From 6641b0b028ae7dc5c0841001f6f0617dc97ac6f8 Mon Sep 17 00:00:00 2001 From: Alexander Zinchuk Date: Sat, 12 Jun 2021 17:21:53 +0300 Subject: [PATCH] [Build] --- dist/0.3ae91f9dfe0fbe76ec81.css | 1 + dist/0.3ae91f9dfe0fbe76ec81.js | 2 ++ dist/0.3ae91f9dfe0fbe76ec81.js.map | 1 + dist/0.46635a34d22085eb936c.css | 1 - dist/0.46635a34d22085eb936c.js | 2 -- dist/0.46635a34d22085eb936c.js.map | 1 - dist/1.7d08855d9784837f4e10.js.map | 1 - dist/{1.7d08855d9784837f4e10.js => 1.c45de763c3ae52a66870.js} | 4 ++-- dist/1.c45de763c3ae52a66870.js.map | 1 + dist/3.695679058d5b91efd31e.css | 1 + dist/3.695679058d5b91efd31e.js | 2 ++ dist/3.695679058d5b91efd31e.js.map | 1 + dist/3.d4466bb252b9014004b6.css | 1 - dist/3.d4466bb252b9014004b6.js | 2 -- dist/3.d4466bb252b9014004b6.js.map | 1 - dist/4.292f70afdd30b166608d.css | 1 + dist/4.292f70afdd30b166608d.js | 2 ++ dist/4.292f70afdd30b166608d.js.map | 1 + dist/4.b0768c144c69fa913166.css | 1 - dist/4.b0768c144c69fa913166.js | 2 -- dist/4.b0768c144c69fa913166.js.map | 1 - dist/5.1497ddf176dcb8025364.css | 1 - dist/5.1497ddf176dcb8025364.js | 2 -- dist/5.1497ddf176dcb8025364.js.map | 1 - dist/5.f9d2e347c4ce9bda504f.css | 1 + dist/5.f9d2e347c4ce9bda504f.js | 2 ++ dist/5.f9d2e347c4ce9bda504f.js.map | 1 + ...{6.cfcac5af41fdc3e4930b.css => 6.1712ed1ad0fe8fb0958d.css} | 0 dist/{6.cfcac5af41fdc3e4930b.js => 6.1712ed1ad0fe8fb0958d.js} | 4 ++-- ...ac5af41fdc3e4930b.js.map => 6.1712ed1ad0fe8fb0958d.js.map} | 2 +- dist/{7.939146af5e88a5ed7b5d.js => 7.04b88cbec82edb17cac3.js} | 4 ++-- ...146af5e88a5ed7b5d.js.map => 7.04b88cbec82edb17cac3.js.map} | 2 +- dist/8.11ac480e85dc7134677d.js | 2 ++ ...a0d226a59f4513906.js.map => 8.11ac480e85dc7134677d.js.map} | 2 +- dist/8.4b6a0d226a59f4513906.js | 2 -- dist/{9.cd351e40def6e292fca1.js => 9.4196177a40c532909fe1.js} | 4 ++-- ...51e40def6e292fca1.js.map => 9.4196177a40c532909fe1.js.map} | 2 +- dist/c9c0072e811220ee46fd.worker.js | 3 --- dist/c9c0072e811220ee46fd.worker.js.map | 1 - ...9c3229391ba89.worker.js => d2b6ca270de7574671ba.worker.js} | 2 +- ...1ba89.worker.js.map => d2b6ca270de7574671ba.worker.js.map} | 2 +- dist/eb485bee0c151237dba8.worker.js | 3 +++ ...LICENSE.txt => eb485bee0c151237dba8.worker.js.LICENSE.txt} | 0 dist/eb485bee0c151237dba8.worker.js.map | 1 + dist/index.html | 2 +- dist/main.2bacad1be7a118611b52.js | 2 -- dist/main.2bacad1be7a118611b52.js.map | 1 - dist/main.4702343722882838bd74.css | 1 - dist/main.9615bb0fe696e5cdc29b.css | 1 + dist/main.bcfa4c2bdab21d30f0f4.js | 2 ++ dist/main.bcfa4c2bdab21d30f0f4.js.map | 1 + dist/report.html | 4 ++-- dist/serviceWorker.js.map | 2 +- 53 files changed, 45 insertions(+), 45 deletions(-) create mode 100644 dist/0.3ae91f9dfe0fbe76ec81.css create mode 100644 dist/0.3ae91f9dfe0fbe76ec81.js create mode 100644 dist/0.3ae91f9dfe0fbe76ec81.js.map delete mode 100644 dist/0.46635a34d22085eb936c.css delete mode 100644 dist/0.46635a34d22085eb936c.js delete mode 100644 dist/0.46635a34d22085eb936c.js.map delete mode 100644 dist/1.7d08855d9784837f4e10.js.map rename dist/{1.7d08855d9784837f4e10.js => 1.c45de763c3ae52a66870.js} (99%) create mode 100644 dist/1.c45de763c3ae52a66870.js.map create mode 100644 dist/3.695679058d5b91efd31e.css create mode 100644 dist/3.695679058d5b91efd31e.js create mode 100644 dist/3.695679058d5b91efd31e.js.map delete mode 100644 dist/3.d4466bb252b9014004b6.css delete mode 100644 dist/3.d4466bb252b9014004b6.js delete mode 100644 dist/3.d4466bb252b9014004b6.js.map create mode 100644 dist/4.292f70afdd30b166608d.css create mode 100644 dist/4.292f70afdd30b166608d.js create mode 100644 dist/4.292f70afdd30b166608d.js.map delete mode 100644 dist/4.b0768c144c69fa913166.css delete mode 100644 dist/4.b0768c144c69fa913166.js delete mode 100644 dist/4.b0768c144c69fa913166.js.map delete mode 100644 dist/5.1497ddf176dcb8025364.css delete mode 100644 dist/5.1497ddf176dcb8025364.js delete mode 100644 dist/5.1497ddf176dcb8025364.js.map create mode 100644 dist/5.f9d2e347c4ce9bda504f.css create mode 100644 dist/5.f9d2e347c4ce9bda504f.js create mode 100644 dist/5.f9d2e347c4ce9bda504f.js.map rename dist/{6.cfcac5af41fdc3e4930b.css => 6.1712ed1ad0fe8fb0958d.css} (100%) rename dist/{6.cfcac5af41fdc3e4930b.js => 6.1712ed1ad0fe8fb0958d.js} (98%) rename dist/{6.cfcac5af41fdc3e4930b.js.map => 6.1712ed1ad0fe8fb0958d.js.map} (99%) rename dist/{7.939146af5e88a5ed7b5d.js => 7.04b88cbec82edb17cac3.js} (93%) rename dist/{7.939146af5e88a5ed7b5d.js.map => 7.04b88cbec82edb17cac3.js.map} (99%) create mode 100644 dist/8.11ac480e85dc7134677d.js rename dist/{8.4b6a0d226a59f4513906.js.map => 8.11ac480e85dc7134677d.js.map} (53%) delete mode 100644 dist/8.4b6a0d226a59f4513906.js rename dist/{9.cd351e40def6e292fca1.js => 9.4196177a40c532909fe1.js} (98%) rename dist/{9.cd351e40def6e292fca1.js.map => 9.4196177a40c532909fe1.js.map} (99%) delete mode 100644 dist/c9c0072e811220ee46fd.worker.js delete mode 100644 dist/c9c0072e811220ee46fd.worker.js.map rename dist/{fba4a019c3229391ba89.worker.js => d2b6ca270de7574671ba.worker.js} (98%) rename dist/{fba4a019c3229391ba89.worker.js.map => d2b6ca270de7574671ba.worker.js.map} (99%) create mode 100644 dist/eb485bee0c151237dba8.worker.js rename dist/{c9c0072e811220ee46fd.worker.js.LICENSE.txt => eb485bee0c151237dba8.worker.js.LICENSE.txt} (100%) create mode 100644 dist/eb485bee0c151237dba8.worker.js.map delete mode 100644 dist/main.2bacad1be7a118611b52.js delete mode 100644 dist/main.2bacad1be7a118611b52.js.map delete mode 100644 dist/main.4702343722882838bd74.css create mode 100644 dist/main.9615bb0fe696e5cdc29b.css create mode 100644 dist/main.bcfa4c2bdab21d30f0f4.js create mode 100644 dist/main.bcfa4c2bdab21d30f0f4.js.map diff --git a/dist/0.3ae91f9dfe0fbe76ec81.css b/dist/0.3ae91f9dfe0fbe76ec81.css new file mode 100644 index 000000000..9f9e085b7 --- /dev/null +++ b/dist/0.3ae91f9dfe0fbe76ec81.css @@ -0,0 +1 @@ +.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(.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:#000}.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:.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:initial!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(.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 .35s 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 .35s ease-out}.Transition.reveal.backwards.animating>.to{animation:none}@keyframes fade-in-opacity{0%{opacity:0}to{opacity:1}}@keyframes fade-out-opacity{0%{opacity:1}to{opacity:0}}@keyframes fade-in-backwards-opacity{0%{opacity:1}to{opacity:0}}@keyframes fade-out-backwards-opacity{0%{opacity:0}to{opacity:1}}@keyframes slide-in{0%{transform:translateX(100%)}to{transform:translateX(0)}}@keyframes slide-out{0%{transform:translateX(0)}to{transform:translateX(-100%)}}@keyframes slide-in-backwards{0%{transform:translateX(0)}to{transform:translateX(100%)}}@keyframes slide-out-backwards{0%{transform:translateX(-100%)}to{transform:translateX(0)}}@keyframes mv-slide-in{0%{transform:translateX(100vw)}to{transform:translateX(0)}}@keyframes mv-slide-out{0%{transform:translateX(0)}to{transform:translateX(-100vw)}}@keyframes mv-slide-in-backwards{0%{transform:translateX(0)}to{transform:translateX(100vw)}}@keyframes mv-slide-out-backwards{0%{transform:translateX(-100vw)}to{transform:translateX(0)}}@keyframes slide-fade-in-move{0%{transform:translateX(1.5rem)}to{transform:translateX(0)}}@keyframes slide-fade-out-move{0%{transform:translateX(0)}to{transform:translateX(-1.5rem)}}@keyframes slide-fade-in-backwards-move{0%{transform:translateX(0)}to{transform:translateX(1.5rem)}}@keyframes slide-fade-out-backwards-move{0%{transform:translateX(-1.5rem)}to{transform:translateX(0)}}@keyframes zoom-fade-in-move{0%{transform:scale(1.1)}to{transform:scale(1)}}@keyframes zoom-fade-in-backwards-move{0%{transform:scale(1)}to{transform:scale(1.1)}}@keyframes zoom-fade-out-backwards-move{0%{transform:scale(.95)}to{transform:scale(1)}}@keyframes slide-layers-out{0%{transform:translateX(0);opacity:1}to{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))}to{transform:translateX(0);opacity:1}}@keyframes push-out{0%{transform:scale(1);opacity:1}to{transform:scale(.7);opacity:0}}@keyframes push-out-backwards{0%{transform:scale(.7);opacity:0}to{transform:scale(1);opacity:1}}@keyframes slide-in-200{0%{transform:translateX(200%)}to{transform:translateX(0)}}@keyframes slide-in-200-backwards{0%{transform:translateX(0)}to{transform:translateX(200%)}}@keyframes reveal-in{0%{-webkit-clip-path:inset(0 100% 0 0);clip-path:inset(0 100% 0 0)}to{-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)}to{-webkit-clip-path:inset(0 100% 0 0);clip-path:inset(0 100% 0 0)}}.Avatar{--color-user:var(--color-primary);flex:none;align-items:center;justify-content:center;width:3.375rem;height:3.375rem;background:linear-gradient(var(--color-white) -125%,var(--color-user));color:#fff;font-weight:700;display:flex;white-space:nowrap}.Avatar,.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:.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:.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:.05rem;right:.05rem;width:.875rem;height:.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%}.ProgressSpinner{position:relative;z-index:1;width:3.375rem;height:3.375rem;background:rgba(0,0,0,.25) url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTkiIGhlaWdodD0iMTkiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTEwLjcxNyA5Ljc1TDE4LjMgMi4xNjdhLjY4NC42ODQgMCAxMC0uOTY3LS45NjdMOS43NSA4Ljc4MyAyLjE2NyAxLjJhLjY4NC42ODQgMCAxMC0uOTY3Ljk2N0w4Ljc4MyA5Ljc1IDEuMiAxNy4zMzNhLjY4NC42ODQgMCAxMC45NjcuOTY3bDcuNTgzLTcuNTgzIDcuNTgzIDcuNTgzYS42ODEuNjgxIDAgMDAuOTY3IDAgLjY4NC42ODQgMCAwMDAtLjk2N0wxMC43MTcgOS43NXoiIGZpbGw9IiNGRkYiIHN0cm9rZT0iI0ZGRiIgc3Ryb2tlLXdpZHRoPSIuNzUiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz48L3N2Zz4=) 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-m,.ProgressSpinner.size-s{width:auto;height:auto;background:transparent url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTUiIGhlaWdodD0iMTUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTguMjE4IDcuNWw1LjYzMy01LjYzM2EuNTA4LjUwOCAwIDEwLS43MTgtLjcxOEw3LjUgNi43ODIgMS44NjcgMS4xNDlhLjUwOC41MDggMCAxMC0uNzE4LjcxOEw2Ljc4MiA3LjVsLTUuNjMzIDUuNjMzYS41MDguNTA4IDAgMTAuNzE4LjcxOEw3LjUgOC4yMThsNS42MzMgNS42MzNhLjUwNi41MDYgMCAwMC43MTggMCAuNTA4LjUwOCAwIDAwMC0uNzE4TDguMjE4IDcuNXoiIGZpbGw9IiNGRkYiIHN0cm9rZT0iI0ZGRiIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPjwvc3ZnPg==) no-repeat 49% 49%}.ProgressSpinner.size-m.square,.ProgressSpinner.size-s.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:initial!important}.ProgressSpinner svg{display:block;transform:rotate(-90deg);transform-origin:50% 50%;animation:ProgressSpinnerAnimation 4s linear 0s infinite}.ProgressSpinner circle{transition:stroke-dashoffset .5s}@keyframes ProgressSpinnerAnimation{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.Modal{position:relative;z-index:var(--z-modal)}.Modal.confirm .modal-dialog,.Modal.delete .modal-dialog,.Modal.error .modal-dialog,.Modal.pin .modal-dialog,.Modal.unpin-all .modal-dialog{max-width:23rem}.Modal.narrow .modal-dialog{max-width:20rem}.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,.25)}.Modal.transparent-backdrop .modal-backdrop{background-color:initial}.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 .25rem .5rem .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:translateZ(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:.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-content,.Modal .modal-content>p,.Modal .modal-title{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}.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,0.08)}.ListItem .ListItem-button>i{font-size:1.5rem;margin-right:2rem;color:var(--color-text-secondary)}.ListItem .group-status,.ListItem .subtitle,.ListItem .title,.ListItem .user-status{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:.5}.ListItem:not(.disabled):not(.is-static) .ListItem-button{cursor:pointer}.ListItem:not(.disabled):not(.is-static) .ListItem-button:focus,body:not(.is-ios) .ListItem:not(.disabled):not(.is-static) .ListItem-button:hover{--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:.75rem}.ListItem.narrow .ListItem-button{padding:.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 -.5rem}.ListItem.chat-item-clickable .ListItem-button{padding:.5625rem .6975rem .5625rem .5625rem}@media (max-width:600px){.ListItem.chat-item-clickable:not(.force-rounded-corners){margin:0}.ListItem.chat-item-clickable:not(.force-rounded-corners) .ListItem-button{border-radius:0}}.ListItem.chat-item-clickable .Avatar{flex-shrink:0;margin-right:.5rem}.ListItem.chat-item-clickable .info{flex-grow:1;overflow:hidden}.ListItem.chat-item-clickable .subtitle,.ListItem.chat-item-clickable .title{overflow:hidden;display:flex;justify-content:flex-start;align-items:center}.ListItem.chat-item-clickable .last-message,.ListItem.chat-item-clickable .status,.ListItem.chat-item-clickable .typing-status,.ListItem.chat-item-clickable h3{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:.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:.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:.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=auto],.ListItem.chat-item-clickable .ChatInfo .status[dir=rtl],.ListItem.chat-item-clickable .ChatInfo .typing-status[dir=auto],.ListItem.chat-item-clickable .ChatInfo .typing-status[dir=rtl]{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 .last-message,.ListItem.chat-item-clickable .status,.ListItem.chat-item-clickable .typing-status,.ListItem.chat-item-clickable h3{text-align:initial;unicode-bidi:plaintext}.ListItem.chat-item-clickable[dir=rtl] .ListItem-button{padding:.5625rem .5625rem .5625rem .6975rem}.ListItem.chat-item-clickable[dir=rtl] .Avatar{margin-left:.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 .subtitle,.ListItem.search-result-message h3{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:.25rem;padding: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:normal;overflow:hidden}.ListItem .multiline-item .subtitle,.ListItem .multiline-item .title{display:block;text-align:initial}.ListItem .multiline-item .title{line-height:1.25rem;overflow:hidden;text-overflow:ellipsis}.ListItem .multiline-item .subtitle{font-size:.875rem;line-height:1.5rem;color:var(--color-text-secondary)}.ListItem .multiline-item .subtitle+.subtitle{margin-top:-.25rem}.ListItem .multiline-item .subtitle.black{color:var(--color-text)}.ListItem[dir=rtl] .ListItem-button>i{margin-left:2rem;margin-right:0}.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:50%}.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{0%{transform:translateX(-1rem)}}@keyframes typing-animation-rtl{0%{transform:translateX(1rem)}}.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)}body.is-right-column-shown .Notification-container{transform:translate3d(calc(var(--right-column-width)/-2),0,0)}}.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,.8) url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj48Y2lyY2xlIGZpbGw9IiNGRkYiIGN4PSIxMiIgY3k9IjEyIiByPSIxMiIvPjxjaXJjbGUgZmlsbD0iIzAwMCIgZmlsbC1ydWxlPSJub256ZXJvIiBjeD0iMTIiIGN5PSI2LjUiIHI9IjEuNSIvPjxwYXRoIGQ9Ik0xMiA5LjVjLS41NTIgMC0xIC4zNy0xIC44MjZ2Ny4zNDhjMCAuNDU2LjQ0OC44MjYgMSAuODI2czEtLjM3IDEtLjgyNnYtNy4zNDhjMC0uNDU2LS40NDgtLjgyNi0xLS44MjZ6IiBmaWxsPSIjMDAwIiBmaWxsLXJ1bGU9Im5vbnplcm8iLz48L2c+PC9zdmc+") no-repeat .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:active,.Notification .text-entity-link:hover{color:#fff!important;text-decoration:underline}.Notification .content{line-height:1.25;word-break:break-word;font-size:.9375rem}.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{pointer-events:none;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:.5rem;background:var(--color-gray);border-radius:.75rem;padding:0 .3125rem;color:#fff;font-size:.875rem;line-height:1.3125rem;font-weight:500;text-align:center;flex-shrink:0}.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:initial;transform-origin:left}.Tab i.animate{transition:transform var(--slide-transition)}body.animation-level-0 .Tab i.animate{transition:none!important}.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:transparent}.TabList.big{font-size:1rem;--border-radius-messages-small:0}.TabList::-webkit-scrollbar{height:0}.TabList::-webkit-scrollbar-thumb{background-color:transparent}.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}.SearchInput{position:relative;width:100%;color:rgba(var(--color-text-secondary-rgb),.5);background-color:var(--color-chat-hover);border:2px solid var(--color-chat-hover);border-radius:1.375rem;transition:border-color .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:initial!important;box-shadow:none!important;padding:calc(.4375rem - var(--border-width)) calc(2.625rem - var(--border-width)) calc(.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:.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}.PickerSelectedItem{display:flex;align-items:center;background:var(--color-chat-hover);height:2rem;min-width:2rem;margin-left:.5rem;margin-bottom:.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% - .5rem)}.PickerSelectedItem.minimized{padding-right:0}.PickerSelectedItem:hover{background-color:var(--color-item-active)}.PickerSelectedItem.closeable:hover{background-color:rgba(var(--color-error-rgb),.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:.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:.375rem;border-radius:50%;background-color:var(--color-primary);color:#fff}.PickerSelectedItem .item-icon i{font-size:1.25rem;position:relative;top:-1px}.PickerSelectedItem .item-name{margin-left:.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:#fff;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:.5rem}.PickerSelectedItem[dir=rtl] .item-remove{left:auto;right:0}.MessageOutgoingStatus{position:relative;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:.13rem}.MessageOutgoingStatus .Transition{width:100%;height:100%}.LastMessageMeta{margin-right:.2rem;padding:.3rem 0 .15rem;flex-shrink:0;font-size:.75rem;line-height:1;display:flex;align-items:center}.LastMessageMeta .MessageOutgoingStatus{color:var(--color-text-meta-colored);margin-right:.1rem;font-size:1.15rem}.LastMessageMeta .time{color:var(--color-text-meta);line-height:1.15rem}.Badge-transition{transform:scale(1);opacity:1;transition:transform .3s cubic-bezier(.34,1.56,.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;margin-left:1.5rem}.Badge-wrapper .Badge{margin-left:.5rem}.Badge{min-width:1.5rem;height:1.5rem;background:var(--color-gray);border-radius:.75rem;padding:0 .4375rem;color:#fff;font-size:.875rem;line-height:1.5625rem;font-weight:500;text-align:center;flex-shrink:0}.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:.25rem}.Badge.mention i{font-size:1rem;vertical-align:super}.Chat{--background-color:var(--color-background);position:absolute;top:0;left:0;margin:0;width:100%}.Chat.animate-opacity{will-change:opacity;transition:opacity .2s ease-out}.Chat.animate-transform{will-change:transform;transition:transform .2s ease-out}.Chat.ListItem.has-menu-open .Avatar.online:after,.Chat:hover .Avatar.online:after{border-color:var(--color-chat-hover)}.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{position:relative;flex-shrink:0}.Chat .info .subtitle,.Chat .info .title{padding-right:.125rem}.Chat .info h3{width:auto;max-width:80%}.Chat .info .icon-muted-chat{font-size:1.25rem;margin-left:.25rem;margin-top:-.0625rem;color:#c6c8ca}.Chat .info .LastMessageMeta{margin-left:auto}.Chat .info .last-message,.Chat .info .typing-status{padding-right:.25rem;flex-grow:1;color:var(--color-text-secondary);unicode-bidi:plaintext}.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 .media-preview{position:relative}.Chat .info .last-message img{width:1.25rem;height:1.25rem;object-fit:cover;border-radius:.125rem;vertical-align:-.25rem;margin-inline-end:.25rem}.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{font-size:.75rem;color:#fff;position:absolute;top:.1875rem;margin-inline-start:-1.25rem}.Chat[dir=rtl] .info .LastMessageMeta{margin-left:0;margin-right:auto}.Chat[dir=rtl] .info .subtitle,.Chat[dir=rtl] .info .title{padding-left:.15rem;padding-right:0}.Chat[dir=rtl] .info .icon-muted-chat{margin-left:0;margin-right:.25rem}.Chat[dir=rtl] .info .last-message,.Chat[dir=rtl] .info .typing-status{padding-left:.5rem;padding-right:0;text-align:right;unicode-bidi:plaintext}.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:color .2s,background .2s}.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}}.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))}.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}.File .file-icon-container{position:relative}.File .file-icon,.File .file-preview,.File .file-progress{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:#fff}.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:.25rem;background:rgba(0,0,0,.25);border-left:0 solid var(--background-color);border-bottom:1.125rem solid transparent;border-right:1.125rem solid var(--background-color);border-top:0 solid transparent;transition:border-width .15s ease-in}.File .file-preview{background:transparent;overflow:hidden}.File .file-preview+.file-progress,.File .file-preview+.icon-download{background:rgba(0,0,0,.5);border-radius:var(--border-radius-messages-small)}.File .file-preview img{object-fit:cover}.File .icon-download{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 .icon-download{opacity:1}.File.interactive .file-icon-container:hover .file-ext,.File.interactive .file-icon-container:hover .icon-download.hidden{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 .file-icon,.File.smaller .file-preview,.File.smaller .file-progress,.File.smaller .icon-download{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-icon,.File:dir(rtl) .file-preview,.File:dir(rtl) .file-progress,.File[dir=rtl] .file-icon,.File[dir=rtl] .file-preview,.File[dir=rtl] .file-progress{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) .icon-download,.File[dir=rtl] .icon-download{left:auto;right:0}.File .file-icon.red,.File .file-progress.red{background-color:var(--color-error)}.File .file-icon.orange,.File .file-progress.orange{background-color:var(--color-warning)}.File .file-icon.green,.File .file-progress.green{background-color:var(--color-text-green)}.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-pause,.Audio .toggle-play .icon-play{opacity:1;transform:scale(1);transition:opacity .4s,transform .6s cubic-bezier(.34,1.56,.64,1)}.Audio .toggle-play.loading .icon-pause,.Audio .toggle-play.loading .icon-play,.Audio .toggle-play.pause .icon-play,.Audio .toggle-play.play .icon-pause{opacity:0;transform:scale(.5)}.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:.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 .date,.Audio .meta,.Audio .performer{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 .date,.Audio.bigger .meta,.Audio.bigger .performer{line-height:1.0625rem}.Audio.bigger .seekline{top:2px;margin-bottom:.5rem}.Audio.bigger .duration{line-height:1rem}.Audio.bigger .media-loading{top:.1875rem;left:.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}.AnimatedEmoji{margin-bottom:.75rem}.AnimatedEmoji img{width:100%;height:100%}.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:.5}.Radio.hidden-widget{cursor:default}.Radio.hidden-widget .Radio-main:after,.Radio.hidden-widget .Radio-main:before{visibility:hidden}.Radio>input{position:absolute;z-index:var(--z-below);opacity:0}.Radio .Radio-main:after,.Radio .Radio-main:before{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);border-radius:50%;background-color:var(--color-white);opacity:1;transition:border-color .1s ease,opacity .1s ease}.Radio .Radio-main:after{left:1.375rem;width:.625rem;height:.625rem;border-radius:50%;background:var(--color-primary);opacity:0;transition:opacity .1s ease}.Radio .Radio-main .label{display:block;word-break:break-word;text-align:initial}.Radio .Radio-main .subLabel{display:block;font-size:.875rem;line-height:1rem;color:var(--color-text-secondary)}.Radio input:checked~.Radio-main:before{border-color:var(--color-primary)}.Radio input:checked~.Radio-main:after{opacity:1}.Radio.loading .Radio-main:after,.Radio.loading .Radio-main:before{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{0%{opacity:0}to{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:.5rem .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}@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 .25rem;background-color:var(--color-borders)}.TextFormatter-link-url-input-wrapper{width:20rem;position:relative}@media (max-width:600px){.TextFormatter-link-url-input-wrapper{max-width:90vw}}.TextFormatter-link-url-input-wrapper:after,.TextFormatter-link-url-input-wrapper:before{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(90deg,var(--color-background) .25rem,transparent 1rem)}.TextFormatter-link-url-input-wrapper:after{right:0;background:linear-gradient(270deg,var(--color-background) .25rem,transparent 1rem)}.TextFormatter-link-url-input-wrapper.mask-left:before,.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:.25rem;font-size:1.5rem;margin:0 .125rem;border-radius:var(--border-radius-messages-small);flex-shrink:0;cursor:pointer}.TextFormatter .Button.active{background-color:var(--color-primary)!important;color:#fff}.TextFormatter .Button.disabled{opacity:.5;pointer-events:none}.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,.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}.WebLink{min-height:3rem;padding:.25rem 0 0 3.75rem;font-size:.875rem;line-height:1.125rem;position:relative}.WebLink+.WebLink{margin-top:1.5rem}.WebLink.without-photo:before{content:attr(data-initial);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,.WebLink.without-photo:before{width:3rem;height:3rem;position:absolute;left:0;top:0}.WebLink .Media{cursor:default!important;padding-bottom:unset!important;border-radius:var(--border-radius-messages-small)!important}.WebLink .site-description,.WebLink .site-name,.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-photo:before{left:auto;right:0}.WebLink[dir=rtl] .content{text-align:right}.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} \ No newline at end of file diff --git a/dist/0.3ae91f9dfe0fbe76ec81.js b/dist/0.3ae91f9dfe0fbe76ec81.js new file mode 100644 index 000000000..c23cd69a2 --- /dev/null +++ b/dist/0.3ae91f9dfe0fbe76ec81.js @@ -0,0 +1,2 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[0],Array(103).concat([function(e,t,n){"use strict";var a=n(0),r=n(7),c=n(8),s=n(143),i=n(171),o=n(24),l=n(43),d=n(52),u=n(42);n(205);t.a=e=>{const{ref:t,buttonRef:n,icon:m,className:h,style:b,children:f,disabled:p,ripple:O,narrow:g,inactive:v,focus:j,destructive:E,multiline:y,isStatic:T,contextActions:N,onClick:C}=e;let w=Object(a.q)(null);t&&(w=t);const{isContextMenuOpen:M,contextMenuPosition:L,handleBeforeContextMenu:S,handleContextMenu:I,handleContextMenuClose:A,handleContextMenuHide:k}=Object(s.a)(w,!N),x=Object(a.m)(()=>w.current,[]),D=Object(a.m)(()=>w.current.closest(".custom-scroll"),[]),R=Object(a.m)(()=>w.current.querySelector(".ListItem-context-menu .bubble"),[]),{positionX:_,positionY:F,style:P}=Object(i.a)(L,x,D,R),U=Object(a.m)(e=>{!p&&C&&C(e)},[p,C]),B=Object(a.m)(e=>{v||r.l||(!N||2!==e.button&&C||S(e),0===e.button&&(C?U(e):I(e)))},[v,N,C,S,I,U]),q=Object(o.a)(),H=Object(c.a)("ListItem",h,!T&&"no-selection",O&&"has-ripple",g&&"narrow",p&&"disabled",v&&"inactive",L&&"has-menu-open",j&&"focus",E&&"destructive",y&&"multiline",T&&"is-static");return a.a.createElement("div",{ref:w,className:H,dir:q.isRtl?"rtl":void 0,style:b},a.a.createElement("div",{className:"ListItem-button",role:"button",ref:n,tabIndex:0,onClick:!v&&r.l?U:void 0,onMouseDown:B,onContextMenu:!v&&N?I:void 0},m&&a.a.createElement("i",{className:"icon-"+m}),y&&a.a.createElement("div",{className:"multiline-item"},f),!y&&f,!p&&!v&&O&&a.a.createElement(l.a,null)),N&&void 0!==L&&a.a.createElement(d.a,{isOpen:M,positionX:_,positionY:F,style:P,className:"ListItem-context-menu",autoClose:!0,onClose:A,onCloseAnimationEnd:k},N.map(e=>a.a.createElement(u.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(9),c=n(48);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)(),h=Object(a.q)(),b=Object(a.q)();m.current=d;const f=Object(a.m)(()=>{h.current=!0},[]),p=Object(a.m)(()=>{h.current=!1,b.current&&(b.current(),b.current=void 0)},[]);Object(c.a)(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.g: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)}),h.current?b.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(5),c=n(53),s=n(25);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(2),c=n(19),s=n(6),i=n(4),o=n(22),l=n(3),d=n(24),u=n(109),m=n(131),h=n(154);t.a=Object(a.h)(Object(r.h)((e,{userId:t,forceShowSelf:n})=>{const{lastSyncTime:a}=e,r=Object(s.Fb)(e,t);return{lastSyncTime:a,user:r,isSavedMessages:!n&&r&&r.isSelf,areMessagesLoaded:Boolean(Object(s.m)(e,t))}},(e,t)=>Object(l.l)(t,["loadFullUser","openMediaViewer"]))(({typingStatus:e,avatarSize:t="medium",status:n,withMediaViewer:r,withUsername:s,withFullInfo:l,withUpdatingStatus:b,noStatusOrTyping:f,noRtl:p,user:O,isSavedMessages:g,areMessagesLoaded:v,lastSyncTime:j,loadFullUser:E,openMediaViewer:y})=>{const{id:T}=O||{},N=Object(i.Z)(O);Object(a.n)(()=>{l&&j&&T&&E({userId:T})},[T,E,j,l]);const C=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]),w=Object(d.a)();if(O)return a.a.createElement("div",{className:"ChatInfo",dir:!p&&w.isRtl?"rtl":void 0},a.a.createElement(u.a,{key:O.id,size:t,user:O,isSavedMessages:g,onClick:r?C:void 0}),a.a.createElement("div",{className:"info"},g?a.a.createElement("div",{className:"title"},a.a.createElement("h3",null,w("SavedMessages"))):a.a.createElement("div",{className:"title"},a.a.createElement("h3",{dir:"auto"},N&&Object(o.a)(N)),O&&O.isVerified&&a.a.createElement(m.a,null)),(n||!g&&!f)&&(n?a.a.createElement("span",{className:"status",dir:"auto"},n):b&&!v?a.a.createElement("span",{className:"status",dir:"auto"},w("Updating")):O?e?a.a.createElement(h.a,{typingStatus:e}):a.a.createElement("div",{className:"status "+(Object(i.xb)(O)?"online":"")},s&&O.username&&a.a.createElement("span",{className:"handle"},O.username),a.a.createElement("span",{className:"user-status",dir:"auto"},Object(i.ab)(w,O))):void 0)))}))},function(e,t,n){"use strict";var a=n(0),r=n(38),c=n(54);var s=n(8),i=n(48),o=n(34),l=n(57),d=n(24),u=n(116),m=n(39),h=n(31),b=n(120);n(148);t.a=e=>{const{title:t,className:n,isOpen:f,header:p,hasCloseButton:O,noBackdrop:g,children:v,onClose:j,onCloseAnimationEnd:E,onEnter:y}=e,[T,N]=Object(a.r)(!1),[C,w]=Object(a.r)(!1),[M,L]=Object(a.r)(!0),{shouldRender:S,transitionClassNames:I}=Object(o.a)(f,E,C,void 0,C),A=Object(a.q)(null);Object(a.n)(()=>f?Object(c.a)({onEsc:j,onEnter:y}):void 0,[f,j,y]),Object(a.n)(()=>f&&A.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)}}(A.current):void 0,[f]),Object(u.a)((e,t,n)=>{n&&"modal"===n.type&&(N(!0),t&&(w(!0),setTimeout(()=>w(!1),200)),j())}),Object(m.a)(()=>{M?L(!1):f?r.a.pushState({type:"modal"}):T?N(!1):r.a.back()},[f]),Object(l.a)(([e])=>(document.body.classList.toggle("has-open-dialog",f),(f||!f&&void 0!==e)&&Object(i.b)(200),()=>{document.body.classList.remove("has-open-dialog")}),[f]);const k=Object(d.a)();if(!S)return;const x=Object(s.a)("Modal",n,I,g&&"transparent-backdrop");return a.a.createElement(b.a,null,a.a.createElement("div",{ref:A,className:x,tabIndex:-1,role:"dialog"},a.a.createElement("div",{className:"modal-container"},a.a.createElement("div",{className:"modal-backdrop",onClick:j}),a.a.createElement("div",{className:"modal-dialog"},p||(t?a.a.createElement("div",{className:"modal-header"},O&&a.a.createElement(h.a,{round:!0,color:"translucent",size:"smaller",ariaLabel:k("Close"),onClick:j},a.a.createElement("i",{className:"icon-close"})),a.a.createElement("div",{className:"modal-title"},t)):void 0),a.a.createElement("div",{className:"modal-content custom-scroll"},v)))))}},function(e,t,n){"use strict";n.d(t,"a",(function(){return u}));var a=n(0),r=n(2),c=n(1),s=n(7),i=n(25),o=n(37),l=n(8),d=n(48);n(191);const u={slide:450,"slide-reversed":450,"mv-slide":400,"slide-fade":400,"zoom-fade":150,"scroll-slide":500,fade:150,"slide-layers":s.g?450:300,"push-slide":300,reveal:350},m=Symbol("CLEANED_UP");t.b=Object(r.h)(e=>{const{animationLevel:t}=e.settings.byKey;return{animationLevel:t}})(({ref:e,activeKey:t,name:n,direction:r="auto",renderCount:s,shouldRestoreHeight:h,shouldCleanup:b,id:f,className:p,onStart:O,onStop:g,children:v,animationLevel:j})=>{let E=Object(a.q)(null);e&&(E=e);const y=Object(a.q)({}),T=Object(o.a)(t),N=Object(a.q)(),C=Object(i.a)(),w=void 0!==T&&t!==T;!s&&w&&(y.current={[T]:y.current[T]}),y.current[t]=v,Object(a.o)(()=>{function e(){b&&(y.current={[T]:m},C())}const a=E.current,i=a.children;if(1===i.length&&!w)return void i[0].classList.add("active");const o=Array.from(a.childNodes);if(!w||!o.length)return;N.current&&(clearTimeout(N.current),N.current=void 0);const l=-1===r||"auto"===r&&T>t||"inverse"===r&&T{e instanceof HTMLElement&&(e.classList.remove("from","through","to"),e.classList.toggle("active",t===v))}),void e();if(o.forEach((e,t)=>{e instanceof HTMLElement&&(e.classList.remove("active"),e.classList.toggle("from",t===p),e.classList.toggle("through",t>p&&tv),e.classList.toggle("to",t===v))}),"scroll-slide"===n){const e=a.offsetWidth;a.scrollBy({left:v>p?e:-e,behavior:"smooth"})}j>0&&Object(d.b)(u[n]+c.c),requestAnimationFrame(()=>{a.classList.add("animating"),N.current=window.setTimeout(()=>{requestAnimationFrame(()=>{if(a.classList.remove("animating","backwards"),o.forEach((e,t)=>{e instanceof HTMLElement&&(e.classList.remove("from","through","to"),e.classList.toggle("active",t===v))}),"scroll-slide"===n&&(a.scrollLeft=t*a.offsetWidth),h){const e=a.querySelector(".active");e&&(e.style.height="auto",a.style.height=e.clientHeight+"px")}e(),g&&g()})},u[n]+c.c),O&&O()})},[t,T,w,r,n,O,g,s,h,b,j,C]),Object(a.o)(()=>{if(h){const e=E.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")}},[h,v]);const M=y.current,L=Object.keys(s?new Array(s).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===T)):void 0}),S=Object(l.a)("Transition",p,0===j&&"scroll-slide"===n?"slide":n);return a.a.createElement("div",{ref:E,id:f,className:S},L)})},function(e,t,n){"use strict";var a=n(0),r=n(5),c=n(1),s=n(4),i=n(49),o=n(8),l=n(22),d=n(105),u=n(111),m=n(24);n(193);t.a=Object(a.h)(({className:e,size:t="large",chat:n,user:h,text:b,withOnlineStatus:f,isSavedMessages:p,lastSyncTime:O,onClick:g})=>{const v=h&&Object(s.pb)(h);let j;p||v||(h?j=Object(s.f)(h):n&&(j=Object(s.f)(n)));const E=Object(d.a)(j,!1,r.ApiMediaFormat.DataUri,O),{shouldRenderFullMedia:y,transitionClassNames:T}=Object(u.a)(E,"slow"),N=Object(m.a)();let C="";if(p)C=a.a.createElement("i",{className:"icon-avatar-saved-messages"});else if(v)C=a.a.createElement("i",{className:"icon-avatar-deleted-account"});else if(y)C=a.a.createElement("img",{src:E,className:T+" avatar-media",alt:"",decoding:"async"});else if(h){const e=Object(s.Z)(h);C=e?Object(i.c)(e,2):void 0}else if(n){const e=Object(s.l)(N,n);C=e&&Object(i.c)(e,Object(s.lb)(n.id)?2:1)}else b&&(C=Object(i.c)(b,2));const w=!p&&h&&Object(s.xb)(h),M=Object(o.a)("Avatar size-"+t,e,"color-bg-"+Object(s.X)(h||n),p&&"saved-messages",v&&"deleted-account",f&&w&&"online",g&&"interactive",!p&&!y&&"no-photo"),L=Object(a.m)(e=>{g&&g(e,p||y)},[g,p,y]),S=(h||n)&&(h||n).id;return a.a.createElement("div",{className:M,onClick:L,"data-test-sender-id":c.F?S:void 0},"string"==typeof C?Object(l.a)(C,["jumbo"===t?"hq_emoji":"emoji"]):C)})},function(e,t,n){"use strict";var a=n(19),r=n(0),c=n(9),s=n(153);t.a=({ref:e,className:t,onLoadMore:n,onScroll:i,onKeyDown:o,items:l,itemSelector:d=".ListItem",preloadBackwards:u=20,sensitiveArea:m=800,noScrollRestore:h=!1,noScrollRestoreOnTop:b=!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)(()=>n({direction:a.e.Backwards}),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)}h||b&&0===e.scrollTop||(Object(s.a)(e,n),t.isScrollTopJustUpdated=!0)},[l,d,h,b,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 h=!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,h=!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 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,"b",(function(){return i})),n.d(t,"c",(function(){return o})),n.d(t,"d",(function(){return l})),n.d(t,"a",(function(){return d})),n.d(t,"j",(function(){return f})),n.d(t,"f",(function(){return p})),n.d(t,"h",(function(){return O})),n.d(t,"k",(function(){return g})),n.d(t,"i",(function(){return v})),n.d(t,"l",(function(){return j})),n.d(t,"g",(function(){return E})),n.d(t,"e",(function(){return y}));var a=n(4),r=n(55),c=n(7),s=n(1);const i="(max-height: 640px)",o=parseInt(getComputedStyle(document.documentElement).fontSize,10),l=200,d={width:640,height:640},u={width:100,height:100};let m;function h(e,t,n){const a=t||n?1.625:0;return(function(e){const t=e?30:29;return c.g?(m||(m=Math.min(t,Math.floor(.69*window.innerWidth)/o)),m):t}(e)-a)*o}function b({width:e,height:t,fromOwnMessage:n,isForwarded:a,isWebPagePhoto:r,isGif:c}){const s=t/e;return y(h(n,a,r),function(e,t){return e&&t&&t>=.75&&t<=1.25?20*o:27*o}(c,s),e,t)}function f(e,t){const n=window.matchMedia(i),{width:a,height:c}=r.a.get();let s=t&&n.matches?10:8.25;return e&&(s=n.matches?10:15),{width:a,height:c-s*o}}function p(e,t,n,r){const{width:c,height:s}=Object(a.T)(e)||u;return b({width:c,height:s,fromOwnMessage:t,isForwarded:n,isWebPagePhoto:r})}function O(e,t,n){const{width:r,height:c}=Object(a.bb)(e)||u;return b({width:r,height:c,fromOwnMessage:t,isForwarded:n,isGif:e.isGif})}function g(){return{width:2*o,height:2*o}}function v(e){return e?{width:3*o,height:3*o}:{width:3.375*o,height:3.375*o}}function j(e){const{width:t}=e;let{height:n}=e;"1258816259753933"===e.id&&(n=t);const a=n&&t&&n/t,r=(c.g?s.wb:s.vb)*o,i=a?r*a:r;return a&&i>r?{width:Math.round(r/a),height:r}:{width:r,height:i}}function E({width:e,height:t},n,a=!1){const{width:r,height:c}=f(n,a);return y(r,c,e,t)}function y(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(9),c=n(8),s=n(48),i=n(129);let o,l;async function d(){return o||(o=n.e(7).then(n.bind(null,190)),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:h,size:b,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),T=Object(a.q)();T.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:h,size:b,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,h,O,f,b,m]),Object(a.n)(()=>()=>{g&&g.destroy()},[g]);const C=Object(a.m)((e=!1)=>{g&&(T.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]),L=Object(a.m)(()=>{E.current&&C(),E.current=!1,y.current=!1},[C]),S=Object(a.m)(()=>{Object(r.b)(L)},[L]);Object(a.n)(()=>{g&&(o||u?y.current?E.current=!0:C(h):y.current?E.current=!1:w())},[g,o,u,h,C,w]),Object(s.a)(M,L),Object(i.a)(M,S);const I=Object(c.a)("AnimatedSticker",e),A=b?`width: ${b}px; height: ${b}px;`:void 0;return a.a.createElement("div",{ref:j,className:I,style:A})})},function(e,t,n){"use strict";var a=n(0),r=n(24),c=n(107),s=n(31);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:h,isButtonsInOneRow:b})=>{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:b?"dialog-buttons mt-2":""},a.a.createElement(s.a,{className:"confirm-dialog-button",isText:!0,onClick:m,color:h?"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(8),c=n(34),s=n(22),i=n(24);n(246);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 l}));var a=n(0),r=n(7),c=n(38);let s=!1;const i=e=>{const t=e.touches[0].pageX;(t<=60||t>=window.innerWidth-60)&&(s=!0)},o=()=>{s&&setTimeout(()=>{s=!1},200)};function l(e){const t=t=>{c.a.isHistoryChangedByUser?e(t,s,c.a.states[c.a.states.length-1]):setTimeout(()=>{c.a.isHistoryChangedByUser=!0},0)};Object(a.n)(()=>(window.addEventListener("popstate",t),()=>{window.removeEventListener("popstate",t)}))}r.e&&(console.log("Adding event listeners for useHistoryBack"),window.addEventListener("touchstart",i),window.addEventListener("touchend",o))},function(e,t,n){"use strict";n.d(t,"a",(function(){return s}));var a=n(0),r=n(39),c=n(25);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(7),c=n(5),s=n(9),i=n(53),o=n(25);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.i&&n===c.ApiMediaFormat.Progressive,h=Object(o.a)(),[b,f]=Object(a.r)(u&&!m?1:0),p=Object(a.q)(),O=Object(a.p)(()=>Object(s.g)(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?h():setTimeout(h,d-e)})))},[t,e,u,n,l,h,m,d,O]),Object(a.n)(()=>{t&&p.current&&(i.a(O),f(0))},[O,t]),{mediaData:u,downloadProgress:b}}},function(e,t,n){"use strict";var a=n(0),r=n(8);n(216);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,h=Object(a.q)(null);Object(a.n)(()=>{if(!h.current)return;const t=h.current.firstElementChild,n=m-Math.min(Math.max(.05,e),1)*m;t?t.firstElementChild.setAttribute("stroke-dashoffset",n.toString()):h.current.innerHTML=`\n \n `},[h,m,u,d,e]);const b=Object(r.a)("ProgressSpinner size-"+t,s&&"transparent",n&&"square",i&&"no-cross");return a.a.createElement("div",{ref:h,className:b,onClick:o})})},function(e,t,n){"use strict";var a=n(0),r=n(65);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(2),c=n(19),s=n(4),i=n(6),o=n(22),l=n(3),d=n(24),u=n(109),m=n(131),h=n(154);t.a=Object(a.h)(Object(r.h)((e,{chatId:t})=>{const{lastSyncTime:n}=e,a=Object(i.f)(e,t);return{lastSyncTime:n,chat:a,onlineCount:a?Object(i.n)(e,a):void 0,areMessagesLoaded:Boolean(Object(i.m)(e,t))}},(e,t)=>Object(l.l)(t,["loadFullChat","openMediaViewer"]))(({typingStatus:e,avatarSize:t="medium",withMediaViewer:n,withUsername:r,withFullInfo:i,withUpdatingStatus:l,withChatType:b,noRtl:f,chat:p,onlineCount:O,areMessagesLoaded:g,lastSyncTime:v,loadFullChat:j,openMediaViewer:E})=>{const y=p&&Object(s.nb)(p),{id:T,isMin:N,isRestricted:C}=p||{};Object(a.n)(()=>{T&&!N&&i&&v&&j({chatId:T})},[T,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.l)(M,p))),p.isVerified&&a.a.createElement(m.a,null)),function(){if(l&&!g&&!C)return a.a.createElement("span",{className:"status",dir:"auto"},M("Updating"));if(!p)return;if(e)return a.a.createElement(h.a,{typingStatus:e});if(b)return a.a.createElement("div",{className:"status",dir:"auto"},M(Object(s.m)(p)));const t=r?p.username:void 0,n=function(e,t){const n=e(Object(s.m)(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 o})),n.d(t,"b",(function(){return l}));var a=n(19),r=n(48),c=n(9),s=n(60);let i=!1;function o(e,t,n,o=0,l=1500,d,u,m){if(d===a.b.Static)return void t.scrollIntoView({block:n});const{offsetTop:h}=t;if(void 0===d){const t=h-e.scrollTop;t<-l?e.scrollTop+=t+l:t>l&&(e.scrollTop+=t-l)}else d===a.b.Up?e.scrollTop=h+l:d===a.b.Down&&(e.scrollTop=Math.max(0,h-l));i=!0,Object(c.b)(()=>{!function(e,t,n,a=0,c,o){const{offsetTop:l,offsetHeight:d}=t,{scrollTop:u,offsetHeight:m,scrollHeight:h}=e,b=!o&&e.dataset.normalHeight?Number(e.dataset.normalHeight):m;let f;switch(n){case"start":f=l-a-u;break;case"end":f=l+d+a-(u+b);break;case"nearest":case"center":f=d0){const e=h-(u+b);f=Math.min(f,e)}const p=e.scrollTop+f,O=c||250+Math.abs(f)/1500*350,g=Date.now();Object(r.b)(O),Object(s.b)(()=>{const t=Math.min((Date.now()-g)/O,1),n=f*(1-function(e){return 1-(1-e)**3.5}(t));return e.scrollTop=Math.round(p-n),i=t<1,i})}(e,t,n,o,u,m)})}function l(){return i}},,function(e,t,n){"use strict";var a=n(0),r=n(8),c=n(24),s=n(20);n(223);var i=Object(a.h)(({id:e,label:t,subLabel:n,value:i,name:o,checked:l,disabled:d,hidden:u,isLoading:m,onChange:h})=>{const b=Object(c.a)(),f=Object(r.a)("Radio",d&&"disabled",u&&"hidden-widget",m&&"loading");return a.a.createElement("label",{className:f,dir:b.isRtl?"rtl":void 0},a.a.createElement("input",{type:"radio",name:o,value:i,id:e,checked:l,onChange:h,disabled:d||u}),a.a.createElement("div",{className:"Radio-main"},a.a.createElement("span",{className:"label",dir:"auto"},t),n&&a.a.createElement("span",{className:"subLabel",dir:"auto"},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";var a=n(0),r=n(19),c=n(3),s=n(25),i=n(37);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})()),h=Object(s.a)(),b=Object(i.a)(t),f=Object(i.a)(n);if(t&&!n&&(t!==b||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})=>{const a=m.current,s=a?n===r.e.Backwards?a[a.length-1]:a[0]:void 0;if(!t)return void(e&&e({offsetId:s}));u.current={...u.current,direction:n,offsetId:s};const{newViewportIds:i,areSomeLocal:d,areAllLocal:b}=o(t,s,n,l);!d||a&&Object(c.a)(a,i)||(m.current=i,h()),!b&&e&&e({offsetId:s})},[t,l,e,h]);return n?[t]:[m.current,p]}},function(e,t,n){"use strict";var a=n(0),r=n(5),c=n(1),s=n(112),i=n(104),o=n(105),l=n(111),d=n(33),u=n(113);n(221);t.a=({sticker:e,isInline:t=!1,observeIntersection:n,lastSyncTime:m})=>{const h=Object(a.q)(null),[b,f]=Object(d.a)(),p="sticker"+e.id,O=Object(i.b)(h,n),g=Object(o.a)(p+"?size=m",!O,r.ApiMediaFormat.BlobUrl,m),{transitionClassNames:v}=Object(l.a)(g,"slow"),j=Object(o.a)(p,!O,r.ApiMediaFormat.Lottie,m),E=Boolean(j),[y,T]=Object(a.r)(String(Math.random())),N=Object(a.m)(()=>{T(String(Math.random()))},[]);let C;C=t?.5*Object(s.l)(e).width:c.Bb;const w=`width: ${C}px; height: ${C}px;`;return a.a.createElement("div",{ref:h,className:"AnimatedEmoji media-inner",style:w,onClick:N},g&&!b&&a.a.createElement("img",{src:g,className:v,alt:""}),E&&a.a.createElement(u.a,{key:p,id:p,animationData:j,size:C,quality:1,play:O&&y,noLoop:!0,onLoad:f}))}},function(e,t,n){"use strict";function a(e,t){if(!t&&e===document.activeElement)return;const n=window.getSelection(),a=document.createRange();e.lastChild&&e.lastChild.nodeValue?(a.setStart(e.lastChild,e.lastChild.nodeValue.length),n.removeAllRanges(),n.addRange(a)):e.focus()}n.d(t,"a",(function(){return a}))},,function(e,t,n){"use strict";var a=n(0);t.a=(e,t)=>{Object(a.n)(()=>(document.hasFocus()||e(),window.addEventListener("blur",e),window.addEventListener("focus",t),()=>{window.removeEventListener("focus",t),window.removeEventListener("blur",e)}),[e,t])}},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&&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(200);t.a=()=>a.a.createElement("span",{className:"VerifiedIcon"})},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(37);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(1);t.a=e=>{e.play().catch(e=>{a.p&&console.warn(e)})}},function(e,t,n){"use strict";var a=n(0),r=n(9),c=n(156);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(5),r=n(7);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);t=r.d?t.replace(/([^<]*)<\/span>/g,"$1"):t.replace(/]+alt="([^"]+)"[^>]*>/gm,"$1");return t=t.replace(/<\/?span([^>]*)?>/g,""),t=t.replace(/ /g," "),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(/[*]{1}([^*\n]+)[*]{1}/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.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(34),c=n(8),s=n(47),i=n(37),o=n(33);n(211);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(212);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:h}=Object(r.a)(e);Object(a.n)(()=>e?Object(s.a)(n):void 0,[e,n]);const b=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",h);return a.a.createElement("div",{className:O,onDragLeave:p,onDragOver:()=>{d.current&&window.clearTimeout(d.current)},onDrop:n},a.a.createElement(l,{onFileSelect:b}),(t||u)&&a.a.createElement(l,{onFileSelect:f,isQuick:!0}))})},,function(e,t,n){"use strict";var a=n(0),r=n(2),c=n(6),s=n(4),i=n(22),o=n(8),l=n(24),d=n(109);n(194);t.a=Object(a.h)(Object(r.h)((e,{chatOrUserId:t})=>{if(!t)return{};return{chat:t?Object(c.f)(e,t):void 0,user:Object(s.lb)(t)?Object(c.Fb)(e,t):void 0}})(({icon:e,title:t,isMinimized:n,canClose:r,onClick:c,clickArg:u,chat:m,user:h,className:b})=>{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||h){p=a.a.createElement(d.a,{chat:m,user:h,size:"small",isSavedMessages:h&&h.isSelf});const e=!m||h&&!h.isSelf?Object(s.Y)(h):Object(s.l)(f,m,h);O=e?Object(i.a)(e):void 0}const g=Object(o.a)("PickerSelectedItem",b,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(9),r=n(60),c=n(7);function s(e,t){c.e?Object(a.b)(()=>{!function(e,t){const{scrollLeft:n,offsetWidth:a,scrollWidth:c}=e;let s=t-n;if(s<0){const e=-n;s=Math.max(s,e)}else if(s>0){const e=c-(n+a);s=Math.min(s,e)}const i=e.scrollLeft+s,o=Date.now();Object(r.a)(()=>{const t=Math.min((Date.now()-o)/450,1),n=s*(1-function(e){return 1-(1-e)**3.5}(t));return e.scrollLeft=Math.round(i-n),t<1})}(e,t)}):e.scrollTo({left:t,behavior:"smooth"})}},function(e,t,n){"use strict";var a=n(0);t.a=(e,t)=>{Object(a.n)(()=>{const t=e.current;if(t)return t.addEventListener("wheel",n,{passive:!0}),()=>{t.removeEventListener("wheel",n)};function n(e){e.deltaX||(t.scrollLeft+=e.deltaY/4)}},[e,t])}},function(e,t,n){"use strict";var a=n(0),r=n(2),c=n(9);t.a=(e,t,n,s)=>{const{loadMessage:i}=Object(r.d)(),o=Object(a.p)(()=>{const n=Object(c.g)(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(7);let c=0;t.a=(e,t,n)=>{const[s,i]=Object(a.r)(!1),[o,l]=Object(a.r)(void 0),d=Object(a.m)(e=>{t||2!==e.button||document.body.classList.add("no-selection")},[t]),u=Object(a.m)(e=>{document.body.classList.remove("no-selection"),t||n&&e.target.matches("a.text-entity-link[href]")||(e.preventDefault(),o||(document.body.classList.remove("no-selection"),0===c&&document.body.classList.add("has-context-menu"),c++,i(!0),l({x:e.clientX,y:e.clientY})))},[t,n,o]),m=Object(a.m)(()=>{i(!1)},[]),h=Object(a.m)(()=>{l(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.l)return;const n=e.current;if(!n)return;let a;const c=()=>{a&&(clearTimeout(a),a=void 0)},s=e=>{t||r.g&&window.document.body.classList.contains("enable-symbol-menu-transforms")||(c(),a=window.setTimeout(()=>(e=>{c();const{clientX:t,clientY:a}=e.touches[0];o||(n.addEventListener("touchend",(function e(t){n.removeEventListener("touchend",e,!0),t.stopImmediatePropagation(),t.preventDefault(),t.stopPropagation()}),!0),document.body.classList.add("no-selection"),i(!0),l({x:t,y:a}))})(e),250))};return n.addEventListener("touchstart",s,{passive:!0}),n.addEventListener("touchcancel",c,!0),n.addEventListener("touchend",c,!0),n.addEventListener("touchmove",c,{passive:!0}),()=>{c(),n.removeEventListener("touchstart",s),n.removeEventListener("touchcancel",c,!0),n.removeEventListener("touchend",c,!0),n.removeEventListener("touchmove",c)}},[o,t,e]),{isContextMenuOpen:s,contextMenuPosition:o,handleBeforeContextMenu:d,handleContextMenu:u,handleContextMenuClose:m,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(2),c=n(5),s=n(4),i=n(22),o=n(74),l=n(56);function d(e,t,n){const a=e.content.text;if(!a||!a.text){const t=Object(s.O)(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=a.filter((e,t)=>t>n&&e.offset>=c&&e.offsete(t,a.indexOf(t),a,r)).filter(Boolean);return o.forEach(e=>e.organizedIndexes.forEach(e=>i.add(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 h(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:T,type:N}=j;let C=e.substring(t,y);const w=C.length;C&&(m&&C.length>0&&"\n"===C[0]&&(C=C.substr(1),m=!1),C&&v.push(...h(C,n,r,s)));const M=t+w,L=M+T;let S=e.substring(y,y+T);const I=[];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,L,t,n===E.length-1);I.push(...a),e=r})}const A=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,I):function(e,t,n){const r="string"==typeof t&&t,s=n.length?n:t;if(!r)return h(s);switch(e.type){case c.ApiMessageEntityTypes.Bold:return a.a.createElement("strong",null,h(s));case c.ApiMessageEntityTypes.Blockquote:return a.a.createElement("blockquote",null,h(s));case c.ApiMessageEntityTypes.BotCommand:return a.a.createElement("a",{onClick:f,className:"text-entity-link",dir:"auto"},h(s));case c.ApiMessageEntityTypes.Hashtag:case c.ApiMessageEntityTypes.Cashtag:return a.a.createElement("a",{onClick:p,className:"text-entity-link",dir:"auto"},h(s));case c.ApiMessageEntityTypes.Code:return a.a.createElement("code",{className:"text-entity-code"},h(s));case c.ApiMessageEntityTypes.Email:return a.a.createElement("a",{href:"mailto:"+r,target:"_blank",rel:"noopener noreferrer",className:"text-entity-link",dir:"auto"},h(s));case c.ApiMessageEntityTypes.Italic:return a.a.createElement("em",null,h(s));case c.ApiMessageEntityTypes.MentionName:return a.a.createElement(o.a,{userId:e.userId},h(s));case c.ApiMessageEntityTypes.Mention:return a.a.createElement(o.a,{username:r},h(s));case c.ApiMessageEntityTypes.Phone:return a.a.createElement("a",{href:"tel:"+r,className:"text-entity-link",dir:"auto"},h(s));case c.ApiMessageEntityTypes.Pre:return a.a.createElement("pre",{className:"text-entity-pre"},h(s));case c.ApiMessageEntityTypes.Strike:return a.a.createElement("del",null,h(s));case c.ApiMessageEntityTypes.TextUrl:case c.ApiMessageEntityTypes.Url:return a.a.createElement(l.a,{url:b(r,e),text:r},h(s));case c.ApiMessageEntityTypes.Underline:return a.a.createElement("ins",null,h(s));default:return h(s)}}(j,S,I);if(Array.isArray(A)?v.push(...A):v.push(A),O&&L0&&"\n"===t[0]&&(t=t.substring(1)),t&&v.push(...h(t,n,r,s))}return{renderResult:v,entityEndIndex:L}}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 h(e,t,n,a){if(Array.isArray(e)){const r=[];return e.forEach(e=>{r.push(...h(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 b(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(9);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})),n.d(t,"c",(function(){return s})),n.d(t,"b",(function(){return i}));var a=n(1);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=>{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.p&&console.error(e)}}},function(e,t,n){"use strict";var a=n(0),r=n(8),c=n(33),s=n(24),i=n(16),o=n(31);n(192);t.a=Object(a.h)(({ref:e,children:t,parentContainerClassName:n,value:l,inputId:d,className:u,focused:m,isLoading:h,placeholder:b,disabled:f,canClose:p,onChange:O,onReset:g,onFocus:v,onBlur:j})=>{let E=Object(a.q)(null);e&&(E=e);const[y,T,N]=Object(c.a)(m);Object(a.n)(()=>{E.current&&(m?E.current.focus():E.current.blur())},[m,b]);const C=Object(s.a)();const w=Object(a.m)(e=>{if("ArrowDown"===e.key){const e=document.querySelector(`.${n} .ListItem-button`);e&&e.focus()}},[n]);return a.a.createElement("div",{className:Object(r.a)("SearchInput",u,y&&"has-focus"),dir:C.isRtl?"rtl":void 0},t,a.a.createElement("input",{ref:E,id:d,type:"text",dir:"auto",placeholder:b||C("Search"),className:"form-control",value:l,disabled:f,onChange:function(e){const{currentTarget:t}=e;O(t.value)},onFocus:function(){T(),v&&v()},onBlur:function(){N(),j&&j()},onKeyDown:w}),a.a.createElement("i",{className:"icon-search"}),h&&a.a.createElement(i.a,null),!h&&(l||p)&&g&&a.a.createElement(o.a,{round:!0,size:"tiny",color:"translucent",onClick:g},a.a.createElement("span",{className:"icon-close"})))})},function(e,t,n){"use strict";var a=n(7);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(2),c=n(6),s=n(4),i=n(22),o=n(24);n(201);t.a=Object(a.h)(Object(r.h)((e,{typingStatus:t})=>{if(!t.userId)return{};return{typingUser:Object(c.Fb)(e,t.userId)}})(({typingStatus:e,typingUser:t})=>{const n=Object(o.a)(),r=t&&!t.isSelf&&Object(s.Y)(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(2),c=n(6),s=n(4),i=n(3),o=n(24),l=n(22),d=n(109),u=n(107),m=n(31);n(204);t.a=Object(a.h)(Object(r.h)((e,{chat:t})=>{const n=Object(s.lb)(t.id),a=Object(c.O)(e,t.id),r=n&&!a,i=t&&Object(s.lb)(t.id)?Object(s.Y)(Object(c.Fb)(e,Object(s.U)(t))):void 0;return{isPrivateChat:n,isChatWithSelf:a,isChannel:Object(s.jb)(t),isBasicGroup:Object(s.ib)(t),isSuperGroup:Object(s.nb)(t),canDeleteForAll:r,contactName:i}},(e,t)=>Object(i.l)(t,["leaveChannel","deleteHistory","deleteChannel"]))(({isOpen:e,chat:t,isChannel:n,isPrivateChat:r,isChatWithSelf:c,isBasicGroup:i,isSuperGroup:h,canDeleteForAll:b,contactName:f,onClose:p,leaveChannel:O,deleteHistory:g,deleteChannel:v})=>{const j=Object(o.a)(),E=Object(s.l)(j,t),y=Object(a.m)(()=>{g({chatId:t.id,maxId:t.lastMessage.id,shouldDeleteForAll:!0}),p()},[g,t.id,t.lastMessage,p]),T=Object(a.m)(()=>{r||i?g({chatId:t.id,maxId:t.lastMessage.id,shouldDeleteForAll:!1}):!n&&!h||t.isCreator?(n||h)&&t.isCreator&&v({chatId:t.id}):O({chatId:t.id}),p()},[r,i,n,h,t.isCreator,t.lastMessage,t.id,p,g,O,v]);return a.a.createElement(u.a,{isOpen:e,onClose:p,className:"DeleteChatModal",header:a.a.createElement("div",{className:"modal-header",dir:j.isRtl?"rtl":void 0},a.a.createElement(d.a,{size:"tiny",chat:t,isSavedMessages:c}),a.a.createElement("h3",{className:"modal-title"},j(n&&!t.isCreator?"LeaveChannel":n&&t.isCreator?"ChannelDelete":i||h?"Group.LeaveGroup":"DeleteChatUser")))},n&&t.isCreator?a.a.createElement("p",null,Object(l.a)(j("ChatList.DeleteAndLeaveGroupConfirmation",E),["simple_markdown"])):n&&!t.isCreator||i||h?a.a.createElement("p",null,Object(l.a)(j("ChannelLeaveAlertWithName",E),["simple_markdown"])):a.a.createElement("p",null,Object(l.a)(j("ChatList.DeleteChatConfirmation",f),["simple_markdown"])),b&&a.a.createElement(m.a,{color:"danger",className:"confirm-dialog-button",isText:!0,onClick:y},f?j("ChatList.DeleteForEveryone",f):j("DeleteForAll")),a.a.createElement(m.a,{color:"danger",className:"confirm-dialog-button",isText:!0,onClick:T},j(n&&!t.isCreator?"LeaveChannel":n&&t.isCreator?"Chat.Input.Delete":i||h?"Group.LeaveGroup":b?"ChatList.DeleteForCurrentUser":"Delete")),a.a.createElement(m.a,{className:"confirm-dialog-button",isText:!0,onClick:p},j("Cancel")))}))},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(37);t.a=(e,t)=>{const n=Object(r.a)(t);return Object(a.o)(()=>{e(n||[])},t)}},function(e,t,n){"use strict";var a=n(0),r=n(58),c=n(4),s=n(104),i=n(118),o=n(105),l=n(176),d=n(177);t.a=Object(a.h)(({message:e,observeIntersection:t,smaller:n,uploadProgress:u,withDate:m,datetime:h,className:b,sender:f,isSelected:p,isSelectable:O,onCancelUpload:g,onDateClick:v})=>{const j=Object(a.q)(null),E=e.content.document,y=Object(r.b)(E)||"",{fileName:T,size:N,timestamp:C}=E,w=Object(s.b)(j,t),[M,L]=Object(a.r)(!1),{mediaData:S,downloadProgress:I}=Object(i.a)(Object(c.D)(e,"download"),!M),{isUploading:A,isTransferring:k,transferProgress:x}=Object(c.s)(e,u||I,M),D=Object(r.c)(E),R=D?Object(c.E)(e):void 0,_=D?E.previewBlobUrl:void 0,F=Object(o.a)(Object(c.D)(e,"pictogram"),!w),P=Object(a.m)(()=>{A?g&&g():L(e=>!e)},[A,g]),U=Object(a.m)(()=>{v(e.id,e.chatId)},[v,e.id,e.chatId]);return Object(a.n)(()=>{M&&S&&(Object(l.a)(S,T),L(!1))},[T,S,M]),a.a.createElement(d.a,{ref:j,name:T,extension:y,size:N,timestamp:m?h||C:void 0,thumbnailDataUri:R,previewData:_||F,smaller:n,isTransferring:k,isUploading:A,transferProgress:x,className:b,sender:f,isSelectable:O,isSelected:p,onClick:P,onDateClick:v?U:void 0})})},function(e,t,n){"use strict";var a=n(0),r=n(11),c=n(17);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(161),c=n(25),s=n(7);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,h,b,f,p,O,g,v,j,E,y,T=c-1,N=s-1,C=i+1,w=[],M=[],L=[],S=a[i],I=r[i],A=[],k=[];for(;o-- >0;){for(y=E=0,f=0;fT?T:p)<<2),u+=d[O++],m+=d[O++],h+=d[O++];for(b=0;b0?O<<2:0),g=y+A[b],v=y+k[b],u+=d[g++]-d[v++],m+=d[g++]-d[v++],h+=d[g++]-d[v++],E++;y+=c<<2}for(b=0;bN?0:c,u+=w[j],m+=M[j],h+=L[j];for(E=b<<2,f=0;f>>I,d[E+1]=m*S>>>I,d[E+2]=h*S>>>I,0==b&&(A[f]=((O=f+C)0?O*c:0),g=b+A[f],v=b+k[f],u+=w[g]-w[v],m+=M[g]-M[v],h+=L[g]-L[v],E+=c<<2}}e.putImageData(l,t,n)}},function(e,t,n){"use strict";var a=n(0),r=n(1),c=n(8),s=n(47),i=n(34),o=n(77),l=n(33),d=n(24),u=n(31);n(236);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:h})=>{const b=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)(""),[T,N]=Object(a.r)(!1),[C,w]=Object(a.r)(),[M,L]=Object(a.r)({});Object(a.n)(()=>e?Object(s.a)(h):void 0,[e,h]),Object(o.a)(e,b,h),Object(a.n)(()=>{g?f.current.focus():(y(""),N(!1))},[g]),Object(a.n)(()=>{p||(j(),L({}),w(void 0))},[j,p]),Object(a.n)(()=>{if(!e||!n)return;const t={};let{parentElement:a}=n.commonAncestorContainer;for(;a&&a.id!==r.v;){const e=m[a.tagName];e&&(t[e]=!0),a=a.parentElement}L(t)},[e,n,v]);const S=Object(a.m)(()=>{if(n)return n.toString()},[n]),I=Object(a.m)(()=>{if(n)return n.commonAncestorContainer.parentElement},[n]);function A(){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 k(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)(()=>{L(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"),L(e=>({...e,italic:!e.italic}))},[]),R=Object(a.m)(()=>{document.execCommand("underline"),L(e=>({...e,underline:!e.underline}))},[]),_=Object(a.m)(()=>{if(M.strikethrough){const e=I();if(!n||!e||"DEL"!==e.tagName||!e.textContent)return;return e.replaceWith(e.textContent),void L(e=>({...e,strikethrough:!1}))}const e=S();document.execCommand("insertHTML",!1,`${e}`),h()},[I,S,h,n,M.strikethrough]),F=Object(a.m)(()=>{if(M.monospace){const e=I();if(!n||!e||"CODE"!==e.tagName||!e.textContent)return;return e.replaceWith(e.textContent),void L(e=>({...e,monospace:!1}))}const e=S();document.execCommand("insertHTML",!1,`${e}`),h()},[I,S,h,n,M.monospace]);function P(){const e=E.includes("://")?E:"http://"+E;if(T){const t=I();if(!t||"A"!==t.tagName)return;return t.href=e,void h()}const t=S();!function(){if(!n)return;const e=window.getSelection();e&&(e.removeAllRanges(),e.addRange(n))}(),document.execCommand("insertHTML",!1,`${t}`),h()}const U=Object(a.m)(e=>{const t={KeyK:v,KeyB:x,KeyU:R,KeyI:D,KeyM:F,KeyS:_}[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:b,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:k("bold"),onClick:x},a.a.createElement("i",{className:"icon-bold"})),a.a.createElement(u.a,{color:"translucent",ariaLabel:"Italic text",className:k("italic"),onClick:D},a.a.createElement("i",{className:"icon-italic"})),a.a.createElement(u.a,{color:"translucent",ariaLabel:"Underlined text",className:k("underline"),onClick:R},a.a.createElement("i",{className:"icon-underlined"})),a.a.createElement(u.a,{color:"translucent",ariaLabel:"Strikethrough text",className:k("strikethrough"),onClick:_},a.a.createElement("i",{className:"icon-strikethrough"})),a.a.createElement(u.a,{color:"translucent",ariaLabel:"Monospace text",className:k("monospace"),onClick:F},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",C)},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),A()},onScroll:A})),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";var a=n(0),r=n(35),c=n(4),s=n(105),i=n(111);n(244);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.E)(e),d=Object(s.a)(Object(c.D)(e,"pictogram")),{shouldRenderThumb:u,shouldRenderFullMedia:m,transitionClassNames:h}=Object(i.a)(d,"slow"),b=Object(c.P)(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:h+" full-media",alt:""}),b&&a.a.createElement("span",{className:"video-duration"},b.isGif?"GIF":Object(r.e)(b.duration)))})},,function(e,t,n){"use strict";var a=n(0),r=n(2),c=n(7),s=n(35),i=n(4);var o=n(8),l=n(22);var d=n(118),u=n(34),m=n(135),h=n(174),b=n(24),f=n(31),p=n(119),O=n(26);n(218);const g=c.g?20:25,v=c.g?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)(Object(r.h)(e=>({theme:e.settings.byKey.theme}))(({theme:e,message:t,senderTitle:n,uploadProgress:r,renderingFor:E,date:y,lastSyncTime:T,className:N,isSelectable:C,isSelected:w,onPlay:M,onReadMedia:L,onCancelUpload:S,onDateClick:I})=>{const{content:{audio:A,voice:k},isMediaUnread:x}=t,D=Boolean(k),R=Object(a.q)(!1),_=Object(b.a)(),[F,P]=Object(a.r)(!1),U=T,{mediaData:B,downloadProgress:q}=Object(d.a)(Object(i.D)(t,"inline"),!U,Object(i.C)(t,"inline"));const{isBuffered:H,bufferedProgress:$,bufferingHandlers:K,checkBuffering:Y}=Object(m.a)(),{isPlaying:V,playProgress:W,playPause:z,setCurrentTime:G,duration:X}=Object(h.a)(Object(i.A)(t),Object(i.r)(t),B,K,Y,F,(function(){P(!0),M(t.id,t.chatId)}),Object(i.sb)(t));Object(a.n)(()=>{P(V)},[V]);const{isUploading:Q,isTransferring:J,transferProgress:Z}=Object(i.s)(t,r||q,F&&!H),{shouldRender:ee,transitionClassNames:te}=Object(u.a)(J),ne=Object(a.m)(()=>{Q?S&&S():(V||M(t.id,t.chatId),P(!F),z())},[V,Q,t.id,t.chatId,S,M,z,F]);Object(a.n)(()=>{V&&L&&x&&L()},[V,x,L]);const ae=Object(a.m)(e=>{if(R.current){const t=e.currentTarget.closest(".seekline,.waveform");if(t){const{width:n,left:a}=t.getBoundingClientRect();G(X*((e.clientX-a)/n))}}},[X,G]),re=Object(a.m)(e=>{R.current=!0,ae(e)},[ae]),ce=Object(a.m)(()=>{R.current=!1},[]),se=Object(a.m)(()=>{I(t.id,t.chatId)},[I,t.id,t.chatId]);const ie={handleStartSeek:re,handleSeek:ae,handleStopSeek:ce},oe=Object(i.tb)(t),le=Object(a.p)(()=>k&&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?"#C69C85":"#B0DEA6",m="dark"===i?"#868DF5":"#54a3e6",h="dark"===i?"#FFFFFF":"#53ad53",b=Math.min(l/30,1),f=Math.round(g+(v-g)*b),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?h:m});return a.a.createElement("img",{src:E,alt:"",width:y,height:T,className:"waveform",draggable:!1,onMouseDown:r,onMouseMove:c,onMouseUp:s})}(k,W,oe,ie,e),[k,W,oe,ie,e]),de=Object(o.a)("Audio media-inner",N,oe&&!E&&"own",E&&"bigger",w&&"audio-is-selected"),ue=["toggle-play"];ee?ue.push("loading"):V?ue.push("pause"):V||ue.push("play");const me=V||W>0&&W<1,he=Object(o.a)("content",me&&"with-seekline");return a.a.createElement("div",{className:de,dir:_.isRtl?"rtl":void 0},C&&a.a.createElement("div",{className:"message-select-control"},w&&a.a.createElement("i",{className:"icon-select"})),a.a.createElement(f.a,{round:!0,ripple:!c.g,size:E?"smaller":"tiny",className:ue.join(" "),ariaLabel:V?"Pause audio":"Play audio",onClick:ne,isRtl:_.isRtl},a.a.createElement("i",{className:"icon-play"}),a.a.createElement("i",{className:"icon-pause"})),ee&&a.a.createElement("div",{className:Object(o.a)("media-loading",te)},a.a.createElement(p.a,{progress:Z,transparent:!0,size:E?"m":"s",onClick:ne})),"searchResult"===E&&a.a.createElement(a.a.Fragment,null,a.a.createElement("div",{className:he},a.a.createElement("div",{className:"content-row"},a.a.createElement("p",{className:"title",dir:"auto"},Object(l.a)(function(){if(D)return n||"Voice";const{title:e,fileName:t}=A;return e||t}())),a.a.createElement("div",{className:"message-date"},y&&a.a.createElement(O.a,{className:"date",onClick:se},Object(s.g)(_,1e3*y)))),me&&j(W,$,ie),!me&&a.a.createElement("p",{className:"duration",dir:"auto"},W>0?Object(s.e)(X*W)+" / ":void 0,function(){if(D)return Object(s.e)(k.duration);const{performer:e}=A;return a.a.createElement(a.a.Fragment,null,e&&Object(l.a)(e),e&&n&&a.a.createElement("span",null,"•"),n&&Object(l.a)(n))}()))),"searchResult"!==E&&A&&function(e,t,n,r,c,i,o,d){const{title:u,performer:m,duration:h,fileName:b}=t,f=n||r>0&&r<1;return a.a.createElement("div",{className:"content"},a.a.createElement("p",{className:"title",dir:"auto"},Object(l.a)(u||b)),f&&j(r,c,i),!f&&a.a.createElement("div",{className:"meta",dir:"auto"},a.a.createElement("span",{className:"performer"},Object(l.a)(m||"Unknown")),o&&a.a.createElement(a.a.Fragment,null," ","•"," ",a.a.createElement(O.a,{className:"date",onClick:d},Object(s.d)(e,1e3*o)))),a.a.createElement("p",{className:"duration",dir:"auto"},r>0?Object(s.e)(h*r)+" / ":void 0,Object(s.e)(h)))}(_,A,V,W,$,ie,y,I?se:void 0),"searchResult"!==E&&k&&function(e,t,n){return a.a.createElement("div",{className:"content"},t,a.a.createElement("p",{className:"voice-duration",dir:"auto"},Object(s.e)(e.duration),n&&a.a.createElement("span",null,"•")))}(k,le,x))}))},function(e,t,n){"use strict";var a=n(0),r=n(140),c=n(37),s=n(141),i=n(24),o=n(8);n(198);var l=Object(a.h)(({className:e,title:t,active:n,badgeCount:r,isBadgeActive:c,previousActiveTab:s,onClick:i,clickArg:l})=>{const d=Object(a.q)(null);return Object(a.o)(()=>{if(!n||void 0===s)return;const e=d.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(l),ref:d},a.a.createElement("span",null,t,!!r&&a.a.createElement("span",{className:Object(o.a)("badge",c&&"active")},r),a.a.createElement("i",null)))});n(199);t.a=Object(a.h)(({tabs:e,activeTab:t,big:n,onSwitchTab:o})=>{const d=Object(a.q)(null),u=Object(c.a)(t);Object(s.a)(d),Object(a.n)(()=>{const e=d.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:d,dir:m.isRtl?"rtl":void 0},e.map((e,n)=>a.a.createElement(l,{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"};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";var a=n(0),r=n(2),c=n(4),s=n(24);t.a=({chat:e,privateChatUser:t,handleDelete:n,folderId:i,isPinned:o})=>{const l=Object(s.a)(),{toggleChatPinned:d,updateChatMutedState:u,toggleChatArchived:m,toggleChatUnread:h}=Object(r.d)();return Object(a.p)(()=>{if(!e)return;const a=t&&t.isSelf,r=e.unreadCount||e.hasUnreadMark?{title:l("MarkAsRead"),icon:"readchats",handler:()=>h({id:e.id})}:{title:l("MarkAsUnread"),icon:"unread",handler:()=>h({id:e.id})},s=o?{title:l("UnpinFromTop"),icon:"unpin",handler:()=>d({id:e.id,folderId:i})}:{title:l("PinToTop"),icon:"pin",handler:()=>d({id:e.id,folderId:i})},b=e.isMuted?{title:l("ChatList.Unmute"),icon:"unmute",handler:()=>u({chatId:e.id,isMuted:!1})}:{title:l("ChatList.Mute"),icon:"mute",handler:()=>u({chatId:e.id,isMuted:!0})},f=Object(c.hb)(e)?{title:l("Unarchive"),icon:"unarchive",handler:()=>m({id:e.id})}:{title:l("Archive"),icon:"archive",handler:()=>m({id:e.id})};return[r,s,...a?[]:[b,f],{title:Object(c.lb)(e.id)?l("Delete"):l(Object(c.d)(e)?"DeleteChat":Object(c.jb)(e)?"LeaveChannel":"Group.LeaveGroup"),icon:"delete",destructive:!0,handler:n}]},[e,t,l,o,n,h,d,i,u,m])}},function(e,t,n){"use strict";var a=n(0),r=n(35),c=n(24),s=n(170);n(203);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(108);n(202);!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.b,{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},h=r(),b=n(),f=a.getBoundingClientRect(),p=h?{width:h.offsetWidth,height:h.offsetHeight}:u,O=b?b.getBoundingClientRect():u;i+p.width+c0?(o("right"),i-=3):(o("left"),i=16),l+p.height{const{shouldRender:d,transitionClassNames:u}=Object(r.a)(e,void 0,void 0,!t&&void 0),m=Object(c.a)(e),h=Object(c.a)(l),b=Object(a.q)();return m&&!e&&(b.current=h),d&&a.a.createElement("div",{id:n,className:Object(s.a)(i,u),onClick:o},e?l():b.current())}},function(e,t,n){"use strict";n.d(t,"a",(function(){return i}));var a=n(0),r=n(37),c=n(25),s=n(39);function i(e,t){const n=Object(r.a)(e,!0),i=Object(a.q)(),o=Object(c.a)(),l=null!=e,d=null!=n;return l&&i.current&&(clearTimeout(i.current),i.current=void 0),Object(s.a)(()=>{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(175),c=n(57),s=n(156),i=n(39);t.a=(e,t,n,o,l,d=!1,u,m=!1)=>{const h=Object(a.q)(null),[b,f]=Object(a.r)(!1);let p=b;const[O,g]=Object(a.r)(0);Object(i.a)(()=>{h.current=Object(r.a)(e,(e,n)=>{switch(e){case"onPlay":f(!0);break;case"onPause":f(!1);break;case"onTimeUpdate":{const{proxy:e}=h.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}=h.current;b||n.paused||(f(!0),p=!0),l&&l(n)},[e]);const{play:v,pause:j,setCurrentTime:E,proxy:y,destroy:T}=h.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)(()=>()=>{T(m)},[T,m]),Object(c.a)(([e,t])=>{e===d&&n===t||y.src&&y.paused||d&&n&&!b&&v(n)},[d,n,b,v,y.src,y.paused]);const C=Object(a.m)(()=>{b?j():n&&v(n)},[n,j,v,b]);return{isPlaying:p,playProgress:O,playPause:C,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(7),r=n(134),c=n(156),s=n(2),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.zb)(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:h}=o.get(e);return h.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(34),c=n(111),s=n(8),i=n(35),o=n(58),l=n(112),d=n(22),u=n(24),m=n(119),h=n(26);n(217);t.a=Object(a.h)(({ref:e,name:t,size:n,extension:b="",timestamp:f,sender:p,thumbnailDataUri:O,previewData:g,className:v,smaller:j,isTransferring:E,isUploading:y,isSelectable:T,isSelected:N,transferProgress:C,onClick:w,onDateClick:M})=>{const L=Object(u.a)();let S=Object(a.q)(null);e&&(S=e);const{shouldRender:I,transitionClassNames:A}=Object(r.a)(E,void 0,!0),k=Object(o.a)(b),x=Object(o.e)(n),{shouldRenderThumb:D,shouldRenderFullMedia:R,transitionClassNames:_}=Object(c.a)(g,"slow"),{width:F,height:P}=Object(l.i)(j),U=Object(s.a)("File",v,j&&"smaller",w&&!y&&"interactive",N&&"file-is-selected");return a.a.createElement("div",{ref:S,className:U,dir:L.isRtl?"rtl":void 0},T&&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:w},O||g?a.a.createElement("div",{className:"file-preview media-inner"},D&&a.a.createElement("img",{src:O,width:F,height:P,className:"thumbnail",alt:""}),R&&a.a.createElement("img",{src:g,className:"full-media "+_,width:F,height:P,alt:""})):a.a.createElement("div",{className:"file-icon "+k},b.length<=4&&a.a.createElement("span",{className:"file-ext",dir:"auto"},b)),I&&a.a.createElement("div",{className:Object(s.a)("file-progress",k,A)},a.a.createElement(m.a,{progress:C,size:j?"s":"m",onClick:y?w:void 0})),w&&a.a.createElement("i",{className:Object(s.a)("icon-download",I&&"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&&C?Math.round(100*C)+"%":x),p&&a.a.createElement("span",{className:"file-sender"},Object(d.a)(p)),!p&&f&&a.a.createElement(a.a.Fragment,null," ",a.a.createElement(h.a,{onClick:M},Object(i.d)(L,1e3*f))))),p&&f&&a.a.createElement(h.a,{onClick:M},Object(i.g)(L,1e3*f)))})},function(e,t,n){"use strict";var a=n(0),r=n(1),c=n(34),s=n(8),i=n(47),o=n(120);n(224);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:h}=Object(c.a)(d),b=Object(a.m)(()=>{u(!1),setTimeout(l,150+r.c)},[l]);Object(a.n)(()=>d?Object(i.a)(b):void 0,[d,b]),Object(a.n)(()=>(m.current=window.setTimeout(b,t),()=>{m.current&&(clearTimeout(m.current),m.current=void 0)}),[t,b]);const f=Object(a.m)(()=>{m.current&&(clearTimeout(m.current),m.current=void 0)},[]),p=Object(a.m)(()=>{m.current=window.setTimeout(b,t)},[t,b]);return a.a.createElement(o.a,{className:"Notification-container",containerId:n},a.a.createElement("div",{className:Object(s.a)("Notification",h),onClick:b,onMouseEnter:f,onMouseLeave:p},a.a.createElement("div",{className:"content"},e)))})},function(e,t,n){"use strict";n.d(t,"a",(function(){return r}));var a=n(1);function r(e){const{commonAncestorContainer:t}=e;let n=t,r=1;for(;n&&n.id!==a.v&&r<5;)n=n.parentElement,r++;return Boolean(n&&n.id===a.v)}},function(e,t,n){"use strict";n.d(t,"a",(function(){return h}));var a=n(0),r=n(1),c=n(7),s=n(64),i=n(33),o=n(127);let l,d,u;const m=/[^-_:\p{L}\p{N}]+/iu;function h(e,t,h,b=r.v,f){const[p,O,g]=Object(i.a)(),[v,j]=Object(a.r)([]),[E,y]=Object(a.r)([]),T=Object(a.p)(()=>v.length&&h.length?h.map(e=>u.emojis[e]).filter(Boolean):[],[v,h]);Object(a.n)(()=>{const e=()=>{j(Object.keys(u.emojis))};u?e():async function(){l||(l=n.e(1).then(n.t.bind(null,313,3)),d=(await l).default,u=Object(s.b)(d));return l}().then(e)},[]),Object(a.n)(()=>{if(!e||!t||!v.length)return void g();const n=function(e){const t=document.createElement("div");t.innerHTML=e.replace("
","\n");const n=t.innerText,a=n[n.length-1],r=n.split(m).pop();if(!n.length||m.test(a)||!r||!r.startsWith(":"))return;return r.toLowerCase()}(t);if(!n)return y([]),void g();const a=n.substr(1),r=""===a?T:v.filter(e=>u.emojis[e].names.find(e=>e.includes(a))).slice(0,36).map(e=>u.emojis[e]);r.length?(O(),y(r)):g()},[v,t,e,O,T,g]);const N=Object(a.m)(e=>{const n=t.lastIndexOf(":");if(-1!==n){f(`${t.substr(0,n)}${e}`);const a=document.getElementById(b);c.g||requestAnimationFrame(()=>{Object(o.a)(a,!0)})}g()},[t,b,f,g]);return{isEmojiTooltipOpen:p,closeEmojiTooltip:g,filteredEmojis:E,insertEmoji:N}}},function(e,t,n){"use strict";var a=n(0),r=n(11),c=n(17);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(2),c=n(1),s=n(6),i=n(9),o=n(127),l=n(8),d=n(3),u=n(7),m=n(54),h=n(157),b=n(33),f=n(63),p=n(179),O=n(24),g=n(162);const v=u.g?256:416;t.a=Object(a.h)(Object(r.h)(e=>{const{chatId:t,threadId:n}=Object(s.y)(e)||{},{messageSendKeyCombo:a}=e.settings.byKey;return{currentChatId:t,messageSendKeyCombo:a,replyingToId:t&&n?Object(s.lb)(e,t,n):void 0,noTabCapture:e.isPollModalOpen||e.payment.isPaymentModalOpen}},(e,t)=>Object(d.l)(t,["editLastMessage","replyToNextMessage"]))(({id:e,editableInputId:t,html:n,placeholder:r,shouldSetFocus:s,shouldSupressFocus:d,shouldSupressTextFormatter:j,onUpdate:E,onSupressedFocus:y,onSend:T,currentChatId:N,replyingToId:C,noTabCapture:w,messageSendKeyCombo:M,editLastMessage:L,replyToNextMessage:S})=>{const I=Object(a.q)(null),A=Object(a.q)(null),k=Object(O.a)(),x=Object(a.q)(!1),[D,R,_]=Object(b.a)(),[F,P]=Object(a.r)(),[U,B]=Object(a.r)();Object(a.n)(()=>{K(!1)},[]),Object(h.a)(([e])=>{n!==I.current.innerHTML&&(I.current.innerHTML=n),n!==A.current.innerHTML&&(A.current.innerHTML=n),void 0!==e&&e!==n&&K(!n.length)},[n]);const q=Object(a.m)(()=>{I.current.closest(".from, .to")?setTimeout(q,350):Object(o.a)(I.current)},[]),H=Object(a.m)(()=>{_(),function(){const e=window.getSelection();e&&(e.removeAllRanges?e.removeAllRanges():e.empty&&e.empty())}()},[_]);function $(){if(u.e)return;const e=window.getSelection();if(!e||!e.rangeCount||x.current)return void _();const t=e.getRangeAt(0),n=t.toString().trim();if(j||!Object(p.a)(t)||!n||Object(f.a)(n)||!t.START_TO_END)return void _();const a=t.getBoundingClientRect(),r=I.current.getBoundingClientRect();let c=a.left+a.width/2-r.left;c<90?c=90:c>r.width-90&&(c=r.width-90),P({x:c,y:a.top-r.top}),B(t),R()}function K(e=!1){const t=I.current,n=A.current,a=Number(t.style.height.replace("px","")),r=Math.min(n.scrollHeight,v);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>v)};e?requestAnimationFrame(s):s()}Object(a.n)(()=>{u.l||q()},[N,q,C,s]),Object(a.n)(()=>{if(w)return;const e=Object(i.a)(e=>{"Tab"===e.key&&(e.preventDefault(),requestAnimationFrame(q))},2e3,!0,!1);return Object(m.a)({onTab:e})},[q,w]),Object(a.n)(()=>{const e=I.current;function t(){e.blur()}return d&&e.addEventListener("focus",t),()=>{e.removeEventListener("focus",t)}},[d]);const Y=Object(l.a)("form-control custom-scroll",n.length>0&&"touched",d&&"focus-disabled");return a.a.createElement("div",{id:e,onClick:d?y:void 0,dir:k.isRtl?"rtl":void 0},a.a.createElement("div",{ref:I,id:t||c.v,className:Y,contentEditable:!0,dir:"auto",onClick:q,onChange:function(e){const{innerHTML:t,textContent:n}=e.currentTarget;if(E("
"===t?"":t),!(u.l||n&&n.length)){const e=window.getSelection();e&&(I.current.blur(),e.removeAllRanges(),Object(o.a)(I.current,!0))}},onKeyDown:function(e){if(e.metaKey){const t="ArrowDown"===e.key?1:"ArrowUp"===e.key?-1:void 0;if(t)return e.preventDefault(),void S({targetIndexDelta:t})}"Enter"!==e.key||e.shiftKey?"ArrowUp"!==e.key||n.length||e.metaKey?e.target.addEventListener("keyup",(function t(){$(),e.target.removeEventListener("keyup",t)})):(e.preventDefault(),L()):u.e||u.b||!("enter"===M&&!e.shiftKey||"ctrl-enter"===M&&(e.ctrlKey||e.metaKey))||(e.preventDefault(),_(),T())},onMouseDown:function(e){2===e.button?!0!==x.current&&(x.current=!0,document.addEventListener("mousedown",(function e(){setTimeout(()=>{x.current=!1},100),window.removeEventListener("mouseup",e)})),document.addEventListener("keydown",(function e(t){"Esc"!==t.key&&"Escape"!==t.key||(setTimeout(()=>{x.current=!1},100),window.removeEventListener("keydown",e))}))):e.target.addEventListener("mouseup",(function t(){$(),e.target.removeEventListener("mouseup",t)}))},onContextMenu:function(e){u.b&&(e.preventDefault(),e.stopPropagation())},onTouchCancel:function(){u.b&&$()}}),a.a.createElement("div",{ref:A,className:Object(l.a)(Y,"clone"),dir:"auto"}),a.a.createElement("span",{className:"placeholder-text",dir:"auto"},r),a.a.createElement(g.a,{isOpen:D,anchorPosition:F,selectedRange:U,onClose:H}))}))},function(e,t,n){"use strict";var a=n(0),r=n(4),c=n(8),s=n(40),i=n(22),o=n(35),l=n(24),d=n(163),u=n(26),m=n(56);n(245);t.a=Object(a.h)(({message:e,senderTitle:t,onMessageClick:n})=>{const h=Object(l.a)();let b=Object(r.Q)(e);if(!b){const t=Object(r.n)(e);if(t){const{url:n,domain:a}=t,c=Object(r.N)(h,e);b={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(!b)return;const{siteName:p,url:O,displayUrl:g,title:v,description:j,photo:E}=b,y=!t&&Object(s.a)(j,170),T=Object(c.a)("WebLink scroll-item",!E&&"without-photo");return a.a.createElement("div",{className:T,"data-initial":(p||g)[0],dir:h.isRtl?"rtl":void 0},E&&a.a.createElement(d.a,{message:e}),a.a.createElement("div",{className:"content"},a.a.createElement(u.a,{isRtl:h.isRtl,className:"site-title",onClick:f},Object(i.a)(v||p||g)),y&&a.a.createElement(u.a,{isRtl:h.isRtl,className:"site-description",onClick:f},Object(i.a)(y)),a.a.createElement(m.a,{url:O,className:"site-name",text:"",isRtl:h.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:h.isRtl},Object(o.g)(h,1e3*e.date))))})},,,,function(e,t,n){"use strict";var a=n(0),r=n(2),c=n(5),s=n(1),i=n(7),o=n(37),l=n(3),d=n(4),u=n(6),m=n(125);let h;!function(e){e[e.Move=0]="Move",e[e.Opacity=1]="Opacity",e[e.None=2]="None"}(h||(h={}));var b=n(110),f=n(16),p=n(24),O=n(66),g=n(22),v=n(9),j=n(8),E=n(142),y=n(168),T=n(33),N=n(105),C=n(109),w=n(131),M=n(154),L=n(169),S=n(155),I=n(103),A=n(49),k=n(172);n(206);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(A.b)(e.unreadCount))):a.a.createElement("div",{className:c},Object(A.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(k.a,{isCustom:!0,className:"Badge-transition",isOpen:r},s)});n(207);var D,R=Object(a.h)(Object(r.h)((e,{chatId:t})=>{const n=Object(u.f)(e,t);if(!n||!n.lastMessage)return{};const{senderId:a,replyToMessageId:r,isOutgoing:s}=n.lastMessage,i=a?Object(u.Fb)(e,a):void 0,o=Object(d.t)(n.lastMessage),l=o&&r?Object(u.k)(e,n.id,r):void 0,{targetUserId:m,targetChatId:h}=o||{},b=Object(d.U)(n),{type:f}=Object(u.y)(e)||{};return{chat:n,isMuted:Object(d.Cb)(n,Object(u.db)(e),Object(u.cb)(e)),lastMessageSender:i,...s&&{lastMessageOutgoingStatus:Object(u.eb)(e,n.lastMessage)},...b&&{privateChatUser:Object(u.Fb)(e,b)},...m&&{actionTargetUser:Object(u.Fb)(e,m)},actionTargetChatId:h,actionTargetMessage:l,draft:Object(u.B)(e,t,c.MAIN_THREAD_ID),messageListType:f,animationLevel:e.settings.byKey.animationLevel,lastSyncTime:e.lastSyncTime}},(e,t)=>Object(l.l)(t,["openChat","focusLastMessage"]))(({style:e,chatId:t,folderId:n,orderDiff:r,animationType:c,isSelected:o,isPinned:l,chat:u,isMuted:m,privateChatUser:b,actionTargetUser:f,lastMessageSender:A,lastMessageOutgoingStatus:k,actionTargetMessage:D,actionTargetChatId:R,draft:_,messageListType:F,animationLevel:P,lastSyncTime:U,openChat:B,focusLastMessage:q})=>{const H=Object(a.q)(null),[$,K,Y]=Object(T.a)(),{lastMessage:V,typingStatus:W}=u||{},z=V&&Object(d.db)(V);Object(E.a)(t,z?V.replyToMessageId:void 0,D);const G=V&&!Object(d.M)(V)?Object(d.E)(V):void 0,X=Object(N.a)(V?Object(d.D)(V,"micro"):void 0),Q=Boolean(V&&Object(d.I)(V));Object(a.o)(()=>{if(0===P)return;const e=H.current;if(c===h.Opacity)e.style.opacity="0",Object(v.b)(()=>{e.classList.add("animate-opacity"),e.style.opacity="1"});else{if(c!==h.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+s.c)},[P,r,c]);const J=Object(a.m)(()=>{B({id:t}),o&&"thread"===F&&q()},[o,F,B,t,q]),Z=Object(y.a)({chat:u,privateChatUser:b,handleDelete:K,folderId:n,isPinned:l}),ee=Object(p.a)();if(!u)return;const te=Object(j.a)("Chat chat-item-clickable",Object(d.lb)(t)?"private":"group",o&&!i.g&&"selected");return a.a.createElement(I.a,{ref:H,className:te,style:e,ripple:!i.g,contextActions:Z,onClick:J},a.a.createElement("div",{className:"status"},a.a.createElement(C.a,{chat:u,user:b,withOnlineStatus:!0,isSavedMessages:b&&b.isSelf,lastSyncTime:U})),a.a.createElement("div",{className:"info"},a.a.createElement("div",{className:"title"},a.a.createElement("h3",null,Object(g.a)(Object(d.l)(ee,u,b))),u.isVerified&&a.a.createElement(w.a,null),m&&a.a.createElement("i",{className:"icon-muted-chat"}),u.lastMessage&&a.a.createElement(L.a,{message:u.lastMessage,outgoingStatus:k})),a.a.createElement("div",{className:"subtitle"},function(){if(W&&V&&W.timestamp>1e3*V.date)return a.a.createElement(M.a,{typingStatus:W});if(_&&_.text.length)return a.a.createElement("p",{className:"last-message",dir:"auto"},a.a.createElement("span",{className:"draft"},ee("Draft")),Object(g.a)(_.text));if(!V)return;if(z){const e=u&&(Object(d.jb)(u)||V.senderId===V.chatId)?u:A;return a.a.createElement("p",{className:"last-message",dir:"auto"},Object(g.a)(Object(O.a)(ee,V,e,f,D,R,{asPlain:!0})))}const e=Object(d.J)(ee,t,A);return a.a.createElement("p",{className:"last-message",dir:"auto"},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(d.N)(e,t));return a.a.createElement("span",{className:"media-preview"},a.a.createElement("img",{src:n,alt:"",className:r?"round":void 0}),Object(d.P)(t)&&a.a.createElement("i",{className:"icon-play"}),Object(g.a)(Object(d.N)(e,t,!0)))}(ee,V,X||G,Q))}(),a.a.createElement(x,{chat:u,isPinned:l,isMuted:m}))),a.a.createElement(S.a,{isOpen:$,onClose:Y,chat:u}))}));!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:s},users:{byId:i},lastSyncTime:o}=e,{chatId:l,threadId:d}=Object(u.y)(e)||{},m="folder"!==t?D[t]:void 0,h=n?Object(u.i)(e,n):void 0;return{chatsById:r,usersById:i,currentChatId:l,lastSyncTime:o,...m?{listIds:a[m],orderedPinnedIds:s[m]}:{chatFolder:h},isInDiscussionThread:d!==c.MAIN_THREAD_ID,notifySettings:Object(u.db)(e),notifyExceptions:Object(u.cb)(e)}},(e,t)=>Object(l.l)(t,["loadMoreChats","preloadTopChatMessages","openChat"]))(({folderType:e,folderId:t,noChatsText:n="Chat list is empty.",isActive:r,chatFolder:c,chatsById:u,usersById:p,listIds:O,currentChatId:g,orderedPinnedIds:v,lastSyncTime:j,isInDiscussionThread:E,notifySettings:y,notifyExceptions:T,loadMoreChats:N,preloadTopChatMessages:C,openChat:w})=>{const[M,L]=Object(a.p)(()=>"folder"===e&&c?Object(d.Bb)(u,p,c,y,T):[O,v],[e,c,u,p,y,T,O,v]),[S,I]=Object(a.p)(()=>{if(!M||"folder"===e&&!c)return[];const t=Object(d.Ab)(u,M,L,e),n=[...t.pinnedChats,...t.otherChats],a=n.map(({id:e})=>e);return[n.reduce((e,t,n)=>(e[t.id]=n,e),{}),a]},[M,L,e,c,u]),A=Object(o.a)(S),k=S&&A?Object(l.i)(S,(e,t)=>e-(void 0!==A[t]?A[t]:1/0)):{},x=Object(a.m)(()=>{N({listType:"archived"===e?"archived":"active"})},[N,e]),[D,_]=Object(m.a)(j?x:void 0,I,void 0,s.k,"all"===e&&!s.a),F=D&&Object(d.Ab)(u,D,L,e);Object(a.n)(()=>{j&&"all"===e&&C()},[j,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?h.None:r===1/0||r===-1/0||t(a)&&c<=s||n(a)&&s{const e=e=>{if(r&&I){if(e.ctrlKey&&e.code.startsWith("Digit")){const[,t]=e.code.match(/Digit(\d)/)||[];if(!t)return;const n=Number(t)-1;if(n>I.length-1)return;w({id:I[n]})}if(e.altKey){const t="ArrowDown"===e.key?1:"ArrowUp"===e.key?-1:void 0;if(!t)return;if(!g)return e.preventDefault(),void w({id:I[0]});const n=I.indexOf(g);if(-1===n)return;const a=I[n+t];e.preventDefault(),w({id:a})}}};return document.addEventListener("keydown",e,!1),()=>{document.removeEventListener("keydown",e,!1)}}),a.a.createElement(b.a,{className:"chat-list custom-scroll",items:D,onLoadMore:_,preloadBackwards:s.k,noFastList:!0,noScrollRestore:!0},D&&D.length&&F?function(){const e=I.indexOf(D[0]),n=e+F.pinnedChats.length;return a.a.createElement("div",{className:"scroll-container",style:i.b?`height: ${I.length*s.i}px`:void 0,teactFastList:!0},F.pinnedChats.map(({id:n},r)=>a.a.createElement(R,{key:n,teactOrderKey:r,chatId:n,isPinned:!0,folderId:t,isSelected:n===g&&!E,animationType:P(n),orderDiff:k[n],style:`top: ${(e+r)*s.i}px;`})),F.otherChats.map((e,r)=>a.a.createElement(R,{key:e.id,teactOrderKey:Object(d.j)(e),chatId:e.id,folderId:t,isSelected:e.id===g&&!E,animationType:P(e.id),orderDiff:k[e.id],style:`top: ${(n+r)*s.i}px;`})))}():D&&!D.length?a.a.createElement("div",{className:"no-results"},n):a.a.createElement(f.a,{key:"loading"}))}))},function(e,t,n){"use strict";n.d(t,"a",(function(){return m}));var a=n(0),r=n(5),c=n(1),s=n(4),i=n(51);var o=n(7),l=n(127),d=n(33);const u=/[^@_\d\wа-яё]+/i;function m(e,t,n,m=c.v,h,b,f){const[p,O,g]=Object(d.a)(),[v,j]=Object(a.r)(""),[E,y]=Object(a.r)([]),T=Object(a.m)(e=>{if(h&&f)return h.filter(({userId:t})=>{const n=f[t];return!(t===b||!n)&&(!e||function(e,t){const n=t.username.toLowerCase(),a=Object(s.Z)(t),r=a&&a.toLowerCase(),c=e.toLowerCase();return n.startsWith(c)||r&&Object(i.a)(r,c)}(e,n))})},[h,b,f]);Object(a.n)(()=>{if(!e||!t.length)return void g();const n=function(e){const t=document.createElement("div");t.innerHTML=e;const n=t.innerText,a=n[n.length-1],r=n.split(u).pop();if(!n.length||u.test(a)||!r||!r.startsWith("@"))return;return r}(t);if(n){const e=n?n.substr(1):"",t=T(e);t&&t.length?(O(),j(e),y(t)):g()}else g()},[e,t,T,O,g]);const N=Object(a.m)((e,a=!1)=>{if(!e.username&&!Object(s.Y)(e))return;const c=e.username?"@"+e.username:`${Object(s.Y)(e)}`,i=t.lastIndexOf("@");if(-1!==i){n(`${t.substr(0,i)}${c} `);const e=document.getElementById(m);o.g||requestAnimationFrame(()=>{Object(l.a)(e,a)})}g()},[t,m,n,g]);return{isMentionTooltipOpen:p,mentionFilter:v,closeMentionTooltip:g,insertMention:N,mentionFilteredMembers:E}}},function(e,t,n){"use strict";n.d(t,"a",(function(){return l}));var a=n(0),r=n(161),c=n(39),s=n(13),i=n(25);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){}])]); +//# sourceMappingURL=0.3ae91f9dfe0fbe76ec81.js.map \ No newline at end of file diff --git a/dist/0.3ae91f9dfe0fbe76ec81.js.map b/dist/0.3ae91f9dfe0fbe76ec81.js.map new file mode 100644 index 000000000..da96d856a --- /dev/null +++ b/dist/0.3ae91f9dfe0fbe76ec81.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/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/hooks/useHistoryBack.ts","webpack:///./src/components/right/hooks/useAsyncRendering.ts","webpack:///./src/hooks/useMediaWithDownloadProgress.ts","webpack:///./src/components/ui/ProgressSpinner.tsx","webpack:///./src/components/ui/Portal.ts","webpack:///./src/components/common/GroupChatInfo.tsx","webpack:///./src/util/fastSmoothScroll.ts","webpack:///./src/components/ui/Radio.tsx","webpack:///./src/components/ui/RadioGroup.tsx","webpack:///./src/hooks/useInfiniteScroll.ts","webpack:///./src/components/common/AnimatedEmoji.tsx","webpack:///./src/util/focusEditableElement.ts","webpack:///./src/hooks/useBackgroundMode.ts","webpack:///./src/util/captureEvents.ts","webpack:///./src/components/common/VerifiedIcon.tsx","webpack:///./src/util/cycleRestrict.ts","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/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/util/clipboard.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/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/components/common/Media.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/hooks/useChatContextActions.ts","webpack:///./src/components/common/LastMessageMeta.tsx","webpack:///./src/components/common/MessageOutgoingStatus.tsx","webpack:///./src/hooks/useContextMenuPosition.ts","webpack:///./src/components/ui/ShowTransition.tsx","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/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/ChatList.tsx","webpack:///./src/components/middle/composer/hooks/useMentionTooltip.ts","webpack:///./src/components/middle/composer/helpers/searchUserName.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","isContextMenuOpen","contextMenuPosition","handleBeforeContextMenu","handleContextMenu","handleContextMenuClose","handleContextMenuHide","useContextMenuHandlers","getTriggerElement","useCallback","current","getRootElement","closest","getMenuElement","querySelector","positionX","positionY","menuStyle","useContextMenuPosition","handleClick","e","handleMouseDown","IS_TOUCH_ENV","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","isFrozenRef","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","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","isClosedWithHistory","setIsClosedWithHistory","noAnimations","setNoAnimations","isFirstRender","setIsFirstRender","shouldRender","transitionClassNames","useShowTransition","modalRef","captureKeyboardListeners","onEsc","element","handleKeyDown","preventDefault","focusableElements","querySelectorAll","length","currentFocusedIndex","findIndex","em","isSameNode","document","activeElement","newFocusedIndex","shiftKey","addEventListener","removeEventListener","trapFocus","useHistoryBack","event","noAnimation","previousHistoryState","type","useOnChange","HistoryWrapper","pushState","back","useEffectWithPrevDeps","prevIsOpen","body","classList","toggle","dispatchHeavyAnimationEvent","remove","Portal","Button","round","color","ariaLabel","ANIMATION_DURATION","slide","fade","IS_MOBILE_SCREEN","reveal","CLEANED_UP","Symbol","animationLevel","settings","byKey","activeKey","name","direction","renderCount","shouldRestoreHeight","shouldCleanup","onStart","onStop","rendersRef","prevActiveKey","usePrevious","activateTimeoutRef","activeKeyChanged","useLayoutEffect","cleanup","container","childElements","add","childNodes","clearTimeout","isBackwards","keys","Object","Number","prevActiveIndex","indexOf","activeIndex","node","i","HTMLElement","width","offsetWidth","scrollBy","left","behavior","ANIMATION_END_DELAY","requestAnimationFrame","window","scrollLeft","height","clientHeight","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","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","SPEED","fast","slow","speed","noAnimate","isMediaLoaded","willAnimate","shouldRenderThumb","setShouldRenderThumb","MEDIA_VIEWER_MEDIA_QUERY","REM","parseInt","getComputedStyle","documentElement","fontSize","ROUND_VIDEO_DIMENSIONS","AVATAR_FULL_DIMENSIONS","DEFAULT_MEDIA_DIMENSIONS","cachedMaxWidth","getAvailableWidth","fromOwnMessage","isForwarded","isWebPagePhoto","extraPaddingRem","regularMaxWidth","Math","min","floor","innerWidth","getMaxMessageWidthRem","calculateDimensionsForMessageMedia","isGif","aspectRatio","calculateDimensions","getAvailableHeight","getMediaViewerAvailableDimensions","withFooter","isVideo","mql","matchMedia","windowWidth","windowHeight","windowSize","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","fastRaf","destroy","playAnimation","shouldRestart","goToAndPlay","pauseAnimation","pause","freezeAnimation","isPlaying","unfreezeAnimation","unfreezeAnimationOnRaf","useBackgroundMode","textParts","confirmLabel","confirmHandler","confirmIsDestructive","isButtonsInOneRow","split","textPart","isText","description","isEdge","onTouchStart","x","touches","pageX","onTouchEnd","onPopState","isHistoryChangedByUser","states","IS_IOS","console","log","useAsyncRendering","dependencies","shouldRenderRef","timeoutRef","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","containerId","elementRef","createElement","appendChild","TeactDOM","removeChild","chatId","selectChat","onlineCount","selectChatOnlineCount","withChatType","loadFullChat","isSuperGroup","isChatSuperGroup","isMin","isRestricted","getChatTypeString","handle","groupStatus","chatTypeString","membersCount","getGroupStatus","onlineStatus","renderStatusOrTyping","isAnimating","fastSmoothScroll","position","maxDistance","forceDirection","forceDuration","forceCurrentContainerHeight","FocusDirection","Static","scrollIntoView","block","offset","Up","Down","elementTop","elementHeight","containerHeight","targetContainerHeight","dataset","normalHeight","path","remainingPath","duration","abs","startAt","animateSingle","t","currentPath","transition","scrollWithJs","isAnimatingScroll","label","subLabel","value","checked","hidden","isLoading","onChange","Spinner","options","selected","loadingOption","handleChange","currentTarget","option","getViewportSlice","sourceIds","offsetId","listSlice","index","indexForDirection","to","newViewportIds","slice","areSomeLocal","areAllLocal","listIds","forceFullPreload","lastParamsRef","viewportIdsRef","prevListIds","prevIsDisabled","areSortedArraysEqual","viewportIds","getMore","AnimatedEmoji","isInline","observeIntersection","isAnimationLoaded","markAnimationLoaded","useFlag","localMediaHash","previewBlobUrl","Lottie","playKey","setPlayKey","String","random","STICKER_SIZE_TWO_FA","focusEditableElement","force","selection","getSelection","range","createRange","lastChild","nodeValue","setStart","removeAllRanges","addRange","onBlur","onFocus","hasFocus","SwipeDirection","captureEvents","captureEvent","currentSwipeAxis","hasMoved","onCapture","excludedClosestSelector","onMove","onRelease","pageY","withCursor","dragOffsetX","dragOffsetY","onDrag","onSwipe","xAbs","yAbs","Left","Right","processSwipe","passive","VerifiedIcon","cycleRestrict","useCurrentOrPrev","shouldSkipUndefined","shouldForceCurrent","prev","mediaEl","catch","err","DEBUG","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","href","startsWith","Email","Phone","textContent","TextUrl","Url","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","chatOrUserId","isMinimized","canClose","clickArg","iconElement","titleText","getUserFirstOrLastName","fastSmoothScrollHorizontal","containerWidth","scrollWidth","animate","scrollTo","deltaX","deltaY","messageId","message","replyOriginForId","loadMessage","getDispatch","loadMessageThrottled","throttled","contextMenuCounter","isMenuDisabled","shouldDisableOnLink","setIsContextMenuOpen","setContextMenuPosition","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","filter","organizedIndex","shouldRenderAsHtml","renderMessagePart","result","deleteLineBreakAfterPre","organizedEntites","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","CLIPBOARD_ITEM_SUPPORTED","navigator","clipboard","ClipboardItem","textCopyEl","copyTextToClipboard","str","rangeToRestore","rangeCount","getRangeAt","select","execCommand","copyImageToClipboard","imageUrl","canvas","ctx","getContext","imageEl","Image","onload","img","drawImage","toBlob","copyBlobToClipboard","pngBlob","write","error","parentContainerClassName","inputId","focused","placeholder","onReset","inputRef","isInputFocused","markInputFocused","unmarkInputFocused","blur","overflow","typingUser","typingUserName","isPrivateChat","isChatWithSelf","selectIsChatWithSelf","canDeleteForAll","contactName","getPrivateChatUserId","isChannel","isChatChannel","isBasicGroup","isChatBasicGroup","leaveChannel","deleteHistory","deleteChannel","chatTitle","handleDeleteMessageForAll","maxId","lastMessage","shouldDeleteForAll","handleDeleteChat","isCreator","patchSafariProgressiveAudio","audioEl","patchedForSafari","patchForSafariInProgress","paused","once","cb","prevDeps","uploadProgress","withDate","datetime","sender","isSelected","isSelectable","onCancelUpload","onDateClick","extension","getDocumentExtension","fileName","timestamp","isDownloadAllowed","setIsDownloadAllowed","useMediaWithDownloadProgress","getMessageMediaHash","isUploading","isTransferring","transferProgress","getMediaTransferState","hasPreview","getDocumentHasPreview","thumbDataUri","getMessageMediaThumbDataUri","localBlobUrl","previewData","isAllowed","handleDateClick","download","thumbnailDataUri","StickerSetModal","useModuleLoader","Bundles","Extra","useCanvasBlur","withRaf","canvasRef","processBlur","alpha","IS_CANVAS_FILTER_SUPPORTED","RADIUS","fastBlur","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","bold","handleItalicText","italic","handleUnderlineText","underline","handleStrikethroughText","replaceWith","handleMonospaceText","handleLinkUrlConfirm","formattedLinkUrl","restoreSelection","KeyK","KeyB","KeyU","KeyI","KeyM","KeyS","code","altKey","ctrlKey","metaKey","linkUrlConfirmClassName","autoComplete","inputMode","idPrefix","mediaBlobUrl","getMessageVideo","formatMediaDuration","MIN_SPIKES","MAX_SPIKES","renderSeekline","playProgress","handleStartSeek","handleSeek","handleStopSeek","onMouseMove","onMouseUp","theme","senderTitle","renderingFor","date","onPlay","onReadMedia","audio","voice","isMediaUnread","isVoice","isSeeking","isActivated","setIsActivated","shouldDownload","getMessageMediaFormat","useBuffering","playPause","setCurrentTime","useAudioPlayer","getMessageKey","getMediaDuration","isMessageLocal","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","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","getReadableErrorText","isSlowMode","textParams","extraPartIndex","errorMessage","reduce","acc","privateChatUser","handleDelete","folderId","isPinned","toggleChatPinned","updateChatMutedState","toggleChatArchived","toggleChatUnread","actionUnreadMark","unreadCount","hasUnreadMark","actionPin","actionMute","isMuted","actionArchive","isChatArchived","getCanDeleteChat","outgoingStatus","Keys","extraPaddingX","extraTopPadding","setPositionX","setPositionY","setStyle","triggerEl","emptyRect","menuEl","rootEl","triggerRect","menuRect","rootRect","ShowTransition","isCustom","prevChildren","fromChildrenRef","usePrevDuringAnimation","isCurrentPresent","isPrevPresent","trackId","originalDuration","handlers","onInit","shouldPlay","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","onDismiss","setIsOpen","timerRef","closeAndDismiss","handleMouseEnter","handleMouseLeave","onMouseEnter","onMouseLeave","isSelectionInsideInput","selectionRange","parentNode","emojiDataPromise","emojiRawData","emojiData","RE_NOT_EMOJI_SEARCH","useEmojiTooltip","recentEmojiIds","onUpdateHtml","markIsOpen","unmarkIsOpen","emojiIds","setEmojiIds","filteredEmojis","setFilteredEmojis","recentEmojis","emojiId","emojis","uncompressEmoji","ensureEmojiData","tempEl","lastSymbol","lastWord","pop","test","toLowerCase","getEmojiCode","matched","names","find","insertEmoji","textEmoji","atIndex","lastIndexOf","messageInput","getElementById","isEmojiTooltipOpen","closeEmojiTooltip","EmojiTooltip","MAX_INPUT_HEIGHT","currentChatId","threadId","selectCurrentMessageList","messageSendKeyCombo","replyingToId","selectReplyingToId","noTabCapture","isPollModalOpen","payment","isPaymentModalOpen","editableInputId","shouldSetFocus","shouldSupressFocus","shouldSupressTextFormatter","onUpdate","onSupressedFocus","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","captureFirstTab","onTab","supressFocus","contentEditable","targetIndexDelta","handleKeyUp","IS_ANDROID","closeContextMenuMouseListener","closeContextMenuKeyListener","handleMouseUp","onTouchCancel","onMessageClick","linkData","getMessageWebPage","getFirstLinkInMessage","domain","messageText","getMessageSummaryText","siteName","handleMessageClick","displayUrl","truncatedDescription","trimText","data-initial","ChatAnimationTypes","isShown","renderContent","unreadMentionsCount","formatIntegerCompact","FolderTypeToListType","replyToMessageId","isOutgoing","lastMessageSender","lastMessageAction","getMessageAction","actionTargetMessage","selectChatMessage","targetUserId","actionTargetUserId","targetChatId","actionTargetChatId","privateChatUserId","messageListType","selectIsChatMuted","selectNotifySettings","selectNotifyExceptions","lastMessageOutgoingStatus","selectOutgoingStatus","actionTargetUser","draft","selectDraft","MAIN_THREAD_ID","orderDiff","animationType","openChat","focusLastMessage","isDeleteModalOpen","openDeleteModal","closeDeleteModal","isAction","isActionMessage","useEnsureMessage","mediaThumbnail","getMessageSticker","isRoundVideo","getMessageRoundVideo","Opacity","opacity","Move","useChatContextActions","Avatar","LastMessageMeta","TypingStatus","actionOrigin","renderActionMessageText","asPlain","senderName","getMessageSenderName","blobUrl","renderMessageSummary","renderLastMessageOrTyping","DeleteChatModal","folderType","chats","byId","chatsById","orderedPinnedIds","users","usersById","currentThreadId","listType","chatFolder","selectChatFolder","isInDiscussionThread","notifySettings","notifyExceptions","noChatsText","isActive","loadMoreChats","preloadTopChatMessages","currentListIds","currentPinnedIds","prepareFolderListIds","orderById","orderedIds","newChatArrays","prepareChatList","singleList","pinnedChats","otherChats","newOrderedIds","prevOrderById","orderDiffById","mapValues","order","Infinity","loadMoreOfType","useInfiniteScroll","CHAT_LIST_SLICE","ALL_CHATS_PRELOAD_DISABLED","chatArrays","getAnimationType","movesUp","movesDown","orderDiffIds","numberOfUp","numberOfDown","None","useChatAnimationType","digit","match","nextId","viewportOffset","pinnedOffset","CHAT_HEIGHT_PX","teactOrderKey","getChatOrder","renderChats","Loading","RE_NOT_USERNAME_SEARCH","useMentionTooltip","canSuggestMembers","groupChatMembers","currentUserId","currentFilter","setCurrentFilter","filteredMembers","setFilteredMembers","getFilteredMembers","usernameLowered","fullNameLowered","filterLowered","searchWords","searchUserName","usernameFilter","getUsernameFilter","membersToMention","insertMention","forceFocus","insertedHtml","isMentionTooltipOpen","mentionFilter","closeMentionTooltip","mentionFilteredMembers","cache","useBlurSync","blurredRef","isChanged","imgToCanvas","blurredAsync","blurredDataUri","useBlur"],"mappings":"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AK,GAAI,IAAK,GAAI,IAAK,EAAG,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,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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","file":"0.3ae91f9dfe0fbe76ec81.js","sourcesContent":["import { RefObject } from 'react';\nimport React, { FC, useRef, useCallback } from '../../lib/teact/teact';\n\nimport { IS_TOUCH_ENV } from '../../util/environment';\nimport buildClassName from '../../util/buildClassName';\nimport useContextMenuHandlers from '../../hooks/useContextMenuHandlers';\nimport useContextMenuPosition from '../../hooks/useContextMenuPosition';\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\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 }, [disabled, onClick]);\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 isFrozenRef = useRef();\n const onUnfreezeRef = useRef();\n\n rootCallbackRef.current = rootCallback;\n\n const freeze = useCallback(() => {\n isFrozenRef.current = true;\n }, []);\n\n const unfreeze = useCallback(() => {\n isFrozenRef.current = false;\n\n if (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 (isFrozenRef.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} & 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}) => {\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)}\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 } = 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,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['loadFullUser', 'openMediaViewer']),\n)(PrivateChatInfo));\n","import React, {\n FC, useEffect, useRef, useState,\n} from '../../lib/teact/teact';\n\nimport { HistoryWrapper } from '../../util/history';\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';\nimport useOnChange from '../../hooks/useOnChange';\n\nimport Button from './Button';\nimport Portal from './Portal';\n\nimport './Modal.scss';\n\nconst ANIMATION_DURATION = 200;\n\ntype OwnProps = {\n title?: string;\n className?: string;\n isOpen?: boolean;\n header?: FC;\n hasCloseButton?: boolean;\n noBackdrop?: boolean;\n children: any;\n onClose: () => void;\n onCloseAnimationEnd?: () => void;\n onEnter?: () => void;\n};\n\nconst Modal: FC = (props) => {\n const {\n title,\n className,\n isOpen,\n header,\n hasCloseButton,\n noBackdrop,\n children,\n onClose,\n onCloseAnimationEnd,\n onEnter,\n } = props;\n const [isClosedWithHistory, setIsClosedWithHistory] = useState(false);\n const [noAnimations, setNoAnimations] = useState(false);\n const [isFirstRender, setIsFirstRender] = useState(true);\n const {\n shouldRender,\n transitionClassNames,\n } = useShowTransition(isOpen, onCloseAnimationEnd, noAnimations, undefined, noAnimations);\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 useHistoryBack((event, noAnimation, previousHistoryState) => {\n if (previousHistoryState && previousHistoryState.type === 'modal') {\n setIsClosedWithHistory(true);\n if (noAnimation) {\n setNoAnimations(true);\n setTimeout(() => setNoAnimations(false), ANIMATION_DURATION);\n }\n onClose();\n }\n });\n\n useOnChange(() => {\n if (isFirstRender) {\n setIsFirstRender(false);\n return;\n }\n if (isOpen) {\n HistoryWrapper.pushState({\n type: 'modal',\n });\n } else if (!isClosedWithHistory) {\n HistoryWrapper.back();\n } else {\n setIsClosedWithHistory(false);\n }\n }, [isOpen]);\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 { withGlobal } from '../../lib/teact/teactn';\n\nimport { ANIMATION_END_DELAY } from '../../config';\nimport { IS_MOBILE_SCREEN } from '../../util/environment';\nimport useForceUpdate from '../../hooks/useForceUpdate';\nimport usePrevious from '../../hooks/usePrevious';\nimport buildClassName from '../../util/buildClassName';\nimport { dispatchHeavyAnimationEvent } from '../../hooks/useHeavyAnimationCheck';\n\nimport './Transition.scss';\n\ntype ChildrenFn = (isActive: boolean, isFrom: boolean) => any;\ntype OwnProps = {\n ref?: RefObject;\n activeKey: number;\n name: (\n 'none' | 'slide' | 'slide-reversed' | 'mv-slide' | 'slide-fade' | 'zoom-fade' | 'scroll-slide' | 'slide-layers'\n | 'fade' | 'push-slide' | 'reveal'\n );\n direction?: 'auto' | 'inverse' | 1 | -1;\n renderCount?: number;\n shouldRestoreHeight?: boolean;\n shouldCleanup?: boolean;\n id?: string;\n className?: string;\n onStart?: () => void;\n onStop?: () => void;\n children: ChildrenFn;\n};\n\ntype StateProps = {\n animationLevel: number;\n};\n\nexport const ANIMATION_DURATION = {\n slide: 450,\n 'slide-reversed': 450,\n 'mv-slide': 400,\n 'slide-fade': 400,\n 'zoom-fade': 150,\n 'scroll-slide': 500,\n fade: 150,\n 'slide-layers': IS_MOBILE_SCREEN ? 450 : 300,\n 'push-slide': 300,\n reveal: 350,\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 id,\n className,\n onStart,\n onStop,\n children,\n animationLevel,\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 activateTimeoutRef = useRef();\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) {\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 if (activateTimeoutRef.current) {\n clearTimeout(activateTimeoutRef.current);\n activateTimeoutRef.current = undefined;\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 if (name === 'scroll-slide') {\n const width = container.offsetWidth;\n container.scrollBy({\n left: activeIndex > prevActiveIndex ? width : -width,\n behavior: 'smooth',\n });\n }\n\n if (animationLevel > 0) {\n dispatchHeavyAnimationEvent(ANIMATION_DURATION[name] + ANIMATION_END_DELAY);\n }\n\n requestAnimationFrame(() => {\n container.classList.add('animating');\n\n activateTimeoutRef.current = window.setTimeout(() => {\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 (name === 'scroll-slide') {\n container.scrollLeft = activeKey * container.offsetWidth;\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 cleanup();\n\n if (onStop) {\n onStop();\n }\n });\n }, ANIMATION_DURATION[name] + ANIMATION_END_DELAY);\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 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' ?
{render(key === activeKey, key === prevActiveKey)}
: undefined\n );\n });\n\n const fullClassName = buildClassName(\n 'Transition',\n className,\n animationLevel === 0 && name === 'scroll-slide' ? 'slide' : name,\n );\n\n return (\n
\n {contents}\n
\n );\n};\n\nexport default withGlobal((global) => {\n const { animationLevel } = global.settings.byKey;\n return { animationLevel };\n})(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 }) => 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(() => onLoadMore({ direction: LoadMoreDirection.Backwards }), 1000, true, false),\n debounce(() => onLoadMore({ direction: LoadMoreDirection.Forwards }), 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();\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 { 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 { ApiPhoto, ApiVideo, ApiSticker } from '../../../api/types';\nimport { getPhotoInlineDimensions, getVideoDimensions, IDimensions } from '../../../modules/helpers';\nimport windowSize from '../../../util/windowSize';\nimport { IS_MOBILE_SCREEN } from '../../../util/environment';\nimport { STICKER_SIZE_INLINE_DESKTOP_FACTOR, STICKER_SIZE_INLINE_MOBILE_FACTOR } from '../../../config';\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 };\n\nconst DEFAULT_MEDIA_DIMENSIONS: IDimensions = { width: 100, height: 100 };\nconst LIKE_STICKER_ID = '1258816259753933';\nconst MOBILE_SCREEN_MAX_MESSAGE_SCREEN_WIDTH = 0.69;\n\nlet cachedMaxWidth: number | undefined;\n\nfunction getMaxMessageWidthRem(fromOwnMessage: boolean) {\n const regularMaxWidth = fromOwnMessage ? 30 : 29;\n if (!IS_MOBILE_SCREEN) {\n return regularMaxWidth;\n }\n\n // @optimization Limitation: changing device screen width not supported\n if (!cachedMaxWidth) {\n cachedMaxWidth = Math.min(\n regularMaxWidth,\n Math.floor(window.innerWidth * MOBILE_SCREEN_MAX_MESSAGE_SCREEN_WIDTH) / REM,\n );\n }\n\n return cachedMaxWidth;\n}\n\nfunction getAvailableWidth(\n fromOwnMessage: boolean,\n isForwarded?: boolean,\n isWebPagePhoto?: boolean,\n) {\n const extraPaddingRem = isForwarded || isWebPagePhoto ? 1.625 : 0;\n const availableWidthRem = getMaxMessageWidthRem(fromOwnMessage) - 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}: {\n width: number;\n height: number;\n fromOwnMessage: boolean;\n isForwarded?: boolean;\n isWebPagePhoto?: boolean;\n isGif?: boolean;\n}): IDimensions {\n const aspectRatio = height / width;\n const availableWidth = getAvailableWidth(fromOwnMessage, isForwarded, isWebPagePhoto);\n const availableHeight = getAvailableHeight(isGif, aspectRatio);\n\n return calculateDimensions(availableWidth, availableHeight, width, height);\n}\n\nexport function getMediaViewerAvailableDimensions(withFooter: boolean, isVideo: boolean): IDimensions {\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) {\n const { width, height } = getPhotoInlineDimensions(photo) || DEFAULT_MEDIA_DIMENSIONS;\n\n return calculateDimensionsForMessageMedia({\n width,\n height,\n fromOwnMessage,\n isForwarded,\n isWebPagePhoto,\n });\n}\n\nexport function calculateVideoDimensions(\n video: ApiVideo,\n fromOwnMessage: boolean,\n isForwarded?: 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 });\n}\n\nexport function getPictogramDimensions(): IDimensions {\n return {\n width: 2 * REM,\n height: 2 * REM,\n };\n}\n\nexport function getDocumentThumbnailDimensions(smaller?: boolean): IDimensions {\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): IDimensions {\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 = (IS_MOBILE_SCREEN ? STICKER_SIZE_INLINE_MOBILE_FACTOR : STICKER_SIZE_INLINE_DESKTOP_FACTOR) * REM;\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 }: IDimensions, withFooter: boolean, isVideo: boolean = false,\n): IDimensions {\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): IDimensions {\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","// This is unsafe and can be not chained as `popstate` event is asynchronous\n\nimport { useEffect } from '../lib/teact/teact';\nimport { IS_IOS } from '../util/environment';\nimport { HistoryWrapper } from '../util/history';\n\ntype HistoryBackFunction = ((event: PopStateEvent, noAnimation: boolean, previousHistoryState: any) => void);\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 = 60;\nconst SAFARI_EDGE_BACK_GESTURE_DURATION = 200;\nlet isEdge = false;\n\nconst onTouchStart = (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 isEdge = true;\n }\n};\n\nconst onTouchEnd = () => {\n if (isEdge) {\n setTimeout(() => {\n isEdge = false;\n }, SAFARI_EDGE_BACK_GESTURE_DURATION);\n }\n};\n\nif (IS_IOS) {\n // eslint-disable-next-line no-console\n console.log('Adding event listeners for useHistoryBack');\n window.addEventListener('touchstart', onTouchStart);\n window.addEventListener('touchend', onTouchEnd);\n}\n\nexport default function useHistoryBack(handler: NoneToVoidFunction | HistoryBackFunction) {\n const onPopState = (event: PopStateEvent) => {\n // Check if the event was caused by History API call or the user\n if (!HistoryWrapper.isHistoryChangedByUser) {\n // HACK: Handle multiple event listeners.\n // onTickChange doesn't work on Safari for some reason\n setTimeout(() => {\n HistoryWrapper.isHistoryChangedByUser = true;\n }, 0);\n return;\n }\n handler(event, isEdge, HistoryWrapper.states[HistoryWrapper.states.length - 1]);\n };\n\n\n useEffect(() => {\n window.addEventListener('popstate', onPopState);\n\n return () => {\n window.removeEventListener('popstate', onPopState);\n };\n });\n}\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 { 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 { 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 { FocusDirection } from '../types';\n\nimport { dispatchHeavyAnimationEvent } from '../hooks/useHeavyAnimationCheck';\nimport { fastRaf } from './schedulers';\nimport { animateSingle } from './animation';\n\nconst MAX_DISTANCE = 1500;\nconst MIN_JS_DURATION = 250;\nconst MAX_JS_DURATION = 600;\n\nlet isAnimating = false;\n\nexport default function fastSmoothScroll(\n container: HTMLElement,\n element: HTMLElement,\n position: ScrollLogicalPosition,\n margin = 0,\n maxDistance = MAX_DISTANCE,\n forceDirection?: FocusDirection,\n forceDuration?: number,\n forceCurrentContainerHeight?: boolean,\n) {\n if (forceDirection === FocusDirection.Static) {\n element.scrollIntoView({ block: position });\n\n return;\n }\n\n const { offsetTop } = element;\n\n if (forceDirection === undefined) {\n const offset = offsetTop - container.scrollTop;\n\n if (offset < -maxDistance) {\n container.scrollTop += (offset + maxDistance);\n } else if (offset > maxDistance) {\n container.scrollTop += (offset - maxDistance);\n }\n } else if (forceDirection === FocusDirection.Up) {\n container.scrollTop = offsetTop + maxDistance;\n } else if (forceDirection === FocusDirection.Down) {\n container.scrollTop = Math.max(0, offsetTop - maxDistance);\n }\n\n isAnimating = true;\n fastRaf(() => {\n scrollWithJs(container, element, position, margin, forceDuration, forceCurrentContainerHeight);\n });\n}\n\nexport function isAnimatingScroll() {\n return isAnimating;\n}\n\nfunction scrollWithJs(\n container: HTMLElement,\n element: HTMLElement,\n position: ScrollLogicalPosition,\n margin = 0,\n forceDuration?: number,\n forceCurrentContainerHeight?: boolean,\n) {\n const { offsetTop: elementTop, offsetHeight: elementHeight } = element;\n const { scrollTop, offsetHeight: containerHeight, scrollHeight } = container;\n const targetContainerHeight = !forceCurrentContainerHeight && container.dataset.normalHeight\n ? Number(container.dataset.normalHeight)\n : containerHeight;\n\n let path!: number;\n\n switch (position) {\n case 'start':\n path = (elementTop - margin) - scrollTop;\n break;\n case 'end':\n path = (elementTop + elementHeight + margin) - (scrollTop + targetContainerHeight);\n break;\n // 'nearest' is not supported yet\n case 'nearest':\n case 'center':\n path = elementHeight < targetContainerHeight\n ? (elementTop + elementHeight / 2) - (scrollTop + targetContainerHeight / 2)\n : (elementTop - margin) - scrollTop;\n break;\n }\n\n if (path < 0) {\n const remainingPath = -scrollTop;\n path = Math.max(path, remainingPath);\n } else if (path > 0) {\n const remainingPath = scrollHeight - (scrollTop + targetContainerHeight);\n path = Math.min(path, remainingPath);\n }\n\n const target = container.scrollTop + path;\n const duration = forceDuration || (\n MIN_JS_DURATION + (Math.abs(path) / MAX_DISTANCE) * (MAX_JS_DURATION - MIN_JS_DURATION)\n );\n const startAt = Date.now();\n\n dispatchHeavyAnimationEvent(duration);\n animateSingle(() => {\n const t = Math.min((Date.now() - startAt) / duration, 1);\n\n const currentPath = path * (1 - transition(t));\n container.scrollTop = Math.round(target - currentPath);\n\n isAnimating = t < 1;\n\n return isAnimating;\n });\n}\n\nfunction transition(t: number) {\n return 1 - ((1 - t) ** 3.5);\n}\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 { 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(({ direction }: { direction: LoadMoreDirection }) => {\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 lastParamsRef.current = { ...lastParamsRef.current, direction, offsetId };\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","import React, {\n FC, useCallback, useRef, useState,\n} from '../../lib/teact/teact';\n\nimport { ApiMediaFormat, ApiSticker } from '../../api/types';\n\nimport { STICKER_SIZE_TWO_FA } from '../../config';\nimport { getStickerDimensions } 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 isInline?: boolean;\n lastSyncTime?: number;\n};\n\nconst QUALITY = 1;\nconst RESIZE_FACTOR = 0.5;\n\nconst AnimatedEmoji: FC = ({\n sticker, isInline = false, observeIntersection, lastSyncTime,\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 previewBlobUrl = useMedia(`${localMediaHash}?size=m`, !isIntersecting, ApiMediaFormat.BlobUrl, lastSyncTime);\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 let width: number;\n if (isInline) {\n width = getStickerDimensions(sticker).width * RESIZE_FACTOR;\n } else {\n width = STICKER_SIZE_TWO_FA;\n }\n\n const style = `width: ${width}px; height: ${width}px;`;\n\n return (\n \n {previewBlobUrl && !isAnimationLoaded && (\n \"\"\n )}\n {isMediaLoaded && (\n \n )}\n \n );\n};\n\nexport default AnimatedEmoji;\n","export default function focusEditableElement(element: HTMLElement, force?: boolean) {\n if (!force && element === document.activeElement) {\n return;\n }\n const selection = window.getSelection()!;\n const range = document.createRange();\n\n if (!element.lastChild || !element.lastChild.nodeValue) {\n element.focus();\n return;\n }\n\n range.setStart(element.lastChild, element.lastChild.nodeValue.length);\n selection.removeAllRanges();\n selection.addRange(range);\n}\n","import { useEffect } from '../lib/teact/teact';\n\nexport default (\n onBlur: AnyToVoidFunction,\n onFocus: AnyToVoidFunction,\n) => {\n useEffect(() => {\n if (!document.hasFocus()) {\n onBlur();\n }\n\n window.addEventListener('blur', onBlur);\n window.addEventListener('focus', onFocus);\n\n return () => {\n window.removeEventListener('focus', onFocus);\n window.removeEventListener('blur', onBlur);\n };\n }, [onBlur, onFocus]);\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) {\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","export default function cycleRestrict(length: number, index: number) {\n return index - Math.floor(index / length) * length;\n}\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 } else {\n parsedHtml = parsedHtml.replace(/([^<]*)<\\/span>/g, '$1');\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\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(/[*]{1}([^*\\n]+)[*]{1}/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.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 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 { fastRaf } from './schedulers';\nimport { animate } from './animation';\nimport { IS_IOS } from './environment';\n\nconst DURATION = 450;\n\nexport default function fastSmoothScrollHorizontal(container: HTMLElement, left: number) {\n // Native way seems to be smoother in Chrome\n if (!IS_IOS) {\n container.scrollTo({ left, behavior: 'smooth' });\n } else {\n fastRaf(() => {\n scrollWithJs(container, left);\n });\n }\n}\n\nfunction scrollWithJs(container: HTMLElement, left: 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 const target = container.scrollLeft + path;\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 { RefObject } from 'react';\nimport { useEffect } from '../lib/teact/teact';\n\nexport default (containerRef: RefObject, isDisabled?: boolean) => {\n useEffect(() => {\n const container = containerRef.current;\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 }, [containerRef, 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_MOBILE_SCREEN } 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_MOBILE_SCREEN\n && window.document.body.classList.contains('enable-symbol-menu-transforms');\n}\n\nexport default (\n elementRef: RefObject,\n isMenuDisabled?: boolean,\n shouldDisableOnLink?: 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) {\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 } = originalEvent.touches[0];\n\n if (contextMenuPosition) {\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, elementRef]);\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 = 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 nestedEntities.forEach((e) => e.organizedIndexes.forEach((i) => organizedIndexes.add(i)));\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 organizedEntites = 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 organizedEntites.forEach((entity, arrayIndex) => {\n const { renderResult, entityEndIndex } = renderEntity(\n index,\n text.length,\n entity,\n arrayIndex === organizedEntites.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 { 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 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 { 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 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 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') {\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 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};\n\ntype StateProps = {\n isChannel: boolean;\n isChatWithSelf?: boolean;\n isPrivateChat: boolean;\n isBasicGroup: boolean;\n isSuperGroup: boolean;\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 isBasicGroup,\n isSuperGroup,\n canDeleteForAll,\n contactName,\n onClose,\n leaveChannel,\n deleteHistory,\n deleteChannel,\n}) => {\n const lang = useLang();\n const chatTitle = getChatTitle(lang, chat);\n\n const handleDeleteMessageForAll = useCallback(() => {\n deleteHistory({ chatId: chat.id, maxId: chat.lastMessage!.id, shouldDeleteForAll: true });\n onClose();\n }, [deleteHistory, chat.id, chat.lastMessage, onClose]);\n\n const handleDeleteChat = useCallback(() => {\n if (isPrivateChat || isBasicGroup) {\n deleteHistory({ chatId: chat.id, maxId: chat.lastMessage!.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 chat.isCreator,\n chat.lastMessage,\n chat.id,\n onClose,\n deleteHistory,\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 {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 canDeleteForAll = (isPrivateChat && !isChatWithSelf);\n const contactName = chat && isChatPrivate(chat.id)\n ? getUserFirstOrLastName(selectUser(global, getPrivateChatUserId(chat)!))\n : undefined;\n\n return {\n isPrivateChat,\n isChatWithSelf,\n isChannel: isChatChannel(chat),\n isBasicGroup: isChatBasicGroup(chat),\n isSuperGroup: isChatSuperGroup(chat),\n canDeleteForAll,\n contactName,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['leaveChannel', 'deleteHistory', 'deleteChannel']),\n)(DeleteChatModal));\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) => {\n const prevDeps = usePrevious(dependencies);\n return useLayoutEffect(() => {\n // @ts-ignore (workaround for \"could be instantiated with a different subtype\" issue)\n cb(prevDeps || []);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, dependencies);\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 { getMediaTransferState, getMessageMediaHash, getMessageMediaThumbDataUri } 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 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 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\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 (isUploading) {\n if (onCancelUpload) {\n onCancelUpload();\n }\n } else {\n setIsDownloadAllowed((isAllowed) => !isAllowed);\n }\n }, [isUploading, onCancelUpload]);\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 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, memo, useCallback, useEffect, useMemo, useRef, useState,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport {\n ApiAudio, ApiMessage, ApiVoice,\n} from '../../api/types';\nimport { ISettings } from '../../types';\n\nimport { IS_MOBILE_SCREEN } from '../../util/environment';\nimport { formatMediaDateTime, formatMediaDuration, formatPastTimeShort } from '../../util/dateFormat';\nimport {\n getMediaDuration,\n getMediaTransferState,\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 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 message: ApiMessage;\n senderTitle?: string;\n uploadProgress?: number;\n renderingFor?: '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\ntype StateProps = {\n theme: ISettings['theme'];\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_MOBILE_SCREEN ? 20 : 25;\nconst MAX_SPIKES = IS_MOBILE_SCREEN ? 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 renderingFor,\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 isUploading, isTransferring, transferProgress,\n } = getMediaTransferState(message, uploadProgress || downloadProgress, isActivated && !isBuffered);\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 && !renderingFor && 'own',\n renderingFor && 'bigger',\n isSelected && 'audio-is-selected',\n );\n\n const buttonClassNames = ['toggle-play'];\n if (shouldRenderSpinner) {\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 {renderingFor === 'searchResult' && renderSearchResult()}\n {renderingFor !== 'searchResult' && audio && renderAudio(\n lang, audio, isPlaying, playProgress, bufferedProgress, seekHandlers, date,\n onDateClick ? handleDateClick : undefined,\n )}\n {renderingFor !== '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?: () => void,\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' ? '#C69C85' : '#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(withGlobal((global) => ({ theme: global.settings.byKey.theme }))(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';\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 currentIndicator = tab.parentElement!.children[previousActiveTab].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 {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);\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};\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","import { useMemo } from '../lib/teact/teact';\nimport { getDispatch } from '../lib/teact/teactn';\nimport { ApiChat, ApiUser } from '../api/types';\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}: {\n chat: ApiChat | undefined;\n privateChatUser: ApiUser | undefined;\n handleDelete: () => void;\n folderId?: number;\n isPinned?: 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 = chat.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,\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\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 if (x + menuRect.width + extraPaddingX < rootRect.width + rootRect.left) {\n setPositionX('left');\n x += 3;\n } else if (x - menuRect.width > 0) {\n setPositionX('right');\n x -= 3;\n } else {\n setPositionX('left');\n x = 16;\n }\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 setStyle(`left: ${x - triggerRect.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 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","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 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 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
{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, {\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","import { EDITABLE_INPUT_ID } from '../../../../config';\n\nconst MAX_NESTING_PARENTS = 5;\n\nexport function isSelectionInsideInput(selectionRange: Range) {\n const { commonAncestorContainer } = selectionRange;\n let parentNode: HTMLElement | null = commonAncestorContainer as HTMLElement;\n let iterations = 1;\n while (parentNode && parentNode.id !== EDITABLE_INPUT_ID && iterations < MAX_NESTING_PARENTS) {\n parentNode = parentNode.parentElement;\n iterations++;\n }\n\n return Boolean(parentNode && parentNode.id === EDITABLE_INPUT_ID);\n}\n","import {\n useCallback, useEffect, useMemo, useState,\n} from '../../../../lib/teact/teact';\n\nimport { EDITABLE_INPUT_ID } from '../../../../config';\nimport { IS_MOBILE_SCREEN } from '../../../../util/environment';\nimport {\n EmojiData, EmojiModule, EmojiRawData, uncompressEmoji,\n} from '../../../../util/emoji';\nimport useFlag from '../../../../hooks/useFlag';\nimport focusEditableElement from '../../../../util/focusEditableElement';\n\nlet emojiDataPromise: Promise;\nlet emojiRawData: EmojiRawData;\nlet emojiData: EmojiData;\n\nconst RE_NOT_EMOJI_SEARCH = /[^-_:\\p{L}\\p{N}]+/iu;\nconst EMOJIS_LIMIT = 36;\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) {\n const [isOpen, markIsOpen, unmarkIsOpen] = useFlag();\n const [emojiIds, setEmojiIds] = useState([]);\n const [filteredEmojis, setFilteredEmojis] = useState([]);\n\n const recentEmojis = useMemo(\n () => {\n if (!emojiIds.length || !recentEmojiIds.length) {\n return [];\n }\n\n return recentEmojiIds\n .map((emojiId) => emojiData.emojis[emojiId])\n .filter(Boolean as any);\n },\n [emojiIds, recentEmojiIds],\n );\n\n // Initialize data on first render.\n useEffect(() => {\n const exec = () => {\n setEmojiIds(Object.keys(emojiData.emojis));\n };\n\n if (emojiData) {\n exec();\n } else {\n ensureEmojiData()\n .then(exec);\n }\n }, []);\n\n useEffect(() => {\n if (!isAllowed || !html || !emojiIds.length) {\n unmarkIsOpen();\n return;\n }\n\n const code = getEmojiCode(html);\n if (!code) {\n setFilteredEmojis([]);\n unmarkIsOpen();\n return;\n }\n\n const filter = code.substr(1);\n const matched = filter === ''\n ? recentEmojis\n : emojiIds\n .filter((emojiId) => emojiData.emojis[emojiId].names.find((name) => name.includes(filter)))\n .slice(0, EMOJIS_LIMIT)\n .map((emojiId) => emojiData.emojis[emojiId]);\n\n if (matched.length) {\n markIsOpen();\n setFilteredEmojis(matched);\n } else {\n unmarkIsOpen();\n }\n }, [emojiIds, html, isAllowed, markIsOpen, recentEmojis, unmarkIsOpen]);\n\n const insertEmoji = useCallback((textEmoji: string) => {\n const atIndex = html.lastIndexOf(':');\n if (atIndex !== -1) {\n onUpdateHtml(`${html.substr(0, atIndex)}${textEmoji}`);\n const messageInput = document.getElementById(inputId)!;\n if (!IS_MOBILE_SCREEN) {\n requestAnimationFrame(() => {\n focusEditableElement(messageInput, true);\n });\n }\n }\n\n unmarkIsOpen();\n }, [html, inputId, onUpdateHtml, unmarkIsOpen]);\n\n return {\n isEmojiTooltipOpen: isOpen,\n closeEmojiTooltip: unmarkIsOpen,\n filteredEmojis,\n insertEmoji,\n };\n}\n\nfunction getEmojiCode(html: string) {\n const tempEl = document.createElement('div');\n tempEl.innerHTML = html.replace('
', '\\n');\n const text = tempEl.innerText;\n\n const lastSymbol = text[text.length - 1];\n const lastWord = text.split(RE_NOT_EMOJI_SEARCH).pop();\n\n if (\n !text.length || RE_NOT_EMOJI_SEARCH.test(lastSymbol)\n || !lastWord || !lastWord.startsWith(':')\n ) {\n return undefined;\n }\n\n return lastWord.toLowerCase();\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_MOBILE_SCREEN, 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';\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 editableInputId?: string;\n html: string;\n placeholder: string;\n shouldSetFocus: boolean;\n shouldSupressFocus?: boolean;\n shouldSupressTextFormatter?: boolean;\n onUpdate: (html: string) => void;\n onSupressedFocus?: () => 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_MOBILE_SCREEN ? 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 editableInputId,\n html,\n placeholder,\n shouldSetFocus,\n shouldSupressFocus,\n shouldSupressTextFormatter,\n onUpdate,\n onSupressedFocus,\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 updateInputHeight(false);\n }, []);\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 shouldSupressTextFormatter\n || !isSelectionInsideInput(selectionRange)\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) {\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 supressFocus() {\n input.blur();\n }\n\n if (shouldSupressFocus) {\n input.addEventListener('focus', supressFocus);\n }\n\n return () => {\n input.removeEventListener('focus', supressFocus);\n };\n }, [shouldSupressFocus]);\n\n const className = buildClassName(\n 'form-control custom-scroll',\n html.length > 0 && 'touched',\n shouldSupressFocus && 'focus-disabled',\n );\n\n return (\n
\n \n
\n {placeholder}\n \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 } = linkData;\n\n const truncatedDescription = !senderTitle && trimText(description, MAX_TEXT_LENGTH);\n\n const className = buildClassName(\n 'WebLink scroll-item',\n !photo && 'without-photo',\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, useRef,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport useLang, { LangFn } from '../../../hooks/useLang';\n\nimport { GlobalActions, MessageListType } 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_MOBILE_SCREEN } 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 isSelected: boolean;\n isPinned?: boolean;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n isMuted?: boolean;\n privateChatUser?: ApiUser;\n actionTargetUser?: ApiUser;\n actionTargetMessage?: ApiMessage;\n actionTargetChatId?: number;\n lastMessageSender?: ApiUser;\n lastMessageOutgoingStatus?: ApiMessageOutgoingStatus;\n draft?: ApiFormattedText;\n messageListType?: MessageListType;\n animationLevel?: number;\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 isSelected,\n isPinned,\n chat,\n isMuted,\n privateChatUser,\n actionTargetUser,\n lastMessageSender,\n lastMessageOutgoingStatus,\n actionTargetMessage,\n actionTargetChatId,\n draft,\n messageListType,\n animationLevel,\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\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 // Sets animation excess values when `orderDiff` changes and then resets excess values to animate.\n useLayoutEffect(() => {\n if (animationLevel === 0) {\n return;\n }\n\n const element = ref.current!;\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 });\n\n if (isSelected && messageListType === 'thread') {\n focusLastMessage();\n }\n }, [\n isSelected,\n messageListType,\n openChat,\n chatId,\n focusLastMessage,\n ]);\n\n const contextActions = useChatContextActions({\n chat,\n privateChatUser,\n handleDelete: openDeleteModal,\n folderId,\n isPinned,\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 actionTargetUser,\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 && !IS_MOBILE_SCREEN && '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 \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 { targetUserId: actionTargetUserId, targetChatId: actionTargetChatId } = lastMessageAction || {};\n const privateChatUserId = getPrivateChatUserId(chat);\n const { type: messageListType } = selectCurrentMessageList(global) || {};\n\n return {\n chat,\n isMuted: selectIsChatMuted(chat, selectNotifySettings(global), selectNotifyExceptions(global)),\n lastMessageSender,\n ...(isOutgoing && { lastMessageOutgoingStatus: selectOutgoingStatus(global, chat.lastMessage) }),\n ...(privateChatUserId && { privateChatUser: selectUser(global, privateChatUserId) }),\n ...(actionTargetUserId && { actionTargetUser: selectUser(global, actionTargetUserId) }),\n actionTargetChatId,\n actionTargetMessage,\n draft: selectDraft(global, chatId, MAIN_THREAD_ID),\n messageListType,\n animationLevel: global.settings.byKey.animationLevel,\n lastSyncTime: global.lastSyncTime,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'openChat',\n 'focusLastMessage',\n ]),\n)(Chat));\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, MAIN_THREAD_ID,\n} from '../../../api/types';\nimport { NotifyException, NotifySettings } from '../../../types';\n\nimport { ALL_CHATS_PRELOAD_DISABLED, CHAT_HEIGHT_PX, CHAT_LIST_SLICE } from '../../../config';\nimport { IS_ANDROID } from '../../../util/environment';\nimport usePrevious from '../../../hooks/usePrevious';\nimport { mapValues, pick } from '../../../util/iteratees';\nimport { getChatOrder, prepareChatList, prepareFolderListIds } from '../../../modules/helpers';\nimport {\n selectChatFolder, selectCurrentMessageList, 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';\n\ntype OwnProps = {\n folderType: 'all' | 'archived' | 'folder';\n folderId?: number;\n noChatsText?: string;\n isActive: boolean;\n};\n\ntype StateProps = {\n chatsById: Record;\n usersById: Record;\n chatFolder?: ApiChatFolder;\n listIds?: number[];\n currentChatId?: number;\n orderedPinnedIds?: number[];\n lastSyncTime?: number;\n isInDiscussionThread?: boolean;\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 noChatsText = 'Chat list is empty.',\n isActive,\n chatFolder,\n chatsById,\n usersById,\n listIds,\n currentChatId,\n orderedPinnedIds,\n lastSyncTime,\n isInDiscussionThread,\n notifySettings,\n notifyExceptions,\n loadMoreChats,\n preloadTopChatMessages,\n openChat,\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 = orderById && prevOrderById\n ? mapValues(orderById, (order, id) => {\n return order - (prevOrderById[id] !== undefined ? prevOrderById[id] : Infinity);\n })\n : {};\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 (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] });\n }\n\n if (e.altKey) {\n const targetIndexDelta = e.key === 'ArrowDown' ? 1 : e.key === 'ArrowUp' ? -1 : undefined;\n if (!targetIndexDelta) return;\n\n if (!currentChatId) {\n e.preventDefault();\n openChat({ id: orderedIds[0] });\n return;\n }\n\n const position = orderedIds.indexOf(currentChatId);\n\n if (position === -1) {\n return;\n }\n const nextId = orderedIds[position + targetIndexDelta];\n\n e.preventDefault();\n openChat({ id: nextId });\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
{noChatsText}
\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 { chatId: currentChatId, threadId: currentThreadId } = selectCurrentMessageList(global) || {};\n\n const listType = folderType !== 'folder' ? FolderTypeToListType[folderType] : undefined;\n const chatFolder = folderId ? selectChatFolder(global, folderId) : undefined;\n\n return {\n chatsById,\n usersById,\n currentChatId,\n lastSyncTime,\n ...(listType ? {\n listIds: listIds[listType],\n orderedPinnedIds: orderedPinnedIds[listType],\n } : {\n chatFolder,\n }),\n isInDiscussionThread: currentThreadId !== MAIN_THREAD_ID,\n notifySettings: selectNotifySettings(global),\n notifyExceptions: selectNotifyExceptions(global),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadMoreChats',\n 'preloadTopChatMessages',\n 'openChat',\n ]),\n)(ChatList));\n","import { useCallback, useEffect, useState } 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 { IS_MOBILE_SCREEN } from '../../../../util/environment';\nimport focusEditableElement from '../../../../util/focusEditableElement';\nimport useFlag from '../../../../hooks/useFlag';\n\nconst RE_NOT_USERNAME_SEARCH = /[^@_\\d\\wа-яё]+/i;\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 currentUserId?: number,\n usersById?: Record,\n) {\n const [isOpen, markIsOpen, unmarkIsOpen] = useFlag();\n const [currentFilter, setCurrentFilter] = useState('');\n const [filteredMembers, setFilteredMembers] = useState([]);\n\n const getFilteredMembers = useCallback((filter) => {\n if (!groupChatMembers || !usersById) {\n return undefined;\n }\n\n return groupChatMembers.filter(({ userId }) => {\n const user = usersById[userId];\n if (userId === currentUserId || !user) {\n return false;\n }\n\n return !filter || searchUserName(filter, user);\n });\n }, [groupChatMembers, currentUserId, usersById]);\n\n useEffect(() => {\n if (!canSuggestMembers || !html.length) {\n unmarkIsOpen();\n return;\n }\n\n const usernameFilter = getUsernameFilter(html);\n\n if (usernameFilter) {\n const filter = usernameFilter ? usernameFilter.substr(1) : '';\n const membersToMention = getFilteredMembers(filter);\n if (membersToMention && membersToMention.length) {\n markIsOpen();\n setCurrentFilter(filter);\n setFilteredMembers(membersToMention);\n } else {\n unmarkIsOpen();\n }\n } else {\n unmarkIsOpen();\n }\n }, [canSuggestMembers, html, getFilteredMembers, markIsOpen, unmarkIsOpen]);\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 if (!IS_MOBILE_SCREEN) {\n requestAnimationFrame(() => {\n focusEditableElement(messageInput, forceFocus);\n });\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 mentionFilteredMembers: filteredMembers,\n };\n}\n\nfunction getUsernameFilter(html: string) {\n const tempEl = document.createElement('div');\n tempEl.innerHTML = html;\n const text = tempEl.innerText;\n\n const lastSymbol = text[text.length - 1];\n const lastWord = text.split(RE_NOT_USERNAME_SEARCH).pop();\n\n if (\n !text.length || RE_NOT_USERNAME_SEARCH.test(lastSymbol)\n || !lastWord || !lastWord.startsWith('@')\n ) {\n return undefined;\n }\n\n return lastWord;\n}\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 { 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.46635a34d22085eb936c.css b/dist/0.46635a34d22085eb936c.css deleted file mode 100644 index cd576c37a..000000000 --- a/dist/0.46635a34d22085eb936c.css +++ /dev/null @@ -1 +0,0 @@ -.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.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.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(.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:#000}.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:.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:initial!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(.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 .35s 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 .35s ease-out}.Transition.reveal.backwards.animating>.to{animation:none}@keyframes fade-in-opacity{0%{opacity:0}to{opacity:1}}@keyframes fade-out-opacity{0%{opacity:1}to{opacity:0}}@keyframes fade-in-backwards-opacity{0%{opacity:1}to{opacity:0}}@keyframes fade-out-backwards-opacity{0%{opacity:0}to{opacity:1}}@keyframes slide-in{0%{transform:translateX(100%)}to{transform:translateX(0)}}@keyframes slide-out{0%{transform:translateX(0)}to{transform:translateX(-100%)}}@keyframes slide-in-backwards{0%{transform:translateX(0)}to{transform:translateX(100%)}}@keyframes slide-out-backwards{0%{transform:translateX(-100%)}to{transform:translateX(0)}}@keyframes mv-slide-in{0%{transform:translateX(100vw)}to{transform:translateX(0)}}@keyframes mv-slide-out{0%{transform:translateX(0)}to{transform:translateX(-100vw)}}@keyframes mv-slide-in-backwards{0%{transform:translateX(0)}to{transform:translateX(100vw)}}@keyframes mv-slide-out-backwards{0%{transform:translateX(-100vw)}to{transform:translateX(0)}}@keyframes slide-fade-in-move{0%{transform:translateX(1.5rem)}to{transform:translateX(0)}}@keyframes slide-fade-out-move{0%{transform:translateX(0)}to{transform:translateX(-1.5rem)}}@keyframes slide-fade-in-backwards-move{0%{transform:translateX(0)}to{transform:translateX(1.5rem)}}@keyframes slide-fade-out-backwards-move{0%{transform:translateX(-1.5rem)}to{transform:translateX(0)}}@keyframes zoom-fade-in-move{0%{transform:scale(1.1)}to{transform:scale(1)}}@keyframes zoom-fade-in-backwards-move{0%{transform:scale(1)}to{transform:scale(1.1)}}@keyframes zoom-fade-out-backwards-move{0%{transform:scale(.95)}to{transform:scale(1)}}@keyframes slide-layers-out{0%{transform:translateX(0);opacity:1}to{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))}to{transform:translateX(0);opacity:1}}@keyframes push-out{0%{transform:scale(1);opacity:1}to{transform:scale(.7);opacity:0}}@keyframes push-out-backwards{0%{transform:scale(.7);opacity:0}to{transform:scale(1);opacity:1}}@keyframes slide-in-200{0%{transform:translateX(200%)}to{transform:translateX(0)}}@keyframes slide-in-200-backwards{0%{transform:translateX(0)}to{transform:translateX(200%)}}@keyframes reveal-in{0%{-webkit-clip-path:inset(0 100% 0 0);clip-path:inset(0 100% 0 0)}to{-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)}to{-webkit-clip-path:inset(0 100% 0 0);clip-path:inset(0 100% 0 0)}}.Avatar{--color-user:var(--color-primary);flex:none;align-items:center;justify-content:center;width:3.375rem;height:3.375rem;background:linear-gradient(var(--color-white) -125%,var(--color-user));color:#fff;font-weight:700;display:flex;white-space:nowrap}.Avatar,.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:.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:.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:.05rem;right:.05rem;width:.875rem;height:.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%}.ProgressSpinner{position:relative;z-index:1;width:3.375rem;height:3.375rem;background:rgba(0,0,0,.25) url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTkiIGhlaWdodD0iMTkiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTEwLjcxNyA5Ljc1TDE4LjMgMi4xNjdhLjY4NC42ODQgMCAxMC0uOTY3LS45NjdMOS43NSA4Ljc4MyAyLjE2NyAxLjJhLjY4NC42ODQgMCAxMC0uOTY3Ljk2N0w4Ljc4MyA5Ljc1IDEuMiAxNy4zMzNhLjY4NC42ODQgMCAxMC45NjcuOTY3bDcuNTgzLTcuNTgzIDcuNTgzIDcuNTgzYS42ODEuNjgxIDAgMDAuOTY3IDAgLjY4NC42ODQgMCAwMDAtLjk2N0wxMC43MTcgOS43NXoiIGZpbGw9IiNGRkYiIHN0cm9rZT0iI0ZGRiIgc3Ryb2tlLXdpZHRoPSIuNzUiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz48L3N2Zz4=) 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-m,.ProgressSpinner.size-s{width:auto;height:auto;background:transparent url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTUiIGhlaWdodD0iMTUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTguMjE4IDcuNWw1LjYzMy01LjYzM2EuNTA4LjUwOCAwIDEwLS43MTgtLjcxOEw3LjUgNi43ODIgMS44NjcgMS4xNDlhLjUwOC41MDggMCAxMC0uNzE4LjcxOEw2Ljc4MiA3LjVsLTUuNjMzIDUuNjMzYS41MDguNTA4IDAgMTAuNzE4LjcxOEw3LjUgOC4yMThsNS42MzMgNS42MzNhLjUwNi41MDYgMCAwMC43MTggMCAuNTA4LjUwOCAwIDAwMC0uNzE4TDguMjE4IDcuNXoiIGZpbGw9IiNGRkYiIHN0cm9rZT0iI0ZGRiIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPjwvc3ZnPg==) no-repeat 49% 49%}.ProgressSpinner.size-m.square,.ProgressSpinner.size-s.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:initial!important}.ProgressSpinner svg{display:block;transform:rotate(-90deg);transform-origin:50% 50%;animation:ProgressSpinnerAnimation 4s linear 0s infinite}.ProgressSpinner circle{transition:stroke-dashoffset .5s}@keyframes ProgressSpinnerAnimation{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.Modal{position:relative;z-index:var(--z-modal)}.Modal.confirm .modal-dialog,.Modal.delete .modal-dialog,.Modal.error .modal-dialog,.Modal.pin .modal-dialog,.Modal.unpin-all .modal-dialog{max-width:23rem}.Modal.narrow .modal-dialog{max-width:20rem}.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,.25)}.Modal.transparent-backdrop .modal-backdrop{background-color:initial}.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 .25rem .5rem .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:translateZ(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;text-align:left;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:.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 .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}.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,0.08)}.ListItem .ListItem-button>i{font-size:1.5rem;margin-right:2rem;color:var(--color-text-secondary)}.ListItem.multiline .ListItem-button>i{position:relative;top:.25rem}.ListItem.disabled{pointer-events:none}.ListItem.disabled .ListItem-button{opacity:.5}.ListItem:not(.disabled):not(.is-static) .ListItem-button{cursor:pointer}.ListItem:not(.disabled):not(.is-static) .ListItem-button:focus,body:not(.is-ios) .ListItem:not(.disabled):not(.is-static) .ListItem-button:hover{--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:.75rem}.ListItem.narrow .ListItem-button{padding:.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 -.5rem}.ListItem.chat-item-clickable .ListItem-button{padding:.5625rem .6975rem .5625rem .5625rem}@media (max-width:600px){.ListItem.chat-item-clickable:not(.force-rounded-corners){margin:0}.ListItem.chat-item-clickable:not(.force-rounded-corners) .ListItem-button{border-radius:0}}.ListItem.chat-item-clickable .Avatar{flex-shrink:0;margin-right:.5rem}.ListItem.chat-item-clickable .info{flex-grow:1;overflow:hidden}.ListItem.chat-item-clickable .subtitle,.ListItem.chat-item-clickable .title{overflow:hidden;display:flex;justify-content:flex-start;align-items:center}.ListItem.chat-item-clickable .last-message,.ListItem.chat-item-clickable .status,.ListItem.chat-item-clickable .typing-status,.ListItem.chat-item-clickable h3{font-size:1rem;line-height:1.6875rem;margin:0;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;text-align:left}.ListItem.chat-item-clickable .title h3{font-weight:500}.ListItem.chat-item-clickable .title .VerifiedIcon{width:1.25rem;height:1.25rem;margin-left:.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:.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:.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.search-result-message .title{padding-right:.15rem}.ListItem.search-result-message h3{max-width:80%}.ListItem.search-result-message .subtitle,.ListItem.search-result-message h3{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:.25rem;padding:0 .125rem}.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 .multiline-item{white-space:normal;overflow:hidden}.ListItem .multiline-item .subtitle,.ListItem .multiline-item .title{display:block;text-align:left}.ListItem .multiline-item .title{line-height:1.25rem;overflow:hidden;text-overflow:ellipsis}.ListItem .multiline-item .subtitle{font-size:.875rem;line-height:1.5rem;color:var(--color-text-secondary)}.ListItem .multiline-item .subtitle+.subtitle{margin-top:-.25rem}.ListItem .multiline-item .subtitle.black{color:var(--color-text)}.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:50%}.typing-status{display:flex;align-items:baseline}.typing-status .sender-name:after{content:"\00a0is\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}@keyframes typing-animation{0%{transform:translateX(-1rem)}}.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)}body.is-right-column-shown .Notification-container{transform:translate3d(calc(var(--right-column-width)/-2),0,0)}}.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,.8) url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj48Y2lyY2xlIGZpbGw9IiNGRkYiIGN4PSIxMiIgY3k9IjEyIiByPSIxMiIvPjxjaXJjbGUgZmlsbD0iIzAwMCIgZmlsbC1ydWxlPSJub256ZXJvIiBjeD0iMTIiIGN5PSI2LjUiIHI9IjEuNSIvPjxwYXRoIGQ9Ik0xMiA5LjVjLS41NTIgMC0xIC4zNy0xIC44MjZ2Ny4zNDhjMCAuNDU2LjQ0OC44MjYgMSAuODI2czEtLjM3IDEtLjgyNnYtNy4zNDhjMC0uNDU2LS40NDgtLjgyNi0xLS44MjZ6IiBmaWxsPSIjMDAwIiBmaWxsLXJ1bGU9Im5vbnplcm8iLz48L2c+PC9zdmc+") no-repeat .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:active,.Notification .text-entity-link:hover{color:#fff!important;text-decoration:underline}.Notification .content{line-height:1.25;word-break:break-word;font-size:.9375rem}.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{pointer-events:none;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-left:.5rem;background:var(--color-gray);border-radius:.75rem;padding:0 .3125rem;color:#fff;font-size:.875rem;line-height:1.3125rem;font-weight:500;text-align:center;flex-shrink:0}.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:initial;transform-origin:left}.Tab i.animate{transition:transform var(--slide-transition)}body.animation-level-0 .Tab i.animate{transition:none!important}.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:transparent}.TabList.big{font-size:1rem;--border-radius-messages-small:0}.TabList::-webkit-scrollbar{height:0}.TabList::-webkit-scrollbar-thumb{background-color:transparent}.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}.SearchInput{position:relative;width:100%;color:rgba(var(--color-text-secondary-rgb),.5);background-color:var(--color-chat-hover);border:2px solid var(--color-chat-hover);border-radius:1.375rem;transition:border-color .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.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:initial!important;box-shadow:none!important;padding:calc(.4375rem - var(--border-width)) calc(2.625rem - var(--border-width)) calc(.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:.5rem}}.PickerSelectedItem{display:flex;align-items:center;background:var(--color-chat-hover);height:2rem;min-width:2rem;margin-left:.5rem;margin-bottom:.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% - .5rem)}.PickerSelectedItem.minimized{padding-right:0}.PickerSelectedItem:hover{background-color:var(--color-item-active)}.PickerSelectedItem.closeable:hover{background-color:rgba(var(--color-error-rgb),.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:.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:.375rem;border-radius:50%;background-color:var(--color-primary);color:#fff}.PickerSelectedItem .item-icon i{font-size:1.25rem;position:relative;top:-1px}.PickerSelectedItem .item-name{margin-left:.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:#fff;opacity:0;transition:opacity .15s ease}@keyframes bar-animation-transform-1{0%{transform:scaleY(.33)}12.5%{transform:scaleY(1.66)}25%{transform:scaleY(.33)}37.5%{transform:scaleY(1)}50%{transform:scaleY(.33)}62.5%{transform:scaleY(1.66)}75%{transform:scaleY(.33)}87.5%{transform:scaleY(1.66)}to{transform:scaleY(.33)}}@keyframes bar-animation-transform-2{0%{transform:scaleY(1)}12.5%{transform:scaleY(.33)}25%{transform:scaleY(1.66)}37.5%{transform:scaleY(.33)}50%{transform:scaleY(1)}62.5%{transform:scaleY(.33)}75%{transform:scaleY(1.66)}87.5%{transform:scaleY(.33)}to{transform:scaleY(1)}}.ChatCallStatus{position:absolute;right:6px;bottom:0;width:20px;height:20px;border-radius:50%;background-color:#0ac630;border:2px solid var(--color-background);overflow:hidden}.ChatCallStatus .indicator{width:100%;height:100%;display:flex;align-items:center;justify-content:center;border-radius:50%}.ChatCallStatus .indicator>div{width:2px;height:6px;background:var(--color-background);border-radius:1px;margin:1px;will-change:transform;transform:translateZ(0)}.ChatCallStatus .indicator>div:nth-child(odd){transform:scaleY(.8)}.ChatCallStatus .indicator>div:nth-child(2n){transform:scaleY(1.33)}.ChatCallStatus.selected{background-color:var(--color-white);border-color:var(--color-chat-active)}.ChatCallStatus.selected .indicator div{background-color:var(--color-chat-active)}.ChatCallStatus.active .indicator div:nth-child(odd){animation:bar-animation-transform-2 3.2s infinite normal}.ChatCallStatus.active .indicator div:nth-child(2n){animation:bar-animation-transform-1 3.2s infinite normal}.MessageOutgoingStatus{position:relative;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:.13rem}.MessageOutgoingStatus .Transition{width:100%;height:100%}.LastMessageMeta{margin-right:.2rem;padding:.3rem 0 .15rem;flex-shrink:0;font-size:.75rem;line-height:1;display:flex;align-items:center}.LastMessageMeta .MessageOutgoingStatus{color:var(--color-text-meta-colored);margin-right:.1rem;font-size:1.15rem}.LastMessageMeta .time{color:var(--color-text-meta);line-height:1.15rem}.Badge-transition{transform:scale(1);opacity:1;transition:transform .3s cubic-bezier(.34,1.56,.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;margin-left:1.5rem}.Badge-wrapper .Badge{margin-left:.5rem}.Badge{min-width:1.5rem;height:1.5rem;background:var(--color-gray);border-radius:.75rem;padding:0 .4375rem;color:#fff;font-size:.875rem;line-height:1.5625rem;font-weight:500;text-align:center;flex-shrink:0}.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:.25rem}.Badge.mention i{font-size:1rem;vertical-align:super}.Chat{--background-color:var(--color-background);position:absolute;top:0;left:0;margin:0;width:100%}.Chat.animate-opacity{will-change:opacity;transition:opacity .2s ease-out}.Chat.animate-transform{will-change:transform;transition:transform .2s ease-out}.Chat.ListItem.has-menu-open .Avatar.online:after,.Chat:hover .Avatar.online:after{border-color:var(--color-chat-hover)}.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{position:relative;flex-shrink:0}.Chat .info .subtitle,.Chat .info .title{padding-right:.125rem}.Chat .info h3{width:auto;max-width:80%}.Chat .info .icon-muted-chat{font-size:1.25rem;margin-left:.25rem;margin-top:-.0625rem;color:#c6c8ca}.Chat .info .LastMessageMeta{margin-left:auto}.Chat .info .last-message,.Chat .info .typing-status{padding-right:.25rem;flex-grow:1;color:var(--color-text-secondary);unicode-bidi:plaintext}.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,.Chat .info .last-message .sender-name:after{content:": "}.Chat .info .last-message .media-preview{position:relative}.Chat .info .last-message img{width:1.25rem;height:1.25rem;object-fit:cover;border-radius:.125rem;vertical-align:-.25rem;margin-right:.25rem}.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{font-size:.75rem;color:#fff;position:absolute;left:.25rem;top:.1875rem}.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:color .2s,background .2s}.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}}.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))}.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}.File .file-icon-container{position:relative}.File .file-icon,.File .file-preview,.File .file-progress{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:#fff}.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:.25rem;background:rgba(0,0,0,.25);border-left:0 solid var(--background-color);border-bottom:1.125rem solid transparent;border-right:1.125rem solid var(--background-color);border-top:0 solid transparent;transition:border-width .15s ease-in}.File .file-preview{background:transparent;overflow:hidden}.File .file-preview+.file-progress,.File .file-preview+.icon-download{background:rgba(0,0,0,.5);border-radius:var(--border-radius-messages-small)}.File .file-preview img{object-fit:cover}.File .icon-download{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 .icon-download{opacity:1}.File.interactive .file-icon-container:hover .file-ext,.File.interactive .file-icon-container:hover .icon-download.hidden{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 .file-icon,.File.smaller .file-preview,.File.smaller .file-progress,.File.smaller .icon-download{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-info{text-align:right}.File:dir(rtl) .file-info+.Link{padding-left:0;padding-right:1rem}.File:dir(rtl) .icon-download{left:auto;right:0}.File .file-icon.red,.File .file-progress.red{background-color:var(--color-error)}.File .file-icon.orange,.File .file-progress.orange{background-color:var(--color-warning)}.File .file-icon.green,.File .file-progress.green{background-color:var(--color-text-green)}.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-pause,.Audio .toggle-play .icon-play{opacity:1;transform:scale(1);transition:opacity .4s,transform .6s cubic-bezier(.34,1.56,.64,1)}.Audio .toggle-play.loading .icon-pause,.Audio .toggle-play.loading .icon-play,.Audio .toggle-play.pause .icon-play,.Audio .toggle-play.play .icon-pause{opacity:0;transform:scale(.5)}.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:.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 .date,.Audio .meta,.Audio .performer{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 .date,.Audio.bigger .meta,.Audio.bigger .performer{line-height:1.0625rem}.Audio.bigger .seekline{top:2px;margin-bottom:.5rem}.Audio.bigger .duration{line-height:1rem}.Audio.bigger .media-loading{top:.1875rem;left:.1875rem}.Audio .ProgressSpinner.size-s svg{width:2.25rem;height:2.25rem}.AnimatedEmoji{margin-bottom:.75rem}.AnimatedEmoji img{width:100%;height:100%}.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:.5}.Radio.hidden-widget{cursor:default}.Radio.hidden-widget .Radio-main:after,.Radio.hidden-widget .Radio-main:before{visibility:hidden}.Radio>input{position:absolute;z-index:var(--z-below);opacity:0}.Radio .Radio-main:after,.Radio .Radio-main:before{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);border-radius:50%;background-color:var(--color-white);opacity:1;transition:border-color .1s ease,opacity .1s ease}.Radio .Radio-main:after{left:1.375rem;width:.625rem;height:.625rem;border-radius:50%;background:var(--color-primary);opacity:0;transition:opacity .1s ease}.Radio .Radio-main .label{display:block;word-break:break-word}.Radio .Radio-main .subLabel{display:block;font-size:.875rem;line-height:1rem;color:var(--color-text-secondary)}.Radio input:checked~.Radio-main:before{border-color:var(--color-primary)}.Radio input:checked~.Radio-main:after{opacity:1}.Radio.loading .Radio-main:after,.Radio.loading .Radio-main:before{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}@keyframes fade-in{0%{opacity:0}to{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:.5rem .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}@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 .25rem;background-color:var(--color-borders)}.TextFormatter-link-url-input-wrapper{width:20rem;position:relative}@media (max-width:600px){.TextFormatter-link-url-input-wrapper{max-width:90vw}}.TextFormatter-link-url-input-wrapper:after,.TextFormatter-link-url-input-wrapper:before{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(90deg,var(--color-background) .25rem,transparent 1rem)}.TextFormatter-link-url-input-wrapper:after{right:0;background:linear-gradient(270deg,var(--color-background) .25rem,transparent 1rem)}.TextFormatter-link-url-input-wrapper.mask-left:before,.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:.25rem;font-size:1.5rem;margin:0 .125rem;border-radius:var(--border-radius-messages-small);flex-shrink:0;cursor:pointer}.TextFormatter .Button.active{background-color:var(--color-primary)!important;color:#fff}.TextFormatter .Button.disabled{opacity:.5;pointer-events:none}.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,.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}.WebLink{min-height:3rem;padding:.25rem 0 0 3.75rem;font-size:.875rem;line-height:1.125rem;position:relative}.WebLink+.WebLink{margin-top:1.5rem}.WebLink.without-photo:before{content:attr(data-initial);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,.WebLink.without-photo:before{width:3rem;height:3rem;position:absolute;left:0;top:0}.WebLink .Media{cursor:default!important;padding-bottom:unset!important;border-radius:var(--border-radius-messages-small)!important}.WebLink .site-description,.WebLink .site-name,.WebLink .site-title{word-break:break-word}.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}.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} \ No newline at end of file diff --git a/dist/0.46635a34d22085eb936c.js b/dist/0.46635a34d22085eb936c.js deleted file mode 100644 index 4a1763e25..000000000 --- a/dist/0.46635a34d22085eb936c.js +++ /dev/null @@ -1,2 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[0],Array(99).concat([function(e,t,n){"use strict";var a=n(18),r=n(35),c=n(108);t.a=()=>{const e=Object(r.a)();return Object(c.a)(()=>a.a(e),[e]),a.b}},function(e,t,n){"use strict";var a=n(0),r=n(7),c=n(8),s=n(140),i=n(168),o=n(39),l=n(49),u=n(38);n(203);t.a=e=>{const{ref:t,icon:n,className:d,style:m,children:h,disabled:b,ripple:f,narrow:p,inactive:O,focus:g,destructive:v,multiline:j,isStatic:E,contextActions:y,onClick:N}=e;let T=Object(a.q)(null);t&&(T=t);const{isContextMenuOpen:C,contextMenuPosition:M,handleBeforeContextMenu:w,handleContextMenu:S,handleContextMenuClose:L,handleContextMenuHide:I}=Object(s.a)(T,!y),A=Object(a.m)(()=>T.current,[]),k=Object(a.m)(()=>T.current.closest(".custom-scroll"),[]),x=Object(a.m)(()=>T.current.querySelector(".ListItem-context-menu .bubble"),[]),{positionX:D,positionY:_,style:R}=Object(i.a)(M,A,k,x),F=Object(a.m)(e=>{!b&&N&&N(e)},[b,N]),P=Object(a.m)(e=>{O||r.l||(!y||2!==e.button&&N||w(e),0===e.button&&(N?F(e):S(e)))},[O,y,N,w,S,F]),U=Object(c.a)("ListItem",d,!E&&"no-selection",f&&"has-ripple",p&&"narrow",b&&"disabled",O&&"inactive",M&&"has-menu-open",g&&"focus",v&&"destructive",j&&"multiline",E&&"is-static");return a.a.createElement("div",{ref:T,className:U,style:m},a.a.createElement("div",{className:"ListItem-button",role:"button",tabIndex:0,onClick:!O&&r.l?F:void 0,onMouseDown:P,onContextMenu:!O&&y?S:void 0},n&&a.a.createElement("i",{className:"icon-"+n}),j&&a.a.createElement("div",{className:"multiline-item"},h),!j&&h,!b&&!O&&f&&a.a.createElement(o.a,null)),y&&void 0!==M&&a.a.createElement(l.a,{isOpen:C,positionX:D,positionY:_,style:R,className:"ListItem-context-menu",autoClose:!0,onClose:L,onCloseAnimationEnd:I},y.map(e=>a.a.createElement(u.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(9),c=n(45);function s({rootRef:e,throttleMs:t,debounceMs:n,shouldSkipFirst:s,margin:i,threshold:o,isDisabled:l},u){const d=Object(a.q)(),m=Object(a.q)(),h=Object(a.q)(),b=Object(a.q)();m.current=u;const f=Object(a.m)(()=>{h.current=!0},[]),p=Object(a.m)(()=>{h.current=!1,b.current&&(b.current(),b.current=void 0)},[]);Object(c.a)(f,p),Object(a.n)(()=>{if(!l)return()=>{d.current&&(d.current.observer.disconnect(),d.current.callbacks.clear(),d.current=void 0)}},[l]);return{observe:Object(a.m)((a,c)=>{d.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()},u=t?r.g:n?r.a:void 0,f=u?u(l,t||n,!s):l,p=new IntersectionObserver(e=>{e.forEach(e=>{c.set(e.target,e)}),h.current?b.current=()=>{f()}:f()},{root:e.current,rootMargin:i?i+"px":void 0,threshold:o});d.current={observer:p,callbacks:a}}();const l=d.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(5),c=n(50),s=n(35);t.a=(e,t=!1,n=r.ApiMediaFormat.BlobUrl,i,o)=>{const l=e?c.c(e):void 0,u=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?u():setTimeout(u,o-e)})}},[t,e,l,n,i,u,o]),l}},function(e,t,n){"use strict";var a=n(0),r=n(2),c=n(19),s=n(6),i=n(4),o=n(22),l=n(3),u=n(99),d=n(106),m=n(128),h=n(151);t.a=Object(a.h)(Object(r.h)((e,{userId:t,forceShowSelf:n})=>{const{lastSyncTime:a}=e,r=Object(s.Fb)(e,t);return{lastSyncTime:a,user:r,isSavedMessages:!n&&r&&r.isSelf,areMessagesLoaded:Boolean(Object(s.m)(e,t))}},(e,t)=>Object(l.l)(t,["loadFullUser","openMediaViewer"]))(({typingStatus:e,avatarSize:t="medium",status:n,withMediaViewer:r,withUsername:s,withFullInfo:l,withUpdatingStatus:b,noStatusOrTyping:f,user:p,isSavedMessages:O,areMessagesLoaded:g,lastSyncTime:v,loadFullUser:j,openMediaViewer:E})=>{const{id:y}=p||{},N=Object(i.Z)(p);Object(a.n)(()=>{l&&v&&y&&j({userId:y})},[y,j,v,l]);const T=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]),C=Object(u.a)();if(p)return a.a.createElement("div",{className:"ChatInfo"},a.a.createElement(d.a,{key:p.id,size:t,user:p,isSavedMessages:O,onClick:r?T:void 0}),a.a.createElement("div",{className:"info"},O?a.a.createElement("div",{className:"title"},a.a.createElement("h3",null,C("SavedMessages"))):a.a.createElement("div",{className:"title"},a.a.createElement("h3",{dir:"auto"},N&&Object(o.a)(N)),p&&p.isVerified&&a.a.createElement(m.a,null)),(n||!O&&!f)&&(n?a.a.createElement("span",{className:"status",dir:"auto"},n):b&&!g?a.a.createElement("span",{className:"status",dir:"auto"},C("Updating")):p?e?a.a.createElement(h.a,{typingStatus:e}):a.a.createElement("div",{className:"status "+(Object(i.xb)(p)?"online":"")},s&&p.username&&a.a.createElement("span",{className:"handle"},p.username),a.a.createElement("span",{className:"user-status",dir:"auto"},Object(i.ab)(C,p))):void 0)))}))},function(e,t,n){"use strict";var a=n(0),r=n(51);var c=n(8),s=n(45),i=n(32),o=n(54),l=n(99),u=n(29),d=n(117);n(145);t.a=e=>{const{title:t,className:n,isOpen:m,header:h,hasCloseButton:b,noBackdrop:f,children:p,onClose:O,onCloseAnimationEnd:g,onEnter:v}=e,{shouldRender:j,transitionClassNames:E}=Object(i.a)(m,g),y=Object(a.q)(null);Object(a.n)(()=>m?Object(r.a)({onEsc:O,onEnter:v}):void 0,[m,O,v]),Object(a.n)(()=>m&&y.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)}}(y.current):void 0,[m]),Object(o.a)(([e])=>(document.body.classList.toggle("has-open-dialog",m),(m||!m&&void 0!==e)&&Object(s.b)(200),()=>{document.body.classList.remove("has-open-dialog")}),[m]);const N=Object(l.a)();if(!j)return;const T=Object(c.a)("Modal",n,E,f&&"transparent-backdrop");return a.a.createElement(d.a,null,a.a.createElement("div",{ref:y,className:T,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"},h||(t?a.a.createElement("div",{className:"modal-header"},b&&a.a.createElement(u.a,{round:!0,color:"translucent",size:"smaller",ariaLabel:N("Close"),onClick:O},a.a.createElement("i",{className:"icon-close"})),a.a.createElement("div",{className:"modal-title"},t)):void 0),a.a.createElement("div",{className:"modal-content custom-scroll"},p)))))}},function(e,t,n){"use strict";var a=n(0),r=n(2),c=n(1),s=n(7),i=n(35),o=n(41),l=n(8),u=n(45);n(188);const d={slide:450,"mv-slide":400,"slide-fade":400,"zoom-fade":150,"scroll-slide":500,fade:150,"slide-layers":s.g?450:300,"push-slide":300,reveal:350},m=Symbol("CLEANED_UP");t.a=Object(r.h)(e=>{const{animationLevel:t}=e.settings.byKey;return{animationLevel:t}})(({ref:e,activeKey:t,name:n,direction:r="auto",renderCount:s,shouldRestoreHeight:h,shouldCleanup:b,id:f,className:p,onStart:O,onStop:g,children:v,animationLevel:j})=>{let E=Object(a.q)(null);e&&(E=e);const y=Object(a.q)({}),N=Object(o.a)(t),T=Object(a.q)(),C=Object(i.a)(),M=void 0!==N&&t!==N;!s&&M&&(y.current={[N]:y.current[N]}),y.current[t]=v,Object(a.o)(()=>{function e(){b&&(y.current={[N]:m},C())}const a=E.current,i=a.children;if(1===i.length&&!M)return void i[0].classList.add("active");const o=Array.from(a.childNodes);if(!M||!o.length)return;T.current&&(clearTimeout(T.current),T.current=void 0);const l=-1===r||"auto"===r&&N>t||"inverse"===r&&N{e instanceof HTMLElement&&(e.classList.remove("from","through","to"),e.classList.toggle("active",t===v))}),void e();if(o.forEach((e,t)=>{e instanceof HTMLElement&&(e.classList.remove("active"),e.classList.toggle("from",t===p),e.classList.toggle("through",t>p&&tv),e.classList.toggle("to",t===v))}),"scroll-slide"===n){const e=a.offsetWidth;a.scrollBy({left:v>p?e:-e,behavior:"smooth"})}j>0&&Object(u.b)(d[n]+c.c),requestAnimationFrame(()=>{a.classList.add("animating"),T.current=window.setTimeout(()=>{requestAnimationFrame(()=>{if(a.classList.remove("animating","backwards"),o.forEach((e,t)=>{e instanceof HTMLElement&&(e.classList.remove("from","through","to"),e.classList.toggle("active",t===v))}),"scroll-slide"===n&&(a.scrollLeft=t*a.offsetWidth),h){const e=a.querySelector(".active");e&&(e.style.height="auto",a.style.height=e.clientHeight+"px")}e(),g&&g()})},d[n]+c.c),O&&O()})},[t,N,M,r,n,O,g,s,h,b,j,C]),Object(a.o)(()=>{if(h){const e=E.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")}},[h,v]);const w=y.current,S=Object.keys(s?new Array(s).fill(void 0):w).map(Number).map(e=>{const n=w[e];return"function"==typeof n?a.a.createElement("div",{key:e},n(e===t,e===N)):void 0}),L=Object(l.a)("Transition",p,0===j&&"scroll-slide"===n?"slide":n);return a.a.createElement("div",{ref:E,id:f,className:L},S)})},function(e,t,n){"use strict";var a=n(0),r=n(5),c=n(1),s=n(4),i=n(46),o=n(8),l=n(22),u=n(102),d=n(109),m=n(99);n(190);t.a=Object(a.h)(({className:e,size:t="large",chat:n,user:h,text:b,withOnlineStatus:f,isSavedMessages:p,lastSyncTime:O,onClick:g})=>{const v=h&&Object(s.pb)(h);let j;p||v||(h?j=Object(s.f)(h):n&&(j=Object(s.f)(n)));const E=Object(u.a)(j,!1,r.ApiMediaFormat.DataUri,O),{shouldRenderFullMedia:y,transitionClassNames:N}=Object(d.a)(E,"slow"),T=Object(m.a)();let C="";if(p)C=a.a.createElement("i",{className:"icon-avatar-saved-messages"});else if(v)C=a.a.createElement("i",{className:"icon-avatar-deleted-account"});else if(y)C=a.a.createElement("img",{src:E,className:N+" avatar-media",alt:"",decoding:"async"});else if(h){const e=Object(s.Z)(h);C=e?Object(i.c)(e,2):void 0}else if(n){const e=Object(s.l)(T,n);C=e&&Object(i.c)(e,Object(s.lb)(n.id)?2:1)}else b&&(C=Object(i.c)(b,2));const M=!p&&h&&Object(s.xb)(h),w=Object(o.a)("Avatar size-"+t,e,"color-bg-"+Object(s.X)(h||n),p&&"saved-messages",v&&"deleted-account",f&&M&&"online",g&&"interactive",!p&&!y&&"no-photo"),S=Object(a.m)(e=>{g&&g(e,p||y)},[g,p,y]),L=(h||n)&&(h||n).id;return a.a.createElement("div",{className:w,onClick:S,"data-test-sender-id":c.F?L:void 0},"string"==typeof C?Object(l.a)(C,["jumbo"===t?"hq_emoji":"emoji"]):C)})},function(e,t,n){"use strict";var a=n(19),r=n(0),c=n(9),s=n(150);t.a=({ref:e,className:t,onLoadMore:n,onScroll:i,items:o,itemSelector:l=".ListItem",preloadBackwards:u=20,sensitiveArea:d=800,noScrollRestore:m=!1,noScrollRestoreOnTop:h=!1,noFastList:b,cacheBuster:f,children:p})=>{let O=Object(r.q)(null);e&&(O=e);const g=Object(r.q)({}),[v,j]=Object(r.p)(()=>n?[Object(c.a)(()=>n({direction:a.e.Backwards}),1e3,!0,!1),Object(c.a)(()=>n({direction:a.e.Forwards}),1e3,!0,!1)]:[],[n,o]);Object(r.n)(()=>{if(!v)return;if(u>0&&(!o||o.length{const e=O.current,t=g.current;let n;if(t.listItemElements=e.querySelectorAll(l),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)}m||h&&0===e.scrollTop||(Object(s.a)(e,n),t.isScrollTopJustUpdated=!0)},[o,l,m,h,f]);const E=Object(r.m)(e=>{if(j&&v){const{listItemElements:e,isScrollTopJustUpdated:t,currentAnchor:n,currentAnchorTop:a}=g.current;if(t)return void(g.current.isScrollTopJustUpdated=!1);const r=e.length,c=O.current,{scrollTop:i,scrollHeight:o,offsetHeight:l}=c,u=i<=(r?e[0].offsetTop:0)+d,m=(r?e[r-1].offsetTop+e[r-1].offsetHeight:o)-(i+l)<=d;let h=!1;if(u){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&&(g.current.currentAnchor=t,g.current.currentAnchorTop=e,h=!0,Object(s.a)(c),j())}}if(m){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 n=Object(a.a)(t);n&&!t.some((e,t)=>e!==n[t])||e(n||[])}},function(e,t,n){"use strict";var a=n(0),r=n(32);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:u,transitionClassNames:d}=Object(r.a)(s,void 0,!i,t);return Object(a.n)(()=>{u&&(i?setTimeout(()=>{l(!1)},c[t]):l(!1))},[i,u,t]),{shouldRenderThumb:o,shouldRenderFullMedia:u,transitionClassNames:d}}},function(e,t,n){"use strict";n.d(t,"b",(function(){return i})),n.d(t,"c",(function(){return o})),n.d(t,"d",(function(){return l})),n.d(t,"a",(function(){return u})),n.d(t,"j",(function(){return f})),n.d(t,"f",(function(){return p})),n.d(t,"h",(function(){return O})),n.d(t,"k",(function(){return g})),n.d(t,"i",(function(){return v})),n.d(t,"l",(function(){return j})),n.d(t,"g",(function(){return E})),n.d(t,"e",(function(){return y}));var a=n(4),r=n(52),c=n(7),s=n(1);const i="(max-height: 640px)",o=parseInt(getComputedStyle(document.documentElement).fontSize,10),l=200,u={width:640,height:640},d={width:100,height:100};let m;function h(e,t,n){const a=t||n?1.625:0;return(function(e){const t=e?30:29;return c.g?(m||(m=Math.min(t,Math.floor(.69*window.innerWidth)/o)),m):t}(e)-a)*o}function b({width:e,height:t,fromOwnMessage:n,isForwarded:a,isWebPagePhoto:r,isGif:c}){const s=t/e;return y(h(n,a,r),function(e,t){return e&&t&&t>=.75&&t<=1.25?20*o:27*o}(c,s),e,t)}function f(e,t){const n=window.matchMedia(i),{width:a,height:c}=r.a.get();let s=t&&n.matches?10:8.25;return e&&(s=n.matches?10:15),{width:a,height:c-s*o}}function p(e,t,n,r){const{width:c,height:s}=Object(a.T)(e)||d;return b({width:c,height:s,fromOwnMessage:t,isForwarded:n,isWebPagePhoto:r})}function O(e,t,n){const{width:r,height:c}=Object(a.bb)(e)||d;return b({width:r,height:c,fromOwnMessage:t,isForwarded:n,isGif:e.isGif})}function g(){return{width:2*o,height:2*o}}function v(e){return e?{width:3*o,height:3*o}:{width:3.375*o,height:3.375*o}}function j(e){const{width:t}=e;let{height:n}=e;"1258816259753933"===e.id&&(n=t);const a=n&&t&&n/t,r=(c.g?s.wb:s.vb)*o,i=a?r*a:r;return a&&i>r?{width:Math.round(r/a),height:r}:{width:r,height:i}}function E({width:e,height:t},n,a=!1){const{width:r,height:c}=f(n,a);return y(r,c,e,t)}function y(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(9),c=n(8),s=n(45),i=n(126);let o,l;async function u(){return o||(o=n.e(7).then(n.bind(null,187)),l=(await o).default),o}setTimeout(u,5e3);t.a=Object(a.h)(({className:e,id:t,animationData:n,play:o,playSegment:d,speed:m,noLoop:h,size:b,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),N=Object(a.q)();N.current=o;const T=Object(a.q)();T.current=d,Object(a.n)(()=>{if(g||!n)return;const e=()=>{if(!j.current)return;const e=new l(t,j.current,n,{noLoop:h,size:b,quality:f,isLowPriority:p},O);m&&e.setSpeed(m),v(e)};l?e():u().then(()=>{Object(r.b)(()=>{j.current&&e()})})},[g,n,t,p,h,O,f,b,m]),Object(a.n)(()=>()=>{g&&g.destroy()},[g]);const C=Object(a.m)((e=!1)=>{g&&(N.current||T.current)&&(T.current?g.playSegment(T.current):e?g.goToAndPlay(0):g.play())},[g]),M=Object(a.m)(()=>{g&&g.pause()},[g]),w=Object(a.m)(()=>{y.current=!0,g&&(E.current||(E.current=g.isPlaying()),M())},[g,M]),S=Object(a.m)(()=>{E.current&&C(),E.current=!1,y.current=!1},[C]),L=Object(a.m)(()=>{Object(r.b)(S)},[S]);Object(a.n)(()=>{g&&(o||d?y.current?E.current=!0:C(h):y.current?E.current=!1:M())},[g,o,d,h,C,M]),Object(s.a)(w,S),Object(i.a)(w,L);const I=Object(c.a)("AnimatedSticker",e),A=b?`width: ${b}px; height: ${b}px;`:void 0;return a.a.createElement("div",{ref:j,className:I,style:A})})},function(e,t,n){"use strict";var a=n(0),r=n(99),c=n(104),s=n(29);t.a=Object(a.h)(({isOpen:e,onClose:t,onCloseAnimationEnd:n,title:i,header:o,text:l,textParts:u,confirmLabel:d="Confirm",confirmHandler:m,confirmIsDestructive:h,isButtonsInOneRow:b})=>{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)),u,a.a.createElement("div",{className:b?"dialog-buttons mt-2":""},a.a.createElement(s.a,{className:"confirm-dialog-button",isText:!0,onClick:m,color:h?"danger":"primary"},d),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(8),c=n(32),s=n(22),i=n(99);n(244);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(108),c=n(35);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(7),c=n(5),s=n(9),i=n(50),o=n(35);t.a=(e,t=!1,n=c.ApiMediaFormat.BlobUrl,l,u)=>{const d=e?i.c(e):void 0,m=n===c.ApiMediaFormat.Stream||r.i&&n===c.ApiMediaFormat.Progressive,h=Object(o.a)(),[b,f]=Object(a.r)(d&&!m?1:0),p=Object(a.q)(),O=Object(a.p)(()=>Object(s.g)(e=>{(!u||Date.now()-p.current>u)&&f(e)},500,!0),[u]);return Object(a.n)(()=>{!t&&e&&(d?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,!u||e>=u?h():setTimeout(h,u-e)})))},[t,e,d,n,l,h,m,u,O]),Object(a.n)(()=>{t&&p.current&&(i.a(O),f(0))},[O,t]),{mediaData:d,downloadProgress:b}}},function(e,t,n){"use strict";var a=n(0),r=n(8);n(214);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],u=l-4,d=l-1,m=2*u*Math.PI,h=Object(a.q)(null);Object(a.n)(()=>{if(!h.current)return;const t=h.current.firstElementChild,n=m-Math.min(Math.max(.05,e),1)*m;t?t.firstElementChild.setAttribute("stroke-dashoffset",n.toString()):h.current.innerHTML=`\n \n `},[h,m,d,u,e]);const b=Object(r.a)("ProgressSpinner size-"+t,s&&"transparent",n&&"square",i&&"no-cross");return a.a.createElement("div",{ref:h,className:b,onClick:o})})},function(e,t,n){"use strict";var a=n(0),r=n(61);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(2),c=n(19),s=n(4),i=n(6),o=n(22),l=n(3),u=n(99),d=n(106),m=n(128),h=n(151);t.a=Object(a.h)(Object(r.h)((e,{chatId:t})=>{const{lastSyncTime:n}=e,a=Object(i.f)(e,t);return{lastSyncTime:n,chat:a,onlineCount:a?Object(i.n)(e,a):void 0,areMessagesLoaded:Boolean(Object(i.m)(e,t))}},(e,t)=>Object(l.l)(t,["loadFullChat","openMediaViewer"]))(({typingStatus:e,avatarSize:t="medium",withMediaViewer:n,withUsername:r,withFullInfo:i,withUpdatingStatus:l,withChatType:b,chat:f,onlineCount:p,areMessagesLoaded:O,lastSyncTime:g,loadFullChat:v,openMediaViewer:j})=>{const E=f&&Object(s.nb)(f),{id:y,isMin:N,isRestricted:T}=f||{};Object(a.n)(()=>{y&&!N&&i&&g&&v({chatId:y})},[y,N,g,i,v,E]);const C=Object(a.m)((e,n)=>{f&&n&&(e.stopPropagation(),j({avatarOwnerId:f.id,origin:"jumbo"===t?c.h.ProfileAvatar:c.h.MiddleHeaderAvatar}))},[f,t,j]),M=Object(u.a)();if(f)return a.a.createElement("div",{className:"ChatInfo"},a.a.createElement(d.a,{key:f.id,size:t,chat:f,onClick:n?C: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.l)(M,f))),f.isVerified&&a.a.createElement(m.a,null)),function(){if(l&&!O&&!T)return a.a.createElement("span",{className:"status",dir:"auto"},M("Updating"));if(!f)return;if(e)return a.a.createElement(h.a,{typingStatus:e});if(b)return a.a.createElement("div",{className:"status",dir:"auto"},M(Object(s.m)(f)));const t=r?f.username:void 0,n=function(e,t){const n=e(Object(s.m)(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,f),c=p?", "+M("OnlineCount",p,"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 o})),n.d(t,"b",(function(){return l}));var a=n(19),r=n(45),c=n(9),s=n(57);let i=!1;function o(e,t,n,o=0,l=1500,u,d,m){if(u===a.b.Static)return void t.scrollIntoView({block:n});const{offsetTop:h}=t;if(void 0===u){const t=h-e.scrollTop;t<-l?e.scrollTop+=t+l:t>l&&(e.scrollTop+=t-l)}else u===a.b.Up?e.scrollTop=h+l:u===a.b.Down&&(e.scrollTop=Math.max(0,h-l));i=!0,Object(c.b)(()=>{!function(e,t,n,a=0,c,o){const{offsetTop:l,offsetHeight:u}=t,{scrollTop:d,offsetHeight:m,scrollHeight:h}=e,b=!o&&e.dataset.normalHeight?Number(e.dataset.normalHeight):m;let f;switch(n){case"start":f=l-a-d;break;case"end":f=l+u+a-(d+b);break;case"nearest":case"center":f=u0){const e=h-(d+b);f=Math.min(f,e)}const p=e.scrollTop+f,O=c||250+Math.abs(f)/1500*350,g=Date.now();Object(r.b)(O),Object(s.b)(()=>{const t=Math.min((Date.now()-g)/O,1),n=f*(1-function(e){return 1-(1-e)**3.5}(t));return e.scrollTop=Math.round(p-n),i=t<1,i})}(e,t,n,o,d,m)})}function l(){return i}},,function(e,t,n){"use strict";var a=n(0),r=n(8),c=n(20);n(221);var s=Object(a.h)(({id:e,label:t,subLabel:n,value:s,name:i,checked:o,disabled:l,hidden:u,isLoading:d,onChange:m})=>{const h=Object(r.a)("Radio",l&&"disabled",u&&"hidden-widget",d&&"loading");return a.a.createElement("label",{className:h},a.a.createElement("input",{type:"radio",name:i,value:s,id:e,checked:o,onChange:m,disabled:l||u}),a.a.createElement("div",{className:"Radio-main"},a.a.createElement("span",{className:"label"},t),n&&a.a.createElement("span",{className:"subLabel"},n)),d&&a.a.createElement(c.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";var a=n(0),r=n(19),c=n(3),s=n(35),i=n(41);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,u=e.slice(Math.max(0,o),l+1);let d,m;switch(n){case r.e.Forwards:d=i>0,m=o>=0;break;case r.e.Backwards:d=i{const d=Object(a.q)(),m=Object(a.q)((()=>{if(!t||d.current)return;const{newViewportIds:e}=o(t,t[0],r.e.Forwards,l);return e})()),h=Object(s.a)(),b=Object(i.a)(t),f=Object(i.a)(n);if(t&&!n&&(t!==b||n!==f)){const{offsetId:e=t[0],direction:n=r.e.Forwards}=d.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&&u){const t=m.current;e({offsetId:t[t.length-1]})}},[t,n,e,u]);const p=Object(a.m)(({direction:n})=>{const a=m.current,s=a?n===r.e.Backwards?a[a.length-1]:a[0]:void 0;if(!t)return void(e&&e({offsetId:s}));d.current={...d.current,direction:n,offsetId:s};const{newViewportIds:i,areSomeLocal:u,areAllLocal:b}=o(t,s,n,l);!u||a&&Object(c.a)(a,i)||(m.current=i,h()),!b&&e&&e({offsetId:s})},[t,l,e,h]);return n?[t]:[m.current,p]}},function(e,t,n){"use strict";var a=n(0),r=n(5),c=n(1),s=n(110),i=n(101),o=n(102),l=n(109),u=n(31),d=n(111);n(219);t.a=({sticker:e,isInline:t=!1,observeIntersection:n,lastSyncTime:m})=>{const h=Object(a.q)(null),[b,f]=Object(u.a)(),p="sticker"+e.id,O=Object(i.b)(h,n),g=Object(o.a)(p+"?size=m",!O,r.ApiMediaFormat.BlobUrl,m),{transitionClassNames:v}=Object(l.a)(g,"slow"),j=Object(o.a)(p,!O,r.ApiMediaFormat.Lottie,m),E=Boolean(j),[y,N]=Object(a.r)(String(Math.random())),T=Object(a.m)(()=>{N(String(Math.random()))},[]);let C;C=t?.5*Object(s.l)(e).width:c.Bb;const M=`width: ${C}px; height: ${C}px;`;return a.a.createElement("div",{ref:h,className:"AnimatedEmoji media-inner",style:M,onClick:T},g&&!b&&a.a.createElement("img",{src:g,className:v,alt:""}),E&&a.a.createElement(d.a,{key:p,id:p,animationData:j,size:C,quality:1,play:O&&y,noLoop:!0,onLoad:f}))}},function(e,t,n){"use strict";function a(e,t){if(!t&&e===document.activeElement)return;const n=window.getSelection(),a=document.createRange();e.lastChild&&e.lastChild.nodeValue?(a.setStart(e.lastChild,e.lastChild.nodeValue.length),n.removeAllRanges(),n.addRange(a)):e.focus()}n.d(t,"a",(function(){return a}))},,function(e,t,n){"use strict";var a=n(0);t.a=(e,t)=>{Object(a.n)(()=>(document.hasFocus()||e(),window.addEventListener("blur",e),window.addEventListener("focus",t),()=>{window.removeEventListener("focus",t),window.removeEventListener("blur",e)}),[e,t])}},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&&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(198);t.a=()=>a.a.createElement("span",{className:"VerifiedIcon"})},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(41);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(1);t.a=e=>{e.play().catch(e=>{a.p&&console.warn(e)})}},function(e,t,n){"use strict";var a=n(0),r=n(9),c=n(153);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(5),r=n(7);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);t=r.d?t.replace(/([^<]*)<\/span>/g,"$1"):t.replace(/]+alt="([^"]+)"[^>]*>/gm,"$1");return t=t.replace(/<\/?span([^>]*)?>/g,""),t=t.replace(/ /g," "),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(/[*]{1}([^*\n]+)[*]{1}/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.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 u,d;r===a.ApiMessageEntityTypes.TextUrl&&(u=e.href);r===a.ApiMessageEntityTypes.MentionName&&(d=Number(e.dataset.userId));return{index:i,entity:{type:r,offset:o,length:l,...u&&{url:u},...d&&{userId:d}}}}(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 u}));var a=n(0),r=n(32),c=n(8),s=n(44),i=n(41),o=n(31);n(209);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(210);let u;!function(e){e.None="none",e.Document="document",e.QuickFile="quick_file"}(u||(u={}));t.b=Object(a.h)(({isOpen:e,withQuick:t,onHide:n,onFileSelect:o})=>{const u=Object(a.q)(null),d=Object(i.a)(t),{shouldRender:m,transitionClassNames:h}=Object(r.a)(e);Object(a.n)(()=>e?Object(s.a)(n):void 0,[e,n]);const b=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&&(u.current=window.setTimeout(()=>{n()},150))},[n]);if(!m)return;const O=Object(c.a)("DropArea",h);return a.a.createElement("div",{className:O,onDragLeave:p,onDragOver:()=>{u.current&&window.clearTimeout(u.current)},onDrop:n},a.a.createElement(l,{onFileSelect:b}),(t||d)&&a.a.createElement(l,{onFileSelect:f,isQuick:!0}))})},,function(e,t,n){"use strict";var a=n(0),r=n(2),c=n(6),s=n(4),i=n(22),o=n(8),l=n(99),u=n(106);n(191);t.a=Object(a.h)(Object(r.h)((e,{chatOrUserId:t})=>{if(!t)return{};return{chat:t?Object(c.f)(e,t):void 0,user:Object(s.lb)(t)?Object(c.Fb)(e,t):void 0}})(({icon:e,title:t,isMinimized:n,canClose:r,onClick:c,clickArg:d,chat:m,user:h,className:b})=>{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||h){p=a.a.createElement(u.a,{chat:m,user:h,size:"small",isSavedMessages:h&&h.isSelf});const e=!m||h&&!h.isSelf?Object(s.Y)(h):Object(s.l)(f,m,h);O=e?Object(i.a)(e):void 0}const g=Object(o.a)("PickerSelectedItem",b,n&&"minimized",r&&"closeable");return a.a.createElement("div",{className:g,onClick:()=>c(d),title:n?O: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(9),r=n(57),c=n(7);function s(e,t){c.e?Object(a.b)(()=>{!function(e,t){const{scrollLeft:n,offsetWidth:a,scrollWidth:c}=e;let s=t-n;if(s<0){const e=-n;s=Math.max(s,e)}else if(s>0){const e=c-(n+a);s=Math.min(s,e)}const i=e.scrollLeft+s,o=Date.now();Object(r.a)(()=>{const t=Math.min((Date.now()-o)/450,1),n=s*(1-function(e){return 1-(1-e)**3.5}(t));return e.scrollLeft=Math.round(i-n),t<1})}(e,t)}):e.scrollTo({left:t,behavior:"smooth"})}},function(e,t,n){"use strict";var a=n(0);t.a=(e,t)=>{Object(a.n)(()=>{const t=e.current;if(t)return t.addEventListener("wheel",n,{passive:!0}),()=>{t.removeEventListener("wheel",n)};function n(e){e.deltaX||(t.scrollLeft+=e.deltaY/4)}},[e,t])}},function(e,t,n){"use strict";var a=n(0),r=n(2),c=n(9);t.a=(e,t,n,s)=>{const{loadMessage:i}=Object(r.d)(),o=Object(a.p)(()=>{const n=Object(c.g)(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(7);let c=0;t.a=(e,t,n)=>{const[s,i]=Object(a.r)(!1),[o,l]=Object(a.r)(void 0),u=Object(a.m)(e=>{t||2!==e.button||document.body.classList.add("no-selection")},[t]),d=Object(a.m)(e=>{document.body.classList.remove("no-selection"),t||n&&e.target.matches("a.text-entity-link[href]")||(e.preventDefault(),o||(document.body.classList.remove("no-selection"),0===c&&document.body.classList.add("has-context-menu"),c++,i(!0),l({x:e.clientX,y:e.clientY})))},[t,n,o]),m=Object(a.m)(()=>{i(!1)},[]),h=Object(a.m)(()=>{l(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.l)return;const n=e.current;if(!n)return;let a;const c=()=>{a&&(clearTimeout(a),a=void 0)},s=e=>{t||r.g&&window.document.body.classList.contains("enable-symbol-menu-transforms")||(c(),a=window.setTimeout(()=>(e=>{c();const{clientX:t,clientY:a}=e.touches[0];o||(n.addEventListener("touchend",(function e(t){n.removeEventListener("touchend",e,!0),t.stopImmediatePropagation(),t.preventDefault(),t.stopPropagation()}),!0),document.body.classList.add("no-selection"),i(!0),l({x:t,y:a}))})(e),250))};return n.addEventListener("touchstart",s,{passive:!0}),n.addEventListener("touchcancel",c,!0),n.addEventListener("touchend",c,!0),n.addEventListener("touchmove",c,{passive:!0}),()=>{c(),n.removeEventListener("touchstart",s),n.removeEventListener("touchcancel",c,!0),n.removeEventListener("touchend",c,!0),n.removeEventListener("touchmove",c)}},[o,t,e]),{isContextMenuOpen:s,contextMenuPosition:o,handleBeforeContextMenu:u,handleContextMenu:d,handleContextMenuClose:m,handleContextMenuHide:h}}},function(e,t,n){"use strict";n.d(t,"a",(function(){return u})),n.d(t,"b",(function(){return m}));var a=n(0),r=n(2),c=n(5),s=n(4),i=n(22),o=n(70),l=n(53);function u(e,t,n){const a=e.content.text;if(!a||!a.text){const t=Object(s.O)(e);return t?[t]:void 0}const{text:r,entities:c}=a;return m(r,c,t,n)}function d(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=a.filter((e,t)=>t>n&&e.offset>=c&&e.offsete(t,a.indexOf(t),a,r)).filter(Boolean);return o.forEach(e=>e.organizedIndexes.forEach(e=>i.add(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 h(e,n,r,s);const u=[];let m=!1;const O=d(t);function g(t,u,d,O){const v=[],{entity:j,nestedEntities:E}=d,{offset:y,length:N,type:T}=j;let C=e.substring(t,y);const M=C.length;C&&(m&&C.length>0&&"\n"===C[0]&&(C=C.substr(1),m=!1),C&&v.push(...h(C,n,r,s)));const w=t+M,S=w+N;let L=e.substring(y,y+N);const I=[];if(m&&L.length>0&&"\n"===L[0]&&(L=L.substr(1),m=!1),T===c.ApiMessageEntityTypes.Pre&&(m=!0),E.length){let e=w;E.forEach((t,n)=>{const{renderResult:a,entityEndIndex:r}=g(e,S,t,n===E.length-1);I.push(...a),e=r})}const A=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,L,I):function(e,t,n){const r="string"==typeof t&&t,s=n.length?n:t;if(!r)return h(s);switch(e.type){case c.ApiMessageEntityTypes.Bold:return a.a.createElement("strong",null,h(s));case c.ApiMessageEntityTypes.Blockquote:return a.a.createElement("blockquote",null,h(s));case c.ApiMessageEntityTypes.BotCommand:return a.a.createElement("a",{onClick:f,className:"text-entity-link",dir:"auto"},h(s));case c.ApiMessageEntityTypes.Hashtag:case c.ApiMessageEntityTypes.Cashtag:return a.a.createElement("a",{onClick:p,className:"text-entity-link",dir:"auto"},h(s));case c.ApiMessageEntityTypes.Code:return a.a.createElement("code",{className:"text-entity-code"},h(s));case c.ApiMessageEntityTypes.Email:return a.a.createElement("a",{href:"mailto:"+r,target:"_blank",rel:"noopener noreferrer",className:"text-entity-link",dir:"auto"},h(s));case c.ApiMessageEntityTypes.Italic:return a.a.createElement("em",null,h(s));case c.ApiMessageEntityTypes.MentionName:return a.a.createElement(o.a,{userId:e.userId},h(s));case c.ApiMessageEntityTypes.Mention:return a.a.createElement(o.a,{username:r},h(s));case c.ApiMessageEntityTypes.Phone:return a.a.createElement("a",{href:"tel:"+r,className:"text-entity-link"},h(s));case c.ApiMessageEntityTypes.Pre:return a.a.createElement("pre",{className:"text-entity-pre"},h(s));case c.ApiMessageEntityTypes.Strike:return a.a.createElement("del",null,h(s));case c.ApiMessageEntityTypes.TextUrl:case c.ApiMessageEntityTypes.Url:return a.a.createElement(l.a,{url:b(r,e),text:r},h(s));case c.ApiMessageEntityTypes.Underline:return a.a.createElement("ins",null,h(s));default:return h(s)}}(j,L,I);if(Array.isArray(A)?v.push(...A):v.push(A),O&&S0&&"\n"===t[0]&&(t=t.substring(1)),t&&v.push(...h(t,n,r,s))}return{renderResult:v,entityEndIndex:S}}let v=0;return O.forEach((t,n)=>{const{renderResult:a,entityEndIndex:r}=g(v,e.length,t,n===O.length-1);u.push(...a),v=r}),u}function h(e,t,n,a){if(Array.isArray(e)){const r=[];return e.forEach(e=>{r.push(...h(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 b(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(9);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})),n.d(t,"c",(function(){return s})),n.d(t,"b",(function(){return i}));var a=n(1);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=>{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.p&&console.error(e)}}},function(e,t,n){"use strict";var a=n(0),r=n(8),c=n(31),s=n(99),i=n(15),o=n(29);n(189);t.a=Object(a.h)(({ref:e,children:t,value:n,inputId:l,className:u,focused:d,isLoading:m,placeholder:h,disabled:b,canClose:f,onChange:p,onReset:O,onFocus:g,onBlur:v})=>{let j=Object(a.q)(null);e&&(j=e);const[E,y,N]=Object(c.a)(d);Object(a.n)(()=>{j.current&&(d?j.current.focus():j.current.blur())},[d,h]);const T=Object(s.a)();return a.a.createElement("div",{className:Object(r.a)("SearchInput",u,E&&"has-focus")},t,a.a.createElement("input",{ref:j,id:l,type:"text",dir:"auto",placeholder:h||T("Search"),className:"form-control",value:n,disabled:b,onChange:function(e){const{currentTarget:t}=e;p(t.value)},onFocus:function(){y(),g&&g()},onBlur:function(){N(),v&&v()}}),a.a.createElement("i",{className:"icon-search"}),m&&a.a.createElement(i.a,null),!m&&(n||f)&&O&&a.a.createElement(o.a,{round:!0,size:"tiny",color:"translucent",onClick:O},a.a.createElement("span",{className:"icon-close"})))})},function(e,t,n){"use strict";var a=n(7);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(2),c=n(6),s=n(4),i=n(22);n(199);t.a=Object(a.h)(Object(r.h)((e,{typingStatus:t})=>{if(!t.userId)return{};return{typingUser:Object(c.Fb)(e,t.userId)}})(({typingStatus:e,typingUser:t})=>{const n=t&&!t.isSelf&&Object(s.Y)(t);return a.a.createElement("p",{className:"typing-status"},n&&a.a.createElement("span",{className:"sender-name",dir:"auto"},Object(i.a)(n)),e.action,a.a.createElement("span",{className:"ellipsis"}))}))},function(e,t,n){"use strict";var a=n(0),r=n(2),c=n(6),s=n(4),i=n(3),o=n(99),l=n(22),u=n(106),d=n(104),m=n(29);n(202);t.a=Object(a.h)(Object(r.h)((e,{chat:t})=>{const n=Object(s.lb)(t.id),a=Object(c.O)(e,t.id),r=n&&!a,i=t&&Object(s.lb)(t.id)?Object(s.Y)(Object(c.Fb)(e,Object(s.U)(t))):void 0;return{isPrivateChat:n,isChatWithSelf:a,isChannel:Object(s.jb)(t),isBasicGroup:Object(s.ib)(t),isSuperGroup:Object(s.nb)(t),canDeleteForAll:r,contactName:i}},(e,t)=>Object(i.l)(t,["leaveChannel","deleteHistory","deleteChannel"]))(({isOpen:e,chat:t,isChannel:n,isPrivateChat:r,isChatWithSelf:c,isBasicGroup:i,isSuperGroup:h,canDeleteForAll:b,contactName:f,onClose:p,leaveChannel:O,deleteHistory:g,deleteChannel:v})=>{const j=Object(o.a)(),E=Object(s.l)(j,t),y=Object(a.m)(()=>{g({chatId:t.id,maxId:t.lastMessage.id,shouldDeleteForAll:!0}),p()},[g,t.id,t.lastMessage,p]),N=Object(a.m)(()=>{r||i?g({chatId:t.id,maxId:t.lastMessage.id,shouldDeleteForAll:!1}):!n&&!h||t.isCreator?(n||h)&&t.isCreator&&v({chatId:t.id}):O({chatId:t.id}),p()},[r,i,n,h,t.isCreator,t.lastMessage,t.id,p,g,O,v]);return a.a.createElement(d.a,{isOpen:e,onClose:p,className:"DeleteChatModal",header:a.a.createElement("div",{className:"modal-header"},a.a.createElement(u.a,{size:"tiny",chat:t,isSavedMessages:c}),a.a.createElement("h3",{className:"modal-title"},j(n&&!t.isCreator?"LeaveChannel":n&&t.isCreator?"ChannelDelete":i||h?"Group.LeaveGroup":"DeleteChatUser")))},n&&t.isCreator?a.a.createElement("p",null,Object(l.a)(j("ChatList.DeleteAndLeaveGroupConfirmation",E),["simple_markdown"])):n&&!t.isCreator||i||h?a.a.createElement("p",null,Object(l.a)(j("ChannelLeaveAlertWithName",E),["simple_markdown"])):a.a.createElement("p",null,Object(l.a)(j("ChatList.DeleteChatConfirmation",f),["simple_markdown"])),b&&a.a.createElement(m.a,{color:"danger",className:"confirm-dialog-button",isText:!0,onClick:y},f?j("ChatList.DeleteForEveryone",f):j("DeleteForAll")),a.a.createElement(m.a,{color:"danger",className:"confirm-dialog-button",isText:!0,onClick:N},j(n&&!t.isCreator?"LeaveChannel":n&&t.isCreator?"Chat.Input.Delete":i||h?"Group.LeaveGroup":b?"ChatList.DeleteForCurrentUser":"Delete")),a.a.createElement(m.a,{className:"confirm-dialog-button",isText:!0,onClick:p},j("Cancel")))}))},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(41);t.a=(e,t)=>{const n=Object(r.a)(t);return Object(a.o)(()=>{e(n||[])},t)}},function(e,t,n){"use strict";var a=n(0),r=n(55),c=n(4),s=n(101),i=n(115),o=n(102),l=n(173),u=n(174);t.a=Object(a.h)(({message:e,observeIntersection:t,smaller:n,uploadProgress:d,withDate:m,datetime:h,className:b,sender:f,isSelected:p,isSelectable:O,onCancelUpload:g,onDateClick:v})=>{const j=Object(a.q)(null),E=e.content.document,y=Object(r.b)(E)||"",{fileName:N,size:T,timestamp:C}=E,M=Object(s.b)(j,t),[w,S]=Object(a.r)(!1),{mediaData:L,downloadProgress:I}=Object(i.a)(Object(c.D)(e,"download"),!w),{isUploading:A,isTransferring:k,transferProgress:x}=Object(c.s)(e,d||I,w),D=Object(r.c)(E),_=D?Object(c.E)(e):void 0,R=D?E.previewBlobUrl:void 0,F=Object(o.a)(Object(c.D)(e,"pictogram"),!M),P=Object(a.m)(()=>{A?g&&g():S(e=>!e)},[A,g]),U=Object(a.m)(()=>{v(e.id,e.chatId)},[v,e.id,e.chatId]);return Object(a.n)(()=>{w&&L&&(Object(l.a)(L,N),S(!1))},[N,L,w]),a.a.createElement(u.a,{ref:j,name:N,extension:y,size:T,timestamp:m?h||C:void 0,thumbnailDataUri:_,previewData:R||F,smaller:n,isTransferring:k,isUploading:A,transferProgress:x,className:b,sender:f,isSelectable:O,isSelected:p,onClick:P,onDateClick:v?U:void 0})})},function(e,t,n){"use strict";var a=n(0),r=n(11),c=n(16);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(158),c=n(35),s=n(7);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),u=l.data;let d,m,h,b,f,p,O,g,v,j,E,y,N=c-1,T=s-1,C=i+1,M=[],w=[],S=[],L=a[i],I=r[i],A=[],k=[];for(;o-- >0;){for(y=E=0,f=0;fN?N:p)<<2),d+=u[O++],m+=u[O++],h+=u[O++];for(b=0;b0?O<<2:0),g=y+A[b],v=y+k[b],d+=u[g++]-u[v++],m+=u[g++]-u[v++],h+=u[g++]-u[v++],E++;y+=c<<2}for(b=0;bT?0:c,d+=M[j],m+=w[j],h+=S[j];for(E=b<<2,f=0;f>>I,u[E+1]=m*L>>>I,u[E+2]=h*L>>>I,0==b&&(A[f]=((O=f+C)0?O*c:0),g=b+A[f],v=b+k[f],d+=M[g]-M[v],m+=w[g]-w[v],h+=S[g]-S[v],E+=c<<2}}e.putImageData(l,t,n)}},function(e,t,n){"use strict";var a=n(0),r=n(1),c=n(8),s=n(44),i=n(32),o=n(73),l=n(31),u=n(99),d=n(29);n(234);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:h})=>{const b=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)(""),[N,T]=Object(a.r)(!1),[C,M]=Object(a.r)(),[w,S]=Object(a.r)({});Object(a.n)(()=>e?Object(s.a)(h):void 0,[e,h]),Object(o.a)(e,b,h),Object(a.n)(()=>{g?f.current.focus():(y(""),T(!1))},[g]),Object(a.n)(()=>{p||(j(),S({}),M(void 0))},[j,p]),Object(a.n)(()=>{if(!e||!n)return;const t={};let{parentElement:a}=n.commonAncestorContainer;for(;a&&a.id!==r.v;){const e=m[a.tagName];e&&(t[e]=!0),a=a.parentElement}S(t)},[e,n,v]);const L=Object(a.m)(()=>{if(n)return n.toString()},[n]),I=Object(a.m)(()=>{if(n)return n.commonAncestorContainer.parentElement},[n]);function A(){const e=f.current;if(!e)return;const{offsetWidth:t,scrollWidth:n,scrollLeft:a}=e;if(n<=t)return void M(void 0);let r="";a0&&(r+=" mask-left"),M(r)}function k(e){if(w[e])return"active";if("monospace"===e||"strikethrough"===e){if(Object.keys(w).some(t=>t!==e&&!!w[t]))return"disabled"}else if(w.monospace||w.strikethrough)return"disabled"}const x=Object(a.m)(()=>{S(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"),S(e=>({...e,italic:!e.italic}))},[]),_=Object(a.m)(()=>{document.execCommand("underline"),S(e=>({...e,underline:!e.underline}))},[]),R=Object(a.m)(()=>{if(w.strikethrough){const e=I();if(!n||!e||"DEL"!==e.tagName||!e.textContent)return;return e.replaceWith(e.textContent),void S(e=>({...e,strikethrough:!1}))}const e=L();document.execCommand("insertHTML",!1,`${e}`),h()},[I,L,h,n,w.strikethrough]),F=Object(a.m)(()=>{if(w.monospace){const e=I();if(!n||!e||"CODE"!==e.tagName||!e.textContent)return;return e.replaceWith(e.textContent),void S(e=>({...e,monospace:!1}))}const e=L();document.execCommand("insertHTML",!1,`${e}`),h()},[I,L,h,n,w.monospace]);function P(){const e=E.includes("://")?E:"http://"+E;if(N){const t=I();if(!t||"A"!==t.tagName)return;return t.href=e,void h()}const t=L();!function(){if(!n)return;const e=window.getSelection();e&&(e.removeAllRanges(),e.addRange(n))}(),document.execCommand("insertHTML",!1,`${t}`),h()}const U=Object(a.m)(e=>{const t={KeyK:v,KeyB:x,KeyU:_,KeyI:D,KeyM:F,KeyS:R}[e.code];!e.altKey&&(e.ctrlKey||e.metaKey)&&t&&(e.preventDefault(),e.stopPropagation(),t())},[x,D,_,F,R,v]);Object(a.n)(()=>(e&&document.addEventListener("keydown",U),()=>document.removeEventListener("keydown",U)),[e,U]);const B=Object(u.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:b,className:q,style:$,onKeyDown:function(e){"Enter"===e.key&&g&&(P(),e.preventDefault())}},a.a.createElement("div",{className:"TextFormatter-buttons"},a.a.createElement(d.a,{color:"translucent",ariaLabel:"Bold text",className:k("bold"),onClick:x},a.a.createElement("i",{className:"icon-bold"})),a.a.createElement(d.a,{color:"translucent",ariaLabel:"Italic text",className:k("italic"),onClick:D},a.a.createElement("i",{className:"icon-italic"})),a.a.createElement(d.a,{color:"translucent",ariaLabel:"Underlined text",className:k("underline"),onClick:_},a.a.createElement("i",{className:"icon-underlined"})),a.a.createElement(d.a,{color:"translucent",ariaLabel:"Strikethrough text",className:k("strikethrough"),onClick:R},a.a.createElement("i",{className:"icon-strikethrough"})),a.a.createElement(d.a,{color:"translucent",ariaLabel:"Monospace text",className:k("monospace"),onClick:F},a.a.createElement("i",{className:"icon-monospace"})),a.a.createElement("div",{className:"TextFormatter-divider"}),a.a.createElement(d.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(d.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",C)},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),A()},onScroll:A})),a.a.createElement("div",{className:H},a.a.createElement("div",{className:"TextFormatter-divider"}),a.a.createElement(d.a,{color:"translucent",ariaLabel:B("Save"),className:"color-primary",onClick:P},a.a.createElement("i",{className:"icon-check"}))))))})},function(e,t,n){"use strict";var a=n(0),r=n(33),c=n(4),s=n(102),i=n(109);n(242);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.E)(e),u=Object(s.a)(Object(c.D)(e,"pictogram")),{shouldRenderThumb:d,shouldRenderFullMedia:m,transitionClassNames:h}=Object(i.a)(u,"slow"),b=Object(c.P)(e);return a.a.createElement("div",{id:`${t}${e.id}`,className:"Media scroll-item",onClick:n?o:void 0},d&&a.a.createElement("img",{src:l,alt:""}),m&&a.a.createElement("img",{src:u,className:h+" full-media",alt:""}),b&&a.a.createElement("span",{className:"video-duration"},b.isGif?"GIF":Object(r.e)(b.duration)))})},,function(e,t,n){"use strict";var a=n(0),r=n(2),c=n(7),s=n(33),i=n(4);var o=n(8),l=n(22);var u=n(115),d=n(32),m=n(132),h=n(171),b=n(99),f=n(29),p=n(116),O=n(24);n(216);const g=c.g?20:25,v=c.g?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)(Object(r.h)(e=>({theme:e.settings.byKey.theme}))(({theme:e,message:t,senderTitle:n,uploadProgress:r,renderingFor:E,date:y,lastSyncTime:N,className:T,isSelectable:C,isSelected:M,onPlay:w,onReadMedia:S,onCancelUpload:L,onDateClick:I})=>{const{content:{audio:A,voice:k},isMediaUnread:x}=t,D=Boolean(k),_=Object(a.q)(!1),[R,F]=Object(a.r)(!1),P=N,{mediaData:U,downloadProgress:B}=Object(u.a)(Object(i.D)(t,"inline"),!P,Object(i.C)(t,"inline"));const{isBuffered:q,bufferedProgress:H,bufferingHandlers:$,checkBuffering:Y}=Object(m.a)(),{isPlaying:V,playProgress:K,playPause:z,setCurrentTime:W,duration:G}=Object(h.a)(Object(i.A)(t),Object(i.r)(t),U,$,Y,R,(function(){F(!0),w(t.id,t.chatId)}),Object(i.sb)(t));Object(a.n)(()=>{F(V)},[V]);const{isUploading:X,isTransferring:Q,transferProgress:J}=Object(i.s)(t,r||B,R&&!q),{shouldRender:Z,transitionClassNames:ee}=Object(d.a)(Q),te=Object(a.m)(()=>{X?L&&L():(V||w(t.id,t.chatId),F(!R),z())},[V,X,t.id,t.chatId,L,w,z,R]);Object(a.n)(()=>{V&&S&&x&&S()},[V,x,S]);const ne=Object(a.m)(e=>{if(_.current){const t=e.currentTarget.closest(".seekline,.waveform");if(t){const{width:n,left:a}=t.getBoundingClientRect();W(G*((e.clientX-a)/n))}}},[G,W]),ae=Object(a.m)(e=>{_.current=!0,ne(e)},[ne]),re=Object(a.m)(()=>{_.current=!1},[]),ce=Object(a.m)(()=>{I(t.id,t.chatId)},[I,t.id,t.chatId]),se=Object(b.a)();const ie={handleStartSeek:ae,handleSeek:ne,handleStopSeek:re},oe=Object(i.tb)(t),le=Object(a.p)(()=>k&&function(e,t=0,n=!1,{handleStartSeek:r,handleSeek:c,handleStopSeek:s},i){const{waveform:o,duration:l}=e;if(!o)return;const u="dark"===i?"#494B75":"#CBCBCB",d="dark"===i?"#C69C85":"#B0DEA6",m="dark"===i?"#868DF5":"#54a3e6",h="dark"===i?"#FFFFFF":"#53ad53",b=Math.min(l/30,1),f=Math.round(g+(v-g)*b),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 u=0;u{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?d:u,progressFillStyle:n?h:m});return a.a.createElement("img",{src:E,alt:"",width:y,height:N,className:"waveform",draggable:!1,onMouseDown:r,onMouseMove:c,onMouseUp:s})}(k,K,oe,ie,e),[k,K,oe,ie,e]),ue=Object(o.a)("Audio media-inner",T,oe&&!E&&"own",E&&"bigger",M&&"audio-is-selected"),de=["toggle-play"];Z?de.push("loading"):V?de.push("pause"):V||de.push("play");const me=V||K>0&&K<1,he=Object(o.a)("content",me&&"with-seekline");return a.a.createElement("div",{className:ue},C&&a.a.createElement("div",{className:"message-select-control"},M&&a.a.createElement("i",{className:"icon-select"})),a.a.createElement(f.a,{round:!0,ripple:!c.g,size:E?"smaller":"tiny",className:de.join(" "),ariaLabel:V?"Pause audio":"Play audio",onClick:te},a.a.createElement("i",{className:"icon-play"}),a.a.createElement("i",{className:"icon-pause"})),Z&&a.a.createElement("div",{className:Object(o.a)("media-loading",ee)},a.a.createElement(p.a,{progress:J,transparent:!0,size:E?"m":"s",onClick:te})),"searchResult"===E&&a.a.createElement(a.a.Fragment,null,a.a.createElement("div",{className:he},a.a.createElement("div",{className:"content-row"},a.a.createElement("p",{className:"title",dir:"auto"},Object(l.a)(function(){if(D)return n||"Voice";const{title:e,fileName:t}=A;return e||t}())),a.a.createElement("div",{className:"message-date"},y&&a.a.createElement(O.a,{className:"date",onClick:ce},Object(s.g)(se,1e3*y)))),me&&j(K,H,ie),!me&&a.a.createElement("p",{className:"duration",dir:"auto"},K>0?Object(s.e)(G*K)+" / ":void 0,function(){if(D)return Object(s.e)(k.duration);const{performer:e}=A;return a.a.createElement(a.a.Fragment,null,e&&Object(l.a)(e),e&&n&&a.a.createElement("span",null,"•"),n&&Object(l.a)(n))}()))),"searchResult"!==E&&A&&function(e,t,n,r,c,i,o,u){const{title:d,performer:m,duration:h,fileName:b}=t,f=n||r>0&&r<1;return a.a.createElement("div",{className:"content"},a.a.createElement("p",{className:"title",dir:"auto"},Object(l.a)(d||b)),f&&j(r,c,i),!f&&a.a.createElement("div",{className:"meta",dir:"auto"},a.a.createElement("span",{className:"performer"},Object(l.a)(m||"Unknown")),o&&a.a.createElement(a.a.Fragment,null," ","•"," ",a.a.createElement(O.a,{className:"date",onClick:u},Object(s.d)(e,1e3*o)))),a.a.createElement("p",{className:"duration",dir:"auto"},r>0?Object(s.e)(h*r)+" / ":void 0,Object(s.e)(h)))}(se,A,V,K,H,ie,y,I?ce:void 0),"searchResult"!==E&&k&&function(e,t,n){return a.a.createElement("div",{className:"content"},t,a.a.createElement("p",{className:"voice-duration",dir:"auto"},Object(s.e)(e.duration),n&&a.a.createElement("span",null,"•")))}(k,le,x))}))},function(e,t,n){"use strict";var a=n(0),r=n(137),c=n(41),s=n(138),i=n(99),o=n(8);n(195);var l=Object(a.h)(({className:e,title:t,active:n,badgeCount:r,isBadgeActive:c,previousActiveTab:s,onClick:i,clickArg:l})=>{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(l),ref:u},a.a.createElement("span",null,t,!!r&&a.a.createElement("span",{className:Object(o.a)("badge",c&&"active")},r),a.a.createElement("i",null)))});n(196);t.a=Object(a.h)(({tabs:e,activeTab:t,big:n,onSwitchTab:o})=>{const u=Object(a.q)(null),d=Object(c.a)(t);Object(s.a)(u),Object(a.n)(()=>{const e=u.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:u},e.map((e,n)=>a.a.createElement(l,{key:e.title,title:m(e.title),active:n===t,badgeCount:e.badgeCount,isBadgeActive:e.isBadgeActive,previousActiveTab:d,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"};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";var a=n(0),r=n(2),c=n(4),s=n(99);t.a=({chat:e,privateChatUser:t,handleDelete:n,folderId:i,isPinned:o})=>{const l=Object(s.a)(),{toggleChatPinned:u,updateChatMutedState:d,toggleChatArchived:m,toggleChatUnread:h}=Object(r.d)();return Object(a.p)(()=>{if(!e)return;const a=t&&t.isSelf,r=e.unreadCount||e.hasUnreadMark?{title:l("MarkAsRead"),icon:"readchats",handler:()=>h({id:e.id})}:{title:l("MarkAsUnread"),icon:"unread",handler:()=>h({id:e.id})},s=o?{title:l("UnpinFromTop"),icon:"unpin",handler:()=>u({id:e.id,folderId:i})}:{title:l("PinToTop"),icon:"pin",handler:()=>u({id:e.id,folderId:i})},b=e.isMuted?{title:l("ChatList.Unmute"),icon:"unmute",handler:()=>d({chatId:e.id,isMuted:!1})}:{title:l("ChatList.Mute"),icon:"mute",handler:()=>d({chatId:e.id,isMuted:!0})},f=Object(c.hb)(e)?{title:l("Unarchive"),icon:"unarchive",handler:()=>m({id:e.id})}:{title:l("Archive"),icon:"archive",handler:()=>m({id:e.id})};return[r,s,...a?[]:[b,f],{title:Object(c.lb)(e.id)?l("Delete"):l(Object(c.d)(e)?"DeleteChat":Object(c.jb)(e)?"LeaveChannel":"Group.LeaveGroup"),icon:"delete",destructive:!0,handler:n}]},[e,t,l,o,n,h,u,i,d,m])}},function(e,t,n){"use strict";var a=n(0),r=n(33),c=n(99),s=n(167);n(201);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(105);n(200);!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,u]=Object(a.r)("bottom"),[d,m]=Object(a.r)("");return Object(a.n)(()=>{const a=t();if(!e||!a)return;let{x:i,y:l}=e;const d={width:0,left:0,height:0,top:0},h=r(),b=n(),f=a.getBoundingClientRect(),p=h?{width:h.offsetWidth,height:h.offsetHeight}:d,O=b?b.getBoundingClientRect():d;i+p.width+c0?(o("right"),i-=3):(o("left"),i=16),l+p.height{const{shouldRender:u,transitionClassNames:d}=Object(r.a)(e,void 0,void 0,!t&&void 0),m=Object(c.a)(e),h=Object(c.a)(l),b=Object(a.q)();return m&&!e&&(b.current=h),u&&a.a.createElement("div",{id:n,className:Object(s.a)(i,d),onClick:o},e?l():b.current())}},function(e,t,n){"use strict";n.d(t,"a",(function(){return i}));var a=n(0),r=n(41),c=n(35),s=n(108);function i(e,t){const n=Object(r.a)(e,!0),i=Object(a.q)(),o=Object(c.a)(),l=null!=e,u=null!=n;return l&&i.current&&(clearTimeout(i.current),i.current=void 0),Object(s.a)(()=>{t&&!l&&u&&!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(172),c=n(54),s=n(153),i=n(108);t.a=(e,t,n,o,l,u=!1,d,m=!1)=>{const h=Object(a.q)(null),[b,f]=Object(a.r)(!1);let p=b;const[O,g]=Object(a.r)(0);Object(i.a)(()=>{h.current=Object(r.a)(e,(e,n)=>{switch(e){case"onPlay":f(!0);break;case"onPause":f(!1);break;case"onTimeUpdate":{const{proxy:e}=h.current,n=e.duration&&Number.isFinite(e.duration)?e.duration:t;g(e.currentTime/n);break}}o&&o[e]&&o[e](n)},d);const{proxy:n}=h.current;b||n.paused||(f(!0),p=!0),l&&l(n)},[e]);const{play:v,pause:j,setCurrentTime:E,proxy:y,destroy:N}=h.current,T=y.duration&&Number.isFinite(y.duration)?y.duration:t;Object(a.n)(()=>{T&&!Object(s.a)(y)&&g(y.currentTime/T)},[T,O,y]),Object(a.n)(()=>()=>{N(m)},[N,m]),Object(c.a)(([e,t])=>{e===u&&n===t||y.src&&y.paused||u&&n&&!b&&v(n)},[u,n,b,v,y.src,y.paused]);const C=Object(a.m)(()=>{b?j():n&&v(n)},[n,j,v,b]);return{isPlaying:p,playProgress:O,playPause:C,setCurrentTime:E,audioProxy:y,duration:T}}},function(e,t,n){"use strict";n.d(t,"b",(function(){return d})),n.d(t,"a",(function(){return m}));var a=n(7),r=n(131),c=n(153),s=n(2),i=n(4);const o=new Map;let l,u=[];function d(){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=u[u.indexOf(e)+1];if(!t)return;if(!o.has(t))return void Object(s.d)().openAudioPlayer(Object(i.zb)(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)),u.includes(e)||u.push(e));const{audio:d,proxy:m,handlers:h}=o.get(e);return h.push(t),{play(t){l&&l!==e&&o.get(l).audio.pause(),l=e,d.src||(d.src=t,d.preload="auto",t.includes("/progressive/")&&a.j&&Object(c.b)(d)),Object(r.a)(d)},pause(){l===e&&d.pause()},setCurrentTime(t){l===e&&(d.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&&(u=u.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(32),c=n(109),s=n(8),i=n(33),o=n(55),l=n(110),u=n(22),d=n(99),m=n(116),h=n(24);n(215);t.a=Object(a.h)(({ref:e,name:t,size:n,extension:b="",timestamp:f,sender:p,thumbnailDataUri:O,previewData:g,className:v,smaller:j,isTransferring:E,isUploading:y,isSelectable:N,isSelected:T,transferProgress:C,onClick:M,onDateClick:w})=>{const S=Object(d.a)();let L=Object(a.q)(null);e&&(L=e);const{shouldRender:I,transitionClassNames:A}=Object(r.a)(E,void 0,!0),k=Object(o.a)(b),x=Object(o.e)(n),{shouldRenderThumb:D,shouldRenderFullMedia:_,transitionClassNames:R}=Object(c.a)(g,"slow"),{width:F,height:P}=Object(l.i)(j),U=Object(s.a)("File",v,j&&"smaller",M&&!y&&"interactive",T&&"file-is-selected");return a.a.createElement("div",{ref:L,className:U},N&&a.a.createElement("div",{className:"message-select-control"},T&&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"},D&&a.a.createElement("img",{src:O,width:F,height:P,className:"thumbnail",alt:""}),_&&a.a.createElement("img",{src:g,className:"full-media "+R,width:F,height:P,alt:""})):a.a.createElement("div",{className:"file-icon "+k},b.length<=4&&a.a.createElement("span",{className:"file-ext",dir:"auto"},b)),I&&a.a.createElement("div",{className:Object(s.a)("file-progress",k,A)},a.a.createElement(m.a,{progress:C,size:j?"s":"m",onClick:y?M:void 0})),M&&a.a.createElement("i",{className:Object(s.a)("icon-download",I&&"hidden")})),a.a.createElement("div",{className:"file-info"},a.a.createElement("div",{className:"file-title",dir:"auto"},Object(u.a)(t)),a.a.createElement("div",{className:"file-subtitle",dir:"auto"},a.a.createElement("span",null,E&&C?Math.round(100*C)+"%":x),p&&a.a.createElement("span",{className:"file-sender"},Object(u.a)(p)),!p&&f&&a.a.createElement(a.a.Fragment,null," ",a.a.createElement(h.a,{onClick:w},Object(i.d)(S,1e3*f))))),p&&f&&a.a.createElement(h.a,{onClick:w},Object(i.g)(S,1e3*f)))})},function(e,t,n){"use strict";var a=n(0),r=n(1),c=n(32),s=n(8),i=n(44),o=n(117);n(222);t.a=Object(a.h)(({message:e,duration:t=3e3,containerId:n,onDismiss:l})=>{const[u,d]=Object(a.r)(!0),m=Object(a.q)(null),{transitionClassNames:h}=Object(c.a)(u),b=Object(a.m)(()=>{d(!1),setTimeout(l,150+r.c)},[l]);Object(a.n)(()=>u?Object(i.a)(b):void 0,[u,b]),Object(a.n)(()=>(m.current=window.setTimeout(b,t),()=>{m.current&&(clearTimeout(m.current),m.current=void 0)}),[t,b]);const f=Object(a.m)(()=>{m.current&&(clearTimeout(m.current),m.current=void 0)},[]),p=Object(a.m)(()=>{m.current=window.setTimeout(b,t)},[t,b]);return a.a.createElement(o.a,{className:"Notification-container",containerId:n},a.a.createElement("div",{className:Object(s.a)("Notification",h),onClick:b,onMouseEnter:f,onMouseLeave:p},a.a.createElement("div",{className:"content"},e)))})},function(e,t,n){"use strict";n.d(t,"a",(function(){return r}));var a=n(1);function r(e){const{commonAncestorContainer:t}=e;let n=t,r=1;for(;n&&n.id!==a.v&&r<5;)n=n.parentElement,r++;return Boolean(n&&n.id===a.v)}},function(e,t,n){"use strict";n.d(t,"a",(function(){return h}));var a=n(0),r=n(1),c=n(7),s=n(60),i=n(31),o=n(124);let l,u,d;const m=/[^-_:\p{L}\p{N}]+/iu;function h(e,t,h,b=r.v,f){const[p,O,g]=Object(i.a)(),[v,j]=Object(a.r)([]),[E,y]=Object(a.r)([]),N=Object(a.p)(()=>v.length&&h.length?h.map(e=>d.emojis[e]).filter(Boolean):[],[v,h]);Object(a.n)(()=>{const e=()=>{j(Object.keys(d.emojis))};d?e():async function(){l||(l=n.e(1).then(n.t.bind(null,311,3)),u=(await l).default,d=Object(s.b)(u));return l}().then(e)},[]),Object(a.n)(()=>{if(!e||!t||!v.length)return void g();const n=function(e){const t=document.createElement("div");t.innerHTML=e.replace("
","\n");const n=t.innerText,a=n[n.length-1],r=n.split(m).pop();if(!n.length||m.test(a)||!r||!r.startsWith(":"))return;return r.toLowerCase()}(t);if(!n)return y([]),void g();const a=n.substr(1),r=""===a?N:v.filter(e=>d.emojis[e].names.find(e=>e.includes(a))).slice(0,36).map(e=>d.emojis[e]);r.length?(O(),y(r)):g()},[v,t,e,O,N,g]);const T=Object(a.m)(e=>{const n=t.lastIndexOf(":");if(-1!==n){f(`${t.substr(0,n)}${e}`);const a=document.getElementById(b);c.g||requestAnimationFrame(()=>{Object(o.a)(a,!0)})}g()},[t,b,f,g]);return{isEmojiTooltipOpen:p,closeEmojiTooltip:g,filteredEmojis:E,insertEmoji:T}}},function(e,t,n){"use strict";var a=n(0),r=n(11),c=n(16);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(2),c=n(1),s=n(6),i=n(9),o=n(124),l=n(8),u=n(3),d=n(7),m=n(51),h=n(154),b=n(31),f=n(59),p=n(176),O=n(159);const g=d.g?256:416;t.a=Object(a.h)(Object(r.h)(e=>{const{chatId:t,threadId:n}=Object(s.y)(e)||{},{messageSendKeyCombo:a}=e.settings.byKey;return{currentChatId:t,messageSendKeyCombo:a,replyingToId:t&&n?Object(s.lb)(e,t,n):void 0,noTabCapture:e.isPollModalOpen||e.payment.isPaymentModalOpen}},(e,t)=>Object(u.l)(t,["editLastMessage"]))(({id:e,editableInputId:t,html:n,placeholder:r,shouldSetFocus:s,shouldSupressFocus:u,shouldSupressTextFormatter:v,onUpdate:j,onSupressedFocus:E,onSend:y,currentChatId:N,replyingToId:T,noTabCapture:C,messageSendKeyCombo:M,editLastMessage:w})=>{const S=Object(a.q)(null),L=Object(a.q)(null),I=Object(a.q)(!1),[A,k,x]=Object(b.a)(),[D,_]=Object(a.r)(),[R,F]=Object(a.r)();Object(a.n)(()=>{q(!1)},[]),Object(h.a)(([e])=>{n!==S.current.innerHTML&&(S.current.innerHTML=n),n!==L.current.innerHTML&&(L.current.innerHTML=n),void 0!==e&&e!==n&&q(!n.length)},[n]);const P=Object(a.m)(()=>{S.current.closest(".from, .to")?setTimeout(P,350):Object(o.a)(S.current)},[]),U=Object(a.m)(()=>{x(),function(){const e=window.getSelection();e&&(e.removeAllRanges?e.removeAllRanges():e.empty&&e.empty())}()},[x]);function B(){if(d.e)return;const e=window.getSelection();if(!e||!e.rangeCount||I.current)return void x();const t=e.getRangeAt(0),n=t.toString().trim();if(v||!Object(p.a)(t)||!n||Object(f.a)(n)||!t.START_TO_END)return void x();const a=t.getBoundingClientRect(),r=S.current.getBoundingClientRect();let c=a.left+a.width/2-r.left;c<90?c=90:c>r.width-90&&(c=r.width-90),_({x:c,y:a.top-r.top}),F(t),k()}function q(e=!1){const t=S.current,n=L.current,a=Number(t.style.height.replace("px","")),r=Math.min(n.scrollHeight,g);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>g)};e?requestAnimationFrame(s):s()}Object(a.n)(()=>{d.l||P()},[N,P,T,s]),Object(a.n)(()=>{if(C)return;const e=Object(i.a)(e=>{"Tab"===e.key&&(e.preventDefault(),requestAnimationFrame(P))},2e3,!0,!1);return Object(m.a)({onTab:e})},[P,C]),Object(a.n)(()=>{const e=S.current;function t(){e.blur()}return u&&e.addEventListener("focus",t),()=>{e.removeEventListener("focus",t)}},[u]);const H=Object(l.a)("form-control custom-scroll",n.length>0&&"touched",u&&"focus-disabled");return a.a.createElement("div",{id:e,onClick:u?E:void 0},a.a.createElement("div",{ref:S,id:t||c.v,className:H,dir:"auto",contentEditable:!0,onClick:P,onChange:function(e){const{innerHTML:t,textContent:n}=e.currentTarget;if(j("
"===t?"":t),!(d.l||n&&n.length)){const e=window.getSelection();e&&(S.current.blur(),e.removeAllRanges(),Object(o.a)(S.current,!0))}},onKeyDown:function(e){"Enter"!==e.key||e.shiftKey?"ArrowUp"!==e.key||n.length?e.target.addEventListener("keyup",(function t(){B(),e.target.removeEventListener("keyup",t)})):(e.preventDefault(),w()):d.e||d.b||!("enter"===M&&!e.shiftKey||"ctrl-enter"===M&&(e.ctrlKey||e.metaKey))||(e.preventDefault(),x(),y())},onMouseDown:function(e){2===e.button?!0!==I.current&&(I.current=!0,document.addEventListener("mousedown",(function e(){setTimeout(()=>{I.current=!1},100),window.removeEventListener("mouseup",e)})),document.addEventListener("keydown",(function e(t){"Esc"!==t.key&&"Escape"!==t.key||(setTimeout(()=>{I.current=!1},100),window.removeEventListener("keydown",e))}))):e.target.addEventListener("mouseup",(function t(){B(),e.target.removeEventListener("mouseup",t)}))},onContextMenu:function(e){d.b&&(e.preventDefault(),e.stopPropagation())},onTouchCancel:function(){d.b&&B()}}),a.a.createElement("div",{ref:L,className:Object(l.a)(H,"clone"),dir:"auto"}),a.a.createElement("span",{className:"placeholder-text",dir:"auto"},r),a.a.createElement(O.a,{isOpen:A,anchorPosition:D,selectedRange:R,onClose:U}))}))},function(e,t,n){"use strict";var a=n(0),r=n(4),c=n(8),s=n(36),i=n(22),o=n(33),l=n(99),u=n(160),d=n(24),m=n(53);n(243);t.a=Object(a.h)(({message:e,senderTitle:t,onMessageClick:n})=>{const h=Object(l.a)();let b=Object(r.Q)(e);if(!b){const t=Object(r.n)(e);if(t){const{url:n,domain:a}=t,c=Object(r.N)(h,e);b={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(!b)return;const{siteName:p,url:O,displayUrl:g,title:v,description:j,photo:E}=b,y=!t&&Object(s.a)(j,170),N=Object(c.a)("WebLink scroll-item",!E&&"without-photo");return a.a.createElement("div",{className:N,"data-initial":(p||g)[0]},E&&a.a.createElement(u.a,{message:e}),a.a.createElement("div",{className:"content"},a.a.createElement(d.a,{className:"site-title",onClick:f},Object(i.a)(v||p||g)),y&&a.a.createElement(d.a,{className:"site-description",onClick:f},Object(i.a)(y)),a.a.createElement(m.a,{url:O,className:"site-name",text:""},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(d.a,{className:"date",onClick:f},Object(o.g)(h,1e3*e.date))))})},,,,function(e,t,n){"use strict";var a=n(0),r=n(2),c=n(5),s=n(1),i=n(7),o=n(41),l=n(3),u=n(4),d=n(6),m=n(122);let h;!function(e){e[e.Move=0]="Move",e[e.Opacity=1]="Opacity",e[e.None=2]="None"}(h||(h={}));var b=n(107),f=n(15),p=n(99),O=n(62),g=n(22),v=n(9),j=n(8),E=n(139),y=n(165),N=n(31),T=n(102);n(197);var C=Object(a.h)(({isSelected:e,isActive:t})=>a.a.createElement("div",{className:Object(j.a)("ChatCallStatus",t&&"active",e&&"selected")},a.a.createElement("div",{className:"indicator"},a.a.createElement("div",null),a.a.createElement("div",null),a.a.createElement("div",null)))),M=n(106),w=n(128),S=n(151),L=n(166),I=n(152),A=n(100),k=n(46),x=n(169);n(204);var D=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(x.a,{isCustom:!0,className:"Badge-transition",isOpen:r},s)});n(205);var _,R=Object(a.h)(Object(r.h)((e,{chatId:t})=>{const n=Object(d.f)(e,t);if(!n||!n.lastMessage)return{};const{senderId:a,replyToMessageId:r,isOutgoing:s}=n.lastMessage,i=a?Object(d.Fb)(e,a):void 0,o=Object(u.t)(n.lastMessage),l=o&&r?Object(d.k)(e,n.id,r):void 0,{targetUserId:m,targetChatId:h}=o||{},b=Object(u.U)(n),{type:f}=Object(d.y)(e)||{};return{chat:n,isMuted:Object(u.Cb)(n,Object(d.db)(e),Object(d.cb)(e)),lastMessageSender:i,...s&&{lastMessageOutgoingStatus:Object(d.eb)(e,n.lastMessage)},...b&&{privateChatUser:Object(d.Fb)(e,b)},...m&&{actionTargetUser:Object(d.Fb)(e,m)},actionTargetChatId:h,actionTargetMessage:l,draft:Object(d.B)(e,t,c.MAIN_THREAD_ID),messageListType:f,animationLevel:e.settings.byKey.animationLevel,lastSyncTime:e.lastSyncTime}},(e,t)=>Object(l.l)(t,["openChat","focusLastMessage"]))(({style:e,chatId:t,folderId:n,orderDiff:r,animationType:c,isSelected:o,isPinned:l,chat:d,isMuted:m,privateChatUser:b,actionTargetUser:f,lastMessageSender:k,lastMessageOutgoingStatus:x,actionTargetMessage:_,actionTargetChatId:R,draft:F,messageListType:P,animationLevel:U,lastSyncTime:B,openChat:q,focusLastMessage:H})=>{const $=Object(a.q)(null),[Y,V,K]=Object(N.a)(),{lastMessage:z,typingStatus:W}=d||{},G=z&&Object(u.db)(z);Object(E.a)(t,G?z.replyToMessageId:void 0,_);const X=z&&!Object(u.M)(z)?Object(u.E)(z):void 0,Q=Object(T.a)(z?Object(u.D)(z,"micro"):void 0),J=Boolean(z&&Object(u.I)(z));Object(a.o)(()=>{if(0===U)return;const e=$.current;if(c===h.Opacity)e.style.opacity="0",Object(v.b)(()=>{e.classList.add("animate-opacity"),e.style.opacity="1"});else{if(c!==h.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+s.c)},[U,r,c]);const Z=Object(a.m)(()=>{q({id:t}),o&&"thread"===P&&H()},[o,P,q,t,H]),ee=Object(y.a)({chat:d,privateChatUser:b,handleDelete:V,folderId:n,isPinned:l}),te=Object(p.a)();if(!d)return;const ne=Object(j.a)("Chat chat-item-clickable",Object(u.lb)(t)?"private":"group",o&&!i.g&&"selected");return a.a.createElement(A.a,{ref:$,className:ne,style:e,ripple:!i.g,contextActions:ee,onClick:Z},a.a.createElement("div",{className:"status"},a.a.createElement(M.a,{chat:d,user:b,withOnlineStatus:!0,isSavedMessages:b&&b.isSelf,lastSyncTime:B}),d.isCallActive&&a.a.createElement(C,{isSelected:o,isActive:0!==U})),a.a.createElement("div",{className:"info"},a.a.createElement("div",{className:"title"},a.a.createElement("h3",null,Object(g.a)(Object(u.l)(te,d,b))),d.isVerified&&a.a.createElement(w.a,null),m&&a.a.createElement("i",{className:"icon-muted-chat"}),d.lastMessage&&a.a.createElement(L.a,{message:d.lastMessage,outgoingStatus:x})),a.a.createElement("div",{className:"subtitle"},function(){if(W&&z&&W.timestamp>1e3*z.date)return a.a.createElement(S.a,{typingStatus:W});if(F&&F.text.length)return a.a.createElement("p",{className:"last-message",dir:"auto"},a.a.createElement("span",{className:"draft"},te("Draft")),Object(g.a)(F.text));if(!z)return;if(G){const e=d&&(Object(u.jb)(d)||z.senderId===z.chatId)?d:k;return a.a.createElement("p",{className:"last-message",dir:"auto"},Object(g.a)(Object(O.a)(te,z,e,f,_,R,{asPlain:!0})))}const e=Object(u.J)(te,t,k);return a.a.createElement("p",{className:"last-message",dir:"auto"},e&&a.a.createElement("span",{className:"sender-name"},Object(g.a)(e)),function(e,t,n,r){if(!n)return Object(g.a)(Object(u.N)(e,t));return a.a.createElement("span",{className:"media-preview"},a.a.createElement("img",{src:n,alt:"",className:r?"round":void 0}),Object(u.P)(t)&&a.a.createElement("i",{className:"icon-play"}),Object(g.a)(Object(u.N)(e,t,!0)))}(te,z,Q||X,J))}(),a.a.createElement(D,{chat:d,isPinned:l,isMuted:m}))),a.a.createElement(I.a,{isOpen:Y,onClose:K,chat:d}))}));!function(e){e.all="active",e.archived="archived"}(_||(_={}));t.a=Object(a.h)(Object(r.h)((e,{folderType:t,folderId:n})=>{const{chats:{listIds:a,byId:r,orderedPinnedIds:s},users:{byId:i},lastSyncTime:o}=e,{chatId:l,threadId:u}=Object(d.y)(e)||{},m="folder"!==t?_[t]:void 0,h=n?Object(d.i)(e,n):void 0;return{chatsById:r,usersById:i,currentChatId:l,lastSyncTime:o,...m?{listIds:a[m],orderedPinnedIds:s[m]}:{chatFolder:h},isInDiscussionThread:u!==c.MAIN_THREAD_ID,notifySettings:Object(d.db)(e),notifyExceptions:Object(d.cb)(e)}},(e,t)=>Object(l.l)(t,["loadMoreChats","preloadTopChatMessages"]))(({folderType:e,folderId:t,noChatsText:n="Chat list is empty.",chatFolder:r,chatsById:c,usersById:d,listIds:p,currentChatId:O,orderedPinnedIds:g,lastSyncTime:v,isInDiscussionThread:j,notifySettings:E,notifyExceptions:y,loadMoreChats:N,preloadTopChatMessages:T})=>{const[C,M]=Object(a.p)(()=>"folder"===e&&r?Object(u.Bb)(c,d,r,E,y):[p,g],[e,r,c,d,E,y,p,g]),[w,S]=Object(a.p)(()=>{if(!C||"folder"===e&&!r)return[];const t=Object(u.Ab)(c,C,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]},[C,M,e,r,c]),L=Object(o.a)(w),I=w&&L?Object(l.i)(w,(e,t)=>e-(void 0!==L[t]?L[t]:1/0)):{},A=Object(a.m)(()=>{N({listType:"archived"===e?"archived":"active"})},[N,e]),[k,x]=Object(m.a)(v?A:void 0,S,void 0,s.k,"all"===e&&!s.a),D=k&&Object(u.Ab)(c,k,M,e);Object(a.n)(()=>{v&&"all"===e&&T()},[v,e,T]);const _=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?h.None:r===1/0||r===-1/0||t(a)&&c<=s||n(a)&&sa.a.createElement(R,{key:n,teactOrderKey:r,chatId:n,isPinned:!0,folderId:t,isSelected:n===O&&!j,animationType:_(n),orderDiff:I[n],style:`top: ${(e+r)*s.i}px;`})),D.otherChats.map((e,r)=>a.a.createElement(R,{key:e.id,teactOrderKey:Object(u.j)(e),chatId:e.id,folderId:t,isSelected:e.id===O&&!j,animationType:_(e.id),orderDiff:I[e.id],style:`top: ${(n+r)*s.i}px;`})))}():k&&!k.length?a.a.createElement("div",{className:"no-results"},n):a.a.createElement(f.a,{key:"loading"}))}))},function(e,t,n){"use strict";n.d(t,"a",(function(){return m}));var a=n(0),r=n(5),c=n(1),s=n(4),i=n(48);var o=n(7),l=n(124),u=n(31);const d=/[^@_\d\wа-яё]+/i;function m(e,t,n,m=c.v,h,b,f){const[p,O,g]=Object(u.a)(),[v,j]=Object(a.r)(""),[E,y]=Object(a.r)([]),N=Object(a.m)(e=>{if(h&&f)return h.filter(({userId:t})=>{const n=f[t];return!(t===b||!n)&&(!e||function(e,t){const n=t.username.toLowerCase(),a=Object(s.Z)(t),r=a&&a.toLowerCase(),c=e.toLowerCase();return n.startsWith(c)||r&&Object(i.a)(r,c)}(e,n))})},[h,b,f]);Object(a.n)(()=>{if(!e||!t.length)return void g();const n=function(e){const t=document.createElement("div");t.innerHTML=e;const n=t.innerText,a=n[n.length-1],r=n.split(d).pop();if(!n.length||d.test(a)||!r||!r.startsWith("@"))return;return r}(t);if(n){const e=n?n.substr(1):"",t=N(e);t&&t.length?(O(),j(e),y(t)):g()}else g()},[e,t,N,O,g]);const T=Object(a.m)((e,a=!1)=>{if(!e.username&&!Object(s.Y)(e))return;const c=e.username?"@"+e.username:`${Object(s.Y)(e)}`,i=t.lastIndexOf("@");if(-1!==i){n(`${t.substr(0,i)}${c} `);const e=document.getElementById(m);o.g||requestAnimationFrame(()=>{Object(l.a)(e,a)})}g()},[t,m,n,g]);return{isMentionTooltipOpen:p,mentionFilter:v,closeMentionTooltip:g,insertMention:T,mentionFilteredMembers:E}}},function(e,t,n){"use strict";n.d(t,"a",(function(){return l}));var a=n(0),r=n(158),c=n(108),s=n(13),i=n(35);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)(),u=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,u(),o.size>=1e3&&o.clear(),o.set(e,n)},n?l.current=window.setTimeout(()=>{a.src=e},n):a.src=e},[e,n,u,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.46635a34d22085eb936c.js.map \ No newline at end of file diff --git a/dist/0.46635a34d22085eb936c.js.map b/dist/0.46635a34d22085eb936c.js.map deleted file mode 100644 index 4eee4ea56..000000000 --- a/dist/0.46635a34d22085eb936c.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack:///./src/hooks/useLang.ts","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/hooks/useOnChange.ts","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/ui/Portal.ts","webpack:///./src/components/common/GroupChatInfo.tsx","webpack:///./src/util/fastSmoothScroll.ts","webpack:///./src/components/ui/Radio.tsx","webpack:///./src/components/ui/RadioGroup.tsx","webpack:///./src/hooks/useInfiniteScroll.ts","webpack:///./src/components/common/AnimatedEmoji.tsx","webpack:///./src/util/focusEditableElement.ts","webpack:///./src/hooks/useBackgroundMode.ts","webpack:///./src/util/captureEvents.ts","webpack:///./src/components/common/VerifiedIcon.tsx","webpack:///./src/util/cycleRestrict.ts","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/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/util/clipboard.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/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/components/common/Media.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/hooks/useChatContextActions.ts","webpack:///./src/components/common/LastMessageMeta.tsx","webpack:///./src/components/common/MessageOutgoingStatus.tsx","webpack:///./src/hooks/useContextMenuPosition.ts","webpack:///./src/components/ui/ShowTransition.tsx","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/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/ChatCallStatus.tsx","webpack:///./src/components/left/main/Badge.tsx","webpack:///./src/components/left/main/Chat.tsx","webpack:///./src/components/left/main/ChatList.tsx","webpack:///./src/components/middle/composer/hooks/useMentionTooltip.ts","webpack:///./src/components/middle/composer/helpers/searchUserName.ts","webpack:///./src/hooks/useBlur.ts","webpack:///./src/hooks/useBlurSync.ts"],"names":["forceUpdate","useForceUpdate","useOnChange","langProvider","ListItem","props","ref","icon","className","style","children","disabled","ripple","narrow","inactive","focus","destructive","multiline","isStatic","contextActions","onClick","containerRef","useRef","isContextMenuOpen","contextMenuPosition","handleBeforeContextMenu","handleContextMenu","handleContextMenuClose","handleContextMenuHide","useContextMenuHandlers","getTriggerElement","useCallback","current","getRootElement","closest","getMenuElement","querySelector","positionX","positionY","menuStyle","useContextMenuPosition","handleClick","e","handleMouseDown","IS_TOUCH_ENV","button","fullClassName","buildClassName","role","tabIndex","undefined","onMouseDown","onContextMenu","isOpen","autoClose","onClose","onCloseAnimationEnd","map","action","key","title","handler","useIntersectionObserver","rootRef","throttleMs","debounceMs","shouldSkipFirst","margin","threshold","isDisabled","rootCallback","controllerRef","rootCallbackRef","isFrozenRef","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","startedAt","Date","now","then","spentTime","setTimeout","memo","withGlobal","global","userId","forceShowSelf","lastSyncTime","user","selectUser","isSavedMessages","isSelf","areMessagesLoaded","Boolean","selectChatMessages","setGlobal","actions","pick","typingStatus","avatarSize","status","withMediaViewer","withUsername","withFullInfo","withUpdatingStatus","noStatusOrTyping","loadFullUser","openMediaViewer","id","fullName","getUserFullName","handleAvatarViewerOpen","hasPhoto","stopPropagation","avatarOwnerId","origin","MediaViewerOrigin","ProfileAvatar","MiddleHeaderAvatar","lang","useLang","size","dir","renderText","isVerified","isUserOnline","username","getUserStatus","Modal","header","hasCloseButton","noBackdrop","onEnter","shouldRender","transitionClassNames","useShowTransition","modalRef","captureKeyboardListeners","onEsc","element","handleKeyDown","preventDefault","focusableElements","querySelectorAll","length","currentFocusedIndex","findIndex","em","isSameNode","document","activeElement","newFocusedIndex","shiftKey","addEventListener","removeEventListener","trapFocus","useEffectWithPrevDeps","prevIsOpen","body","classList","toggle","dispatchHeavyAnimationEvent","remove","Portal","Button","round","color","ariaLabel","ANIMATION_DURATION","slide","fade","IS_MOBILE_SCREEN","reveal","CLEANED_UP","Symbol","animationLevel","settings","byKey","activeKey","name","direction","renderCount","shouldRestoreHeight","shouldCleanup","onStart","onStop","rendersRef","prevActiveKey","usePrevious","activateTimeoutRef","activeKeyChanged","useLayoutEffect","cleanup","container","childElements","add","childNodes","clearTimeout","isBackwards","keys","Object","Number","prevActiveIndex","indexOf","activeIndex","node","i","HTMLElement","width","offsetWidth","scrollBy","left","behavior","ANIMATION_END_DELAY","requestAnimationFrame","window","scrollLeft","height","clientHeight","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","items","itemSelector","preloadBackwards","sensitiveArea","noScrollRestore","noScrollRestoreOnTop","noFastList","stateRef","loadMoreBackwards","loadMoreForwards","useMemo","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","cb","dependencies","prevDeps","some","d","SPEED","fast","slow","speed","noAnimate","isMediaLoaded","willAnimate","shouldRenderThumb","setShouldRenderThumb","MEDIA_VIEWER_MEDIA_QUERY","REM","parseInt","getComputedStyle","documentElement","fontSize","ROUND_VIDEO_DIMENSIONS","AVATAR_FULL_DIMENSIONS","DEFAULT_MEDIA_DIMENSIONS","cachedMaxWidth","getAvailableWidth","fromOwnMessage","isForwarded","isWebPagePhoto","extraPaddingRem","regularMaxWidth","Math","min","floor","innerWidth","getMaxMessageWidthRem","calculateDimensionsForMessageMedia","isGif","aspectRatio","calculateDimensions","getAvailableHeight","getMediaViewerAvailableDimensions","withFooter","isVideo","mql","matchMedia","windowWidth","windowHeight","windowSize","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","fastRaf","destroy","playAnimation","shouldRestart","goToAndPlay","pauseAnimation","pause","freezeAnimation","isPlaying","unfreezeAnimation","unfreezeAnimationOnRaf","useBackgroundMode","textParts","confirmLabel","confirmHandler","confirmIsDestructive","isButtonsInOneRow","split","textPart","isText","description","useAsyncRendering","shouldRenderRef","timeoutRef","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","containerId","elementRef","createElement","appendChild","TeactDOM","removeChild","chatId","selectChat","onlineCount","selectChatOnlineCount","withChatType","loadFullChat","isSuperGroup","isChatSuperGroup","isMin","isRestricted","getChatTypeString","handle","groupStatus","chatTypeString","membersCount","getGroupStatus","onlineStatus","renderStatusOrTyping","isAnimating","fastSmoothScroll","position","maxDistance","forceDirection","forceDuration","forceCurrentContainerHeight","FocusDirection","Static","scrollIntoView","block","offset","Up","Down","elementTop","elementHeight","containerHeight","targetContainerHeight","dataset","normalHeight","path","remainingPath","duration","abs","startAt","animateSingle","t","currentPath","transition","scrollWithJs","isAnimatingScroll","label","subLabel","value","checked","hidden","isLoading","onChange","type","Spinner","options","selected","loadingOption","handleChange","event","currentTarget","option","getViewportSlice","sourceIds","offsetId","listSlice","index","indexForDirection","to","newViewportIds","slice","areSomeLocal","areAllLocal","listIds","forceFullPreload","lastParamsRef","viewportIdsRef","prevListIds","prevIsDisabled","areSortedArraysEqual","viewportIds","getMore","AnimatedEmoji","isInline","observeIntersection","isAnimationLoaded","markAnimationLoaded","useFlag","localMediaHash","previewBlobUrl","Lottie","playKey","setPlayKey","String","random","STICKER_SIZE_TWO_FA","focusEditableElement","force","selection","getSelection","range","createRange","lastChild","nodeValue","setStart","removeAllRanges","addRange","onBlur","onFocus","hasFocus","SwipeDirection","captureEvents","captureEvent","currentSwipeAxis","hasMoved","onCapture","excludedClosestSelector","onMove","onRelease","pageX","touches","pageY","withCursor","dragOffsetX","dragOffsetY","onDrag","onSwipe","xAbs","yAbs","Left","Right","processSwipe","passive","VerifiedIcon","cycleRestrict","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","href","startsWith","Email","Phone","textContent","TextUrl","Url","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","chatOrUserId","isMinimized","canClose","clickArg","iconElement","titleText","getUserFirstOrLastName","fastSmoothScrollHorizontal","IS_IOS","containerWidth","scrollWidth","animate","scrollTo","deltaX","deltaY","messageId","message","replyOriginForId","loadMessage","getDispatch","loadMessageThrottled","throttled","contextMenuCounter","isMenuDisabled","shouldDisableOnLink","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","filter","organizedIndex","shouldRenderAsHtml","renderMessagePart","result","deleteLineBreakAfterPre","organizedEntites","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","CLIPBOARD_ITEM_SUPPORTED","navigator","clipboard","ClipboardItem","textCopyEl","copyTextToClipboard","str","rangeToRestore","rangeCount","getRangeAt","select","execCommand","copyImageToClipboard","imageUrl","canvas","ctx","getContext","imageEl","Image","onload","img","drawImage","toBlob","copyBlobToClipboard","pngBlob","write","error","inputId","focused","placeholder","onReset","inputRef","isInputFocused","markInputFocused","unmarkInputFocused","blur","overflow","typingUser","typingUserName","isPrivateChat","isChatWithSelf","selectIsChatWithSelf","canDeleteForAll","contactName","getPrivateChatUserId","isChannel","isChatChannel","isBasicGroup","isChatBasicGroup","leaveChannel","deleteHistory","deleteChannel","chatTitle","handleDeleteMessageForAll","maxId","lastMessage","shouldDeleteForAll","handleDeleteChat","isCreator","patchSafariProgressiveAudio","audioEl","patchedForSafari","patchForSafariInProgress","paused","once","uploadProgress","withDate","datetime","sender","isSelected","isSelectable","onCancelUpload","onDateClick","extension","getDocumentExtension","fileName","timestamp","isDownloadAllowed","setIsDownloadAllowed","useMediaWithDownloadProgress","getMessageMediaHash","isUploading","isTransferring","transferProgress","getMediaTransferState","hasPreview","getDocumentHasPreview","thumbDataUri","getMessageMediaThumbDataUri","localBlobUrl","previewData","isAllowed","handleDateClick","download","thumbnailDataUri","StickerSetModal","useModuleLoader","Bundles","Extra","useCanvasBlur","withRaf","canvasRef","processBlur","alpha","IS_CANVAS_FILTER_SUPPORTED","RADIUS","fastBlur","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","fKey","monospace","strikethrough","handleBoldText","bold","handleItalicText","italic","handleUnderlineText","underline","handleStrikethroughText","replaceWith","handleMonospaceText","handleLinkUrlConfirm","formattedLinkUrl","restoreSelection","KeyK","KeyB","KeyU","KeyI","KeyM","KeyS","code","altKey","ctrlKey","metaKey","linkUrlConfirmClassName","onKeyDown","autoComplete","inputMode","idPrefix","mediaBlobUrl","getMessageVideo","formatMediaDuration","MIN_SPIKES","MAX_SPIKES","renderSeekline","playProgress","handleStartSeek","handleSeek","handleStopSeek","onMouseMove","onMouseUp","theme","senderTitle","renderingFor","date","onPlay","onReadMedia","audio","voice","isMediaUnread","isVoice","isSeeking","isActivated","setIsActivated","shouldDownload","getMessageMediaFormat","useBuffering","playPause","setCurrentTime","useAudioPlayer","getMessageKey","getMediaDuration","isMessageLocal","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","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","getReadableErrorText","isSlowMode","textParams","extraPartIndex","errorMessage","reduce","acc","privateChatUser","handleDelete","folderId","isPinned","toggleChatPinned","updateChatMutedState","toggleChatArchived","toggleChatUnread","actionUnreadMark","unreadCount","hasUnreadMark","actionPin","actionMute","isMuted","actionArchive","isChatArchived","getCanDeleteChat","outgoingStatus","Keys","extraPaddingX","extraTopPadding","setPositionX","setPositionY","setStyle","triggerEl","emptyRect","menuEl","rootEl","triggerRect","menuRect","rootRect","ShowTransition","isCustom","prevChildren","fromChildrenRef","usePrevDuringAnimation","isCurrentPresent","isPrevPresent","trackId","originalDuration","handlers","onInit","shouldPlay","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","onDismiss","setIsOpen","timerRef","closeAndDismiss","handleMouseEnter","handleMouseLeave","onMouseEnter","onMouseLeave","isSelectionInsideInput","selectionRange","parentNode","emojiDataPromise","emojiRawData","emojiData","RE_NOT_EMOJI_SEARCH","useEmojiTooltip","recentEmojiIds","onUpdateHtml","markIsOpen","unmarkIsOpen","emojiIds","setEmojiIds","filteredEmojis","setFilteredEmojis","recentEmojis","emojiId","emojis","uncompressEmoji","ensureEmojiData","tempEl","lastSymbol","lastWord","pop","test","toLowerCase","getEmojiCode","matched","names","find","insertEmoji","textEmoji","atIndex","lastIndexOf","messageInput","getElementById","isEmojiTooltipOpen","closeEmojiTooltip","EmojiTooltip","MAX_INPUT_HEIGHT","currentChatId","threadId","selectCurrentMessageList","messageSendKeyCombo","replyingToId","selectReplyingToId","noTabCapture","isPollModalOpen","payment","isPaymentModalOpen","editableInputId","shouldSetFocus","shouldSupressFocus","shouldSupressTextFormatter","onUpdate","onSupressedFocus","onSend","editLastMessage","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","supressFocus","contentEditable","handleKeyUp","IS_ANDROID","closeContextMenuMouseListener","closeContextMenuKeyListener","handleMouseUp","onTouchCancel","onMessageClick","linkData","getMessageWebPage","getFirstLinkInMessage","domain","messageText","getMessageSummaryText","siteName","handleMessageClick","displayUrl","truncatedDescription","trimText","data-initial","ChatAnimationTypes","isActive","isShown","renderContent","unreadMentionsCount","formatIntegerCompact","FolderTypeToListType","replyToMessageId","isOutgoing","lastMessageSender","lastMessageAction","getMessageAction","actionTargetMessage","selectChatMessage","targetUserId","actionTargetUserId","targetChatId","actionTargetChatId","privateChatUserId","messageListType","selectIsChatMuted","selectNotifySettings","selectNotifyExceptions","lastMessageOutgoingStatus","selectOutgoingStatus","actionTargetUser","draft","selectDraft","MAIN_THREAD_ID","orderDiff","animationType","openChat","focusLastMessage","isDeleteModalOpen","openDeleteModal","closeDeleteModal","isAction","isActionMessage","useEnsureMessage","mediaThumbnail","getMessageSticker","isRoundVideo","getMessageRoundVideo","Opacity","opacity","Move","useChatContextActions","Avatar","isCallActive","LastMessageMeta","TypingStatus","actionOrigin","renderActionMessageText","asPlain","senderName","getMessageSenderName","blobUrl","renderMessageSummary","renderLastMessageOrTyping","DeleteChatModal","folderType","chats","byId","chatsById","orderedPinnedIds","users","usersById","currentThreadId","listType","chatFolder","selectChatFolder","isInDiscussionThread","notifySettings","notifyExceptions","noChatsText","loadMoreChats","preloadTopChatMessages","currentListIds","currentPinnedIds","prepareFolderListIds","orderById","orderedIds","newChatArrays","prepareChatList","singleList","pinnedChats","otherChats","newOrderedIds","prevOrderById","orderDiffById","mapValues","order","Infinity","loadMoreOfType","useInfiniteScroll","CHAT_LIST_SLICE","ALL_CHATS_PRELOAD_DISABLED","chatArrays","getAnimationType","movesUp","movesDown","orderDiffIds","numberOfUp","numberOfDown","None","useChatAnimationType","viewportOffset","pinnedOffset","CHAT_HEIGHT_PX","teactOrderKey","getChatOrder","renderChats","Loading","RE_NOT_USERNAME_SEARCH","useMentionTooltip","canSuggestMembers","groupChatMembers","currentUserId","currentFilter","setCurrentFilter","filteredMembers","setFilteredMembers","getFilteredMembers","usernameLowered","fullNameLowered","filterLowered","searchWords","searchUserName","usernameFilter","getUsernameFilter","membersToMention","insertMention","forceFocus","insertedHtml","isMentionTooltipOpen","mentionFilter","closeMentionTooltip","mentionFilteredMembers","cache","useBlurSync","blurredRef","isChanged","imgToCanvas","blurredAsync","blurredDataUri","useBlur"],"mappings":"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AAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,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,GAA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","file":"0.46635a34d22085eb936c.js","sourcesContent":["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 { RefObject } from 'react';\nimport React, { FC, useRef, useCallback } from '../../lib/teact/teact';\n\nimport { IS_TOUCH_ENV } from '../../util/environment';\nimport buildClassName from '../../util/buildClassName';\nimport useContextMenuHandlers from '../../hooks/useContextMenuHandlers';\nimport useContextMenuPosition from '../../hooks/useContextMenuPosition';\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 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 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\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 }, [disabled, onClick]);\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 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 isFrozenRef = useRef();\n const onUnfreezeRef = useRef();\n\n rootCallbackRef.current = rootCallback;\n\n const freeze = useCallback(() => {\n isFrozenRef.current = true;\n }, []);\n\n const unfreeze = useCallback(() => {\n isFrozenRef.current = false;\n\n if (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 (isFrozenRef.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};\n\ntype StateProps = {\n user?: ApiUser;\n isSavedMessages?: boolean;\n areMessagesLoaded: boolean;\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 user,\n isSavedMessages,\n areMessagesLoaded,\n lastSyncTime,\n loadFullUser,\n openMediaViewer,\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)}\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 } = 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,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['loadFullUser', 'openMediaViewer']),\n)(PrivateChatInfo));\n","import React, { FC, useEffect, useRef } from '../../lib/teact/teact';\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';\n\nimport Button from './Button';\nimport Portal from './Portal';\n\nimport './Modal.scss';\n\nconst ANIMATION_DURATION = 200;\n\ntype OwnProps = {\n title?: string;\n className?: string;\n isOpen?: boolean;\n header?: FC;\n hasCloseButton?: boolean;\n noBackdrop?: boolean;\n children: any;\n onClose: () => void;\n onCloseAnimationEnd?: () => void;\n onEnter?: () => void;\n};\n\nconst Modal: FC = (props) => {\n const {\n title,\n className,\n isOpen,\n header,\n hasCloseButton,\n noBackdrop,\n children,\n onClose,\n onCloseAnimationEnd,\n onEnter,\n } = props;\n const { shouldRender, transitionClassNames } = useShowTransition(isOpen, onCloseAnimationEnd);\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 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 { withGlobal } from '../../lib/teact/teactn';\n\nimport { ANIMATION_END_DELAY } from '../../config';\nimport { IS_MOBILE_SCREEN } from '../../util/environment';\nimport useForceUpdate from '../../hooks/useForceUpdate';\nimport usePrevious from '../../hooks/usePrevious';\nimport buildClassName from '../../util/buildClassName';\nimport { dispatchHeavyAnimationEvent } from '../../hooks/useHeavyAnimationCheck';\n\nimport './Transition.scss';\n\ntype ChildrenFn = (isActive: boolean, isFrom: boolean) => any;\ntype OwnProps = {\n ref?: RefObject;\n activeKey: number;\n name: (\n 'none' | 'slide' | 'mv-slide' | 'slide-fade' | 'zoom-fade' | 'scroll-slide' | 'fade' | 'slide-layers'\n | 'push-slide' | 'reveal'\n );\n direction?: 'auto' | 'inverse' | 1 | -1;\n renderCount?: number;\n shouldRestoreHeight?: boolean;\n shouldCleanup?: boolean;\n id?: string;\n className?: string;\n onStart?: () => void;\n onStop?: () => void;\n children: ChildrenFn;\n};\n\ntype StateProps = {\n animationLevel: number;\n};\n\nconst ANIMATION_DURATION = {\n slide: 450,\n 'mv-slide': 400,\n 'slide-fade': 400,\n 'zoom-fade': 150,\n 'scroll-slide': 500,\n fade: 150,\n 'slide-layers': IS_MOBILE_SCREEN ? 450 : 300,\n 'push-slide': 300,\n reveal: 350,\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 id,\n className,\n onStart,\n onStop,\n children,\n animationLevel,\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 activateTimeoutRef = useRef();\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) {\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 if (activateTimeoutRef.current) {\n clearTimeout(activateTimeoutRef.current);\n activateTimeoutRef.current = undefined;\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 if (name === 'scroll-slide') {\n const width = container.offsetWidth;\n container.scrollBy({\n left: activeIndex > prevActiveIndex ? width : -width,\n behavior: 'smooth',\n });\n }\n\n if (animationLevel > 0) {\n dispatchHeavyAnimationEvent(ANIMATION_DURATION[name] + ANIMATION_END_DELAY);\n }\n\n requestAnimationFrame(() => {\n container.classList.add('animating');\n\n activateTimeoutRef.current = window.setTimeout(() => {\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 (name === 'scroll-slide') {\n container.scrollLeft = activeKey * container.offsetWidth;\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 cleanup();\n\n if (onStop) {\n onStop();\n }\n });\n }, ANIMATION_DURATION[name] + ANIMATION_END_DELAY);\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 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' ?
{render(key === activeKey, key === prevActiveKey)}
: undefined\n );\n });\n\n const fullClassName = buildClassName(\n 'Transition',\n className,\n animationLevel === 0 && name === 'scroll-slide' ? 'slide' : name,\n );\n\n return (\n
\n {contents}\n
\n );\n};\n\nexport default withGlobal((global) => {\n const { animationLevel } = global.settings.byKey;\n return { animationLevel };\n})(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 }) => void;\n onScroll?: (e: UIEvent) => 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 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(() => onLoadMore({ direction: LoadMoreDirection.Backwards }), 1000, true, false),\n debounce(() => onLoadMore({ direction: LoadMoreDirection.Forwards }), 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();\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 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","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 { ApiPhoto, ApiVideo, ApiSticker } from '../../../api/types';\nimport { getPhotoInlineDimensions, getVideoDimensions, IDimensions } from '../../../modules/helpers';\nimport windowSize from '../../../util/windowSize';\nimport { IS_MOBILE_SCREEN } from '../../../util/environment';\nimport { STICKER_SIZE_INLINE_DESKTOP_FACTOR, STICKER_SIZE_INLINE_MOBILE_FACTOR } from '../../../config';\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 };\n\nconst DEFAULT_MEDIA_DIMENSIONS: IDimensions = { width: 100, height: 100 };\nconst LIKE_STICKER_ID = '1258816259753933';\nconst MOBILE_SCREEN_MAX_MESSAGE_SCREEN_WIDTH = 0.69;\n\nlet cachedMaxWidth: number | undefined;\n\nfunction getMaxMessageWidthRem(fromOwnMessage: boolean) {\n const regularMaxWidth = fromOwnMessage ? 30 : 29;\n if (!IS_MOBILE_SCREEN) {\n return regularMaxWidth;\n }\n\n // @optimization Limitation: changing device screen width not supported\n if (!cachedMaxWidth) {\n cachedMaxWidth = Math.min(\n regularMaxWidth,\n Math.floor(window.innerWidth * MOBILE_SCREEN_MAX_MESSAGE_SCREEN_WIDTH) / REM,\n );\n }\n\n return cachedMaxWidth;\n}\n\nfunction getAvailableWidth(\n fromOwnMessage: boolean,\n isForwarded?: boolean,\n isWebPagePhoto?: boolean,\n) {\n const extraPaddingRem = isForwarded || isWebPagePhoto ? 1.625 : 0;\n const availableWidthRem = getMaxMessageWidthRem(fromOwnMessage) - 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}: {\n width: number;\n height: number;\n fromOwnMessage: boolean;\n isForwarded?: boolean;\n isWebPagePhoto?: boolean;\n isGif?: boolean;\n}): IDimensions {\n const aspectRatio = height / width;\n const availableWidth = getAvailableWidth(fromOwnMessage, isForwarded, isWebPagePhoto);\n const availableHeight = getAvailableHeight(isGif, aspectRatio);\n\n return calculateDimensions(availableWidth, availableHeight, width, height);\n}\n\nexport function getMediaViewerAvailableDimensions(withFooter: boolean, isVideo: boolean): IDimensions {\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) {\n const { width, height } = getPhotoInlineDimensions(photo) || DEFAULT_MEDIA_DIMENSIONS;\n\n return calculateDimensionsForMessageMedia({\n width,\n height,\n fromOwnMessage,\n isForwarded,\n isWebPagePhoto,\n });\n}\n\nexport function calculateVideoDimensions(\n video: ApiVideo,\n fromOwnMessage: boolean,\n isForwarded?: 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 });\n}\n\nexport function getPictogramDimensions(): IDimensions {\n return {\n width: 2 * REM,\n height: 2 * REM,\n };\n}\n\nexport function getDocumentThumbnailDimensions(smaller?: boolean): IDimensions {\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): IDimensions {\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 = (IS_MOBILE_SCREEN ? STICKER_SIZE_INLINE_MOBILE_FACTOR : STICKER_SIZE_INLINE_DESKTOP_FACTOR) * REM;\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 }: IDimensions, withFooter: boolean, isVideo: boolean = false,\n): IDimensions {\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): IDimensions {\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 { 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 { 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};\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 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 { FocusDirection } from '../types';\n\nimport { dispatchHeavyAnimationEvent } from '../hooks/useHeavyAnimationCheck';\nimport { fastRaf } from './schedulers';\nimport { animateSingle } from './animation';\n\nconst MAX_DISTANCE = 1500;\nconst MIN_JS_DURATION = 250;\nconst MAX_JS_DURATION = 600;\n\nlet isAnimating = false;\n\nexport default function fastSmoothScroll(\n container: HTMLElement,\n element: HTMLElement,\n position: ScrollLogicalPosition,\n margin = 0,\n maxDistance = MAX_DISTANCE,\n forceDirection?: FocusDirection,\n forceDuration?: number,\n forceCurrentContainerHeight?: boolean,\n) {\n if (forceDirection === FocusDirection.Static) {\n element.scrollIntoView({ block: position });\n\n return;\n }\n\n const { offsetTop } = element;\n\n if (forceDirection === undefined) {\n const offset = offsetTop - container.scrollTop;\n\n if (offset < -maxDistance) {\n container.scrollTop += (offset + maxDistance);\n } else if (offset > maxDistance) {\n container.scrollTop += (offset - maxDistance);\n }\n } else if (forceDirection === FocusDirection.Up) {\n container.scrollTop = offsetTop + maxDistance;\n } else if (forceDirection === FocusDirection.Down) {\n container.scrollTop = Math.max(0, offsetTop - maxDistance);\n }\n\n isAnimating = true;\n fastRaf(() => {\n scrollWithJs(container, element, position, margin, forceDuration, forceCurrentContainerHeight);\n });\n}\n\nexport function isAnimatingScroll() {\n return isAnimating;\n}\n\nfunction scrollWithJs(\n container: HTMLElement,\n element: HTMLElement,\n position: ScrollLogicalPosition,\n margin = 0,\n forceDuration?: number,\n forceCurrentContainerHeight?: boolean,\n) {\n const { offsetTop: elementTop, offsetHeight: elementHeight } = element;\n const { scrollTop, offsetHeight: containerHeight, scrollHeight } = container;\n const targetContainerHeight = !forceCurrentContainerHeight && container.dataset.normalHeight\n ? Number(container.dataset.normalHeight)\n : containerHeight;\n\n let path!: number;\n\n switch (position) {\n case 'start':\n path = (elementTop - margin) - scrollTop;\n break;\n case 'end':\n path = (elementTop + elementHeight + margin) - (scrollTop + targetContainerHeight);\n break;\n // 'nearest' is not supported yet\n case 'nearest':\n case 'center':\n path = elementHeight < targetContainerHeight\n ? (elementTop + elementHeight / 2) - (scrollTop + targetContainerHeight / 2)\n : (elementTop - margin) - scrollTop;\n break;\n }\n\n if (path < 0) {\n const remainingPath = -scrollTop;\n path = Math.max(path, remainingPath);\n } else if (path > 0) {\n const remainingPath = scrollHeight - (scrollTop + targetContainerHeight);\n path = Math.min(path, remainingPath);\n }\n\n const target = container.scrollTop + path;\n const duration = forceDuration || (\n MIN_JS_DURATION + (Math.abs(path) / MAX_DISTANCE) * (MAX_JS_DURATION - MIN_JS_DURATION)\n );\n const startAt = Date.now();\n\n dispatchHeavyAnimationEvent(duration);\n animateSingle(() => {\n const t = Math.min((Date.now() - startAt) / duration, 1);\n\n const currentPath = path * (1 - transition(t));\n container.scrollTop = Math.round(target - currentPath);\n\n isAnimating = t < 1;\n\n return isAnimating;\n });\n}\n\nfunction transition(t: number) {\n return 1 - ((1 - t) ** 3.5);\n}\n","import { ChangeEvent } from 'react';\nimport React, { FC, memo } from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\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 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';\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 { 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(({ direction }: { direction: LoadMoreDirection }) => {\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 lastParamsRef.current = { ...lastParamsRef.current, direction, offsetId };\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","import React, {\n FC, useCallback, useRef, useState,\n} from '../../lib/teact/teact';\n\nimport { ApiMediaFormat, ApiSticker } from '../../api/types';\n\nimport { STICKER_SIZE_TWO_FA } from '../../config';\nimport { getStickerDimensions } 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 isInline?: boolean;\n lastSyncTime?: number;\n};\n\nconst QUALITY = 1;\nconst RESIZE_FACTOR = 0.5;\n\nconst AnimatedEmoji: FC = ({\n sticker, isInline = false, observeIntersection, lastSyncTime,\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 previewBlobUrl = useMedia(`${localMediaHash}?size=m`, !isIntersecting, ApiMediaFormat.BlobUrl, lastSyncTime);\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 let width: number;\n if (isInline) {\n width = getStickerDimensions(sticker).width * RESIZE_FACTOR;\n } else {\n width = STICKER_SIZE_TWO_FA;\n }\n\n const style = `width: ${width}px; height: ${width}px;`;\n\n return (\n \n {previewBlobUrl && !isAnimationLoaded && (\n \"\"\n )}\n {isMediaLoaded && (\n \n )}\n \n );\n};\n\nexport default AnimatedEmoji;\n","export default function focusEditableElement(element: HTMLElement, force?: boolean) {\n if (!force && element === document.activeElement) {\n return;\n }\n const selection = window.getSelection()!;\n const range = document.createRange();\n\n if (!element.lastChild || !element.lastChild.nodeValue) {\n element.focus();\n return;\n }\n\n range.setStart(element.lastChild, element.lastChild.nodeValue.length);\n selection.removeAllRanges();\n selection.addRange(range);\n}\n","import { useEffect } from '../lib/teact/teact';\n\nexport default (\n onBlur: AnyToVoidFunction,\n onFocus: AnyToVoidFunction,\n) => {\n useEffect(() => {\n if (!document.hasFocus()) {\n onBlur();\n }\n\n window.addEventListener('blur', onBlur);\n window.addEventListener('focus', onFocus);\n\n return () => {\n window.removeEventListener('focus', onFocus);\n window.removeEventListener('blur', onBlur);\n };\n }, [onBlur, onFocus]);\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) {\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","export default function cycleRestrict(length: number, index: number) {\n return index - Math.floor(index / length) * length;\n}\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 } else {\n parsedHtml = parsedHtml.replace(/([^<]*)<\\/span>/g, '$1');\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\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(/[*]{1}([^*\\n]+)[*]{1}/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.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 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 >\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 { fastRaf } from './schedulers';\nimport { animate } from './animation';\nimport { IS_IOS } from './environment';\n\nconst DURATION = 450;\n\nexport default function fastSmoothScrollHorizontal(container: HTMLElement, left: number) {\n // Native way seems to be smoother in Chrome\n if (!IS_IOS) {\n container.scrollTo({ left, behavior: 'smooth' });\n } else {\n fastRaf(() => {\n scrollWithJs(container, left);\n });\n }\n}\n\nfunction scrollWithJs(container: HTMLElement, left: 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 const target = container.scrollLeft + path;\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 { RefObject } from 'react';\nimport { useEffect } from '../lib/teact/teact';\n\nexport default (containerRef: RefObject, isDisabled?: boolean) => {\n useEffect(() => {\n const container = containerRef.current;\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 }, [containerRef, 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_MOBILE_SCREEN } 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_MOBILE_SCREEN\n && window.document.body.classList.contains('enable-symbol-menu-transforms');\n}\n\nexport default (\n elementRef: RefObject,\n isMenuDisabled?: boolean,\n shouldDisableOnLink?: 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) {\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 } = originalEvent.touches[0];\n\n if (contextMenuPosition) {\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, elementRef]);\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 = 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 nestedEntities.forEach((e) => e.organizedIndexes.forEach((i) => organizedIndexes.add(i)));\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 organizedEntites = 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 organizedEntites.forEach((entity, arrayIndex) => {\n const { renderResult, entityEndIndex } = renderEntity(\n index,\n text.length,\n entity,\n arrayIndex === organizedEntites.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 { 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 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 { RefObject } from 'react';\nimport React, {\n FC, useRef, useEffect, memo,\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 className?: string;\n inputId?: string;\n value?: string;\n focused?: boolean;\n isLoading?: boolean;\n placeholder?: string;\n disabled?: boolean;\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 value,\n inputId,\n className,\n focused,\n isLoading,\n placeholder,\n disabled,\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 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';\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 typingUserName = typingUser && !typingUser.isSelf && getUserFirstOrLastName(typingUser);\n\n return (\n

\n {typingUserName && (\n {renderText(typingUserName)}\n )}\n {typingStatus.action}\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 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};\n\ntype StateProps = {\n isChannel: boolean;\n isChatWithSelf?: boolean;\n isPrivateChat: boolean;\n isBasicGroup: boolean;\n isSuperGroup: boolean;\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 isBasicGroup,\n isSuperGroup,\n canDeleteForAll,\n contactName,\n onClose,\n leaveChannel,\n deleteHistory,\n deleteChannel,\n}) => {\n const lang = useLang();\n const chatTitle = getChatTitle(lang, chat);\n\n const handleDeleteMessageForAll = useCallback(() => {\n deleteHistory({ chatId: chat.id, maxId: chat.lastMessage!.id, shouldDeleteForAll: true });\n onClose();\n }, [deleteHistory, chat.id, chat.lastMessage, onClose]);\n\n const handleDeleteChat = useCallback(() => {\n if (isPrivateChat || isBasicGroup) {\n deleteHistory({ chatId: chat.id, maxId: chat.lastMessage!.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 chat.isCreator,\n chat.lastMessage,\n chat.id,\n onClose,\n deleteHistory,\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 {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 canDeleteForAll = (isPrivateChat && !isChatWithSelf);\n const contactName = chat && isChatPrivate(chat.id)\n ? getUserFirstOrLastName(selectUser(global, getPrivateChatUserId(chat)!))\n : undefined;\n\n return {\n isPrivateChat,\n isChatWithSelf,\n isChannel: isChatChannel(chat),\n isBasicGroup: isChatBasicGroup(chat),\n isSuperGroup: isChatSuperGroup(chat),\n canDeleteForAll,\n contactName,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['leaveChannel', 'deleteHistory', 'deleteChannel']),\n)(DeleteChatModal));\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) => {\n const prevDeps = usePrevious(dependencies);\n return useLayoutEffect(() => {\n // @ts-ignore (workaround for \"could be instantiated with a different subtype\" issue)\n cb(prevDeps || []);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, dependencies);\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 { getMediaTransferState, getMessageMediaHash, getMessageMediaThumbDataUri } 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 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 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\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 (isUploading) {\n if (onCancelUpload) {\n onCancelUpload();\n }\n } else {\n setIsDownloadAllowed((isAllowed) => !isAllowed);\n }\n }, [isUploading, onCancelUpload]);\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 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, memo, useCallback, useEffect, useMemo, useRef, useState,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport {\n ApiAudio, ApiMessage, ApiVoice,\n} from '../../api/types';\nimport { ISettings } from '../../types';\n\nimport { IS_MOBILE_SCREEN } from '../../util/environment';\nimport { formatMediaDateTime, formatMediaDuration, formatPastTimeShort } from '../../util/dateFormat';\nimport {\n getMediaDuration,\n getMediaTransferState,\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 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 message: ApiMessage;\n senderTitle?: string;\n uploadProgress?: number;\n renderingFor?: '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\ntype StateProps = {\n theme: ISettings['theme'];\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_MOBILE_SCREEN ? 20 : 25;\nconst MAX_SPIKES = IS_MOBILE_SCREEN ? 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 renderingFor,\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\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 isUploading, isTransferring, transferProgress,\n } = getMediaTransferState(message, uploadProgress || downloadProgress, isActivated && !isBuffered);\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 const lang = useLang();\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 && !renderingFor && 'own',\n renderingFor && 'bigger',\n isSelected && 'audio-is-selected',\n );\n\n const buttonClassNames = ['toggle-play'];\n if (shouldRenderSpinner) {\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 {renderingFor === 'searchResult' && renderSearchResult()}\n {renderingFor !== 'searchResult' && audio && renderAudio(\n lang, audio, isPlaying, playProgress, bufferedProgress, seekHandlers, date,\n onDateClick ? handleDateClick : undefined,\n )}\n {renderingFor !== '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?: () => void,\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' ? '#C69C85' : '#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(withGlobal((global) => ({ theme: global.settings.byKey.theme }))(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';\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 currentIndicator = tab.parentElement!.children[previousActiveTab].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 {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);\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};\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","import { useMemo } from '../lib/teact/teact';\nimport { getDispatch } from '../lib/teact/teactn';\nimport { ApiChat, ApiUser } from '../api/types';\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}: {\n chat: ApiChat | undefined;\n privateChatUser: ApiUser | undefined;\n handleDelete: () => void;\n folderId?: number;\n isPinned?: 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 = chat.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,\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\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 if (x + menuRect.width + extraPaddingX < rootRect.width + rootRect.left) {\n setPositionX('left');\n x += 3;\n } else if (x - menuRect.width > 0) {\n setPositionX('right');\n x -= 3;\n } else {\n setPositionX('left');\n x = 16;\n }\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 setStyle(`left: ${x - triggerRect.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 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","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 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 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
{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, {\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","import { EDITABLE_INPUT_ID } from '../../../../config';\n\nconst MAX_NESTING_PARENTS = 5;\n\nexport function isSelectionInsideInput(selectionRange: Range) {\n const { commonAncestorContainer } = selectionRange;\n let parentNode: HTMLElement | null = commonAncestorContainer as HTMLElement;\n let iterations = 1;\n while (parentNode && parentNode.id !== EDITABLE_INPUT_ID && iterations < MAX_NESTING_PARENTS) {\n parentNode = parentNode.parentElement;\n iterations++;\n }\n\n return Boolean(parentNode && parentNode.id === EDITABLE_INPUT_ID);\n}\n","import {\n useCallback, useEffect, useMemo, useState,\n} from '../../../../lib/teact/teact';\n\nimport { EDITABLE_INPUT_ID } from '../../../../config';\nimport { IS_MOBILE_SCREEN } from '../../../../util/environment';\nimport {\n EmojiData, EmojiModule, EmojiRawData, uncompressEmoji,\n} from '../../../../util/emoji';\nimport useFlag from '../../../../hooks/useFlag';\nimport focusEditableElement from '../../../../util/focusEditableElement';\n\nlet emojiDataPromise: Promise;\nlet emojiRawData: EmojiRawData;\nlet emojiData: EmojiData;\n\nconst RE_NOT_EMOJI_SEARCH = /[^-_:\\p{L}\\p{N}]+/iu;\nconst EMOJIS_LIMIT = 36;\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) {\n const [isOpen, markIsOpen, unmarkIsOpen] = useFlag();\n const [emojiIds, setEmojiIds] = useState([]);\n const [filteredEmojis, setFilteredEmojis] = useState([]);\n\n const recentEmojis = useMemo(\n () => {\n if (!emojiIds.length || !recentEmojiIds.length) {\n return [];\n }\n\n return recentEmojiIds\n .map((emojiId) => emojiData.emojis[emojiId])\n .filter(Boolean as any);\n },\n [emojiIds, recentEmojiIds],\n );\n\n // Initialize data on first render.\n useEffect(() => {\n const exec = () => {\n setEmojiIds(Object.keys(emojiData.emojis));\n };\n\n if (emojiData) {\n exec();\n } else {\n ensureEmojiData()\n .then(exec);\n }\n }, []);\n\n useEffect(() => {\n if (!isAllowed || !html || !emojiIds.length) {\n unmarkIsOpen();\n return;\n }\n\n const code = getEmojiCode(html);\n if (!code) {\n setFilteredEmojis([]);\n unmarkIsOpen();\n return;\n }\n\n const filter = code.substr(1);\n const matched = filter === ''\n ? recentEmojis\n : emojiIds\n .filter((emojiId) => emojiData.emojis[emojiId].names.find((name) => name.includes(filter)))\n .slice(0, EMOJIS_LIMIT)\n .map((emojiId) => emojiData.emojis[emojiId]);\n\n if (matched.length) {\n markIsOpen();\n setFilteredEmojis(matched);\n } else {\n unmarkIsOpen();\n }\n }, [emojiIds, html, isAllowed, markIsOpen, recentEmojis, unmarkIsOpen]);\n\n const insertEmoji = useCallback((textEmoji: string) => {\n const atIndex = html.lastIndexOf(':');\n if (atIndex !== -1) {\n onUpdateHtml(`${html.substr(0, atIndex)}${textEmoji}`);\n const messageInput = document.getElementById(inputId)!;\n if (!IS_MOBILE_SCREEN) {\n requestAnimationFrame(() => {\n focusEditableElement(messageInput, true);\n });\n }\n }\n\n unmarkIsOpen();\n }, [html, inputId, onUpdateHtml, unmarkIsOpen]);\n\n return {\n isEmojiTooltipOpen: isOpen,\n closeEmojiTooltip: unmarkIsOpen,\n filteredEmojis,\n insertEmoji,\n };\n}\n\nfunction getEmojiCode(html: string) {\n const tempEl = document.createElement('div');\n tempEl.innerHTML = html.replace('
', '\\n');\n const text = tempEl.innerText;\n\n const lastSymbol = text[text.length - 1];\n const lastWord = text.split(RE_NOT_EMOJI_SEARCH).pop();\n\n if (\n !text.length || RE_NOT_EMOJI_SEARCH.test(lastSymbol)\n || !lastWord || !lastWord.startsWith(':')\n ) {\n return undefined;\n }\n\n return lastWord.toLowerCase();\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_MOBILE_SCREEN, 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';\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 editableInputId?: string;\n html: string;\n placeholder: string;\n shouldSetFocus: boolean;\n shouldSupressFocus?: boolean;\n shouldSupressTextFormatter?: boolean;\n onUpdate: (html: string) => void;\n onSupressedFocus?: () => 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_MOBILE_SCREEN ? 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 editableInputId,\n html,\n placeholder,\n shouldSetFocus,\n shouldSupressFocus,\n shouldSupressTextFormatter,\n onUpdate,\n onSupressedFocus,\n onSend,\n currentChatId,\n replyingToId,\n noTabCapture,\n messageSendKeyCombo,\n editLastMessage,\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 isContextMenuOpenRef = useRef(false);\n const [isTextFormatterOpen, openTextFormatter, closeTextFormatter] = useFlag();\n const [textFormatterAnchorPosition, setTextFormatterAnchorPosition] = useState();\n const [selectedRange, setSelectedRange] = useState();\n\n useEffect(() => {\n updateInputHeight(false);\n }, []);\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 shouldSupressTextFormatter\n || !isSelectionInsideInput(selectionRange)\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.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) {\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 supressFocus() {\n input.blur();\n }\n\n if (shouldSupressFocus) {\n input.addEventListener('focus', supressFocus);\n }\n\n return () => {\n input.removeEventListener('focus', supressFocus);\n };\n }, [shouldSupressFocus]);\n\n const className = buildClassName(\n 'form-control custom-scroll',\n html.length > 0 && 'touched',\n shouldSupressFocus && 'focus-disabled',\n );\n\n return (\n
\n \n
\n {placeholder}\n \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']),\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 } = linkData;\n\n const truncatedDescription = !senderTitle && trimText(description, MAX_TEXT_LENGTH);\n\n const className = buildClassName(\n 'WebLink scroll-item',\n !photo && 'without-photo',\n );\n\n return (\n \n {photo && (\n \n )}\n
\n {renderText(title || siteName || displayUrl)}\n {truncatedDescription && (\n {renderText(truncatedDescription)}\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';\nimport buildClassName from '../../../util/buildClassName';\n\nimport './ChatCallStatus.scss';\n\ntype OwnProps = {\n isSelected?: boolean;\n isActive?: boolean;\n};\n\nconst ChatCallStatus: FC = ({\n isSelected,\n isActive,\n}) => {\n return (\n
\n
\n
\n
\n
\n
\n
\n );\n};\n\nexport default memo(ChatCallStatus);\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, useRef,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport useLang, { LangFn } from '../../../hooks/useLang';\n\nimport { GlobalActions, MessageListType } 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_MOBILE_SCREEN } 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 ChatCallStatus from './ChatCallStatus';\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 isSelected: boolean;\n isPinned?: boolean;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n isMuted?: boolean;\n privateChatUser?: ApiUser;\n actionTargetUser?: ApiUser;\n actionTargetMessage?: ApiMessage;\n actionTargetChatId?: number;\n lastMessageSender?: ApiUser;\n lastMessageOutgoingStatus?: ApiMessageOutgoingStatus;\n draft?: ApiFormattedText;\n messageListType?: MessageListType;\n animationLevel?: number;\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 isSelected,\n isPinned,\n chat,\n isMuted,\n privateChatUser,\n actionTargetUser,\n lastMessageSender,\n lastMessageOutgoingStatus,\n actionTargetMessage,\n actionTargetChatId,\n draft,\n messageListType,\n animationLevel,\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\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 // Sets animation excess values when `orderDiff` changes and then resets excess values to animate.\n useLayoutEffect(() => {\n if (animationLevel === 0) {\n return;\n }\n\n const element = ref.current!;\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 });\n\n if (isSelected && messageListType === 'thread') {\n focusLastMessage();\n }\n }, [\n isSelected,\n messageListType,\n openChat,\n chatId,\n focusLastMessage,\n ]);\n\n const contextActions = useChatContextActions({\n chat,\n privateChatUser,\n handleDelete: openDeleteModal,\n folderId,\n isPinned,\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 actionTargetUser,\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 {renderText(senderName)}\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 && !IS_MOBILE_SCREEN && 'selected',\n );\n\n return (\n \n
\n \n {chat.isCallActive && (\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 \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 { targetUserId: actionTargetUserId, targetChatId: actionTargetChatId } = lastMessageAction || {};\n const privateChatUserId = getPrivateChatUserId(chat);\n const { type: messageListType } = selectCurrentMessageList(global) || {};\n\n return {\n chat,\n isMuted: selectIsChatMuted(chat, selectNotifySettings(global), selectNotifyExceptions(global)),\n lastMessageSender,\n ...(isOutgoing && { lastMessageOutgoingStatus: selectOutgoingStatus(global, chat.lastMessage) }),\n ...(privateChatUserId && { privateChatUser: selectUser(global, privateChatUserId) }),\n ...(actionTargetUserId && { actionTargetUser: selectUser(global, actionTargetUserId) }),\n actionTargetChatId,\n actionTargetMessage,\n draft: selectDraft(global, chatId, MAIN_THREAD_ID),\n messageListType,\n animationLevel: global.settings.byKey.animationLevel,\n lastSyncTime: global.lastSyncTime,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'openChat',\n 'focusLastMessage',\n ]),\n)(Chat));\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, MAIN_THREAD_ID,\n} from '../../../api/types';\nimport { NotifyException, NotifySettings } from '../../../types';\n\nimport { ALL_CHATS_PRELOAD_DISABLED, CHAT_HEIGHT_PX, CHAT_LIST_SLICE } from '../../../config';\nimport { IS_ANDROID } from '../../../util/environment';\nimport usePrevious from '../../../hooks/usePrevious';\nimport { mapValues, pick } from '../../../util/iteratees';\nimport { getChatOrder, prepareChatList, prepareFolderListIds } from '../../../modules/helpers';\nimport {\n selectChatFolder, selectCurrentMessageList, 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';\n\ntype OwnProps = {\n folderType: 'all' | 'archived' | 'folder';\n folderId?: number;\n noChatsText?: string;\n};\n\ntype StateProps = {\n chatsById: Record;\n usersById: Record;\n chatFolder?: ApiChatFolder;\n listIds?: number[];\n currentChatId?: number;\n orderedPinnedIds?: number[];\n lastSyncTime?: number;\n isInDiscussionThread?: boolean;\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 noChatsText = 'Chat list is empty.',\n chatFolder,\n chatsById,\n usersById,\n listIds,\n currentChatId,\n orderedPinnedIds,\n lastSyncTime,\n isInDiscussionThread,\n notifySettings,\n notifyExceptions,\n loadMoreChats,\n preloadTopChatMessages,\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 = orderById && prevOrderById\n ? mapValues(orderById, (order, id) => {\n return order - (prevOrderById[id] !== undefined ? prevOrderById[id] : Infinity);\n })\n : {};\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 return (\n \n {viewportIds && viewportIds.length && chatArrays ? (\n renderChats()\n ) : viewportIds && !viewportIds.length ? (\n
{noChatsText}
\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 { chatId: currentChatId, threadId: currentThreadId } = selectCurrentMessageList(global) || {};\n\n const listType = folderType !== 'folder' ? FolderTypeToListType[folderType] : undefined;\n const chatFolder = folderId ? selectChatFolder(global, folderId) : undefined;\n\n return {\n chatsById,\n usersById,\n currentChatId,\n lastSyncTime,\n ...(listType ? {\n listIds: listIds[listType],\n orderedPinnedIds: orderedPinnedIds[listType],\n } : {\n chatFolder,\n }),\n isInDiscussionThread: currentThreadId !== MAIN_THREAD_ID,\n notifySettings: selectNotifySettings(global),\n notifyExceptions: selectNotifyExceptions(global),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['loadMoreChats', 'preloadTopChatMessages']),\n)(ChatList));\n","import { useCallback, useEffect, useState } 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 { IS_MOBILE_SCREEN } from '../../../../util/environment';\nimport focusEditableElement from '../../../../util/focusEditableElement';\nimport useFlag from '../../../../hooks/useFlag';\n\nconst RE_NOT_USERNAME_SEARCH = /[^@_\\d\\wа-яё]+/i;\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 currentUserId?: number,\n usersById?: Record,\n) {\n const [isOpen, markIsOpen, unmarkIsOpen] = useFlag();\n const [currentFilter, setCurrentFilter] = useState('');\n const [filteredMembers, setFilteredMembers] = useState([]);\n\n const getFilteredMembers = useCallback((filter) => {\n if (!groupChatMembers || !usersById) {\n return undefined;\n }\n\n return groupChatMembers.filter(({ userId }) => {\n const user = usersById[userId];\n if (userId === currentUserId || !user) {\n return false;\n }\n\n return !filter || searchUserName(filter, user);\n });\n }, [groupChatMembers, currentUserId, usersById]);\n\n useEffect(() => {\n if (!canSuggestMembers || !html.length) {\n unmarkIsOpen();\n return;\n }\n\n const usernameFilter = getUsernameFilter(html);\n\n if (usernameFilter) {\n const filter = usernameFilter ? usernameFilter.substr(1) : '';\n const membersToMention = getFilteredMembers(filter);\n if (membersToMention && membersToMention.length) {\n markIsOpen();\n setCurrentFilter(filter);\n setFilteredMembers(membersToMention);\n } else {\n unmarkIsOpen();\n }\n } else {\n unmarkIsOpen();\n }\n }, [canSuggestMembers, html, getFilteredMembers, markIsOpen, unmarkIsOpen]);\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 if (!IS_MOBILE_SCREEN) {\n requestAnimationFrame(() => {\n focusEditableElement(messageInput, forceFocus);\n });\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 mentionFilteredMembers: filteredMembers,\n };\n}\n\nfunction getUsernameFilter(html: string) {\n const tempEl = document.createElement('div');\n tempEl.innerHTML = html;\n const text = tempEl.innerText;\n\n const lastSymbol = text[text.length - 1];\n const lastWord = text.split(RE_NOT_USERNAME_SEARCH).pop();\n\n if (\n !text.length || RE_NOT_USERNAME_SEARCH.test(lastSymbol)\n || !lastWord || !lastWord.startsWith('@')\n ) {\n return undefined;\n }\n\n return lastWord;\n}\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 { 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/1.7d08855d9784837f4e10.js.map b/dist/1.7d08855d9784837f4e10.js.map deleted file mode 100644 index d99587842..000000000 --- a/dist/1.7d08855d9784837f4e10.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":[],"names":[],"mappings":"","file":"1.7d08855d9784837f4e10.js","sourceRoot":""} \ No newline at end of file diff --git a/dist/1.7d08855d9784837f4e10.js b/dist/1.c45de763c3ae52a66870.js similarity index 99% rename from dist/1.7d08855d9784837f4e10.js rename to dist/1.c45de763c3ae52a66870.js index dc0918207..b236d896d 100644 --- a/dist/1.7d08855d9784837f4e10.js +++ b/dist/1.c45de763c3ae52a66870.js @@ -1,2 +1,2 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[1],{311:function(a){a.exports=JSON.parse('[["people",["Smileys & People"]],[["1F600",["grinning","grinning_face","face","smile","happy","joy",":D","grin"]],["1F603",["smiley","grinning_face_with_big_eyes","face","happy","joy","haha",":D",":)","smile","funny"]],["1F604",["smile","grinning_face_with_smiling_eyes","face","happy","joy","funny","haha","laugh","like",":D",":)"]],["1F601",["grin","beaming_face_with_smiling_eyes","face","happy","smile","joy","kawaii"]],["1F606",["laughing","grinning_squinting_face","happy","joy","lol","satisfied","haha","face","glad","XD","laugh"]],["1F605",["sweat_smile","grinning_face_with_sweat","face","hot","happy","laugh","sweat","smile","relief"]],["1F923",["rolling_on_the_floor_laughing","face","rolling","floor","laughing","lol","haha"]],["1F602",["joy","face_with_tears_of_joy","face","cry","tears","weep","happy","happytears","haha"]],["1F642",["slightly_smiling_face","face","smile"]],["1F643",["upside_down_face","face","flipped","silly","smile"]],["1F609",["wink","winking_face","face","happy","mischievous","secret",";)","smile","eye"]],["1F60A",["blush","smiling_face_with_smiling_eyes","face","smile","happy","flushed","crush","embarrassed","shy","joy"]],["1F607",["innocent","smiling_face_with_halo","face","angel","heaven","halo"]],["1F970",["smiling_face_with_3_hearts","smiling_face_with_hearts","face","love","like","affection","valentines","infatuation","crush","hearts","adore"]],["1F60D",["heart_eyes","smiling_face_with_heart_eyes","face","love","like","affection","valentines","infatuation","crush","heart"]],["1F929",["star-struck","star_struck","face","smile","starry","eyes","grinning"]],["1F618",["kissing_heart","face_blowing_a_kiss","face","love","like","affection","valentines","infatuation","kiss"]],["1F617",["kissing","kissing_face","love","like","face","3","valentines","infatuation","kiss"]],["263A-FE0F",["relaxed","smiling_face","face","blush","massage","happiness"]],["1F61A",["kissing_closed_eyes","kissing_face_with_closed_eyes","face","love","like","affection","valentines","infatuation","kiss"]],["1F619",["kissing_smiling_eyes","kissing_face_with_smiling_eyes","face","affection","valentines","infatuation","kiss"]],["1F972",["smiling_face_with_tear","smiling face with tear","sad","cry","pretend"]],["1F60B",["yum","face_savoring_food","happy","joy","tongue","smile","face","silly","yummy","nom","delicious","savouring"]],["1F61B",["stuck_out_tongue","face_with_tongue","face","prank","childish","playful","mischievous","smile","tongue"]],["1F61C",["stuck_out_tongue_winking_eye","winking_face_with_tongue","face","prank","childish","playful","mischievous","smile","wink","tongue"]],["1F92A",["zany_face","face","goofy","crazy"]],["1F61D",["stuck_out_tongue_closed_eyes","squinting_face_with_tongue","face","prank","playful","mischievous","smile","tongue"]],["1F911",["money_mouth_face","face","rich","dollar","money"]],["1F917",["hugging_face","face","smile","hug"]],["1F92D",["face_with_hand_over_mouth","face","whoops","shock","surprise"]],["1F92B",["shushing_face","face","quiet","shhh"]],["1F914",["thinking_face","face","hmmm","think","consider"]],["1F910",["zipper_mouth_face","face","sealed","zipper","secret"]],["1F928",["face_with_raised_eyebrow","face","distrust","scepticism","disapproval","disbelief","surprise"]],["1F610",["neutral_face","indifference","meh",":|","neutral"]],["1F611",["expressionless","expressionless_face","face","indifferent","-_-","meh","deadpan"]],["1F636",["no_mouth","face_without_mouth","face","hellokitty"]],["1F636-200D-1F32B-FE0F",["face_in_clouds"]],["1F60F",["smirk","smirking_face","face","smile","mean","prank","smug","sarcasm"]],["1F612",["unamused","unamused_face","indifference","bored","straight face","serious","sarcasm","unimpressed","skeptical","dubious","side_eye"]],["1F644",["face_with_rolling_eyes","face","eyeroll","frustrated"]],["1F62C",["grimacing","grimacing_face","face","grimace","teeth"]],["1F62E-200D-1F4A8",["face_exhaling"]],["1F925",["lying_face","face","lie","pinocchio"]],["1F60C",["relieved","relieved_face","face","relaxed","phew","massage","happiness"]],["1F614",["pensive","pensive_face","face","sad","depressed","upset"]],["1F62A",["sleepy","sleepy_face","face","tired","rest","nap"]],["1F924",["drooling_face","face"]],["1F634",["sleeping","sleeping_face","face","tired","sleepy","night","zzz"]],["1F637",["mask","face_with_medical_mask","face","sick","ill","disease"]],["1F912",["face_with_thermometer","sick","temperature","thermometer","cold","fever"]],["1F915",["face_with_head_bandage","injured","clumsy","bandage","hurt"]],["1F922",["nauseated_face","face","vomit","gross","green","sick","throw up","ill"]],["1F92E",["face_vomiting","face","sick"]],["1F927",["sneezing_face","face","gesundheit","sneeze","sick","allergy"]],["1F975",["hot_face","face","feverish","heat","red","sweating"]],["1F976",["cold_face","face","blue","freezing","frozen","frostbite","icicles"]],["1F974",["woozy_face","face","dizzy","intoxicated","tipsy","wavy"]],["1F635",["dizzy_face","spent","unconscious","xox","dizzy"]],["1F635-200D-1F4AB",["face_with_spiral_eyes"]],["1F92F",["exploding_head","face","shocked","mind","blown"]],["1F920",["face_with_cowboy_hat","cowboy_hat_face","face","cowgirl","hat"]],["1F973",["partying_face","face","celebration","woohoo"]],["1F978",["disguised_face","disguised face","pretent","brows","glasses","moustache"]],["1F60E",["sunglasses","smiling_face_with_sunglasses","face","cool","smile","summer","beach","sunglass"]],["1F913",["nerd_face","face","nerdy","geek","dork"]],["1F9D0",["face_with_monocle","face","stuffy","wealthy"]],["1F615",["confused","confused_face","face","indifference","huh","weird","hmmm",":/"]],["1F61F",["worried","worried_face","face","concern","nervous",":("]],["1F641",["slightly_frowning_face","face","frowning","disappointed","sad","upset"]],["2639-FE0F",["white_frowning_face","frowning_face","face","sad","upset","frown"]],["1F62E",["open_mouth","face_with_open_mouth","face","surprise","impressed","wow","whoa",":O"]],["1F62F",["hushed","hushed_face","face","woo","shh"]],["1F632",["astonished","astonished_face","face","xox","surprised","poisoned"]],["1F633",["flushed","flushed_face","face","blush","shy","flattered"]],["1F97A",["pleading_face","face","begging","mercy"]],["1F626",["frowning","frowning_face_with_open_mouth","face","aw","what"]],["1F627",["anguished","anguished_face","face","stunned","nervous"]],["1F628",["fearful","fearful_face","face","scared","terrified","nervous","oops","huh"]],["1F630",["cold_sweat","anxious_face_with_sweat","face","nervous","sweat"]],["1F625",["disappointed_relieved","sad_but_relieved_face","face","phew","sweat","nervous"]],["1F622",["cry","crying_face","face","tears","sad","depressed","upset",":\'("]],["1F62D",["sob","loudly_crying_face","face","cry","tears","sad","upset","depressed"]],["1F631",["scream","face_screaming_in_fear","face","munch","scared","omg"]],["1F616",["confounded","confounded_face","face","confused","sick","unwell","oops",":S"]],["1F623",["persevere","persevering_face","face","sick","no","upset","oops"]],["1F61E",["disappointed","disappointed_face","face","sad","upset","depressed",":("]],["1F613",["sweat","downcast_face_with_sweat","face","hot","sad","tired","exercise"]],["1F629",["weary","weary_face","face","tired","sleepy","sad","frustrated","upset"]],["1F62B",["tired_face","sick","whine","upset","frustrated"]],["1F971",["yawning_face","tired","sleepy"]],["1F624",["triumph","face_with_steam_from_nose","face","gas","phew","proud","pride"]],["1F621",["rage","pouting_face","angry","mad","hate","despise"]],["1F620",["angry","angry_face","mad","face","annoyed","frustrated"]],["1F92C",["face_with_symbols_on_mouth","face","swearing","cursing","cussing","profanity","expletive"]],["1F608",["smiling_imp","smiling_face_with_horns","devil","horns"]],["1F47F",["imp","angry_face_with_horns","devil","angry","horns"]],["1F480",["skull","dead","skeleton","creepy","death"]],["2620-FE0F",["skull_and_crossbones","poison","danger","deadly","scary","death","pirate","evil"]],["1F4A9",["hankey","pile_of_poo","shitface","fail","turd","shit"]],["1F921",["clown_face","face"]],["1F479",["japanese_ogre","ogre","monster","red","mask","halloween","scary","creepy","devil","demon","japanese"]],["1F47A",["japanese_goblin","goblin","red","evil","mask","monster","scary","creepy","japanese"]],["1F47B",["ghost","halloween","spooky","scary"]],["1F47D",["alien","UFO","paul","weird","outer_space"]],["1F47E",["space_invader","alien_monster","game","arcade","play"]],["1F916",["robot_face","robot","computer","machine","bot"]],["1F63A",["smiley_cat","grinning_cat","animal","cats","happy","smile"]],["1F638",["smile_cat","grinning_cat_with_smiling_eyes","animal","cats","smile"]],["1F639",["joy_cat","cat_with_tears_of_joy","animal","cats","haha","happy","tears"]],["1F63B",["heart_eyes_cat","smiling_cat_with_heart_eyes","animal","love","like","affection","cats","valentines","heart"]],["1F63C",["smirk_cat","cat_with_wry_smile","animal","cats","smirk"]],["1F63D",["kissing_cat","animal","cats","kiss"]],["1F640",["scream_cat","weary_cat","animal","cats","munch","scared","scream"]],["1F63F",["crying_cat_face","crying_cat","animal","tears","weep","sad","cats","upset","cry"]],["1F63E",["pouting_cat","animal","cats"]],["1F648",["see_no_evil","see_no_evil_monkey","monkey","animal","nature","haha"]],["1F649",["hear_no_evil","hear_no_evil_monkey","animal","monkey","nature"]],["1F64A",["speak_no_evil","speak_no_evil_monkey","monkey","animal","nature","omg"]],["1F48B",["kiss","kiss_mark","face","lips","love","like","affection","valentines"]],["1F48C",["love_letter","email","like","affection","envelope","valentines"]],["1F498",["cupid","heart_with_arrow","love","like","heart","affection","valentines"]],["1F49D",["gift_heart","heart_with_ribbon","love","valentines"]],["1F496",["sparkling_heart","love","like","affection","valentines"]],["1F497",["heartpulse","growing_heart","like","love","affection","valentines","pink"]],["1F493",["heartbeat","beating_heart","love","like","affection","valentines","pink","heart"]],["1F49E",["revolving_hearts","love","like","affection","valentines"]],["1F495",["two_hearts","love","like","affection","valentines","heart"]],["1F49F",["heart_decoration","purple-square","love","like"]],["2763-FE0F",["heavy_heart_exclamation_mark_ornament","heart_exclamation","decoration","love"]],["1F494",["broken_heart","sad","sorry","break","heart","heartbreak"]],["2764-FE0F-200D-1F525",["heart_on_fire"]],["2764-FE0F-200D-1FA79",["mending_heart"]],["2764-FE0F",["heart","red_heart","love","like","valentines"]],["1F9E1",["orange_heart","love","like","affection","valentines"]],["1F49B",["yellow_heart","love","like","affection","valentines"]],["1F49A",["green_heart","love","like","affection","valentines"]],["1F499",["blue_heart","love","like","affection","valentines"]],["1F49C",["purple_heart","love","like","affection","valentines"]],["1F90E",["brown_heart","coffee"]],["1F5A4",["black_heart","evil"]],["1F90D",["white_heart","pure"]],["1F4AF",["100","hundred_points","score","perfect","numbers","century","exam","quiz","test","pass","hundred"]],["1F4A2",["anger","anger_symbol","angry","mad"]],["1F4A5",["boom","collision","bomb","explode","explosion","blown"]],["1F4AB",["dizzy","star","sparkle","shoot","magic"]],["1F4A6",["sweat_drops","sweat_droplets","water","drip","oops"]],["1F4A8",["dash","dashing_away","wind","air","fast","shoo","fart","smoke","puff"]],["1F573-FE0F",["hole","embarrassing"]],["1F4A3",["bomb","boom","explode","explosion","terrorism"]],["1F4AC",["speech_balloon","bubble","words","message","talk","chatting"]],["1F441-FE0F-200D-1F5E8-FE0F",["eye-in-speech-bubble","eye_in_speech_bubble","info"]],["1F5E8-FE0F",["left_speech_bubble","words","message","talk","chatting"]],["1F5EF-FE0F",["right_anger_bubble","caption","speech","thinking","mad"]],["1F4AD",["thought_balloon","bubble","cloud","speech","thinking","dream"]],["1F4A4",["zzz","sleepy","tired","dream"]],["1F44B",["wave","waving_hand","hands","gesture","goodbye","solong","farewell","hello","hi","palm"]],["1F91A",["raised_back_of_hand","fingers","raised","backhand"]],["1F590-FE0F",["raised_hand_with_fingers_splayed","hand_with_fingers_splayed","hand","fingers","palm"]],["270B",["hand","raised_hand","fingers","stop","highfive","palm","ban"]],["1F596",["spock-hand","vulcan_salute","hand","fingers","spock","star trek"]],["1F44C",["ok_hand","fingers","limbs","perfect","ok","okay"]],["1F90C",["pinched_fingers","pinched fingers","size","tiny","small"]],["1F90F",["pinching_hand","tiny","small","size"]],["270C-FE0F",["v","victory_hand","fingers","ohyeah","hand","peace","victory","two"]],["1F91E",["crossed_fingers","good","lucky"]],["1F91F",["i_love_you_hand_sign","love_you_gesture","hand","fingers","gesture"]],["1F918",["the_horns","sign_of_the_horns","hand","fingers","evil_eye","sign_of_horns","rock_on"]],["1F919",["call_me_hand","hands","gesture"]],["1F448",["point_left","backhand_index_pointing_left","direction","fingers","hand","left"]],["1F449",["point_right","backhand_index_pointing_right","fingers","hand","direction","right"]],["1F446",["point_up_2","backhand_index_pointing_up","fingers","hand","direction","up"]],["1F595",["middle_finger","hand","fingers","rude","middle","flipping"]],["1F447",["point_down","backhand_index_pointing_down","fingers","hand","direction","down"]],["261D-FE0F",["point_up","index_pointing_up","hand","fingers","direction","up"]],["1F44D",["+1","thumbs_up","thumbsup","yes","awesome","good","agree","accept","cool","hand","like"]],["1F44E",["-1","thumbs_down","thumbsdown","no","dislike","hand"]],["270A",["fist","raised_fist","fingers","hand","grasp"]],["1F44A",["facepunch","oncoming_fist","angry","violence","fist","hit","attack","hand"]],["1F91B",["left-facing_fist","left_facing_fist","hand","fistbump"]],["1F91C",["right-facing_fist","right_facing_fist","hand","fistbump"]],["1F44F",["clap","clapping_hands","hands","praise","applause","congrats","yay"]],["1F64C",["raised_hands","raising_hands","gesture","hooray","yea","celebration","hands"]],["1F450",["open_hands","fingers","butterfly","hands","open"]],["1F932",["palms_up_together","hands","gesture","cupped","prayer"]],["1F91D",["handshake","agreement","shake"]],["1F64F",["pray","folded_hands","please","hope","wish","namaste","highfive"]],["270D-FE0F",["writing_hand","lower_left_ballpoint_pen","stationery","write","compose"]],["1F485",["nail_care","nail_polish","beauty","manicure","finger","fashion","nail"]],["1F933",["selfie","camera","phone"]],["1F4AA",["muscle","flexed_biceps","arm","flex","hand","summer","strong","biceps"]],["1F9BE",["mechanical_arm","accessibility"]],["1F9BF",["mechanical_leg","accessibility"]],["1F9B5",["leg","kick","limb"]],["1F9B6",["foot","kick","stomp"]],["1F442",["ear","face","hear","sound","listen"]],["1F9BB",["ear_with_hearing_aid","accessibility"]],["1F443",["nose","smell","sniff"]],["1F9E0",["brain","smart","intelligent"]],["1FAC0",["anatomical_heart","anatomical heart","health","heartbeat"]],["1FAC1",["lungs","breathe"]],["1F9B7",["tooth","teeth","dentist"]],["1F9B4",["bone","skeleton"]],["1F440",["eyes","look","watch","stalk","peek","see"]],["1F441-FE0F",["eye","face","look","see","watch","stare"]],["1F445",["tongue","mouth","playful"]],["1F444",["lips","mouth","kiss"]],["1F476",["baby","child","boy","girl","toddler"]],["1F9D2",["child","gender-neutral","young"]],["1F466",["boy","man","male","guy","teenager"]],["1F467",["girl","female","woman","teenager"]],["1F9D1",["adult","person","gender-neutral"]],["1F471",["person_with_blond_hair","person_blond_hair","hairstyle"]],["1F468",["man","mustache","father","dad","guy","classy","sir","moustache"]],["1F9D4",["bearded_person","man_beard","person","bewhiskered"]],["1F9D4-200D-2642-FE0F",["man_with_beard"]],["1F9D4-200D-2640-FE0F",["woman_with_beard"]],["1F468-200D-1F9B0",["red_haired_man","man_red_hair","hairstyle"]],["1F468-200D-1F9B1",["curly_haired_man","man_curly_hair","hairstyle"]],["1F468-200D-1F9B3",["white_haired_man","man_white_hair","old","elder"]],["1F468-200D-1F9B2",["bald_man","man_bald","hairless"]],["1F469",["woman","female","girls","lady"]],["1F469-200D-1F9B0",["red_haired_woman","woman_red_hair","hairstyle"]],["1F9D1-200D-1F9B0",["red_haired_person","person_red_hair","hairstyle"]],["1F469-200D-1F9B1",["curly_haired_woman","woman_curly_hair","hairstyle"]],["1F9D1-200D-1F9B1",["curly_haired_person","person_curly_hair","hairstyle"]],["1F469-200D-1F9B3",["white_haired_woman","woman_white_hair","old","elder"]],["1F9D1-200D-1F9B3",["white_haired_person","person_white_hair","elder","old"]],["1F469-200D-1F9B2",["bald_woman","woman_bald","hairless"]],["1F9D1-200D-1F9B2",["bald_person","person_bald","hairless"]],["1F471-200D-2640-FE0F",["blond-haired-woman","woman_blond_hair","woman","female","girl","blonde","person"]],["1F471-200D-2642-FE0F",["blond-haired-man","man_blond_hair","man","male","boy","blonde","guy","person"]],["1F9D3",["older_adult","older_person","human","elder","senior","gender-neutral"]],["1F474",["older_man","old_man","human","male","men","old","elder","senior"]],["1F475",["older_woman","old_woman","human","female","women","lady","old","elder","senior"]],["1F64D",["person_frowning","worried"]],["1F64D-200D-2642-FE0F",["man-frowning","man_frowning","male","boy","man","sad","depressed","discouraged","unhappy"]],["1F64D-200D-2640-FE0F",["woman-frowning","woman_frowning","female","girl","woman","sad","depressed","discouraged","unhappy"]],["1F64E",["person_with_pouting_face","person_pouting","upset"]],["1F64E-200D-2642-FE0F",["man-pouting","man_pouting","male","boy","man"]],["1F64E-200D-2640-FE0F",["woman-pouting","woman_pouting","female","girl","woman"]],["1F645",["no_good","person_gesturing_no","decline"]],["1F645-200D-2642-FE0F",["man-gesturing-no","man_gesturing_no","male","boy","man","nope"]],["1F645-200D-2640-FE0F",["woman-gesturing-no","woman_gesturing_no","female","girl","woman","nope"]],["1F646",["ok_woman","person_gesturing_ok","agree"]],["1F646-200D-2642-FE0F",["man-gesturing-ok","man_gesturing_ok","men","boy","male","blue","human","man"]],["1F646-200D-2640-FE0F",["woman-gesturing-ok","woman_gesturing_ok","women","girl","female","pink","human","woman"]],["1F481",["information_desk_person","person_tipping_hand","information"]],["1F481-200D-2642-FE0F",["man-tipping-hand","man_tipping_hand","male","boy","man","human","information"]],["1F481-200D-2640-FE0F",["woman-tipping-hand","woman_tipping_hand","female","girl","woman","human","information"]],["1F64B",["raising_hand","person_raising_hand","question"]],["1F64B-200D-2642-FE0F",["man-raising-hand","man_raising_hand","male","boy","man"]],["1F64B-200D-2640-FE0F",["woman-raising-hand","woman_raising_hand","female","girl","woman"]],["1F9CF",["deaf_person","accessibility"]],["1F9CF-200D-2642-FE0F",["deaf_man","accessibility"]],["1F9CF-200D-2640-FE0F",["deaf_woman","accessibility"]],["1F647",["bow","person_bowing","respectiful"]],["1F647-200D-2642-FE0F",["man-bowing","man_bowing","man","male","boy"]],["1F647-200D-2640-FE0F",["woman-bowing","woman_bowing","woman","female","girl"]],["1F926",["face_palm","person_facepalming","disappointed"]],["1F926-200D-2642-FE0F",["man-facepalming","man_facepalming","man","male","boy","disbelief"]],["1F926-200D-2640-FE0F",["woman-facepalming","woman_facepalming","woman","female","girl","disbelief"]],["1F937",["shrug","person_shrugging","regardless"]],["1F937-200D-2642-FE0F",["man-shrugging","man_shrugging","man","male","boy","confused","indifferent","doubt"]],["1F937-200D-2640-FE0F",["woman-shrugging","woman_shrugging","woman","female","girl","confused","indifferent","doubt"]],["1F9D1-200D-2695-FE0F",["health_worker","hospital"]],["1F468-200D-2695-FE0F",["male-doctor","man_health_worker","doctor","nurse","therapist","healthcare","man","human"]],["1F469-200D-2695-FE0F",["female-doctor","woman_health_worker","doctor","nurse","therapist","healthcare","woman","human"]],["1F9D1-200D-1F393",["student","learn"]],["1F468-200D-1F393",["male-student","man_student","graduate","man","human"]],["1F469-200D-1F393",["female-student","woman_student","graduate","woman","human"]],["1F9D1-200D-1F3EB",["teacher","professor"]],["1F468-200D-1F3EB",["male-teacher","man_teacher","instructor","professor","man","human"]],["1F469-200D-1F3EB",["female-teacher","woman_teacher","instructor","professor","woman","human"]],["1F9D1-200D-2696-FE0F",["judge","law"]],["1F468-200D-2696-FE0F",["male-judge","man_judge","justice","court","man","human"]],["1F469-200D-2696-FE0F",["female-judge","woman_judge","justice","court","woman","human"]],["1F9D1-200D-1F33E",["farmer","crops"]],["1F468-200D-1F33E",["male-farmer","man_farmer","rancher","gardener","man","human"]],["1F469-200D-1F33E",["female-farmer","woman_farmer","rancher","gardener","woman","human"]],["1F9D1-200D-1F373",["cook","food","kitchen","culinary"]],["1F468-200D-1F373",["male-cook","man_cook","chef","man","human"]],["1F469-200D-1F373",["female-cook","woman_cook","chef","woman","human"]],["1F9D1-200D-1F527",["mechanic","worker","technician"]],["1F468-200D-1F527",["male-mechanic","man_mechanic","plumber","man","human","wrench"]],["1F469-200D-1F527",["female-mechanic","woman_mechanic","plumber","woman","human","wrench"]],["1F9D1-200D-1F3ED",["factory_worker","labor"]],["1F468-200D-1F3ED",["male-factory-worker","man_factory_worker","assembly","industrial","man","human"]],["1F469-200D-1F3ED",["female-factory-worker","woman_factory_worker","assembly","industrial","woman","human"]],["1F9D1-200D-1F4BC",["office_worker","business"]],["1F468-200D-1F4BC",["male-office-worker","man_office_worker","business","manager","man","human"]],["1F469-200D-1F4BC",["female-office-worker","woman_office_worker","business","manager","woman","human"]],["1F9D1-200D-1F52C",["scientist","chemistry"]],["1F468-200D-1F52C",["male-scientist","man_scientist","biologist","chemist","engineer","physicist","man","human"]],["1F469-200D-1F52C",["female-scientist","woman_scientist","biologist","chemist","engineer","physicist","woman","human"]],["1F9D1-200D-1F4BB",["technologist","computer"]],["1F468-200D-1F4BB",["male-technologist","man_technologist","coder","developer","engineer","programmer","software","man","human","laptop","computer"]],["1F469-200D-1F4BB",["female-technologist","woman_technologist","coder","developer","engineer","programmer","software","woman","human","laptop","computer"]],["1F9D1-200D-1F3A4",["singer","song","artist","performer"]],["1F468-200D-1F3A4",["male-singer","man_singer","rockstar","entertainer","man","human"]],["1F469-200D-1F3A4",["female-singer","woman_singer","rockstar","entertainer","woman","human"]],["1F9D1-200D-1F3A8",["artist","painting","draw","creativity"]],["1F468-200D-1F3A8",["male-artist","man_artist","painter","man","human"]],["1F469-200D-1F3A8",["female-artist","woman_artist","painter","woman","human"]],["1F9D1-200D-2708-FE0F",["pilot","fly","plane","airplane"]],["1F468-200D-2708-FE0F",["male-pilot","man_pilot","aviator","plane","man","human"]],["1F469-200D-2708-FE0F",["female-pilot","woman_pilot","aviator","plane","woman","human"]],["1F9D1-200D-1F680",["astronaut","outerspace"]],["1F468-200D-1F680",["male-astronaut","man_astronaut","space","rocket","man","human"]],["1F469-200D-1F680",["female-astronaut","woman_astronaut","space","rocket","woman","human"]],["1F9D1-200D-1F692",["firefighter","fire"]],["1F468-200D-1F692",["male-firefighter","man_firefighter","fireman","man","human"]],["1F469-200D-1F692",["female-firefighter","woman_firefighter","fireman","woman","human"]],["1F46E",["cop","police_officer"]],["1F46E-200D-2642-FE0F",["male-police-officer","man_police_officer","man","police","law","legal","enforcement","arrest","911"]],["1F46E-200D-2640-FE0F",["female-police-officer","woman_police_officer","woman","police","law","legal","enforcement","arrest","911","female"]],["1F575-FE0F",["sleuth_or_spy","detective","human","spy"]],["1F575-FE0F-200D-2642-FE0F",["male-detective","man_detective","crime"]],["1F575-FE0F-200D-2640-FE0F",["female-detective","woman_detective","human","spy","detective","female","woman"]],["1F482",["guardsman","guard","protect"]],["1F482-200D-2642-FE0F",["male-guard","man_guard","uk","gb","british","male","guy","royal"]],["1F482-200D-2640-FE0F",["female-guard","woman_guard","uk","gb","british","female","royal","woman"]],["1F977",["ninja","ninjutsu","skills","japanese"]],["1F477",["construction_worker","labor","build"]],["1F477-200D-2642-FE0F",["male-construction-worker","man_construction_worker","male","human","wip","guy","build","construction","worker","labor"]],["1F477-200D-2640-FE0F",["female-construction-worker","woman_construction_worker","female","human","wip","build","construction","worker","labor","woman"]],["1F934",["prince","boy","man","male","crown","royal","king"]],["1F478",["princess","girl","woman","female","blond","crown","royal","queen"]],["1F473",["man_with_turban","person_wearing_turban","headdress"]],["1F473-200D-2642-FE0F",["man-wearing-turban","man_wearing_turban","male","indian","hinduism","arabs"]],["1F473-200D-2640-FE0F",["woman-wearing-turban","woman_wearing_turban","female","indian","hinduism","arabs","woman"]],["1F472",["man_with_gua_pi_mao","man_with_skullcap","male","boy","chinese"]],["1F9D5",["person_with_headscarf","woman_with_headscarf","female","hijab","mantilla","tichel"]],["1F935",["person_in_tuxedo","man_in_tuxedo","couple","marriage","wedding","groom"]],["1F935-200D-2642-FE0F",["man_in_tuxedo","man in tuxedo","formal","fashion"]],["1F935-200D-2640-FE0F",["woman_in_tuxedo","woman in tuxedo","formal","fashion"]],["1F470",["bride_with_veil","couple","marriage","wedding","woman","bride"]],["1F470-200D-2642-FE0F",["man_with_veil","man with veil","wedding","marriage"]],["1F470-200D-2640-FE0F",["woman_with_veil","woman with veil","wedding","marriage"]],["1F930",["pregnant_woman","baby"]],["1F931",["breast-feeding","breast_feeding","nursing","baby"]],["1F469-200D-1F37C",["woman_feeding_baby","woman feeding baby","birth","food"]],["1F468-200D-1F37C",["man_feeding_baby","man feeding baby","birth","food"]],["1F9D1-200D-1F37C",["person_feeding_baby","person feeding baby","birth","food"]],["1F47C",["angel","baby_angel","heaven","wings","halo"]],["1F385",["santa","santa_claus","festival","man","male","xmas","father christmas"]],["1F936",["mrs_claus","woman","female","xmas","mother christmas"]],["1F9D1-200D-1F384",["mx_claus","mx claus","christmas"]],["1F9B8",["superhero","marvel"]],["1F9B8-200D-2642-FE0F",["male_superhero","man_superhero","man","male","good","hero","superpowers"]],["1F9B8-200D-2640-FE0F",["female_superhero","woman_superhero","woman","female","good","heroine","superpowers"]],["1F9B9",["supervillain","marvel"]],["1F9B9-200D-2642-FE0F",["male_supervillain","man_supervillain","man","male","evil","bad","criminal","hero","superpowers"]],["1F9B9-200D-2640-FE0F",["female_supervillain","woman_supervillain","woman","female","evil","bad","criminal","heroine","superpowers"]],["1F9D9",["mage","magic"]],["1F9D9-200D-2642-FE0F",["male_mage","man_mage","man","male","mage","sorcerer"]],["1F9D9-200D-2640-FE0F",["female_mage","woman_mage","woman","female","mage","witch"]],["1F9DA",["fairy","wings","magical"]],["1F9DA-200D-2642-FE0F",["male_fairy","man_fairy","man","male"]],["1F9DA-200D-2640-FE0F",["female_fairy","woman_fairy","woman","female"]],["1F9DB",["vampire","blood","twilight"]],["1F9DB-200D-2642-FE0F",["male_vampire","man_vampire","man","male","dracula"]],["1F9DB-200D-2640-FE0F",["female_vampire","woman_vampire","woman","female"]],["1F9DC",["merperson","sea"]],["1F9DC-200D-2642-FE0F",["merman","man","male","triton"]],["1F9DC-200D-2640-FE0F",["mermaid","woman","female","merwoman","ariel"]],["1F9DD",["elf","magical"]],["1F9DD-200D-2642-FE0F",["male_elf","man_elf","man","male"]],["1F9DD-200D-2640-FE0F",["female_elf","woman_elf","woman","female"]],["1F9DE",["genie","magical","wishes"]],["1F9DE-200D-2642-FE0F",["male_genie","man_genie","man","male"]],["1F9DE-200D-2640-FE0F",["female_genie","woman_genie","woman","female"]],["1F9DF",["zombie","dead"]],["1F9DF-200D-2642-FE0F",["male_zombie","man_zombie","man","male","dracula","undead","walking dead"]],["1F9DF-200D-2640-FE0F",["female_zombie","woman_zombie","woman","female","undead","walking dead"]],["1F486",["massage","person_getting_massage","relax"]],["1F486-200D-2642-FE0F",["man-getting-massage","man_getting_massage","male","boy","man","head"]],["1F486-200D-2640-FE0F",["woman-getting-massage","woman_getting_massage","female","girl","woman","head"]],["1F487",["haircut","person_getting_haircut","hairstyle"]],["1F487-200D-2642-FE0F",["man-getting-haircut","man_getting_haircut","male","boy","man"]],["1F487-200D-2640-FE0F",["woman-getting-haircut","woman_getting_haircut","female","girl","woman"]],["1F6B6",["walking","person_walking","move"]],["1F6B6-200D-2642-FE0F",["man-walking","man_walking","human","feet","steps"]],["1F6B6-200D-2640-FE0F",["woman-walking","woman_walking","human","feet","steps","woman","female"]],["1F9CD",["standing_person","person_standing","still"]],["1F9CD-200D-2642-FE0F",["man_standing","still"]],["1F9CD-200D-2640-FE0F",["woman_standing","still"]],["1F9CE",["kneeling_person","person_kneeling","pray","respectful"]],["1F9CE-200D-2642-FE0F",["man_kneeling","pray","respectful"]],["1F9CE-200D-2640-FE0F",["woman_kneeling","respectful","pray"]],["1F9D1-200D-1F9AF",["person_with_probing_cane","blind"]],["1F468-200D-1F9AF",["man_with_probing_cane","blind"]],["1F469-200D-1F9AF",["woman_with_probing_cane","blind"]],["1F9D1-200D-1F9BC",["person_in_motorized_wheelchair","disability","accessibility"]],["1F468-200D-1F9BC",["man_in_motorized_wheelchair","disability","accessibility"]],["1F469-200D-1F9BC",["woman_in_motorized_wheelchair","disability","accessibility"]],["1F9D1-200D-1F9BD",["person_in_manual_wheelchair","disability","accessibility"]],["1F468-200D-1F9BD",["man_in_manual_wheelchair","disability","accessibility"]],["1F469-200D-1F9BD",["woman_in_manual_wheelchair","disability","accessibility"]],["1F3C3",["runner","person_running","move"]],["1F3C3-200D-2642-FE0F",["man-running","man_running","man","walking","exercise","race","running"]],["1F3C3-200D-2640-FE0F",["woman-running","woman_running","woman","walking","exercise","race","running","female"]],["1F483",["dancer","woman_dancing","female","girl","woman","fun"]],["1F57A",["man_dancing","male","boy","fun","dancer"]],["1F574-FE0F",["man_in_business_suit_levitating","man_in_suit_levitating","suit","business","levitate","hover","jump"]],["1F46F",["dancers","people_with_bunny_ears","perform","costume"]],["1F46F-200D-2642-FE0F",["men-with-bunny-ears-partying","men_with_bunny_ears","male","bunny","men","boys"]],["1F46F-200D-2640-FE0F",["women-with-bunny-ears-partying","women_with_bunny_ears","female","bunny","women","girls"]],["1F9D6",["person_in_steamy_room","relax","spa"]],["1F9D6-200D-2642-FE0F",["man_in_steamy_room","male","man","spa","steamroom","sauna"]],["1F9D6-200D-2640-FE0F",["woman_in_steamy_room","female","woman","spa","steamroom","sauna"]],["1F9D7",["person_climbing","sport"]],["1F9D7-200D-2642-FE0F",["man_climbing","sports","hobby","man","male","rock"]],["1F9D7-200D-2640-FE0F",["woman_climbing","sports","hobby","woman","female","rock"]],["1F93A",["fencer","person_fencing","sports","fencing","sword"]],["1F3C7",["horse_racing","animal","betting","competition","gambling","luck"]],["26F7-FE0F",["skier","sports","winter","snow"]],["1F3C2",["snowboarder","sports","winter"]],["1F3CC-FE0F",["golfer","person_golfing","sports","business"]],["1F3CC-FE0F-200D-2642-FE0F",["man-golfing","man_golfing","sport"]],["1F3CC-FE0F-200D-2640-FE0F",["woman-golfing","woman_golfing","sports","business","woman","female"]],["1F3C4",["surfer","person_surfing","sport","sea"]],["1F3C4-200D-2642-FE0F",["man-surfing","man_surfing","sports","ocean","sea","summer","beach"]],["1F3C4-200D-2640-FE0F",["woman-surfing","woman_surfing","sports","ocean","sea","summer","beach","woman","female"]],["1F6A3",["rowboat","person_rowing_boat","sport","move"]],["1F6A3-200D-2642-FE0F",["man-rowing-boat","man_rowing_boat","sports","hobby","water","ship"]],["1F6A3-200D-2640-FE0F",["woman-rowing-boat","woman_rowing_boat","sports","hobby","water","ship","woman","female"]],["1F3CA",["swimmer","person_swimming","sport","pool"]],["1F3CA-200D-2642-FE0F",["man-swimming","man_swimming","sports","exercise","human","athlete","water","summer"]],["1F3CA-200D-2640-FE0F",["woman-swimming","woman_swimming","sports","exercise","human","athlete","water","summer","woman","female"]],["26F9-FE0F",["person_with_ball","person_bouncing_ball","sports","human"]],["26F9-FE0F-200D-2642-FE0F",["man-bouncing-ball","man_bouncing_ball","sport"]],["26F9-FE0F-200D-2640-FE0F",["woman-bouncing-ball","woman_bouncing_ball","sports","human","woman","female"]],["1F3CB-FE0F",["weight_lifter","person_lifting_weights","sports","training","exercise"]],["1F3CB-FE0F-200D-2642-FE0F",["man-lifting-weights","man_lifting_weights","sport"]],["1F3CB-FE0F-200D-2640-FE0F",["woman-lifting-weights","woman_lifting_weights","sports","training","exercise","woman","female"]],["1F6B4",["bicyclist","person_biking","sport","move"]],["1F6B4-200D-2642-FE0F",["man-biking","man_biking","sports","bike","exercise","hipster"]],["1F6B4-200D-2640-FE0F",["woman-biking","woman_biking","sports","bike","exercise","hipster","woman","female"]],["1F6B5",["mountain_bicyclist","person_mountain_biking","sport","move"]],["1F6B5-200D-2642-FE0F",["man-mountain-biking","man_mountain_biking","transportation","sports","human","race","bike"]],["1F6B5-200D-2640-FE0F",["woman-mountain-biking","woman_mountain_biking","transportation","sports","human","race","bike","woman","female"]],["1F938",["person_doing_cartwheel","person_cartwheeling","sport","gymnastic"]],["1F938-200D-2642-FE0F",["man-cartwheeling","man_cartwheeling","gymnastics"]],["1F938-200D-2640-FE0F",["woman-cartwheeling","woman_cartwheeling","gymnastics"]],["1F93C",["wrestlers","people_wrestling","sport"]],["1F93C-200D-2642-FE0F",["man-wrestling","men_wrestling","sports","wrestlers"]],["1F93C-200D-2640-FE0F",["woman-wrestling","women_wrestling","sports","wrestlers"]],["1F93D",["water_polo","person_playing_water_polo","sport"]],["1F93D-200D-2642-FE0F",["man-playing-water-polo","man_playing_water_polo","sports","pool"]],["1F93D-200D-2640-FE0F",["woman-playing-water-polo","woman_playing_water_polo","sports","pool"]],["1F93E",["handball","person_playing_handball","sport"]],["1F93E-200D-2642-FE0F",["man-playing-handball","man_playing_handball","sports"]],["1F93E-200D-2640-FE0F",["woman-playing-handball","woman_playing_handball","sports"]],["1F939",["juggling","person_juggling","performance","balance"]],["1F939-200D-2642-FE0F",["man-juggling","man_juggling","juggle","balance","skill","multitask"]],["1F939-200D-2640-FE0F",["woman-juggling","woman_juggling","juggle","balance","skill","multitask"]],["1F9D8",["person_in_lotus_position","meditate"]],["1F9D8-200D-2642-FE0F",["man_in_lotus_position","man","male","meditation","yoga","serenity","zen","mindfulness"]],["1F9D8-200D-2640-FE0F",["woman_in_lotus_position","woman","female","meditation","yoga","serenity","zen","mindfulness"]],["1F6C0",["bath","person_taking_bath","clean","shower","bathroom"]],["1F6CC",["sleeping_accommodation","person_in_bed","bed","rest"]],["1F9D1-200D-1F91D-200D-1F9D1",["people_holding_hands","friendship"]],["1F46D",["two_women_holding_hands","women_holding_hands","pair","friendship","couple","love","like","female","people","human"]],["1F46B",["man_and_woman_holding_hands","woman_and_man_holding_hands","pair","people","human","love","date","dating","like","affection","valentines","marriage"]],["1F46C",["two_men_holding_hands","men_holding_hands","pair","couple","love","like","bromance","friendship","people","human"]],["1F48F",["couplekiss","kiss","pair","valentines","love","like","dating","marriage"]],["1F469-200D-2764-FE0F-200D-1F48B-200D-1F468",["woman-kiss-man","kiss_woman_man","love"]],["1F468-200D-2764-FE0F-200D-1F48B-200D-1F468",["man-kiss-man","kiss_man_man","pair","valentines","love","like","dating","marriage"]],["1F469-200D-2764-FE0F-200D-1F48B-200D-1F469",["woman-kiss-woman","kiss_woman_woman","pair","valentines","love","like","dating","marriage"]],["1F491",["couple_with_heart","pair","love","like","affection","human","dating","valentines","marriage"]],["1F469-200D-2764-FE0F-200D-1F468",["woman-heart-man","couple_with_heart_woman_man","love"]],["1F468-200D-2764-FE0F-200D-1F468",["man-heart-man","couple_with_heart_man_man","pair","love","like","affection","human","dating","valentines","marriage"]],["1F469-200D-2764-FE0F-200D-1F469",["woman-heart-woman","couple_with_heart_woman_woman","pair","love","like","affection","human","dating","valentines","marriage"]],["1F46A",["family","home","parents","child","mom","dad","father","mother","people","human"]],["1F468-200D-1F469-200D-1F466",["man-woman-boy","family_man_woman_boy","love"]],["1F468-200D-1F469-200D-1F467",["man-woman-girl","family_man_woman_girl","home","parents","people","human","child"]],["1F468-200D-1F469-200D-1F467-200D-1F466",["man-woman-girl-boy","family_man_woman_girl_boy","home","parents","people","human","children"]],["1F468-200D-1F469-200D-1F466-200D-1F466",["man-woman-boy-boy","family_man_woman_boy_boy","home","parents","people","human","children"]],["1F468-200D-1F469-200D-1F467-200D-1F467",["man-woman-girl-girl","family_man_woman_girl_girl","home","parents","people","human","children"]],["1F468-200D-1F468-200D-1F466",["man-man-boy","family_man_man_boy","home","parents","people","human","children"]],["1F468-200D-1F468-200D-1F467",["man-man-girl","family_man_man_girl","home","parents","people","human","children"]],["1F468-200D-1F468-200D-1F467-200D-1F466",["man-man-girl-boy","family_man_man_girl_boy","home","parents","people","human","children"]],["1F468-200D-1F468-200D-1F466-200D-1F466",["man-man-boy-boy","family_man_man_boy_boy","home","parents","people","human","children"]],["1F468-200D-1F468-200D-1F467-200D-1F467",["man-man-girl-girl","family_man_man_girl_girl","home","parents","people","human","children"]],["1F469-200D-1F469-200D-1F466",["woman-woman-boy","family_woman_woman_boy","home","parents","people","human","children"]],["1F469-200D-1F469-200D-1F467",["woman-woman-girl","family_woman_woman_girl","home","parents","people","human","children"]],["1F469-200D-1F469-200D-1F467-200D-1F466",["woman-woman-girl-boy","family_woman_woman_girl_boy","home","parents","people","human","children"]],["1F469-200D-1F469-200D-1F466-200D-1F466",["woman-woman-boy-boy","family_woman_woman_boy_boy","home","parents","people","human","children"]],["1F469-200D-1F469-200D-1F467-200D-1F467",["woman-woman-girl-girl","family_woman_woman_girl_girl","home","parents","people","human","children"]],["1F468-200D-1F466",["man-boy","family_man_boy","home","parent","people","human","child"]],["1F468-200D-1F466-200D-1F466",["man-boy-boy","family_man_boy_boy","home","parent","people","human","children"]],["1F468-200D-1F467",["man-girl","family_man_girl","home","parent","people","human","child"]],["1F468-200D-1F467-200D-1F466",["man-girl-boy","family_man_girl_boy","home","parent","people","human","children"]],["1F468-200D-1F467-200D-1F467",["man-girl-girl","family_man_girl_girl","home","parent","people","human","children"]],["1F469-200D-1F466",["woman-boy","family_woman_boy","home","parent","people","human","child"]],["1F469-200D-1F466-200D-1F466",["woman-boy-boy","family_woman_boy_boy","home","parent","people","human","children"]],["1F469-200D-1F467",["woman-girl","family_woman_girl","home","parent","people","human","child"]],["1F469-200D-1F467-200D-1F466",["woman-girl-boy","family_woman_girl_boy","home","parent","people","human","children"]],["1F469-200D-1F467-200D-1F467",["woman-girl-girl","family_woman_girl_girl","home","parent","people","human","children"]],["1F5E3-FE0F",["speaking_head_in_silhouette","speaking_head","user","person","human","sing","say","talk"]],["1F464",["bust_in_silhouette","user","person","human"]],["1F465",["busts_in_silhouette","user","person","human","group","team"]],["1FAC2",["people_hugging","people hugging","care"]],["1F463",["footprints","feet","tracking","walking","beach"]]],["nature",["Animals & Nature"]],[["1F435",["monkey_face","animal","nature","circus"]],["1F412",["monkey","animal","nature","banana","circus"]],["1F98D",["gorilla","animal","nature","circus"]],["1F9A7",["orangutan","animal"]],["1F436",["dog","dog_face","animal","friend","nature","woof","puppy","pet","faithful"]],["1F415",["dog2","dog","animal","nature","friend","doge","pet","faithful"]],["1F9AE",["guide_dog","animal","blind"]],["1F415-200D-1F9BA",["service_dog","blind","animal"]],["1F429",["poodle","dog","animal","101","nature","pet"]],["1F43A",["wolf","animal","nature","wild"]],["1F98A",["fox_face","fox","animal","nature","face"]],["1F99D",["raccoon","animal","nature"]],["1F431",["cat","cat_face","animal","meow","nature","pet","kitten"]],["1F408",["cat2","cat","animal","meow","pet","cats"]],["1F408-200D-2B1B",["black_cat","black cat","superstition","luck"]],["1F981",["lion_face","lion","animal","nature"]],["1F42F",["tiger","tiger_face","animal","cat","danger","wild","nature","roar"]],["1F405",["tiger2","tiger","animal","nature","roar"]],["1F406",["leopard","animal","nature"]],["1F434",["horse","horse_face","animal","brown","nature"]],["1F40E",["racehorse","horse","animal","gamble","luck"]],["1F984",["unicorn_face","unicorn","animal","nature","mystical"]],["1F993",["zebra_face","zebra","animal","nature","stripes","safari"]],["1F98C",["deer","animal","nature","horns","venison"]],["1F9AC",["bison","ox"]],["1F42E",["cow","cow_face","beef","ox","animal","nature","moo","milk"]],["1F402",["ox","animal","cow","beef"]],["1F403",["water_buffalo","animal","nature","ox","cow"]],["1F404",["cow2","cow","beef","ox","animal","nature","moo","milk"]],["1F437",["pig","pig_face","animal","oink","nature"]],["1F416",["pig2","pig","animal","nature"]],["1F417",["boar","animal","nature"]],["1F43D",["pig_nose","animal","oink"]],["1F40F",["ram","animal","sheep","nature"]],["1F411",["sheep","ewe","animal","nature","wool","shipit"]],["1F410",["goat","animal","nature"]],["1F42A",["dromedary_camel","camel","animal","hot","desert","hump"]],["1F42B",["camel","two_hump_camel","animal","nature","hot","desert","hump"]],["1F999",["llama","animal","nature","alpaca"]],["1F992",["giraffe_face","giraffe","animal","nature","spots","safari"]],["1F418",["elephant","animal","nature","nose","th","circus"]],["1F9A3",["mammoth","elephant","tusks"]],["1F98F",["rhinoceros","animal","nature","horn"]],["1F99B",["hippopotamus","animal","nature"]],["1F42D",["mouse","mouse_face","animal","nature","cheese_wedge","rodent"]],["1F401",["mouse2","mouse","animal","nature","rodent"]],["1F400",["rat","animal","mouse","rodent"]],["1F439",["hamster","animal","nature"]],["1F430",["rabbit","rabbit_face","animal","nature","pet","spring","magic","bunny"]],["1F407",["rabbit2","rabbit","animal","nature","pet","magic","spring"]],["1F43F-FE0F",["chipmunk","animal","nature","rodent","squirrel"]],["1F9AB",["beaver","animal","rodent"]],["1F994",["hedgehog","animal","nature","spiny"]],["1F987",["bat","animal","nature","blind","vampire"]],["1F43B",["bear","animal","nature","wild"]],["1F43B-200D-2744-FE0F",["polar_bear","polar bear","animal","arctic"]],["1F428",["koala","animal","nature"]],["1F43C",["panda_face","panda","animal","nature"]],["1F9A5",["sloth","animal"]],["1F9A6",["otter","animal"]],["1F9A8",["skunk","animal"]],["1F998",["kangaroo","animal","nature","australia","joey","hop","marsupial"]],["1F9A1",["badger","animal","nature","honey"]],["1F43E",["feet","paw_prints","animal","tracking","footprints","dog","cat","pet"]],["1F983",["turkey","animal","bird"]],["1F414",["chicken","animal","cluck","nature","bird"]],["1F413",["rooster","animal","nature","chicken"]],["1F423",["hatching_chick","animal","chicken","egg","born","baby","bird"]],["1F424",["baby_chick","animal","chicken","bird"]],["1F425",["hatched_chick","front_facing_baby_chick","animal","chicken","baby","bird"]],["1F426",["bird","animal","nature","fly","tweet","spring"]],["1F427",["penguin","animal","nature"]],["1F54A-FE0F",["dove_of_peace","dove","animal","bird"]],["1F985",["eagle","animal","nature","bird"]],["1F986",["duck","animal","nature","bird","mallard"]],["1F9A2",["swan","animal","nature","bird"]],["1F989",["owl","animal","nature","bird","hoot"]],["1F9A4",["dodo","animal","bird"]],["1FAB6",["feather","bird","fly"]],["1F9A9",["flamingo","animal"]],["1F99A",["peacock","animal","nature","peahen","bird"]],["1F99C",["parrot","animal","nature","bird","pirate","talk"]],["1F438",["frog","animal","nature","croak","toad"]],["1F40A",["crocodile","animal","nature","reptile","lizard","alligator"]],["1F422",["turtle","animal","slow","nature","tortoise"]],["1F98E",["lizard","animal","nature","reptile"]],["1F40D",["snake","animal","evil","nature","hiss","python"]],["1F432",["dragon_face","animal","myth","nature","chinese","green"]],["1F409",["dragon","animal","myth","nature","chinese","green"]],["1F995",["sauropod","animal","nature","dinosaur","brachiosaurus","brontosaurus","diplodocus","extinct"]],["1F996",["t-rex","t_rex","animal","nature","dinosaur","tyrannosaurus","extinct"]],["1F433",["whale","spouting_whale","animal","nature","sea","ocean"]],["1F40B",["whale2","whale","animal","nature","sea","ocean"]],["1F42C",["dolphin","animal","nature","fish","sea","ocean","flipper","fins","beach"]],["1F9AD",["seal","animal","creature","sea"]],["1F41F",["fish","animal","food","nature"]],["1F420",["tropical_fish","animal","swim","ocean","beach","nemo"]],["1F421",["blowfish","animal","nature","food","sea","ocean"]],["1F988",["shark","animal","nature","fish","sea","ocean","jaws","fins","beach"]],["1F419",["octopus","animal","creature","ocean","sea","nature","beach"]],["1F41A",["shell","spiral_shell","nature","sea","beach"]],["1F40C",["snail","slow","animal","shell"]],["1F98B",["butterfly","animal","insect","nature","caterpillar"]],["1F41B",["bug","animal","insect","nature","worm"]],["1F41C",["ant","animal","insect","nature","bug"]],["1F41D",["bee","honeybee","animal","insect","nature","bug","spring","honey"]],["1FAB2",["beetle","insect"]],["1F41E",["ladybug","lady_beetle","animal","insect","nature"]],["1F997",["cricket","animal","chirp"]],["1FAB3",["cockroach","insect","pests"]],["1F577-FE0F",["spider","animal","arachnid"]],["1F578-FE0F",["spider_web","animal","insect","arachnid","silk"]],["1F982",["scorpion","animal","arachnid"]],["1F99F",["mosquito","animal","nature","insect","malaria"]],["1FAB0",["fly","insect"]],["1FAB1",["worm","animal"]],["1F9A0",["microbe","amoeba","bacteria","germs"]],["1F490",["bouquet","flowers","nature","spring"]],["1F338",["cherry_blossom","nature","plant","spring","flower"]],["1F4AE",["white_flower","japanese","spring"]],["1F3F5-FE0F",["rosette","flower","decoration","military"]],["1F339",["rose","flowers","valentines","love","spring"]],["1F940",["wilted_flower","plant","nature","flower"]],["1F33A",["hibiscus","plant","vegetable","flowers","beach"]],["1F33B",["sunflower","nature","plant","fall"]],["1F33C",["blossom","nature","flowers","yellow"]],["1F337",["tulip","flowers","plant","nature","summer","spring"]],["1F331",["seedling","plant","nature","grass","lawn","spring"]],["1FAB4",["potted_plant","potted plant","greenery","house"]],["1F332",["evergreen_tree","plant","nature"]],["1F333",["deciduous_tree","plant","nature"]],["1F334",["palm_tree","plant","vegetable","nature","summer","beach","mojito","tropical"]],["1F335",["cactus","vegetable","plant","nature"]],["1F33E",["ear_of_rice","sheaf_of_rice","nature","plant"]],["1F33F",["herb","vegetable","plant","medicine","weed","grass","lawn"]],["2618-FE0F",["shamrock","vegetable","plant","nature","irish","clover"]],["1F340",["four_leaf_clover","vegetable","plant","nature","lucky","irish"]],["1F341",["maple_leaf","nature","plant","vegetable","ca","fall"]],["1F342",["fallen_leaf","nature","plant","vegetable","leaves"]],["1F343",["leaves","leaf_fluttering_in_wind","nature","plant","tree","vegetable","grass","lawn","spring"]]],["foods",["Food & Drink"]],[["1F347",["grapes","fruit","food","wine"]],["1F348",["melon","fruit","nature","food"]],["1F349",["watermelon","fruit","food","picnic","summer"]],["1F34A",["tangerine","food","fruit","nature","orange"]],["1F34B",["lemon","fruit","nature"]],["1F34C",["banana","fruit","food","monkey"]],["1F34D",["pineapple","fruit","nature","food"]],["1F96D",["mango","fruit","food","tropical"]],["1F34E",["apple","red_apple","fruit","mac","school"]],["1F34F",["green_apple","fruit","nature"]],["1F350",["pear","fruit","nature","food"]],["1F351",["peach","fruit","nature","food"]],["1F352",["cherries","food","fruit"]],["1F353",["strawberry","fruit","food","nature"]],["1FAD0",["blueberries","fruit"]],["1F95D",["kiwifruit","kiwi_fruit","fruit","food"]],["1F345",["tomato","fruit","vegetable","nature","food"]],["1FAD2",["olive","fruit"]],["1F965",["coconut","fruit","nature","food","palm"]],["1F951",["avocado","fruit","food"]],["1F346",["eggplant","vegetable","nature","food","aubergine"]],["1F954",["potato","food","tuber","vegatable","starch"]],["1F955",["carrot","vegetable","food","orange"]],["1F33D",["corn","ear_of_corn","food","vegetable","plant"]],["1F336-FE0F",["hot_pepper","food","spicy","chilli","chili"]],["1FAD1",["bell_pepper","bell pepper","fruit","plant"]],["1F952",["cucumber","fruit","food","pickle"]],["1F96C",["leafy_green","food","vegetable","plant","bok choy","cabbage","kale","lettuce"]],["1F966",["broccoli","fruit","food","vegetable"]],["1F9C4",["garlic","food","spice","cook"]],["1F9C5",["onion","cook","food","spice"]],["1F344",["mushroom","plant","vegetable"]],["1F95C",["peanuts","food","nut"]],["1F330",["chestnut","food","squirrel"]],["1F35E",["bread","food","wheat","breakfast","toast"]],["1F950",["croissant","food","bread","french"]],["1F956",["baguette_bread","food","bread","french"]],["1FAD3",["flatbread","flour","food"]],["1F968",["pretzel","food","bread","twisted"]],["1F96F",["bagel","food","bread","bakery","schmear"]],["1F95E",["pancakes","food","breakfast","flapjacks","hotcakes"]],["1F9C7",["waffle","food","breakfast"]],["1F9C0",["cheese_wedge","food","chadder"]],["1F356",["meat_on_bone","good","food","drumstick"]],["1F357",["poultry_leg","food","meat","drumstick","bird","chicken","turkey"]],["1F969",["cut_of_meat","food","cow","meat","cut","chop","lambchop","porkchop"]],["1F953",["bacon","food","breakfast","pork","pig","meat"]],["1F354",["hamburger","meat","fast food","beef","cheeseburger","mcdonalds","burger king"]],["1F35F",["fries","french_fries","chips","snack","fast food"]],["1F355",["pizza","food","party"]],["1F32D",["hotdog","hot_dog","food","frankfurter"]],["1F96A",["sandwich","food","lunch","bread"]],["1F32E",["taco","food","mexican"]],["1F32F",["burrito","food","mexican"]],["1FAD4",["tamale","food","masa"]],["1F959",["stuffed_flatbread","food","flatbread","stuffed","gyro"]],["1F9C6",["falafel","food"]],["1F95A",["egg","food","chicken","breakfast"]],["1F373",["fried_egg","cooking","food","breakfast","kitchen","egg"]],["1F958",["shallow_pan_of_food","food","cooking","casserole","paella"]],["1F372",["stew","pot_of_food","food","meat","soup"]],["1FAD5",["fondue","cheese","pot","food"]],["1F963",["bowl_with_spoon","food","breakfast","cereal","oatmeal","porridge"]],["1F957",["green_salad","food","healthy","lettuce"]],["1F37F",["popcorn","food","movie theater","films","snack"]],["1F9C8",["butter","food","cook"]],["1F9C2",["salt","condiment","shaker"]],["1F96B",["canned_food","food","soup"]],["1F371",["bento","bento_box","food","japanese","box"]],["1F358",["rice_cracker","food","japanese"]],["1F359",["rice_ball","food","japanese"]],["1F35A",["rice","cooked_rice","food","china","asian"]],["1F35B",["curry","curry_rice","food","spicy","hot","indian"]],["1F35C",["ramen","steaming_bowl","food","japanese","noodle","chopsticks"]],["1F35D",["spaghetti","food","italian","noodle"]],["1F360",["sweet_potato","roasted_sweet_potato","food","nature"]],["1F362",["oden","food","japanese"]],["1F363",["sushi","food","fish","japanese","rice"]],["1F364",["fried_shrimp","food","animal","appetizer","summer"]],["1F365",["fish_cake","fish_cake_with_swirl","food","japan","sea","beach","narutomaki","pink","swirl","kamaboko","surimi","ramen"]],["1F96E",["moon_cake","food","autumn"]],["1F361",["dango","food","dessert","sweet","japanese","barbecue","meat"]],["1F95F",["dumpling","food","empanada","pierogi","potsticker"]],["1F960",["fortune_cookie","food","prophecy"]],["1F961",["takeout_box","food","leftovers"]],["1F980",["crab","animal","crustacean"]],["1F99E",["lobster","animal","nature","bisque","claws","seafood"]],["1F990",["shrimp","animal","ocean","nature","seafood"]],["1F991",["squid","animal","nature","ocean","sea"]],["1F9AA",["oyster","food"]],["1F366",["icecream","soft_ice_cream","food","hot","dessert","summer"]],["1F367",["shaved_ice","hot","dessert","summer"]],["1F368",["ice_cream","food","hot","dessert"]],["1F369",["doughnut","food","dessert","snack","sweet","donut"]],["1F36A",["cookie","food","snack","oreo","chocolate","sweet","dessert"]],["1F382",["birthday","birthday_cake","food","dessert","cake"]],["1F370",["cake","shortcake","food","dessert"]],["1F9C1",["cupcake","food","dessert","bakery","sweet"]],["1F967",["pie","food","dessert","pastry"]],["1F36B",["chocolate_bar","food","snack","dessert","sweet"]],["1F36C",["candy","snack","dessert","sweet","lolly"]],["1F36D",["lollipop","food","snack","candy","sweet"]],["1F36E",["custard","dessert","food"]],["1F36F",["honey_pot","bees","sweet","kitchen"]],["1F37C",["baby_bottle","food","container","milk"]],["1F95B",["glass_of_milk","beverage","drink","cow"]],["2615",["coffee","hot_beverage","beverage","caffeine","latte","espresso"]],["1FAD6",["teapot","drink","hot"]],["1F375",["tea","teacup_without_handle","drink","bowl","breakfast","green","british"]],["1F376",["sake","wine","drink","drunk","beverage","japanese","alcohol","booze"]],["1F37E",["champagne","bottle_with_popping_cork","drink","wine","bottle","celebration"]],["1F377",["wine_glass","drink","beverage","drunk","alcohol","booze"]],["1F378",["cocktail","cocktail_glass","drink","drunk","alcohol","beverage","booze","mojito"]],["1F379",["tropical_drink","beverage","cocktail","summer","beach","alcohol","booze","mojito"]],["1F37A",["beer","beer_mug","relax","beverage","drink","drunk","party","pub","summer","alcohol","booze"]],["1F37B",["beers","clinking_beer_mugs","relax","beverage","drink","drunk","party","pub","summer","alcohol","booze"]],["1F942",["clinking_glasses","beverage","drink","party","alcohol","celebrate","cheers","wine","champagne","toast"]],["1F943",["tumbler_glass","drink","beverage","drunk","alcohol","liquor","booze","bourbon","scotch","whisky","glass","shot"]],["1F964",["cup_with_straw","drink","soda"]],["1F9CB",["bubble_tea","bubble tea","taiwan","boba","milk tea","straw"]],["1F9C3",["beverage_box","drink"]],["1F9C9",["mate_drink","mate","drink","tea","beverage"]],["1F9CA",["ice_cube","ice","water","cold"]],["1F962",["chopsticks","food"]],["1F37D-FE0F",["knife_fork_plate","fork_and_knife_with_plate","food","eat","meal","lunch","dinner","restaurant"]],["1F374",["fork_and_knife","cutlery","kitchen"]],["1F944",["spoon","cutlery","kitchen","tableware"]],["1F52A",["hocho","kitchen_knife","knife","blade","cutlery","kitchen","weapon"]],["1F3FA",["amphora","vase","jar"]]],["activity",["Activities"]],[["1F383",["jack_o_lantern","halloween","light","pumpkin","creepy","fall"]],["1F384",["christmas_tree","festival","vacation","december","xmas","celebration"]],["1F386",["fireworks","photo","festival","carnival","congratulations"]],["1F387",["sparkler","stars","night","shine"]],["1F9E8",["firecracker","dynamite","boom","explode","explosion","explosive"]],["2728",["sparkles","stars","shine","shiny","cool","awesome","good","magic"]],["1F388",["balloon","party","celebration","birthday","circus"]],["1F389",["tada","party_popper","party","congratulations","birthday","magic","circus","celebration"]],["1F38A",["confetti_ball","festival","party","birthday","circus"]],["1F38B",["tanabata_tree","plant","nature","branch","summer"]],["1F38D",["bamboo","pine_decoration","plant","nature","vegetable","panda"]],["1F38E",["dolls","japanese_dolls","japanese","toy","kimono"]],["1F38F",["flags","carp_streamer","fish","japanese","koinobori","carp","banner"]],["1F390",["wind_chime","nature","ding","spring","bell"]],["1F391",["rice_scene","moon_viewing_ceremony","photo","japan","asia","tsukimi"]],["1F9E7",["red_envelope","gift"]],["1F380",["ribbon","decoration","pink","girl","bowtie"]],["1F381",["gift","wrapped_gift","present","birthday","christmas","xmas"]],["1F397-FE0F",["reminder_ribbon","sports","cause","support","awareness"]],["1F39F-FE0F",["admission_tickets","sports","concert","entrance"]],["1F3AB",["ticket","event","concert","pass"]],["1F396-FE0F",["medal","military_medal","award","winning","army"]],["1F3C6",["trophy","win","award","contest","place","ftw","ceremony"]],["1F3C5",["sports_medal","award","winning"]],["1F947",["first_place_medal","1st_place_medal","award","winning","first"]],["1F948",["second_place_medal","2nd_place_medal","award","second"]],["1F949",["third_place_medal","3rd_place_medal","award","third"]],["26BD",["soccer","soccer_ball","sports","football"]],["26BE",["baseball","sports","balls"]],["1F94E",["softball","sports","balls"]],["1F3C0",["basketball","sports","balls","NBA"]],["1F3D0",["volleyball","sports","balls"]],["1F3C8",["football","american_football","sports","balls","NFL"]],["1F3C9",["rugby_football","sports","team"]],["1F3BE",["tennis","sports","balls","green"]],["1F94F",["flying_disc","sports","frisbee","ultimate"]],["1F3B3",["bowling","sports","fun","play"]],["1F3CF",["cricket_bat_and_ball","cricket_game","sports"]],["1F3D1",["field_hockey_stick_and_ball","field_hockey","sports"]],["1F3D2",["ice_hockey_stick_and_puck","ice_hockey","sports"]],["1F94D",["lacrosse","sports","ball","stick"]],["1F3D3",["table_tennis_paddle_and_ball","ping_pong","sports","pingpong"]],["1F3F8",["badminton_racquet_and_shuttlecock","badminton","sports"]],["1F94A",["boxing_glove","sports","fighting"]],["1F94B",["martial_arts_uniform","judo","karate","taekwondo"]],["1F945",["goal_net","sports"]],["26F3",["golf","flag_in_hole","sports","business","flag","hole","summer"]],["26F8-FE0F",["ice_skate","sports"]],["1F3A3",["fishing_pole_and_fish","fishing_pole","food","hobby","summer"]],["1F93F",["diving_mask","sport","ocean"]],["1F3BD",["running_shirt_with_sash","running_shirt","play","pageant"]],["1F3BF",["ski","skis","sports","winter","cold","snow"]],["1F6F7",["sled","sleigh","luge","toboggan"]],["1F94C",["curling_stone","sports"]],["1F3AF",["dart","direct_hit","game","play","bar","target","bullseye"]],["1FA80",["yo-yo","yo_yo","toy"]],["1FA81",["kite","wind","fly"]],["1F3B1",["8ball","pool_8_ball","pool","hobby","game","luck","magic"]],["1F52E",["crystal_ball","disco","party","magic","circus","fortune_teller"]],["1FA84",["magic_wand","magic wand","supernature","power"]],["1F9FF",["nazar_amulet","bead","charm"]],["1F3AE",["video_game","play","console","PS4","controller"]],["1F579-FE0F",["joystick","game","play"]],["1F3B0",["slot_machine","bet","gamble","vegas","fruit machine","luck","casino"]],["1F3B2",["game_die","dice","random","tabletop","play","luck"]],["1F9E9",["jigsaw","puzzle_piece","interlocking","puzzle","piece"]],["1F9F8",["teddy_bear","plush","stuffed"]],["1FA85",["pinata","mexico","candy","celebration"]],["1FA86",["nesting_dolls","nesting dolls","matryoshka","toy"]],["2660-FE0F",["spades","spade_suit","poker","cards","suits","magic"]],["2665-FE0F",["hearts","heart_suit","poker","cards","magic","suits"]],["2666-FE0F",["diamonds","diamond_suit","poker","cards","magic","suits"]],["2663-FE0F",["clubs","club_suit","poker","cards","magic","suits"]],["265F-FE0F",["chess_pawn","expendable"]],["1F0CF",["black_joker","joker","poker","cards","game","play","magic"]],["1F004",["mahjong","mahjong_red_dragon","game","play","chinese","kanji"]],["1F3B4",["flower_playing_cards","game","sunset","red"]],["1F3AD",["performing_arts","acting","theater","drama"]],["1F5BC-FE0F",["frame_with_picture","framed_picture","photography"]],["1F3A8",["art","artist_palette","design","paint","draw","colors"]],["1F9F5",["thread","needle","sewing","spool","string"]],["1FAA1",["sewing_needle","sewing needle","stitches"]],["1F9F6",["yarn","ball","crochet","knit"]],["1FAA2",["knot","rope","scout"]]],["places",["Travel & Places"]],[["1F30D",["earth_africa","globe_showing_europe_africa","globe","world","international"]],["1F30E",["earth_americas","globe_showing_americas","globe","world","USA","international"]],["1F30F",["earth_asia","globe_showing_asia_australia","globe","world","east","international"]],["1F310",["globe_with_meridians","earth","international","world","internet","interweb","i18n"]],["1F5FA-FE0F",["world_map","location","direction"]],["1F5FE",["japan","map_of_japan","nation","country","japanese","asia"]],["1F9ED",["compass","magnetic","navigation","orienteering"]],["1F3D4-FE0F",["snow_capped_mountain","photo","nature","environment","winter","cold"]],["26F0-FE0F",["mountain","photo","nature","environment"]],["1F30B",["volcano","photo","nature","disaster"]],["1F5FB",["mount_fuji","photo","mountain","nature","japanese"]],["1F3D5-FE0F",["camping","photo","outdoors","tent"]],["1F3D6-FE0F",["beach_with_umbrella","weather","summer","sunny","sand","mojito"]],["1F3DC-FE0F",["desert","photo","warm","saharah"]],["1F3DD-FE0F",["desert_island","photo","tropical","mojito"]],["1F3DE-FE0F",["national_park","photo","environment","nature"]],["1F3DF-FE0F",["stadium","photo","place","sports","concert","venue"]],["1F3DB-FE0F",["classical_building","art","culture","history"]],["1F3D7-FE0F",["building_construction","wip","working","progress"]],["1F9F1",["bricks","brick"]],["1FAA8",["rock","stone"]],["1FAB5",["wood","nature","timber","trunk"]],["1F6D6",["hut","house","structure"]],["1F3D8-FE0F",["house_buildings","houses","buildings","photo"]],["1F3DA-FE0F",["derelict_house_building","derelict_house","abandon","evict","broken","building"]],["1F3E0",["house","building","home"]],["1F3E1",["house_with_garden","home","plant","nature"]],["1F3E2",["office","office_building","building","bureau","work"]],["1F3E3",["post_office","japanese_post_office","building","envelope","communication"]],["1F3E4",["european_post_office","post_office","building","email"]],["1F3E5",["hospital","building","health","surgery","doctor"]],["1F3E6",["bank","building","money","sales","cash","business","enterprise"]],["1F3E8",["hotel","building","accomodation","checkin"]],["1F3E9",["love_hotel","like","affection","dating"]],["1F3EA",["convenience_store","building","shopping","groceries"]],["1F3EB",["school","building","student","education","learn","teach"]],["1F3EC",["department_store","building","shopping","mall"]],["1F3ED",["factory","building","industry","pollution","smoke"]],["1F3EF",["japanese_castle","photo","building"]],["1F3F0",["european_castle","castle","building","royalty","history"]],["1F492",["wedding","love","like","affection","couple","marriage","bride","groom"]],["1F5FC",["tokyo_tower","photo","japanese"]],["1F5FD",["statue_of_liberty","american","newyork"]],["26EA",["church","building","religion","christ"]],["1F54C",["mosque","islam","worship","minaret"]],["1F6D5",["hindu_temple","religion"]],["1F54D",["synagogue","judaism","worship","temple","jewish"]],["26E9-FE0F",["shinto_shrine","temple","japan","kyoto"]],["1F54B",["kaaba","mecca","mosque","islam"]],["26F2",["fountain","photo","summer","water","fresh"]],["26FA",["tent","photo","camping","outdoors"]],["1F301",["foggy","photo","mountain"]],["1F303",["night_with_stars","evening","city","downtown"]],["1F3D9-FE0F",["cityscape","photo","night life","urban"]],["1F304",["sunrise_over_mountains","view","vacation","photo"]],["1F305",["sunrise","morning","view","vacation","photo"]],["1F306",["city_sunset","cityscape_at_dusk","photo","evening","sky","buildings"]],["1F307",["city_sunrise","sunset","photo","good morning","dawn"]],["1F309",["bridge_at_night","photo","sanfrancisco"]],["2668-FE0F",["hotsprings","hot_springs","bath","warm","relax"]],["1F3A0",["carousel_horse","photo","carnival"]],["1F3A1",["ferris_wheel","photo","carnival","londoneye"]],["1F3A2",["roller_coaster","carnival","playground","photo","fun"]],["1F488",["barber","barber_pole","hair","salon","style"]],["1F3AA",["circus_tent","festival","carnival","party"]],["1F682",["steam_locomotive","locomotive","transportation","vehicle","train"]],["1F683",["railway_car","transportation","vehicle"]],["1F684",["bullettrain_side","high_speed_train","transportation","vehicle"]],["1F685",["bullettrain_front","bullet_train","transportation","vehicle","speed","fast","public","travel"]],["1F686",["train2","train","transportation","vehicle"]],["1F687",["metro","transportation","blue-square","mrt","underground","tube"]],["1F688",["light_rail","transportation","vehicle"]],["1F689",["station","transportation","vehicle","public"]],["1F68A",["tram","transportation","vehicle"]],["1F69D",["monorail","transportation","vehicle"]],["1F69E",["mountain_railway","transportation","vehicle"]],["1F68B",["train","tram_car","transportation","vehicle","carriage","public","travel"]],["1F68C",["bus","car","vehicle","transportation"]],["1F68D",["oncoming_bus","vehicle","transportation"]],["1F68E",["trolleybus","bart","transportation","vehicle"]],["1F690",["minibus","vehicle","car","transportation"]],["1F691",["ambulance","health","911","hospital"]],["1F692",["fire_engine","transportation","cars","vehicle"]],["1F693",["police_car","vehicle","cars","transportation","law","legal","enforcement"]],["1F694",["oncoming_police_car","vehicle","law","legal","enforcement","911"]],["1F695",["taxi","uber","vehicle","cars","transportation"]],["1F696",["oncoming_taxi","vehicle","cars","uber"]],["1F697",["car","automobile","red","transportation","vehicle"]],["1F698",["oncoming_automobile","car","vehicle","transportation"]],["1F699",["blue_car","sport_utility_vehicle","transportation","vehicle"]],["1F6FB",["pickup_truck","pickup truck","car","transportation"]],["1F69A",["truck","delivery_truck","cars","transportation"]],["1F69B",["articulated_lorry","vehicle","cars","transportation","express"]],["1F69C",["tractor","vehicle","car","farming","agriculture"]],["1F3CE-FE0F",["racing_car","sports","race","fast","formula","f1"]],["1F3CD-FE0F",["racing_motorcycle","motorcycle","race","sports","fast"]],["1F6F5",["motor_scooter","vehicle","vespa","sasha"]],["1F9BD",["manual_wheelchair","accessibility"]],["1F9BC",["motorized_wheelchair","accessibility"]],["1F6FA",["auto_rickshaw","move","transportation"]],["1F6B2",["bike","bicycle","sports","exercise","hipster"]],["1F6F4",["scooter","kick_scooter","vehicle","kick","razor"]],["1F6F9",["skateboard","board"]],["1F6FC",["roller_skate","roller skate","footwear","sports"]],["1F68F",["busstop","bus_stop","transportation","wait"]],["1F6E3-FE0F",["motorway","road","cupertino","interstate","highway"]],["1F6E4-FE0F",["railway_track","train","transportation"]],["1F6E2-FE0F",["oil_drum","barrell"]],["26FD",["fuelpump","fuel_pump","gas station","petroleum"]],["1F6A8",["rotating_light","police_car_light","police","ambulance","911","emergency","alert","error","pinged","law","legal"]],["1F6A5",["traffic_light","horizontal_traffic_light","transportation","signal"]],["1F6A6",["vertical_traffic_light","transportation","driving"]],["1F6D1",["octagonal_sign","stop_sign","stop"]],["1F6A7",["construction","wip","progress","caution","warning"]],["2693",["anchor","ship","ferry","sea","boat"]],["26F5",["boat","sailboat","ship","summer","transportation","water","sailing"]],["1F6F6",["canoe","boat","paddle","water","ship"]],["1F6A4",["speedboat","ship","transportation","vehicle","summer"]],["1F6F3-FE0F",["passenger_ship","yacht","cruise","ferry"]],["26F4-FE0F",["ferry","boat","ship","yacht"]],["1F6E5-FE0F",["motor_boat","ship"]],["1F6A2",["ship","transportation","titanic","deploy"]],["2708-FE0F",["airplane","vehicle","transportation","flight","fly"]],["1F6E9-FE0F",["small_airplane","flight","transportation","fly","vehicle"]],["1F6EB",["airplane_departure","airport","flight","landing"]],["1F6EC",["airplane_arriving","airplane_arrival","airport","flight","boarding"]],["1FA82",["parachute","fly","glide"]],["1F4BA",["seat","sit","airplane","transport","bus","flight","fly"]],["1F681",["helicopter","transportation","vehicle","fly"]],["1F69F",["suspension_railway","vehicle","transportation"]],["1F6A0",["mountain_cableway","transportation","vehicle","ski"]],["1F6A1",["aerial_tramway","transportation","vehicle","ski"]],["1F6F0-FE0F",["satellite","communication","gps","orbit","spaceflight","NASA","ISS"]],["1F680",["rocket","launch","ship","staffmode","NASA","outer space","outer_space","fly"]],["1F6F8",["flying_saucer","transportation","vehicle","ufo"]],["1F6CE-FE0F",["bellhop_bell","service"]],["1F9F3",["luggage","packing","travel"]],["231B",["hourglass","hourglass_done","time","clock","oldschool","limit","exam","quiz","test"]],["23F3",["hourglass_flowing_sand","hourglass_not_done","oldschool","time","countdown"]],["231A",["watch","time","accessories"]],["23F0",["alarm_clock","time","wake"]],["23F1-FE0F",["stopwatch","time","deadline"]],["23F2-FE0F",["timer_clock","alarm"]],["1F570-FE0F",["mantelpiece_clock","time"]],["1F55B",["clock12","twelve_o_clock","time","noon","midnight","midday","late","early","schedule"]],["1F567",["clock1230","twelve_thirty","time","late","early","schedule"]],["1F550",["clock1","one_o_clock","time","late","early","schedule"]],["1F55C",["clock130","one_thirty","time","late","early","schedule"]],["1F551",["clock2","two_o_clock","time","late","early","schedule"]],["1F55D",["clock230","two_thirty","time","late","early","schedule"]],["1F552",["clock3","three_o_clock","time","late","early","schedule"]],["1F55E",["clock330","three_thirty","time","late","early","schedule"]],["1F553",["clock4","four_o_clock","time","late","early","schedule"]],["1F55F",["clock430","four_thirty","time","late","early","schedule"]],["1F554",["clock5","five_o_clock","time","late","early","schedule"]],["1F560",["clock530","five_thirty","time","late","early","schedule"]],["1F555",["clock6","six_o_clock","time","late","early","schedule","dawn","dusk"]],["1F561",["clock630","six_thirty","time","late","early","schedule"]],["1F556",["clock7","seven_o_clock","time","late","early","schedule"]],["1F562",["clock730","seven_thirty","time","late","early","schedule"]],["1F557",["clock8","eight_o_clock","time","late","early","schedule"]],["1F563",["clock830","eight_thirty","time","late","early","schedule"]],["1F558",["clock9","nine_o_clock","time","late","early","schedule"]],["1F564",["clock930","nine_thirty","time","late","early","schedule"]],["1F559",["clock10","ten_o_clock","time","late","early","schedule"]],["1F565",["clock1030","ten_thirty","time","late","early","schedule"]],["1F55A",["clock11","eleven_o_clock","time","late","early","schedule"]],["1F566",["clock1130","eleven_thirty","time","late","early","schedule"]],["1F311",["new_moon","nature","twilight","planet","space","night","evening","sleep"]],["1F312",["waxing_crescent_moon","nature","twilight","planet","space","night","evening","sleep"]],["1F313",["first_quarter_moon","nature","twilight","planet","space","night","evening","sleep"]],["1F314",["moon","waxing_gibbous_moon","nature","night","sky","gray","twilight","planet","space","evening","sleep"]],["1F315",["full_moon","nature","yellow","twilight","planet","space","night","evening","sleep"]],["1F316",["waning_gibbous_moon","nature","twilight","planet","space","night","evening","sleep","waxing_gibbous_moon"]],["1F317",["last_quarter_moon","nature","twilight","planet","space","night","evening","sleep"]],["1F318",["waning_crescent_moon","nature","twilight","planet","space","night","evening","sleep"]],["1F319",["crescent_moon","night","sleep","sky","evening","magic"]],["1F31A",["new_moon_with_face","new_moon_face","nature","twilight","planet","space","night","evening","sleep"]],["1F31B",["first_quarter_moon_with_face","first_quarter_moon_face","nature","twilight","planet","space","night","evening","sleep"]],["1F31C",["last_quarter_moon_with_face","last_quarter_moon_face","nature","twilight","planet","space","night","evening","sleep"]],["1F321-FE0F",["thermometer","weather","temperature","hot","cold"]],["2600-FE0F",["sunny","sun","weather","nature","brightness","summer","beach","spring"]],["1F31D",["full_moon_with_face","full_moon_face","nature","twilight","planet","space","night","evening","sleep"]],["1F31E",["sun_with_face","nature","morning","sky"]],["1FA90",["ringed_planet","outerspace"]],["2B50",["star","night","yellow"]],["1F31F",["star2","glowing_star","night","sparkle","awesome","good","magic"]],["1F320",["stars","shooting_star","night","photo"]],["1F30C",["milky_way","photo","space","stars"]],["2601-FE0F",["cloud","weather","sky"]],["26C5",["partly_sunny","sun_behind_cloud","weather","nature","cloudy","morning","fall","spring"]],["26C8-FE0F",["thunder_cloud_and_rain","cloud_with_lightning_and_rain","weather","lightning"]],["1F324-FE0F",["mostly_sunny","sun_behind_small_cloud","weather"]],["1F325-FE0F",["barely_sunny","sun_behind_large_cloud","weather"]],["1F326-FE0F",["partly_sunny_rain","sun_behind_rain_cloud","weather"]],["1F327-FE0F",["rain_cloud","cloud_with_rain","weather"]],["1F328-FE0F",["snow_cloud","cloud_with_snow","weather"]],["1F329-FE0F",["lightning","cloud_with_lightning","weather","thunder"]],["1F32A-FE0F",["tornado","weather","cyclone","twister"]],["1F32B-FE0F",["fog","weather"]],["1F32C-FE0F",["wind_blowing_face","wind_face","gust","air"]],["1F300",["cyclone","weather","swirl","blue","cloud","vortex","spiral","whirlpool","spin","tornado","hurricane","typhoon"]],["1F308",["rainbow","nature","happy","unicorn_face","photo","sky","spring"]],["1F302",["closed_umbrella","weather","rain","drizzle"]],["2602-FE0F",["umbrella","weather","spring"]],["2614",["umbrella_with_rain_drops","rainy","weather","spring"]],["26F1-FE0F",["umbrella_on_ground","weather","summer"]],["26A1",["zap","high_voltage","thunder","weather","lightning bolt","fast"]],["2744-FE0F",["snowflake","winter","season","cold","weather","christmas","xmas"]],["2603-FE0F",["snowman","winter","season","cold","weather","christmas","xmas","frozen"]],["26C4",["snowman_without_snow","winter","season","cold","weather","christmas","xmas","frozen","without_snow"]],["2604-FE0F",["comet","space"]],["1F525",["fire","hot","cook","flame"]],["1F4A7",["droplet","water","drip","faucet","spring"]],["1F30A",["ocean","water_wave","sea","water","wave","nature","tsunami","disaster"]]],["objects",["Objects"]],[["1F453",["eyeglasses","glasses","fashion","accessories","eyesight","nerdy","dork","geek"]],["1F576-FE0F",["dark_sunglasses","sunglasses","face","cool","accessories"]],["1F97D",["goggles","eyes","protection","safety"]],["1F97C",["lab_coat","doctor","experiment","scientist","chemist"]],["1F9BA",["safety_vest","protection"]],["1F454",["necktie","shirt","suitup","formal","fashion","cloth","business"]],["1F455",["shirt","t_shirt","fashion","cloth","casual","tee"]],["1F456",["jeans","fashion","shopping"]],["1F9E3",["scarf","neck","winter","clothes"]],["1F9E4",["gloves","hands","winter","clothes"]],["1F9E5",["coat","jacket"]],["1F9E6",["socks","stockings","clothes"]],["1F457",["dress","clothes","fashion","shopping"]],["1F458",["kimono","dress","fashion","women","female","japanese"]],["1F97B",["sari","dress"]],["1FA71",["one-piece_swimsuit","one_piece_swimsuit","fashion"]],["1FA72",["briefs","clothing"]],["1FA73",["shorts","clothing"]],["1F459",["bikini","swimming","female","woman","girl","fashion","beach","summer"]],["1F45A",["womans_clothes","woman_s_clothes","fashion","shopping_bags","female"]],["1F45B",["purse","fashion","accessories","money","sales","shopping"]],["1F45C",["handbag","fashion","accessory","accessories","shopping"]],["1F45D",["pouch","clutch_bag","bag","accessories","shopping"]],["1F6CD-FE0F",["shopping_bags","mall","buy","purchase"]],["1F392",["school_satchel","backpack","student","education","bag"]],["1FA74",["thong_sandal","thong sandal","footwear","summer"]],["1F45E",["mans_shoe","man_s_shoe","fashion","male"]],["1F45F",["athletic_shoe","running_shoe","shoes","sports","sneakers"]],["1F97E",["hiking_boot","backpacking","camping","hiking"]],["1F97F",["womans_flat_shoe","flat_shoe","ballet","slip-on","slipper"]],["1F460",["high_heel","high_heeled_shoe","fashion","shoes","female","pumps","stiletto"]],["1F461",["sandal","woman_s_sandal","shoes","fashion","flip flops"]],["1FA70",["ballet_shoes","dance"]],["1F462",["boot","woman_s_boot","shoes","fashion"]],["1F451",["crown","king","kod","leader","royalty","lord"]],["1F452",["womans_hat","woman_s_hat","fashion","accessories","female","lady","spring"]],["1F3A9",["tophat","top_hat","magic","gentleman","classy","circus"]],["1F393",["mortar_board","graduation_cap","school","college","degree","university","graduation","cap","hat","legal","learn","education"]],["1F9E2",["billed_cap","cap","baseball"]],["1FA96",["military_helmet","military helmet","army","protection"]],["26D1-FE0F",["helmet_with_white_cross","rescue_worker_s_helmet","construction","build"]],["1F4FF",["prayer_beads","dhikr","religious"]],["1F484",["lipstick","female","girl","fashion","woman"]],["1F48D",["ring","wedding","propose","marriage","valentines","diamond","fashion","jewelry","gem","engagement"]],["1F48E",["gem","gem_stone","blue","ruby","diamond","jewelry"]],["1F507",["mute","muted_speaker","sound","volume","silence","quiet"]],["1F508",["speaker","speaker_low_volume","sound","volume","silence","broadcast"]],["1F509",["sound","speaker_medium_volume","volume","speaker","broadcast"]],["1F50A",["loud_sound","speaker_high_volume","volume","noise","noisy","speaker","broadcast"]],["1F4E2",["loudspeaker","volume","sound"]],["1F4E3",["mega","megaphone","sound","speaker","volume"]],["1F4EF",["postal_horn","instrument","music"]],["1F514",["bell","sound","notification","christmas","xmas","chime"]],["1F515",["no_bell","bell_with_slash","sound","volume","mute","quiet","silent"]],["1F3BC",["musical_score","treble","clef","compose"]],["1F3B5",["musical_note","score","tone","sound"]],["1F3B6",["notes","musical_notes","music","score"]],["1F399-FE0F",["studio_microphone","sing","recording","artist","talkshow"]],["1F39A-FE0F",["level_slider","scale"]],["1F39B-FE0F",["control_knobs","dial"]],["1F3A4",["microphone","sound","music","PA","sing","talkshow"]],["1F3A7",["headphones","headphone","music","score","gadgets"]],["1F4FB",["radio","communication","music","podcast","program"]],["1F3B7",["saxophone","music","instrument","jazz","blues"]],["1FA97",["accordion","music"]],["1F3B8",["guitar","music","instrument"]],["1F3B9",["musical_keyboard","piano","instrument","compose"]],["1F3BA",["trumpet","music","brass"]],["1F3BB",["violin","music","instrument","orchestra","symphony"]],["1FA95",["banjo","music","instructment"]],["1F941",["drum_with_drumsticks","drum","music","instrument","drumsticks","snare"]],["1FA98",["long_drum","long drum","music"]],["1F4F1",["iphone","mobile_phone","technology","apple","gadgets","dial"]],["1F4F2",["calling","mobile_phone_with_arrow","iphone","incoming"]],["260E-FE0F",["phone","telephone","technology","communication","dial"]],["1F4DE",["telephone_receiver","technology","communication","dial"]],["1F4DF",["pager","bbcall","oldschool","90s"]],["1F4E0",["fax","fax_machine","communication","technology"]],["1F50B",["battery","power","energy","sustain"]],["1F50C",["electric_plug","charger","power"]],["1F4BB",["computer","laptop","technology","screen","display","monitor"]],["1F5A5-FE0F",["desktop_computer","technology","computing","screen"]],["1F5A8-FE0F",["printer","paper","ink"]],["2328-FE0F",["keyboard","technology","computer","type","input","text"]],["1F5B1-FE0F",["three_button_mouse","computer_mouse","click"]],["1F5B2-FE0F",["trackball","technology","trackpad"]],["1F4BD",["minidisc","computer_disk","technology","record","data","disk","90s"]],["1F4BE",["floppy_disk","oldschool","technology","save","90s","80s"]],["1F4BF",["cd","optical_disk","technology","dvd","disk","disc","90s"]],["1F4C0",["dvd","cd","disk","disc"]],["1F9EE",["abacus","calculation"]],["1F3A5",["movie_camera","film","record"]],["1F39E-FE0F",["film_frames","movie"]],["1F4FD-FE0F",["film_projector","video","tape","record","movie"]],["1F3AC",["clapper","clapper_board","movie","film","record"]],["1F4FA",["tv","television","technology","program","oldschool","show"]],["1F4F7",["camera","gadgets","photography"]],["1F4F8",["camera_with_flash","photography","gadgets"]],["1F4F9",["video_camera","film","record"]],["1F4FC",["vhs","videocassette","record","video","oldschool","90s","80s"]],["1F50D",["mag","magnifying_glass_tilted_left","search","zoom","find","detective"]],["1F50E",["mag_right","magnifying_glass_tilted_right","search","zoom","find","detective"]],["1F56F-FE0F",["candle","fire","wax"]],["1F4A1",["bulb","light_bulb","light","electricity","idea"]],["1F526",["flashlight","dark","camping","sight","night"]],["1F3EE",["izakaya_lantern","red_paper_lantern","light","paper","halloween","spooky"]],["1FA94",["diya_lamp","lighting"]],["1F4D4",["notebook_with_decorative_cover","classroom","notes","record","paper","study"]],["1F4D5",["closed_book","read","library","knowledge","textbook","learn"]],["1F4D6",["book","open_book","read","library","knowledge","literature","learn","study"]],["1F4D7",["green_book","read","library","knowledge","study"]],["1F4D8",["blue_book","read","library","knowledge","learn","study"]],["1F4D9",["orange_book","read","library","knowledge","textbook","study"]],["1F4DA",["books","literature","library","study"]],["1F4D3",["notebook","stationery","record","notes","paper","study"]],["1F4D2",["ledger","notes","paper"]],["1F4C3",["page_with_curl","documents","office","paper"]],["1F4DC",["scroll","documents","ancient","history","paper"]],["1F4C4",["page_facing_up","documents","office","paper","information"]],["1F4F0",["newspaper","press","headline"]],["1F5DE-FE0F",["rolled_up_newspaper","press","headline"]],["1F4D1",["bookmark_tabs","favorite","save","order","tidy"]],["1F516",["bookmark","favorite","label","save"]],["1F3F7-FE0F",["label","sale","tag"]],["1F4B0",["moneybag","money_bag","dollar","payment","coins","sale"]],["1FA99",["coin","money","currency"]],["1F4B4",["yen","yen_banknote","money","sales","japanese","dollar","currency"]],["1F4B5",["dollar","dollar_banknote","money","sales","bill","currency"]],["1F4B6",["euro","euro_banknote","money","sales","dollar","currency"]],["1F4B7",["pound","pound_banknote","british","sterling","money","sales","bills","uk","england","currency"]],["1F4B8",["money_with_wings","dollar","bills","payment","sale"]],["1F4B3",["credit_card","money","sales","dollar","bill","payment","shopping"]],["1F9FE",["receipt","accounting","expenses"]],["1F4B9",["chart","chart_increasing_with_yen","green-square","graph","presentation","stats"]],["2709-FE0F",["email","envelope","letter","postal","inbox","communication"]],["1F4E7",["e-mail","e_mail","communication","inbox"]],["1F4E8",["incoming_envelope","email","inbox"]],["1F4E9",["envelope_with_arrow","email","communication"]],["1F4E4",["outbox_tray","inbox","email"]],["1F4E5",["inbox_tray","email","documents"]],["1F4E6",["package","mail","gift","cardboard","box","moving"]],["1F4EB",["mailbox","closed_mailbox_with_raised_flag","email","inbox","communication"]],["1F4EA",["mailbox_closed","closed_mailbox_with_lowered_flag","email","communication","inbox"]],["1F4EC",["mailbox_with_mail","open_mailbox_with_raised_flag","email","inbox","communication"]],["1F4ED",["mailbox_with_no_mail","open_mailbox_with_lowered_flag","email","inbox"]],["1F4EE",["postbox","email","letter","envelope"]],["1F5F3-FE0F",["ballot_box_with_ballot","election","vote"]],["270F-FE0F",["pencil2","pencil","stationery","write","paper","writing","school","study"]],["2712-FE0F",["black_nib","pen","stationery","writing","write"]],["1F58B-FE0F",["lower_left_fountain_pen","fountain_pen","stationery","writing","write"]],["1F58A-FE0F",["lower_left_ballpoint_pen","pen","stationery","writing","write"]],["1F58C-FE0F",["lower_left_paintbrush","paintbrush","drawing","creativity","art"]],["1F58D-FE0F",["lower_left_crayon","crayon","drawing","creativity"]],["1F4DD",["memo","write","documents","stationery","pencil","paper","writing","legal","exam","quiz","test","study","compose"]],["1F4BC",["briefcase","business","documents","work","law","legal","job","career"]],["1F4C1",["file_folder","documents","business","office"]],["1F4C2",["open_file_folder","documents","load"]],["1F5C2-FE0F",["card_index_dividers","organizing","business","stationery"]],["1F4C5",["date","calendar","schedule"]],["1F4C6",["calendar","tear_off_calendar","schedule","date","planning"]],["1F5D2-FE0F",["spiral_note_pad","spiral_notepad","memo","stationery"]],["1F5D3-FE0F",["spiral_calendar_pad","spiral_calendar","date","schedule","planning"]],["1F4C7",["card_index","business","stationery"]],["1F4C8",["chart_with_upwards_trend","chart_increasing","graph","presentation","stats","recovery","business","economics","money","sales","good","success"]],["1F4C9",["chart_with_downwards_trend","chart_decreasing","graph","presentation","stats","recession","business","economics","money","sales","bad","failure"]],["1F4CA",["bar_chart","graph","presentation","stats"]],["1F4CB",["clipboard","stationery","documents"]],["1F4CC",["pushpin","stationery","mark","here"]],["1F4CD",["round_pushpin","stationery","location","map","here"]],["1F4CE",["paperclip","documents","stationery"]],["1F587-FE0F",["linked_paperclips","documents","stationery"]],["1F4CF",["straight_ruler","stationery","calculate","length","math","school","drawing","architect","sketch"]],["1F4D0",["triangular_ruler","stationery","math","architect","sketch"]],["2702-FE0F",["scissors","stationery","cut"]],["1F5C3-FE0F",["card_file_box","business","stationery"]],["1F5C4-FE0F",["file_cabinet","filing","organizing"]],["1F5D1-FE0F",["wastebasket","bin","trash","rubbish","garbage","toss"]],["1F512",["lock","locked","security","password","padlock"]],["1F513",["unlock","unlocked","privacy","security"]],["1F50F",["lock_with_ink_pen","locked_with_pen","security","secret"]],["1F510",["closed_lock_with_key","locked_with_key","security","privacy"]],["1F511",["key","lock","door","password"]],["1F5DD-FE0F",["old_key","lock","door","password"]],["1F528",["hammer","tools","build","create"]],["1FA93",["axe","tool","chop","cut"]],["26CF-FE0F",["pick","tools","dig"]],["2692-FE0F",["hammer_and_pick","tools","build","create"]],["1F6E0-FE0F",["hammer_and_wrench","tools","build","create"]],["1F5E1-FE0F",["dagger_knife","dagger","weapon"]],["2694-FE0F",["crossed_swords","weapon"]],["1F52B",["gun","pistol","violence","weapon","revolver"]],["1FA83",["boomerang","weapon"]],["1F3F9",["bow_and_arrow","sports"]],["1F6E1-FE0F",["shield","protection","security"]],["1FA9A",["carpentry_saw","carpentry saw","cut","chop"]],["1F527",["wrench","tools","diy","ikea","fix","maintainer"]],["1FA9B",["screwdriver","tools"]],["1F529",["nut_and_bolt","handy","tools","fix"]],["2699-FE0F",["gear","cog"]],["1F5DC-FE0F",["compression","clamp","tool"]],["2696-FE0F",["scales","balance_scale","law","fairness","weight"]],["1F9AF",["probing_cane","accessibility"]],["1F517",["link","rings","url"]],["26D3-FE0F",["chains","lock","arrest"]],["1FA9D",["hook","tools"]],["1F9F0",["toolbox","tools","diy","fix","maintainer","mechanic"]],["1F9F2",["magnet","attraction","magnetic"]],["1FA9C",["ladder","tools"]],["2697-FE0F",["alembic","distilling","science","experiment","chemistry"]],["1F9EA",["test_tube","chemistry","experiment","lab","science"]],["1F9EB",["petri_dish","bacteria","biology","culture","lab"]],["1F9EC",["dna","biologist","genetics","life"]],["1F52C",["microscope","laboratory","experiment","zoomin","science","study"]],["1F52D",["telescope","stars","space","zoom","science","astronomy"]],["1F4E1",["satellite_antenna","communication","future","radio","space"]],["1F489",["syringe","health","hospital","drugs","blood","medicine","needle","doctor","nurse"]],["1FA78",["drop_of_blood","period","hurt","harm","wound"]],["1F48A",["pill","health","medicine","doctor","pharmacy","drug"]],["1FA79",["adhesive_bandage","heal"]],["1FA7A",["stethoscope","health"]],["1F6AA",["door","house","entry","exit"]],["1F6D7",["elevator","lift"]],["1FA9E",["mirror","reflection"]],["1FA9F",["window","scenery"]],["1F6CF-FE0F",["bed","sleep","rest"]],["1F6CB-FE0F",["couch_and_lamp","read","chill"]],["1FA91",["chair","sit","furniture"]],["1F6BD",["toilet","restroom","wc","washroom","bathroom","potty"]],["1FAA0",["plunger","toilet"]],["1F6BF",["shower","clean","water","bathroom"]],["1F6C1",["bathtub","clean","shower","bathroom"]],["1FAA4",["mouse_trap","mouse trap","cheese"]],["1FA92",["razor","cut"]],["1F9F4",["lotion_bottle","moisturizer","sunscreen"]],["1F9F7",["safety_pin","diaper"]],["1F9F9",["broom","cleaning","sweeping","witch"]],["1F9FA",["basket","laundry"]],["1F9FB",["roll_of_paper","roll"]],["1FAA3",["bucket","water","container"]],["1F9FC",["soap","bar","bathing","cleaning","lather"]],["1FAA5",["toothbrush","hygiene","dental"]],["1F9FD",["sponge","absorbing","cleaning","porous"]],["1F9EF",["fire_extinguisher","quench"]],["1F6D2",["shopping_trolley","shopping_cart","trolley"]],["1F6AC",["smoking","cigarette","kills","tobacco","joint","smoke"]],["26B0-FE0F",["coffin","vampire","dead","die","death","rip","graveyard","cemetery","casket","funeral","box"]],["1FAA6",["headstone","death","rip","grave"]],["26B1-FE0F",["funeral_urn","dead","die","death","rip","ashes"]],["1F5FF",["moyai","moai","rock","easter island"]],["1FAA7",["placard","announcement"]]],["symbols",["Symbols"]],[["1F3E7",["atm","atm_sign","money","sales","cash","blue-square","payment","bank"]],["1F6AE",["put_litter_in_its_place","litter_in_bin_sign","blue-square","sign","human","info"]],["1F6B0",["potable_water","blue-square","liquid","restroom","cleaning","faucet"]],["267F",["wheelchair","wheelchair_symbol","blue-square","disabled","accessibility"]],["1F6B9",["mens","men_s_room","toilet","restroom","wc","blue-square","gender","male"]],["1F6BA",["womens","women_s_room","purple-square","woman","female","toilet","loo","restroom","gender"]],["1F6BB",["restroom","blue-square","toilet","refresh","wc","gender"]],["1F6BC",["baby_symbol","orange-square","child"]],["1F6BE",["wc","water_closet","toilet","restroom","blue-square"]],["1F6C2",["passport_control","custom","blue-square"]],["1F6C3",["customs","passport","border","blue-square"]],["1F6C4",["baggage_claim","blue-square","airport","transport"]],["1F6C5",["left_luggage","blue-square","travel"]],["26A0-FE0F",["warning","exclamation","wip","alert","error","problem","issue"]],["1F6B8",["children_crossing","school","warning","danger","sign","driving","yellow-diamond"]],["26D4",["no_entry","limit","security","privacy","bad","denied","stop","circle"]],["1F6AB",["no_entry_sign","prohibited","forbid","stop","limit","denied","disallow","circle"]],["1F6B3",["no_bicycles","cyclist","prohibited","circle"]],["1F6AD",["no_smoking","cigarette","blue-square","smell","smoke"]],["1F6AF",["do_not_litter","no_littering","trash","bin","garbage","circle"]],["1F6B1",["non-potable_water","non_potable_water","drink","faucet","tap","circle"]],["1F6B7",["no_pedestrians","rules","crossing","walking","circle"]],["1F4F5",["no_mobile_phones","iphone","mute","circle"]],["1F51E",["underage","no_one_under_eighteen","18","drink","pub","night","minor","circle"]],["2622-FE0F",["radioactive_sign","radioactive","nuclear","danger"]],["2623-FE0F",["biohazard_sign","biohazard","danger"]],["2B06-FE0F",["arrow_up","up_arrow","blue-square","continue","top","direction"]],["2197-FE0F",["arrow_upper_right","up_right_arrow","blue-square","point","direction","diagonal","northeast"]],["27A1-FE0F",["arrow_right","right_arrow","blue-square","next"]],["2198-FE0F",["arrow_lower_right","down_right_arrow","blue-square","direction","diagonal","southeast"]],["2B07-FE0F",["arrow_down","down_arrow","blue-square","direction","bottom"]],["2199-FE0F",["arrow_lower_left","down_left_arrow","blue-square","direction","diagonal","southwest"]],["2B05-FE0F",["arrow_left","left_arrow","blue-square","previous","back"]],["2196-FE0F",["arrow_upper_left","up_left_arrow","blue-square","point","direction","diagonal","northwest"]],["2195-FE0F",["arrow_up_down","up_down_arrow","blue-square","direction","way","vertical"]],["2194-FE0F",["left_right_arrow","shape","direction","horizontal","sideways"]],["21A9-FE0F",["leftwards_arrow_with_hook","right_arrow_curving_left","back","return","blue-square","undo","enter"]],["21AA-FE0F",["arrow_right_hook","left_arrow_curving_right","blue-square","return","rotate","direction"]],["2934-FE0F",["arrow_heading_up","right_arrow_curving_up","blue-square","direction","top"]],["2935-FE0F",["arrow_heading_down","right_arrow_curving_down","blue-square","direction","bottom"]],["1F503",["arrows_clockwise","clockwise_vertical_arrows","sync","cycle","round","repeat"]],["1F504",["arrows_counterclockwise","counterclockwise_arrows_button","blue-square","sync","cycle"]],["1F519",["back","back_arrow","arrow","words","return"]],["1F51A",["end","end_arrow","words","arrow"]],["1F51B",["on","on_arrow","arrow","words"]],["1F51C",["soon","soon_arrow","arrow","words"]],["1F51D",["top","top_arrow","words","blue-square"]],["1F6D0",["place_of_worship","religion","church","temple","prayer"]],["269B-FE0F",["atom_symbol","science","physics","chemistry"]],["1F549-FE0F",["om_symbol","om","hinduism","buddhism","sikhism","jainism"]],["2721-FE0F",["star_of_david","judaism"]],["2638-FE0F",["wheel_of_dharma","hinduism","buddhism","sikhism","jainism"]],["262F-FE0F",["yin_yang","balance"]],["271D-FE0F",["latin_cross","christianity"]],["2626-FE0F",["orthodox_cross","suppedaneum","religion"]],["262A-FE0F",["star_and_crescent","islam"]],["262E-FE0F",["peace_symbol","hippie"]],["1F54E",["menorah_with_nine_branches","menorah","hanukkah","candles","jewish"]],["1F52F",["six_pointed_star","dotted_six_pointed_star","purple-square","religion","jewish","hexagram"]],["2648",["aries","sign","purple-square","zodiac","astrology"]],["2649",["taurus","purple-square","sign","zodiac","astrology"]],["264A",["gemini","sign","zodiac","purple-square","astrology"]],["264B",["cancer","sign","zodiac","purple-square","astrology"]],["264C",["leo","sign","purple-square","zodiac","astrology"]],["264D",["virgo","sign","zodiac","purple-square","astrology"]],["264E",["libra","sign","purple-square","zodiac","astrology"]],["264F",["scorpius","scorpio","sign","zodiac","purple-square","astrology"]],["2650",["sagittarius","sign","zodiac","purple-square","astrology"]],["2651",["capricorn","sign","zodiac","purple-square","astrology"]],["2652",["aquarius","sign","purple-square","zodiac","astrology"]],["2653",["pisces","purple-square","sign","zodiac","astrology"]],["26CE",["ophiuchus","sign","purple-square","constellation","astrology"]],["1F500",["twisted_rightwards_arrows","shuffle_tracks_button","blue-square","shuffle","music","random"]],["1F501",["repeat","repeat_button","loop","record"]],["1F502",["repeat_one","repeat_single_button","blue-square","loop"]],["25B6-FE0F",["arrow_forward","play_button","blue-square","right","direction","play"]],["23E9",["fast_forward","fast_forward_button","blue-square","play","speed","continue"]],["23ED-FE0F",["black_right_pointing_double_triangle_with_vertical_bar","next_track_button","forward","next","blue-square"]],["23EF-FE0F",["black_right_pointing_triangle_with_double_vertical_bar","play_or_pause_button","blue-square","play","pause"]],["25C0-FE0F",["arrow_backward","reverse_button","blue-square","left","direction"]],["23EA",["rewind","fast_reverse_button","play","blue-square"]],["23EE-FE0F",["black_left_pointing_double_triangle_with_vertical_bar","last_track_button","backward"]],["1F53C",["arrow_up_small","upwards_button","blue-square","triangle","direction","point","forward","top"]],["23EB",["arrow_double_up","fast_up_button","blue-square","direction","top"]],["1F53D",["arrow_down_small","downwards_button","blue-square","direction","bottom"]],["23EC",["arrow_double_down","fast_down_button","blue-square","direction","bottom"]],["23F8-FE0F",["double_vertical_bar","pause_button","pause","blue-square"]],["23F9-FE0F",["black_square_for_stop","stop_button","blue-square"]],["23FA-FE0F",["black_circle_for_record","record_button","blue-square"]],["23CF-FE0F",["eject","eject_button","blue-square"]],["1F3A6",["cinema","blue-square","record","film","movie","curtain","stage","theater"]],["1F505",["low_brightness","dim_button","sun","afternoon","warm","summer"]],["1F506",["high_brightness","bright_button","sun","light"]],["1F4F6",["signal_strength","antenna_bars","blue-square","reception","phone","internet","connection","wifi","bluetooth","bars"]],["1F4F3",["vibration_mode","orange-square","phone"]],["1F4F4",["mobile_phone_off","mute","orange-square","silence","quiet"]],["2640-FE0F",["female_sign","woman","women","lady","girl"]],["2642-FE0F",["male_sign","man","boy","men"]],["26A7-FE0F",["transgender_symbol","transgender symbol","lgbtq"]],["2716-FE0F",["heavy_multiplication_x","multiplication_sign","math","calculation"]],["2795",["heavy_plus_sign","plus_sign","math","calculation","addition","more","increase"]],["2796",["heavy_minus_sign","minus_sign","math","calculation","subtract","less"]],["2797",["heavy_division_sign","division_sign","divide","math","calculation"]],["267E-FE0F",["infinity","forever"]],["203C-FE0F",["bangbang","double_exclamation_mark","exclamation","surprise"]],["2049-FE0F",["interrobang","exclamation_question_mark","wat","punctuation","surprise"]],["2753",["question","question_mark","doubt","confused"]],["2754",["grey_question","white_question_mark","doubts","gray","huh","confused"]],["2755",["grey_exclamation","white_exclamation_mark","surprise","punctuation","gray","wow","warning"]],["2757",["exclamation","exclamation_mark","heavy_exclamation_mark","danger","surprise","punctuation","wow","warning"]],["3030-FE0F",["wavy_dash","draw","line","moustache","mustache","squiggle","scribble"]],["1F4B1",["currency_exchange","money","sales","dollar","travel"]],["1F4B2",["heavy_dollar_sign","money","sales","payment","currency","buck"]],["2695-FE0F",["medical_symbol","health","hospital"]],["267B-FE0F",["recycle","recycling_symbol","arrow","environment","garbage","trash"]],["269C-FE0F",["fleur_de_lis","decorative","scout"]],["1F531",["trident","trident_emblem","weapon","spear"]],["1F4DB",["name_badge","fire","forbid"]],["1F530",["beginner","japanese_symbol_for_beginner","badge","shield"]],["2B55",["o","hollow_red_circle","circle","round"]],["2705",["white_check_mark","check_mark_button","green-square","ok","agree","vote","election","answer","tick"]],["2611-FE0F",["ballot_box_with_check","check_box_with_check","ok","agree","confirm","black-square","vote","election","yes","tick"]],["2714-FE0F",["heavy_check_mark","check_mark","ok","nike","answer","yes","tick"]],["274C",["x","cross_mark","no","delete","remove","cancel","red"]],["274E",["negative_squared_cross_mark","cross_mark_button","x","green-square","no","deny"]],["27B0",["curly_loop","scribble","draw","shape","squiggle"]],["27BF",["loop","double_curly_loop","tape","cassette"]],["303D-FE0F",["part_alternation_mark","graph","presentation","stats","business","economics","bad"]],["2733-FE0F",["eight_spoked_asterisk","star","sparkle","green-square"]],["2734-FE0F",["eight_pointed_black_star","eight_pointed_star","orange-square","shape","polygon"]],["2747-FE0F",["sparkle","stars","green-square","awesome","good","fireworks"]],["00A9-FE0F",["copyright","ip","license","circle","law","legal"]],["00AE-FE0F",["registered","alphabet","circle"]],["2122-FE0F",["tm","trade_mark","trademark","brand","law","legal"]],["0023-FE0F-20E3",["hash","keycap_","symbol","blue-square","twitter"]],["002A-FE0F-20E3",["keycap_star","keycap_","star","keycap"]],["0030-FE0F-20E3",["zero","keycap_0","0","numbers","blue-square","null"]],["0031-FE0F-20E3",["one","keycap_1","blue-square","numbers","1"]],["0032-FE0F-20E3",["two","keycap_2","numbers","2","prime","blue-square"]],["0033-FE0F-20E3",["three","keycap_3","3","numbers","prime","blue-square"]],["0034-FE0F-20E3",["four","keycap_4","4","numbers","blue-square"]],["0035-FE0F-20E3",["five","keycap_5","5","numbers","blue-square","prime"]],["0036-FE0F-20E3",["six","keycap_6","6","numbers","blue-square"]],["0037-FE0F-20E3",["seven","keycap_7","7","numbers","blue-square","prime"]],["0038-FE0F-20E3",["eight","keycap_8","8","blue-square","numbers"]],["0039-FE0F-20E3",["nine","keycap_9","blue-square","numbers","9"]],["1F51F",["keycap_ten","keycap_10","numbers","10","blue-square"]],["1F520",["capital_abcd","input_latin_uppercase","alphabet","words","blue-square"]],["1F521",["abcd","input_latin_lowercase","blue-square","alphabet"]],["1F522",["1234","input_numbers","numbers","blue-square"]],["1F523",["symbols","input_symbols","blue-square","music","note","ampersand","percent","glyphs","characters"]],["1F524",["abc","input_latin_letters","blue-square","alphabet"]],["1F170-FE0F",["a","a_button","red-square","alphabet","letter"]],["1F18E",["ab","ab_button","red-square","alphabet"]],["1F171-FE0F",["b","b_button","red-square","alphabet","letter"]],["1F191",["cl","cl_button","alphabet","words","red-square"]],["1F192",["cool","cool_button","words","blue-square"]],["1F193",["free","free_button","blue-square","words"]],["2139-FE0F",["information_source","information","blue-square","alphabet","letter"]],["1F194",["id","id_button","purple-square","words"]],["24C2-FE0F",["m","circled_m","alphabet","blue-circle","letter"]],["1F195",["new","new_button","blue-square","words","start"]],["1F196",["ng","ng_button","blue-square","words","shape","icon"]],["1F17E-FE0F",["o2","o_button","alphabet","red-square","letter"]],["1F197",["ok","ok_button","good","agree","yes","blue-square"]],["1F17F-FE0F",["parking","p_button","cars","blue-square","alphabet","letter"]],["1F198",["sos","sos_button","help","red-square","words","emergency","911"]],["1F199",["up","up_button","blue-square","above","high"]],["1F19A",["vs","vs_button","words","orange-square"]],["1F201",["koko","japanese_here_button","blue-square","here","katakana","japanese","destination"]],["1F202-FE0F",["sa","japanese_service_charge_button","japanese","blue-square","katakana"]],["1F237-FE0F",["u6708","japanese_monthly_amount_button","chinese","month","moon","japanese","orange-square","kanji"]],["1F236",["u6709","japanese_not_free_of_charge_button","orange-square","chinese","have","kanji"]],["1F22F",["u6307","japanese_reserved_button","chinese","point","green-square","kanji"]],["1F250",["ideograph_advantage","japanese_bargain_button","chinese","kanji","obtain","get","circle"]],["1F239",["u5272","japanese_discount_button","cut","divide","chinese","kanji","pink-square"]],["1F21A",["u7121","japanese_free_of_charge_button","nothing","chinese","kanji","japanese","orange-square"]],["1F232",["u7981","japanese_prohibited_button","kanji","japanese","chinese","forbidden","limit","restricted","red-square"]],["1F251",["accept","japanese_acceptable_button","ok","good","chinese","kanji","agree","yes","orange-circle"]],["1F238",["u7533","japanese_application_button","chinese","japanese","kanji","orange-square"]],["1F234",["u5408","japanese_passing_grade_button","japanese","chinese","join","kanji","red-square"]],["1F233",["u7a7a","japanese_vacancy_button","kanji","japanese","chinese","empty","sky","blue-square"]],["3297-FE0F",["congratulations","japanese_congratulations_button","chinese","kanji","japanese","red-circle"]],["3299-FE0F",["secret","japanese_secret_button","privacy","chinese","sshh","kanji","red-circle"]],["1F23A",["u55b6","japanese_open_for_business_button","japanese","opening hours","orange-square"]],["1F235",["u6e80","japanese_no_vacancy_button","full","chinese","japanese","red-square","kanji"]],["1F534",["red_circle","shape","error","danger"]],["1F7E0",["large_orange_circle","orange_circle","round"]],["1F7E1",["large_yellow_circle","yellow_circle","round"]],["1F7E2",["large_green_circle","green_circle","round"]],["1F535",["large_blue_circle","blue_circle","shape","icon","button"]],["1F7E3",["large_purple_circle","purple_circle","round"]],["1F7E4",["large_brown_circle","brown_circle","round"]],["26AB",["black_circle","shape","button","round"]],["26AA",["white_circle","shape","round"]],["1F7E5",["large_red_square","red_square"]],["1F7E7",["large_orange_square","orange_square"]],["1F7E8",["large_yellow_square","yellow_square"]],["1F7E9",["large_green_square","green_square"]],["1F7E6",["large_blue_square","blue_square"]],["1F7EA",["large_purple_square","purple_square"]],["1F7EB",["large_brown_square","brown_square"]],["2B1B",["black_large_square","shape","icon","button"]],["2B1C",["white_large_square","shape","icon","stone","button"]],["25FC-FE0F",["black_medium_square","shape","button","icon"]],["25FB-FE0F",["white_medium_square","shape","stone","icon"]],["25FE",["black_medium_small_square","icon","shape","button"]],["25FD",["white_medium_small_square","shape","stone","icon","button"]],["25AA-FE0F",["black_small_square","shape","icon"]],["25AB-FE0F",["white_small_square","shape","icon"]],["1F536",["large_orange_diamond","shape","jewel","gem"]],["1F537",["large_blue_diamond","shape","jewel","gem"]],["1F538",["small_orange_diamond","shape","jewel","gem"]],["1F539",["small_blue_diamond","shape","jewel","gem"]],["1F53A",["small_red_triangle","red_triangle_pointed_up","shape","direction","up","top"]],["1F53B",["small_red_triangle_down","red_triangle_pointed_down","shape","direction","bottom"]],["1F4A0",["diamond_shape_with_a_dot_inside","diamond_with_a_dot","jewel","blue","gem","crystal","fancy"]],["1F518",["radio_button","input","old","music","circle"]],["1F533",["white_square_button","shape","input"]],["1F532",["black_square_button","shape","input","frame"]]],["flags",["Flags"]],[["1F3C1",["checkered_flag","chequered_flag","contest","finishline","race","gokart"]],["1F6A9",["triangular_flag_on_post","triangular_flag","mark","milestone","place"]],["1F38C",["crossed_flags","japanese","nation","country","border"]],["1F3F4",["waving_black_flag","black_flag","pirate"]],["1F3F3-FE0F",["waving_white_flag","white_flag","losing","loser","lost","surrender","give up","fail"]],["1F3F3-FE0F-200D-1F308",["rainbow-flag","rainbow_flag","flag","rainbow","pride","gay","lgbt","glbt","queer","homosexual","lesbian","bisexual","transgender"]],["1F3F3-FE0F-200D-26A7-FE0F",["transgender_flag","transgender flag","lgbtq"]],["1F3F4-200D-2620-FE0F",["pirate_flag","skull","crossbones","flag","banner"]],["1F1E6-1F1E8",["flag-ac","flag_ascension_island"]],["1F1E6-1F1E9",["flag-ad","flag_andorra","ad","flag","nation","country","banner"]],["1F1E6-1F1EA",["flag-ae","flag_united_arab_emirates","united","arab","emirates","flag","nation","country","banner"]],["1F1E6-1F1EB",["flag-af","flag_afghanistan","af","flag","nation","country","banner"]],["1F1E6-1F1EC",["flag-ag","flag_antigua_barbuda","antigua","barbuda","flag","nation","country","banner"]],["1F1E6-1F1EE",["flag-ai","flag_anguilla","ai","flag","nation","country","banner"]],["1F1E6-1F1F1",["flag-al","flag_albania","al","flag","nation","country","banner"]],["1F1E6-1F1F2",["flag-am","flag_armenia","am","flag","nation","country","banner"]],["1F1E6-1F1F4",["flag-ao","flag_angola","ao","flag","nation","country","banner"]],["1F1E6-1F1F6",["flag-aq","flag_antarctica","aq","flag","nation","country","banner"]],["1F1E6-1F1F7",["flag-ar","flag_argentina","ar","flag","nation","country","banner"]],["1F1E6-1F1F8",["flag-as","flag_american_samoa","american","ws","flag","nation","country","banner"]],["1F1E6-1F1F9",["flag-at","flag_austria","at","flag","nation","country","banner"]],["1F1E6-1F1FA",["flag-au","flag_australia","au","flag","nation","country","banner"]],["1F1E6-1F1FC",["flag-aw","flag_aruba","aw","flag","nation","country","banner"]],["1F1E6-1F1FD",["flag-ax","flag_aland_islands","Åland","islands","flag","nation","country","banner"]],["1F1E6-1F1FF",["flag-az","flag_azerbaijan","az","flag","nation","country","banner"]],["1F1E7-1F1E6",["flag-ba","flag_bosnia_herzegovina","bosnia","herzegovina","flag","nation","country","banner"]],["1F1E7-1F1E7",["flag-bb","flag_barbados","bb","flag","nation","country","banner"]],["1F1E7-1F1E9",["flag-bd","flag_bangladesh","bd","flag","nation","country","banner"]],["1F1E7-1F1EA",["flag-be","flag_belgium","be","flag","nation","country","banner"]],["1F1E7-1F1EB",["flag-bf","flag_burkina_faso","burkina","faso","flag","nation","country","banner"]],["1F1E7-1F1EC",["flag-bg","flag_bulgaria","bg","flag","nation","country","banner"]],["1F1E7-1F1ED",["flag-bh","flag_bahrain","bh","flag","nation","country","banner"]],["1F1E7-1F1EE",["flag-bi","flag_burundi","bi","flag","nation","country","banner"]],["1F1E7-1F1EF",["flag-bj","flag_benin","bj","flag","nation","country","banner"]],["1F1E7-1F1F1",["flag-bl","flag_st_barthelemy","saint","barthélemy","flag","nation","country","banner"]],["1F1E7-1F1F2",["flag-bm","flag_bermuda","bm","flag","nation","country","banner"]],["1F1E7-1F1F3",["flag-bn","flag_brunei","bn","darussalam","flag","nation","country","banner"]],["1F1E7-1F1F4",["flag-bo","flag_bolivia","bo","flag","nation","country","banner"]],["1F1E7-1F1F6",["flag-bq","flag_caribbean_netherlands","bonaire","flag","nation","country","banner"]],["1F1E7-1F1F7",["flag-br","flag_brazil","br","flag","nation","country","banner"]],["1F1E7-1F1F8",["flag-bs","flag_bahamas","bs","flag","nation","country","banner"]],["1F1E7-1F1F9",["flag-bt","flag_bhutan","bt","flag","nation","country","banner"]],["1F1E7-1F1FB",["flag-bv","flag_bouvet_island","norway"]],["1F1E7-1F1FC",["flag-bw","flag_botswana","bw","flag","nation","country","banner"]],["1F1E7-1F1FE",["flag-by","flag_belarus","by","flag","nation","country","banner"]],["1F1E7-1F1FF",["flag-bz","flag_belize","bz","flag","nation","country","banner"]],["1F1E8-1F1E6",["flag-ca","flag_canada","ca","flag","nation","country","banner"]],["1F1E8-1F1E8",["flag-cc","flag_cocos_islands","cocos","keeling","islands","flag","nation","country","banner"]],["1F1E8-1F1E9",["flag-cd","flag_congo_kinshasa","congo","democratic","republic","flag","nation","country","banner"]],["1F1E8-1F1EB",["flag-cf","flag_central_african_republic","central","african","republic","flag","nation","country","banner"]],["1F1E8-1F1EC",["flag-cg","flag_congo_brazzaville","congo","flag","nation","country","banner"]],["1F1E8-1F1ED",["flag-ch","flag_switzerland","ch","flag","nation","country","banner"]],["1F1E8-1F1EE",["flag-ci","flag_cote_d_ivoire","ivory","coast","flag","nation","country","banner"]],["1F1E8-1F1F0",["flag-ck","flag_cook_islands","cook","islands","flag","nation","country","banner"]],["1F1E8-1F1F1",["flag-cl","flag_chile","flag","nation","country","banner"]],["1F1E8-1F1F2",["flag-cm","flag_cameroon","cm","flag","nation","country","banner"]],["1F1E8-1F1F3",["cn","flag_china","china","chinese","prc","flag","country","nation","banner"]],["1F1E8-1F1F4",["flag-co","flag_colombia","co","flag","nation","country","banner"]],["1F1E8-1F1F5",["flag-cp","flag_clipperton_island"]],["1F1E8-1F1F7",["flag-cr","flag_costa_rica","costa","rica","flag","nation","country","banner"]],["1F1E8-1F1FA",["flag-cu","flag_cuba","cu","flag","nation","country","banner"]],["1F1E8-1F1FB",["flag-cv","flag_cape_verde","cabo","verde","flag","nation","country","banner"]],["1F1E8-1F1FC",["flag-cw","flag_curacao","curaçao","flag","nation","country","banner"]],["1F1E8-1F1FD",["flag-cx","flag_christmas_island","christmas","island","flag","nation","country","banner"]],["1F1E8-1F1FE",["flag-cy","flag_cyprus","cy","flag","nation","country","banner"]],["1F1E8-1F1FF",["flag-cz","flag_czechia","cz","flag","nation","country","banner"]],["1F1E9-1F1EA",["de","flag_germany","german","nation","flag","country","banner"]],["1F1E9-1F1EC",["flag-dg","flag_diego_garcia"]],["1F1E9-1F1EF",["flag-dj","flag_djibouti","dj","flag","nation","country","banner"]],["1F1E9-1F1F0",["flag-dk","flag_denmark","dk","flag","nation","country","banner"]],["1F1E9-1F1F2",["flag-dm","flag_dominica","dm","flag","nation","country","banner"]],["1F1E9-1F1F4",["flag-do","flag_dominican_republic","dominican","republic","flag","nation","country","banner"]],["1F1E9-1F1FF",["flag-dz","flag_algeria","dz","flag","nation","country","banner"]],["1F1EA-1F1E6",["flag-ea","flag_ceuta_melilla"]],["1F1EA-1F1E8",["flag-ec","flag_ecuador","ec","flag","nation","country","banner"]],["1F1EA-1F1EA",["flag-ee","flag_estonia","ee","flag","nation","country","banner"]],["1F1EA-1F1EC",["flag-eg","flag_egypt","eg","flag","nation","country","banner"]],["1F1EA-1F1ED",["flag-eh","flag_western_sahara","western","sahara","flag","nation","country","banner"]],["1F1EA-1F1F7",["flag-er","flag_eritrea","er","flag","nation","country","banner"]],["1F1EA-1F1F8",["es","flag_spain","spain","flag","nation","country","banner"]],["1F1EA-1F1F9",["flag-et","flag_ethiopia","et","flag","nation","country","banner"]],["1F1EA-1F1FA",["flag-eu","flag_european_union","european","union","flag","banner"]],["1F1EB-1F1EE",["flag-fi","flag_finland","fi","flag","nation","country","banner"]],["1F1EB-1F1EF",["flag-fj","flag_fiji","fj","flag","nation","country","banner"]],["1F1EB-1F1F0",["flag-fk","flag_falkland_islands","falkland","islands","malvinas","flag","nation","country","banner"]],["1F1EB-1F1F2",["flag-fm","flag_micronesia","micronesia","federated","states","flag","nation","country","banner"]],["1F1EB-1F1F4",["flag-fo","flag_faroe_islands","faroe","islands","flag","nation","country","banner"]],["1F1EB-1F1F7",["fr","flag_france","banner","flag","nation","france","french","country"]],["1F1EC-1F1E6",["flag-ga","flag_gabon","ga","flag","nation","country","banner"]],["1F1EC-1F1E7",["gb","flag_united_kingdom","united","kingdom","great","britain","northern","ireland","flag","nation","country","banner","british","UK","english","england","union jack"]],["1F1EC-1F1E9",["flag-gd","flag_grenada","gd","flag","nation","country","banner"]],["1F1EC-1F1EA",["flag-ge","flag_georgia","ge","flag","nation","country","banner"]],["1F1EC-1F1EB",["flag-gf","flag_french_guiana","french","guiana","flag","nation","country","banner"]],["1F1EC-1F1EC",["flag-gg","flag_guernsey","gg","flag","nation","country","banner"]],["1F1EC-1F1ED",["flag-gh","flag_ghana","gh","flag","nation","country","banner"]],["1F1EC-1F1EE",["flag-gi","flag_gibraltar","gi","flag","nation","country","banner"]],["1F1EC-1F1F1",["flag-gl","flag_greenland","gl","flag","nation","country","banner"]],["1F1EC-1F1F2",["flag-gm","flag_gambia","gm","flag","nation","country","banner"]],["1F1EC-1F1F3",["flag-gn","flag_guinea","gn","flag","nation","country","banner"]],["1F1EC-1F1F5",["flag-gp","flag_guadeloupe","gp","flag","nation","country","banner"]],["1F1EC-1F1F6",["flag-gq","flag_equatorial_guinea","equatorial","gn","flag","nation","country","banner"]],["1F1EC-1F1F7",["flag-gr","flag_greece","gr","flag","nation","country","banner"]],["1F1EC-1F1F8",["flag-gs","flag_south_georgia_south_sandwich_islands","south","georgia","sandwich","islands","flag","nation","country","banner"]],["1F1EC-1F1F9",["flag-gt","flag_guatemala","gt","flag","nation","country","banner"]],["1F1EC-1F1FA",["flag-gu","flag_guam","gu","flag","nation","country","banner"]],["1F1EC-1F1FC",["flag-gw","flag_guinea_bissau","gw","bissau","flag","nation","country","banner"]],["1F1EC-1F1FE",["flag-gy","flag_guyana","gy","flag","nation","country","banner"]],["1F1ED-1F1F0",["flag-hk","flag_hong_kong_sar_china","hong","kong","flag","nation","country","banner"]],["1F1ED-1F1F2",["flag-hm","flag_heard_mcdonald_islands"]],["1F1ED-1F1F3",["flag-hn","flag_honduras","hn","flag","nation","country","banner"]],["1F1ED-1F1F7",["flag-hr","flag_croatia","hr","flag","nation","country","banner"]],["1F1ED-1F1F9",["flag-ht","flag_haiti","ht","flag","nation","country","banner"]],["1F1ED-1F1FA",["flag-hu","flag_hungary","hu","flag","nation","country","banner"]],["1F1EE-1F1E8",["flag-ic","flag_canary_islands","canary","islands","flag","nation","country","banner"]],["1F1EE-1F1E9",["flag-id","flag_indonesia","flag","nation","country","banner"]],["1F1EE-1F1EA",["flag-ie","flag_ireland","ie","flag","nation","country","banner"]],["1F1EE-1F1F1",["flag-il","flag_israel","il","flag","nation","country","banner"]],["1F1EE-1F1F2",["flag-im","flag_isle_of_man","isle","man","flag","nation","country","banner"]],["1F1EE-1F1F3",["flag-in","flag_india","in","flag","nation","country","banner"]],["1F1EE-1F1F4",["flag-io","flag_british_indian_ocean_territory","british","indian","ocean","territory","flag","nation","country","banner"]],["1F1EE-1F1F6",["flag-iq","flag_iraq","iq","flag","nation","country","banner"]],["1F1EE-1F1F7",["flag-ir","flag_iran","iran","islamic","republic","flag","nation","country","banner"]],["1F1EE-1F1F8",["flag-is","flag_iceland","is","flag","nation","country","banner"]],["1F1EE-1F1F9",["it","flag_italy","italy","flag","nation","country","banner"]],["1F1EF-1F1EA",["flag-je","flag_jersey","je","flag","nation","country","banner"]],["1F1EF-1F1F2",["flag-jm","flag_jamaica","jm","flag","nation","country","banner"]],["1F1EF-1F1F4",["flag-jo","flag_jordan","jo","flag","nation","country","banner"]],["1F1EF-1F1F5",["jp","flag_japan","japanese","nation","flag","country","banner"]],["1F1F0-1F1EA",["flag-ke","flag_kenya","ke","flag","nation","country","banner"]],["1F1F0-1F1EC",["flag-kg","flag_kyrgyzstan","kg","flag","nation","country","banner"]],["1F1F0-1F1ED",["flag-kh","flag_cambodia","kh","flag","nation","country","banner"]],["1F1F0-1F1EE",["flag-ki","flag_kiribati","ki","flag","nation","country","banner"]],["1F1F0-1F1F2",["flag-km","flag_comoros","km","flag","nation","country","banner"]],["1F1F0-1F1F3",["flag-kn","flag_st_kitts_nevis","saint","kitts","nevis","flag","nation","country","banner"]],["1F1F0-1F1F5",["flag-kp","flag_north_korea","north","korea","nation","flag","country","banner"]],["1F1F0-1F1F7",["kr","flag_south_korea","south","korea","nation","flag","country","banner"]],["1F1F0-1F1FC",["flag-kw","flag_kuwait","kw","flag","nation","country","banner"]],["1F1F0-1F1FE",["flag-ky","flag_cayman_islands","cayman","islands","flag","nation","country","banner"]],["1F1F0-1F1FF",["flag-kz","flag_kazakhstan","kz","flag","nation","country","banner"]],["1F1F1-1F1E6",["flag-la","flag_laos","lao","democratic","republic","flag","nation","country","banner"]],["1F1F1-1F1E7",["flag-lb","flag_lebanon","lb","flag","nation","country","banner"]],["1F1F1-1F1E8",["flag-lc","flag_st_lucia","saint","lucia","flag","nation","country","banner"]],["1F1F1-1F1EE",["flag-li","flag_liechtenstein","li","flag","nation","country","banner"]],["1F1F1-1F1F0",["flag-lk","flag_sri_lanka","sri","lanka","flag","nation","country","banner"]],["1F1F1-1F1F7",["flag-lr","flag_liberia","lr","flag","nation","country","banner"]],["1F1F1-1F1F8",["flag-ls","flag_lesotho","ls","flag","nation","country","banner"]],["1F1F1-1F1F9",["flag-lt","flag_lithuania","lt","flag","nation","country","banner"]],["1F1F1-1F1FA",["flag-lu","flag_luxembourg","lu","flag","nation","country","banner"]],["1F1F1-1F1FB",["flag-lv","flag_latvia","lv","flag","nation","country","banner"]],["1F1F1-1F1FE",["flag-ly","flag_libya","ly","flag","nation","country","banner"]],["1F1F2-1F1E6",["flag-ma","flag_morocco","ma","flag","nation","country","banner"]],["1F1F2-1F1E8",["flag-mc","flag_monaco","mc","flag","nation","country","banner"]],["1F1F2-1F1E9",["flag-md","flag_moldova","moldova","republic","flag","nation","country","banner"]],["1F1F2-1F1EA",["flag-me","flag_montenegro","me","flag","nation","country","banner"]],["1F1F2-1F1EB",["flag-mf","flag_st_martin"]],["1F1F2-1F1EC",["flag-mg","flag_madagascar","mg","flag","nation","country","banner"]],["1F1F2-1F1ED",["flag-mh","flag_marshall_islands","marshall","islands","flag","nation","country","banner"]],["1F1F2-1F1F0",["flag-mk","flag_north_macedonia","macedonia","flag","nation","country","banner"]],["1F1F2-1F1F1",["flag-ml","flag_mali","ml","flag","nation","country","banner"]],["1F1F2-1F1F2",["flag-mm","flag_myanmar","mm","flag","nation","country","banner"]],["1F1F2-1F1F3",["flag-mn","flag_mongolia","mn","flag","nation","country","banner"]],["1F1F2-1F1F4",["flag-mo","flag_macao_sar_china","macao","flag","nation","country","banner"]],["1F1F2-1F1F5",["flag-mp","flag_northern_mariana_islands","northern","mariana","islands","flag","nation","country","banner"]],["1F1F2-1F1F6",["flag-mq","flag_martinique","mq","flag","nation","country","banner"]],["1F1F2-1F1F7",["flag-mr","flag_mauritania","mr","flag","nation","country","banner"]],["1F1F2-1F1F8",["flag-ms","flag_montserrat","ms","flag","nation","country","banner"]],["1F1F2-1F1F9",["flag-mt","flag_malta","mt","flag","nation","country","banner"]],["1F1F2-1F1FA",["flag-mu","flag_mauritius","mu","flag","nation","country","banner"]],["1F1F2-1F1FB",["flag-mv","flag_maldives","mv","flag","nation","country","banner"]],["1F1F2-1F1FC",["flag-mw","flag_malawi","mw","flag","nation","country","banner"]],["1F1F2-1F1FD",["flag-mx","flag_mexico","mx","flag","nation","country","banner"]],["1F1F2-1F1FE",["flag-my","flag_malaysia","my","flag","nation","country","banner"]],["1F1F2-1F1FF",["flag-mz","flag_mozambique","mz","flag","nation","country","banner"]],["1F1F3-1F1E6",["flag-na","flag_namibia","na","flag","nation","country","banner"]],["1F1F3-1F1E8",["flag-nc","flag_new_caledonia","new","caledonia","flag","nation","country","banner"]],["1F1F3-1F1EA",["flag-ne","flag_niger","ne","flag","nation","country","banner"]],["1F1F3-1F1EB",["flag-nf","flag_norfolk_island","norfolk","island","flag","nation","country","banner"]],["1F1F3-1F1EC",["flag-ng","flag_nigeria","flag","nation","country","banner"]],["1F1F3-1F1EE",["flag-ni","flag_nicaragua","ni","flag","nation","country","banner"]],["1F1F3-1F1F1",["flag-nl","flag_netherlands","nl","flag","nation","country","banner"]],["1F1F3-1F1F4",["flag-no","flag_norway","no","flag","nation","country","banner"]],["1F1F3-1F1F5",["flag-np","flag_nepal","np","flag","nation","country","banner"]],["1F1F3-1F1F7",["flag-nr","flag_nauru","nr","flag","nation","country","banner"]],["1F1F3-1F1FA",["flag-nu","flag_niue","nu","flag","nation","country","banner"]],["1F1F3-1F1FF",["flag-nz","flag_new_zealand","new","zealand","flag","nation","country","banner"]],["1F1F4-1F1F2",["flag-om","flag_oman","om_symbol","flag","nation","country","banner"]],["1F1F5-1F1E6",["flag-pa","flag_panama","pa","flag","nation","country","banner"]],["1F1F5-1F1EA",["flag-pe","flag_peru","pe","flag","nation","country","banner"]],["1F1F5-1F1EB",["flag-pf","flag_french_polynesia","french","polynesia","flag","nation","country","banner"]],["1F1F5-1F1EC",["flag-pg","flag_papua_new_guinea","papua","new","guinea","flag","nation","country","banner"]],["1F1F5-1F1ED",["flag-ph","flag_philippines","ph","flag","nation","country","banner"]],["1F1F5-1F1F0",["flag-pk","flag_pakistan","pk","flag","nation","country","banner"]],["1F1F5-1F1F1",["flag-pl","flag_poland","pl","flag","nation","country","banner"]],["1F1F5-1F1F2",["flag-pm","flag_st_pierre_miquelon","saint","pierre","miquelon","flag","nation","country","banner"]],["1F1F5-1F1F3",["flag-pn","flag_pitcairn_islands","pitcairn","flag","nation","country","banner"]],["1F1F5-1F1F7",["flag-pr","flag_puerto_rico","puerto","rico","flag","nation","country","banner"]],["1F1F5-1F1F8",["flag-ps","flag_palestinian_territories","palestine","palestinian","territories","flag","nation","country","banner"]],["1F1F5-1F1F9",["flag-pt","flag_portugal","pt","flag","nation","country","banner"]],["1F1F5-1F1FC",["flag-pw","flag_palau","pw","flag","nation","country","banner"]],["1F1F5-1F1FE",["flag-py","flag_paraguay","py","flag","nation","country","banner"]],["1F1F6-1F1E6",["flag-qa","flag_qatar","qa","flag","nation","country","banner"]],["1F1F7-1F1EA",["flag-re","flag_reunion","réunion","flag","nation","country","banner"]],["1F1F7-1F1F4",["flag-ro","flag_romania","ro","flag","nation","country","banner"]],["1F1F7-1F1F8",["flag-rs","flag_serbia","rs","flag","nation","country","banner"]],["1F1F7-1F1FA",["ru","flag_russia","russian","federation","flag","nation","country","banner"]],["1F1F7-1F1FC",["flag-rw","flag_rwanda","rw","flag","nation","country","banner"]],["1F1F8-1F1E6",["flag-sa","flag_saudi_arabia","flag","nation","country","banner"]],["1F1F8-1F1E7",["flag-sb","flag_solomon_islands","solomon","islands","flag","nation","country","banner"]],["1F1F8-1F1E8",["flag-sc","flag_seychelles","sc","flag","nation","country","banner"]],["1F1F8-1F1E9",["flag-sd","flag_sudan","sd","flag","nation","country","banner"]],["1F1F8-1F1EA",["flag-se","flag_sweden","se","flag","nation","country","banner"]],["1F1F8-1F1EC",["flag-sg","flag_singapore","sg","flag","nation","country","banner"]],["1F1F8-1F1ED",["flag-sh","flag_st_helena","saint","helena","ascension","tristan","cunha","flag","nation","country","banner"]],["1F1F8-1F1EE",["flag-si","flag_slovenia","si","flag","nation","country","banner"]],["1F1F8-1F1EF",["flag-sj","flag_svalbard_jan_mayen"]],["1F1F8-1F1F0",["flag-sk","flag_slovakia","sk","flag","nation","country","banner"]],["1F1F8-1F1F1",["flag-sl","flag_sierra_leone","sierra","leone","flag","nation","country","banner"]],["1F1F8-1F1F2",["flag-sm","flag_san_marino","san","marino","flag","nation","country","banner"]],["1F1F8-1F1F3",["flag-sn","flag_senegal","sn","flag","nation","country","banner"]],["1F1F8-1F1F4",["flag-so","flag_somalia","so","flag","nation","country","banner"]],["1F1F8-1F1F7",["flag-sr","flag_suriname","sr","flag","nation","country","banner"]],["1F1F8-1F1F8",["flag-ss","flag_south_sudan","south","sd","flag","nation","country","banner"]],["1F1F8-1F1F9",["flag-st","flag_sao_tome_principe","sao","tome","principe","flag","nation","country","banner"]],["1F1F8-1F1FB",["flag-sv","flag_el_salvador","el","salvador","flag","nation","country","banner"]],["1F1F8-1F1FD",["flag-sx","flag_sint_maarten","sint","maarten","dutch","flag","nation","country","banner"]],["1F1F8-1F1FE",["flag-sy","flag_syria","syrian","arab","republic","flag","nation","country","banner"]],["1F1F8-1F1FF",["flag-sz","flag_eswatini","sz","flag","nation","country","banner"]],["1F1F9-1F1E6",["flag-ta","flag_tristan_da_cunha"]],["1F1F9-1F1E8",["flag-tc","flag_turks_caicos_islands","turks","caicos","islands","flag","nation","country","banner"]],["1F1F9-1F1E9",["flag-td","flag_chad","td","flag","nation","country","banner"]],["1F1F9-1F1EB",["flag-tf","flag_french_southern_territories","french","southern","territories","flag","nation","country","banner"]],["1F1F9-1F1EC",["flag-tg","flag_togo","tg","flag","nation","country","banner"]],["1F1F9-1F1ED",["flag-th","flag_thailand","th","flag","nation","country","banner"]],["1F1F9-1F1EF",["flag-tj","flag_tajikistan","tj","flag","nation","country","banner"]],["1F1F9-1F1F0",["flag-tk","flag_tokelau","tk","flag","nation","country","banner"]],["1F1F9-1F1F1",["flag-tl","flag_timor_leste","timor","leste","flag","nation","country","banner"]],["1F1F9-1F1F2",["flag-tm","flag_turkmenistan","flag","nation","country","banner"]],["1F1F9-1F1F3",["flag-tn","flag_tunisia","tn","flag","nation","country","banner"]],["1F1F9-1F1F4",["flag-to","flag_tonga","to","flag","nation","country","banner"]],["1F1F9-1F1F7",["flag-tr","flag_turkey","turkey","flag","nation","country","banner"]],["1F1F9-1F1F9",["flag-tt","flag_trinidad_tobago","trinidad","tobago","flag","nation","country","banner"]],["1F1F9-1F1FB",["flag-tv","flag_tuvalu","flag","nation","country","banner"]],["1F1F9-1F1FC",["flag-tw","flag_taiwan","tw","flag","nation","country","banner"]],["1F1F9-1F1FF",["flag-tz","flag_tanzania","tanzania","united","republic","flag","nation","country","banner"]],["1F1FA-1F1E6",["flag-ua","flag_ukraine","ua","flag","nation","country","banner"]],["1F1FA-1F1EC",["flag-ug","flag_uganda","ug","flag","nation","country","banner"]],["1F1FA-1F1F2",["flag-um","flag_u_s_outlying_islands"]],["1F1FA-1F1F3",["flag-un","flag_united_nations","un","flag","banner"]],["1F1FA-1F1F8",["us","flag_united_states","united","states","america","flag","nation","country","banner"]],["1F1FA-1F1FE",["flag-uy","flag_uruguay","uy","flag","nation","country","banner"]],["1F1FA-1F1FF",["flag-uz","flag_uzbekistan","uz","flag","nation","country","banner"]],["1F1FB-1F1E6",["flag-va","flag_vatican_city","vatican","city","flag","nation","country","banner"]],["1F1FB-1F1E8",["flag-vc","flag_st_vincent_grenadines","saint","vincent","grenadines","flag","nation","country","banner"]],["1F1FB-1F1EA",["flag-ve","flag_venezuela","ve","bolivarian","republic","flag","nation","country","banner"]],["1F1FB-1F1EC",["flag-vg","flag_british_virgin_islands","british","virgin","islands","bvi","flag","nation","country","banner"]],["1F1FB-1F1EE",["flag-vi","flag_u_s_virgin_islands","virgin","islands","us","flag","nation","country","banner"]],["1F1FB-1F1F3",["flag-vn","flag_vietnam","viet","nam","flag","nation","country","banner"]],["1F1FB-1F1FA",["flag-vu","flag_vanuatu","vu","flag","nation","country","banner"]],["1F1FC-1F1EB",["flag-wf","flag_wallis_futuna","wallis","futuna","flag","nation","country","banner"]],["1F1FC-1F1F8",["flag-ws","flag_samoa","ws","flag","nation","country","banner"]],["1F1FD-1F1F0",["flag-xk","flag_kosovo","xk","flag","nation","country","banner"]],["1F1FE-1F1EA",["flag-ye","flag_yemen","ye","flag","nation","country","banner"]],["1F1FE-1F1F9",["flag-yt","flag_mayotte","yt","flag","nation","country","banner"]],["1F1FF-1F1E6",["flag-za","flag_south_africa","south","africa","flag","nation","country","banner"]],["1F1FF-1F1F2",["flag-zm","flag_zambia","zm","flag","nation","country","banner"]],["1F1FF-1F1FC",["flag-zw","flag_zimbabwe","zw","flag","nation","country","banner"]],["1F3F4-E0067-E0062-E0065-E006E-E0067-E007F",["flag-england","flag_england","flag","english"]],["1F3F4-E0067-E0062-E0073-E0063-E0074-E007F",["flag-scotland","flag_scotland","flag","scottish"]],["1F3F4-E0067-E0062-E0077-E006C-E0073-E007F",["flag-wales","flag_wales","flag","welsh"]]]]')}}]); -//# sourceMappingURL=1.7d08855d9784837f4e10.js.map \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[1],{313:function(a){a.exports=JSON.parse('[["people",["Smileys & People"]],[["1F600",["grinning","grinning_face","face","smile","happy","joy",":D","grin"]],["1F603",["smiley","grinning_face_with_big_eyes","face","happy","joy","haha",":D",":)","smile","funny"]],["1F604",["smile","grinning_face_with_smiling_eyes","face","happy","joy","funny","haha","laugh","like",":D",":)"]],["1F601",["grin","beaming_face_with_smiling_eyes","face","happy","smile","joy","kawaii"]],["1F606",["laughing","grinning_squinting_face","happy","joy","lol","satisfied","haha","face","glad","XD","laugh"]],["1F605",["sweat_smile","grinning_face_with_sweat","face","hot","happy","laugh","sweat","smile","relief"]],["1F923",["rolling_on_the_floor_laughing","face","rolling","floor","laughing","lol","haha"]],["1F602",["joy","face_with_tears_of_joy","face","cry","tears","weep","happy","happytears","haha"]],["1F642",["slightly_smiling_face","face","smile"]],["1F643",["upside_down_face","face","flipped","silly","smile"]],["1F609",["wink","winking_face","face","happy","mischievous","secret",";)","smile","eye"]],["1F60A",["blush","smiling_face_with_smiling_eyes","face","smile","happy","flushed","crush","embarrassed","shy","joy"]],["1F607",["innocent","smiling_face_with_halo","face","angel","heaven","halo"]],["1F970",["smiling_face_with_3_hearts","smiling_face_with_hearts","face","love","like","affection","valentines","infatuation","crush","hearts","adore"]],["1F60D",["heart_eyes","smiling_face_with_heart_eyes","face","love","like","affection","valentines","infatuation","crush","heart"]],["1F929",["star-struck","star_struck","face","smile","starry","eyes","grinning"]],["1F618",["kissing_heart","face_blowing_a_kiss","face","love","like","affection","valentines","infatuation","kiss"]],["1F617",["kissing","kissing_face","love","like","face","3","valentines","infatuation","kiss"]],["263A-FE0F",["relaxed","smiling_face","face","blush","massage","happiness"]],["1F61A",["kissing_closed_eyes","kissing_face_with_closed_eyes","face","love","like","affection","valentines","infatuation","kiss"]],["1F619",["kissing_smiling_eyes","kissing_face_with_smiling_eyes","face","affection","valentines","infatuation","kiss"]],["1F972",["smiling_face_with_tear","smiling face with tear","sad","cry","pretend"]],["1F60B",["yum","face_savoring_food","happy","joy","tongue","smile","face","silly","yummy","nom","delicious","savouring"]],["1F61B",["stuck_out_tongue","face_with_tongue","face","prank","childish","playful","mischievous","smile","tongue"]],["1F61C",["stuck_out_tongue_winking_eye","winking_face_with_tongue","face","prank","childish","playful","mischievous","smile","wink","tongue"]],["1F92A",["zany_face","face","goofy","crazy"]],["1F61D",["stuck_out_tongue_closed_eyes","squinting_face_with_tongue","face","prank","playful","mischievous","smile","tongue"]],["1F911",["money_mouth_face","face","rich","dollar","money"]],["1F917",["hugging_face","face","smile","hug"]],["1F92D",["face_with_hand_over_mouth","face","whoops","shock","surprise"]],["1F92B",["shushing_face","face","quiet","shhh"]],["1F914",["thinking_face","face","hmmm","think","consider"]],["1F910",["zipper_mouth_face","face","sealed","zipper","secret"]],["1F928",["face_with_raised_eyebrow","face","distrust","scepticism","disapproval","disbelief","surprise"]],["1F610",["neutral_face","indifference","meh",":|","neutral"]],["1F611",["expressionless","expressionless_face","face","indifferent","-_-","meh","deadpan"]],["1F636",["no_mouth","face_without_mouth","face","hellokitty"]],["1F636-200D-1F32B-FE0F",["face_in_clouds"]],["1F60F",["smirk","smirking_face","face","smile","mean","prank","smug","sarcasm"]],["1F612",["unamused","unamused_face","indifference","bored","straight face","serious","sarcasm","unimpressed","skeptical","dubious","side_eye"]],["1F644",["face_with_rolling_eyes","face","eyeroll","frustrated"]],["1F62C",["grimacing","grimacing_face","face","grimace","teeth"]],["1F62E-200D-1F4A8",["face_exhaling"]],["1F925",["lying_face","face","lie","pinocchio"]],["1F60C",["relieved","relieved_face","face","relaxed","phew","massage","happiness"]],["1F614",["pensive","pensive_face","face","sad","depressed","upset"]],["1F62A",["sleepy","sleepy_face","face","tired","rest","nap"]],["1F924",["drooling_face","face"]],["1F634",["sleeping","sleeping_face","face","tired","sleepy","night","zzz"]],["1F637",["mask","face_with_medical_mask","face","sick","ill","disease"]],["1F912",["face_with_thermometer","sick","temperature","thermometer","cold","fever"]],["1F915",["face_with_head_bandage","injured","clumsy","bandage","hurt"]],["1F922",["nauseated_face","face","vomit","gross","green","sick","throw up","ill"]],["1F92E",["face_vomiting","face","sick"]],["1F927",["sneezing_face","face","gesundheit","sneeze","sick","allergy"]],["1F975",["hot_face","face","feverish","heat","red","sweating"]],["1F976",["cold_face","face","blue","freezing","frozen","frostbite","icicles"]],["1F974",["woozy_face","face","dizzy","intoxicated","tipsy","wavy"]],["1F635",["dizzy_face","spent","unconscious","xox","dizzy"]],["1F635-200D-1F4AB",["face_with_spiral_eyes"]],["1F92F",["exploding_head","face","shocked","mind","blown"]],["1F920",["face_with_cowboy_hat","cowboy_hat_face","face","cowgirl","hat"]],["1F973",["partying_face","face","celebration","woohoo"]],["1F978",["disguised_face","disguised face","pretent","brows","glasses","moustache"]],["1F60E",["sunglasses","smiling_face_with_sunglasses","face","cool","smile","summer","beach","sunglass"]],["1F913",["nerd_face","face","nerdy","geek","dork"]],["1F9D0",["face_with_monocle","face","stuffy","wealthy"]],["1F615",["confused","confused_face","face","indifference","huh","weird","hmmm",":/"]],["1F61F",["worried","worried_face","face","concern","nervous",":("]],["1F641",["slightly_frowning_face","face","frowning","disappointed","sad","upset"]],["2639-FE0F",["white_frowning_face","frowning_face","face","sad","upset","frown"]],["1F62E",["open_mouth","face_with_open_mouth","face","surprise","impressed","wow","whoa",":O"]],["1F62F",["hushed","hushed_face","face","woo","shh"]],["1F632",["astonished","astonished_face","face","xox","surprised","poisoned"]],["1F633",["flushed","flushed_face","face","blush","shy","flattered"]],["1F97A",["pleading_face","face","begging","mercy"]],["1F626",["frowning","frowning_face_with_open_mouth","face","aw","what"]],["1F627",["anguished","anguished_face","face","stunned","nervous"]],["1F628",["fearful","fearful_face","face","scared","terrified","nervous","oops","huh"]],["1F630",["cold_sweat","anxious_face_with_sweat","face","nervous","sweat"]],["1F625",["disappointed_relieved","sad_but_relieved_face","face","phew","sweat","nervous"]],["1F622",["cry","crying_face","face","tears","sad","depressed","upset",":\'("]],["1F62D",["sob","loudly_crying_face","face","cry","tears","sad","upset","depressed"]],["1F631",["scream","face_screaming_in_fear","face","munch","scared","omg"]],["1F616",["confounded","confounded_face","face","confused","sick","unwell","oops",":S"]],["1F623",["persevere","persevering_face","face","sick","no","upset","oops"]],["1F61E",["disappointed","disappointed_face","face","sad","upset","depressed",":("]],["1F613",["sweat","downcast_face_with_sweat","face","hot","sad","tired","exercise"]],["1F629",["weary","weary_face","face","tired","sleepy","sad","frustrated","upset"]],["1F62B",["tired_face","sick","whine","upset","frustrated"]],["1F971",["yawning_face","tired","sleepy"]],["1F624",["triumph","face_with_steam_from_nose","face","gas","phew","proud","pride"]],["1F621",["rage","pouting_face","angry","mad","hate","despise"]],["1F620",["angry","angry_face","mad","face","annoyed","frustrated"]],["1F92C",["face_with_symbols_on_mouth","face","swearing","cursing","cussing","profanity","expletive"]],["1F608",["smiling_imp","smiling_face_with_horns","devil","horns"]],["1F47F",["imp","angry_face_with_horns","devil","angry","horns"]],["1F480",["skull","dead","skeleton","creepy","death"]],["2620-FE0F",["skull_and_crossbones","poison","danger","deadly","scary","death","pirate","evil"]],["1F4A9",["hankey","pile_of_poo","shitface","fail","turd","shit"]],["1F921",["clown_face","face"]],["1F479",["japanese_ogre","ogre","monster","red","mask","halloween","scary","creepy","devil","demon","japanese"]],["1F47A",["japanese_goblin","goblin","red","evil","mask","monster","scary","creepy","japanese"]],["1F47B",["ghost","halloween","spooky","scary"]],["1F47D",["alien","UFO","paul","weird","outer_space"]],["1F47E",["space_invader","alien_monster","game","arcade","play"]],["1F916",["robot_face","robot","computer","machine","bot"]],["1F63A",["smiley_cat","grinning_cat","animal","cats","happy","smile"]],["1F638",["smile_cat","grinning_cat_with_smiling_eyes","animal","cats","smile"]],["1F639",["joy_cat","cat_with_tears_of_joy","animal","cats","haha","happy","tears"]],["1F63B",["heart_eyes_cat","smiling_cat_with_heart_eyes","animal","love","like","affection","cats","valentines","heart"]],["1F63C",["smirk_cat","cat_with_wry_smile","animal","cats","smirk"]],["1F63D",["kissing_cat","animal","cats","kiss"]],["1F640",["scream_cat","weary_cat","animal","cats","munch","scared","scream"]],["1F63F",["crying_cat_face","crying_cat","animal","tears","weep","sad","cats","upset","cry"]],["1F63E",["pouting_cat","animal","cats"]],["1F648",["see_no_evil","see_no_evil_monkey","monkey","animal","nature","haha"]],["1F649",["hear_no_evil","hear_no_evil_monkey","animal","monkey","nature"]],["1F64A",["speak_no_evil","speak_no_evil_monkey","monkey","animal","nature","omg"]],["1F48B",["kiss","kiss_mark","face","lips","love","like","affection","valentines"]],["1F48C",["love_letter","email","like","affection","envelope","valentines"]],["1F498",["cupid","heart_with_arrow","love","like","heart","affection","valentines"]],["1F49D",["gift_heart","heart_with_ribbon","love","valentines"]],["1F496",["sparkling_heart","love","like","affection","valentines"]],["1F497",["heartpulse","growing_heart","like","love","affection","valentines","pink"]],["1F493",["heartbeat","beating_heart","love","like","affection","valentines","pink","heart"]],["1F49E",["revolving_hearts","love","like","affection","valentines"]],["1F495",["two_hearts","love","like","affection","valentines","heart"]],["1F49F",["heart_decoration","purple-square","love","like"]],["2763-FE0F",["heavy_heart_exclamation_mark_ornament","heart_exclamation","decoration","love"]],["1F494",["broken_heart","sad","sorry","break","heart","heartbreak"]],["2764-FE0F-200D-1F525",["heart_on_fire"]],["2764-FE0F-200D-1FA79",["mending_heart"]],["2764-FE0F",["heart","red_heart","love","like","valentines"]],["1F9E1",["orange_heart","love","like","affection","valentines"]],["1F49B",["yellow_heart","love","like","affection","valentines"]],["1F49A",["green_heart","love","like","affection","valentines"]],["1F499",["blue_heart","love","like","affection","valentines"]],["1F49C",["purple_heart","love","like","affection","valentines"]],["1F90E",["brown_heart","coffee"]],["1F5A4",["black_heart","evil"]],["1F90D",["white_heart","pure"]],["1F4AF",["100","hundred_points","score","perfect","numbers","century","exam","quiz","test","pass","hundred"]],["1F4A2",["anger","anger_symbol","angry","mad"]],["1F4A5",["boom","collision","bomb","explode","explosion","blown"]],["1F4AB",["dizzy","star","sparkle","shoot","magic"]],["1F4A6",["sweat_drops","sweat_droplets","water","drip","oops"]],["1F4A8",["dash","dashing_away","wind","air","fast","shoo","fart","smoke","puff"]],["1F573-FE0F",["hole","embarrassing"]],["1F4A3",["bomb","boom","explode","explosion","terrorism"]],["1F4AC",["speech_balloon","bubble","words","message","talk","chatting"]],["1F441-FE0F-200D-1F5E8-FE0F",["eye-in-speech-bubble","eye_in_speech_bubble","info"]],["1F5E8-FE0F",["left_speech_bubble","words","message","talk","chatting"]],["1F5EF-FE0F",["right_anger_bubble","caption","speech","thinking","mad"]],["1F4AD",["thought_balloon","bubble","cloud","speech","thinking","dream"]],["1F4A4",["zzz","sleepy","tired","dream"]],["1F44B",["wave","waving_hand","hands","gesture","goodbye","solong","farewell","hello","hi","palm"]],["1F91A",["raised_back_of_hand","fingers","raised","backhand"]],["1F590-FE0F",["raised_hand_with_fingers_splayed","hand_with_fingers_splayed","hand","fingers","palm"]],["270B",["hand","raised_hand","fingers","stop","highfive","palm","ban"]],["1F596",["spock-hand","vulcan_salute","hand","fingers","spock","star trek"]],["1F44C",["ok_hand","fingers","limbs","perfect","ok","okay"]],["1F90C",["pinched_fingers","pinched fingers","size","tiny","small"]],["1F90F",["pinching_hand","tiny","small","size"]],["270C-FE0F",["v","victory_hand","fingers","ohyeah","hand","peace","victory","two"]],["1F91E",["crossed_fingers","good","lucky"]],["1F91F",["i_love_you_hand_sign","love_you_gesture","hand","fingers","gesture"]],["1F918",["the_horns","sign_of_the_horns","hand","fingers","evil_eye","sign_of_horns","rock_on"]],["1F919",["call_me_hand","hands","gesture"]],["1F448",["point_left","backhand_index_pointing_left","direction","fingers","hand","left"]],["1F449",["point_right","backhand_index_pointing_right","fingers","hand","direction","right"]],["1F446",["point_up_2","backhand_index_pointing_up","fingers","hand","direction","up"]],["1F595",["middle_finger","hand","fingers","rude","middle","flipping"]],["1F447",["point_down","backhand_index_pointing_down","fingers","hand","direction","down"]],["261D-FE0F",["point_up","index_pointing_up","hand","fingers","direction","up"]],["1F44D",["+1","thumbs_up","thumbsup","yes","awesome","good","agree","accept","cool","hand","like"]],["1F44E",["-1","thumbs_down","thumbsdown","no","dislike","hand"]],["270A",["fist","raised_fist","fingers","hand","grasp"]],["1F44A",["facepunch","oncoming_fist","angry","violence","fist","hit","attack","hand"]],["1F91B",["left-facing_fist","left_facing_fist","hand","fistbump"]],["1F91C",["right-facing_fist","right_facing_fist","hand","fistbump"]],["1F44F",["clap","clapping_hands","hands","praise","applause","congrats","yay"]],["1F64C",["raised_hands","raising_hands","gesture","hooray","yea","celebration","hands"]],["1F450",["open_hands","fingers","butterfly","hands","open"]],["1F932",["palms_up_together","hands","gesture","cupped","prayer"]],["1F91D",["handshake","agreement","shake"]],["1F64F",["pray","folded_hands","please","hope","wish","namaste","highfive"]],["270D-FE0F",["writing_hand","lower_left_ballpoint_pen","stationery","write","compose"]],["1F485",["nail_care","nail_polish","beauty","manicure","finger","fashion","nail"]],["1F933",["selfie","camera","phone"]],["1F4AA",["muscle","flexed_biceps","arm","flex","hand","summer","strong","biceps"]],["1F9BE",["mechanical_arm","accessibility"]],["1F9BF",["mechanical_leg","accessibility"]],["1F9B5",["leg","kick","limb"]],["1F9B6",["foot","kick","stomp"]],["1F442",["ear","face","hear","sound","listen"]],["1F9BB",["ear_with_hearing_aid","accessibility"]],["1F443",["nose","smell","sniff"]],["1F9E0",["brain","smart","intelligent"]],["1FAC0",["anatomical_heart","anatomical heart","health","heartbeat"]],["1FAC1",["lungs","breathe"]],["1F9B7",["tooth","teeth","dentist"]],["1F9B4",["bone","skeleton"]],["1F440",["eyes","look","watch","stalk","peek","see"]],["1F441-FE0F",["eye","face","look","see","watch","stare"]],["1F445",["tongue","mouth","playful"]],["1F444",["lips","mouth","kiss"]],["1F476",["baby","child","boy","girl","toddler"]],["1F9D2",["child","gender-neutral","young"]],["1F466",["boy","man","male","guy","teenager"]],["1F467",["girl","female","woman","teenager"]],["1F9D1",["adult","person","gender-neutral"]],["1F471",["person_with_blond_hair","person_blond_hair","hairstyle"]],["1F468",["man","mustache","father","dad","guy","classy","sir","moustache"]],["1F9D4",["bearded_person","man_beard","person","bewhiskered"]],["1F9D4-200D-2642-FE0F",["man_with_beard"]],["1F9D4-200D-2640-FE0F",["woman_with_beard"]],["1F468-200D-1F9B0",["red_haired_man","man_red_hair","hairstyle"]],["1F468-200D-1F9B1",["curly_haired_man","man_curly_hair","hairstyle"]],["1F468-200D-1F9B3",["white_haired_man","man_white_hair","old","elder"]],["1F468-200D-1F9B2",["bald_man","man_bald","hairless"]],["1F469",["woman","female","girls","lady"]],["1F469-200D-1F9B0",["red_haired_woman","woman_red_hair","hairstyle"]],["1F9D1-200D-1F9B0",["red_haired_person","person_red_hair","hairstyle"]],["1F469-200D-1F9B1",["curly_haired_woman","woman_curly_hair","hairstyle"]],["1F9D1-200D-1F9B1",["curly_haired_person","person_curly_hair","hairstyle"]],["1F469-200D-1F9B3",["white_haired_woman","woman_white_hair","old","elder"]],["1F9D1-200D-1F9B3",["white_haired_person","person_white_hair","elder","old"]],["1F469-200D-1F9B2",["bald_woman","woman_bald","hairless"]],["1F9D1-200D-1F9B2",["bald_person","person_bald","hairless"]],["1F471-200D-2640-FE0F",["blond-haired-woman","woman_blond_hair","woman","female","girl","blonde","person"]],["1F471-200D-2642-FE0F",["blond-haired-man","man_blond_hair","man","male","boy","blonde","guy","person"]],["1F9D3",["older_adult","older_person","human","elder","senior","gender-neutral"]],["1F474",["older_man","old_man","human","male","men","old","elder","senior"]],["1F475",["older_woman","old_woman","human","female","women","lady","old","elder","senior"]],["1F64D",["person_frowning","worried"]],["1F64D-200D-2642-FE0F",["man-frowning","man_frowning","male","boy","man","sad","depressed","discouraged","unhappy"]],["1F64D-200D-2640-FE0F",["woman-frowning","woman_frowning","female","girl","woman","sad","depressed","discouraged","unhappy"]],["1F64E",["person_with_pouting_face","person_pouting","upset"]],["1F64E-200D-2642-FE0F",["man-pouting","man_pouting","male","boy","man"]],["1F64E-200D-2640-FE0F",["woman-pouting","woman_pouting","female","girl","woman"]],["1F645",["no_good","person_gesturing_no","decline"]],["1F645-200D-2642-FE0F",["man-gesturing-no","man_gesturing_no","male","boy","man","nope"]],["1F645-200D-2640-FE0F",["woman-gesturing-no","woman_gesturing_no","female","girl","woman","nope"]],["1F646",["ok_woman","person_gesturing_ok","agree"]],["1F646-200D-2642-FE0F",["man-gesturing-ok","man_gesturing_ok","men","boy","male","blue","human","man"]],["1F646-200D-2640-FE0F",["woman-gesturing-ok","woman_gesturing_ok","women","girl","female","pink","human","woman"]],["1F481",["information_desk_person","person_tipping_hand","information"]],["1F481-200D-2642-FE0F",["man-tipping-hand","man_tipping_hand","male","boy","man","human","information"]],["1F481-200D-2640-FE0F",["woman-tipping-hand","woman_tipping_hand","female","girl","woman","human","information"]],["1F64B",["raising_hand","person_raising_hand","question"]],["1F64B-200D-2642-FE0F",["man-raising-hand","man_raising_hand","male","boy","man"]],["1F64B-200D-2640-FE0F",["woman-raising-hand","woman_raising_hand","female","girl","woman"]],["1F9CF",["deaf_person","accessibility"]],["1F9CF-200D-2642-FE0F",["deaf_man","accessibility"]],["1F9CF-200D-2640-FE0F",["deaf_woman","accessibility"]],["1F647",["bow","person_bowing","respectiful"]],["1F647-200D-2642-FE0F",["man-bowing","man_bowing","man","male","boy"]],["1F647-200D-2640-FE0F",["woman-bowing","woman_bowing","woman","female","girl"]],["1F926",["face_palm","person_facepalming","disappointed"]],["1F926-200D-2642-FE0F",["man-facepalming","man_facepalming","man","male","boy","disbelief"]],["1F926-200D-2640-FE0F",["woman-facepalming","woman_facepalming","woman","female","girl","disbelief"]],["1F937",["shrug","person_shrugging","regardless"]],["1F937-200D-2642-FE0F",["man-shrugging","man_shrugging","man","male","boy","confused","indifferent","doubt"]],["1F937-200D-2640-FE0F",["woman-shrugging","woman_shrugging","woman","female","girl","confused","indifferent","doubt"]],["1F9D1-200D-2695-FE0F",["health_worker","hospital"]],["1F468-200D-2695-FE0F",["male-doctor","man_health_worker","doctor","nurse","therapist","healthcare","man","human"]],["1F469-200D-2695-FE0F",["female-doctor","woman_health_worker","doctor","nurse","therapist","healthcare","woman","human"]],["1F9D1-200D-1F393",["student","learn"]],["1F468-200D-1F393",["male-student","man_student","graduate","man","human"]],["1F469-200D-1F393",["female-student","woman_student","graduate","woman","human"]],["1F9D1-200D-1F3EB",["teacher","professor"]],["1F468-200D-1F3EB",["male-teacher","man_teacher","instructor","professor","man","human"]],["1F469-200D-1F3EB",["female-teacher","woman_teacher","instructor","professor","woman","human"]],["1F9D1-200D-2696-FE0F",["judge","law"]],["1F468-200D-2696-FE0F",["male-judge","man_judge","justice","court","man","human"]],["1F469-200D-2696-FE0F",["female-judge","woman_judge","justice","court","woman","human"]],["1F9D1-200D-1F33E",["farmer","crops"]],["1F468-200D-1F33E",["male-farmer","man_farmer","rancher","gardener","man","human"]],["1F469-200D-1F33E",["female-farmer","woman_farmer","rancher","gardener","woman","human"]],["1F9D1-200D-1F373",["cook","food","kitchen","culinary"]],["1F468-200D-1F373",["male-cook","man_cook","chef","man","human"]],["1F469-200D-1F373",["female-cook","woman_cook","chef","woman","human"]],["1F9D1-200D-1F527",["mechanic","worker","technician"]],["1F468-200D-1F527",["male-mechanic","man_mechanic","plumber","man","human","wrench"]],["1F469-200D-1F527",["female-mechanic","woman_mechanic","plumber","woman","human","wrench"]],["1F9D1-200D-1F3ED",["factory_worker","labor"]],["1F468-200D-1F3ED",["male-factory-worker","man_factory_worker","assembly","industrial","man","human"]],["1F469-200D-1F3ED",["female-factory-worker","woman_factory_worker","assembly","industrial","woman","human"]],["1F9D1-200D-1F4BC",["office_worker","business"]],["1F468-200D-1F4BC",["male-office-worker","man_office_worker","business","manager","man","human"]],["1F469-200D-1F4BC",["female-office-worker","woman_office_worker","business","manager","woman","human"]],["1F9D1-200D-1F52C",["scientist","chemistry"]],["1F468-200D-1F52C",["male-scientist","man_scientist","biologist","chemist","engineer","physicist","man","human"]],["1F469-200D-1F52C",["female-scientist","woman_scientist","biologist","chemist","engineer","physicist","woman","human"]],["1F9D1-200D-1F4BB",["technologist","computer"]],["1F468-200D-1F4BB",["male-technologist","man_technologist","coder","developer","engineer","programmer","software","man","human","laptop","computer"]],["1F469-200D-1F4BB",["female-technologist","woman_technologist","coder","developer","engineer","programmer","software","woman","human","laptop","computer"]],["1F9D1-200D-1F3A4",["singer","song","artist","performer"]],["1F468-200D-1F3A4",["male-singer","man_singer","rockstar","entertainer","man","human"]],["1F469-200D-1F3A4",["female-singer","woman_singer","rockstar","entertainer","woman","human"]],["1F9D1-200D-1F3A8",["artist","painting","draw","creativity"]],["1F468-200D-1F3A8",["male-artist","man_artist","painter","man","human"]],["1F469-200D-1F3A8",["female-artist","woman_artist","painter","woman","human"]],["1F9D1-200D-2708-FE0F",["pilot","fly","plane","airplane"]],["1F468-200D-2708-FE0F",["male-pilot","man_pilot","aviator","plane","man","human"]],["1F469-200D-2708-FE0F",["female-pilot","woman_pilot","aviator","plane","woman","human"]],["1F9D1-200D-1F680",["astronaut","outerspace"]],["1F468-200D-1F680",["male-astronaut","man_astronaut","space","rocket","man","human"]],["1F469-200D-1F680",["female-astronaut","woman_astronaut","space","rocket","woman","human"]],["1F9D1-200D-1F692",["firefighter","fire"]],["1F468-200D-1F692",["male-firefighter","man_firefighter","fireman","man","human"]],["1F469-200D-1F692",["female-firefighter","woman_firefighter","fireman","woman","human"]],["1F46E",["cop","police_officer"]],["1F46E-200D-2642-FE0F",["male-police-officer","man_police_officer","man","police","law","legal","enforcement","arrest","911"]],["1F46E-200D-2640-FE0F",["female-police-officer","woman_police_officer","woman","police","law","legal","enforcement","arrest","911","female"]],["1F575-FE0F",["sleuth_or_spy","detective","human","spy"]],["1F575-FE0F-200D-2642-FE0F",["male-detective","man_detective","crime"]],["1F575-FE0F-200D-2640-FE0F",["female-detective","woman_detective","human","spy","detective","female","woman"]],["1F482",["guardsman","guard","protect"]],["1F482-200D-2642-FE0F",["male-guard","man_guard","uk","gb","british","male","guy","royal"]],["1F482-200D-2640-FE0F",["female-guard","woman_guard","uk","gb","british","female","royal","woman"]],["1F977",["ninja","ninjutsu","skills","japanese"]],["1F477",["construction_worker","labor","build"]],["1F477-200D-2642-FE0F",["male-construction-worker","man_construction_worker","male","human","wip","guy","build","construction","worker","labor"]],["1F477-200D-2640-FE0F",["female-construction-worker","woman_construction_worker","female","human","wip","build","construction","worker","labor","woman"]],["1F934",["prince","boy","man","male","crown","royal","king"]],["1F478",["princess","girl","woman","female","blond","crown","royal","queen"]],["1F473",["man_with_turban","person_wearing_turban","headdress"]],["1F473-200D-2642-FE0F",["man-wearing-turban","man_wearing_turban","male","indian","hinduism","arabs"]],["1F473-200D-2640-FE0F",["woman-wearing-turban","woman_wearing_turban","female","indian","hinduism","arabs","woman"]],["1F472",["man_with_gua_pi_mao","man_with_skullcap","male","boy","chinese"]],["1F9D5",["person_with_headscarf","woman_with_headscarf","female","hijab","mantilla","tichel"]],["1F935",["person_in_tuxedo","man_in_tuxedo","couple","marriage","wedding","groom"]],["1F935-200D-2642-FE0F",["man_in_tuxedo","man in tuxedo","formal","fashion"]],["1F935-200D-2640-FE0F",["woman_in_tuxedo","woman in tuxedo","formal","fashion"]],["1F470",["bride_with_veil","couple","marriage","wedding","woman","bride"]],["1F470-200D-2642-FE0F",["man_with_veil","man with veil","wedding","marriage"]],["1F470-200D-2640-FE0F",["woman_with_veil","woman with veil","wedding","marriage"]],["1F930",["pregnant_woman","baby"]],["1F931",["breast-feeding","breast_feeding","nursing","baby"]],["1F469-200D-1F37C",["woman_feeding_baby","woman feeding baby","birth","food"]],["1F468-200D-1F37C",["man_feeding_baby","man feeding baby","birth","food"]],["1F9D1-200D-1F37C",["person_feeding_baby","person feeding baby","birth","food"]],["1F47C",["angel","baby_angel","heaven","wings","halo"]],["1F385",["santa","santa_claus","festival","man","male","xmas","father christmas"]],["1F936",["mrs_claus","woman","female","xmas","mother christmas"]],["1F9D1-200D-1F384",["mx_claus","mx claus","christmas"]],["1F9B8",["superhero","marvel"]],["1F9B8-200D-2642-FE0F",["male_superhero","man_superhero","man","male","good","hero","superpowers"]],["1F9B8-200D-2640-FE0F",["female_superhero","woman_superhero","woman","female","good","heroine","superpowers"]],["1F9B9",["supervillain","marvel"]],["1F9B9-200D-2642-FE0F",["male_supervillain","man_supervillain","man","male","evil","bad","criminal","hero","superpowers"]],["1F9B9-200D-2640-FE0F",["female_supervillain","woman_supervillain","woman","female","evil","bad","criminal","heroine","superpowers"]],["1F9D9",["mage","magic"]],["1F9D9-200D-2642-FE0F",["male_mage","man_mage","man","male","mage","sorcerer"]],["1F9D9-200D-2640-FE0F",["female_mage","woman_mage","woman","female","mage","witch"]],["1F9DA",["fairy","wings","magical"]],["1F9DA-200D-2642-FE0F",["male_fairy","man_fairy","man","male"]],["1F9DA-200D-2640-FE0F",["female_fairy","woman_fairy","woman","female"]],["1F9DB",["vampire","blood","twilight"]],["1F9DB-200D-2642-FE0F",["male_vampire","man_vampire","man","male","dracula"]],["1F9DB-200D-2640-FE0F",["female_vampire","woman_vampire","woman","female"]],["1F9DC",["merperson","sea"]],["1F9DC-200D-2642-FE0F",["merman","man","male","triton"]],["1F9DC-200D-2640-FE0F",["mermaid","woman","female","merwoman","ariel"]],["1F9DD",["elf","magical"]],["1F9DD-200D-2642-FE0F",["male_elf","man_elf","man","male"]],["1F9DD-200D-2640-FE0F",["female_elf","woman_elf","woman","female"]],["1F9DE",["genie","magical","wishes"]],["1F9DE-200D-2642-FE0F",["male_genie","man_genie","man","male"]],["1F9DE-200D-2640-FE0F",["female_genie","woman_genie","woman","female"]],["1F9DF",["zombie","dead"]],["1F9DF-200D-2642-FE0F",["male_zombie","man_zombie","man","male","dracula","undead","walking dead"]],["1F9DF-200D-2640-FE0F",["female_zombie","woman_zombie","woman","female","undead","walking dead"]],["1F486",["massage","person_getting_massage","relax"]],["1F486-200D-2642-FE0F",["man-getting-massage","man_getting_massage","male","boy","man","head"]],["1F486-200D-2640-FE0F",["woman-getting-massage","woman_getting_massage","female","girl","woman","head"]],["1F487",["haircut","person_getting_haircut","hairstyle"]],["1F487-200D-2642-FE0F",["man-getting-haircut","man_getting_haircut","male","boy","man"]],["1F487-200D-2640-FE0F",["woman-getting-haircut","woman_getting_haircut","female","girl","woman"]],["1F6B6",["walking","person_walking","move"]],["1F6B6-200D-2642-FE0F",["man-walking","man_walking","human","feet","steps"]],["1F6B6-200D-2640-FE0F",["woman-walking","woman_walking","human","feet","steps","woman","female"]],["1F9CD",["standing_person","person_standing","still"]],["1F9CD-200D-2642-FE0F",["man_standing","still"]],["1F9CD-200D-2640-FE0F",["woman_standing","still"]],["1F9CE",["kneeling_person","person_kneeling","pray","respectful"]],["1F9CE-200D-2642-FE0F",["man_kneeling","pray","respectful"]],["1F9CE-200D-2640-FE0F",["woman_kneeling","respectful","pray"]],["1F9D1-200D-1F9AF",["person_with_probing_cane","blind"]],["1F468-200D-1F9AF",["man_with_probing_cane","blind"]],["1F469-200D-1F9AF",["woman_with_probing_cane","blind"]],["1F9D1-200D-1F9BC",["person_in_motorized_wheelchair","disability","accessibility"]],["1F468-200D-1F9BC",["man_in_motorized_wheelchair","disability","accessibility"]],["1F469-200D-1F9BC",["woman_in_motorized_wheelchair","disability","accessibility"]],["1F9D1-200D-1F9BD",["person_in_manual_wheelchair","disability","accessibility"]],["1F468-200D-1F9BD",["man_in_manual_wheelchair","disability","accessibility"]],["1F469-200D-1F9BD",["woman_in_manual_wheelchair","disability","accessibility"]],["1F3C3",["runner","person_running","move"]],["1F3C3-200D-2642-FE0F",["man-running","man_running","man","walking","exercise","race","running"]],["1F3C3-200D-2640-FE0F",["woman-running","woman_running","woman","walking","exercise","race","running","female"]],["1F483",["dancer","woman_dancing","female","girl","woman","fun"]],["1F57A",["man_dancing","male","boy","fun","dancer"]],["1F574-FE0F",["man_in_business_suit_levitating","man_in_suit_levitating","suit","business","levitate","hover","jump"]],["1F46F",["dancers","people_with_bunny_ears","perform","costume"]],["1F46F-200D-2642-FE0F",["men-with-bunny-ears-partying","men_with_bunny_ears","male","bunny","men","boys"]],["1F46F-200D-2640-FE0F",["women-with-bunny-ears-partying","women_with_bunny_ears","female","bunny","women","girls"]],["1F9D6",["person_in_steamy_room","relax","spa"]],["1F9D6-200D-2642-FE0F",["man_in_steamy_room","male","man","spa","steamroom","sauna"]],["1F9D6-200D-2640-FE0F",["woman_in_steamy_room","female","woman","spa","steamroom","sauna"]],["1F9D7",["person_climbing","sport"]],["1F9D7-200D-2642-FE0F",["man_climbing","sports","hobby","man","male","rock"]],["1F9D7-200D-2640-FE0F",["woman_climbing","sports","hobby","woman","female","rock"]],["1F93A",["fencer","person_fencing","sports","fencing","sword"]],["1F3C7",["horse_racing","animal","betting","competition","gambling","luck"]],["26F7-FE0F",["skier","sports","winter","snow"]],["1F3C2",["snowboarder","sports","winter"]],["1F3CC-FE0F",["golfer","person_golfing","sports","business"]],["1F3CC-FE0F-200D-2642-FE0F",["man-golfing","man_golfing","sport"]],["1F3CC-FE0F-200D-2640-FE0F",["woman-golfing","woman_golfing","sports","business","woman","female"]],["1F3C4",["surfer","person_surfing","sport","sea"]],["1F3C4-200D-2642-FE0F",["man-surfing","man_surfing","sports","ocean","sea","summer","beach"]],["1F3C4-200D-2640-FE0F",["woman-surfing","woman_surfing","sports","ocean","sea","summer","beach","woman","female"]],["1F6A3",["rowboat","person_rowing_boat","sport","move"]],["1F6A3-200D-2642-FE0F",["man-rowing-boat","man_rowing_boat","sports","hobby","water","ship"]],["1F6A3-200D-2640-FE0F",["woman-rowing-boat","woman_rowing_boat","sports","hobby","water","ship","woman","female"]],["1F3CA",["swimmer","person_swimming","sport","pool"]],["1F3CA-200D-2642-FE0F",["man-swimming","man_swimming","sports","exercise","human","athlete","water","summer"]],["1F3CA-200D-2640-FE0F",["woman-swimming","woman_swimming","sports","exercise","human","athlete","water","summer","woman","female"]],["26F9-FE0F",["person_with_ball","person_bouncing_ball","sports","human"]],["26F9-FE0F-200D-2642-FE0F",["man-bouncing-ball","man_bouncing_ball","sport"]],["26F9-FE0F-200D-2640-FE0F",["woman-bouncing-ball","woman_bouncing_ball","sports","human","woman","female"]],["1F3CB-FE0F",["weight_lifter","person_lifting_weights","sports","training","exercise"]],["1F3CB-FE0F-200D-2642-FE0F",["man-lifting-weights","man_lifting_weights","sport"]],["1F3CB-FE0F-200D-2640-FE0F",["woman-lifting-weights","woman_lifting_weights","sports","training","exercise","woman","female"]],["1F6B4",["bicyclist","person_biking","sport","move"]],["1F6B4-200D-2642-FE0F",["man-biking","man_biking","sports","bike","exercise","hipster"]],["1F6B4-200D-2640-FE0F",["woman-biking","woman_biking","sports","bike","exercise","hipster","woman","female"]],["1F6B5",["mountain_bicyclist","person_mountain_biking","sport","move"]],["1F6B5-200D-2642-FE0F",["man-mountain-biking","man_mountain_biking","transportation","sports","human","race","bike"]],["1F6B5-200D-2640-FE0F",["woman-mountain-biking","woman_mountain_biking","transportation","sports","human","race","bike","woman","female"]],["1F938",["person_doing_cartwheel","person_cartwheeling","sport","gymnastic"]],["1F938-200D-2642-FE0F",["man-cartwheeling","man_cartwheeling","gymnastics"]],["1F938-200D-2640-FE0F",["woman-cartwheeling","woman_cartwheeling","gymnastics"]],["1F93C",["wrestlers","people_wrestling","sport"]],["1F93C-200D-2642-FE0F",["man-wrestling","men_wrestling","sports","wrestlers"]],["1F93C-200D-2640-FE0F",["woman-wrestling","women_wrestling","sports","wrestlers"]],["1F93D",["water_polo","person_playing_water_polo","sport"]],["1F93D-200D-2642-FE0F",["man-playing-water-polo","man_playing_water_polo","sports","pool"]],["1F93D-200D-2640-FE0F",["woman-playing-water-polo","woman_playing_water_polo","sports","pool"]],["1F93E",["handball","person_playing_handball","sport"]],["1F93E-200D-2642-FE0F",["man-playing-handball","man_playing_handball","sports"]],["1F93E-200D-2640-FE0F",["woman-playing-handball","woman_playing_handball","sports"]],["1F939",["juggling","person_juggling","performance","balance"]],["1F939-200D-2642-FE0F",["man-juggling","man_juggling","juggle","balance","skill","multitask"]],["1F939-200D-2640-FE0F",["woman-juggling","woman_juggling","juggle","balance","skill","multitask"]],["1F9D8",["person_in_lotus_position","meditate"]],["1F9D8-200D-2642-FE0F",["man_in_lotus_position","man","male","meditation","yoga","serenity","zen","mindfulness"]],["1F9D8-200D-2640-FE0F",["woman_in_lotus_position","woman","female","meditation","yoga","serenity","zen","mindfulness"]],["1F6C0",["bath","person_taking_bath","clean","shower","bathroom"]],["1F6CC",["sleeping_accommodation","person_in_bed","bed","rest"]],["1F9D1-200D-1F91D-200D-1F9D1",["people_holding_hands","friendship"]],["1F46D",["two_women_holding_hands","women_holding_hands","pair","friendship","couple","love","like","female","people","human"]],["1F46B",["man_and_woman_holding_hands","woman_and_man_holding_hands","pair","people","human","love","date","dating","like","affection","valentines","marriage"]],["1F46C",["two_men_holding_hands","men_holding_hands","pair","couple","love","like","bromance","friendship","people","human"]],["1F48F",["couplekiss","kiss","pair","valentines","love","like","dating","marriage"]],["1F469-200D-2764-FE0F-200D-1F48B-200D-1F468",["woman-kiss-man","kiss_woman_man","love"]],["1F468-200D-2764-FE0F-200D-1F48B-200D-1F468",["man-kiss-man","kiss_man_man","pair","valentines","love","like","dating","marriage"]],["1F469-200D-2764-FE0F-200D-1F48B-200D-1F469",["woman-kiss-woman","kiss_woman_woman","pair","valentines","love","like","dating","marriage"]],["1F491",["couple_with_heart","pair","love","like","affection","human","dating","valentines","marriage"]],["1F469-200D-2764-FE0F-200D-1F468",["woman-heart-man","couple_with_heart_woman_man","love"]],["1F468-200D-2764-FE0F-200D-1F468",["man-heart-man","couple_with_heart_man_man","pair","love","like","affection","human","dating","valentines","marriage"]],["1F469-200D-2764-FE0F-200D-1F469",["woman-heart-woman","couple_with_heart_woman_woman","pair","love","like","affection","human","dating","valentines","marriage"]],["1F46A",["family","home","parents","child","mom","dad","father","mother","people","human"]],["1F468-200D-1F469-200D-1F466",["man-woman-boy","family_man_woman_boy","love"]],["1F468-200D-1F469-200D-1F467",["man-woman-girl","family_man_woman_girl","home","parents","people","human","child"]],["1F468-200D-1F469-200D-1F467-200D-1F466",["man-woman-girl-boy","family_man_woman_girl_boy","home","parents","people","human","children"]],["1F468-200D-1F469-200D-1F466-200D-1F466",["man-woman-boy-boy","family_man_woman_boy_boy","home","parents","people","human","children"]],["1F468-200D-1F469-200D-1F467-200D-1F467",["man-woman-girl-girl","family_man_woman_girl_girl","home","parents","people","human","children"]],["1F468-200D-1F468-200D-1F466",["man-man-boy","family_man_man_boy","home","parents","people","human","children"]],["1F468-200D-1F468-200D-1F467",["man-man-girl","family_man_man_girl","home","parents","people","human","children"]],["1F468-200D-1F468-200D-1F467-200D-1F466",["man-man-girl-boy","family_man_man_girl_boy","home","parents","people","human","children"]],["1F468-200D-1F468-200D-1F466-200D-1F466",["man-man-boy-boy","family_man_man_boy_boy","home","parents","people","human","children"]],["1F468-200D-1F468-200D-1F467-200D-1F467",["man-man-girl-girl","family_man_man_girl_girl","home","parents","people","human","children"]],["1F469-200D-1F469-200D-1F466",["woman-woman-boy","family_woman_woman_boy","home","parents","people","human","children"]],["1F469-200D-1F469-200D-1F467",["woman-woman-girl","family_woman_woman_girl","home","parents","people","human","children"]],["1F469-200D-1F469-200D-1F467-200D-1F466",["woman-woman-girl-boy","family_woman_woman_girl_boy","home","parents","people","human","children"]],["1F469-200D-1F469-200D-1F466-200D-1F466",["woman-woman-boy-boy","family_woman_woman_boy_boy","home","parents","people","human","children"]],["1F469-200D-1F469-200D-1F467-200D-1F467",["woman-woman-girl-girl","family_woman_woman_girl_girl","home","parents","people","human","children"]],["1F468-200D-1F466",["man-boy","family_man_boy","home","parent","people","human","child"]],["1F468-200D-1F466-200D-1F466",["man-boy-boy","family_man_boy_boy","home","parent","people","human","children"]],["1F468-200D-1F467",["man-girl","family_man_girl","home","parent","people","human","child"]],["1F468-200D-1F467-200D-1F466",["man-girl-boy","family_man_girl_boy","home","parent","people","human","children"]],["1F468-200D-1F467-200D-1F467",["man-girl-girl","family_man_girl_girl","home","parent","people","human","children"]],["1F469-200D-1F466",["woman-boy","family_woman_boy","home","parent","people","human","child"]],["1F469-200D-1F466-200D-1F466",["woman-boy-boy","family_woman_boy_boy","home","parent","people","human","children"]],["1F469-200D-1F467",["woman-girl","family_woman_girl","home","parent","people","human","child"]],["1F469-200D-1F467-200D-1F466",["woman-girl-boy","family_woman_girl_boy","home","parent","people","human","children"]],["1F469-200D-1F467-200D-1F467",["woman-girl-girl","family_woman_girl_girl","home","parent","people","human","children"]],["1F5E3-FE0F",["speaking_head_in_silhouette","speaking_head","user","person","human","sing","say","talk"]],["1F464",["bust_in_silhouette","user","person","human"]],["1F465",["busts_in_silhouette","user","person","human","group","team"]],["1FAC2",["people_hugging","people hugging","care"]],["1F463",["footprints","feet","tracking","walking","beach"]]],["nature",["Animals & Nature"]],[["1F435",["monkey_face","animal","nature","circus"]],["1F412",["monkey","animal","nature","banana","circus"]],["1F98D",["gorilla","animal","nature","circus"]],["1F9A7",["orangutan","animal"]],["1F436",["dog","dog_face","animal","friend","nature","woof","puppy","pet","faithful"]],["1F415",["dog2","dog","animal","nature","friend","doge","pet","faithful"]],["1F9AE",["guide_dog","animal","blind"]],["1F415-200D-1F9BA",["service_dog","blind","animal"]],["1F429",["poodle","dog","animal","101","nature","pet"]],["1F43A",["wolf","animal","nature","wild"]],["1F98A",["fox_face","fox","animal","nature","face"]],["1F99D",["raccoon","animal","nature"]],["1F431",["cat","cat_face","animal","meow","nature","pet","kitten"]],["1F408",["cat2","cat","animal","meow","pet","cats"]],["1F408-200D-2B1B",["black_cat","black cat","superstition","luck"]],["1F981",["lion_face","lion","animal","nature"]],["1F42F",["tiger","tiger_face","animal","cat","danger","wild","nature","roar"]],["1F405",["tiger2","tiger","animal","nature","roar"]],["1F406",["leopard","animal","nature"]],["1F434",["horse","horse_face","animal","brown","nature"]],["1F40E",["racehorse","horse","animal","gamble","luck"]],["1F984",["unicorn_face","unicorn","animal","nature","mystical"]],["1F993",["zebra_face","zebra","animal","nature","stripes","safari"]],["1F98C",["deer","animal","nature","horns","venison"]],["1F9AC",["bison","ox"]],["1F42E",["cow","cow_face","beef","ox","animal","nature","moo","milk"]],["1F402",["ox","animal","cow","beef"]],["1F403",["water_buffalo","animal","nature","ox","cow"]],["1F404",["cow2","cow","beef","ox","animal","nature","moo","milk"]],["1F437",["pig","pig_face","animal","oink","nature"]],["1F416",["pig2","pig","animal","nature"]],["1F417",["boar","animal","nature"]],["1F43D",["pig_nose","animal","oink"]],["1F40F",["ram","animal","sheep","nature"]],["1F411",["sheep","ewe","animal","nature","wool","shipit"]],["1F410",["goat","animal","nature"]],["1F42A",["dromedary_camel","camel","animal","hot","desert","hump"]],["1F42B",["camel","two_hump_camel","animal","nature","hot","desert","hump"]],["1F999",["llama","animal","nature","alpaca"]],["1F992",["giraffe_face","giraffe","animal","nature","spots","safari"]],["1F418",["elephant","animal","nature","nose","th","circus"]],["1F9A3",["mammoth","elephant","tusks"]],["1F98F",["rhinoceros","animal","nature","horn"]],["1F99B",["hippopotamus","animal","nature"]],["1F42D",["mouse","mouse_face","animal","nature","cheese_wedge","rodent"]],["1F401",["mouse2","mouse","animal","nature","rodent"]],["1F400",["rat","animal","mouse","rodent"]],["1F439",["hamster","animal","nature"]],["1F430",["rabbit","rabbit_face","animal","nature","pet","spring","magic","bunny"]],["1F407",["rabbit2","rabbit","animal","nature","pet","magic","spring"]],["1F43F-FE0F",["chipmunk","animal","nature","rodent","squirrel"]],["1F9AB",["beaver","animal","rodent"]],["1F994",["hedgehog","animal","nature","spiny"]],["1F987",["bat","animal","nature","blind","vampire"]],["1F43B",["bear","animal","nature","wild"]],["1F43B-200D-2744-FE0F",["polar_bear","polar bear","animal","arctic"]],["1F428",["koala","animal","nature"]],["1F43C",["panda_face","panda","animal","nature"]],["1F9A5",["sloth","animal"]],["1F9A6",["otter","animal"]],["1F9A8",["skunk","animal"]],["1F998",["kangaroo","animal","nature","australia","joey","hop","marsupial"]],["1F9A1",["badger","animal","nature","honey"]],["1F43E",["feet","paw_prints","animal","tracking","footprints","dog","cat","pet"]],["1F983",["turkey","animal","bird"]],["1F414",["chicken","animal","cluck","nature","bird"]],["1F413",["rooster","animal","nature","chicken"]],["1F423",["hatching_chick","animal","chicken","egg","born","baby","bird"]],["1F424",["baby_chick","animal","chicken","bird"]],["1F425",["hatched_chick","front_facing_baby_chick","animal","chicken","baby","bird"]],["1F426",["bird","animal","nature","fly","tweet","spring"]],["1F427",["penguin","animal","nature"]],["1F54A-FE0F",["dove_of_peace","dove","animal","bird"]],["1F985",["eagle","animal","nature","bird"]],["1F986",["duck","animal","nature","bird","mallard"]],["1F9A2",["swan","animal","nature","bird"]],["1F989",["owl","animal","nature","bird","hoot"]],["1F9A4",["dodo","animal","bird"]],["1FAB6",["feather","bird","fly"]],["1F9A9",["flamingo","animal"]],["1F99A",["peacock","animal","nature","peahen","bird"]],["1F99C",["parrot","animal","nature","bird","pirate","talk"]],["1F438",["frog","animal","nature","croak","toad"]],["1F40A",["crocodile","animal","nature","reptile","lizard","alligator"]],["1F422",["turtle","animal","slow","nature","tortoise"]],["1F98E",["lizard","animal","nature","reptile"]],["1F40D",["snake","animal","evil","nature","hiss","python"]],["1F432",["dragon_face","animal","myth","nature","chinese","green"]],["1F409",["dragon","animal","myth","nature","chinese","green"]],["1F995",["sauropod","animal","nature","dinosaur","brachiosaurus","brontosaurus","diplodocus","extinct"]],["1F996",["t-rex","t_rex","animal","nature","dinosaur","tyrannosaurus","extinct"]],["1F433",["whale","spouting_whale","animal","nature","sea","ocean"]],["1F40B",["whale2","whale","animal","nature","sea","ocean"]],["1F42C",["dolphin","animal","nature","fish","sea","ocean","flipper","fins","beach"]],["1F9AD",["seal","animal","creature","sea"]],["1F41F",["fish","animal","food","nature"]],["1F420",["tropical_fish","animal","swim","ocean","beach","nemo"]],["1F421",["blowfish","animal","nature","food","sea","ocean"]],["1F988",["shark","animal","nature","fish","sea","ocean","jaws","fins","beach"]],["1F419",["octopus","animal","creature","ocean","sea","nature","beach"]],["1F41A",["shell","spiral_shell","nature","sea","beach"]],["1F40C",["snail","slow","animal","shell"]],["1F98B",["butterfly","animal","insect","nature","caterpillar"]],["1F41B",["bug","animal","insect","nature","worm"]],["1F41C",["ant","animal","insect","nature","bug"]],["1F41D",["bee","honeybee","animal","insect","nature","bug","spring","honey"]],["1FAB2",["beetle","insect"]],["1F41E",["ladybug","lady_beetle","animal","insect","nature"]],["1F997",["cricket","animal","chirp"]],["1FAB3",["cockroach","insect","pests"]],["1F577-FE0F",["spider","animal","arachnid"]],["1F578-FE0F",["spider_web","animal","insect","arachnid","silk"]],["1F982",["scorpion","animal","arachnid"]],["1F99F",["mosquito","animal","nature","insect","malaria"]],["1FAB0",["fly","insect"]],["1FAB1",["worm","animal"]],["1F9A0",["microbe","amoeba","bacteria","germs"]],["1F490",["bouquet","flowers","nature","spring"]],["1F338",["cherry_blossom","nature","plant","spring","flower"]],["1F4AE",["white_flower","japanese","spring"]],["1F3F5-FE0F",["rosette","flower","decoration","military"]],["1F339",["rose","flowers","valentines","love","spring"]],["1F940",["wilted_flower","plant","nature","flower"]],["1F33A",["hibiscus","plant","vegetable","flowers","beach"]],["1F33B",["sunflower","nature","plant","fall"]],["1F33C",["blossom","nature","flowers","yellow"]],["1F337",["tulip","flowers","plant","nature","summer","spring"]],["1F331",["seedling","plant","nature","grass","lawn","spring"]],["1FAB4",["potted_plant","potted plant","greenery","house"]],["1F332",["evergreen_tree","plant","nature"]],["1F333",["deciduous_tree","plant","nature"]],["1F334",["palm_tree","plant","vegetable","nature","summer","beach","mojito","tropical"]],["1F335",["cactus","vegetable","plant","nature"]],["1F33E",["ear_of_rice","sheaf_of_rice","nature","plant"]],["1F33F",["herb","vegetable","plant","medicine","weed","grass","lawn"]],["2618-FE0F",["shamrock","vegetable","plant","nature","irish","clover"]],["1F340",["four_leaf_clover","vegetable","plant","nature","lucky","irish"]],["1F341",["maple_leaf","nature","plant","vegetable","ca","fall"]],["1F342",["fallen_leaf","nature","plant","vegetable","leaves"]],["1F343",["leaves","leaf_fluttering_in_wind","nature","plant","tree","vegetable","grass","lawn","spring"]]],["foods",["Food & Drink"]],[["1F347",["grapes","fruit","food","wine"]],["1F348",["melon","fruit","nature","food"]],["1F349",["watermelon","fruit","food","picnic","summer"]],["1F34A",["tangerine","food","fruit","nature","orange"]],["1F34B",["lemon","fruit","nature"]],["1F34C",["banana","fruit","food","monkey"]],["1F34D",["pineapple","fruit","nature","food"]],["1F96D",["mango","fruit","food","tropical"]],["1F34E",["apple","red_apple","fruit","mac","school"]],["1F34F",["green_apple","fruit","nature"]],["1F350",["pear","fruit","nature","food"]],["1F351",["peach","fruit","nature","food"]],["1F352",["cherries","food","fruit"]],["1F353",["strawberry","fruit","food","nature"]],["1FAD0",["blueberries","fruit"]],["1F95D",["kiwifruit","kiwi_fruit","fruit","food"]],["1F345",["tomato","fruit","vegetable","nature","food"]],["1FAD2",["olive","fruit"]],["1F965",["coconut","fruit","nature","food","palm"]],["1F951",["avocado","fruit","food"]],["1F346",["eggplant","vegetable","nature","food","aubergine"]],["1F954",["potato","food","tuber","vegatable","starch"]],["1F955",["carrot","vegetable","food","orange"]],["1F33D",["corn","ear_of_corn","food","vegetable","plant"]],["1F336-FE0F",["hot_pepper","food","spicy","chilli","chili"]],["1FAD1",["bell_pepper","bell pepper","fruit","plant"]],["1F952",["cucumber","fruit","food","pickle"]],["1F96C",["leafy_green","food","vegetable","plant","bok choy","cabbage","kale","lettuce"]],["1F966",["broccoli","fruit","food","vegetable"]],["1F9C4",["garlic","food","spice","cook"]],["1F9C5",["onion","cook","food","spice"]],["1F344",["mushroom","plant","vegetable"]],["1F95C",["peanuts","food","nut"]],["1F330",["chestnut","food","squirrel"]],["1F35E",["bread","food","wheat","breakfast","toast"]],["1F950",["croissant","food","bread","french"]],["1F956",["baguette_bread","food","bread","french"]],["1FAD3",["flatbread","flour","food"]],["1F968",["pretzel","food","bread","twisted"]],["1F96F",["bagel","food","bread","bakery","schmear"]],["1F95E",["pancakes","food","breakfast","flapjacks","hotcakes"]],["1F9C7",["waffle","food","breakfast"]],["1F9C0",["cheese_wedge","food","chadder"]],["1F356",["meat_on_bone","good","food","drumstick"]],["1F357",["poultry_leg","food","meat","drumstick","bird","chicken","turkey"]],["1F969",["cut_of_meat","food","cow","meat","cut","chop","lambchop","porkchop"]],["1F953",["bacon","food","breakfast","pork","pig","meat"]],["1F354",["hamburger","meat","fast food","beef","cheeseburger","mcdonalds","burger king"]],["1F35F",["fries","french_fries","chips","snack","fast food"]],["1F355",["pizza","food","party"]],["1F32D",["hotdog","hot_dog","food","frankfurter"]],["1F96A",["sandwich","food","lunch","bread"]],["1F32E",["taco","food","mexican"]],["1F32F",["burrito","food","mexican"]],["1FAD4",["tamale","food","masa"]],["1F959",["stuffed_flatbread","food","flatbread","stuffed","gyro"]],["1F9C6",["falafel","food"]],["1F95A",["egg","food","chicken","breakfast"]],["1F373",["fried_egg","cooking","food","breakfast","kitchen","egg"]],["1F958",["shallow_pan_of_food","food","cooking","casserole","paella"]],["1F372",["stew","pot_of_food","food","meat","soup"]],["1FAD5",["fondue","cheese","pot","food"]],["1F963",["bowl_with_spoon","food","breakfast","cereal","oatmeal","porridge"]],["1F957",["green_salad","food","healthy","lettuce"]],["1F37F",["popcorn","food","movie theater","films","snack"]],["1F9C8",["butter","food","cook"]],["1F9C2",["salt","condiment","shaker"]],["1F96B",["canned_food","food","soup"]],["1F371",["bento","bento_box","food","japanese","box"]],["1F358",["rice_cracker","food","japanese"]],["1F359",["rice_ball","food","japanese"]],["1F35A",["rice","cooked_rice","food","china","asian"]],["1F35B",["curry","curry_rice","food","spicy","hot","indian"]],["1F35C",["ramen","steaming_bowl","food","japanese","noodle","chopsticks"]],["1F35D",["spaghetti","food","italian","noodle"]],["1F360",["sweet_potato","roasted_sweet_potato","food","nature"]],["1F362",["oden","food","japanese"]],["1F363",["sushi","food","fish","japanese","rice"]],["1F364",["fried_shrimp","food","animal","appetizer","summer"]],["1F365",["fish_cake","fish_cake_with_swirl","food","japan","sea","beach","narutomaki","pink","swirl","kamaboko","surimi","ramen"]],["1F96E",["moon_cake","food","autumn"]],["1F361",["dango","food","dessert","sweet","japanese","barbecue","meat"]],["1F95F",["dumpling","food","empanada","pierogi","potsticker"]],["1F960",["fortune_cookie","food","prophecy"]],["1F961",["takeout_box","food","leftovers"]],["1F980",["crab","animal","crustacean"]],["1F99E",["lobster","animal","nature","bisque","claws","seafood"]],["1F990",["shrimp","animal","ocean","nature","seafood"]],["1F991",["squid","animal","nature","ocean","sea"]],["1F9AA",["oyster","food"]],["1F366",["icecream","soft_ice_cream","food","hot","dessert","summer"]],["1F367",["shaved_ice","hot","dessert","summer"]],["1F368",["ice_cream","food","hot","dessert"]],["1F369",["doughnut","food","dessert","snack","sweet","donut"]],["1F36A",["cookie","food","snack","oreo","chocolate","sweet","dessert"]],["1F382",["birthday","birthday_cake","food","dessert","cake"]],["1F370",["cake","shortcake","food","dessert"]],["1F9C1",["cupcake","food","dessert","bakery","sweet"]],["1F967",["pie","food","dessert","pastry"]],["1F36B",["chocolate_bar","food","snack","dessert","sweet"]],["1F36C",["candy","snack","dessert","sweet","lolly"]],["1F36D",["lollipop","food","snack","candy","sweet"]],["1F36E",["custard","dessert","food"]],["1F36F",["honey_pot","bees","sweet","kitchen"]],["1F37C",["baby_bottle","food","container","milk"]],["1F95B",["glass_of_milk","beverage","drink","cow"]],["2615",["coffee","hot_beverage","beverage","caffeine","latte","espresso"]],["1FAD6",["teapot","drink","hot"]],["1F375",["tea","teacup_without_handle","drink","bowl","breakfast","green","british"]],["1F376",["sake","wine","drink","drunk","beverage","japanese","alcohol","booze"]],["1F37E",["champagne","bottle_with_popping_cork","drink","wine","bottle","celebration"]],["1F377",["wine_glass","drink","beverage","drunk","alcohol","booze"]],["1F378",["cocktail","cocktail_glass","drink","drunk","alcohol","beverage","booze","mojito"]],["1F379",["tropical_drink","beverage","cocktail","summer","beach","alcohol","booze","mojito"]],["1F37A",["beer","beer_mug","relax","beverage","drink","drunk","party","pub","summer","alcohol","booze"]],["1F37B",["beers","clinking_beer_mugs","relax","beverage","drink","drunk","party","pub","summer","alcohol","booze"]],["1F942",["clinking_glasses","beverage","drink","party","alcohol","celebrate","cheers","wine","champagne","toast"]],["1F943",["tumbler_glass","drink","beverage","drunk","alcohol","liquor","booze","bourbon","scotch","whisky","glass","shot"]],["1F964",["cup_with_straw","drink","soda"]],["1F9CB",["bubble_tea","bubble tea","taiwan","boba","milk tea","straw"]],["1F9C3",["beverage_box","drink"]],["1F9C9",["mate_drink","mate","drink","tea","beverage"]],["1F9CA",["ice_cube","ice","water","cold"]],["1F962",["chopsticks","food"]],["1F37D-FE0F",["knife_fork_plate","fork_and_knife_with_plate","food","eat","meal","lunch","dinner","restaurant"]],["1F374",["fork_and_knife","cutlery","kitchen"]],["1F944",["spoon","cutlery","kitchen","tableware"]],["1F52A",["hocho","kitchen_knife","knife","blade","cutlery","kitchen","weapon"]],["1F3FA",["amphora","vase","jar"]]],["activity",["Activities"]],[["1F383",["jack_o_lantern","halloween","light","pumpkin","creepy","fall"]],["1F384",["christmas_tree","festival","vacation","december","xmas","celebration"]],["1F386",["fireworks","photo","festival","carnival","congratulations"]],["1F387",["sparkler","stars","night","shine"]],["1F9E8",["firecracker","dynamite","boom","explode","explosion","explosive"]],["2728",["sparkles","stars","shine","shiny","cool","awesome","good","magic"]],["1F388",["balloon","party","celebration","birthday","circus"]],["1F389",["tada","party_popper","party","congratulations","birthday","magic","circus","celebration"]],["1F38A",["confetti_ball","festival","party","birthday","circus"]],["1F38B",["tanabata_tree","plant","nature","branch","summer"]],["1F38D",["bamboo","pine_decoration","plant","nature","vegetable","panda"]],["1F38E",["dolls","japanese_dolls","japanese","toy","kimono"]],["1F38F",["flags","carp_streamer","fish","japanese","koinobori","carp","banner"]],["1F390",["wind_chime","nature","ding","spring","bell"]],["1F391",["rice_scene","moon_viewing_ceremony","photo","japan","asia","tsukimi"]],["1F9E7",["red_envelope","gift"]],["1F380",["ribbon","decoration","pink","girl","bowtie"]],["1F381",["gift","wrapped_gift","present","birthday","christmas","xmas"]],["1F397-FE0F",["reminder_ribbon","sports","cause","support","awareness"]],["1F39F-FE0F",["admission_tickets","sports","concert","entrance"]],["1F3AB",["ticket","event","concert","pass"]],["1F396-FE0F",["medal","military_medal","award","winning","army"]],["1F3C6",["trophy","win","award","contest","place","ftw","ceremony"]],["1F3C5",["sports_medal","award","winning"]],["1F947",["first_place_medal","1st_place_medal","award","winning","first"]],["1F948",["second_place_medal","2nd_place_medal","award","second"]],["1F949",["third_place_medal","3rd_place_medal","award","third"]],["26BD",["soccer","soccer_ball","sports","football"]],["26BE",["baseball","sports","balls"]],["1F94E",["softball","sports","balls"]],["1F3C0",["basketball","sports","balls","NBA"]],["1F3D0",["volleyball","sports","balls"]],["1F3C8",["football","american_football","sports","balls","NFL"]],["1F3C9",["rugby_football","sports","team"]],["1F3BE",["tennis","sports","balls","green"]],["1F94F",["flying_disc","sports","frisbee","ultimate"]],["1F3B3",["bowling","sports","fun","play"]],["1F3CF",["cricket_bat_and_ball","cricket_game","sports"]],["1F3D1",["field_hockey_stick_and_ball","field_hockey","sports"]],["1F3D2",["ice_hockey_stick_and_puck","ice_hockey","sports"]],["1F94D",["lacrosse","sports","ball","stick"]],["1F3D3",["table_tennis_paddle_and_ball","ping_pong","sports","pingpong"]],["1F3F8",["badminton_racquet_and_shuttlecock","badminton","sports"]],["1F94A",["boxing_glove","sports","fighting"]],["1F94B",["martial_arts_uniform","judo","karate","taekwondo"]],["1F945",["goal_net","sports"]],["26F3",["golf","flag_in_hole","sports","business","flag","hole","summer"]],["26F8-FE0F",["ice_skate","sports"]],["1F3A3",["fishing_pole_and_fish","fishing_pole","food","hobby","summer"]],["1F93F",["diving_mask","sport","ocean"]],["1F3BD",["running_shirt_with_sash","running_shirt","play","pageant"]],["1F3BF",["ski","skis","sports","winter","cold","snow"]],["1F6F7",["sled","sleigh","luge","toboggan"]],["1F94C",["curling_stone","sports"]],["1F3AF",["dart","direct_hit","game","play","bar","target","bullseye"]],["1FA80",["yo-yo","yo_yo","toy"]],["1FA81",["kite","wind","fly"]],["1F3B1",["8ball","pool_8_ball","pool","hobby","game","luck","magic"]],["1F52E",["crystal_ball","disco","party","magic","circus","fortune_teller"]],["1FA84",["magic_wand","magic wand","supernature","power"]],["1F9FF",["nazar_amulet","bead","charm"]],["1F3AE",["video_game","play","console","PS4","controller"]],["1F579-FE0F",["joystick","game","play"]],["1F3B0",["slot_machine","bet","gamble","vegas","fruit machine","luck","casino"]],["1F3B2",["game_die","dice","random","tabletop","play","luck"]],["1F9E9",["jigsaw","puzzle_piece","interlocking","puzzle","piece"]],["1F9F8",["teddy_bear","plush","stuffed"]],["1FA85",["pinata","mexico","candy","celebration"]],["1FA86",["nesting_dolls","nesting dolls","matryoshka","toy"]],["2660-FE0F",["spades","spade_suit","poker","cards","suits","magic"]],["2665-FE0F",["hearts","heart_suit","poker","cards","magic","suits"]],["2666-FE0F",["diamonds","diamond_suit","poker","cards","magic","suits"]],["2663-FE0F",["clubs","club_suit","poker","cards","magic","suits"]],["265F-FE0F",["chess_pawn","expendable"]],["1F0CF",["black_joker","joker","poker","cards","game","play","magic"]],["1F004",["mahjong","mahjong_red_dragon","game","play","chinese","kanji"]],["1F3B4",["flower_playing_cards","game","sunset","red"]],["1F3AD",["performing_arts","acting","theater","drama"]],["1F5BC-FE0F",["frame_with_picture","framed_picture","photography"]],["1F3A8",["art","artist_palette","design","paint","draw","colors"]],["1F9F5",["thread","needle","sewing","spool","string"]],["1FAA1",["sewing_needle","sewing needle","stitches"]],["1F9F6",["yarn","ball","crochet","knit"]],["1FAA2",["knot","rope","scout"]]],["places",["Travel & Places"]],[["1F30D",["earth_africa","globe_showing_europe_africa","globe","world","international"]],["1F30E",["earth_americas","globe_showing_americas","globe","world","USA","international"]],["1F30F",["earth_asia","globe_showing_asia_australia","globe","world","east","international"]],["1F310",["globe_with_meridians","earth","international","world","internet","interweb","i18n"]],["1F5FA-FE0F",["world_map","location","direction"]],["1F5FE",["japan","map_of_japan","nation","country","japanese","asia"]],["1F9ED",["compass","magnetic","navigation","orienteering"]],["1F3D4-FE0F",["snow_capped_mountain","photo","nature","environment","winter","cold"]],["26F0-FE0F",["mountain","photo","nature","environment"]],["1F30B",["volcano","photo","nature","disaster"]],["1F5FB",["mount_fuji","photo","mountain","nature","japanese"]],["1F3D5-FE0F",["camping","photo","outdoors","tent"]],["1F3D6-FE0F",["beach_with_umbrella","weather","summer","sunny","sand","mojito"]],["1F3DC-FE0F",["desert","photo","warm","saharah"]],["1F3DD-FE0F",["desert_island","photo","tropical","mojito"]],["1F3DE-FE0F",["national_park","photo","environment","nature"]],["1F3DF-FE0F",["stadium","photo","place","sports","concert","venue"]],["1F3DB-FE0F",["classical_building","art","culture","history"]],["1F3D7-FE0F",["building_construction","wip","working","progress"]],["1F9F1",["bricks","brick"]],["1FAA8",["rock","stone"]],["1FAB5",["wood","nature","timber","trunk"]],["1F6D6",["hut","house","structure"]],["1F3D8-FE0F",["house_buildings","houses","buildings","photo"]],["1F3DA-FE0F",["derelict_house_building","derelict_house","abandon","evict","broken","building"]],["1F3E0",["house","building","home"]],["1F3E1",["house_with_garden","home","plant","nature"]],["1F3E2",["office","office_building","building","bureau","work"]],["1F3E3",["post_office","japanese_post_office","building","envelope","communication"]],["1F3E4",["european_post_office","post_office","building","email"]],["1F3E5",["hospital","building","health","surgery","doctor"]],["1F3E6",["bank","building","money","sales","cash","business","enterprise"]],["1F3E8",["hotel","building","accomodation","checkin"]],["1F3E9",["love_hotel","like","affection","dating"]],["1F3EA",["convenience_store","building","shopping","groceries"]],["1F3EB",["school","building","student","education","learn","teach"]],["1F3EC",["department_store","building","shopping","mall"]],["1F3ED",["factory","building","industry","pollution","smoke"]],["1F3EF",["japanese_castle","photo","building"]],["1F3F0",["european_castle","castle","building","royalty","history"]],["1F492",["wedding","love","like","affection","couple","marriage","bride","groom"]],["1F5FC",["tokyo_tower","photo","japanese"]],["1F5FD",["statue_of_liberty","american","newyork"]],["26EA",["church","building","religion","christ"]],["1F54C",["mosque","islam","worship","minaret"]],["1F6D5",["hindu_temple","religion"]],["1F54D",["synagogue","judaism","worship","temple","jewish"]],["26E9-FE0F",["shinto_shrine","temple","japan","kyoto"]],["1F54B",["kaaba","mecca","mosque","islam"]],["26F2",["fountain","photo","summer","water","fresh"]],["26FA",["tent","photo","camping","outdoors"]],["1F301",["foggy","photo","mountain"]],["1F303",["night_with_stars","evening","city","downtown"]],["1F3D9-FE0F",["cityscape","photo","night life","urban"]],["1F304",["sunrise_over_mountains","view","vacation","photo"]],["1F305",["sunrise","morning","view","vacation","photo"]],["1F306",["city_sunset","cityscape_at_dusk","photo","evening","sky","buildings"]],["1F307",["city_sunrise","sunset","photo","good morning","dawn"]],["1F309",["bridge_at_night","photo","sanfrancisco"]],["2668-FE0F",["hotsprings","hot_springs","bath","warm","relax"]],["1F3A0",["carousel_horse","photo","carnival"]],["1F3A1",["ferris_wheel","photo","carnival","londoneye"]],["1F3A2",["roller_coaster","carnival","playground","photo","fun"]],["1F488",["barber","barber_pole","hair","salon","style"]],["1F3AA",["circus_tent","festival","carnival","party"]],["1F682",["steam_locomotive","locomotive","transportation","vehicle","train"]],["1F683",["railway_car","transportation","vehicle"]],["1F684",["bullettrain_side","high_speed_train","transportation","vehicle"]],["1F685",["bullettrain_front","bullet_train","transportation","vehicle","speed","fast","public","travel"]],["1F686",["train2","train","transportation","vehicle"]],["1F687",["metro","transportation","blue-square","mrt","underground","tube"]],["1F688",["light_rail","transportation","vehicle"]],["1F689",["station","transportation","vehicle","public"]],["1F68A",["tram","transportation","vehicle"]],["1F69D",["monorail","transportation","vehicle"]],["1F69E",["mountain_railway","transportation","vehicle"]],["1F68B",["train","tram_car","transportation","vehicle","carriage","public","travel"]],["1F68C",["bus","car","vehicle","transportation"]],["1F68D",["oncoming_bus","vehicle","transportation"]],["1F68E",["trolleybus","bart","transportation","vehicle"]],["1F690",["minibus","vehicle","car","transportation"]],["1F691",["ambulance","health","911","hospital"]],["1F692",["fire_engine","transportation","cars","vehicle"]],["1F693",["police_car","vehicle","cars","transportation","law","legal","enforcement"]],["1F694",["oncoming_police_car","vehicle","law","legal","enforcement","911"]],["1F695",["taxi","uber","vehicle","cars","transportation"]],["1F696",["oncoming_taxi","vehicle","cars","uber"]],["1F697",["car","automobile","red","transportation","vehicle"]],["1F698",["oncoming_automobile","car","vehicle","transportation"]],["1F699",["blue_car","sport_utility_vehicle","transportation","vehicle"]],["1F6FB",["pickup_truck","pickup truck","car","transportation"]],["1F69A",["truck","delivery_truck","cars","transportation"]],["1F69B",["articulated_lorry","vehicle","cars","transportation","express"]],["1F69C",["tractor","vehicle","car","farming","agriculture"]],["1F3CE-FE0F",["racing_car","sports","race","fast","formula","f1"]],["1F3CD-FE0F",["racing_motorcycle","motorcycle","race","sports","fast"]],["1F6F5",["motor_scooter","vehicle","vespa","sasha"]],["1F9BD",["manual_wheelchair","accessibility"]],["1F9BC",["motorized_wheelchair","accessibility"]],["1F6FA",["auto_rickshaw","move","transportation"]],["1F6B2",["bike","bicycle","sports","exercise","hipster"]],["1F6F4",["scooter","kick_scooter","vehicle","kick","razor"]],["1F6F9",["skateboard","board"]],["1F6FC",["roller_skate","roller skate","footwear","sports"]],["1F68F",["busstop","bus_stop","transportation","wait"]],["1F6E3-FE0F",["motorway","road","cupertino","interstate","highway"]],["1F6E4-FE0F",["railway_track","train","transportation"]],["1F6E2-FE0F",["oil_drum","barrell"]],["26FD",["fuelpump","fuel_pump","gas station","petroleum"]],["1F6A8",["rotating_light","police_car_light","police","ambulance","911","emergency","alert","error","pinged","law","legal"]],["1F6A5",["traffic_light","horizontal_traffic_light","transportation","signal"]],["1F6A6",["vertical_traffic_light","transportation","driving"]],["1F6D1",["octagonal_sign","stop_sign","stop"]],["1F6A7",["construction","wip","progress","caution","warning"]],["2693",["anchor","ship","ferry","sea","boat"]],["26F5",["boat","sailboat","ship","summer","transportation","water","sailing"]],["1F6F6",["canoe","boat","paddle","water","ship"]],["1F6A4",["speedboat","ship","transportation","vehicle","summer"]],["1F6F3-FE0F",["passenger_ship","yacht","cruise","ferry"]],["26F4-FE0F",["ferry","boat","ship","yacht"]],["1F6E5-FE0F",["motor_boat","ship"]],["1F6A2",["ship","transportation","titanic","deploy"]],["2708-FE0F",["airplane","vehicle","transportation","flight","fly"]],["1F6E9-FE0F",["small_airplane","flight","transportation","fly","vehicle"]],["1F6EB",["airplane_departure","airport","flight","landing"]],["1F6EC",["airplane_arriving","airplane_arrival","airport","flight","boarding"]],["1FA82",["parachute","fly","glide"]],["1F4BA",["seat","sit","airplane","transport","bus","flight","fly"]],["1F681",["helicopter","transportation","vehicle","fly"]],["1F69F",["suspension_railway","vehicle","transportation"]],["1F6A0",["mountain_cableway","transportation","vehicle","ski"]],["1F6A1",["aerial_tramway","transportation","vehicle","ski"]],["1F6F0-FE0F",["satellite","communication","gps","orbit","spaceflight","NASA","ISS"]],["1F680",["rocket","launch","ship","staffmode","NASA","outer space","outer_space","fly"]],["1F6F8",["flying_saucer","transportation","vehicle","ufo"]],["1F6CE-FE0F",["bellhop_bell","service"]],["1F9F3",["luggage","packing","travel"]],["231B",["hourglass","hourglass_done","time","clock","oldschool","limit","exam","quiz","test"]],["23F3",["hourglass_flowing_sand","hourglass_not_done","oldschool","time","countdown"]],["231A",["watch","time","accessories"]],["23F0",["alarm_clock","time","wake"]],["23F1-FE0F",["stopwatch","time","deadline"]],["23F2-FE0F",["timer_clock","alarm"]],["1F570-FE0F",["mantelpiece_clock","time"]],["1F55B",["clock12","twelve_o_clock","time","noon","midnight","midday","late","early","schedule"]],["1F567",["clock1230","twelve_thirty","time","late","early","schedule"]],["1F550",["clock1","one_o_clock","time","late","early","schedule"]],["1F55C",["clock130","one_thirty","time","late","early","schedule"]],["1F551",["clock2","two_o_clock","time","late","early","schedule"]],["1F55D",["clock230","two_thirty","time","late","early","schedule"]],["1F552",["clock3","three_o_clock","time","late","early","schedule"]],["1F55E",["clock330","three_thirty","time","late","early","schedule"]],["1F553",["clock4","four_o_clock","time","late","early","schedule"]],["1F55F",["clock430","four_thirty","time","late","early","schedule"]],["1F554",["clock5","five_o_clock","time","late","early","schedule"]],["1F560",["clock530","five_thirty","time","late","early","schedule"]],["1F555",["clock6","six_o_clock","time","late","early","schedule","dawn","dusk"]],["1F561",["clock630","six_thirty","time","late","early","schedule"]],["1F556",["clock7","seven_o_clock","time","late","early","schedule"]],["1F562",["clock730","seven_thirty","time","late","early","schedule"]],["1F557",["clock8","eight_o_clock","time","late","early","schedule"]],["1F563",["clock830","eight_thirty","time","late","early","schedule"]],["1F558",["clock9","nine_o_clock","time","late","early","schedule"]],["1F564",["clock930","nine_thirty","time","late","early","schedule"]],["1F559",["clock10","ten_o_clock","time","late","early","schedule"]],["1F565",["clock1030","ten_thirty","time","late","early","schedule"]],["1F55A",["clock11","eleven_o_clock","time","late","early","schedule"]],["1F566",["clock1130","eleven_thirty","time","late","early","schedule"]],["1F311",["new_moon","nature","twilight","planet","space","night","evening","sleep"]],["1F312",["waxing_crescent_moon","nature","twilight","planet","space","night","evening","sleep"]],["1F313",["first_quarter_moon","nature","twilight","planet","space","night","evening","sleep"]],["1F314",["moon","waxing_gibbous_moon","nature","night","sky","gray","twilight","planet","space","evening","sleep"]],["1F315",["full_moon","nature","yellow","twilight","planet","space","night","evening","sleep"]],["1F316",["waning_gibbous_moon","nature","twilight","planet","space","night","evening","sleep","waxing_gibbous_moon"]],["1F317",["last_quarter_moon","nature","twilight","planet","space","night","evening","sleep"]],["1F318",["waning_crescent_moon","nature","twilight","planet","space","night","evening","sleep"]],["1F319",["crescent_moon","night","sleep","sky","evening","magic"]],["1F31A",["new_moon_with_face","new_moon_face","nature","twilight","planet","space","night","evening","sleep"]],["1F31B",["first_quarter_moon_with_face","first_quarter_moon_face","nature","twilight","planet","space","night","evening","sleep"]],["1F31C",["last_quarter_moon_with_face","last_quarter_moon_face","nature","twilight","planet","space","night","evening","sleep"]],["1F321-FE0F",["thermometer","weather","temperature","hot","cold"]],["2600-FE0F",["sunny","sun","weather","nature","brightness","summer","beach","spring"]],["1F31D",["full_moon_with_face","full_moon_face","nature","twilight","planet","space","night","evening","sleep"]],["1F31E",["sun_with_face","nature","morning","sky"]],["1FA90",["ringed_planet","outerspace"]],["2B50",["star","night","yellow"]],["1F31F",["star2","glowing_star","night","sparkle","awesome","good","magic"]],["1F320",["stars","shooting_star","night","photo"]],["1F30C",["milky_way","photo","space","stars"]],["2601-FE0F",["cloud","weather","sky"]],["26C5",["partly_sunny","sun_behind_cloud","weather","nature","cloudy","morning","fall","spring"]],["26C8-FE0F",["thunder_cloud_and_rain","cloud_with_lightning_and_rain","weather","lightning"]],["1F324-FE0F",["mostly_sunny","sun_behind_small_cloud","weather"]],["1F325-FE0F",["barely_sunny","sun_behind_large_cloud","weather"]],["1F326-FE0F",["partly_sunny_rain","sun_behind_rain_cloud","weather"]],["1F327-FE0F",["rain_cloud","cloud_with_rain","weather"]],["1F328-FE0F",["snow_cloud","cloud_with_snow","weather"]],["1F329-FE0F",["lightning","cloud_with_lightning","weather","thunder"]],["1F32A-FE0F",["tornado","weather","cyclone","twister"]],["1F32B-FE0F",["fog","weather"]],["1F32C-FE0F",["wind_blowing_face","wind_face","gust","air"]],["1F300",["cyclone","weather","swirl","blue","cloud","vortex","spiral","whirlpool","spin","tornado","hurricane","typhoon"]],["1F308",["rainbow","nature","happy","unicorn_face","photo","sky","spring"]],["1F302",["closed_umbrella","weather","rain","drizzle"]],["2602-FE0F",["umbrella","weather","spring"]],["2614",["umbrella_with_rain_drops","rainy","weather","spring"]],["26F1-FE0F",["umbrella_on_ground","weather","summer"]],["26A1",["zap","high_voltage","thunder","weather","lightning bolt","fast"]],["2744-FE0F",["snowflake","winter","season","cold","weather","christmas","xmas"]],["2603-FE0F",["snowman","winter","season","cold","weather","christmas","xmas","frozen"]],["26C4",["snowman_without_snow","winter","season","cold","weather","christmas","xmas","frozen","without_snow"]],["2604-FE0F",["comet","space"]],["1F525",["fire","hot","cook","flame"]],["1F4A7",["droplet","water","drip","faucet","spring"]],["1F30A",["ocean","water_wave","sea","water","wave","nature","tsunami","disaster"]]],["objects",["Objects"]],[["1F453",["eyeglasses","glasses","fashion","accessories","eyesight","nerdy","dork","geek"]],["1F576-FE0F",["dark_sunglasses","sunglasses","face","cool","accessories"]],["1F97D",["goggles","eyes","protection","safety"]],["1F97C",["lab_coat","doctor","experiment","scientist","chemist"]],["1F9BA",["safety_vest","protection"]],["1F454",["necktie","shirt","suitup","formal","fashion","cloth","business"]],["1F455",["shirt","t_shirt","fashion","cloth","casual","tee"]],["1F456",["jeans","fashion","shopping"]],["1F9E3",["scarf","neck","winter","clothes"]],["1F9E4",["gloves","hands","winter","clothes"]],["1F9E5",["coat","jacket"]],["1F9E6",["socks","stockings","clothes"]],["1F457",["dress","clothes","fashion","shopping"]],["1F458",["kimono","dress","fashion","women","female","japanese"]],["1F97B",["sari","dress"]],["1FA71",["one-piece_swimsuit","one_piece_swimsuit","fashion"]],["1FA72",["briefs","clothing"]],["1FA73",["shorts","clothing"]],["1F459",["bikini","swimming","female","woman","girl","fashion","beach","summer"]],["1F45A",["womans_clothes","woman_s_clothes","fashion","shopping_bags","female"]],["1F45B",["purse","fashion","accessories","money","sales","shopping"]],["1F45C",["handbag","fashion","accessory","accessories","shopping"]],["1F45D",["pouch","clutch_bag","bag","accessories","shopping"]],["1F6CD-FE0F",["shopping_bags","mall","buy","purchase"]],["1F392",["school_satchel","backpack","student","education","bag"]],["1FA74",["thong_sandal","thong sandal","footwear","summer"]],["1F45E",["mans_shoe","man_s_shoe","fashion","male"]],["1F45F",["athletic_shoe","running_shoe","shoes","sports","sneakers"]],["1F97E",["hiking_boot","backpacking","camping","hiking"]],["1F97F",["womans_flat_shoe","flat_shoe","ballet","slip-on","slipper"]],["1F460",["high_heel","high_heeled_shoe","fashion","shoes","female","pumps","stiletto"]],["1F461",["sandal","woman_s_sandal","shoes","fashion","flip flops"]],["1FA70",["ballet_shoes","dance"]],["1F462",["boot","woman_s_boot","shoes","fashion"]],["1F451",["crown","king","kod","leader","royalty","lord"]],["1F452",["womans_hat","woman_s_hat","fashion","accessories","female","lady","spring"]],["1F3A9",["tophat","top_hat","magic","gentleman","classy","circus"]],["1F393",["mortar_board","graduation_cap","school","college","degree","university","graduation","cap","hat","legal","learn","education"]],["1F9E2",["billed_cap","cap","baseball"]],["1FA96",["military_helmet","military helmet","army","protection"]],["26D1-FE0F",["helmet_with_white_cross","rescue_worker_s_helmet","construction","build"]],["1F4FF",["prayer_beads","dhikr","religious"]],["1F484",["lipstick","female","girl","fashion","woman"]],["1F48D",["ring","wedding","propose","marriage","valentines","diamond","fashion","jewelry","gem","engagement"]],["1F48E",["gem","gem_stone","blue","ruby","diamond","jewelry"]],["1F507",["mute","muted_speaker","sound","volume","silence","quiet"]],["1F508",["speaker","speaker_low_volume","sound","volume","silence","broadcast"]],["1F509",["sound","speaker_medium_volume","volume","speaker","broadcast"]],["1F50A",["loud_sound","speaker_high_volume","volume","noise","noisy","speaker","broadcast"]],["1F4E2",["loudspeaker","volume","sound"]],["1F4E3",["mega","megaphone","sound","speaker","volume"]],["1F4EF",["postal_horn","instrument","music"]],["1F514",["bell","sound","notification","christmas","xmas","chime"]],["1F515",["no_bell","bell_with_slash","sound","volume","mute","quiet","silent"]],["1F3BC",["musical_score","treble","clef","compose"]],["1F3B5",["musical_note","score","tone","sound"]],["1F3B6",["notes","musical_notes","music","score"]],["1F399-FE0F",["studio_microphone","sing","recording","artist","talkshow"]],["1F39A-FE0F",["level_slider","scale"]],["1F39B-FE0F",["control_knobs","dial"]],["1F3A4",["microphone","sound","music","PA","sing","talkshow"]],["1F3A7",["headphones","headphone","music","score","gadgets"]],["1F4FB",["radio","communication","music","podcast","program"]],["1F3B7",["saxophone","music","instrument","jazz","blues"]],["1FA97",["accordion","music"]],["1F3B8",["guitar","music","instrument"]],["1F3B9",["musical_keyboard","piano","instrument","compose"]],["1F3BA",["trumpet","music","brass"]],["1F3BB",["violin","music","instrument","orchestra","symphony"]],["1FA95",["banjo","music","instructment"]],["1F941",["drum_with_drumsticks","drum","music","instrument","drumsticks","snare"]],["1FA98",["long_drum","long drum","music"]],["1F4F1",["iphone","mobile_phone","technology","apple","gadgets","dial"]],["1F4F2",["calling","mobile_phone_with_arrow","iphone","incoming"]],["260E-FE0F",["phone","telephone","technology","communication","dial"]],["1F4DE",["telephone_receiver","technology","communication","dial"]],["1F4DF",["pager","bbcall","oldschool","90s"]],["1F4E0",["fax","fax_machine","communication","technology"]],["1F50B",["battery","power","energy","sustain"]],["1F50C",["electric_plug","charger","power"]],["1F4BB",["computer","laptop","technology","screen","display","monitor"]],["1F5A5-FE0F",["desktop_computer","technology","computing","screen"]],["1F5A8-FE0F",["printer","paper","ink"]],["2328-FE0F",["keyboard","technology","computer","type","input","text"]],["1F5B1-FE0F",["three_button_mouse","computer_mouse","click"]],["1F5B2-FE0F",["trackball","technology","trackpad"]],["1F4BD",["minidisc","computer_disk","technology","record","data","disk","90s"]],["1F4BE",["floppy_disk","oldschool","technology","save","90s","80s"]],["1F4BF",["cd","optical_disk","technology","dvd","disk","disc","90s"]],["1F4C0",["dvd","cd","disk","disc"]],["1F9EE",["abacus","calculation"]],["1F3A5",["movie_camera","film","record"]],["1F39E-FE0F",["film_frames","movie"]],["1F4FD-FE0F",["film_projector","video","tape","record","movie"]],["1F3AC",["clapper","clapper_board","movie","film","record"]],["1F4FA",["tv","television","technology","program","oldschool","show"]],["1F4F7",["camera","gadgets","photography"]],["1F4F8",["camera_with_flash","photography","gadgets"]],["1F4F9",["video_camera","film","record"]],["1F4FC",["vhs","videocassette","record","video","oldschool","90s","80s"]],["1F50D",["mag","magnifying_glass_tilted_left","search","zoom","find","detective"]],["1F50E",["mag_right","magnifying_glass_tilted_right","search","zoom","find","detective"]],["1F56F-FE0F",["candle","fire","wax"]],["1F4A1",["bulb","light_bulb","light","electricity","idea"]],["1F526",["flashlight","dark","camping","sight","night"]],["1F3EE",["izakaya_lantern","red_paper_lantern","light","paper","halloween","spooky"]],["1FA94",["diya_lamp","lighting"]],["1F4D4",["notebook_with_decorative_cover","classroom","notes","record","paper","study"]],["1F4D5",["closed_book","read","library","knowledge","textbook","learn"]],["1F4D6",["book","open_book","read","library","knowledge","literature","learn","study"]],["1F4D7",["green_book","read","library","knowledge","study"]],["1F4D8",["blue_book","read","library","knowledge","learn","study"]],["1F4D9",["orange_book","read","library","knowledge","textbook","study"]],["1F4DA",["books","literature","library","study"]],["1F4D3",["notebook","stationery","record","notes","paper","study"]],["1F4D2",["ledger","notes","paper"]],["1F4C3",["page_with_curl","documents","office","paper"]],["1F4DC",["scroll","documents","ancient","history","paper"]],["1F4C4",["page_facing_up","documents","office","paper","information"]],["1F4F0",["newspaper","press","headline"]],["1F5DE-FE0F",["rolled_up_newspaper","press","headline"]],["1F4D1",["bookmark_tabs","favorite","save","order","tidy"]],["1F516",["bookmark","favorite","label","save"]],["1F3F7-FE0F",["label","sale","tag"]],["1F4B0",["moneybag","money_bag","dollar","payment","coins","sale"]],["1FA99",["coin","money","currency"]],["1F4B4",["yen","yen_banknote","money","sales","japanese","dollar","currency"]],["1F4B5",["dollar","dollar_banknote","money","sales","bill","currency"]],["1F4B6",["euro","euro_banknote","money","sales","dollar","currency"]],["1F4B7",["pound","pound_banknote","british","sterling","money","sales","bills","uk","england","currency"]],["1F4B8",["money_with_wings","dollar","bills","payment","sale"]],["1F4B3",["credit_card","money","sales","dollar","bill","payment","shopping"]],["1F9FE",["receipt","accounting","expenses"]],["1F4B9",["chart","chart_increasing_with_yen","green-square","graph","presentation","stats"]],["2709-FE0F",["email","envelope","letter","postal","inbox","communication"]],["1F4E7",["e-mail","e_mail","communication","inbox"]],["1F4E8",["incoming_envelope","email","inbox"]],["1F4E9",["envelope_with_arrow","email","communication"]],["1F4E4",["outbox_tray","inbox","email"]],["1F4E5",["inbox_tray","email","documents"]],["1F4E6",["package","mail","gift","cardboard","box","moving"]],["1F4EB",["mailbox","closed_mailbox_with_raised_flag","email","inbox","communication"]],["1F4EA",["mailbox_closed","closed_mailbox_with_lowered_flag","email","communication","inbox"]],["1F4EC",["mailbox_with_mail","open_mailbox_with_raised_flag","email","inbox","communication"]],["1F4ED",["mailbox_with_no_mail","open_mailbox_with_lowered_flag","email","inbox"]],["1F4EE",["postbox","email","letter","envelope"]],["1F5F3-FE0F",["ballot_box_with_ballot","election","vote"]],["270F-FE0F",["pencil2","pencil","stationery","write","paper","writing","school","study"]],["2712-FE0F",["black_nib","pen","stationery","writing","write"]],["1F58B-FE0F",["lower_left_fountain_pen","fountain_pen","stationery","writing","write"]],["1F58A-FE0F",["lower_left_ballpoint_pen","pen","stationery","writing","write"]],["1F58C-FE0F",["lower_left_paintbrush","paintbrush","drawing","creativity","art"]],["1F58D-FE0F",["lower_left_crayon","crayon","drawing","creativity"]],["1F4DD",["memo","write","documents","stationery","pencil","paper","writing","legal","exam","quiz","test","study","compose"]],["1F4BC",["briefcase","business","documents","work","law","legal","job","career"]],["1F4C1",["file_folder","documents","business","office"]],["1F4C2",["open_file_folder","documents","load"]],["1F5C2-FE0F",["card_index_dividers","organizing","business","stationery"]],["1F4C5",["date","calendar","schedule"]],["1F4C6",["calendar","tear_off_calendar","schedule","date","planning"]],["1F5D2-FE0F",["spiral_note_pad","spiral_notepad","memo","stationery"]],["1F5D3-FE0F",["spiral_calendar_pad","spiral_calendar","date","schedule","planning"]],["1F4C7",["card_index","business","stationery"]],["1F4C8",["chart_with_upwards_trend","chart_increasing","graph","presentation","stats","recovery","business","economics","money","sales","good","success"]],["1F4C9",["chart_with_downwards_trend","chart_decreasing","graph","presentation","stats","recession","business","economics","money","sales","bad","failure"]],["1F4CA",["bar_chart","graph","presentation","stats"]],["1F4CB",["clipboard","stationery","documents"]],["1F4CC",["pushpin","stationery","mark","here"]],["1F4CD",["round_pushpin","stationery","location","map","here"]],["1F4CE",["paperclip","documents","stationery"]],["1F587-FE0F",["linked_paperclips","documents","stationery"]],["1F4CF",["straight_ruler","stationery","calculate","length","math","school","drawing","architect","sketch"]],["1F4D0",["triangular_ruler","stationery","math","architect","sketch"]],["2702-FE0F",["scissors","stationery","cut"]],["1F5C3-FE0F",["card_file_box","business","stationery"]],["1F5C4-FE0F",["file_cabinet","filing","organizing"]],["1F5D1-FE0F",["wastebasket","bin","trash","rubbish","garbage","toss"]],["1F512",["lock","locked","security","password","padlock"]],["1F513",["unlock","unlocked","privacy","security"]],["1F50F",["lock_with_ink_pen","locked_with_pen","security","secret"]],["1F510",["closed_lock_with_key","locked_with_key","security","privacy"]],["1F511",["key","lock","door","password"]],["1F5DD-FE0F",["old_key","lock","door","password"]],["1F528",["hammer","tools","build","create"]],["1FA93",["axe","tool","chop","cut"]],["26CF-FE0F",["pick","tools","dig"]],["2692-FE0F",["hammer_and_pick","tools","build","create"]],["1F6E0-FE0F",["hammer_and_wrench","tools","build","create"]],["1F5E1-FE0F",["dagger_knife","dagger","weapon"]],["2694-FE0F",["crossed_swords","weapon"]],["1F52B",["gun","pistol","violence","weapon","revolver"]],["1FA83",["boomerang","weapon"]],["1F3F9",["bow_and_arrow","sports"]],["1F6E1-FE0F",["shield","protection","security"]],["1FA9A",["carpentry_saw","carpentry saw","cut","chop"]],["1F527",["wrench","tools","diy","ikea","fix","maintainer"]],["1FA9B",["screwdriver","tools"]],["1F529",["nut_and_bolt","handy","tools","fix"]],["2699-FE0F",["gear","cog"]],["1F5DC-FE0F",["compression","clamp","tool"]],["2696-FE0F",["scales","balance_scale","law","fairness","weight"]],["1F9AF",["probing_cane","accessibility"]],["1F517",["link","rings","url"]],["26D3-FE0F",["chains","lock","arrest"]],["1FA9D",["hook","tools"]],["1F9F0",["toolbox","tools","diy","fix","maintainer","mechanic"]],["1F9F2",["magnet","attraction","magnetic"]],["1FA9C",["ladder","tools"]],["2697-FE0F",["alembic","distilling","science","experiment","chemistry"]],["1F9EA",["test_tube","chemistry","experiment","lab","science"]],["1F9EB",["petri_dish","bacteria","biology","culture","lab"]],["1F9EC",["dna","biologist","genetics","life"]],["1F52C",["microscope","laboratory","experiment","zoomin","science","study"]],["1F52D",["telescope","stars","space","zoom","science","astronomy"]],["1F4E1",["satellite_antenna","communication","future","radio","space"]],["1F489",["syringe","health","hospital","drugs","blood","medicine","needle","doctor","nurse"]],["1FA78",["drop_of_blood","period","hurt","harm","wound"]],["1F48A",["pill","health","medicine","doctor","pharmacy","drug"]],["1FA79",["adhesive_bandage","heal"]],["1FA7A",["stethoscope","health"]],["1F6AA",["door","house","entry","exit"]],["1F6D7",["elevator","lift"]],["1FA9E",["mirror","reflection"]],["1FA9F",["window","scenery"]],["1F6CF-FE0F",["bed","sleep","rest"]],["1F6CB-FE0F",["couch_and_lamp","read","chill"]],["1FA91",["chair","sit","furniture"]],["1F6BD",["toilet","restroom","wc","washroom","bathroom","potty"]],["1FAA0",["plunger","toilet"]],["1F6BF",["shower","clean","water","bathroom"]],["1F6C1",["bathtub","clean","shower","bathroom"]],["1FAA4",["mouse_trap","mouse trap","cheese"]],["1FA92",["razor","cut"]],["1F9F4",["lotion_bottle","moisturizer","sunscreen"]],["1F9F7",["safety_pin","diaper"]],["1F9F9",["broom","cleaning","sweeping","witch"]],["1F9FA",["basket","laundry"]],["1F9FB",["roll_of_paper","roll"]],["1FAA3",["bucket","water","container"]],["1F9FC",["soap","bar","bathing","cleaning","lather"]],["1FAA5",["toothbrush","hygiene","dental"]],["1F9FD",["sponge","absorbing","cleaning","porous"]],["1F9EF",["fire_extinguisher","quench"]],["1F6D2",["shopping_trolley","shopping_cart","trolley"]],["1F6AC",["smoking","cigarette","kills","tobacco","joint","smoke"]],["26B0-FE0F",["coffin","vampire","dead","die","death","rip","graveyard","cemetery","casket","funeral","box"]],["1FAA6",["headstone","death","rip","grave"]],["26B1-FE0F",["funeral_urn","dead","die","death","rip","ashes"]],["1F5FF",["moyai","moai","rock","easter island"]],["1FAA7",["placard","announcement"]]],["symbols",["Symbols"]],[["1F3E7",["atm","atm_sign","money","sales","cash","blue-square","payment","bank"]],["1F6AE",["put_litter_in_its_place","litter_in_bin_sign","blue-square","sign","human","info"]],["1F6B0",["potable_water","blue-square","liquid","restroom","cleaning","faucet"]],["267F",["wheelchair","wheelchair_symbol","blue-square","disabled","accessibility"]],["1F6B9",["mens","men_s_room","toilet","restroom","wc","blue-square","gender","male"]],["1F6BA",["womens","women_s_room","purple-square","woman","female","toilet","loo","restroom","gender"]],["1F6BB",["restroom","blue-square","toilet","refresh","wc","gender"]],["1F6BC",["baby_symbol","orange-square","child"]],["1F6BE",["wc","water_closet","toilet","restroom","blue-square"]],["1F6C2",["passport_control","custom","blue-square"]],["1F6C3",["customs","passport","border","blue-square"]],["1F6C4",["baggage_claim","blue-square","airport","transport"]],["1F6C5",["left_luggage","blue-square","travel"]],["26A0-FE0F",["warning","exclamation","wip","alert","error","problem","issue"]],["1F6B8",["children_crossing","school","warning","danger","sign","driving","yellow-diamond"]],["26D4",["no_entry","limit","security","privacy","bad","denied","stop","circle"]],["1F6AB",["no_entry_sign","prohibited","forbid","stop","limit","denied","disallow","circle"]],["1F6B3",["no_bicycles","cyclist","prohibited","circle"]],["1F6AD",["no_smoking","cigarette","blue-square","smell","smoke"]],["1F6AF",["do_not_litter","no_littering","trash","bin","garbage","circle"]],["1F6B1",["non-potable_water","non_potable_water","drink","faucet","tap","circle"]],["1F6B7",["no_pedestrians","rules","crossing","walking","circle"]],["1F4F5",["no_mobile_phones","iphone","mute","circle"]],["1F51E",["underage","no_one_under_eighteen","18","drink","pub","night","minor","circle"]],["2622-FE0F",["radioactive_sign","radioactive","nuclear","danger"]],["2623-FE0F",["biohazard_sign","biohazard","danger"]],["2B06-FE0F",["arrow_up","up_arrow","blue-square","continue","top","direction"]],["2197-FE0F",["arrow_upper_right","up_right_arrow","blue-square","point","direction","diagonal","northeast"]],["27A1-FE0F",["arrow_right","right_arrow","blue-square","next"]],["2198-FE0F",["arrow_lower_right","down_right_arrow","blue-square","direction","diagonal","southeast"]],["2B07-FE0F",["arrow_down","down_arrow","blue-square","direction","bottom"]],["2199-FE0F",["arrow_lower_left","down_left_arrow","blue-square","direction","diagonal","southwest"]],["2B05-FE0F",["arrow_left","left_arrow","blue-square","previous","back"]],["2196-FE0F",["arrow_upper_left","up_left_arrow","blue-square","point","direction","diagonal","northwest"]],["2195-FE0F",["arrow_up_down","up_down_arrow","blue-square","direction","way","vertical"]],["2194-FE0F",["left_right_arrow","shape","direction","horizontal","sideways"]],["21A9-FE0F",["leftwards_arrow_with_hook","right_arrow_curving_left","back","return","blue-square","undo","enter"]],["21AA-FE0F",["arrow_right_hook","left_arrow_curving_right","blue-square","return","rotate","direction"]],["2934-FE0F",["arrow_heading_up","right_arrow_curving_up","blue-square","direction","top"]],["2935-FE0F",["arrow_heading_down","right_arrow_curving_down","blue-square","direction","bottom"]],["1F503",["arrows_clockwise","clockwise_vertical_arrows","sync","cycle","round","repeat"]],["1F504",["arrows_counterclockwise","counterclockwise_arrows_button","blue-square","sync","cycle"]],["1F519",["back","back_arrow","arrow","words","return"]],["1F51A",["end","end_arrow","words","arrow"]],["1F51B",["on","on_arrow","arrow","words"]],["1F51C",["soon","soon_arrow","arrow","words"]],["1F51D",["top","top_arrow","words","blue-square"]],["1F6D0",["place_of_worship","religion","church","temple","prayer"]],["269B-FE0F",["atom_symbol","science","physics","chemistry"]],["1F549-FE0F",["om_symbol","om","hinduism","buddhism","sikhism","jainism"]],["2721-FE0F",["star_of_david","judaism"]],["2638-FE0F",["wheel_of_dharma","hinduism","buddhism","sikhism","jainism"]],["262F-FE0F",["yin_yang","balance"]],["271D-FE0F",["latin_cross","christianity"]],["2626-FE0F",["orthodox_cross","suppedaneum","religion"]],["262A-FE0F",["star_and_crescent","islam"]],["262E-FE0F",["peace_symbol","hippie"]],["1F54E",["menorah_with_nine_branches","menorah","hanukkah","candles","jewish"]],["1F52F",["six_pointed_star","dotted_six_pointed_star","purple-square","religion","jewish","hexagram"]],["2648",["aries","sign","purple-square","zodiac","astrology"]],["2649",["taurus","purple-square","sign","zodiac","astrology"]],["264A",["gemini","sign","zodiac","purple-square","astrology"]],["264B",["cancer","sign","zodiac","purple-square","astrology"]],["264C",["leo","sign","purple-square","zodiac","astrology"]],["264D",["virgo","sign","zodiac","purple-square","astrology"]],["264E",["libra","sign","purple-square","zodiac","astrology"]],["264F",["scorpius","scorpio","sign","zodiac","purple-square","astrology"]],["2650",["sagittarius","sign","zodiac","purple-square","astrology"]],["2651",["capricorn","sign","zodiac","purple-square","astrology"]],["2652",["aquarius","sign","purple-square","zodiac","astrology"]],["2653",["pisces","purple-square","sign","zodiac","astrology"]],["26CE",["ophiuchus","sign","purple-square","constellation","astrology"]],["1F500",["twisted_rightwards_arrows","shuffle_tracks_button","blue-square","shuffle","music","random"]],["1F501",["repeat","repeat_button","loop","record"]],["1F502",["repeat_one","repeat_single_button","blue-square","loop"]],["25B6-FE0F",["arrow_forward","play_button","blue-square","right","direction","play"]],["23E9",["fast_forward","fast_forward_button","blue-square","play","speed","continue"]],["23ED-FE0F",["black_right_pointing_double_triangle_with_vertical_bar","next_track_button","forward","next","blue-square"]],["23EF-FE0F",["black_right_pointing_triangle_with_double_vertical_bar","play_or_pause_button","blue-square","play","pause"]],["25C0-FE0F",["arrow_backward","reverse_button","blue-square","left","direction"]],["23EA",["rewind","fast_reverse_button","play","blue-square"]],["23EE-FE0F",["black_left_pointing_double_triangle_with_vertical_bar","last_track_button","backward"]],["1F53C",["arrow_up_small","upwards_button","blue-square","triangle","direction","point","forward","top"]],["23EB",["arrow_double_up","fast_up_button","blue-square","direction","top"]],["1F53D",["arrow_down_small","downwards_button","blue-square","direction","bottom"]],["23EC",["arrow_double_down","fast_down_button","blue-square","direction","bottom"]],["23F8-FE0F",["double_vertical_bar","pause_button","pause","blue-square"]],["23F9-FE0F",["black_square_for_stop","stop_button","blue-square"]],["23FA-FE0F",["black_circle_for_record","record_button","blue-square"]],["23CF-FE0F",["eject","eject_button","blue-square"]],["1F3A6",["cinema","blue-square","record","film","movie","curtain","stage","theater"]],["1F505",["low_brightness","dim_button","sun","afternoon","warm","summer"]],["1F506",["high_brightness","bright_button","sun","light"]],["1F4F6",["signal_strength","antenna_bars","blue-square","reception","phone","internet","connection","wifi","bluetooth","bars"]],["1F4F3",["vibration_mode","orange-square","phone"]],["1F4F4",["mobile_phone_off","mute","orange-square","silence","quiet"]],["2640-FE0F",["female_sign","woman","women","lady","girl"]],["2642-FE0F",["male_sign","man","boy","men"]],["26A7-FE0F",["transgender_symbol","transgender symbol","lgbtq"]],["2716-FE0F",["heavy_multiplication_x","multiplication_sign","math","calculation"]],["2795",["heavy_plus_sign","plus_sign","math","calculation","addition","more","increase"]],["2796",["heavy_minus_sign","minus_sign","math","calculation","subtract","less"]],["2797",["heavy_division_sign","division_sign","divide","math","calculation"]],["267E-FE0F",["infinity","forever"]],["203C-FE0F",["bangbang","double_exclamation_mark","exclamation","surprise"]],["2049-FE0F",["interrobang","exclamation_question_mark","wat","punctuation","surprise"]],["2753",["question","question_mark","doubt","confused"]],["2754",["grey_question","white_question_mark","doubts","gray","huh","confused"]],["2755",["grey_exclamation","white_exclamation_mark","surprise","punctuation","gray","wow","warning"]],["2757",["exclamation","exclamation_mark","heavy_exclamation_mark","danger","surprise","punctuation","wow","warning"]],["3030-FE0F",["wavy_dash","draw","line","moustache","mustache","squiggle","scribble"]],["1F4B1",["currency_exchange","money","sales","dollar","travel"]],["1F4B2",["heavy_dollar_sign","money","sales","payment","currency","buck"]],["2695-FE0F",["medical_symbol","health","hospital"]],["267B-FE0F",["recycle","recycling_symbol","arrow","environment","garbage","trash"]],["269C-FE0F",["fleur_de_lis","decorative","scout"]],["1F531",["trident","trident_emblem","weapon","spear"]],["1F4DB",["name_badge","fire","forbid"]],["1F530",["beginner","japanese_symbol_for_beginner","badge","shield"]],["2B55",["o","hollow_red_circle","circle","round"]],["2705",["white_check_mark","check_mark_button","green-square","ok","agree","vote","election","answer","tick"]],["2611-FE0F",["ballot_box_with_check","check_box_with_check","ok","agree","confirm","black-square","vote","election","yes","tick"]],["2714-FE0F",["heavy_check_mark","check_mark","ok","nike","answer","yes","tick"]],["274C",["x","cross_mark","no","delete","remove","cancel","red"]],["274E",["negative_squared_cross_mark","cross_mark_button","x","green-square","no","deny"]],["27B0",["curly_loop","scribble","draw","shape","squiggle"]],["27BF",["loop","double_curly_loop","tape","cassette"]],["303D-FE0F",["part_alternation_mark","graph","presentation","stats","business","economics","bad"]],["2733-FE0F",["eight_spoked_asterisk","star","sparkle","green-square"]],["2734-FE0F",["eight_pointed_black_star","eight_pointed_star","orange-square","shape","polygon"]],["2747-FE0F",["sparkle","stars","green-square","awesome","good","fireworks"]],["00A9-FE0F",["copyright","ip","license","circle","law","legal"]],["00AE-FE0F",["registered","alphabet","circle"]],["2122-FE0F",["tm","trade_mark","trademark","brand","law","legal"]],["0023-FE0F-20E3",["hash","keycap_","symbol","blue-square","twitter"]],["002A-FE0F-20E3",["keycap_star","keycap_","star","keycap"]],["0030-FE0F-20E3",["zero","keycap_0","0","numbers","blue-square","null"]],["0031-FE0F-20E3",["one","keycap_1","blue-square","numbers","1"]],["0032-FE0F-20E3",["two","keycap_2","numbers","2","prime","blue-square"]],["0033-FE0F-20E3",["three","keycap_3","3","numbers","prime","blue-square"]],["0034-FE0F-20E3",["four","keycap_4","4","numbers","blue-square"]],["0035-FE0F-20E3",["five","keycap_5","5","numbers","blue-square","prime"]],["0036-FE0F-20E3",["six","keycap_6","6","numbers","blue-square"]],["0037-FE0F-20E3",["seven","keycap_7","7","numbers","blue-square","prime"]],["0038-FE0F-20E3",["eight","keycap_8","8","blue-square","numbers"]],["0039-FE0F-20E3",["nine","keycap_9","blue-square","numbers","9"]],["1F51F",["keycap_ten","keycap_10","numbers","10","blue-square"]],["1F520",["capital_abcd","input_latin_uppercase","alphabet","words","blue-square"]],["1F521",["abcd","input_latin_lowercase","blue-square","alphabet"]],["1F522",["1234","input_numbers","numbers","blue-square"]],["1F523",["symbols","input_symbols","blue-square","music","note","ampersand","percent","glyphs","characters"]],["1F524",["abc","input_latin_letters","blue-square","alphabet"]],["1F170-FE0F",["a","a_button","red-square","alphabet","letter"]],["1F18E",["ab","ab_button","red-square","alphabet"]],["1F171-FE0F",["b","b_button","red-square","alphabet","letter"]],["1F191",["cl","cl_button","alphabet","words","red-square"]],["1F192",["cool","cool_button","words","blue-square"]],["1F193",["free","free_button","blue-square","words"]],["2139-FE0F",["information_source","information","blue-square","alphabet","letter"]],["1F194",["id","id_button","purple-square","words"]],["24C2-FE0F",["m","circled_m","alphabet","blue-circle","letter"]],["1F195",["new","new_button","blue-square","words","start"]],["1F196",["ng","ng_button","blue-square","words","shape","icon"]],["1F17E-FE0F",["o2","o_button","alphabet","red-square","letter"]],["1F197",["ok","ok_button","good","agree","yes","blue-square"]],["1F17F-FE0F",["parking","p_button","cars","blue-square","alphabet","letter"]],["1F198",["sos","sos_button","help","red-square","words","emergency","911"]],["1F199",["up","up_button","blue-square","above","high"]],["1F19A",["vs","vs_button","words","orange-square"]],["1F201",["koko","japanese_here_button","blue-square","here","katakana","japanese","destination"]],["1F202-FE0F",["sa","japanese_service_charge_button","japanese","blue-square","katakana"]],["1F237-FE0F",["u6708","japanese_monthly_amount_button","chinese","month","moon","japanese","orange-square","kanji"]],["1F236",["u6709","japanese_not_free_of_charge_button","orange-square","chinese","have","kanji"]],["1F22F",["u6307","japanese_reserved_button","chinese","point","green-square","kanji"]],["1F250",["ideograph_advantage","japanese_bargain_button","chinese","kanji","obtain","get","circle"]],["1F239",["u5272","japanese_discount_button","cut","divide","chinese","kanji","pink-square"]],["1F21A",["u7121","japanese_free_of_charge_button","nothing","chinese","kanji","japanese","orange-square"]],["1F232",["u7981","japanese_prohibited_button","kanji","japanese","chinese","forbidden","limit","restricted","red-square"]],["1F251",["accept","japanese_acceptable_button","ok","good","chinese","kanji","agree","yes","orange-circle"]],["1F238",["u7533","japanese_application_button","chinese","japanese","kanji","orange-square"]],["1F234",["u5408","japanese_passing_grade_button","japanese","chinese","join","kanji","red-square"]],["1F233",["u7a7a","japanese_vacancy_button","kanji","japanese","chinese","empty","sky","blue-square"]],["3297-FE0F",["congratulations","japanese_congratulations_button","chinese","kanji","japanese","red-circle"]],["3299-FE0F",["secret","japanese_secret_button","privacy","chinese","sshh","kanji","red-circle"]],["1F23A",["u55b6","japanese_open_for_business_button","japanese","opening hours","orange-square"]],["1F235",["u6e80","japanese_no_vacancy_button","full","chinese","japanese","red-square","kanji"]],["1F534",["red_circle","shape","error","danger"]],["1F7E0",["large_orange_circle","orange_circle","round"]],["1F7E1",["large_yellow_circle","yellow_circle","round"]],["1F7E2",["large_green_circle","green_circle","round"]],["1F535",["large_blue_circle","blue_circle","shape","icon","button"]],["1F7E3",["large_purple_circle","purple_circle","round"]],["1F7E4",["large_brown_circle","brown_circle","round"]],["26AB",["black_circle","shape","button","round"]],["26AA",["white_circle","shape","round"]],["1F7E5",["large_red_square","red_square"]],["1F7E7",["large_orange_square","orange_square"]],["1F7E8",["large_yellow_square","yellow_square"]],["1F7E9",["large_green_square","green_square"]],["1F7E6",["large_blue_square","blue_square"]],["1F7EA",["large_purple_square","purple_square"]],["1F7EB",["large_brown_square","brown_square"]],["2B1B",["black_large_square","shape","icon","button"]],["2B1C",["white_large_square","shape","icon","stone","button"]],["25FC-FE0F",["black_medium_square","shape","button","icon"]],["25FB-FE0F",["white_medium_square","shape","stone","icon"]],["25FE",["black_medium_small_square","icon","shape","button"]],["25FD",["white_medium_small_square","shape","stone","icon","button"]],["25AA-FE0F",["black_small_square","shape","icon"]],["25AB-FE0F",["white_small_square","shape","icon"]],["1F536",["large_orange_diamond","shape","jewel","gem"]],["1F537",["large_blue_diamond","shape","jewel","gem"]],["1F538",["small_orange_diamond","shape","jewel","gem"]],["1F539",["small_blue_diamond","shape","jewel","gem"]],["1F53A",["small_red_triangle","red_triangle_pointed_up","shape","direction","up","top"]],["1F53B",["small_red_triangle_down","red_triangle_pointed_down","shape","direction","bottom"]],["1F4A0",["diamond_shape_with_a_dot_inside","diamond_with_a_dot","jewel","blue","gem","crystal","fancy"]],["1F518",["radio_button","input","old","music","circle"]],["1F533",["white_square_button","shape","input"]],["1F532",["black_square_button","shape","input","frame"]]],["flags",["Flags"]],[["1F3C1",["checkered_flag","chequered_flag","contest","finishline","race","gokart"]],["1F6A9",["triangular_flag_on_post","triangular_flag","mark","milestone","place"]],["1F38C",["crossed_flags","japanese","nation","country","border"]],["1F3F4",["waving_black_flag","black_flag","pirate"]],["1F3F3-FE0F",["waving_white_flag","white_flag","losing","loser","lost","surrender","give up","fail"]],["1F3F3-FE0F-200D-1F308",["rainbow-flag","rainbow_flag","flag","rainbow","pride","gay","lgbt","glbt","queer","homosexual","lesbian","bisexual","transgender"]],["1F3F3-FE0F-200D-26A7-FE0F",["transgender_flag","transgender flag","lgbtq"]],["1F3F4-200D-2620-FE0F",["pirate_flag","skull","crossbones","flag","banner"]],["1F1E6-1F1E8",["flag-ac","flag_ascension_island"]],["1F1E6-1F1E9",["flag-ad","flag_andorra","ad","flag","nation","country","banner"]],["1F1E6-1F1EA",["flag-ae","flag_united_arab_emirates","united","arab","emirates","flag","nation","country","banner"]],["1F1E6-1F1EB",["flag-af","flag_afghanistan","af","flag","nation","country","banner"]],["1F1E6-1F1EC",["flag-ag","flag_antigua_barbuda","antigua","barbuda","flag","nation","country","banner"]],["1F1E6-1F1EE",["flag-ai","flag_anguilla","ai","flag","nation","country","banner"]],["1F1E6-1F1F1",["flag-al","flag_albania","al","flag","nation","country","banner"]],["1F1E6-1F1F2",["flag-am","flag_armenia","am","flag","nation","country","banner"]],["1F1E6-1F1F4",["flag-ao","flag_angola","ao","flag","nation","country","banner"]],["1F1E6-1F1F6",["flag-aq","flag_antarctica","aq","flag","nation","country","banner"]],["1F1E6-1F1F7",["flag-ar","flag_argentina","ar","flag","nation","country","banner"]],["1F1E6-1F1F8",["flag-as","flag_american_samoa","american","ws","flag","nation","country","banner"]],["1F1E6-1F1F9",["flag-at","flag_austria","at","flag","nation","country","banner"]],["1F1E6-1F1FA",["flag-au","flag_australia","au","flag","nation","country","banner"]],["1F1E6-1F1FC",["flag-aw","flag_aruba","aw","flag","nation","country","banner"]],["1F1E6-1F1FD",["flag-ax","flag_aland_islands","Åland","islands","flag","nation","country","banner"]],["1F1E6-1F1FF",["flag-az","flag_azerbaijan","az","flag","nation","country","banner"]],["1F1E7-1F1E6",["flag-ba","flag_bosnia_herzegovina","bosnia","herzegovina","flag","nation","country","banner"]],["1F1E7-1F1E7",["flag-bb","flag_barbados","bb","flag","nation","country","banner"]],["1F1E7-1F1E9",["flag-bd","flag_bangladesh","bd","flag","nation","country","banner"]],["1F1E7-1F1EA",["flag-be","flag_belgium","be","flag","nation","country","banner"]],["1F1E7-1F1EB",["flag-bf","flag_burkina_faso","burkina","faso","flag","nation","country","banner"]],["1F1E7-1F1EC",["flag-bg","flag_bulgaria","bg","flag","nation","country","banner"]],["1F1E7-1F1ED",["flag-bh","flag_bahrain","bh","flag","nation","country","banner"]],["1F1E7-1F1EE",["flag-bi","flag_burundi","bi","flag","nation","country","banner"]],["1F1E7-1F1EF",["flag-bj","flag_benin","bj","flag","nation","country","banner"]],["1F1E7-1F1F1",["flag-bl","flag_st_barthelemy","saint","barthélemy","flag","nation","country","banner"]],["1F1E7-1F1F2",["flag-bm","flag_bermuda","bm","flag","nation","country","banner"]],["1F1E7-1F1F3",["flag-bn","flag_brunei","bn","darussalam","flag","nation","country","banner"]],["1F1E7-1F1F4",["flag-bo","flag_bolivia","bo","flag","nation","country","banner"]],["1F1E7-1F1F6",["flag-bq","flag_caribbean_netherlands","bonaire","flag","nation","country","banner"]],["1F1E7-1F1F7",["flag-br","flag_brazil","br","flag","nation","country","banner"]],["1F1E7-1F1F8",["flag-bs","flag_bahamas","bs","flag","nation","country","banner"]],["1F1E7-1F1F9",["flag-bt","flag_bhutan","bt","flag","nation","country","banner"]],["1F1E7-1F1FB",["flag-bv","flag_bouvet_island","norway"]],["1F1E7-1F1FC",["flag-bw","flag_botswana","bw","flag","nation","country","banner"]],["1F1E7-1F1FE",["flag-by","flag_belarus","by","flag","nation","country","banner"]],["1F1E7-1F1FF",["flag-bz","flag_belize","bz","flag","nation","country","banner"]],["1F1E8-1F1E6",["flag-ca","flag_canada","ca","flag","nation","country","banner"]],["1F1E8-1F1E8",["flag-cc","flag_cocos_islands","cocos","keeling","islands","flag","nation","country","banner"]],["1F1E8-1F1E9",["flag-cd","flag_congo_kinshasa","congo","democratic","republic","flag","nation","country","banner"]],["1F1E8-1F1EB",["flag-cf","flag_central_african_republic","central","african","republic","flag","nation","country","banner"]],["1F1E8-1F1EC",["flag-cg","flag_congo_brazzaville","congo","flag","nation","country","banner"]],["1F1E8-1F1ED",["flag-ch","flag_switzerland","ch","flag","nation","country","banner"]],["1F1E8-1F1EE",["flag-ci","flag_cote_d_ivoire","ivory","coast","flag","nation","country","banner"]],["1F1E8-1F1F0",["flag-ck","flag_cook_islands","cook","islands","flag","nation","country","banner"]],["1F1E8-1F1F1",["flag-cl","flag_chile","flag","nation","country","banner"]],["1F1E8-1F1F2",["flag-cm","flag_cameroon","cm","flag","nation","country","banner"]],["1F1E8-1F1F3",["cn","flag_china","china","chinese","prc","flag","country","nation","banner"]],["1F1E8-1F1F4",["flag-co","flag_colombia","co","flag","nation","country","banner"]],["1F1E8-1F1F5",["flag-cp","flag_clipperton_island"]],["1F1E8-1F1F7",["flag-cr","flag_costa_rica","costa","rica","flag","nation","country","banner"]],["1F1E8-1F1FA",["flag-cu","flag_cuba","cu","flag","nation","country","banner"]],["1F1E8-1F1FB",["flag-cv","flag_cape_verde","cabo","verde","flag","nation","country","banner"]],["1F1E8-1F1FC",["flag-cw","flag_curacao","curaçao","flag","nation","country","banner"]],["1F1E8-1F1FD",["flag-cx","flag_christmas_island","christmas","island","flag","nation","country","banner"]],["1F1E8-1F1FE",["flag-cy","flag_cyprus","cy","flag","nation","country","banner"]],["1F1E8-1F1FF",["flag-cz","flag_czechia","cz","flag","nation","country","banner"]],["1F1E9-1F1EA",["de","flag_germany","german","nation","flag","country","banner"]],["1F1E9-1F1EC",["flag-dg","flag_diego_garcia"]],["1F1E9-1F1EF",["flag-dj","flag_djibouti","dj","flag","nation","country","banner"]],["1F1E9-1F1F0",["flag-dk","flag_denmark","dk","flag","nation","country","banner"]],["1F1E9-1F1F2",["flag-dm","flag_dominica","dm","flag","nation","country","banner"]],["1F1E9-1F1F4",["flag-do","flag_dominican_republic","dominican","republic","flag","nation","country","banner"]],["1F1E9-1F1FF",["flag-dz","flag_algeria","dz","flag","nation","country","banner"]],["1F1EA-1F1E6",["flag-ea","flag_ceuta_melilla"]],["1F1EA-1F1E8",["flag-ec","flag_ecuador","ec","flag","nation","country","banner"]],["1F1EA-1F1EA",["flag-ee","flag_estonia","ee","flag","nation","country","banner"]],["1F1EA-1F1EC",["flag-eg","flag_egypt","eg","flag","nation","country","banner"]],["1F1EA-1F1ED",["flag-eh","flag_western_sahara","western","sahara","flag","nation","country","banner"]],["1F1EA-1F1F7",["flag-er","flag_eritrea","er","flag","nation","country","banner"]],["1F1EA-1F1F8",["es","flag_spain","spain","flag","nation","country","banner"]],["1F1EA-1F1F9",["flag-et","flag_ethiopia","et","flag","nation","country","banner"]],["1F1EA-1F1FA",["flag-eu","flag_european_union","european","union","flag","banner"]],["1F1EB-1F1EE",["flag-fi","flag_finland","fi","flag","nation","country","banner"]],["1F1EB-1F1EF",["flag-fj","flag_fiji","fj","flag","nation","country","banner"]],["1F1EB-1F1F0",["flag-fk","flag_falkland_islands","falkland","islands","malvinas","flag","nation","country","banner"]],["1F1EB-1F1F2",["flag-fm","flag_micronesia","micronesia","federated","states","flag","nation","country","banner"]],["1F1EB-1F1F4",["flag-fo","flag_faroe_islands","faroe","islands","flag","nation","country","banner"]],["1F1EB-1F1F7",["fr","flag_france","banner","flag","nation","france","french","country"]],["1F1EC-1F1E6",["flag-ga","flag_gabon","ga","flag","nation","country","banner"]],["1F1EC-1F1E7",["gb","flag_united_kingdom","united","kingdom","great","britain","northern","ireland","flag","nation","country","banner","british","UK","english","england","union jack"]],["1F1EC-1F1E9",["flag-gd","flag_grenada","gd","flag","nation","country","banner"]],["1F1EC-1F1EA",["flag-ge","flag_georgia","ge","flag","nation","country","banner"]],["1F1EC-1F1EB",["flag-gf","flag_french_guiana","french","guiana","flag","nation","country","banner"]],["1F1EC-1F1EC",["flag-gg","flag_guernsey","gg","flag","nation","country","banner"]],["1F1EC-1F1ED",["flag-gh","flag_ghana","gh","flag","nation","country","banner"]],["1F1EC-1F1EE",["flag-gi","flag_gibraltar","gi","flag","nation","country","banner"]],["1F1EC-1F1F1",["flag-gl","flag_greenland","gl","flag","nation","country","banner"]],["1F1EC-1F1F2",["flag-gm","flag_gambia","gm","flag","nation","country","banner"]],["1F1EC-1F1F3",["flag-gn","flag_guinea","gn","flag","nation","country","banner"]],["1F1EC-1F1F5",["flag-gp","flag_guadeloupe","gp","flag","nation","country","banner"]],["1F1EC-1F1F6",["flag-gq","flag_equatorial_guinea","equatorial","gn","flag","nation","country","banner"]],["1F1EC-1F1F7",["flag-gr","flag_greece","gr","flag","nation","country","banner"]],["1F1EC-1F1F8",["flag-gs","flag_south_georgia_south_sandwich_islands","south","georgia","sandwich","islands","flag","nation","country","banner"]],["1F1EC-1F1F9",["flag-gt","flag_guatemala","gt","flag","nation","country","banner"]],["1F1EC-1F1FA",["flag-gu","flag_guam","gu","flag","nation","country","banner"]],["1F1EC-1F1FC",["flag-gw","flag_guinea_bissau","gw","bissau","flag","nation","country","banner"]],["1F1EC-1F1FE",["flag-gy","flag_guyana","gy","flag","nation","country","banner"]],["1F1ED-1F1F0",["flag-hk","flag_hong_kong_sar_china","hong","kong","flag","nation","country","banner"]],["1F1ED-1F1F2",["flag-hm","flag_heard_mcdonald_islands"]],["1F1ED-1F1F3",["flag-hn","flag_honduras","hn","flag","nation","country","banner"]],["1F1ED-1F1F7",["flag-hr","flag_croatia","hr","flag","nation","country","banner"]],["1F1ED-1F1F9",["flag-ht","flag_haiti","ht","flag","nation","country","banner"]],["1F1ED-1F1FA",["flag-hu","flag_hungary","hu","flag","nation","country","banner"]],["1F1EE-1F1E8",["flag-ic","flag_canary_islands","canary","islands","flag","nation","country","banner"]],["1F1EE-1F1E9",["flag-id","flag_indonesia","flag","nation","country","banner"]],["1F1EE-1F1EA",["flag-ie","flag_ireland","ie","flag","nation","country","banner"]],["1F1EE-1F1F1",["flag-il","flag_israel","il","flag","nation","country","banner"]],["1F1EE-1F1F2",["flag-im","flag_isle_of_man","isle","man","flag","nation","country","banner"]],["1F1EE-1F1F3",["flag-in","flag_india","in","flag","nation","country","banner"]],["1F1EE-1F1F4",["flag-io","flag_british_indian_ocean_territory","british","indian","ocean","territory","flag","nation","country","banner"]],["1F1EE-1F1F6",["flag-iq","flag_iraq","iq","flag","nation","country","banner"]],["1F1EE-1F1F7",["flag-ir","flag_iran","iran","islamic","republic","flag","nation","country","banner"]],["1F1EE-1F1F8",["flag-is","flag_iceland","is","flag","nation","country","banner"]],["1F1EE-1F1F9",["it","flag_italy","italy","flag","nation","country","banner"]],["1F1EF-1F1EA",["flag-je","flag_jersey","je","flag","nation","country","banner"]],["1F1EF-1F1F2",["flag-jm","flag_jamaica","jm","flag","nation","country","banner"]],["1F1EF-1F1F4",["flag-jo","flag_jordan","jo","flag","nation","country","banner"]],["1F1EF-1F1F5",["jp","flag_japan","japanese","nation","flag","country","banner"]],["1F1F0-1F1EA",["flag-ke","flag_kenya","ke","flag","nation","country","banner"]],["1F1F0-1F1EC",["flag-kg","flag_kyrgyzstan","kg","flag","nation","country","banner"]],["1F1F0-1F1ED",["flag-kh","flag_cambodia","kh","flag","nation","country","banner"]],["1F1F0-1F1EE",["flag-ki","flag_kiribati","ki","flag","nation","country","banner"]],["1F1F0-1F1F2",["flag-km","flag_comoros","km","flag","nation","country","banner"]],["1F1F0-1F1F3",["flag-kn","flag_st_kitts_nevis","saint","kitts","nevis","flag","nation","country","banner"]],["1F1F0-1F1F5",["flag-kp","flag_north_korea","north","korea","nation","flag","country","banner"]],["1F1F0-1F1F7",["kr","flag_south_korea","south","korea","nation","flag","country","banner"]],["1F1F0-1F1FC",["flag-kw","flag_kuwait","kw","flag","nation","country","banner"]],["1F1F0-1F1FE",["flag-ky","flag_cayman_islands","cayman","islands","flag","nation","country","banner"]],["1F1F0-1F1FF",["flag-kz","flag_kazakhstan","kz","flag","nation","country","banner"]],["1F1F1-1F1E6",["flag-la","flag_laos","lao","democratic","republic","flag","nation","country","banner"]],["1F1F1-1F1E7",["flag-lb","flag_lebanon","lb","flag","nation","country","banner"]],["1F1F1-1F1E8",["flag-lc","flag_st_lucia","saint","lucia","flag","nation","country","banner"]],["1F1F1-1F1EE",["flag-li","flag_liechtenstein","li","flag","nation","country","banner"]],["1F1F1-1F1F0",["flag-lk","flag_sri_lanka","sri","lanka","flag","nation","country","banner"]],["1F1F1-1F1F7",["flag-lr","flag_liberia","lr","flag","nation","country","banner"]],["1F1F1-1F1F8",["flag-ls","flag_lesotho","ls","flag","nation","country","banner"]],["1F1F1-1F1F9",["flag-lt","flag_lithuania","lt","flag","nation","country","banner"]],["1F1F1-1F1FA",["flag-lu","flag_luxembourg","lu","flag","nation","country","banner"]],["1F1F1-1F1FB",["flag-lv","flag_latvia","lv","flag","nation","country","banner"]],["1F1F1-1F1FE",["flag-ly","flag_libya","ly","flag","nation","country","banner"]],["1F1F2-1F1E6",["flag-ma","flag_morocco","ma","flag","nation","country","banner"]],["1F1F2-1F1E8",["flag-mc","flag_monaco","mc","flag","nation","country","banner"]],["1F1F2-1F1E9",["flag-md","flag_moldova","moldova","republic","flag","nation","country","banner"]],["1F1F2-1F1EA",["flag-me","flag_montenegro","me","flag","nation","country","banner"]],["1F1F2-1F1EB",["flag-mf","flag_st_martin"]],["1F1F2-1F1EC",["flag-mg","flag_madagascar","mg","flag","nation","country","banner"]],["1F1F2-1F1ED",["flag-mh","flag_marshall_islands","marshall","islands","flag","nation","country","banner"]],["1F1F2-1F1F0",["flag-mk","flag_north_macedonia","macedonia","flag","nation","country","banner"]],["1F1F2-1F1F1",["flag-ml","flag_mali","ml","flag","nation","country","banner"]],["1F1F2-1F1F2",["flag-mm","flag_myanmar","mm","flag","nation","country","banner"]],["1F1F2-1F1F3",["flag-mn","flag_mongolia","mn","flag","nation","country","banner"]],["1F1F2-1F1F4",["flag-mo","flag_macao_sar_china","macao","flag","nation","country","banner"]],["1F1F2-1F1F5",["flag-mp","flag_northern_mariana_islands","northern","mariana","islands","flag","nation","country","banner"]],["1F1F2-1F1F6",["flag-mq","flag_martinique","mq","flag","nation","country","banner"]],["1F1F2-1F1F7",["flag-mr","flag_mauritania","mr","flag","nation","country","banner"]],["1F1F2-1F1F8",["flag-ms","flag_montserrat","ms","flag","nation","country","banner"]],["1F1F2-1F1F9",["flag-mt","flag_malta","mt","flag","nation","country","banner"]],["1F1F2-1F1FA",["flag-mu","flag_mauritius","mu","flag","nation","country","banner"]],["1F1F2-1F1FB",["flag-mv","flag_maldives","mv","flag","nation","country","banner"]],["1F1F2-1F1FC",["flag-mw","flag_malawi","mw","flag","nation","country","banner"]],["1F1F2-1F1FD",["flag-mx","flag_mexico","mx","flag","nation","country","banner"]],["1F1F2-1F1FE",["flag-my","flag_malaysia","my","flag","nation","country","banner"]],["1F1F2-1F1FF",["flag-mz","flag_mozambique","mz","flag","nation","country","banner"]],["1F1F3-1F1E6",["flag-na","flag_namibia","na","flag","nation","country","banner"]],["1F1F3-1F1E8",["flag-nc","flag_new_caledonia","new","caledonia","flag","nation","country","banner"]],["1F1F3-1F1EA",["flag-ne","flag_niger","ne","flag","nation","country","banner"]],["1F1F3-1F1EB",["flag-nf","flag_norfolk_island","norfolk","island","flag","nation","country","banner"]],["1F1F3-1F1EC",["flag-ng","flag_nigeria","flag","nation","country","banner"]],["1F1F3-1F1EE",["flag-ni","flag_nicaragua","ni","flag","nation","country","banner"]],["1F1F3-1F1F1",["flag-nl","flag_netherlands","nl","flag","nation","country","banner"]],["1F1F3-1F1F4",["flag-no","flag_norway","no","flag","nation","country","banner"]],["1F1F3-1F1F5",["flag-np","flag_nepal","np","flag","nation","country","banner"]],["1F1F3-1F1F7",["flag-nr","flag_nauru","nr","flag","nation","country","banner"]],["1F1F3-1F1FA",["flag-nu","flag_niue","nu","flag","nation","country","banner"]],["1F1F3-1F1FF",["flag-nz","flag_new_zealand","new","zealand","flag","nation","country","banner"]],["1F1F4-1F1F2",["flag-om","flag_oman","om_symbol","flag","nation","country","banner"]],["1F1F5-1F1E6",["flag-pa","flag_panama","pa","flag","nation","country","banner"]],["1F1F5-1F1EA",["flag-pe","flag_peru","pe","flag","nation","country","banner"]],["1F1F5-1F1EB",["flag-pf","flag_french_polynesia","french","polynesia","flag","nation","country","banner"]],["1F1F5-1F1EC",["flag-pg","flag_papua_new_guinea","papua","new","guinea","flag","nation","country","banner"]],["1F1F5-1F1ED",["flag-ph","flag_philippines","ph","flag","nation","country","banner"]],["1F1F5-1F1F0",["flag-pk","flag_pakistan","pk","flag","nation","country","banner"]],["1F1F5-1F1F1",["flag-pl","flag_poland","pl","flag","nation","country","banner"]],["1F1F5-1F1F2",["flag-pm","flag_st_pierre_miquelon","saint","pierre","miquelon","flag","nation","country","banner"]],["1F1F5-1F1F3",["flag-pn","flag_pitcairn_islands","pitcairn","flag","nation","country","banner"]],["1F1F5-1F1F7",["flag-pr","flag_puerto_rico","puerto","rico","flag","nation","country","banner"]],["1F1F5-1F1F8",["flag-ps","flag_palestinian_territories","palestine","palestinian","territories","flag","nation","country","banner"]],["1F1F5-1F1F9",["flag-pt","flag_portugal","pt","flag","nation","country","banner"]],["1F1F5-1F1FC",["flag-pw","flag_palau","pw","flag","nation","country","banner"]],["1F1F5-1F1FE",["flag-py","flag_paraguay","py","flag","nation","country","banner"]],["1F1F6-1F1E6",["flag-qa","flag_qatar","qa","flag","nation","country","banner"]],["1F1F7-1F1EA",["flag-re","flag_reunion","réunion","flag","nation","country","banner"]],["1F1F7-1F1F4",["flag-ro","flag_romania","ro","flag","nation","country","banner"]],["1F1F7-1F1F8",["flag-rs","flag_serbia","rs","flag","nation","country","banner"]],["1F1F7-1F1FA",["ru","flag_russia","russian","federation","flag","nation","country","banner"]],["1F1F7-1F1FC",["flag-rw","flag_rwanda","rw","flag","nation","country","banner"]],["1F1F8-1F1E6",["flag-sa","flag_saudi_arabia","flag","nation","country","banner"]],["1F1F8-1F1E7",["flag-sb","flag_solomon_islands","solomon","islands","flag","nation","country","banner"]],["1F1F8-1F1E8",["flag-sc","flag_seychelles","sc","flag","nation","country","banner"]],["1F1F8-1F1E9",["flag-sd","flag_sudan","sd","flag","nation","country","banner"]],["1F1F8-1F1EA",["flag-se","flag_sweden","se","flag","nation","country","banner"]],["1F1F8-1F1EC",["flag-sg","flag_singapore","sg","flag","nation","country","banner"]],["1F1F8-1F1ED",["flag-sh","flag_st_helena","saint","helena","ascension","tristan","cunha","flag","nation","country","banner"]],["1F1F8-1F1EE",["flag-si","flag_slovenia","si","flag","nation","country","banner"]],["1F1F8-1F1EF",["flag-sj","flag_svalbard_jan_mayen"]],["1F1F8-1F1F0",["flag-sk","flag_slovakia","sk","flag","nation","country","banner"]],["1F1F8-1F1F1",["flag-sl","flag_sierra_leone","sierra","leone","flag","nation","country","banner"]],["1F1F8-1F1F2",["flag-sm","flag_san_marino","san","marino","flag","nation","country","banner"]],["1F1F8-1F1F3",["flag-sn","flag_senegal","sn","flag","nation","country","banner"]],["1F1F8-1F1F4",["flag-so","flag_somalia","so","flag","nation","country","banner"]],["1F1F8-1F1F7",["flag-sr","flag_suriname","sr","flag","nation","country","banner"]],["1F1F8-1F1F8",["flag-ss","flag_south_sudan","south","sd","flag","nation","country","banner"]],["1F1F8-1F1F9",["flag-st","flag_sao_tome_principe","sao","tome","principe","flag","nation","country","banner"]],["1F1F8-1F1FB",["flag-sv","flag_el_salvador","el","salvador","flag","nation","country","banner"]],["1F1F8-1F1FD",["flag-sx","flag_sint_maarten","sint","maarten","dutch","flag","nation","country","banner"]],["1F1F8-1F1FE",["flag-sy","flag_syria","syrian","arab","republic","flag","nation","country","banner"]],["1F1F8-1F1FF",["flag-sz","flag_eswatini","sz","flag","nation","country","banner"]],["1F1F9-1F1E6",["flag-ta","flag_tristan_da_cunha"]],["1F1F9-1F1E8",["flag-tc","flag_turks_caicos_islands","turks","caicos","islands","flag","nation","country","banner"]],["1F1F9-1F1E9",["flag-td","flag_chad","td","flag","nation","country","banner"]],["1F1F9-1F1EB",["flag-tf","flag_french_southern_territories","french","southern","territories","flag","nation","country","banner"]],["1F1F9-1F1EC",["flag-tg","flag_togo","tg","flag","nation","country","banner"]],["1F1F9-1F1ED",["flag-th","flag_thailand","th","flag","nation","country","banner"]],["1F1F9-1F1EF",["flag-tj","flag_tajikistan","tj","flag","nation","country","banner"]],["1F1F9-1F1F0",["flag-tk","flag_tokelau","tk","flag","nation","country","banner"]],["1F1F9-1F1F1",["flag-tl","flag_timor_leste","timor","leste","flag","nation","country","banner"]],["1F1F9-1F1F2",["flag-tm","flag_turkmenistan","flag","nation","country","banner"]],["1F1F9-1F1F3",["flag-tn","flag_tunisia","tn","flag","nation","country","banner"]],["1F1F9-1F1F4",["flag-to","flag_tonga","to","flag","nation","country","banner"]],["1F1F9-1F1F7",["flag-tr","flag_turkey","turkey","flag","nation","country","banner"]],["1F1F9-1F1F9",["flag-tt","flag_trinidad_tobago","trinidad","tobago","flag","nation","country","banner"]],["1F1F9-1F1FB",["flag-tv","flag_tuvalu","flag","nation","country","banner"]],["1F1F9-1F1FC",["flag-tw","flag_taiwan","tw","flag","nation","country","banner"]],["1F1F9-1F1FF",["flag-tz","flag_tanzania","tanzania","united","republic","flag","nation","country","banner"]],["1F1FA-1F1E6",["flag-ua","flag_ukraine","ua","flag","nation","country","banner"]],["1F1FA-1F1EC",["flag-ug","flag_uganda","ug","flag","nation","country","banner"]],["1F1FA-1F1F2",["flag-um","flag_u_s_outlying_islands"]],["1F1FA-1F1F3",["flag-un","flag_united_nations","un","flag","banner"]],["1F1FA-1F1F8",["us","flag_united_states","united","states","america","flag","nation","country","banner"]],["1F1FA-1F1FE",["flag-uy","flag_uruguay","uy","flag","nation","country","banner"]],["1F1FA-1F1FF",["flag-uz","flag_uzbekistan","uz","flag","nation","country","banner"]],["1F1FB-1F1E6",["flag-va","flag_vatican_city","vatican","city","flag","nation","country","banner"]],["1F1FB-1F1E8",["flag-vc","flag_st_vincent_grenadines","saint","vincent","grenadines","flag","nation","country","banner"]],["1F1FB-1F1EA",["flag-ve","flag_venezuela","ve","bolivarian","republic","flag","nation","country","banner"]],["1F1FB-1F1EC",["flag-vg","flag_british_virgin_islands","british","virgin","islands","bvi","flag","nation","country","banner"]],["1F1FB-1F1EE",["flag-vi","flag_u_s_virgin_islands","virgin","islands","us","flag","nation","country","banner"]],["1F1FB-1F1F3",["flag-vn","flag_vietnam","viet","nam","flag","nation","country","banner"]],["1F1FB-1F1FA",["flag-vu","flag_vanuatu","vu","flag","nation","country","banner"]],["1F1FC-1F1EB",["flag-wf","flag_wallis_futuna","wallis","futuna","flag","nation","country","banner"]],["1F1FC-1F1F8",["flag-ws","flag_samoa","ws","flag","nation","country","banner"]],["1F1FD-1F1F0",["flag-xk","flag_kosovo","xk","flag","nation","country","banner"]],["1F1FE-1F1EA",["flag-ye","flag_yemen","ye","flag","nation","country","banner"]],["1F1FE-1F1F9",["flag-yt","flag_mayotte","yt","flag","nation","country","banner"]],["1F1FF-1F1E6",["flag-za","flag_south_africa","south","africa","flag","nation","country","banner"]],["1F1FF-1F1F2",["flag-zm","flag_zambia","zm","flag","nation","country","banner"]],["1F1FF-1F1FC",["flag-zw","flag_zimbabwe","zw","flag","nation","country","banner"]],["1F3F4-E0067-E0062-E0065-E006E-E0067-E007F",["flag-england","flag_england","flag","english"]],["1F3F4-E0067-E0062-E0073-E0063-E0074-E007F",["flag-scotland","flag_scotland","flag","scottish"]],["1F3F4-E0067-E0062-E0077-E006C-E0073-E007F",["flag-wales","flag_wales","flag","welsh"]]]]')}}]); +//# sourceMappingURL=1.c45de763c3ae52a66870.js.map \ No newline at end of file diff --git a/dist/1.c45de763c3ae52a66870.js.map b/dist/1.c45de763c3ae52a66870.js.map new file mode 100644 index 000000000..83acef03e --- /dev/null +++ b/dist/1.c45de763c3ae52a66870.js.map @@ -0,0 +1 @@ +{"version":3,"sources":[],"names":[],"mappings":"","file":"1.c45de763c3ae52a66870.js","sourceRoot":""} \ No newline at end of file diff --git a/dist/3.695679058d5b91efd31e.css b/dist/3.695679058d5b91efd31e.css new file mode 100644 index 000000000..88ecf77c7 --- /dev/null +++ b/dist/3.695679058d5b91efd31e.css @@ -0,0 +1 @@ +.SenderInfo{display:flex;align-content:center;color:#fff;cursor:pointer;opacity:.5;transition:opacity .15s}.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:.875rem;letter-spacing:-.01rem}.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}.MediaViewerFooter{position:absolute;bottom:0;padding:1rem 0;width:100%}#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(0deg,#000 0,transparent)}.MediaViewerFooter.hideable{opacity:0;pointer-events:none}.video-controls-visible .MediaViewerFooter.hideable{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 .media-text{margin-bottom:0;overflow:auto;padding:0 .5rem;text-align:center;color:hsla(0,0%,100%,.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,.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:focus,.MediaViewerFooter a:hover{color:var(--color-links-hover)}.VideoPlayerControls{display:flex;align-items:center;position:absolute;left:0;bottom:0;width:100%;padding-top:.625rem;font-size:.875rem;background:linear-gradient(0deg,#000 0,transparent)}#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:hsla(0,0%,100%,.16);border-radius:var(--border-radius-default)}.VideoPlayerControls .player-seekline-buffered,.VideoPlayerControls .player-seekline-input,.VideoPlayerControls .player-seekline-played{position:absolute;top:0;left:0;height:100%;border-radius:var(--border-radius-default)}.VideoPlayerControls .player-seekline-buffered{background-color:hsla(0,0%,100%,.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(.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}.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 .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,.25);color:#fff;font-size:.75rem;position:absolute;left:.1875rem;top:.1875rem;z-index:1;padding:0 .375rem;border-radius:.75rem;line-height:1.125rem}.VideoPlayer .spinner-container .ProgressSpinner{cursor:pointer}.ZoomControls{position:absolute;bottom:1.25rem;left:50%;background:rgba(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-in,.ZoomControls .zoom-out{position:absolute;top:.4375rem;width:2.5rem;height:2.5rem;color:#fff}.ZoomControls .zoom-in i,.ZoomControls .zoom-out 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:hsla(0,0%,100%,.5);border-radius:var(--border-radius-default)}.ZoomControls .seekline-input,.ZoomControls .seekline-played{position:absolute;top:0;left:0;height:100%;border-radius:var(--border-radius-default)}.ZoomControls .seekline-played{background:#fff;transition:width .2s}.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(.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}.pan-container,.pan-wrapper{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}#MediaViewer,.zoomed .pan-container{position:fixed;top:0;left:0}#MediaViewer{width:100vw;height:100%;background:rgba(0,0,0,.9);color:#fff;z-index:var(--z-media-viewer);padding:.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 .closing .SenderInfo,#MediaViewer:not(.open) .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)}#MediaViewer .media-viewer-head>.Transition{width:100%}@media (max-width:600px){#MediaViewer .media-viewer-head{padding:0 .5rem}#MediaViewer .media-viewer-head .media-viewer-close{margin-right:1.5rem}}#MediaViewer>.pan-wrapper,#MediaViewer>.Transition{grid-area:1/1/-1/-1}#MediaViewer>.pan-wrapper .Transition,#MediaViewer>.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}.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:.25rem .5rem}.ForwardPicker .modal-header .Button{margin-right:.5rem}.ForwardPicker .modal-header .input-group{margin:0}.ForwardPicker .modal-header .form-control{border:none;box-shadow:none!important;height:2.75rem;padding:.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;display:flex;align-items:center;justify-content:center;color:var(--color-text-secondary)}#Errors{position:fixed;top:0;left:0;width:100vw;height:100vh;z-index:var(--z-modal)}.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:.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:#fff}.CalendarModal .day-button.disabled{opacity:.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:.875rem}.CalendarModal .calendar-wrapper{display:flex;align-items:center;justify-content:center;min-height:17rem;margin:1.5rem -.5rem .5rem}.CalendarModal .calendar-grid{display:grid;grid-template-columns:repeat(7,1fr);width:100%}.MessageSelectToolbar{position:absolute;bottom:.5rem;left:.5rem;right:.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 .messaging-disabled+.MessageSelectToolbar,.no-composer .unpin-button-container+.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:.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}@media (max-width:600px){.MessageSelectToolbar-count{margin-right:.5rem}}.MessageSelectToolbar-actions{margin-left:auto;display:flex}.MessageSelectToolbar-actions .MenuItem{border-radius:var(--border-radius-default);padding:.75rem 2rem .75rem 1rem}.MessageSelectToolbar-actions .MenuItem i{margin-right:1rem}@media (max-width:600px){.MessageSelectToolbar-actions .MenuItem{padding:.6875rem;border-radius:50%}.MessageSelectToolbar-actions .MenuItem i{margin-right:0}.MessageSelectToolbar-actions .MenuItem .item-text{display:none}}.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:transparent}.RecentContacts .top-peers::-webkit-scrollbar{height:0}.RecentContacts .top-peers::-webkit-scrollbar-thumb{background-color:transparent}.RecentContacts .top-peer-item{display:inline-block;width:4.5rem;height:6rem;padding:.625rem .25rem;margin-left:.5rem;border-radius:var(--border-radius-default);cursor:pointer;position:relative;overflow:hidden}.RecentContacts .top-peer-item:first-child{margin-left:.125rem}.RecentContacts .top-peer-item:last-child{margin-right:.125rem}.RecentContacts .top-peer-item .Avatar{margin:0 auto .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:.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}.ChatMessage:first-child{margin-top:.5rem}.ChatMessage.selected .Avatar.online:after,.ChatMessage:hover .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:.25rem;padding: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 .media-preview{position:relative}.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{font-size:.75rem;color:#fff;position:absolute;top:.1875rem;margin-inline-start:-1.25rem}.ChatMessage .info-row{display:flex;justify-content:space-between}.ChatMessage[dir=rtl] .subtitle{text-align:right}.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}.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=auto],.LeftSearch .section-heading[dir=rtl]{padding-left:0;padding-right:1.25rem;margin:0 -1.25rem 0 1rem!important;text-align:initial}.LeftSearch .section-heading[dir=auto]:before,.LeftSearch .section-heading[dir=rtl]: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{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 -.625rem}}.LeftSearch .search-section{padding:0 1rem .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=auto] .Link,.LeftSearch .search-section .section-heading[dir=rtl] .Link{float:left;margin-left:1rem;margin-right:0}.LeftSearch .search-section .Loading{height:4.5rem;margin-bottom:.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:transparent}.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}.CropModal .modal-dialog{width:calc(100% - 2rem);max-width:35rem;height:calc(100% - 1rem);max-height:35rem;position:relative}.CropModal #avatar-crop,.CropModal .modal-content{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 hsla(0,0%,100%,.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)}.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:#fff;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:after,.Transition>div:not(.active) .AvatarEditable label i,.Transition>div:not(.active) .AvatarEditable label input,body.animating-right-column .AvatarEditable label:after,body.animating-right-column .AvatarEditable label i,body.animating-right-column .AvatarEditable label input{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,.4)}.AvatarEditable label.disabled{pointer-events:none}.AvatarEditable label.disabled:after,.AvatarEditable label.disabled i{display:none}.FloatingActionButton{position:absolute;right:1rem;bottom:1rem;transform:translateY(5rem);transition:transform .25s cubic-bezier(.34,1.56,.64,1)}body.animation-level-0 .FloatingActionButton{transition:none!important}.FloatingActionButton.revealed{transform:translateY(0)}.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:.4375rem}.Picker{height:100%;display:flex;flex-direction:column;overflow:hidden}.Picker .picker-header{padding:0 1rem .25rem .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:.5rem;margin-left:.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:.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;display:flex;align-items:center;justify-content:center;color:var(--color-text-secondary)}.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:.5rem;margin-left:.5rem;flex-grow:1;color:var(--color-text-secondary)}.SettingsFoldersChatsPicker .picker-list{padding:0 .5rem .5rem}.SettingsFoldersChatsPicker .picker-list .no-results{height:10rem}.SettingsFoldersChatsPicker .ListItem.picker-list-item.chat-type-item .ListItem-button{padding:.875rem .75rem}.SettingsFoldersChatsPicker .ListItem.picker-list-item.chat-item .ListItem-button{padding:.5rem .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:.75rem;margin-top:1rem;margin-bottom:.5rem}.SettingsFoldersChatsPicker .picker-list-divider{margin:.5rem -.5rem 0;border-bottom:1px solid var(--color-borders)}.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:-.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:.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:-.25rem}.settings-item .ShowMoreButton{margin:0 -1rem;width:calc(100% + 2rem);padding-left:1rem!important}.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:.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:"";background-color:var(--color-borders);opacity:.5;z-index:-1}.RangeSlider .slider-fill-track,.RangeSlider .slider-main:before{position:absolute;width:100%;left:0;top:.3125rem;height:.125rem;border-radius:.125rem}.RangeSlider .slider-fill-track{background-color:var(--slider-color);pointer-events:none}.RangeSlider input[type=range]{-webkit-appearance:none;display:block;width:100%;height:.75rem;margin-bottom:.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;background:var(--slider-color);border:none;height:.75rem;width:.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:.75rem;width:.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:.75rem;width:.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:.825rem;text-align:center;cursor:pointer;color:var(--color-text-secondary);transition:color .2s ease}.RangeSlider .slider-option.active,.RangeSlider .slider-option:hover{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}.StickerButton{display:inline-block;width:4rem;height:4rem;margin:.5rem;border-radius:var(--border-radius-messages-small);background:transparent no-repeat 50%;background-size:contain;cursor:pointer;transition:background-color .15s ease,opacity .3s ease!important;position:relative}@media (max-width:600px){.StickerButton{margin:.25rem}}.StickerButton.set-button{width:2.75rem!important;height:2.75rem;margin: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:-.5rem;right:-.5rem;width:1.25rem;height:1.25rem;padding:.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}.settings-item .SettingsStickerSet.ListItem{margin-bottom:.5rem}.SettingsStickerSet .Button,.SettingsStickerSet .StickerButton{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] .Button,.SettingsStickerSet[dir=rtl] .StickerButton{margin:0 0 0 .5rem}.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 canvas,.WallpaperTile .media-inner img{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(.9)}.WallpaperTile .spinner-container{height:100%;display:flex;align-items:center;justify-content:center}.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}.SettingsGeneralBackgroundColor:not(.is-dragging) .handle{transition:transform .3s 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:.5rem}.SettingsGeneralBackgroundColor canvas{display:block;width:100%;height:100%;border-radius:var(--border-radius-default);cursor:pointer}.SettingsGeneralBackgroundColor .handle{position:absolute;top:-.75rem;left:-.75rem;width:1.5rem;height:1.5rem;border:.125rem solid var(--color-white);border-radius:.75rem;cursor:grab}.SettingsGeneralBackgroundColor .hue-picker .handle{top:-.5rem}.SettingsGeneralBackgroundColor .tools{margin-bottom:.625rem;display:flex}.SettingsGeneralBackgroundColor .tools .input-group{margin-bottom:0}.SettingsGeneralBackgroundColor .tools .input-group[dir=rtl] label{transform:scale(.75) translate(1.25rem,-2.25rem)}.SettingsGeneralBackgroundColor .tools .input-group:first-child{margin-right:.5rem}.SettingsGeneralBackgroundColor .tools .input-group:last-child{margin-left:.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 .3s ease}.SettingsGeneralBackgroundColor .predefined-colors div.active{border:.125rem solid var(--color-primary);box-shadow:inset 0 0 0 .3125rem var(--color-background)}.SettingsGeneralBackgroundColor .predefined-colors div:before{display:block;content:"";width:100%;padding-top:100%;pointer-events:none}#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) 50%}#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 .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:.25rem;margin-top:.1rem}.settings-current-user .phone{font-size:.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:.875rem;color:var(--color-text-secondary);margin-top:-.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:.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:normal}.settings-item .ListItem .multiline-menu-item.full-size{width:100%}.settings-item .ListItem .multiline-menu-item .date{float:right;font-size:.75rem;margin-left:1rem;color:var(--color-text-secondary)}.settings-item .ListItem .multiline-menu-item .subtitle,.settings-item .ListItem .multiline-menu-item .title{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:.875rem;line-height:1.5rem;color:var(--color-text-secondary)}.settings-item .ListItem .multiline-menu-item .subtitle+.subtitle{margin-top:-.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:.5rem}.settings-item .ListItem.blocked-list-item .ListItem-button{align-items:center;text-align:left;padding:.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:.25rem;font-weight:500}.settings-item .ListItem.blocked-list-item .contact-phone{font-size:.875rem;line-height:1rem;color:var(--color-text-secondary)}.settings-item .ListItem[dir=rtl] .multiline-menu-item .subtitle,.settings-item .ListItem[dir=rtl] .multiline-menu-item .title{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 .5rem}.settings-item .radio-group .Radio:last-child{margin-bottom:0}.settings-item .Checkbox+.Checkbox,.settings-item .Radio+.Radio{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)}.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 .error,.NewChat-inner.step-2 .note{font-size:.875rem;line-height:1.25rem;margin:1.5rem .25rem}.NewChat-inner.step-2 .error{color:var(--color-error)}.NewChat-inner.step-2 .note{margin-top:-.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 .25rem}.NewChat-inner.step-2 .chat-members-list{margin:0 -1.25rem;padding:0 1rem 1rem;overflow-x:hidden;flex-grow:1}.ArchivedChats{height:100%;overflow:hidden}.ArchivedChats .chat-list{height:calc(100% - var(--header-height))}.MessageContextMenu{position:absolute;font-size:1rem}.MessageContextMenu .backdrop{position:absolute;touch-action:none}.StickerSetModal .modal-dialog{width:26.25rem;max-width:100%}@media (max-width:600px){.StickerSetModal .modal-dialog{width:18.875rem}}.StickerSetModal .modal-header{padding:.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 .25rem;text-align:left}.StickerSetModal .button-wrapper{padding:.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)}.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)}#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 .5rem 0 .25rem}#MobileSearch>.header>.SearchInput{margin-left:.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:.5rem}#MobileSearch>.footer>.counter{flex:1;color:var(--color-text-secondary)}#MobileSearch:not(.active) .footer,#MobileSearch:not(.active) .header{transform:translateX(-999rem)}.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%;flex:1 0 auto}.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:.7em}.MentionTooltip .ChatInfo .handle:before{content:"@"}.MentionTooltip .ChatInfo .user-status{display:none!important}.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 img,.AttachmentModal .media-wrapper video{flex:1;width:calc(50% - .15rem);height:12rem;margin-bottom:.3rem;border-radius:var(--border-radius-default);object-fit:cover}.AttachmentModal .media-wrapper img:only-child,.AttachmentModal .media-wrapper video:only-child{height:auto;max-height:25rem;margin-bottom:0}.AttachmentModal .media-wrapper img:nth-child(2n),.AttachmentModal .media-wrapper video:nth-child(2n){margin-left:.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:after,.AttachmentModal .drop-target:before{content:"";position:absolute;left:0;top:0;right:0;bottom:0;border-radius:var(--border-radius-default);pointer-events:none;opacity:0;transition:opacity .25s;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)}.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 .25rem}.PollModal .options-list{margin:1rem -.75rem -.5rem;padding:0 .75rem;border-top:1px solid var(--color-chat-hover);max-height:20rem;overflow:auto}.PollModal .options-list.overflown{padding:0 .4rem .5rem .75rem}@media (max-width:600px){.PollModal .options-list{overflow:hidden;max-height:none}.PollModal .options-list,.PollModal .options-list.overflown{padding:0 .75rem}}.PollModal .option-wrapper{position:relative}.PollModal .option-wrapper .form-control{padding-right:3rem}.PollModal .option-wrapper .option-remove-button{position:absolute;top:.3125rem;right:.3125rem}.PollModal .quiz-mode{margin-top:1.5rem}.PollModal .quiz-mode .options-header{margin-bottom:.5rem}.PollModal .quiz-mode .note{margin-top:.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:.5rem}.EmojiButton{display:inline-flex;align-items:center;justify-content:center;width:2.5rem;height:2.5rem;margin:.125rem;border-radius:var(--border-radius-messages-small);cursor:pointer;font-size:1.75rem;line-height:2.5rem;background-color:initial;transition:background-color .15s ease}.mac-os-fix .EmojiButton{line-height:inherit}.EmojiButton.focus,.EmojiButton:hover{background-color:var(--color-interactive-element-hover)}.EmojiButton>img{width:2rem;height:2rem}.EmojiPicker{height:100%}.EmojiPicker-main{height:calc(100% - 3rem);overflow-y:auto;padding:.5rem}@media (max-width:600px){.EmojiPicker-main{padding:.5rem .25rem}}.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:.4375rem 0;scrollbar-width:none;scrollbar-color:transparent}.EmojiPicker-header::-webkit-scrollbar{height:0}.EmojiPicker-header::-webkit-scrollbar-thumb{background-color:transparent}.EmojiPicker-header .symbol-set-button{display:inline-flex;vertical-align:middle}.EmojiPicker-header:after{content:"";display:block;flex-shrink:0;width:.1px;height:1rem}}.StickerPicker{height:100%}.StickerPicker-main{position:relative;height:calc(100% - 3rem);overflow-y:auto;padding:.5rem}@media (max-width:600px){.StickerPicker-main{padding:.5rem .25rem}}.StickerPicker-header{height:3rem;border-bottom:1px solid var(--color-borders);padding:.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:transparent}.StickerPicker-header::-webkit-scrollbar{height:0}.StickerPicker-header::-webkit-scrollbar-thumb{background-color:transparent}.StickerPicker-header:after{content:"";display:block;flex-shrink:0;width:.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 .AnimatedSticker,.StickerPicker-header .sticker-set-button.StickerButton img{top:.375rem;left:.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 .AnimatedSticker,.StickerPicker-header .sticker-set-button .sticker-set-cover img{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 .25rem;border-radius:var(--border-radius-messages-small)}.GifButton{display:flex;align-items:center;justify-content:center;height:6.25rem;background-color:initial;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 50%}.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}.GifPicker{display:grid;grid-template-columns:repeat(6,1fr);grid-auto-rows:6.25rem;grid-gap:.25rem;grid-auto-flow:dense;height:100%;overflow-y:auto;padding:.25rem}.GifPicker .Loading,.GifPicker .picker-disabled{grid-column:1/-1;height:var(--menu-height)}.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:translateZ(0)}body.is-media-viewer-open .SymbolMenu.mobile-menu.open{transform:translate3d(0,calc(var(--symbol-menu-height) + var(--symbol-menu-footer-height)),0)}.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 .75rem}.SymbolMenu-footer .Button.symbol-search-button{position:absolute;left:.25rem}.SymbolMenu-footer .Button.symbol-delete-button{position:absolute;right:.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:.5rem;color:rgba(var(--color-text-secondary-rgb),.75);overflow:hidden;white-space:nowrap;text-overflow:ellipsis;unicode-bidi:plaintext}.symbol-set-container,.symbol-set-name{text-align:initial}.symbol-set-button{flex-shrink:0;width:2.125rem!important;height:2.125rem;margin: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}.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}.StickerTooltip{display:grid;grid-template-columns:repeat(auto-fill,minmax(5rem,1fr));grid-auto-rows:auto;place-items:center}.StickerTooltip.hidden{display:none}.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}.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}.EmojiTooltip{display:flex;padding-left:.25rem;overflow-x:auto;overflow-x:overlay;overflow-y:hidden}.EmojiTooltip .EmojiButton{flex:0 0 2.5rem}.RightSearch{height:100%;padding:0 .5rem;overflow-y:auto}.RightSearch .helper-text{padding:1rem;margin-bottom:.125rem;font-weight:500;color:var(--color-text-secondary);unicode-bidi:plaintext;text-align:initial}.StickerSearch{height:100%;padding:0 .5rem;overflow-y:auto}.StickerSearch .helper-text{padding:1rem;margin-bottom:.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:.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:active,.StickerSearch .sticker-set-header .Button.is-added:hover{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:.125rem}.GifSearch{height:100%;padding:.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:.25rem;grid-auto-flow:dense}.GifSearch .helper-text{color:var(--color-text-meta);margin-top:2rem;text-align:center}.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 -.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}.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:hsla(0,0%,100%,.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}.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:.125rem;top:.25rem;transform:none}.Management .radio-group .Radio-main:after{left:.4375rem;top:.5625rem;transform:none}.ManageGroupMembers,.ShippingInfo{padding:.5rem 1rem}.ShippingInfo h5{font-size:.9rem;color:var(--color-text-secondary);margin:1rem 0 1.1rem}.Shipping{padding:.5rem 1rem}.Shipping form p{color:var(--color-text-secondary);font-weight:500;margin:.5rem 0 2rem}.Shipping form .Radio{margin-bottom:2rem}.Checkout{padding:.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:.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 solid var(--color-borders);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 50%;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:.875rem;color:var(--color-text-secondary)}.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}.PaymentInfo{padding:.5rem 1rem}.PaymentInfo h5{font-size:.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}.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 solid var(--color-borders)}.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 solid var(--color-borders)}.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}} \ No newline at end of file diff --git a/dist/3.695679058d5b91efd31e.js b/dist/3.695679058d5b91efd31e.js new file mode 100644 index 000000000..e105f9a08 --- /dev/null +++ b/dist/3.695679058d5b91efd31e.js @@ -0,0 +1,2 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[3],Array(100).concat([function(e,t,a){"use strict";a.r(t),a.d(t,"MediaViewer",(function(){return de})),a.d(t,"ForwardPicker",(function(){return je})),a.d(t,"Errors",(function(){return ke})),a.d(t,"Notifications",(function(){return Ie})),a.d(t,"SafeLinkModal",(function(){return Pe})),a.d(t,"CalendarModal",(function(){return Ae})),a.d(t,"DeleteMessageModal",(function(){return Te})),a.d(t,"PinMessageModal",(function(){return Re})),a.d(t,"UnpinAllMessagesModal",(function(){return De})),a.d(t,"MessageSelectToolbar",(function(){return Ge})),a.d(t,"LeftSearch",(function(){return kt})),a.d(t,"Settings",(function(){return ln})),a.d(t,"ContactList",(function(){return dn})),a.d(t,"NewChat",(function(){return gn})),a.d(t,"NewChatStep1",(function(){return un})),a.d(t,"NewChatStep2",(function(){return hn})),a.d(t,"ArchivedChats",(function(){return vn})),a.d(t,"ContextMenuContainer",(function(){return Pn})),a.d(t,"StickerSetModal",(function(){return Mn})),a.d(t,"HeaderMenuContainer",(function(){return Ln})),a.d(t,"MobileSearch",(function(){return Rn})),a.d(t,"AttachmentModal",(function(){return Wn})),a.d(t,"PollModal",(function(){return Yn})),a.d(t,"SymbolMenu",(function(){return fc})),a.d(t,"AttachMenu",(function(){return jc})),a.d(t,"MentionTooltip",(function(){return _n})),a.d(t,"StickerTooltip",(function(){return Cc})),a.d(t,"BotKeyboardMenu",(function(){return yc})),a.d(t,"CustomSendMenu",(function(){return kc})),a.d(t,"DropArea",(function(){return Nc.b})),a.d(t,"TextFormatter",(function(){return Ic.a})),a.d(t,"EmojiTooltip",(function(){return wc})),a.d(t,"RightSearch",(function(){return Mc})),a.d(t,"StickerSearch",(function(){return Tc})),a.d(t,"GifSearch",(function(){return Rc})),a.d(t,"PollResults",(function(){return Bc})),a.d(t,"Management",(function(){return Xc})),a.d(t,"PaymentModal",(function(){return yr})),a.d(t,"ReceiptModal",(function(){return Ir}));var n=a(0),c=a(2),r=a(5),s=a(19),l=a(1),o=a(7),i=a(112),d=a(6),m=a(4),u=a(3),h=a(130),b=a(47),g=a(175),p=a(25),v=a(105),E=a(118),O=a(189),f=a(37),j=a(48),C=a(144),y=a(55);function k(e,t,a,n){const{mediaEl:c}=P(t,n);if(!c)return;const{width:r}=y.a.get();let o,d=!1;if(n){const{photo:e,video:t,webPage:a}=Object(m.v)(n);d=Boolean(t),o=t?Object(m.bb)(t):Object(m.S)(e||a.photo)}else o=i.a;const{width:u,height:h}=Object(i.j)(e,d),{width:b,height:g}=Object(i.e)(u,h,o.width,o.height),p=(r-b)/2,v=function(e){const t=window.matchMedia(i.b);let a=4.125;e&&(a+=t.matches?.875:3.375);return a*i.c}(e)+(h-g)/2;let{top:E,left:O,width:f,height:j}=c.getBoundingClientRect();if([s.h.SharedMedia,s.h.Album,s.h.ScheduledAlbum,s.h.SearchResult].includes(t)){const e=function(e,t,a,n,c,r){if(e===t){const s=Math.max(c,r)*(e/t);n-=(s-c)/2,a-=(s-r)/2,c=s,r=s}else if(e>t){const a=c;n-=((c=r*(e/t))-a)/2}else if(t>e){const n=r;a-=((r=c*(t/e))-n)/2}return{top:a,left:n,width:c,height:r}}(b,g,E,O,f,j);E=e.top,O=e.left,f=e.width,j=e.height}const C=O+f/2-(p+b/2),k=E+j/2-(v+g/2),N=f/b,S=j/g,F=I(a||c);w(F,{top:v+"px",left:p+"px",width:b+"px",height:g+"px",transform:`translate3d(${C}px, ${k}px, 0) scale(${N}, ${S})`}),M(F,t),document.body.classList.add("ghost-animating"),requestAnimationFrame(()=>{document.body.appendChild(F),requestAnimationFrame(()=>{F.style.transform="",function(e){e.firstChild.style.objectFit="default",e.classList.remove("rounded-corners","circle")}(F),setTimeout(()=>{requestAnimationFrame(()=>{document.body.contains(F)&&document.body.removeChild(F),document.body.classList.remove("ghost-animating")})},200+l.c)})})}function N(e,t,a){const{container:n,mediaEl:c}=P(e,a);if(!c)return;const r=document.getElementById("MediaViewer").querySelector(".active .media-viewer-content img, .active .media-viewer-content video");if(!r||!c)return;const{top:o,left:i,width:d,height:m}=r.getBoundingClientRect(),{top:u,left:h,width:b,height:g}=c.getBoundingClientRect();let p=u;if(!function(e){if("none"===e.style.display)return!1;const t=e.getBoundingClientRect(),{height:a}=y.a.get();return t.top<=a&&t.top+t.height>=0}(n)){const{height:e}=y.a.get();p=uf?O=f:f>O&&(f=O));const C=document.getElementsByClassName("ghost")[0],k=C||I(t||c,e===s.h.ProfileAvatar);C||w(k,{top:p+"px",left:h+"px",width:b+"px",height:g+"px",transform:`translate3d(${v}px, ${E}px, 0) scale(${O}, ${f})`}),requestAnimationFrame(()=>{if(C){const{top:e,left:t,width:a,height:n}=C.getBoundingClientRect();w(k,{transition:"none",top:p+"px",left:h+"px",transformOrigin:"top left",transform:`translate3d(${t-h}px, ${e-p}px, 0) scale(${a/b}, ${n/g})`,width:b+"px",height:g+"px"})}document.body.classList.add("ghost-animating"),C||document.body.appendChild(k),requestAnimationFrame(()=>{C&&(C.style.transition=""),k.style.transform="",j&&(k.style.opacity="0"),M(k,e),setTimeout(()=>{requestAnimationFrame(()=>{document.body.contains(k)&&document.body.removeChild(k),document.body.classList.remove("ghost-animating")})},200+l.c)})})}function I(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(m.lb)(t)?Object(d.Fb)(e,t):Object(d.f)(e,t)};if(!a||!t)return{};const c=Object(d.k)(e,t,a);return{message:c,sender:c&&Object(d.sb)(e,c)}},(e,t)=>Object(u.l)(t,["closeMediaViewer","focusMessage"]))(({chatId:e,messageId:t,sender:a,isAvatar:c,message:r,closeMediaViewer:s,focusMessage:l})=>{const o=Object(n.m)(()=>{s(),l({chatId:e,messageId:t})},[e,l,t,s]),i=Object(F.a)();if(!a||!r&&!c)return;const d=a.id<0,u=Object(m.V)(i,a);return n.a.createElement("div",{className:"SenderInfo",onClick:o},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"},u&&Object(B.a)(u)),n.a.createElement("div",{className:"date",dir:"auto"},c?i("lng_mediaview_profile_photo"):Object(D.d)(i,1e3*r.date))))}),G=a(176),q=a(61),z=a(42),$=a(119);a(251);var H=({mediaData:e,isVideo:t,isZoomed:a,message:c,fileName:r,isAvatar:s,onCloseMediaViewer:l,onForward:i,onZoomToggle:d})=>{const[u,h]=Object(n.r)(!1),b=t&&c?Object(m.D)(c,"download"):void 0,{mediaData:g,downloadProgress:p}=Object(E.a)(b,!u);Object(n.n)(()=>{u&&g&&(Object(G.a)(g,r),h(!1))},[r,g,u]),Object(n.n)(()=>{h(!1)},[b]);const v=Object(n.m)(e=>{e.stopPropagation(),h(e=>!e)},[]),O=Object(F.a)(),f=Object(n.p)(()=>({onTrigger:e,isOpen:t})=>n.a.createElement(R.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 o.g?n.a.createElement("div",{className:"MediaViewerActions-mobile"},n.a.createElement(q.a,{trigger:f,positionX:"right"},!s&&n.a.createElement(z.a,{icon:"forward",onClick:i},O("Forward")),t?n.a.createElement(z.a,{icon:u?"close":"download",onClick:v},u?Math.round(100*p)+"% Downloading...":"Download"):n.a.createElement(z.a,{icon:"download",href:e,download:r},O("AccActionDownload"))),u&&n.a.createElement($.a,{progress:p,size:"s",noCross:!0})):n.a.createElement("div",{className:"MediaViewerActions"},!s&&n.a.createElement(n.a.Fragment,null,n.a.createElement(R.a,{round:!0,size:"smaller",color:"translucent-white",ariaLabel:O("Forward"),onClick:i},n.a.createElement("i",{className:"icon-forward"}))),t?n.a.createElement(R.a,{round:!0,size:"smaller",color:"translucent-white",ariaLabel:O("AccActionDownload"),onClick:v},u?n.a.createElement($.a,{progress:p,size:"s",onClick:v}):n.a.createElement("i",{className:"icon-download"})):n.a.createElement(R.a,{href:e,download:r,round:!0,size:"smaller",color:"translucent-white",ariaLabel:O("AccActionDownload")},n.a.createElement("i",{className:"icon-download"})),n.a.createElement(R.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(R.a,{round:!0,size:"smaller",color:"translucent-white",ariaLabel:O("Close"),onClick:l},n.a.createElement("i",{className:"icon-close"})))},_=a(9);a(252);var V=({text:e="",isHideable:t,onClick:a})=>{const[c,r]=Object(n.r)(!1);return Object(n.n)(()=>{const e=document.querySelector(".MediaViewerFooter .media-text"),t=()=>{const t=e?e.clientHeight:0;r(t>2*i.c)};t();const a=Object(_.g)(t,500,!0);return window.addEventListener("resize",a,!1),()=>{window.removeEventListener("resize",a,!1)}},[]),n.a.createElement("div",{className:"MediaViewerFooter "+(t?"hideable":""),onClick:function(t){e&&t.stopPropagation()}},e&&n.a.createElement("div",{className:"media-viewer-footer-content",onClick:a},n.a.createElement("p",{className:"media-text custom-scroll "+(c?"multiline":""),dir:"auto"},e)))},W=a(34),K=a(135);const Y=function(){if(void 0!==document.fullscreenElement)return"fullscreenElement";if(void 0!==document.mozFullScreenElement)return"mozFullScreenElement";if(void 0!==document.webkitFullscreenElement)return"webkitFullscreenElement";return""}();var Z=a(145),Q=a(134);const X=["bytes","kB","MB","GB","TB","PB"];var J=e=>{const t=0===e?0:Math.floor(Math.log(e)/Math.log(1024));return`${(e/1024**Math.floor(t)).toFixed(1)} ${X[t]}`};a(253);const ee=e=>{e.stopPropagation()};var te=({bufferedProgress:e,currentTime:t,duration:a,fileSize:c,isForceVisible:r,isForceMobileVersion:s,isPlayed:l,isFullscreenSupported:i,isFullscreen:d,onChangeFullscreen:m,onPlayPause:u,onSeek:h})=>{const[b,g]=Object(n.r)(!0);Object(n.n)(()=>{r&&g(r)},[r]),Object(n.n)(()=>{let e;return r||(o.g?g(!1):e=window.setTimeout(()=>{g(!1)},800)),()=>{e&&window.clearTimeout(e)}},[r]),Object(n.n)(()=>((b||r)&&document.body.classList.add("video-controls-visible"),()=>{document.body.classList.remove("video-controls-visible")}),[r,b]);const p=Object(F.a)();var v,E;if(b||r)return n.a.createElement("div",{className:"VideoPlayerControls "+(s?"mobile":""),onClick:ee},function(e,t,a,c){const r=e/t*100,s=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: ${s||0}%`}),n.a.createElement("div",{className:"player-seekline-played",style:`width: ${r||0}%`}),n.a.createElement("input",{min:"0",max:"100",step:.01,type:"range",onInput:c,className:"player-seekline-input",value:r||0})))}(t,a,e,h),n.a.createElement(R.a,{ariaLabel:p("AccActionPlay"),size:"tiny",ripple:!o.g,color:"translucent-white",className:"play",onClick:u},n.a.createElement("i",{className:l?"icon-pause":"icon-play"})),function(e,t){return n.a.createElement("div",{className:"player-time"},`${Object(D.e)(e)} / ${Object(D.e)(t)}`)}(t,a),e<1&&(v=e,E=c,n.a.createElement("div",{className:"player-file-size"},`${J(E*v)} / ${J(E)}`)),i&&n.a.createElement(R.a,{ariaLabel:"Fullscreen",size:"tiny",color:"translucent-white",className:"fullscreen",onClick:m},n.a.createElement("i",{className:""+(d?"icon-smallscreen":"icon-fullscreen")})))};a(254);function ae(){return(ae=Object.assign||function(e){for(var t=1;t{const m=Object(n.q)(null),[u,h]=Object(n.r)(!o.l||!o.e),[b,g]=Object(n.r)(0),[p,v]=Object(n.r)(!0),[E,O,f]=function(e,t){const[a,c]=Object(n.r)(Boolean(Y&&document[Y]));return Object(n.o)(()=>{const a=()=>{c(Boolean(Y&&document[Y]))},n=()=>{c(!0)},r=()=>{c(!1),t(!1)},s=e.current;return document.addEventListener("fullscreenchange",a,!1),document.addEventListener("webkitfullscreenchange",a,!1),document.addEventListener("mozfullscreenchange",a,!1),s&&(s.addEventListener("webkitbeginfullscreen",n,!1),s.addEventListener("webkitendfullscreen",r,!1)),()=>{document.removeEventListener("fullscreenchange",a,!1),document.removeEventListener("webkitfullscreenchange",a,!1),document.removeEventListener("mozfullscreenchange",a,!1),s&&(s.removeEventListener("webkitbeginfullscreen",n,!1),s.removeEventListener("webkitendfullscreen",r,!1))}},[]),Y||"iOS"===o.o?[a,()=>{e.current&&(Y||"iOS"===o.o)&&(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,h),{isBuffered:j,bufferedProgress:C,bufferingHandlers:y}=Object(K.a)(),{shouldRender:k,transitionClassNames:N}=Object(W.a)(!j,void 0,void 0,"slow");Object(n.n)(()=>{i||!l?m.current.pause():e&&!o.l&&Object(Q.a)(m.current)},[i,l,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(Z.a)(m,[]);const S=Object(n.m)(()=>{v(!0)},[]),w=Object(n.m)(()=>{v(!1)},[]),P=Object(n.m)(e=>{g(e.currentTarget.currentTime)},[]),M=Object(n.m)(()=>{g(0),h(!1)},[]),F=Object(n.m)(()=>{E&&f?f():!E&&O&&O()},[f,E,O]),L=Object(n.m)(e=>{e.stopPropagation(),m.current.currentTime=Number(e.target.value)*m.current.duration/100},[]),A=Object(n.m)(e=>{e.stopPropagation(),v(!p)},[p]);Object(n.n)(()=>{const e=e=>{"Enter"!==e.key&&" "!==e.key||I(e)};return document.addEventListener("keydown",e,!1),()=>{document.removeEventListener("keydown",e,!1)}},[I]);const T=c&&`width: ${c.width}px; height: ${c.height}px`,R=`background-image: url(${a})`;return n.a.createElement("div",{className:"VideoPlayer",onClick:!t&&o.g?A:void 0,onMouseOver:t?void 0:S,onMouseOut:t?void 0:w},n.a.createElement("div",{style:T},n.a.createElement("video",ae({ref:m,autoPlay:o.l,playsInline:!0,loop:t,muted:t,id:"media-viewer-video",style:R,onEnded:M},y,{onTimeUpdate:P}),e&&n.a.createElement("source",{src:e}))),k&&n.a.createElement("div",{className:["spinner-container",N].join(" ")},!j&&n.a.createElement("div",{className:"buffering"},"Buffering..."),n.a.createElement($.a,{size:"xl",progress:j?1:r,square:!0,onClick:d})),!t&&!k&&n.a.createElement(te,{isPlayed:u,bufferedProgress:C,currentTime:b,isFullscreenSupported:Boolean(O),isFullscreen:E,fileSize:s,duration:m.current?m.current.duration:0,isForceVisible:!u||p,isForceMobileVersion:c&&c.width<400,onSeek:L,onChangeFullscreen:F,onPlayPause:I}))}),ce=a(8);a(255);var re=Object(n.h)(({isShown:e,onChangeZoom:t})=>{const{transitionClassNames:a}=Object(W.a)(e),c=Object(f.a)(e),r=Object(n.q)(null),[s,l]=Object(n.r)(1),i=Object(n.q)(!1);Object(n.n)(()=>{e&&!c&&l(1.5)},[e,c]);const d=Object(n.m)(()=>{i.current=!0},[]),m=Object(n.m)(()=>{i.current=!1,1===s&&t(s,!i.current)},[t,s]);Object(n.n)(()=>{t(s,!i.current)},[s,t]);const u=Object(F.a)(),h=Object(ce.a)("ZoomControls",a);return n.a.createElement("div",{className:h},n.a.createElement(R.a,{disabled:1===s,size:"tiny",color:"translucent-white",ariaLabel:u("ZoomOut"),className:"zoom-out",ripple:!o.g,onClick:()=>{r.current&&l(Math.max(1,s-.5))}},n.a.createElement("i",{className:"icon-zoom-out"})),n.a.createElement(R.a,{disabled:3===s,size:"tiny",color:"translucent-white",ariaLabel:"Zoom In",className:"zoom-in",ripple:!o.g,onClick:()=>{r.current&&l(Math.min(3,s+.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*(s-1)}%`}),n.a.createElement("input",{ref:r,min:1,max:3,step:"0.5",value:s,type:"range",className:"seekline-input",onChange:e=>{l(Math.min(3,Math.max(Number(e.target.value),1)))},onMouseDown:d,onMouseUp:m}))))});a(256);const se=[1,0,0,1,0,0],le={1:1,1.5:1.5,2:2.2,2.5:3.3,3:5.5};var oe=Object(n.h)(({children:e,className:t,noWrap:a,canPan:c,zoomLevel:r,panDeltaX:s,panDeltaY:l,onPan:o})=>{const i=le[r]||r,[d,m]=Object(n.r)(!1),[h,b]=Object(n.r)({dx:s,dy:l,x:0,y:0}),[g,p]=Object(n.r)(se),v=Object(n.q)(null),E=Object(n.q)(null);Object(n.n)(()=>{const e=i||g[0],t=s||g[4],a=l||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(u.a)(g,n)||p(function(e,t,a){const n=a&&a.querySelector(".active img");if(!a||!n)return t;const c=a.getBoundingClientRect(),r=n.getBoundingClientRect(),s=r.width/e*t[0],l=r.height/e*t[3],o=(c.width-s)/2+t[4],i=(c.height-l)/2+t[5];return c.width&&c.width-150{c||p(se)},[c]),Object(n.n)(()=>{E.current&&(E.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};b(t),m(!0),v.current&&v.current.classList.add("move")},onMouseUp:()=>{m(!1),v.current&&v.current.classList.remove("move"),o&&o(g[4],g[5])},onMouseMove:e=>{if(d){const t=function(e,t){const a=[...g],n=h.x-e,c=h.y-t;return a[4]=h.dx-n,a[5]=h.dy-c,a}(e.pageX,e.pageY);p(t),E.current&&(E.current.style.transform=`matrix(${g.toString()})`)}}},n.a.createElement("div",{ref:E,className:"pan-container"},e))});a(257);function ie(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 de=Object(n.h)(Object(c.h)(e=>{const{chatId:t,threadId:a,messageId:n,avatarOwnerId:c,profilePhotoIndex:r,origin:l}=e.mediaViewer,{animationLevel:o}=e.settings.byKey;if(l===s.h.SearchResult){if(!t||!n)return{animationLevel:o};const a=Object(d.k)(e,t,n);return a?{chatId:t,messageId:n,senderId:a.senderId,origin:l,message:a,animationLevel:o}:{animationLevel:o}}if(c){return{messageId:-1,senderId:c,avatarOwner:Object(d.Fb)(e,c)||Object(d.f)(e,c),profilePhotoIndex:r||0,animationLevel:o,origin:l}}if(!(t&&a&&n))return{animationLevel:o};let i,m,u;if(i=l&&[s.h.ScheduledAlbum,s.h.ScheduledInline].includes(l)?Object(d.ob)(e,t,n):Object(d.k)(e,t,n),!i)return{animationLevel:o};if(m=l&&[s.h.ScheduledAlbum,s.h.ScheduledInline].includes(l)?Object(d.pb)(e,t):Object(d.m)(e,t),l===s.h.Inline||l===s.h.Album)u=Object(d.fb)(e,t,a)||Object(d.X)(e,t,a);else if(l===s.h.SharedMedia){const t=Object(d.v)(e),{foundIds:a}=t&&t.resultsByType&&t.resultsByType.media||{};u=a}return{chatId:t,threadId:a,messageId:n,senderId:i.senderId,origin:l,message:i,chatMessages:m,collectionIds:u,animationLevel:o}},(e,t)=>Object(u.l)(t,["openMediaViewer","closeMediaViewer","openForwardMenu","focusMessage"]))(({chatId:e,threadId:t,messageId:a,senderId:c,origin:d,avatarOwner:u,profilePhotoIndex:y,message:I,chatMessages:S,collectionIds:w,openMediaViewer:P,closeMediaViewer:M,openForwardMenu:L,focusMessage:D,animationLevel:B})=>{const x=Object(n.q)(null),G=Boolean(u||a),q=I?Object(m.R)(I):void 0,z=I?Object(m.G)(I):void 0,$=I?Object(m.P)(I):void 0,_=Boolean(q),W=Boolean(z||q),K=Boolean($),Y=$?$.isGif:void 0,Z=d===s.h.SharedMedia,Q=d===s.h.SearchResult,X=B>=1?"mv-slide":"none",J=2===B?"slide-fade":"none",ee=2===B,te=u?`avatar${u.id}-${y}.jpg`:I&&Object(m.B)(I),ae=Object(f.a)(c),[ce,se]=Object(n.r)(!1),[le,de]=Object(n.r)(!1),[me,ue]=Object(n.r)(1),[he,be]=Object(n.r)({x:0,y:0}),ge=Object(n.p)(()=>_&&a?[a]:Object(m.i)(S||{},w||[],Z),[_,a,S,w,Z]),pe=a?ge.indexOf(a):-1,ve=0===pe||-1===pe,Ee=pe===ge.length-1||-1===pe;function Oe(e){if(u&&void 0!==y){const{photos:t}=u;return t&&t[y]?`photo${t[y].id}?size=c`:Object(m.f)(u,e?"big":"normal")}return I&&Object(m.D)(I,e?"viewerFull":"viewerPreview")}!G||ae&&ae===c&&x.current||(x.current=pe);const fe=Object(v.a)(I&&(Z||Q)&&Object(m.D)(I,"pictogram"),void 0,r.ApiMediaFormat.BlobUrl,void 0,ee&&350),je=Oe(),Ce=Object(v.a)(je,void 0,u&&je&&je.startsWith("profilePhoto")?r.ApiMediaFormat.DataUri:r.ApiMediaFormat.BlobUrl,void 0,ee&&350),{mediaData:ye,downloadProgress:ke}=Object(E.a)(Oe(!0),void 0,I&&Object(m.C)(I,"viewerFull"),void 0,ee&&350),Ne=z||$?(z||$).blobUrl:void 0;let Ie=!K&&(Ne||ye)||Ce||fe;const Se=Object(O.a)(!Ie&&I&&Object(m.E)(I));Ie||d===s.h.SearchResult||(Ie=Se);const we=W?Object(m.S)(_?Object(m.R)(I):Object(m.G)(I)):void 0,Pe=K?Object(m.bb)(Object(m.P)(I)):void 0;Object(n.n)(()=>{o.g&&document.body.classList.toggle("is-media-viewer-open",G)},[G]);const Me=Object(p.a)();Object(n.n)(()=>{const e=window.matchMedia(i.b);return"function"==typeof e.addEventListener?e.addEventListener("change",Me):"function"==typeof e.addListener&&e.addListener(Me),()=>{"function"==typeof e.removeEventListener?e.removeEventListener("change",Me):"function"==typeof e.removeListener&&e.removeListener(Me)}},[Me]);const Fe=Object(f.a)(I),Le=Object(f.a)(d),Ae=Object(f.a)(u),Te=Object(f.a)(Ie);Object(n.n)(()=>{if(ee&&G&&!Fe&&!Ae){Object(j.b)(350+l.c);const e=I?Object(C.a)(I):void 0;k(Boolean(e),d,Ie,I)}ee&&!G&&(Fe||Ae)&&(Object(j.b)(350+l.c),N(Le,Te,Fe||void 0))},[ee,G,d,Le,I,Fe,Ae,Ie,Te]),Object(n.n)(()=>{let e;return le?se(!0):e=window.setTimeout(()=>{se(!1)},350),()=>{e&&window.clearTimeout(e)}},[le]);const Re=()=>{de(!1),ue(1),be({x:0,y:0})},De=Object(n.m)(()=>{de(!le),ue(le?1:1.5),le&&be({x:0,y:0})},[le]),Be=Object(n.m)((e,t=!1)=>{ue(e),1===e&&t&&Re()},[]),xe=Object(n.m)(()=>{M(),Re()},[M]),Ue=Object(n.m)(()=>{xe(),D({chatId:e,threadId:t,messageId:a})},[xe,e,t,D,a]),Ge=Object(n.m)(()=>{L({fromChatId:e,messageIds:[a]}),Re()},[L,e,a]);Object(n.n)(()=>G?Object(b.a)(()=>{le?Re():xe()}):void 0,[xe,G,le]),Object(n.n)(()=>{K&&!Y&&Object(g.b)()},[Y,K]);const qe=Object(n.m)((e,t)=>{let a=ge.indexOf(e);return(-1===t&&a>0||1===t&&a{ve||P({chatId:e,threadId:t,messageId:a?qe(a,-1):void 0,origin:d})},[e,t,qe,ve,a,P,d]),$e=Object(n.m)(()=>{Ee||P({chatId:e,threadId:t,messageId:a?qe(a,1):void 0,origin:d})},[e,t,qe,Ee,a,P,d]);Object(n.n)(()=>{const e=e=>{switch(e.key){case"Left":case"ArrowLeft":ze();break;case"Right":case"ArrowRight":$e()}};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=Y&&!o.e;return Object(h.b)(e,{excludedClosestSelector:".backdrop, .navigation, .media-viewer-head, .media-viewer-footer"+(t?"":", .VideoPlayer"),onClick:()=>{le||xe()},onSwipe:o.l?(e,t)=>{t===h.a.Right?ze():t===h.a.Left?$e():xe()}:void 0})},[xe,Y,le,$e,ze,ce]);const He=Object(n.m)((e,t)=>{be({x:e,y:t})},[]),_e=Object(F.a)();function Ve(t){if(u)return n.a.createElement("div",{key:e,className:"media-viewer-content"},ie(ye||Ce,Object(i.g)(i.a,!1),!o.g&&!le));if(I){const e=Object(C.a)(I),c=Boolean(e);return n.a.createElement("div",{key:a,className:"media-viewer-content "+(c?"has-footer":"")},W&&ie(Ne||ye||Ce||fe,I&&Object(i.g)(we,c),!o.g&&!le),K&&n.a.createElement(ne,{key:a,url:Ne||ye,isGif:Y,posterData:Ie,posterSize:I&&Object(i.g)(Pe,c,!0),downloadProgress:ke,fileSize:$.size,isMediaViewerOpen:G,noPlay:!t,onClose:xe}),e&&n.a.createElement(V,{text:e,onClick:Ue,isHideable:K}))}}function We(){return n.a.createElement(U,{key:u?u.id:a,chatId:u?u.id:e,messageId:a,isAvatar:Boolean(u)})}return n.a.createElement(A.a,{id:"MediaViewer",className:le?"zoomed":"",isOpen:G},()=>n.a.createElement(n.a.Fragment,null,n.a.createElement("div",{className:"media-viewer-head",dir:_e.isRtl?"rtl":void 0},o.g&&n.a.createElement(R.a,{className:"media-viewer-close",round:!0,size:"smaller",color:"translucent-white",ariaLabel:_e("Close"),onClick:xe},n.a.createElement("i",{className:"icon-close"})),n.a.createElement(T.b,{activeKey:x.current,name:J},We),n.a.createElement(H,{mediaData:ye||Ce,isVideo:K,isZoomed:le,message:I,fileName:te,onCloseMediaViewer:xe,onForward:Ge,onZoomToggle:De,isAvatar:Boolean(u)})),n.a.createElement(oe,{noWrap:!ce,canPan:le,panDeltaX:he.x,panDeltaY:he.y,zoomLevel:me,onPan:He},n.a.createElement(T.b,{className:"slide-container",activeKey:pe,name:X},Ve)),!ve&&n.a.createElement("button",{type:"button",className:"navigation prev "+(K&&!Y&&"inline"),"aria-label":_e("AccDescrPrevious"),dir:_e.isRtl?"rtl":void 0,onClick:ze}),!Ee&&n.a.createElement("button",{type:"button",className:"navigation next "+(K&&!Y&&"inline"),"aria-label":_e("Next"),dir:_e.isRtl?"rtl":void 0,onClick:$e}),n.a.createElement(re,{isShown:le,onChangeZoom:Be})))})),me=a(51),ue=a(125),he=a(62),be=a(16),ge=a(107),pe=a(45),ve=a(110),Ee=a(103),Oe=a(106),fe=a(121);a(258);var je=Object(n.h)(Object(c.h)(e=>{const{chats:{byId:t,listIds:a},currentUserId:n}=e;return{chatsById:t,activeListIds:a.active,archivedListIds:a.archived,currentUserId:n}},(e,t)=>Object(u.l)(t,["setForwardChatId","exitForwardMode","loadMoreChats"]))(({chatsById:e,activeListIds:t,archivedListIds:a,currentUserId:c,isOpen:s,setForwardChatId:l,exitForwardMode:i,loadMoreChats:d})=>{const[u,h]=Object(n.r)(""),b=Object(n.q)(null),g=Object(F.a)();Object(n.n)(()=>{s?o.g||setTimeout(()=>{requestAnimationFrame(()=>{b.current&&b.current.focus()})},500):(b.current&&b.current.blur(),setTimeout(()=>{h("")},300))},[s]);const p=Object(n.p)(()=>{const n=[...t||[],...a||[]];return Object(m.Db)([...n.filter(t=>{const a=e[t];return!a||!!Object(m.e)(a,r.MAIN_THREAD_ID)&&(!u||Object(me.a)(Object(m.l)(g,e[t],void 0,t===c),u))})],e,void 0,c?[c]:void 0)},[t,a,e,c,u,g]),[v,E]=Object(ue.a)(d,p,Boolean(u)),O=Object(n.m)(e=>{h(e.currentTarget.value)},[]),f=Object(n.q)(null),j=Object(he.a)(f,s,e=>{v&&l({id:v[e]})},".ListItem-button",!0),C=n.a.createElement("div",{className:"modal-header",dir:g.isRtl?"rtl":void 0},n.a.createElement(R.a,{round:!0,color:"translucent",size:"smaller",ariaLabel:g("Close"),onClick:i},n.a.createElement("i",{className:"icon-close"})),n.a.createElement(pe.a,{ref:b,value:u,onChange:O,onKeyDown:j,placeholder:g("ForwardTo")}));return n.a.createElement(ge.a,{isOpen:s,onClose:i,className:"ForwardPicker",header:C},v&&v.length?n.a.createElement(ve.a,{className:"picker-list custom-scroll",items:v,onLoadMore:E,noScrollRestore:Boolean(u),ref:f,onKeyDown:j},v.map(e=>n.a.createElement(Ee.a,{key:e,className:"chat-item-clickable force-rounded-corners",onClick:()=>l({id:e})},Object(m.lb)(e)?n.a.createElement(Oe.a,{status:e===c?g("SavedMessagesInfo"):void 0,userId:e}):n.a.createElement(fe.a,{chatId:e})))):v&&!v.length?n.a.createElement("p",{className:"no-results"},"Sorry, nothing found."):n.a.createElement(be.a,null))})),Ce=a(167);a(259);function ye(e){return e.isSlowMode?"Slowmode enabled":"Something went wrong"}var ke=Object(n.h)(Object(c.h)(e=>Object(u.l)(e,["errors"]),(e,t)=>Object(u.l)(t,["dismissError"]))(({errors:e,dismissError:t})=>{const a=Object(F.a)();if(e.length)return n.a.createElement("div",{id:"Errors"},e.map(e=>n.a.createElement(ge.a,{isOpen:!0,onClose:t,className:"error",title:ye(e)},n.a.createElement("p",null,Object(Ce.a)(e)),n.a.createElement(R.a,{isText:!0,onClick:t},a("OK")))))})),Ne=a(178);var Ie=Object(n.h)(Object(c.h)(e=>Object(u.l)(e,["notifications"]),(e,t)=>Object(u.l)(t,["dismissNotification"]))(({notifications:e,dismissNotification:t})=>{if(e.length)return n.a.createElement("div",{id:"Notifications"},e.map(({message:e})=>n.a.createElement(Ne.a,{message:Object(B.a)(e,["emoji","br","links"]),onDismiss:t})))})),Se=a(133),we=a(114);var Pe=Object(n.h)(Object(c.h)(void 0,(e,t)=>Object(u.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]),r=Object(n.m)(()=>{t({url:void 0})},[t]),s=Object(Se.a)(e);return n.a.createElement(we.a,{isOpen:Boolean(e),onClose:r,title:a("OpenUrlTitle"),textParts:Object(B.a)(a("OpenUrlAlert2",s),["links"]),confirmLabel:a("OpenUrlTitle"),confirmHandler:c})}));a(260);const Me=["M","T","W","T","F","S","S"];function Fe(e,t,a,n,c){const r=new Date(e,t,a,0,0,0,0),s=n&&new Date(n.getFullYear(),n.getMonth(),n.getDate(),0,0,0,0),l=c&&new Date(c.getFullYear(),c.getMonth(),c.getDate(),0,0,0,0);return!!(l&&r>l)||!!(s&&r{const h=Object(F.a)(),b=new Date,g=Object(n.p)(()=>e?new Date(e):new Date,[e]),p=t?new Date(t):void 0,[v,E]=Object(n.r)(g),[O,f]=Object(n.r)(Le(g.getHours())),[j,C]=Object(n.r)(Le(g.getMinutes())),y=v.getFullYear(),k=v.getMonth(),N=v.getDate();Object(n.n)(()=>{r&&E(g)},[r,g]);const I=c&&y>=b.getFullYear()&&k>=b.getMonth()||p&&y>=p.getFullYear()&&k>=p.getMonth(),S=a&&y<=b.getFullYear()&&k<=b.getMonth(),w=Object(n.p)(()=>function(e,t){const a=[],n=new Date;n.setFullYear(e),n.setMonth(t),n.setDate(1);const c=n.getDay();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),E(n);const c=Le(a);f(c),e.target.value=c},[v]),M=Object(n.m)(e=>{const t=e.target.value.replace(/[^\d]+/g,"");if(!t.length)return C(""),void(e.target.value="");const a=Math.max(0,Math.min(Number(t),59)),n=new Date(v.getTime());n.setMinutes(a),E(n);const c=Le(a);C(c),e.target.value=c},[v]);return n.a.createElement(ge.a,{isOpen:r,onClose:d,className:"CalendarModal"},n.a.createElement("div",{className:"container"},n.a.createElement("div",{className:"month-selector"},n.a.createElement(R.a,{round:!0,size:"smaller",color:"translucent",onClick:d},n.a.createElement("i",{className:"icon-close"})),n.a.createElement("h4",null,Object(D.f)(h,v,o.g)),n.a.createElement(R.a,{round:!0,size:"smaller",color:"translucent",disabled:S,onClick:S?void 0:function(){E(e=>{const t=new Date(e);return t.setMonth(t.getMonth()-1),t})}},n.a.createElement("i",{className:"icon-previous"})),n.a.createElement(R.a,{round:!0,size:"smaller",color:"translucent",disabled:I,onClick:I?void 0:function(){E(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,e))),w.map(e=>n.a.createElement("div",{role:"button",tabIndex:0,onClick:()=>{return t=e,void E(e=>{const a=new Date(e);return a.setDate(t),a});var t},className:Object(ce.a)("day-button",Fe(y,k,e,a?b:void 0,c?b:p)?"disabled":""+(e?"clickable":""),e===N&&"selected")},!!e&&n.a.createElement("span",null,e))))),s&&n.a.createElement("div",{className:"timepicker"},n.a.createElement("input",{type:"text",className:"form-control",inputMode:"decimal",value:O,onChange:P}),":",n.a.createElement("input",{type:"text",className:"form-control",inputMode:"decimal",value:j,onChange:M})),n.a.createElement("div",{className:"footer"},n.a.createElement(R.a,{onClick:function(){m(v)}},s?function(e,t){const a=Object(D.c)(e,t,!0);if("Today"===a)return e("Conversation.ScheduleMessage.SendToday",Object(D.h)(t));return e("Conversation.ScheduleMessage.SendOn",a).replace("%@",Object(D.h)(t))}(h,v):l),i&&n.a.createElement(R.a,{onClick:u,isText:!0},i)))});var Te=Object(n.h)(Object(c.h)((e,{message:t,isSchedule:a})=>{const{threadId:n}=Object(d.y)(e)||{},{canDeleteForAll:c}=n&&Object(d.b)(e,t,n)||{},r=Object(d.f)(e,t.chatId);return{canDeleteForAll:!a&&c,contactName:r&&Object(m.lb)(r.id)?Object(m.Y)(Object(d.Fb)(e,Object(m.U)(r))):void 0,willDeleteForCurrentUserOnly:r&&Object(m.ib)(r)&&!c,willDeleteForAll:r&&Object(m.nb)(r)}},(e,t)=>Object(u.l)(t,["deleteMessages","deleteScheduledMessages"]))(({isOpen:e,isSchedule:t,message:a,album:c,canDeleteForAll:r,contactName:s,willDeleteForCurrentUserOnly:l,willDeleteForAll:o,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]),h=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]),b=Object(F.a)();return n.a.createElement(ge.a,{isOpen:e,onClose:i,onEnter:e&&!r?h:void 0,className:"delete",title:b("DeleteSingleMessagesTitle")},n.a.createElement("p",null,b("AreYouSureDeleteSingleMessage")),l&&n.a.createElement("p",null,b("lng_delete_for_me_chat_hint")),o&&n.a.createElement("p",null,b("lng_delete_for_everyone_hint",1,"i")),r&&n.a.createElement(R.a,{color:"danger",className:"confirm-dialog-button",isText:!0,onClick:u},s&&b("Conversation.DeleteMessagesFor",Object(B.a)(s)),!s&&b("Conversation.DeleteMessagesForEveryone")),n.a.createElement(R.a,{color:"danger",className:"confirm-dialog-button",isText:!0,onClick:h},b(r?"ChatList.DeleteForCurrentUser":"Delete")),n.a.createElement(R.a,{className:"confirm-dialog-button",isText:!0,onClick:i},b("Cancel")))}));var Re=Object(n.h)(Object(c.h)((e,{chatId:t})=>{const a=Object(m.lb)(t),n=Object(d.O)(e,t),c=Object(d.f)(e,t),r=!!c&&Object(m.jb)(c),s=!!c&&Object(m.ib)(c),l=!!c&&Object(m.nb)(c);return{isPrivateChat:a,isChatWithSelf:n,isChannel:r,isGroup:s,isSuperGroup:l,canPinForAll:a&&!n||l||s,contactName:c&&Object(m.lb)(c.id)?Object(m.Y)(Object(d.Fb)(e,Object(m.U)(c))):void 0}},(e,t)=>Object(u.l)(t,["pinMessage"]))(({isOpen:e,messageId:t,chatId:a,isChannel:c,isGroup:r,isSuperGroup:s,canPinForAll:l,contactName:o,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(F.a)();return n.a.createElement(ge.a,{isOpen:e,onClose:i,className:"pin",title:h("PinMessageAlertTitle")},n.a.createElement("p",null,h(c?"PinMessageAlertChannel":r||s?"PinMessageAlert":"PinMessageAlertChat")),n.a.createElement(R.a,{className:"confirm-dialog-button",isText:!0,onClick:u},h("DialogPin")),l&&n.a.createElement(R.a,{className:"confirm-dialog-button",isText:!0,onClick:m},o?h("Conversation.PinMessagesFor",o):h("Conversation.PinMessageAlert.PinAndNotifyMembers")),n.a.createElement(R.a,{className:"confirm-dialog-button",isText:!0,onClick:i},h("Cancel")))}));var De=Object(n.h)(({isOpen:e,pinnedMessagesCount:t=0,onClose:a,onUnpin:c})=>{const r=Object(F.a)();return n.a.createElement(ge.a,{isOpen:e,onClose:a,className:"unpin-all",title:r("Chat.PanelUnpinAllMessages")},n.a.createElement("p",null,r("Chat.UnpinAllMessagesConfirmation",t,"i")),n.a.createElement(R.a,{className:"confirm-dialog-button",isText:!0,onClick:c},r("DialogUnpin")),n.a.createElement(R.a,{className:"confirm-dialog-button",isText:!0,onClick:a},r("Cancel")))}),Be=a(33),xe=a(54);var Ue=Object(n.h)(Object(c.h)((e,{isSchedule:t})=>{const{messageIds:a}=e.selectedMessages||{},{canDeleteForAll:n}=Object(d.e)(e),c=Object(d.r)(e);return{selectedMessageIds:a,canDeleteForAll:!t&&n,contactName:c&&Object(m.lb)(c.id)?Object(m.Y)(Object(d.Fb)(e,Object(m.U)(c))):void 0,willDeleteForCurrentUserOnly:c&&Object(m.ib)(c)&&!n,willDeleteForAll:c&&Object(m.nb)(c)}},(e,t)=>Object(u.l)(t,["deleteMessages","deleteScheduledMessages","exitMessageSelectMode"]))(({isOpen:e,isSchedule:t,selectedMessageIds:a,canDeleteForAll:c,contactName:r,willDeleteForCurrentUserOnly:s,willDeleteForAll:l,onClose:o,deleteMessages:i,deleteScheduledMessages:d,exitMessageSelectMode:m})=>{const u=Object(n.m)(()=>{i({messageIds:a,shouldDeleteForAll:!0}),m(),o()},[i,m,a,o]),h=Object(n.m)(()=>{t?d({messageIds:a}):i({messageIds:a,shouldDeleteForAll:!1}),m(),o()},[t,m,o,d,a,i]),b=Object(F.a)();if(a)return n.a.createElement(ge.a,{isOpen:e,onClose:o,onEnter:c?void 0:h,className:"delete",title:b("Conversation.DeleteManyMessages")},n.a.createElement("p",null,b("AreYouSureDeleteFewMessages")),s&&n.a.createElement("p",null,"This will delete them just for you, not for other participants in the chat."),l&&n.a.createElement("p",null,"This will delete them for everyone in this chat."),c&&n.a.createElement(R.a,{color:"danger",className:"confirm-dialog-button",isText:!0,onClick:u},r?b("ChatList.DeleteForEveryone",Object(B.a)(r)):b("Conversation.DeleteMessagesForEveryone")),n.a.createElement(R.a,{color:"danger",className:"confirm-dialog-button",isText:!0,onClick:h},b(c?"ChatList.DeleteForCurrentUser":"Delete")),n.a.createElement(R.a,{className:"confirm-dialog-button",isText:!0,onClick:o},b("Cancel")))}));a(261);var Ge=Object(n.h)(Object(c.h)(e=>{const{type:t}=Object(d.y)(e)||{},{canDelete:a}=Object(d.e)(e);return{isSchedule:"scheduled"===t,selectedMessagesCount:Object(d.rb)(e),canDeleteMessages:a}},(e,t)=>Object(u.l)(t,["exitMessageSelectMode","openForwardMenuForSelectedMessages"]))(({canPost:e,isActive:t,messageListType:a,isSchedule:c,selectedMessagesCount:r,canDeleteMessages:s,exitMessageSelectMode:l,openForwardMenuForSelectedMessages:o})=>{const[i,d,m]=Object(Be.a)();Object(n.n)(()=>t&&!i?Object(xe.a)({onBackspace:d,onDelete:d,onEsc:l}):void 0,[t,i,d,l]);const u=Object(f.a)(r||void 0,!0),h=t?r:u,b=Object(F.a)(),g=b("VoiceOver.Chat.MessagesSelected",h),p=Object(ce.a)("MessageSelectToolbar",e&&"with-composer",t&&"shown");return n.a.createElement("div",{className:p},n.a.createElement("div",{className:"MessageSelectToolbar-inner"},n.a.createElement(R.a,{color:"translucent",round:!0,onClick:l,ariaLabel:"Exit select mode"},n.a.createElement("i",{className:"icon-close"})),n.a.createElement("span",{className:"MessageSelectToolbar-count",title:g},g),!!r&&n.a.createElement("div",{className:"MessageSelectToolbar-actions"},"scheduled"!==a&&n.a.createElement(z.a,{icon:"forward",ariaLabel:"Forward Messages",onClick:o},n.a.createElement("span",{className:"item-text"},b("Forward"))),n.a.createElement(z.a,{destructive:!0,icon:"delete",onClick:d,disabled:!s,ariaLabel:b("EditAdminGroupDeleteMessages")},n.a.createElement("span",{className:"item-text"},b("Delete"))))),n.a.createElement(Ue,{isOpen:i,isSchedule:c,onClose:m}))})),qe=a(166),ze=a(50),$e=a(168),He=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},_e=a(155);var Ve=Object(n.h)(Object(c.h)((e,{chatId:t})=>{const a=Object(d.f)(e,t),n=a&&Object(m.U)(a);return{chat:a,privateChatUser:n?Object(d.Fb)(e,n):void 0,isPinned:Object(d.M)(e,t)}})(({chatId:e,chat:t,privateChatUser:a,isPinned:c,withUsername:r,onClick:s})=>{const[l,o,i]=Object(Be.a)(),d=Object($e.a)({chat:t,privateChatUser:a,isPinned:c,handleDelete:o}),u=()=>{s(e)},h=He(u);if(t)return n.a.createElement(Ee.a,{className:"chat-item-clickable search-result",onClick:u,contextActions:d,buttonRef:h},Object(m.lb)(e)?n.a.createElement(Oe.a,{userId:e,withUsername:r,avatarSize:"large"}):n.a.createElement(fe.a,{chatId:e,withUsername:r,avatarSize:"large"}),n.a.createElement(_e.a,{isOpen:l,onClose:i,chat:t}))})),We=a(141);a(262);const Ke=Object(_.g)(e=>e(),6e4,!0);var Ye=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(u.l)(t,["loadTopUsers","loadContactList","openChat","addRecentlyFoundChatId","clearRecentlyFoundChats"]))(({topUserIds:e,usersById:t,recentlyFoundChatIds:a,onReset:c,loadTopUsers:r,loadContactList:s,openChat:l,addRecentlyFoundChatId:o,clearRecentlyFoundChats:i})=>{const d=Object(n.q)(null);Object(n.n)(()=>{Ke(()=>{r(),s()})},[r,s]),Object(We.a)(d,!e);const u=Object(n.m)(e=>{l({id:e}),c(),setTimeout(()=>{o({id:e})},250)},[l,o,c]),h=Object(F.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:()=>u(e),dir:h.isRtl?"rtl":void 0},n.a.createElement(x.a,{user:t[e]}),n.a.createElement("div",{className:"top-peer-name"},Object(B.a)(Object(m.Y)(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(R.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(Ve,{chatId:e,onClick:u}))))})),Ze=a(131),Qe=a(26);a(263);var Xe=Object(n.h)(Object(c.h)((e,{chatId:t})=>{const a=Object(d.f)(e,t);if(!a)return{};const n=Object(m.U)(a);return{chat:a,...n&&{privateChatUser:Object(d.Fb)(e,n)},lastSyncTime:e.lastSyncTime}},(e,t)=>Object(u.l)(t,["focusMessage"]))(({message:e,searchQuery:t,chatId:a,chat:c,privateChatUser:r,focusMessage:s,lastSyncTime:l})=>{const i=Object(m.E)(e),d=Object(v.a)(Object(m.D)(e,"micro")),u=Boolean(Object(m.I)(e)),h=Object(n.m)(()=>{s({chatId:a,messageId:e.id})},[a,s,e.id]),b=Object(F.a)(),g=He(h);if(c)return n.a.createElement(Ee.a,{className:"ChatMessage chat-item-clickable",ripple:!o.g,onClick:h,buttonRef:g},n.a.createElement(x.a,{chat:c,user:r,withOnlineStatus:!0,isSavedMessages:r&&r.isSelf,lastSyncTime:l}),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(B.a)(Object(m.l)(b,c,r))),c.isVerified&&n.a.createElement(Ze.a,null)),n.a.createElement("div",{className:"message-date"},n.a.createElement(Qe.a,{className:"date"},Object(D.g)(b,1e3*e.date)))),n.a.createElement("div",{className:"subtitle"},n.a.createElement("div",{className:"message",dir:"auto"},function(e,t,a,c,r){if(!a)return Object(B.a)(Object(m.N)(e,t));return n.a.createElement("span",{className:"media-preview"},n.a.createElement("img",{src:a,alt:"",className:r?"round":void 0}),Object(m.P)(t)&&n.a.createElement("i",{className:"icon-play"}),Object(B.a)(Object(m.N)(e,t,!0),["emoji","highlight"],{highlight:c}))}(b,e,d||i,t,u)))))}));a(264);var Je=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(D.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(D.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))))}),et=a(115),tt=a(139);const at=Object(_.g)(e=>e(),500,!0);var nt=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:r,lastSyncTime:s}=e,{fetchingStatus:l,globalResults:o,localResults:i,resultsByType:d}=e.globalSearch,{chatIds:m,userIds:u}=o||{},{chatIds:h,userIds:b}=i||{},{byChatId:g}=r,{foundIds:p}=d&&d.text||{};return{currentUserId:c,localContactIds:n,localChatIds:h,localUserIds:b,globalChatIds:m,globalUserIds:u,foundIds:p,globalMessagesByChatId:g,chatsById:t,usersById:a,fetchingStatus:l,lastSyncTime:s}},(e,t)=>Object(u.l)(t,["openChat","addRecentlyFoundChatId","searchMessagesGlobal","setGlobalSearchChatId"]))(({searchQuery:e,searchDate:t,dateSearchQuery:a,currentUserId:c,localContactIds:r,localChatIds:l,localUserIds:i,globalChatIds:d,globalUserIds:h,foundIds:b,globalMessagesByChatId:g,chatsById:p,usersById:v,fetchingStatus:E,lastSyncTime:O,onReset:f,onSearchDateSelect:j,openChat:C,addRecentlyFoundChatId:y,searchMessagesGlobal:k,setGlobalSearchChatId:N})=>{const I=Object(F.a)(),[S,w]=Object(n.r)(!1),[P,M]=Object(n.r)(!1),L=Object(n.m)(({direction:t})=>{O&&t===s.e.Backwards&&at(()=>{k({type:"text",query:e})})},[O,k,e]),A=Object(n.m)(e=>{C({id:e}),e!==c&&y({id:e}),o.g||f()},[c,C,y,f]),T=Object(n.m)(e=>{N({id:e})},[N]),R=Object(n.p)(()=>{if(!e||e.startsWith("@")&&e.length<2)return ze.a;const t=r?r.filter(t=>{const a=v[t];if(!a)return!1;const n=Object(m.Z)(a);return n&&Object(me.a)(n,e)||Object(me.a)(a.username,e)}):[];return[...c&&Object(me.a)(I("SavedMessages"),e)?[c]:[],...Object(m.Db)(Object(u.o)([...t,...l||[],...i||[]]),p)]},[e,r,c,I,l,i,p,v]),D=Object(n.p)(()=>!e||e.length<4||!d||!h?ze.a:Object(m.Db)(Object(u.o)([...d,...h]),p,!0),[p,d,h,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):ze.a,[b,g,e,t]),x=Object(n.m)(()=>{w(!S)},[S]),U=Object(n.m)(()=>{M(!P)},[P]);const G=E&&!E.chats&&!E.messages&&!R.length&&!D.length&&!B.length;return e||t?n.a.createElement(ve.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(Je,{searchDate:a,onSelect:j})),G&&n.a.createElement(et.a,{text:I("ChatList.Search.NoResults"),description:I("ChatList.Search.NoResultsDescription")}),!!R.length&&n.a.createElement("div",{className:"chat-selection no-selection no-scrollbar",dir:I.isRtl?"rtl":void 0},R.map(e=>n.a.createElement(tt.a,{chatOrUserId:e,onClick:T,clickArg:e}))),!!R.length&&n.a.createElement("div",{className:"search-section"},n.a.createElement("h3",{className:"section-heading",dir:I.isRtl?"auto":void 0},R.length>3&&n.a.createElement(Qe.a,{onClick:x},I(S?"ChatList.Search.ShowLess":"ChatList.Search.ShowMore")),I("DialogList.SearchSectionDialogs")),R.map((e,t)=>{if(S||!(t>=3))return n.a.createElement(Ve,{chatId:e,onClick:A})})),!!D.length&&n.a.createElement("div",{className:"search-section"},n.a.createElement("h3",{className:"section-heading",dir:I.isRtl?"auto":void 0},D.length>3&&n.a.createElement(Qe.a,{onClick:U},I(P?"ChatList.Search.ShowLess":"ChatList.Search.ShowMore")),I("DialogList.SearchSectionGlobal")),D.map((e,t)=>{if(P||!(t>=3))return n.a.createElement(Ve,{chatId:e,withUsername:!0,onClick:A})})),!!B.length&&n.a.createElement("div",{className:"search-section"},n.a.createElement("h3",{className:"section-heading",dir:I.isRtl?"auto":void 0},I("SearchMessages")),B.map((function(t){const a=Object(m.N)(I,t),c=p[t.chatId];if(a&&c)return n.a.createElement(Xe,{chatId:t.chatId,message:t,searchQuery:e})})))):n.a.createElement(Ye,{onReset:f})}));const ct=Object(_.g)(e=>e(),500,!0);var rt=Object(n.h)(Object(c.h)(e=>{const{byId:t}=e.chats,{currentUserId:a,messages:{byChatId:n},lastSyncTime:c}=e,{fetchingStatus:r,resultsByType:s}=e.globalSearch,{foundIds:l}=s&&s.text||{};return{currentUserId:a,foundIds:l,globalMessagesByChatId:n,chatsById:t,fetchingStatus:r,lastSyncTime:c}},(e,t)=>Object(u.l)(t,["searchMessagesGlobal"]))(({searchQuery:e,currentUserId:t,dateSearchQuery:a,foundIds:c,globalMessagesByChatId:r,chatsById:l,fetchingStatus:o,lastSyncTime:i,searchMessagesGlobal:d,onSearchDateSelect:u})=>{const h=Object(F.a)(),b=Object(n.m)(({direction:a})=>{i&&a===s.e.Backwards&&ct(()=>{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 r&&r[t]&&r[t].byId[a]}).filter(Boolean).sort((e,t)=>t.date-e.date):ze.a,[c,r]);const p=o&&!o.chats&&!o.messages&&!g.length;return n.a.createElement("div",{className:"LeftSearch"},n.a.createElement(ve.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(Je,{searchDate:a,onSelect:u})),p&&n.a.createElement(et.a,{text:h("ChatList.Search.NoResults"),description:h("ChatList.Search.NoResultsDescription")}),!!g.length&&g.map((function(t){const a=Object(m.N)(h,t),c=l[t.chatId];if(a&&c)return n.a.createElement(Xe,{chatId:t.chatId,message:t,searchQuery:e})}))))}));function st(e){return(t,a)=>{const{byId:n}=t.chats,{byId:c}=t.users,{fetchingStatus:r,resultsByType:s,chatId:l}=t.globalSearch,o="audio"!==e?e:a&&a.isVoice?"voice":"audio",{byChatId:i}=t.messages,{foundIds:d}=s&&s[o]||{};return{isLoading:void 0===d||!!r&&Boolean(r.chats||r.messages),chatsById:n,usersById:c,globalMessagesByChatId:i,foundIds:d,searchChatId:l,lastSyncTime:t.lastSyncTime}}}var lt=a(117),ot=a(163);const it=Object(_.g)(e=>e(),500,!0);var dt=Object(n.h)(Object(c.h)(st("media"),(e,t)=>Object(u.l)(t,["searchMessagesGlobal","openMediaViewer"]))(({searchQuery:e,searchChatId:t,isLoading:a,globalMessagesByChatId:c,foundIds:r,lastSyncTime:o,searchMessagesGlobal:i,openMediaViewer:d})=>{const m=Object(F.a)(),u=Object(n.m)(({direction:a})=>{o&&a===s.e.Backwards&&it(()=>{i({type:"media",query:e,chatId:t})})},[o,i,e,t]),h=Object(n.p)(()=>r&&c?r.map(e=>{const[t,a]=e.split("_").map(Number);return c[t]&&c[t].byId[a]}).filter(Boolean):ze.a,[c,r]),b=Object(n.m)((e,t)=>{d({chatId:t,messageId:e,origin:s.h.SearchResult})},[d]);const g=Object(lt.a)([e],l.pb)&&!a,p=g&&r&&r.length>0&&!e,v=g&&r&&r.length>0&&e,E=Object(ce.a)("search-content custom-scroll",v&&"chat-list");return n.a.createElement("div",{className:"LeftSearch"},n.a.createElement(ve.a,{className:E,items:h,itemSelector:e?".ListItem":".Media",onLoadMore:u,noFastList:!0},!g&&n.a.createElement(be.a,null),g&&(!r||0===r.length)&&n.a.createElement(et.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(ot.a,{key:e.id,idPrefix:"search-media",message:e,onClick:b}))),v&&h.map(e=>n.a.createElement(Xe,{key:e.id,chatId:e.chatId,message:e}))))}));function mt(e,t,a,n){const{senderId:c}=t;if(!c)return;const r=Object(m.lb)(c)?n[c]:a[c];let s=Object(m.V)(e,r);const l=a[t.chatId];return l&&(Object(m.lb)(c)&&r.isSelf?s=`${e("FromYou")} → ${Object(m.l)(e,l)}`:Object(m.kb)(l)&&(s+=" → "+Object(m.l)(e,l))),s}var ut=a(183);const ht=Object(_.g)(e=>e(),500,!0);var bt=Object(n.h)(Object(c.h)(st("links"),(e,t)=>Object(u.l)(t,["searchMessagesGlobal","focusMessage"]))(({searchQuery:e,searchChatId:t,isLoading:a,chatsById:c,usersById:r,globalMessagesByChatId:o,foundIds:i,lastSyncTime:d,searchMessagesGlobal:m,focusMessage:u})=>{const h=Object(F.a)(),b=Object(n.m)(({direction:a})=>{d&&a===s.e.Backwards&&ht(()=>{m({type:"links",query:e,chatId:t})})},[d,m,e,t]),g=Object(n.p)(()=>i&&o?i.map(e=>{const[t,a]=e.split("_").map(Number);return o[t]&&o[t].byId[a]}).filter(Boolean):ze.a,[o,i]),p=Object(n.m)((e,t)=>{u({chatId:t,messageId:e})},[u]);const v=Object(lt.a)([e],l.pb)&&!a;return n.a.createElement("div",{className:"LeftSearch"},n.a.createElement(ve.a,{className:"search-content documents-list custom-scroll",items:g,onLoadMore:b,noFastList:!0},!v&&n.a.createElement(be.a,null),v&&(!i||0===i.length)&&n.a.createElement(et.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(D.n)(e.date)!==Object(D.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(D.f)(h,new Date(1e3*e.date))),n.a.createElement(ut.a,{key:e.id,message:e,senderTitle:mt(h,e,c,r),onMessageClick:p}))})))})),gt=a(158);const pt=Object(_.g)(e=>e(),500,!0);var vt=Object(n.h)(Object(c.h)(st("documents"),(e,t)=>Object(u.l)(t,["searchMessagesGlobal","focusMessage"]))(({searchQuery:e,searchChatId:t,isLoading:a,chatsById:c,usersById:r,globalMessagesByChatId:o,foundIds:i,lastSyncTime:d,searchMessagesGlobal:u,focusMessage:h})=>{const b=Object(F.a)(),g=Object(n.m)(({direction:a})=>{d&&a===s.e.Backwards&&pt(()=>{u({type:"documents",query:e,chatId:t})})},[d,u,e,t]),p=Object(n.p)(()=>i&&o?i.map(e=>{const[t,a]=e.split("_").map(Number),n=o[t]&&o[t].byId[a];return n&&Object(m.y)(n)?n:void 0}).filter(Boolean):ze.a,[o,i]),v=Object(n.m)((e,t)=>{h({chatId:t,messageId:e})},[h]);const E=Object(lt.a)([e],l.pb)&&!a;return n.a.createElement("div",{className:"LeftSearch"},n.a.createElement(ve.a,{className:"search-content documents-list custom-scroll",items:p,onLoadMore:g,noFastList:!0},!E&&n.a.createElement(be.a,null),E&&(!i||0===i.length)&&n.a.createElement(et.a,{text:b("ChatList.Search.NoResults"),description:b("ChatList.Search.NoResultsDescription")}),E&&i&&i.length>0&&p.map((e,t)=>{const a=0===t||Object(D.n)(e.date)!==Object(D.n)(p[t-1].date);return n.a.createElement("div",{className:"ListItem",key:e.id},a&&n.a.createElement("p",{className:"section-heading"},Object(D.f)(b,new Date(1e3*e.date))),n.a.createElement(gt.a,{message:e,withDate:!0,datetime:e.date,smaller:!0,sender:mt(b,e,c,r),className:"scroll-item",onDateClick:v}))})))})),Et=a(165);const Ot=Object(_.g)(e=>e(),500,!0);var ft=Object(n.h)(Object(c.h)(st("audio"),(e,t)=>Object(u.l)(t,["searchMessagesGlobal","focusMessage","openAudioPlayer"]))(({isVoice:e,searchQuery:t,searchChatId:a,isLoading:c,chatsById:r,usersById:o,globalMessagesByChatId:i,foundIds:d,lastSyncTime:m,searchMessagesGlobal:u,focusMessage:h,openAudioPlayer:b})=>{const g=Object(F.a)(),p=e?"voice":"audio",v=Object(n.m)(({direction:e})=>{m&&e===s.e.Backwards&&Ot(()=>{u({type:p,query:t,chatId:a})})},[p,m,u,t,a]),E=Object(n.p)(()=>d&&i?d.map(e=>{const[t,a]=e.split("_").map(Number);return i[t]&&i[t].byId[a]}).filter(Boolean):ze.a,[i,d]),O=Object(n.m)((e,t)=>{h({chatId:t,messageId:e})},[h]),f=Object(n.m)((e,t)=>{b({chatId:t,messageId:e})},[b]);const j=Object(lt.a)([t],l.pb)&&!c;return n.a.createElement("div",{className:"LeftSearch"},n.a.createElement(ve.a,{className:"search-content documents-list custom-scroll",items:E,onLoadMore:v,noFastList:!0},!j&&n.a.createElement(be.a,null),j&&(!d||0===d.length)&&n.a.createElement(et.a,{text:g("ChatList.Search.NoResults"),description:g("ChatList.Search.NoResultsDescription")}),j&&d&&d.length>0&&E.map((e,t)=>{const a=0===t||Object(D.n)(e.date)!==Object(D.n)(E[t-1].date);return n.a.createElement("div",{className:"ListItem",key:e.id},a&&n.a.createElement("p",{className:"section-heading",dir:g.isRtl?"rtl":void 0},Object(D.f)(g,new Date(1e3*e.date))),n.a.createElement(Et.a,{key:e.id,message:e,renderingFor:"searchResult",senderTitle:mt(g,e,r,o),date:e.date,lastSyncTime:m,className:"scroll-item",onPlay:f,onDateClick:O}))})))}));a(265);const jt=[{type:s.c.ChatList,title:"SearchAllChatsShort"},{type:s.c.Media,title:"SharedMediaTab2"},{type:s.c.Links,title:"SharedLinksTab2"},{type:s.c.Files,title:"SharedFilesTab2"},{type:s.c.Music,title:"SharedMusicTab2"},{type:s.c.Voice,title:"SharedVoiceTab2"}],Ct=[{type:s.c.ChatList,title:"All Messages"},...jt.slice(1)],yt=Object.keys(s.c).length/2;var kt=Object(n.h)(Object(c.h)(e=>{const{currentContent:t,chatId:a}=e.globalSearch;return{currentContent:t,chatId:a}},(e,t)=>Object(u.l)(t,["setGlobalSearchContent","setGlobalSearchDate"]))(({searchQuery:e,searchDate:t,isActive:a,currentContent:c=s.c.ChatList,chatId:r,setGlobalSearchContent:l,setGlobalSearchDate:o,onReset:i})=>{const d=Object(F.a)(),[m,u]=Object(n.r)(0),h=Object(n.p)(()=>Object(D.l)(e),[e]),b=Object(n.m)(e=>{const t=jt[e];l({content:t.type}),u(e)},[l]),g=Object(n.m)(e=>{o({date:e.getTime()/1e3})},[o]),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(qe.a,{activeTab:m,tabs:r?Ct:jt,onSwitchTab:b}),n.a.createElement(T.b,{name:d.isRtl?"slide-reversed":"slide",renderCount:yt,activeKey:c},()=>{switch(c){case s.c.ChatList:return r?n.a.createElement(rt,{searchQuery:e,dateSearchQuery:h,onReset:i,onSearchDateSelect:g}):n.a.createElement(nt,{searchQuery:e,searchDate:t,dateSearchQuery:h,onReset:i,onSearchDateSelect:g});case s.c.Media:return n.a.createElement(dt,{searchQuery:e});case s.c.Links:return n.a.createElement(bt,{searchQuery:e});case s.c.Files:return n.a.createElement(vt,{searchQuery:e});case s.c.Music:return n.a.createElement(ft,{key:"audio",searchQuery:e});case s.c.Voice:return n.a.createElement(ft,{key:"voice",isVoice:!0,searchQuery:e});default:return}}))}));function Nt(e,t){const a=Object(n.q)(e),[c,r]=Object(n.r)(t);return[c,Object(n.m)(e=>{r(t=>a.current(t,e))},[])]}const It=[{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"}],St=[{icon:"mute",title:"FilterMuted",key:"excludeMuted"},{icon:"archive",title:"FilterArchived",key:"excludeArchived"},{icon:"readchats",title:"FilterRead",key:"excludeRead"}],wt=["includedChatIds","bots","channels","groups","contacts","nonContacts"],Pt=["excludedChatIds","excludeArchived","excludeMuted","excludeRead"];function Mt(e,t,a){let n=[],c=[];if("included"===t){const{includedChatIds:t,...r}=a?e.includeFilters||{}:Object(u.l)(e.folder,wt);n=t||[],c=Object.keys(r).filter(e=>Boolean(r[e]))}else{const{excludedChatIds:t,...r}=a?e.excludeFilters||{}:Object(u.l)(e.folder,Pt);n=t||[],c=Object.keys(r).filter(e=>Boolean(r[e]))}return{selectedChatIds:n,selectedChatTypes:c}}function Ft(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 Lt={mode:"create",chatFilter:"",folder:{title:"",includedChatIds:[],excludedChatIds:[]}},At=(e,t)=>{switch(t.type){case"setTitle":return{...e,folder:{...e.folder,title:t.payload},isTouched:!0};case"editIncludeFilters":return{...e,includeFilters:Object(u.l)(e.folder,wt)};case"editExcludeFilters":return{...e,excludeFilters:Object(u.l)(e.folder,Pt)};case"setIncludeFilters":return{...e,includeFilters:t.payload,chatFilter:""};case"setExcludeFilters":return{...e,excludeFilters:t.payload,chatFilter:""};case"saveFilters":return e.includeFilters?{...e,folder:{...Object(u.j)(e.folder,wt),title:e.folder.title?e.folder.title:Ft(e.includeFilters),...e.includeFilters},includeFilters:void 0,chatFilter:"",isTouched:!0}:e.excludeFilters?{...e,folder:{...Object(u.j)(e.folder,Pt),...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 Lt;default:return e}};const Tt={currentPassword:"",password:"",hint:"",email:""},Rt=(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 Tt;default:return e}};var Dt=Object(n.h)(Object(c.h)(void 0,(e,t)=>Object(u.l)(t,["signOut","deleteChatFolder"]))(({currentScreen:e,editedFolderId:t,onReset:a,onSaveFilter:c,signOut:r,deleteChatFolder:l})=>{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(),r()},[b,r]),E=Object(n.m)(()=>{p(),l({id:t}),a()},[t,p,l,a]),O=Object(n.p)(()=>({onTrigger:e,isOpen:t})=>n.a.createElement(R.a,{round:!0,ripple:!o.g,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(R.a,{round:!0,size:"smaller",color:"translucent",onClick:a,ariaLabel:f("AccDescrGoBack")},n.a.createElement("i",{className:"icon-arrow-left"})),function(){switch(e){case s.m.EditProfile:return n.a.createElement("h3",null,f("lng_settings_information"));case s.m.General:return n.a.createElement("h3",null,f("General"));case s.m.Notifications:return n.a.createElement("h3",null,f("Notifications"));case s.m.Privacy:return n.a.createElement("h3",null,f("PrivacySettings"));case s.m.Language:return n.a.createElement("h3",null,f("Language"));case s.m.GeneralChatBackground:return n.a.createElement("h3",null,f("ChatBackground"));case s.m.GeneralChatBackgroundColor:return n.a.createElement("h3",null,f("SetColor"));case s.m.PrivacyPhoneNumber:return n.a.createElement("h3",null,f("PrivacyPhone"));case s.m.PrivacyLastSeen:return n.a.createElement("h3",null,f("PrivacyLastSeen"));case s.m.PrivacyProfilePhoto:return n.a.createElement("h3",null,f("Privacy.ProfilePhoto"));case s.m.PrivacyForwarding:return n.a.createElement("h3",null,f("PrivacyForwards"));case s.m.PrivacyGroupChats:return n.a.createElement("h3",null,f("AutodownloadGroupChats"));case s.m.PrivacyPhoneNumberAllowedContacts:case s.m.PrivacyLastSeenAllowedContacts:case s.m.PrivacyProfilePhotoAllowedContacts:case s.m.PrivacyForwardingAllowedContacts:case s.m.PrivacyGroupChatsAllowedContacts:return n.a.createElement("h3",null,f("AlwaysShareWith"));case s.m.PrivacyPhoneNumberDeniedContacts:case s.m.PrivacyLastSeenDeniedContacts:case s.m.PrivacyProfilePhotoDeniedContacts:case s.m.PrivacyForwardingDeniedContacts:case s.m.PrivacyGroupChatsDeniedContacts:return n.a.createElement("h3",null,f("NeverShareWith"));case s.m.PrivacyActiveSessions:return n.a.createElement("h3",null,f("SessionsTitle"));case s.m.PrivacyBlockedUsers:return n.a.createElement("h3",null,f("BlockedUsers"));case s.m.TwoFaDisabled:case s.m.TwoFaEnabled:return n.a.createElement("h3",null,f("TwoStepVerification"));case s.m.TwoFaNewPassword:case s.m.TwoFaChangePasswordNew:case s.m.TwoFaChangePasswordConfirm:return n.a.createElement("h3",null,f("EnterPassword"));case s.m.TwoFaNewPasswordConfirm:return n.a.createElement("h3",null,f("PleaseReEnterPassword"));case s.m.TwoFaNewPasswordHint:case s.m.TwoFaChangePasswordHint:return n.a.createElement("h3",null,f("PasswordHint"));case s.m.TwoFaNewPasswordEmail:case s.m.TwoFaRecoveryEmail:return n.a.createElement("h3",null,f("RecoveryEmailTitle"));case s.m.TwoFaNewPasswordEmailCode:case s.m.TwoFaRecoveryEmailCode:return n.a.createElement("h3",null,"Recovery Email Code");case s.m.TwoFaCongratulations:return n.a.createElement("h3",null,f("TwoStepVerificationPasswordSet"));case s.m.TwoFaChangePasswordCurrent:case s.m.TwoFaTurnOff:case s.m.TwoFaRecoveryEmailCurrentPassword:return n.a.createElement("h3",null,f("PleaseEnterCurrentPassword"));case s.m.Folders:return n.a.createElement("h3",null,f("Filters"));case s.m.FoldersCreateFolder:return n.a.createElement("h3",null,f("FilterNew"));case s.m.FoldersEditFolder:return n.a.createElement("div",{className:"settings-main-header"},n.a.createElement("h3",null,f("FilterEdit")),t&&n.a.createElement(q.a,{className:"settings-more-menu",trigger:O,positionX:"right"},n.a.createElement(z.a,{icon:"delete",destructive:!0,onClick:g},"Delete Folder")));case s.m.FoldersIncludedChats:case s.m.FoldersExcludedChats:return n.a.createElement("div",{className:"settings-main-header"},e===s.m.FoldersIncludedChats?n.a.createElement("h3",null,f("FilterInclude")):n.a.createElement("h3",null,f("FilterExclude")),n.a.createElement(R.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(q.a,{className:"settings-more-menu",trigger:O,positionX:"right"},n.a.createElement(z.a,{icon:"logout",onClick:h},f("LogOutTitle"))))}}(),n.a.createElement(we.a,{isOpen:i,onClose:b,text:"Are you sure you want to log out?",confirmLabel:"Log Out",confirmHandler:v,confirmIsDestructive:!0}),n.a.createElement(we.a,{isOpen:m,onClose:p,text:"Are you sure you want to delete this folder?",confirmLabel:"Delete",confirmHandler:E,confirmIsDestructive:!0}))})),Bt=a(18);var xt=Object(n.h)(Object(c.h)(e=>{const{currentUserId:t}=e;return{currentUser:t?Object(d.Fb)(e,t):void 0}})(({onScreenSelect:e,currentUser:t})=>{const a=Object(F.a)();return n.a.createElement("div",{className:"settings-content custom-scroll"},n.a.createElement("div",{className:"settings-main-menu"},t&&n.a.createElement("div",{className:"settings-current-user"},n.a.createElement(x.a,{user:t,size:"jumbo"}),n.a.createElement("p",{className:"name"},Object(m.Z)(t)),n.a.createElement("p",{className:"phone"},Object(Bt.c)(t.phoneNumber))),n.a.createElement(Ee.a,{icon:"edit",onClick:()=>e(s.m.EditProfile)},a("lng_settings_information")),n.a.createElement(Ee.a,{icon:"folder",onClick:()=>e(s.m.Folders)},a("Filters")),n.a.createElement(Ee.a,{icon:"settings",onClick:()=>e(s.m.General)},a("Telegram.GeneralSettingsViewController")),n.a.createElement(Ee.a,{icon:"unmute",onClick:()=>e(s.m.Notifications)},a("Notifications")),n.a.createElement(Ee.a,{icon:"lock",onClick:()=>e(s.m.Privacy)},a("PrivacySettings")),n.a.createElement(Ee.a,{icon:"language",onClick:()=>e(s.m.Language)},a("Language"))))})),Ut=a(128);a(266);var Gt=({isShown:e,className:t,color:a="primary",ariaLabel:c,disabled:r,onClick:s,children:l})=>{const o=Object(ce.a)("FloatingActionButton",e&&"revealed",t);return n.a.createElement(R.a,{className:o,color:a,round:!0,disabled:r,onClick:e&&!r?s:void 0,ariaLabel:c,tabIndex:-1},l)};const qt=/https:\/\/t\.me\/?/i,zt=/^([a-zA-Z0-9_]+)$/,$t=Object(_.a)(e=>e(),250,!1);var Ht=Object(n.h)(({currentUsername:e,asLink:t,isLoading:a,isUsernameAvailable:c,checkUsername:r,onChange:s})=>{const[l,o]=Object(n.r)(e||""),i=Object(F.a)(),d=t?"SetUrl":"Username",m=i(t?"SetUrlPlaceholder":"Username"),[u,h]=Object(n.p)(()=>l.length?l.length<5?[void 0,m+" is too short"]:l.length>32?[void 0,m+" is too long"]:zt.test(l)?void 0===c?[]:[c?i(d+"Available","Username"):void 0,!1===c?i(d+"InUse"):void 0]:[void 0,m+" contains invalid characters"]:[],[l,c,i,d,m]);Object(n.n)(()=>{o(e||"")},[t,e]);const b=Object(n.m)(e=>{const a=e.target.value.trim().replace(qt,"");o(a),e.target.value=`${t?"https://t.me/":""}${a}`;const n=function(e){return e.length>=5&&e.length<=32&&zt.test(e)}(a);n&&$t(()=>{r({username:a})}),s&&s(!!n&&a)},[t,r,s]);return n.a.createElement(pe.a,{value:`${t?"https://t.me/":""}${l}`,onChange:b,label:m,error:h,success:u,readOnly:a})});const _t=Object(_.g)(e=>e(),6e4,!0);var Vt=Object(n.h)(Object(c.h)(e=>{const{currentUserId:t}=e,{progress:a,isUsernameAvailable:n}=e.profileEdit||{},c=t?Object(d.Fb)(e,t):void 0;if(!c)return{progress:a,isUsernameAvailable:n};const{firstName:r,lastName:s,username:l,fullInfo:o}=c,{bio:i}=o||{};return{currentAvatarHash:Object(m.f)(c),currentFirstName:r,currentLastName:s,currentBio:i,currentUsername:l,progress:a,isUsernameAvailable:n}},(e,t)=>Object(u.l)(t,["loadCurrentUser","updateProfile","checkUsername"]))(({currentAvatarHash:e,currentFirstName:t,currentLastName:a,currentBio:c,currentUsername:l,progress:o,isUsernameAvailable:i,loadCurrentUser:d,updateProfile:m,checkUsername:u})=>{const[h,b]=Object(n.r)(!1),[g,p]=Object(n.r)(!1),[E,O]=Object(n.r)(),[f,j]=Object(n.r)(),[C,y]=Object(n.r)(t||""),[k,N]=Object(n.r)(a||""),[I,S]=Object(n.r)(c||""),[w,P]=Object(n.r)(l||""),M=Object(v.a)(e,!1,r.ApiMediaFormat.BlobUrl),A=o===s.j.InProgress,T=!1===w,R=Object(n.p)(()=>!T&&(Boolean(f)||g||!0===i),[f,g,T,i]);Object(n.n)(()=>{_t(()=>{d()})},[d]),Object(n.n)(()=>{j(void 0)},[M]),Object(n.n)(()=>{y(t||""),N(a||""),S(c||"")},[t,a,c]),Object(n.n)(()=>{P(l||"")},[l]),Object(n.n)(()=>{o===s.j.Complete&&(p(!1),b(!1),O(void 0))},[o]);const D=Object(n.m)(e=>{j(e)},[]),x=Object(n.m)(e=>{y(e.target.value),p(!0)},[]),U=Object(n.m)(e=>{N(e.target.value),p(!0)},[]),G=Object(n.m)(e=>{S(e.target.value),p(!0)},[]),q=Object(n.m)(e=>{P(e),b(!0)},[]),z=Object(n.m)(()=>{const e=C.trim(),t=k.trim(),a=I.trim();e.length?a.length>70?O("Bio can' be longer than 70 characters"):m({photo:f,...g&&{firstName:e,lastName:t,bio:a},...h&&{username:w}}):O("Please provide your first name")},[f,C,k,I,g,w,h,m]),$=Object(F.a)();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(Ut.a,{currentAvatarBlobUrl:M,onChange:D,title:"Edit your profile photo",disabled:A}),n.a.createElement(pe.a,{value:C,onChange:x,label:$("FirstName"),disabled:A,error:"Please provide your first name"===E?E:void 0}),n.a.createElement(pe.a,{value:k,onChange:U,label:$("LastName"),disabled:A}),n.a.createElement(pe.a,{value:I,onChange:G,label:$("UserBio"),disabled:A,error:"Bio can' be longer than 70 characters"===E?E:void 0}),n.a.createElement("p",{className:"settings-item-description",dir:$.isRtl?"rtl":void 0},Object(B.a)($("lng_settings_about_bio"),["br","simple_markdown"]))),n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header",dir:$.isRtl?"rtl":void 0},$("Username")),n.a.createElement(Ht,{currentUsername:w||"",isLoading:A,isUsernameAvailable:i,checkUsername:u,onChange:q}),n.a.createElement("p",{className:"settings-item-description",dir:$.isRtl?"rtl":void 0},Object(B.a)($("UsernameHelp"),["br","simple_markdown"])),w&&n.a.createElement("p",{className:"settings-item-description",dir:$.isRtl?"rtl":void 0},$("lng_username_link"),n.a.createElement("br",null),n.a.createElement("span",{className:"username-link"},"https://t.me/",w)))),n.a.createElement(Gt,{isShown:R,onClick:z,disabled:A,ariaLabel:"Save changes"},A?n.a.createElement(L.a,{color:"white"}):n.a.createElement("i",{className:"icon-check"})))})),Wt=a(123),Kt=a(113);const Yt=Object(_.g)(e=>e(),6e4,!0);var Zt=Object(n.h)(Object(c.h)(e=>{const{chats:{byId:t},users:{byId:a}}=e,{orderedIds:n,byId:c,recommended:r}=e.chatFolders;return{chatsById:t,usersById:a,orderedFolderIds:n,foldersById:c,recommendedChatFolders:r,notifySettings:Object(d.db)(e),notifyExceptions:Object(d.cb)(e)}},(e,t)=>Object(u.l)(t,["loadRecommendedChatFolders","addChatFolder","showError"]))(({onCreateFolder:e,onEditFolder:t,chatsById:a,usersById:c,orderedFolderIds:r,foldersById:s,recommendedChatFolders:o,notifySettings:i,notifyExceptions:d,loadRecommendedChatFolders:u,addChatFolder:h,showError:b})=>{const[g,p]=Object(n.r)(),[v,E]=Object(n.r)(!1),O=Object(n.m)(()=>E(!0),[]);Object(n.n)(()=>{g||Object(Wt.a)("FoldersAll").then(p)},[g]),Object(n.n)(()=>{Yt(()=>{u()})},[u]);const f=Object(n.m)(()=>{Object.keys(s).length>=10?b({error:{message:"DIALOG_FILTERS_TOO_MUCH"}}):e()},[s,b,e]),j=Object(F.a)(),C=Object(n.p)(()=>{if(!r)return;const e=Object.keys(a).map(Number);return r.map(t=>{const n=s[t];return{id:n.id,title:n.title,subtitle:Object(m.o)(j,a,c,n,e,i,d)}})},[r,a,s,c,i,d,j]),y=Object(n.m)(e=>{Object.keys(s).length>=10?b({error:{message:"DIALOG_FILTERS_TOO_MUCH"}}):h({folder:e})},[s,h,b]);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"},g&&n.a.createElement(Kt.a,{id:"settingsFoldersMain",size:l.tb,animationData:g,play:v,noLoop:!0,onLoad:O})),n.a.createElement("p",{className:"settings-item-description mb-3",dir:"auto"},j("CreateNewFilterInfo")),n.a.createElement(R.a,{className:"with-icon mb-2",color:"primary",size:"smaller",pill:!0,fluid:!0,onClick:f,isRtl:j.isRtl},n.a.createElement("i",{className:"icon-add"}),j("CreateNewFilter"))),n.a.createElement("div",{className:"settings-item pt-3"},n.a.createElement("h4",{className:"settings-item-header mb-3",dir:j.isRtl?"rtl":void 0},j("Filters")),C&&C.length?C.map(e=>n.a.createElement(Ee.a,{className:"mb-2",narrow:!0,multiline:!0,onClick:()=>t(s[e.id])},n.a.createElement("span",{className:"title"},e.title),n.a.createElement("span",{className:"subtitle"},e.subtitle))):C&&!C.length?n.a.createElement("p",{className:"settings-item-description my-4",dir:"auto"},"You have no folders yet."):n.a.createElement(be.a,null)),o&&!!o.length&&n.a.createElement("div",{className:"settings-item pt-3"},n.a.createElement("h4",{className:"settings-item-header mb-3",dir:j.isRtl?"rtl":void 0},j("FilterRecommended")),o.map(e=>n.a.createElement(Ee.a,{className:"mb-2",narrow:!0,onClick:()=>y(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(R.a,{className:"px-3",color:"primary",size:"tiny",pill:!0,fluid:!0,isRtl:j.isRtl},j("Add")))))))}));a(267);var Qt=({count:e,itemName:t,itemPluralName:a,isLoading:c,onClick:r})=>{const s=Object(F.a)();return n.a.createElement(R.a,{className:"ShowMoreButton",color:"translucent",size:"smaller",isText:!0,isLoading:c,isRtl:s.isRtl,onClick:r},n.a.createElement("i",{className:"icon-down"}),"Show ",e," more ",e>1?a||t+"s":t)};const Xt="Please provide a title for this folder.",Jt="Please select at least one chat for this folder.";var ea=Object(n.h)(Object(c.h)(e=>{const{listIds:t}=e.chats;return{loadedActiveChatIds:t.active,loadedArchivedChatIds:t.archived}},(e,t)=>Object(u.l)(t,["editChatFolder","addChatFolder","loadMoreChats"]))(({state:e,dispatch:t,onAddIncludedChats:a,onAddExcludedChats:c,onReset:r,loadedActiveChatIds:s,loadedArchivedChatIds:o,editChatFolder:i,addChatFolder:d,loadMoreChats:h})=>{const[b,g]=Object(n.r)(),[p,v]=Object(n.r)(!1),E=Object(n.m)(()=>v(!0),[]),[O,f]=Object(n.r)(!1),[j,C]=Object(n.r)(!1),{selectedChatIds:y,selectedChatTypes:k}=Mt(e,"included"),{selectedChatIds:N,selectedChatTypes:I}=Mt(e,"excluded");Object(n.n)(()=>{b||Object(Wt.a)("FoldersNew").then(g)},[b]),Object(n.n)(()=>{f(!1),C(!1)},[e.folderId]);const[S,w]=Object(n.p)(()=>{const e=new Set([...s||[],...o||[]]),t=Object(u.f)(y,e),a=Object(u.f)(N,e);return[O?t:t.slice(0,5-k.length),j?a:a.slice(0,5-I.length)]},[N,y,k,I,j,O,s,o]);Object(n.n)(()=>{(S.lengthf(!0):()=>C(!0);return n.a.createElement(n.a.Fragment,null,t.map(t=>function(e,t){const a="included"===t?It.find(({key:t})=>t===e):St.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},P(a.title))}(t,e)),a.map(e=>n.a.createElement(Ee.a,{className:"settings-folders-list-item mb-1",narrow:!0,inactive:!0},Object(m.lb)(e)?n.a.createElement(Oe.a,{avatarSize:"small",userId:e}):n.a.createElement(fe.a,{avatarSize:"small",chatId:e}))),!c&&r>0&&n.a.createElement(Qt,{count:r,itemName:"chat",onClick:s}))}return 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"},b&&n.a.createElement(Kt.a,{id:"settingsFoldersEdit",size:l.tb,animationData:b,play:p&&String(e.folderId),noLoop:!0,onLoad:E})),"create"===e.mode&&n.a.createElement("p",{className:"settings-item-description mb-3",dir:P.isRtl?"rtl":void 0},P("FilterIncludeInfo")),n.a.createElement(pe.a,{className:"mb-0",label:P("FilterNameHint"),value:e.folder.title,onChange:function(e){const{currentTarget:a}=e;t({type:"setTitle",payload:a.value.trim()})},error:e.error&&e.error===Xt?Xt:void 0})),n.a.createElement("div",{className:"settings-item no-border pt-3"},e.error&&e.error===Jt&&n.a.createElement("p",{className:"settings-item-description color-danger mb-2",dir:P.isRtl?"rtl":void 0},e.error),n.a.createElement("h4",{className:"settings-item-header mb-3",dir:P.isRtl?"rtl":void 0},P("FilterInclude")),n.a.createElement(Ee.a,{className:"settings-folders-list-item color-primary mb-0",icon:"add",onClick:a},P("FilterAddChats")),M("included")),n.a.createElement("div",{className:"settings-item no-border pt-3"},n.a.createElement("h4",{className:"settings-item-header mb-3",dir:P.isRtl?"rtl":void 0},P("FilterExclude")),n.a.createElement(Ee.a,{className:"settings-folders-list-item color-primary mb-0",icon:"add",onClick:c},P("FilterAddChats")),M("excluded"))),n.a.createElement(Gt,{isShown:!!e.isTouched,disabled:e.isLoading,onClick:function(){const{title:a}=e.folder;a?y.length||Object.keys(k).length?(t({type:"setIsLoading",payload:!0}),"edit"===e.mode?i({id:e.folderId,folderUpdate:e.folder}):d({folder:e.folder}),setTimeout(()=>{r()},500)):t({type:"setError",payload:Jt}):t({type:"setError",payload:Xt})},ariaLabel:"edit"===e.mode?"Save changes":"Create folder"},e.isLoading?n.a.createElement(L.a,{color:"white"}):n.a.createElement("i",{className:"icon-check"})))})),ta=a(46);a(184),a(268);var aa=Object(n.h)(({mode:e,chatIds:t,selectedIds:a,selectedChatTypes:c,filterValue:r,onSelectedIdsChange:s,onSelectedChatTypesChange:l,onFilterChange:o,onLoadMore:i})=>{const d=Object(n.q)(null),u="included"===e?It:St,h=a.length+c.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),s(t)},[a,s]),p=Object(n.m)(e=>{const t=[...c];t.includes(e)?t.splice(t.indexOf(e),1):t.push(e),l(t)},[c,l]),v=Object(n.m)(e=>{const{value:t}=e.currentTarget;o(t)},[o]),E=Object(F.a)();const[O,f]=Object(ue.a)(i,t,Boolean(r));return n.a.createElement("div",{className:"Picker SettingsFoldersChatsPicker"},n.a.createElement("div",{className:"picker-header custom-scroll"},c.map((function(e){const t=u.find(({key:t})=>e===t);if(t)return n.a.createElement(tt.a,{icon:t.icon,title:E(t.title),isMinimized:h,canClose:!0,onClick:p,clickArg:t.key})})),a.map((e,t)=>n.a.createElement(tt.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"},E(e.title)),n.a.createElement(ta.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:E.isRtl?"rtl":void 0},E("FilterChats"))),O&&O.length?O.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(m.lb)(e)?n.a.createElement(Oe.a,{userId:e}):n.a.createElement(fe.a,{chatId:e,withChatType:!0}),n.a.createElement(ta.a,{label:"",checked:t,round:!0}))})):O&&!O.length?n.a.createElement("p",{className:"no-results",key:"no-results"},"Sorry, nothing found."):n.a.createElement(be.a,{key:"loading"})))});var na=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(u.l)(t,["loadMoreChats"]))(({mode:e,state:t,dispatch:a,chatsById:c,listIds:r,orderedPinnedIds:s,archivedListIds:l,archivedPinnedIds:o,loadMoreChats:i})=>{const{chatFilter:d}=t,{selectedChatIds:u,selectedChatTypes:h}=Mt(t,e,!0),b=Object(F.a)(),g=Object(n.p)(()=>{const e=r?Object(m.Ab)(c,r,s,"all"):void 0,t=l?Object(m.Ab)(c,l,o,"archived"):void 0;if(e||t)return[...e?[...e.pinnedChats,...e.otherChats]:[],...t?t.otherChats:[]]},[c,r,s,l,o]),p=Object(n.p)(()=>{if(g)return g.filter(e=>!d||Object(me.a)(Object(m.l)(b,e),d)||u.includes(e.id)).map(({id:e})=>e)},[g,d,b,u]),v=Object(n.m)(e=>{a({type:"setChatFilter",payload:e})},[a]),E=Object(n.m)(n=>{a("included"===e?{type:"setIncludeFilters",payload:{...t.includeFilters,includedChatIds:n}}:{type:"setExcludeFilters",payload:{...t.excludeFilters,excludedChatIds:n}})},[e,t,a]),O=Object(n.m)(t=>{const n={};t.forEach(e=>{n[e]=!0}),a("included"===e?{type:"setIncludeFilters",payload:{includedChatIds:u,...n}}:{type:"setExcludeFilters",payload:{excludedChatIds:u,...n}})},[e,u,a]);return p?n.a.createElement(aa,{mode:e,chatIds:p,selectedIds:u,selectedChatTypes:h,filterValue:d,onSelectedIdsChange:E,onSelectedChatTypesChange:O,onFilterChange:v,onLoadMore:i}):n.a.createElement(be.a,null)}));a(269);var ca=Object(n.h)(({currentScreen:e,state:t,dispatch:a,onScreenSelect:c,onReset:r})=>{const l=Object(n.m)(()=>{e!==s.m.FoldersCreateFolder&&e!==s.m.FoldersEditFolder||setTimeout(()=>{a({type:"reset"})},200),e!==s.m.FoldersIncludedChats&&e!==s.m.FoldersExcludedChats?r():"create"===t.mode?c(s.m.FoldersCreateFolder):c(s.m.FoldersEditFolder)},[t.mode,a,e,r,c]),o=Object(n.m)(()=>{a({type:"reset"}),c(s.m.FoldersCreateFolder)},[c,a]),i=Object(n.m)(e=>{a({type:"editFolder",payload:e}),c(s.m.FoldersEditFolder)},[a,c]),d=Object(n.m)(()=>{a({type:"editIncludeFilters"}),c(s.m.FoldersIncludedChats)},[a,c]),m=Object(n.m)(()=>{a({type:"editExcludeFilters"}),c(s.m.FoldersExcludedChats)},[a,c]);switch(e){case s.m.Folders:return n.a.createElement(Zt,{onCreateFolder:o,onEditFolder:i});case s.m.FoldersCreateFolder:case s.m.FoldersEditFolder:return n.a.createElement(ea,{state:t,dispatch:a,onAddIncludedChats:d,onAddExcludedChats:m,onReset:l});case s.m.FoldersIncludedChats:return n.a.createElement(na,{mode:"included",state:t,dispatch:a});case s.m.FoldersExcludedChats:return n.a.createElement(na,{mode:"excluded",state:t,dispatch:a});default:return}}),ra=a(104);a(270);var sa=Object(n.h)(({options:e,range:t,label:a,value:c,disabled:r,onChange:s})=>{const l=Object(F.a)(),o=Object(n.m)(e=>{s(Number(e.currentTarget.value))},[s]),i=Object(ce.a)("RangeSlider",r&&"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,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:l.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:h,type:"range",onChange:o}),e&&n.a.createElement("div",{className:"slider-options"},e.map((e,t)=>n.a.createElement("div",{className:Object(ce.a)("slider-option no-selection",t===c&&"active"),onClick:()=>s(t)},e)))))}),la=a(124),oa=a(111),ia=a(49);var da=Object(n.h)(({size:e=l.zb,stickerSet:t,observeIntersection:a})=>{const c=Object(n.q)(null),s=Object(ra.b)(c,a),o="stickerSet"+t.id,i=Object(v.a)(o,!s,r.ApiMediaFormat.Lottie),{shouldRenderFullMedia:d,transitionClassNames:m}=Object(oa.a)(i,"slow");return n.a.createElement("div",{ref:c,className:"sticker-set-cover"},!d&&Object(ia.c)(t.title,2),d&&i&&n.a.createElement(Kt.a,{id:o,size:e,animationData:i,className:m}))});var ma=Object(n.h)(({stickerSet:e,observeIntersection:t})=>{const a=Object(n.q)(null),c=Object(ra.b)(a,t),r=Object(v.a)(e.hasThumbnail&&"stickerSet"+e.id,!c),{shouldRenderFullMedia:s,transitionClassNames:l}=Object(oa.a)(r,"slow");return n.a.createElement("div",{ref:a,className:"sticker-set-cover"},!s&&Object(ia.c)(e.title,2),s&&n.a.createElement("img",{src:r,className:l,alt:""}))});a(271);var ua=Object(n.h)(({sticker:e,size:t,observeIntersection:a,noAnimate:c,title:s,className:l,onClick:o,clickArg:i,onUnfaveClick:d})=>{const m=Object(n.q)(null),u="sticker"+e.id,h="sticker-button-"+e.id,b=Object(ra.b)(m,a),g=e.thumbnail?e.thumbnail.dataUri:void 0,p=Object(v.a)(u+"?size=m",!b,r.ApiMediaFormat.BlobUrl),E=b&&!c,O=Object(v.a)(e.isAnimated&&u,!E,r.ApiMediaFormat.Lottie),[f,j,C]=Object(Be.a)(Boolean(O)),y=f&&E,{shouldRenderThumb:k,shouldRenderFullMedia:N,transitionClassNames:I}=Object(oa.a)(p||y,"slow");Object(n.n)(()=>{E||C()},[C,E]);const S=Object(ce.a)("StickerButton",e.isAnimated&&"animated",h,l),w=k&&g?`background-image: url('${g}');`:"";return n.a.createElement("div",{ref:m,className:S,title:s||e&&e.emoji,style:w,"data-sticker-id":e.id,onClick:function(){o&&o(i)}},N&&!y&&n.a.createElement("img",{src:p,className:I}),E&&O&&n.a.createElement(Kt.a,{id:u,animationData:O,play:!0,size:t,isLowPriority:!0,onLoad:j}),d&&n.a.createElement(R.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(272);var ha=Object(n.h)(({stickerSet:e,observeIntersection:t,onClick:a})=>{const c=Object(F.a)();if(!e||!e.stickers)return;const r=e.stickers&&e.stickers[0];return e.hasThumbnail||!r?n.a.createElement(Ee.a,{narrow:!0,className:"SettingsStickerSet",inactive:!r,onClick:()=>r&&a(r)},n.a.createElement(R.a,{ariaLabel:e.title,color:"translucent",isRtl:c.isRtl},e.isAnimated?n.a.createElement(da,{size:l.ub,stickerSet:e,observeIntersection:t}):n.a.createElement(ma,{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(r)},n.a.createElement(ua,{sticker:r,size:l.ub,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"))))}),ba=a(159);const ga=["Solid and Steady","Nice and Fast","Lots of Stuff"];var pa=Object(n.h)(Object(c.h)(e=>({...Object(u.l)(e.settings.byKey,["messageTextSize","animationLevel","messageSendKeyCombo","shouldAutoDownloadMediaFromContacts","shouldAutoDownloadMediaInPrivateChats","shouldAutoDownloadMediaInGroups","shouldAutoDownloadMediaInChannels","shouldAutoPlayGifs","shouldAutoPlayVideos","shouldSuggestStickers","shouldLoopStickers"]),stickerSetIds:e.stickers.added.setIds,stickerSetsById:e.stickers.setsById}),(e,t)=>Object(u.l)(t,["setSettingOption","loadStickerSets","loadAddedStickers"]))(({onScreenSelect:e,stickerSetIds:t,stickerSetsById:a,messageTextSize:c,animationLevel:r,messageSendKeyCombo:l,shouldAutoDownloadMediaFromContacts:i,shouldAutoDownloadMediaInPrivateChats:d,shouldAutoDownloadMediaInGroups:m,shouldAutoDownloadMediaInChannels:u,shouldAutoPlayGifs:h,shouldAutoPlayVideos:b,shouldSuggestStickers:g,shouldLoopStickers:p,setSettingOption:v,loadStickerSets:E,loadAddedStickers:O})=>{const f=Object(n.q)(null),{observe:j}=Object(ra.a)({rootRef:f}),[C,y,k]=Object(Be.a)(),[N,I]=Object(n.r)(),S=Object(F.a)(),w=o.l?void 0:[{value:"enter",label:S("lng_settings_send_enter"),subLabel:"New line by Shift + Enter"},{value:"ctrl-enter",label:S(o.f?"lng_settings_send_cmdenter":"lng_settings_send_ctrlenter"),subLabel:"New line by Enter"}];Object(n.n)(()=>{E()},[E]),Object(n.n)(()=>{t&&t.length&&O()},[t,O]);const P=Object(n.m)(e=>{ga.forEach((t,a)=>{document.body.classList.toggle("animation-level-"+a,e===a)}),v({animationLevel:e})},[v]),M=Object(n.m)(e=>{document.documentElement.style.setProperty("--message-text-size",e+"px"),v({messageTextSize:e})},[v]),L=Object(n.m)(e=>{I(e),y()},[y]),A=t&&t.map(e=>!!(a&&a[e]&&a[e].installedDate)&&a[e]).filter(Boolean);return 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:S.isRtl?"rtl":void 0},S("SETTINGS")),n.a.createElement(sa,{label:S("TextSize"),range:{min:12,max:20},value:c,onChange:M}),n.a.createElement(Ee.a,{icon:"photo",onClick:()=>e(s.m.GeneralChatBackground)},S("ChatBackground"))),n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header",dir:S.isRtl?"rtl":void 0},"Animation Level"),n.a.createElement("p",{className:"settings-item-description",dir:S.isRtl?"rtl":void 0},"Choose the desired animations amount."),n.a.createElement(sa,{options:ga,value:r,onChange:P})),w&&n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header",dir:S.isRtl?"rtl":void 0},S("Keyboard")),n.a.createElement(la.a,{name:"keyboard-send-settings",options:w,onChange:e=>v({messageSendKeyCombo:e}),selected:l})),n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header",dir:S.isRtl?"rtl":void 0},S("AutoDownloadMedia")),n.a.createElement(ta.a,{label:S("Contacts"),checked:i,onCheck:e=>v({shouldAutoDownloadMediaFromContacts:e})}),n.a.createElement(ta.a,{label:S("AutodownloadPrivateChats"),checked:d,onCheck:e=>v({shouldAutoDownloadMediaInPrivateChats:e})}),n.a.createElement(ta.a,{label:S("AutodownloadGroupChats"),checked:m,onCheck:e=>v({shouldAutoDownloadMediaInGroups:e})}),n.a.createElement(ta.a,{label:S("FilterChannels"),checked:u,onCheck:e=>v({shouldAutoDownloadMediaInChannels:e})})),n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header",dir:S.isRtl?"rtl":void 0},S("AutoplayMedia")),n.a.createElement(ta.a,{label:S("GifsTab2"),checked:h,onCheck:e=>v({shouldAutoPlayGifs:e})}),n.a.createElement(ta.a,{label:S("VideosTitle"),checked:b,onCheck:e=>v({shouldAutoPlayVideos:e})})),n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header",dir:S.isRtl?"rtl":void 0},S("AccDescrStickers")),n.a.createElement(ta.a,{label:S("SuggestStickers"),checked:g,onCheck:e=>v({shouldSuggestStickers:e})}),n.a.createElement(ta.a,{label:S("LoopAnimatedStickers"),checked:p,onCheck:e=>v({shouldLoopStickers:e})}),n.a.createElement("div",{className:"mt-4",ref:f},A&&A.map(e=>n.a.createElement(ha,{key:e.id,stickerSet:e,observeIntersection:j,onClick:L}))),N&&n.a.createElement(ba.a,{isOpen:C,fromSticker:N,onClose:k})))}));let va;function Ea(e="*",t,a=!1){va||(va=document.createElement("input"),va.setAttribute("type","file")),va.setAttribute("accept",e),a?va.removeAttribute("multiple"):va.setAttribute("multiple","multiple"),va.onchange=null,va.value="",va.onchange=t,va.click()}var Oa=a(13);function fa(e){return[parseInt(e.substring(0,2),16),parseInt(e.substring(2,4),16),parseInt(e.substring(4,6),16)]}function ja(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 Ca([e,t,a]){e/=255,t/=255,a/=255;let n,c,r=Math.max(e,t,a),s=Math.min(e,t,a),l=r,o=r-s;if(c=0==r?0:o/r,r==s)n=0;else{switch(r){case e:n=(t-a)/o+(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 Na=a(12),Ia=a(160);a(273);var Sa=Object(n.h)(({wallpaper:e,theme:t,isSelected:a,onClick:c})=>{const{slug:r,document:o}=e,i="wallpaper"+o.id,d=o.previewBlobUrl,m=Object(v.a)(i+"?size=m"),u=Object(Ia.a)(o.thumbnail&&o.thumbnail.dataUri,Boolean(m),!0),{shouldRenderThumb:h,shouldRenderFullMedia:b,transitionClassNames:g}=Object(oa.a)(m||d,"slow"),[p,O]=Object(n.r)(!1),{mediaData:j,downloadProgress:C}=Object(E.a)(i,!p),y=!1===Object(f.a)(p),{shouldRender:k,transitionClassNames:N}=Object(W.a)(p&&!j||r===s.n,void 0,y,"slow"),I=Object(n.q)();I.current=t;const S=Object(n.m)(()=>{(async()=>{const e=await Object(Oa.e)(j);await Na.d(l.m,I.current,e),c(r)})()},[j,c,r]);Object(n.n)(()=>{j&&S()},[j,S]);const w=Object(n.m)(()=>{j?S():O(e=>!e)},[j,S]),P=Object(ce.a)("WallpaperTile",a&&"selected");return n.a.createElement("div",{className:P,onClick:w},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(ce.a)("spinner-container",N)},n.a.createElement($.a,{progress:C,onClick:w}))))});a(274);const wa=Object(_.g)(e=>e(),6e4,!0);var Pa=Object(n.h)(Object(c.h)(e=>{const{theme:t}=e.settings.byKey,{background:a,isBlurred:n}=e.settings.themes[t]||{},{loadedWallpapers:c}=e.settings;return{background:a,isBlurred:n,loadedWallpapers:c,theme:t}},(e,t)=>Object(u.l)(t,["loadWallpapers","uploadWallpaper","setThemeSettings"]))(({onScreenSelect:e,background:t,isBlurred:a,loadedWallpapers:c,theme:r,loadWallpapers:o,uploadWallpaper:i,setThemeSettings:d})=>{const m=Object(n.q)();m.current=r,Object(n.n)(()=>{wa(()=>{o()})},[o]);const u=Object(n.m)(e=>{const{files:t}=e.target;t&&t.length>0&&i(t[0])},[i]),h=Object(n.m)(()=>{Ea("image/jpeg",u,!0)},[u]),b=Object(n.m)(()=>{e(s.m.GeneralChatBackgroundColor)},[e]),g=Object(n.m)(()=>{d({theme:r,background:void 0,backgroundColor:void 0,isBlurred:!0,patternColor:"dark"===r?l.o:l.t})},[d,r]),p=Object(n.m)(e=>{d({theme:m.current,background:e});const t=c&&c.find(t=>t.slug===e);t&&t.document.thumbnail&&async function(e){const t=[0,0,0];let a,n,c,r,s=-4,l=[0,0,0],o=0;const i=document.createElement("canvas"),d=i.getContext&&i.getContext("2d");if(!d)return t;const m=await Object(Oa.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(r=a.data.length;(s+=20){const t=ka(e),a="#"+ja(e);d({theme:m.current,backgroundColor:a,patternColor:t})})},[c,d]),v=Object(n.m)(e=>{d({theme:m.current,isBlurred:e.target.checked})},[d]),E=Object(F.a)(),O=c&&c[0]&&c[0].slug===s.n;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:O,onClick:h},E("UploadImage")),n.a.createElement(Ee.a,{icon:"colorize",className:"mb-0",onClick:b},E("SetColor")),n.a.createElement(Ee.a,{icon:"favorite",onClick:g},E("ThemeResetToDefaults")),n.a.createElement(ta.a,{label:E("BackgroundBlurred"),checked:Boolean(a),onChange:v})),c?n.a.createElement("div",{className:"settings-wallpapers"},c.map(e=>n.a.createElement(Sa,{wallpaper:e,theme:r,isSelected:t===e.slug,onClick:p}))):n.a.createElement(be.a,null))}));a(275);const Ma=Ca(fa("e6ebee")),Fa=["#e6ebee","#b2cee1","#008dd0","#c6e7cb","#c4e1a6","#60b16e","#ccd0af","#a6a997","#7a7072","#fdd7af","#fdb76e","#dd8851"];function La(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 Aa({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 Ta=Object(n.h)(Object(c.h)(e=>{const{theme:t}=e.settings.byKey,{backgroundColor:a}=e.settings.themes[t]||{};return{backgroundColor:a,theme:t}},(e,t)=>Object(u.l)(t,["setThemeSettings"]))(({theme:e,backgroundColor:t,setThemeSettings:a})=>{const c=Object(n.q)();c.current=e;const r=Object(n.q)(null),s=Object(n.q)(null),l=Object(n.q)(null),o=Object(n.q)(!0),[i,d]=Object(n.r)(function(e){return e&&e.startsWith("#")?Ca(fa(e.replace("#",""))):Ma}(t)),m=Object(n.q)(i);Object(n.n)(()=>{m.current=i},[i]);const[b,g,p]=Object(Be.a)(),[v,E]=Object(n.r)(""),[O,f]=Object(n.r)(""),j=Object(n.q)(),C=Object(n.q)();Object(n.n)(()=>{const e={offsetLeft:s.current.offsetLeft,...Object(u.l)(s.current.getBoundingClientRect(),["top","width","height"])},t={offsetLeft:l.current.offsetLeft,...Object(u.l)(l.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+r.current.scrollTop),e.height-1)],{huePosition:n}=La(m.current,j.current);d(Aa({colorPosition:a,huePosition:n},j.current)),g()}function n(e){const{colorPosition:a}=La(m.current,j.current),n=Math.min(Math.max(0,e.pageX-t.offsetLeft),t.width-1);d(Aa({colorPosition:a,huePosition:n},j.current)),g()}j.current={colorRect:e,hueRect:t},Object(h.b)(s.current,{onCapture:a,onDrag:a,onRelease:p,onClick:p,withCursor:!0}),Object(h.b)(l.current,{onCapture:n,onDrag:n,onRelease:p,onClick:p,withCursor:!0})},[g,p]);const{colorPosition:y=[0,0],huePosition:k=0}=j.current?La(i,j.current):{},N=ja(ya(i)),I=i[0],S=ja(ya([I,1,1]));Object(n.n)(()=>{const e=ya(i),t="#"+ja(e);if(E(e.join(", ")),f(t),!o.current){const n=ka(e);a({theme:c.current,background:void 0,backgroundColor:t,patternColor:n})}o.current=!1},[i,a]),Object(n.n)(()=>{!function(e,t,a,n){let c,r,s;a.current&&n.current?(c=n.current.colorRect.width,r=n.current.colorRect.height,s=a.current):(c=e.offsetWidth,r=e.offsetHeight,s=e.getContext("2d"),e.width=c,e.height=r,a.current=s);const l=s.createImageData(c,r),o=l.data,i=ya([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 r=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()));d(Ca(e))}e.currentTarget.value=t},[]),P=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}$/)&&d(Ca(fa(t.replace("#","")))),e.currentTarget.value=t},[]),M=Object(n.m)(e=>{d(Ca(fa(e.currentTarget.dataset.color.replace("#",""))))},[]),F=Object(ce.a)("SettingsGeneralBackgroundColor settings-content custom-scroll",b&&"is-dragging");return n.a.createElement("div",{ref:r,className:F},n.a.createElement("div",{className:"settings-item pt-3"},n.a.createElement("div",{ref:s,className:"color-picker"},n.a.createElement("canvas",null),n.a.createElement("div",{className:"handle",style:`transform: translate(${y[0]}px, ${y[1]}px); background-color: #${N};`})),n.a.createElement("div",{ref:l,className:"hue-picker"},n.a.createElement("canvas",null),n.a.createElement("div",{className:"handle",style:`transform: translateX(${k}px); background-color: #${S};`})),n.a.createElement("div",{className:"tools"},n.a.createElement(pe.a,{value:O,label:"HEX",onChange:P}),n.a.createElement(pe.a,{value:v,label:"RGB",onChange:w}))),n.a.createElement("div",{className:"predefined-colors"},Fa.map(e=>n.a.createElement("div",{className:e==="#"+N?"active":void 0,"data-color":e,style:`background-color: ${e};`,onClick:M}))))}));var Ra=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(u.l)(t,["loadNotificationSettings","updateContactSignUpNotification","updateNotificationSettings"]))(({hasPrivateChatsNotifications:e,hasPrivateChatsMessagePreview:t,hasGroupNotifications:a,hasGroupMessagePreview:c,hasBroadcastNotifications:r,hasBroadcastMessagePreview:s,hasContactJoinedNotifications:l,loadNotificationSettings:o,updateContactSignUpNotification:i,updateNotificationSettings:d})=>{Object(n.n)(()=>{o()},[o]);const m=Object(n.m)((n,l,o)=>{const i="contact"===l?!e:!("group"===l?a:r),m="contact"===l?t:"group"===l?c:s;d({peerType:l,..."silent"===o&&{isSilent:!n.target.checked,shouldShowPreviews:m},..."showPreviews"===o&&{shouldShowPreviews:n.target.checked,isSilent:i}})},[s,r,c,a,t,e,d]),u=Object(n.m)(e=>{i({isSilent:!e.target.checked})},[i]),h=Object(F.a)();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},h("AutodownloadPrivateChats")),n.a.createElement(ta.a,{label:h("NotificationsForPrivateChats"),subLabel:h(e?"NotificationsEnabled":"NotificationsDisabled"),checked:e,onChange:e=>{m(e,"contact","silent")}}),n.a.createElement(ta.a,{label:h("MessagePreview"),subLabel:h(t?"PreviewEnabled":"PreviewDisabled"),checked:t,onChange:e=>{m(e,"contact","showPreviews")}})),n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header",dir:h.isRtl?"rtl":void 0},h("FilterGroups")),n.a.createElement(ta.a,{label:h("NotificationsForGroups"),subLabel:h(a?"NotificationsEnabled":"NotificationsDisabled"),checked:a,onChange:e=>{m(e,"group","silent")}}),n.a.createElement(ta.a,{label:h("MessagePreview"),subLabel:h(c?"PreviewEnabled":"PreviewDisabled"),checked:c,onChange:e=>{m(e,"group","showPreviews")}})),n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header",dir:h.isRtl?"rtl":void 0},h("FilterChannels")),n.a.createElement(ta.a,{label:h("NotificationsForChannels"),subLabel:h(r?"NotificationsEnabled":"NotificationsDisabled"),checked:r,onChange:e=>{m(e,"broadcast","silent")}}),n.a.createElement(ta.a,{label:h("MessagePreview"),subLabel:h(s?"PreviewEnabled":"PreviewDisabled"),checked:s,onChange:e=>{m(e,"broadcast","showPreviews")}})),n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header",dir:h.isRtl?"rtl":void 0},h("PhoneOther")),n.a.createElement(ta.a,{label:h("ContactJoined"),checked:l,onChange:u})))}));var Da=Object(n.h)(Object(c.h)(e=>{const{settings:{byKey:{hasPassword:t},privacy:a},blocked:n,activeSessions:c}=e;return{hasPassword:t,blockedCount:n.totalCount,sessionsCount:c.length,visibilityPrivacyPhoneNumber:a.phoneNumber&&a.phoneNumber.visibility,visibilityPrivacyLastSeen:a.lastSeen&&a.lastSeen.visibility,visibilityPrivacyProfilePhoto:a.profilePhoto&&a.profilePhoto.visibility,visibilityPrivacyForwarding:a.forwards&&a.forwards.visibility,visibilityPrivacyGroupChats:a.chatInvite&&a.chatInvite.visibility}},(e,t)=>Object(u.l)(t,["loadBlockedContacts","loadAuthorizations","loadPrivacySettings"]))(({onScreenSelect:e,hasPassword:t,blockedCount:a,sessionsCount:c,visibilityPrivacyPhoneNumber:r,visibilityPrivacyLastSeen:l,visibilityPrivacyProfilePhoto:o,visibilityPrivacyForwarding:i,visibilityPrivacyGroupChats:d,loadPrivacySettings:m,loadBlockedContacts:u,loadAuthorizations:h})=>{Object(n.n)(()=>{u(),h(),m()},[u,h,m]);const b=Object(F.a)();function g(e){switch(e){case"everybody":return b("P2PEverybody");case"contacts":return b("P2PContacts");case"nobody":return b("P2PNobody")}}return 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:()=>e(s.m.PrivacyBlockedUsers)},n.a.createElement("div",{className:"multiline-menu-item"},n.a.createElement("span",{className:"title"},b("BlockedUsers")),a>0&&n.a.createElement("span",{className:"subtitle",dir:"auto"},b("Users",a)))),n.a.createElement(Ee.a,{icon:"lock",narrow:!0,onClick:()=>e(t?s.m.TwoFaEnabled:s.m.TwoFaDisabled)},n.a.createElement("div",{className:"multiline-menu-item"},n.a.createElement("span",{className:"title"},b("TwoStepVerification")),n.a.createElement("span",{className:"subtitle",dir:"auto"},b(t?"PasswordOn":"PasswordOff")))),n.a.createElement(Ee.a,{icon:"active-sessions",narrow:!0,onClick:()=>e(s.m.PrivacyActiveSessions)},n.a.createElement("div",{className:"multiline-menu-item"},n.a.createElement("span",{className:"title"},b("SessionsTitle")),c>0&&n.a.createElement("span",{className:"subtitle",dir:"auto"},1===c?"1 session":c+" sessions")))),n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header mb-4",dir:b.isRtl?"rtl":void 0},b("PrivacyTitle")),n.a.createElement(Ee.a,{narrow:!0,onClick:()=>e(s.m.PrivacyPhoneNumber)},n.a.createElement("div",{className:"multiline-menu-item"},n.a.createElement("span",{className:"title"},b("PrivacyPhoneTitle")),n.a.createElement("span",{className:"subtitle",dir:"auto"},g(r)))),n.a.createElement(Ee.a,{narrow:!0,onClick:()=>e(s.m.PrivacyLastSeen)},n.a.createElement("div",{className:"multiline-menu-item"},n.a.createElement("span",{className:"title"},b("LastSeenTitle")),n.a.createElement("span",{className:"subtitle",dir:"auto"},g(l)))),n.a.createElement(Ee.a,{narrow:!0,onClick:()=>e(s.m.PrivacyProfilePhoto)},n.a.createElement("div",{className:"multiline-menu-item"},n.a.createElement("span",{className:"title"},b("PrivacyProfilePhotoTitle")),n.a.createElement("span",{className:"subtitle",dir:"auto"},g(o)))),n.a.createElement(Ee.a,{narrow:!0,onClick:()=>e(s.m.PrivacyForwarding)},n.a.createElement("div",{className:"multiline-menu-item"},n.a.createElement("span",{className:"title"},b("PrivacyForwardsTitle")),n.a.createElement("span",{className:"subtitle",dir:"auto"},g(i)))),n.a.createElement(Ee.a,{narrow:!0,onClick:()=>e(s.m.PrivacyGroupChats)},n.a.createElement("div",{className:"multiline-menu-item"},n.a.createElement("span",{className:"title"},b("WhoCanAddMe")),n.a.createElement("span",{className:"subtitle",dir:"auto"},g(d))))))})),Ba=a(14);var xa=Object(n.h)(Object(c.h)(e=>({languages:e.settings.byKey.languages,language:e.settings.byKey.language}),(e,t)=>Object(u.l)(t,["loadLanguages","setSettingOption"]))(({languages:e,language:t,loadLanguages:a,setSettingOption:c})=>{const[r,s]=Object(n.r)(t),[l,o,i]=Object(Be.a)();Object(n.n)(()=>{a()},[a]);const d=Object(n.m)(e=>{s(e),o(),Object(Ba.c)(e,()=>{i(),c({language:e})})},[o,i,c]),m=Object(n.p)(()=>e?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)}(e):void 0,[e]);return n.a.createElement("div",{className:"settings-content settings-item settings-language custom-scroll"},m?n.a.createElement(la.a,{name:"keyboard-send-settings",options:m,selected:r,loadingOption:l?r:void 0,onChange:d}):n.a.createElement(be.a,null))}));function Ua(e){switch(e){case s.m.PrivacyPhoneNumber:case s.m.PrivacyPhoneNumberAllowedContacts:case s.m.PrivacyPhoneNumberDeniedContacts:return"phoneNumber";case s.m.PrivacyLastSeen:case s.m.PrivacyLastSeenAllowedContacts:case s.m.PrivacyLastSeenDeniedContacts:return"lastSeen";case s.m.PrivacyProfilePhoto:case s.m.PrivacyProfilePhotoAllowedContacts:case s.m.PrivacyProfilePhotoDeniedContacts:return"profilePhoto";case s.m.PrivacyForwarding:case s.m.PrivacyForwardingAllowedContacts:case s.m.PrivacyForwardingDeniedContacts:return"forwards";case s.m.PrivacyGroupChats:case s.m.PrivacyGroupChatsAllowedContacts:case s.m.PrivacyGroupChatsDeniedContacts:return"chatInvite"}}var Ga=Object(n.h)(Object(c.h)((e,{screen:t})=>{let a;const{chats:{byId:n},settings:{privacy:c}}=e;switch(t){case s.m.PrivacyPhoneNumber:a=c.phoneNumber;break;case s.m.PrivacyLastSeen:a=c.lastSeen;break;case s.m.PrivacyProfilePhoto:a=c.profilePhoto;break;case s.m.PrivacyForwarding:a=c.forwards;break;case s.m.PrivacyGroupChats:a=c.chatInvite}return a?{...a,chatsById:n}:{}},(e,t)=>Object(u.l)(t,["setPrivacyVisibility"]))(({screen:e,onScreenSelect:t,visibility:a,allowUserIds:c,allowChatIds:r,blockUserIds:l,blockChatIds:o,chatsById:i,setPrivacyVisibility:d})=>{const m=Object(F.a)(),u=Object(n.p)(()=>{switch(e){case s.m.PrivacyProfilePhoto:case s.m.PrivacyGroupChats:return[{value:"everybody",label:m("P2PEverybody")},{value:"contacts",label:m("P2PContacts")}];default:return[{value:"everybody",label:m("P2PEverybody")},{value:"contacts",label:m("P2PContacts")},{value:"nobody",label:m("P2PNobody")}]}},[m,e]),h={shouldShowDenied:"nobody"!==a,shouldShowAllowed:"everybody"!==a},b=Ua(e),g=Object(n.p)(()=>{switch(e){case s.m.PrivacyPhoneNumber:return m("PrivacyPhoneTitle");case s.m.PrivacyLastSeen:return m("LastSeenTitle");case s.m.PrivacyProfilePhoto:return m("PrivacyProfilePhotoTitle");case s.m.PrivacyForwarding:return m("PrivacyForwardsTitle");case s.m.PrivacyGroupChats:return m("WhoCanAddMe");default:return}},[m,e]),p=Object(n.p)(()=>{switch(e){case s.m.PrivacyLastSeen:return m("CustomHelp");default:return}},[m,e]),v=(()=>{switch(e){case s.m.PrivacyPhoneNumber:return s.m.PrivacyPhoneNumberAllowedContacts;case s.m.PrivacyLastSeen:return s.m.PrivacyLastSeenAllowedContacts;case s.m.PrivacyProfilePhoto:return s.m.PrivacyProfilePhotoAllowedContacts;case s.m.PrivacyForwarding:return s.m.PrivacyForwardingAllowedContacts;default:return s.m.PrivacyGroupChatsAllowedContacts}})(),E=(()=>{switch(e){case s.m.PrivacyPhoneNumber:return s.m.PrivacyPhoneNumberDeniedContacts;case s.m.PrivacyLastSeen:return s.m.PrivacyLastSeenDeniedContacts;case s.m.PrivacyProfilePhoto:return s.m.PrivacyProfilePhotoDeniedContacts;case s.m.PrivacyForwarding:return s.m.PrivacyForwardingDeniedContacts;default:return s.m.PrivacyGroupChatsDeniedContacts}})(),O=Object(n.p)(()=>c&&r&&i?r.reduce((e,t)=>e+(i[t]?i[t].membersCount:0),c.length):0,[r,c,i]),f=Object(n.p)(()=>l&&o&&i?o.reduce((e,t)=>e+(i[t]?i[t].membersCount:0),l.length):0,[o,l,i]),j=Object(n.m)(e=>{d({privacyKey:b,visibility:e})},[b,d]);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:m.isRtl?"rtl":void 0},g),n.a.createElement(la.a,{name:"visibility-"+b,options:u,onChange:j,selected:a}),p&&n.a.createElement("p",{className:"settings-item-description-larger",dir:m.isRtl?"rtl":void 0},p)),n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header mb-4",dir:m.isRtl?"rtl":void 0},m("PrivacyExceptions")),h.shouldShowAllowed&&n.a.createElement(Ee.a,{narrow:!0,icon:"add-user",onClick:()=>{t(v)}},n.a.createElement("div",{className:"multiline-menu-item full-size"},O>0&&n.a.createElement("span",{className:"date",dir:"auto"},"+",O),n.a.createElement("span",{className:"title"},m("AlwaysShareWith")),n.a.createElement("span",{className:"subtitle"},m("EditAdminAddUsers")))),h.shouldShowDenied&&n.a.createElement(Ee.a,{narrow:!0,icon:"delete-user",onClick:()=>{t(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"},m("NeverShareWith")),n.a.createElement("span",{className:"subtitle"},m("EditAdminAddUsers"))))))}));function qa(e){return[e.region,e.country].filter(Boolean).join(", ")}function za(e){return`${e.deviceModel}${e.deviceModel?", ":""} ${e.platform} ${e.systemVersion}`}var $a=Object(n.h)(Object(c.h)(e=>({activeSessions:e.activeSessions}),(e,t)=>Object(u.l)(t,["loadAuthorizations","terminateAuthorization","terminateAllAuthorizations"]))(({activeSessions:e,loadAuthorizations:t,terminateAuthorization:a,terminateAllAuthorizations:c})=>{const[r,s,l]=Object(Be.a)();Object(n.n)(()=>{t()},[t]);const o=Object(n.m)(e=>{a({hash:e})},[a]),i=Object(n.m)(()=>{l(),c()},[l,c]),d=Object(n.p)(()=>e.find(e=>e.isCurrent),[e]),m=Object(n.p)(()=>e.filter(e=>!e.isCurrent),[e]),u=Object(F.a)();function h(e){return n.a.createElement(Ee.a,{key:e.hash,ripple:!0,narrow:!0,contextActions:[{title:"Terminate",icon:"stop",handler:()=>{o(e.hash)}}]},n.a.createElement("div",{className:"multiline-menu-item full-size",dir:"auto"},n.a.createElement("span",{className:"date"},Object(D.g)(u,1e3*e.dateActive)),n.a.createElement("span",{className:"title"},e.appName),n.a.createElement("span",{className:"subtitle black tight"},za(e)),n.a.createElement("span",{className:"subtitle"},e.ip," - ",qa(e))))}return n.a.createElement("div",{className:"settings-content custom-scroll"},d&&(g=d,n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header mb-4",dir:u.isRtl?"rtl":void 0},u("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"},g.appName),n.a.createElement("span",{className:"subtitle black tight"},za(g)),n.a.createElement("span",{className:"subtitle"},g.ip," - ",qa(g)))),n.a.createElement(Ee.a,{className:"destructive mb-0",icon:"stop",ripple:!0,narrow:!0,onClick:s},u("TerminateAllSessions")))),m&&(b=m,n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header mb-4",dir:u.isRtl?"rtl":void 0},"Other Sessions"),b.map(h))),m&&n.a.createElement(we.a,{isOpen:r,onClose:l,text:"Are you sure you want to terminate all other sessions?",confirmLabel:"Terminate All Other Sessions",confirmHandler:i,confirmIsDestructive:!0}),";");var b,g}));var Ha=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(u.l)(t,["unblockContact"]))(({chatsByIds:e,usersByIds:t,blockedIds:a,unblockContact:c})=>{const r=Object(n.m)(e=>{c({contactId:e})},[c]),s=Object(F.a)();return 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:s.isRtl?"rtl":void 0},s("BlockedUsersInfo"))),n.a.createElement("div",{className:"chat-list custom-scroll"},a&&a.length?n.a.createElement("div",{className:"scroll-container"},a.map((a,c)=>function(a,c,o){const i=Object(m.lb)(a),d=i?t[a]:void 0,u=i?void 0:e[a],h=Object(ce.a)("Chat chat-item-clickable blocked-list-item",i?"private":"group");return n.a.createElement(Ee.a,{key:a,className:h,ripple:!0,narrow:!0,contextActions:[{title:"Unblock",icon:"unlock",handler:()=>{r(a)}}],style:`top: ${(o+c)*l.i}px;`},n.a.createElement(x.a,{size:"medium",user:d,chat:u}),n.a.createElement("div",{className:"contact-info",dir:"auto"},n.a.createElement("h3",{dir:"auto"},Object(B.a)((i?Object(m.Z)(d):Object(m.l)(s,u))||"")),d&&d.phoneNumber&&n.a.createElement("div",{className:"contact-phone",dir:"auto"},Object(Bt.c)(d.phoneNumber)),d&&!d.phoneNumber&&d.username&&n.a.createElement("div",{className:"contact-username",dir:"auto"},"@",d.username)))}(a,c,0))):a&&!a.length?n.a.createElement("div",{className:"no-results",dir:"auto"},"List is empty"):n.a.createElement(be.a,{key:"loading"}))),n.a.createElement(Gt,{isShown:!0,onClick:()=>{},className:"not-implemented",ariaLabel:"Add a blocked user"},n.a.createElement("i",{className:"icon-add"})))})),_a=a(126);var Va=Object(n.h)(Object(c.h)(e=>({animatedEmoji:Object(d.c)(e,"🔐")}))(({animatedEmoji:e,onScreenSelect:t})=>{const a=Object(F.a)();return n.a.createElement("div",{className:"settings-content two-fa custom-scroll"},n.a.createElement("div",{className:"settings-content-header"},n.a.createElement(_a.a,{sticker:e}),n.a.createElement("p",{className:"settings-item-description mb-3",dir:"auto"},Object(B.a)(a("EnabledPasswordText"),["br"]))),n.a.createElement("div",{className:"settings-item pt-0 no-border"},n.a.createElement(Ee.a,{icon:"edit",onClick:()=>t(s.m.TwoFaChangePasswordCurrent)},a("ChangePassword")),n.a.createElement(Ee.a,{icon:"password-off",onClick:()=>t(s.m.TwoFaTurnOff)},a("TurnPasswordOff")),n.a.createElement(Ee.a,{icon:"email",onClick:()=>t(s.m.TwoFaRecoveryEmailCurrentPassword)},a("SetRecoveryEmail"))))})),Wa=a(146),Ka=a(147);var Ya=Object(n.h)(({error:e,isLoading:t,expectedPassword:a,placeholder:c="Current Password",hint:r,submitLabel:s,clearError:l,onSubmit:o})=>{const[i,d]=Object(n.r)(""),[m,u]=Object(n.r)(!1),h=Object(n.m)(e=>{a&&e!==a?d("Passwords Should Be Equal"):o(e)},[o,a]),b=Object(n.m)(()=>{l&&l(),d("")},[l]),g=Object(F.a)();return n.a.createElement("div",{className:"settings-content two-fa custom-scroll"},n.a.createElement("div",{className:"settings-content-header"},n.a.createElement(Wa.a,{isBig:!0,isPasswordVisible:m})),n.a.createElement("div",{className:"settings-item pt-0 no-border"},n.a.createElement(Ka.a,{error:i||e,hint:r,placeholder:c,submitLabel:s||g("Next"),clearError:b,isLoading:t,isPasswordVisible:m,onChangePasswordVisibility:u,onSubmit:h})))});var Za=Object(n.h)(Object(c.h)(e=>({animatedEmoji:Object(d.c)(e,"🔐")}))(({animatedEmoji:e,onStart:t})=>{const a=Object(F.a)();return n.a.createElement("div",{className:"settings-content two-fa custom-scroll"},n.a.createElement("div",{className:"settings-content-header"},n.a.createElement(_a.a,{sticker:e}),n.a.createElement("p",{className:"settings-item-description mb-3",dir:"auto"},a("SetAdditionalPasswordInfo"))),n.a.createElement("div",{className:"settings-item pt-0 no-border"},n.a.createElement(R.a,{onClick:t},a("EditAdminTransferSetPassword"))))}));const Qa=o.g?550:400;var Xa=Object(n.h)(Object(c.h)((e,{icon:t})=>({animatedEmoji:Object(d.c)(e,"email"===t?"💌":"💡")}))(({animatedEmoji:e,type:t="text",isLoading:a,error:c,placeholder:r,shouldConfirm:s,clearError:l,onSubmit:i})=>{const d=Object(n.q)(null),[m,u]=Object(n.r)(""),[h,b,g]=Object(Be.a)(!1);Object(n.n)(()=>{o.l||setTimeout(()=>{d.current.focus()},Qa)},[]);const p=Object(F.a)();return n.a.createElement("div",{className:"settings-content two-fa custom-scroll"},n.a.createElement("div",{className:"settings-content-header"},n.a.createElement(_a.a,{sticker:e})),n.a.createElement("div",{className:"settings-item pt-0 no-border"},n.a.createElement("form",{action:"",onSubmit:e=>{e.preventDefault(),d.current&&i(m)}},n.a.createElement(pe.a,{ref:d,value:m,inputMode:t,label:r,error:c,onChange:e=>{c&&l&&l(),u(e.target.value)}}),m?n.a.createElement(R.a,{type:"submit",isLoading:a,ripple:!0},p("Continue")):n.a.createElement(R.a,{isText:!0,isLoading:a,ripple:!0,onClick:s?b:()=>{i()}},p("YourEmailSkip"))),s&&n.a.createElement(ge.a,{className:"narrow",isOpen:h,title:p("YourEmailSkipWarning"),onClose:g},Object(B.a)(p("YourEmailSkipWarningText"),["br","simple_markdown"]),n.a.createElement("div",{className:"dialog-buttons"},n.a.createElement(R.a,{color:"danger",ripple:!0,isText:!0,className:"confirm-dialog-button",onClick:()=>{g(),i()}},p("YourEmailSkip")),n.a.createElement(R.a,{color:"primary",ripple:!0,isText:!0,className:"confirm-dialog-button",onClick:g},p("Cancel"))))))}));var Ja=Object(n.h)(Object(c.h)(e=>({animatedEmoji:Object(d.c)(e,"🥳")}))(({animatedEmoji:e,onScreenSelect:t})=>{const a=Object(F.a)();return n.a.createElement("div",{className:"settings-content two-fa custom-scroll"},n.a.createElement("div",{className:"settings-content-header"},n.a.createElement(_a.a,{sticker:e}),n.a.createElement("p",{className:"settings-item-description mb-3",dir:"auto"},a("TwoStepVerificationPasswordSetInfo"))),n.a.createElement("div",{className:"settings-item pt-0 no-border"},n.a.createElement(R.a,{onClick:()=>{t(s.m.Privacy)}},a("TwoStepVerificationPasswordReturnSettings"))))}));const en=o.g?550:400;var tn=Object(n.h)(Object(c.h)(e=>({animatedEmoji:Object(d.c)(e,"💌"),codeLength:e.twoFaSettings.waitingEmailCodeLength}))(({animatedEmoji:e,codeLength:t,isLoading:a,error:c,clearError:r,onSubmit:s})=>{const l=Object(n.q)(null),[i,d]=Object(n.r)("");Object(n.n)(()=>{o.l||setTimeout(()=>{l.current.focus()},en)},[]);const m=Object(F.a)();return n.a.createElement("div",{className:"settings-content two-fa custom-scroll"},n.a.createElement("div",{className:"settings-content-header"},n.a.createElement(_a.a,{sticker:e})),n.a.createElement("div",{className:"settings-item pt-0 no-border"},n.a.createElement(pe.a,{value:i,ref:l,inputMode:"decimal",label:m("YourEmailCode"),error:c,onChange:e=>{c&&r&&r();const a=e.target.value.slice(0,t);a.length===t&&s(a),d(a),e.target.value=a}}),a&&n.a.createElement(be.a,null)))}));var an=Object(n.h)(Object(c.h)(e=>({...e.twoFaSettings}),(e,t)=>Object(u.l)(t,["updatePassword","updateRecoveryEmail","clearPassword","provideTwoFaEmailCode","checkPassword","clearTwoFaError"]))(({currentScreen:e,state:t,hint:a,isLoading:c,error:r,waitingEmailCodeLength:l,dispatch:o,onScreenSelect:i,updatePassword:d,checkPassword:m,clearTwoFaError:u,updateRecoveryEmail:h,provideTwoFaEmailCode:b,clearPassword:g})=>{Object(n.n)(()=>{l&&(e===s.m.TwoFaNewPasswordEmail?i(s.m.TwoFaNewPasswordEmailCode):e===s.m.TwoFaRecoveryEmail&&i(s.m.TwoFaRecoveryEmailCode))},[e,i,l]);const p=Object(n.m)(()=>{o({type:"reset"}),i(s.m.TwoFaNewPassword)},[o,i]),v=Object(n.m)(e=>{o({type:"setPassword",payload:e}),i(s.m.TwoFaNewPasswordConfirm)},[o,i]),E=Object(n.m)(()=>{i(s.m.TwoFaNewPasswordHint)},[i]),O=Object(n.m)(e=>{o({type:"setHint",payload:e}),i(s.m.TwoFaNewPasswordEmail)},[o,i]),f=Object(n.m)(e=>{o({type:"setEmail",payload:e}),d({...t,email:e,onSuccess:()=>{i(s.m.TwoFaCongratulations)}})},[o,i,t,d]),j=Object(n.m)(e=>{o({type:"setCurrentPassword",payload:e}),m({currentPassword:e,onSuccess:()=>{i(s.m.TwoFaChangePasswordNew)}})},[m,o,i]),C=Object(n.m)(e=>{o({type:"setPassword",payload:e}),i(s.m.TwoFaChangePasswordConfirm)},[o,i]),y=Object(n.m)(()=>{i(s.m.TwoFaChangePasswordHint)},[i]),k=Object(n.m)(e=>{o({type:"setHint",payload:e}),d({...t,hint:e,onSuccess:()=>{i(s.m.TwoFaCongratulations)}})},[o,i,t,d]),N=Object(n.m)(e=>{g({currentPassword:e,onSuccess:()=>{i(s.m.Privacy)}})},[g,i]),I=Object(n.m)(e=>{o({type:"setCurrentPassword",payload:e}),m({currentPassword:e,onSuccess:()=>{i(s.m.TwoFaRecoveryEmail)}})},[m,o,i]),S=Object(n.m)(e=>{o({type:"setEmail",payload:e}),h({...t,email:e,onSuccess:()=>{i(s.m.TwoFaCongratulations)}})},[o,i,t,h]),w=Object(n.m)(e=>{b({code:e})},[b]),P=Object(F.a)();switch(e){case s.m.TwoFaDisabled:return n.a.createElement(Za,{onStart:p});case s.m.TwoFaNewPassword:return n.a.createElement(Ya,{placeholder:P("EnterPassword"),submitLabel:P("Continue"),onSubmit:v});case s.m.TwoFaNewPasswordConfirm:return n.a.createElement(Ya,{expectedPassword:t.password,placeholder:P("PleaseReEnterPassword"),submitLabel:P("Continue"),onSubmit:E});case s.m.TwoFaNewPasswordHint:return n.a.createElement(Xa,{icon:"hint",placeholder:P("PasswordHintPlaceholder"),onSubmit:O});case s.m.TwoFaNewPasswordEmail:return n.a.createElement(Xa,{icon:"email",type:"email",isLoading:c,error:r,clearError:u,placeholder:P("RecoveryEmailTitle"),shouldConfirm:!0,onSubmit:f});case s.m.TwoFaNewPasswordEmailCode:return n.a.createElement(tn,{isLoading:c,error:r,clearError:u,onSubmit:w});case s.m.TwoFaCongratulations:return n.a.createElement(Ja,{onScreenSelect:i});case s.m.TwoFaEnabled:return n.a.createElement(Va,{onScreenSelect:i});case s.m.TwoFaChangePasswordCurrent:return n.a.createElement(Ya,{isLoading:c,error:r,clearError:u,hint:a,onSubmit:j});case s.m.TwoFaChangePasswordNew:return n.a.createElement(Ya,{placeholder:P("PleaseEnterNewFirstPassword"),onSubmit:C});case s.m.TwoFaChangePasswordConfirm:return n.a.createElement(Ya,{expectedPassword:t.password,placeholder:P("PleaseReEnterPassword"),onSubmit:y});case s.m.TwoFaChangePasswordHint:return n.a.createElement(Xa,{isLoading:c,error:r,clearError:u,icon:"hint",placeholder:P("PasswordHintPlaceholder"),onSubmit:k});case s.m.TwoFaTurnOff:return n.a.createElement(Ya,{isLoading:c,error:r,clearError:u,hint:a,onSubmit:N});case s.m.TwoFaRecoveryEmailCurrentPassword:return n.a.createElement(Ya,{isLoading:c,error:r,clearError:u,hint:a,onSubmit:I});case s.m.TwoFaRecoveryEmail:return n.a.createElement(Xa,{icon:"email",type:"email",placeholder:P("RecoveryEmailTitle"),onSubmit:S});case s.m.TwoFaRecoveryEmailCode:return n.a.createElement(tn,{isLoading:c,error:r,clearError:u,onSubmit:w});default:return}}));var nn=Object(n.h)(({itemIds:e,selectedIds:t,filterValue:a,filterPlaceholder:c,notFoundText:r,searchInputId:s,isLoading:l,onSelectedIdsChange:o,onFilterChange:i,onLoadMore:d})=>{const u=Object(n.q)(null),h=t.length>10;Object(n.n)(()=>{setTimeout(()=>{requestAnimationFrame(()=>{u.current.focus()})},500)},[]);const b=Object(n.m)(e=>{const a=[...t];a.includes(e)?a.splice(a.indexOf(e),1):a.push(e),o(a),i("")},[t,o,i]),g=Object(n.m)(e=>{const{value:t}=e.currentTarget;i(t)},[i]),[p,v]=Object(ue.a)(d,e,Boolean(a)),E=Object(F.a)();return n.a.createElement("div",{className:"Picker"},n.a.createElement("div",{className:"picker-header custom-scroll",dir:E.isRtl?"rtl":void 0},t.map((e,a)=>n.a.createElement(tt.a,{chatOrUserId:e,isMinimized:h&&an.a.createElement(Ee.a,{key:e,className:"chat-item-clickable picker-list-item",onClick:()=>b(e),ripple:!0},n.a.createElement(ta.a,{label:"",checked:t.includes(e)}),Object(m.lb)(e)?n.a.createElement(Oe.a,{userId:e}):n.a.createElement(fe.a,{chatId:e})))):l||!p||p.length?n.a.createElement(be.a,null):n.a.createElement("p",{className:"no-results"},r||"Sorry, nothing found."))});function cn(e,t){const{privacy:a}=e.settings;switch(t){case s.m.PrivacyPhoneNumberAllowedContacts:case s.m.PrivacyPhoneNumberDeniedContacts:return a.phoneNumber;case s.m.PrivacyLastSeenAllowedContacts:case s.m.PrivacyLastSeenDeniedContacts:return a.lastSeen;case s.m.PrivacyProfilePhotoAllowedContacts:case s.m.PrivacyProfilePhotoDeniedContacts:return a.profilePhoto;case s.m.PrivacyForwardingAllowedContacts:case s.m.PrivacyForwardingDeniedContacts:return a.forwards;case s.m.PrivacyGroupChatsDeniedContacts:case s.m.PrivacyGroupChatsAllowedContacts:return a.chatInvite}}var rn=Object(n.h)(Object(c.h)((e,{screen:t})=>{const{chats:{byId:a,listIds:n,orderedPinnedIds:c},currentUserId:r}=e;return{currentUserId:r,chatsById:a,listIds:n.active,orderedPinnedIds:c.active,archivedPinnedIds:c.archived,archivedListIds:n.archived,settings:cn(e,t)}},(e,t)=>Object(u.l)(t,["setPrivacySettings"]))(({currentUserId:e,isAllowList:t,screen:a,settings:c,chatsById:r,listIds:l,orderedPinnedIds:o,archivedListIds:i,archivedPinnedIds:d,setPrivacySettings:u,onScreenSelect:h})=>{const b=Object(F.a)(),g=Object(n.p)(()=>c?t?[...c.allowUserIds,...c.allowChatIds]:[...c.blockUserIds,...c.blockChatIds]:[],[t,c]),[p,v]=Object(n.r)(""),[E,O]=Object(n.r)(!1),[f,j]=Object(n.r)(g),C=Object(n.p)(()=>{const e=l?Object(m.Ab)(r,l,o,"all"):void 0,t=i?Object(m.Ab)(r,i,d,"archived"):void 0;if(e||t)return[...e?[...e.pinnedChats,...e.otherChats]:[],...t?t.otherChats:[]]},[r,l,o,i,d]),y=Object(n.p)(()=>{if(C)return C.filter(t=>(Object(m.lb)(t.id)&&t.id!==e||Object(m.kb)(t))&&(!p||Object(me.a)(Object(m.l)(b,t),p)||g.includes(t.id))).map(({id:e})=>e)},[C,e,b,p,g]),k=Object(n.m)(e=>{j(e),O(!0)},[]),N=Object(n.m)(()=>{u({privacyKey:Ua(a),isAllowList:Boolean(t),contactsIds:f}),h(s.m.Privacy)},[t,f,h,a,u]);return n.a.createElement("div",{className:"NewChat-inner step-1"},n.a.createElement(nn,{itemIds:y||[],selectedIds:f,filterValue:p,filterPlaceholder:b(t?"AlwaysShareWithPlaceholder":"NeverShareWithPlaceholder"),searchInputId:"new-group-picker-search",onSelectedIdsChange:k,onFilterChange:v}),n.a.createElement(Gt,{isShown:E,onClick:N,ariaLabel:b(t?"AlwaysShareWithTitle":"NeverShareWithTitle")},n.a.createElement("i",{className:"icon-arrow-right"})))}));a(276);const sn=Object.keys(s.m).length/2;var ln=Object(n.h)(({currentScreen:e,onScreenSelect:t,onReset:a,shouldSkipTransition:c})=>{const[r,l]=Nt(At,Lt),[i,d]=Nt(Rt,Tt),m=Object(n.m)(()=>{e!==s.m.FoldersCreateFolder&&e!==s.m.FoldersEditFolder||setTimeout(()=>{l({type:"reset"})},200),e!==s.m.FoldersIncludedChats&&e!==s.m.FoldersExcludedChats?a():"create"===r.mode?t(s.m.FoldersCreateFolder):t(s.m.FoldersEditFolder)},[r.mode,l,e,a,t]),u=Object(n.m)(()=>{l({type:"saveFilters"}),m()},[l,m]);function h(){return n.a.createElement(n.a.Fragment,null,n.a.createElement(Dt,{currentScreen:e,onReset:m,onSaveFilter:u,editedFolderId:r.folderId}),function(){switch(e){case s.m.Main:return n.a.createElement(xt,{onScreenSelect:t});case s.m.EditProfile:return n.a.createElement(Vt,null);case s.m.General:return n.a.createElement(pa,{onScreenSelect:t});case s.m.Notifications:return n.a.createElement(Ra,null);case s.m.Privacy:return n.a.createElement(Da,{onScreenSelect:t});case s.m.Language:return n.a.createElement(xa,null);case s.m.GeneralChatBackground:return n.a.createElement(Pa,{onScreenSelect:t});case s.m.GeneralChatBackgroundColor:return n.a.createElement(Ta,{onScreenSelect:t});case s.m.PrivacyActiveSessions:return n.a.createElement($a,null);case s.m.PrivacyBlockedUsers:return n.a.createElement(Ha,null);case s.m.PrivacyPhoneNumber:case s.m.PrivacyLastSeen:case s.m.PrivacyProfilePhoto:case s.m.PrivacyForwarding:case s.m.PrivacyGroupChats:return n.a.createElement(Ga,{screen:e,onScreenSelect:t});case s.m.PrivacyPhoneNumberAllowedContacts:case s.m.PrivacyLastSeenAllowedContacts:case s.m.PrivacyProfilePhotoAllowedContacts:case s.m.PrivacyForwardingAllowedContacts:case s.m.PrivacyGroupChatsAllowedContacts:return n.a.createElement(rn,{isAllowList:!0,screen:e,onScreenSelect:t});case s.m.PrivacyPhoneNumberDeniedContacts:case s.m.PrivacyLastSeenDeniedContacts:case s.m.PrivacyProfilePhotoDeniedContacts:case s.m.PrivacyForwardingDeniedContacts:case s.m.PrivacyGroupChatsDeniedContacts:return n.a.createElement(rn,{screen:e,onScreenSelect:t});case s.m.Folders:case s.m.FoldersCreateFolder:case s.m.FoldersEditFolder:case s.m.FoldersIncludedChats:case s.m.FoldersExcludedChats:return n.a.createElement(ca,{currentScreen:e,state:r,dispatch:l,onScreenSelect:t,onReset:m});case s.m.TwoFaDisabled:case s.m.TwoFaNewPassword:case s.m.TwoFaNewPasswordConfirm:case s.m.TwoFaNewPasswordHint:case s.m.TwoFaNewPasswordEmail:case s.m.TwoFaNewPasswordEmailCode:case s.m.TwoFaCongratulations:case s.m.TwoFaEnabled:case s.m.TwoFaChangePasswordCurrent:case s.m.TwoFaChangePasswordNew:case s.m.TwoFaChangePasswordConfirm:case s.m.TwoFaChangePasswordHint:case s.m.TwoFaTurnOff:case s.m.TwoFaRecoveryEmailCurrentPassword:case s.m.TwoFaRecoveryEmail:case s.m.TwoFaRecoveryEmailCode:return n.a.createElement(an,{currentScreen:e,state:i,dispatch:d,onScreenSelect:t});default:return}}())}return n.a.createElement(T.b,{id:"Settings",name:c?"none":o.g?"slide-layers":"push-slide",activeKey:e,renderCount:sn},h)});const on=Object(_.g)(e=>e(),6e4,!0);var dn=Object(n.h)(Object(c.h)(e=>{const{userIds:t}=e.contactList||{},{byId:a}=e.users;return{usersById:a,contactIds:t}},(e,t)=>Object(u.l)(t,["loadContactList","openChat"]))(({filter:e,usersById:t,contactIds:a,loadContactList:c,openChat:r})=>{Object(n.n)(()=>{on(()=>{c()})});const s=Object(n.m)(e=>{r({id:e})},[r]),l=Object(n.p)(()=>{if(!a)return;const n=e?a.filter(a=>{const n=t[a];if(!n)return!1;const c=Object(m.Z)(n);return c&&Object(me.a)(c,e)}):a;return Object(m.Eb)(n,t)},[e,t,a]),[i,d]=Object(ue.a)(void 0,l,Boolean(e));return n.a.createElement(ve.a,{items:i,onLoadMore:d,className:"chat-list custom-scroll"},i&&i.length?i.map(e=>n.a.createElement(Ee.a,{key:e,className:"chat-item-clickable",onClick:()=>s(e),ripple:!o.g},n.a.createElement(Oe.a,{userId:e,forceShowSelf:!0,avatarSize:"large"}))):i&&!i.length?n.a.createElement("p",{className:"no-results",key:"no-results",dir:"auto"},e.length?"No contacts matched your search.":"Contact list is empty."):n.a.createElement(be.a,{key:"loading"}))}));const mn=Object(_.g)(e=>e(),6e4,!0);var un=Object(n.h)(Object(c.h)(e=>{const{userIds:t}=e.contactList||{},{byId:a}=e.users,{byId:n}=e.chats,{currentUserId:c}=e,{query:r,fetchingStatus:s,globalResults:l,localResults:o}=e.globalSearch,{userIds:i}=l||{},{userIds:d}=o||{};return{currentUserId:c,usersById:a,chatsById:n,localContactIds:t,searchQuery:r,isSearching:s&&s.chats,globalUserIds:i,localUserIds:d}},(e,t)=>Object(u.l)(t,["loadContactList","setGlobalSearchQuery"]))(({isChannel:e,selectedMemberIds:t,onSelectedMemberIdsChange:a,onNextStep:c,onReset:r,currentUserId:s,usersById:l,chatsById:o,localContactIds:i,searchQuery:d,isSearching:h,localUserIds:b,globalUserIds:g,loadContactList:p,setGlobalSearchQuery:v})=>{Object(n.n)(()=>{mn(()=>{p()})});const E=Object(n.m)(e=>{v({query:e})},[v]),O=Object(n.p)(()=>{const e=i?Object(m.Db)(i.filter(e=>e!==s),o):[];if(!d)return e;const a=e.filter(e=>{const t=l[e];if(!t)return!1;const a=Object(m.Z)(t);return a&&Object(me.a)(a,d)});return Object(m.Db)(Object(u.o)([...a,...b||[],...g||[]]),o,!1,t)},[i,d,b,g,l,o,t,s]),f=Object(n.m)(()=>{(t.length||e)&&(v({query:""}),c())},[t.length,e,v,c]),j=Object(F.a)();return n.a.createElement("div",{className:"NewChat step-1"},n.a.createElement("div",{className:"left-header"},n.a.createElement(R.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,j("GroupAddMembers"))),n.a.createElement("div",{className:"NewChat-inner step-1"},n.a.createElement(nn,{itemIds:O,selectedIds:t,filterValue:d,filterPlaceholder:j("SendMessageTo"),searchInputId:"new-group-picker-search",isLoading:h,onSelectedIdsChange:a,onFilterChange:E}),n.a.createElement(Gt,{isShown:Boolean(t.length||e),onClick:f,ariaLabel:e?"Continue To Channel Info":"Continue To Group Info"},n.a.createElement("i",{className:"icon-arrow-right"}))))}));var hn=Object(n.h)(Object(c.h)(e=>{const{progress:t,error:a}=e.chatCreation||{};return{creationProgress:t,creationError:a}},(e,t)=>Object(u.l)(t,["createGroupChat","createChannel"]))(({isChannel:e,memberIds:t,onReset:a,creationProgress:c,creationError:r,createGroupChat:l,createChannel:o})=>{const i=Object(F.a)(),[d,m]=Object(n.r)(""),[u,h]=Object(n.r)(""),[b,g]=Object(n.r)(),[p,v]=Object(n.r)(),E=c===s.a.InProgress,O=Object(n.m)(e=>{const{value:t}=e.currentTarget,a=t.replace(/^\s+/,"");m(a),a!==t&&(e.currentTarget.value=a)},[]),f=Object(n.m)(e=>{h(e.currentTarget.value)},[]),j=Object(n.m)(()=>{d.length?t.length>199?v("Sorry, creating supergroups is not yet supported"):l({title:d,photo:b,memberIds:t}):v("Chat title can't be empty")},[d,t,l,b,"Chat title can't be empty","Sorry, creating supergroups is not yet supported"]),C=Object(n.m)(()=>{d.length?o({title:d,about:u,photo:b,memberIds:t}):v("Channel title can't be empty")},[d,o,u,b,t,"Channel title can't be empty"]);Object(n.n)(()=>{c===s.a.Complete&&a(!0)},[c,a]);const y=r||("Chat title can't be empty"!==p&&"Channel title can't be empty"!==p?p:void 0);return n.a.createElement("div",{className:"NewChat"},n.a.createElement("div",{className:"left-header"},n.a.createElement(R.a,{round:!0,size:"smaller",color:"translucent",onClick:()=>a(),ariaLabel:"Return to member selection"},n.a.createElement("i",{className:"icon-arrow-left"})),n.a.createElement("h3",null,i(e?"NewChannel":"NewGroup"))),n.a.createElement("div",{className:"NewChat-inner step-2"},n.a.createElement(Ut.a,{onChange:g,title:i("AddPhoto")}),n.a.createElement(pe.a,{value:d,onChange:O,label:i(e?"EnterChannelName":"GroupName"),error:"Chat title can't be empty"===p||"Channel title can't be empty"===p?p:void 0}),e&&n.a.createElement(n.a.Fragment,null,n.a.createElement(pe.a,{value:u,onChange:f,label:i("DescriptionOptionalPlaceholder")}),n.a.createElement("p",{className:"note"},i("DescriptionInfo"))),y&&n.a.createElement("p",{className:"error"},y),t.length>0&&n.a.createElement(n.a.Fragment,null,n.a.createElement("h3",{className:"chat-members-heading"},i("GroupInfo.ParticipantCount",t.length,"i")),n.a.createElement("div",{className:"chat-members-list custom-scroll"},t.map(e=>n.a.createElement(Ee.a,{inactive:!0,className:"chat-item-clickable"},n.a.createElement(Oe.a,{userId:e})))))),n.a.createElement(Gt,{isShown:0!==d.length,onClick:e?C:j,disabled:E,ariaLabel:e?i("ChannelIntro.CreateChannel"):"Create Group"},E?n.a.createElement(L.a,{color:"white"}):n.a.createElement("i",{className:"icon-arrow-right"})))}));a(277);const bn=Object.keys(s.d).length/2;var gn=Object(n.h)(({isChannel:e=!1,content:t,onContentChange:a,onReset:c})=>{const[r,l]=Object(n.r)([]),i=Object(n.m)(()=>{a(e?s.d.NewChannelStep2:s.d.NewGroupStep2)},[e,a]);return n.a.createElement(T.b,{id:"NewChat",name:o.g?"slide-layers":"push-slide",renderCount:bn,activeKey:t},()=>{switch(t){case s.d.NewChannelStep1:case s.d.NewGroupStep1:return n.a.createElement(un,{isChannel:e,selectedMemberIds:r,onSelectedMemberIdsChange:l,onNextStep:i,onReset:c});case s.d.NewChannelStep2:case s.d.NewGroupStep2:return n.a.createElement(hn,{isChannel:e,memberIds:r,onReset:c});default:return}})}),pn=a(187);a(278);var vn=Object(n.h)(({isActive:e,onReset:t})=>{const a=Object(F.a)();return n.a.createElement("div",{className:"ArchivedChats"},n.a.createElement("div",{className:"left-header"},n.a.createElement(R.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,a("ArchivedChats"))),n.a.createElement(pn.a,{folderType:"archived",noChatsText:"Archive is empty.",isActive:e}))});const En={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},On=e=>{e.preventDefault()};function fn(e){En[e.key]&&On(e)}function jn(){document.addEventListener("wheel",On,{passive:!1}),window.ontouchmove=On,document.onkeydown=fn}function Cn(){document.removeEventListener("wheel",On),window.ontouchmove=null,document.onkeydown=null}var yn=a(53),kn=a(151);function Nn(e,t){return e?"lng_context_copy_selected":t?"lng_context_copy_text":"Copy"}var In=a(171),Sn=a(52);a(279);var wn=({isOpen:e,message:t,anchor:a,canSendNow:c,canReschedule:s,canReply:l,canEdit:o,canPin:i,canUnpin:d,canDelete:u,canForward:h,canFaveSticker:b,canUnfaveSticker:g,canCopy:p,canCopyLink:v,canSelect:E,onReply:O,onEdit:f,onPin:C,onUnpin:y,onForward:k,onDelete:N,onFaveSticker:I,onUnfaveSticker:S,onSelect:w,onSend:P,onReschedule:M,onClose:L,onCloseAnimationEnd:A,onCopyLink:T})=>{Object(n.n)(()=>{Object(j.b)(200)},[e]);const R=function(e,t,a){const n=[],c=Object(m.O)(e),s=Object(m.G)(e),l=Object(m.D)(e,"inline"),o=s&&l&&kn.a,i=window.getSelection();if(o&&n.push({label:"lng_context_copy_image",handler:()=>{yn.b(l,r.ApiMediaFormat.BlobUrl).then(kn.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:Nn(e,o),handler:()=>{const a=e&&i?i.toString():c;Object(kn.c)(a),t&&t()}})}return a&&n.push({label:"lng_context_copy_message_link",handler:()=>{a(),t&&t()}}),n}(t,L,v?T:void 0),D=Object(n.m)(()=>document.querySelector(`.active > .MessageList div[data-message-id="${t.id}"]`),[t.id]),B=Object(n.m)(()=>document.querySelector(".active > .MessageList"),[]),x=Object(n.m)(()=>document.querySelector(".MessageContextMenu .bubble"),[]),{positionX:U,positionY:G,style:q}=Object(In.a)(a,D,B,x,10,document.querySelector(".MiddleHeader").offsetHeight),$=Object(F.a)();return n.a.createElement(Sn.a,{isOpen:e,positionX:U,positionY:G,style:q,className:"MessageContextMenu fluid",onClose:L,onCloseAnimationEnd:A},c&&n.a.createElement(z.a,{icon:"send-outline",onClick:P},$("MessageScheduleSend")),s&&n.a.createElement(z.a,{icon:"schedule",onClick:M},$("MessageScheduleEditTime")),l&&n.a.createElement(z.a,{icon:"reply",onClick:O},$("Reply")),o&&n.a.createElement(z.a,{icon:"edit",onClick:f},$("Edit")),b&&n.a.createElement(z.a,{icon:"favorite",onClick:I},$("AddToFavorites")),g&&n.a.createElement(z.a,{icon:"favorite",onClick:S},$("Stickers.RemoveFromFavorites")),p&&R.map(e=>n.a.createElement(z.a,{key:e.label,icon:"copy",onClick:e.handler},$(e.label))),i&&n.a.createElement(z.a,{icon:"pin",onClick:C},$("DialogPin")),d&&n.a.createElement(z.a,{icon:"unpin",onClick:y},$("DialogUnpin")),h&&n.a.createElement(z.a,{icon:"forward",onClick:k},$("Forward")),E&&n.a.createElement(z.a,{icon:"select",onClick:w},$("Common.Select")),u&&n.a.createElement(z.a,{destructive:!0,icon:"delete",onClick:N},$("Delete")))};var Pn=Object(n.h)(Object(c.h)((e,{message:t,messageListType:a})=>{const{threadId:n}=Object(d.y)(e)||{},{noOptions:c,canReply:r,canPin:s,canUnpin:l,canDelete:o,canEdit:i,canForward:m,canFaveSticker:u,canUnfaveSticker:h,canCopy:b,canCopyLink:g,canSelect:p}=n&&Object(d.b)(e,t,n)||{},v="pinned"===a,E="scheduled"===a;return{noOptions:c,canSendNow:E,canReschedule:E,canReply:!v&&!E&&r,canPin:!E&&s,canUnpin:!E&&l,canDelete:o,canEdit:!v&&i,canForward:!E&&m,canFaveSticker:!E&&u,canUnfaveSticker:!E&&h,canCopy:b,canCopyLink:!E&&g,canSelect:p}},(e,t)=>Object(u.l)(t,["setReplyingToId","setEditingId","pinMessage","openForwardMenu","faveSticker","unfaveSticker","toggleMessageSelection","sendScheduledMessages","rescheduleMessage","loadMessageLink"]))(({isOpen:e,messageListType:t,message:a,album:c,anchor:r,onClose:s,onCloseAnimationEnd:l,noOptions:o,canSendNow:i,canReschedule:d,canReply:m,canPin:u,canUnpin:h,canDelete:b,canEdit:g,canForward:p,canFaveSticker:v,canUnfaveSticker:E,canCopy:O,canCopyLink:f,canSelect:j,setReplyingToId:C,setEditingId:y,pinMessage:k,openForwardMenu:N,faveSticker:I,unfaveSticker:S,toggleMessageSelection:w,sendScheduledMessages:P,rescheduleMessage:M,loadMessageLink:F})=>{const{transitionClassNames:L}=Object(W.a)(e,l,void 0,!1),[A,T]=Object(n.r)(!0),[R,B]=Object(n.r)(!1),[x,U]=Object(n.r)(!1),[G,q,z]=Object(Be.a)(),$=Object(n.m)(()=>{T(!1),B(!0)},[]),H=Object(n.m)(()=>{T(!1),s()},[s]),_=Object(n.m)(()=>{B(!1),s()},[s]),V=Object(n.m)(()=>{U(!1),s()},[s]),K=Object(n.m)(()=>{z(),s()},[z,s]),Y=Object(n.m)(()=>{C({messageId:a.id}),H()},[C,a.id,H]),Z=Object(n.m)(()=>{y({messageId:a.id}),H()},[y,a.id,H]),Q=Object(n.m)(()=>{T(!1),U(!0)},[]),X=Object(n.m)(()=>{k({messageId:a.id,isUnpin:!0}),H()},[k,a.id,H]),J=Object(n.m)(()=>{if(H(),c&&c.messages){const e=c.messages.map(({id:e})=>e);N({fromChatId:a.chatId,messageIds:e})}else N({fromChatId:a.chatId,messageIds:[a.id]})},[N,a,H,c]),ee=Object(n.m)(()=>{H(),I({sticker:a.content.sticker})},[H,a.content.sticker,I]),te=Object(n.m)(()=>{H(),S({sticker:a.content.sticker})},[H,a.content.sticker,S]),ae=Object(n.m)(()=>{const e=c&&c.messages?{messageId:a.id,childMessageIds:c.messages.map(({id:e})=>e),withShift:!1}:{messageId:a.id,withShift:!1};w(e),H()},[H,a.id,w,c]),ne=Object(n.m)(()=>{P({chatId:a.chatId,id:a.id}),H()},[H,a.chatId,a.id,P]),ce=Object(n.m)(()=>{T(!1),q()},[q]),re=Object(n.m)(e=>{M({chatId:a.chatId,messageId:a.id,scheduledAt:Math.round(e.getTime()/1e3)})},[a.chatId,a.id,M]),se=Object(n.m)(()=>{F({messageId:a.id,chatId:a.chatId}),H()},[H,F,a.chatId,a.id]);if(Object(n.n)(()=>(jn(),Cn),[]),o)return void H();const le=new Date;return le.setFullYear(le.getFullYear()+1),n.a.createElement("div",{className:["ContextMenuContainer",L].join(" ")},n.a.createElement(wn,{message:a,isOpen:A,anchor:r,canSendNow:i,canReschedule:d,canReply:m,canDelete:b,canPin:u,canUnpin:h,canEdit:g,canForward:p,canFaveSticker:v,canUnfaveSticker:E,canCopy:O,canCopyLink:f,canSelect:j,onReply:Y,onEdit:Z,onPin:Q,onUnpin:X,onForward:J,onDelete:$,onFaveSticker:ee,onUnfaveSticker:te,onSelect:ae,onSend:ne,onReschedule:ce,onClose:H,onCopyLink:se}),n.a.createElement(Te,{isOpen:R,isSchedule:"scheduled"===t,onClose:_,album:c,message:a}),n.a.createElement(Re,{isOpen:x,messageId:a.id,chatId:a.chatId,onClose:V}),n.a.createElement(Ae,{isOpen:G,withTimePicker:!0,selectedAt:1e3*a.date,maxAt:Object(D.k)(le),isFutureMode:!0,onClose:K,onSubmit:re}))}));a(280);var Mn=Object(n.h)(Object(c.h)((e,{fromSticker:t})=>({stickerSet:Object(d.wb)(e,t.stickerSetId)}),(e,t)=>Object(u.l)(t,["loadStickers","toggleStickerSet","sendMessage"]))(({isOpen:e,fromSticker:t,stickerSet:a,onClose:c,loadStickers:r,toggleStickerSet:s,sendMessage:o})=>{const i=Object(n.q)(null),d=Object(F.a)(),{observe:m}=Object(ra.a)({rootRef:i,throttleMs:200,isDisabled:!e});Object(n.n)(()=>{if(e){const{stickerSetId:e,stickerSetAccessHash:a}=t;r({stickerSetId:e,stickerSetAccessHash:a})}},[e,t,r]);const u=Object(n.m)(e=>{e={...e,isPreloadedGlobally:!0},o({sticker:e}),c()},[c,o]),h=Object(n.m)(()=>{s({stickerSetId:t.stickerSetId}),c()},[t.stickerSetId,c,s]);return n.a.createElement(ge.a,{className:"StickerSetModal",isOpen:e,onClose:c,hasCloseButton:!0,title:a?a.title: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(ua,{sticker:e,size:l.xb,observeIntersection:m,onClick:u,clickArg:e}))),n.a.createElement("div",{className:"button-wrapper"},n.a.createElement(R.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(be.a,null))})),Fn=a(120);a(281);var Ln=Object(n.h)(Object(c.h)((e,{chatId:t})=>{const a=Object(d.f)(e,t);return!a||a.isRestricted?{}:{chat:a,isMuted:a.isMuted,isPrivate:Object(m.lb)(a.id),canDeleteChat:Object(m.d)(a)}},(e,t)=>Object(u.l)(t,["updateChatMutedState","enterMessageSelectMode"]))(({chatId:e,isOpen:t,anchor:a,isChannel:c,canSubscribe:r,canSearch:s,canMute:l,canSelect:i,canLeave:d,chat:m,isPrivate:u,isMuted:h,canDeleteChat:b,onSubscribeChannel:g,onSearchClick:p,onClose:v,onCloseAnimationEnd:E,updateChatMutedState:O,enterMessageSelectMode:f})=>{const[j,C]=Object(n.r)(!0),[y,k]=Object(n.r)(!1),{x:N,y:I}=a;Object(W.a)(t,E,void 0,!1);const S=Object(n.m)(()=>{C(!1),k(!0)},[]),w=Object(n.m)(()=>{C(!1),v()},[v]),P=Object(n.m)(()=>{k(!1),v()},[v]),M=Object(n.m)(()=>{O({chatId:e,isMuted:!h}),w()},[e,w,h,O]),L=Object(n.m)(()=>{g(),w()},[w,g]),A=Object(n.m)(()=>{p(),w()},[w,p]),T=Object(n.m)(()=>{f(),w()},[w,f]);Object(n.n)(()=>(jn(),Cn),[]);const R=Object(F.a)();return n.a.createElement(Fn.a,null,n.a.createElement("div",{className:"HeaderMenuContainer"},n.a.createElement(Sn.a,{isOpen:j,positionX:"right",style:`left: ${N}px;top: ${I}px;`,onClose:w},o.g&&r&&n.a.createElement(z.a,{icon:c?"channel":"group",onClick:L},R(c?"Subscribe":"Join Group")),o.g&&s&&n.a.createElement(z.a,{icon:"search",onClick:A},R("Search")),l&&n.a.createElement(z.a,{icon:h?"unmute":"mute",onClick:M},R(h?"ChatsUnmute":"ChatsMute")),i&&n.a.createElement(z.a,{icon:"select",onClick:T},R("ReportSelectMessages")),d&&n.a.createElement(z.a,{destructive:!0,icon:"delete",onClick:S},R(u?"Delete":b?"GroupInfo.DeleteAndExit":c?"LeaveChannel":"Group.LeaveGroup"))),m&&n.a.createElement(_e.a,{isOpen:y,onClose:P,chat:m})))})),An=a(152);a(282);const Tn=Object(_.a)(e=>e(),200,!1);var Rn=Object(n.h)(Object(c.h)(e=>{const t=Object(d.r)(e);if(!t)return{};const{query:a,results:n}=Object(d.A)(e)||{},{totalCount:c,foundIds:r}=n||{};return{chat:t,query:a,totalCount:c,foundIds:r}},(e,t)=>Object(u.l)(t,["setLocalTextSearchQuery","searchTextMessagesLocal","focusMessage","closeLocalTextSearch","searchMessagesByDate"]))(({isActive:e,chat:t,query:a,totalCount:c,foundIds:r,setLocalTextSearchQuery:s,searchTextMessagesLocal:l,focusMessage:o,closeLocalTextSearch:i,searchMessagesByDate:d})=>{const m=Object(n.q)(null),[u,h]=Object(n.r)(0),[b,g,p]=Object(Be.a)();Object(n.n)(()=>{const{visualViewport:e}=window;if(!e)return;const t=document.getElementById("Main"),a=()=>{const{activeElement:a}=document;if(a&&a===m.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&&r&&r.length?(o({chatId:t.id,messageId:r[r.length-1]}),h(0)):h(-1)},[t,o,r]),Object(n.n)(()=>{Array.from(document.querySelectorAll("input")).forEach(t=>{t.disabled=Boolean(e&&t!==m.current)}),Array.from(document.querySelectorAll("div[contenteditable]")).forEach(t=>{t.contentEditable=e?"false":"true"})},[e]),Object(n.n)(()=>{e||m.current.blur()},[e]),Object(n.o)(()=>{document.querySelector("#MobileSearch input").blur()},[b]);const v=Object(n.m)(e=>{s({query:e}),e.length&&Tn(l)},[l,s]),E=Object(n.m)(e=>{d({timestamp:e.valueOf()/1e3}),p()},[p,d]),O=Object(n.m)(()=>{if(t&&r){const e=u+1;o({chatId:t.id,messageId:r[r.length-1-e]}),h(e)}},[t,u,o,r]),f=Object(n.m)(()=>{if(t&&r){const e=u-1;o({chatId:t.id,messageId:r[r.length-1-e]}),h(e)}},[t,u,o,r]),j=Object(F.a)();return n.a.createElement("div",{id:"MobileSearch",className:e?"active":""},n.a.createElement("div",{className:"header"},n.a.createElement(R.a,{size:"smaller",round:!0,color:"translucent",onClick:()=>i({noPushState:!0})},n.a.createElement("i",{className:"icon-arrow-left"})),n.a.createElement(An.a,{ref:m,value:a,onChange:v})),n.a.createElement("div",{className:"footer"},n.a.createElement("div",{className:"counter"},a?r&&r.length?`${u+1} of ${c}`:r&&!r.length?"No results":"":n.a.createElement(R.a,{round:!0,size:"smaller",color:"translucent",onClick:g,ariaLabel:"Search messages by date"},n.a.createElement("i",{className:"icon-calendar"}))),n.a.createElement(R.a,{round:!0,size:"smaller",color:"translucent",onClick:O,disabled:!r||!r.length||u===r.length-1},n.a.createElement("i",{className:"icon-up"})),n.a.createElement(R.a,{round:!0,size:"smaller",color:"translucent",onClick:f,disabled:!r||!r.length||0===u},n.a.createElement("i",{className:"icon-down"}))),n.a.createElement(Ae,{isOpen:b,isPastMode:!0,submitButtonLabel:j("JumpToDate"),onClose:p,onSubmit:E}))})),Dn=a(58),Bn=a(188),xn=a(180),Un=a(177),Gn=a(182);function qn(e,t,a=0,n=!1,c=!1,r=!1){const s=e[r?"scrollLeft":"scrollTop"],l=s+e[r?"offsetWidth":"offsetHeight"],o="string"==typeof t?e.querySelectorAll(t):t,{length:i}=o,d=[];let m=!1;for(let e=0;e=s-a&&u<=l+a:i<=l+a&&u>=s-a)d.push(e),m=!0;else if(m&&!n)break}return{allElements:o,visibleIndexes:d}}var zn=function(e,t,a=!1){const n=e[a?"scrollLeft":"scrollTop"],c=n+e[a?"offsetWidth":"offsetHeight"],r=t[a?"offsetLeft":"offsetTop"],s=r+t[a?"offsetWidth":"offsetHeight"];return r>n&&s{const l=Object(n.q)(null),{shouldRender:o,transitionClassNames:i}=Object(W.a)(e,void 0,void 0,!1),d=Object(n.m)(e=>{if(!s)return-1;const t=s.length;return Object(Hn.a)(t,e)},[s]),[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=r&&r[e];a&&c(a,t)},[r,c]),g=Object(n.m)(e=>{if(s&&s.length&&m>-1){const t=s[m];t&&(e.preventDefault(),b(t.userId,!0))}},[s,m,b]);Object(n.n)(()=>e?Object(xe.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)(()=>{s&&!s.length&&a()},[s,a]),Object(n.n)(()=>{u(0)},[t]),Object(n.n)(()=>{!function(e,t){const a=t.current;if(!a||e<0)return;const{visibleIndexes:n,allElements:c}=qn(a,".chat-item-clickable",8,!0,!0);if(!c.length||!c[e])return;const r=n[0];if(!n.includes(e)||e===r&&!zn(a,c[r])){const t=e>n[n.length-1]?"start":"end";Object($n.a)(a,c[e],t,10)}}(m,l)},[m]);const p=Object(f.a)(s&&s.length?s:void 0,o),v=s&&!s.length?p:s;if(!o||v&&!v.length)return;const E=Object(ce.a)("MentionTooltip composer-tooltip custom-scroll",i);return n.a.createElement("div",{className:E,ref:l},v&&v.map(({userId:e},t)=>n.a.createElement(Ee.a,{key:e,className:"chat-item-clickable scroll-item",onClick:()=>b(e),focus:m===t},n.a.createElement(Oe.a,{userId:e,avatarSize:"small",withUsername:!0}))))}),Vn=a(181);a(284);var Wn=Object(n.h)(({attachments:e,caption:t,canSuggestMembers:a,groupChatMembers:c,currentUserId:r,usersById:s,recentEmojis:o,onCaptionUpdate:i,addRecentEmoji:d,onSend:m,onFileAppend:u,onClear:h})=>{const g=Object(n.q)(null),p=Object(f.a)(e),v=e.length?e:p,E=Boolean(e.length),[O,j,C]=Object(Be.a)(),y=v&&v.every(e=>e.quick),k=Object(F.a)(),{isMentionTooltipOpen:N,mentionFilter:I,closeMentionTooltip:S,insertMention:w,mentionFilteredMembers:P}=Object(Bn.a)(a&&E,t,i,l.w,c,r,s),{isEmojiTooltipOpen:M,closeEmojiTooltip:L,filteredEmojis:A,insertEmoji:T}=Object(xn.a)(E,t,o,l.w,i);Object(n.n)(()=>E?Object(b.a)(h):void 0,[E,h]);const D=Object(n.m)(()=>{E&&m()},[E,m]),B=Object(n.m)(e=>{e.preventDefault(),C();const{dataTransfer:{files:t}}=e;if(t&&t.length){const e=y?Array.from(t).filter(e=>e.type&&l.l.includes(e.type)):Array.from(t);u(e,!1)}},[y,u,C]);if(!v)return;const x=v.every(e=>e.mimeType.startsWith("image/")),U=v.every(e=>e.mimeType.startsWith("video/"));let G="";return G=k(x?"PreviewSender.SendPhoto":U?"PreviewSender.SendVideo":"PreviewSender.SendFile",v.length,"i"),n.a.createElement(ge.a,{isOpen:E,onClose:h,header:function(){if(v)return n.a.createElement("div",{className:"modal-header-condensed",dir:k.isRtl?"rtl":void 0},n.a.createElement(R.a,{round:!0,color:"translucent",size:"smaller",ariaLabel:"Cancel attachments",onClick:h},n.a.createElement("i",{className:"icon-close"})),n.a.createElement("div",{className:"modal-title"},G),n.a.createElement(R.a,{color:"primary",size:"smaller",className:"modal-action-button",onClick:D},k("Send")))}(),className:"AttachmentModal "+(O?"hovered":"")},n.a.createElement("div",{className:"drop-target",onDragEnter:j,onDrop:B,onDragOver:function(e){e.preventDefault(),e.stopPropagation(),g.current&&window.clearTimeout(g.current)},onDragLeave:e=>{const{relatedTarget:t,target:a}=e;a.matches(".drop-target")&&!t&&(g.current=window.setTimeout(C,150)),a&&a.closest(".AttachmentModal.hovered")||(t&&e.stopPropagation(),C())},"data-attach-description":k("Preview.Dragging.AddItems",10)},y?n.a.createElement("div",{className:"media-wrapper custom-scroll"},v.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"},v.map(e=>n.a.createElement(Un.a,{name:e.filename,extension:Object(Dn.d)(e.filename,e.mimeType),previewData:e.previewBlobUrl,size:e.size,smaller:!0}))),n.a.createElement("div",{className:"attachment-caption-wrapper"},n.a.createElement(_n,{isOpen:N,onClose:S,filter:I,onInsertUserName:w,filteredChatMembers:P,usersById:s}),n.a.createElement(Vn.a,{isOpen:M,emojis:A,onClose:L,onEmojiSelect:T,addRecentEmoji:d}),n.a.createElement(Gn.a,{id:"caption-input-text",html:t,editableInputId:l.w,placeholder:k("Caption"),onUpdate:i,onSend:m,shouldSetFocus:E}))))}),Kn=a(136);a(285);var Yn=Object(n.h)(({isOpen:e,onSend:t,onClear:a})=>{const c=Object(n.q)(null),r=Object(n.q)(null),s=Object(n.q)(null),[l,o]=Object(n.r)(""),[i,d]=Object(n.r)([""]),[m,u]=Object(n.r)(!0),[h,g]=Object(n.r)(!1),[p,v]=Object(n.r)(!1),[E,O]=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(b.a)(a):void 0,[e,a]),Object(n.n)(()=>{e||(o(""),d([""]),u(!0),g(!1),v(!1),O(""),j(""),y(!1))},[e]),Object(n.n)(()=>N(c),[N,e]),Object(n.o)(()=>{const e=s.current;e&&E!==e.innerHTML&&(e.innerHTML=E)},[E]);const I=Object(n.m)((e=[])=>{d([...e,""]),requestAnimationFrame(()=>{const e=r.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=l.trim().substring(0,255),n=i.map(e=>e.trim().substring(0,100)).filter(e=>e.length);if(!a||n.length<2)return o(a),n.length?n.length<2?I(n):d(n):I(),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},...h&&{multipleChoice:!0},...p&&{quiz:!0}}};if(p){const{text:e,entities:t}=E&&Object(Kn.a)(E.substring(0,200))||{};c.quiz={correctAnswers:[f],...e&&{solution:e},...t&&{solutionEntities:t}}}t(c)},[e,l,i,p,f,m,h,t,I,E]),w=Object(n.m)((e,t)=>{const a=[...i];a[e]=t,a[a.length-1].trim().length&&a.length<10?I(a):d(a)},[i,I]),P=Object(n.m)(e=>{const t=[...i];t.splice(e,1),d(t),requestAnimationFrame(()=>{r.current&&r.current.classList.toggle("overflown",r.current.scrollHeight>320)})},[i]),M=Object(n.m)(e=>{j(e)},[j]),L=Object(n.m)(e=>{u(e.target.checked)},[]),A=Object(n.m)(e=>{g(e.target.checked)},[]),T=Object(n.m)(e=>{v(e.target.checked)},[]),D=Object(n.m)(e=>{13===e.keyCode&&S()},[S]),B=Object(n.m)(()=>{if(C&&!l.trim().length)return k("lng_polls_choose_question")},[C,k,l]),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(pe.a,{label:t!==i.length-1||10===i.length?k("OptionHint"):k("CreatePoll.AddOption"),error:x(t),value:e,onChange:e=>w(t,e.currentTarget.value),onKeyPress:D}),t!==i.length-1&&n.a.createElement(R.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(ge.a,{isOpen:e,onClose:a,header:n.a.createElement("div",{className:"modal-header-condensed"},n.a.createElement(R.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(R.a,{color:"primary",size:"smaller",className:"modal-action-button",onClick:S},k("Create"))),className:"PollModal"},n.a.createElement(pe.a,{ref:c,label:k("AskAQuestion"),value:l,error:B(),onChange:e=>o(e.currentTarget.value),onKeyPress:D}),n.a.createElement("div",{className:"options-divider"}),n.a.createElement("div",{className:"options-list custom-scroll",ref:r},n.a.createElement("h3",{className:"options-header"},"Options"),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(la.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(ta.a,{label:k("PollAnonymous"),checked:m,onChange:L}),n.a.createElement(ta.a,{label:k("PollMultiple"),checked:h,disabled:p,onChange:A}),n.a.createElement(ta.a,{label:k("PollQuiz"),checked:p,disabled:h,onChange:T}),p&&n.a.createElement(n.a.Fragment,null,n.a.createElement("h3",{className:"options-header"},"Solution"),n.a.createElement("div",{ref:s,className:"form-control",contentEditable:!0,dir:"auto",onChange:e=>O(e.currentTarget.innerHTML)}),n.a.createElement("div",{className:"note"},k("CreatePoll.ExplanationInfo")))))});let Zn;function Qn(e,t,a=250){const c=Object(n.q)(!1);Object(n.n)(()=>{Zn&&(clearTimeout(Zn),Zn=void 0),e&&!o.l&&(Zn=window.setTimeout(()=>{c.current||t()},2*a))},[e,a,t]);return[Object(n.m)(()=>{c.current=!0},[]),Object(n.m)(()=>{c.current=!1,Zn&&(clearTimeout(Zn),Zn=void 0),Zn=window.setTimeout(()=>{c.current||t()},a)},[a,t])]}var Xn=a(64),Jn=a(140);a(286);var ec=Object(n.h)(({emoji:e,focus:t,onClick:a})=>{const c=Object(n.m)(()=>{a(e.native,e.id)},[e,a]);return n.a.createElement("div",{className:"EmojiButton "+(t?"focus":""),onClick:c,title:`:${e.names[0]}:`},o.d?n.a.createElement("span",{className:"font-emoji"},e.native):n.a.createElement("img",{src:`./img-apple-64/${e.image}.png`,alt:"",loading:"lazy"}))});var tc=Object(n.h)(({category:e,index:t,allEmojis:a,observeIntersection:c,shouldRender:r,onEmojiSelect:s})=>{const l=Object(n.q)(null);Object(ra.c)(l,c);const{transitionClassNames:i}=Object(W.a)(r,void 0,void 0,"slow"),d=Object(F.a)(),m=o.g?Math.floor((y.a.get().width-8)/44):9,u=44*Math.ceil(e.emojis.length/m);return n.a.createElement("div",{ref:l,key:e.id,id:"emoji-category-"+t,className:"symbol-set"},n.a.createElement("p",{className:"symbol-set-name",dir:"auto"},d("recent"===e.id?"RecentStickers":"Emoji"+t)),n.a.createElement("div",{className:Object(ce.a)("symbol-set-container",i),style:`height: ${u}px;`,dir:d.isRtl?"rtl":void 0},r&&e.emojis.map(e=>{const t=a[e],c="id"in t?t:t[1];return n.a.createElement(ec,{key:c.id,emoji:c,onClick:s})})))});a(287);const ac={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"},nc=[];let cc,rc,sc;var lc=Object(n.h)(Object(c.h)(e=>Object(u.l)(e,["recentEmojis"]))(({className:e,onEmojiSelect:t,recentEmojis:c})=>{const r=Object(n.q)(null),s=Object(n.q)(null),[i,d]=Object(n.r)(),[m,u]=Object(n.r)(),[h,b]=Object(n.r)(0),{observe:g}=Object(ra.a)({rootRef:r,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-",""));nc[a]=e.isIntersecting});const t=nc.map((e,t)=>({index:t,isIntersecting:e})).filter(({isIntersecting:e})=>e);t.length&&b(t[Math.floor(t.length/2)].index)});Object(We.a)(s,!o.g),Object(n.n)(()=>{if(!i)return;const e=s.current;if(!e)return;const t=42*h-e.offsetWidth/2+21;Object(Jn.a)(e,t)},[i,h]);const p=Object(F.a)(),v=Object(n.p)(()=>{if(!i)return ze.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(sc.categories),u(sc.emojis)};sc?e():async function(){cc||(cc=a.e(1).then(a.t.bind(null,313,3)),rc=(await cc).default,sc=Object(Xn.b)(rc));return cc}().then(e)},200)},[]);const E=Object(n.m)(e=>{b(e);const t=document.getElementById("emoji-category-"+e);Object($n.a)(r.current,t,"start",50,800)},[]),O=Object(n.m)((e,a)=>{t(e,a)},[t]),f=Object(lt.a)([],l.U);const j=Object(ce.a)("EmojiPicker",e);return m&&f?n.a.createElement("div",{className:j},n.a.createElement("div",{ref:s,className:"EmojiPicker-header",dir:p.isRtl?"rtl":""},v.map((function(e,t){const a=ac[e.id];return a&&n.a.createElement(R.a,{className:"symbol-set-button "+(t===h?"activated":""),round:!0,faded:!0,color:"translucent",onClick:()=>E(t),ariaLabel:e.name},n.a.createElement("i",{className:a}))}))),n.a.createElement("div",{ref:r,className:"EmojiPicker-main no-selection no-scrollbar"},v.map((e,t)=>n.a.createElement(tc,{category:e,index:t,allEmojis:m,observeIntersection:g,shouldRender:h>=t-1&&h<=t+1,onEmojiSelect:O})))):n.a.createElement("div",{className:j},n.a.createElement(be.a,null))}));const oc=o.g?8:16;var ic=Object(n.h)(({stickerSet:e,loadAndPlay:t,index:a,observeIntersection:c,shouldRender:r,onStickerSelect:s,onStickerUnfave:i})=>{const d=Object(n.q)(null);Object(ra.c)(d,c);const{transitionClassNames:m}=Object(W.a)(r,void 0,void 0,"slow"),u=o.g?Math.floor((y.a.get().width-8)/(l.yb+oc)):5,h=Math.ceil(e.count/u)*(l.yb+oc);return n.a.createElement("div",{ref:d,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(ce.a)("symbol-set-container",m),style:`height: ${h}px;`},r&&e.stickers&&e.stickers.map(a=>n.a.createElement(ua,{key:a.id,sticker:a,size:l.yb,observeIntersection:c,noAnimate:!t,onClick:s,clickArg:a,onUnfaveClick:"favorite"===e.id?i:void 0}))))});a(288);const dc=[];var mc=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(u.l)(t,["loadStickerSets","loadRecentStickers","loadFavoriteStickers","loadAddedStickers","addRecentSticker","unfaveSticker"]))(({className:e,loadAndPlay:t,canSendStickers:a,recentStickers:c,favoriteStickers:r,addedSetIds:s,stickerSetsById:o,shouldPlay:i,onStickerSelect:d,loadStickerSets:m,loadRecentStickers:u,loadFavoriteStickers:h,loadAddedStickers:b,addRecentSticker:g,unfaveSticker:p})=>{const v=Object(n.q)(null),E=Object(n.q)(null),[O,f]=Object(n.r)(0),{observe:j}=Object(ra.a)({rootRef:v,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-",""));dc[a]=e.isIntersecting});const t=dc.map((e,t)=>({index:t,isIntersecting:e})).filter(({isIntersecting:e})=>e);t.length&&f(t[Math.floor(t.length/2)].index)}),{observe:C}=Object(ra.a)({rootRef:E}),y=Object(F.a)(),k=Boolean(s),N=Object(n.p)(()=>s?[{id:"recent",title:y("RecentStickers"),stickers:c,count:c.length},{id:"favorite",title:y("FavoriteStickers"),stickers:r,count:r.length},...s.map(e=>o[e]).filter(Boolean)]:ze.a,[s,y,c,r,o]),I=Object(n.p)(()=>k&&0===N.filter(e=>e.stickers&&e.stickers.length).length,[N,k]);Object(n.n)(()=>{t&&(m(),u(),h())},[t,h,u,m]),Object(n.n)(()=>{s&&s.length&&b()},[s,b]),Object(We.a)(E),Object(n.n)(()=>{if(!k)return;const e=E.current;if(!e)return;const t=52*O-(e.offsetWidth/2-26);Object(Jn.a)(e,t)},[k,O]);const S=Object(n.m)(e=>{f(e);const t=document.getElementById("sticker-set-"+e);Object($n.a)(v.current,t,"start",void 0,500)},[]),w=Object(n.m)(e=>{d(e),g({sticker:e})},[g,d]),P=Object(n.m)(e=>{p({sticker:e})},[p]),M=Object(lt.a)([],l.pb);const L=Object(ce.a)("StickerPicker",e);return k&&M&&!I&&a?n.a.createElement("div",{className:L},n.a.createElement("div",{ref:E,className:"StickerPicker-header no-selection no-scrollbar"},N.map((function(e,t){const a=e.stickers&&e.stickers[0],c=Object(ce.a)("symbol-set-button sticker-set-button",t===O&&"activated");return"recent"===e.id||"favorite"===e.id||e.hasThumbnail||!a?n.a.createElement(R.a,{key:e.id,className:c,ariaLabel:e.title,round:!0,faded:"recent"===e.id||"favorite"===e.id,color:"translucent",onClick:()=>S(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(da,{stickerSet:e,observeIntersection:C}):n.a.createElement(ma,{stickerSet:e,observeIntersection:C})):n.a.createElement(ua,{key:e.id,sticker:a,size:l.zb,title:e.title,className:c,observeIntersection:C,onClick:S,clickArg:t})}))),n.a.createElement("div",{ref:v,className:"StickerPicker-main no-scrollbar"},N.map((e,a)=>n.a.createElement(ic,{key:e.id,stickerSet:e,loadAndPlay:Boolean(i&&t),index:a,observeIntersection:j,shouldRender:O>=a-1&&O<=a+1,onStickerSelect:w,onStickerUnfave:P})))):n.a.createElement("div",{className:L},a?I?n.a.createElement("div",{className:"picker-disabled"},"You have no saved Stickers."):n.a.createElement(be.a,null):n.a.createElement("div",{className:"picker-disabled"},"Sending stickers is not allowed in this chat."))}));a(289);function uc(){return(uc=Object.assign||function(e){for(var t=1;t{const s=Object(n.q)(null),l=Object(n.q)(null),o=e.thumbnail&&!!e.thumbnail.dataUri,i="gif"+e.id,d=Object(ra.b)(s,t)&&!a,m=Object(v.a)(i+"?size=m",!d,r.ApiMediaFormat.BlobUrl),u=Object(Ia.a)(e.thumbnail&&e.thumbnail.dataUri,Boolean(m)),h=Object(v.a)(i,!d,r.ApiMediaFormat.BlobUrl),b=Boolean(d&&h),{transitionClassNames:g}=Object(oa.a)(o||m||h,"slow"),{isBuffered:p,bufferingHandlers:E}=Object(K.a)(!0),O=d&&!p;Object(Z.a)(l,[b]);const f=Object(n.m)(()=>c({...e,blobUrl:h}),[c,e,h]),j=Object(ce.a)("GifButton",e.width&&e.height&&e.width({savedGifs:e.gifs.saved.gifs}),(e,t)=>Object(u.l)(t,["loadSavedGifs"]))(({className:e,loadAndPlay:t,canSendGifs:a,savedGifs:c,onGifSelect:r,loadSavedGifs:s})=>{const o=Object(n.q)(null),{observe:i}=Object(ra.a)({rootRef:o,debounceMs:300});Object(n.n)(()=>{t&&s()},[t,s]);const d=Object(lt.a)([],l.pb);return n.a.createElement("div",{ref:o,className:Object(ce.a)("GifPicker no-scrollbar",e)},a?d&&c&&c.length?c.map(e=>n.a.createElement(hc,{key:e.id,gif:e,observeIntersection:i,isDisabled:!t,onClick:r})):d&&c?n.a.createElement("div",{className:"picker-disabled"},"No saved GIFs."):n.a.createElement(be.a,null):n.a.createElement("div",{className:"picker-disabled"},"Sending GIFs is not allowed in this chat."))}));let gc;!function(e){e[e.Emoji=0]="Emoji",e[e.Stickers=1]="Stickers",e[e.GIFs=2]="GIFs"}(gc||(gc={}));const pc=Object.values(gc).filter(e=>"string"==typeof e),vc={[gc.Emoji]:"icon-smile",[gc.Stickers]:"icon-stickers",[gc.GIFs]:"icon-gifs"};var Ec=Object(n.h)(({activeTab:e,onSwitchTab:t,onRemoveSymbol:a,onSearchOpen:c})=>{const r=Object(F.a)();function s(a){return n.a.createElement(R.a,{className:"symbol-tab-button "+(e===a?"activated":""),onClick:()=>t(a),ariaLabel:pc[a],round:!0,faded:!0,color:"translucent"},n.a.createElement("i",{className:vc[a]}))}const l=Object(n.m)(()=>{c(e===gc.Stickers?"stickers":"gifs")},[e,c]);return n.a.createElement("div",{className:"SymbolMenu-footer",onClick:function(e){e.stopPropagation()},dir:r.isRtl?"rtl":void 0},e!==gc.Emoji&&n.a.createElement(R.a,{className:"symbol-search-button",ariaLabel:e===gc.Stickers?"Search Stickers":"Search GIFs",round:!0,faded:!0,color:"translucent",onClick:l},n.a.createElement("i",{className:"icon-search"})),s(gc.Emoji),s(gc.Stickers),s(gc.GIFs),e===gc.Emoji&&n.a.createElement(R.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(291);let Oc=!1;var fc=Object(n.h)(({isOpen:e,allowedAttachmentOptions:t,onLoad:a,onClose:c,onEmojiSelect:r,onStickerSelect:s,onGifSelect:l,onRemoveSymbol:i,onSearchOpen:d,addRecentEmoji:m})=>{const[u,h]=Object(n.r)(0),[b,g]=Object(n.r)([]),[p,v]=Qn(e,c),{shouldRender:E,transitionClassNames:O}=Object(W.a)(e,c,!1,!1);!Oc&&e&&(Oc=!0),Object(n.n)(()=>{a()},[a]),Object(n.o)(()=>{if(o.g)return e&&(document.body.classList.add("enable-symbol-menu-transforms"),document.body.classList.add("is-symbol-menu-open")),()=>{e&&Object(_.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)(b);f.current=b,Object(n.n)(()=>{f.current.length&&(f.current.forEach(e=>{m({emoji:e})}),g([]))},[e,u,m]);const j=Object(n.m)((e,t)=>{g(e=>[...e,t]),r(e)},[r]),C=Object(n.m)(e=>{c(),d(e)},[c,d]),y=Object(F.a)(),{canSendStickers:k,canSendGifs:N}=t;function I(t,a){switch(u){case gc.Emoji:return n.a.createElement(lc,{className:"picker-tab",onEmojiSelect:j});case gc.Stickers:return n.a.createElement(mc,{className:"picker-tab",loadAndPlay:!!k&&(e&&(t||a)),canSendStickers:k,onStickerSelect:s});case gc.GIFs:return n.a.createElement(bc,{className:"picker-tab",loadAndPlay:!!N&&(e&&(t||a)),canSendGifs:N,onGifSelect:l})}}const S=n.a.createElement(n.a.Fragment,null,n.a.createElement("div",{className:"SymbolMenu-main",onClick:function(e){e.stopPropagation()}},Oc&&n.a.createElement(T.b,{name:"slide",activeKey:u,renderCount:pc.length},I)),o.g&&n.a.createElement(R.a,{round:!0,faded:!0,color:"translucent",ariaLabel:y("Close"),className:"symbol-close-button",size:"tiny",onClick:c},n.a.createElement("i",{className:"icon-close"})),n.a.createElement(Ec,{activeTab:u,onSwitchTab:h,onRemoveSymbol:i,onSearchOpen:C}));if(o.g){if(!E)return;const e=Object(ce.a)("SymbolMenu mobile-menu",O);return n.a.createElement(Fn.a,null,n.a.createElement("div",{className:e},S))}return n.a.createElement(Sn.a,{isOpen:e,positionX:"left",positionY:"bottom",onClose:c,className:"SymbolMenu",onCloseAnimationEnd:c,onMouseEnter:o.l?void 0:p,onMouseLeave:o.l?void 0:v,noCloseOnBackdrop:!o.l},S)});a(292);var jc=Object(n.h)(({isOpen:e,allowedAttachmentOptions:t,onFileSelect:a,onPollCreate:c,onClose:r})=>{const[s,i]=Qn(e,r),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)(()=>{Ea(l.l,e=>d(e,!0))},[d]),u=Object(n.m)(()=>{Ea("*",e=>d(e,!1))},[d]),h=Object(F.a)(),{canAttachMedia:b,canAttachPolls:g}=t;return n.a.createElement(Sn.a,{isOpen:e,autoClose:!0,positionX:"right",positionY:"bottom",onClose:r,className:"AttachMenu fluid",onCloseAnimationEnd:r,onMouseEnter:o.l?void 0:s,onMouseLeave:o.l?void 0:i,noCloseOnBackdrop:!o.l},!b&&n.a.createElement(z.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(z.a,{icon:"photo",onClick:m},h("AttachmentMenu.PhotoOrVideo")),n.a.createElement(z.a,{icon:"document",onClick:u},h("AttachDocument"))),g&&n.a.createElement(z.a,{icon:"poll",onClick:c},h("Poll")))});a(293);var Cc=Object(n.h)(Object(c.h)(e=>{const{stickers:t}=e.stickers.forEmoji;return{stickers:t}},(e,t)=>Object(u.l)(t,["clearStickersForEmoji"]))(({isOpen:e,onStickerSelect:t,stickers:a,clearStickersForEmoji:c})=>{const r=Object(n.q)(null),{shouldRender:s,transitionClassNames:i}=Object(W.a)(e,void 0,void 0,!1),d=Object(f.a)(a,!0),m=a||d,{observe:u}=Object(ra.a)({rootRef:r,throttleMs:200});Object(n.n)(()=>e?Object(b.a)(c):void 0,[e,c]);const h=Object(ce.a)("StickerTooltip composer-tooltip custom-scroll",i,!(m&&m.length)&&"hidden");return n.a.createElement("div",{ref:r,className:h,onMouseEnter:o.l?void 0:()=>{document.body.classList.add("no-select")},onMouseLeave:o.l?void 0:()=>{document.body.classList.remove("no-select")}},s&&m?m.map(e=>n.a.createElement(ua,{key:e.id,sticker:e,size:l.yb,observeIntersection:u,onClick:t,clickArg:e})):s?n.a.createElement(be.a,null):void 0)}));a(294);var yc=Object(n.h)(Object(c.h)((e,{messageId:t})=>{const{chatId:a}=Object(d.y)(e)||{};return a?{message:Object(d.k)(e,a,t)}:{}},(e,t)=>Object(u.l)(t,["clickInlineButton"]))(({isOpen:e,message:t,onClose:a,clickInlineButton:c})=>{const[r,s]=Qn(e,a);if(t&&t.keyboardButtons)return n.a.createElement(Sn.a,{isOpen:e,autoClose:!0,positionX:"right",positionY:"bottom",onClose:a,className:"KeyboardMenu",onCloseAnimationEnd:a,onMouseEnter:o.l?void 0:r,onMouseLeave:o.l?void 0:s,noCloseOnBackdrop:!o.l},n.a.createElement("div",{className:"content"},t.keyboardButtons.map(e=>n.a.createElement("div",{className:"row"},e.map(e=>n.a.createElement(R.a,{ripple:!0,disabled:"NOT_SUPPORTED"===e.type,onClick:()=>c({button:e})},e.text))))))}));a(295);var kc=Object(n.h)(({isOpen:e,onSilentSend:t,onScheduleSend:a,onClose:c,onCloseAnimationEnd:r})=>{const[s,l]=Qn(e,c),i=Object(F.a)();return n.a.createElement(Sn.a,{isOpen:e,autoClose:!0,positionX:"right",positionY:"bottom",className:"CustomSendMenu",onClose:c,onCloseAnimationEnd:r,onMouseEnter:o.l?void 0:s,onMouseLeave:o.l?void 0:l,noCloseOnBackdrop:!o.l},t&&n.a.createElement(z.a,{icon:"mute",onClick:t},i("SendWithoutSound")),a&&n.a.createElement(z.a,{icon:"schedule",onClick:a},i("ScheduleMessage")))}),Nc=a(137),Ic=a(162),Sc=a(173);a(296);var wc=Object(n.h)(({isOpen:e,emojis:t,onClose:a,onEmojiSelect:c,addRecentEmoji:r})=>{const s=Object(n.q)(null),{shouldRender:l,transitionClassNames:i}=Object(W.a)(e,void 0,void 0,!1),d=Object(Sc.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}=qn(a,".EmojiButton",8,!0,!0,!0);if(!c.length||!c[e])return;const r=n[0];if(!n.includes(e)||e===r&&!zn(a,c[r],!0)){const t="start"===(e>n[n.length-1]?"start":"end")?44*e:0;Object(Jn.a)(a,t)}}(m,s)},[m]);const h=Object(n.m)(e=>{if(!t.length)return-1;const a=t.length;return Object(Hn.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(),c(a.native),r({emoji:a.id}))}},[r,t,c,m]);Object(n.n)(()=>e?Object(xe.a)({onEsc:a,onLeft:e=>b(-1,e),onRight:e=>b(1,e),onEnter:g}):void 0,[b,g,e,a]);const p=Object(ce.a)("EmojiTooltip composer-tooltip custom-scroll-x",i);return n.a.createElement("div",{ref:s,className:p,onMouseEnter:o.l?void 0:()=>{document.body.classList.add("no-select")},onMouseLeave:o.l?void 0:()=>{document.body.classList.remove("no-select")}},l&&d?d.map((e,t)=>n.a.createElement(ec,{key:e.id,emoji:e,focus:m===t,onClick:c})):l?n.a.createElement(be.a,null):void 0)}),Pc=a(169);a(297);var Mc=Object(n.h)(Object(c.h)((e,{chatId:t})=>{const a=Object(d.f)(e,t),n=a&&Object(d.m)(e,a.id);if(!a||!n)return{};const{query:c,results:r}=Object(d.A)(e)||{},{totalCount:s,foundIds:l}=r||{};return{chat:a,messagesById:n,query:c,totalCount:s,foundIds:l}},(e,t)=>Object(u.l)(t,["searchTextMessagesLocal","focusMessage"]))(({chatId:e,threadId:t,chat:a,messagesById:r,query:s,totalCount:l,foundIds:o,searchTextMessagesLocal:i,focusMessage:h})=>{const b=Object(F.a)(),g=Object(n.p)(()=>{if(!(s&&o&&o.length&&r))return ze.a;const n=o.map(n=>{const s=r[n];if(!s)return;const l=s.senderId?Object(d.Fb)(Object(c.e)(),s.senderId):void 0;let o;if(a&&Object(m.jb)(a))o=a;else if(s.forwardInfo){const{isChannelPost:e,fromChatId:t}=s.forwardInfo;o=e&&t?Object(d.f)(Object(c.e)(),t):void 0}else o=s.senderId?Object(d.f)(Object(c.e)(),s.senderId):void 0;return{message:s,senderUser:l,senderChat:o,onClick:()=>h({chatId:e,threadId:t,messageId:n})}}).filter(Boolean);return Object(u.k)(n,({message:e})=>e.date,"desc")},[e,t,h,o,a,r,s]),p=Object(n.q)(null),v=Object(he.a)(p,!0,e=>{g&&g[e]&&g[e].onClick()},".ListItem-button",!0);return n.a.createElement(ve.a,{className:"RightSearch custom-scroll",items:g,preloadBackwards:0,onLoadMore:i,noFastList:!0,onKeyDown:v,ref:p},n.a.createElement("p",{className:"helper-text",dir:"auto"},s?0!==l&&g.length?1===l?"1 message found":(g.length&&(l||g.length))+" messages found":b("lng_search_no_results"):b("lng_dlg_search_for_messages")),g.map(({message:e,senderUser:t,senderChat:a,onClick:c})=>{const r=a?Object(m.l)(b,a):Object(m.Z)(t),l=Object(m.N)(b,e);return n.a.createElement(Ee.a,{className:"chat-item-clickable search-result-message m-0",onClick:c},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"},r&&Object(B.a)(r)),n.a.createElement(Pc.a,{message:e})),n.a.createElement("div",{className:"subtitle",dir:"auto"},Object(B.a)(l,["emoji","highlight"],{highlight:s}))))}))})),Fc=a(39);var Lc=Object(n.h)(Object(c.h)((e,{stickerSetId:t})=>({set:Object(d.wb)(e,t),shouldPlay:Object(d.vb)(e)}),(e,t)=>Object(u.l)(t,["loadStickers","toggleStickerSet"]))(({stickerSetId:e,observeIntersection:t,set:a,shouldPlay:c,loadStickers:r,toggleStickerSet:s,isSomeModalOpen:o,onModalToggle:i})=>{const d=Object(F.a)(),m=a&&Boolean(a.installedDate),u=Boolean(a&&a.stickers),[h,b,g]=Object(Be.a)();Object(Fc.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&&r({stickerSetId:e})},[u,p.length,r,e]);const v=Object(n.m)(()=>{s({stickerSetId:e})},[s,e]);if(!a)return;const E=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(R.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"},!E&&n.a.createElement(L.a,null),E&&p.map(e=>n.a.createElement(ua,{sticker:e,size:l.Ab,observeIntersection:t,noAnimate:!c||h||o,onClick:b}))),E&&n.a.createElement(ba.a,{isOpen:h,fromSticker:p[0],onClose:g}))}));a(298);const Ac=Object(_.g)(e=>e(),6e4,!0);var Tc=Object(n.h)(Object(c.h)(e=>{const t=Object(d.z)(e),{query:a,resultIds:n}=t||{},{featured:c}=e.stickers;return{query:a,featuredIds:c.setIds,resultIds:n}},(e,t)=>Object(u.l)(t,["loadFeaturedStickers"]))(({query:e,featuredIds:t,resultIds:a,loadFeaturedStickers:c})=>{const r=Object(n.q)(null),s=Object(F.a)(),[l,o]=Object(n.r)(!1),{observe:i}=Object(ra.a)({rootRef:r,throttleMs:200});return Object(n.n)(()=>{Ac(()=>{c()})}),n.a.createElement("div",{ref:r,className:"StickerSearch custom-scroll",dir:s.isRtl?"rtl":void 0},function(){if(void 0!==e)return!e&&t?t.map(e=>n.a.createElement(Lc,{key:e,stickerSetId:e,observeIntersection:i,isSomeModalOpen:l,onModalToggle:o})):a?a.length?a.map(e=>n.a.createElement(Lc,{key:e,stickerSetId:e,observeIntersection:i,isSomeModalOpen:l,onModalToggle:o})):n.a.createElement("p",{className:"helper-text",dir:"auto"},"Nothing found."):n.a.createElement(be.a,null)}())}));a(299);var Rc=Object(n.h)(Object(c.h)(e=>{const t=Object(d.s)(e),{query:a,results:n}=t||{},{chatId:c}=Object(d.y)(e)||{},r=c?Object(d.f)(e,c):void 0;return{query:a,results:n,chat:r,isChatWithBot:r?Object(d.N)(e,r):void 0}},(e,t)=>Object(u.l)(t,["searchMoreGifs","sendMessage","setGifSearchQuery"]))(({query:e,results:t,chat:a,isChatWithBot:c,searchMoreGifs:r,sendMessage:s,setGifSearchQuery:l})=>{const i=Object(n.q)(null),{observe:d}=Object(ra.a)({rootRef:i,debounceMs:300}),{canSendGifs:u}=Object(m.c)(a,c),h=Object(n.m)(e=>{u&&s({gif:e}),o.l&&l({query:void 0})},[u,s,l]),b=Object(F.a)();const g=Boolean(void 0!==e&&t&&t.length);return n.a.createElement("div",{className:"GifSearch",dir:b.isRtl?"rtl":void 0},n.a.createElement(ve.a,{ref:i,className:Object(ce.a)("gif-container custom-scroll",g&&"grid"),items:t,itemSelector:".GifButton",preloadBackwards:96,noFastList:!0,onLoadMore:r},function(){if(void 0!==e)return t?t.length?t.map(e=>n.a.createElement(hc,{key:e.id,gif:e,observeIntersection:d,onClick:h})):n.a.createElement("p",{className:"helper-text",dir:"auto"},b("NoGIFsFound")):n.a.createElement(be.a,null)}()))}));a(300);var Dc=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(u.l)(t,["loadPollOptionResults","openChat","closePollResults"]))(({chat:e,message:t,answer:a,answerVote:c,totalVoters:r,voters:s,offset:l,loadPollOptionResults:o,openChat:i,closePollResults:d})=>{const m=Object(f.a)(c.votersCount),[u,h]=Object(n.r)(!0),b=Boolean(s),{option:g,text:p}=a,v=Object(F.a)();Object(n.n)(()=>{b&&m===c.votersCount||o({chat:e,messageId:t.id,option:g,offset:l,limit:4,shouldResetVoters:!0})},[c.votersCount,b]);const E=Object(n.m)(()=>{h(!0),o({chat:e,messageId:t.id,option:g,offset:l,limit:50})},[e,o,t.id,l,g]);Object(n.n)(()=>{h(!1)},[s]);const O=Object(n.m)(e=>{i({id:e}),d()},[d,i]);return n.a.createElement("div",{className:"PollAnswerResults"},n.a.createElement("div",{className:"poll-voters"},s?s.map(e=>n.a.createElement(Ee.a,{key:e,className:"chat-item-clickable",onClick:()=>O(e)},n.a.createElement(Oe.a,{avatarSize:"tiny",userId:e,forceShowSelf:!0,noStatusOrTyping:!0}))):n.a.createElement(be.a,null),s&&function(){const e=c.votersCount-s.length;return c.votersCount>4&&e>0&&n.a.createElement(Qt,{count:e,itemName:"voter",isLoading:u,onClick:E})}()),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=c.votersCount,(C=r)>0?(j/C*100).toFixed():0),"%")));var j,C}));a(301);var Bc=Object(n.h)(Object(c.h)(e=>{const{pollResults:{chatId:t,messageId:a},lastSyncTime:n}=e;if(!t||!a)return{};return{chat:Object(d.f)(e,t),message:Object(d.k)(e,t,a),lastSyncTime:n}})(({chat:e,message:t,lastSyncTime:a})=>{const c=Object(F.a)();if(!t||!e)return n.a.createElement(be.a,null);const{summary:r,results:s}=Object(m.H)(t);if(!s.results)return;const l=Object(u.c)(s.results,"option");return n.a.createElement("div",{className:"PollResults",dir:c.isRtl?"rtl":void 0},n.a.createElement("h3",{className:"poll-question",dir:"auto"},r.question),n.a.createElement("div",{className:"poll-results-list custom-scroll"},a&&r.answers.map(a=>n.a.createElement(Dc,{key:`${t.id}-${a.option}`,chat:e,message:t,answer:a,answerVote:l[a.option],totalVoters:s.totalVoters})),!a&&n.a.createElement(be.a,null)))}));a(164);var xc=Object(n.h)(Object(c.h)((e,{userId:t})=>{const a=Object(d.Fb)(e,t),n=Object(d.f)(e,t),{progress:c}=e.management;return{user:a,chat:n,progress:c}},(e,t)=>Object(u.l)(t,["updateContact","deleteUser","closeManagement","openChat","deleteHistory"]))(({userId:e,user:t,chat:a,progress:c,updateContact:r,deleteUser:l,deleteHistory:o,closeManagement:i,openChat:d})=>{const[m,u,h]=Object(Be.a)(),[b,g]=Object(n.r)(!1),[p,v]=Object(n.r)(),E=Object(F.a)(),O=t&&t.firstName||"",f=t&&t.lastName||"",j=a?a.isMuted:void 0,[C,y]=Object(n.r)(O),[k,N]=Object(n.r)(f),[I,S]=Object(n.r)(!j);Object(n.n)(()=>{S(!j)},[j]),Object(n.n)(()=>{g(!1),h()},[h,e]),Object(n.n)(()=>{y(O),N(f)},[O,f,t]),Object(n.n)(()=>{c===s.f.Complete&&(g(!1),v(void 0),h())},[h,c]);const w=Object(n.m)(e=>{y(e.target.value),g(!0)},[]),P=Object(n.m)(e=>{N(e.target.value),g(!0)},[]),M=Object(n.m)(e=>{S(e.target.checked),g(!0)},[]),A=Object(n.m)(()=>{const t=C.trim(),a=k.trim();t.length||v("Please provide first name"),r({userId:e,isMuted:!I,firstName:t,lastName:a})},[C,k,r,e,I]),T=Object(n.m)(()=>{a.lastMessage&&o({chatId:a.id,maxId:a.lastMessage.id,shouldDeleteForAll:!1}),l({userId:e}),h(),i(),d({id:void 0})},[a.id,a.lastMessage,h,i,o,l,d,e]);if(!t)return;const R=c===s.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(Oe.a,{userId:t.id,avatarSize:"jumbo",status:"original name",withFullInfo:!0}),n.a.createElement(pe.a,{id:"user-first-name",label:E("UserInfo.FirstNamePlaceholder"),onChange:w,value:C,error:"Please provide first name"===p?p:void 0}),n.a.createElement(pe.a,{id:"user-last-name",label:E("UserInfo.LastNamePlaceholder"),onChange:P,value:k}),n.a.createElement("div",{className:"ListItem no-selection narrow"},n.a.createElement(ta.a,{checked:I,label:E("Notifications"),subLabel:E(I?"UserInfo.NotificationsEnabled":"UserInfo.NotificationsDisabled"),onChange:M}))),n.a.createElement("div",{className:"section"},n.a.createElement(Ee.a,{icon:"delete",ripple:!0,destructive:!0,onClick:u},E("DeleteContact")))),n.a.createElement(Gt,{isShown:b,onClick:A,disabled:R,ariaLabel:E("Save")},R?n.a.createElement(L.a,{color:"white"}):n.a.createElement("i",{className:"icon-check"})),n.a.createElement(we.a,{isOpen:m,onClose:h,text:E("AreYouSureDeleteContact"),confirmLabel:E("DeleteContact"),confirmHandler:T,confirmIsDestructive:!0}))}));var Uc=Object(n.h)(Object(c.h)((e,{chatId:t})=>{const a=Object(d.f)(e,t),{progress:n}=e.management,c=Boolean(a.fullInfo&&a.fullInfo.linkedChatId);return{chat:a,progress:n,isBasicGroup:Object(m.ib)(a),hasLinkedChannel:c,canChangeInfo:Object(m.q)(a,"changeInfo"),canBanUsers:Object(m.q)(a,"banUsers")}},(e,t)=>Object(u.l)(t,["togglePreHistoryHidden","updateChat","closeManagement","deleteHistory","leaveChannel","deleteChannel","openChat"]))(({chatId:e,chat:t,progress:a,isBasicGroup:c,hasLinkedChannel:l,canChangeInfo:o,canBanUsers:i,onScreenSelect:d,togglePreHistoryHidden:u,updateChat:h,deleteHistory:b,leaveChannel:g,deleteChannel:p,closeManagement:E,openChat:O})=>{const[f,j,C]=Object(Be.a)(),y=t.title,k=t.fullInfo&&t.fullInfo.about||"",[N,I]=Object(n.r)(!1),[S,w]=Object(n.r)(y),[P,M]=Object(n.r)(k),[A,T]=Object(n.r)(),[R,D]=Object(n.r)(),x=Object(m.f)(t),U=Object(v.a)(x,!1,r.ApiMediaFormat.BlobUrl),G=Object(F.a)();Object(n.n)(()=>{a===s.f.Complete&&(I(!1),D(void 0))},[a]);const q=Object(n.m)(()=>{d(s.g.ChatPrivacyType)},[d]),z=Object(n.m)(()=>{d(s.g.Discussion)},[d]),$=Object(n.m)(()=>{d(s.g.GroupPermissions)},[d]),H=Object(n.m)(()=>{d(s.g.ChatAdministrators)},[d]),_=Object(n.m)(e=>{T(e),I(!0)},[]),V=Object(n.m)(e=>{w(e.target.value),I(!0)},[]),W=Object(n.m)(e=>{M(e.target.value),I(!0)},[]),K=Object(n.m)(()=>{const t=S.trim(),a=P.trim();t.length?h({chatId:e,title:t,about:a,photo:A}):D("Group title can't be empty")},[P,e,A,S,h]),Y=Object(n.m)(()=>{d(s.g.GroupMembers)},[d]),Z=Object(n.m)(()=>{if(!t.fullInfo)return;const{isPreHistoryHidden:e}=t.fullInfo;u({chatId:t.id,isEnabled:!e})},[t,u]),Q=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]),X=t.fullInfo&&t.fullInfo.adminMembers&&t.fullInfo.adminMembers.length||0,J=Object(n.m)(()=>{c?b({chatId:t.id,maxId:t.lastMessage.id,shouldDeleteForAll:!1}):t.isCreator?p({chatId:t.id}):g({chatId:t.id}),C(),E(),O({id:void 0})},[c,t.isCreator,t.id,t.lastMessage,C,E,b,g,p,O]);if(t.isRestricted)return;const ee=a===s.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(Ut.a,{currentAvatarBlobUrl:U,onChange:_,disabled:!o}),n.a.createElement(pe.a,{id:"group-title",label:G("GroupName"),onChange:V,value:S,error:"Group title can't be empty"===R?R:void 0,disabled:!o}),n.a.createElement(pe.a,{id:"group-about",className:"mb-2",label:G("DescriptionPlaceholder"),onChange:W,value:P,disabled:!o}),t.isCreator&&n.a.createElement(Ee.a,{icon:"lock",multiline:!0,ripple:!0,onClick:q},n.a.createElement("span",{className:"title"},G("GroupType")),n.a.createElement("span",{className:"subtitle"},t.username?G("TypePublic"):G("TypePrivate"))),l&&n.a.createElement(Ee.a,{icon:"message",multiline:!0,ripple:!0,onClick:z},n.a.createElement("span",{className:"title"},G("LinkedChannel")),n.a.createElement("span",{className:"subtitle"},G("DiscussionUnlink"))),n.a.createElement(Ee.a,{icon:"permissions",multiline:!0,ripple:!0,onClick:$,disabled:!i},n.a.createElement("span",{className:"title"},G("ChannelPermissions")),n.a.createElement("span",{className:"subtitle",dir:"auto"},Q,"/",8)),n.a.createElement(Ee.a,{icon:"admin",multiline:!0,ripple:!0,onClick:H},n.a.createElement("span",{className:"title"},G("ChannelAdministrators")),n.a.createElement("span",{className:"subtitle"},Object(ia.a)(X)))),n.a.createElement("div",{className:"section"},n.a.createElement(Ee.a,{icon:"group",multiline:!0,ripple:!0,onClick:Y},n.a.createElement("span",{className:"title"},G("GroupMembers")),n.a.createElement("span",{className:"subtitle"},Object(ia.a)(t.membersCount))),t.fullInfo&&n.a.createElement("div",{className:"ListItem narrow no-selection"},n.a.createElement(ta.a,{checked:!t.fullInfo.isPreHistoryHidden,label:G("ChatHistory"),onChange:Z,disabled:!i}))),n.a.createElement("div",{className:"section"},n.a.createElement(Ee.a,{icon:"delete",ripple:!0,destructive:!0,onClick:j},G("DeleteMega")))),n.a.createElement(Gt,{isShown:N,onClick:K,disabled:ee,ariaLabel:G("Save")},ee?n.a.createElement(L.a,{color:"white"}):n.a.createElement("i",{className:"icon-check"})),n.a.createElement(we.a,{isOpen:f,onClose:C,textParts:Object(B.a)(c||!t.isCreator?G("AreYouSureDeleteAndExit"):G("AreYouSureDeleteThisChatWithGroup",t.title),["br","simple_markdown"]),confirmLabel:c||!t.isCreator?G("DeleteMega"):G("DeleteGroupForAll"),confirmHandler:J,confirmIsDestructive:!0}))}));var Gc=Object(n.h)(Object(c.h)((e,{chatId:t})=>({chat:Object(d.f)(e,t),currentUserId:e.currentUserId}),(e,t)=>Object(u.l)(t,["updateChatDefaultBannedRights"]))(({onScreenSelect:e,onChatMemberSelect:t,chat:a,currentUserId:c,updateChatDefaultBannedRights:r})=>{const[l,o]=Object(n.r)({}),[i,d]=Object(n.r)(!1),[m,u]=Object(n.r)(!1),h=Object(F.a)(),b=Object(n.m)(()=>{e(s.g.GroupRemovedUsers)},[e]),g=Object(n.m)(()=>{e(s.g.GroupUserPermissionsCreate)},[e]),p=Object(n.m)(a=>{t(a.userId,a.promotedByUserId===c),e(s.g.GroupUserPermissions)},[c,t,e]);Object(n.n)(()=>{o(a&&a.defaultBannedRights||{}),d(!1),setTimeout(()=>{u(!1)},250)},[a]);const v=Object(n.m)(e=>{const{name:t}=e.target;function a(e){return!e||void 0}o(e=>({...e,[t]:a(e[t]),..."sendStickers"===t&&{sendGifs:a(e[t])}})),d(!0)},[]),E=Object(n.m)(()=>{a&&(u(!0),r({chatId:a.id,bannedRights:l}))},[a,l,r]),O=Object(n.p)(()=>a&&a.fullInfo&&a.fullInfo.kickedMembers?a.fullInfo.kickedMembers.length:0,[a]),f=Object(n.p)(()=>a&&a.fullInfo&&a.fullInfo.members?a.fullInfo.members.filter(({bannedRights:e})=>!!e):[],[a]),j=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 r=h(c);return`${e}${e.length?", "+r:r}`},"")},[a,h]);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"},h("ChannelPermissionsHeader")),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(ta.a,{name:"sendMessages",checked:!l.sendMessages,label:h("UserRestrictionsSend"),blocking:!0,onChange:v})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(ta.a,{name:"sendMedia",checked:!l.sendMedia,label:h("UserRestrictionsSendMedia"),blocking:!0,onChange:v})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(ta.a,{name:"sendStickers",checked:!l.sendStickers&&!l.sendGifs,label:h("UserRestrictionsSendStickers"),blocking:!0,onChange:v})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(ta.a,{name:"sendPolls",checked:!l.sendPolls,label:h("UserRestrictionsSendPolls"),blocking:!0,onChange:v})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(ta.a,{name:"embedLinks",checked:!l.embedLinks,label:h("UserRestrictionsEmbedLinks"),blocking:!0,onChange:v})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(ta.a,{name:"inviteUsers",checked:!l.inviteUsers,label:h("UserRestrictionsInviteUsers"),blocking:!0,onChange:v})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(ta.a,{name:"pinMessages",checked:!l.pinMessages,label:h("UserRestrictionsPinMessages"),blocking:!0,onChange:v})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(ta.a,{name:"changeInfo",checked:!l.changeInfo,label:h("UserRestrictionsChangeInfo"),blocking:!0,onChange:v}))),n.a.createElement("div",{className:"section"},n.a.createElement(Ee.a,{icon:"delete-user",multiline:!0,ripple:!0,narrow:!0,onClick:b},n.a.createElement("span",{className:"title"},h("ChannelBlockedUsers")),n.a.createElement("span",{className:"subtitle"},O))),n.a.createElement("div",{className:"section"},n.a.createElement("h3",{className:"section-heading",dir:"auto"},h("PrivacyExceptions")),n.a.createElement(Ee.a,{icon:"add-user",ripple:!0,onClick:g},h("ChannelAddException")),f.map(e=>n.a.createElement(Ee.a,{key:e.userId,className:"chat-item-clickable exceptions-member",ripple:!0,onClick:()=>p(e)},n.a.createElement(Oe.a,{userId:e.userId,status:j(e)}))))),n.a.createElement(Gt,{isShown:i,onClick:E,ariaLabel:h("Save"),disabled:m},m?n.a.createElement(L.a,{color:"white"}):n.a.createElement("i",{className:"icon-check"})))}));var qc=Object(n.h)(Object(c.h)((e,{chatId:t})=>{const a=Object(d.f)(e,t),{byId:n}=e.users;return{chat:a,usersById:n}},(e,t)=>Object(u.l)(t,["updateChatMemberBannedRights"]))(({chat:e,usersById:t,updateChatMemberBannedRights:a})=>{const c=Object(F.a)(),r=Object(n.p)(()=>e&&e.fullInfo&&e.fullInfo.kickedMembers?e.fullInfo.kickedMembers:[],[e]),s=Object(n.m)(e=>{if(!e.kickedByUserId)return;const a=t[e.kickedByUserId];return a?c("UserRemovedBy",Object(m.Z)(a)):void 0},[c,t]),l=Object(n.m)(t=>{if(e)return[{title:c("Unblock"),icon:"delete",destructive:!0,handler:()=>a({chatId:e.id,userId:t.userId,bannedRights:{}})}]},[c,e,a]);return n.a.createElement("div",{className:"Management"},n.a.createElement("div",{className:"custom-scroll"},n.a.createElement("div",{className:"section",dir:c.isRtl?"rtl":void 0},n.a.createElement("p",{className:"text-muted"},c("NoBlockedGroup2")),r.map(e=>n.a.createElement(Ee.a,{key:e.userId,className:"chat-item-clickable",ripple:!0,contextActions:l(e)},n.a.createElement(Oe.a,{userId:e.userId,status:s(e)}))))))}));var zc=Object(n.h)(Object(c.h)((e,{chatId:t})=>{const a=Object(d.f)(e,t),{progress:n}=e.management;return{chat:a,progress:n,isSignaturesShown:Boolean(a&&a.isSignaturesShown),canChangeInfo:Object(m.q)(a,"changeInfo")}},(e,t)=>Object(u.l)(t,["toggleSignatures","updateChat","closeManagement","leaveChannel","deleteChannel","openChat"]))(({chatId:e,chat:t,progress:a,isSignaturesShown:c,canChangeInfo:l,onScreenSelect:o,updateChat:i,toggleSignatures:d,closeManagement:u,leaveChannel:h,deleteChannel:b,openChat:g})=>{const p=t&&t.title||"",E=t&&t.fullInfo&&t.fullInfo.about||"",O=t&&t.fullInfo&&t.fullInfo.linkedChatId,[f,j,C]=Object(Be.a)(),[y,k]=Object(n.r)(!1),[N,I]=Object(n.r)(p),[S,w]=Object(n.r)(E),[P,M]=Object(n.r)(),[A,T]=Object(n.r)(),R=t&&Object(m.f)(t),D=Object(v.a)(R,!1,r.ApiMediaFormat.BlobUrl),B=Object(F.a)();Object(n.n)(()=>{a===s.f.Complete&&(k(!1),T(void 0))},[a]);const x=t&&t.fullInfo&&t.fullInfo.adminMembers&&t.fullInfo.adminMembers.length||0,U=Object(n.m)(()=>{o(s.g.ChatPrivacyType)},[o]),G=Object(n.m)(()=>{o(s.g.Discussion)},[o]),q=Object(n.m)(()=>{o(s.g.ChatAdministrators)},[o]),z=Object(n.m)(e=>{M(e),k(!0)},[]),$=Object(n.m)(e=>{I(e.target.value),k(!0)},[]),H=Object(n.m)(e=>{w(e.target.value),k(!0)},[]),_=Object(n.m)(()=>{const t=N.trim(),a=S.trim();t.length?i({chatId:e,title:t,about:a,photo:P}):T("Channel title can't be empty")},[S,e,P,N,i]),V=Object(n.m)(()=>{d({chatId:e,isEnabled:!c})},[e,c,d]),W=Object(n.m)(()=>{o(s.g.ChannelSubscribers)},[o]),K=Object(n.m)(()=>{t.isCreator?b({chatId:t.id}):h({chatId:t.id}),C(),u(),g({id:void 0})},[t.isCreator,t.id,C,u,h,b,g]);if(t.isRestricted)return;const Y=a===s.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(Ut.a,{currentAvatarBlobUrl:D,onChange:z,disabled:!l}),n.a.createElement(pe.a,{id:"channel-title",label:B("EnterChannelName"),onChange:$,value:N,error:"Channel title can't be empty"===A?A:void 0,disabled:!l}),n.a.createElement(pe.a,{id:"channel-about",className:"mb-2",label:B("DescriptionPlaceholder"),onChange:H,value:S,disabled:!l}),t.isCreator&&n.a.createElement(Ee.a,{icon:"lock",ripple:!0,multiline:!0,onClick:U},n.a.createElement("span",{className:"title"},B("ChannelType")),n.a.createElement("span",{className:"subtitle"},t.username?B("TypePublic"):B("TypePrivate"))),n.a.createElement(Ee.a,{icon:"message",multiline:!0,ripple:!0,onClick:G,disabled:!l},n.a.createElement("span",{className:"title"},B("Discussion")),n.a.createElement("span",{className:"subtitle"},B(O?"DiscussionUnlink":"Add"))),n.a.createElement(Ee.a,{icon:"admin",multiline:!0,ripple:!0,onClick:q},n.a.createElement("span",{className:"title"},B("ChannelAdministrators")),n.a.createElement("span",{className:"subtitle"},x)),n.a.createElement("div",{className:"ListItem no-selection narrow"},n.a.createElement(ta.a,{checked:c,label:B("ChannelSignMessages"),onChange:V}))),n.a.createElement("div",{className:"section"},n.a.createElement(Ee.a,{icon:"group",multiline:!0,ripple:!0,onClick:W},n.a.createElement("span",{className:"title",dir:"auto"},B("ChannelSubscribers")),n.a.createElement("span",{className:"subtitle",dir:"auto"},B("Subscribers",t.membersCount,"i")))),n.a.createElement("div",{className:"section"},n.a.createElement(Ee.a,{icon:"delete",ripple:!0,destructive:!0,onClick:j},t.isCreator?B("ChannelDelete"):B("LeaveChannel")))),n.a.createElement(Gt,{isShown:y,onClick:_,disabled:Y,ariaLabel:B("Save")},Y?n.a.createElement(L.a,{color:"white"}):n.a.createElement("i",{className:"icon-check"})),n.a.createElement(we.a,{isOpen:f,onClose:C,text:t.isCreator?B("ChannelDeleteAlert"):B("ChannelLeaveAlert"),confirmLabel:t.isCreator?B("ChannelDelete"):B("LeaveChannel"),confirmHandler:K,confirmIsDestructive:!0}))})),$c=a(56);var Hc=Object(n.h)(Object(c.h)((e,{chatId:t})=>{const a=Object(d.f)(e,t),{isUsernameAvailable:n}=Object(d.Y)(e,t);return{chat:a,isChannel:Object(m.jb)(a),progress:e.management.progress,isUsernameAvailable:n}},(e,t)=>Object(u.l)(t,["checkPublicLink","updatePublicLink","updatePrivateLink"]))(({chat:e,isChannel:t,progress:a,isUsernameAvailable:c,checkPublicLink:r,updatePublicLink:l,updatePrivateLink:o})=>{const i=Boolean(e.username),d=e.fullInfo&&e.fullInfo.inviteLink,[m,u]=Object(n.r)(i?"public":"private"),[h,b]=Object(n.r)(),[g,p,v]=Object(Be.a)(),E="public"===m&&h&&c||"private"===m&&i;Object(n.n)(()=>{m&&!d&&o()},[m,d,o]);const O=Object(n.m)(e=>{u(e)},[]),f=Object(n.m)(()=>{l({username:"public"===m?h:""})},[m,l,h]),j=Object(n.m)(()=>{v(),o()},[v,o]),C=Object(F.a)(),y=t?"Channel":"Mega",k=t?"Channel":"Group",N=[{value:"private",label:C(y+"Private"),subLabel:C(y+"PrivateInfo")},{value:"public",label:C(y+"Public"),subLabel:C(y+"PublicInfo")}],I=a===s.f.InProgress;return n.a.createElement("div",{className:"Management"},n.a.createElement("div",{className:"custom-scroll"},n.a.createElement("div",{className:"section",dir:C.isRtl?"rtl":void 0},n.a.createElement("h3",{className:"section-heading"},C(k+"Type")),n.a.createElement(la.a,{selected:m,name:"channel-type",options:N,onChange:O})),"private"===m?n.a.createElement("div",{className:"section",dir:C.isRtl?"rtl":void 0},d?n.a.createElement(n.a.Fragment,null,n.a.createElement($c.a,{url:d,className:"group-link",text:d}),n.a.createElement("p",{className:"section-info",dir:C.isRtl?"rtl":void 0},C(y+"PrivateLinkHelp")),n.a.createElement(Ee.a,{icon:"delete",ripple:!0,destructive:!0,onClick:p},C("RevokeLink")),n.a.createElement(we.a,{isOpen:g,onClose:v,text:C("RevokeAlert"),confirmLabel:C("RevokeButton"),confirmHandler:j,confirmIsDestructive:!0})):n.a.createElement(be.a,null)):n.a.createElement("div",{className:"section no-border"},n.a.createElement(Ht,{asLink:!0,currentUsername:e.username,isLoading:I,isUsernameAvailable:c,checkUsername:r,onChange:b}),n.a.createElement("p",{className:"section-info",dir:"auto"},C(k+".Username.CreatePublicLinkHelp")))),n.a.createElement(Gt,{isShown:E,disabled:I,ariaLabel:C("Save"),onClick:f},I?n.a.createElement(L.a,{color:"white"}):n.a.createElement("i",{className:"icon-check"})))}));var _c=Object(n.h)(Object(c.h)((e,{chatId:t})=>{const a=Object(d.f)(e,t),{forDiscussionIds:n,byId:c}=e.chats;return{chat:a,chatsByIds:c,forDiscussionIds:n,linkedChat:a&&a.fullInfo&&a.fullInfo.linkedChatId?Object(d.f)(e,a.fullInfo.linkedChatId):void 0,isChannel:a&&Object(m.jb)(a)}},(e,t)=>Object(u.l)(t,["loadGroupsForDiscussion","linkDiscussionGroup","unlinkDiscussionGroup"]))(({chat:e,chatId:t,chatsByIds:a,linkedChat:c,forDiscussionIds:r,isChannel:o,onScreenSelect:i,loadGroupsForDiscussion:d,linkDiscussionGroup:m,unlinkDiscussionGroup:u})=>{const[h,b]=Object(n.r)(),[g,p]=Object(n.r)(),[v,E]=Object(n.r)(!1),O=Object(n.m)(()=>E(!0),[]),[f,j,C]=Object(Be.a)(),[y,k,N]=Object(Be.a)(),I=Object(F.a)(),S=c&&c.id;Object(n.n)(()=>{d()},[d]),Object(n.n)(()=>{g||Object(Wt.a)("DiscussionGroups").then(p)},[g]);const w=Object(n.m)(()=>{C(),u({channelId:o?t:S}),o||i(s.g.Initial)},[C,u,o,t,S,i]),P=Object(n.m)(()=>{N(),m({channelId:t,chatId:h})},[N,m,t,h]);function M(){const e=a[h];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 L(){const t=a[h];if(t)return t.hasPrivateLink?Object(B.a)(`Do you want to make **${t.title}** the discussion board for **${e.title}**?`,["br","simple_markdown"]):Object(B.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"},g&&n.a.createElement(Kt.a,{id:"discussionGroupsDucks",size:l.sb,animationData:g,play:v,noLoop:!0,onLoad:O})),c&&n.a.createElement("div",null,n.a.createElement(Ee.a,{className:"chat-item-clickable",inactive:!0},n.a.createElement(fe.a,{chatId:c.id})),n.a.createElement(Ee.a,{icon:"delete",ripple:!0,destructive:!0,onClick:j},I(o?"DiscussionUnlinkGroup":"DiscussionUnlinkChannel")),n.a.createElement(we.a,{isOpen:f,onClose:C,header:n.a.createElement("div",{className:"modal-header"},n.a.createElement(x.a,{size:"tiny",chat:c}),n.a.createElement("div",{className:"modal-title"},I(o?"DiscussionUnlinkGroup":"DiscussionUnlinkChannel"))),textParts:Object(B.a)(I(o?"DiscussionUnlinkChannelAlert":"DiscussionUnlinkGroupAlert",c.title),["br","simple_markdown"]),confirmLabel:I(o?"DiscussionUnlinkGroup":"DiscussionUnlinkChannel"),confirmHandler:w,confirmIsDestructive:!0})),!c&&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")),r?r.map((e,t)=>n.a.createElement(Ee.a,{key:e,teactOrderKey:t+1,className:"chat-item-clickable scroll-item",onClick:()=>{b(e),k()}},n.a.createElement(fe.a,{chatId:e}))):n.a.createElement(et.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(we.a,{isOpen:y,onClose:N,header:M(),textParts:L(),confirmLabel:I("DiscussionLinkGroup"),confirmHandler:P,isButtonsInOneRow:!0})))))}));var Vc=Object(n.h)(Object(c.h)((e,{chatId:t,isPromotedByCurrentUser:a})=>{const n=Object(d.f)(e,t);return{chat:n,isFormFullyDisabled:!(n.isCreator||a)}},(e,t)=>Object(u.l)(t,["updateChatMemberBannedRights"]))(({chat:e,selectedChatMemberId:t,onScreenSelect:a,updateChatMemberBannedRights:c,isFormFullyDisabled:r})=>{const[l,o]=Object(n.r)({}),[i,d]=Object(n.r)(!1),[m,u]=Object(n.r)(!1),[h,b,g]=Object(Be.a)(),p=Object(F.a)(),v=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&&!v&&a(s.g.GroupPermissions)},[e,a,v,t]),Object(n.n)(()=>{o(v&&v.bannedRights||e&&e.defaultBannedRights||{}),d(!1),u(!1)},[e,v]);const E=Object(n.m)(e=>{const{name:t}=e.target;function a(e){return!e||void 0}o(e=>({...e,[t]:a(e[t]),..."sendStickers"===t&&{sendGifs:a(e[t])}})),d(!0)},[]),O=Object(n.m)(()=>{e&&t&&(u(!0),c({chatId:e.id,userId:t,bannedRights:l}))},[e,t,l,c]),f=Object(n.m)(()=>{e&&t&&c({chatId:e.id,userId:t,bannedRights:{viewMessages:!0}})},[e,t,c]),j=Object(n.m)(t=>!!r||!(!e||!e.defaultBannedRights)&&e.defaultBannedRights[t],[e,r]);if(v)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(Oe.a,{userId:v.userId})),n.a.createElement("h3",{className:"section-heading mt-4",dir:"auto"},p("UserRestrictionsCanDo")),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(ta.a,{name:"sendMessages",checked:!l.sendMessages,label:p("UserRestrictionsSend"),blocking:!0,disabled:j("sendMessages"),onChange:E})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(ta.a,{name:"sendMedia",checked:!l.sendMedia,label:p("UserRestrictionsSendMedia"),blocking:!0,disabled:j("sendMedia"),onChange:E})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(ta.a,{name:"sendStickers",checked:!l.sendStickers&&!l.sendGifs,label:p("UserRestrictionsSendStickers"),blocking:!0,disabled:j("sendStickers"),onChange:E})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(ta.a,{name:"sendPolls",checked:!l.sendPolls,label:p("UserRestrictionsSendPolls"),blocking:!0,disabled:j("sendPolls"),onChange:E})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(ta.a,{name:"embedLinks",checked:!l.embedLinks,label:p("UserRestrictionsEmbedLinks"),blocking:!0,disabled:j("embedLinks"),onChange:E})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(ta.a,{name:"inviteUsers",checked:!l.inviteUsers,label:p("UserRestrictionsInviteUsers"),blocking:!0,disabled:j("inviteUsers"),onChange:E})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(ta.a,{name:"pinMessages",checked:!l.pinMessages,label:p("UserRestrictionsPinMessages"),blocking:!0,disabled:j("pinMessages"),onChange:E})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(ta.a,{name:"changeInfo",checked:!l.changeInfo,label:p("UserRestrictionsChangeInfo"),blocking:!0,disabled:j("changeInfo"),onChange:E}))),!r&&n.a.createElement("div",{className:"section"},n.a.createElement(Ee.a,{icon:"delete-user",ripple:!0,destructive:!0,onClick:b},p("UserRestrictionsBlock")))),n.a.createElement(Gt,{isShown:i,onClick:O,ariaLabel:p("Save"),disabled:m},m?n.a.createElement(L.a,{color:"white"}):n.a.createElement("i",{className:"icon-check"})),n.a.createElement(we.a,{isOpen:h,onClose:g,text:"Are you sure you want to ban and remove this user from the group?",confirmLabel:"Remove",confirmHandler:f,confirmIsDestructive:!0}))}));var Wc=Object(n.h)(Object(c.h)((e,{chatId:t})=>{const a=Object(d.f)(e,t),{byId:n}=e.users;return{chat:a,currentUserId:e.currentUserId,isChannel:Object(m.jb)(a),usersById:n}})(({chat:e,isChannel:t,currentUserId:a,usersById:c,onScreenSelect:r,onChatMemberSelect:l})=>{const o=Object(F.a)();const i=Object(n.p)(()=>e.fullInfo&&e.fullInfo.adminMembers?e.fullInfo.adminMembers.sort((e,t)=>e.isOwner?-1:t.isOwner?1:0):[],[e]),d=Object(n.m)(e=>{l(e.userId,e.promotedByUserId===a),r(s.g.ChatAdminRights)},[a,l,r]),u=Object(n.m)(e=>{if(e.isOwner)return o("ChannelCreator");const t=e.promotedByUserId?c[e.promotedByUserId]:void 0;return t?o("EditAdminPromotedBy",Object(m.Z)(t)):o("ChannelAdmin")},[o,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,ripple:!0,onClick:function(){r(s.g.GroupRecentActions)}},n.a.createElement("span",{className:"title"},o("EventLog")),n.a.createElement("span",{className:"subtitle"},o(t?"EventLogInfoDetailChannel":"EventLogInfoDetail")))),n.a.createElement("div",{className:"section",dir:o.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."),i.map(e=>n.a.createElement(Ee.a,{key:e.userId,className:"chat-item-clickable",ripple:!0,onClick:()=>d(e)},n.a.createElement(Oe.a,{userId:e.userId,status:u(e),forceShowSelf:!0}))))))}));var Kc=Object(n.h)(Object(c.h)((e,{chatId:t})=>({chat:Object(d.f)(e,t)}))(({chat:e})=>{const t=Object(F.a)(),a=Object(n.p)(()=>e&&e.fullInfo&&e.fullInfo.adminMembers?e.fullInfo.adminMembers.sort((e,t)=>e.isOwner?-1:t.isOwner?1:0):[],[e]),c=Object(n.m)(e=>e.isOwner?t("ChannelCreator"):t("ChannelAdmin"),[t]);return n.a.createElement("div",{className:"Management"},n.a.createElement("div",{className:"custom-scroll"},n.a.createElement("div",{className:"section not-implemented",dir:t.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(ta.a,{name:"changeInfo",checked:!0,label:t("EventLogAllEvents"),onChange:void 0})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(ta.a,{name:"changeInfo",checked:!0,label:t("EventLogFilterNewAdmins"),onChange:void 0})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(ta.a,{name:"changeInfo",checked:!0,label:t("EventLogFilterNewMembers"),onChange:void 0})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(ta.a,{name:"changeInfo",checked:!0,label:t("EventLogFilterChannelInfo"),onChange:void 0})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(ta.a,{name:"changeInfo",checked:!0,label:t("EventLogFilterDeletedMessages"),onChange:void 0})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(ta.a,{name:"changeInfo",checked:!0,label:t("EventLogFilterEditedMessages"),onChange:void 0})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(ta.a,{name:"changeInfo",checked:!0,label:t("EventLogFilterLeavingMembers"),onChange:void 0}))),n.a.createElement("div",{className:"section not-implemented",dir:t.isRtl?"rtl":void 0},n.a.createElement("h3",{className:"section-heading",dir:"auto"},t("Channel.Management.Title")),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(ta.a,{name:"changeInfo",checked:!0,label:t("EventLogAllAdmins"),onChange:void 0})),a.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(ta.a,{label:"",checked:!0}),n.a.createElement(Oe.a,{userId:e.userId,status:c(e),forceShowSelf:!0}))))))}));var Yc=Object(n.h)(Object(c.h)((e,{chatId:t,isPromotedByCurrentUser:a})=>{const n=Object(d.f)(e,t),{byId:c}=e.users,{currentUserId:r}=e;return{chat:n,usersById:c,currentUserId:r,isChannel:Object(m.jb)(n),isFormFullyDisabled:!(n.isCreator||a)}},(e,t)=>Object(u.l)(t,["updateChatAdmin"]))(({selectedChatMemberId:e,onScreenSelect:t,chat:a,usersById:c,currentUserId:r,isChannel:l,isFormFullyDisabled:o,updateChatAdmin:i})=>{const[d,u]=Object(n.r)({}),[h,b]=Object(n.r)(!1),[g,p]=Object(n.r)(!1),[v,E,O]=Object(Be.a)(),[f,j]=Object(n.r)(""),C=Object(F.a)(),y=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&&!y&&t(s.g.ChatAdministrators)},[a,t,y,e]),Object(n.n)(()=>{u(y&&y.adminRights||{}),j((y&&y.customTitle||"").substr(0,16)),b(!1),p(!1)},[y]);const k=Object(n.m)(e=>{const{name:t}=e.target;u(e=>{return{...e,[t]:(a=e[t],!a||void 0)};var a}),b(!0)},[]),N=Object(n.m)(()=>{e&&(p(!0),i({chatId:a.id,userId:e,adminRights:d,customTitle:f}))},[a,e,d,f,i]),I=Object(n.m)(()=>{e&&(i({chatId:a.id,userId:e,adminRights:{}}),O())},[a.id,O,e,i]),S=Object(n.m)(e=>!Object(m.ib)(a)&&(!(!o&&a.adminRights)||!a.adminRights[e]),[a,o]),w=Object(n.p)(()=>{if(!y)return;if(y.isOwner)return C("ChannelCreator");const e=y.promotedByUserId?c[y.promotedByUserId]:void 0;return e?C("EditAdminPromotedBy",Object(m.Z)(e)):C("ChannelAdmin")},[y,c,C]),P=Object(n.m)(e=>{const{value:t}=e.target;j(t),b(!0)},[]);if(y)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(Oe.a,{userId:y.userId,status:w,forceShowSelf:!0})),n.a.createElement("h3",{className:"section-heading mt-4",dir:"auto"},C("EditAdminWhatCanDo")),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(ta.a,{name:"changeInfo",checked:!!d.changeInfo,label:C(l?"EditAdminChangeChannelInfo":"EditAdminChangeGroupInfo"),blocking:!0,disabled:S("changeInfo"),onChange:k})),l&&n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(ta.a,{name:"postMessages",checked:!!d.postMessages,label:C("EditAdminPostMessages"),blocking:!0,disabled:S("postMessages"),onChange:k})),l&&n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(ta.a,{name:"editMessages",checked:!!d.editMessages,label:C("EditAdminEditMessages"),blocking:!0,disabled:S("editMessages"),onChange:k})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(ta.a,{name:"deleteMessages",checked:!!d.deleteMessages,label:C(l?"EditAdminDeleteMessages":"EditAdminGroupDeleteMessages"),blocking:!0,disabled:S("deleteMessages"),onChange:k})),!l&&n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(ta.a,{name:"banUsers",checked:!!d.banUsers,label:C("EditAdminBanUsers"),blocking:!0,disabled:S("banUsers"),onChange:k})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(ta.a,{name:"inviteUsers",checked:!!d.inviteUsers,label:C("EditAdminAddUsers"),blocking:!0,disabled:S("inviteUsers"),onChange:k})),!l&&n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(ta.a,{name:"pinMessages",checked:!!d.pinMessages,label:C("EditAdminPinMessages"),blocking:!0,disabled:S("pinMessages"),onChange:k})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(ta.a,{name:"addAdmins",checked:!!d.addAdmins,label:C("EditAdminAddAdmins"),blocking:!0,disabled:S("addAdmins"),onChange:k})),!l&&n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(ta.a,{name:"anonymous",checked:!!d.anonymous,label:C("EditAdminSendAnonymously"),blocking:!0,disabled:S("anonymous"),onChange:k})),o&&n.a.createElement("p",{className:"section-info mb-4",dir:"auto"},C("Channel.EditAdmin.CannotEdit")),!l&&n.a.createElement(pe.a,{id:"admin-title",label:C("EditAdminRank"),onChange:P,value:f,disabled:o,maxLength:16}),r!==e&&!o&&n.a.createElement(Ee.a,{icon:"delete",ripple:!0,destructive:!0,onClick:E},C("EditAdminRemoveAdmin")))),n.a.createElement(Gt,{isShown:h,onClick:N,ariaLabel:C("Save"),disabled:g},g?n.a.createElement(L.a,{color:"white"}):n.a.createElement("i",{className:"icon-check"})),n.a.createElement(we.a,{isOpen:v,onClose:O,text:"Are you sure you want to dismiss this admin?",confirmLabel:"Dismiss",confirmHandler:I,confirmIsDestructive:!0}))}));var Zc=Object(n.h)(Object(c.h)((e,{chatId:t})=>{const a=Object(d.f)(e,t),{byId:n}=e.users;return{members:a&&a.fullInfo&&a.fullInfo.members,usersById:n,isChannel:a&&Object(m.jb)(a)}},(e,t)=>Object(u.l)(t,["openUserInfo"]))(({members:e,usersById:t,isChannel:a,openUserInfo:c})=>{const r=Object(n.p)(()=>{if(e&&t)return Object(m.Eb)(e.map(({userId:e})=>e),t)},[e,t]),s=Object(n.m)(e=>{c({id:e})},[c]);return n.a.createElement("div",{className:"Management"},n.a.createElement("div",{className:"custom-scroll"},n.a.createElement("div",{className:"section",teactFastList:!0},r?r.map((e,t)=>n.a.createElement(Ee.a,{key:e,teactOrderKey:t,className:"chat-item-clickable scroll-item",onClick:()=>s(e)},n.a.createElement(Oe.a,{userId:e,forceShowSelf:!0}))):n.a.createElement(et.a,{teactOrderKey:0,key:"nothing-found",text:a?"No subscribers found":"No members found"}))))}));var Qc=Object(n.h)(Object(c.h)((e,{chatId:t})=>{const a=Object(d.f)(e,t),{byId:n}=e.users;return{members:a&&a.fullInfo&&a.fullInfo.members,usersById:n,isChannel:a&&Object(m.jb)(a)}})(({usersById:e,members:t,isChannel:a,onScreenSelect:c,onChatMemberSelect:r})=>{const l=Object(n.p)(()=>{if(t&&e)return Object(m.Eb)(t.filter(e=>!e.isOwner).map(({userId:e})=>e),e)},[t,e]),o=Object(n.m)(e=>{r(e),c(s.g.GroupUserPermissions)},[r,c]);return 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:()=>o(e)},n.a.createElement(Oe.a,{userId:e,forceShowSelf:!0}))):n.a.createElement(et.a,{teactOrderKey:0,key:"nothing-found",text:a?"No subscribers found":"No members found"}))))}));var Xc=Object(n.h)(Object(c.h)(e=>({managementType:Object(d.u)(e)}))(({chatId:e,currentScreen:t,selectedChatMemberId:a,isPromotedByCurrentUser:c,onScreenSelect:r,onChatMemberSelect:l,managementType:o})=>{switch(t){case s.g.Initial:switch(o){case"user":return n.a.createElement(xc,{key:e,userId:e});case"group":return n.a.createElement(Uc,{key:e,chatId:e,onScreenSelect:r});case"channel":return n.a.createElement(zc,{key:e,chatId:e,onScreenSelect:r})}break;case s.g.ChatPrivacyType:return n.a.createElement(Hc,{chatId:e});case s.g.Discussion:return n.a.createElement(_c,{chatId:e,onScreenSelect:r});case s.g.GroupPermissions:return n.a.createElement(Gc,{chatId:e,onScreenSelect:r,onChatMemberSelect:l});case s.g.GroupRemovedUsers:return n.a.createElement(qc,{chatId:e});case s.g.GroupUserPermissionsCreate:return n.a.createElement(Qc,{chatId:e,onChatMemberSelect:l,onScreenSelect:r});case s.g.GroupUserPermissions:return n.a.createElement(Vc,{chatId:e,selectedChatMemberId:a,isPromotedByCurrentUser:c,onScreenSelect:r});case s.g.ChatAdministrators:return n.a.createElement(Wc,{chatId:e,onScreenSelect:r,onChatMemberSelect:l});case s.g.GroupRecentActions:return n.a.createElement(Kc,{chatId:e});case s.g.ChatAdminRights:return n.a.createElement(Yc,{chatId:e,selectedChatMemberId:a,isPromotedByCurrentUser:c,onScreenSelect:r});case s.g.ChannelSubscribers:case s.g.GroupMembers:return n.a.createElement(Zc,{chatId:e})}}));const Jc={USD:"$",EUR:"€",GBP:"£",JPY:"¥",RUB:"₽",UAH:"₴",INR:"₹",AED:"د.إ"};function er(e){return e&&Jc[e]||""}const tr=/^4[0-9]{12}(?:[0-9]{1,3})?$/,ar=/^5[1-5][0-9]{11,14}$/,nr=/^2[2-7][0-9]{11,14}$/;let cr;!function(e){e[e.Default=0]="Default",e[e.Visa=1]="Visa",e[e.Mastercard=2]="Mastercard"}(cr||(cr={}));const rr={[cr.Default]:"",[cr.Visa]:"visa",[cr.Mastercard]:"mastercard"};function sr(e){return e=e.replace(/\s/g,""),tr.test(e)?cr.Visa:ar.test(e)||nr.test(e)?cr.Mastercard:cr.Default}var lr=a(59);const or={streetLine1:"",streetLine2:"",city:"",state:"",countryIso2:"",postCode:"",fullName:"",email:"",phone:"",shipping:"",cardNumber:"",cardholder:"",expiry:"",cvv:"",billingCountry:"",billingZip:"",saveInfo:!0,saveCredentials:!1,formErrors:{}},ir=(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:dr(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:dr(t.payload.countryIso2)}:{...e,...t.payload};case"setFormErrors":return{...e,formErrors:{...e.formErrors,...t.payload}};default:return e}};function dr(e){const t=Bt.a.find(({id:t})=>t===e);return t?t.name:""}function mr(e,t=400){Object(n.n)(()=>{o.l||setTimeout(()=>{Object(_.b)(()=>{e.current&&e.current.focus()})},t)},[e,t])}var ur=Object(n.h)(e=>{const{id:t,value:a,label:c,hasArrow:r,error:s,ref:l,placeholder:o,onChange:i,children:d}=e,m=s||c,u=Object(ce.a)("input-group",a&&"touched",s&&"error",m&&"with-label",r&&"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:o||c,ref:l},d),m&&t&&n.a.createElement("label",{htmlFor:t},m))});a(302);var hr=Object(n.h)(({state:e,needEmail:t,needPhone:a,needName:c,needAddress:r,dispatch:s})=>{const l=Object(n.q)(null),o=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)();mr(l);const m=Object(n.m)(e=>{s({type:"changeAddress1",payload:e.target.value})},[s]),u=Object(n.m)(e=>{s({type:"changeAddress2",payload:e.target.value})},[s]),h=Object(n.m)(e=>{s({type:"changeCity",payload:e.target.value})},[s]),b=Object(n.m)(e=>{s({type:"changeState",payload:e.target.value})},[s]),g=Object(n.m)(e=>{s({type:"changeCountry",payload:e.target.value})},[s]),p=Object(n.m)(e=>{s({type:"changePostCode",payload:e.target.value})},[s]),v=Object(n.m)(e=>{s({type:"changeFullName",payload:e.target.value})},[s]),E=Object(n.m)(e=>{s({type:"changeEmail",payload:e.target.value})},[s]),O=Object(n.m)(e=>{let{value:t}=e.target;t="+"+t.replace(/\D/g,""),o.current&&(o.current.value=t),s({type:"changePhone",payload:t})},[s]),f=Object(n.m)(e=>{s({type:"changeSaveInfo",payload:e.target.value})},[s]),{formErrors:j}=e;return n.a.createElement("div",{className:"ShippingInfo"},n.a.createElement("form",null,r?n.a.createElement("div",null,n.a.createElement("h5",null,d("PaymentShippingAddress")),n.a.createElement(pe.a,{ref:l,label:"Address1 (Street)",onChange:m,value:e.streetLine1,inputMode:"text",error:j.streetLine1}),n.a.createElement(pe.a,{label:"Address2 (Street)",onChange:u,value:e.streetLine2,inputMode:"text",error:j.streetLine2}),n.a.createElement(pe.a,{label:"City",onChange:h,value:e.city,inputMode:"text",error:j.city}),n.a.createElement(pe.a,{label:"State",onChange:b,value:e.state,inputMode:"text",error:j.state}),n.a.createElement(ur,{label:"Country",placeholder:"Country",onChange:g,value:e.countryIso2,hasArrow:Boolean(!0),id:"shipping-country",error:j.countryIso2,ref:i},Bt.a.map(({name:e,id:t})=>n.a.createElement("option",{value:t,className:"county-item"},e))),n.a.createElement(pe.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(pe.a,{label:"Full name",onChange:v,value:e.fullName,inputMode:"text",error:j.fullName}),t&&n.a.createElement(pe.a,{label:"Email",onChange:E,value:e.email,inputMode:"email",error:j.email}),a&&n.a.createElement(pe.a,{label:"Phone number",onChange:O,value:e.phone,inputMode:"tel",error:j.phone,ref:o}),n.a.createElement(ta.a,{label:d("PaymentShippingSave"),subLabel:d("PaymentShippingSaveInfo"),checked:Boolean(e.saveInfo),onChange:f})))});a(303);var br=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 r=Object(n.m)(e=>{c({type:"changeShipping",payload:e})},[c]),s=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(la.a,{name:"shipping-options",options:s,onChange:r,selected:e.shipping})))});a(304);function gr(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 pr(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 vr=Object(n.h)(({invoiceContent:e,prices:t,shippingPrices:a,checkoutInfo:c,currency:r,totalPrice:s})=>{const{photoUrl:l,title:o,text:i}=e||{},{paymentMethod:d,paymentProvider:m,shippingAddress:u,name:h,phone:b,shippingMethod:g}=c||{};return n.a.createElement("div",{className:"Checkout"},n.a.createElement("div",{className:"description has-image"},l&&n.a.createElement("img",{src:l,alt:""}),n.a.createElement("div",{className:"text"},n.a.createElement("h5",null,o),n.a.createElement("p",null,i))),n.a.createElement("div",{className:"price-info"},t&&t.map(e=>gr(e.label,e.amount,r,!1)),a&&a.map(e=>gr(e.label,e.amount,r,!1)),void 0!==s&&gr("Total",s,r,!0)),n.a.createElement("div",{className:"invoice-info"},d&&pr("icon-card",d,"Payment method"),m&&pr("stripe-provider",m,"Payment provider"),u&&pr("icon-location",u,"Shipping address"),h&&pr("icon-user",h,"Name"),b&&pr("icon-phone",b,"Phone number"),g&&pr("icon-truck",g,"Shipping method")))});var Er=Object(n.h)(({value:e,error:t,onChange:a})=>{const c=Object(n.q)(null),r=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]),s=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(pe.a,{label:"Expiry date",ref:c,onChange:s,onKeyDown:r,value:e,error:t,inputMode:"numeric",maxLength:5})}),Or=(a(305),a.p+"mastercard.4216118edafe23cc2dec7b8807ba4622.svg"),fr=a.p+"visa.e5a7c336e1deb4b92a636e2e053878c4.svg";var jr=Object(n.h)(({value:e,error:t,onChange:a})=>{const c=Object(n.q)(null);mr(c);const[r,s]=Object(n.r)(cr.Default);Object(n.n)(()=>{const t=sr(e);s(t)},[]);const l=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=sr(e.target.value);s(n),a(t),c.current&&(c.current.value=t)},[a,c]),o=function(e){switch(e){case cr.Mastercard:return n.a.createElement("img",{src:Or,alt:""});case cr.Visa:return n.a.createElement("img",{src:fr,alt:""});default:return}}(r);return n.a.createElement("div",{className:"CardInput"},n.a.createElement("span",{className:"left-addon"},o),n.a.createElement(pe.a,{ref:c,label:"Card number",onChange:l,value:e,inputMode:"numeric",className:r?"has-left-addon":"",error:t,maxLength:23}))});a(306);var Cr=Object(n.h)(({state:e,canSaveCredentials:t,needCardholderName:a,needCountry:c,needZip:r,dispatch:s})=>{const l=Object(n.q)(null);Object(n.n)(()=>{l.current&&l.current.value!==e.billingCountry&&(l.current.value=e.billingCountry)},[e.billingCountry]);const o=Object(n.m)(e=>{s({type:"changeCardNumber",payload:e})},[s]),i=Object(n.m)(e=>{s({type:"changeCardholder",payload:e.target.value.toUpperCase()})},[s]),d=Object(n.m)(e=>{s({type:"changeExpiryDate",payload:e})},[s]),m=Object(n.m)(e=>{s({type:"changeCvvCode",payload:e.target.value})},[s]),u=Object(n.m)(e=>{s({type:"changeBillingCountry",payload:e.target.value})},[s]),h=Object(n.m)(e=>{s({type:"changeBillingZip",payload:e.target.value})},[s]),b=Object(n.m)(e=>{s({type:"changeSaveCredentials",payload:e.target.value})},[s]),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(jr,{onChange:o,value:e.cardNumber,error:p.cardNumber}),a&&n.a.createElement(pe.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(Er,{value:e.expiry,onChange:d,error:p.expiry}),n.a.createElement(pe.a,{label:"CVV code",onChange:m,value:e.cvv,inputMode:"numeric",maxLength:3,error:p.cvv})),c||r?n.a.createElement("h5",null,g("PaymentBillingAddress")):void 0,c&&n.a.createElement(ur,{label:"Country",placeholder:"Country",onChange:u,value:e.billingCountry,hasArrow:Boolean(!0),id:"billing-country",error:p.billingCountry,ref:l},Bt.a.map(({name:e})=>n.a.createElement("option",{value:e,className:"county-item"},e))),r&&n.a.createElement(pe.a,{label:"Post Code",onChange:h,value:e.billingZip,inputMode:"text",error:p.billingZip}),t&&n.a.createElement(ta.a,{label:g("PaymentCardSavePaymentInformation"),checked:e.saveCredentials,onChange:b})))});a(185);var yr=Object(n.h)(Object(c.h)(e=>{const{step:t,shippingOptions:a,savedInfo:n,canSaveCredentials:c,invoice:r,invoiceContent:s,nativeProvider:l,nativeParams:o,passwordMissing:i,error:d}=e.payment,m=Boolean(r&&(!l||"stripe"!==l)),{needCardholderName:u,needCountry:h,needZip:b}=o||{},{nameRequested:g,phoneRequested:p,emailRequested:v,shippingAddressRequested:E,flexible:O,phoneToProvider:f,emailToProvider:j,currency:C,prices:y}=r||{};return{step:t,shippingOptions:a,savedInfo:n,canSaveCredentials:c,nativeProvider:l,passwordMissing:i,nameRequested:g,shippingAddressRequested:E,phoneRequested:p,emailRequested:v,flexible:O,phoneToProvider:f,emailToProvider:j,currency:C,prices:y,isProviderError:m,invoiceContent:s,needCardholderName:u,needCountry:h,needZip:b,error:d,globalErrors:e.errors}},(e,t)=>Object(u.l)(t,["validateRequestedInfo","sendPaymentForm","setPaymentStep","sendCredentialsInfo","clearPaymentError"]))(({isOpen:e,onClose:t,step:a,shippingOptions:c,savedInfo:r,canSaveCredentials:l,nameRequested:o,shippingAddressRequested:i,phoneRequested:d,emailRequested:m,phoneToProvider:u,emailToProvider:h,currency:b,passwordMissing:g,isProviderError:p,invoiceContent:v,nativeProvider:E,prices:O,needCardholderName:f,needCountry:j,needZip:C,error:y,globalErrors:k,validateRequestedInfo:N,sendPaymentForm:I,setPaymentStep:S,sendCredentialsInfo:w,clearPaymentError:P})=>{const[M,A]=Nt(ir,or),D=er(b),[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(lr.a)(k);A({type:"setFormErrors",payload:{...e}})}},[y,k,A]),Object(n.n)(()=>{if(r){const{name:e,phone:t,email:a,shippingAddress:n}=r;A({type:"updateUserInfo",payload:{fullName:e,phone:t&&"+"!==t.charAt(0)?"+"+t:t,email:a,...n||{}}})}},[r,A]);const G=Object(n.m)(()=>{P()},[P]),q=Object(n.p)(()=>a!==s.i.Checkout?0:function(e=[],t,a){const n=t?Nr(t,a):[];let c=0;const r=e.concat(n||[]);return c=r.reduce((e,t)=>e+t.amount,c),c}(O,c,M.shipping),[a,M.shipping,O,c]),z=Object(n.p)(()=>{if(a===s.i.Checkout)return function(e,t,a){const n=`${function(e){const t=sr(e);return rr[t]||""}(e.cardNumber)} *${e.cardNumber.slice(-4)}`,c=e.streetLine1?`${e.streetLine1}, ${e.city}, ${e.countryIso2}`:void 0,{phone:r,fullName:s}=e,l=t?kr(t,e.shipping):void 0,o=l?l.title:void 0;return{paymentMethod:n,paymentProvider:a,shippingAddress:c,name:s,phone:r,shippingMethod:o}}(M,c,E||"")},[a,M,c,E]);const $=Object(n.m)(()=>{const{saveInfo:e}=M,t=function(e){const{streetLine1:t,streetLine2:a,city:n,state:c,countryIso2:r,postCode:s,fullName:l,phone:o,email:i}=e;return{name:l,phone:o,email:i,shippingAddress:{streetLine1:t,streetLine2:a,city:n,state:c,countryIso2:r,postCode:s}}}(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:r,billingZip:s}=e,[l,o]=n.split("/");return{data:{cardNumber:t,cardholder:a,expiryMonth:l,expiryYear:o,cvv:c,country:r,zip:s}}}(M);w({credentials:e})},[w,M]),_=Object(n.m)(()=>{I({shippingOptionId:M.shipping,saveCredentials:M.saveCredentials})},[I,M]),V=Object(n.m)(e=>{S({step:e})},[S]),W=Object(n.m)(()=>{switch(x(!0),a){case s.i.ShippingInfo:return $();case s.i.Shipping:return V(s.i.PaymentInfo);case s.i.PaymentInfo:return H();case s.i.Checkout:return _();default:return()=>{}}},[a,$,V,H,_]),K=Object(n.p)(()=>{switch(a){case s.i.ShippingInfo:return U("PaymentShippingInfo");case s.i.Shipping:return U("PaymentShippingMethod");case s.i.PaymentInfo:return U("PaymentCardInfo");case s.i.Checkout:return U("PaymentCheckout");default:return""}},[a,U]),Y=Object(n.p)(()=>{switch(a){case s.i.Checkout:return U("Checkout.PayPrice",`${D}${(q/100).toFixed(2)}`);default:return U("Next")}},[a,U,D,q]);return p?n.a.createElement(ge.a,{className:"error",isOpen:e,onClose:t},n.a.createElement("p",null,"Sorry, Telegram T 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(R.a,{isText:!0,onClick:t},U("OK"))):n.a.createElement(ge.a,{className:"PaymentModal",isOpen:e,onClose:t},n.a.createElement("div",{className:"header",dir:U.isRtl?"rtl":void 0},n.a.createElement(R.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.b,{name:"slide",activeKey:a},()=>n.a.createElement("div",{className:"content custom-scroll"},function(e){switch(e){case s.i.ShippingInfo:return n.a.createElement(hr,{state:M,dispatch:A,needAddress:Boolean(i),needEmail:Boolean(m||h),needPhone:Boolean(d||u),needName:Boolean(o)});case s.i.Shipping:return n.a.createElement(br,{state:M,dispatch:A,shippingOptions:c||[],currency:D});case s.i.PaymentInfo:return n.a.createElement(Cr,{state:M,dispatch:A,canSaveCredentials:Boolean(!g&&l),needCardholderName:f,needCountry:j,needZip:C});case s.i.Checkout:return n.a.createElement(vr,{prices:O,shippingPrices:M.shipping&&c?Nr(c,M.shipping):void 0,totalPrice:q,invoiceContent:v,checkoutInfo:z,currency:D});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(R.a,{type:"submit",onClick:W,disabled:B,isLoading:B},Y)),y&&!y.field&&function(){if(y)return n.a.createElement(ge.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(R.a,{isText:!0,onClick:P},U("OK")))}())}));function kr(e,t){return e.find(({id:e})=>e===t)}function Nr(e,t){const a=kr(e,t);return a?a.prices:void 0}var Ir=Object(n.h)(Object(c.h)(e=>{const{receipt:t}=e.payment,{currency:a,prices:n,info:c,totalAmount:r,credentialsTitle:s,shippingPrices:l,shippingMethod:o,photoUrl:i,text:d,title:m}=t||{};return{currency:a,prices:n,info:c,totalAmount:r,credentialsTitle:s,shippingPrices:l,shippingMethod:o,photoUrl:i,text:d,title:m}})(({isOpen:e,onClose:t,prices:a,shippingPrices:c,totalAmount:r,currency:s,info:l,photoUrl:o,text:i,title:d,credentialsTitle:m,shippingMethod:u})=>{const h=Object(F.a)(),b=er(s),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:r,name:s}=t;return{paymentMethod:e,paymentProvider:"Stripe",shippingAddress:c,name:s,phone:r,shippingMethod:a}}(m,l,u),[l,u,m]);return n.a.createElement(ge.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(R.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(vr,{prices:a,shippingPrices:c,totalPrice:r,invoiceContent:{photoUrl:o,text:i,title:d},checkoutInfo:g,currency:b}))))}))},,,,,,,,,,,,,,,,,,,,,,,function(e,t,a){"use strict";a.d(t,"a",(function(){return s}));var n=a(5),c=a(53);const r={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 s(e){const t=r[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(8),r=a(1),s=a(13),l=a(24),o=a(31),i=a(107),d=a(16);a(149);const m={type:"blob",quality:.8,format:"jpeg",circle:!1};let u,h,b;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;b=new u(t,{enableZoom:!0,boundary:{width:a,height:n},viewport:{width:a-16,height:n-16,type:"circle"}});const c=await Object(s.a)(e);await b.bind({url:c})}catch(e){r.p&&console.error(e)}}(e):async function(){return h||(h=Promise.all([a.e(6),a.e(8)]).then(a.bind(null,314)),u=(await h).default),h}().then(()=>p(!0)))},[e,g]);const v=Object(l.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(o.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(s.b)(e,"avatar.jpg");t(a)},ariaLabel:v("CropImage")},n.a.createElement("i",{className:"icon-check"})))});a(150);t.a=Object(n.h)(({title:e="Change your profile picture",disabled:t,currentAvatarBlobUrl:a,onChange:r})=>{const[s,l]=Object(n.r)(),[o,i]=Object(n.r)(a);Object(n.n)(()=>{i(a)},[a]);const d=Object(c.a)(o&&"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]&&(l(t.files[0]),t.value="")},accept:"image/png, image/jpeg"}),n.a.createElement("i",{className:"icon-camera-add"}),o&&n.a.createElement("img",{src:o,alt:"Avatar"})),n.a.createElement(g,{file:s,onClose:function(){l(void 0)},onChange:function(e){l(void 0),r(e),o&&URL.revokeObjectURL(o),i(URL.createObjectURL(e))}}))})},,,,,,,,,,function(e,t,a){},,,,,,,,function(e,t,a){"use strict";var n=a(0),c=a(1),r=a(7),s=a(123),l=a(113);a(138);const o=[0,50],i=[0,20],d=[20,0],m=r.g?c.rb:c.qb;t.a=Object(n.h)(({isPasswordVisible:e,isBig:t})=>{const[a,r]=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(s.a)("MonkeyClose").then(r)},[a]),Object(n.n)(()=>{u||Object(s.a)("MonkeyPeek").then(h)},[u]);const E=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(l.a,{id:"closeMonkey",size:t?c.Bb:m,className:p?"hidden":"shown",animationData:a,playSegment:o,noLoop:!0,onLoad:E}),u&&n.a.createElement(l.a,{id:"peekMonkey",size:t?c.Bb: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(1),r=a(7),s=a(8),l=a(24),o=a(31);const i=r.g?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),E=Object(l.a)(),[O,f]=Object(n.r)(""),[j,C]=Object(n.r)(!1);return Object(n.n)(()=>{r.l||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(O)},autoComplete:"off"},n.a.createElement("div",{className:Object(s.a)("input-group password-input",O&&"touched",a&&"error"),dir:E.isRtl?"rtl":void 0},n.a.createElement("input",{ref:v,className:"form-control",type:t?"text":"password",id:"sign-in-password",value:O||"",autoComplete:"current-password",onChange:function(e){a&&h();const{target:t}=e;f(t.value),C(t.value.length>=c.Z),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"}))),j&&n.a.createElement(o.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){}])]); +//# sourceMappingURL=3.695679058d5b91efd31e.js.map \ No newline at end of file diff --git a/dist/3.695679058d5b91efd31e.js.map b/dist/3.695679058d5b91efd31e.js.map new file mode 100644 index 000000000..530ecd4d8 --- /dev/null +++ b/dist/3.695679058d5b91efd31e.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/Errors.tsx","webpack:///./src/components/main/Notifications.tsx","webpack:///./src/components/main/SafeLinkModal.tsx","webpack:///./src/components/common/CalendarModal.tsx","webpack:///./src/components/common/DeleteMessageModal.tsx","webpack:///./src/components/common/PinMessageModal.tsx","webpack:///./src/components/common/UnpinAllMessagesModal.tsx","webpack:///./src/components/middle/DeleteSelectedMessagesModal.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/ui/FloatingActionButton.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/common/Picker.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/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/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","message","mediaEl","fromImage","getNodes","width","windowWidth","windowSize","get","mediaSize","isVideo","photo","video","webPage","getMessageContent","Boolean","getVideoDimensions","getPhotoFullDimensions","AVATAR_FULL_DIMENSIONS","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","isVideoDownloadAllowed","setIsVideoDownloadAllowed","useState","videoMediaHash","getMessageMediaHash","undefined","videoBlobUrl","downloadProgress","useMediaWithDownloadProgress","useEffect","download","handleVideoDownloadClick","e","stopPropagation","isAllowed","MenuButton","useMemo","onTrigger","isOpen","Button","round","color","ariaLabel","IS_MOBILE_SCREEN","DropdownMenu","trigger","positionX","MenuItem","icon","href","ProgressSpinner","progress","noCross","MediaViewerFooter","text","isHideable","isMultiline","setIsMultiline","footerContent","checkIsMultiline","clientHeight","handleResize","throttle","addEventListener","removeEventListener","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","useLayoutEffect","listener","listenerEnter","listenerExit","current","PLATFORM_ENV","requestFullscreen","webkitRequestFullscreen","webkitEnterFullscreen","mozRequestFullScreen","mozCancelFullScreen","webkitCancelFullScreen","webkitExitFullscreen","useFullscreenStatus","isBuffered","bufferingHandlers","useBuffering","shouldRender","shouldRenderSpinner","transitionClassNames","spinnerClassNames","useShowTransition","pause","safePlay","togglePlayState","play","useVideoCleanup","handleMouseOver","handleMouseOut","handleTimeUpdate","currentTarget","handleEnded","handleFullscreenChange","handleSeek","Number","target","toggleControls","togglePayingStateBySpace","wrapperStyle","videoStyle","onMouseOver","onMouseOut","ref","autoPlay","playsInline","loop","muted","onEnded","onTimeUpdate","join","square","isShown","onChangeZoom","prevIsShown","usePrevious","inputRef","zoomLevel","setZoomLevel","isSeeking","handleStartSeek","handleStopSeek","buildClassName","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","preventDefault","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","animationKey","webPagePhoto","getMessageWebPagePhoto","getMessagePhoto","getMessageVideo","isWebPagePhoto","isPhoto","isFromSharedMedia","isFromSearch","slideAnimation","headerAnimation","isGhostAnimation","getMessageMediaFilename","prevSenderId","canPanZoomWrap","setCanPanZoomWrap","setIsZoomed","panDelta","setPanDelta","messageIds","getChatMediaMessageIds","selectedMediaMessageIndex","indexOf","isFirst","isLast","getMediaHash","full","photos","getChatAvatarHash","blobUrlPictogram","useMedia","ApiMediaFormat","BlobUrl","previewMediaHash","blobUrlPreview","startsWith","DataUri","fullMediaData","getMessageMediaFormat","localBlobUrl","thumbDataUri","useBlurSync","getMessageMediaThumbDataUri","photoDimensions","videoDimensions","toggle","forceUpdate","useForceUpdate","addListener","removeListener","prevMessage","prevOrigin","prevAvatarOwner","prevBestImageData","dispatchHeavyAnimationEvent","textParts","renderMessageText","timer","closeZoom","handleZoomToggle","handleZoomValue","level","canCloseZoom","close","handleFooterClick","handleForward","fromChatId","captureEscKeyListener","stopCurrentAudio","getMessageId","fromId","direction","index","selectPreviousMedia","selectNextMedia","handleKeyDown","shouldCloseOnVideo","captureEvents","excludedClosestSelector","onSwipe","SwipeDirection","Right","Left","handlePan","renderSlide","isActive","calculateMediaViewerDimensions","renderSenderInfo","ShowTransition","isRtl","Transition","activeKey","name","aria-label","chats","byId","chatsById","listIds","currentUserId","activeListIds","active","archivedListIds","archived","setForwardChatId","exitForwardMode","loadMoreChats","filter","setFilter","focus","blur","chatIds","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","errors","dismissError","title","getReadableErrorText","isText","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","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","formatMonthAndYear","d","dateCopy","letter","role","tabIndex","handleDateSelect","inputMode","formatHumanDate","formatTime","formatSubmitLabel","isSchedule","selectCurrentMessageList","canDeleteForAll","selectAllowedMessageActions","contactName","getUserFirstOrLastName","getPrivateChatUserId","willDeleteForCurrentUserOnly","isChatBasicGroup","willDeleteForAll","isChatSuperGroup","album","deleteMessages","deleteScheduledMessages","handleDeleteMessageForAll","messages","shouldDeleteForAll","handleDeleteMessageForSelf","onEnter","isPrivateChat","isChatWithSelf","selectIsChatWithSelf","isChannel","isChatChannel","isGroup","isSuperGroup","canPinForAll","pinMessage","handlePinMessageForAll","isUnpin","handlePinMessage","isOneSide","isSilent","pinnedMessagesCount","onUnpin","selectedMessageIds","selectedMessages","selectCanDeleteSelectedMessages","selectCurrentChat","exitMessageSelectMode","messageListType","canDelete","selectedMessagesCount","selectSelectedMessagesCount","canDeleteMessages","canPost","openForwardMenuForSelectedMessages","isDeleteModalOpen","openDeleteModal","closeDeleteModal","useFlag","captureKeyboardListeners","onBackspace","onDelete","onEsc","prevSelectedMessagesCount","renderingSelectedMessagesCount","formattedMessagesCount","destructive","onSelect","buttonRef","activeElement","privateChatUserId","privateChatUser","isPinned","selectIsChatPinned","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","lastSyncTime","searchQuery","mediaThumbnail","mediaBlobUrl","isRoundVideo","getMessageRoundVideo","withOnlineStatus","isSavedMessages","isSelf","isVerified","VerifiedIcon","Link","formatPastTimeShort","getMessageSummaryText","highlight","renderMessageSummary","searchDate","suggestions","match","formatDateToString","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","unique","foundMessages","split","sort","a","b","handleClickShowMoreLocal","handleClickShowMoreGlobal","nothingFound","noScrollRestoreOnTop","noFastList","NothingFound","description","PickerSelectedItem","chatOrUserId","clickArg","createMapStateToProps","props","currentType","isVoice","isLoading","searchChatId","handleSelectMedia","canRenderContents","useAsyncRendering","SLIDE_TRANSITION_DURATION","isMediaGrid","isMessageList","classNames","itemSelector","Media","idPrefix","getSenderName","senderName","isChatGroup","handleMessageFocus","shouldDrawDateDivider","toYearMonth","WebLink","onMessageClick","getMessageDocument","Document","withDate","datetime","smaller","onDateClick","openAudioPlayer","handlePlayAudio","Audio","renderingFor","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","formatPhoneNumberWithCode","phoneNumber","FloatingActionButton","buttonClassName","LINK_PREFIX_REGEX","USERNAME_REGEX","runDebouncedForCheckUsername","debounce","currentUsername","asLink","isUsernameAvailable","checkUsername","setUsername","langPrefix","label","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","runThrottledForLoadRecommended","orderedIds","orderedFolderIds","foldersById","recommended","recommendedChatFolders","chatFolders","notifySettings","selectNotifySettings","notifyExceptions","selectNotifyExceptions","onCreateFolder","onEditFolder","loadRecommendedChatFolders","addChatFolder","showError","animationData","setAnimationData","isAnimationLoaded","setIsAnimationLoaded","handleAnimationLoad","getAnimationData","then","handleCreateFolder","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","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","orderedPinnedIds","archivedPinnedIds","activeChatArrays","prepareChatList","archivedChatArrays","pinnedChats","otherChats","displayedIds","newFilter","handleSelectedIdsChange","ids","handleSelectedChatTypesChange","newFilters","forEach","handleReset","handleEditFolder","handleAddIncludedChats","handleAddExcludedChats","options","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","RadioGroup","selected","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","theme","slug","thumbRef","useCanvasBlur","isDownloadAllowed","setIsDownloadAllowed","fullMedia","wasDownloadDisabled","UPLOADING_WALLPAPER_SLUG","cacheKeyRef","handleSelect","blob","fetchBlob","cacheApi","CUSTOM_BG_CACHE_NAME","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","data","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","privacy","blocked","activeSessions","blockedCount","totalCount","sessionsCount","visibilityPrivacyPhoneNumber","visibility","visibilityPrivacyLastSeen","lastSeen","visibilityPrivacyProfilePhoto","profilePhoto","visibilityPrivacyForwarding","forwards","visibilityPrivacyGroupChats","chatInvite","loadPrivacySettings","loadBlockedContacts","loadAuthorizations","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","hash","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","code","itemIds","filterPlaceholder","notFoundText","searchInputId","getCurrentPrivacySettings","isAllowList","setPrivacySettings","selectedContactIds","setSearchQuery","isSubmitShown","setIsSubmitShown","newSelectedContactIds","setNewSelectedContactIds","handleSelectedContactIdsChange","contactsIds","shouldSkipTransition","foldersState","foldersDispatch","twoFaState","twoFaDispatch","handleSaveFilter","renderCurrentSection","Main","renderCurrentSectionContent","contactIds","resultIds","sortUserIds","forceShowSelf","isSearching","selectedMemberIds","onSelectedMemberIdsChange","onNextStep","setGlobalSearchQuery","handleNextStep","creationProgress","creationError","chatCreation","memberIds","createGroupChat","createChannel","setTitle","about","setAbout","ChatCreationProgress","handleTitleChange","handleDescriptionChange","handleCreateGroup","handleCreateChannel","renderedError","RENDER_COUNT","LeftColumnContent","onContentChange","newChatMemberIds","setNewChatMemberIds","NewChannelStep2","NewGroupStep2","NewChannelStep1","NewGroupStep1","folderType","noChatsText","IGNORED_KEYS","Down","ArrowDown","Up","ArrowUp","ArrowLeft","ArrowRight","PageUp","PageDown","End","Home","Tab","preventDefaultForScrollKeys","disableScrolling","passive","ontouchmove","onkeydown","enableScrolling","getCopyLabel","hasSelection","canImageBeCopied","MessageContextMenu","anchor","canSendNow","canReschedule","canReply","canEdit","canPin","canUnpin","canForward","canFaveSticker","canUnfaveSticker","canCopy","canCopyLink","canSelect","onReply","onEdit","onPin","onFaveSticker","onUnfaveSticker","onSend","onReschedule","onCloseAnimationEnd","onCopyLink","copyOptions","afterEffect","getMessageText","CLIPBOARD_ITEM_SUPPORTED","selection","getSelection","mediaLoader","copyImageToClipboard","anchorNode","parentNode","clipboardText","copyTextToClipboard","getMessageCopyOptions","getTriggerElement","getRootElement","getMenuElement","positionY","useContextMenuPosition","Menu","noOptions","isScheduled","setReplyingToId","setEditingId","faveSticker","unfaveSticker","toggleMessageSelection","sendScheduledMessages","rescheduleMessage","loadMessageLink","isMenuOpen","setIsMenuOpen","setIsDeleteModalOpen","isPinModalOpen","setIsPinModalOpen","isCalendarOpen","openCalendar","closeCalendar","closeMenu","closePinModal","handleCloseCalendar","handleReply","handleEdit","handlePin","handleUnpin","handleFaveSticker","handleUnfaveSticker","handleSelectMessage","params","childMessageIds","withShift","handleScheduledMessageSend","handleOpenCalendar","handleRescheduleMessage","scheduledAt","handleCopyLink","scheduledMaxDate","getDayStartAt","selectStickerSet","stickerSetId","loadStickers","toggleStickerSet","sendMessage","throttleMs","isDisabled","stickerSetAccessHash","isPreloadedGlobally","handleButtonClick","hasCloseButton","STICKER_SIZE_MODAL","isRestricted","isMuted","canDeleteChat","getCanDeleteChat","canSubscribe","canSearch","canMute","canLeave","onSubscribeChannel","onSearchClick","updateChatMutedState","enterMessageSelectMode","handleToggleMuteClick","handleSubscribe","handleSearch","handleSelectMessages","Portal","runDebouncedForSearch","results","selectCurrentTextSearch","setLocalTextSearchQuery","searchTextMessagesLocal","closeLocalTextSearch","searchMessagesByDate","focusedIndex","setFocusedIndex","visualViewport","mainEl","pageTop","Array","from","input","div","contentEditable","handleMessageSearchQueryChange","newQuery","handleJumpToDate","timestamp","valueOf","handleUp","newFocusIndex","handleDown","noPushState","SearchInput","findInViewport","selectorOrElements","margin","isDense","shouldContainBottom","isHorizontal","viewportY1","viewportY2","allElements","visibleIndexes","isFound","y1","y2","isFullyVisible","onInsertUserName","filteredChatMembers","getSelectedIndex","newIndex","cycleRestrict","selectedMentionIndex","setSelectedMentionIndex","handleArrowKey","handleUserSelect","forceFocus","handleSelectMention","member","onUp","onDown","onTab","first","position","fastSmoothScroll","setItemVisible","prevChatMembers","renderedChatMembers","attachments","caption","canSuggestMembers","groupChatMembers","recentEmojis","onCaptionUpdate","addRecentEmoji","onFileAppend","onClear","hideTimeoutRef","prevAttachments","renderingAttachments","isHovered","markHovered","unmarkHovered","isQuick","every","quick","isMentionTooltipOpen","mentionFilter","closeMentionTooltip","insertMention","mentionFilteredMembers","useMentionTooltip","EDITABLE_INPUT_MODAL_ID","isEmojiTooltipOpen","closeEmojiTooltip","filteredEmojis","insertEmoji","useEmojiTooltip","sendAttachments","handleFilesDrop","dataTransfer","newFiles","file","CONTENT_TYPES_FOR_QUICK_UPLOAD","areAllPhotos","mimeType","areAllVideos","renderHeader","onDragEnter","onDrop","onDragOver","onDragLeave","relatedTarget","toTarget","fromTarget","data-attach-description","attachment","File","filename","extension","getFileExtension","previewData","emojis","onEmojiSelect","MessageInput","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","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","allowedAttachmentOptions","setRecentEmojis","handleMouseEnter","handleMouseLeave","fastRaf","recentEmojisRef","renderContent","isFrom","onMouseEnter","onMouseLeave","noCloseOnBackdrop","onFileSelect","onPollCreate","handleQuickSelect","handleDocumentSelect","canAttachMedia","canAttachPolls","autoClose","forEmoji","clearStickersForEmoji","prevStickers","displayedStickers","clickInlineButton","keyboardButtons","row","button","onSilentSend","onScheduleSend","listEmojis","usePrevDuringAnimation","selectedIndex","setSelectedIndex","emojisCount","handleSelectEmoji","onLeft","onRight","messagesById","foundResults","senderUser","getGlobal","senderChat","forwardInfo","isChannelPost","orderBy","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","currentIsMuted","isNotificationsEnabled","setIsNotificationsEnabled","ManagementProgress","handleNotificationChange","handleDeleteContact","lastMessage","maxId","withFullInfo","hasLinkedChannel","linkedChatId","isBasicGroup","canChangeInfo","getHasAdminRight","canBanUsers","togglePreHistoryHidden","updateChat","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","isCreator","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","globalErrors","validateRequestedInfo","sendPaymentForm","setPaymentStep","sendCredentialsInfo","clearPaymentError","paymentState","paymentDispatch","currencySign","field","fieldError","getShippingError","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.695679058d5b91efd31e.js","sourcesContent":["import { ApiMessage } from '../../../api/types';\nimport { MediaViewerOrigin } from '../../../types';\n\nimport { ANIMATION_END_DELAY } from '../../../config';\nimport { getMessageContent, getPhotoFullDimensions, getVideoDimensions } from '../../../modules/helpers';\nimport {\n AVATAR_FULL_DIMENSIONS,\n calculateDimensions,\n getMediaViewerAvailableDimensions,\n MEDIA_VIEWER_MEDIA_QUERY,\n REM,\n} from '../../common/helpers/mediaDimensions';\n\nimport windowSize from '../../../util/windowSize';\n\nconst ANIMATION_DURATION = 200;\n\nexport function animateOpening(\n hasFooter: boolean, origin: MediaViewerOrigin, bestImageData: string, message?: ApiMessage,\n) {\n const { mediaEl: fromImage } = getNodes(origin, message);\n if (!fromImage) {\n return;\n }\n\n const { width: windowWidth } = windowSize.get();\n\n let isVideo = false;\n let mediaSize;\n if (message) {\n const { photo, video, webPage } = getMessageContent(message);\n isVideo = Boolean(video);\n mediaSize = video ? getVideoDimensions(video)! : getPhotoFullDimensions((photo || webPage!.photo)!)!;\n } else {\n mediaSize = AVATAR_FULL_DIMENSIONS;\n }\n\n // eslint-disable-next-line max-len\n const {\n width: availableWidth, height: availableHeight,\n } = getMediaViewerAvailableDimensions(hasFooter, isVideo);\n const { width: toWidth, height: toHeight } = calculateDimensions(\n availableWidth, availableHeight, mediaSize.width, mediaSize.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, {\n FC, useCallback, useEffect, useMemo, useState,\n} from '../../lib/teact/teact';\n\nimport { ApiMessage } from '../../api/types';\n\nimport { IS_MOBILE_SCREEN } from '../../util/environment';\nimport download from '../../util/download';\nimport { getMessageMediaHash } from '../../modules/helpers';\nimport useMediaWithDownloadProgress from '../../hooks/useMediaWithDownloadProgress';\nimport useLang from '../../hooks/useLang';\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 [isVideoDownloadAllowed, setIsVideoDownloadAllowed] = useState(false);\n const videoMediaHash = isVideo && message ? getMessageMediaHash(message, 'download') : undefined;\n const {\n mediaData: videoBlobUrl, downloadProgress,\n } = useMediaWithDownloadProgress(videoMediaHash, !isVideoDownloadAllowed);\n\n // Download with browser when fully loaded\n useEffect(() => {\n if (isVideoDownloadAllowed && videoBlobUrl) {\n download(videoBlobUrl, fileName!);\n setIsVideoDownloadAllowed(false);\n }\n }, [fileName, videoBlobUrl, isVideoDownloadAllowed]);\n\n // Cancel download on slide change\n useEffect(() => {\n setIsVideoDownloadAllowed(false);\n }, [videoMediaHash]);\n\n const handleVideoDownloadClick = useCallback((e: React.SyntheticEvent) => {\n e.stopPropagation();\n setIsVideoDownloadAllowed((isAllowed) => !isAllowed);\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_MOBILE_SCREEN) {\n return (\n
\n \n {!isAvatar && (\n \n {lang('Forward')}\n \n )}\n {isVideo ? (\n \n {isVideoDownloadAllowed ? `${Math.round(downloadProgress * 100)}% Downloading...` : 'Download'}\n \n ) : (\n \n {lang('AccActionDownload')}\n \n )}\n \n {isVideoDownloadAllowed && }\n
\n );\n }\n\n return (\n
\n {!isAvatar && (\n <>\n \n \n \n \n )}\n {isVideo ? (\n \n {isVideoDownloadAllowed ? (\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';\nimport { throttle } from '../../util/schedulers';\nimport { TextPart } from '../common/helpers/renderMessageText';\nimport { REM } from '../common/helpers/mediaDimensions';\n\nimport './MediaViewerFooter.scss';\n\nconst RESIZE_THROTTLE_MS = 500;\n\ntype OwnProps = {\n text: TextPart | TextPart[];\n onClick: () => void;\n isHideable: boolean;\n};\n\nconst MediaViewerFooter: FC = ({ text = '', isHideable, onClick }) => {\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 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_MOBILE_SCREEN } 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_MOBILE_SCREEN) {\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 { IDimensions } from '../../modules/helpers';\n\nimport { IS_IOS, IS_MOBILE_SCREEN, 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';\n\nimport './VideoPlayer.scss';\n\ntype OwnProps = {\n url?: string;\n isGif?: boolean;\n posterData?: string;\n posterSize?: IDimensions;\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\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 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 {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_MOBILE_SCREEN } 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,\n} from '../../api/types';\nimport { MediaViewerOrigin } from '../../types';\n\nimport { ANIMATION_END_DELAY } from '../../config';\nimport { IS_IOS, IS_MOBILE_SCREEN, IS_TOUCH_ENV } from '../../util/environment';\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 getMessageMediaFilename,\n getMessageMediaFormat,\n getMessageMediaHash,\n getMessageMediaThumbDataUri,\n getMessagePhoto,\n getMessageVideo,\n getMessageWebPagePhoto,\n getPhotoFullDimensions,\n getVideoDimensions,\n IDimensions,\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';\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 // eslint-disable-next-line no-null/no-null\n const animationKey = useRef(null);\n const isOpen = Boolean(avatarOwner || messageId);\n const webPagePhoto = message ? getMessageWebPagePhoto(message) : undefined;\n const photo = message ? getMessagePhoto(message) : undefined;\n const video = message ? getMessageVideo(message) : undefined;\n const isWebPagePhoto = Boolean(webPagePhoto);\n const isPhoto = Boolean(photo || webPagePhoto);\n const isVideo = Boolean(video);\n const isGif = video ? video.isGif : undefined;\n const isFromSharedMedia = origin === MediaViewerOrigin.SharedMedia;\n const isFromSearch = origin === MediaViewerOrigin.SearchResult;\n const slideAnimation = animationLevel >= 1 ? 'mv-slide' : 'none';\n const headerAnimation = animationLevel === 2 ? 'slide-fade' : 'none';\n const isGhostAnimation = animationLevel === 2;\n const fileName = avatarOwner\n ? `avatar${avatarOwner.id}-${profilePhotoIndex}.jpg`\n : message && getMessageMediaFilename(message);\n const prevSenderId = usePrevious(senderId);\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 const messageIds = useMemo(() => {\n return isWebPagePhoto && messageId\n ? [messageId]\n : getChatMediaMessageIds(chatMessages || {}, collectionIds || [], isFromSharedMedia);\n }, [isWebPagePhoto, 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 if (isOpen && (!prevSenderId || prevSenderId !== senderId || !animationKey.current)) {\n animationKey.current = selectedMediaMessageIndex;\n }\n\n function getMediaHash(full?: boolean) {\n if (avatarOwner && profilePhotoIndex !== undefined) {\n const { photos } = avatarOwner;\n return photos && photos[profilePhotoIndex]\n ? `photo${photos[profilePhotoIndex].id}?size=c`\n : getChatAvatarHash(avatarOwner, full ? 'big' : 'normal');\n }\n\n return message && getMessageMediaHash(message, full ? '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 avatarOwner && 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 photoDimensions = isPhoto ? getPhotoFullDimensions((\n isWebPagePhoto ? getMessageWebPagePhoto(message!) : getMessagePhoto(message!)\n )!) : undefined;\n const videoDimensions = isVideo ? getVideoDimensions(getMessageVideo(message!)!) : undefined;\n\n useEffect(() => {\n if (!IS_MOBILE_SCREEN) {\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!, 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,\n message, prevMessage, prevAvatarOwner, bestImageData, prevBestImageData,\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 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) {\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 {\n close();\n }\n } : undefined,\n });\n }, [close, isGif, isZoomed, selectNextMedia, selectPreviousMedia, canPanZoomWrap]);\n\n const handlePan = useCallback((x: number, y: number) => {\n setPanDelta({ x, y });\n }, []);\n\n const lang = useLang();\n\n function renderSlide(isActive: boolean) {\n if (avatarOwner) {\n return (\n
\n {renderPhoto(\n fullMediaData || blobUrlPreview,\n calculateMediaViewerDimensions(AVATAR_FULL_DIMENSIONS, false),\n !IS_MOBILE_SCREEN && !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(photoDimensions!, hasFooter),\n !IS_MOBILE_SCREEN && !isZoomed,\n )}\n {isVideo && (\n \n )}\n {textParts && (\n \n )}\n
\n );\n }\n\n return undefined;\n }\n\n function renderSenderInfo() {\n return (\n \n );\n }\n\n return (\n \n {() => (\n <>\n
\n {IS_MOBILE_SCREEN && (\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?: IDimensions, 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_MOBILE_SCREEN } from '../../util/environment';\nimport {\n getCanPostInChat, getChatTitle, isChatPrivate, sortChatIds,\n} from '../../modules/helpers';\nimport searchWords from '../../util/searchWords';\nimport { pick } 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 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 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_MOBILE_SCREEN) {\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 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, currentUserId ? [currentUserId] : undefined);\n }, [activeListIds, archivedListIds, chatsById, currentUserId, filter, lang]);\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) {\n setForwardChatId({ id: viewportIds[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 },\n currentUserId,\n } = global;\n\n return {\n chatsById,\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 } from '../../api/types';\n\nimport getReadableErrorText from '../../util/getReadableErrorText';\nimport { pick } from '../../util/iteratees';\nimport useLang from '../../hooks/useLang';\n\nimport Modal from '../ui/Modal';\nimport Button from '../ui/Button';\n\nimport './Errors.scss';\n\ntype StateProps = {\n errors: ApiError[];\n};\n\ntype DispatchProps = Pick;\n\nconst Errors: FC = ({ errors, dismissError }) => {\n const lang = useLang();\n\n if (!errors.length) {\n return undefined;\n }\n\n return (\n
\n {errors.map((error) => (\n \n

{getReadableErrorText(error)}

\n \n \n ))}\n
\n );\n};\n\nfunction getErrorHeader(error: ApiError) {\n if (error.isSlowMode) {\n return 'Slowmode enabled';\n }\n\n return 'Something went wrong';\n}\n\nexport default memo(withGlobal(\n (global): StateProps => pick(global, ['errors']),\n (setGlobal, actions): DispatchProps => pick(actions, ['dismissError']),\n)(Errors));\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 {\n formatMonthAndYear, formatHumanDate, formatTime,\n} from '../../util/dateFormat';\nimport { IS_MOBILE_SCREEN } from '../../util/environment';\nimport useLang, { LangFn } from '../../hooks/useLang';\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 = ['M', 'T', 'W', 'T', 'F', 'S', 'S'];\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\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 (isOpen) {\n setSelectedDate(defaultSelectedDate);\n }\n }, [isOpen, defaultSelectedDate]);\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 {formatMonthAndYear(lang, selectedDate, IS_MOBILE_SCREEN)}\n

\n\n \n \n \n\n \n \n \n
\n
\n\n
\n
\n {WEEKDAY_LETTERS.map((letter) => (\n
\n {letter}\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();\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 = formatHumanDate(lang, date, true);\n\n if (day === 'Today') {\n return lang('Conversation.ScheduleMessage.SendToday', formatTime(date));\n }\n\n return lang('Conversation.ScheduleMessage.SendOn', day).replace('%@', formatTime(date));\n}\n\nexport default memo(CalendarModal);\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')}

\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';\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, { FC, useCallback, memo } 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';\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 DeleteSelectedMessagesModal: 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 handleDeleteMessageForAll = useCallback(() => {\n deleteMessages({ messageIds: selectedMessageIds, shouldDeleteForAll: true });\n exitMessageSelectMode();\n onClose();\n }, [deleteMessages, exitMessageSelectMode, 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 exitMessageSelectMode();\n onClose();\n }, [\n isSchedule, exitMessageSelectMode, onClose, deleteScheduledMessages, selectedMessageIds, deleteMessages,\n ]);\n\n const lang = useLang();\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)(DeleteSelectedMessagesModal));\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 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 DeleteSelectedMessagesModal from './DeleteSelectedMessagesModal';\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};\n\ntype DispatchProps = Pick;\n\nconst MessageSelectToolbar: FC = ({\n canPost,\n isActive,\n messageListType,\n isSchedule,\n selectedMessagesCount,\n canDeleteMessages,\n exitMessageSelectMode,\n openForwardMenuForSelectedMessages,\n}) => {\n const [isDeleteModalOpen, openDeleteModal, closeDeleteModal] = useFlag();\n\n useEffect(() => {\n return isActive && !isDeleteModalOpen\n ? captureKeyboardListeners({\n onBackspace: openDeleteModal,\n onDelete: openDeleteModal,\n onEsc: exitMessageSelectMode,\n })\n : undefined;\n }, [isActive, isDeleteModalOpen, 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 \n \n {lang('Delete')}\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\n return {\n isSchedule: messageListType === 'scheduled',\n selectedMessagesCount: selectSelectedMessagesCount(global),\n canDeleteMessages: canDelete,\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 } from '../../../modules/helpers';\nimport { selectChat, selectUser, selectIsChatPinned } 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};\n\nconst LeftSearchResultChat: FC = ({\n chatId,\n chat,\n privateChatUser,\n isPinned,\n withUsername,\n onClick,\n}) => {\n const [isDeleteModalOpen, openDeleteModal, closeDeleteModal] = useFlag();\n\n const contextActions = useChatContextActions({\n chat,\n privateChatUser,\n isPinned,\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\n return {\n chat,\n privateChatUser,\n isPinned,\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, !topUserIds);\n\n const handleClick = useCallback(\n (id: number) => {\n openChat({ id });\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_MOBILE_SCREEN } 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 ...(privateChatUserId && { privateChatUser: selectUser(global, privateChatUserId) }),\n lastSyncTime: global.lastSyncTime,\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_MOBILE_SCREEN } 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 });\n\n if (id !== currentUserId) {\n addRecentlyFoundChatId({ id });\n }\n\n if (!IS_MOBILE_SCREEN) {\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 }, [searchQuery, localContactIds, currentUserId, lang, localChatIds, localUserIds, chatsById, usersById]);\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]), 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 { currentUserId, messages, lastSyncTime } = 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';\n\nexport type StateProps = {\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 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 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';\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(0);\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 // 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_MOBILE_SCREEN } 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('EnterPassword')}

;\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 Delete Folder\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 useLang from '../../../hooks/useLang';\n\nimport ListItem from '../../ui/ListItem';\nimport Avatar from '../../common/Avatar';\n\ntype OwnProps = {\n onScreenSelect: (screen: SettingsScreens) => void;\n};\n\ntype StateProps = {\n currentUser?: ApiUser;\n};\n\nconst SettingsMain: FC = ({\n onScreenSelect,\n currentUser,\n}) => {\n const lang = useLang();\n\n return (\n
\n
\n {currentUser && (\n
\n \n

{getUserFullName(currentUser)}

\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 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 { 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 } 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';\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 currentAvatarHash,\n currentFirstName,\n currentLastName,\n currentBio,\n currentUsername,\n progress,\n isUsernameAvailable,\n loadCurrentUser,\n updateProfile,\n checkUsername,\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 // 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 const lang = useLang();\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 } 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';\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};\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 chatsById,\n usersById,\n orderedFolderIds,\n foldersById,\n recommendedChatFolders,\n notifySettings,\n notifyExceptions,\n loadRecommendedChatFolders,\n addChatFolder,\n showError,\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 showError({\n error: {\n message: 'DIALOG_FILTERS_TOO_MUCH',\n },\n });\n\n return;\n }\n\n onCreateFolder();\n }, [foldersById, showError, onCreateFolder]);\n\n const lang = useLang();\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 showError({\n error: {\n message: 'DIALOG_FILTERS_TOO_MUCH',\n },\n });\n\n return;\n }\n\n addChatFolder({ folder });\n }, [foldersById, addChatFolder, showError]);\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', 'showError']),\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, useState, useEffect, useMemo,\n} from '../../../../lib/teact/teact';\nimport { withGlobal } from '../../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../../global/types';\n\nimport { STICKER_SIZE_FOLDER_SETTINGS } from '../../../../config';\nimport { pick, findIntersectionWithSet } from '../../../../util/iteratees';\nimport { isChatPrivate } from '../../../../modules/helpers';\nimport getAnimationData from '../../../common/helpers/animatedAssets';\nimport {\n FoldersState,\n FolderEditDispatch,\n INCLUDED_CHAT_TYPES,\n EXCLUDED_CHAT_TYPES,\n selectChatFilters,\n} from '../../../../hooks/reducers/useFoldersReducer';\nimport useLang from '../../../../hooks/useLang';\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 onReset: () => 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 onReset,\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 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';\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';\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};\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 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 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 { FoldersState, FolderEditDispatch } 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 state: FoldersState;\n dispatch: FolderEditDispatch;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\nconst SettingsFolders: FC = ({\n currentScreen,\n state,\n dispatch,\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_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';\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 onScreenSelect: (screen: SettingsScreens) => void;\n};\n\ntype StateProps = ISettings['byKey'] & {\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 onScreenSelect,\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('--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);\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('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 [\n 'messageTextSize',\n 'animationLevel',\n 'messageSendKeyCombo',\n 'shouldAutoDownloadMediaFromContacts',\n 'shouldAutoDownloadMediaInPrivateChats',\n 'shouldAutoDownloadMediaInGroups',\n 'shouldAutoDownloadMediaInChannels',\n 'shouldAutoPlayGifs',\n 'shouldAutoPlayVideos',\n 'shouldSuggestStickers',\n 'shouldLoopStickers',\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 useLang from '../../../hooks/useLang';\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 onScreenSelect: (screen: SettingsScreens) => 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 onScreenSelect,\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 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 } = global.settings.byKey;\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 useFlag from '../../../hooks/useFlag';\nimport buildClassName from '../../../util/buildClassName';\n\nimport InputText from '../../ui/InputText';\n\nimport './SettingsGeneralBackgroundColor.scss';\n\ntype OwnProps = {\n onScreenSelect: (screen: SettingsScreens) => 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 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 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 } = global.settings.byKey;\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';\n\nimport { pick } from '../../../util/iteratees';\nimport useLang from '../../../hooks/useLang';\n\nimport Checkbox from '../../ui/Checkbox';\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 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 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';\n\nimport ListItem from '../../ui/ListItem';\n\ntype OwnProps = {\n onScreenSelect: (screen: SettingsScreens) => void;\n};\n\ntype StateProps = {\n hasPassword?: boolean;\n blockedCount: number;\n sessionsCount: number;\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 onScreenSelect,\n hasPassword,\n blockedCount,\n sessionsCount,\n visibilityPrivacyPhoneNumber,\n visibilityPrivacyLastSeen,\n visibilityPrivacyProfilePhoto,\n visibilityPrivacyForwarding,\n visibilityPrivacyGroupChats,\n loadPrivacySettings,\n loadBlockedContacts,\n loadAuthorizations,\n}) => {\n useEffect(() => {\n loadBlockedContacts();\n loadAuthorizations();\n loadPrivacySettings();\n }, [loadBlockedContacts, loadAuthorizations, loadPrivacySettings]);\n\n const lang = useLang();\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 );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const {\n settings: {\n byKey: { hasPassword },\n privacy,\n },\n blocked,\n activeSessions,\n } = global;\n\n return {\n hasPassword,\n blockedCount: blocked.totalCount,\n sessionsCount: activeSessions.length,\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',\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 } 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';\n\ntype StateProps = Pick;\n\ntype DispatchProps = Pick;\n\nconst SettingsLanguage: FC = ({\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 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';\n\nimport ListItem from '../../ui/ListItem';\nimport RadioGroup from '../../ui/RadioGroup';\nimport { getPrivacyKey } from './helper/privacy';\n\ntype OwnProps = {\n screen: SettingsScreens;\n onScreenSelect: (screen: SettingsScreens) => void;\n};\n\ntype StateProps = Partial & {\n chatsById?: Record;\n usersById?: Record;\n};\n\ntype DispatchProps = Pick;\n\nconst SettingsPrivacyVisibility: FC = ({\n screen,\n onScreenSelect,\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 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';\n\nimport { pick } from '../../../util/iteratees';\nimport { formatPastTimeShort } from '../../../util/dateFormat';\nimport useFlag from '../../../hooks/useFlag';\nimport useLang from '../../../hooks/useLang';\n\nimport ListItem from '../../ui/ListItem';\nimport ConfirmDialog from '../../ui/ConfirmDialog';\n\ntype StateProps = {\n activeSessions: ApiSession[];\n};\n\ntype DispatchProps = Pick;\n\nconst SettingsPrivacyActiveSessions: FC = ({\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 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

Other Sessions

\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\n {otherSessions && renderOtherSessions(otherSessions)}\n\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';\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';\n\nimport ListItem from '../../ui/ListItem';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\nimport Avatar from '../../common/Avatar';\nimport Loading from '../../ui/Loading';\n\ntype StateProps = {\n chatsByIds: Record;\n usersByIds: Record;\n blockedIds: number[];\n};\n\ntype DispatchProps = Pick;\n\nconst SettingsPrivacyBlockedUsers: FC = ({\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 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';\n\nimport ListItem from '../../../ui/ListItem';\nimport AnimatedEmoji from '../../../common/AnimatedEmoji';\nimport renderText from '../../../common/helpers/renderText';\n\ntype OwnProps = {\n onScreenSelect: (screen: SettingsScreens) => void;\n};\n\ntype StateProps = {\n animatedEmoji: ApiSticker;\n};\n\nconst SettingsTwoFaEnabled: FC = ({ animatedEmoji, onScreenSelect }) => {\n const lang = useLang();\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 useLang from '../../../../hooks/useLang';\n\nimport PasswordMonkey from '../../../common/PasswordMonkey';\nimport PasswordForm from '../../../common/PasswordForm';\n\ntype OwnProps = {\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};\n\nconst EQUAL_PASSWORD_ERROR = 'Passwords Should Be Equal';\n\nconst SettingsTwoFaPassword: FC = ({\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 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';\n\nimport { selectAnimatedEmoji } from '../../../../modules/selectors';\nimport useLang from '../../../../hooks/useLang';\n\nimport Button from '../../../ui/Button';\nimport AnimatedEmoji from '../../../common/AnimatedEmoji';\n\ntype OwnProps = {\n onStart: NoneToVoidFunction;\n};\n\ntype StateProps = {\n animatedEmoji: ApiSticker;\n};\n\nconst SettingsTwoFaStart: FC = ({ animatedEmoji, onStart }) => {\n const lang = useLang();\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';\n\nimport { IS_MOBILE_SCREEN, IS_TOUCH_ENV } from '../../../../util/environment';\nimport { selectAnimatedEmoji } from '../../../../modules/selectors';\nimport useFlag from '../../../../hooks/useFlag';\nimport useLang from '../../../../hooks/useLang';\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};\n\ntype StateProps = {\n animatedEmoji: ApiSticker;\n};\n\nconst FOCUS_DELAY_TIMEOUT_MS = IS_MOBILE_SCREEN ? 550 : 400;\n\nconst SettingsTwoFaSkippableForm: FC = ({\n animatedEmoji,\n type = 'text',\n isLoading,\n error,\n placeholder,\n shouldConfirm,\n clearError,\n onSubmit,\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 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';\n\nimport Button from '../../../ui/Button';\nimport AnimatedEmoji from '../../../common/AnimatedEmoji';\n\ntype OwnProps = {\n onScreenSelect: (screen: SettingsScreens) => void;\n};\n\ntype StateProps = {\n animatedEmoji: ApiSticker;\n};\n\nconst SettingsTwoFaCongratulations: FC = ({ animatedEmoji, onScreenSelect }) => {\n const lang = useLang();\n\n const handleClick = () => {\n onScreenSelect(SettingsScreens.Privacy);\n };\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';\n\nimport { IS_MOBILE_SCREEN, IS_TOUCH_ENV } from '../../../../util/environment';\nimport { selectAnimatedEmoji } from '../../../../modules/selectors';\nimport useLang from '../../../../hooks/useLang';\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};\n\ntype StateProps = {\n animatedEmoji: ApiSticker;\n codeLength: number;\n};\n\nconst FOCUS_DELAY_TIMEOUT_MS = IS_MOBILE_SCREEN ? 550 : 400;\n\nconst SettingsTwoFaEmailCode: FC = ({\n animatedEmoji,\n codeLength,\n isLoading,\n error,\n clearError,\n onSubmit,\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 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 dispatch: TwoFaDispatch;\n onScreenSelect: (screen: SettingsScreens) => void;\n};\n\ntype StateProps = GlobalState['twoFaSettings'];\n\ntype DispatchProps = Pick;\n\nconst SettingsTwoFa: FC = ({\n currentScreen,\n state,\n hint,\n isLoading,\n error,\n waitingEmailCodeLength,\n dispatch,\n onScreenSelect,\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, 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 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 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, 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';\n\nimport Picker from '../../common/Picker';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\n\nexport type OwnProps = {\n isAllowList?: boolean;\n screen: SettingsScreens;\n onScreenSelect: (screen: SettingsScreens) => 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 onScreenSelect,\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 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 { IS_MOBILE_SCREEN } 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\nexport type OwnProps = {\n currentScreen: SettingsScreens;\n onScreenSelect: (screen: SettingsScreens) => void;\n shouldSkipTransition?: boolean;\n onReset: () => void;\n};\n\nconst Settings: FC = ({\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() {\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() {\n return (\n <>\n \n {renderCurrentSectionContent()}\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_MOBILE_SCREEN } 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';\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};\n\ntype StateProps = {\n usersById: Record;\n contactIds?: number[];\n};\n\ntype DispatchProps = Pick;\n\nconst runThrottled = throttle((cb) => cb(), 60000, true);\n\nconst ContactList: FC = ({\n filter, usersById, contactIds, loadContactList, openChat,\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 handleClick = useCallback(\n (id: number) => {\n openChat({ id });\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);\n }, [filter, usersById, contactIds]);\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_MOBILE_SCREEN}\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 };\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, sortChatIds } from '../../../modules/helpers';\nimport useLang from '../../../hooks/useLang';\n\nimport Picker from '../../common/Picker';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\nimport Button from '../../ui/Button';\n\nexport type OwnProps = {\n isChannel?: 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 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 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 ]),\n chatsById,\n false,\n selectedMemberIds,\n );\n }, [\n localContactIds, searchQuery, localUserIds, globalUserIds, usersById, chatsById, selectedMemberIds, currentUserId,\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 const lang = useLang();\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';\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 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 memberIds,\n onReset,\n creationProgress,\n creationError,\n createGroupChat,\n createChannel,\n}) => {\n const lang = useLang();\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 { IS_MOBILE_SCREEN } 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 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 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 {() => {\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';\n\nimport Button from '../ui/Button';\nimport ChatList from './main/ChatList';\n\nimport './ArchivedChats.scss';\n\nexport type OwnProps = {\n isActive: boolean;\n onReset: () => void;\n};\n\nconst ArchivedChats: FC = ({ isActive, onReset }) => {\n const lang = useLang();\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\nconst preventDefault = (e: Event) => {\n e.preventDefault();\n};\n\nfunction preventDefaultForScrollKeys(e: KeyboardEvent) {\n if (IGNORED_KEYS[e.key]) {\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 { getMessageMediaHash, getMessagePhoto, getMessageText } 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 const mediaHash = getMessageMediaHash(message, 'inline')!;\n const canImageBeCopied = photo && mediaHash && CLIPBOARD_ITEM_SUPPORTED;\n const selection = window.getSelection();\n\n if (canImageBeCopied) {\n options.push({\n label: 'lng_context_copy_image',\n handler: () => {\n mediaLoader.fetch(mediaHash, ApiMediaFormat.BlobUrl).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, canImageBeCopied),\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, canImageBeCopied: boolean): string {\n if (hasSelection) {\n return 'lng_context_copy_selected';\n }\n\n if (canImageBeCopied) {\n return 'lng_context_copy_text';\n }\n\n return 'Copy';\n}\n","import React, { FC, useCallback, useEffect } 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 { dispatchHeavyAnimationEvent } from '../../../hooks/useHeavyAnimationCheck';\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 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 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 ANIMATION_DURATION = 200;\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 canForward,\n canFaveSticker,\n canUnfaveSticker,\n canCopy,\n canCopyLink,\n canSelect,\n onReply,\n onEdit,\n onPin,\n onUnpin,\n onForward,\n onDelete,\n onFaveSticker,\n onUnfaveSticker,\n onSelect,\n onSend,\n onReschedule,\n onClose,\n onCloseAnimationEnd,\n onCopyLink,\n}) => {\n useEffect(() => {\n dispatchHeavyAnimationEvent(ANIMATION_DURATION);\n }, [isOpen]);\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 {canDelete && {lang('Delete')}}\n \n );\n};\n\nexport default MessageContextMenu;\n","import React, {\n FC, memo, useCallback, useEffect, 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 PinMessageModal from '../../common/PinMessageModal';\nimport MessageContextMenu from './MessageContextMenu';\nimport CalendarModal from '../../common/CalendarModal';\nimport { getDayStartAt } from '../../../util/dateFormat';\n\nexport type OwnProps = {\n isOpen: boolean;\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 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 message,\n album,\n anchor,\n onClose,\n onCloseAnimationEnd,\n noOptions,\n canSendNow,\n canReschedule,\n canReply,\n canPin,\n canUnpin,\n canDelete,\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 loadMessageLink,\n}) => {\n const { transitionClassNames } = useShowTransition(isOpen, onCloseAnimationEnd, undefined, false);\n const [isMenuOpen, setIsMenuOpen] = useState(true);\n const [isDeleteModalOpen, setIsDeleteModalOpen] = 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 closeMenu = useCallback(() => {\n setIsMenuOpen(false);\n onClose();\n }, [onClose]);\n\n const closeDeleteModal = useCallback(() => {\n setIsDeleteModalOpen(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 loadMessageLink({\n messageId: message.id,\n chatId: message.chatId,\n });\n closeMenu();\n }, [closeMenu, loadMessageLink, message.chatId, message.id]);\n\n useEffect(() => {\n disableScrolling();\n\n return enableScrolling;\n }, []);\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\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 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 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 'loadMessageLink',\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';\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_MOBILE_SCREEN } from '../../util/environment';\nimport { disableScrolling, enableScrolling } from '../../util/scrollLock';\nimport { selectChat } from '../../modules/selectors';\nimport { pick } from '../../util/iteratees';\nimport { isChatPrivate, getCanDeleteChat } 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 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 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}) => {\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 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_MOBILE_SCREEN && canSubscribe && (\n \n {lang(isChannel ? 'Subscribe' : 'Join Group')}\n \n )}\n {IS_MOBILE_SCREEN && 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: chat.isMuted,\n isPrivate: isChatPrivate(chat.id),\n canDeleteChat: getCanDeleteChat(chat),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'updateChatMutedState',\n 'enterMessageSelectMode',\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 useFlag from '../../hooks/useFlag';\nimport useLang from '../../hooks/useLang';\n\nimport Button from '../ui/Button';\nimport SearchInput from '../ui/SearchInput';\nimport CalendarModal from '../common/CalendarModal';\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};\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 setLocalTextSearchQuery,\n searchTextMessagesLocal,\n focusMessage,\n closeLocalTextSearch,\n searchMessagesByDate,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef(null);\n const [focusedIndex, setFocusedIndex] = useState(0);\n const [isCalendarOpen, openCalendar, closeCalendar] = useFlag();\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 }, [isCalendarOpen]);\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 handleJumpToDate = useCallback((date: Date) => {\n searchMessagesByDate({ timestamp: date.valueOf() / 1000 });\n closeCalendar();\n }, [closeCalendar, searchMessagesByDate]);\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 const lang = useLang();\n\n return (\n
\n
\n closeLocalTextSearch({ noPushState: true })}\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 \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 };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'setLocalTextSearchQuery',\n 'searchTextMessagesLocal',\n 'focusMessage',\n 'closeLocalTextSearch',\n 'searchMessagesByDate',\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 React, {\n FC, useCallback, useEffect, useState, useRef, memo,\n} from '../../../lib/teact/teact';\nimport usePrevious from '../../../hooks/usePrevious';\n\nimport { ApiChatMember, ApiUser } from '../../../api/types';\n\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport buildClassName from '../../../util/buildClassName';\nimport captureKeyboardListeners from '../../../util/captureKeyboardListeners';\nimport findInViewport from '../../../util/findInViewport';\nimport isFullyVisible from '../../../util/isFullyVisible';\nimport fastSmoothScroll from '../../../util/fastSmoothScroll';\nimport cycleRestrict from '../../../util/cycleRestrict';\n\nimport ListItem from '../../ui/ListItem';\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\n\nimport './MentionTooltip.scss';\n\nconst VIEWPORT_MARGIN = 8;\nconst SCROLL_MARGIN = 10;\n\nfunction setItemVisible(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 '.chat-item-clickable',\n VIEWPORT_MARGIN,\n true,\n true,\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\nexport type OwnProps = {\n isOpen: boolean;\n filter: string;\n onClose: () => void;\n onInsertUserName: (user: ApiUser, forceFocus?: boolean) => void;\n filteredChatMembers?: ApiChatMember[];\n usersById?: Record;\n};\n\nconst MentionTooltip: FC = ({\n isOpen,\n filter,\n onClose,\n onInsertUserName,\n usersById,\n filteredChatMembers,\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 (!filteredChatMembers) {\n return -1;\n }\n const membersCount = filteredChatMembers!.length;\n return cycleRestrict(membersCount, newIndex);\n }, [filteredChatMembers]);\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 (filteredChatMembers && filteredChatMembers.length && selectedMentionIndex > -1) {\n const member = filteredChatMembers[selectedMentionIndex];\n if (member) {\n e.preventDefault();\n handleUserSelect(member.userId, true);\n }\n }\n }, [filteredChatMembers, 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 (filteredChatMembers && !filteredChatMembers.length) {\n onClose();\n }\n }, [filteredChatMembers, onClose]);\n\n useEffect(() => {\n setSelectedMentionIndex(0);\n }, [filter]);\n\n useEffect(() => {\n setItemVisible(selectedMentionIndex, containerRef);\n }, [selectedMentionIndex]);\n\n const prevChatMembers = usePrevious(\n filteredChatMembers && filteredChatMembers.length\n ? filteredChatMembers\n : undefined,\n shouldRender,\n );\n const renderedChatMembers = filteredChatMembers && !filteredChatMembers.length\n ? prevChatMembers\n : filteredChatMembers;\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(({ userId }, index) => (\n handleUserSelect(userId)}\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';\nimport { CONTENT_TYPES_FOR_QUICK_UPLOAD, EDITABLE_INPUT_MODAL_ID } from '../../../config';\n\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 canSuggestMembers?: boolean;\n canSuggestEmoji?: boolean;\n currentUserId?: number;\n groupChatMembers?: ApiChatMember[];\n usersById?: Record;\n recentEmojis: string[];\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 canSuggestMembers,\n groupChatMembers,\n currentUserId,\n usersById,\n recentEmojis,\n onCaptionUpdate,\n addRecentEmoji,\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 = renderingAttachments && renderingAttachments.every((a) => a.quick);\n const lang = useLang();\n\n const {\n isMentionTooltipOpen, mentionFilter,\n closeMentionTooltip, insertMention,\n mentionFilteredMembers,\n } = useMentionTooltip(\n canSuggestMembers && isOpen,\n caption,\n onCaptionUpdate,\n EDITABLE_INPUT_MODAL_ID,\n groupChatMembers,\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 );\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.includes(file.type);\n })\n : Array.from(files);\n\n onFileAppend(newFiles, false);\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

Options

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

Solution

\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,\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) {\n closeTimeout = window.setTimeout(() => {\n if (!isMouseInside.current) {\n onClose();\n }\n }, menuCloseTimeout * 2);\n }\n }, [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(() => {\n onClick(emoji.native, emoji.id);\n }, [emoji, onClick]);\n\n return (\n \n {IS_EMOJI_SUPPORTED\n ? {emoji.native}\n : \"\"}\n
\n );\n};\n\nexport default memo(EmojiButton);\n","import React, { FC, memo, useRef } from '../../../lib/teact/teact';\n\nimport { IS_MOBILE_SCREEN } 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_MOBILE_SCREEN\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 { MEMO_EMPTY_ARRAY } from '../../../util/memo';\nimport { IS_MOBILE_SCREEN } from '../../../util/environment';\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, !IS_MOBILE_SCREEN);\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_MOBILE_SCREEN } 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_MOBILE_SCREEN ? 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_MOBILE_SCREEN\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 { 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);\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 onClick: (gif: ApiVideo) => void;\n};\n\nconst GifButton: FC = ({\n gif, observeIntersection, isDisabled, 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 className = buildClassName(\n 'GifButton',\n gif.width && gif.height && gif.width < gif.height ? 'vertical' : 'horizontal',\n transitionClassNames,\n localMediaHash,\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 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';\n\nimport { ApiSticker, ApiVideo } from '../../../api/types';\n\nimport { IAllowedAttachmentOptions } from '../../../modules/helpers';\nimport { IS_MOBILE_SCREEN, 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) => void;\n onGifSelect: (gif: ApiVideo) => void;\n onRemoveSymbol: () => void;\n onSearchOpen: (type: 'stickers' | 'gifs') => void;\n addRecentEmoji: AnyToVoidFunction;\n};\n\nlet isActivated = false;\n\nconst SymbolMenu: FC = ({\n isOpen, allowedAttachmentOptions,\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);\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_MOBILE_SCREEN) {\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 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_MOBILE_SCREEN && (\n \n \n \n )}\n \n \n );\n\n if (IS_MOBILE_SCREEN) {\n if (!shouldRender) {\n return undefined;\n }\n\n const className = buildClassName(\n 'SymbolMenu mobile-menu',\n transitionClassNames,\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(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 CONTENT_TYPES_FOR_QUICK_UPLOAD,\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;\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 CLOSE_DURATION = 350;\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(-1);\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 -1;\n }\n\n const emojisCount = emojis.length;\n return cycleRestrict(emojisCount, newIndex);\n }, [emojis]);\n\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 > -1) {\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 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, {\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';\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};\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 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 // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n const handleKeyDown = useKeyboardListNavigation(containerRef, true, (index) => {\n if (foundResults && foundResults[index]) {\n foundResults[index].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';\n\nimport Loading from '../ui/Loading';\nimport StickerSetResult from './StickerSetResult';\n\nimport './StickerSearch.scss';\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 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 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';\n\nimport InfiniteScroll from '../ui/InfiniteScroll';\nimport GifButton from '../common/GifButton';\nimport Loading from '../ui/Loading';\n\nimport './GifSearch.scss';\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 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 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};\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';\n\nimport PollAnswerResults from './PollAnswerResults';\nimport Loading from '../ui/Loading';\n\nimport './PollResults.scss';\n\ntype StateProps = {\n chat?: ApiChat;\n message?: ApiMessage;\n lastSyncTime?: number;\n};\n\nconst PollResults: FC = ({\n chat,\n message,\n lastSyncTime,\n}) => {\n const lang = useLang();\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 { selectChat, selectUser } from '../../../modules/selectors';\nimport useFlag from '../../../hooks/useFlag';\nimport useLang from '../../../hooks/useLang';\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};\n\ntype StateProps = {\n user?: ApiUser;\n chat: ApiChat;\n progress?: ManagementProgress;\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 updateContact,\n deleteUser,\n deleteHistory,\n closeManagement,\n openChat,\n}) => {\n const [isDeleteDialogOpen, openDeleteDialog, closeDeleteDialog] = useFlag();\n const [isProfileFieldsTouched, setIsProfileFieldsTouched] = useState(false);\n const [error, setError] = useState();\n const lang = useLang();\n\n const currentFirstName = user ? (user.firstName || '') : '';\n const currentLastName = user ? (user.lastName || '') : '';\n const currentIsMuted = chat ? chat.isMuted : undefined;\n\n const [firstName, setFirstName] = useState(currentFirstName);\n const [lastName, setLastName] = useState(currentLastName);\n const [isNotificationsEnabled, setIsNotificationsEnabled] = useState(!currentIsMuted);\n\n useEffect(() => {\n setIsNotificationsEnabled(!currentIsMuted);\n }, [currentIsMuted]);\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 if (chat.lastMessage) {\n deleteHistory({\n chatId: chat.id,\n maxId: chat.lastMessage!.id,\n shouldDeleteForAll: false,\n });\n }\n deleteUser({ userId });\n closeDeleteDialog();\n closeManagement();\n openChat({ id: undefined });\n }, [chat.id, chat.lastMessage, 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\n return {\n user, chat, progress,\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';\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};\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 deleteHistory,\n leaveChannel,\n deleteChannel,\n closeManagement,\n openChat,\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 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 deleteHistory({ chatId: chat.id, maxId: chat.lastMessage!.id, shouldDeleteForAll: false });\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, chat.lastMessage,\n closeDeleteDialog, closeManagement, deleteHistory, leaveChannel, deleteChannel, 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\n return {\n chat,\n progress,\n isBasicGroup: isChatBasicGroup(chat),\n hasLinkedChannel,\n canChangeInfo: getHasAdminRight(chat, 'changeInfo'),\n canBanUsers: getHasAdminRight(chat, 'banUsers'),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'togglePreHistoryHidden', 'updateChat', 'closeManagement',\n 'deleteHistory', 'leaveChannel', 'deleteChannel', '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';\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};\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}) => {\n const [permissions, setPermissions] = useState({});\n const [havePermissionChanged, setHavePermissionChanged] = useState(false);\n const [isLoading, setIsLoading] = useState(false);\n const lang = useLang();\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 keyof ApiChatBannedRights]),\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';\n\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\nimport ListItem from '../../ui/ListItem';\n\ntype OwnProps = {\n chatId: number;\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}) => {\n const lang = useLang();\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';\n\nimport './Management.scss';\n\ntype OwnProps = {\n chatId: number;\n onScreenSelect: (screen: ManagementScreens) => void;\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}) => {\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 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';\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};\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 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 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';\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};\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 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 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';\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};\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}) => {\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 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 keyof ApiChatBannedRights]),\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: keyof ApiChatBannedRights) => {\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';\nimport { getUserFullName, isChatChannel } from '../../../modules/helpers';\n\nimport { selectChat } from '../../../modules/selectors';\nimport useLang from '../../../hooks/useLang';\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};\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}) => {\n const lang = useLang();\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';\n\nimport ListItem from '../../ui/ListItem';\nimport Checkbox from '../../ui/Checkbox';\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\n\ntype OwnProps = {\n chatId: number;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n};\n\nconst ManageGroupRecentActions: FC = ({ chat }) => {\n const lang = useLang();\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';\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};\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}) => {\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 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';\n\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\nimport NothingFound from '../../common/NothingFound';\nimport ListItem from '../../ui/ListItem';\n\ntype OwnProps = {\n chatId: number;\n};\n\ntype StateProps = {\n usersById: Record;\n members?: ApiChatMember[];\n isChannel?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst ManageGroupMembers: FC = ({\n members,\n usersById,\n isChannel,\n openUserInfo,\n}) => {\n const memberIds = useMemo(() => {\n if (!members || !usersById) {\n return undefined;\n }\n\n return sortUserIds(members.map(({ userId }) => userId), usersById);\n }, [members, usersById]);\n\n const handleMemberClick = useCallback((id: number) => {\n openUserInfo({ id });\n }, [openUserInfo]);\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 };\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';\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};\n\ntype StateProps = {\n usersById: Record;\n members?: ApiChatMember[];\n isChannel?: boolean;\n};\n\nconst ManageGroupUserPermissionsCreate: FC = ({\n usersById,\n members,\n isChannel,\n onScreenSelect,\n onChatMemberSelect,\n}) => {\n const memberIds = useMemo(() => {\n if (!members || !usersById) {\n return undefined;\n }\n\n return sortUserIds(members.filter((member) => !member.isOwner).map(({ userId }) => userId), usersById);\n }, [members, 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 };\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};\n\ntype StateProps = {\n managementType?: ManagementType;\n};\n\nconst Management: FC = ({\n chatId,\n currentScreen,\n selectedChatMemberId,\n isPromotedByCurrentUser,\n onScreenSelect,\n onChatMemberSelect,\n managementType,\n}) => {\n switch (currentScreen) {\n case ManagementScreens.Initial: {\n switch (managementType) {\n case 'user':\n return ;\n case 'group':\n return ;\n case 'channel':\n return ;\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 } from '../../api/types';\n\nimport { pick } from '../../util/iteratees';\nimport { getCurrencySign } from '../middle/helpers/getCurrencySign';\nimport { detectCardTypeText } from '../common/helpers/detectCardType';\nimport { getShippingError } 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 globalErrors?: ApiError[];\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 globalErrors,\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 || globalErrors) {\n setIsLoading(false);\n }\n }, [step, error, globalErrors]);\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 (globalErrors && globalErrors.length) {\n const errors = getShippingError(globalErrors);\n paymentDispatch({\n type: 'setFormErrors',\n payload: {\n ...errors,\n },\n });\n }\n }, [error, globalErrors, 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 T 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 globalErrors: global.errors,\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_MOBILE_SCREEN } 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_MOBILE_SCREEN ? 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_MOBILE_SCREEN } 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_MOBILE_SCREEN ? 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.d4466bb252b9014004b6.css b/dist/3.d4466bb252b9014004b6.css deleted file mode 100644 index 7663cb5b0..000000000 --- a/dist/3.d4466bb252b9014004b6.css +++ /dev/null @@ -1 +0,0 @@ -.SenderInfo{display:flex;align-content:center;color:#fff;cursor:pointer;opacity:.5;transition:opacity .15s}.SenderInfo:hover{opacity:1}.SenderInfo .Avatar{margin-right: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:.875rem;letter-spacing:-.01rem}.MediaViewerActions{display:flex;margin-left:auto;margin-right:-.375rem}.MediaViewerActions .Button{margin-left:.25rem}.MediaViewerActions-mobile{position:relative}.MediaViewerActions-mobile .ProgressSpinner{position:absolute;top:0;left:0}.MediaViewerFooter{position:absolute;bottom:0;padding:1rem 0;width:100%}#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(0deg,#000 0,transparent)}.MediaViewerFooter.hideable{opacity:0;pointer-events:none}.video-controls-visible .MediaViewerFooter.hideable{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 .media-text{margin-bottom:0;overflow:auto;padding:0 .5rem;text-align:center;color:hsla(0,0%,100%,.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,.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:focus,.MediaViewerFooter a:hover{color:var(--color-links-hover)}.VideoPlayerControls{display:flex;align-items:center;position:absolute;left:0;bottom:0;width:100%;padding-top:.625rem;font-size:.875rem;background:linear-gradient(0deg,#000 0,transparent)}#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:hsla(0,0%,100%,.16);border-radius:var(--border-radius-default)}.VideoPlayerControls .player-seekline-buffered,.VideoPlayerControls .player-seekline-input,.VideoPlayerControls .player-seekline-played{position:absolute;top:0;left:0;height:100%;border-radius:var(--border-radius-default)}.VideoPlayerControls .player-seekline-buffered{background-color:hsla(0,0%,100%,.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(.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}.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 .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,.25);color:#fff;font-size:.75rem;position:absolute;left:.1875rem;top:.1875rem;z-index:1;padding:0 .375rem;border-radius:.75rem;line-height:1.125rem}.VideoPlayer .spinner-container .ProgressSpinner{cursor:pointer}.ZoomControls{position:absolute;bottom:1.25rem;left:50%;background:rgba(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-in,.ZoomControls .zoom-out{position:absolute;top:.4375rem;width:2.5rem;height:2.5rem;color:#fff}.ZoomControls .zoom-in i,.ZoomControls .zoom-out 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:hsla(0,0%,100%,.5);border-radius:var(--border-radius-default)}.ZoomControls .seekline-input,.ZoomControls .seekline-played{position:absolute;top:0;left:0;height:100%;border-radius:var(--border-radius-default)}.ZoomControls .seekline-played{background:#fff;transition:width .2s}.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(.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}.pan-container,.pan-wrapper{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}#MediaViewer,.zoomed .pan-container{position:fixed;top:0;left:0}#MediaViewer{width:100vw;height:100%;background:rgba(0,0,0,.9);color:#fff;z-index:var(--z-media-viewer);padding:.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 .closing .SenderInfo,#MediaViewer:not(.open) .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)}#MediaViewer .media-viewer-head>.Transition{width:100%}@media (max-width:600px){#MediaViewer .media-viewer-head{padding:0 .5rem}#MediaViewer .media-viewer-head .media-viewer-close{margin-right:1.5rem}}#MediaViewer>.pan-wrapper,#MediaViewer>.Transition{grid-area:1/1/-1/-1}#MediaViewer>.pan-wrapper .Transition,#MediaViewer>.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.next{right:0;background-image:url(media_navigation_next.3d6e264d21e73ad725738beb8e9dbbb8.svg);background-position:calc(100% - 1.25rem) calc(50% - 2rem)}#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}.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:.25rem .5rem}.ForwardPicker .modal-header .Button{margin-right:.5rem}.ForwardPicker .modal-header .input-group{margin:0}.ForwardPicker .modal-header .form-control{border:none;box-shadow:none!important;height:2.75rem;padding:.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;display:flex;align-items:center;justify-content:center;color:var(--color-text-secondary)}#Errors{position:fixed;top:0;left:0;width:100vw;height:100vh;z-index:var(--z-modal)}.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:.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:#fff}.CalendarModal .day-button.disabled{opacity:.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:.875rem}.CalendarModal .calendar-wrapper{display:flex;align-items:center;justify-content:center;min-height:17rem;margin:1.5rem -.5rem .5rem}.CalendarModal .calendar-grid{display:grid;grid-template-columns:repeat(7,1fr);width:100%}.MessageSelectToolbar{position:absolute;bottom:.5rem;left:.5rem;right:.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 .messaging-disabled+.MessageSelectToolbar,.no-composer .unpin-button-container+.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:.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}@media (max-width:600px){.MessageSelectToolbar-count{margin-right:.5rem}}.MessageSelectToolbar-actions{margin-left:auto;display:flex}.MessageSelectToolbar-actions .MenuItem{border-radius:var(--border-radius-default);padding:.75rem 2rem .75rem 1rem}.MessageSelectToolbar-actions .MenuItem i{margin-right:1rem}@media (max-width:600px){.MessageSelectToolbar-actions .MenuItem{padding:.6875rem;border-radius:50%}.MessageSelectToolbar-actions .MenuItem i{margin-right:0}.MessageSelectToolbar-actions .MenuItem .item-text{display:none}}.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:transparent}.RecentContacts .top-peers::-webkit-scrollbar{height:0}.RecentContacts .top-peers::-webkit-scrollbar-thumb{background-color:transparent}.RecentContacts .top-peer-item{display:inline-block;width:4.5rem;height:6rem;padding:.625rem .25rem;margin-left:.5rem;border-radius:var(--border-radius-default);cursor:pointer;position:relative;overflow:hidden}.RecentContacts .top-peer-item:first-child{margin-left:.125rem}.RecentContacts .top-peer-item:last-child{margin-right:.125rem}.RecentContacts .top-peer-item .Avatar{margin:0 auto .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:.75rem;overflow:hidden;text-overflow:ellipsis}.RecentContacts .top-peer-item .top-peer-name .emoji-small{width:1rem;height:1rem;background-size:1rem;margin-right:1px;vertical-align:-3px}.RecentContacts .recent-chats-header{display:flex;align-items:center}.RecentContacts .recent-chats-header .Button{margin-left:auto}.ChatMessage:first-child{margin-top:.5rem}.ChatMessage.selected .Avatar.online:after,.ChatMessage:hover .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:.25rem;padding: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 .media-preview{position:relative}.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{font-size:.75rem;color:#fff;position:absolute;left:.25rem;top:.1875rem}.ChatMessage .info-row,.DateSuggest{display:flex;justify-content:space-between}.DateSuggest{height:2rem;flex-direction:row;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}.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 .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)}.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-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 -.625rem}}.LeftSearch .search-section{padding:0 1rem .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 .Loading{height:4.5rem;margin-bottom:.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:transparent}.LeftSearch .chat-selection>.PickerSelectedItem{flex:0 0 auto}.LeftSearch .chat-selection>.PickerSelectedItem:last-child{margin-right:auto}.LeftSearch .NothingFound{height:100%}.CropModal .modal-dialog{width:calc(100% - 2rem);max-width:35rem;height:calc(100% - 1rem);max-height:35rem;position:relative}.CropModal #avatar-crop,.CropModal .modal-content{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 hsla(0,0%,100%,.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)}.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:#fff;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:after,.Transition>div:not(.active) .AvatarEditable label i,.Transition>div:not(.active) .AvatarEditable label input,body.animating-right-column .AvatarEditable label:after,body.animating-right-column .AvatarEditable label i,body.animating-right-column .AvatarEditable label input{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,.4)}.AvatarEditable label.disabled{pointer-events:none}.AvatarEditable label.disabled:after,.AvatarEditable label.disabled i{display:none}.FloatingActionButton{position:absolute;right:1rem;bottom:1rem;transform:translateY(5rem);transition:transform .25s cubic-bezier(.34,1.56,.64,1)}body.animation-level-0 .FloatingActionButton{transition:none!important}.FloatingActionButton.revealed{transform:translateY(0)}.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:.4375rem}.Picker{height:100%;display:flex;flex-direction:column;overflow:hidden}.Picker .picker-header{padding:0 1rem .25rem .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:.5rem;margin-left:.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:.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;display:flex;align-items:center;justify-content:center;color:var(--color-text-secondary)}.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:.5rem;margin-left:.5rem;flex-grow:1;color:var(--color-text-secondary)}.SettingsFoldersChatsPicker .picker-list{padding:0 .5rem .5rem}.SettingsFoldersChatsPicker .picker-list .no-results{height:10rem}.SettingsFoldersChatsPicker .ListItem.picker-list-item.chat-type-item .ListItem-button{padding:.875rem .75rem}.SettingsFoldersChatsPicker .ListItem.picker-list-item.chat-item .ListItem-button{padding:.5rem .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 .settings-item-header{margin-left:.75rem;margin-top:1rem;margin-bottom:.5rem}.SettingsFoldersChatsPicker .picker-list-divider{margin:.5rem -.5rem 0;border-bottom:1px solid var(--color-borders)}.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:-.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 .ListItem-button i{opacity:.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-item .ShowMoreButton{margin:0 -1rem;width:calc(100% + 2rem);padding-left:1rem!important}.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:.625rem}.RangeSlider .slider-top-row .value{flex-shrink:0;margin-left:1rem;color:var(--color-text-secondary)}.RangeSlider .slider-main{position:relative;z-index:1}.RangeSlider .slider-main:before{content:"";background-color:var(--color-borders);opacity:.5;z-index:-1}.RangeSlider .slider-fill-track,.RangeSlider .slider-main:before{position:absolute;width:100%;left:0;top:.3125rem;height:.125rem;border-radius:.125rem}.RangeSlider .slider-fill-track{background-color:var(--slider-color);pointer-events:none}.RangeSlider input[type=range]{-webkit-appearance:none;display:block;width:100%;height:.75rem;margin-bottom:.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;background:var(--slider-color);border:none;height:.75rem;width:.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:.75rem;width:.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:.75rem;width:.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:.825rem;text-align:center;cursor:pointer;color:var(--color-text-secondary);transition:color .2s ease}.RangeSlider .slider-option.active,.RangeSlider .slider-option:hover{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}.StickerButton{display:inline-block;width:4rem;height:4rem;margin:.5rem;border-radius:var(--border-radius-messages-small);background:transparent no-repeat 50%;background-size:contain;cursor:pointer;transition:background-color .15s ease,opacity .3s ease!important;position:relative}@media (max-width:600px){.StickerButton{margin:.25rem}}.StickerButton.set-button{width:2.75rem!important;height:2.75rem;margin: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:-.5rem;right:-.5rem;width:1.25rem;height:1.25rem;padding:.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}.settings-item .SettingsStickerSet.ListItem{margin-bottom:.5rem}.SettingsStickerSet .Button,.SettingsStickerSet .StickerButton{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}.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 canvas,.WallpaperTile .media-inner img{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(.9)}.WallpaperTile .spinner-container{height:100%;display:flex;align-items:center;justify-content:center}.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}.SettingsGeneralBackgroundColor:not(.is-dragging) .handle{transition:transform .3s 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:.5rem}.SettingsGeneralBackgroundColor canvas{display:block;width:100%;height:100%;border-radius:var(--border-radius-default);cursor:pointer}.SettingsGeneralBackgroundColor .handle{position:absolute;top:-.75rem;left:-.75rem;width:1.5rem;height:1.5rem;border:.125rem solid var(--color-white);border-radius:.75rem;cursor:grab}.SettingsGeneralBackgroundColor .hue-picker .handle{top:-.5rem}.SettingsGeneralBackgroundColor .tools{margin-bottom:.625rem;display:flex}.SettingsGeneralBackgroundColor .tools .input-group{margin-bottom:0}.SettingsGeneralBackgroundColor .tools .input-group:first-child{margin-right:.5rem}.SettingsGeneralBackgroundColor .tools .input-group:last-child{margin-left:.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 .3s ease}.SettingsGeneralBackgroundColor .predefined-colors div.active{border:.125rem solid var(--color-primary);box-shadow:inset 0 0 0 .3125rem var(--color-background)}.SettingsGeneralBackgroundColor .predefined-colors div:before{display:block;content:"";width:100%;padding-top:100%;pointer-events:none}#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) 50%}#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{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 .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:.25rem;margin-top:.1rem}.settings-current-user .phone{font-size:.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-description{font-size:.875rem;color:var(--color-text-secondary);margin-top:-.5rem;margin-bottom:1.5rem}.settings-content.two-fa .settings-item-description{font-size:1rem}.settings-item-description-larger{font-size:1rem;line-height:1.3125rem;color:var(--color-text-secondary);margin-top:2rem;margin-bottom:.75rem}.settings-item .ListItem{margin:0 -1rem 1rem}.settings-item .ListItem:last-child{margin-bottom:0}.settings-item .ListItem .multiline-menu-item{white-space:normal}.settings-item .ListItem .multiline-menu-item.full-size{width:100%}.settings-item .ListItem .multiline-menu-item .date{float:right;font-size:.75rem;margin-left:1rem;color:var(--color-text-secondary)}.settings-item .ListItem .multiline-menu-item .subtitle,.settings-item .ListItem .multiline-menu-item .title{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:.875rem;line-height:1.5rem;color:var(--color-text-secondary)}.settings-item .ListItem .multiline-menu-item .subtitle+.subtitle{margin-top:-.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:.5rem}.settings-item .ListItem.blocked-list-item .ListItem-button{align-items:center;text-align:left;padding:.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:.25rem;font-weight:500}.settings-item .ListItem.blocked-list-item .contact-phone{font-size:.875rem;line-height:1rem;color:var(--color-text-secondary)}.settings-item .RangeSlider{margin-bottom:1.0625rem}.settings-item .Checkbox,.settings-item .radio-group{margin:0 -1rem .5rem}.settings-item .radio-group .Radio:last-child{margin-bottom:0}.settings-item .Checkbox+.Checkbox,.settings-item .Radio+.Radio{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)}.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 .error,.NewChat-inner.step-2 .note{font-size:.875rem;line-height:1.25rem;margin:1.5rem .25rem}.NewChat-inner.step-2 .error{color:var(--color-error)}.NewChat-inner.step-2 .note{margin-top:-.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 .25rem}.NewChat-inner.step-2 .chat-members-list{margin:0 -1.25rem;padding:0 1rem 1rem;overflow-x:hidden;flex-grow:1}.ArchivedChats{height:100%;overflow:hidden}.ArchivedChats .chat-list{height:calc(100% - var(--header-height))}.MessageContextMenu{position:absolute;font-size:1rem}.MessageContextMenu .backdrop{position:absolute;touch-action:none}.StickerSetModal .modal-dialog{width:26.25rem;max-width:100%}@media (max-width:600px){.StickerSetModal .modal-dialog{width:18.875rem}}.StickerSetModal .modal-header{padding:.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 .25rem;text-align:left}.StickerSetModal .button-wrapper{padding:.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)}.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)}#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 .5rem 0 .25rem}#MobileSearch>.header>.SearchInput{margin-left:.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:.5rem}#MobileSearch>.footer>.counter{flex:1;color:var(--color-text-secondary)}#MobileSearch:not(.active) .footer,#MobileSearch:not(.active) .header{transform:translateX(-999rem)}.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-right:10px;max-width:70%}.MentionTooltip .ListItem.chat-item-clickable .handle{font-size:1rem}.MentionTooltip .ChatInfo .title h3{line-height:1.25}.MentionTooltip .ChatInfo .Avatar{margin-right:.7em}.MentionTooltip .ChatInfo .handle:before{content:"@"}.MentionTooltip .ChatInfo .user-status{display:none}.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 img,.AttachmentModal .media-wrapper video{flex:1;width:calc(50% - .15rem);height:12rem;margin-bottom:.3rem;border-radius:var(--border-radius-default);object-fit:cover}.AttachmentModal .media-wrapper img:only-child,.AttachmentModal .media-wrapper video:only-child{height:auto;max-height:25rem;margin-bottom:0}.AttachmentModal .media-wrapper img:nth-child(2n),.AttachmentModal .media-wrapper video:nth-child(2n){margin-left:.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:after,.AttachmentModal .drop-target:before{content:"";position:absolute;left:0;top:0;right:0;bottom:0;border-radius:var(--border-radius-default);pointer-events:none;opacity:0;transition:opacity .25s;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)}.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 .25rem}.PollModal .options-list{margin:1rem -.75rem -.5rem;padding:0 .75rem;border-top:1px solid var(--color-chat-hover);max-height:20rem;overflow:auto}.PollModal .options-list.overflown{padding:0 .4rem .5rem .75rem}@media (max-width:600px){.PollModal .options-list{overflow:hidden;max-height:none}.PollModal .options-list,.PollModal .options-list.overflown{padding:0 .75rem}}.PollModal .option-wrapper{position:relative}.PollModal .option-wrapper .form-control{padding-right:3rem}.PollModal .option-wrapper .option-remove-button{position:absolute;top:.3125rem;right:.3125rem}.PollModal .quiz-mode{margin-top:1.5rem}.PollModal .quiz-mode .options-header{margin-bottom:.5rem}.PollModal .quiz-mode .note{margin-top:.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:.5rem}.EmojiButton{display:inline-flex;align-items:center;justify-content:center;width:2.5rem;height:2.5rem;margin:.125rem;border-radius:var(--border-radius-messages-small);cursor:pointer;font-size:1.75rem;line-height:2.5rem;background-color:initial;transition:background-color .15s ease}.mac-os-fix .EmojiButton{line-height:inherit}.EmojiButton.focus,.EmojiButton:hover{background-color:var(--color-interactive-element-hover)}.EmojiButton>img{width:2rem;height:2rem}.EmojiPicker{height:100%}.EmojiPicker-main{height:calc(100% - 3rem);overflow-y:auto;padding:.5rem}@media (max-width:600px){.EmojiPicker-main{padding:.5rem .25rem}}.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:.4375rem 0;scrollbar-width:none;scrollbar-color:transparent}.EmojiPicker-header::-webkit-scrollbar{height:0}.EmojiPicker-header::-webkit-scrollbar-thumb{background-color:transparent}.EmojiPicker-header .symbol-set-button{display:inline-flex;vertical-align:middle}.EmojiPicker-header:after{content:"";display:block;flex-shrink:0;width:.1px;height:1rem}}.StickerPicker{height:100%}.StickerPicker-main{position:relative;height:calc(100% - 3rem);overflow-y:auto;padding:.5rem}@media (max-width:600px){.StickerPicker-main{padding:.5rem .25rem}}.StickerPicker-header{height:3rem;border-bottom:1px solid var(--color-borders);padding:.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:transparent}.StickerPicker-header::-webkit-scrollbar{height:0}.StickerPicker-header::-webkit-scrollbar-thumb{background-color:transparent}.StickerPicker-header:after{content:"";display:block;flex-shrink:0;width:.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 .AnimatedSticker,.StickerPicker-header .sticker-set-button.StickerButton img{top:.375rem;left:.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 .AnimatedSticker,.StickerPicker-header .sticker-set-button .sticker-set-cover img{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 .25rem;border-radius:var(--border-radius-messages-small)}.GifButton{display:flex;align-items:center;justify-content:center;height:6.25rem;background-color:initial;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 50%}.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}.GifPicker{display:grid;grid-template-columns:repeat(6,1fr);grid-auto-rows:6.25rem;grid-gap:.25rem;grid-auto-flow:dense;height:100%;overflow-y:auto;padding:.25rem}.GifPicker .Loading,.GifPicker .picker-disabled{grid-column:1/-1;height:var(--menu-height)}.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:translateZ(0)}body.is-media-viewer-open .SymbolMenu.mobile-menu.open{transform:translate3d(0,calc(var(--symbol-menu-height) + var(--symbol-menu-footer-height)),0)}.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 .75rem}.SymbolMenu-footer .Button.symbol-search-button{position:absolute;left:.25rem}.SymbolMenu-footer .Button.symbol-delete-button{position:absolute;right:.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:.5rem;color:rgba(var(--color-text-secondary-rgb),.75);overflow:hidden;white-space:nowrap;text-overflow:ellipsis;unicode-bidi:plaintext}.symbol-set-container,.symbol-set-name{text-align:initial}.symbol-set-button{flex-shrink:0;width:2.125rem!important;height:2.125rem;margin: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}.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}.StickerTooltip{display:grid;grid-template-columns:repeat(auto-fill,minmax(5rem,1fr));grid-auto-rows:auto;place-items:center}.StickerTooltip.hidden{display:none}.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}.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}.EmojiTooltip{display:flex;padding-left:.25rem;overflow-x:auto;overflow-x:overlay;overflow-y:hidden}.EmojiTooltip .EmojiButton{flex:0 0 2.5rem}.RightSearch{height:100%;padding:0 .5rem;overflow-y:auto}.RightSearch .helper-text{padding:1rem;margin-bottom:.125rem;font-weight:500;color:var(--color-text-secondary);unicode-bidi:plaintext;text-align:initial}.StickerSearch{height:100%;padding:0 .5rem;overflow-y:auto}.StickerSearch .helper-text{padding:1rem;margin-bottom:.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:.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:active,.StickerSearch .sticker-set-header .Button.is-added:hover{background:var(--color-item-active)!important}.StickerSearch .sticker-set-main{display:flex;flex-wrap:nowrap;overflow:hidden}.StickerSearch .StickerButton{margin:.125rem}.GifSearch{height:100%;padding:.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:.25rem;grid-auto-flow:dense}.GifSearch .helper-text{color:var(--color-text-meta);margin-top:2rem;text-align:center}.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 .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 .ShowMoreButton{margin:.25rem 0 0 -.5rem;width:calc(100% + 1rem)}.PollAnswerResults .icon-down{vertical-align:middle;margin-right:2rem;font-size:1.5rem}.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:hsla(0,0%,100%,.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}.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-help{color:var(--color-text-secondary);line-height:1.375rem}.Management .section .section-info{color:var(--color-text-secondary);font-size:.875rem}.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:.125rem;top:.25rem;transform:none}.Management .radio-group .Radio-main:after{left:.4375rem;top:.5625rem;transform:none}.ManageGroupMembers,.ShippingInfo{padding:.5rem 1rem}.ShippingInfo h5{font-size:.9rem;color:var(--color-text-secondary);margin:1rem 0 1.1rem}.Shipping{padding:.5rem 1rem}.Shipping form p{color:var(--color-text-secondary);font-weight:500;margin:.5rem 0 2rem}.Shipping form .Radio{margin-bottom:2rem}.Checkout{padding:.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:.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 solid var(--color-borders);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 50%;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:.875rem;color:var(--color-text-secondary)}.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}.PaymentInfo{padding:.5rem 1rem}.PaymentInfo h5{font-size:.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}.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 solid var(--color-borders)}.PaymentModal .header h3{margin-bottom:0;margin-left:1.5rem}.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 solid var(--color-borders)}.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}} \ No newline at end of file diff --git a/dist/3.d4466bb252b9014004b6.js b/dist/3.d4466bb252b9014004b6.js deleted file mode 100644 index fa598d8fd..000000000 --- a/dist/3.d4466bb252b9014004b6.js +++ /dev/null @@ -1,2 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[3],Array(96).concat([function(e,t,a){"use strict";a.r(t),a.d(t,"MediaViewer",(function(){return de})),a.d(t,"ForwardPicker",(function(){return fe})),a.d(t,"Errors",(function(){return ye})),a.d(t,"Notifications",(function(){return Ne})),a.d(t,"SafeLinkModal",(function(){return we})),a.d(t,"CalendarModal",(function(){return Le})),a.d(t,"DeleteMessageModal",(function(){return Ae})),a.d(t,"PinMessageModal",(function(){return Te})),a.d(t,"UnpinAllMessagesModal",(function(){return De})),a.d(t,"MessageSelectToolbar",(function(){return Ue})),a.d(t,"LeftSearch",(function(){return Ct})),a.d(t,"Settings",(function(){return rn})),a.d(t,"ContactList",(function(){return ln})),a.d(t,"NewChat",(function(){return hn})),a.d(t,"NewChatStep1",(function(){return dn})),a.d(t,"NewChatStep2",(function(){return mn})),a.d(t,"ArchivedChats",(function(){return gn})),a.d(t,"ContextMenuContainer",(function(){return Sn})),a.d(t,"StickerSetModal",(function(){return wn})),a.d(t,"HeaderMenuContainer",(function(){return Mn})),a.d(t,"MobileSearch",(function(){return An})),a.d(t,"AttachmentModal",(function(){return _n})),a.d(t,"PollModal",(function(){return Wn})),a.d(t,"SymbolMenu",(function(){return Ec})),a.d(t,"AttachMenu",(function(){return Oc})),a.d(t,"MentionTooltip",(function(){return $n})),a.d(t,"StickerTooltip",(function(){return fc})),a.d(t,"BotKeyboardMenu",(function(){return jc})),a.d(t,"CustomSendMenu",(function(){return Cc})),a.d(t,"DropArea",(function(){return yc.b})),a.d(t,"TextFormatter",(function(){return kc.a})),a.d(t,"EmojiTooltip",(function(){return Ic})),a.d(t,"RightSearch",(function(){return wc})),a.d(t,"StickerSearch",(function(){return Lc})),a.d(t,"GifSearch",(function(){return Ac})),a.d(t,"PollResults",(function(){return Dc})),a.d(t,"Management",(function(){return Zc})),a.d(t,"PaymentModal",(function(){return jr})),a.d(t,"ReceiptModal",(function(){return kr}));var n=a(0),c=a(2),r=a(5),s=a(19),l=a(1),o=a(7),i=a(110),d=a(6),m=a(4),u=a(3),h=a(127),b=a(44),g=a(172),p=a(35),v=a(102),E=a(115),O=a(186),f=a(41),j=a(45),C=a(141),y=a(52);function k(e,t,a,n){const{mediaEl:c}=P(t,n);if(!c)return;const{width:r}=y.a.get();let o,d=!1;if(n){const{photo:e,video:t,webPage:a}=Object(m.v)(n);d=Boolean(t),o=t?Object(m.bb)(t):Object(m.S)(e||a.photo)}else o=i.a;const{width:u,height:h}=Object(i.j)(e,d),{width:b,height:g}=Object(i.e)(u,h,o.width,o.height),p=(r-b)/2,v=function(e){const t=window.matchMedia(i.b);let a=4.125;e&&(a+=t.matches?.875:3.375);return a*i.c}(e)+(h-g)/2;let{top:E,left:O,width:f,height:j}=c.getBoundingClientRect();if([s.h.SharedMedia,s.h.Album,s.h.ScheduledAlbum,s.h.SearchResult].includes(t)){const e=function(e,t,a,n,c,r){if(e===t){const s=Math.max(c,r)*(e/t);n-=(s-c)/2,a-=(s-r)/2,c=s,r=s}else if(e>t){const a=c;n-=((c=r*(e/t))-a)/2}else if(t>e){const n=r;a-=((r=c*(t/e))-n)/2}return{top:a,left:n,width:c,height:r}}(b,g,E,O,f,j);E=e.top,O=e.left,f=e.width,j=e.height}const C=O+f/2-(p+b/2),k=E+j/2-(v+g/2),N=f/b,S=j/g,F=I(a||c);w(F,{top:v+"px",left:p+"px",width:b+"px",height:g+"px",transform:`translate3d(${C}px, ${k}px, 0) scale(${N}, ${S})`}),M(F,t),document.body.classList.add("ghost-animating"),requestAnimationFrame(()=>{document.body.appendChild(F),requestAnimationFrame(()=>{F.style.transform="",function(e){e.firstChild.style.objectFit="default",e.classList.remove("rounded-corners","circle")}(F),setTimeout(()=>{requestAnimationFrame(()=>{document.body.contains(F)&&document.body.removeChild(F),document.body.classList.remove("ghost-animating")})},200+l.c)})})}function N(e,t,a){const{container:n,mediaEl:c}=P(e,a);if(!c)return;const r=document.getElementById("MediaViewer").querySelector(".active .media-viewer-content img, .active .media-viewer-content video");if(!r||!c)return;const{top:o,left:i,width:d,height:m}=r.getBoundingClientRect(),{top:u,left:h,width:b,height:g}=c.getBoundingClientRect();let p=u;if(!function(e){if("none"===e.style.display)return!1;const t=e.getBoundingClientRect(),{height:a}=y.a.get();return t.top<=a&&t.top+t.height>=0}(n)){const{height:e}=y.a.get();p=uf?O=f:f>O&&(f=O));const C=document.getElementsByClassName("ghost")[0],k=C||I(t||c,e===s.h.ProfileAvatar);C||w(k,{top:p+"px",left:h+"px",width:b+"px",height:g+"px",transform:`translate3d(${v}px, ${E}px, 0) scale(${O}, ${f})`}),requestAnimationFrame(()=>{if(C){const{top:e,left:t,width:a,height:n}=C.getBoundingClientRect();w(k,{transition:"none",top:p+"px",left:h+"px",transformOrigin:"top left",transform:`translate3d(${t-h}px, ${e-p}px, 0) scale(${a/b}, ${n/g})`,width:b+"px",height:g+"px"})}document.body.classList.add("ghost-animating"),C||document.body.appendChild(k),requestAnimationFrame(()=>{C&&(C.style.transition=""),k.style.transform="",j&&(k.style.opacity="0"),M(k,e),setTimeout(()=>{requestAnimationFrame(()=>{document.body.contains(k)&&document.body.removeChild(k),document.body.classList.remove("ghost-animating")})},200+l.c)})})}function I(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(m.lb)(t)?Object(d.Fb)(e,t):Object(d.f)(e,t)};if(!a||!t)return{};const c=Object(d.k)(e,t,a);return{message:c,sender:c&&Object(d.sb)(e,c)}},(e,t)=>Object(u.l)(t,["closeMediaViewer","focusMessage"]))(({chatId:e,messageId:t,sender:a,isAvatar:c,message:r,closeMediaViewer:s,focusMessage:l})=>{const o=Object(n.m)(()=>{s(),l({chatId:e,messageId:t})},[e,l,t,s]),i=Object(F.a)();if(!a||!r&&!c)return;const d=a.id<0,u=Object(m.V)(i,a);return n.a.createElement("div",{className:"SenderInfo",onClick:o},d?n.a.createElement(R.a,{key:a.id,size:"medium",chat:a}):n.a.createElement(R.a,{key:a.id,size:"medium",user:a}),n.a.createElement("div",{className:"meta"},n.a.createElement("div",{className:"title",dir:"auto"},u&&Object(x.a)(u)),n.a.createElement("div",{className:"date",dir:"auto"},c?i("lng_mediaview_profile_photo"):Object(B.d)(i,1e3*r.date))))}),G=a(173),q=a(58),z=a(38),$=a(116);a(249);var H=({mediaData:e,isVideo:t,isZoomed:a,message:c,fileName:r,isAvatar:s,onCloseMediaViewer:l,onForward:i,onZoomToggle:d})=>{const[u,h]=Object(n.r)(!1),b=t&&c?Object(m.D)(c,"download"):void 0,{mediaData:g,downloadProgress:p}=Object(E.a)(b,!u);Object(n.n)(()=>{u&&g&&(Object(G.a)(g,r),h(!1))},[r,g,u]),Object(n.n)(()=>{h(!1)},[b]);const v=Object(n.m)(e=>{e.stopPropagation(),h(e=>!e)},[]),O=Object(F.a)(),f=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 o.g?n.a.createElement("div",{className:"MediaViewerActions-mobile"},n.a.createElement(q.a,{trigger:f,positionX:"right"},!s&&n.a.createElement(z.a,{icon:"forward",onClick:i},O("Forward")),t?n.a.createElement(z.a,{icon:u?"close":"download",onClick:v},u?Math.round(100*p)+"% Downloading...":"Download"):n.a.createElement(z.a,{icon:"download",href:e,download:r},O("AccActionDownload"))),u&&n.a.createElement($.a,{progress:p,size:"s",noCross:!0})):n.a.createElement("div",{className:"MediaViewerActions"},!s&&n.a.createElement(n.a.Fragment,null,n.a.createElement(D.a,{round:!0,size:"smaller",color:"translucent-white",ariaLabel:O("Forward"),onClick:i},n.a.createElement("i",{className:"icon-forward"}))),t?n.a.createElement(D.a,{round:!0,size:"smaller",color:"translucent-white",ariaLabel:O("AccActionDownload"),onClick:v},u?n.a.createElement($.a,{progress:p,size:"s",onClick:v}):n.a.createElement("i",{className:"icon-download"})):n.a.createElement(D.a,{href:e,download:r,round:!0,size:"smaller",color:"translucent-white",ariaLabel:O("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:O("Close"),onClick:l},n.a.createElement("i",{className:"icon-close"})))},_=a(9);a(250);var V=({text:e="",isHideable:t,onClick:a})=>{const[c,r]=Object(n.r)(!1);return Object(n.n)(()=>{const e=document.querySelector(".MediaViewerFooter .media-text"),t=()=>{const t=e?e.clientHeight:0;r(t>2*i.c)};t();const a=Object(_.g)(t,500,!0);return window.addEventListener("resize",a,!1),()=>{window.removeEventListener("resize",a,!1)}},[]),n.a.createElement("div",{className:"MediaViewerFooter "+(t?"hideable":""),onClick:function(t){e&&t.stopPropagation()}},e&&n.a.createElement("div",{className:"media-viewer-footer-content",onClick:a},n.a.createElement("p",{className:"media-text custom-scroll "+(c?"multiline":""),dir:"auto"},e)))},W=a(32),Y=a(132);const K=function(){if(void 0!==document.fullscreenElement)return"fullscreenElement";if(void 0!==document.mozFullScreenElement)return"mozFullScreenElement";if(void 0!==document.webkitFullscreenElement)return"webkitFullscreenElement";return""}();var Z=a(142),Q=a(131);const X=["bytes","kB","MB","GB","TB","PB"];var J=e=>{const t=0===e?0:Math.floor(Math.log(e)/Math.log(1024));return`${(e/1024**Math.floor(t)).toFixed(1)} ${X[t]}`};a(251);const ee=e=>{e.stopPropagation()};var te=({bufferedProgress:e,currentTime:t,duration:a,fileSize:c,isForceVisible:r,isForceMobileVersion:s,isPlayed:l,isFullscreenSupported:i,isFullscreen:d,onChangeFullscreen:m,onPlayPause:u,onSeek:h})=>{const[b,g]=Object(n.r)(!0);Object(n.n)(()=>{r&&g(r)},[r]),Object(n.n)(()=>{let e;return r||(o.g?g(!1):e=window.setTimeout(()=>{g(!1)},800)),()=>{e&&window.clearTimeout(e)}},[r]),Object(n.n)(()=>((b||r)&&document.body.classList.add("video-controls-visible"),()=>{document.body.classList.remove("video-controls-visible")}),[r,b]);const p=Object(F.a)();var v,E;if(b||r)return n.a.createElement("div",{className:"VideoPlayerControls "+(s?"mobile":""),onClick:ee},function(e,t,a,c){const r=e/t*100,s=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: ${s||0}%`}),n.a.createElement("div",{className:"player-seekline-played",style:`width: ${r||0}%`}),n.a.createElement("input",{min:"0",max:"100",step:.01,type:"range",onInput:c,className:"player-seekline-input",value:r||0})))}(t,a,e,h),n.a.createElement(D.a,{ariaLabel:p("AccActionPlay"),size:"tiny",ripple:!o.g,color:"translucent-white",className:"play",onClick:u},n.a.createElement("i",{className:l?"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,E=c,n.a.createElement("div",{className:"player-file-size"},`${J(E*v)} / ${J(E)}`)),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(252);function ae(){return(ae=Object.assign||function(e){for(var t=1;t{const m=Object(n.q)(null),[u,h]=Object(n.r)(!o.l||!o.e),[b,g]=Object(n.r)(0),[p,v]=Object(n.r)(!0),[E,O,f]=function(e,t){const[a,c]=Object(n.r)(Boolean(K&&document[K]));return Object(n.o)(()=>{const a=()=>{c(Boolean(K&&document[K]))},n=()=>{c(!0)},r=()=>{c(!1),t(!1)},s=e.current;return document.addEventListener("fullscreenchange",a,!1),document.addEventListener("webkitfullscreenchange",a,!1),document.addEventListener("mozfullscreenchange",a,!1),s&&(s.addEventListener("webkitbeginfullscreen",n,!1),s.addEventListener("webkitendfullscreen",r,!1)),()=>{document.removeEventListener("fullscreenchange",a,!1),document.removeEventListener("webkitfullscreenchange",a,!1),document.removeEventListener("mozfullscreenchange",a,!1),s&&(s.removeEventListener("webkitbeginfullscreen",n,!1),s.removeEventListener("webkitendfullscreen",r,!1))}},[]),K||"iOS"===o.o?[a,()=>{e.current&&(K||"iOS"===o.o)&&(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,h),{isBuffered:j,bufferedProgress:C,bufferingHandlers:y}=Object(Y.a)(),{shouldRender:k,transitionClassNames:N}=Object(W.a)(!j,void 0,void 0,"slow");Object(n.n)(()=>{i||!l?m.current.pause():e&&!o.l&&Object(Q.a)(m.current)},[i,l,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(Z.a)(m,[]);const S=Object(n.m)(()=>{v(!0)},[]),w=Object(n.m)(()=>{v(!1)},[]),P=Object(n.m)(e=>{g(e.currentTarget.currentTime)},[]),M=Object(n.m)(()=>{g(0),h(!1)},[]),F=Object(n.m)(()=>{E&&f?f():!E&&O&&O()},[f,E,O]),L=Object(n.m)(e=>{e.stopPropagation(),m.current.currentTime=Number(e.target.value)*m.current.duration/100},[]),A=Object(n.m)(e=>{e.stopPropagation(),v(!p)},[p]);Object(n.n)(()=>{const e=e=>{"Enter"!==e.key&&" "!==e.key||I(e)};return document.addEventListener("keydown",e,!1),()=>{document.removeEventListener("keydown",e,!1)}},[I]);const T=c&&`width: ${c.width}px; height: ${c.height}px`,D=`background-image: url(${a})`;return n.a.createElement("div",{className:"VideoPlayer",onClick:!t&&o.g?A:void 0,onMouseOver:t?void 0:S,onMouseOut:t?void 0:w},n.a.createElement("div",{style:T},n.a.createElement("video",ae({ref:m,autoPlay:o.l,playsInline:!0,loop:t,muted:t,id:"media-viewer-video",style:D,onEnded:M},y,{onTimeUpdate:P}),e&&n.a.createElement("source",{src:e}))),k&&n.a.createElement("div",{className:["spinner-container",N].join(" ")},!j&&n.a.createElement("div",{className:"buffering"},"Buffering..."),n.a.createElement($.a,{size:"xl",progress:j?1:r,square:!0,onClick:d})),!t&&!k&&n.a.createElement(te,{isPlayed:u,bufferedProgress:C,currentTime:b,isFullscreenSupported:Boolean(O),isFullscreen:E,fileSize:s,duration:m.current?m.current.duration:0,isForceVisible:!u||p,isForceMobileVersion:c&&c.width<400,onSeek:L,onChangeFullscreen:F,onPlayPause:I}))}),ce=a(8);a(253);var re=Object(n.h)(({isShown:e,onChangeZoom:t})=>{const{transitionClassNames:a}=Object(W.a)(e),c=Object(f.a)(e),r=Object(n.q)(null),[s,l]=Object(n.r)(1),i=Object(n.q)(!1);Object(n.n)(()=>{e&&!c&&l(1.5)},[e,c]);const d=Object(n.m)(()=>{i.current=!0},[]),m=Object(n.m)(()=>{i.current=!1,1===s&&t(s,!i.current)},[t,s]);Object(n.n)(()=>{t(s,!i.current)},[s,t]);const u=Object(F.a)(),h=Object(ce.a)("ZoomControls",a);return n.a.createElement("div",{className:h},n.a.createElement(D.a,{disabled:1===s,size:"tiny",color:"translucent-white",ariaLabel:u("ZoomOut"),className:"zoom-out",ripple:!o.g,onClick:()=>{r.current&&l(Math.max(1,s-.5))}},n.a.createElement("i",{className:"icon-zoom-out"})),n.a.createElement(D.a,{disabled:3===s,size:"tiny",color:"translucent-white",ariaLabel:"Zoom In",className:"zoom-in",ripple:!o.g,onClick:()=>{r.current&&l(Math.min(3,s+.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*(s-1)}%`}),n.a.createElement("input",{ref:r,min:1,max:3,step:"0.5",value:s,type:"range",className:"seekline-input",onChange:e=>{l(Math.min(3,Math.max(Number(e.target.value),1)))},onMouseDown:d,onMouseUp:m}))))});a(254);const se=[1,0,0,1,0,0],le={1:1,1.5:1.5,2:2.2,2.5:3.3,3:5.5};var oe=Object(n.h)(({children:e,className:t,noWrap:a,canPan:c,zoomLevel:r,panDeltaX:s,panDeltaY:l,onPan:o})=>{const i=le[r]||r,[d,m]=Object(n.r)(!1),[h,b]=Object(n.r)({dx:s,dy:l,x:0,y:0}),[g,p]=Object(n.r)(se),v=Object(n.q)(null),E=Object(n.q)(null);Object(n.n)(()=>{const e=i||g[0],t=s||g[4],a=l||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(u.a)(g,n)||p(function(e,t,a){const n=a&&a.querySelector(".active img");if(!a||!n)return t;const c=a.getBoundingClientRect(),r=n.getBoundingClientRect(),s=r.width/e*t[0],l=r.height/e*t[3],o=(c.width-s)/2+t[4],i=(c.height-l)/2+t[5];return c.width&&c.width-150{c||p(se)},[c]),Object(n.n)(()=>{E.current&&(E.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};b(t),m(!0),v.current&&v.current.classList.add("move")},onMouseUp:()=>{m(!1),v.current&&v.current.classList.remove("move"),o&&o(g[4],g[5])},onMouseMove:e=>{if(d){const t=function(e,t){const a=[...g],n=h.x-e,c=h.y-t;return a[4]=h.dx-n,a[5]=h.dy-c,a}(e.pageX,e.pageY);p(t),E.current&&(E.current.style.transform=`matrix(${g.toString()})`)}}},n.a.createElement("div",{ref:E,className:"pan-container"},e))});a(255);function ie(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 de=Object(n.h)(Object(c.h)(e=>{const{chatId:t,threadId:a,messageId:n,avatarOwnerId:c,profilePhotoIndex:r,origin:l}=e.mediaViewer,{animationLevel:o}=e.settings.byKey;if(l===s.h.SearchResult){if(!t||!n)return{animationLevel:o};const a=Object(d.k)(e,t,n);return a?{chatId:t,messageId:n,senderId:a.senderId,origin:l,message:a,animationLevel:o}:{animationLevel:o}}if(c){return{messageId:-1,senderId:c,avatarOwner:Object(d.Fb)(e,c)||Object(d.f)(e,c),profilePhotoIndex:r||0,animationLevel:o,origin:l}}if(!(t&&a&&n))return{animationLevel:o};let i,m,u;if(i=l&&[s.h.ScheduledAlbum,s.h.ScheduledInline].includes(l)?Object(d.ob)(e,t,n):Object(d.k)(e,t,n),!i)return{animationLevel:o};if(m=l&&[s.h.ScheduledAlbum,s.h.ScheduledInline].includes(l)?Object(d.pb)(e,t):Object(d.m)(e,t),l===s.h.Inline||l===s.h.Album)u=Object(d.fb)(e,t,a)||Object(d.X)(e,t,a);else if(l===s.h.SharedMedia){const t=Object(d.v)(e),{foundIds:a}=t&&t.resultsByType&&t.resultsByType.media||{};u=a}return{chatId:t,threadId:a,messageId:n,senderId:i.senderId,origin:l,message:i,chatMessages:m,collectionIds:u,animationLevel:o}},(e,t)=>Object(u.l)(t,["openMediaViewer","closeMediaViewer","openForwardMenu","focusMessage"]))(({chatId:e,threadId:t,messageId:a,senderId:c,origin:d,avatarOwner:u,profilePhotoIndex:y,message:I,chatMessages:S,collectionIds:w,openMediaViewer:P,closeMediaViewer:M,openForwardMenu:L,focusMessage:B,animationLevel:x})=>{const R=Object(n.q)(null),G=Boolean(u||a),q=I?Object(m.R)(I):void 0,z=I?Object(m.G)(I):void 0,$=I?Object(m.P)(I):void 0,_=Boolean(q),W=Boolean(z||q),Y=Boolean($),K=$?$.isGif:void 0,Z=d===s.h.SharedMedia,Q=d===s.h.SearchResult,X=x>=1?"mv-slide":"none",J=2===x?"slide-fade":"none",ee=2===x,te=u?`avatar${u.id}-${y}.jpg`:I&&Object(m.B)(I),ae=Object(f.a)(c),[ce,se]=Object(n.r)(!1),[le,de]=Object(n.r)(!1),[me,ue]=Object(n.r)(1),[he,be]=Object(n.r)({x:0,y:0}),ge=Object(n.p)(()=>_&&a?[a]:Object(m.i)(S||{},w||[],Z),[_,a,S,w,Z]),pe=a?ge.indexOf(a):-1,ve=0===pe||-1===pe,Ee=pe===ge.length-1||-1===pe;function Oe(e){if(u&&void 0!==y){const{photos:t}=u;return t&&t[y]?`photo${t[y].id}?size=c`:Object(m.f)(u,e?"big":"normal")}return I&&Object(m.D)(I,e?"viewerFull":"viewerPreview")}!G||ae&&ae===c&&R.current||(R.current=pe);const fe=Object(v.a)(I&&(Z||Q)&&Object(m.D)(I,"pictogram"),void 0,r.ApiMediaFormat.BlobUrl,void 0,ee&&350),je=Oe(),Ce=Object(v.a)(je,void 0,u&&je&&je.startsWith("profilePhoto")?r.ApiMediaFormat.DataUri:r.ApiMediaFormat.BlobUrl,void 0,ee&&350),{mediaData:ye,downloadProgress:ke}=Object(E.a)(Oe(!0),void 0,I&&Object(m.C)(I,"viewerFull"),void 0,ee&&350),Ne=z||$?(z||$).blobUrl:void 0;let Ie=!Y&&(Ne||ye)||Ce||fe;const Se=Object(O.a)(!Ie&&I&&Object(m.E)(I));Ie||d===s.h.SearchResult||(Ie=Se);const we=W?Object(m.S)(_?Object(m.R)(I):Object(m.G)(I)):void 0,Pe=Y?Object(m.bb)(Object(m.P)(I)):void 0;Object(n.n)(()=>{o.g&&document.body.classList.toggle("is-media-viewer-open",G)},[G]);const Me=Object(p.a)();Object(n.n)(()=>{const e=window.matchMedia(i.b);return"function"==typeof e.addEventListener?e.addEventListener("change",Me):"function"==typeof e.addListener&&e.addListener(Me),()=>{"function"==typeof e.removeEventListener?e.removeEventListener("change",Me):"function"==typeof e.removeListener&&e.removeListener(Me)}},[Me]);const Fe=Object(f.a)(I),Le=Object(f.a)(d),Ae=Object(f.a)(u),Te=Object(f.a)(Ie);Object(n.n)(()=>{if(ee&&G&&!Fe&&!Ae){Object(j.b)(350+l.c);const e=I?Object(C.a)(I):void 0;k(Boolean(e),d,Ie,I)}ee&&!G&&(Fe||Ae)&&(Object(j.b)(350+l.c),N(Le,Te,Fe||void 0))},[ee,G,d,Le,I,Fe,Ae,Ie,Te]),Object(n.n)(()=>{let e;return le?se(!0):e=window.setTimeout(()=>{se(!1)},350),()=>{e&&window.clearTimeout(e)}},[le]);const De=()=>{de(!1),ue(1),be({x:0,y:0})},Be=Object(n.m)(()=>{de(!le),ue(le?1:1.5),le&&be({x:0,y:0})},[le]),xe=Object(n.m)((e,t=!1)=>{ue(e),1===e&&t&&De()},[]),Re=Object(n.m)(()=>{M(),De()},[M]),Ue=Object(n.m)(()=>{Re(),B({chatId:e,threadId:t,messageId:a})},[Re,e,t,B,a]),Ge=Object(n.m)(()=>{L({fromChatId:e,messageIds:[a]}),De()},[L,e,a]);Object(n.n)(()=>G?Object(b.a)(()=>{le?De():Re()}):void 0,[Re,G,le]),Object(n.n)(()=>{Y&&!K&&Object(g.b)()},[K,Y]);const qe=Object(n.m)((e,t)=>{let a=ge.indexOf(e);return(-1===t&&a>0||1===t&&a{ve||P({chatId:e,threadId:t,messageId:a?qe(a,-1):void 0,origin:d})},[e,t,qe,ve,a,P,d]),$e=Object(n.m)(()=>{Ee||P({chatId:e,threadId:t,messageId:a?qe(a,1):void 0,origin:d})},[e,t,qe,Ee,a,P,d]);Object(n.n)(()=>{const e=e=>{switch(e.key){case"Left":case"ArrowLeft":ze();break;case"Right":case"ArrowRight":$e()}};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=K&&!o.e;return Object(h.b)(e,{excludedClosestSelector:".backdrop, .navigation, .media-viewer-head, .media-viewer-footer"+(t?"":", .VideoPlayer"),onClick:()=>{le||Re()},onSwipe:o.l?(e,t)=>{t===h.a.Right?ze():t===h.a.Left?$e():Re()}:void 0})},[Re,K,le,$e,ze,ce]);const He=Object(n.m)((e,t)=>{be({x:e,y:t})},[]),_e=Object(F.a)();function Ve(t){if(u)return n.a.createElement("div",{key:e,className:"media-viewer-content"},ie(ye||Ce,Object(i.g)(i.a,!1),!o.g&&!le));if(I){const e=Object(C.a)(I),c=Boolean(e);return n.a.createElement("div",{key:a,className:"media-viewer-content "+(c?"has-footer":"")},W&&ie(Ne||ye||Ce||fe,I&&Object(i.g)(we,c),!o.g&&!le),Y&&n.a.createElement(ne,{key:a,url:Ne||ye,isGif:K,posterData:Ie,posterSize:I&&Object(i.g)(Pe,c,!0),downloadProgress:ke,fileSize:$.size,isMediaViewerOpen:G,noPlay:!t,onClose:Re}),e&&n.a.createElement(V,{text:e,onClick:Ue,isHideable:Y}))}}function We(){return n.a.createElement(U,{key:u?u.id:a,chatId:u?u.id:e,messageId:a,isAvatar:Boolean(u)})}return n.a.createElement(A.a,{id:"MediaViewer",className:le?"zoomed":"",isOpen:G},()=>n.a.createElement(n.a.Fragment,null,n.a.createElement("div",{className:"media-viewer-head"},o.g&&n.a.createElement(D.a,{className:"media-viewer-close",round:!0,size:"smaller",color:"translucent-white",ariaLabel:_e("Close"),onClick:Re},n.a.createElement("i",{className:"icon-close"})),n.a.createElement(T.a,{activeKey:R.current,name:J},We),n.a.createElement(H,{mediaData:ye||Ce,isVideo:Y,isZoomed:le,message:I,fileName:te,onCloseMediaViewer:Re,onForward:Ge,onZoomToggle:Be,isAvatar:Boolean(u)})),n.a.createElement(oe,{noWrap:!ce,canPan:le,panDeltaX:he.x,panDeltaY:he.y,zoomLevel:me,onPan:He},n.a.createElement(T.a,{className:"slide-container",activeKey:pe,name:X},Ve)),!ve&&n.a.createElement("button",{type:"button",className:"navigation prev "+(Y&&!K&&"inline"),"aria-label":_e("AccDescrPrevious"),onClick:ze}),!Ee&&n.a.createElement("button",{type:"button",className:"navigation next "+(Y&&!K&&"inline"),"aria-label":_e("Next"),onClick:$e}),n.a.createElement(re,{isShown:le,onChangeZoom:xe})))})),me=a(48),ue=a(122),he=a(15),be=a(104),ge=a(42),pe=a(107),ve=a(100),Ee=a(103),Oe=a(118);a(256);var fe=Object(n.h)(Object(c.h)(e=>{const{chats:{byId:t,listIds:a},currentUserId:n}=e;return{chatsById:t,activeListIds:a.active,archivedListIds:a.archived,currentUserId:n}},(e,t)=>Object(u.l)(t,["setForwardChatId","exitForwardMode","loadMoreChats"]))(({chatsById:e,activeListIds:t,archivedListIds:a,currentUserId:c,isOpen:s,setForwardChatId:l,exitForwardMode:i,loadMoreChats:d})=>{const[u,h]=Object(n.r)(""),b=Object(n.q)(null),g=Object(F.a)();Object(n.n)(()=>{s?o.g||setTimeout(()=>{requestAnimationFrame(()=>{b.current&&b.current.focus()})},500):(b.current&&b.current.blur(),setTimeout(()=>{h("")},300))},[s]);const p=Object(n.p)(()=>{const n=[...t||[],...a||[]];return Object(m.Db)([...n.filter(t=>{const a=e[t];return!a||!!Object(m.e)(a,r.MAIN_THREAD_ID)&&(!u||Object(me.a)(Object(m.l)(g,e[t],void 0,t===c),u))})],e,void 0,c?[c]:void 0)},[t,a,e,c,u,g]),[v,E]=Object(ue.a)(d,p,Boolean(u)),O=Object(n.m)(e=>{h(e.currentTarget.value)},[]),f=n.a.createElement("div",{className:"modal-header"},n.a.createElement(D.a,{round:!0,color:"translucent",size:"smaller",ariaLabel:g("Close"),onClick:i},n.a.createElement("i",{className:"icon-close"})),n.a.createElement(ge.a,{ref:b,value:u,onChange:O,placeholder:g("ForwardTo")}));return n.a.createElement(be.a,{isOpen:s,onClose:i,className:"ForwardPicker",header:f},v&&v.length?n.a.createElement(pe.a,{className:"picker-list custom-scroll",items:v,onLoadMore:E,noScrollRestore:Boolean(u)},v.map(e=>n.a.createElement(ve.a,{key:e,className:"chat-item-clickable force-rounded-corners",onClick:()=>l({id:e})},Object(m.lb)(e)?n.a.createElement(Ee.a,{status:e===c?g("SavedMessagesInfo"):void 0,userId:e}):n.a.createElement(Oe.a,{chatId:e})))):v&&!v.length?n.a.createElement("p",{className:"no-results"},"Sorry, nothing found."):n.a.createElement(he.a,null))})),je=a(164);a(257);function Ce(e){return e.isSlowMode?"Slowmode enabled":"Something went wrong"}var ye=Object(n.h)(Object(c.h)(e=>Object(u.l)(e,["errors"]),(e,t)=>Object(u.l)(t,["dismissError"]))(({errors:e,dismissError:t})=>{const a=Object(F.a)();if(e.length)return n.a.createElement("div",{id:"Errors"},e.map(e=>n.a.createElement(be.a,{isOpen:!0,onClose:t,className:"error",title:Ce(e)},n.a.createElement("p",null,Object(je.a)(e)),n.a.createElement(D.a,{isText:!0,onClick:t},a("OK")))))})),ke=a(175);var Ne=Object(n.h)(Object(c.h)(e=>Object(u.l)(e,["notifications"]),(e,t)=>Object(u.l)(t,["dismissNotification"]))(({notifications:e,dismissNotification:t})=>{if(e.length)return n.a.createElement("div",{id:"Notifications"},e.map(({message:e})=>n.a.createElement(ke.a,{message:Object(x.a)(e,["emoji","br","links"]),onDismiss:t})))})),Ie=a(130),Se=a(112);var we=Object(n.h)(Object(c.h)(void 0,(e,t)=>Object(u.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]),r=Object(n.m)(()=>{t({url:void 0})},[t]),s=Object(Ie.a)(e);return n.a.createElement(Se.a,{isOpen:Boolean(e),onClose:r,title:a("OpenUrlTitle"),textParts:Object(x.a)(a("OpenUrlAlert2",s),["links"]),confirmLabel:a("OpenUrlTitle"),confirmHandler:c})}));a(258);const Pe=["M","T","W","T","F","S","S"];function Me(e,t,a,n,c){const r=new Date(e,t,a,0,0,0,0),s=n&&new Date(n.getFullYear(),n.getMonth(),n.getDate(),0,0,0,0),l=c&&new Date(c.getFullYear(),c.getMonth(),c.getDate(),0,0,0,0);return!!(l&&r>l)||!!(s&&r{const h=Object(F.a)(),b=new Date,g=Object(n.p)(()=>e?new Date(e):new Date,[e]),p=t?new Date(t):void 0,[v,E]=Object(n.r)(g),[O,f]=Object(n.r)(Fe(g.getHours())),[j,C]=Object(n.r)(Fe(g.getMinutes())),y=v.getFullYear(),k=v.getMonth(),N=v.getDate();Object(n.n)(()=>{r&&E(g)},[r,g]);const I=c&&y>=b.getFullYear()&&k>=b.getMonth()||p&&y>=p.getFullYear()&&k>=p.getMonth(),S=a&&y<=b.getFullYear()&&k<=b.getMonth(),w=Object(n.p)(()=>function(e,t){const a=[],n=new Date;n.setFullYear(e),n.setMonth(t),n.setDate(1);const c=n.getDay();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),E(n);const c=Fe(a);f(c),e.target.value=c},[v]),M=Object(n.m)(e=>{const t=e.target.value.replace(/[^\d]+/g,"");if(!t.length)return C(""),void(e.target.value="");const a=Math.max(0,Math.min(Number(t),59)),n=new Date(v.getTime());n.setMinutes(a),E(n);const c=Fe(a);C(c),e.target.value=c},[v]);return n.a.createElement(be.a,{isOpen:r,onClose:d,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:d},n.a.createElement("i",{className:"icon-close"})),n.a.createElement("h4",null,Object(B.f)(h,v,o.g)),n.a.createElement(D.a,{round:!0,size:"smaller",color:"translucent",disabled:S,onClick:S?void 0:function(){E(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:I,onClick:I?void 0:function(){E(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"},Pe.map(e=>n.a.createElement("div",{className:"day-button faded weekday"},n.a.createElement("span",null,e))),w.map(e=>n.a.createElement("div",{role:"button",tabIndex:0,onClick:()=>{return t=e,void E(e=>{const a=new Date(e);return a.setDate(t),a});var t},className:Object(ce.a)("day-button",Me(y,k,e,a?b:void 0,c?b:p)?"disabled":""+(e?"clickable":""),e===N&&"selected")},!!e&&n.a.createElement("span",null,e))))),s&&n.a.createElement("div",{className:"timepicker"},n.a.createElement("input",{type:"text",className:"form-control",inputMode:"decimal",value:O,onChange:P}),":",n.a.createElement("input",{type:"text",className:"form-control",inputMode:"decimal",value:j,onChange:M})),n.a.createElement("div",{className:"footer"},n.a.createElement(D.a,{onClick:function(){m(v)}},s?function(e,t){const a=Object(B.c)(e,t,!0);if("Today"===a)return e("Conversation.ScheduleMessage.SendToday",Object(B.h)(t));return e("Conversation.ScheduleMessage.SendOn",a).replace("%@",Object(B.h)(t))}(h,v):l),i&&n.a.createElement(D.a,{onClick:u,isText:!0},i)))});var Ae=Object(n.h)(Object(c.h)((e,{message:t,isSchedule:a})=>{const{threadId:n}=Object(d.y)(e)||{},{canDeleteForAll:c}=n&&Object(d.b)(e,t,n)||{},r=Object(d.f)(e,t.chatId);return{canDeleteForAll:!a&&c,contactName:r&&Object(m.lb)(r.id)?Object(m.Y)(Object(d.Fb)(e,Object(m.U)(r))):void 0,willDeleteForCurrentUserOnly:r&&Object(m.ib)(r)&&!c,willDeleteForAll:r&&Object(m.nb)(r)}},(e,t)=>Object(u.l)(t,["deleteMessages","deleteScheduledMessages"]))(({isOpen:e,isSchedule:t,message:a,album:c,canDeleteForAll:r,contactName:s,willDeleteForCurrentUserOnly:l,willDeleteForAll:o,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]),h=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]),b=Object(F.a)();return n.a.createElement(be.a,{isOpen:e,onClose:i,onEnter:e&&!r?h:void 0,className:"delete",title:b("DeleteSingleMessagesTitle")},n.a.createElement("p",null,b("AreYouSureDeleteSingleMessage")),l&&n.a.createElement("p",null,b("lng_delete_for_me_chat_hint")),o&&n.a.createElement("p",null,b("lng_delete_for_everyone_hint",1,"i")),r&&n.a.createElement(D.a,{color:"danger",className:"confirm-dialog-button",isText:!0,onClick:u},s&&b("Conversation.DeleteMessagesFor",Object(x.a)(s)),!s&&b("Conversation.DeleteMessagesForEveryone")),n.a.createElement(D.a,{color:"danger",className:"confirm-dialog-button",isText:!0,onClick:h},b(r?"ChatList.DeleteForCurrentUser":"Delete")),n.a.createElement(D.a,{className:"confirm-dialog-button",isText:!0,onClick:i},b("Cancel")))}));var Te=Object(n.h)(Object(c.h)((e,{chatId:t})=>{const a=Object(m.lb)(t),n=Object(d.O)(e,t),c=Object(d.f)(e,t),r=!!c&&Object(m.jb)(c),s=!!c&&Object(m.ib)(c),l=!!c&&Object(m.nb)(c);return{isPrivateChat:a,isChatWithSelf:n,isChannel:r,isGroup:s,isSuperGroup:l,canPinForAll:a&&!n||l||s,contactName:c&&Object(m.lb)(c.id)?Object(m.Y)(Object(d.Fb)(e,Object(m.U)(c))):void 0}},(e,t)=>Object(u.l)(t,["pinMessage"]))(({isOpen:e,messageId:t,chatId:a,isChannel:c,isGroup:r,isSuperGroup:s,canPinForAll:l,contactName:o,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(F.a)();return n.a.createElement(be.a,{isOpen:e,onClose:i,className:"pin",title:h("PinMessageAlertTitle")},n.a.createElement("p",null,h(c?"PinMessageAlertChannel":r||s?"PinMessageAlert":"PinMessageAlertChat")),n.a.createElement(D.a,{className:"confirm-dialog-button",isText:!0,onClick:u},h("DialogPin")),l&&n.a.createElement(D.a,{className:"confirm-dialog-button",isText:!0,onClick:m},o?h("Conversation.PinMessagesFor",o):h("Conversation.PinMessageAlert.PinAndNotifyMembers")),n.a.createElement(D.a,{className:"confirm-dialog-button",isText:!0,onClick:i},h("Cancel")))}));var De=Object(n.h)(({isOpen:e,pinnedMessagesCount:t=0,onClose:a,onUnpin:c})=>{const r=Object(F.a)();return n.a.createElement(be.a,{isOpen:e,onClose:a,className:"unpin-all",title:r("Chat.PanelUnpinAllMessages")},n.a.createElement("p",null,r("Chat.UnpinAllMessagesConfirmation",t,"i")),n.a.createElement(D.a,{className:"confirm-dialog-button",isText:!0,onClick:c},r("DialogUnpin")),n.a.createElement(D.a,{className:"confirm-dialog-button",isText:!0,onClick:a},r("Cancel")))}),Be=a(31),xe=a(51);var Re=Object(n.h)(Object(c.h)((e,{isSchedule:t})=>{const{messageIds:a}=e.selectedMessages||{},{canDeleteForAll:n}=Object(d.e)(e),c=Object(d.r)(e);return{selectedMessageIds:a,canDeleteForAll:!t&&n,contactName:c&&Object(m.lb)(c.id)?Object(m.Y)(Object(d.Fb)(e,Object(m.U)(c))):void 0,willDeleteForCurrentUserOnly:c&&Object(m.ib)(c)&&!n,willDeleteForAll:c&&Object(m.nb)(c)}},(e,t)=>Object(u.l)(t,["deleteMessages","deleteScheduledMessages","exitMessageSelectMode"]))(({isOpen:e,isSchedule:t,selectedMessageIds:a,canDeleteForAll:c,contactName:r,willDeleteForCurrentUserOnly:s,willDeleteForAll:l,onClose:o,deleteMessages:i,deleteScheduledMessages:d,exitMessageSelectMode:m})=>{const u=Object(n.m)(()=>{i({messageIds:a,shouldDeleteForAll:!0}),m(),o()},[i,m,a,o]),h=Object(n.m)(()=>{t?d({messageIds:a}):i({messageIds:a,shouldDeleteForAll:!1}),m(),o()},[t,m,o,d,a,i]),b=Object(F.a)();if(a)return n.a.createElement(be.a,{isOpen:e,onClose:o,onEnter:c?void 0:h,className:"delete",title:b("Conversation.DeleteManyMessages")},n.a.createElement("p",null,b("AreYouSureDeleteFewMessages")),s&&n.a.createElement("p",null,"This will delete them just for you, not for other participants in the chat."),l&&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:u},r?b("ChatList.DeleteForEveryone",Object(x.a)(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:o},b("Cancel")))}));a(259);var Ue=Object(n.h)(Object(c.h)(e=>{const{type:t}=Object(d.y)(e)||{},{canDelete:a}=Object(d.e)(e);return{isSchedule:"scheduled"===t,selectedMessagesCount:Object(d.rb)(e),canDeleteMessages:a}},(e,t)=>Object(u.l)(t,["exitMessageSelectMode","openForwardMenuForSelectedMessages"]))(({canPost:e,isActive:t,messageListType:a,isSchedule:c,selectedMessagesCount:r,canDeleteMessages:s,exitMessageSelectMode:l,openForwardMenuForSelectedMessages:o})=>{const[i,d,m]=Object(Be.a)();Object(n.n)(()=>t&&!i?Object(xe.a)({onBackspace:d,onDelete:d,onEsc:l}):void 0,[t,i,d,l]);const u=Object(f.a)(r||void 0,!0),h=t?r:u,b=Object(F.a)(),g=b("VoiceOver.Chat.MessagesSelected",h),p=Object(ce.a)("MessageSelectToolbar",e&&"with-composer",t&&"shown");return n.a.createElement("div",{className:p},n.a.createElement("div",{className:"MessageSelectToolbar-inner"},n.a.createElement(D.a,{color:"translucent",round:!0,onClick:l,ariaLabel:"Exit select mode"},n.a.createElement("i",{className:"icon-close"})),n.a.createElement("span",{className:"MessageSelectToolbar-count",title:g},g),!!r&&n.a.createElement("div",{className:"MessageSelectToolbar-actions"},"scheduled"!==a&&n.a.createElement(z.a,{icon:"forward",ariaLabel:"Forward Messages",onClick:o},n.a.createElement("span",{className:"item-text"},b("Forward"))),n.a.createElement(z.a,{destructive:!0,icon:"delete",onClick:d,disabled:!s,ariaLabel:b("EditAdminGroupDeleteMessages")},n.a.createElement("span",{className:"item-text"},b("Delete"))))),n.a.createElement(Re,{isOpen:i,isSchedule:c,onClose:m}))})),Ge=a(163),qe=a(47),ze=a(165),$e=a(152);var He=Object(n.h)(Object(c.h)((e,{chatId:t})=>{const a=Object(d.f)(e,t),n=a&&Object(m.U)(a);return{chat:a,privateChatUser:n?Object(d.Fb)(e,n):void 0,isPinned:Object(d.M)(e,t)}})(({chatId:e,chat:t,privateChatUser:a,isPinned:c,withUsername:r,onClick:s})=>{const[l,o,i]=Object(Be.a)(),d=Object(ze.a)({chat:t,privateChatUser:a,isPinned:c,handleDelete:o});if(t)return n.a.createElement(ve.a,{className:"chat-item-clickable search-result",onClick:()=>s(e),contextActions:d},Object(m.lb)(e)?n.a.createElement(Ee.a,{userId:e,withUsername:r,avatarSize:"large"}):n.a.createElement(Oe.a,{chatId:e,withUsername:r,avatarSize:"large"}),n.a.createElement($e.a,{isOpen:l,onClose:i,chat:t}))})),_e=a(138);a(260);const Ve=Object(_.g)(e=>e(),6e4,!0);var We=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(u.l)(t,["loadTopUsers","loadContactList","openChat","addRecentlyFoundChatId","clearRecentlyFoundChats"]))(({topUserIds:e,usersById:t,recentlyFoundChatIds:a,onReset:c,loadTopUsers:r,loadContactList:s,openChat:l,addRecentlyFoundChatId:o,clearRecentlyFoundChats:i})=>{const d=Object(n.q)(null);Object(n.n)(()=>{Ve(()=>{r(),s()})},[r,s]),Object(_e.a)(d,!e);const u=Object(n.m)(e=>{l({id:e}),c(),setTimeout(()=>{o({id:e})},250)},[l,o,c]),h=Object(F.a)();return n.a.createElement("div",{className:"RecentContacts custom-scroll"},e&&n.a.createElement("div",{className:"top-peers-section"},n.a.createElement("div",{ref:d,className:"top-peers no-selection"},e.map(e=>n.a.createElement("div",{className:"top-peer-item",onClick:()=>u(e)},n.a.createElement(R.a,{user:t[e]}),n.a.createElement("div",{className:"top-peer-name"},Object(x.a)(Object(m.Y)(t[e])||" ")))))),a&&n.a.createElement("div",{className:"search-section pt-1"},n.a.createElement("h3",{className:"section-heading mt-0 recent-chats-header"},h("Recent"),n.a.createElement(D.a,{round:!0,size:"smaller",color:"translucent",ariaLabel:"Clear recent chats",onClick:i},n.a.createElement("i",{className:"icon-close"}))),a.map(e=>n.a.createElement(He,{chatId:e,onClick:u}))))})),Ye=a(128),Ke=a(24);a(261);var Ze=Object(n.h)(Object(c.h)((e,{chatId:t})=>{const a=Object(d.f)(e,t);if(!a)return{};const n=Object(m.U)(a);return{chat:a,...n&&{privateChatUser:Object(d.Fb)(e,n)},lastSyncTime:e.lastSyncTime}},(e,t)=>Object(u.l)(t,["focusMessage"]))(({message:e,searchQuery:t,chatId:a,chat:c,privateChatUser:r,focusMessage:s,lastSyncTime:l})=>{const i=Object(m.E)(e),d=Object(v.a)(Object(m.D)(e,"micro")),u=Boolean(Object(m.I)(e)),h=Object(n.m)(()=>{s({chatId:a,messageId:e.id})},[a,s,e.id]),b=Object(F.a)();if(c)return n.a.createElement(ve.a,{className:"ChatMessage chat-item-clickable",ripple:!o.g,onClick:h},n.a.createElement(R.a,{chat:c,user:r,withOnlineStatus:!0,isSavedMessages:r&&r.isSelf,lastSyncTime:l}),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(m.l)(b,c,r))),c.isVerified&&n.a.createElement(Ye.a,null)),n.a.createElement("div",{className:"message-date"},n.a.createElement(Ke.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,c,r){if(!a)return Object(x.a)(Object(m.N)(e,t));return n.a.createElement("span",{className:"media-preview"},n.a.createElement("img",{src:a,alt:"",className:r?"round":void 0}),Object(m.P)(t)&&n.a.createElement("i",{className:"icon-play"}),Object(x.a)(Object(m.N)(e,t,!0),["emoji","highlight"],{highlight:c}))}(b,e,d||i,t,u)))))}));a(262);var Qe=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))))}),Xe=a(113),Je=a(136);const et=Object(_.g)(e=>e(),500,!0);var tt=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:r,lastSyncTime:s}=e,{fetchingStatus:l,globalResults:o,localResults:i,resultsByType:d}=e.globalSearch,{chatIds:m,userIds:u}=o||{},{chatIds:h,userIds:b}=i||{},{byChatId:g}=r,{foundIds:p}=d&&d.text||{};return{currentUserId:c,localContactIds:n,localChatIds:h,localUserIds:b,globalChatIds:m,globalUserIds:u,foundIds:p,globalMessagesByChatId:g,chatsById:t,usersById:a,fetchingStatus:l,lastSyncTime:s}},(e,t)=>Object(u.l)(t,["openChat","addRecentlyFoundChatId","searchMessagesGlobal","setGlobalSearchChatId"]))(({searchQuery:e,searchDate:t,dateSearchQuery:a,currentUserId:c,localContactIds:r,localChatIds:l,localUserIds:i,globalChatIds:d,globalUserIds:h,foundIds:b,globalMessagesByChatId:g,chatsById:p,usersById:v,fetchingStatus:E,lastSyncTime:O,onReset:f,onSearchDateSelect:j,openChat:C,addRecentlyFoundChatId:y,searchMessagesGlobal:k,setGlobalSearchChatId:N})=>{const I=Object(F.a)(),[S,w]=Object(n.r)(!1),[P,M]=Object(n.r)(!1),L=Object(n.m)(({direction:t})=>{O&&t===s.e.Backwards&&et(()=>{k({type:"text",query:e})})},[O,k,e]),A=Object(n.m)(e=>{C({id:e}),e!==c&&y({id:e}),o.g||f()},[c,C,y,f]),T=Object(n.m)(e=>{N({id:e})},[N]),D=Object(n.p)(()=>{if(!e||e.startsWith("@")&&e.length<2)return qe.a;const t=r?r.filter(t=>{const a=v[t];if(!a)return!1;const n=Object(m.Z)(a);return n&&Object(me.a)(n,e)||Object(me.a)(a.username,e)}):[];return[...c&&Object(me.a)(I("SavedMessages"),e)?[c]:[],...Object(m.Db)(Object(u.o)([...t,...l||[],...i||[]]),p)]},[e,r,c,I,l,i,p,v]),B=Object(n.p)(()=>!e||e.length<4||!d||!h?qe.a:Object(m.Db)(Object(u.o)([...d,...h]),p,!0),[p,d,h,e]),x=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):qe.a,[b,g,e,t]),R=Object(n.m)(()=>{w(!S)},[S]),U=Object(n.m)(()=>{M(!P)},[P]);const G=E&&!E.chats&&!E.messages&&!D.length&&!B.length&&!x.length;return e||t?n.a.createElement(pe.a,{className:"LeftSearch custom-scroll",items:x,onLoadMore:L,noScrollRestoreOnTop:!0,noFastList:!0},a&&n.a.createElement("div",{className:"chat-selection no-selection no-scrollbar"},n.a.createElement(Qe,{searchDate:a,onSelect:j})),G&&n.a.createElement(Xe.a,{text:I("ChatList.Search.NoResults"),description:I("ChatList.Search.NoResultsDescription")}),!!D.length&&n.a.createElement("div",{className:"chat-selection no-selection no-scrollbar"},D.map(e=>n.a.createElement(Je.a,{chatOrUserId:e,onClick:T,clickArg:e}))),!!D.length&&n.a.createElement("div",{className:"search-section"},n.a.createElement("h3",{className:"section-heading"},D.length>3&&n.a.createElement(Ke.a,{onClick:R},I(S?"ChatList.Search.ShowLess":"ChatList.Search.ShowMore")),I("DialogList.SearchSectionDialogs")),D.map((e,t)=>{if(S||!(t>=3))return n.a.createElement(He,{chatId:e,onClick:A})})),!!B.length&&n.a.createElement("div",{className:"search-section"},n.a.createElement("h3",{className:"section-heading"},B.length>3&&n.a.createElement(Ke.a,{onClick:U},I(P?"ChatList.Search.ShowLess":"ChatList.Search.ShowMore")),I("DialogList.SearchSectionGlobal")),B.map((e,t)=>{if(P||!(t>=3))return n.a.createElement(He,{chatId:e,withUsername:!0,onClick:A})})),!!x.length&&n.a.createElement("div",{className:"search-section"},n.a.createElement("h3",{className:"section-heading"},I("SearchMessages")),x.map((function(t){const a=Object(m.N)(I,t),c=p[t.chatId];if(a&&c)return n.a.createElement(Ze,{chatId:t.chatId,message:t,searchQuery:e})})))):n.a.createElement(We,{onReset:f})}));const at=Object(_.g)(e=>e(),500,!0);var nt=Object(n.h)(Object(c.h)(e=>{const{byId:t}=e.chats,{currentUserId:a,messages:{byChatId:n},lastSyncTime:c}=e,{fetchingStatus:r,resultsByType:s}=e.globalSearch,{foundIds:l}=s&&s.text||{};return{currentUserId:a,foundIds:l,globalMessagesByChatId:n,chatsById:t,fetchingStatus:r,lastSyncTime:c}},(e,t)=>Object(u.l)(t,["searchMessagesGlobal"]))(({searchQuery:e,currentUserId:t,dateSearchQuery:a,foundIds:c,globalMessagesByChatId:r,chatsById:l,fetchingStatus:o,lastSyncTime:i,searchMessagesGlobal:d,onSearchDateSelect:u})=>{const h=Object(F.a)(),b=Object(n.m)(({direction:a})=>{i&&a===s.e.Backwards&&at(()=>{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 r&&r[t]&&r[t].byId[a]}).filter(Boolean).sort((e,t)=>t.date-e.date):qe.a,[c,r]);const p=o&&!o.chats&&!o.messages&&!g.length;return n.a.createElement("div",{className:"LeftSearch"},n.a.createElement(pe.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(Qe,{searchDate:a,onSelect:u})),p&&n.a.createElement(Xe.a,{text:h("ChatList.Search.NoResults"),description:h("ChatList.Search.NoResultsDescription")}),!!g.length&&g.map((function(t){const a=Object(m.N)(h,t),c=l[t.chatId];if(a&&c)return n.a.createElement(Ze,{chatId:t.chatId,message:t,searchQuery:e})}))))}));function ct(e){return(t,a)=>{const{byId:n}=t.chats,{byId:c}=t.users,{fetchingStatus:r,resultsByType:s,chatId:l}=t.globalSearch,o="audio"!==e?e:a&&a.isVoice?"voice":"audio",{byChatId:i}=t.messages,{foundIds:d}=s&&s[o]||{};return{isLoading:void 0===d||!!r&&Boolean(r.chats||r.messages),chatsById:n,usersById:c,globalMessagesByChatId:i,foundIds:d,searchChatId:l,lastSyncTime:t.lastSyncTime}}}var rt=a(114),st=a(160);const lt=Object(_.g)(e=>e(),500,!0);var ot=Object(n.h)(Object(c.h)(ct("media"),(e,t)=>Object(u.l)(t,["searchMessagesGlobal","openMediaViewer"]))(({searchQuery:e,searchChatId:t,isLoading:a,globalMessagesByChatId:c,foundIds:r,lastSyncTime:o,searchMessagesGlobal:i,openMediaViewer:d})=>{const m=Object(F.a)(),u=Object(n.m)(({direction:a})=>{o&&a===s.e.Backwards&<(()=>{i({type:"media",query:e,chatId:t})})},[o,i,e,t]),h=Object(n.p)(()=>r&&c?r.map(e=>{const[t,a]=e.split("_").map(Number);return c[t]&&c[t].byId[a]}).filter(Boolean):qe.a,[c,r]),b=Object(n.m)((e,t)=>{d({chatId:t,messageId:e,origin:s.h.SearchResult})},[d]);const g=Object(rt.a)([e],l.pb)&&!a,p=g&&r&&r.length>0&&!e,v=g&&r&&r.length>0&&e,E=Object(ce.a)("search-content custom-scroll",v&&"chat-list");return n.a.createElement("div",{className:"LeftSearch"},n.a.createElement(pe.a,{className:E,items:h,itemSelector:e?".ListItem":".Media",onLoadMore:u,noFastList:!0},!g&&n.a.createElement(he.a,null),g&&(!r||0===r.length)&&n.a.createElement(Xe.a,{text:m("ChatList.Search.NoResults"),description:m("ChatList.Search.NoResultsDescription")}),p&&n.a.createElement("div",{className:"media-list"},h.map(e=>n.a.createElement(st.a,{key:e.id,idPrefix:"search-media",message:e,onClick:b}))),v&&h.map(e=>n.a.createElement(Ze,{key:e.id,chatId:e.chatId,message:e}))))}));function it(e,t,a,n){const{senderId:c}=t;if(!c)return;const r=Object(m.lb)(c)?n[c]:a[c];let s=Object(m.V)(e,r);const l=a[t.chatId];return l&&(Object(m.lb)(c)&&r.isSelf?s=`${e("FromYou")} → ${Object(m.l)(e,l)}`:Object(m.kb)(l)&&(s+=" → "+Object(m.l)(e,l))),s}var dt=a(180);const mt=Object(_.g)(e=>e(),500,!0);var ut=Object(n.h)(Object(c.h)(ct("links"),(e,t)=>Object(u.l)(t,["searchMessagesGlobal","focusMessage"]))(({searchQuery:e,searchChatId:t,isLoading:a,chatsById:c,usersById:r,globalMessagesByChatId:o,foundIds:i,lastSyncTime:d,searchMessagesGlobal:m,focusMessage:u})=>{const h=Object(F.a)(),b=Object(n.m)(({direction:a})=>{d&&a===s.e.Backwards&&mt(()=>{m({type:"links",query:e,chatId:t})})},[d,m,e,t]),g=Object(n.p)(()=>i&&o?i.map(e=>{const[t,a]=e.split("_").map(Number);return o[t]&&o[t].byId[a]}).filter(Boolean):qe.a,[o,i]),p=Object(n.m)((e,t)=>{u({chatId:t,messageId:e})},[u]);const v=Object(rt.a)([e],l.pb)&&!a;return n.a.createElement("div",{className:"LeftSearch"},n.a.createElement(pe.a,{className:"search-content documents-list custom-scroll",items:g,onLoadMore:b,noFastList:!0},!v&&n.a.createElement(he.a,null),v&&(!i||0===i.length)&&n.a.createElement(Xe.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",key:e.id},a&&n.a.createElement("p",{className:"section-heading"},Object(B.f)(h,new Date(1e3*e.date))),n.a.createElement(dt.a,{key:e.id,message:e,senderTitle:it(h,e,c,r),onMessageClick:p}))})))})),ht=a(155);const bt=Object(_.g)(e=>e(),500,!0);var gt=Object(n.h)(Object(c.h)(ct("documents"),(e,t)=>Object(u.l)(t,["searchMessagesGlobal","focusMessage"]))(({searchQuery:e,searchChatId:t,isLoading:a,chatsById:c,usersById:r,globalMessagesByChatId:o,foundIds:i,lastSyncTime:d,searchMessagesGlobal:u,focusMessage:h})=>{const b=Object(F.a)(),g=Object(n.m)(({direction:a})=>{d&&a===s.e.Backwards&&bt(()=>{u({type:"documents",query:e,chatId:t})})},[d,u,e,t]),p=Object(n.p)(()=>i&&o?i.map(e=>{const[t,a]=e.split("_").map(Number),n=o[t]&&o[t].byId[a];return n&&Object(m.y)(n)?n:void 0}).filter(Boolean):qe.a,[o,i]),v=Object(n.m)((e,t)=>{h({chatId:t,messageId:e})},[h]);const E=Object(rt.a)([e],l.pb)&&!a;return n.a.createElement("div",{className:"LeftSearch"},n.a.createElement(pe.a,{className:"search-content documents-list custom-scroll",items:p,onLoadMore:g,noFastList:!0},!E&&n.a.createElement(he.a,null),E&&(!i||0===i.length)&&n.a.createElement(Xe.a,{text:b("ChatList.Search.NoResults"),description:b("ChatList.Search.NoResultsDescription")}),E&&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(ht.a,{message:e,withDate:!0,datetime:e.date,smaller:!0,sender:it(b,e,c,r),className:"scroll-item",onDateClick:v}))})))})),pt=a(162);const vt=Object(_.g)(e=>e(),500,!0);var Et=Object(n.h)(Object(c.h)(ct("audio"),(e,t)=>Object(u.l)(t,["searchMessagesGlobal","focusMessage","openAudioPlayer"]))(({isVoice:e,searchQuery:t,searchChatId:a,isLoading:c,chatsById:r,usersById:o,globalMessagesByChatId:i,foundIds:d,lastSyncTime:m,searchMessagesGlobal:u,focusMessage:h,openAudioPlayer:b})=>{const g=Object(F.a)(),p=e?"voice":"audio",v=Object(n.m)(({direction:e})=>{m&&e===s.e.Backwards&&vt(()=>{u({type:p,query:t,chatId:a})})},[p,m,u,t,a]),E=Object(n.p)(()=>d&&i?d.map(e=>{const[t,a]=e.split("_").map(Number);return i[t]&&i[t].byId[a]}).filter(Boolean):qe.a,[i,d]),O=Object(n.m)((e,t)=>{h({chatId:t,messageId:e})},[h]),f=Object(n.m)((e,t)=>{b({chatId:t,messageId:e})},[b]);const j=Object(rt.a)([t],l.pb)&&!c;return n.a.createElement("div",{className:"LeftSearch"},n.a.createElement(pe.a,{className:"search-content documents-list custom-scroll",items:E,onLoadMore:v,noFastList:!0},!j&&n.a.createElement(he.a,null),j&&(!d||0===d.length)&&n.a.createElement(Xe.a,{text:g("ChatList.Search.NoResults"),description:g("ChatList.Search.NoResultsDescription")}),j&&d&&d.length>0&&E.map((e,t)=>{const a=0===t||Object(B.n)(e.date)!==Object(B.n)(E[t-1].date);return n.a.createElement("div",{className:"ListItem",key:e.id},a&&n.a.createElement("p",{className:"section-heading"},Object(B.f)(g,new Date(1e3*e.date))),n.a.createElement(pt.a,{key:e.id,message:e,renderingFor:"searchResult",senderTitle:it(g,e,r,o),date:e.date,lastSyncTime:m,className:"scroll-item",onPlay:f,onDateClick:O}))})))}));a(263);const Ot=[{type:s.c.ChatList,title:"SearchAllChatsShort"},{type:s.c.Media,title:"SharedMediaTab2"},{type:s.c.Links,title:"SharedLinksTab2"},{type:s.c.Files,title:"SharedFilesTab2"},{type:s.c.Music,title:"SharedMusicTab2"},{type:s.c.Voice,title:"SharedVoiceTab2"}],ft=[{type:s.c.ChatList,title:"All Messages"},...Ot.slice(1)],jt=Object.keys(s.c).length/2;var Ct=Object(n.h)(Object(c.h)(e=>{const{currentContent:t,chatId:a}=e.globalSearch;return{currentContent:t,chatId:a}},(e,t)=>Object(u.l)(t,["setGlobalSearchContent","setGlobalSearchDate"]))(({searchQuery:e,searchDate:t,currentContent:a=s.c.ChatList,chatId:c,setGlobalSearchContent:r,setGlobalSearchDate:l,onReset:o})=>{const[i,d]=Object(n.r)(0),m=Object(n.p)(()=>Object(B.l)(e),[e]),u=Object(n.m)(e=>{const t=Ot[e];r({content:t.type}),d(e)},[r]),h=Object(n.m)(e=>{l({date:e.getTime()/1e3})},[l]);return n.a.createElement("div",{className:"LeftSearch"},n.a.createElement(Ge.a,{activeTab:i,tabs:c?ft:Ot,onSwitchTab:u}),n.a.createElement(T.a,{name:"slide",renderCount:jt,activeKey:a},()=>{switch(a){case s.c.ChatList:return c?n.a.createElement(nt,{searchQuery:e,dateSearchQuery:m,onReset:o,onSearchDateSelect:h}):n.a.createElement(tt,{searchQuery:e,searchDate:t,dateSearchQuery:m,onReset:o,onSearchDateSelect:h});case s.c.Media:return n.a.createElement(ot,{searchQuery:e});case s.c.Links:return n.a.createElement(ut,{searchQuery:e});case s.c.Files:return n.a.createElement(gt,{searchQuery:e});case s.c.Music:return n.a.createElement(Et,{key:"audio",searchQuery:e});case s.c.Voice:return n.a.createElement(Et,{key:"voice",isVoice:!0,searchQuery:e});default:return}}))}));function yt(e,t){const a=Object(n.q)(e),[c,r]=Object(n.r)(t);return[c,Object(n.m)(e=>{r(t=>a.current(t,e))},[])]}const kt=[{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"}],Nt=[{icon:"mute",title:"FilterMuted",key:"excludeMuted"},{icon:"archive",title:"FilterArchived",key:"excludeArchived"},{icon:"readchats",title:"FilterRead",key:"excludeRead"}],It=["includedChatIds","bots","channels","groups","contacts","nonContacts"],St=["excludedChatIds","excludeArchived","excludeMuted","excludeRead"];function wt(e,t,a){let n=[],c=[];if("included"===t){const{includedChatIds:t,...r}=a?e.includeFilters||{}:Object(u.l)(e.folder,It);n=t||[],c=Object.keys(r).filter(e=>Boolean(r[e]))}else{const{excludedChatIds:t,...r}=a?e.excludeFilters||{}:Object(u.l)(e.folder,St);n=t||[],c=Object.keys(r).filter(e=>Boolean(r[e]))}return{selectedChatIds:n,selectedChatTypes:c}}function Pt(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 Mt={mode:"create",chatFilter:"",folder:{title:"",includedChatIds:[],excludedChatIds:[]}},Ft=(e,t)=>{switch(t.type){case"setTitle":return{...e,folder:{...e.folder,title:t.payload},isTouched:!0};case"editIncludeFilters":return{...e,includeFilters:Object(u.l)(e.folder,It)};case"editExcludeFilters":return{...e,excludeFilters:Object(u.l)(e.folder,St)};case"setIncludeFilters":return{...e,includeFilters:t.payload,chatFilter:""};case"setExcludeFilters":return{...e,excludeFilters:t.payload,chatFilter:""};case"saveFilters":return e.includeFilters?{...e,folder:{...Object(u.j)(e.folder,It),title:e.folder.title?e.folder.title:Pt(e.includeFilters),...e.includeFilters},includeFilters:void 0,chatFilter:"",isTouched:!0}:e.excludeFilters?{...e,folder:{...Object(u.j)(e.folder,St),...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 Mt;default:return e}};const Lt={currentPassword:"",password:"",hint:"",email:""},At=(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 Lt;default:return e}};var Tt=Object(n.h)(Object(c.h)(void 0,(e,t)=>Object(u.l)(t,["signOut","deleteChatFolder"]))(({currentScreen:e,editedFolderId:t,onReset:a,onSaveFilter:c,signOut:r,deleteChatFolder:l})=>{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(),r()},[b,r]),E=Object(n.m)(()=>{p(),l({id:t}),a()},[t,p,l,a]),O=Object(n.p)(()=>({onTrigger:e,isOpen:t})=>n.a.createElement(D.a,{round:!0,ripple:!o.g,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 s.m.EditProfile:return n.a.createElement("h3",null,f("lng_settings_information"));case s.m.General:return n.a.createElement("h3",null,f("General"));case s.m.Notifications:return n.a.createElement("h3",null,f("Notifications"));case s.m.Privacy:return n.a.createElement("h3",null,f("PrivacySettings"));case s.m.Language:return n.a.createElement("h3",null,f("Language"));case s.m.GeneralChatBackground:return n.a.createElement("h3",null,f("ChatBackground"));case s.m.GeneralChatBackgroundColor:return n.a.createElement("h3",null,f("SetColor"));case s.m.PrivacyPhoneNumber:return n.a.createElement("h3",null,f("PrivacyPhone"));case s.m.PrivacyLastSeen:return n.a.createElement("h3",null,f("PrivacyLastSeen"));case s.m.PrivacyProfilePhoto:return n.a.createElement("h3",null,f("Privacy.ProfilePhoto"));case s.m.PrivacyForwarding:return n.a.createElement("h3",null,f("PrivacyForwards"));case s.m.PrivacyGroupChats:return n.a.createElement("h3",null,f("AutodownloadGroupChats"));case s.m.PrivacyPhoneNumberAllowedContacts:case s.m.PrivacyLastSeenAllowedContacts:case s.m.PrivacyProfilePhotoAllowedContacts:case s.m.PrivacyForwardingAllowedContacts:case s.m.PrivacyGroupChatsAllowedContacts:return n.a.createElement("h3",null,f("AlwaysShareWith"));case s.m.PrivacyPhoneNumberDeniedContacts:case s.m.PrivacyLastSeenDeniedContacts:case s.m.PrivacyProfilePhotoDeniedContacts:case s.m.PrivacyForwardingDeniedContacts:case s.m.PrivacyGroupChatsDeniedContacts:return n.a.createElement("h3",null,f("NeverShareWith"));case s.m.PrivacyActiveSessions:return n.a.createElement("h3",null,f("SessionsTitle"));case s.m.PrivacyBlockedUsers:return n.a.createElement("h3",null,f("BlockedUsers"));case s.m.TwoFaDisabled:case s.m.TwoFaEnabled:return n.a.createElement("h3",null,f("TwoStepVerification"));case s.m.TwoFaNewPassword:case s.m.TwoFaChangePasswordNew:case s.m.TwoFaChangePasswordConfirm:return n.a.createElement("h3",null,f("EnterPassword"));case s.m.TwoFaNewPasswordConfirm:return n.a.createElement("h3",null,f("PleaseReEnterPassword"));case s.m.TwoFaNewPasswordHint:case s.m.TwoFaChangePasswordHint:return n.a.createElement("h3",null,f("PasswordHint"));case s.m.TwoFaNewPasswordEmail:case s.m.TwoFaRecoveryEmail:return n.a.createElement("h3",null,f("RecoveryEmailTitle"));case s.m.TwoFaNewPasswordEmailCode:case s.m.TwoFaRecoveryEmailCode:return n.a.createElement("h3",null,"Recovery Email Code");case s.m.TwoFaCongratulations:return n.a.createElement("h3",null,f("TwoStepVerificationPasswordSet"));case s.m.TwoFaChangePasswordCurrent:case s.m.TwoFaTurnOff:case s.m.TwoFaRecoveryEmailCurrentPassword:return n.a.createElement("h3",null,f("PleaseEnterCurrentPassword"));case s.m.Folders:return n.a.createElement("h3",null,f("Filters"));case s.m.FoldersCreateFolder:return n.a.createElement("h3",null,f("FilterNew"));case s.m.FoldersEditFolder:return n.a.createElement("div",{className:"settings-main-header"},n.a.createElement("h3",null,f("FilterEdit")),t&&n.a.createElement(q.a,{className:"settings-more-menu",trigger:O,positionX:"right"},n.a.createElement(z.a,{icon:"delete",destructive:!0,onClick:g},"Delete Folder")));case s.m.FoldersIncludedChats:case s.m.FoldersExcludedChats:return n.a.createElement("div",{className:"settings-main-header"},e===s.m.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(q.a,{className:"settings-more-menu",trigger:O,positionX:"right"},n.a.createElement(z.a,{icon:"logout",onClick:h},f("LogOutTitle"))))}}(),n.a.createElement(Se.a,{isOpen:i,onClose:b,text:"Are you sure you want to log out?",confirmLabel:"Log Out",confirmHandler:v,confirmIsDestructive:!0}),n.a.createElement(Se.a,{isOpen:m,onClose:p,text:"Are you sure you want to delete this folder?",confirmLabel:"Delete",confirmHandler:E,confirmIsDestructive:!0}))})),Dt=a(17);var Bt=Object(n.h)(Object(c.h)(e=>{const{currentUserId:t}=e;return{currentUser:t?Object(d.Fb)(e,t):void 0}})(({onScreenSelect:e,currentUser:t})=>{const a=Object(F.a)();return n.a.createElement("div",{className:"settings-content custom-scroll"},n.a.createElement("div",{className:"settings-main-menu"},t&&n.a.createElement("div",{className:"settings-current-user"},n.a.createElement(R.a,{user:t,size:"jumbo"}),n.a.createElement("p",{className:"name"},Object(m.Z)(t)),n.a.createElement("p",{className:"phone"},Object(Dt.c)(t.phoneNumber))),n.a.createElement(ve.a,{icon:"edit",onClick:()=>e(s.m.EditProfile)},a("lng_settings_information")),n.a.createElement(ve.a,{icon:"folder",onClick:()=>e(s.m.Folders)},a("Filters")),n.a.createElement(ve.a,{icon:"settings",onClick:()=>e(s.m.General)},a("GeneralSettings")),n.a.createElement(ve.a,{icon:"unmute",onClick:()=>e(s.m.Notifications)},a("Notifications")),n.a.createElement(ve.a,{icon:"lock",onClick:()=>e(s.m.Privacy)},a("PrivacySettings")),n.a.createElement(ve.a,{icon:"language",onClick:()=>e(s.m.Language)},a("Language"))))})),xt=a(125);a(264);var Rt=({isShown:e,className:t,color:a="primary",ariaLabel:c,disabled:r,onClick:s,children:l})=>{const o=Object(ce.a)("FloatingActionButton",e&&"revealed",t);return n.a.createElement(D.a,{className:o,color:a,round:!0,disabled:r,onClick:e&&!r?s:void 0,ariaLabel:c,tabIndex:-1},l)};const Ut=/https:\/\/t\.me\/?/i,Gt=/^([a-zA-Z0-9_]+)$/,qt=Object(_.a)(e=>e(),250,!1);var zt=Object(n.h)(({currentUsername:e,asLink:t,isLoading:a,isUsernameAvailable:c,checkUsername:r,onChange:s})=>{const[l,o]=Object(n.r)(e||""),i=Object(F.a)(),d=t?"SetUrl":"Username",m=i(t?"SetUrlPlaceholder":"Username"),[u,h]=Object(n.p)(()=>l.length?l.length<5?[void 0,m+" is too short"]:l.length>32?[void 0,m+" is too long"]:Gt.test(l)?void 0===c?[]:[c?i(d+"Available","Username"):void 0,!1===c?i(d+"InUse"):void 0]:[void 0,m+" contains invalid characters"]:[],[l,c,i,d,m]);Object(n.n)(()=>{o(e||"")},[t,e]);const b=Object(n.m)(e=>{const a=e.target.value.trim().replace(Ut,"");o(a),e.target.value=`${t?"https://t.me/":""}${a}`;const n=function(e){return e.length>=5&&e.length<=32&&Gt.test(e)}(a);n&&qt(()=>{r({username:a})}),s&&s(!!n&&a)},[t,r,s]);return n.a.createElement(ge.a,{value:`${t?"https://t.me/":""}${l}`,onChange:b,label:m,error:h,success:u,readOnly:a})});const $t=Object(_.g)(e=>e(),6e4,!0);var Ht=Object(n.h)(Object(c.h)(e=>{const{currentUserId:t}=e,{progress:a,isUsernameAvailable:n}=e.profileEdit||{},c=t?Object(d.Fb)(e,t):void 0;if(!c)return{progress:a,isUsernameAvailable:n};const{firstName:r,lastName:s,username:l,fullInfo:o}=c,{bio:i}=o||{};return{currentAvatarHash:Object(m.f)(c),currentFirstName:r,currentLastName:s,currentBio:i,currentUsername:l,progress:a,isUsernameAvailable:n}},(e,t)=>Object(u.l)(t,["loadCurrentUser","updateProfile","checkUsername"]))(({currentAvatarHash:e,currentFirstName:t,currentLastName:a,currentBio:c,currentUsername:l,progress:o,isUsernameAvailable:i,loadCurrentUser:d,updateProfile:m,checkUsername:u})=>{const[h,b]=Object(n.r)(!1),[g,p]=Object(n.r)(!1),[E,O]=Object(n.r)(),[f,j]=Object(n.r)(),[C,y]=Object(n.r)(t||""),[k,N]=Object(n.r)(a||""),[I,S]=Object(n.r)(c||""),[w,P]=Object(n.r)(l||""),M=Object(v.a)(e,!1,r.ApiMediaFormat.BlobUrl),A=o===s.j.InProgress,T=!1===w,D=Object(n.p)(()=>!T&&(Boolean(f)||g||!0===i),[f,g,T,i]);Object(n.n)(()=>{$t(()=>{d()})},[d]),Object(n.n)(()=>{j(void 0)},[M]),Object(n.n)(()=>{y(t||""),N(a||""),S(c||"")},[t,a,c]),Object(n.n)(()=>{P(l||"")},[l]),Object(n.n)(()=>{o===s.j.Complete&&(p(!1),b(!1),O(void 0))},[o]);const B=Object(n.m)(e=>{j(e)},[]),R=Object(n.m)(e=>{y(e.target.value),p(!0)},[]),U=Object(n.m)(e=>{N(e.target.value),p(!0)},[]),G=Object(n.m)(e=>{S(e.target.value),p(!0)},[]),q=Object(n.m)(e=>{P(e),b(!0)},[]),z=Object(n.m)(()=>{const e=C.trim(),t=k.trim(),a=I.trim();e.length?a.length>70?O("Bio can' be longer than 70 characters"):m({photo:f,...g&&{firstName:e,lastName:t,bio:a},...h&&{username:w}}):O("Please provide your first name")},[f,C,k,I,g,w,h,m]),$=Object(F.a)();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(xt.a,{currentAvatarBlobUrl:M,onChange:B,title:"Edit your profile photo",disabled:A}),n.a.createElement(ge.a,{value:C,onChange:R,label:$("FirstName"),disabled:A,error:"Please provide your first name"===E?E:void 0}),n.a.createElement(ge.a,{value:k,onChange:U,label:$("LastName"),disabled:A}),n.a.createElement(ge.a,{value:I,onChange:G,label:$("UserBio"),disabled:A,error:"Bio can' be longer than 70 characters"===E?E:void 0}),n.a.createElement("p",{className:"settings-item-description"},Object(x.a)($("lng_settings_about_bio"),["br","simple_markdown"]))),n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header"},$("Username")),n.a.createElement(zt,{currentUsername:w||"",isLoading:A,isUsernameAvailable:i,checkUsername:u,onChange:q}),n.a.createElement("p",{className:"settings-item-description"},Object(x.a)($("UsernameHelp"),["br","simple_markdown"])),w&&n.a.createElement("p",{className:"settings-item-description"},$("lng_username_link"),n.a.createElement("br",null),n.a.createElement("span",{className:"username-link"},"https://t.me/",w)))),n.a.createElement(Rt,{isShown:D,onClick:z,disabled:A,ariaLabel:"Save changes"},A?n.a.createElement(L.a,{color:"white"}):n.a.createElement("i",{className:"icon-check"})))})),_t=a(120),Vt=a(111);const Wt=Object(_.g)(e=>e(),6e4,!0);var Yt=Object(n.h)(Object(c.h)(e=>{const{chats:{byId:t},users:{byId:a}}=e,{orderedIds:n,byId:c,recommended:r}=e.chatFolders;return{chatsById:t,usersById:a,orderedFolderIds:n,foldersById:c,recommendedChatFolders:r,notifySettings:Object(d.db)(e),notifyExceptions:Object(d.cb)(e)}},(e,t)=>Object(u.l)(t,["loadRecommendedChatFolders","addChatFolder","showError"]))(({onCreateFolder:e,onEditFolder:t,chatsById:a,usersById:c,orderedFolderIds:r,foldersById:s,recommendedChatFolders:o,notifySettings:i,notifyExceptions:d,loadRecommendedChatFolders:u,addChatFolder:h,showError:b})=>{const[g,p]=Object(n.r)(),[v,E]=Object(n.r)(!1),O=Object(n.m)(()=>E(!0),[]);Object(n.n)(()=>{g||Object(_t.a)("FoldersAll").then(p)},[g]),Object(n.n)(()=>{Wt(()=>{u()})},[u]);const f=Object(n.m)(()=>{Object.keys(s).length>=10?b({error:{message:"DIALOG_FILTERS_TOO_MUCH"}}):e()},[s,b,e]),j=Object(F.a)(),C=Object(n.p)(()=>{if(!r)return;const e=Object.keys(a).map(Number);return r.map(t=>{const n=s[t];return{id:n.id,title:n.title,subtitle:Object(m.o)(j,a,c,n,e,i,d)}})},[r,a,s,c,i,d,j]),y=Object(n.m)(e=>{Object.keys(s).length>=10?b({error:{message:"DIALOG_FILTERS_TOO_MUCH"}}):h({folder:e})},[s,h,b]);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"},g&&n.a.createElement(Vt.a,{id:"settingsFoldersMain",size:l.tb,animationData:g,play:v,noLoop:!0,onLoad:O})),n.a.createElement("p",{className:"settings-item-description mb-3",dir:"auto"},j("CreateNewFilterInfo")),n.a.createElement(D.a,{className:"with-icon mb-2",color:"primary",size:"smaller",pill:!0,fluid:!0,onClick:f},n.a.createElement("i",{className:"icon-add"}),j("CreateNewFilter"))),n.a.createElement("div",{className:"settings-item pt-3"},n.a.createElement("h4",{className:"settings-item-header mb-3"},j("Filters")),C&&C.length?C.map(e=>n.a.createElement(ve.a,{className:"mb-2",narrow:!0,multiline:!0,onClick:()=>t(s[e.id])},n.a.createElement("span",{className:"title"},e.title),n.a.createElement("span",{className:"subtitle"},e.subtitle))):C&&!C.length?n.a.createElement("p",{className:"settings-item-description my-4"},"You have no folders yet."):n.a.createElement(he.a,null)),o&&!!o.length&&n.a.createElement("div",{className:"settings-item pt-3"},n.a.createElement("h4",{className:"settings-item-header mb-3"},j("FilterRecommended")),o.map(e=>n.a.createElement(ve.a,{className:"mb-2",narrow:!0,onClick:()=>y(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},j("Add")))))))}));a(265);var Kt=({count:e,itemName:t,itemPluralName:a,isLoading:c,onClick:r})=>n.a.createElement(D.a,{className:"ShowMoreButton",color:"translucent",size:"smaller",isText:!0,isLoading:c,onClick:r},n.a.createElement("i",{className:"icon-down"}),"Show ",e," more ",e>1?a||t+"s":t);const Zt="Please provide a title for this folder.",Qt="Please select at least one chat for this folder.";var Xt=Object(n.h)(Object(c.h)(e=>{const{listIds:t}=e.chats;return{loadedActiveChatIds:t.active,loadedArchivedChatIds:t.archived}},(e,t)=>Object(u.l)(t,["editChatFolder","addChatFolder","loadMoreChats"]))(({state:e,dispatch:t,onAddIncludedChats:a,onAddExcludedChats:c,onReset:r,loadedActiveChatIds:s,loadedArchivedChatIds:o,editChatFolder:i,addChatFolder:d,loadMoreChats:h})=>{const[b,g]=Object(n.r)(),[p,v]=Object(n.r)(!1),E=Object(n.m)(()=>v(!0),[]),[O,f]=Object(n.r)(!1),[j,C]=Object(n.r)(!1),{selectedChatIds:y,selectedChatTypes:k}=wt(e,"included"),{selectedChatIds:N,selectedChatTypes:I}=wt(e,"excluded");Object(n.n)(()=>{b||Object(_t.a)("FoldersNew").then(g)},[b]),Object(n.n)(()=>{f(!1),C(!1)},[e.folderId]);const[S,w]=Object(n.p)(()=>{const e=new Set([...s||[],...o||[]]),t=Object(u.f)(y,e),a=Object(u.f)(N,e);return[O?t:t.slice(0,5-k.length),j?a:a.slice(0,5-I.length)]},[N,y,k,I,j,O,s,o]);Object(n.n)(()=>{(S.lengthf(!0):()=>C(!0);return n.a.createElement(n.a.Fragment,null,t.map(t=>function(e,t){const a="included"===t?kt.find(({key:t})=>t===e):Nt.find(({key:t})=>t===e);if(a)return n.a.createElement(ve.a,{key:a.key,className:"settings-folders-list-item mb-1",icon:a.icon,narrow:!0,inactive:!0},P(a.title))}(t,e)),a.map(e=>n.a.createElement(ve.a,{className:"settings-folders-list-item mb-1",narrow:!0,inactive:!0},Object(m.lb)(e)?n.a.createElement(Ee.a,{avatarSize:"small",userId:e}):n.a.createElement(Oe.a,{avatarSize:"small",chatId:e}))),!c&&r>0&&n.a.createElement(Kt,{count:r,itemName:"chat",onClick:s}))}return 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"},b&&n.a.createElement(Vt.a,{id:"settingsFoldersEdit",size:l.tb,animationData:b,play:p&&String(e.folderId),noLoop:!0,onLoad:E})),"create"===e.mode&&n.a.createElement("p",{className:"settings-item-description mb-3"},P("FilterIncludeInfo")),n.a.createElement(ge.a,{className:"mb-0",label:P("FilterNameHint"),value:e.folder.title,onChange:function(e){const{currentTarget:a}=e;t({type:"setTitle",payload:a.value.trim()})},error:e.error&&e.error===Zt?Zt:void 0})),n.a.createElement("div",{className:"settings-item no-border pt-3"},e.error&&e.error===Qt&&n.a.createElement("p",{className:"settings-item-description color-danger mb-2"},e.error),n.a.createElement("h4",{className:"settings-item-header mb-3"},P("FilterInclude")),n.a.createElement(ve.a,{className:"settings-folders-list-item color-primary mb-0",icon:"add",onClick:a},P("FilterAddChats")),M("included")),n.a.createElement("div",{className:"settings-item no-border pt-3"},n.a.createElement("h4",{className:"settings-item-header mb-3"},P("FilterExclude")),n.a.createElement(ve.a,{className:"settings-folders-list-item color-primary mb-0",icon:"add",onClick:c},P("FilterAddChats")),M("excluded"))),n.a.createElement(Rt,{isShown:!!e.isTouched,disabled:e.isLoading,onClick:function(){const{title:a}=e.folder;a?y.length||Object.keys(k).length?(t({type:"setIsLoading",payload:!0}),"edit"===e.mode?i({id:e.folderId,folderUpdate:e.folder}):d({folder:e.folder}),setTimeout(()=>{r()},500)):t({type:"setError",payload:Qt}):t({type:"setError",payload:Zt})},ariaLabel:"edit"===e.mode?"Save changes":"Create folder"},e.isLoading?n.a.createElement(L.a,{color:"white"}):n.a.createElement("i",{className:"icon-check"})))})),Jt=a(43);a(181),a(266);var ea=Object(n.h)(({mode:e,chatIds:t,selectedIds:a,selectedChatTypes:c,filterValue:r,onSelectedIdsChange:s,onSelectedChatTypesChange:l,onFilterChange:o,onLoadMore:i})=>{const d=Object(n.q)(null),u="included"===e?kt:Nt,h=a.length+c.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),s(t)},[a,s]),p=Object(n.m)(e=>{const t=[...c];t.includes(e)?t.splice(t.indexOf(e),1):t.push(e),l(t)},[c,l]),v=Object(n.m)(e=>{const{value:t}=e.currentTarget;o(t)},[o]),E=Object(F.a)();const[O,f]=Object(ue.a)(i,t,Boolean(r));return n.a.createElement("div",{className:"Picker SettingsFoldersChatsPicker"},n.a.createElement("div",{className:"picker-header custom-scroll"},c.map((function(e){const t=u.find(({key:t})=>e===t);if(t)return n.a.createElement(Je.a,{icon:t.icon,title:E(t.title),isMinimized:h,canClose:!0,onClick:p,clickArg:t.key})})),a.map((e,t)=>n.a.createElement(Je.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"},E(e.title)),n.a.createElement(Jt.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"},E("FilterChats"))),O&&O.length?O.map((function(e){const t=a.includes(e);return n.a.createElement(ve.a,{key:e,className:"chat-item-clickable picker-list-item chat-item",onClick:()=>g(e),ripple:!0,disabled:!t&&b},Object(m.lb)(e)?n.a.createElement(Ee.a,{userId:e}):n.a.createElement(Oe.a,{chatId:e,withChatType:!0}),n.a.createElement(Jt.a,{label:"",checked:t,round:!0}))})):O&&!O.length?n.a.createElement("p",{className:"no-results",key:"no-results"},"Sorry, nothing found."):n.a.createElement(he.a,{key:"loading"})))});var ta=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(u.l)(t,["loadMoreChats"]))(({mode:e,state:t,dispatch:a,chatsById:c,listIds:r,orderedPinnedIds:s,archivedListIds:l,archivedPinnedIds:o,loadMoreChats:i})=>{const{chatFilter:d}=t,{selectedChatIds:u,selectedChatTypes:h}=wt(t,e,!0),b=Object(F.a)(),g=Object(n.p)(()=>{const e=r?Object(m.Ab)(c,r,s,"all"):void 0,t=l?Object(m.Ab)(c,l,o,"archived"):void 0;if(e||t)return[...e?[...e.pinnedChats,...e.otherChats]:[],...t?t.otherChats:[]]},[c,r,s,l,o]),p=Object(n.p)(()=>{if(g)return g.filter(e=>!d||Object(me.a)(Object(m.l)(b,e),d)||u.includes(e.id)).map(({id:e})=>e)},[g,d,b,u]),v=Object(n.m)(e=>{a({type:"setChatFilter",payload:e})},[a]),E=Object(n.m)(n=>{a("included"===e?{type:"setIncludeFilters",payload:{...t.includeFilters,includedChatIds:n}}:{type:"setExcludeFilters",payload:{...t.excludeFilters,excludedChatIds:n}})},[e,t,a]),O=Object(n.m)(t=>{const n={};t.forEach(e=>{n[e]=!0}),a("included"===e?{type:"setIncludeFilters",payload:{includedChatIds:u,...n}}:{type:"setExcludeFilters",payload:{excludedChatIds:u,...n}})},[e,u,a]);return p?n.a.createElement(ea,{mode:e,chatIds:p,selectedIds:u,selectedChatTypes:h,filterValue:d,onSelectedIdsChange:E,onSelectedChatTypesChange:O,onFilterChange:v,onLoadMore:i}):n.a.createElement(he.a,null)}));a(267);var aa=Object(n.h)(({currentScreen:e,state:t,dispatch:a,onScreenSelect:c,onReset:r})=>{const l=Object(n.m)(()=>{e!==s.m.FoldersCreateFolder&&e!==s.m.FoldersEditFolder||setTimeout(()=>{a({type:"reset"})},200),e!==s.m.FoldersIncludedChats&&e!==s.m.FoldersExcludedChats?r():"create"===t.mode?c(s.m.FoldersCreateFolder):c(s.m.FoldersEditFolder)},[t.mode,a,e,r,c]),o=Object(n.m)(()=>{a({type:"reset"}),c(s.m.FoldersCreateFolder)},[c,a]),i=Object(n.m)(e=>{a({type:"editFolder",payload:e}),c(s.m.FoldersEditFolder)},[a,c]),d=Object(n.m)(()=>{a({type:"editIncludeFilters"}),c(s.m.FoldersIncludedChats)},[a,c]),m=Object(n.m)(()=>{a({type:"editExcludeFilters"}),c(s.m.FoldersExcludedChats)},[a,c]);switch(e){case s.m.Folders:return n.a.createElement(Yt,{onCreateFolder:o,onEditFolder:i});case s.m.FoldersCreateFolder:case s.m.FoldersEditFolder:return n.a.createElement(Xt,{state:t,dispatch:a,onAddIncludedChats:d,onAddExcludedChats:m,onReset:l});case s.m.FoldersIncludedChats:return n.a.createElement(ta,{mode:"included",state:t,dispatch:a});case s.m.FoldersExcludedChats:return n.a.createElement(ta,{mode:"excluded",state:t,dispatch:a});default:return}}),na=a(101);a(268);var ca=Object(n.h)(({options:e,range:t,label:a,value:c,disabled:r,onChange:s})=>{const l=Object(n.m)(e=>{s(Number(e.currentTarget.value))},[s]),o=Object(ce.a)("RangeSlider",r&&"disabled"),i=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]),[d,m,u]=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:o},a&&n.a.createElement("div",{className:"slider-top-row"},n.a.createElement("span",{className:"label"},a),t&&n.a.createElement("span",{className:"value"},c)),n.a.createElement("div",{className:"slider-main"},n.a.createElement("div",{className:"slider-fill-track",style:`width: ${i}%`}),n.a.createElement("input",{min:d,max:m,value:c,step:u,type:"range",onChange:l}),e&&n.a.createElement("div",{className:"slider-options"},e.map((e,t)=>n.a.createElement("div",{className:Object(ce.a)("slider-option no-selection",t===c&&"active"),onClick:()=>s(t)},e)))))}),ra=a(121),sa=a(109),la=a(46);var oa=Object(n.h)(({size:e=l.zb,stickerSet:t,observeIntersection:a})=>{const c=Object(n.q)(null),s=Object(na.b)(c,a),o="stickerSet"+t.id,i=Object(v.a)(o,!s,r.ApiMediaFormat.Lottie),{shouldRenderFullMedia:d,transitionClassNames:m}=Object(sa.a)(i,"slow");return n.a.createElement("div",{ref:c,className:"sticker-set-cover"},!d&&Object(la.c)(t.title,2),d&&i&&n.a.createElement(Vt.a,{id:o,size:e,animationData:i,className:m}))});var ia=Object(n.h)(({stickerSet:e,observeIntersection:t})=>{const a=Object(n.q)(null),c=Object(na.b)(a,t),r=Object(v.a)(e.hasThumbnail&&"stickerSet"+e.id,!c),{shouldRenderFullMedia:s,transitionClassNames:l}=Object(sa.a)(r,"slow");return n.a.createElement("div",{ref:a,className:"sticker-set-cover"},!s&&Object(la.c)(e.title,2),s&&n.a.createElement("img",{src:r,className:l,alt:""}))});a(269);var da=Object(n.h)(({sticker:e,size:t,observeIntersection:a,noAnimate:c,title:s,className:l,onClick:o,clickArg:i,onUnfaveClick:d})=>{const m=Object(n.q)(null),u="sticker"+e.id,h="sticker-button-"+e.id,b=Object(na.b)(m,a),g=e.thumbnail?e.thumbnail.dataUri:void 0,p=Object(v.a)(u+"?size=m",!b,r.ApiMediaFormat.BlobUrl),E=b&&!c,O=Object(v.a)(e.isAnimated&&u,!E,r.ApiMediaFormat.Lottie),[f,j,C]=Object(Be.a)(Boolean(O)),y=f&&E,{shouldRenderThumb:k,shouldRenderFullMedia:N,transitionClassNames:I}=Object(sa.a)(p||y,"slow");Object(n.n)(()=>{E||C()},[C,E]);const S=Object(ce.a)("StickerButton",e.isAnimated&&"animated",h,l),w=k&&g?`background-image: url('${g}');`:"";return n.a.createElement("div",{ref:m,className:S,title:s||e&&e.emoji,style:w,"data-sticker-id":e.id,onClick:function(){o&&o(i)}},N&&!y&&n.a.createElement("img",{src:p,className:I}),E&&O&&n.a.createElement(Vt.a,{id:u,animationData:O,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(270);var ma=Object(n.h)(({stickerSet:e,observeIntersection:t,onClick:a})=>{const c=Object(F.a)();if(!e||!e.stickers)return;const r=e.stickers&&e.stickers[0];return e.hasThumbnail||!r?n.a.createElement(ve.a,{narrow:!0,className:"SettingsStickerSet",inactive:!r,onClick:()=>r&&a(r)},n.a.createElement(D.a,{ariaLabel:e.title,color:"translucent"},e.isAnimated?n.a.createElement(oa,{size:l.ub,stickerSet:e,observeIntersection:t}):n.a.createElement(ia,{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(ve.a,{narrow:!0,className:"SettingsStickerSet",onClick:()=>a(r)},n.a.createElement(da,{sticker:r,size:l.ub,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"))))}),ua=a(156);const ha=["Solid and Steady","Nice and Fast","Lots of Stuff"];var ba=Object(n.h)(Object(c.h)(e=>({...Object(u.l)(e.settings.byKey,["messageTextSize","animationLevel","messageSendKeyCombo","shouldAutoDownloadMediaFromContacts","shouldAutoDownloadMediaInPrivateChats","shouldAutoDownloadMediaInGroups","shouldAutoDownloadMediaInChannels","shouldAutoPlayGifs","shouldAutoPlayVideos","shouldSuggestStickers","shouldLoopStickers"]),stickerSetIds:e.stickers.added.setIds,stickerSetsById:e.stickers.setsById}),(e,t)=>Object(u.l)(t,["setSettingOption","loadStickerSets","loadAddedStickers"]))(({onScreenSelect:e,stickerSetIds:t,stickerSetsById:a,messageTextSize:c,animationLevel:r,messageSendKeyCombo:l,shouldAutoDownloadMediaFromContacts:i,shouldAutoDownloadMediaInPrivateChats:d,shouldAutoDownloadMediaInGroups:m,shouldAutoDownloadMediaInChannels:u,shouldAutoPlayGifs:h,shouldAutoPlayVideos:b,shouldSuggestStickers:g,shouldLoopStickers:p,setSettingOption:v,loadStickerSets:E,loadAddedStickers:O})=>{const f=Object(n.q)(null),{observe:j}=Object(na.a)({rootRef:f}),[C,y,k]=Object(Be.a)(),[N,I]=Object(n.r)(),S=Object(F.a)(),w=o.l?void 0:[{value:"enter",label:S("lng_settings_send_enter"),subLabel:"New line by Shift + Enter"},{value:"ctrl-enter",label:S(o.f?"lng_settings_send_cmdenter":"lng_settings_send_ctrlenter"),subLabel:"New line by Enter"}];Object(n.n)(()=>{E()},[E]),Object(n.n)(()=>{t&&t.length&&O()},[t,O]);const P=Object(n.m)(e=>{ha.forEach((t,a)=>{document.body.classList.toggle("animation-level-"+a,e===a)}),v({animationLevel:e})},[v]),M=Object(n.m)(e=>{document.documentElement.style.setProperty("--message-text-size",e+"px"),v({messageTextSize:e})},[v]),L=Object(n.m)(e=>{I(e),y()},[y]),A=t&&t.map(e=>!!(a&&a[e]&&a[e].installedDate)&&a[e]).filter(Boolean);return 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"},S("SETTINGS")),n.a.createElement(ca,{label:S("TextSize"),range:{min:12,max:20},value:c,onChange:M}),n.a.createElement(ve.a,{icon:"photo",onClick:()=>e(s.m.GeneralChatBackground)},S("ChatBackground"))),n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header"},"Animation Level"),n.a.createElement("p",{className:"settings-item-description"},"Choose the desired animations amount."),n.a.createElement(ca,{options:ha,value:r,onChange:P})),w&&n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header"},S("Keyboard")),n.a.createElement(ra.a,{name:"keyboard-send-settings",options:w,onChange:e=>v({messageSendKeyCombo:e}),selected:l})),n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header"},S("AutoDownloadMedia")),n.a.createElement(Jt.a,{label:S("Contacts"),checked:i,onCheck:e=>v({shouldAutoDownloadMediaFromContacts:e})}),n.a.createElement(Jt.a,{label:S("AutodownloadPrivateChats"),checked:d,onCheck:e=>v({shouldAutoDownloadMediaInPrivateChats:e})}),n.a.createElement(Jt.a,{label:S("AutodownloadGroupChats"),checked:m,onCheck:e=>v({shouldAutoDownloadMediaInGroups:e})}),n.a.createElement(Jt.a,{label:S("FilterChannels"),checked:u,onCheck:e=>v({shouldAutoDownloadMediaInChannels:e})})),n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header"},S("AutoplayMedia")),n.a.createElement(Jt.a,{label:S("GifsTab2"),checked:h,onCheck:e=>v({shouldAutoPlayGifs:e})}),n.a.createElement(Jt.a,{label:S("VideosTitle"),checked:b,onCheck:e=>v({shouldAutoPlayVideos:e})})),n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header"},S("AccDescrStickers")),n.a.createElement(Jt.a,{label:S("SuggestStickers"),checked:g,onCheck:e=>v({shouldSuggestStickers:e})}),n.a.createElement(Jt.a,{label:S("LoopAnimatedStickers"),checked:p,onCheck:e=>v({shouldLoopStickers:e})}),n.a.createElement("div",{className:"mt-4",ref:f},A&&A.map(e=>n.a.createElement(ma,{key:e.id,stickerSet:e,observeIntersection:j,onClick:L}))),N&&n.a.createElement(ua.a,{isOpen:C,fromSticker:N,onClose:k})))}));let ga;function pa(e="*",t,a=!1){ga||(ga=document.createElement("input"),ga.setAttribute("type","file")),ga.setAttribute("accept",e),a?ga.removeAttribute("multiple"):ga.setAttribute("multiple","multiple"),ga.onchange=null,ga.value="",ga.onchange=t,ga.click()}var va=a(13);function Ea(e){return[parseInt(e.substring(0,2),16),parseInt(e.substring(2,4),16),parseInt(e.substring(4,6),16)]}function Oa(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 fa([e,t,a]){e/=255,t/=255,a/=255;let n,c,r=Math.max(e,t,a),s=Math.min(e,t,a),l=r,o=r-s;if(c=0==r?0:o/r,r==s)n=0;else{switch(r){case e:n=(t-a)/o+(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 ya=a(12),ka=a(157);a(271);var Na=Object(n.h)(({wallpaper:e,theme:t,isSelected:a,onClick:c})=>{const{slug:r,document:o}=e,i="wallpaper"+o.id,d=o.previewBlobUrl,m=Object(v.a)(i+"?size=m"),u=Object(ka.a)(o.thumbnail&&o.thumbnail.dataUri,Boolean(m),!0),{shouldRenderThumb:h,shouldRenderFullMedia:b,transitionClassNames:g}=Object(sa.a)(m||d,"slow"),[p,O]=Object(n.r)(!1),{mediaData:j,downloadProgress:C}=Object(E.a)(i,!p),y=!1===Object(f.a)(p),{shouldRender:k,transitionClassNames:N}=Object(W.a)(p&&!j||r===s.n,void 0,y,"slow"),I=Object(n.q)();I.current=t;const S=Object(n.m)(()=>{(async()=>{const e=await Object(va.e)(j);await ya.d(l.m,I.current,e),c(r)})()},[j,c,r]);Object(n.n)(()=>{j&&S()},[j,S]);const w=Object(n.m)(()=>{j?S():O(e=>!e)},[j,S]),P=Object(ce.a)("WallpaperTile",a&&"selected");return n.a.createElement("div",{className:P,onClick:w},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(ce.a)("spinner-container",N)},n.a.createElement($.a,{progress:C,onClick:w}))))});a(272);const Ia=Object(_.g)(e=>e(),6e4,!0);var Sa=Object(n.h)(Object(c.h)(e=>{const{theme:t}=e.settings.byKey,{background:a,isBlurred:n}=e.settings.themes[t]||{},{loadedWallpapers:c}=e.settings;return{background:a,isBlurred:n,loadedWallpapers:c,theme:t}},(e,t)=>Object(u.l)(t,["loadWallpapers","uploadWallpaper","setThemeSettings"]))(({onScreenSelect:e,background:t,isBlurred:a,loadedWallpapers:c,theme:r,loadWallpapers:o,uploadWallpaper:i,setThemeSettings:d})=>{const m=Object(n.q)();m.current=r,Object(n.n)(()=>{Ia(()=>{o()})},[o]);const u=Object(n.m)(e=>{const{files:t}=e.target;t&&t.length>0&&i(t[0])},[i]),h=Object(n.m)(()=>{pa("image/jpeg",u,!0)},[u]),b=Object(n.m)(()=>{e(s.m.GeneralChatBackgroundColor)},[e]),g=Object(n.m)(()=>{d({theme:r,background:void 0,backgroundColor:void 0,isBlurred:!0,patternColor:"dark"===r?l.o:l.t})},[d,r]),p=Object(n.m)(e=>{d({theme:m.current,background:e});const t=c&&c.find(t=>t.slug===e);t&&t.document.thumbnail&&async function(e){const t=[0,0,0];let a,n,c,r,s=-4,l=[0,0,0],o=0;const i=document.createElement("canvas"),d=i.getContext&&i.getContext("2d");if(!d)return t;const m=await Object(va.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(r=a.data.length;(s+=20){const t=Ca(e),a="#"+Oa(e);d({theme:m.current,backgroundColor:a,patternColor:t})})},[c,d]),v=Object(n.m)(e=>{d({theme:m.current,isBlurred:e.target.checked})},[d]),E=Object(F.a)(),O=c&&c[0]&&c[0].slug===s.n;return n.a.createElement("div",{className:"SettingsGeneralBackground settings-content custom-scroll"},n.a.createElement("div",{className:"settings-item pt-3"},n.a.createElement(ve.a,{icon:"camera-add",className:"mb-0",disabled:O,onClick:h},E("UploadImage")),n.a.createElement(ve.a,{icon:"colorize",className:"mb-0",onClick:b},E("SetColor")),n.a.createElement(ve.a,{icon:"favorite",onClick:g},E("ThemeResetToDefaults")),n.a.createElement(Jt.a,{label:E("BackgroundBlurred"),checked:Boolean(a),onChange:v})),c?n.a.createElement("div",{className:"settings-wallpapers"},c.map(e=>n.a.createElement(Na,{wallpaper:e,theme:r,isSelected:t===e.slug,onClick:p}))):n.a.createElement(he.a,null))}));a(273);const wa=fa(Ea("e6ebee")),Pa=["#e6ebee","#b2cee1","#008dd0","#c6e7cb","#c4e1a6","#60b16e","#ccd0af","#a6a997","#7a7072","#fdd7af","#fdb76e","#dd8851"];function Ma(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 Fa({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 La=Object(n.h)(Object(c.h)(e=>{const{theme:t}=e.settings.byKey,{backgroundColor:a}=e.settings.themes[t]||{};return{backgroundColor:a,theme:t}},(e,t)=>Object(u.l)(t,["setThemeSettings"]))(({theme:e,backgroundColor:t,setThemeSettings:a})=>{const c=Object(n.q)();c.current=e;const r=Object(n.q)(null),s=Object(n.q)(null),l=Object(n.q)(null),o=Object(n.q)(!0),[i,d]=Object(n.r)(function(e){return e&&e.startsWith("#")?fa(Ea(e.replace("#",""))):wa}(t)),m=Object(n.q)(i);Object(n.n)(()=>{m.current=i},[i]);const[b,g,p]=Object(Be.a)(),[v,E]=Object(n.r)(""),[O,f]=Object(n.r)(""),j=Object(n.q)(),C=Object(n.q)();Object(n.n)(()=>{const e={offsetLeft:s.current.offsetLeft,...Object(u.l)(s.current.getBoundingClientRect(),["top","width","height"])},t={offsetLeft:l.current.offsetLeft,...Object(u.l)(l.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+r.current.scrollTop),e.height-1)],{huePosition:n}=Ma(m.current,j.current);d(Fa({colorPosition:a,huePosition:n},j.current)),g()}function n(e){const{colorPosition:a}=Ma(m.current,j.current),n=Math.min(Math.max(0,e.pageX-t.offsetLeft),t.width-1);d(Fa({colorPosition:a,huePosition:n},j.current)),g()}j.current={colorRect:e,hueRect:t},Object(h.b)(s.current,{onCapture:a,onDrag:a,onRelease:p,onClick:p,withCursor:!0}),Object(h.b)(l.current,{onCapture:n,onDrag:n,onRelease:p,onClick:p,withCursor:!0})},[g,p]);const{colorPosition:y=[0,0],huePosition:k=0}=j.current?Ma(i,j.current):{},N=Oa(ja(i)),I=i[0],S=Oa(ja([I,1,1]));Object(n.n)(()=>{const e=ja(i),t="#"+Oa(e);if(E(e.join(", ")),f(t),!o.current){const n=Ca(e);a({theme:c.current,background:void 0,backgroundColor:t,patternColor:n})}o.current=!1},[i,a]),Object(n.n)(()=>{!function(e,t,a,n){let c,r,s;a.current&&n.current?(c=n.current.colorRect.width,r=n.current.colorRect.height,s=a.current):(c=e.offsetWidth,r=e.offsetHeight,s=e.getContext("2d"),e.width=c,e.height=r,a.current=s);const l=s.createImageData(c,r),o=l.data,i=ja([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 r=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()));d(fa(e))}e.currentTarget.value=t},[]),P=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}$/)&&d(fa(Ea(t.replace("#","")))),e.currentTarget.value=t},[]),M=Object(n.m)(e=>{d(fa(Ea(e.currentTarget.dataset.color.replace("#",""))))},[]),F=Object(ce.a)("SettingsGeneralBackgroundColor settings-content custom-scroll",b&&"is-dragging");return n.a.createElement("div",{ref:r,className:F},n.a.createElement("div",{className:"settings-item pt-3"},n.a.createElement("div",{ref:s,className:"color-picker"},n.a.createElement("canvas",null),n.a.createElement("div",{className:"handle",style:`transform: translate(${y[0]}px, ${y[1]}px); background-color: #${N};`})),n.a.createElement("div",{ref:l,className:"hue-picker"},n.a.createElement("canvas",null),n.a.createElement("div",{className:"handle",style:`transform: translateX(${k}px); background-color: #${S};`})),n.a.createElement("div",{className:"tools"},n.a.createElement(ge.a,{value:O,label:"HEX",onChange:P}),n.a.createElement(ge.a,{value:v,label:"RGB",onChange:w}))),n.a.createElement("div",{className:"predefined-colors"},Pa.map(e=>n.a.createElement("div",{className:e==="#"+N?"active":void 0,"data-color":e,style:`background-color: ${e};`,onClick:M}))))}));var Aa=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(u.l)(t,["loadNotificationSettings","updateContactSignUpNotification","updateNotificationSettings"]))(({hasPrivateChatsNotifications:e,hasPrivateChatsMessagePreview:t,hasGroupNotifications:a,hasGroupMessagePreview:c,hasBroadcastNotifications:r,hasBroadcastMessagePreview:s,hasContactJoinedNotifications:l,loadNotificationSettings:o,updateContactSignUpNotification:i,updateNotificationSettings:d})=>{Object(n.n)(()=>{o()},[o]);const m=Object(n.m)((n,l,o)=>{const i="contact"===l?!e:!("group"===l?a:r),m="contact"===l?t:"group"===l?c:s;d({peerType:l,..."silent"===o&&{isSilent:!n.target.checked,shouldShowPreviews:m},..."showPreviews"===o&&{shouldShowPreviews:n.target.checked,isSilent:i}})},[s,r,c,a,t,e,d]),u=Object(n.m)(e=>{i({isSilent:!e.target.checked})},[i]),h=Object(F.a)();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"},h("AutodownloadPrivateChats")),n.a.createElement(Jt.a,{label:h("NotificationsForPrivateChats"),subLabel:h(e?"NotificationsEnabled":"NotificationsDisabled"),checked:e,onChange:e=>{m(e,"contact","silent")}}),n.a.createElement(Jt.a,{label:h("MessagePreview"),subLabel:h(t?"PreviewEnabled":"PreviewDisabled"),checked:t,onChange:e=>{m(e,"contact","showPreviews")}})),n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header"},h("FilterGroups")),n.a.createElement(Jt.a,{label:h("NotificationsForGroups"),subLabel:h(a?"NotificationsEnabled":"NotificationsDisabled"),checked:a,onChange:e=>{m(e,"group","silent")}}),n.a.createElement(Jt.a,{label:h("MessagePreview"),subLabel:h(c?"PreviewEnabled":"PreviewDisabled"),checked:c,onChange:e=>{m(e,"group","showPreviews")}})),n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header"},h("FilterChannels")),n.a.createElement(Jt.a,{label:h("NotificationsForChannels"),subLabel:h(r?"NotificationsEnabled":"NotificationsDisabled"),checked:r,onChange:e=>{m(e,"broadcast","silent")}}),n.a.createElement(Jt.a,{label:h("MessagePreview"),subLabel:h(s?"PreviewEnabled":"PreviewDisabled"),checked:s,onChange:e=>{m(e,"broadcast","showPreviews")}})),n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header"},h("PhoneOther")),n.a.createElement(Jt.a,{label:h("ContactJoined"),checked:l,onChange:u})))}));var Ta=Object(n.h)(Object(c.h)(e=>{const{settings:{byKey:{hasPassword:t},privacy:a},blocked:n,activeSessions:c}=e;return{hasPassword:t,blockedCount:n.totalCount,sessionsCount:c.length,visibilityPrivacyPhoneNumber:a.phoneNumber&&a.phoneNumber.visibility,visibilityPrivacyLastSeen:a.lastSeen&&a.lastSeen.visibility,visibilityPrivacyProfilePhoto:a.profilePhoto&&a.profilePhoto.visibility,visibilityPrivacyForwarding:a.forwards&&a.forwards.visibility,visibilityPrivacyGroupChats:a.chatInvite&&a.chatInvite.visibility}},(e,t)=>Object(u.l)(t,["loadBlockedContacts","loadAuthorizations","loadPrivacySettings"]))(({onScreenSelect:e,hasPassword:t,blockedCount:a,sessionsCount:c,visibilityPrivacyPhoneNumber:r,visibilityPrivacyLastSeen:l,visibilityPrivacyProfilePhoto:o,visibilityPrivacyForwarding:i,visibilityPrivacyGroupChats:d,loadPrivacySettings:m,loadBlockedContacts:u,loadAuthorizations:h})=>{Object(n.n)(()=>{u(),h(),m()},[u,h,m]);const b=Object(F.a)();function g(e){switch(e){case"everybody":return b("P2PEverybody");case"contacts":return b("P2PContacts");case"nobody":return b("P2PNobody")}}return n.a.createElement("div",{className:"settings-content custom-scroll"},n.a.createElement("div",{className:"settings-item pt-3"},n.a.createElement(ve.a,{icon:"delete-user",narrow:!0,onClick:()=>e(s.m.PrivacyBlockedUsers)},n.a.createElement("div",{className:"multiline-menu-item"},n.a.createElement("span",{className:"title"},b("BlockedUsers")),a>0&&n.a.createElement("span",{className:"subtitle",dir:"auto"},b("Users",a)))),n.a.createElement(ve.a,{icon:"lock",narrow:!0,onClick:()=>e(t?s.m.TwoFaEnabled:s.m.TwoFaDisabled)},n.a.createElement("div",{className:"multiline-menu-item"},n.a.createElement("span",{className:"title"},b("TwoStepVerification")),n.a.createElement("span",{className:"subtitle",dir:"auto"},b(t?"PasswordOn":"PasswordOff")))),n.a.createElement(ve.a,{icon:"active-sessions",narrow:!0,onClick:()=>e(s.m.PrivacyActiveSessions)},n.a.createElement("div",{className:"multiline-menu-item"},n.a.createElement("span",{className:"title"},b("SessionsTitle")),c>0&&n.a.createElement("span",{className:"subtitle",dir:"auto"},1===c?"1 session":c+" sessions")))),n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header mb-4"},b("PrivacyTitle")),n.a.createElement(ve.a,{narrow:!0,onClick:()=>e(s.m.PrivacyPhoneNumber)},n.a.createElement("div",{className:"multiline-menu-item"},n.a.createElement("span",{className:"title"},b("PrivacyPhoneTitle")),n.a.createElement("span",{className:"subtitle",dir:"auto"},g(r)))),n.a.createElement(ve.a,{narrow:!0,onClick:()=>e(s.m.PrivacyLastSeen)},n.a.createElement("div",{className:"multiline-menu-item"},n.a.createElement("span",{className:"title"},b("LastSeenTitle")),n.a.createElement("span",{className:"subtitle",dir:"auto"},g(l)))),n.a.createElement(ve.a,{narrow:!0,onClick:()=>e(s.m.PrivacyProfilePhoto)},n.a.createElement("div",{className:"multiline-menu-item"},n.a.createElement("span",{className:"title"},b("PrivacyProfilePhotoTitle")),n.a.createElement("span",{className:"subtitle",dir:"auto"},g(o)))),n.a.createElement(ve.a,{narrow:!0,onClick:()=>e(s.m.PrivacyForwarding)},n.a.createElement("div",{className:"multiline-menu-item"},n.a.createElement("span",{className:"title"},b("PrivacyForwardsTitle")),n.a.createElement("span",{className:"subtitle",dir:"auto"},g(i)))),n.a.createElement(ve.a,{narrow:!0,onClick:()=>e(s.m.PrivacyGroupChats)},n.a.createElement("div",{className:"multiline-menu-item"},n.a.createElement("span",{className:"title"},b("WhoCanAddMe")),n.a.createElement("span",{className:"subtitle",dir:"auto"},g(d))))))})),Da=a(18);var Ba=Object(n.h)(Object(c.h)(e=>({languages:e.settings.byKey.languages,language:e.settings.byKey.language}),(e,t)=>Object(u.l)(t,["loadLanguages","setSettingOption"]))(({languages:e,language:t,loadLanguages:a,setSettingOption:c})=>{const[r,s]=Object(n.r)(t),[l,o,i]=Object(Be.a)();Object(n.n)(()=>{a()},[a]);const d=Object(n.m)(e=>{s(e),o(),Object(Da.c)(e,()=>{i(),c({language:e})})},[o,i,c]),m=Object(n.p)(()=>e?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)}(e):void 0,[e]);return n.a.createElement("div",{className:"settings-content settings-item settings-language custom-scroll"},m?n.a.createElement(ra.a,{name:"keyboard-send-settings",options:m,selected:r,loadingOption:l?r:void 0,onChange:d}):n.a.createElement(he.a,null))}));function xa(e){switch(e){case s.m.PrivacyPhoneNumber:case s.m.PrivacyPhoneNumberAllowedContacts:case s.m.PrivacyPhoneNumberDeniedContacts:return"phoneNumber";case s.m.PrivacyLastSeen:case s.m.PrivacyLastSeenAllowedContacts:case s.m.PrivacyLastSeenDeniedContacts:return"lastSeen";case s.m.PrivacyProfilePhoto:case s.m.PrivacyProfilePhotoAllowedContacts:case s.m.PrivacyProfilePhotoDeniedContacts:return"profilePhoto";case s.m.PrivacyForwarding:case s.m.PrivacyForwardingAllowedContacts:case s.m.PrivacyForwardingDeniedContacts:return"forwards";case s.m.PrivacyGroupChats:case s.m.PrivacyGroupChatsAllowedContacts:case s.m.PrivacyGroupChatsDeniedContacts:return"chatInvite"}}var Ra=Object(n.h)(Object(c.h)((e,{screen:t})=>{let a;const{chats:{byId:n},settings:{privacy:c}}=e;switch(t){case s.m.PrivacyPhoneNumber:a=c.phoneNumber;break;case s.m.PrivacyLastSeen:a=c.lastSeen;break;case s.m.PrivacyProfilePhoto:a=c.profilePhoto;break;case s.m.PrivacyForwarding:a=c.forwards;break;case s.m.PrivacyGroupChats:a=c.chatInvite}return a?{...a,chatsById:n}:{}},(e,t)=>Object(u.l)(t,["setPrivacyVisibility"]))(({screen:e,onScreenSelect:t,visibility:a,allowUserIds:c,allowChatIds:r,blockUserIds:l,blockChatIds:o,chatsById:i,setPrivacyVisibility:d})=>{const m=Object(F.a)(),u=Object(n.p)(()=>{switch(e){case s.m.PrivacyProfilePhoto:case s.m.PrivacyGroupChats:return[{value:"everybody",label:m("P2PEverybody")},{value:"contacts",label:m("P2PContacts")}];default:return[{value:"everybody",label:m("P2PEverybody")},{value:"contacts",label:m("P2PContacts")},{value:"nobody",label:m("P2PNobody")}]}},[m,e]),h={shouldShowDenied:"nobody"!==a,shouldShowAllowed:"everybody"!==a},b=xa(e),g=Object(n.p)(()=>{switch(e){case s.m.PrivacyPhoneNumber:return m("PrivacyPhoneTitle");case s.m.PrivacyLastSeen:return m("LastSeenTitle");case s.m.PrivacyProfilePhoto:return m("PrivacyProfilePhotoTitle");case s.m.PrivacyForwarding:return m("PrivacyForwardsTitle");case s.m.PrivacyGroupChats:return m("WhoCanAddMe");default:return}},[m,e]),p=Object(n.p)(()=>{switch(e){case s.m.PrivacyLastSeen:return m("CustomHelp");default:return}},[m,e]),v=(()=>{switch(e){case s.m.PrivacyPhoneNumber:return s.m.PrivacyPhoneNumberAllowedContacts;case s.m.PrivacyLastSeen:return s.m.PrivacyLastSeenAllowedContacts;case s.m.PrivacyProfilePhoto:return s.m.PrivacyProfilePhotoAllowedContacts;case s.m.PrivacyForwarding:return s.m.PrivacyForwardingAllowedContacts;default:return s.m.PrivacyGroupChatsAllowedContacts}})(),E=(()=>{switch(e){case s.m.PrivacyPhoneNumber:return s.m.PrivacyPhoneNumberDeniedContacts;case s.m.PrivacyLastSeen:return s.m.PrivacyLastSeenDeniedContacts;case s.m.PrivacyProfilePhoto:return s.m.PrivacyProfilePhotoDeniedContacts;case s.m.PrivacyForwarding:return s.m.PrivacyForwardingDeniedContacts;default:return s.m.PrivacyGroupChatsDeniedContacts}})(),O=Object(n.p)(()=>c&&r&&i?r.reduce((e,t)=>e+(i[t]?i[t].membersCount:0),c.length):0,[r,c,i]),f=Object(n.p)(()=>l&&o&&i?o.reduce((e,t)=>e+(i[t]?i[t].membersCount:0),l.length):0,[o,l,i]),j=Object(n.m)(e=>{d({privacyKey:b,visibility:e})},[b,d]);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"},g),n.a.createElement(ra.a,{name:"visibility-"+b,options:u,onChange:j,selected:a}),p&&n.a.createElement("p",{className:"settings-item-description-larger"},p)),n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header mb-4"},m("PrivacyExceptions")),h.shouldShowAllowed&&n.a.createElement(ve.a,{narrow:!0,icon:"add-user",onClick:()=>{t(v)}},n.a.createElement("div",{className:"multiline-menu-item full-size"},O>0&&n.a.createElement("span",{className:"date"},"+",O),n.a.createElement("span",{className:"title"},m("AlwaysShareWith")),n.a.createElement("span",{className:"subtitle"},m("EditAdminAddUsers")))),h.shouldShowDenied&&n.a.createElement(ve.a,{narrow:!0,icon:"delete-user",onClick:()=>{t(E)}},n.a.createElement("div",{className:"multiline-menu-item full-size"},f>0&&n.a.createElement("span",{className:"date"},"−",f),n.a.createElement("span",{className:"title"},m("NeverShareWith")),n.a.createElement("span",{className:"subtitle"},m("EditAdminAddUsers"))))))}));function Ua(e){return[e.region,e.country].filter(Boolean).join(", ")}function Ga(e){return`${e.deviceModel}${e.deviceModel?", ":""} ${e.platform} ${e.systemVersion}`}var qa=Object(n.h)(Object(c.h)(e=>({activeSessions:e.activeSessions}),(e,t)=>Object(u.l)(t,["loadAuthorizations","terminateAuthorization","terminateAllAuthorizations"]))(({activeSessions:e,loadAuthorizations:t,terminateAuthorization:a,terminateAllAuthorizations:c})=>{const[r,s,l]=Object(Be.a)();Object(n.n)(()=>{t()},[t]);const o=Object(n.m)(e=>{a({hash:e})},[a]),i=Object(n.m)(()=>{l(),c()},[l,c]),d=Object(n.p)(()=>e.find(e=>e.isCurrent),[e]),m=Object(n.p)(()=>e.filter(e=>!e.isCurrent),[e]),u=Object(F.a)();function h(e){return n.a.createElement(ve.a,{key:e.hash,ripple:!0,narrow:!0,contextActions:[{title:"Terminate",icon:"stop",handler:()=>{o(e.hash)}}]},n.a.createElement("div",{className:"multiline-menu-item full-size"},n.a.createElement("span",{className:"date"},Object(B.g)(u,1e3*e.dateActive)),n.a.createElement("span",{className:"title"},e.appName),n.a.createElement("span",{className:"subtitle black tight"},Ga(e)),n.a.createElement("span",{className:"subtitle"},e.ip," - ",Ua(e))))}return n.a.createElement("div",{className:"settings-content custom-scroll"},d&&(g=d,n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header mb-4"},u("AuthSessions.CurrentSession")),n.a.createElement(ve.a,{narrow:!0,inactive:!0},n.a.createElement("div",{className:"multiline-menu-item"},n.a.createElement("span",{className:"title"},g.appName),n.a.createElement("span",{className:"subtitle black tight"},Ga(g)),n.a.createElement("span",{className:"subtitle"},g.ip," - ",Ua(g)))),n.a.createElement(ve.a,{className:"destructive mb-0",icon:"stop",ripple:!0,narrow:!0,onClick:s},u("TerminateAllSessions")))),m&&(b=m,n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header mb-4"},"Other Sessions"),b.map(h))),m&&n.a.createElement(Se.a,{isOpen:r,onClose:l,text:"Are you sure you want to terminate all other sessions?",confirmLabel:"Terminate All Other Sessions",confirmHandler:i,confirmIsDestructive:!0}),";");var b,g}));var za=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(u.l)(t,["unblockContact"]))(({chatsByIds:e,usersByIds:t,blockedIds:a,unblockContact:c})=>{const r=Object(n.m)(e=>{c({contactId:e})},[c]),s=Object(F.a)();return 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"},s("BlockedUsersInfo"))),n.a.createElement("div",{className:"chat-list custom-scroll"},a&&a.length?n.a.createElement("div",{className:"scroll-container"},a.map((a,c)=>function(a,c,o){const i=Object(m.lb)(a),d=i?t[a]:void 0,u=i?void 0:e[a],h=Object(ce.a)("Chat chat-item-clickable blocked-list-item",i?"private":"group");return n.a.createElement(ve.a,{key:a,className:h,ripple:!0,narrow:!0,contextActions:[{title:"Unblock",icon:"unlock",handler:()=>{r(a)}}],style:`top: ${(o+c)*l.i}px;`},n.a.createElement(R.a,{size:"medium",user:d,chat:u}),n.a.createElement("div",{className:"contact-info",dir:"auto"},n.a.createElement("h3",{dir:"auto"},Object(x.a)((i?Object(m.Z)(d):Object(m.l)(s,u))||"")),d&&d.phoneNumber&&n.a.createElement("div",{className:"contact-phone",dir:"auto"},Object(Dt.c)(d.phoneNumber)),d&&!d.phoneNumber&&d.username&&n.a.createElement("div",{className:"contact-username",dir:"auto"},"@",d.username)))}(a,c,0))):a&&!a.length?n.a.createElement("div",{className:"no-results"},"List is empty"):n.a.createElement(he.a,{key:"loading"}))),n.a.createElement(Rt,{isShown:!0,onClick:()=>{},className:"not-implemented",ariaLabel:"Add a blocked user"},n.a.createElement("i",{className:"icon-add"})))})),$a=a(123);var Ha=Object(n.h)(Object(c.h)(e=>({animatedEmoji:Object(d.c)(e,"🔐")}))(({animatedEmoji:e,onScreenSelect:t})=>{const a=Object(F.a)();return n.a.createElement("div",{className:"settings-content two-fa custom-scroll"},n.a.createElement("div",{className:"settings-content-header"},n.a.createElement($a.a,{sticker:e}),n.a.createElement("p",{className:"settings-item-description mb-3",dir:"auto"},Object(x.a)(a("EnabledPasswordText"),["br"]))),n.a.createElement("div",{className:"settings-item pt-0 no-border"},n.a.createElement(ve.a,{icon:"edit",onClick:()=>t(s.m.TwoFaChangePasswordCurrent)},a("ChangePassword")),n.a.createElement(ve.a,{icon:"password-off",onClick:()=>t(s.m.TwoFaTurnOff)},a("TurnPasswordOff")),n.a.createElement(ve.a,{icon:"email",onClick:()=>t(s.m.TwoFaRecoveryEmailCurrentPassword)},a("SetRecoveryEmail"))))})),_a=a(143),Va=a(144);var Wa=Object(n.h)(({error:e,isLoading:t,expectedPassword:a,placeholder:c="Current Password",hint:r,submitLabel:s,clearError:l,onSubmit:o})=>{const[i,d]=Object(n.r)(""),[m,u]=Object(n.r)(!1),h=Object(n.m)(e=>{a&&e!==a?d("Passwords Should Be Equal"):o(e)},[o,a]),b=Object(n.m)(()=>{l&&l(),d("")},[l]),g=Object(F.a)();return n.a.createElement("div",{className:"settings-content two-fa custom-scroll"},n.a.createElement("div",{className:"settings-content-header"},n.a.createElement(_a.a,{isBig:!0,isPasswordVisible:m})),n.a.createElement("div",{className:"settings-item pt-0 no-border"},n.a.createElement(Va.a,{error:i||e,hint:r,placeholder:c,submitLabel:s||g("Next"),clearError:b,isLoading:t,isPasswordVisible:m,onChangePasswordVisibility:u,onSubmit:h})))});var Ya=Object(n.h)(Object(c.h)(e=>({animatedEmoji:Object(d.c)(e,"🔐")}))(({animatedEmoji:e,onStart:t})=>{const a=Object(F.a)();return n.a.createElement("div",{className:"settings-content two-fa custom-scroll"},n.a.createElement("div",{className:"settings-content-header"},n.a.createElement($a.a,{sticker:e}),n.a.createElement("p",{className:"settings-item-description mb-3",dir:"auto"},a("SetAdditionalPasswordInfo"))),n.a.createElement("div",{className:"settings-item pt-0 no-border"},n.a.createElement(D.a,{onClick:t},a("EditAdminTransferSetPassword"))))}));const Ka=o.g?550:400;var Za=Object(n.h)(Object(c.h)((e,{icon:t})=>({animatedEmoji:Object(d.c)(e,"email"===t?"💌":"💡")}))(({animatedEmoji:e,type:t="text",isLoading:a,error:c,placeholder:r,shouldConfirm:s,clearError:l,onSubmit:i})=>{const d=Object(n.q)(null),[m,u]=Object(n.r)(""),[h,b,g]=Object(Be.a)(!1);Object(n.n)(()=>{o.l||setTimeout(()=>{d.current.focus()},Ka)},[]);const p=Object(F.a)();return n.a.createElement("div",{className:"settings-content two-fa custom-scroll"},n.a.createElement("div",{className:"settings-content-header"},n.a.createElement($a.a,{sticker:e})),n.a.createElement("div",{className:"settings-item pt-0 no-border"},n.a.createElement("form",{action:"",onSubmit:e=>{e.preventDefault(),d.current&&i(m)}},n.a.createElement(ge.a,{ref:d,value:m,inputMode:t,label:r,error:c,onChange:e=>{c&&l&&l(),u(e.target.value)}}),m?n.a.createElement(D.a,{type:"submit",isLoading:a,ripple:!0},p("Continue")):n.a.createElement(D.a,{isText:!0,isLoading:a,ripple:!0,onClick:s?b:()=>{i()}},p("YourEmailSkip"))),s&&n.a.createElement(be.a,{className:"narrow",isOpen:h,title:p("YourEmailSkipWarning"),onClose:g},Object(x.a)(p("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:()=>{g(),i()}},p("YourEmailSkip")),n.a.createElement(D.a,{color:"primary",ripple:!0,isText:!0,className:"confirm-dialog-button",onClick:g},p("Cancel"))))))}));var Qa=Object(n.h)(Object(c.h)(e=>({animatedEmoji:Object(d.c)(e,"🥳")}))(({animatedEmoji:e,onScreenSelect:t})=>{const a=Object(F.a)();return n.a.createElement("div",{className:"settings-content two-fa custom-scroll"},n.a.createElement("div",{className:"settings-content-header"},n.a.createElement($a.a,{sticker:e}),n.a.createElement("p",{className:"settings-item-description mb-3",dir:"auto"},a("TwoStepVerificationPasswordSetInfo"))),n.a.createElement("div",{className:"settings-item pt-0 no-border"},n.a.createElement(D.a,{onClick:()=>{t(s.m.Privacy)}},a("TwoStepVerificationPasswordReturnSettings"))))}));const Xa=o.g?550:400;var Ja=Object(n.h)(Object(c.h)(e=>({animatedEmoji:Object(d.c)(e,"💌"),codeLength:e.twoFaSettings.waitingEmailCodeLength}))(({animatedEmoji:e,codeLength:t,isLoading:a,error:c,clearError:r,onSubmit:s})=>{const l=Object(n.q)(null),[i,d]=Object(n.r)("");Object(n.n)(()=>{o.l||setTimeout(()=>{l.current.focus()},Xa)},[]);const m=Object(F.a)();return n.a.createElement("div",{className:"settings-content two-fa custom-scroll"},n.a.createElement("div",{className:"settings-content-header"},n.a.createElement($a.a,{sticker:e})),n.a.createElement("div",{className:"settings-item pt-0 no-border"},n.a.createElement(ge.a,{value:i,ref:l,inputMode:"decimal",label:m("YourEmailCode"),error:c,onChange:e=>{c&&r&&r();const a=e.target.value.slice(0,t);a.length===t&&s(a),d(a),e.target.value=a}}),a&&n.a.createElement(he.a,null)))}));var en=Object(n.h)(Object(c.h)(e=>({...e.twoFaSettings}),(e,t)=>Object(u.l)(t,["updatePassword","updateRecoveryEmail","clearPassword","provideTwoFaEmailCode","checkPassword","clearTwoFaError"]))(({currentScreen:e,state:t,hint:a,isLoading:c,error:r,waitingEmailCodeLength:l,dispatch:o,onScreenSelect:i,updatePassword:d,checkPassword:m,clearTwoFaError:u,updateRecoveryEmail:h,provideTwoFaEmailCode:b,clearPassword:g})=>{Object(n.n)(()=>{l&&(e===s.m.TwoFaNewPasswordEmail?i(s.m.TwoFaNewPasswordEmailCode):e===s.m.TwoFaRecoveryEmail&&i(s.m.TwoFaRecoveryEmailCode))},[e,i,l]);const p=Object(n.m)(()=>{o({type:"reset"}),i(s.m.TwoFaNewPassword)},[o,i]),v=Object(n.m)(e=>{o({type:"setPassword",payload:e}),i(s.m.TwoFaNewPasswordConfirm)},[o,i]),E=Object(n.m)(()=>{i(s.m.TwoFaNewPasswordHint)},[i]),O=Object(n.m)(e=>{o({type:"setHint",payload:e}),i(s.m.TwoFaNewPasswordEmail)},[o,i]),f=Object(n.m)(e=>{o({type:"setEmail",payload:e}),d({...t,email:e,onSuccess:()=>{i(s.m.TwoFaCongratulations)}})},[o,i,t,d]),j=Object(n.m)(e=>{o({type:"setCurrentPassword",payload:e}),m({currentPassword:e,onSuccess:()=>{i(s.m.TwoFaChangePasswordNew)}})},[m,o,i]),C=Object(n.m)(e=>{o({type:"setPassword",payload:e}),i(s.m.TwoFaChangePasswordConfirm)},[o,i]),y=Object(n.m)(()=>{i(s.m.TwoFaChangePasswordHint)},[i]),k=Object(n.m)(e=>{o({type:"setHint",payload:e}),d({...t,hint:e,onSuccess:()=>{i(s.m.TwoFaCongratulations)}})},[o,i,t,d]),N=Object(n.m)(e=>{g({currentPassword:e,onSuccess:()=>{i(s.m.Privacy)}})},[g,i]),I=Object(n.m)(e=>{o({type:"setCurrentPassword",payload:e}),m({currentPassword:e,onSuccess:()=>{i(s.m.TwoFaRecoveryEmail)}})},[m,o,i]),S=Object(n.m)(e=>{o({type:"setEmail",payload:e}),h({...t,email:e,onSuccess:()=>{i(s.m.TwoFaCongratulations)}})},[o,i,t,h]),w=Object(n.m)(e=>{b({code:e})},[b]),P=Object(F.a)();switch(e){case s.m.TwoFaDisabled:return n.a.createElement(Ya,{onStart:p});case s.m.TwoFaNewPassword:return n.a.createElement(Wa,{placeholder:P("EnterPassword"),submitLabel:P("Continue"),onSubmit:v});case s.m.TwoFaNewPasswordConfirm:return n.a.createElement(Wa,{expectedPassword:t.password,placeholder:P("PleaseReEnterPassword"),submitLabel:P("Continue"),onSubmit:E});case s.m.TwoFaNewPasswordHint:return n.a.createElement(Za,{icon:"hint",placeholder:P("PasswordHintPlaceholder"),onSubmit:O});case s.m.TwoFaNewPasswordEmail:return n.a.createElement(Za,{icon:"email",type:"email",isLoading:c,error:r,clearError:u,placeholder:P("RecoveryEmailTitle"),shouldConfirm:!0,onSubmit:f});case s.m.TwoFaNewPasswordEmailCode:return n.a.createElement(Ja,{isLoading:c,error:r,clearError:u,onSubmit:w});case s.m.TwoFaCongratulations:return n.a.createElement(Qa,{onScreenSelect:i});case s.m.TwoFaEnabled:return n.a.createElement(Ha,{onScreenSelect:i});case s.m.TwoFaChangePasswordCurrent:return n.a.createElement(Wa,{isLoading:c,error:r,clearError:u,hint:a,onSubmit:j});case s.m.TwoFaChangePasswordNew:return n.a.createElement(Wa,{placeholder:P("PleaseEnterNewFirstPassword"),onSubmit:C});case s.m.TwoFaChangePasswordConfirm:return n.a.createElement(Wa,{expectedPassword:t.password,placeholder:P("PleaseReEnterPassword"),onSubmit:y});case s.m.TwoFaChangePasswordHint:return n.a.createElement(Za,{isLoading:c,error:r,clearError:u,icon:"hint",placeholder:P("PasswordHintPlaceholder"),onSubmit:k});case s.m.TwoFaTurnOff:return n.a.createElement(Wa,{isLoading:c,error:r,clearError:u,hint:a,onSubmit:N});case s.m.TwoFaRecoveryEmailCurrentPassword:return n.a.createElement(Wa,{isLoading:c,error:r,clearError:u,hint:a,onSubmit:I});case s.m.TwoFaRecoveryEmail:return n.a.createElement(Za,{icon:"email",type:"email",placeholder:P("RecoveryEmailTitle"),onSubmit:S});case s.m.TwoFaRecoveryEmailCode:return n.a.createElement(Ja,{isLoading:c,error:r,clearError:u,onSubmit:w});default:return}}));var tn=Object(n.h)(({itemIds:e,selectedIds:t,filterValue:a,filterPlaceholder:c,notFoundText:r,searchInputId:s,isLoading:l,onSelectedIdsChange:o,onFilterChange:i,onLoadMore:d})=>{const u=Object(n.q)(null),h=t.length>10;Object(n.n)(()=>{setTimeout(()=>{requestAnimationFrame(()=>{u.current.focus()})},500)},[]);const b=Object(n.m)(e=>{const a=[...t];a.includes(e)?a.splice(a.indexOf(e),1):a.push(e),o(a),i("")},[t,o,i]),g=Object(n.m)(e=>{const{value:t}=e.currentTarget;i(t)},[i]),[p,v]=Object(ue.a)(d,e,Boolean(a)),E=Object(F.a)();return n.a.createElement("div",{className:"Picker"},n.a.createElement("div",{className:"picker-header custom-scroll"},t.map((e,a)=>n.a.createElement(Je.a,{chatOrUserId:e,isMinimized:h&&an.a.createElement(ve.a,{key:e,className:"chat-item-clickable picker-list-item",onClick:()=>b(e),ripple:!0},n.a.createElement(Jt.a,{label:"",checked:t.includes(e)}),Object(m.lb)(e)?n.a.createElement(Ee.a,{userId:e}):n.a.createElement(Oe.a,{chatId:e})))):l||!p||p.length?n.a.createElement(he.a,null):n.a.createElement("p",{className:"no-results"},r||"Sorry, nothing found."))});function an(e,t){const{privacy:a}=e.settings;switch(t){case s.m.PrivacyPhoneNumberAllowedContacts:case s.m.PrivacyPhoneNumberDeniedContacts:return a.phoneNumber;case s.m.PrivacyLastSeenAllowedContacts:case s.m.PrivacyLastSeenDeniedContacts:return a.lastSeen;case s.m.PrivacyProfilePhotoAllowedContacts:case s.m.PrivacyProfilePhotoDeniedContacts:return a.profilePhoto;case s.m.PrivacyForwardingAllowedContacts:case s.m.PrivacyForwardingDeniedContacts:return a.forwards;case s.m.PrivacyGroupChatsDeniedContacts:case s.m.PrivacyGroupChatsAllowedContacts:return a.chatInvite}}var nn=Object(n.h)(Object(c.h)((e,{screen:t})=>{const{chats:{byId:a,listIds:n,orderedPinnedIds:c},currentUserId:r}=e;return{currentUserId:r,chatsById:a,listIds:n.active,orderedPinnedIds:c.active,archivedPinnedIds:c.archived,archivedListIds:n.archived,settings:an(e,t)}},(e,t)=>Object(u.l)(t,["setPrivacySettings"]))(({currentUserId:e,isAllowList:t,screen:a,settings:c,chatsById:r,listIds:l,orderedPinnedIds:o,archivedListIds:i,archivedPinnedIds:d,setPrivacySettings:u,onScreenSelect:h})=>{const b=Object(F.a)(),g=Object(n.p)(()=>c?t?[...c.allowUserIds,...c.allowChatIds]:[...c.blockUserIds,...c.blockChatIds]:[],[t,c]),[p,v]=Object(n.r)(""),[E,O]=Object(n.r)(!1),[f,j]=Object(n.r)(g),C=Object(n.p)(()=>{const e=l?Object(m.Ab)(r,l,o,"all"):void 0,t=i?Object(m.Ab)(r,i,d,"archived"):void 0;if(e||t)return[...e?[...e.pinnedChats,...e.otherChats]:[],...t?t.otherChats:[]]},[r,l,o,i,d]),y=Object(n.p)(()=>{if(C)return C.filter(t=>(Object(m.lb)(t.id)&&t.id!==e||Object(m.kb)(t))&&(!p||Object(me.a)(Object(m.l)(b,t),p)||g.includes(t.id))).map(({id:e})=>e)},[C,e,b,p,g]),k=Object(n.m)(e=>{j(e),O(!0)},[]),N=Object(n.m)(()=>{u({privacyKey:xa(a),isAllowList:Boolean(t),contactsIds:f}),h(s.m.Privacy)},[t,f,h,a,u]);return n.a.createElement("div",{className:"NewChat-inner step-1"},n.a.createElement(tn,{itemIds:y||[],selectedIds:f,filterValue:p,filterPlaceholder:b(t?"AlwaysShareWithPlaceholder":"NeverShareWithPlaceholder"),searchInputId:"new-group-picker-search",onSelectedIdsChange:k,onFilterChange:v}),n.a.createElement(Rt,{isShown:E,onClick:N,ariaLabel:b(t?"AlwaysShareWithTitle":"NeverShareWithTitle")},n.a.createElement("i",{className:"icon-arrow-right"})))}));a(274);const cn=Object.keys(s.m).length/2;var rn=Object(n.h)(({currentScreen:e,onScreenSelect:t,onReset:a})=>{const[c,r]=yt(Ft,Mt),[l,i]=yt(At,Lt),d=Object(n.m)(()=>{e!==s.m.FoldersCreateFolder&&e!==s.m.FoldersEditFolder||setTimeout(()=>{r({type:"reset"})},200),e!==s.m.FoldersIncludedChats&&e!==s.m.FoldersExcludedChats?a():"create"===c.mode?t(s.m.FoldersCreateFolder):t(s.m.FoldersEditFolder)},[c.mode,r,e,a,t]),m=Object(n.m)(()=>{r({type:"saveFilters"}),d()},[r,d]);function u(){return n.a.createElement(n.a.Fragment,null,n.a.createElement(Tt,{currentScreen:e,onReset:d,onSaveFilter:m,editedFolderId:c.folderId}),function(){switch(e){case s.m.Main:return n.a.createElement(Bt,{onScreenSelect:t});case s.m.EditProfile:return n.a.createElement(Ht,null);case s.m.General:return n.a.createElement(ba,{onScreenSelect:t});case s.m.Notifications:return n.a.createElement(Aa,null);case s.m.Privacy:return n.a.createElement(Ta,{onScreenSelect:t});case s.m.Language:return n.a.createElement(Ba,null);case s.m.GeneralChatBackground:return n.a.createElement(Sa,{onScreenSelect:t});case s.m.GeneralChatBackgroundColor:return n.a.createElement(La,{onScreenSelect:t});case s.m.PrivacyActiveSessions:return n.a.createElement(qa,null);case s.m.PrivacyBlockedUsers:return n.a.createElement(za,null);case s.m.PrivacyPhoneNumber:case s.m.PrivacyLastSeen:case s.m.PrivacyProfilePhoto:case s.m.PrivacyForwarding:case s.m.PrivacyGroupChats:return n.a.createElement(Ra,{screen:e,onScreenSelect:t});case s.m.PrivacyPhoneNumberAllowedContacts:case s.m.PrivacyLastSeenAllowedContacts:case s.m.PrivacyProfilePhotoAllowedContacts:case s.m.PrivacyForwardingAllowedContacts:case s.m.PrivacyGroupChatsAllowedContacts:return n.a.createElement(nn,{isAllowList:!0,screen:e,onScreenSelect:t});case s.m.PrivacyPhoneNumberDeniedContacts:case s.m.PrivacyLastSeenDeniedContacts:case s.m.PrivacyProfilePhotoDeniedContacts:case s.m.PrivacyForwardingDeniedContacts:case s.m.PrivacyGroupChatsDeniedContacts:return n.a.createElement(nn,{screen:e,onScreenSelect:t});case s.m.Folders:case s.m.FoldersCreateFolder:case s.m.FoldersEditFolder:case s.m.FoldersIncludedChats:case s.m.FoldersExcludedChats:return n.a.createElement(aa,{currentScreen:e,state:c,dispatch:r,onScreenSelect:t,onReset:d});case s.m.TwoFaDisabled:case s.m.TwoFaNewPassword:case s.m.TwoFaNewPasswordConfirm:case s.m.TwoFaNewPasswordHint:case s.m.TwoFaNewPasswordEmail:case s.m.TwoFaNewPasswordEmailCode:case s.m.TwoFaCongratulations:case s.m.TwoFaEnabled:case s.m.TwoFaChangePasswordCurrent:case s.m.TwoFaChangePasswordNew:case s.m.TwoFaChangePasswordConfirm:case s.m.TwoFaChangePasswordHint:case s.m.TwoFaTurnOff:case s.m.TwoFaRecoveryEmailCurrentPassword:case s.m.TwoFaRecoveryEmail:case s.m.TwoFaRecoveryEmailCode:return n.a.createElement(en,{currentScreen:e,state:l,dispatch:i,onScreenSelect:t});default:return}}())}return n.a.createElement(T.a,{id:"Settings",name:o.g?"slide-layers":"push-slide",activeKey:e,renderCount:cn},u)});const sn=Object(_.g)(e=>e(),6e4,!0);var ln=Object(n.h)(Object(c.h)(e=>{const{userIds:t}=e.contactList||{},{byId:a}=e.users;return{usersById:a,contactIds:t}},(e,t)=>Object(u.l)(t,["loadContactList","openChat"]))(({filter:e,usersById:t,contactIds:a,loadContactList:c,openChat:r})=>{Object(n.n)(()=>{sn(()=>{c()})});const s=Object(n.m)(e=>{r({id:e})},[r]),l=Object(n.p)(()=>{if(!a)return;const n=e?a.filter(a=>{const n=t[a];if(!n)return!1;const c=Object(m.Z)(n);return c&&Object(me.a)(c,e)}):a;return Object(m.Eb)(n,t)},[e,t,a]),[i,d]=Object(ue.a)(void 0,l,Boolean(e));return n.a.createElement(pe.a,{items:i,onLoadMore:d,className:"chat-list custom-scroll"},i&&i.length?i.map(e=>n.a.createElement(ve.a,{key:e,className:"chat-item-clickable",onClick:()=>s(e),ripple:!o.g},n.a.createElement(Ee.a,{userId:e,forceShowSelf:!0,avatarSize:"large"}))):i&&!i.length?n.a.createElement("p",{className:"no-results",key:"no-results",dir:"auto"},e.length?"No contacts matched your search.":"Contact list is empty."):n.a.createElement(he.a,{key:"loading"}))}));const on=Object(_.g)(e=>e(),6e4,!0);var dn=Object(n.h)(Object(c.h)(e=>{const{userIds:t}=e.contactList||{},{byId:a}=e.users,{byId:n}=e.chats,{currentUserId:c}=e,{query:r,fetchingStatus:s,globalResults:l,localResults:o}=e.globalSearch,{userIds:i}=l||{},{userIds:d}=o||{};return{currentUserId:c,usersById:a,chatsById:n,localContactIds:t,searchQuery:r,isSearching:s&&s.chats,globalUserIds:i,localUserIds:d}},(e,t)=>Object(u.l)(t,["loadContactList","setGlobalSearchQuery"]))(({isChannel:e,selectedMemberIds:t,onSelectedMemberIdsChange:a,onNextStep:c,onReset:r,currentUserId:s,usersById:l,chatsById:o,localContactIds:i,searchQuery:d,isSearching:h,localUserIds:b,globalUserIds:g,loadContactList:p,setGlobalSearchQuery:v})=>{Object(n.n)(()=>{on(()=>{p()})});const E=Object(n.m)(e=>{v({query:e})},[v]),O=Object(n.p)(()=>{const e=i?Object(m.Db)(i.filter(e=>e!==s),o):[];if(!d)return e;const a=e.filter(e=>{const t=l[e];if(!t)return!1;const a=Object(m.Z)(t);return a&&Object(me.a)(a,d)});return Object(m.Db)(Object(u.o)([...a,...b||[],...g||[]]),o,!1,t)},[i,d,b,g,l,o,t,s]),f=Object(n.m)(()=>{(t.length||e)&&(v({query:""}),c())},[t.length,e,v,c]),j=Object(F.a)();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,j("GroupAddMembers"))),n.a.createElement("div",{className:"NewChat-inner step-1"},n.a.createElement(tn,{itemIds:O,selectedIds:t,filterValue:d,filterPlaceholder:j("SendMessageTo"),searchInputId:"new-group-picker-search",isLoading:h,onSelectedIdsChange:a,onFilterChange:E}),n.a.createElement(Rt,{isShown:Boolean(t.length||e),onClick:f,ariaLabel:e?"Continue To Channel Info":"Continue To Group Info"},n.a.createElement("i",{className:"icon-arrow-right"}))))}));var mn=Object(n.h)(Object(c.h)(e=>{const{progress:t,error:a}=e.chatCreation||{};return{creationProgress:t,creationError:a}},(e,t)=>Object(u.l)(t,["createGroupChat","createChannel"]))(({isChannel:e,memberIds:t,onReset:a,creationProgress:c,creationError:r,createGroupChat:l,createChannel:o})=>{const i=Object(F.a)(),[d,m]=Object(n.r)(""),[u,h]=Object(n.r)(""),[b,g]=Object(n.r)(),[p,v]=Object(n.r)(),E=c===s.a.InProgress,O=Object(n.m)(e=>{const{value:t}=e.currentTarget,a=t.replace(/^\s+/,"");m(a),a!==t&&(e.currentTarget.value=a)},[]),f=Object(n.m)(e=>{h(e.currentTarget.value)},[]),j=Object(n.m)(()=>{d.length?t.length>199?v("Sorry, creating supergroups is not yet supported"):l({title:d,photo:b,memberIds:t}):v("Chat title can't be empty")},[d,t,l,b,"Chat title can't be empty","Sorry, creating supergroups is not yet supported"]),C=Object(n.m)(()=>{d.length?o({title:d,about:u,photo:b,memberIds:t}):v("Channel title can't be empty")},[d,o,u,b,t,"Channel title can't be empty"]);Object(n.n)(()=>{c===s.a.Complete&&a(!0)},[c,a]);const y=r||("Chat title can't be empty"!==p&&"Channel title can't be empty"!==p?p: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:()=>a(),ariaLabel:"Return to member selection"},n.a.createElement("i",{className:"icon-arrow-left"})),n.a.createElement("h3",null,i(e?"NewChannel":"NewGroup"))),n.a.createElement("div",{className:"NewChat-inner step-2"},n.a.createElement(xt.a,{onChange:g,title:i("AddPhoto")}),n.a.createElement(ge.a,{value:d,onChange:O,label:i(e?"EnterChannelName":"GroupName"),error:"Chat title can't be empty"===p||"Channel title can't be empty"===p?p:void 0}),e&&n.a.createElement(n.a.Fragment,null,n.a.createElement(ge.a,{value:u,onChange:f,label:i("DescriptionOptionalPlaceholder")}),n.a.createElement("p",{className:"note"},i("DescriptionInfo"))),y&&n.a.createElement("p",{className:"error"},y),t.length>0&&n.a.createElement(n.a.Fragment,null,n.a.createElement("h3",{className:"chat-members-heading"},i("GroupInfo.ParticipantCount",t.length,"i")),n.a.createElement("div",{className:"chat-members-list custom-scroll"},t.map(e=>n.a.createElement(ve.a,{inactive:!0,className:"chat-item-clickable"},n.a.createElement(Ee.a,{userId:e})))))),n.a.createElement(Rt,{isShown:0!==d.length,onClick:e?C:j,disabled:E,ariaLabel:e?i("ChannelIntro.CreateChannel"):"Create Group"},E?n.a.createElement(L.a,{color:"white"}):n.a.createElement("i",{className:"icon-arrow-right"})))}));a(275);const un=Object.keys(s.d).length/2;var hn=Object(n.h)(({isChannel:e=!1,content:t,onContentChange:a,onReset:c})=>{const[r,l]=Object(n.r)([]),i=Object(n.m)(()=>{a(e?s.d.NewChannelStep2:s.d.NewGroupStep2)},[e,a]);return n.a.createElement(T.a,{id:"NewChat",name:o.g?"slide-layers":"push-slide",renderCount:un,activeKey:t},()=>{switch(t){case s.d.NewChannelStep1:case s.d.NewGroupStep1:return n.a.createElement(dn,{isChannel:e,selectedMemberIds:r,onSelectedMemberIdsChange:l,onNextStep:i,onReset:c});case s.d.NewChannelStep2:case s.d.NewGroupStep2:return n.a.createElement(mn,{isChannel:e,memberIds:r,onReset:c});default:return}})}),bn=a(184);a(276);var gn=Object(n.h)(({onReset:e})=>{const t=Object(F.a)();return 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:e,ariaLabel:"Return to chat list"},n.a.createElement("i",{className:"icon-arrow-left"})),n.a.createElement("h3",null,t("ArchivedChats"))),n.a.createElement(bn.a,{folderType:"archived",noChatsText:"Archive is empty."}))});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},vn=e=>{e.preventDefault()};function En(e){pn[e.key]&&vn(e)}function On(){document.addEventListener("wheel",vn,{passive:!1}),window.ontouchmove=vn,document.onkeydown=En}function fn(){document.removeEventListener("wheel",vn),window.ontouchmove=null,document.onkeydown=null}var jn=a(50),Cn=a(148);function yn(e,t){return e?"lng_context_copy_selected":t?"lng_context_copy_text":"Copy"}var kn=a(168),Nn=a(49);a(277);var In=({isOpen:e,message:t,anchor:a,canSendNow:c,canReschedule:s,canReply:l,canEdit:o,canPin:i,canUnpin:d,canDelete:u,canForward:h,canFaveSticker:b,canUnfaveSticker:g,canCopy:p,canCopyLink:v,canSelect:E,onReply:O,onEdit:f,onPin:C,onUnpin:y,onForward:k,onDelete:N,onFaveSticker:I,onUnfaveSticker:S,onSelect:w,onSend:P,onReschedule:M,onClose:L,onCloseAnimationEnd:A,onCopyLink:T})=>{Object(n.n)(()=>{Object(j.b)(200)},[e]);const D=function(e,t,a){const n=[],c=Object(m.O)(e),s=Object(m.G)(e),l=Object(m.D)(e,"inline"),o=s&&l&&Cn.a,i=window.getSelection();if(o&&n.push({label:"lng_context_copy_image",handler:()=>{jn.b(l,r.ApiMediaFormat.BlobUrl).then(Cn.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:yn(e,o),handler:()=>{const a=e&&i?i.toString():c;Object(Cn.c)(a),t&&t()}})}return a&&n.push({label:"lng_context_copy_message_link",handler:()=>{a(),t&&t()}}),n}(t,L,v?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"),[]),R=Object(n.m)(()=>document.querySelector(".MessageContextMenu .bubble"),[]),{positionX:U,positionY:G,style:q}=Object(kn.a)(a,B,x,R,10,document.querySelector(".MiddleHeader").offsetHeight),$=Object(F.a)();return n.a.createElement(Nn.a,{isOpen:e,positionX:U,positionY:G,style:q,className:"MessageContextMenu fluid",onClose:L,onCloseAnimationEnd:A},c&&n.a.createElement(z.a,{icon:"send-outline",onClick:P},$("MessageScheduleSend")),s&&n.a.createElement(z.a,{icon:"schedule",onClick:M},$("MessageScheduleEditTime")),l&&n.a.createElement(z.a,{icon:"reply",onClick:O},$("Reply")),o&&n.a.createElement(z.a,{icon:"edit",onClick:f},$("Edit")),b&&n.a.createElement(z.a,{icon:"favorite",onClick:I},$("AddToFavorites")),g&&n.a.createElement(z.a,{icon:"favorite",onClick:S},$("Stickers.RemoveFromFavorites")),p&&D.map(e=>n.a.createElement(z.a,{key:e.label,icon:"copy",onClick:e.handler},$(e.label))),i&&n.a.createElement(z.a,{icon:"pin",onClick:C},$("DialogPin")),d&&n.a.createElement(z.a,{icon:"unpin",onClick:y},$("DialogUnpin")),h&&n.a.createElement(z.a,{icon:"forward",onClick:k},$("Forward")),E&&n.a.createElement(z.a,{icon:"select",onClick:w},$("Common.Select")),u&&n.a.createElement(z.a,{destructive:!0,icon:"delete",onClick:N},$("Delete")))};var Sn=Object(n.h)(Object(c.h)((e,{message:t,messageListType:a})=>{const{threadId:n}=Object(d.y)(e)||{},{noOptions:c,canReply:r,canPin:s,canUnpin:l,canDelete:o,canEdit:i,canForward:m,canFaveSticker:u,canUnfaveSticker:h,canCopy:b,canCopyLink:g,canSelect:p}=n&&Object(d.b)(e,t,n)||{},v="pinned"===a,E="scheduled"===a;return{noOptions:c,canSendNow:E,canReschedule:E,canReply:!v&&!E&&r,canPin:!E&&s,canUnpin:!E&&l,canDelete:o,canEdit:!v&&i,canForward:!E&&m,canFaveSticker:!E&&u,canUnfaveSticker:!E&&h,canCopy:b,canCopyLink:!E&&g,canSelect:p}},(e,t)=>Object(u.l)(t,["setReplyingToId","setEditingId","pinMessage","openForwardMenu","faveSticker","unfaveSticker","toggleMessageSelection","sendScheduledMessages","rescheduleMessage","loadMessageLink"]))(({isOpen:e,messageListType:t,message:a,album:c,anchor:r,onClose:s,onCloseAnimationEnd:l,noOptions:o,canSendNow:i,canReschedule:d,canReply:m,canPin:u,canUnpin:h,canDelete:b,canEdit:g,canForward:p,canFaveSticker:v,canUnfaveSticker:E,canCopy:O,canCopyLink:f,canSelect:j,setReplyingToId:C,setEditingId:y,pinMessage:k,openForwardMenu:N,faveSticker:I,unfaveSticker:S,toggleMessageSelection:w,sendScheduledMessages:P,rescheduleMessage:M,loadMessageLink:F})=>{const{transitionClassNames:L}=Object(W.a)(e,l,void 0,!1),[A,T]=Object(n.r)(!0),[D,x]=Object(n.r)(!1),[R,U]=Object(n.r)(!1),[G,q,z]=Object(Be.a)(),$=Object(n.m)(()=>{T(!1),x(!0)},[]),H=Object(n.m)(()=>{T(!1),s()},[s]),_=Object(n.m)(()=>{x(!1),s()},[s]),V=Object(n.m)(()=>{U(!1),s()},[s]),Y=Object(n.m)(()=>{z(),s()},[z,s]),K=Object(n.m)(()=>{C({messageId:a.id}),H()},[C,a.id,H]),Z=Object(n.m)(()=>{y({messageId:a.id}),H()},[y,a.id,H]),Q=Object(n.m)(()=>{T(!1),U(!0)},[]),X=Object(n.m)(()=>{k({messageId:a.id,isUnpin:!0}),H()},[k,a.id,H]),J=Object(n.m)(()=>{if(H(),c&&c.messages){const e=c.messages.map(({id:e})=>e);N({fromChatId:a.chatId,messageIds:e})}else N({fromChatId:a.chatId,messageIds:[a.id]})},[N,a,H,c]),ee=Object(n.m)(()=>{H(),I({sticker:a.content.sticker})},[H,a.content.sticker,I]),te=Object(n.m)(()=>{H(),S({sticker:a.content.sticker})},[H,a.content.sticker,S]),ae=Object(n.m)(()=>{const e=c&&c.messages?{messageId:a.id,childMessageIds:c.messages.map(({id:e})=>e),withShift:!1}:{messageId:a.id,withShift:!1};w(e),H()},[H,a.id,w,c]),ne=Object(n.m)(()=>{P({chatId:a.chatId,id:a.id}),H()},[H,a.chatId,a.id,P]),ce=Object(n.m)(()=>{T(!1),q()},[q]),re=Object(n.m)(e=>{M({chatId:a.chatId,messageId:a.id,scheduledAt:Math.round(e.getTime()/1e3)})},[a.chatId,a.id,M]),se=Object(n.m)(()=>{F({messageId:a.id,chatId:a.chatId}),H()},[H,F,a.chatId,a.id]);if(Object(n.n)(()=>(On(),fn),[]),o)return void H();const le=new Date;return le.setFullYear(le.getFullYear()+1),n.a.createElement("div",{className:["ContextMenuContainer",L].join(" ")},n.a.createElement(In,{message:a,isOpen:A,anchor:r,canSendNow:i,canReschedule:d,canReply:m,canDelete:b,canPin:u,canUnpin:h,canEdit:g,canForward:p,canFaveSticker:v,canUnfaveSticker:E,canCopy:O,canCopyLink:f,canSelect:j,onReply:K,onEdit:Z,onPin:Q,onUnpin:X,onForward:J,onDelete:$,onFaveSticker:ee,onUnfaveSticker:te,onSelect:ae,onSend:ne,onReschedule:ce,onClose:H,onCopyLink:se}),n.a.createElement(Ae,{isOpen:D,isSchedule:"scheduled"===t,onClose:_,album:c,message:a}),n.a.createElement(Te,{isOpen:R,messageId:a.id,chatId:a.chatId,onClose:V}),n.a.createElement(Le,{isOpen:G,withTimePicker:!0,selectedAt:1e3*a.date,maxAt:Object(B.k)(le),isFutureMode:!0,onClose:Y,onSubmit:re}))}));a(278);var wn=Object(n.h)(Object(c.h)((e,{fromSticker:t})=>({stickerSet:Object(d.wb)(e,t.stickerSetId)}),(e,t)=>Object(u.l)(t,["loadStickers","toggleStickerSet","sendMessage"]))(({isOpen:e,fromSticker:t,stickerSet:a,onClose:c,loadStickers:r,toggleStickerSet:s,sendMessage:o})=>{const i=Object(n.q)(null),d=Object(F.a)(),{observe:m}=Object(na.a)({rootRef:i,throttleMs:200,isDisabled:!e});Object(n.n)(()=>{if(e){const{stickerSetId:e,stickerSetAccessHash:a}=t;r({stickerSetId:e,stickerSetAccessHash:a})}},[e,t,r]);const u=Object(n.m)(e=>{e={...e,isPreloadedGlobally:!0},o({sticker:e}),c()},[c,o]),h=Object(n.m)(()=>{s({stickerSetId:t.stickerSetId}),c()},[t.stickerSetId,c,s]);return n.a.createElement(be.a,{className:"StickerSetModal",isOpen:e,onClose:c,hasCloseButton:!0,title:a?a.title: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(da,{sticker:e,size:l.xb,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(he.a,null))})),Pn=a(117);a(279);var Mn=Object(n.h)(Object(c.h)((e,{chatId:t})=>{const a=Object(d.f)(e,t);return!a||a.isRestricted?{}:{chat:a,isMuted:a.isMuted,isPrivate:Object(m.lb)(a.id),canDeleteChat:Object(m.d)(a)}},(e,t)=>Object(u.l)(t,["updateChatMutedState","enterMessageSelectMode"]))(({chatId:e,isOpen:t,anchor:a,isChannel:c,canSubscribe:r,canSearch:s,canMute:l,canSelect:i,canLeave:d,chat:m,isPrivate:u,isMuted:h,canDeleteChat:b,onSubscribeChannel:g,onSearchClick:p,onClose:v,onCloseAnimationEnd:E,updateChatMutedState:O,enterMessageSelectMode:f})=>{const[j,C]=Object(n.r)(!0),[y,k]=Object(n.r)(!1),{x:N,y:I}=a;Object(W.a)(t,E,void 0,!1);const S=Object(n.m)(()=>{C(!1),k(!0)},[]),w=Object(n.m)(()=>{C(!1),v()},[v]),P=Object(n.m)(()=>{k(!1),v()},[v]),M=Object(n.m)(()=>{O({chatId:e,isMuted:!h}),w()},[e,w,h,O]),L=Object(n.m)(()=>{g(),w()},[w,g]),A=Object(n.m)(()=>{p(),w()},[w,p]),T=Object(n.m)(()=>{f(),w()},[w,f]);Object(n.n)(()=>(On(),fn),[]);const D=Object(F.a)();return n.a.createElement(Pn.a,null,n.a.createElement("div",{className:"HeaderMenuContainer"},n.a.createElement(Nn.a,{isOpen:j,positionX:"right",style:`left: ${N}px;top: ${I}px;`,onClose:w},o.g&&r&&n.a.createElement(z.a,{icon:c?"channel":"group",onClick:L},D(c?"Subscribe":"Join Group")),o.g&&s&&n.a.createElement(z.a,{icon:"search",onClick:A},D("Search")),l&&n.a.createElement(z.a,{icon:h?"unmute":"mute",onClick:M},D(h?"ChatsUnmute":"ChatsMute")),i&&n.a.createElement(z.a,{icon:"select",onClick:T},D("ReportSelectMessages")),d&&n.a.createElement(z.a,{destructive:!0,icon:"delete",onClick:S},D(u?"Delete":b?"GroupInfo.DeleteAndExit":c?"LeaveChannel":"Group.LeaveGroup"))),m&&n.a.createElement($e.a,{isOpen:y,onClose:P,chat:m})))})),Fn=a(149);a(280);const Ln=Object(_.a)(e=>e(),200,!1);var An=Object(n.h)(Object(c.h)(e=>{const t=Object(d.r)(e);if(!t)return{};const{query:a,results:n}=Object(d.A)(e)||{},{totalCount:c,foundIds:r}=n||{};return{chat:t,query:a,totalCount:c,foundIds:r}},(e,t)=>Object(u.l)(t,["setLocalTextSearchQuery","searchTextMessagesLocal","focusMessage","closeLocalTextSearch","searchMessagesByDate"]))(({isActive:e,chat:t,query:a,totalCount:c,foundIds:r,setLocalTextSearchQuery:s,searchTextMessagesLocal:l,focusMessage:o,closeLocalTextSearch:i,searchMessagesByDate:d})=>{const m=Object(n.q)(null),[u,h]=Object(n.r)(0),[b,g,p]=Object(Be.a)();Object(n.n)(()=>{const{visualViewport:e}=window;if(!e)return;const t=document.getElementById("Main"),a=()=>{const{activeElement:a}=document;if(a&&a===m.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&&r&&r.length?(o({chatId:t.id,messageId:r[r.length-1]}),h(0)):h(-1)},[t,o,r]),Object(n.n)(()=>{Array.from(document.querySelectorAll("input")).forEach(t=>{t.disabled=Boolean(e&&t!==m.current)}),Array.from(document.querySelectorAll("div[contenteditable]")).forEach(t=>{t.contentEditable=e?"false":"true"})},[e]),Object(n.n)(()=>{e||m.current.blur()},[e]),Object(n.o)(()=>{document.querySelector("#MobileSearch input").blur()},[b]);const v=Object(n.m)(e=>{s({query:e}),e.length&&Ln(l)},[l,s]),E=Object(n.m)(e=>{d({timestamp:e.valueOf()/1e3}),p()},[p,d]),O=Object(n.m)(()=>{if(t&&r){const e=u+1;o({chatId:t.id,messageId:r[r.length-1-e]}),h(e)}},[t,u,o,r]),f=Object(n.m)(()=>{if(t&&r){const e=u-1;o({chatId:t.id,messageId:r[r.length-1-e]}),h(e)}},[t,u,o,r]),j=Object(F.a)();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:i},n.a.createElement("i",{className:"icon-arrow-left"})),n.a.createElement(Fn.a,{ref:m,value:a,onChange:v})),n.a.createElement("div",{className:"footer"},n.a.createElement("div",{className:"counter"},a?r&&r.length?`${u+1} of ${c}`:r&&!r.length?"No results":"":n.a.createElement(D.a,{round:!0,size:"smaller",color:"translucent",onClick:g,ariaLabel:"Search messages by date"},n.a.createElement("i",{className:"icon-calendar"}))),n.a.createElement(D.a,{round:!0,size:"smaller",color:"translucent",onClick:O,disabled:!r||!r.length||u===r.length-1},n.a.createElement("i",{className:"icon-up"})),n.a.createElement(D.a,{round:!0,size:"smaller",color:"translucent",onClick:f,disabled:!r||!r.length||0===u},n.a.createElement("i",{className:"icon-down"}))),n.a.createElement(Le,{isOpen:b,isPastMode:!0,submitButtonLabel:j("JumpToDate"),onClose:p,onSubmit:E}))})),Tn=a(55),Dn=a(185),Bn=a(177),xn=a(174),Rn=a(179);function Un(e,t,a=0,n=!1,c=!1,r=!1){const s=e[r?"scrollLeft":"scrollTop"],l=s+e[r?"offsetWidth":"offsetHeight"],o="string"==typeof t?e.querySelectorAll(t):t,{length:i}=o,d=[];let m=!1;for(let e=0;e=s-a&&u<=l+a:i<=l+a&&u>=s-a)d.push(e),m=!0;else if(m&&!n)break}return{allElements:o,visibleIndexes:d}}var Gn=function(e,t,a=!1){const n=e[a?"scrollLeft":"scrollTop"],c=n+e[a?"offsetWidth":"offsetHeight"],r=t[a?"offsetLeft":"offsetTop"],s=r+t[a?"offsetWidth":"offsetHeight"];return r>n&&s{const l=Object(n.q)(null),{shouldRender:o,transitionClassNames:i}=Object(W.a)(e,void 0,void 0,!1),d=Object(n.m)(e=>{if(!s)return-1;const t=s.length;return Object(zn.a)(t,e)},[s]),[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=r&&r[e];a&&c(a,t)},[r,c]),g=Object(n.m)(e=>{if(s&&s.length&&m>-1){const t=s[m];t&&(e.preventDefault(),b(t.userId,!0))}},[s,m,b]);Object(n.n)(()=>e?Object(xe.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)(()=>{s&&!s.length&&a()},[s,a]),Object(n.n)(()=>{u(0)},[t]),Object(n.n)(()=>{!function(e,t){const a=t.current;if(!a||e<0)return;const{visibleIndexes:n,allElements:c}=Un(a,".chat-item-clickable",8,!0,!0);if(!c.length||!c[e])return;const r=n[0];if(!n.includes(e)||e===r&&!Gn(a,c[r])){const t=e>n[n.length-1]?"start":"end";Object(qn.a)(a,c[e],t,10)}}(m,l)},[m]);const p=Object(f.a)(s&&s.length?s:void 0,o),v=s&&!s.length?p:s;if(!o||v&&!v.length)return;const E=Object(ce.a)("MentionTooltip composer-tooltip custom-scroll",i);return n.a.createElement("div",{className:E,ref:l},v&&v.map(({userId:e},t)=>n.a.createElement(ve.a,{key:e,className:"chat-item-clickable scroll-item",onClick:()=>b(e),focus:m===t},n.a.createElement(Ee.a,{userId:e,avatarSize:"small",withUsername:!0}))))}),Hn=a(178);a(282);var _n=Object(n.h)(({attachments:e,caption:t,canSuggestMembers:a,groupChatMembers:c,currentUserId:r,usersById:s,recentEmojis:o,onCaptionUpdate:i,addRecentEmoji:d,onSend:m,onFileAppend:u,onClear:h})=>{const g=Object(n.q)(null),p=Object(f.a)(e),v=e.length?e:p,E=Boolean(e.length),[O,j,C]=Object(Be.a)(),y=v&&v.every(e=>e.quick),k=Object(F.a)(),{isMentionTooltipOpen:N,mentionFilter:I,closeMentionTooltip:S,insertMention:w,mentionFilteredMembers:P}=Object(Dn.a)(a&&E,t,i,l.w,c,r,s),{isEmojiTooltipOpen:M,closeEmojiTooltip:L,filteredEmojis:A,insertEmoji:T}=Object(Bn.a)(E,t,o,l.w,i);Object(n.n)(()=>E?Object(b.a)(h):void 0,[E,h]);const B=Object(n.m)(()=>{E&&m()},[E,m]),x=Object(n.m)(e=>{e.preventDefault(),C();const{dataTransfer:{files:t}}=e;if(t&&t.length){const e=y?Array.from(t).filter(e=>e.type&&l.l.includes(e.type)):Array.from(t);u(e,!1)}},[y,u,C]);if(!v)return;const R=v.every(e=>e.mimeType.startsWith("image/")),U=v.every(e=>e.mimeType.startsWith("video/"));let G="";return G=k(R?"PreviewSender.SendPhoto":U?"PreviewSender.SendVideo":"PreviewSender.SendFile",v.length,"i"),n.a.createElement(be.a,{isOpen:E,onClose:h,header:function(){if(v)return n.a.createElement("div",{className:"modal-header-condensed"},n.a.createElement(D.a,{round:!0,color:"translucent",size:"smaller",ariaLabel:"Cancel attachments",onClick:h},n.a.createElement("i",{className:"icon-close"})),n.a.createElement("div",{className:"modal-title"},G),n.a.createElement(D.a,{color:"primary",size:"smaller",className:"modal-action-button",onClick:B},k("Send")))}(),className:"AttachmentModal "+(O?"hovered":"")},n.a.createElement("div",{className:"drop-target",onDragEnter:j,onDrop:x,onDragOver:function(e){e.preventDefault(),e.stopPropagation(),g.current&&window.clearTimeout(g.current)},onDragLeave:e=>{const{relatedTarget:t,target:a}=e;a.matches(".drop-target")&&!t&&(g.current=window.setTimeout(C,150)),a&&a.closest(".AttachmentModal.hovered")||(t&&e.stopPropagation(),C())},"data-attach-description":k("Preview.Dragging.AddItems",10)},y?n.a.createElement("div",{className:"media-wrapper custom-scroll"},v.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"},v.map(e=>n.a.createElement(xn.a,{name:e.filename,extension:Object(Tn.d)(e.filename,e.mimeType),previewData:e.previewBlobUrl,size:e.size,smaller:!0}))),n.a.createElement("div",{className:"attachment-caption-wrapper"},n.a.createElement($n,{isOpen:N,onClose:S,filter:I,onInsertUserName:w,filteredChatMembers:P,usersById:s}),n.a.createElement(Hn.a,{isOpen:M,emojis:A,onClose:L,onEmojiSelect:T,addRecentEmoji:d}),n.a.createElement(Rn.a,{id:"caption-input-text",html:t,editableInputId:l.w,placeholder:k("Caption"),onUpdate:i,onSend:m,shouldSetFocus:E}))))}),Vn=a(133);a(283);var Wn=Object(n.h)(({isOpen:e,onSend:t,onClear:a})=>{const c=Object(n.q)(null),r=Object(n.q)(null),s=Object(n.q)(null),[l,o]=Object(n.r)(""),[i,d]=Object(n.r)([""]),[m,u]=Object(n.r)(!0),[h,g]=Object(n.r)(!1),[p,v]=Object(n.r)(!1),[E,O]=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(b.a)(a):void 0,[e,a]),Object(n.n)(()=>{e||(o(""),d([""]),u(!0),g(!1),v(!1),O(""),j(""),y(!1))},[e]),Object(n.n)(()=>N(c),[N,e]),Object(n.o)(()=>{const e=s.current;e&&E!==e.innerHTML&&(e.innerHTML=E)},[E]);const I=Object(n.m)((e=[])=>{d([...e,""]),requestAnimationFrame(()=>{const e=r.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=l.trim().substring(0,255),n=i.map(e=>e.trim().substring(0,100)).filter(e=>e.length);if(!a||n.length<2)return o(a),n.length?n.length<2?I(n):d(n):I(),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},...h&&{multipleChoice:!0},...p&&{quiz:!0}}};if(p){const{text:e,entities:t}=E&&Object(Vn.a)(E.substring(0,200))||{};c.quiz={correctAnswers:[f],...e&&{solution:e},...t&&{solutionEntities:t}}}t(c)},[e,l,i,p,f,m,h,t,I,E]),w=Object(n.m)((e,t)=>{const a=[...i];a[e]=t,a[a.length-1].trim().length&&a.length<10?I(a):d(a)},[i,I]),P=Object(n.m)(e=>{const t=[...i];t.splice(e,1),d(t),requestAnimationFrame(()=>{r.current&&r.current.classList.toggle("overflown",r.current.scrollHeight>320)})},[i]),M=Object(n.m)(e=>{j(e)},[j]),L=Object(n.m)(e=>{u(e.target.checked)},[]),A=Object(n.m)(e=>{g(e.target.checked)},[]),T=Object(n.m)(e=>{v(e.target.checked)},[]),B=Object(n.m)(e=>{13===e.keyCode&&S()},[S]),x=Object(n.m)(()=>{if(C&&!l.trim().length)return k("lng_polls_choose_question")},[C,k,l]),R=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(ge.a,{label:t!==i.length-1||10===i.length?k("OptionHint"):k("CreatePoll.AddOption"),error:R(t),value:e,onChange:e=>w(t,e.currentTarget.value),onKeyPress:B}),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(be.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(ge.a,{ref:c,label:k("AskAQuestion"),value:l,error:x(),onChange:e=>o(e.currentTarget.value),onKeyPress:B}),n.a.createElement("div",{className:"options-divider"}),n.a.createElement("div",{className:"options-list custom-scroll",ref:r},n.a.createElement("h3",{className:"options-header"},"Options"),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(ra.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(Jt.a,{label:k("PollAnonymous"),checked:m,onChange:L}),n.a.createElement(Jt.a,{label:k("PollMultiple"),checked:h,disabled:p,onChange:A}),n.a.createElement(Jt.a,{label:k("PollQuiz"),checked:p,disabled:h,onChange:T}),p&&n.a.createElement(n.a.Fragment,null,n.a.createElement("h3",{className:"options-header"},"Solution"),n.a.createElement("div",{ref:s,className:"form-control",contentEditable:!0,dir:"auto",onChange:e=>O(e.currentTarget.innerHTML)}),n.a.createElement("div",{className:"note"},k("CreatePoll.ExplanationInfo")))))});let Yn;function Kn(e,t,a=250){const c=Object(n.q)(!1);Object(n.n)(()=>{Yn&&(clearTimeout(Yn),Yn=void 0),e&&!o.l&&(Yn=window.setTimeout(()=>{c.current||t()},2*a))},[e,a,t]);return[Object(n.m)(()=>{c.current=!0},[]),Object(n.m)(()=>{c.current=!1,Yn&&(clearTimeout(Yn),Yn=void 0),Yn=window.setTimeout(()=>{c.current||t()},a)},[a,t])]}var Zn=a(60),Qn=a(137);a(284);var Xn=Object(n.h)(({emoji:e,focus:t,onClick:a})=>{const c=Object(n.m)(()=>{a(e.native,e.id)},[e,a]);return n.a.createElement("div",{className:"EmojiButton "+(t?"focus":""),onClick:c,title:`:${e.names[0]}:`},o.d?n.a.createElement("span",{className:"font-emoji"},e.native):n.a.createElement("img",{src:`./img-apple-64/${e.image}.png`,alt:"",loading:"lazy"}))});var Jn=Object(n.h)(({category:e,index:t,allEmojis:a,observeIntersection:c,shouldRender:r,onEmojiSelect:s})=>{const l=Object(n.q)(null);Object(na.c)(l,c);const{transitionClassNames:i}=Object(W.a)(r,void 0,void 0,"slow"),d=Object(F.a)(),m=o.g?Math.floor((y.a.get().width-8)/44):9,u=44*Math.ceil(e.emojis.length/m);return n.a.createElement("div",{ref:l,key:e.id,id:"emoji-category-"+t,className:"symbol-set"},n.a.createElement("p",{className:"symbol-set-name",dir:"auto"},d("recent"===e.id?"RecentStickers":"Emoji"+t)),n.a.createElement("div",{className:Object(ce.a)("symbol-set-container",i),style:`height: ${u}px;`},r&&e.emojis.map(e=>{const t=a[e],c="id"in t?t:t[1];return n.a.createElement(Xn,{key:c.id,emoji:c,onClick:s})})))});a(285);const ec={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"},tc=[];let ac,nc,cc;var rc=Object(n.h)(Object(c.h)(e=>Object(u.l)(e,["recentEmojis"]))(({className:e,onEmojiSelect:t,recentEmojis:c})=>{const r=Object(n.q)(null),s=Object(n.q)(null),[i,d]=Object(n.r)(),[m,u]=Object(n.r)(),[h,b]=Object(n.r)(0),{observe:g}=Object(na.a)({rootRef:r,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-",""));tc[a]=e.isIntersecting});const t=tc.map((e,t)=>({index:t,isIntersecting:e})).filter(({isIntersecting:e})=>e);t.length&&b(t[Math.floor(t.length/2)].index)});Object(_e.a)(s,!o.g),Object(n.n)(()=>{if(!i)return;const e=s.current;if(!e)return;const t=42*h-e.offsetWidth/2+21;Object(Qn.a)(e,t)},[i,h]);const p=Object(F.a)(),v=Object(n.p)(()=>{if(!i)return qe.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(cc.categories),u(cc.emojis)};cc?e():async function(){ac||(ac=a.e(1).then(a.t.bind(null,311,3)),nc=(await ac).default,cc=Object(Zn.b)(nc));return ac}().then(e)},200)},[]);const E=Object(n.m)(e=>{b(e);const t=document.getElementById("emoji-category-"+e);Object(qn.a)(r.current,t,"start",50,800)},[]),O=Object(n.m)((e,a)=>{t(e,a)},[t]),f=Object(rt.a)([],l.U);const j=Object(ce.a)("EmojiPicker",e);return m&&f?n.a.createElement("div",{className:j},n.a.createElement("div",{ref:s,className:"EmojiPicker-header"},v.map((function(e,t){const a=ec[e.id];return a&&n.a.createElement(D.a,{className:"symbol-set-button "+(t===h?"activated":""),round:!0,faded:!0,color:"translucent",onClick:()=>E(t),ariaLabel:e.name},n.a.createElement("i",{className:a}))}))),n.a.createElement("div",{ref:r,className:"EmojiPicker-main no-selection no-scrollbar"},v.map((e,t)=>n.a.createElement(Jn,{category:e,index:t,allEmojis:m,observeIntersection:g,shouldRender:h>=t-1&&h<=t+1,onEmojiSelect:O})))):n.a.createElement("div",{className:j},n.a.createElement(he.a,null))}));const sc=o.g?8:16;var lc=Object(n.h)(({stickerSet:e,loadAndPlay:t,index:a,observeIntersection:c,shouldRender:r,onStickerSelect:s,onStickerUnfave:i})=>{const d=Object(n.q)(null);Object(na.c)(d,c);const{transitionClassNames:m}=Object(W.a)(r,void 0,void 0,"slow"),u=o.g?Math.floor((y.a.get().width-8)/(l.yb+sc)):5,h=Math.ceil(e.count/u)*(l.yb+sc);return n.a.createElement("div",{ref:d,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(ce.a)("symbol-set-container",m),style:`height: ${h}px;`},r&&e.stickers&&e.stickers.map(a=>n.a.createElement(da,{key:a.id,sticker:a,size:l.yb,observeIntersection:c,noAnimate:!t,onClick:s,clickArg:a,onUnfaveClick:"favorite"===e.id?i:void 0}))))});a(286);const oc=[];var ic=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(u.l)(t,["loadStickerSets","loadRecentStickers","loadFavoriteStickers","loadAddedStickers","addRecentSticker","unfaveSticker"]))(({className:e,loadAndPlay:t,canSendStickers:a,recentStickers:c,favoriteStickers:r,addedSetIds:s,stickerSetsById:o,shouldPlay:i,onStickerSelect:d,loadStickerSets:m,loadRecentStickers:u,loadFavoriteStickers:h,loadAddedStickers:b,addRecentSticker:g,unfaveSticker:p})=>{const v=Object(n.q)(null),E=Object(n.q)(null),[O,f]=Object(n.r)(0),{observe:j}=Object(na.a)({rootRef:v,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-",""));oc[a]=e.isIntersecting});const t=oc.map((e,t)=>({index:t,isIntersecting:e})).filter(({isIntersecting:e})=>e);t.length&&f(t[Math.floor(t.length/2)].index)}),{observe:C}=Object(na.a)({rootRef:E}),y=Object(F.a)(),k=Boolean(s),N=Object(n.p)(()=>s?[{id:"recent",title:y("RecentStickers"),stickers:c,count:c.length},{id:"favorite",title:y("FavoriteStickers"),stickers:r,count:r.length},...s.map(e=>o[e]).filter(Boolean)]:qe.a,[s,y,c,r,o]),I=Object(n.p)(()=>k&&0===N.filter(e=>e.stickers&&e.stickers.length).length,[N,k]);Object(n.n)(()=>{t&&(m(),u(),h())},[t,h,u,m]),Object(n.n)(()=>{s&&s.length&&b()},[s,b]),Object(_e.a)(E),Object(n.n)(()=>{if(!k)return;const e=E.current;if(!e)return;const t=52*O-(e.offsetWidth/2-26);Object(Qn.a)(e,t)},[k,O]);const S=Object(n.m)(e=>{f(e);const t=document.getElementById("sticker-set-"+e);Object(qn.a)(v.current,t,"start",void 0,500)},[]),w=Object(n.m)(e=>{d(e),g({sticker:e})},[g,d]),P=Object(n.m)(e=>{p({sticker:e})},[p]),M=Object(rt.a)([],l.pb);const L=Object(ce.a)("StickerPicker",e);return k&&M&&!I&&a?n.a.createElement("div",{className:L},n.a.createElement("div",{ref:E,className:"StickerPicker-header no-selection no-scrollbar"},N.map((function(e,t){const a=e.stickers&&e.stickers[0],c=Object(ce.a)("symbol-set-button sticker-set-button",t===O&&"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:()=>S(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(oa,{stickerSet:e,observeIntersection:C}):n.a.createElement(ia,{stickerSet:e,observeIntersection:C})):n.a.createElement(da,{key:e.id,sticker:a,size:l.zb,title:e.title,className:c,observeIntersection:C,onClick:S,clickArg:t})}))),n.a.createElement("div",{ref:v,className:"StickerPicker-main no-scrollbar"},N.map((e,a)=>n.a.createElement(lc,{key:e.id,stickerSet:e,loadAndPlay:Boolean(i&&t),index:a,observeIntersection:j,shouldRender:O>=a-1&&O<=a+1,onStickerSelect:w,onStickerUnfave:P})))):n.a.createElement("div",{className:L},a?I?n.a.createElement("div",{className:"picker-disabled"},"You have no saved Stickers."):n.a.createElement(he.a,null):n.a.createElement("div",{className:"picker-disabled"},"Sending stickers is not allowed in this chat."))}));a(287);function dc(){return(dc=Object.assign||function(e){for(var t=1;t{const s=Object(n.q)(null),l=Object(n.q)(null),o=e.thumbnail&&!!e.thumbnail.dataUri,i="gif"+e.id,d=Object(na.b)(s,t)&&!a,m=Object(v.a)(i+"?size=m",!d,r.ApiMediaFormat.BlobUrl),u=Object(ka.a)(e.thumbnail&&e.thumbnail.dataUri,Boolean(m)),h=Object(v.a)(i,!d,r.ApiMediaFormat.BlobUrl),b=Boolean(d&&h),{transitionClassNames:g}=Object(sa.a)(o||m||h,"slow"),{isBuffered:p,bufferingHandlers:E}=Object(Y.a)(!0),O=d&&!p;Object(Z.a)(l,[b]);const f=Object(n.m)(()=>c({...e,blobUrl:h}),[c,e,h]),j=Object(ce.a)("GifButton",e.width&&e.height&&e.width({savedGifs:e.gifs.saved.gifs}),(e,t)=>Object(u.l)(t,["loadSavedGifs"]))(({className:e,loadAndPlay:t,canSendGifs:a,savedGifs:c,onGifSelect:r,loadSavedGifs:s})=>{const o=Object(n.q)(null),{observe:i}=Object(na.a)({rootRef:o,debounceMs:300});Object(n.n)(()=>{t&&s()},[t,s]);const d=Object(rt.a)([],l.pb);return n.a.createElement("div",{ref:o,className:Object(ce.a)("GifPicker no-scrollbar",e)},a?d&&c&&c.length?c.map(e=>n.a.createElement(mc,{key:e.id,gif:e,observeIntersection:i,isDisabled:!t,onClick:r})):d&&c?n.a.createElement("div",{className:"picker-disabled"},"No saved GIFs."):n.a.createElement(he.a,null):n.a.createElement("div",{className:"picker-disabled"},"Sending GIFs is not allowed in this chat."))}));let hc;!function(e){e[e.Emoji=0]="Emoji",e[e.Stickers=1]="Stickers",e[e.GIFs=2]="GIFs"}(hc||(hc={}));const bc=Object.values(hc).filter(e=>"string"==typeof e),gc={[hc.Emoji]:"icon-smile",[hc.Stickers]:"icon-stickers",[hc.GIFs]:"icon-gifs"};var pc=Object(n.h)(({activeTab:e,onSwitchTab:t,onRemoveSymbol:a,onSearchOpen:c})=>{function r(a){return n.a.createElement(D.a,{className:"symbol-tab-button "+(e===a?"activated":""),onClick:()=>t(a),ariaLabel:bc[a],round:!0,faded:!0,color:"translucent"},n.a.createElement("i",{className:gc[a]}))}const s=Object(n.m)(()=>{c(e===hc.Stickers?"stickers":"gifs")},[e,c]);return n.a.createElement("div",{className:"SymbolMenu-footer",onClick:function(e){e.stopPropagation()}},e!==hc.Emoji&&n.a.createElement(D.a,{className:"symbol-search-button",ariaLabel:e===hc.Stickers?"Search Stickers":"Search GIFs",round:!0,faded:!0,color:"translucent",onClick:s},n.a.createElement("i",{className:"icon-search"})),r(hc.Emoji),r(hc.Stickers),r(hc.GIFs),e===hc.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(289);let vc=!1;var Ec=Object(n.h)(({isOpen:e,allowedAttachmentOptions:t,onLoad:a,onClose:c,onEmojiSelect:r,onStickerSelect:s,onGifSelect:l,onRemoveSymbol:i,onSearchOpen:d,addRecentEmoji:m})=>{const[u,h]=Object(n.r)(0),[b,g]=Object(n.r)([]),[p,v]=Kn(e,c),{shouldRender:E,transitionClassNames:O}=Object(W.a)(e,c,!1,!1);!vc&&e&&(vc=!0),Object(n.n)(()=>{a()},[a]),Object(n.o)(()=>{if(o.g)return e&&(document.body.classList.add("enable-symbol-menu-transforms"),document.body.classList.add("is-symbol-menu-open")),()=>{e&&Object(_.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)(b);f.current=b,Object(n.n)(()=>{f.current.length&&(f.current.forEach(e=>{m({emoji:e})}),g([]))},[e,u,m]);const j=Object(n.m)((e,t)=>{g(e=>[...e,t]),r(e)},[r]),C=Object(n.m)(e=>{c(),d(e)},[c,d]),y=Object(F.a)(),{canSendStickers:k,canSendGifs:N}=t;function I(t,a){switch(u){case hc.Emoji:return n.a.createElement(rc,{className:"picker-tab",onEmojiSelect:j});case hc.Stickers:return n.a.createElement(ic,{className:"picker-tab",loadAndPlay:!!k&&(e&&(t||a)),canSendStickers:k,onStickerSelect:s});case hc.GIFs:return n.a.createElement(uc,{className:"picker-tab",loadAndPlay:!!N&&(e&&(t||a)),canSendGifs:N,onGifSelect:l})}}const S=n.a.createElement(n.a.Fragment,null,n.a.createElement("div",{className:"SymbolMenu-main",onClick:function(e){e.stopPropagation()}},vc&&n.a.createElement(T.a,{name:"slide",activeKey:u,renderCount:bc.length},I)),o.g&&n.a.createElement(D.a,{round:!0,faded:!0,color:"translucent",ariaLabel:y("Close"),className:"symbol-close-button",size:"tiny",onClick:c},n.a.createElement("i",{className:"icon-close"})),n.a.createElement(pc,{activeTab:u,onSwitchTab:h,onRemoveSymbol:i,onSearchOpen:C}));if(o.g){if(!E)return;const e=Object(ce.a)("SymbolMenu mobile-menu",O);return n.a.createElement(Pn.a,null,n.a.createElement("div",{className:e},S))}return n.a.createElement(Nn.a,{isOpen:e,positionX:"left",positionY:"bottom",onClose:c,className:"SymbolMenu",onCloseAnimationEnd:c,onMouseEnter:o.l?void 0:p,onMouseLeave:o.l?void 0:v,noCloseOnBackdrop:!o.l},S)});a(290);var Oc=Object(n.h)(({isOpen:e,allowedAttachmentOptions:t,onFileSelect:a,onPollCreate:c,onClose:r})=>{const[s,i]=Kn(e,r),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)(()=>{pa(l.l,e=>d(e,!0))},[d]),u=Object(n.m)(()=>{pa("*",e=>d(e,!1))},[d]),h=Object(F.a)(),{canAttachMedia:b,canAttachPolls:g}=t;return n.a.createElement(Nn.a,{isOpen:e,autoClose:!0,positionX:"right",positionY:"bottom",onClose:r,className:"AttachMenu fluid",onCloseAnimationEnd:r,onMouseEnter:o.l?void 0:s,onMouseLeave:o.l?void 0:i,noCloseOnBackdrop:!o.l},!b&&n.a.createElement(z.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(z.a,{icon:"photo",onClick:m},h("AttachmentMenu.PhotoOrVideo")),n.a.createElement(z.a,{icon:"document",onClick:u},"Document")),g&&n.a.createElement(z.a,{icon:"poll",onClick:c},h("Poll")))});a(291);var fc=Object(n.h)(Object(c.h)(e=>{const{stickers:t}=e.stickers.forEmoji;return{stickers:t}},(e,t)=>Object(u.l)(t,["clearStickersForEmoji"]))(({isOpen:e,onStickerSelect:t,stickers:a,clearStickersForEmoji:c})=>{const r=Object(n.q)(null),{shouldRender:s,transitionClassNames:i}=Object(W.a)(e,void 0,void 0,!1),d=Object(f.a)(a,!0),m=a||d,{observe:u}=Object(na.a)({rootRef:r,throttleMs:200});Object(n.n)(()=>e?Object(b.a)(c):void 0,[e,c]);const h=Object(ce.a)("StickerTooltip composer-tooltip custom-scroll",i,!(m&&m.length)&&"hidden");return n.a.createElement("div",{ref:r,className:h,onMouseEnter:o.l?void 0:()=>{document.body.classList.add("no-select")},onMouseLeave:o.l?void 0:()=>{document.body.classList.remove("no-select")}},s&&m?m.map(e=>n.a.createElement(da,{key:e.id,sticker:e,size:l.yb,observeIntersection:u,onClick:t,clickArg:e})):s?n.a.createElement(he.a,null):void 0)}));a(292);var jc=Object(n.h)(Object(c.h)((e,{messageId:t})=>{const{chatId:a}=Object(d.y)(e)||{};return a?{message:Object(d.k)(e,a,t)}:{}},(e,t)=>Object(u.l)(t,["clickInlineButton"]))(({isOpen:e,message:t,onClose:a,clickInlineButton:c})=>{const[r,s]=Kn(e,a);if(t&&t.keyboardButtons)return n.a.createElement(Nn.a,{isOpen:e,autoClose:!0,positionX:"right",positionY:"bottom",onClose:a,className:"KeyboardMenu",onCloseAnimationEnd:a,onMouseEnter:o.l?void 0:r,onMouseLeave:o.l?void 0:s,noCloseOnBackdrop:!o.l},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(293);var Cc=Object(n.h)(({isOpen:e,onSilentSend:t,onScheduleSend:a,onClose:c,onCloseAnimationEnd:r})=>{const[s,l]=Kn(e,c),i=Object(F.a)();return n.a.createElement(Nn.a,{isOpen:e,autoClose:!0,positionX:"right",positionY:"bottom",className:"CustomSendMenu",onClose:c,onCloseAnimationEnd:r,onMouseEnter:o.l?void 0:s,onMouseLeave:o.l?void 0:l,noCloseOnBackdrop:!o.l},t&&n.a.createElement(z.a,{icon:"mute",onClick:t},i("SendWithoutSound")),a&&n.a.createElement(z.a,{icon:"schedule",onClick:a},i("ScheduleMessage")))}),yc=a(134),kc=a(159),Nc=a(170);a(294);var Ic=Object(n.h)(({isOpen:e,emojis:t,onClose:a,onEmojiSelect:c,addRecentEmoji:r})=>{const s=Object(n.q)(null),{shouldRender:l,transitionClassNames:i}=Object(W.a)(e,void 0,void 0,!1),d=Object(Nc.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}=Un(a,".EmojiButton",8,!0,!0,!0);if(!c.length||!c[e])return;const r=n[0];if(!n.includes(e)||e===r&&!Gn(a,c[r],!0)){const t="start"===(e>n[n.length-1]?"start":"end")?44*e:0;Object(Qn.a)(a,t)}}(m,s)},[m]);const h=Object(n.m)(e=>{if(!t.length)return-1;const a=t.length;return Object(zn.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(),c(a.native),r({emoji:a.id}))}},[r,t,c,m]);Object(n.n)(()=>e?Object(xe.a)({onEsc:a,onLeft:e=>b(-1,e),onRight:e=>b(1,e),onEnter:g}):void 0,[b,g,e,a]);const p=Object(ce.a)("EmojiTooltip composer-tooltip custom-scroll-x",i);return n.a.createElement("div",{ref:s,className:p,onMouseEnter:o.l?void 0:()=>{document.body.classList.add("no-select")},onMouseLeave:o.l?void 0:()=>{document.body.classList.remove("no-select")}},l&&d?d.map((e,t)=>n.a.createElement(Xn,{key:e.id,emoji:e,focus:m===t,onClick:c})):l?n.a.createElement(he.a,null):void 0)}),Sc=a(166);a(295);var wc=Object(n.h)(Object(c.h)((e,{chatId:t})=>{const a=Object(d.f)(e,t),n=a&&Object(d.m)(e,a.id);if(!a||!n)return{};const{query:c,results:r}=Object(d.A)(e)||{},{totalCount:s,foundIds:l}=r||{};return{chat:a,messagesById:n,query:c,totalCount:s,foundIds:l}},(e,t)=>Object(u.l)(t,["searchTextMessagesLocal","focusMessage"]))(({chatId:e,threadId:t,chat:a,messagesById:r,query:s,totalCount:l,foundIds:o,searchTextMessagesLocal:i,focusMessage:h})=>{const b=Object(F.a)(),g=Object(n.p)(()=>{if(!(s&&o&&o.length&&r))return qe.a;const n=o.map(n=>{const s=r[n];if(!s)return;const l=s.senderId?Object(d.Fb)(Object(c.e)(),s.senderId):void 0;let o;if(a&&Object(m.jb)(a))o=a;else if(s.forwardInfo){const{isChannelPost:e,fromChatId:t}=s.forwardInfo;o=e&&t?Object(d.f)(Object(c.e)(),t):void 0}else o=s.senderId?Object(d.f)(Object(c.e)(),s.senderId):void 0;return{message:s,senderUser:l,senderChat:o,onClick:()=>h({chatId:e,threadId:t,messageId:n})}}).filter(Boolean);return Object(u.k)(n,({message:e})=>e.date,"desc")},[e,t,h,o,a,r,s]);return n.a.createElement(pe.a,{className:"RightSearch custom-scroll",items:g,preloadBackwards:0,onLoadMore:i,noFastList:!0},n.a.createElement("p",{className:"helper-text",dir:"auto"},s?0!==l&&g.length?1===l?"1 message found":(g.length&&(l||g.length))+" messages found":b("lng_search_no_results"):b("lng_dlg_search_for_messages")),g.map(({message:e,senderUser:t,senderChat:a,onClick:c})=>{const r=a?Object(m.l)(b,a):Object(m.Z)(t),l=Object(m.N)(b,e);return n.a.createElement(ve.a,{className:"chat-item-clickable search-result-message m-0",onClick:c},n.a.createElement(R.a,{chat:a,user:t}),n.a.createElement("div",{className:"info"},n.a.createElement("div",{className:"title"},n.a.createElement("h3",{dir:"auto"},r&&Object(x.a)(r)),n.a.createElement(Sc.a,{message:e})),n.a.createElement("div",{className:"subtitle",dir:"auto"},Object(x.a)(l,["emoji","highlight"],{highlight:s}))))}))})),Pc=a(108);var Mc=Object(n.h)(Object(c.h)((e,{stickerSetId:t})=>({set:Object(d.wb)(e,t),shouldPlay:Object(d.vb)(e)}),(e,t)=>Object(u.l)(t,["loadStickers","toggleStickerSet"]))(({stickerSetId:e,observeIntersection:t,set:a,shouldPlay:c,loadStickers:r,toggleStickerSet:s,isSomeModalOpen:o,onModalToggle:i})=>{const d=Object(F.a)(),m=a&&Boolean(a.installedDate),u=Boolean(a&&a.stickers),[h,b,g]=Object(Be.a)();Object(Pc.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&&r({stickerSetId:e})},[u,p.length,r,e]);const v=Object(n.m)(()=>{s({stickerSetId:e})},[s,e]);if(!a)return;const E=p.length>0;return n.a.createElement("div",{key:a.id,className:"sticker-set"},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"},!E&&n.a.createElement(L.a,null),E&&p.map(e=>n.a.createElement(da,{sticker:e,size:l.Ab,observeIntersection:t,noAnimate:!c||h||o,onClick:b}))),E&&n.a.createElement(ua.a,{isOpen:h,fromSticker:p[0],onClose:g}))}));a(296);const Fc=Object(_.g)(e=>e(),6e4,!0);var Lc=Object(n.h)(Object(c.h)(e=>{const t=Object(d.z)(e),{query:a,resultIds:n}=t||{},{featured:c}=e.stickers;return{query:a,featuredIds:c.setIds,resultIds:n}},(e,t)=>Object(u.l)(t,["loadFeaturedStickers"]))(({query:e,featuredIds:t,resultIds:a,loadFeaturedStickers:c})=>{const r=Object(n.q)(null),[s,l]=Object(n.r)(!1),{observe:o}=Object(na.a)({rootRef:r,throttleMs:200});return Object(n.n)(()=>{Fc(()=>{c()})}),n.a.createElement("div",{ref:r,className:"StickerSearch custom-scroll"},function(){if(void 0!==e)return!e&&t?t.map(e=>n.a.createElement(Mc,{key:e,stickerSetId:e,observeIntersection:o,isSomeModalOpen:s,onModalToggle:l})):a?a.length?a.map(e=>n.a.createElement(Mc,{key:e,stickerSetId:e,observeIntersection:o,isSomeModalOpen:s,onModalToggle:l})):n.a.createElement("p",{className:"helper-text"},"Nothing found."):n.a.createElement(he.a,null)}())}));a(297);var Ac=Object(n.h)(Object(c.h)(e=>{const t=Object(d.s)(e),{query:a,results:n}=t||{},{chatId:c}=Object(d.y)(e)||{},r=c?Object(d.f)(e,c):void 0;return{query:a,results:n,chat:r,isChatWithBot:r?Object(d.N)(e,r):void 0}},(e,t)=>Object(u.l)(t,["searchMoreGifs","sendMessage","setGifSearchQuery"]))(({query:e,results:t,chat:a,isChatWithBot:c,searchMoreGifs:r,sendMessage:s,setGifSearchQuery:l})=>{const i=Object(n.q)(null),{observe:d}=Object(na.a)({rootRef:i,debounceMs:300}),{canSendGifs:u}=Object(m.c)(a,c),h=Object(n.m)(e=>{u&&s({gif:e}),o.l&&l({query:void 0})},[u,s,l]),b=Object(F.a)();const g=Boolean(void 0!==e&&t&&t.length);return n.a.createElement("div",{className:"GifSearch"},n.a.createElement(pe.a,{ref:i,className:Object(ce.a)("gif-container custom-scroll",g&&"grid"),items:t,itemSelector:".GifButton",preloadBackwards:96,noFastList:!0,onLoadMore:r},function(){if(void 0!==e)return t?t.length?t.map(e=>n.a.createElement(mc,{key:e.id,gif:e,observeIntersection:d,onClick:h})):n.a.createElement("p",{className:"helper-text",dir:"auto"},b("NoGIFsFound")):n.a.createElement(he.a,null)}()))}));a(298);var Tc=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(u.l)(t,["loadPollOptionResults","openChat","closePollResults"]))(({chat:e,message:t,answer:a,answerVote:c,totalVoters:r,voters:s,offset:l,loadPollOptionResults:o,openChat:i,closePollResults:d})=>{const m=Object(f.a)(c.votersCount),[u,h]=Object(n.r)(!0),b=Boolean(s),{option:g,text:p}=a;Object(n.n)(()=>{b&&m===c.votersCount||o({chat:e,messageId:t.id,option:g,offset:l,limit:4,shouldResetVoters:!0})},[c.votersCount,b]);const v=Object(n.m)(()=>{h(!0),o({chat:e,messageId:t.id,option:g,offset:l,limit:50})},[e,o,t.id,l,g]);Object(n.n)(()=>{h(!1)},[s]);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"},s?s.map(e=>n.a.createElement(ve.a,{key:e,className:"chat-item-clickable",onClick:()=>E(e)},n.a.createElement(Ee.a,{avatarSize:"tiny",userId:e,forceShowSelf:!0,noStatusOrTyping:!0}))):n.a.createElement(he.a,null),s&&function(){const e=c.votersCount-s.length;return c.votersCount>4&&e>0&&n.a.createElement(Kt,{count:e,itemName:"voter",isLoading:u,onClick:v})}()),n.a.createElement("div",{className:"answer-head"},n.a.createElement("span",{className:"answer-title",dir:"auto"},p),n.a.createElement("span",{className:"answer-percent"},(O=c.votersCount,(j=r)>0?(O/j*100).toFixed():0),"%")));var O,j}));a(299);var Dc=Object(n.h)(Object(c.h)(e=>{const{pollResults:{chatId:t,messageId:a},lastSyncTime:n}=e;if(!t||!a)return{};return{chat:Object(d.f)(e,t),message:Object(d.k)(e,t,a),lastSyncTime:n}})(({chat:e,message:t,lastSyncTime:a})=>{if(!t||!e)return n.a.createElement(he.a,null);const{summary:c,results:r}=Object(m.H)(t);if(!r.results)return;const s=Object(u.c)(r.results,"option");return n.a.createElement("div",{className:"PollResults"},n.a.createElement("h3",{className:"poll-question",dir:"auto"},c.question),n.a.createElement("div",{className:"poll-results-list custom-scroll"},a&&c.answers.map(a=>n.a.createElement(Tc,{key:`${t.id}-${a.option}`,chat:e,message:t,answer:a,answerVote:s[a.option],totalVoters:r.totalVoters})),!a&&n.a.createElement(he.a,null)))}));a(161);var Bc=Object(n.h)(Object(c.h)((e,{userId:t})=>{const a=Object(d.Fb)(e,t),n=Object(d.f)(e,t),{progress:c}=e.management;return{user:a,chat:n,progress:c}},(e,t)=>Object(u.l)(t,["updateContact","deleteUser","closeManagement","openChat","deleteHistory"]))(({userId:e,user:t,chat:a,progress:c,updateContact:r,deleteUser:l,deleteHistory:o,closeManagement:i,openChat:d})=>{const[m,u,h]=Object(Be.a)(),[b,g]=Object(n.r)(!1),[p,v]=Object(n.r)(),E=Object(F.a)(),O=t&&t.firstName||"",f=t&&t.lastName||"",j=a?a.isMuted:void 0,[C,y]=Object(n.r)(O),[k,N]=Object(n.r)(f),[I,S]=Object(n.r)(!j);Object(n.n)(()=>{S(!j)},[j]),Object(n.n)(()=>{g(!1),h()},[h,e]),Object(n.n)(()=>{y(O),N(f)},[O,f,t]),Object(n.n)(()=>{c===s.f.Complete&&(g(!1),v(void 0),h())},[h,c]);const w=Object(n.m)(e=>{y(e.target.value),g(!0)},[]),P=Object(n.m)(e=>{N(e.target.value),g(!0)},[]),M=Object(n.m)(e=>{S(e.target.checked),g(!0)},[]),A=Object(n.m)(()=>{const t=C.trim(),a=k.trim();t.length||v("Please provide first name"),r({userId:e,isMuted:!I,firstName:t,lastName:a})},[C,k,r,e,I]),T=Object(n.m)(()=>{a.lastMessage&&o({chatId:a.id,maxId:a.lastMessage.id,shouldDeleteForAll:!1}),l({userId:e}),h(),i(),d({id:void 0})},[a.id,a.lastMessage,h,i,o,l,d,e]);if(!t)return;const D=c===s.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(Ee.a,{userId:t.id,avatarSize:"jumbo",status:"original name",withFullInfo:!0}),n.a.createElement(ge.a,{id:"user-first-name",label:E("UserInfo.FirstNamePlaceholder"),onChange:w,value:C,error:"Please provide first name"===p?p:void 0}),n.a.createElement(ge.a,{id:"user-last-name",label:E("UserInfo.LastNamePlaceholder"),onChange:P,value:k}),n.a.createElement("div",{className:"ListItem no-selection narrow"},n.a.createElement(Jt.a,{checked:I,label:E("Notifications"),subLabel:E(I?"UserInfo.NotificationsEnabled":"UserInfo.NotificationsDisabled"),onChange:M}))),n.a.createElement("div",{className:"section"},n.a.createElement(ve.a,{icon:"delete",ripple:!0,destructive:!0,onClick:u},E("DeleteContact")))),n.a.createElement(Rt,{isShown:b,onClick:A,disabled:D,ariaLabel:E("Save")},D?n.a.createElement(L.a,{color:"white"}):n.a.createElement("i",{className:"icon-check"})),n.a.createElement(Se.a,{isOpen:m,onClose:h,text:E("AreYouSureDeleteContact"),confirmLabel:E("DeleteContact"),confirmHandler:T,confirmIsDestructive:!0}))}));var xc=Object(n.h)(Object(c.h)((e,{chatId:t})=>{const a=Object(d.f)(e,t),{progress:n}=e.management,c=Boolean(a.fullInfo&&a.fullInfo.linkedChatId);return{chat:a,progress:n,isBasicGroup:Object(m.ib)(a),hasLinkedChannel:c,canChangeInfo:Object(m.q)(a,"changeInfo"),canBanUsers:Object(m.q)(a,"banUsers")}},(e,t)=>Object(u.l)(t,["togglePreHistoryHidden","updateChat","closeManagement","deleteHistory","leaveChannel","deleteChannel","openChat"]))(({chatId:e,chat:t,progress:a,isBasicGroup:c,hasLinkedChannel:l,canChangeInfo:o,canBanUsers:i,onScreenSelect:d,togglePreHistoryHidden:u,updateChat:h,deleteHistory:b,leaveChannel:g,deleteChannel:p,closeManagement:E,openChat:O})=>{const[f,j,C]=Object(Be.a)(),y=t.title,k=t.fullInfo&&t.fullInfo.about||"",[N,I]=Object(n.r)(!1),[S,w]=Object(n.r)(y),[P,M]=Object(n.r)(k),[A,T]=Object(n.r)(),[D,B]=Object(n.r)(),R=Object(m.f)(t),U=Object(v.a)(R,!1,r.ApiMediaFormat.BlobUrl),G=Object(F.a)();Object(n.n)(()=>{a===s.f.Complete&&(I(!1),B(void 0))},[a]);const q=Object(n.m)(()=>{d(s.g.ChatPrivacyType)},[d]),z=Object(n.m)(()=>{d(s.g.Discussion)},[d]),$=Object(n.m)(()=>{d(s.g.GroupPermissions)},[d]),H=Object(n.m)(()=>{d(s.g.ChatAdministrators)},[d]),_=Object(n.m)(e=>{T(e),I(!0)},[]),V=Object(n.m)(e=>{w(e.target.value),I(!0)},[]),W=Object(n.m)(e=>{M(e.target.value),I(!0)},[]),Y=Object(n.m)(()=>{const t=S.trim(),a=P.trim();t.length?h({chatId:e,title:t,about:a,photo:A}):B("Group title can't be empty")},[P,e,A,S,h]),K=Object(n.m)(()=>{d(s.g.GroupMembers)},[d]),Z=Object(n.m)(()=>{if(!t.fullInfo)return;const{isPreHistoryHidden:e}=t.fullInfo;u({chatId:t.id,isEnabled:!e})},[t,u]),Q=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]),X=t.fullInfo&&t.fullInfo.adminMembers&&t.fullInfo.adminMembers.length||0,J=Object(n.m)(()=>{c?b({chatId:t.id,maxId:t.lastMessage.id,shouldDeleteForAll:!1}):t.isCreator?p({chatId:t.id}):g({chatId:t.id}),C(),E(),O({id:void 0})},[c,t.isCreator,t.id,t.lastMessage,C,E,b,g,p,O]);if(t.isRestricted)return;const ee=a===s.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(xt.a,{currentAvatarBlobUrl:U,onChange:_,disabled:!o}),n.a.createElement(ge.a,{id:"group-title",label:G("GroupName"),onChange:V,value:S,error:"Group title can't be empty"===D?D:void 0,disabled:!o}),n.a.createElement(ge.a,{id:"group-about",className:"mb-2",label:G("DescriptionPlaceholder"),onChange:W,value:P,disabled:!o}),t.isCreator&&n.a.createElement(ve.a,{icon:"lock",multiline:!0,ripple:!0,onClick:q},n.a.createElement("span",{className:"title"},G("GroupType")),n.a.createElement("span",{className:"subtitle"},t.username?G("TypePublic"):G("TypePrivate"))),l&&n.a.createElement(ve.a,{icon:"message",multiline:!0,ripple:!0,onClick:z},n.a.createElement("span",{className:"title"},G("LinkedChannel")),n.a.createElement("span",{className:"subtitle"},G("DiscussionUnlink"))),n.a.createElement(ve.a,{icon:"permissions",multiline:!0,ripple:!0,onClick:$,disabled:!i},n.a.createElement("span",{className:"title"},G("ChannelPermissions")),n.a.createElement("span",{className:"subtitle"},Q,"/",8)),n.a.createElement(ve.a,{icon:"admin",multiline:!0,ripple:!0,onClick:H},n.a.createElement("span",{className:"title"},G("ChannelAdministrators")),n.a.createElement("span",{className:"subtitle"},Object(la.a)(X)))),n.a.createElement("div",{className:"section"},n.a.createElement(ve.a,{icon:"group",multiline:!0,ripple:!0,onClick:K},n.a.createElement("span",{className:"title"},G("GroupMembers")),n.a.createElement("span",{className:"subtitle"},Object(la.a)(t.membersCount))),t.fullInfo&&n.a.createElement("div",{className:"ListItem narrow no-selection"},n.a.createElement(Jt.a,{checked:!t.fullInfo.isPreHistoryHidden,label:G("ChatHistory"),onChange:Z,disabled:!i}))),n.a.createElement("div",{className:"section"},n.a.createElement(ve.a,{icon:"delete",ripple:!0,destructive:!0,onClick:j},G("DeleteMega")))),n.a.createElement(Rt,{isShown:N,onClick:Y,disabled:ee,ariaLabel:G("Save")},ee?n.a.createElement(L.a,{color:"white"}):n.a.createElement("i",{className:"icon-check"})),n.a.createElement(Se.a,{isOpen:f,onClose:C,textParts:Object(x.a)(c||!t.isCreator?G("AreYouSureDeleteAndExit"):G("AreYouSureDeleteThisChatWithGroup",t.title),["br","simple_markdown"]),confirmLabel:c||!t.isCreator?G("DeleteMega"):G("DeleteGroupForAll"),confirmHandler:J,confirmIsDestructive:!0}))}));var Rc=Object(n.h)(Object(c.h)((e,{chatId:t})=>({chat:Object(d.f)(e,t),currentUserId:e.currentUserId}),(e,t)=>Object(u.l)(t,["updateChatDefaultBannedRights"]))(({onScreenSelect:e,onChatMemberSelect:t,chat:a,currentUserId:c,updateChatDefaultBannedRights:r})=>{const[l,o]=Object(n.r)({}),[i,d]=Object(n.r)(!1),[m,u]=Object(n.r)(!1),h=Object(F.a)(),b=Object(n.m)(()=>{e(s.g.GroupRemovedUsers)},[e]),g=Object(n.m)(()=>{e(s.g.GroupUserPermissionsCreate)},[e]),p=Object(n.m)(a=>{t(a.userId,a.promotedByUserId===c),e(s.g.GroupUserPermissions)},[c,t,e]);Object(n.n)(()=>{o(a&&a.defaultBannedRights||{}),d(!1),setTimeout(()=>{u(!1)},250)},[a]);const v=Object(n.m)(e=>{const{name:t}=e.target;function a(e){return!e||void 0}o(e=>({...e,[t]:a(e[t]),..."sendStickers"===t&&{sendGifs:a(e[t])}})),d(!0)},[]),E=Object(n.m)(()=>{a&&(u(!0),r({chatId:a.id,bannedRights:l}))},[a,l,r]),O=Object(n.p)(()=>a&&a.fullInfo&&a.fullInfo.kickedMembers?a.fullInfo.kickedMembers.length:0,[a]),f=Object(n.p)(()=>a&&a.fullInfo&&a.fullInfo.members?a.fullInfo.members.filter(({bannedRights:e})=>!!e):[],[a]),j=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 r=h(c);return`${e}${e.length?", "+r:r}`},"")},[a,h]);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"},h("ChannelPermissionsHeader")),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(Jt.a,{name:"sendMessages",checked:!l.sendMessages,label:h("UserRestrictionsSend"),blocking:!0,onChange:v})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(Jt.a,{name:"sendMedia",checked:!l.sendMedia,label:h("UserRestrictionsSendMedia"),blocking:!0,onChange:v})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(Jt.a,{name:"sendStickers",checked:!l.sendStickers&&!l.sendGifs,label:h("UserRestrictionsSendStickers"),blocking:!0,onChange:v})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(Jt.a,{name:"sendPolls",checked:!l.sendPolls,label:h("UserRestrictionsSendPolls"),blocking:!0,onChange:v})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(Jt.a,{name:"embedLinks",checked:!l.embedLinks,label:h("UserRestrictionsEmbedLinks"),blocking:!0,onChange:v})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(Jt.a,{name:"inviteUsers",checked:!l.inviteUsers,label:h("UserRestrictionsInviteUsers"),blocking:!0,onChange:v})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(Jt.a,{name:"pinMessages",checked:!l.pinMessages,label:h("UserRestrictionsPinMessages"),blocking:!0,onChange:v})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(Jt.a,{name:"changeInfo",checked:!l.changeInfo,label:h("UserRestrictionsChangeInfo"),blocking:!0,onChange:v}))),n.a.createElement("div",{className:"section"},n.a.createElement(ve.a,{icon:"delete-user",multiline:!0,ripple:!0,narrow:!0,onClick:b},n.a.createElement("span",{className:"title"},h("ChannelBlockedUsers")),n.a.createElement("span",{className:"subtitle"},O))),n.a.createElement("div",{className:"section"},n.a.createElement("h3",{className:"section-heading"},h("PrivacyExceptions")),n.a.createElement(ve.a,{icon:"add-user",ripple:!0,onClick:g},h("ChannelAddException")),f.map(e=>n.a.createElement(ve.a,{key:e.userId,className:"chat-item-clickable exceptions-member",ripple:!0,onClick:()=>p(e)},n.a.createElement(Ee.a,{userId:e.userId,status:j(e)}))))),n.a.createElement(Rt,{isShown:i,onClick:E,ariaLabel:h("Save"),disabled:m},m?n.a.createElement(L.a,{color:"white"}):n.a.createElement("i",{className:"icon-check"})))}));var Uc=Object(n.h)(Object(c.h)((e,{chatId:t})=>{const a=Object(d.f)(e,t),{byId:n}=e.users;return{chat:a,usersById:n}},(e,t)=>Object(u.l)(t,["updateChatMemberBannedRights"]))(({chat:e,usersById:t,updateChatMemberBannedRights:a})=>{const c=Object(F.a)(),r=Object(n.p)(()=>e&&e.fullInfo&&e.fullInfo.kickedMembers?e.fullInfo.kickedMembers:[],[e]),s=Object(n.m)(e=>{if(!e.kickedByUserId)return;const a=t[e.kickedByUserId];return a?c("UserRemovedBy",Object(m.Z)(a)):void 0},[c,t]),l=Object(n.m)(t=>{if(e)return[{title:c("Unblock"),icon:"delete",destructive:!0,handler:()=>a({chatId:e.id,userId:t.userId,bannedRights:{}})}]},[c,e,a]);return n.a.createElement("div",{className:"Management"},n.a.createElement("div",{className:"custom-scroll"},n.a.createElement("div",{className:"section"},n.a.createElement("p",{className:"text-muted"},c("NoBlockedGroup2")),r.map(e=>n.a.createElement(ve.a,{key:e.userId,className:"chat-item-clickable",ripple:!0,contextActions:l(e)},n.a.createElement(Ee.a,{userId:e.userId,status:s(e)}))))))}));var Gc=Object(n.h)(Object(c.h)((e,{chatId:t})=>{const a=Object(d.f)(e,t),{progress:n}=e.management;return{chat:a,progress:n,isSignaturesShown:Boolean(a&&a.isSignaturesShown),canChangeInfo:Object(m.q)(a,"changeInfo")}},(e,t)=>Object(u.l)(t,["toggleSignatures","updateChat","closeManagement","leaveChannel","deleteChannel","openChat"]))(({chatId:e,chat:t,progress:a,isSignaturesShown:c,canChangeInfo:l,onScreenSelect:o,updateChat:i,toggleSignatures:d,closeManagement:u,leaveChannel:h,deleteChannel:b,openChat:g})=>{const p=t&&t.title||"",E=t&&t.fullInfo&&t.fullInfo.about||"",O=t&&t.fullInfo&&t.fullInfo.linkedChatId,[f,j,C]=Object(Be.a)(),[y,k]=Object(n.r)(!1),[N,I]=Object(n.r)(p),[S,w]=Object(n.r)(E),[P,M]=Object(n.r)(),[A,T]=Object(n.r)(),D=t&&Object(m.f)(t),B=Object(v.a)(D,!1,r.ApiMediaFormat.BlobUrl),x=Object(F.a)();Object(n.n)(()=>{a===s.f.Complete&&(k(!1),T(void 0))},[a]);const R=t&&t.fullInfo&&t.fullInfo.adminMembers&&t.fullInfo.adminMembers.length||0,U=Object(n.m)(()=>{o(s.g.ChatPrivacyType)},[o]),G=Object(n.m)(()=>{o(s.g.Discussion)},[o]),q=Object(n.m)(()=>{o(s.g.ChatAdministrators)},[o]),z=Object(n.m)(e=>{M(e),k(!0)},[]),$=Object(n.m)(e=>{I(e.target.value),k(!0)},[]),H=Object(n.m)(e=>{w(e.target.value),k(!0)},[]),_=Object(n.m)(()=>{const t=N.trim(),a=S.trim();t.length?i({chatId:e,title:t,about:a,photo:P}):T("Channel title can't be empty")},[S,e,P,N,i]),V=Object(n.m)(()=>{d({chatId:e,isEnabled:!c})},[e,c,d]),W=Object(n.m)(()=>{o(s.g.ChannelSubscribers)},[o]),Y=Object(n.m)(()=>{t.isCreator?b({chatId:t.id}):h({chatId:t.id}),C(),u(),g({id:void 0})},[t.isCreator,t.id,C,u,h,b,g]);if(t.isRestricted)return;const K=a===s.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(xt.a,{currentAvatarBlobUrl:B,onChange:z,disabled:!l}),n.a.createElement(ge.a,{id:"channel-title",label:x("EnterChannelName"),onChange:$,value:N,error:"Channel title can't be empty"===A?A:void 0,disabled:!l}),n.a.createElement(ge.a,{id:"channel-about",className:"mb-2",label:x("DescriptionPlaceholder"),onChange:H,value:S,disabled:!l}),t.isCreator&&n.a.createElement(ve.a,{icon:"lock",ripple:!0,multiline:!0,onClick:U},n.a.createElement("span",{className:"title"},x("ChannelType")),n.a.createElement("span",{className:"subtitle"},t.username?x("TypePublic"):x("TypePrivate"))),n.a.createElement(ve.a,{icon:"message",multiline:!0,ripple:!0,onClick:G,disabled:!l},n.a.createElement("span",{className:"title"},x("Discussion")),n.a.createElement("span",{className:"subtitle"},x(O?"DiscussionUnlink":"Add"))),n.a.createElement(ve.a,{icon:"admin",multiline:!0,ripple:!0,onClick:q},n.a.createElement("span",{className:"title"},x("ChannelAdministrators")),n.a.createElement("span",{className:"subtitle"},R)),n.a.createElement("div",{className:"ListItem no-selection narrow"},n.a.createElement(Jt.a,{checked:c,label:x("ChannelSignMessages"),onChange:V}))),n.a.createElement("div",{className:"section"},n.a.createElement(ve.a,{icon:"group",multiline:!0,ripple:!0,onClick:W},n.a.createElement("span",{className:"title",dir:"auto"},x("ChannelSubscribers")),n.a.createElement("span",{className:"subtitle",dir:"auto"},x("Subscribers",t.membersCount,"i")))),n.a.createElement("div",{className:"section"},n.a.createElement(ve.a,{icon:"delete",ripple:!0,destructive:!0,onClick:j},t.isCreator?x("ChannelDelete"):x("LeaveChannel")))),n.a.createElement(Rt,{isShown:y,onClick:_,disabled:K,ariaLabel:x("Save")},K?n.a.createElement(L.a,{color:"white"}):n.a.createElement("i",{className:"icon-check"})),n.a.createElement(Se.a,{isOpen:f,onClose:C,text:t.isCreator?x("ChannelDeleteAlert"):x("ChannelLeaveAlert"),confirmLabel:t.isCreator?x("ChannelDelete"):x("LeaveChannel"),confirmHandler:Y,confirmIsDestructive:!0}))})),qc=a(53);var zc=Object(n.h)(Object(c.h)((e,{chatId:t})=>{const a=Object(d.f)(e,t),{isUsernameAvailable:n}=Object(d.Y)(e,t);return{chat:a,isChannel:Object(m.jb)(a),progress:e.management.progress,isUsernameAvailable:n}},(e,t)=>Object(u.l)(t,["checkPublicLink","updatePublicLink","updatePrivateLink"]))(({chat:e,isChannel:t,progress:a,isUsernameAvailable:c,checkPublicLink:r,updatePublicLink:l,updatePrivateLink:o})=>{const i=Boolean(e.username),d=e.fullInfo&&e.fullInfo.inviteLink,[m,u]=Object(n.r)(i?"public":"private"),[h,b]=Object(n.r)(),[g,p,v]=Object(Be.a)(),E="public"===m&&h&&c||"private"===m&&i;Object(n.n)(()=>{m&&!d&&o()},[m,d,o]);const O=Object(n.m)(e=>{u(e)},[]),f=Object(n.m)(()=>{l({username:"public"===m?h:""})},[m,l,h]),j=Object(n.m)(()=>{v(),o()},[v,o]),C=Object(F.a)(),y=t?"Channel":"Mega",k=t?"Channel":"Group",N=[{value:"private",label:C(y+"Private"),subLabel:C(y+"PrivateInfo")},{value:"public",label:C(y+"Public"),subLabel:C(y+"PublicInfo")}],I=a===s.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("h3",{className:"section-heading"},C(k+"Type")),n.a.createElement(ra.a,{selected:m,name:"channel-type",options:N,onChange:O})),"private"===m?n.a.createElement("div",{className:"section"},d?n.a.createElement(n.a.Fragment,null,n.a.createElement(qc.a,{url:d,className:"group-link",text:d}),n.a.createElement("p",{className:"section-info"},C(y+"PrivateLinkHelp")),n.a.createElement(ve.a,{icon:"delete",ripple:!0,destructive:!0,onClick:p},C("RevokeLink")),n.a.createElement(Se.a,{isOpen:g,onClose:v,text:C("RevokeAlert"),confirmLabel:C("RevokeButton"),confirmHandler:j,confirmIsDestructive:!0})):n.a.createElement(he.a,null)):n.a.createElement("div",{className:"section no-border"},n.a.createElement(zt,{asLink:!0,currentUsername:e.username,isLoading:I,isUsernameAvailable:c,checkUsername:r,onChange:b}),n.a.createElement("p",{className:"section-info",dir:"auto"},C(k+".Username.CreatePublicLinkHelp")))),n.a.createElement(Rt,{isShown:E,disabled:I,ariaLabel:C("Save"),onClick:f},I?n.a.createElement(L.a,{color:"white"}):n.a.createElement("i",{className:"icon-check"})))}));var $c=Object(n.h)(Object(c.h)((e,{chatId:t})=>{const a=Object(d.f)(e,t),{forDiscussionIds:n,byId:c}=e.chats;return{chat:a,chatsByIds:c,forDiscussionIds:n,linkedChat:a&&a.fullInfo&&a.fullInfo.linkedChatId?Object(d.f)(e,a.fullInfo.linkedChatId):void 0,isChannel:a&&Object(m.jb)(a)}},(e,t)=>Object(u.l)(t,["loadGroupsForDiscussion","linkDiscussionGroup","unlinkDiscussionGroup"]))(({chat:e,chatId:t,chatsByIds:a,linkedChat:c,forDiscussionIds:r,isChannel:o,onScreenSelect:i,loadGroupsForDiscussion:d,linkDiscussionGroup:m,unlinkDiscussionGroup:u})=>{const[h,b]=Object(n.r)(),[g,p]=Object(n.r)(),[v,E]=Object(n.r)(!1),O=Object(n.m)(()=>E(!0),[]),[f,j,C]=Object(Be.a)(),[y,k,N]=Object(Be.a)(),I=Object(F.a)(),S=c&&c.id;Object(n.n)(()=>{d()},[d]),Object(n.n)(()=>{g||Object(_t.a)("DiscussionGroups").then(p)},[g]);const w=Object(n.m)(()=>{C(),u({channelId:o?t:S}),o||i(s.g.Initial)},[C,u,o,t,S,i]),P=Object(n.m)(()=>{N(),m({channelId:t,chatId:h})},[N,m,t,h]);function M(){const e=a[h];if(e)return n.a.createElement("div",{className:"modal-header"},n.a.createElement(R.a,{size:"tiny",chat:e}),n.a.createElement("div",{className:"modal-title"},I("Channel.DiscussionGroup.LinkGroup")))}function L(){const t=a[h];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"},g&&n.a.createElement(Vt.a,{id:"discussionGroupsDucks",size:l.sb,animationData:g,play:v,noLoop:!0,onLoad:O})),c&&n.a.createElement("div",null,n.a.createElement(ve.a,{className:"chat-item-clickable",inactive:!0},n.a.createElement(Oe.a,{chatId:c.id})),n.a.createElement(ve.a,{icon:"delete",ripple:!0,destructive:!0,onClick:j},I(o?"DiscussionUnlinkGroup":"DiscussionUnlinkChannel")),n.a.createElement(Se.a,{isOpen:f,onClose:C,header:n.a.createElement("div",{className:"modal-header"},n.a.createElement(R.a,{size:"tiny",chat:c}),n.a.createElement("div",{className:"modal-title"},I(o?"DiscussionUnlinkGroup":"DiscussionUnlinkChannel"))),textParts:Object(x.a)(I(o?"DiscussionUnlinkChannelAlert":"DiscussionUnlinkGroupAlert",c.title),["br","simple_markdown"]),confirmLabel:I(o?"DiscussionUnlinkGroup":"DiscussionUnlinkChannel"),confirmHandler:w,confirmIsDestructive:!0})),!c&&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(ve.a,{key:"create-group",icon:"group",ripple:!0,teactOrderKey:0,className:"not-implemented"},I("DiscussionCreateGroup")),r?r.map((e,t)=>n.a.createElement(ve.a,{key:e,teactOrderKey:t+1,className:"chat-item-clickable scroll-item",onClick:()=>{b(e),k()}},n.a.createElement(Oe.a,{chatId:e}))):n.a.createElement(Xe.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(Se.a,{isOpen:y,onClose:N,header:M(),textParts:L(),confirmLabel:I("DiscussionLinkGroup"),confirmHandler:P,isButtonsInOneRow:!0})))))}));var Hc=Object(n.h)(Object(c.h)((e,{chatId:t,isPromotedByCurrentUser:a})=>{const n=Object(d.f)(e,t);return{chat:n,isFormFullyDisabled:!(n.isCreator||a)}},(e,t)=>Object(u.l)(t,["updateChatMemberBannedRights"]))(({chat:e,selectedChatMemberId:t,onScreenSelect:a,updateChatMemberBannedRights:c,isFormFullyDisabled:r})=>{const[l,o]=Object(n.r)({}),[i,d]=Object(n.r)(!1),[m,u]=Object(n.r)(!1),[h,b,g]=Object(Be.a)(),p=Object(F.a)(),v=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&&!v&&a(s.g.GroupPermissions)},[e,a,v,t]),Object(n.n)(()=>{o(v&&v.bannedRights||e&&e.defaultBannedRights||{}),d(!1),u(!1)},[e,v]);const E=Object(n.m)(e=>{const{name:t}=e.target;function a(e){return!e||void 0}o(e=>({...e,[t]:a(e[t]),..."sendStickers"===t&&{sendGifs:a(e[t])}})),d(!0)},[]),O=Object(n.m)(()=>{e&&t&&(u(!0),c({chatId:e.id,userId:t,bannedRights:l}))},[e,t,l,c]),f=Object(n.m)(()=>{e&&t&&c({chatId:e.id,userId:t,bannedRights:{viewMessages:!0}})},[e,t,c]),j=Object(n.m)(t=>!!r||!(!e||!e.defaultBannedRights)&&e.defaultBannedRights[t],[e,r]);if(v)return n.a.createElement("div",{className:"Management"},n.a.createElement("div",{className:"custom-scroll"},n.a.createElement("div",{className:"section"},n.a.createElement(ve.a,{inactive:!0,className:"chat-item-clickable"},n.a.createElement(Ee.a,{userId:v.userId})),n.a.createElement("h3",{className:"section-heading mt-4"},p("UserRestrictionsCanDo")),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(Jt.a,{name:"sendMessages",checked:!l.sendMessages,label:p("UserRestrictionsSend"),blocking:!0,disabled:j("sendMessages"),onChange:E})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(Jt.a,{name:"sendMedia",checked:!l.sendMedia,label:p("UserRestrictionsSendMedia"),blocking:!0,disabled:j("sendMedia"),onChange:E})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(Jt.a,{name:"sendStickers",checked:!l.sendStickers&&!l.sendGifs,label:p("UserRestrictionsSendStickers"),blocking:!0,disabled:j("sendStickers"),onChange:E})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(Jt.a,{name:"sendPolls",checked:!l.sendPolls,label:p("UserRestrictionsSendPolls"),blocking:!0,disabled:j("sendPolls"),onChange:E})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(Jt.a,{name:"embedLinks",checked:!l.embedLinks,label:p("UserRestrictionsEmbedLinks"),blocking:!0,disabled:j("embedLinks"),onChange:E})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(Jt.a,{name:"inviteUsers",checked:!l.inviteUsers,label:p("UserRestrictionsInviteUsers"),blocking:!0,disabled:j("inviteUsers"),onChange:E})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(Jt.a,{name:"pinMessages",checked:!l.pinMessages,label:p("UserRestrictionsPinMessages"),blocking:!0,disabled:j("pinMessages"),onChange:E})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(Jt.a,{name:"changeInfo",checked:!l.changeInfo,label:p("UserRestrictionsChangeInfo"),blocking:!0,disabled:j("changeInfo"),onChange:E}))),!r&&n.a.createElement("div",{className:"section"},n.a.createElement(ve.a,{icon:"delete-user",ripple:!0,destructive:!0,onClick:b},p("UserRestrictionsBlock")))),n.a.createElement(Rt,{isShown:i,onClick:O,ariaLabel:p("Save"),disabled:m},m?n.a.createElement(L.a,{color:"white"}):n.a.createElement("i",{className:"icon-check"})),n.a.createElement(Se.a,{isOpen:h,onClose:g,text:"Are you sure you want to ban and remove this user from the group?",confirmLabel:"Remove",confirmHandler:f,confirmIsDestructive:!0}))}));var _c=Object(n.h)(Object(c.h)((e,{chatId:t})=>{const a=Object(d.f)(e,t),{byId:n}=e.users;return{chat:a,currentUserId:e.currentUserId,isChannel:Object(m.jb)(a),usersById:n}})(({chat:e,isChannel:t,currentUserId:a,usersById:c,onScreenSelect:r,onChatMemberSelect:l})=>{const o=Object(F.a)();const i=Object(n.p)(()=>e.fullInfo&&e.fullInfo.adminMembers?e.fullInfo.adminMembers.sort((e,t)=>e.isOwner?-1:t.isOwner?1:0):[],[e]),d=Object(n.m)(e=>{l(e.userId,e.promotedByUserId===a),r(s.g.ChatAdminRights)},[a,l,r]),u=Object(n.m)(e=>{if(e.isOwner)return o("ChannelCreator");const t=e.promotedByUserId?c[e.promotedByUserId]:void 0;return t?o("EditAdminPromotedBy",Object(m.Z)(t)):o("ChannelAdmin")},[o,c]);return n.a.createElement("div",{className:"Management"},n.a.createElement("div",{className:"custom-scroll"},n.a.createElement("div",{className:"section"},n.a.createElement(ve.a,{icon:"recent",multiline:!0,ripple:!0,onClick:function(){r(s.g.GroupRecentActions)}},n.a.createElement("span",{className:"title"},o("EventLog")),n.a.createElement("span",{className:"subtitle"},o(t?"EventLogInfoDetailChannel":"EventLogInfoDetail")))),n.a.createElement("div",{className:"section"},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."),i.map(e=>n.a.createElement(ve.a,{key:e.userId,className:"chat-item-clickable",ripple:!0,onClick:()=>d(e)},n.a.createElement(Ee.a,{userId:e.userId,status:u(e),forceShowSelf:!0}))))))}));var Vc=Object(n.h)(Object(c.h)((e,{chatId:t})=>({chat:Object(d.f)(e,t)}))(({chat:e})=>{const t=Object(F.a)(),a=Object(n.p)(()=>e&&e.fullInfo&&e.fullInfo.adminMembers?e.fullInfo.adminMembers.sort((e,t)=>e.isOwner?-1:t.isOwner?1:0):[],[e]),c=Object(n.m)(e=>e.isOwner?t("ChannelCreator"):t("ChannelAdmin"),[t]);return n.a.createElement("div",{className:"Management"},n.a.createElement("div",{className:"custom-scroll"},n.a.createElement("div",{className:"section not-implemented"},n.a.createElement("h3",{className:"section-heading"},"Actions"),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(Jt.a,{name:"changeInfo",checked:!0,label:t("EventLogAllEvents"),onChange:void 0})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(Jt.a,{name:"changeInfo",checked:!0,label:t("EventLogFilterNewAdmins"),onChange:void 0})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(Jt.a,{name:"changeInfo",checked:!0,label:t("EventLogFilterNewMembers"),onChange:void 0})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(Jt.a,{name:"changeInfo",checked:!0,label:t("EventLogFilterChannelInfo"),onChange:void 0})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(Jt.a,{name:"changeInfo",checked:!0,label:t("EventLogFilterDeletedMessages"),onChange:void 0})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(Jt.a,{name:"changeInfo",checked:!0,label:t("EventLogFilterEditedMessages"),onChange:void 0})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(Jt.a,{name:"changeInfo",checked:!0,label:t("EventLogFilterLeavingMembers"),onChange:void 0}))),n.a.createElement("div",{className:"section not-implemented"},n.a.createElement("h3",{className:"section-heading"},t("Channel.Management.Title")),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(Jt.a,{name:"changeInfo",checked:!0,label:t("EventLogAllAdmins"),onChange:void 0})),a.map(e=>n.a.createElement(ve.a,{key:e.userId,className:"chat-item-clickable picker-list-item",onClick:void 0,ripple:!0},n.a.createElement(Jt.a,{label:"",checked:!0}),n.a.createElement(Ee.a,{userId:e.userId,status:c(e),forceShowSelf:!0}))))))}));var Wc=Object(n.h)(Object(c.h)((e,{chatId:t,isPromotedByCurrentUser:a})=>{const n=Object(d.f)(e,t),{byId:c}=e.users,{currentUserId:r}=e;return{chat:n,usersById:c,currentUserId:r,isChannel:Object(m.jb)(n),isFormFullyDisabled:!(n.isCreator||a)}},(e,t)=>Object(u.l)(t,["updateChatAdmin"]))(({selectedChatMemberId:e,onScreenSelect:t,chat:a,usersById:c,currentUserId:r,isChannel:l,isFormFullyDisabled:o,updateChatAdmin:i})=>{const[d,u]=Object(n.r)({}),[h,b]=Object(n.r)(!1),[g,p]=Object(n.r)(!1),[v,E,O]=Object(Be.a)(),[f,j]=Object(n.r)(""),C=Object(F.a)(),y=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&&!y&&t(s.g.ChatAdministrators)},[a,t,y,e]),Object(n.n)(()=>{u(y&&y.adminRights||{}),j((y&&y.customTitle||"").substr(0,16)),b(!1),p(!1)},[y]);const k=Object(n.m)(e=>{const{name:t}=e.target;u(e=>{return{...e,[t]:(a=e[t],!a||void 0)};var a}),b(!0)},[]),N=Object(n.m)(()=>{e&&(p(!0),i({chatId:a.id,userId:e,adminRights:d,customTitle:f}))},[a,e,d,f,i]),I=Object(n.m)(()=>{e&&(i({chatId:a.id,userId:e,adminRights:{}}),O())},[a.id,O,e,i]),S=Object(n.m)(e=>!Object(m.ib)(a)&&(!(!o&&a.adminRights)||!a.adminRights[e]),[a,o]),w=Object(n.p)(()=>{if(!y)return;if(y.isOwner)return C("ChannelCreator");const e=y.promotedByUserId?c[y.promotedByUserId]:void 0;return e?C("EditAdminPromotedBy",Object(m.Z)(e)):C("ChannelAdmin")},[y,c,C]),P=Object(n.m)(e=>{const{value:t}=e.target;j(t),b(!0)},[]);if(y)return n.a.createElement("div",{className:"Management"},n.a.createElement("div",{className:"custom-scroll"},n.a.createElement("div",{className:"section"},n.a.createElement(ve.a,{inactive:!0,className:"chat-item-clickable"},n.a.createElement(Ee.a,{userId:y.userId,status:w,forceShowSelf:!0})),n.a.createElement("h3",{className:"section-heading mt-4"},C("EditAdminWhatCanDo")),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(Jt.a,{name:"changeInfo",checked:!!d.changeInfo,label:C(l?"EditAdminChangeChannelInfo":"EditAdminChangeGroupInfo"),blocking:!0,disabled:S("changeInfo"),onChange:k})),l&&n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(Jt.a,{name:"postMessages",checked:!!d.postMessages,label:C("EditAdminPostMessages"),blocking:!0,disabled:S("postMessages"),onChange:k})),l&&n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(Jt.a,{name:"editMessages",checked:!!d.editMessages,label:C("EditAdminEditMessages"),blocking:!0,disabled:S("editMessages"),onChange:k})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(Jt.a,{name:"deleteMessages",checked:!!d.deleteMessages,label:C(l?"EditAdminDeleteMessages":"EditAdminGroupDeleteMessages"),blocking:!0,disabled:S("deleteMessages"),onChange:k})),!l&&n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(Jt.a,{name:"banUsers",checked:!!d.banUsers,label:C("EditAdminBanUsers"),blocking:!0,disabled:S("banUsers"),onChange:k})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(Jt.a,{name:"inviteUsers",checked:!!d.inviteUsers,label:C("EditAdminAddUsers"),blocking:!0,disabled:S("inviteUsers"),onChange:k})),!l&&n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(Jt.a,{name:"pinMessages",checked:!!d.pinMessages,label:C("EditAdminPinMessages"),blocking:!0,disabled:S("pinMessages"),onChange:k})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(Jt.a,{name:"addAdmins",checked:!!d.addAdmins,label:C("EditAdminAddAdmins"),blocking:!0,disabled:S("addAdmins"),onChange:k})),!l&&n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(Jt.a,{name:"anonymous",checked:!!d.anonymous,label:C("EditAdminSendAnonymously"),blocking:!0,disabled:S("anonymous"),onChange:k})),o&&n.a.createElement("p",{className:"section-info mb-4"},C("Channel.EditAdmin.CannotEdit")),!l&&n.a.createElement(ge.a,{id:"admin-title",label:C("EditAdminRank"),onChange:P,value:f,disabled:o,maxLength:16}),r!==e&&!o&&n.a.createElement(ve.a,{icon:"delete",ripple:!0,destructive:!0,onClick:E},C("EditAdminRemoveAdmin")))),n.a.createElement(Rt,{isShown:h,onClick:N,ariaLabel:C("Save"),disabled:g},g?n.a.createElement(L.a,{color:"white"}):n.a.createElement("i",{className:"icon-check"})),n.a.createElement(Se.a,{isOpen:v,onClose:O,text:"Are you sure you want to dismiss this admin?",confirmLabel:"Dismiss",confirmHandler:I,confirmIsDestructive:!0}))}));var Yc=Object(n.h)(Object(c.h)((e,{chatId:t})=>{const a=Object(d.f)(e,t),{byId:n}=e.users;return{members:a&&a.fullInfo&&a.fullInfo.members,usersById:n,isChannel:a&&Object(m.jb)(a)}},(e,t)=>Object(u.l)(t,["openUserInfo"]))(({members:e,usersById:t,isChannel:a,openUserInfo:c})=>{const r=Object(n.p)(()=>{if(e&&t)return Object(m.Eb)(e.map(({userId:e})=>e),t)},[e,t]),s=Object(n.m)(e=>{c({id:e})},[c]);return n.a.createElement("div",{className:"Management"},n.a.createElement("div",{className:"custom-scroll"},n.a.createElement("div",{className:"section",teactFastList:!0},r?r.map((e,t)=>n.a.createElement(ve.a,{key:e,teactOrderKey:t,className:"chat-item-clickable scroll-item",onClick:()=>s(e)},n.a.createElement(Ee.a,{userId:e,forceShowSelf:!0}))):n.a.createElement(Xe.a,{teactOrderKey:0,key:"nothing-found",text:a?"No subscribers found":"No members found"}))))}));var Kc=Object(n.h)(Object(c.h)((e,{chatId:t})=>{const a=Object(d.f)(e,t),{byId:n}=e.users;return{members:a&&a.fullInfo&&a.fullInfo.members,usersById:n,isChannel:a&&Object(m.jb)(a)}})(({usersById:e,members:t,isChannel:a,onScreenSelect:c,onChatMemberSelect:r})=>{const l=Object(n.p)(()=>{if(t&&e)return Object(m.Eb)(t.filter(e=>!e.isOwner).map(({userId:e})=>e),e)},[t,e]),o=Object(n.m)(e=>{r(e),c(s.g.GroupUserPermissions)},[r,c]);return 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(ve.a,{key:e,teactOrderKey:t,className:"chat-item-clickable scroll-item",onClick:()=>o(e)},n.a.createElement(Ee.a,{userId:e,forceShowSelf:!0}))):n.a.createElement(Xe.a,{teactOrderKey:0,key:"nothing-found",text:a?"No subscribers found":"No members found"}))))}));var Zc=Object(n.h)(Object(c.h)(e=>({managementType:Object(d.u)(e)}))(({chatId:e,currentScreen:t,selectedChatMemberId:a,isPromotedByCurrentUser:c,onScreenSelect:r,onChatMemberSelect:l,managementType:o})=>{switch(t){case s.g.Initial:switch(o){case"user":return n.a.createElement(Bc,{key:e,userId:e});case"group":return n.a.createElement(xc,{key:e,chatId:e,onScreenSelect:r});case"channel":return n.a.createElement(Gc,{key:e,chatId:e,onScreenSelect:r})}break;case s.g.ChatPrivacyType:return n.a.createElement(zc,{chatId:e});case s.g.Discussion:return n.a.createElement($c,{chatId:e,onScreenSelect:r});case s.g.GroupPermissions:return n.a.createElement(Rc,{chatId:e,onScreenSelect:r,onChatMemberSelect:l});case s.g.GroupRemovedUsers:return n.a.createElement(Uc,{chatId:e});case s.g.GroupUserPermissionsCreate:return n.a.createElement(Kc,{chatId:e,onChatMemberSelect:l,onScreenSelect:r});case s.g.GroupUserPermissions:return n.a.createElement(Hc,{chatId:e,selectedChatMemberId:a,isPromotedByCurrentUser:c,onScreenSelect:r});case s.g.ChatAdministrators:return n.a.createElement(_c,{chatId:e,onScreenSelect:r,onChatMemberSelect:l});case s.g.GroupRecentActions:return n.a.createElement(Vc,{chatId:e});case s.g.ChatAdminRights:return n.a.createElement(Wc,{chatId:e,selectedChatMemberId:a,isPromotedByCurrentUser:c,onScreenSelect:r});case s.g.ChannelSubscribers:case s.g.GroupMembers:return n.a.createElement(Yc,{chatId:e})}}));const Qc={USD:"$",EUR:"€",GBP:"£",JPY:"¥",RUB:"₽",UAH:"₴",INR:"₹",AED:"د.إ"};function Xc(e){return e&&Qc[e]||""}const Jc=/^4[0-9]{12}(?:[0-9]{1,3})?$/,er=/^5[1-5][0-9]{11,14}$/,tr=/^2[2-7][0-9]{11,14}$/;let ar;!function(e){e[e.Default=0]="Default",e[e.Visa=1]="Visa",e[e.Mastercard=2]="Mastercard"}(ar||(ar={}));const nr={[ar.Default]:"",[ar.Visa]:"visa",[ar.Mastercard]:"mastercard"};function cr(e){return e=e.replace(/\s/g,""),Jc.test(e)?ar.Visa:er.test(e)||tr.test(e)?ar.Mastercard:ar.Default}var rr=a(56);const sr={streetLine1:"",streetLine2:"",city:"",state:"",countryIso2:"",postCode:"",fullName:"",email:"",phone:"",shipping:"",cardNumber:"",cardholder:"",expiry:"",cvv:"",billingCountry:"",billingZip:"",saveInfo:!0,saveCredentials:!1,formErrors:{}},lr=(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:or(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:or(t.payload.countryIso2)}:{...e,...t.payload};case"setFormErrors":return{...e,formErrors:{...e.formErrors,...t.payload}};default:return e}};function or(e){const t=Dt.a.find(({id:t})=>t===e);return t?t.name:""}function ir(e,t=400){Object(n.n)(()=>{o.l||setTimeout(()=>{Object(_.b)(()=>{e.current&&e.current.focus()})},t)},[e,t])}var dr=Object(n.h)(e=>{const{id:t,value:a,label:c,hasArrow:r,error:s,ref:l,placeholder:o,onChange:i,children:d}=e,m=s||c,u=Object(ce.a)("input-group",a&&"touched",s&&"error",m&&"with-label",r&&"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:o||c,ref:l},d),m&&t&&n.a.createElement("label",{htmlFor:t},m))});a(300);var mr=Object(n.h)(({state:e,needEmail:t,needPhone:a,needName:c,needAddress:r,dispatch:s})=>{const l=Object(n.q)(null),o=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)();ir(l);const m=Object(n.m)(e=>{s({type:"changeAddress1",payload:e.target.value})},[s]),u=Object(n.m)(e=>{s({type:"changeAddress2",payload:e.target.value})},[s]),h=Object(n.m)(e=>{s({type:"changeCity",payload:e.target.value})},[s]),b=Object(n.m)(e=>{s({type:"changeState",payload:e.target.value})},[s]),g=Object(n.m)(e=>{s({type:"changeCountry",payload:e.target.value})},[s]),p=Object(n.m)(e=>{s({type:"changePostCode",payload:e.target.value})},[s]),v=Object(n.m)(e=>{s({type:"changeFullName",payload:e.target.value})},[s]),E=Object(n.m)(e=>{s({type:"changeEmail",payload:e.target.value})},[s]),O=Object(n.m)(e=>{let{value:t}=e.target;t="+"+t.replace(/\D/g,""),o.current&&(o.current.value=t),s({type:"changePhone",payload:t})},[s]),f=Object(n.m)(e=>{s({type:"changeSaveInfo",payload:e.target.value})},[s]),{formErrors:j}=e;return n.a.createElement("div",{className:"ShippingInfo"},n.a.createElement("form",null,r?n.a.createElement("div",null,n.a.createElement("h5",null,d("PaymentShippingAddress")),n.a.createElement(ge.a,{ref:l,label:"Address1 (Street)",onChange:m,value:e.streetLine1,inputMode:"text",error:j.streetLine1}),n.a.createElement(ge.a,{label:"Address2 (Street)",onChange:u,value:e.streetLine2,inputMode:"text",error:j.streetLine2}),n.a.createElement(ge.a,{label:"City",onChange:h,value:e.city,inputMode:"text",error:j.city}),n.a.createElement(ge.a,{label:"State",onChange:b,value:e.state,inputMode:"text",error:j.state}),n.a.createElement(dr,{label:"Country",placeholder:"Country",onChange:g,value:e.countryIso2,hasArrow:Boolean(!0),id:"shipping-country",error:j.countryIso2,ref:i},Dt.a.map(({name:e,id:t})=>n.a.createElement("option",{value:t,className:"county-item"},e))),n.a.createElement(ge.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(ge.a,{label:"Full name",onChange:v,value:e.fullName,inputMode:"text",error:j.fullName}),t&&n.a.createElement(ge.a,{label:"Email",onChange:E,value:e.email,inputMode:"email",error:j.email}),a&&n.a.createElement(ge.a,{label:"Phone number",onChange:O,value:e.phone,inputMode:"tel",error:j.phone,ref:o}),n.a.createElement(Jt.a,{label:d("PaymentShippingSave"),subLabel:d("PaymentShippingSaveInfo"),checked:Boolean(e.saveInfo),onChange:f})))});a(301);var ur=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 r=Object(n.m)(e=>{c({type:"changeShipping",payload:e})},[c]),s=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(ra.a,{name:"shipping-options",options:s,onChange:r,selected:e.shipping})))});a(302);function hr(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 br(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 gr=Object(n.h)(({invoiceContent:e,prices:t,shippingPrices:a,checkoutInfo:c,currency:r,totalPrice:s})=>{const{photoUrl:l,title:o,text:i}=e||{},{paymentMethod:d,paymentProvider:m,shippingAddress:u,name:h,phone:b,shippingMethod:g}=c||{};return n.a.createElement("div",{className:"Checkout"},n.a.createElement("div",{className:"description has-image"},l&&n.a.createElement("img",{src:l,alt:""}),n.a.createElement("div",{className:"text"},n.a.createElement("h5",null,o),n.a.createElement("p",null,i))),n.a.createElement("div",{className:"price-info"},t&&t.map(e=>hr(e.label,e.amount,r,!1)),a&&a.map(e=>hr(e.label,e.amount,r,!1)),void 0!==s&&hr("Total",s,r,!0)),n.a.createElement("div",{className:"invoice-info"},d&&br("icon-card",d,"Payment method"),m&&br("stripe-provider",m,"Payment provider"),u&&br("icon-location",u,"Shipping address"),h&&br("icon-user",h,"Name"),b&&br("icon-phone",b,"Phone number"),g&&br("icon-truck",g,"Shipping method")))});var pr=Object(n.h)(({value:e,error:t,onChange:a})=>{const c=Object(n.q)(null),r=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]),s=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(ge.a,{label:"Expiry date",ref:c,onChange:s,onKeyDown:r,value:e,error:t,inputMode:"numeric",maxLength:5})}),vr=(a(303),a.p+"mastercard.4216118edafe23cc2dec7b8807ba4622.svg"),Er=a.p+"visa.e5a7c336e1deb4b92a636e2e053878c4.svg";var Or=Object(n.h)(({value:e,error:t,onChange:a})=>{const c=Object(n.q)(null);ir(c);const[r,s]=Object(n.r)(ar.Default);Object(n.n)(()=>{const t=cr(e);s(t)},[]);const l=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=cr(e.target.value);s(n),a(t),c.current&&(c.current.value=t)},[a,c]),o=function(e){switch(e){case ar.Mastercard:return n.a.createElement("img",{src:vr,alt:""});case ar.Visa:return n.a.createElement("img",{src:Er,alt:""});default:return}}(r);return n.a.createElement("div",{className:"CardInput"},n.a.createElement("span",{className:"left-addon"},o),n.a.createElement(ge.a,{ref:c,label:"Card number",onChange:l,value:e,inputMode:"numeric",className:r?"has-left-addon":"",error:t,maxLength:23}))});a(304);var fr=Object(n.h)(({state:e,canSaveCredentials:t,needCardholderName:a,needCountry:c,needZip:r,dispatch:s})=>{const l=Object(n.q)(null);Object(n.n)(()=>{l.current&&l.current.value!==e.billingCountry&&(l.current.value=e.billingCountry)},[e.billingCountry]);const o=Object(n.m)(e=>{s({type:"changeCardNumber",payload:e})},[s]),i=Object(n.m)(e=>{s({type:"changeCardholder",payload:e.target.value.toUpperCase()})},[s]),d=Object(n.m)(e=>{s({type:"changeExpiryDate",payload:e})},[s]),m=Object(n.m)(e=>{s({type:"changeCvvCode",payload:e.target.value})},[s]),u=Object(n.m)(e=>{s({type:"changeBillingCountry",payload:e.target.value})},[s]),h=Object(n.m)(e=>{s({type:"changeBillingZip",payload:e.target.value})},[s]),b=Object(n.m)(e=>{s({type:"changeSaveCredentials",payload:e.target.value})},[s]),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(Or,{onChange:o,value:e.cardNumber,error:p.cardNumber}),a&&n.a.createElement(ge.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(pr,{value:e.expiry,onChange:d,error:p.expiry}),n.a.createElement(ge.a,{label:"CVV code",onChange:m,value:e.cvv,inputMode:"numeric",maxLength:3,error:p.cvv})),c||r?n.a.createElement("h5",null,g("PaymentBillingAddress")):void 0,c&&n.a.createElement(dr,{label:"Country",placeholder:"Country",onChange:u,value:e.billingCountry,hasArrow:Boolean(!0),id:"billing-country",error:p.billingCountry,ref:l},Dt.a.map(({name:e})=>n.a.createElement("option",{value:e,className:"county-item"},e))),r&&n.a.createElement(ge.a,{label:"Post Code",onChange:h,value:e.billingZip,inputMode:"text",error:p.billingZip}),t&&n.a.createElement(Jt.a,{label:g("PaymentCardSavePaymentInformation"),checked:e.saveCredentials,onChange:b})))});a(182);var jr=Object(n.h)(Object(c.h)(e=>{const{step:t,shippingOptions:a,savedInfo:n,canSaveCredentials:c,invoice:r,invoiceContent:s,nativeProvider:l,nativeParams:o,passwordMissing:i,error:d}=e.payment,m=Boolean(r&&(!l||"stripe"!==l)),{needCardholderName:u,needCountry:h,needZip:b}=o||{},{nameRequested:g,phoneRequested:p,emailRequested:v,shippingAddressRequested:E,flexible:O,phoneToProvider:f,emailToProvider:j,currency:C,prices:y}=r||{};return{step:t,shippingOptions:a,savedInfo:n,canSaveCredentials:c,nativeProvider:l,passwordMissing:i,nameRequested:g,shippingAddressRequested:E,phoneRequested:p,emailRequested:v,flexible:O,phoneToProvider:f,emailToProvider:j,currency:C,prices:y,isProviderError:m,invoiceContent:s,needCardholderName:u,needCountry:h,needZip:b,error:d,globalErrors:e.errors}},(e,t)=>Object(u.l)(t,["validateRequestedInfo","sendPaymentForm","setPaymentStep","sendCredentialsInfo","clearPaymentError"]))(({isOpen:e,onClose:t,step:a,shippingOptions:c,savedInfo:r,canSaveCredentials:l,nameRequested:o,shippingAddressRequested:i,phoneRequested:d,emailRequested:m,phoneToProvider:u,emailToProvider:h,currency:b,passwordMissing:g,isProviderError:p,invoiceContent:v,nativeProvider:E,prices:O,needCardholderName:f,needCountry:j,needZip:C,error:y,globalErrors:k,validateRequestedInfo:N,sendPaymentForm:I,setPaymentStep:S,sendCredentialsInfo:w,clearPaymentError:P})=>{const[M,A]=yt(lr,sr),B=Xc(b),[x,R]=Object(n.r)(!1),U=Object(F.a)();Object(n.n)(()=>{(a||y||k)&&R(!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(rr.a)(k);A({type:"setFormErrors",payload:{...e}})}},[y,k,A]),Object(n.n)(()=>{if(r){const{name:e,phone:t,email:a,shippingAddress:n}=r;A({type:"updateUserInfo",payload:{fullName:e,phone:t&&"+"!==t.charAt(0)?"+"+t:t,email:a,...n||{}}})}},[r,A]);const G=Object(n.m)(()=>{P()},[P]),q=Object(n.p)(()=>a!==s.i.Checkout?0:function(e=[],t,a){const n=t?yr(t,a):[];let c=0;const r=e.concat(n||[]);return c=r.reduce((e,t)=>e+t.amount,c),c}(O,c,M.shipping),[a,M.shipping,O,c]),z=Object(n.p)(()=>{if(a===s.i.Checkout)return function(e,t,a){const n=`${function(e){const t=cr(e);return nr[t]||""}(e.cardNumber)} *${e.cardNumber.slice(-4)}`,c=e.streetLine1?`${e.streetLine1}, ${e.city}, ${e.countryIso2}`:void 0,{phone:r,fullName:s}=e,l=t?Cr(t,e.shipping):void 0,o=l?l.title:void 0;return{paymentMethod:n,paymentProvider:a,shippingAddress:c,name:s,phone:r,shippingMethod:o}}(M,c,E||"")},[a,M,c,E]);const $=Object(n.m)(()=>{const{saveInfo:e}=M,t=function(e){const{streetLine1:t,streetLine2:a,city:n,state:c,countryIso2:r,postCode:s,fullName:l,phone:o,email:i}=e;return{name:l,phone:o,email:i,shippingAddress:{streetLine1:t,streetLine2:a,city:n,state:c,countryIso2:r,postCode:s}}}(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:r,billingZip:s}=e,[l,o]=n.split("/");return{data:{cardNumber:t,cardholder:a,expiryMonth:l,expiryYear:o,cvv:c,country:r,zip:s}}}(M);w({credentials:e})},[w,M]),_=Object(n.m)(()=>{I({shippingOptionId:M.shipping,saveCredentials:M.saveCredentials})},[I,M]),V=Object(n.m)(e=>{S({step:e})},[S]),W=Object(n.m)(()=>{switch(R(!0),a){case s.i.ShippingInfo:return $();case s.i.Shipping:return V(s.i.PaymentInfo);case s.i.PaymentInfo:return H();case s.i.Checkout:return _();default:return()=>{}}},[a,$,V,H,_]),Y=Object(n.p)(()=>{switch(a){case s.i.ShippingInfo:return U("PaymentShippingInfo");case s.i.Shipping:return U("PaymentShippingMethod");case s.i.PaymentInfo:return U("PaymentCardInfo");case s.i.Checkout:return U("PaymentCheckout");default:return""}},[a,U]),K=Object(n.p)(()=>{switch(a){case s.i.Checkout:return U("Checkout.PayPrice",`${B}${(q/100).toFixed(2)}`);default:return U("Next")}},[a,U,B,q]);return p?n.a.createElement(be.a,{className:"error",isOpen:e,onClose:t},n.a.createElement("p",null,"Sorry, Telegram T 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(be.a,{className:"PaymentModal",isOpen:e,onClose:t},n.a.createElement("div",{className:"header"},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,Y)),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 s.i.ShippingInfo:return n.a.createElement(mr,{state:M,dispatch:A,needAddress:Boolean(i),needEmail:Boolean(m||h),needPhone:Boolean(d||u),needName:Boolean(o)});case s.i.Shipping:return n.a.createElement(ur,{state:M,dispatch:A,shippingOptions:c||[],currency:B});case s.i.PaymentInfo:return n.a.createElement(fr,{state:M,dispatch:A,canSaveCredentials:Boolean(!g&&l),needCardholderName:f,needCountry:j,needZip:C});case s.i.Checkout:return n.a.createElement(gr,{prices:O,shippingPrices:M.shipping&&c?yr(c,M.shipping):void 0,totalPrice:q,invoiceContent:v,checkoutInfo:z,currency:B});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:x,isLoading:x},K)),y&&!y.field&&function(){if(y)return n.a.createElement(be.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 Cr(e,t){return e.find(({id:e})=>e===t)}function yr(e,t){const a=Cr(e,t);return a?a.prices:void 0}var kr=Object(n.h)(Object(c.h)(e=>{const{receipt:t}=e.payment,{currency:a,prices:n,info:c,totalAmount:r,credentialsTitle:s,shippingPrices:l,shippingMethod:o,photoUrl:i,text:d,title:m}=t||{};return{currency:a,prices:n,info:c,totalAmount:r,credentialsTitle:s,shippingPrices:l,shippingMethod:o,photoUrl:i,text:d,title:m}})(({isOpen:e,onClose:t,prices:a,shippingPrices:c,totalAmount:r,currency:s,info:l,photoUrl:o,text:i,title:d,credentialsTitle:m,shippingMethod:u})=>{const h=Object(F.a)(),b=Xc(s),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:r,name:s}=t;return{paymentMethod:e,paymentProvider:"Stripe",shippingAddress:c,name:s,phone:r,shippingMethod:a}}(m,l,u),[l,u,m]);return n.a.createElement(be.a,{className:"PaymentModal PaymentModal-receipt",isOpen:e,onClose:t},n.a.createElement("div",null,n.a.createElement("div",{className:"header"},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(gr,{prices:a,shippingPrices:c,totalPrice:r,invoiceContent:{photoUrl:o,text:i,title:d},checkoutInfo:g,currency:b}))))}))},,,,,,,,,,,,,,,,,,,,,,,,function(e,t,a){"use strict";a.d(t,"a",(function(){return s}));var n=a(5),c=a(50);const r={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 s(e){const t=r[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(8),r=a(1),s=a(13),l=a(99),o=a(29),i=a(104),d=a(15);a(146);const m={type:"blob",quality:.8,format:"jpeg",circle:!1};let u,h,b;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;b=new u(t,{enableZoom:!0,boundary:{width:a,height:n},viewport:{width:a-16,height:n-16,type:"circle"}});const c=await Object(s.a)(e);await b.bind({url:c})}catch(e){r.p&&console.error(e)}}(e):async function(){return h||(h=Promise.all([a.e(6),a.e(8)]).then(a.bind(null,312)),u=(await h).default),h}().then(()=>p(!0)))},[e,g]);const v=Object(l.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(o.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(s.b)(e,"avatar.jpg");t(a)},ariaLabel:v("CropImage")},n.a.createElement("i",{className:"icon-check"})))});a(147);t.a=Object(n.h)(({title:e="Change your profile picture",disabled:t,currentAvatarBlobUrl:a,onChange:r})=>{const[s,l]=Object(n.r)(),[o,i]=Object(n.r)(a);Object(n.n)(()=>{i(a)},[a]);const d=Object(c.a)(o&&"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]&&(l(t.files[0]),t.value="")},accept:"image/png, image/jpeg"}),n.a.createElement("i",{className:"icon-camera-add"}),o&&n.a.createElement("img",{src:o,alt:"Avatar"})),n.a.createElement(g,{file:s,onClose:function(){l(void 0)},onChange:function(e){l(void 0),r(e),o&&URL.revokeObjectURL(o),i(URL.createObjectURL(e))}}))})},,,,,,,,,,function(e,t,a){},,,,,,,,function(e,t,a){"use strict";var n=a(0),c=a(1),r=a(7),s=a(120),l=a(111);a(135);const o=[0,50],i=[0,20],d=[20,0],m=r.g?c.rb:c.qb;t.a=Object(n.h)(({isPasswordVisible:e,isBig:t})=>{const[a,r]=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(s.a)("MonkeyClose").then(r)},[a]),Object(n.n)(()=>{u||Object(s.a)("MonkeyPeek").then(h)},[u]);const E=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(l.a,{id:"closeMonkey",size:t?c.Bb:m,className:p?"hidden":"shown",animationData:a,playSegment:o,noLoop:!0,onLoad:E}),u&&n.a.createElement(l.a,{id:"peekMonkey",size:t?c.Bb: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(1),r=a(7),s=a(8),l=a(29);const o=r.g?550:400;t.a=Object(n.h)(({isLoading:e=!1,isPasswordVisible:t,error:a,hint:i,placeholder:d="Password",submitLabel:m="Next",clearError:u,onChangePasswordVisibility:h,onInputChange:b,onSubmit:g})=>{const p=Object(n.q)(null),[v,E]=Object(n.r)(""),[O,f]=Object(n.r)(!1);return Object(n.n)(()=>{r.l||setTimeout(()=>{p.current.focus()},o)},[]),Object(n.n)(()=>{a&&requestAnimationFrame(()=>{p.current.focus(),p.current.select()})},[a]),n.a.createElement("form",{action:"",onSubmit:function(t){t.preventDefault(),e||O&&g(v)},autoComplete:"off"},n.a.createElement("div",{className:Object(s.a)("input-group password-input",v&&"touched",a&&"error")},n.a.createElement("input",{ref:p,className:"form-control",type:t?"text":"password",id:"sign-in-password",value:v||"",autoComplete:"current-password",onChange:function(e){a&&u();const{target:t}=e;E(t.value),f(t.value.length>=c.Z),b&&b(t.value)}}),n.a.createElement("label",null,a||i||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"}))),O&&n.a.createElement(l.a,{type:"submit",ripple:!0,isLoading:e},m))})},,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.d4466bb252b9014004b6.js.map \ No newline at end of file diff --git a/dist/3.d4466bb252b9014004b6.js.map b/dist/3.d4466bb252b9014004b6.js.map deleted file mode 100644 index 33bb8418b..000000000 --- a/dist/3.d4466bb252b9014004b6.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/Errors.tsx","webpack:///./src/components/main/Notifications.tsx","webpack:///./src/components/main/SafeLinkModal.tsx","webpack:///./src/components/common/CalendarModal.tsx","webpack:///./src/components/common/DeleteMessageModal.tsx","webpack:///./src/components/common/PinMessageModal.tsx","webpack:///./src/components/common/UnpinAllMessagesModal.tsx","webpack:///./src/components/middle/DeleteSelectedMessagesModal.tsx","webpack:///./src/components/middle/MessageSelectToolbar.tsx","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/ui/FloatingActionButton.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/common/Picker.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/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/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","message","mediaEl","fromImage","getNodes","width","windowWidth","windowSize","get","mediaSize","isVideo","photo","video","webPage","getMessageContent","Boolean","getVideoDimensions","getPhotoFullDimensions","AVATAR_FULL_DIMENSIONS","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","isVideoDownloadAllowed","setIsVideoDownloadAllowed","useState","videoMediaHash","getMessageMediaHash","undefined","videoBlobUrl","downloadProgress","useMediaWithDownloadProgress","useEffect","download","handleVideoDownloadClick","e","stopPropagation","isAllowed","MenuButton","useMemo","onTrigger","isOpen","Button","round","color","ariaLabel","IS_MOBILE_SCREEN","DropdownMenu","trigger","positionX","MenuItem","icon","href","ProgressSpinner","progress","noCross","MediaViewerFooter","text","isHideable","isMultiline","setIsMultiline","footerContent","checkIsMultiline","clientHeight","handleResize","throttle","addEventListener","removeEventListener","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","useLayoutEffect","listener","listenerEnter","listenerExit","current","PLATFORM_ENV","requestFullscreen","webkitRequestFullscreen","webkitEnterFullscreen","mozRequestFullScreen","mozCancelFullScreen","webkitCancelFullScreen","webkitExitFullscreen","useFullscreenStatus","isBuffered","bufferingHandlers","useBuffering","shouldRender","shouldRenderSpinner","transitionClassNames","spinnerClassNames","useShowTransition","pause","safePlay","togglePlayState","play","useVideoCleanup","handleMouseOver","handleMouseOut","handleTimeUpdate","currentTarget","handleEnded","handleFullscreenChange","handleSeek","Number","target","toggleControls","togglePayingStateBySpace","wrapperStyle","videoStyle","onMouseOver","onMouseOut","ref","autoPlay","playsInline","loop","muted","onEnded","onTimeUpdate","join","square","isShown","onChangeZoom","prevIsShown","usePrevious","inputRef","zoomLevel","setZoomLevel","isSeeking","handleStartSeek","handleStopSeek","buildClassName","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","preventDefault","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","animationKey","webPagePhoto","getMessageWebPagePhoto","getMessagePhoto","getMessageVideo","isWebPagePhoto","isPhoto","isFromSharedMedia","isFromSearch","slideAnimation","headerAnimation","isGhostAnimation","getMessageMediaFilename","prevSenderId","canPanZoomWrap","setCanPanZoomWrap","setIsZoomed","panDelta","setPanDelta","messageIds","getChatMediaMessageIds","selectedMediaMessageIndex","indexOf","isFirst","isLast","getMediaHash","full","photos","getChatAvatarHash","blobUrlPictogram","useMedia","ApiMediaFormat","BlobUrl","previewMediaHash","blobUrlPreview","startsWith","DataUri","fullMediaData","getMessageMediaFormat","localBlobUrl","thumbDataUri","useBlurSync","getMessageMediaThumbDataUri","photoDimensions","videoDimensions","toggle","forceUpdate","useForceUpdate","addListener","removeListener","prevMessage","prevOrigin","prevAvatarOwner","prevBestImageData","dispatchHeavyAnimationEvent","textParts","renderMessageText","timer","closeZoom","handleZoomToggle","handleZoomValue","level","canCloseZoom","close","handleFooterClick","handleForward","fromChatId","captureEscKeyListener","stopCurrentAudio","getMessageId","fromId","direction","index","selectPreviousMedia","selectNextMedia","handleKeyDown","shouldCloseOnVideo","captureEvents","excludedClosestSelector","onSwipe","SwipeDirection","Right","Left","handlePan","renderSlide","isActive","calculateMediaViewerDimensions","renderSenderInfo","ShowTransition","Transition","activeKey","name","aria-label","chats","byId","chatsById","listIds","currentUserId","activeListIds","active","archivedListIds","archived","setForwardChatId","exitForwardMode","loadMoreChats","filter","setFilter","focus","blur","chatIds","sortChatIds","getCanPostInChat","MAIN_THREAD_ID","searchWords","getChatTitle","viewportIds","getMore","useInfiniteScroll","handleFilterChange","modalHeader","InputText","placeholder","Modal","header","InfiniteScroll","items","onLoadMore","noScrollRestore","map","ListItem","PrivateChatInfo","status","userId","GroupChatInfo","Loading","getErrorHeader","error","isSlowMode","errors","dismissError","title","getReadableErrorText","isText","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","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","formatMonthAndYear","d","dateCopy","letter","role","tabIndex","handleDateSelect","inputMode","formatHumanDate","formatTime","formatSubmitLabel","isSchedule","selectCurrentMessageList","canDeleteForAll","selectAllowedMessageActions","contactName","getUserFirstOrLastName","getPrivateChatUserId","willDeleteForCurrentUserOnly","isChatBasicGroup","willDeleteForAll","isChatSuperGroup","album","deleteMessages","deleteScheduledMessages","handleDeleteMessageForAll","messages","shouldDeleteForAll","handleDeleteMessageForSelf","onEnter","isPrivateChat","isChatWithSelf","selectIsChatWithSelf","isChannel","isChatChannel","isGroup","isSuperGroup","canPinForAll","pinMessage","handlePinMessageForAll","isUnpin","handlePinMessage","isOneSide","isSilent","pinnedMessagesCount","onUnpin","selectedMessageIds","selectedMessages","selectCanDeleteSelectedMessages","selectCurrentChat","exitMessageSelectMode","messageListType","canDelete","selectedMessagesCount","selectSelectedMessagesCount","canDeleteMessages","canPost","openForwardMenuForSelectedMessages","isDeleteModalOpen","openDeleteModal","closeDeleteModal","useFlag","captureKeyboardListeners","onBackspace","onDelete","onEsc","prevSelectedMessagesCount","renderingSelectedMessagesCount","formattedMessagesCount","destructive","privateChatUserId","privateChatUser","isPinned","selectIsChatPinned","withUsername","contextActions","useChatContextActions","handleDelete","avatarSize","DeleteChatModal","runThrottled","cb","userIds","topUserIds","topPeers","usersById","users","recentlyFoundChatIds","globalSearch","onReset","loadTopUsers","loadContactList","openChat","addRecentlyFoundChatId","clearRecentlyFoundChats","topUsersRef","useHorizontalScroll","handleClick","lastSyncTime","searchQuery","mediaThumbnail","mediaBlobUrl","isRoundVideo","getMessageRoundVideo","withOnlineStatus","isSavedMessages","isSelf","isVerified","VerifiedIcon","Link","formatPastTimeShort","getMessageSummaryText","highlight","renderMessageSummary","searchDate","onSelect","suggestions","match","formatDateToString","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","unique","foundMessages","split","sort","a","b","handleClickShowMoreLocal","handleClickShowMoreGlobal","nothingFound","noScrollRestoreOnTop","noFastList","NothingFound","description","PickerSelectedItem","chatOrUserId","clickArg","createMapStateToProps","props","currentType","isVoice","isLoading","searchChatId","handleSelectMedia","canRenderContents","useAsyncRendering","SLIDE_TRANSITION_DURATION","isMediaGrid","isMessageList","classNames","itemSelector","Media","idPrefix","getSenderName","senderName","isChatGroup","handleMessageFocus","shouldDrawDateDivider","toYearMonth","WebLink","onMessageClick","getMessageDocument","Document","withDate","datetime","smaller","onDateClick","openAudioPlayer","handlePlayAudio","Audio","renderingFor","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","formatPhoneNumberWithCode","phoneNumber","FloatingActionButton","buttonClassName","LINK_PREFIX_REGEX","USERNAME_REGEX","runDebouncedForCheckUsername","debounce","currentUsername","asLink","isUsernameAvailable","checkUsername","setUsername","langPrefix","label","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","runThrottledForLoadRecommended","orderedIds","orderedFolderIds","foldersById","recommended","recommendedChatFolders","chatFolders","notifySettings","selectNotifySettings","notifyExceptions","selectNotifyExceptions","onCreateFolder","onEditFolder","loadRecommendedChatFolders","addChatFolder","showError","animationData","setAnimationData","isAnimationLoaded","setIsAnimationLoaded","handleAnimationLoad","getAnimationData","then","handleCreateFolder","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","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","orderedPinnedIds","archivedPinnedIds","activeChatArrays","prepareChatList","archivedChatArrays","pinnedChats","otherChats","displayedIds","newFilter","handleSelectedIdsChange","ids","handleSelectedChatTypesChange","newFilters","forEach","handleReset","handleEditFolder","handleAddIncludedChats","handleAddExcludedChats","options","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","RadioGroup","selected","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","theme","slug","thumbRef","useCanvasBlur","isDownloadAllowed","setIsDownloadAllowed","fullMedia","wasDownloadDisabled","UPLOADING_WALLPAPER_SLUG","cacheKeyRef","handleSelect","blob","fetchBlob","cacheApi","CUSTOM_BG_CACHE_NAME","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","data","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","containerRef","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","privacy","blocked","activeSessions","blockedCount","totalCount","sessionsCount","visibilityPrivacyPhoneNumber","visibility","visibilityPrivacyLastSeen","lastSeen","visibilityPrivacyProfilePhoto","profilePhoto","visibilityPrivacyForwarding","forwards","visibilityPrivacyGroupChats","chatInvite","loadPrivacySettings","loadBlockedContacts","loadAuthorizations","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","hash","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","code","itemIds","filterPlaceholder","notFoundText","searchInputId","getCurrentPrivacySettings","isAllowList","setPrivacySettings","selectedContactIds","setSearchQuery","isSubmitShown","setIsSubmitShown","newSelectedContactIds","setNewSelectedContactIds","handleSelectedContactIdsChange","contactsIds","foldersState","foldersDispatch","twoFaState","twoFaDispatch","handleSaveFilter","renderCurrentSection","Main","renderCurrentSectionContent","contactIds","resultIds","sortUserIds","forceShowSelf","isSearching","selectedMemberIds","onSelectedMemberIdsChange","onNextStep","setGlobalSearchQuery","handleNextStep","creationProgress","creationError","chatCreation","memberIds","createGroupChat","createChannel","setTitle","about","setAbout","ChatCreationProgress","handleTitleChange","handleDescriptionChange","handleCreateGroup","handleCreateChannel","renderedError","RENDER_COUNT","LeftColumnContent","onContentChange","newChatMemberIds","setNewChatMemberIds","NewChannelStep2","NewGroupStep2","NewChannelStep1","NewGroupStep1","folderType","noChatsText","IGNORED_KEYS","Down","ArrowDown","Up","ArrowUp","ArrowLeft","ArrowRight","PageUp","PageDown","End","Home","Tab","preventDefaultForScrollKeys","disableScrolling","passive","ontouchmove","onkeydown","enableScrolling","getCopyLabel","hasSelection","canImageBeCopied","MessageContextMenu","anchor","canSendNow","canReschedule","canReply","canEdit","canPin","canUnpin","canForward","canFaveSticker","canUnfaveSticker","canCopy","canCopyLink","canSelect","onReply","onEdit","onPin","onFaveSticker","onUnfaveSticker","onSend","onReschedule","onCloseAnimationEnd","onCopyLink","copyOptions","afterEffect","getMessageText","CLIPBOARD_ITEM_SUPPORTED","selection","getSelection","mediaLoader","copyImageToClipboard","anchorNode","parentNode","clipboardText","copyTextToClipboard","getMessageCopyOptions","getTriggerElement","getRootElement","getMenuElement","positionY","useContextMenuPosition","Menu","noOptions","isScheduled","setReplyingToId","setEditingId","faveSticker","unfaveSticker","toggleMessageSelection","sendScheduledMessages","rescheduleMessage","loadMessageLink","isMenuOpen","setIsMenuOpen","setIsDeleteModalOpen","isPinModalOpen","setIsPinModalOpen","isCalendarOpen","openCalendar","closeCalendar","closeMenu","closePinModal","handleCloseCalendar","handleReply","handleEdit","handlePin","handleUnpin","handleFaveSticker","handleUnfaveSticker","handleSelectMessage","params","childMessageIds","withShift","handleScheduledMessageSend","handleOpenCalendar","handleRescheduleMessage","scheduledAt","handleCopyLink","scheduledMaxDate","getDayStartAt","selectStickerSet","stickerSetId","loadStickers","toggleStickerSet","sendMessage","throttleMs","isDisabled","stickerSetAccessHash","isPreloadedGlobally","handleButtonClick","hasCloseButton","STICKER_SIZE_MODAL","isRestricted","isMuted","canDeleteChat","getCanDeleteChat","canSubscribe","canSearch","canMute","canLeave","onSubscribeChannel","onSearchClick","updateChatMutedState","enterMessageSelectMode","handleToggleMuteClick","handleSubscribe","handleSearch","handleSelectMessages","Portal","runDebouncedForSearch","results","selectCurrentTextSearch","setLocalTextSearchQuery","searchTextMessagesLocal","closeLocalTextSearch","searchMessagesByDate","focusedIndex","setFocusedIndex","visualViewport","mainEl","activeElement","pageTop","Array","from","input","div","contentEditable","handleMessageSearchQueryChange","newQuery","handleJumpToDate","timestamp","valueOf","handleUp","newFocusIndex","handleDown","SearchInput","findInViewport","selectorOrElements","margin","isDense","shouldContainBottom","isHorizontal","viewportY1","viewportY2","allElements","visibleIndexes","isFound","y1","y2","isFullyVisible","onInsertUserName","filteredChatMembers","getSelectedIndex","newIndex","cycleRestrict","selectedMentionIndex","setSelectedMentionIndex","handleArrowKey","handleUserSelect","forceFocus","handleSelectMention","member","onUp","onDown","onTab","first","position","fastSmoothScroll","setItemVisible","prevChatMembers","renderedChatMembers","attachments","caption","canSuggestMembers","groupChatMembers","recentEmojis","onCaptionUpdate","addRecentEmoji","onFileAppend","onClear","hideTimeoutRef","prevAttachments","renderingAttachments","isHovered","markHovered","unmarkHovered","isQuick","every","quick","isMentionTooltipOpen","mentionFilter","closeMentionTooltip","insertMention","mentionFilteredMembers","useMentionTooltip","EDITABLE_INPUT_MODAL_ID","isEmojiTooltipOpen","closeEmojiTooltip","filteredEmojis","insertEmoji","useEmojiTooltip","sendAttachments","handleFilesDrop","dataTransfer","newFiles","file","CONTENT_TYPES_FOR_QUICK_UPLOAD","areAllPhotos","mimeType","areAllVideos","renderHeader","onDragEnter","onDrop","onDragOver","onDragLeave","relatedTarget","toTarget","fromTarget","data-attach-description","attachment","File","filename","extension","getFileExtension","previewData","emojis","onEmojiSelect","MessageInput","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","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","allowedAttachmentOptions","setRecentEmojis","handleMouseEnter","handleMouseLeave","fastRaf","recentEmojisRef","renderContent","isFrom","onMouseEnter","onMouseLeave","noCloseOnBackdrop","onFileSelect","onPollCreate","handleQuickSelect","handleDocumentSelect","canAttachMedia","canAttachPolls","autoClose","forEmoji","clearStickersForEmoji","prevStickers","displayedStickers","clickInlineButton","keyboardButtons","row","button","onSilentSend","onScheduleSend","listEmojis","usePrevDuringAnimation","selectedIndex","setSelectedIndex","emojisCount","handleSelectEmoji","onLeft","onRight","messagesById","foundResults","senderUser","getGlobal","senderChat","forwardInfo","isChannelPost","orderBy","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","currentIsMuted","isNotificationsEnabled","setIsNotificationsEnabled","ManagementProgress","handleNotificationChange","handleDeleteContact","lastMessage","maxId","withFullInfo","hasLinkedChannel","linkedChatId","isBasicGroup","canChangeInfo","getHasAdminRight","canBanUsers","togglePreHistoryHidden","updateChat","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","isCreator","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","onKeyDown","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","globalErrors","validateRequestedInfo","sendPaymentForm","setPaymentStep","sendCredentialsInfo","clearPaymentError","paymentState","paymentDispatch","currencySign","field","fieldError","getShippingError","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":"yjEAiBO,SAASA,EACdC,EAAoBC,EAA2BC,EAAuBC,GAEtE,MAAQC,QAASC,GAAcC,EAASL,EAAQE,GAChD,IAAKE,EACH,OAGF,MAAQE,MAAOC,GAAgBC,IAAWC,MAE1C,IACIC,EADAC,GAAU,EAEd,GAAIT,EAAS,CACX,MAAM,MAAEU,EAAF,MAASC,EAAT,QAAgBC,GAAYC,YAAkBb,GACpDS,EAAUK,QAAQH,GAClBH,EAAYG,EAAQI,aAAmBJ,GAAUK,YAAwBN,GAASE,EAASF,YAE3FF,EAAYS,IAId,MACEb,MAAOc,EAAgBC,OAAQC,GAC7BC,YAAkCxB,EAAWY,IACzCL,MAAOkB,EAASH,OAAQI,GAAaC,YAC3CN,EAAgBE,EAAiBZ,EAAUJ,MAAOI,EAAUW,QAExDM,GAAUpB,EAAciB,GAAW,EACnCI,EAgPR,SAAsB7B,GACpB,MAAM8B,EAAMC,OAAOC,WAAWC,KAC9B,IAAIC,EAAe,MACflC,IACFkC,GAAgBJ,EAAIK,QAAU,KAAQ,OAGxC,OAAOD,EAAeE,IAvPRC,CAAarC,IAAcuB,EAAkBG,GAAY,EAEvE,IACEY,IAAKC,EAASC,KAAMC,EAAUlC,MAAOmC,EAAWpB,OAAQqB,GACtDtC,EAAUuC,wBAEd,GAAI,CACFC,IAAkBC,YAClBD,IAAkBE,MAClBF,IAAkBG,eAClBH,IAAkBI,cAClBC,SAASjD,GAAS,CAClB,MAAMkD,EAwLV,SAAiBC,EAAmBC,EAAoBf,EAAaE,EAAcjC,EAAee,GAChG,GAAI8B,IAAcC,EAAY,CAC5B,MAAMC,EAAOC,KAAKC,IAAIjD,EAAOe,IAAW8B,EAAYC,GACpDb,IAASc,EAAO/C,GAAS,EACzB+B,IAAQgB,EAAOhC,GAAU,EACzBf,EAAQ+C,EACRhC,EAASgC,OACJ,GAAIF,EAAYC,EAAY,CACjC,MAAMI,EAAWlD,EAEjBiC,KADAjC,EAAQe,GAAU8B,EAAYC,IACbI,GAAY,OACxB,GAAIJ,EAAaD,EAAW,CACjC,MAAMM,EAAYpC,EAElBgB,KADAhB,EAASf,GAAS8C,EAAaD,IACdM,GAAa,EAGhC,MAAO,CACLpB,MAAKE,OAAMjC,QAAOe,UA1MAqC,CAAQlC,EAASC,EAAUa,EAASE,EAAUC,EAAWC,GAC3EJ,EAAUY,EAAUb,IACpBG,EAAWU,EAAUX,KACrBE,EAAYS,EAAU5C,MACtBoC,EAAaQ,EAAU7B,OAGzB,MAAMsC,EAAkBnB,EAAWC,EAAY,GAAMd,EAASH,EAAU,GAClEoC,EAAkBtB,EAAUI,EAAa,GAAMd,EAAQH,EAAW,GAClEoC,EAAapB,EAAYjB,EACzBsC,EAAapB,EAAajB,EAE1BsC,EAAQC,EAAY/D,GAAiBG,GAC3C6D,EAAYF,EAAO,CACjB1B,IAAQT,EAAF,KACNW,KAASZ,EAAF,KACPrB,MAAUkB,EAAF,KACRH,OAAWI,EAAF,KACTyC,UAAY,eAAcP,QAAqBC,iBAA8BC,MAAeC,OAE9FK,EAAWJ,EAAO/D,GAElBoE,SAASC,KAAKC,UAAUC,IAAI,mBAE5BC,sBAAsB,KACpBJ,SAASC,KAAKI,YAAYV,GAE1BS,sBAAsB,KACpBT,EAAMW,MAAMR,UAAY,GA0R9B,SAAoBH,GACjBA,EAAMY,WAA2BD,MAAME,UAAY,UACpDb,EAAMO,UAAUO,OAAO,kBAAmB,UA3RtCC,CAAWf,GAEXgB,WAAW,KACTP,sBAAsB,KAChBJ,SAASC,KAAKW,SAASjB,IACzBK,SAASC,KAAKY,YAAYlB,GAE5BK,SAASC,KAAKC,UAAUO,OAAO,sBA9Ed,IAgFGK,SAKvB,SAASC,EAAenF,EAA2BC,EAAuBC,GAC/E,MAAM,UAAEkF,EAAWjF,QAASkF,GAAYhF,EAASL,EAAQE,GACzD,IAAKmF,EACH,OAGF,MAAMjF,EAAYgE,SAASkB,eAAe,eAAgBC,cACxD,0EAEF,IAAKnF,IAAciF,EACjB,OAGF,MACEhD,IAAKC,EAASC,KAAMC,EAAUlC,MAAOmC,EAAWpB,OAAQqB,GACtDtC,EAAUuC,yBAEZN,IAAKmD,EAAWjD,KAAMZ,EAAQrB,MAAOkB,EAASH,OAAQI,GACpD4D,EAAQ1C,wBAEZ,IAAIf,EAAQ4D,EACZ,IA8IF,SAA6BC,GAC3B,GAAyB,SAArBA,EAAGf,MAAMgB,QACX,OAAO,EAGT,MAAMC,EAAOF,EAAG9C,yBACRtB,OAAQuE,GAAiBpF,IAAWC,MAE5C,OAAQkF,EAAKtD,KAAOuD,GAAmBD,EAAKtD,IAAMsD,EAAKtE,QAAW,EAtJ7DwE,CAAoBT,GAAY,CACnC,MAAQ/D,OAAQuE,GAAiBpF,IAAWC,MAC5CmB,EAAQ4D,EAAYlD,GAAWb,EAAWmE,EAG5C,MAAMjC,EAAkBnB,EAAWC,EAAY,GAAMd,EAASH,EAAU,GAClEoC,EAAkBtB,EAAUI,EAAa,GAAMd,EAAQH,EAAW,GACxE,IAAIoC,EAAapB,EAAYjB,EACzBsC,EAAapB,EAAajB,EAE9B,MAAMqE,EACJ,CAAClD,IAAkBmD,OAAQnD,IAAkBoD,iBAAiB/C,SAASjD,KACnEiG,EAA2Bb,EAAWC,IAE1C,CAACzC,IAAkBE,MAAOF,IAAkBG,gBAAgBE,SAASjD,KACjEiG,EAA2Bb,EAAWC,GAGxC,CACFzC,IAAkBC,YAClBD,IAAkBE,MAClBF,IAAkBG,eAClBH,IAAkBI,cAClBC,SAASjD,KACL6D,EAAaC,EACfD,EAAaC,EACJA,EAAaD,IACtBC,EAAaD,IAIjB,MAAMqC,EAAgB9B,SAAS+B,uBAAuB,SAAS,GAEzDpC,EAAQmC,GAAiBlC,EAAY/D,GAAiBoF,EAASrF,IAAW4C,IAAkBwD,eAC7FF,GACHjC,EAAYF,EAAO,CACjB1B,IAAQT,EAAF,KACNW,KAASZ,EAAF,KACPrB,MAAUkB,EAAF,KACRH,OAAWI,EAAF,KACTyC,UAAY,eAAcP,QAAqBC,iBAA8BC,MAAeC,OAIhGU,sBAAsB,KACpB,GAAI0B,EAAe,CACjB,MAAM,IACJ7D,EADI,KAEJE,EAFI,MAGJjC,EAHI,OAIJe,GACE6E,EAAcvD,wBAIlBsB,EAAYF,EAAO,CACjBsC,WAAY,OACZhE,IAAQT,EAAF,KACNW,KAASZ,EAAF,KACP2E,gBAAiB,WACjBpC,UAAY,eAAc3B,EAAOZ,QAAaU,EAAMT,iBARvCtB,EAAQkB,MACRH,EAASI,KAQtBnB,MAAUkB,EAAF,KACRH,OAAWI,EAAF,OAGb2C,SAASC,KAAKC,UAAUC,IAAI,mBACvB2B,GAAe9B,SAASC,KAAKI,YAAYV,GAE9CS,sBAAsB,KAChB0B,IACFA,EAAcxB,MAAM2B,WAAa,IAGnCtC,EAAMW,MAAMR,UAAY,GAEpB4B,IACF/B,EAAMW,MAAM6B,QAAU,KAGxBpC,EAAWJ,EAAO/D,GAElB+E,WAAW,KACTP,sBAAsB,KAChBJ,SAASC,KAAKW,SAASjB,IACzBK,SAASC,KAAKY,YAAYlB,GAE5BK,SAASC,KAAKC,UAAUO,OAAO,sBAhMd,IAkMGK,SAK9B,SAASlB,EAAYwC,EAAsDC,GAA0B,GACnG,MAAM1C,EAAQK,SAASsC,cAAc,OACrC3C,EAAMO,UAAUC,IAAI,SAEpB,MAAMoC,EAAM,IAAIC,MAYhB,GAVsB,iBAAXJ,EACTG,EAAIE,IAAML,EACDA,aAAkBM,iBAC3BH,EAAIE,IAAML,EAAOO,OAEjBJ,EAAIE,IAAML,EAAOK,IAGnB9C,EAAMU,YAAYkC,GAEdF,EAAyB,CAC3B1C,EAAMO,UAAUC,IAAI,eACpB,MAAMyC,EAAc5C,SAASmB,cAAc,mCACvCyB,GACFjD,EAAMU,YAAYuC,EAAYC,WAAU,IAI5C,OAAOlD,EAoCT,SAASkC,EAA2Bb,EAAwB8B,GAC1D,MAAMC,EAAqB/C,SAASmB,cAA8B,0BAClE,IAAI6B,EAAehC,EAAUiC,UAAYH,EAAQI,QAAwB,4BAA6BD,UAKtG,OAJIjC,EAAUmC,GAAGtE,SAAS,kBACxBmE,GAAgBhC,EAAUoC,cAAeH,UAAYjC,EAAUkC,QAAwB,YAAaD,WAG/FD,EAAeD,EAAmBM,WACpCL,EAAeF,EAAQQ,aAAeP,EAAmBM,UAAYN,EAAmBO,aAa/F,SAASzD,EAAY0D,EAAsBC,GACzCC,OAAOC,OAAOH,EAAQjD,MAAOkD,GAG/B,SAASvH,EAASL,EAA2BE,GAC3C,IAAI6H,EACAC,EAEJ,OAAQhI,GACN,KAAK4C,IAAkBE,MACvB,KAAKF,IAAkBG,eACrBgF,EAAqB,uCAAsC7H,EAASqH,GACpES,EAAgB,cAChB,MAEF,KAAKpF,IAAkBC,YACrBkF,EAAqB,gBAAe7H,EAASqH,GAC7CS,EAAgB,MAChB,MAEF,KAAKpF,IAAkBI,aACrB+E,EAAqB,gBAAe7H,EAASqH,GAC7CS,EAAgB,MAChB,MAEF,KAAKpF,IAAkBqF,mBACrBF,EAAoB,kCACpBC,EAAgB,mBAChB,MAEF,KAAKpF,IAAkBwD,cACrB2B,EAAoB,kDACpBC,EAAgB,mBAChB,MAEF,KAAKpF,IAAkBoD,gBACvB,KAAKpD,IAAkBmD,OACvB,QACEgC,EAAqB,kCAAiC7H,EAASqH,GAC/DS,EAAgB,4DAGpB,MAAM5C,EAAYhB,SAASmB,cAA2BwC,GAChDG,EAAW9C,GAAaA,EAAU+C,iBAAsDH,GAE9F,MAAO,CACL5C,YACAjF,QAAS+H,GAAYA,EAASA,EAASE,OAAS,IAIpD,SAASjE,EAAWJ,EAAuB/D,GACzC,OAAQA,GACN,KAAK4C,IAAkBE,MACvB,KAAKF,IAAkBG,eACvB,KAAKH,IAAkBmD,OACvB,KAAKnD,IAAkBoD,gBACrBjC,EAAMO,UAAUC,IAAI,mBACpB,MAEF,KAAK3B,IAAkBC,YACvB,KAAKD,IAAkBwD,cACvB,KAAKxD,IAAkBI,aACpBe,EAAMY,WAA2BD,MAAME,UAAY,QACpD,MAEF,KAAKhC,IAAkBqF,mBACrBlE,EAAMO,UAAUC,IAAI,W,8ECnSX8D,kBACb,CAACC,GAAUC,SAAQC,YAAWC,eAC5B,GAAIA,GAAYF,EACd,MAAO,CACLG,OAAQC,aAAcJ,GAAUK,aAAWN,EAAQC,GAAUM,YAAWP,EAAQC,IAIpF,IAAKC,IAAcD,EACjB,MAAO,GAGT,MAAMrI,EAAU4I,YAAkBR,EAAQC,EAAQC,GAElD,MAAO,CACLtI,UACAwI,OAAQxI,GAAW6I,aAAaT,EAAQpI,KAG5C,CAAC8I,EAAWC,IAA2BC,YAAKD,EAAS,CAAC,mBAAoB,iBAnB7DZ,CApC+C,EAC5DE,SAAQC,YAAWE,SAAQD,WAAUvI,UAASiJ,mBAAkBC,mBAEhE,MAAMC,EAAqBC,YAAY,KACrCH,IACAC,EAAa,CAAEb,SAAQC,eACtB,CAACD,EAAQa,EAAcZ,EAAWW,IAE/BI,EAAOC,cAEb,IAAKd,IAAYxI,IAAYuI,EAC3B,OAGF,MAAMgB,EAAaf,EAAOnB,GAAK,EACzBmC,EAAcC,YAAeJ,EAAMb,GAEzC,OACE,yBAAKkB,UAAU,aAAaC,QAASR,GAClCI,EACC,kBAACK,EAAA,EAAD,CAAQC,IAAKrB,EAAOnB,GAAIlE,KAAK,SAAS2G,KAAMtB,IAE5C,kBAACoB,EAAA,EAAD,CAAQC,IAAKrB,EAAOnB,GAAIlE,KAAK,SAAS4G,KAAMvB,IAE9C,yBAAKkB,UAAU,QACb,yBAAKA,UAAU,QAAQM,IAAI,QACxBR,GAAeS,YAAWT,IAE7B,yBAAKE,UAAU,OAAOM,IAAI,QACvBzB,EAAWc,EAAK,+BAAiCa,YAAoBb,EAAsB,IAAhBrJ,EAASmK,W,yCCuHhFC,MAxJ0B,EACvCC,YACA5J,UACA6J,WACAtK,UACAuK,WACAhC,WACAiC,qBACAC,YACAC,mBAEA,MAAOC,EAAwBC,GAA6BC,aAAS,GAC/DC,EAAiBrK,GAAWT,EAAU+K,YAAoB/K,EAAS,iBAAcgL,GAErFX,UAAWY,EADP,iBACqBC,GACvBC,YAA6BL,GAAiBH,GAGlDS,YAAU,KACJT,GAA0BM,IAC5BI,YAASJ,EAAcV,GACvBK,GAA0B,KAE3B,CAACL,EAAUU,EAAcN,IAG5BS,YAAU,KACRR,GAA0B,IACzB,CAACE,IAEJ,MAAMQ,EAA2BlC,YAAamC,IAC5CA,EAAEC,kBACFZ,EAA2Ba,IAAeA,IACzC,IAEGpC,EAAOC,cAEPoC,EAA8DC,YAAQ,IACnE,EAAGC,YAAWC,YACnB,kBAACC,EAAA,EAAD,CACEC,OAAK,EACL5I,KAAK,UACL6I,MAAM,cACNtC,UAAWmC,EAAS,cAAWb,EAC/BrB,QAASiC,EACTK,UAAU,gBAEV,uBAAGvC,UAAU,eAGhB,IAEH,OAAIwC,IAEA,yBAAKxC,UAAU,6BACb,kBAACyC,EAAA,EAAD,CACEC,QAASV,EACTW,UAAU,UAER9D,GACA,kBAAC+D,EAAA,EAAD,CACEC,KAAK,UACL5C,QAASc,GAERpB,EAAK,YAGT5I,EACC,kBAAC6L,EAAA,EAAD,CACEC,KAAM5B,EAAyB,QAAU,WACzChB,QAAS2B,GAERX,EAA4BvH,KAAK2I,MAAyB,IAAnBb,GAAb,mBAAyD,YAGtF,kBAACoB,EAAA,EAAD,CACEC,KAAK,WACLC,KAAMnC,EACNgB,SAAUd,GAETlB,EAAK,uBAIXsB,GAA0B,kBAAC8B,EAAA,EAAD,CAAiBC,SAAUxB,EAAkB/H,KAAK,IAAIwJ,SAAO,KAM5F,yBAAKjD,UAAU,uBACXnB,GACA,oCACE,kBAACuD,EAAA,EAAD,CACEC,OAAK,EACL5I,KAAK,UACL6I,MAAM,oBACNC,UAAW5C,EAAK,WAChBM,QAASc,GAET,uBAAGf,UAAU,mBAIlBjJ,EACC,kBAACqL,EAAA,EAAD,CACEC,OAAK,EACL5I,KAAK,UACL6I,MAAM,oBACNC,UAAW5C,EAAK,qBAChBM,QAAS2B,GAERX,EACC,kBAAC8B,EAAA,EAAD,CAAiBC,SAAUxB,EAAkB/H,KAAK,IAAIwG,QAAS2B,IAE/D,uBAAG5B,UAAU,mBAIjB,kBAACoC,EAAA,EAAD,CACEU,KAAMnC,EACNgB,SAAUd,EACVwB,OAAK,EACL5I,KAAK,UACL6I,MAAM,oBACNC,UAAW5C,EAAK,sBAEhB,uBAAGK,UAAU,mBAGjB,kBAACoC,EAAA,EAAD,CACEC,OAAK,EACL5I,KAAK,UACL6I,MAAM,oBACNC,UAAW3B,EAAW,WAAa,UACnCX,QAASe,GAET,uBAAGhB,UAAWY,EAAW,gBAAkB,kBAE7C,kBAACwB,EAAA,EAAD,CACEC,OAAK,EACL5I,KAAK,UACL6I,MAAM,oBACNC,UAAW5C,EAAK,SAChBM,QAASa,GAET,uBAAGd,UAAU,kB,cC1HNkD,MAxCyB,EAAGC,OAAO,GAAIC,aAAYnD,cAChE,MAAOoD,EAAaC,GAAkBnC,aAAS,GA4B/C,OA3BAO,YAAU,KACR,MAAM6B,EAAgB/I,SAASmB,cAAc,kCAEvC6H,EAAmB,KACvB,MAAM/L,EAAS8L,EAAgBA,EAAcE,aAAe,EAE5DH,EAAe7L,EAAe,EAANc,MAI1BiL,IAEA,MAAME,EAAeC,YAASH,EAtBP,KAsB6C,GAIpE,OAFAtL,OAAO0L,iBAAiB,SAAUF,GAAc,GAEzC,KACLxL,OAAO2L,oBAAoB,SAAUH,GAAc,KAEpD,IASD,yBAAK1D,UAAY,sBAAoBoD,EAAa,WAAa,IAAMnD,QAPvE,SAAmB4B,GACbsB,GACFtB,EAAEC,oBAMDqB,GACC,yBAAKnD,UAAU,8BAA8BC,QAASA,GACpD,uBAAGD,UAAY,6BAA2BqD,EAAc,YAAc,IAAM/C,IAAI,QAAQ6C,M,iBCtClG,MAAMW,EA8EN,WACE,QAA0C,IAA/BtJ,SAASuJ,kBAClB,MAAO,oBACF,QAA6C,IAAlCvJ,SAASwJ,qBACzB,MAAO,uBACF,QAAgD,IAArCxJ,SAASyJ,wBACzB,MAAO,0BAGT,MAAO,GAvFIC,G,sBCVb,MAAMC,EAAQ,CAAC,QAAS,KAAM,KAAM,KAAM,KAAM,MAEhCC,UACd,MAAMC,EAAmB,IAAVD,EAAc,EAAI1K,KAAK4K,MAAM5K,KAAK6K,IAAIH,GAAS1K,KAAK6K,IAAI,OAEvE,MAAQ,IAAGH,EAAQ,MAAQ1K,KAAK4K,MAAMD,IAASG,QAAQ,MAAML,EAAME,M,OCuBrE,MAAMI,GAAa5C,IACjBA,EAAEC,mBA4IW4C,OAvIyB,EACtCC,mBACAC,cACAC,WACAC,WACAC,iBACAC,uBACAC,WACAC,wBACAC,eACAC,qBACAC,cACAC,aAEA,MAAOC,EAAWC,GAAiBrE,aAAS,GAE5CO,YAAU,KACJqD,GACFS,EAAcT,IAEf,CAACA,IAEJrD,YAAU,KACR,IAAI+D,EAYJ,OAVKV,IACCvC,IACFgD,GAAc,GAEdC,EAAUvN,OAAOiD,WAAW,KAC1BqK,GAAc,IAhCS,MAqCtB,KACDC,GACFvN,OAAOwN,aAAaD,KAGvB,CAACV,IAEJrD,YAAU,MACJ6D,GAAaR,IACfvK,SAASC,KAAKC,UAAUC,IAAI,0BAGvB,KACLH,SAASC,KAAKC,UAAUO,OAAO,4BAEhC,CAAC8J,EAAgBQ,IAEpB,MAAM5F,EAAOC,cA4Cf,IAAwB+F,EAA2BC,EA1CjD,GAAKL,GAAcR,EAInB,OACE,yBAAK/E,UAAY,wBAAsBgF,EAAuB,SAAW,IAAM/E,QAASwE,IA6C5F,SAAwBG,EAAqBC,EAAkBF,EAA0BW,GACvF,MAAMO,EAAoBjB,EAAcC,EAAY,IAC9CiB,EAAwC,IAAnBnB,EAE3B,OACE,yBAAK3E,UAAU,mBACb,yBAAKA,UAAU,yBACb,yBACEA,UAAU,2BAEVlF,MAAQ,UAASgL,GAAsB,OAEzC,yBACE9F,UAAU,yBAEVlF,MAAQ,UAAS+K,GAAoB,OAEvC,2BACEE,IAAI,IACJpM,IAAI,MACJqM,KAAM,IACNC,KAAK,QACLC,QAASZ,EACTtF,UAAU,wBACVmG,MAAON,GAAoB,MApE9BO,CAAexB,EAAaC,EAAUF,EAAkBW,GACzD,kBAAClD,EAAA,EAAD,CACEG,UAAW5C,EAAK,iBAChBlG,KAAK,OACL4M,QAAS7D,IACTF,MAAM,oBACNtC,UAAU,OACVC,QAASoF,GAET,uBAAGrF,UAAWiF,EAAW,aAAe,eAmBhD,SAAoBL,EAAqBC,GACvC,OACE,yBAAK7E,UAAU,eACX,GAAEsG,YAAoB1B,QAAkB0B,YAAoBzB,MApB7D0B,CAAW3B,EAAaC,GACxBF,EAAmB,IAwBFgB,EAxBsBhB,EAwBKiB,EAxBad,EA0B5D,yBAAK9E,UAAU,oBACX,GAAEwG,EAAeZ,EAAYD,QAAwBa,EAAeZ,OA1BrEV,GACC,kBAAC9C,EAAA,EAAD,CACEG,UAAU,aACV9I,KAAK,OACL6I,MAAM,oBACNtC,UAAU,aACVC,QAASmF,GAET,uBAAGpF,UAAY,IAAEmF,EAAe,mBAAqB,wB,wNCyFhDsB,mBA5KmB,EAChCC,MACAC,QACAC,aACAC,aACArF,mBACAsD,WACAgC,oBACAC,SACAC,cAGA,MAAMC,EAAWC,YAAyB,OACnCjC,EAAUkC,GAAehG,aAAUiG,MAAiBC,MACpDzC,EAAa0C,GAAkBnG,YAAS,IACxCoG,EAAmBC,GAAwBrG,aAAS,IAEpDgE,EAAcsC,EAAeC,GHrCvB,SAA6BC,EAAgBR,GAC1D,MAAOhC,EAAcyC,GAAmBzG,YAAS/J,QAAQ0M,GAAQtJ,SAASsJ,KAoE1E,OA9BA+D,YAAgB,KACd,MAAMC,EAAW,KAAQF,EAAgBxQ,QAAQ0M,GAAQtJ,SAASsJ,MAC5DiE,EAAgB,KAAQH,GAAgB,IACxCI,EAAe,KACnBJ,GAAgB,GAChBT,GAAY,IAERlQ,EAAQ0Q,EAAMM,QAWpB,OATAzN,SAASoJ,iBAAiB,mBAAoBkE,GAAU,GACxDtN,SAASoJ,iBAAiB,yBAA0BkE,GAAU,GAC9DtN,SAASoJ,iBAAiB,sBAAuBkE,GAAU,GAEvD7Q,IACFA,EAAM2M,iBAAiB,wBAAyBmE,GAAe,GAC/D9Q,EAAM2M,iBAAiB,sBAAuBoE,GAAc,IAGvD,KACLxN,SAASqJ,oBAAoB,mBAAoBiE,GAAU,GAC3DtN,SAASqJ,oBAAoB,yBAA0BiE,GAAU,GACjEtN,SAASqJ,oBAAoB,sBAAuBiE,GAAU,GAC1D7Q,IACFA,EAAM4M,oBAAoB,wBAAyBkE,GAAe,GAClE9Q,EAAM4M,oBAAoB,sBAAuBmE,GAAc,MAIlE,IAEElE,GAAyB,QAAjBoE,IAIN,CAAC/C,EAtEc,KACfwC,EAAMM,UAAanE,GAAyB,QAAjBoE,OAI5BP,EAAMM,QAAQE,kBAChBR,EAAMM,QAAQE,oBACLR,EAAMM,QAAQG,wBACvBT,EAAMM,QAAQG,0BACLT,EAAMM,QAAQI,sBACvBV,EAAMM,QAAQI,wBACLV,EAAMM,QAAQK,sBACvBX,EAAMM,QAAQK,uBAGhBV,GAAgB,KAGK,KAChBD,EAAMM,UAIPzN,SAASkN,eACXlN,SAASkN,iBACAlN,SAAS+N,oBAClB/N,SAAS+N,sBACA/N,SAASgO,uBAClBhO,SAASgO,yBACAhO,SAASiO,sBAClBjO,SAASiO,uBAGXb,GAAgB,MAkCT,EAAC,GGjC4Cc,CAAoBzB,EAAUE,IAE9E,WAAEwB,EAAF,iBAAchE,EAAd,kBAAgCiE,GAAsBC,eAE1DC,aAAcC,EACdC,qBAAsBC,GACpBC,aAAmBP,OAAYrH,OAAWA,EAAW,QAEzDI,YAAU,KACJqF,IAAWD,EACbG,EAASgB,QAASkB,QACTzC,IAAQU,KAIjBgC,YAASnC,EAASgB,UAEnB,CAAClB,EAAQD,EAAmBJ,IAE/BhF,YAAU,KACJuF,EAASgB,QAASrD,cAAgBqC,EAASgB,QAASpD,UACtDyC,EAAe,GACfH,GAAY,IAEZG,EAAeL,EAASgB,QAASrD,cAElC,CAACA,IAEJ,MAAMyE,EAAkB3J,YAAamC,IACnCA,EAAEC,kBACEmD,GACFgC,EAASgB,QAASkB,QAClBhC,GAAY,KAEZF,EAASgB,QAASqB,OAClBnC,GAAY,KAEb,CAAClC,IAEJsE,YAAgBtC,EAAU,IAE1B,MAAMuC,EAAkB9J,YAAY,KAClC8H,GAAqB,IACpB,IAEGiC,EAAiB/J,YAAY,KACjC8H,GAAqB,IACpB,IAEGkC,EAAmBhK,YAAamC,IACpCyF,EAAezF,EAAE8H,cAAc/E,cAC9B,IAEGgF,EAAclK,YAAY,KAC9B4H,EAAe,GACfH,GAAY,IACX,IAEG0C,EAAyBnK,YAAY,KACrCyF,GAAgBuC,EAClBA,KACUvC,GAAgBsC,GAC1BA,KAED,CAACC,EAAgBvC,EAAcsC,IAE5BqC,EAAapK,YAAamC,IAC9BA,EAAEC,kBAEFmF,EAASgB,QAASrD,YAAemF,OAAOlI,EAAEmI,OAAO7D,OAASc,EAASgB,QAASpD,SAAY,KACvF,IAEGoF,EAAiBvK,YAAamC,IAClCA,EAAEC,kBACF0F,GAAsBD,IACrB,CAACA,IAEJ7F,YAAU,KACR,MAAMwI,EAA4BrI,IAClB,UAAVA,EAAE1B,KAA6B,MAAV0B,EAAE1B,KACzBkJ,EAAgBxH,IAMpB,OAFArH,SAASoJ,iBAAiB,UAAWsG,GAA0B,GAExD,KACL1P,SAASqJ,oBAAoB,UAAWqG,GAA0B,KAEnE,CAACb,IAEJ,MAAMc,EAAetD,GAAe,UAASA,EAAWnQ,oBAAoBmQ,EAAWpP,WACjF2S,EAAc,yBAAwBxD,KAE5C,OACE,yBACE5G,UAAU,cACVC,SAAU0G,GAASnE,IAAmByH,OAAiB3I,EACvD+I,YAAc1D,OAA0BrF,EAAlBkI,EACtBc,WAAa3D,OAAyBrF,EAAjBmI,GAErB,yBAEE3O,MAAOqP,GAGP,8BACEI,IAAKtD,EACLuD,SAAUpD,IACVqD,aAAW,EACXC,KAAM/D,EAENgE,MAAOhE,EACPhJ,GAAG,qBAEH7C,MAAOsP,EACPQ,QAAShB,GAELhB,EAZN,CAaEiC,aAAcnB,IAEbhD,GAAO,4BAAQzJ,IAAKyJ,MAGxBqC,GACC,yBAAK/I,UAAW,CAAC,oBAAqBiJ,GAAmB6B,KAAK,OAC1DnC,GAAc,yBAAK3I,UAAU,aAAf,gBAChB,kBAAC+C,EAAA,EAAD,CACEtJ,KAAK,KACLuJ,SAAU2F,EAAa,EAAInH,EAC3BuJ,QAAM,EACN9K,QAAS+G,MAIbL,IAAUoC,GACV,kBAAC,GAAD,CACE9D,SAAUA,EACVN,iBAAkBA,EAClBC,YAAaA,EACbM,sBAAuB9N,QAAQqQ,GAC/BtC,aAAcA,EACdL,SAAUA,EACVD,SAAUoC,EAASgB,QAAUhB,EAASgB,QAAQpD,SAAW,EACzDE,gBAAiBE,GAAYsC,EAC7BvC,qBAAsB6B,GAAcA,EAAWnQ,MApKpB,IAqK3B4O,OAAQwE,EACR1E,mBAAoByE,EACpBxE,YAAagE,O,eCxER5C,mBArGoB,EAAGuE,UAASC,mBAC7C,MAAM,qBAAEjC,GAAyBE,YAAkB8B,GAC7CE,EAAcC,YAAqBH,GAEnCI,EAAWlE,YAAyB,OACnCmE,EAAWC,GAAgBnK,YAAS,GACrCoK,EAAYrE,aAAgB,GAElCxF,YAAU,KACJsJ,IAAYE,GACdI,EAZmB,MAcpB,CAACN,EAASE,IAEb,MAYMM,EAAkB9L,YAAY,KAClC6L,EAAUtD,SAAU,GACnB,IAEGwD,EAAiB/L,YAAY,KACjC6L,EAAUtD,SAAU,EACF,IAAdoD,GACFJ,EAAaI,GAAYE,EAAUtD,UAEpC,CAACgD,EAAcI,IAMlB3J,YAAU,KACRuJ,EAAaI,GAAYE,EAAUtD,UAClC,CAACoD,EAAWJ,IAEf,MAAMtL,EAAOC,cAEPI,EAAY0L,aAChB,eACA1C,GAGF,OACE,yBAAKhJ,UAAWA,GACd,kBAACoC,EAAA,EAAD,CACEuJ,SA3DsB,IA2DZN,EACV5R,KAAK,OACL6I,MAAM,oBACNC,UAAW5C,EAAK,WAChBK,UAAU,WACVqG,QAAS7D,IACTvC,QA/CgB,KAChBmL,EAASnD,SACXqD,EAAa5R,KAAKC,IApBM,EAoBc0R,EAAY,OA+ChD,uBAAGrL,UAAU,mBAEf,kBAACoC,EAAA,EAAD,CACEuJ,SAvEsB,IAuEZN,EACV5R,KAAK,OACL6I,MAAM,oBACNC,UAAU,UACVvC,UAAU,UACVqG,QAAS7D,IACTvC,QApDe,KACfmL,EAASnD,SACXqD,EAAa5R,KAAKqM,IA3BM,EA2BcsF,EAAY,OAoDhD,uBAAGrL,UAAU,kBAEf,yBAAKA,UAAU,YACb,yBAAKA,UAAU,kBACb,yBACEA,UAAU,kBAEVlF,MAAQ,UApFK,IAoFKuQ,EAAY,QAEhC,2BACEd,IAAKa,EACLrF,IAzFkB,EA0FlBpM,IA3FkB,EA4FlBqM,KAAK,MACLG,MAAOkF,EACPpF,KAAK,QACLjG,UAAU,iBACV4L,SAtDoB/J,IAC5ByJ,EAAa5R,KAAKqM,IA3CQ,EA2CYrM,KAAKC,IAAIoQ,OAAOlI,EAAEmI,OAAO7D,OA1CrC,MAgGlB0F,YAAaL,EACbM,UAAWL,S,OCrFvB,MAAMM,GAAiB,CACrB,EAAG,EAAG,EAAG,EAAG,EAAG,GAGXC,GAAe,CACnBC,EAAG,EACHC,IAAK,IACLC,EAAG,IACHC,IAAK,IACLC,EAAG,KAyKU5F,mBA1Ie,EAC5B6F,WACAtM,YACAuM,SACAC,SACAnB,YACAoB,YACAC,YACAC,YAEA,MAAMC,EAAiBZ,GAAaX,IAA2CA,GACxEwB,EAAYC,GAAiB3L,aAAkB,IAC/C4L,EAAUC,GAAe7L,YAAoB,CAClD8L,GAAIR,EAAWS,GAAIR,EAAWS,EAAG,EAAGC,EAAG,KAGlCC,EAAYC,GAAiBnM,YAAmB4K,IAGjDwB,EAAgBrG,YAAuB,MAGvCsG,EAAkBtG,YAAuB,MAE/CxF,YAAU,KACR,MAAM+L,EAAeb,GAAkBS,EAAW,GAC5CK,EAAWjB,GAAaY,EAAW,GACnCM,EAAWjB,GAAaW,EAAW,GAEnCO,EAAgB,IAAIP,GACtBA,EAAW,KAAOI,IACpBG,EAAc,GAAKH,GAAgBG,EAAc,GACjDA,EAAc,GAAKH,GAAgBG,EAAc,IAE/CP,EAAW,KAAOK,IACpBE,EAAc,GAAKF,GAEjBL,EAAW,KAAOM,IACpBC,EAAc,GAAKD,GAGhBE,YAAqBR,EAAYO,IACpCN,EApEN,SAAiCQ,EAAkBT,EAAsBU,GACvE,MAAMC,EAAQD,GAAWA,EAAQpS,cAAc,eAC/C,IAAKoS,IAAYC,EACf,OAAOX,EAET,MAAMY,EAAcF,EAAQhV,wBACtBmV,EAAYF,EAAMjV,wBAElBoV,EAAeD,EAAUxX,MAAQoX,EAAYT,EAAW,GACxDe,EAAgBF,EAAUzW,OAASqW,EAAYT,EAAW,GAC1DgB,GAAWJ,EAAYvX,MAAQyX,GAAe,EAAId,EAAW,GAC7DiB,GAAWL,EAAYxW,OAAS2W,GAAgB,EAAIf,EAAW,GAYrE,OAXIY,EAAYvX,OAASuX,EAAYvX,MAdhB,IAcyC2X,EAC5DhB,EAAW,IAAMgB,EAAUJ,EAAYvX,MAfpB,IAgBVyX,GAAeA,EAAcE,EAhBnB,MAiBnBhB,EAAW,IAAMc,EAAcE,EAjBZ,KAmBjBJ,EAAYxW,QAAUwW,EAAYxW,OAnBjB,IAmB2C6W,EAC9DjB,EAAW,IAAMiB,EAAUL,EAAYxW,OApBpB,IAqBV2W,GAAgBA,EAAeE,EArBrB,MAsBnBjB,EAAW,IAAMe,EAAeE,EAtBb,KAyBdjB,EA6CWkB,CAAwBlB,EAAW,GAAIO,EAAeL,EAActF,WAGnF,CAACwE,EAAWC,EAAWE,IAE1BlL,YAAU,KACH8K,GACHc,EAAcvB,KAEf,CAACS,IAEJ9K,YAAU,KACJ8L,EAAgBvF,UAClBuF,EAAgBvF,QAAQnN,MAAMR,UAAa,UAAS+S,EAAWmB,gBAEhE,CAACjC,EAAQc,IA2DZ,OAAId,EACKD,EAIP,yBACE/B,IAAKgD,EACLvN,UAAY,gBAAcA,GAAa,IACvC6L,YAjEqBhK,IACvB,IAAK2K,EACH,OAGF3K,EAAEC,kBACFD,EAAE4M,iBAEF,MAEMC,EAAyB,CAC7BzB,GAHcI,EAAW,GAIzBH,GAHcG,EAAW,GAIzBF,EAAGtL,EAAE8M,MACLvB,EAAGvL,EAAE+M,OAEP5B,EAAY0B,GACZ5B,GAAc,GAEVS,EAActF,SAChBsF,EAActF,QAAQvN,UAAUC,IAAI,SA8CpCmR,UA1CkB,KACpBgB,GAAc,GAEVS,EAActF,SAChBsF,EAActF,QAAQvN,UAAUO,OAAO,QAGrC0R,GACFA,EAAMU,EAAW,GAAIA,EAAW,KAmChCwB,YArBqBhN,IACvB,GAAIgL,EAAY,CACd,MAAMe,EAZV,SAA0BT,EAAWC,GACnC,MAAMQ,EAAgB,IAAIP,GACpByB,EAAS/B,EAASI,EAAIA,EACtB4B,EAAShC,EAASK,EAAIA,EAI5B,OAHAQ,EAAc,GAAKb,EAASE,GAAK6B,EACjClB,EAAc,GAAKb,EAASG,GAAK6B,EAE1BnB,EAKiBoB,CAAiBnN,EAAE8M,MAAO9M,EAAE+M,OAClDtB,EAAcM,GAEVJ,EAAgBvF,UAClBuF,EAAgBvF,QAAQnN,MAAMR,UAAa,UAAS+S,EAAWmB,kBAiBjE,yBACEjE,IAAKiD,EACLxN,UAAU,iBAETsM,M,OC4UT,SAAS2C,GAAYC,EAAkBC,EAAyBC,GAC9D,OAAOF,EAEH,yBACEjS,IAAKiS,EACLG,IAAI,GAEJvU,MAAOqU,EAAa,UAASA,EAAUzY,UAAY,GACnD4Y,UAAWlY,QAAQgY,KAIrB,yBACEpP,UAAU,kBAEVlF,MAAOqU,EAAa,UAASA,EAAUzY,UAAY,IAEnD,kBAAC6Y,EAAA,EAAD,CAASjN,MAAM,WAKRmE,mBAAKhI,YACjBC,IACC,MAAM,OACJC,EADI,SACI6Q,EADJ,UACc5Q,EADd,cACyB6Q,EADzB,kBACwCC,EADxC,OAC2DtZ,GAC7DsI,EAAOiR,aACL,eACJC,GACElR,EAAOmR,SAASC,MAEpB,GAAI1Z,IAAW4C,IAAkBI,aAAc,CAC7C,IAAMuF,IAAUC,EACd,MAAO,CAAEgR,kBAGX,MAAMtZ,EAAU4I,YAAkBR,EAAQC,EAAQC,GAClD,OAAKtI,EAIE,CACLqI,SACAC,YACAmR,SAAUzZ,EAAQyZ,SAClB3Z,SACAE,UACAsZ,kBATO,CAAEA,kBAab,GAAIH,EAAe,CAGjB,MAAO,CACL7Q,WAAY,EACZmR,SAAUN,EACVO,YALahR,aAAWN,EAAQ+Q,IAAkBxQ,YAAWP,EAAQ+Q,GAMrEC,kBAAmBA,GAAqB,EACxCE,iBACAxZ,UAIJ,KAAMuI,GAAU6Q,GAAY5Q,GAC1B,MAAO,CAAEgR,kBAGX,IAAItZ,EAWA2Z,EAOAC,EAXJ,GALE5Z,EADEF,GAAU,CAAC4C,IAAkBG,eAAgBH,IAAkBoD,iBAAiB/C,SAASjD,GACjF+Z,aAAuBzR,EAAQC,EAAQC,GAEvCM,YAAkBR,EAAQC,EAAQC,IAGzCtI,EACH,MAAO,CAAEsZ,kBAYX,GANEK,EADE7Z,GAAU,CAAC4C,IAAkBG,eAAgBH,IAAkBoD,iBAAiB/C,SAASjD,GAC5Ega,aAAwB1R,EAAQC,GAEhC0R,YAAmB3R,EAAQC,GAIxCvI,IAAW4C,IAAkBmD,QAAU/F,IAAW4C,IAAkBE,MACtEgX,EAAgBI,aAAkB5R,EAAQC,EAAQ6Q,IAAae,YAAgB7R,EAAQC,EAAQ6Q,QAC1F,GAAIpZ,IAAW4C,IAAkBC,YAAa,CACnD,MAAMuX,EAAgBC,YAAyB/R,IACzC,SAAEgS,GAAcF,GAAiBA,EAAcG,eAAiBH,EAAcG,cAAcC,OAAU,GAC5GV,EAAgBQ,EAGlB,MAAO,CACL/R,SACA6Q,WACA5Q,YACAmR,SAAUzZ,EAAQyZ,SAClB3Z,SACAE,UACA2Z,eACAC,gBACAN,mBAGJ,CAACxQ,EAAWC,IAA2BC,YAAKD,EAAS,CACnD,kBAAmB,mBAAoB,kBAAmB,iBAvF1CZ,CAtdgC,EAClDE,SACA6Q,WACA5Q,YACAmR,WACA3Z,SACA4Z,cACAN,oBACApZ,UACA2Z,eACAC,gBACAW,kBACAtR,mBACAuR,kBACAtR,eACAoQ,qBAGA,MAAMmB,EAAe7J,YAAe,MAC9B/E,EAAS/K,QAAQ4Y,GAAepR,GAChCoS,EAAe1a,EAAU2a,YAAuB3a,QAAWgL,EAC3DtK,EAAQV,EAAU4a,YAAgB5a,QAAWgL,EAC7CrK,EAAQX,EAAU6a,YAAgB7a,QAAWgL,EAC7C8P,EAAiBha,QAAQ4Z,GACzBK,EAAUja,QAAQJ,GAASga,GAC3Bja,EAAUK,QAAQH,GAClB0P,EAAQ1P,EAAQA,EAAM0P,WAAQrF,EAC9BgQ,EAAoBlb,IAAW4C,IAAkBC,YACjDsY,EAAenb,IAAW4C,IAAkBI,aAC5CoY,EAAiB5B,GAAkB,EAAI,WAAa,OACpD6B,EAAqC,IAAnB7B,EAAuB,aAAe,OACxD8B,GAAsC,IAAnB9B,EACnB/O,GAAWmP,EACZ,SAAQA,EAAYrS,MAAM+R,QAC3BpZ,GAAWqb,YAAwBrb,GACjCsb,GAAezG,YAAgC4E,IAC9C8B,GAAgBC,IAAqB3Q,aAAS,IAC9CP,GAAUmR,IAAe5Q,aAAkB,IAC3CkK,GAAWC,IAAgBnK,YAAiB,IAC5C6Q,GAAUC,IAAe9Q,YAAS,CAAEgM,EAAG,EAAGC,EAAG,IAE9C8E,GAAajQ,YAAQ,IAClBmP,GAAkBxS,EACrB,CAACA,GACDuT,YAAuBlC,GAAgB,GAAIC,GAAiB,GAAIoB,GACnE,CAACF,EAAgBxS,EAAWqR,EAAcC,EAAeoB,IAEtDc,GAA4BxT,EAAYsT,GAAWG,QAAQzT,IAAc,EACzE0T,GAAwC,IAA9BF,KAAkE,IAA/BA,GAC7CG,GAASH,KAA8BF,GAAW1T,OAAS,IAAoC,IAA/B4T,GAKtE,SAASI,GAAaC,GACpB,GAAIzC,QAAqC1O,IAAtBoO,EAAiC,CAClD,MAAM,OAAEgD,GAAW1C,EACnB,OAAO0C,GAAUA,EAAOhD,GACnB,QAAOgD,EAAOhD,GAAmB/R,YAClCgV,YAAkB3C,EAAayC,EAAO,MAAQ,UAGpD,OAAOnc,GAAW+K,YAAoB/K,EAASmc,EAAO,aAAe,kBAZnEtQ,GAAYyP,IAAgBA,KAAiB7B,GAAagB,EAAa9I,UACzE8I,EAAa9I,QAAUmK,IAczB,MAAMQ,GAAmBC,YACvBvc,IAAYgb,GAAqBC,IAAiBlQ,YAAoB/K,EAAS,kBAC/EgL,EACAwR,iBAAeC,aACfzR,EACAoQ,IAxEuB,KA0EnBsB,GAAmBR,KACnBS,GAAiBJ,YACrBG,QACA1R,EACA0O,GAAegD,IAAoBA,GAAiBE,WAAW,gBAC3DJ,iBAAeK,QACfL,iBAAeC,aACnBzR,EACAoQ,IAlFuB,MAoFjB/Q,UAAWyS,GAAb,iBAA4B5R,IAAqBC,YACrD+Q,IAAa,QACblR,EACAhL,GAAW+c,YAAsB/c,EAAS,mBAC1CgL,EACAoQ,IAzFuB,KA4FnB4B,GAAgBtc,GAASC,GAAUD,GAASC,GAAQiY,aAAU5N,EACpE,IAAIjL,IAAkBU,IAAYuc,IAAgBF,KAAmBH,IAAkBL,GACvF,MAAMW,GAAeC,aAAand,IAAiBC,GAAWmd,YAA4Bnd,IACrFD,IAAiBD,IAAW4C,IAAkBI,eACjD/C,GAAgBkd,IAGlB,MAAMG,GAAkBrC,EAAU/Z,YAChC8Z,EAAiBH,YAAuB3a,GAAY4a,YAAgB5a,SAChEgL,EACAqS,GAAkB5c,EAAUM,aAAmB8Z,YAAgB7a,SAAcgL,EAEnFI,YAAU,KACHc,KAILhI,SAASC,KAAKC,UAAUkZ,OAAO,uBAAwBzR,IACtD,CAACA,IAEJ,MAAM0R,GAAcC,cACpBpS,YAAU,KACR,MAAMzJ,EAAMC,OAAOC,WAAWC,KAO9B,MANoC,mBAAzBH,EAAI2L,iBACb3L,EAAI2L,iBAAiB,SAAUiQ,IACK,mBAApB5b,EAAI8b,aACpB9b,EAAI8b,YAAYF,IAGX,KACkC,mBAA5B5b,EAAI4L,oBACb5L,EAAI4L,oBAAoB,SAAUgQ,IACK,mBAAvB5b,EAAI+b,gBACpB/b,EAAI+b,eAAeH,MAGtB,CAACA,KAEJ,MAAMI,GAAc9I,YAAoC7U,GAClD4d,GAAa/I,YAAY/U,GACzB+d,GAAkBhJ,YAA2C6E,GAC7DoE,GAAoBjJ,YAAY9U,IACtCqL,YAAU,KACR,GAAIgQ,IAAoBvP,IAAW8R,KAAgBE,GAAiB,CAClEE,YAxIqB,IAwI4B/Y,KACjD,MAAMgZ,EAAYhe,EAAUie,YAAkBje,QAAWgL,EAEzDpL,EADkBkB,QAAQkd,GACAle,EAASC,GAAgBC,GAGjDob,KAAqBvP,IAAW8R,IAAeE,MACjDE,YA/IqB,IA+I4B/Y,KACjDC,EAAe2Y,GAAaE,GAAoBH,SAAe3S,KAEhE,CACDoQ,GAAkBvP,EAAQ/L,EAAQ8d,GAClC5d,EAAS2d,GAAaE,GAAiB9d,GAAe+d,KAGxD1S,YAAU,KACR,IAAI8S,EAUJ,OARI5T,GACFkR,IAAkB,GAElB0C,EAAQtc,OAAOiD,WAAW,KACxB2W,IAAkB,IA9JC,KAkKhB,KACD0C,GACFtc,OAAOwN,aAAa8O,KAGvB,CAAC5T,KAEJ,MAAM6T,GAAY,KAChB1C,IAAY,GACZzG,GAAa,GACb2G,GAAY,CAAE9E,EAAG,EAAGC,EAAG,KAGnBsH,GAAmBhV,YAAY,KACnCqS,IAAanR,IACb0K,GAAc1K,GAAiB,EAAN,KACrBA,IACFqR,GAAY,CAAE9E,EAAG,EAAGC,EAAG,KAExB,CAACxM,KAEE+T,GAAkBjV,YAAY,CAACkV,EAAeC,GAAe,KACjEvJ,GAAasJ,GACC,IAAVA,GAAeC,GACjBJ,MAED,IAEGK,GAAQpV,YAAY,KACxBH,IACAkV,MACC,CAAClV,IAEEwV,GAAoBrV,YAAY,KACpCoV,KACAtV,EAAa,CAAEb,SAAQ6Q,WAAU5Q,eAChC,CAACkW,GAAOnW,EAAQ6Q,EAAUhQ,EAAcZ,IAErCoW,GAAgBtV,YAAY,KAChCoR,EAAgB,CAAEmE,WAAYtW,EAAQuT,WAAY,CAACtT,KACnD6V,MACC,CAAC3D,EAAiBnS,EAAQC,IAE7B8C,YAAU,IAAOS,EAAS+S,YAAsB,KAC1CtU,GACF6T,KAEAK,YAECxT,EAAY,CAACwT,GAAO3S,EAAQvB,KAEjCc,YAAU,KACJ3K,IAAY4P,GACdwO,eAED,CAACxO,EAAO5P,IAEX,MAAMqe,GAAe1V,YAAY,CAAC2V,EAAgBC,KAChD,IAAIC,EAAQrD,GAAWG,QAAQgD,GAK/B,QAJoB,IAAfC,GAAoBC,EAAQ,GAAqB,IAAdD,GAAmBC,EAAQrD,GAAW1T,OAAS,KACrF+W,GAASD,GAGJpD,GAAWqD,IACjB,CAACrD,KAEEsD,GAAsB9V,YAAY,KAClC4S,IAIJzB,EAAgB,CACdlS,SACA6Q,WACA5Q,UAAWA,EAAYwW,GAAaxW,GAAY,QAAK0C,EACrDlL,YAED,CAACuI,EAAQ6Q,EAAU4F,GAAc9C,GAAS1T,EAAWiS,EAAiBza,IAEnEqf,GAAkB/V,YAAY,KAC9B6S,IAIJ1B,EAAgB,CACdlS,SACA6Q,WACA5Q,UAAWA,EAAYwW,GAAaxW,EAAW,QAAK0C,EACpDlL,YAED,CAACuI,EAAQ6Q,EAAU4F,GAAc7C,GAAQ3T,EAAWiS,EAAiBza,IAExEsL,YAAU,KACR,MAAMgU,EAAiB7T,IACrB,OAAQA,EAAE1B,KACR,IAAK,OACL,IAAK,YACHqV,KACA,MAEF,IAAK,QACL,IAAK,aACHC,OAON,OAFAjb,SAASoJ,iBAAiB,UAAW8R,GAAe,GAE7C,KACLlb,SAASqJ,oBAAoB,UAAW6R,GAAe,MAK3DhU,YAAU,KACR,MAAM3D,EAAUvD,SAASmB,cAA8B,sDACvD,IAAKoC,EACH,OAGF,MAAM4X,EAAqBhP,IAAUU,IAErC,OAAOuO,YAAc7X,EAAS,CAE5B8X,wBAA0B,oEAAmEF,EAAwC,GAAnB,kBAClH1V,QAAS,KACFW,IACHkU,MAGJgB,QAAS1O,IAAe,CAACvF,EAAGyT,KACtBA,IAAcS,IAAeC,MAC/BR,KACSF,IAAcS,IAAeE,KACtCR,KAEAX,WAEAxT,KAEL,CAACwT,GAAOnO,EAAO/F,GAAU6U,GAAiBD,GAAqB3D,KAElE,MAAMqE,GAAYxW,YAAY,CAACyN,EAAWC,KACxC6E,GAAY,CAAE9E,IAAGC,OAChB,IAEGzN,GAAOC,cAEb,SAASuW,GAAYC,GACnB,GAAIpG,EACF,OACE,yBAAK7P,IAAKxB,EAAQqB,UAAU,wBACzBiP,GACCmE,IAAiBH,GACjBoD,YAA+B9e,KAAwB,IACtDiL,MAAqB5B,KAIvB,GAAItK,EAAS,CAClB,MAAMge,EAAYC,YAAkBje,GAC9BH,EAAYiB,QAAQkd,GAE1B,OACE,yBAAKnU,IAAKvB,EAAWoB,UAAY,yBAAuB7J,EAAY,aAAe,KAChFkb,GAAWpC,GACVqE,IAAgBF,IAAiBH,IAAkBL,GACnDtc,GAAW+f,YAA+B3C,GAAkBvd,IAC3DqM,MAAqB5B,IAEvB7J,GACC,kBAAC,GAAD,CACEoJ,IAAKvB,EACL8H,IAAK4M,IAAgBF,GACrBzM,MAAOA,EACPC,WAAYvQ,GACZwQ,WAAYvQ,GAAW+f,YAA+B1C,GAAkBxd,GAAW,GACnFqL,iBAAkBA,GAClBsD,SAAU7N,EAAOwC,KACjBqN,kBAAmB3E,EACnB4E,QAASqP,EACTpP,QAAS8N,KAGZR,GACC,kBAAC,EAAD,CACEnR,KAAMmR,EACNrU,QAAS8U,GACT3R,WAAYrM,MAUxB,SAASuf,KACP,OACE,kBAAC,EAAD,CACEnW,IAAK6P,EAAcA,EAAYrS,GAAKiB,EACpCD,OAAQqR,EAAcA,EAAYrS,GAAKgB,EACvCC,UAAWA,EACXC,SAAUzH,QAAQ4Y,KAKxB,OACE,kBAACuG,EAAA,EAAD,CACE5Y,GAAG,cACHqC,UAAWY,GAAW,SAAW,GACjCuB,OAAQA,GAEP,IACC,oCACE,yBAAKnC,UAAU,qBACZwC,KACC,kBAACJ,EAAA,EAAD,CACEpC,UAAU,qBACVqC,OAAK,EACL5I,KAAK,UACL6I,MAAM,oBACNC,UAAW5C,GAAK,SAChBM,QAAS6U,IAET,uBAAG9U,UAAU,gBAGjB,kBAACwW,EAAA,EAAD,CAAYC,UAAW1F,EAAa9I,QAAUyO,KAAMjF,GACjD6E,IAEH,kBAAC,EAAD,CACE3V,UAAWyS,IAAiBH,GAC5Blc,QAASA,EACT6J,SAAUA,GACVtK,QAASA,EACTuK,SAAUA,GACVC,mBAAoBgU,GACpB/T,UAAWiU,GACXhU,aAAc0T,GACd7V,SAAUzH,QAAQ4Y,MAGtB,kBAAC,GAAD,CACEzD,QAASsF,GACTrF,OAAQ5L,GACR6L,UAAWuF,GAAS7E,EACpBT,UAAWsF,GAAS5E,EACpB/B,UAAWA,GACXsB,MAAOuJ,IAEP,kBAACM,EAAA,EAAD,CACExW,UAAU,kBACVyW,UAAWrE,GACXsE,KAAMlF,GAEL2E,MAGH7D,IACA,4BACErM,KAAK,SACLjG,UAAY,oBAAkBjJ,IAAY4P,GAAS,UACnDgQ,aAAYhX,GAAK,oBACjBM,QAASuV,MAGXjD,IACA,4BACEtM,KAAK,SACLjG,UAAY,oBAAkBjJ,IAAY4P,GAAS,UACnDgQ,aAAYhX,GAAK,QACjBM,QAASwV,KAGb,kBAAC,GAAD,CACEzK,QAASpK,GACTqK,aAAc0J,U,8FCnWXlO,mBAAKhI,YACjBC,IACC,MACEkY,OACEC,KAAMC,EADD,QAELC,GAHE,cAKJC,GACEtY,EAEJ,MAAO,CACLoY,YACAG,cAAeF,EAAQG,OACvBC,gBAAiBJ,EAAQK,SACzBJ,kBAGJ,CAAC5X,EAAWC,IAA2BC,YAAKD,EAAS,CAAC,mBAAoB,kBAAmB,kBAjB3EZ,CA/H6C,EAC/DqY,YACAG,gBACAE,kBACAH,gBACA7U,SACAkV,mBACAC,kBACAC,oBAEA,MAAOC,EAAQC,GAAatW,YAAS,IAE/BiK,EAAWlE,YAAyB,MAEpCvH,EAAOC,cAEb8B,YAAU,KACJS,EACGK,KACHrH,WAAW,KACTP,sBAAsB,KAChBwQ,EAASnD,SACXmD,EAASnD,QAAQyP,WAzBR,MA+BbtM,EAASnD,SACXmD,EAASnD,QAAQ0P,OAGnBxc,WAAW,KACTsc,EAAU,KAnCU,OAsCvB,CAACtV,IAEJ,MAAMyV,EAAU3V,YAAQ,KACtB,MAAM8U,EAAU,IACXE,GAAiB,MACjBE,GAAmB,IAGxB,OAAOU,aAAY,IACdd,EAAQS,OAAQ7Z,IACjB,MAAMyC,EAAO0W,EAAUnZ,GACvB,OAAKyC,KAIA0X,YAAiB1X,EAAM2X,qBAIvBP,GAIEQ,aAAYC,YAAatY,EAAMmX,EAAUnZ,QAAK2D,EAAW3D,IAAOqZ,GAAgBQ,OAExFV,OAAWxV,EAAW0V,EAAgB,CAACA,QAAiB1V,IAC1D,CAAC2V,EAAeE,EAAiBL,EAAWE,EAAeQ,EAAQ7X,KAE/DuY,EAAaC,GAAWC,aAAkBb,EAAeK,EAASxgB,QAAQogB,IAE3Ea,EAAqB3Y,YAAamC,IACtC4V,EAAU5V,EAAE8H,cAAcxD,QACzB,IAEGmS,EACJ,yBAAKtY,UAAU,gBACb,kBAACoC,EAAA,EAAD,CACEC,OAAK,EACLC,MAAM,cACN7I,KAAK,UACL8I,UAAW5C,EAAK,SAChBM,QAASqX,GAET,uBAAGtX,UAAU,gBAEf,kBAACuY,GAAA,EAAD,CACEhO,IAAKa,EACLjF,MAAOqR,EACP5L,SAAUyM,EACVG,YAAa7Y,EAAK,gBAKxB,OACE,kBAAC8Y,GAAA,EAAD,CACEtW,OAAQA,EACR6E,QAASsQ,EACTtX,UAAU,gBACV0Y,OAAQJ,GAEPJ,GAAeA,EAAY1Z,OAC1B,kBAACma,GAAA,EAAD,CACE3Y,UAAU,4BACV4Y,MAAOV,EACPW,WAAYV,EACZW,gBAAiB1hB,QAAQogB,IAExBU,EAAYa,IAAKpb,GAChB,kBAACqb,GAAA,EAAD,CACE7Y,IAAKxC,EACLqC,UAAU,4CACVC,QAAS,IAAMoX,EAAiB,CAAE1Z,QAEjCoB,aAAcpB,GACb,kBAACsb,GAAA,EAAD,CAAiBC,OAAQvb,IAAOqZ,EAAgBrX,EAAK,0BAAuB2B,EAAW6X,OAAQxb,IAE/F,kBAACyb,GAAA,EAAD,CAAeza,OAAQhB,OAK7Bua,IAAgBA,EAAY1Z,OAC9B,uBAAGwB,UAAU,cAAb,yBAEA,kBAACqZ,GAAA,EAAD,U,iBC1HR,SAASC,GAAeC,GACtB,OAAIA,EAAMC,WACD,mBAGF,uBAGM/S,mBAAKhI,YACjBC,GAAuBY,YAAKZ,EAAQ,CAAC,WACtC,CAACU,EAAWC,IAA2BC,YAAKD,EAAS,CAAC,iBAFpCZ,CAhC2B,EAAGgb,SAAQC,mBACxD,MAAM/Z,EAAOC,cAEb,GAAK6Z,EAAOjb,OAIZ,OACE,yBAAKb,GAAG,UACL8b,EAAOV,IAAKQ,GACX,kBAACd,GAAA,EAAD,CACEtW,QAAM,EACN6E,QAAS0S,EACT1Z,UAAU,QACV2Z,MAAOL,GAAeC,IAEtB,2BAAIK,aAAqBL,IACzB,kBAACnX,EAAA,EAAD,CAAQyX,QAAM,EAAC5Z,QAASyZ,GAAe/Z,EAAK,a,UCJvC8G,mBAAKhI,YACjBC,GAAuBY,YAAKZ,EAAQ,CAAC,kBACtC,CAACU,EAAWC,IAA2BC,YAAKD,EAAS,CAAC,wBAFpCZ,CAjBkC,EAAGqb,gBAAeC,0BACtE,GAAKD,EAActb,OAInB,OACE,yBAAKb,GAAG,iBACLmc,EAAcf,IAAI,EAAGziB,aACpB,kBAAC0jB,GAAA,EAAD,CACE1jB,QAASiK,YAAWjK,EAAS,CAAC,QAAS,KAAM,UAC7C2jB,UAAWF,S,oBCiBNtT,mBAAKhI,iBAClB6C,EACA,CAAClC,EAAWC,IAA2BC,YAAKD,EAAS,CAAC,wBAFpCZ,CA1BgC,EAAGiI,MAAKwT,0BAC1D,MAAMva,EAAOC,cAEPua,EAAaza,YAAY,KAC7BxH,OAAOkiB,KAAK1T,GACZwT,EAAoB,CAAExT,SAAKpF,KAC1B,CAAC4Y,EAAqBxT,IAEnB2T,EAAgB3a,YAAY,KAChCwa,EAAoB,CAAExT,SAAKpF,KAC1B,CAAC4Y,IAEEI,EAAeC,aAAiB7T,GAEtC,OACE,kBAAC8T,GAAA,EAAD,CACErY,OAAQ/K,QAAQsP,GAChBM,QAASqT,EACTV,MAAOha,EAAK,gBACZ2U,UAAW/T,YAAWZ,EAAK,gBAAiB2a,GAAe,CAAC,UAC5DG,aAAc9a,EAAK,gBACnB+a,eAAgBP,O,OCTtB,MAAMQ,GAAkB,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KAyPvD,SAASC,GAAcC,EAAcC,EAAeC,EAAaC,EAAgBC,GAC/E,MAAMC,EAAc,IAAIC,KAAKN,EAAMC,EAAOC,EAAK,EAAG,EAAG,EAAG,GAClDK,EAAeJ,GAAW,IAAIG,KAAKH,EAAQK,cAAeL,EAAQM,WAAYN,EAAQO,UAAW,EAAG,EAAG,EAAG,GAC1GC,EAAeP,GAAW,IAAIE,KAAKF,EAAQI,cAAeJ,EAAQK,WAAYL,EAAQM,UAAW,EAAG,EAAG,EAAG,GAEhH,SAAIC,GAAgBN,EAAcM,OAEvBJ,GAAgBF,EAAcE,GAO3C,SAASK,GAAgBtV,GACvB,OAAOuV,OAAOvV,GAAOwV,SAAS,EAAG,KAapBlV,mBAnRqB,EAClCmV,aACAC,QACAC,eACAC,aACA5Z,SACA6Z,iBACAC,oBACAC,oBACAlV,UACAmV,WACAC,0BAEA,MAAMzc,EAAOC,cACPyc,EAAM,IAAIlB,KACVmB,EAAsBra,YAAQ,IAAO2Z,EAAa,IAAIT,KAAKS,GAAc,IAAIT,KAAS,CAACS,IACvFX,EAAUY,EAAQ,IAAIV,KAAKU,QAASva,GAEnCib,EAAcC,GAAmBrb,YAAemb,IAChDG,EAAeC,GAAoBvb,YACxCsa,GAAgBa,EAAoBK,cAE/BC,EAAiBC,GAAsB1b,YAC5Csa,GAAgBa,EAAoBQ,eAGhCC,EAAcR,EAAalB,cAC3B2B,EAAeT,EAAajB,WAC5B2B,EAAcV,EAAahB,UAEjC7Z,YAAU,KACJS,GACFqa,EAAgBF,IAEjB,CAACna,EAAQma,IAEZ,MAAMY,EAA0BnB,GAAcgB,GAAeV,EAAIhB,eAAiB2B,GAAgBX,EAAIf,YAChGL,GAAW8B,GAAe9B,EAAQI,eAAiB2B,GAAgB/B,EAAQK,WAC3E6B,EAAyBrB,GAAgBiB,GAAeV,EAAIhB,eAAiB2B,GAAgBX,EAAIf,WAEjG8B,EAAenb,YAAQ,IAwL/B,SAA2B4Y,EAAcC,GACvC,MAAMuC,EAAiB,GAEjB5c,EAAO,IAAI0a,KACjB1a,EAAK6c,YAAYzC,GACjBpa,EAAK8c,SAASzC,GACdra,EAAK+c,QAAQ,GAEb,MAAMC,EAAgBhd,EAAKid,SAE3B,IAAK,IAAIC,EAAI,EAAGA,EAAIF,EAAeE,IACjCN,EAAKO,KAAK,GAGZ,KAAOnd,EAAK6a,aAAeR,GAAO,CAChC,MAAM+C,EAAWpd,EAAK8a,UACtB8B,EAAKO,KAAKC,GACVpd,EAAK+c,QAAQK,EAAW,GAG1B,OAAOR,EA3MLS,CAAkBf,EAAaC,GAC9B,CAACA,EAAcD,IAiClB,MAAMgB,EAAoBre,YAAamC,IACrC,MAAMsE,EAAQtE,EAAEmI,OAAO7D,MAAM6X,QAAQ,UAAW,IAChD,IAAK7X,EAAM3H,OAGT,OAFAke,EAAiB,SACjB7a,EAAEmI,OAAO7D,MAAQ,IAInB,MAAM8X,EAAQvkB,KAAKC,IAAI,EAAGD,KAAKqM,IAAIgE,OAAO5D,GAAQ,KAE5C1F,EAAO,IAAI0a,KAAKoB,EAAa2B,WACnCzd,EAAK0d,SAASF,GACdzB,EAAgB/b,GAEhB,MAAM2d,EAAW3C,GAAgBwC,GACjCvB,EAAiB0B,GACjBvc,EAAEmI,OAAO7D,MAAQiY,GAChB,CAAC7B,IAEE8B,EAAsB3e,YAAamC,IACvC,MAAMsE,EAAQtE,EAAEmI,OAAO7D,MAAM6X,QAAQ,UAAW,IAChD,IAAK7X,EAAM3H,OAGT,OAFAqe,EAAmB,SACnBhb,EAAEmI,OAAO7D,MAAQ,IAInB,MAAMmY,EAAU5kB,KAAKC,IAAI,EAAGD,KAAKqM,IAAIgE,OAAO5D,GAAQ,KAE9C1F,EAAO,IAAI0a,KAAKoB,EAAa2B,WACnCzd,EAAK8d,WAAWD,GAChB9B,EAAgB/b,GAEhB,MAAM+d,EAAa/C,GAAgB6C,GACnCzB,EAAmB2B,GACnB3c,EAAEmI,OAAO7D,MAAQqY,GAChB,CAACjC,IAwBJ,OACE,kBAAC9D,GAAA,EAAD,CACEtW,OAAQA,EACR6E,QAASA,EACThH,UAAU,iBAEV,yBAAKA,UAAU,aACb,yBAAKA,UAAU,kBACb,kBAACoC,EAAA,EAAD,CACEC,OAAK,EACL5I,KAAK,UACL6I,MAAM,cACNrC,QAAS+G,GAET,uBAAGhH,UAAU,gBAGf,4BACGye,YAAmB9e,EAAM4c,EAAc/Z,MAG1C,kBAACJ,EAAA,EAAD,CACEC,OAAK,EACL5I,KAAK,UACL6I,MAAM,cACNqJ,SAAUwR,EACVld,QAAUkd,OAA2C7b,EArH/D,WACEkb,EAAiBkC,IACf,MAAMC,EAAW,IAAIxD,KAAKuD,GAG1B,OAFAC,EAASpB,SAASoB,EAASrD,WAAa,GAEjCqD,MAkHD,uBAAG3e,UAAU,mBAGf,kBAACoC,EAAA,EAAD,CACEC,OAAK,EACL5I,KAAK,UACL6I,MAAM,cACNqJ,SAAUuR,EACVjd,QAAUid,OAA2C5b,EAtH/D,WACEkb,EAAiBkC,IACf,MAAMC,EAAW,IAAIxD,KAAKuD,GAG1B,OAFAC,EAASpB,SAASoB,EAASrD,WAAa,GAEjCqD,MAmHD,uBAAG3e,UAAU,iBAKnB,yBAAKA,UAAU,oBACb,yBAAKA,UAAU,iBACZ2a,GAAgB5B,IAAK6F,GACpB,yBAAK5e,UAAU,4BACb,8BAAO4e,KAGVxB,EAAarE,IAAK8E,GACjB,yBACEgB,KAAK,SACLC,SAAU,EACV7e,QAAS,KAAM8e,OA/HDte,EA+HkBod,OA9H1CrB,EAAiBkC,IACf,MAAMC,EAAW,IAAIxD,KAAKuD,GAG1B,OAFAC,EAASnB,QAAQ/c,GAEVke,IALX,IAA0Ble,GAgIdT,UAAW0L,aACT,aACAkP,GACEmC,EAAaC,EAAca,EAAU/B,EAAeO,OAAM/a,EAAWya,EAAaM,EAAMpB,GAEtF,WACC,IAAE4C,EAAW,YAAc,IAChCA,IAAaZ,GAAe,eAG3BY,GACD,8BAAOA,OAOhB7B,GA7FD,yBAAKhc,UAAU,cACb,2BACEiG,KAAK,OACLjG,UAAU,eACVgf,UAAU,UACV7Y,MAAOsW,EACP7Q,SAAUmS,IANd,IASE,2BACE9X,KAAK,OACLjG,UAAU,eACVgf,UAAU,UACV7Y,MAAOyW,EACPhR,SAAUyS,KAiFd,yBAAKre,UAAU,UACb,kBAACoC,EAAA,EAAD,CAAQnC,QA5Id,WACEkc,EAASI,KA4IFP,EAqDX,SAA2Brc,EAAcc,GACvC,MAAMsa,EAAMkE,YAAgBtf,EAAMc,GAAM,GAExC,GAAY,UAARsa,EACF,OAAOpb,EAAK,yCAA0Cuf,YAAWze,IAGnE,OAAOd,EAAK,sCAAuCob,GAAKiD,QAAQ,KAAMkB,YAAWze,IA5DvD0e,CAAkBxf,EAAM4c,GAAgBN,GAE3DC,GACC,kBAAC9Z,EAAA,EAAD,CAAQnC,QAASmc,EAAqBvC,QAAM,GACzCqC,OCxIEzV,mBAAKhI,YAClB,CAACC,GAAUpI,UAAS8oB,iBAClB,MAAM,SAAE5P,GAAa6P,YAAyB3gB,IAAW,IACnD,gBAAE4gB,GAAqB9P,GAAY+P,YAA4B7gB,EAAQpI,EAASkZ,IAAc,GAC9FpP,EAAOnB,YAAWP,EAAQpI,EAAQqI,QAQxC,MAAO,CACL2gB,iBAAkBF,GAAcE,EAChCE,YATkBpf,GAAQrB,aAAcqB,EAAKzC,IAC3C8hB,YAAuBzgB,aAAWN,EAAQghB,YAAqBtf,UAC/DkB,EAQFqe,6BANmCvf,GAAQwf,aAAiBxf,KAAUkf,EAOtEO,iBANuBzf,GAAQ0f,aAAiB1f,KASpD,CAAChB,EAAWC,IAA2BC,YAAKD,EAAS,CACnD,iBAAkB,4BApBFZ,CAnEkD,EACpE0D,SACAid,aACA9oB,UACAypB,QACAT,kBACAE,cACAG,+BACAE,mBACA7Y,UACAgZ,iBACAC,8BAEA,MAAMC,EAA4BxgB,YAAY,KAC5C,MAAMwS,EAAa6N,GAASA,EAAMI,SAC9BJ,EAAMI,SAASpH,IAAI,EAAGpb,QAASA,GAC/B,CAACrH,EAAQqH,IACbqiB,EAAe,CAAE9N,aAAYkO,oBAAoB,IACjDpZ,KACC,CAACgZ,EAAgB1pB,EAAQqH,GAAIqJ,EAAS+Y,IAEnCM,EAA6B3gB,YAAY,KAC7C,MAAMwS,EAAa6N,GAASA,EAAMI,SAC9BJ,EAAMI,SAASpH,IAAI,EAAGpb,QAASA,GAC/B,CAACrH,EAAQqH,IACTyhB,EACFa,EAAwB,CAAE/N,eAE1B8N,EAAe,CACb9N,aACAkO,oBAAoB,IAGxBpZ,KACC,CAAC+Y,EAAOzpB,EAAQqH,GAAIyhB,EAAYpY,EAASiZ,EAAyBD,IAE/DrgB,EAAOC,cAEb,OACE,kBAAC6Y,GAAA,EAAD,CACEtW,OAAQA,EACR6E,QAASA,EACTsZ,QAASne,IAAWmd,EAAkBe,OAA6B/e,EACnEtB,UAAU,SACV2Z,MAAOha,EAAK,8BAEZ,2BAAIA,EAAK,kCACRggB,GACC,2BAAIhgB,EAAK,gCAEVkgB,GACC,2BAAIlgB,EAAK,+BAAgC,EAAG,MAE7C2f,GACC,kBAACld,EAAA,EAAD,CAAQE,MAAM,SAAStC,UAAU,wBAAwB6Z,QAAM,EAAC5Z,QAASigB,GACtEV,GAAe7f,EAAK,iCAAkCY,YAAWif,KAChEA,GAAe7f,EAAK,2CAG1B,kBAACyC,EAAA,EAAD,CAAQE,MAAM,SAAStC,UAAU,wBAAwB6Z,QAAM,EAAC5Z,QAASogB,GACtE1gB,EAAK2f,EAAkB,gCAAkC,WAE5D,kBAACld,EAAA,EAAD,CAAQpC,UAAU,wBAAwB6Z,QAAM,EAAC5Z,QAAS+G,GAAUrH,EAAK,eCLhE8G,mBAAKhI,YAClB,CAACC,GAAUC,aACT,MAAM4hB,EAAgBxhB,aAAcJ,GAC9B6hB,EAAiBC,YAAqB/hB,EAAQC,GAC9CyB,EAAOnB,YAAWP,EAAQC,GAC1B+hB,IAActgB,GAAQugB,aAAcvgB,GACpCwgB,IAAYxgB,GAAQwf,aAAiBxf,GACrCygB,IAAiBzgB,GAAQ0f,aAAiB1f,GAMhD,MAAO,CACLmgB,gBACAC,iBACAE,YACAE,UACAC,eACAC,aAXoBP,IAAkBC,GAAmBK,GAAgBD,EAYzEpB,YAXkBpf,GAAQrB,aAAcqB,EAAKzC,IAC3C8hB,YAAuBzgB,aAAWN,EAAQghB,YAAqBtf,UAC/DkB,IAYN,CAAClC,EAAWC,IAA2BC,YAAKD,EAAS,CAAC,eAvBpCZ,CA/D+C,EACjE0D,SACAvD,YACAD,SACA+hB,YACAE,UACAC,eACAC,eACAtB,cACAxY,UACA+Z,iBAEA,MAAMC,EAAyBthB,YAAY,KACzCqhB,EAAW,CACTpiB,SAAQC,YAAWqiB,SAAS,IAE9Bja,KACC,CAAC+Z,EAAYpiB,EAAQC,EAAWoI,IAE7Bka,EAAmBxhB,YAAY,KACnCqhB,EAAW,CACTpiB,SAAQC,YAAWqiB,SAAS,EAAOE,WAAW,EAAMC,UAAU,IAEhEpa,KACC,CAACrI,EAAQC,EAAWoI,EAAS+Z,IAE1BphB,EAAOC,cAcb,OACE,kBAAC6Y,GAAA,EAAD,CACEtW,OAAQA,EACR6E,QAASA,EACThH,UAAU,MACV2Z,MAAOha,EAAK,yBAEZ,2BAjBOA,EADL+gB,EACU,yBAGVE,GAAWC,EACD,kBAGF,wBAWV,kBAACze,EAAA,EAAD,CAAQpC,UAAU,wBAAwB6Z,QAAM,EAAC5Z,QAASihB,GACvDvhB,EAAK,cAEPmhB,GACC,kBAAC1e,EAAA,EAAD,CAAQpC,UAAU,wBAAwB6Z,QAAM,EAAC5Z,QAAS+gB,GACvDxB,EACG7f,EAAK,8BAA+B6f,GACpC7f,EAAK,qDAGb,kBAACyC,EAAA,EAAD,CAAQpC,UAAU,wBAAwB6Z,QAAM,EAAC5Z,QAAS+G,GAAUrH,EAAK,eC3DhE8G,mBAvB6B,EAC1CtE,SACAkf,sBAAsB,EACtBra,UACAsa,cAEA,MAAM3hB,EAAOC,cACb,OACE,kBAAC6Y,GAAA,EAAD,CACEtW,OAAQA,EACR6E,QAASA,EACThH,UAAU,YACV2Z,MAAOha,EAAK,+BAEZ,2BAAIA,EAAK,oCAAqC0hB,EAAqB,MACnE,kBAACjf,EAAA,EAAD,CAAQpC,UAAU,wBAAwB6Z,QAAM,EAAC5Z,QAASqhB,GACvD3hB,EAAK,gBAER,kBAACyC,EAAA,EAAD,CAAQpC,UAAU,wBAAwB6Z,QAAM,EAAC5Z,QAAS+G,GAAUrH,EAAK,c,kBCuEhE8G,mBAAKhI,YAClB,CAACC,GAAU0gB,iBACT,MAAQlN,WAAYqP,GAAuB7iB,EAAO8iB,kBAAoB,IAChE,gBAAElC,GAAoBmC,YAAgC/iB,GACtD0B,EAAOshB,YAAkBhjB,GAQ/B,MAAO,CACL6iB,qBACAjC,iBAAkBF,GAAcE,EAChCE,YAVkBpf,GAAQrB,aAAcqB,EAAKzC,IAC3C8hB,YAAuBzgB,aAAWN,EAAQghB,YAAqBtf,UAC/DkB,EASFqe,6BAPmCvf,GAAQwf,aAAiBxf,KAAUkf,EAQtEO,iBAPuBzf,GAAQ0f,aAAiB1f,KAUpD,CAAChB,EAAWC,IAA2BC,YAAKD,EAAS,CACnD,iBACA,0BACA,0BAvBgBZ,CApE2D,EAC7E0D,SACAid,aACAmC,qBACAjC,kBACAE,cACAG,+BACAE,mBACA7Y,UACAgZ,iBACAC,0BACA0B,4BAEA,MAAMzB,EAA4BxgB,YAAY,KAC5CsgB,EAAe,CAAE9N,WAAYqP,EAAoBnB,oBAAoB,IACrEuB,IACA3a,KACC,CAACgZ,EAAgB2B,EAAuBJ,EAAoBva,IAEzDqZ,EAA6B3gB,YAAY,KACzC0f,EACFa,EAAwB,CAAE/N,WAAYqP,IAEtCvB,EAAe,CAAE9N,WAAYqP,EAAoBnB,oBAAoB,IAGvEuB,IACA3a,KACC,CACDoY,EAAYuC,EAAuB3a,EAASiZ,EAAyBsB,EAAoBvB,IAGrFrgB,EAAOC,cAEb,GAAK2hB,EAIL,OACE,kBAAC9I,GAAA,EAAD,CACEtW,OAAQA,EACR6E,QAASA,EACTsZ,QAAShB,OAAkBhe,EAAY+e,EACvCrgB,UAAU,SACV2Z,MAAOha,EAAK,oCAEZ,2BAAIA,EAAK,gCACRggB,GACC,0GAEDE,GACC,+EAEDP,GACC,kBAACld,EAAA,EAAD,CAAQE,MAAM,SAAStC,UAAU,wBAAwB6Z,QAAM,EAAC5Z,QAASigB,GACtEV,EACG7f,EAAK,6BAA8BY,YAAWif,IAC9C7f,EAAK,2CAGb,kBAACyC,EAAA,EAAD,CAAQE,MAAM,SAAStC,UAAU,wBAAwB6Z,QAAM,EAAC5Z,QAASogB,GACtE1gB,EAAK2f,EAAkB,gCAAkC,WAE5D,kBAACld,EAAA,EAAD,CAAQpC,UAAU,wBAAwB6Z,QAAM,EAAC5Z,QAAS+G,GAAUrH,EAAK,e,OCyBhE8G,mBAAKhI,YACjBC,IACC,MAAQuH,KAAM2b,GAAoBvC,YAAyB3gB,IAAW,IAChE,UAAEmjB,GAAcJ,YAAgC/iB,GAEtD,MAAO,CACL0gB,WAAgC,cAApBwC,EACZE,sBAAuBC,aAA4BrjB,GACnDsjB,kBAAmBH,IAGvB,CAACziB,EAAWC,IAA2BC,YAAKD,EAAS,CAAC,wBAAyB,uCAX7DZ,CAtFoD,EACtEwjB,UACA7L,WACAwL,kBACAxC,aACA0C,wBACAE,oBACAL,wBACAO,yCAEA,MAAOC,EAAmBC,EAAiBC,GAAoBC,eAE/D5gB,YAAU,IACD0U,IAAa+L,EAChBI,aAAyB,CACzBC,YAAaJ,EACbK,SAAUL,EACVM,MAAOf,SAEPrgB,EACH,CAAC8U,EAAU+L,EAAmBC,EAAiBT,IAElD,MAAMgB,EAA4BxX,YAAY2W,QAAyBxgB,GAAW,GAC5EshB,EAAiCxM,EAAW0L,EAAwBa,EAEpEhjB,EAAOC,cAEPijB,EAAyBljB,EAAK,kCAAmCijB,GAEjE5iB,EAAY0L,aAChB,uBACAuW,GAAW,gBACX7L,GAAY,SAGd,OACE,yBAAKpW,UAAWA,GACd,yBAAKA,UAAU,8BACb,kBAACoC,EAAA,EAAD,CACEE,MAAM,cACND,OAAK,EACLpC,QAAS0hB,EACTpf,UAAU,oBAEV,uBAAGvC,UAAU,gBAEf,0BAAMA,UAAU,6BAA6B2Z,MAAOkJ,GACjDA,KAGAf,GACD,yBAAK9hB,UAAU,gCACQ,cAApB4hB,GACC,kBAAChf,EAAA,EAAD,CACEC,KAAK,UACLN,UAAU,mBACVtC,QAASiiB,GAET,0BAAMliB,UAAU,aACbL,EAAK,aAIZ,kBAACiD,EAAA,EAAD,CACEkgB,aAAW,EACXjgB,KAAK,SACL5C,QAASmiB,EACTzW,UAAWqW,EACXzf,UAAW5C,EAAK,iCAEhB,0BAAMK,UAAU,aACbL,EAAK,cAMhB,kBAAC,GAAD,CACEwC,OAAQggB,EACR/C,WAAYA,EACZpY,QAASqb,Q,uCClDF5b,mBAAKhI,YAClB,CAACC,GAAUC,aACT,MAAMyB,EAAOnB,YAAWP,EAAQC,GAC1BokB,EAAoB3iB,GAAQsf,YAAqBtf,GAIvD,MAAO,CACLA,OACA4iB,gBALsBD,EAAoB/jB,aAAWN,EAAQqkB,QAAqBzhB,EAMlF2hB,SALeC,YAAmBxkB,EAAQC,KAL5BF,CAzCoC,EACtDE,SACAyB,OACA4iB,kBACAC,WACAE,eACAljB,cAEA,MAAOkiB,EAAmBC,EAAiBC,GAAoBC,eAEzDc,EAAiBC,aAAsB,CAC3CjjB,OACA4iB,kBACAC,WACAK,aAAclB,IAGhB,GAAKhiB,EAIL,OACE,kBAAC4Y,GAAA,EAAD,CACEhZ,UAAU,oCACVC,QAAS,IAAMA,EAAQtB,GACvBykB,eAAgBA,GAEfrkB,aAAcJ,GACb,kBAACsa,GAAA,EAAD,CAAiBE,OAAQxa,EAAQwkB,aAAcA,EAAcI,WAAW,UAExE,kBAACnK,GAAA,EAAD,CAAeza,OAAQA,EAAQwkB,aAAcA,EAAcI,WAAW,UAExE,kBAACC,GAAA,EAAD,CACErhB,OAAQggB,EACRnb,QAASqb,EACTjiB,KAAMA,Q,iBC3Bd,MAGMqjB,GAAe9f,YAAU+f,GAAOA,IAAM,KAAO,GA4EpCjd,mBAAKhI,YACjBC,IACC,MAAQilB,QAASC,GAAellB,EAAOmlB,SACjCC,EAAYplB,EAAOqlB,MAAMlN,MACzB,qBAAEmN,GAAyBtlB,EAAOulB,aAExC,MAAO,CACLL,aACAE,YACAE,yBAGJ,CAAC5kB,EAAWC,IAA2BC,YAAKD,EAAS,CACnD,eACA,kBACA,WACA,yBACA,4BAjBgBZ,CA1E8C,EAChEmlB,aAAYE,YAAWE,uBACvBE,UAASC,eAAcC,kBAAiBC,WACxCC,yBAAwBC,8BAGxB,MAAMC,EAActd,YAAuB,MAI3CxF,YAAU,KACR+hB,GAAa,KACXU,IAEAC,OAED,CAACD,EAAcC,IAElBK,aAAoBD,GAAcZ,GAElC,MAAMc,EAAchlB,YACjB/B,IACC0mB,EAAS,CAAE1mB,OACXumB,IACA/oB,WAAW,KACTmpB,EAAuB,CAAE3mB,QA9BD,MAiC5B,CAAC0mB,EAAUC,EAAwBJ,IAG/BvkB,EAAOC,cAEb,OACE,yBAAKI,UAAU,gCACZ4jB,GACC,yBAAK5jB,UAAU,qBACb,yBAAKuK,IAAKia,EAAaxkB,UAAU,0BAC9B4jB,EAAW7K,IAAKI,GACf,yBAAKnZ,UAAU,gBAAgBC,QAAS,IAAMykB,EAAYvL,IACxD,kBAACjZ,EAAA,EAAD,CAAQG,KAAMyjB,EAAU3K,KACxB,yBAAKnZ,UAAU,iBAAiBO,YAAWkf,YAAuBqE,EAAU3K,KA7C/E,UAmDN6K,GACC,yBAAKhkB,UAAU,uBACb,wBAAIA,UAAU,4CACXL,EAAK,UAEN,kBAACyC,EAAA,EAAD,CACEC,OAAK,EACL5I,KAAK,UACL6I,MAAM,cACNC,UAAU,qBACVtC,QAASskB,GAET,uBAAGvkB,UAAU,iBAGhBgkB,EAAqBjL,IAAKpb,GACzB,kBAAC,GAAD,CACEgB,OAAQhB,EACRsC,QAASykB,U,0BCmBRje,mBAAKhI,YAClB,CAACC,GAAUC,aACT,MAAMyB,EAAOnB,YAAWP,EAAQC,GAChC,IAAKyB,EACH,MAAO,GAGT,MAAM2iB,EAAoBrD,YAAqBtf,GAE/C,MAAO,CACLA,UACI2iB,GAAqB,CAAEC,gBAAiBhkB,aAAWN,EAAQqkB,IAC/D4B,aAAcjmB,EAAOimB,eAGzB,CAACvlB,EAAWC,IAA2BC,YAAKD,EAAS,CACnD,iBAhBgBZ,CA3E2C,EAC7DnI,UACAsuB,cACAjmB,SACAyB,OACA4iB,kBACAxjB,eACAmlB,mBAEA,MAAME,EAAiBpR,YAA4Bnd,GAC7CwuB,EAAejS,YAASxR,YAAoB/K,EAAS,UACrDyuB,EAAe3tB,QAAQ4tB,YAAqB1uB,IAE5CouB,EAAchlB,YAAY,KAC9BF,EAAa,CAAEb,SAAQC,UAAWtI,EAAQqH,MACzC,CAACgB,EAAQa,EAAclJ,EAAQqH,KAE5BgC,EAAOC,cAEb,GAAKQ,EAIL,OACE,kBAAC4Y,GAAA,EAAD,CACEhZ,UAAU,kCACVqG,QAAS7D,IACTvC,QAASykB,GAET,kBAACxkB,EAAA,EAAD,CACEE,KAAMA,EACNC,KAAM2iB,EACNiC,kBAAgB,EAChBC,gBAAiBlC,GAAmBA,EAAgBmC,OACpDR,aAAcA,IAEhB,yBAAK3kB,UAAU,QACb,yBAAKA,UAAU,YACb,yBAAKA,UAAU,SACb,wBAAIM,IAAI,QAAQC,YAAW0X,YAAatY,EAAMS,EAAM4iB,KACnD5iB,EAAKglB,YAAc,kBAACC,GAAA,EAAD,OAEtB,yBAAKrlB,UAAU,gBACb,kBAACslB,GAAA,EAAD,CAAMtlB,UAAU,QACbulB,YAAoB5lB,EAAqB,IAAfrJ,EAAQmK,SAKzC,yBAAKT,UAAU,YACb,yBAAKA,UAAU,UAAUM,IAAI,QASvC,SACEX,EAAcrJ,EAAqB4Y,EAAkB0V,EAAsBG,GAE3E,IAAK7V,EACH,OAAO3O,YAAWilB,YAAsB7lB,EAAMrJ,IAGhD,OACE,0BAAM0J,UAAU,iBACd,yBAAK/C,IAAKiS,EAASG,IAAI,GAAGrP,UAAW+kB,EAAe,aAAUzjB,IAC7D6P,YAAgB7a,IAAY,uBAAG0J,UAAU,cACzCO,YAAWilB,YAAsB7lB,EAAMrJ,GAAS,GAAO,CAAC,QAAS,aAAc,CAAEmvB,UAAWb,KAnBtFc,CAAqB/lB,EAAMrJ,EAASwuB,GAAgBD,EAAgBD,EAAaG,U,OC5C/Ete,mBA5CmB,EAChCkf,aAAYC,eAEZ,MAAMC,EAAc5jB,YAAQ,IAmB9B,SAAgC0jB,GAE9B,GADgBA,EAAWG,MAAM,0BACpB,CACX,MAAMrlB,EAAO,IAAI0a,KAAKwK,GACtB,MAAO,CAAC,CAAEllB,OAAM0C,KAAM4iB,YAAmBtlB,KAG3C,MAAMulB,EAAa,GACb/I,EAAc,IAAI9B,KAClB4B,EAAcE,EAAY5B,cAC1B4K,EAAahJ,EAAYiB,UAAa,IAAI/C,KAAM,GAAE4B,KAAe4I,KAAezH,UAClFnB,EACAA,EAAc,EAElB,IAAK,IAAIY,EAAI,EAAGA,EA3CO,EA2CeA,IAAK,CACzC,MAAMld,EAAO,IAAI0a,KAAM,GAAE8K,EAAatI,KAAKgI,KAC3CK,EAAWpI,KAAK,CAAEnd,OAAM0C,KAAM4iB,YAAmBtlB,KAGnD,OAAOulB,EAtC2BE,CAAuBP,GAAa,CAACA,IACvE,OACE,6BAAS3lB,UAAU,6CAChB6lB,EAAY9M,IAAI,EAAGtY,OAAM0C,UAEtB,yBACElD,QAAS,IAAM2lB,EAASnlB,GACxBT,UAAU,YACVG,IAAKgD,GAEL,uBAAGnD,UAAU,kBACb,8BAAOmD,Q,oBC2BnB,MAGMsgB,GAAe9f,YAAU+f,GAAOA,IAAM,KAAK,GA4NlCjd,mBAAKhI,YACjBC,IACC,MAAQmY,KAAMC,GAAcpY,EAAOkY,OAC3BC,KAAMiN,GAAcplB,EAAOqlB,OAE3BJ,QAASwC,GAAoBznB,EAAO0nB,aAAe,GAE3D,IAAKD,EACH,MAAO,CACLrP,YACAgN,aAIJ,MAAM,cAAE9M,EAAF,SAAiBmJ,EAAjB,aAA2BwE,GAAiBjmB,GAC5C,eACJ2nB,EADI,cACYC,EADZ,aAC2BC,EAD3B,cACyC5V,GAC3CjS,EAAOulB,cACHrM,QAAS4O,EAAe7C,QAAS8C,GAAkBH,GAAiB,IACpE1O,QAAS8O,EAAc/C,QAASgD,GAAiBJ,GAAgB,IACjEK,SAAUC,GAA2B1G,GACvC,SAAEzP,GAAcC,GAAiBA,EAAcxN,MAAS,GAE9D,MAAO,CACL6T,gBACAmP,kBACAO,eACAC,eACAH,gBACAC,gBACA/V,WACAmW,yBACA/P,YACAgN,YACAuC,iBACA1B,iBAGJ,CAACvlB,EAAWC,IAA2BC,YAAKD,EAAS,CACnD,WACA,yBACA,uBACA,0BA1CgBZ,CA1N2C,EAC7DmmB,cAAae,aAAYmB,kBAAiB9P,gBAC1CmP,kBAAiBO,eAAcC,eAAcH,gBAAeC,gBAC5D/V,WAAUmW,yBAAwB/P,YAAWgN,YAAWuC,iBAAgB1B,eACxET,UAAS6C,qBAAoB1C,WAAUC,yBAAwB0C,uBAAsBC,4BAErF,MAAMtnB,EAAOC,eAENsnB,EAAqBC,GAA0BhmB,aAAkB,IACjEimB,EAAsBC,GAA2BlmB,aAAkB,GAEpEmmB,EAAiB5nB,YAAY,EAAG4V,gBAChCqP,GAAgBrP,IAAciS,IAAkBC,WAClD/D,GAAa,KACXuD,EAAqB,CACnB/gB,KAAM,OACNwhB,MAAO7C,OAIZ,CAACD,EAAcqC,EAAsBpC,IAElC8C,EAAkBhoB,YACrB/B,IACC0mB,EAAS,CAAE1mB,OAEPA,IAAOqZ,GACTsN,EAAuB,CAAE3mB,OAGtB6E,KACH0hB,KAGJ,CAAClN,EAAeqN,EAAUC,EAAwBJ,IAG9CyD,EAAwBjoB,YAAa/B,IACzCspB,EAAsB,CAAEtpB,QACvB,CAACspB,IAEEV,EAAetkB,YAAQ,KAC3B,IAAK2iB,GAAgBA,EAAY1R,WAAW,MAAQ0R,EAAYpmB,OAAS,EACvE,OAAOopB,KAGT,MAAMC,EAAkB1B,EACpBA,EAAgB3O,OAAQ7Z,IACxB,MAAM0C,EAAOyjB,EAAUnmB,GACvB,IAAK0C,EACH,OAAO,EAGT,MAAMynB,EAAWC,YAAgB1nB,GACjC,OAAQynB,GAAY9P,aAAY8P,EAAUlD,IAAiB5M,aAAY3X,EAAK2nB,SAAUpD,KAEtF,GAEJ,MAAO,IACD5N,GAAiBgB,aAAYrY,EAAK,iBAAkBilB,GAAe,CAAC5N,GAAiB,MACtFa,aAAYoQ,YAAO,IACjBJ,KACCnB,GAAgB,MAChBC,GAAgB,KAClB7P,KAEL,CAAC8N,EAAauB,EAAiBnP,EAAerX,EAAM+mB,EAAcC,EAAc7P,EAAWgN,IAExFwC,EAAgBrkB,YAAQ,KACvB2iB,GAAeA,EAAYpmB,OA1EO,IA0EyCgoB,IAAkBC,EACzFmB,KAGF/P,aAAYoQ,YAAO,IAAIzB,KAAkBC,IAAiB3P,GAAW,GAC3E,CAACA,EAAW0P,EAAeC,EAAe7B,IAEvCsD,EAAgBjmB,YAAQ,KACtB2iB,GAAgBe,IAAgBjV,GAAgC,IAApBA,EAASlS,OAIpDkS,EACJqI,IAAKpb,IACJ,MAAOgB,EAAQC,GAAajB,EAAGwqB,MAAM,KAAKpP,IAAIhP,QAE9C,OACE8c,GAA0BA,EAAuBloB,IAAWkoB,EAAuBloB,GAAQkY,KAAKjY,KAGnG4Y,OAAmBpgB,SACnBgxB,KAAK,CAACC,EAAGC,IAAMA,EAAE7nB,KAAO4nB,EAAE5nB,MAZpBmnB,KAaR,CAAClX,EAAUmW,EAAwBjC,EAAae,IAE7C4C,EAA2B7oB,YAAY,KAC3CynB,GAAwBD,IACvB,CAACA,IAEEsB,EAA4B9oB,YAAY,KAC5C2nB,GAAyBD,IACxB,CAACA,IAmBJ,MAAMqB,EAAepC,IAAmBA,EAAezP,QAAUyP,EAAelG,WAC1EoG,EAAa/nB,SAAW8nB,EAAc9nB,SAAW0pB,EAAc1pB,OAErE,OAAKomB,GAAgBe,EAKnB,kBAAChN,GAAA,EAAD,CACE3Y,UAAU,2BACV4Y,MAAOsP,EACPrP,WAAYyO,EAEZoB,sBAAoB,EACpBC,YAAU,GAET7B,GACC,yBAAK9mB,UAAU,4CACb,kBAAC,GAAD,CACE2lB,WAAYmB,EACZlB,SAAUmB,KAIf0B,GACC,kBAACG,GAAA,EAAD,CACEzlB,KAAMxD,EAAK,6BACXkpB,YAAalpB,EAAK,4CAGnB4mB,EAAa/nB,QACd,yBAAKwB,UAAU,4CACZumB,EAAaxN,IAAKpb,GACjB,kBAACmrB,GAAA,EAAD,CACEC,aAAcprB,EACdsC,QAAS0nB,EACTqB,SAAUrrB,QAKf4oB,EAAa/nB,QACd,yBAAKwB,UAAU,kBACb,wBAAIA,UAAU,mBACXumB,EAAa/nB,OAtKK,GAuKjB,kBAAC8mB,GAAA,EAAD,CAAMrlB,QAASsoB,GACZ5oB,EAAKunB,EAAsB,2BAA6B,6BAG5DvnB,EAAK,oCAEP4mB,EAAaxN,IAAI,CAACpb,EAAI4X,KACrB,GAAK2R,KAAuB3R,GA9KT,GAkLnB,OACE,kBAAC,GAAD,CACE5W,OAAQhB,EACRsC,QAASynB,SAMhBpB,EAAc9nB,QACf,yBAAKwB,UAAU,kBACb,wBAAIA,UAAU,mBACXsmB,EAAc9nB,OA9LI,GA+LjB,kBAAC8mB,GAAA,EAAD,CAAMrlB,QAASuoB,GACZ7oB,EAAKynB,EAAuB,2BAA6B,6BAG7DznB,EAAK,mCAEP2mB,EAAcvN,IAAI,CAACpb,EAAI4X,KACtB,GAAK6R,KAAwB7R,GAtMV,GA0MnB,OACE,kBAAC,GAAD,CACE5W,OAAQhB,EACRwlB,cAAY,EACZljB,QAASynB,SAMhBQ,EAAc1pB,QACf,yBAAKwB,UAAU,kBACb,wBAAIA,UAAU,mBAAmBL,EAAK,mBACrCuoB,EAAcnP,KA9GvB,SAA4BziB,GAC1B,MAAM6M,EAAOqiB,YAAsB7lB,EAAMrJ,GACnC8J,EAAO0W,EAAUxgB,EAAQqI,QAE/B,GAAKwE,GAAS/C,EAId,OACE,kBAAC,GAAD,CACEzB,OAAQrI,EAAQqI,OAChBrI,QAASA,EACTsuB,YAAaA,SASV,kBAAC,GAAD,CAAgBV,QAASA,OC9IpC,MAAMT,GAAe9f,YAAU+f,GAAOA,IAAM,KAAK,GA2FlCjd,mBAAKhI,YACjBC,IACC,MAAQmY,KAAMC,GAAcpY,EAAOkY,OAC7B,cAAEI,EAAemJ,UAAYyG,SAAUC,GAAvC,aAAiElC,GAAiBjmB,GAClF,eAAE2nB,EAAF,cAAkB1V,GAAkBjS,EAAOulB,cAE3C,SAAEvT,GAAcC,GAAiBA,EAAcxN,MAAS,GAE9D,MAAO,CACL6T,gBACAtG,WACAmW,yBACA/P,YACAuP,iBACA1B,iBAGJ,CAACvlB,EAAWC,IAA2BC,YAAKD,EAAS,CAAC,yBAjBpCZ,CAzFkD,EACpEmmB,cACA5N,gBACA8P,kBACApW,WACAmW,yBACA/P,YACAuP,iBACA1B,eACAqC,uBACAD,yBAEA,MAAMpnB,EAAOC,cACP0nB,EAAiB5nB,YAAY,EAAG4V,gBAChCqP,GAAgBrP,IAAciS,IAAkBC,WAClD/D,GAAa,KACXuD,EAAqB,CACnB/gB,KAAM,OACNwhB,MAAO7C,EACPjmB,OAAQqY,OAIb,CAACA,EAAe2N,EAAcqC,EAAsBpC,IAEjDsD,EAAgBjmB,YAAQ,IACvByO,GAAgC,IAApBA,EAASlS,OAInBkS,EACJqI,IAAKpb,IACJ,MAAOgB,EAAQC,GAAajB,EAAGwqB,MAAM,KAAKpP,IAAIhP,QAE9C,OACE8c,GAA0BA,EAAuBloB,IAAWkoB,EAAuBloB,GAAQkY,KAAKjY,KAGnG4Y,OAAmBpgB,SACnBgxB,KAAK,CAACC,EAAGC,IAAMA,EAAE7nB,KAAO4nB,EAAE5nB,MAZpBmnB,KAaR,CAAClX,EAAUmW,IAmBd,MAAM4B,EAAepC,IAAmBA,EAAezP,QAAUyP,EAAelG,WAAa+H,EAAc1pB,OAE3G,OACE,yBAAKwB,UAAU,cACb,kBAAC2Y,GAAA,EAAD,CACE3Y,UAAU,yCACV4Y,MAAOsP,EACPrP,WAAYyO,EACZqB,YAAU,GAET7B,GACC,yBAAK9mB,UAAU,4CACb,kBAAC,GAAD,CACE2lB,WAAYmB,EACZlB,SAAUmB,KAIf0B,GACC,kBAACG,GAAA,EAAD,CACEzlB,KAAMxD,EAAK,6BACXkpB,YAAalpB,EAAK,4CAGnBuoB,EAAc1pB,QAAU0pB,EAAcnP,KAzC/C,SAA4BziB,GAC1B,MAAM6M,EAAOqiB,YAAsB7lB,EAAMrJ,GACnC8J,EAAO0W,EAAUxgB,EAAQqI,QAE/B,GAAKwE,GAAS/C,EAId,OACE,kBAAC,GAAD,CACEzB,OAAQrI,EAAQqI,OAChBrI,QAASA,EACTsuB,YAAaA,YC/Ed,SAASqE,GAAsBhjB,GACpC,MAAO,CAACvH,EAAqBwqB,KAC3B,MAAQrS,KAAMC,GAAcpY,EAAOkY,OAC3BC,KAAMiN,GAAcplB,EAAOqlB,OAC7B,eACJsC,EADI,cACY1V,EADZ,OAC2BhS,GAC7BD,EAAOulB,aAKLkF,EAAuB,UAATljB,EAAmBA,EAAQijB,GAASA,EAAME,QAAU,QAAU,SAE1ExC,SAAUC,GAA2BnoB,EAAOyhB,UAC9C,SAAEzP,GAAcC,GAAiBA,EAAcwY,IAAiB,GAEtE,MAAO,CACLE,eAAwB/nB,IAAboP,KACL2V,GAAiBjvB,QAAQivB,EAAezP,OAASyP,EAAelG,UACtErJ,YACAgN,YACA+C,yBACAnW,WACA4Y,aAAc3qB,EACdgmB,aAAcjmB,EAAOimB,e,wBCV3B,MACMlB,GAAe9f,YAAU+f,GAAOA,IAAM,KAAK,GAsGlCjd,mBAAKhI,YAClBwqB,GAxGmB,SAyGnB,CAAC7pB,EAAWC,IAA2BC,YAAKD,EAAS,CACnD,uBACA,oBAJgBZ,CApG4C,EAC9DmmB,cACA0E,eACAD,YACAxC,yBACAnW,WACAiU,eACAqC,uBACAnW,sBAEA,MAAMlR,EAAOC,cACP0nB,EAAiB5nB,YAAY,EAAG4V,gBAChCqP,GAAgBrP,IAAciS,IAAkBC,WAClD/D,GAAa,KACXuD,EAAqB,CACnB/gB,KAlBW,QAmBXwhB,MAAO7C,EACPjmB,OAAQ2qB,OAIb,CAAC3E,EAAcqC,EAAsBpC,EAAa0E,IAE/CpB,EAAgBjmB,YAAQ,IACvByO,GAAamW,EAIXnW,EAASqI,IAAKpb,IACnB,MAAOgB,EAAQC,GAAajB,EAAGwqB,MAAM,KAAKpP,IAAIhP,QAE9C,OAAO8c,EAAuBloB,IAAWkoB,EAAuBloB,GAAQkY,KAAKjY,KAC5E4Y,OAAOpgB,SAPDwwB,KAQR,CAACf,EAAwBnW,IAEtB6Y,EAAoB7pB,YAAY,CAACd,EAAmBD,KACxDkS,EAAgB,CACdlS,SACAC,YACAxI,OAAQ4C,IAAkBI,gBAE3B,CAACyX,IA2BJ,MAAM2Y,EAAoBC,aAAkB,CAAC7E,GAAc8E,QAA+BL,EACpFM,EAAcH,GAAqB9Y,GAAYA,EAASlS,OAAS,IAAMomB,EACvEgF,EAAgBJ,GAAqB9Y,GAAYA,EAASlS,OAAS,GAAKomB,EAExEiF,EAAane,aACjB,+BACAke,GAAiB,aAGnB,OACE,yBAAK5pB,UAAU,cACb,kBAAC2Y,GAAA,EAAD,CACE3Y,UAAW6pB,EACXjR,MAAOsP,EACP4B,aAAelF,EAAyB,YAAX,SAC7B/L,WAAYyO,EACZqB,YAAU,IAERa,GAAqB,kBAACnQ,GAAA,EAAD,MACtBmQ,KAAuB9Y,GAAgC,IAApBA,EAASlS,SAC3C,kBAACoqB,GAAA,EAAD,CACEzlB,KAAMxD,EAAK,6BACXkpB,YAAalpB,EAAK,0CAGrBgqB,GAhDH,yBAAK3pB,UAAU,cACZkoB,EAAcnP,IAAKziB,GAClB,kBAACyzB,GAAA,EAAD,CACE5pB,IAAK7J,EAAQqH,GACbqsB,SAAS,eACT1zB,QAASA,EACT2J,QAASspB,MA2CZK,GAnCE1B,EAAcnP,IAAKziB,GACxB,kBAAC,GAAD,CACE6J,IAAK7J,EAAQqH,GACbgB,OAAQrI,EAAQqI,OAChBrI,QAASA,UCtFV,SAAS2zB,GACdtqB,EAAcrJ,EAAqBwgB,EAAoCgN,GAEvE,MAAM,SAAE/T,GAAazZ,EACrB,IAAKyZ,EACH,OAGF,MAAMjR,EAASC,aAAcgR,GAAY+T,EAAU/T,GAAY+G,EAAU/G,GAEzE,IAAIma,EAAanqB,YAAeJ,EAAMb,GAEtC,MAAMsB,EAAO0W,EAAUxgB,EAAQqI,QAS/B,OARIyB,IACErB,aAAcgR,IAAcjR,EAAmBqmB,OACjD+E,EAAc,GAAEvqB,EAAK,gBAAgBsY,YAAatY,EAAMS,KAC/C+pB,aAAY/pB,KACrB8pB,GAAe,MAAKjS,YAAatY,EAAMS,KAIpC8pB,E,cCDT,MACMzG,GAAe9f,YAAU+f,GAAOA,IAAM,KAAK,GAyFlCjd,mBAAKhI,YAClBwqB,GA3FmB,SA4FnB,CAAC7pB,EAAWC,IAA2BC,YAAKD,EAAS,CACnD,uBACA,iBAJgBZ,CAvF2C,EAC7DmmB,cACA0E,eACAD,YACAvS,YACAgN,YACA+C,yBACAnW,WACAiU,eACAqC,uBACAxnB,mBAEA,MAAMG,EAAOC,cACP0nB,EAAiB5nB,YAAY,EAAG4V,gBAChCqP,GAAgBrP,IAAciS,IAAkBC,WAClD/D,GAAa,KACXuD,EAAqB,CACnB/gB,KApBW,QAqBXwhB,MAAO7C,EACPjmB,OAAQ2qB,OAIb,CAAC3E,EAAcqC,EAAsBpC,EAAa0E,IAE/CpB,EAAgBjmB,YAAQ,IACvByO,GAAamW,EAIXnW,EAASqI,IAAKpb,IACnB,MAAOgB,EAAQC,GAAajB,EAAGwqB,MAAM,KAAKpP,IAAIhP,QAE9C,OAAO8c,EAAuBloB,IAAWkoB,EAAuBloB,GAAQkY,KAAKjY,KAC5E4Y,OAAOpgB,SAPDwwB,KAQR,CAACf,EAAwBnW,IAEtB0Z,EAAqB1qB,YAAY,CAACd,EAAmBD,KACzDa,EAAa,CAAEb,SAAQC,eACtB,CAACY,IAyBJ,MAAMgqB,EAAoBC,aAAkB,CAAC7E,GAAc8E,QAA+BL,EAE1F,OACE,yBAAKrpB,UAAU,cACb,kBAAC2Y,GAAA,EAAD,CACE3Y,UAAU,8CACV4Y,MAAOsP,EACPrP,WAAYyO,EACZqB,YAAU,IAERa,GAAqB,kBAACnQ,GAAA,EAAD,MACtBmQ,KAAuB9Y,GAAgC,IAApBA,EAASlS,SAC3C,kBAACoqB,GAAA,EAAD,CACEzlB,KAAMxD,EAAK,6BACXkpB,YAAalpB,EAAK,0CAGrB6pB,GAAqB9Y,GAAYA,EAASlS,OAAS,GAvCjD0pB,EAAcnP,IAAI,CAACziB,EAASif,KACjC,MAAM8U,EAAkC,IAAV9U,GACzB+U,YAAYh0B,EAAQmK,QAAU6pB,YAAYpC,EAAc3S,EAAQ,GAAG9U,MACxE,OACE,yBACET,UAAU,WACVG,IAAK7J,EAAQqH,IAEZ0sB,GACC,uBAAGrqB,UAAU,mBAAmBye,YAAmB9e,EAAM,IAAIwb,KAAoB,IAAf7kB,EAAQmK,QAE5E,kBAAC8pB,GAAA,EAAD,CACEpqB,IAAK7J,EAAQqH,GACbrH,QAASA,EACTwJ,YAAamqB,GAActqB,EAAMrJ,EAASwgB,EAAWgN,GACrD0G,eAAgBJ,Y,UC1D5B,MACM3G,GAAe9f,YAAU+f,GAAOA,IAAM,KAAK,GA6FlCjd,mBAAKhI,YAClBwqB,GA/FmB,aAgGnB,CAAC7pB,EAAWC,IAA2BC,YAAKD,EAAS,CACnD,uBACA,iBAJgBZ,CA3F2C,EAC7DmmB,cACA0E,eACAD,YACAvS,YACAgN,YACA+C,yBACAnW,WACAiU,eACAqC,uBACAxnB,mBAEA,MAAMG,EAAOC,cACP0nB,EAAiB5nB,YAAY,EAAG4V,gBAChCqP,GAAgBrP,IAAciS,IAAkBC,WAClD/D,GAAa,KACXuD,EAAqB,CACnB/gB,KApBW,YAqBXwhB,MAAO7C,EACPjmB,OAAQ2qB,OAIb,CAAC3E,EAAcqC,EAAsBpC,EAAa0E,IAE/CpB,EAAgBjmB,YAAQ,IACvByO,GAAamW,EAIXnW,EAASqI,IAAKpb,IACnB,MAAOgB,EAAQC,GAAajB,EAAGwqB,MAAM,KAAKpP,IAAIhP,QACxCzT,EAAUuwB,EAAuBloB,IAAWkoB,EAAuBloB,GAAQkY,KAAKjY,GAEtF,OAAOtI,GAAWm0B,YAAmBn0B,GAAWA,OAAUgL,IACzDkW,OAAOpgB,SARDwwB,KASR,CAACf,EAAwBnW,IAEtB0Z,EAAqB1qB,YAAY,CAACd,EAAmBD,KACzDa,EAAa,CAAEb,SAAQC,eACtB,CAACY,IA4BJ,MAAMgqB,EAAoBC,aAAkB,CAAC7E,GAAc8E,QAA+BL,EAE1F,OACE,yBAAKrpB,UAAU,cACb,kBAAC2Y,GAAA,EAAD,CACE3Y,UAAU,8CACV4Y,MAAOsP,EACPrP,WAAYyO,EACZqB,YAAU,IAERa,GAAqB,kBAACnQ,GAAA,EAAD,MACtBmQ,KAAuB9Y,GAAgC,IAApBA,EAASlS,SAC3C,kBAACoqB,GAAA,EAAD,CACEzlB,KAAMxD,EAAK,6BACXkpB,YAAalpB,EAAK,0CAGrB6pB,GAAqB9Y,GAAYA,EAASlS,OAAS,GA1CjD0pB,EAAcnP,IAAI,CAACziB,EAASif,KACjC,MAAM8U,EAAkC,IAAV9U,GACzB+U,YAAYh0B,EAAQmK,QAAU6pB,YAAYpC,EAAc3S,EAAQ,GAAG9U,MACxE,OACE,yBACET,UAAU,WACVG,IAAK7J,EAAQqH,IAEZ0sB,GACC,uBAAGrqB,UAAU,mBAAmBye,YAAmB9e,EAAM,IAAIwb,KAAoB,IAAf7kB,EAAQmK,QAE5E,kBAACiqB,GAAA,EAAD,CACEp0B,QAASA,EACTq0B,UAAQ,EACRC,SAAUt0B,EAAQmK,KAClBoqB,SAAO,EACP/rB,OAAQmrB,GAActqB,EAAMrJ,EAASwgB,EAAWgN,GAChD9jB,UAAU,cACV8qB,YAAaV,Y,UCjEzB,MAAM3G,GAAe9f,YAAU+f,GAAOA,IAAM,KAAK,GAqGlCjd,mBAAKhI,YAClBwqB,GAAsB,SACtB,CAAC7pB,EAAWC,IAA2BC,YAAKD,EAAS,CACnD,uBACA,eACA,oBALgBZ,CAnG4C,EAC9D2qB,UACAxE,cACA0E,eACAD,YACAvS,YACAgN,YACA+C,yBACAnW,WACAiU,eACAqC,uBACAxnB,eACAurB,sBAEA,MAAMprB,EAAOC,cACPupB,EAAcC,EAAU,QAAU,QAClC9B,EAAiB5nB,YAAY,EAAG4V,gBAChCqP,GAAgBrP,IAAciS,IAAkBC,WAClD/D,GAAa,KACXuD,EAAqB,CACnB/gB,KAAMkjB,EACN1B,MAAO7C,EACPjmB,OAAQ2qB,OAIb,CAACH,EAAaxE,EAAcqC,EAAsBpC,EAAa0E,IAE5DpB,EAAgBjmB,YAAQ,IACvByO,GAAamW,EAIXnW,EAASqI,IAAKpb,IACnB,MAAOgB,EAAQC,GAAajB,EAAGwqB,MAAM,KAAKpP,IAAIhP,QAE9C,OAAO8c,EAAuBloB,IAAWkoB,EAAuBloB,GAAQkY,KAAKjY,KAC5E4Y,OAAOpgB,SAPDwwB,KAQR,CAACf,EAAwBnW,IAEtB0Z,EAAqB1qB,YAAY,CAACd,EAAmBD,KACzDa,EAAa,CAAEb,SAAQC,eACtB,CAACY,IAEEwrB,EAAkBtrB,YAAY,CAACd,EAAmBD,KACtDosB,EAAgB,CAAEpsB,SAAQC,eACzB,CAACmsB,IA8BJ,MAAMvB,EAAoBC,aAAkB,CAAC7E,GAAc8E,QAA+BL,EAE1F,OACE,yBAAKrpB,UAAU,cACb,kBAAC2Y,GAAA,EAAD,CACE3Y,UAAU,8CACV4Y,MAAOsP,EACPrP,WAAYyO,EACZqB,YAAU,IAERa,GAAqB,kBAACnQ,GAAA,EAAD,MACtBmQ,KAAuB9Y,GAAgC,IAApBA,EAASlS,SAC3C,kBAACoqB,GAAA,EAAD,CACEzlB,KAAMxD,EAAK,6BACXkpB,YAAalpB,EAAK,0CAGrB6pB,GAAqB9Y,GAAYA,EAASlS,OAAS,GA5CjD0pB,EAAcnP,IAAI,CAACziB,EAASif,KACjC,MAAM8U,EAAkC,IAAV9U,GACzB+U,YAAYh0B,EAAQmK,QAAU6pB,YAAYpC,EAAc3S,EAAQ,GAAG9U,MACxE,OACE,yBACET,UAAU,WACVG,IAAK7J,EAAQqH,IAEZ0sB,GACC,uBAAGrqB,UAAU,mBAAmBye,YAAmB9e,EAAM,IAAIwb,KAAoB,IAAf7kB,EAAQmK,QAE5E,kBAACwqB,GAAA,EAAD,CACE9qB,IAAK7J,EAAQqH,GACbrH,QAASA,EACT40B,aAAa,eACbprB,YAAamqB,GAActqB,EAAMrJ,EAASwgB,EAAWgN,GACrDrjB,KAAMnK,EAAQmK,KACdkkB,aAAcA,EACd3kB,UAAU,cACVmrB,OAAQH,EACRF,YAAaV,Y,OClEzB,MAAMgB,GAAO,CACX,CAAEnlB,KAAMolB,IAAoBC,SAAU3R,MAAO,uBAC7C,CAAE1T,KAAMolB,IAAoBtB,MAAOpQ,MAAO,mBAC1C,CAAE1T,KAAMolB,IAAoBE,MAAO5R,MAAO,mBAC1C,CAAE1T,KAAMolB,IAAoBG,MAAO7R,MAAO,mBAC1C,CAAE1T,KAAMolB,IAAoBI,MAAO9R,MAAO,mBAC1C,CAAE1T,KAAMolB,IAAoBK,MAAO/R,MAAO,oBAGtCgS,GAAY,CAChB,CAAE1lB,KAAMolB,IAAoBC,SAAU3R,MAAO,mBAC1CyR,GAAKQ,MAAM,IAGVC,GAA0B5tB,OAAO6tB,KAAKT,KAAqB7sB,OAAS,EAgF3DiI,mBAAKhI,YACjBC,IACC,MAAM,eAAEqtB,EAAF,OAAkBptB,GAAWD,EAAOulB,aAE1C,MAAO,CAAE8H,iBAAgBptB,WAE3B,CAACS,EAAWC,IAA2BC,YAAKD,EAAS,CAAC,yBAA0B,wBAN9DZ,CA9E0C,EAC5DmmB,cACAe,aACAoG,iBAAiBV,IAAoBC,SACrC3sB,SACAqtB,yBACAC,sBACA/H,cAEA,MAAOgI,EAAWC,GAAgBhrB,YAAS,GACrC2lB,EAAkB7kB,YAAQ,IAAMmqB,YAAgBxH,GAAc,CAACA,IAE/DyH,EAAkB3sB,YAAa6V,IACnC,MAAM+W,EAAMlB,GAAK7V,GACjByW,EAAuB,CAAEO,QAASD,EAAIrmB,OACtCkmB,EAAa5W,IACZ,CAACyW,IAEEQ,EAAyB9sB,YAAayG,IAC1C8lB,EAAoB,CAAExrB,KAAM0F,EAAM+X,UAAY,OAC7C,CAAC+N,IAEJ,OACE,yBAAKjsB,UAAU,cACb,kBAACysB,GAAA,EAAD,CAASP,UAAWA,EAAWQ,KAAM/tB,EAASgtB,GAAYP,GAAMuB,YAAaN,IAC7E,kBAAC7V,EAAA,EAAD,CAAYE,KAAK,QAAQkW,YAAaf,GAAyBpV,UAAWsV,GACvE,KACC,OAAQA,GACN,KAAKV,IAAoBC,SACvB,OAAI3sB,EAEA,kBAAC,GAAD,CACEimB,YAAaA,EACbkC,gBAAiBA,EACjB5C,QAASA,EACT6C,mBAAoByF,IAKxB,kBAAC,GAAD,CACE5H,YAAaA,EACbe,WAAYA,EACZmB,gBAAiBA,EACjB5C,QAASA,EACT6C,mBAAoByF,IAG1B,KAAKnB,IAAoBtB,MACvB,OAAO,kBAAC,GAAD,CAAcnF,YAAaA,IACpC,KAAKyG,IAAoBE,MACvB,OAAO,kBAAC,GAAD,CAAa3G,YAAaA,IACnC,KAAKyG,IAAoBG,MACvB,OAAO,kBAAC,GAAD,CAAa5G,YAAaA,IACnC,KAAKyG,IAAoBI,MACvB,OACE,kBAAC,GAAD,CACEtrB,IAAI,QACJykB,YAAaA,IAGnB,KAAKyG,IAAoBK,MACvB,OACE,kBAAC,GAAD,CACEvrB,IAAI,QACJipB,SAAO,EACPxE,YAAaA,IAGnB,QACE,cCnHC,SAASiI,GACtBC,EACAC,GAEA,MAAMC,EAAa9lB,YAAO4lB,IACnBG,EAAOC,GAAY/rB,YAAgB4rB,GAM1C,MAAO,CACLE,EALevtB,YAAaytB,IAC5BD,EAAUE,GAAiBJ,EAAW/kB,QAAQmlB,EAAcD,KAC3D,KCFE,MAAME,GAAwC,CACnD,CAAExqB,KAAM,OAAQ8W,MAAO,iBAAkBxZ,IAAK,YAC9C,CAAE0C,KAAM,eAAgB8W,MAAO,oBAAqBxZ,IAAK,eACzD,CAAE0C,KAAM,QAAS8W,MAAO,eAAgBxZ,IAAK,UAC7C,CAAE0C,KAAM,UAAW8W,MAAO,iBAAkBxZ,IAAK,YACjD,CAAE0C,KAAM,OAAQ8W,MAAO,aAAcxZ,IAAK,SAG/BmtB,GAAwC,CACnD,CAAEzqB,KAAM,OAAQ8W,MAAO,cAAexZ,IAAK,gBAC3C,CAAE0C,KAAM,UAAW8W,MAAO,iBAAkBxZ,IAAK,mBACjD,CAAE0C,KAAM,YAAa8W,MAAO,aAAcxZ,IAAK,gBAG3CotB,GAA2D,CAC/D,kBAAmB,OAAQ,WAAY,SAAU,WAAY,eAEzDC,GAA2D,CAC/D,kBAAmB,kBAAmB,eAAgB,eAGjD,SAASC,GAAkBR,EAAqBS,EAA+BC,GACpF,IAAIC,EAA4B,GAC5BC,EAA6C,GAEjD,GAAa,aAATH,EAAqB,CACvB,MAAM,gBACJI,KACGC,GACDJ,EACAV,EAAMc,gBAAkB,GACxBzuB,YACA2tB,EAAMe,OACNT,IAGJK,EAAkBE,GAAmB,GACrCD,EAAqB5vB,OAAO6tB,KAAKiC,GAC9BvW,OAAQrX,GAAQ/I,QAAQ22B,EAAe5tB,SACrC,CACL,MAAM,gBACJ8tB,KACGC,GACDP,EACAV,EAAMiB,gBAAkB,GACxB5uB,YACA2tB,EAAMe,OACNR,IAGJI,EAAkBK,GAAmB,GACrCJ,EAAqB5vB,OAAO6tB,KAAKoC,GAC9B1W,OAAQrX,GAAQ/I,QAAQ82B,EAAe/tB,KAG5C,MAAO,CACLytB,kBACAC,qBAIJ,SAASM,GAAuBJ,GAC9B,GAAIA,EAAgB,CAClB,MAAM,gBACJD,KACGM,GACDL,EAEJ,GACE9vB,OAAOowB,OAAOD,GAAS5W,OAAOpgB,SAASoH,OAAS,GAC5CsvB,GAAmBA,EAAgBtvB,OAEvC,MAAO,GAGT,GAAI4vB,EAAQE,KACV,MAAO,OACF,GAAIF,EAAQG,OACjB,MAAO,SACF,GAAIH,EAAQI,SACjB,MAAO,WACF,GAAIJ,EAAQK,SACjB,MAAO,WACF,GAAIL,EAAQM,YACjB,MAAO,eAIX,MAAO,GAyBT,MAAMC,GAA8B,CAClCjB,KAAM,SACNkB,WAAY,GACZZ,OAAQ,CACNrU,MAAO,GACPmU,gBAAiB,GACjBG,gBAAiB,KAIfY,GAA6D,CACjE5B,EACAE,KAEA,OAAQA,EAAOlnB,MACb,IAAK,WACH,MAAO,IACFgnB,EACHe,OAAQ,IACHf,EAAMe,OACTrU,MAAOwT,EAAO2B,SAEhBC,WAAW,GAEf,IAAK,qBACH,MAAO,IACF9B,EACHc,eAAgBzuB,YACd2tB,EAAMe,OACNT,KAGN,IAAK,qBACH,MAAO,IACFN,EACHiB,eAAgB5uB,YACd2tB,EAAMe,OACNR,KAGN,IAAK,oBACH,MAAO,IACFP,EACHc,eAAgBZ,EAAO2B,QACvBF,WAAY,IAEhB,IAAK,oBACH,MAAO,IACF3B,EACHiB,eAAgBf,EAAO2B,QACvBF,WAAY,IAEhB,IAAK,cACH,OAAI3B,EAAMc,eACD,IACFd,EACHe,OAAQ,IACHgB,YAAK/B,EAAMe,OAAQT,IACtB5T,MAAOsT,EAAMe,OAAOrU,MAAQsT,EAAMe,OAAOrU,MAAQwU,GAAuBlB,EAAMc,mBAC3Ed,EAAMc,gBAEXA,oBAAgBzsB,EAChBstB,WAAY,GACZG,WAAW,GAEJ9B,EAAMiB,eACR,IACFjB,EACHe,OAAQ,IACHgB,YAAK/B,EAAMe,OAAQR,OACnBP,EAAMiB,gBAEXA,oBAAgB5sB,EAChBstB,WAAY,GACZG,WAAW,GAGN9B,EAEX,IAAK,aAAc,CACjB,MAAQtvB,GAAIsxB,EAAN,YAAgBpG,KAAgBmF,GAAWb,EAAO2B,QAExD,MAAO,CACLpB,KAAM,OACNuB,WACAjB,SACAY,WAAY,IAGhB,IAAK,gBACH,MAAO,IACF3B,EACH2B,WAAYzB,EAAO2B,SAGvB,IAAK,eACH,MAAO,IACF7B,EACH5D,UAAW8D,EAAO2B,SAGtB,IAAK,WACH,MAAO,IACF7B,EACH1T,MAAO4T,EAAO2B,SAGlB,IAAK,QACH,OAAOH,GACT,QACE,OAAO1B,IC9Nb,MAAM0B,GAA4B,CAChCO,gBAAiB,GACjBC,SAAU,GACVC,KAAM,GACNC,MAAO,IAGHC,GAAuD,CAC3DrC,EACAE,KAEA,OAAQA,EAAOlnB,MACb,IAAK,qBACH,MAAO,IACFgnB,EACHiC,gBAAiB/B,EAAO2B,SAG5B,IAAK,cACH,MAAO,IACF7B,EACHkC,SAAUhC,EAAO2B,SAGrB,IAAK,UACH,MAAO,IACF7B,EACHmC,KAAMjC,EAAO2B,SAGjB,IAAK,WACH,MAAO,IACF7B,EACHoC,MAAOlC,EAAO2B,SAGlB,IAAK,QACH,OAAOH,GAET,QACE,OAAO1B,IC+LExmB,mBAAKhI,iBAClB6C,EACA,CAAClC,EAAWC,IAA2BC,YAAKD,EAAS,CAAC,UAAW,qBAF/CZ,CA3NiC,EACnD8wB,gBACAC,iBACAtL,UACAuL,eACAC,UACAC,uBAEA,MAAOC,EAAqBC,GAA0B1uB,aAAS,IACxD2uB,EAA0BC,GAA+B5uB,aAAS,GAEnE6uB,EAA0BtwB,YAAY,KAC1CmwB,GAAuB,IACtB,IAEGI,EAA2BvwB,YAAY,KAC3CmwB,GAAuB,IACtB,IAEGK,EAA+BxwB,YAAY,KAC/CqwB,GAA4B,IAC3B,IAEGI,EAAgCzwB,YAAY,KAChDqwB,GAA4B,IAC3B,IAEGK,EAAuB1wB,YAAY,KACvCuwB,IACAP,KACC,CAACO,EAA0BP,IAExBW,EAA4B3wB,YAAY,KAC5CywB,IACAR,EAAiB,CAAEhyB,GAAI6xB,IACvBtL,KACC,CAACsL,EAAgBW,EAA+BR,EAAkBzL,IAE/DoM,EAAsEruB,YAAQ,IAC3E,EAAGC,YAAWC,YACnB,kBAACC,EAAA,EAAD,CACEC,OAAK,EACLgE,QAAS7D,IACT/I,KAAK,UACL6I,MAAM,cACNtC,UAAWmC,EAAS,SAAW,GAC/BlC,QAASiC,EACTK,UAAU,gBAEV,uBAAGvC,UAAU,eAGhB,IAEGL,EAAOC,cAqIb,OACE,yBAAKI,UAAU,eACb,kBAACoC,EAAA,EAAD,CACEC,OAAK,EACL5I,KAAK,UACL6I,MAAM,cACNrC,QAASikB,EACT3hB,UAAW5C,EAAK,mBAEhB,uBAAGK,UAAU,qBA5InB,WACE,OAAQuvB,GACN,KAAKgB,IAAgBC,YACnB,OAAO,4BAAK7wB,EAAK,6BACnB,KAAK4wB,IAAgBE,QACnB,OAAO,4BAAK9wB,EAAK,YACnB,KAAK4wB,IAAgBG,cACnB,OAAO,4BAAK/wB,EAAK,kBACnB,KAAK4wB,IAAgBI,QACnB,OAAO,4BAAKhxB,EAAK,oBACnB,KAAK4wB,IAAgBK,SACnB,OAAO,4BAAKjxB,EAAK,aAEnB,KAAK4wB,IAAgBM,sBACnB,OAAO,4BAAKlxB,EAAK,mBACnB,KAAK4wB,IAAgBO,2BACnB,OAAO,4BAAKnxB,EAAK,aAEnB,KAAK4wB,IAAgBQ,mBACnB,OAAO,4BAAKpxB,EAAK,iBACnB,KAAK4wB,IAAgBS,gBACnB,OAAO,4BAAKrxB,EAAK,oBACnB,KAAK4wB,IAAgBU,oBACnB,OAAO,4BAAKtxB,EAAK,yBACnB,KAAK4wB,IAAgBW,kBACnB,OAAO,4BAAKvxB,EAAK,oBACnB,KAAK4wB,IAAgBY,kBACnB,OAAO,4BAAKxxB,EAAK,2BACnB,KAAK4wB,IAAgBa,kCACrB,KAAKb,IAAgBc,+BACrB,KAAKd,IAAgBe,mCACrB,KAAKf,IAAgBgB,iCACrB,KAAKhB,IAAgBiB,iCACnB,OAAO,4BAAK7xB,EAAK,oBACnB,KAAK4wB,IAAgBkB,iCACrB,KAAKlB,IAAgBmB,8BACrB,KAAKnB,IAAgBoB,kCACrB,KAAKpB,IAAgBqB,gCACrB,KAAKrB,IAAgBsB,gCACnB,OAAO,4BAAKlyB,EAAK,mBAEnB,KAAK4wB,IAAgBuB,sBACnB,OAAO,4BAAKnyB,EAAK,kBACnB,KAAK4wB,IAAgBwB,oBACnB,OAAO,4BAAKpyB,EAAK,iBAEnB,KAAK4wB,IAAgByB,cACrB,KAAKzB,IAAgB0B,aACnB,OAAO,4BAAKtyB,EAAK,wBACnB,KAAK4wB,IAAgB2B,iBACrB,KAAK3B,IAAgB4B,uBACrB,KAAK5B,IAAgB6B,2BACnB,OAAO,4BAAKzyB,EAAK,kBACnB,KAAK4wB,IAAgB8B,wBACnB,OAAO,4BAAK1yB,EAAK,0BACnB,KAAK4wB,IAAgB+B,qBACrB,KAAK/B,IAAgBgC,wBACnB,OAAO,4BAAK5yB,EAAK,iBACnB,KAAK4wB,IAAgBiC,sBACrB,KAAKjC,IAAgBkC,mBACnB,OAAO,4BAAK9yB,EAAK,uBACnB,KAAK4wB,IAAgBmC,0BACrB,KAAKnC,IAAgBoC,uBACnB,OAAO,mDACT,KAAKpC,IAAgBqC,qBACnB,OAAO,4BAAKjzB,EAAK,mCACnB,KAAK4wB,IAAgBsC,2BACrB,KAAKtC,IAAgBuC,aACrB,KAAKvC,IAAgBwC,kCACnB,OAAO,4BAAKpzB,EAAK,+BAEnB,KAAK4wB,IAAgByC,QACnB,OAAO,4BAAKrzB,EAAK,YACnB,KAAK4wB,IAAgB0C,oBACnB,OAAO,4BAAKtzB,EAAK,cACnB,KAAK4wB,IAAgB2C,kBACnB,OACE,yBAAKlzB,UAAU,wBACb,4BAAKL,EAAK,eAET6vB,GACC,kBAAC/sB,EAAA,EAAD,CACEzC,UAAU,qBACV0C,QAAS4tB,EACT3tB,UAAU,SAEV,kBAACC,EAAA,EAAD,CAAUC,KAAK,SAASigB,aAAW,EAAC7iB,QAASiwB,GAA7C,mBAKV,KAAKK,IAAgB4C,qBACrB,KAAK5C,IAAgB6C,qBACnB,OACE,yBAAKpzB,UAAU,wBACZuvB,IAAkBgB,IAAgB4C,qBACjC,4BAAKxzB,EAAK,kBAEV,4BAAKA,EAAK,kBAGZ,kBAACyC,EAAA,EAAD,CACEC,OAAK,EACL5I,KAAK,UACL6I,MAAM,cACNtC,UAAU,gBACVC,QAASwvB,EACTltB,UAAW5C,EAAK,sBAEhB,uBAAGK,UAAU,iBAKrB,QACE,OACE,yBAAKA,UAAU,wBACb,4BAAKL,EAAK,aAEV,kBAAC8C,EAAA,EAAD,CACEzC,UAAU,qBACV0C,QAAS4tB,EACT3tB,UAAU,SAEV,kBAACC,EAAA,EAAD,CAAUC,KAAK,SAAS5C,QAAS+vB,GAA0BrwB,EAAK,mBAkBvE0zB,GACD,kBAAC7Y,GAAA,EAAD,CACErY,OAAQytB,EACR5oB,QAASipB,EACT9sB,KAAK,oCACLsX,aAAa,UACbC,eAAgB0V,EAChBkD,sBAAoB,IAEtB,kBAAC9Y,GAAA,EAAD,CACErY,OAAQ2tB,EACR9oB,QAASmpB,EACThtB,KAAK,+CACLsX,aAAa,SACbC,eAAgB2V,EAChBiD,sBAAoB,Q,SChKb7sB,mBAAKhI,YACjBC,IACC,MAAM,cAAEsY,GAAkBtY,EAE1B,MAAO,CACL60B,YAAavc,EAAgBhY,aAAWN,EAAQsY,QAAiB1V,IALnD7C,CAzD4B,EAC9C+0B,iBACAD,kBAEA,MAAM5zB,EAAOC,cAEb,OACE,yBAAKI,UAAU,kCACb,yBAAKA,UAAU,sBACZuzB,GACC,yBAAKvzB,UAAU,yBACb,kBAACE,EAAA,EAAD,CAAQG,KAAMkzB,EAAa95B,KAAK,UAChC,uBAAGuG,UAAU,QAAQ+nB,YAAgBwL,IACrC,uBAAGvzB,UAAU,SAASyzB,aAA0BF,EAAYG,eAGhE,kBAAC1a,GAAA,EAAD,CACEnW,KAAK,OACL5C,QAAS,IAAMuzB,EAAejD,IAAgBC,cAE7C7wB,EAAK,6BAER,kBAACqZ,GAAA,EAAD,CACEnW,KAAK,SACL5C,QAAS,IAAMuzB,EAAejD,IAAgByC,UAE7CrzB,EAAK,YAER,kBAACqZ,GAAA,EAAD,CACEnW,KAAK,WACL5C,QAAS,IAAMuzB,EAAejD,IAAgBE,UAE7C9wB,EAAK,oBAER,kBAACqZ,GAAA,EAAD,CACEnW,KAAK,SACL5C,QAAS,IAAMuzB,EAAejD,IAAgBG,gBAE7C/wB,EAAK,kBAER,kBAACqZ,GAAA,EAAD,CACEnW,KAAK,OACL5C,QAAS,IAAMuzB,EAAejD,IAAgBI,UAE7ChxB,EAAK,oBAER,kBAACqZ,GAAA,EAAD,CACEnW,KAAK,WACL5C,QAAS,IAAMuzB,EAAejD,IAAgBK,WAE7CjxB,EAAK,kB,iBCxBDg0B,OA9B4B,EACzC3oB,UACAhL,YACAsC,QAAQ,UACRC,YACAoJ,WACA1L,UACAqM,eAEA,MAAMsnB,EAAkBloB,aACtB,uBACAV,GAAW,WACXhL,GAGF,OACE,kBAACoC,EAAA,EAAD,CACEpC,UAAW4zB,EACXtxB,MAAOA,EACPD,OAAK,EACLsJ,SAAUA,EACV1L,QAAS+K,IAAYW,EAAW1L,OAAUqB,EAC1CiB,UAAWA,EACXuc,UAAW,GAEVxS,ICxBP,MAGMunB,GAAoB,sBACpBC,GAAiB,oBAEjBC,GAA+BC,YAAUtQ,GAAOA,IAAM,KAAK,GAkFlDjd,mBA1E2B,EACxCwtB,kBACAC,SACA7K,YACA8K,sBACAC,gBACAxoB,eAEA,MAAOoc,EAAUqM,GAAelzB,YAAS8yB,GAAmB,IAEtDt0B,EAAOC,cACP00B,EAAaJ,EAAS,SAAW,WACjCK,EAAiB50B,EAATu0B,EAAc,oBAA4B,aAEjDM,EAAiBC,GAAiBxyB,YAAQ,IAC1C+lB,EAASxpB,OAIVwpB,EAASxpB,OAjCW,EAkCf,MAAC8C,EAAcizB,EAAF,iBAElBvM,EAASxpB,OAnCW,GAoCf,MAAC8C,EAAcizB,EAAF,gBAEjBT,GAAeY,KAAK1M,QAIG1mB,IAAxB6yB,EACK,GAIF,CACLA,EAAsBx0B,EAAQ20B,EAAF,YAAyB,iBAAchzB,GAC3C,IAAxB6yB,EAAgCx0B,EAAQ20B,EAAF,cAAuBhzB,GAVtD,MAACA,EAAcizB,EAAF,gCAVb,GAsBR,CAACvM,EAAUmM,EAAqBx0B,EAAM20B,EAAYC,IAErD7yB,YAAU,KACR2yB,EAAYJ,GAAmB,KAC9B,CAACC,EAAQD,IAEZ,MAAMU,EAAuBj1B,YAAamC,IACxC,MAAM+yB,EAAc/yB,EAAEmI,OAAO7D,MAAM0uB,OAAO7W,QAAQ6V,GAAmB,IACrEQ,EAAYO,GACZ/yB,EAAEmI,OAAO7D,MAAS,GAAE+tB,EA3DJ,gBA2D2B,KAAKU,IAEhD,MAAME,EAvDV,SAAyB9M,GACvB,OAAOA,EAASxpB,QATU,GAUrBwpB,EAASxpB,QATY,IAUrBs1B,GAAeY,KAAK1M,GAoDP+M,CAAgBH,GAE5BE,GACFf,GAA6B,KAC3BK,EAAc,CAAEpM,SAAU4M,MAI1BhpB,GACFA,IAASkpB,GAAUF,IAEpB,CAACV,EAAQE,EAAexoB,IAE3B,OACE,kBAAC2M,GAAA,EAAD,CACEpS,MAAQ,GAAE+tB,EA5EI,gBA4EmB,KAAKlM,IACtCpc,SAAU+oB,EACVJ,MAAOA,EACPhb,MAAOkb,EACPO,QAASR,EACTS,SAAU5L,MChEhB,MAAM5F,GAAe9f,YAAU+f,GAAOA,IAAM,KAAO,GA8MpCjd,mBAAKhI,YACjBC,IACC,MAAM,cAAEsY,GAAkBtY,GACpB,SAAEsE,EAAF,oBAAYmxB,GAAwBz1B,EAAOw2B,aAAe,GAC1D3B,EAAcvc,EAAgBhY,aAAWN,EAAQsY,QAAiB1V,EAExE,IAAKiyB,EACH,MAAO,CACLvwB,WACAmxB,uBAIJ,MACEgB,UAAWC,EACXC,SAAUC,EACVtN,SAAUiM,EAHN,SAIJsB,GACEhC,GACIiC,IAAKC,GAAeF,GAAY,GAGxC,MAAO,CACLG,kBAHwB/iB,YAAkB4gB,GAI1C6B,mBACAE,kBACAG,aACAxB,kBACAjxB,WACAmxB,wBAGJ,CAAC/0B,EAAWC,IAA2BC,YAAKD,EAAS,CACnD,kBACA,gBACA,kBAnCgBZ,CAvMwC,EAC1Di3B,oBACAN,mBACAE,kBACAG,aACAxB,kBACAjxB,WACAmxB,sBACAwB,kBACAC,gBACAxB,oBAEA,MAAOyB,EAAmBC,GAAwB30B,aAAS,IACpD40B,EAAwBC,GAA6B70B,aAAS,IAC9DoY,EAAO0c,GAAY90B,eAEnBnK,EAAOk/B,GAAY/0B,eACnBg0B,EAAWgB,GAAgBh1B,YAASi0B,GAAoB,KACxDC,EAAUe,GAAej1B,YAASm0B,GAAmB,KACrDE,EAAKa,GAAUl1B,YAASs0B,GAAc,KACtCzN,EAAUqM,GAAelzB,YAAyB8yB,GAAmB,IAEtEqC,EAAuBzjB,YAAS6iB,GAAmB,EAAO5iB,iBAAeC,SAEzEsW,EAAYrmB,IAAauzB,IAAoBC,WAC7CC,GAA+B,IAAbzO,EAElB0O,EAAoBz0B,YAAQ,KAC5Bw0B,IAIGr/B,QAAQJ,IAAU++B,IAAkD,IAAxB5B,GAClD,CAACn9B,EAAO++B,EAAwBU,EAAiBtC,IAIpDzyB,YAAU,KACR+hB,GAAa,KACXkS,OAED,CAACA,IAEJj0B,YAAU,KACRw0B,OAAS50B,IACR,CAACg1B,IAEJ50B,YAAU,KACRy0B,EAAaf,GAAoB,IACjCgB,EAAYd,GAAmB,IAC/Be,EAAOZ,GAAc,KACpB,CAACL,EAAkBE,EAAiBG,IAEvC/zB,YAAU,KACR2yB,EAAYJ,GAAmB,KAC9B,CAACA,IAEJvyB,YAAU,KACJsB,IAAauzB,IAAoBI,WACnCX,GAA0B,GAC1BF,GAAqB,GACrBG,OAAS30B,KAEV,CAAC0B,IAEJ,MAAM4zB,EAAoBl3B,YAAam3B,IACrCX,EAASW,IACR,IAEGC,EAAwBp3B,YAAamC,IACzCs0B,EAAat0B,EAAEmI,OAAO7D,OACtB6vB,GAA0B,IACzB,IAEGe,EAAuBr3B,YAAamC,IACxCu0B,EAAYv0B,EAAEmI,OAAO7D,OACrB6vB,GAA0B,IACzB,IAEGgB,EAAkBt3B,YAAamC,IACnCw0B,EAAOx0B,EAAEmI,OAAO7D,OAChB6vB,GAA0B,IACzB,IAEGrB,EAAuBj1B,YAAayG,IACxCkuB,EAAYluB,GACZ2vB,GAAqB,IACpB,IAEGmB,EAAoBv3B,YAAY,KACpC,MAAMw3B,EAAmB/B,EAAUN,OAC7BsC,EAAkB9B,EAASR,OAC3BuC,EAAa5B,EAAIX,OAElBqC,EAAiB14B,OAKlB44B,EAAW54B,OAxGI,GAyGjBy3B,EAtGqB,yCA0GvBL,EAAc,CACZ5+B,WACI++B,GAA0B,CAC5BZ,UAAW+B,EACX7B,SAAU8B,EACV3B,IAAK4B,MAEHvB,GAAqB,CACvB7N,cAjBFiO,EAlG2B,mCAsH5B,CACDj/B,EACAm+B,EAAWE,EAAUG,EAAKO,EAC1B/N,EAAU6N,EACVD,IAGIj2B,EAAOC,cAEb,OACE,yBAAKI,UAAU,wBACb,yBAAKA,UAAU,kCACb,yBAAKA,UAAU,yBACb,kBAACq3B,GAAA,EAAD,CACEf,qBAAsBA,EACtB1qB,SAAUgrB,EACVjd,MAAM,0BACNhO,SAAU0d,IAEZ,kBAAC9Q,GAAA,EAAD,CACEpS,MAAOgvB,EACPvpB,SAAUkrB,EACVvC,MAAO50B,EAAK,aACZgM,SAAU0d,EACV9P,MA9IqB,mCA8IdA,EAAqCA,OAAQjY,IAEtD,kBAACiX,GAAA,EAAD,CACEpS,MAAOkvB,EACPzpB,SAAUmrB,EACVxC,MAAO50B,EAAK,YACZgM,SAAU0d,IAEZ,kBAAC9Q,GAAA,EAAD,CACEpS,MAAOqvB,EACP5pB,SAAUorB,EACVzC,MAAO50B,EAAK,WACZgM,SAAU0d,EACV9P,MA1Je,0CA0JRA,EAA+BA,OAAQjY,IAGhD,uBAAGtB,UAAU,6BACVO,YAAWZ,EAAK,0BAA2B,CAAC,KAAM,sBAIvD,yBAAKK,UAAU,iBACb,wBAAIA,UAAU,wBAAwBL,EAAK,aAE3C,kBAAC23B,GAAD,CACErD,gBAAiBjM,GAAY,GAC7BqB,UAAWA,EACX8K,oBAAqBA,EACrBC,cAAeA,EACfxoB,SAAU+oB,IAGZ,uBAAG30B,UAAU,6BACVO,YAAWZ,EAAK,gBAAiB,CAAC,KAAM,qBAE1CqoB,GACC,uBAAGhoB,UAAU,6BACVL,EAAK,qBAAqB,6BAC3B,0BAAMK,UAAU,iBAAhB,gBAA8CgoB,MAMtD,kBAAC,GAAD,CACEhd,QAAS0rB,EACTz2B,QAASg3B,EACTtrB,SAAU0d,EACV9mB,UAAU,gBAET8mB,EACC,kBAAC9Z,EAAA,EAAD,CAASjN,MAAM,UAEf,uBAAGtC,UAAU,oB,oBCtMvB,MAAMu3B,GAAiC5zB,YAAU+f,GAAOA,IAAM,KAAO,GA8KtDjd,mBAAKhI,YACjBC,IACC,MACEkY,OAASC,KAAMC,GACfiN,OAASlN,KAAMiN,IACbplB,GAGF84B,WAAYC,EACZ5gB,KAAM6gB,EACNC,YAAaC,GACXl5B,EAAOm5B,YAEX,MAAO,CACL/gB,YACAgN,YACA2T,mBACAC,cACAE,yBACAE,eAAgBC,aAAqBr5B,GACrCs5B,iBAAkBC,aAAuBv5B,KAG7C,CAACU,EAAWC,IAA2BC,YAAKD,EAAS,CAAC,6BAA8B,gBAAiB,cAvBnFZ,CA1KmD,EACrEy5B,iBACAC,eACArhB,YACAgN,YACA2T,mBACAC,cACAE,yBACAE,iBACAE,mBACAI,6BACAC,gBACAC,gBAEA,MAAOC,EAAeC,GAAoBr3B,eACnCs3B,EAAmBC,GAAwBv3B,aAAS,GACrDw3B,EAAsBj5B,YAAY,IAAMg5B,GAAqB,GAAO,IAE1Eh3B,YAAU,KACH62B,GACHK,aAAiB,cAAcC,KAAKL,IAErC,CAACD,IAIJ72B,YAAU,KACR61B,GAA+B,KAC7Ba,OAED,CAACA,IAEJ,MAAMU,EAAqBp5B,YAAY,KACjCzB,OAAO6tB,KAAK4L,GAAal5B,QAnCL,GAoCtB85B,EAAU,CACR/e,MAAO,CACLjjB,QAAS,6BAOf4hC,KACC,CAACR,EAAaY,EAAWJ,IAEtBv4B,EAAOC,cAEPm5B,EAAc92B,YAAQ,KAC1B,IAAKw1B,EACH,OAGF,MAAM7f,EAAU3Z,OAAO6tB,KAAKhV,GAAWiC,IAAIhP,QAE3C,OAAO0tB,EAAiB1e,IAAKpb,IAC3B,MAAMqwB,EAAS0J,EAAY/5B,GAE3B,MAAO,CACLA,GAAIqwB,EAAOrwB,GACXgc,MAAOqU,EAAOrU,MACdqf,SAAUC,YACRt5B,EAAMmX,EAAWgN,EAAWkK,EAAQpW,EAASkgB,EAAgBE,OAIlE,CAACP,EAAkB3gB,EAAW4gB,EAAa5T,EAAWgU,EAAgBE,EAAkBr4B,IAErFu5B,EAAoCx5B,YAAasuB,IACjD/vB,OAAO6tB,KAAK4L,GAAal5B,QAvEL,GAwEtB85B,EAAU,CACR/e,MAAO,CACLjjB,QAAS,6BAOf+hC,EAAc,CAAErK,YACf,CAAC0J,EAAaW,EAAeC,IAEhC,OACE,yBAAKt4B,UAAU,kCACb,yBAAKA,UAAU,2BACb,yBAAKA,UAAU,yBACZu4B,GACC,kBAACY,GAAA,EAAD,CACEx7B,GAAG,sBACHlE,KAAM2/B,KACNb,cAAeA,EACfjvB,KAAMmvB,EACNY,QAAM,EACNC,OAAQX,KAKd,uBAAG34B,UAAU,iCAAiCM,IAAI,QAC/CX,EAAK,wBAGR,kBAACyC,EAAA,EAAD,CAEEpC,UAAU,iBACVsC,MAAM,UACN7I,KAAK,UACL8/B,MAAI,EACJC,OAAK,EACLv5B,QAAS64B,GAET,uBAAG94B,UAAU,aACZL,EAAK,qBAIV,yBAAKK,UAAU,sBACb,wBAAIA,UAAU,6BAA6BL,EAAK,YAE/Co5B,GAAeA,EAAYv6B,OAASu6B,EAAYhgB,IAAKiV,GACpD,kBAAChV,GAAA,EAAD,CACEhZ,UAAU,OACVy5B,QAAM,EACNC,WAAS,EACTz5B,QAAS,IAAMk4B,EAAaT,EAAY1J,EAAOrwB,MAE/C,0BAAMqC,UAAU,SAASguB,EAAOrU,OAChC,0BAAM3Z,UAAU,YAAYguB,EAAOgL,YAElCD,IAAgBA,EAAYv6B,OAC/B,uBAAGwB,UAAU,kCAAb,4BAGE,kBAACqZ,GAAA,EAAD,OAGJue,KAA4BA,EAAuBp5B,QACnD,yBAAKwB,UAAU,sBACb,wBAAIA,UAAU,6BAA6BL,EAAK,sBAE/Ci4B,EAAuB7e,IAAKiV,GAC3B,kBAAChV,GAAA,EAAD,CACEhZ,UAAU,OACVy5B,QAAM,EACNx5B,QAAS,IAAMi5B,EAAkClL,IAEjD,yBAAKhuB,UAAU,qCACb,yBAAKA,UAAU,kBACb,0BAAMA,UAAU,SAASguB,EAAOrU,OAChC,0BAAM3Z,UAAU,YAAYguB,EAAOnF,cAGrC,kBAACzmB,EAAA,EAAD,CACEpC,UAAU,OACVsC,MAAM,UACN7I,KAAK,OACL8/B,MAAI,EACJC,OAAK,GAEJ75B,EAAK,gB,OCtKTg6B,OAtBsB,EACnCC,QACAC,WACAC,iBACAzQ,YACAppB,aAGE,kBAACmC,EAAA,EAAD,CACEpC,UAAU,iBACVsC,MAAM,cACN7I,KAAK,UACLogB,QAAM,EACNwP,UAAWA,EACXppB,QAASA,GAET,uBAAGD,UAAU,cARf,QASQ45B,EATR,SASqBA,EAAQ,EAAIE,GAAqBD,EAAF,IAAgBA,GCaxE,MAIME,GAAiB,0CACjBC,GAAiB,mDA8PRvzB,mBAAKhI,YACjBC,IACC,MAAM,QAAEqY,GAAYrY,EAAOkY,MAE3B,MAAO,CACLqjB,oBAAqBljB,EAAQG,OAC7BgjB,sBAAuBnjB,EAAQK,WAGnC,CAAChY,EAAWC,IAA2BC,YAAKD,EAAS,CAAC,iBAAkB,gBAAiB,kBATvEZ,CA5PmD,EACrEwuB,QACAkN,WACAC,qBACAC,qBACAnW,UACA+V,sBACAC,wBACAI,iBACAjC,gBACA9gB,oBAEA,MAAOghB,EAAeC,GAAoBr3B,eACnCs3B,EAAmBC,GAAwBv3B,aAAS,GACrDw3B,EAAsBj5B,YAAY,IAAMg5B,GAAqB,GAAO,KAEnE6B,EAA6BC,GAAkCr5B,aAAS,IACxEs5B,EAA6BC,GAAkCv5B,aAAS,IAG7EysB,gBAAiBE,EACjBD,kBAAmB8M,GACjBlN,GAAkBR,EAAO,aAE3BW,gBAAiBK,EACjBJ,kBAAmB+M,GACjBnN,GAAkBR,EAAO,YAE7BvrB,YAAU,KACH62B,GACHK,aAAiB,cAAcC,KAAKL,IAErC,CAACD,IAEJ72B,YAAU,KACR84B,GAA+B,GAC/BE,GAA+B,IAC9B,CAACzN,EAAMgC,WAEV,MAAO4L,EAAwBC,GAA0B74B,YAAQ,KAC/D,MAAM84B,EAAoB,IAAIC,IAAI,IAC7Bf,GAAuB,MACvBC,GAAyB,KAGxBe,EAAwBC,YAAwBpN,EAAiBiN,GACjEI,EAAwBD,YAAwBjN,EAAiB8M,GAEvE,MAAO,CACLR,EACIU,EACAA,EAAsBrP,MAAM,EAxDV,EAwDmC+O,EAAkBn8B,QAC3Ei8B,EACIU,EACAA,EAAsBvP,MAAM,EA3DV,EA2DmCgP,EAAkBp8B,UAE5E,CACDyvB,EAAiBH,EAAiB6M,EAAmBC,EACrDH,EAA6BF,EAC7BN,EAAqBC,IAGvBx4B,YAAU,MAENm5B,EAAuBr8B,OAASsvB,EAAgBtvB,QAC7Cs8B,EAAuBt8B,OAASyvB,EAAgBzvB,SAEnD+Y,EAAc,CAAE6jB,SAAU,YAE3B,CACD7jB,EACA0W,EAAgBzvB,OAChBsvB,EAAgBtvB,OAChBs8B,EAAuBt8B,OACvBq8B,EAAuBr8B,SAGzB,MAAMmB,EAAOC,cAsDb,SAASy7B,EAAY3N,GACnB,MAAMG,EAA6B,aAATH,EAAsBiN,EAAoBC,EAC9DU,EAA0B,aAAT5N,EAAsBmN,EAAyBC,EAEhES,EAAsB,aAAT7N,EAAsB6M,EAA8BE,EAEjEe,GADsB,aAAT9N,EAAsBI,EAAkBG,GACzBzvB,OAASqvB,EAAkBrvB,OAAS88B,EAAe98B,OAC/Ei9B,EAAwB,aAAT/N,EACjB,IAAM8M,GAA+B,GACrC,IAAME,GAA+B,GAEzC,OACE,oCACG7M,EAAkB9U,IAAK5Y,GAnC9B,SAAwBA,EAAautB,GACnC,MAAMgO,EAAoB,aAAThO,EACbL,GAAoBsO,KAAK,EAAGx7B,IAAKy7B,KAAcA,IAAYz7B,GAC3DmtB,GAAoBqO,KAAK,EAAGx7B,IAAKy7B,KAAcA,IAAYz7B,GAE/D,GAAKu7B,EAIL,OACE,kBAAC1iB,GAAA,EAAD,CACE7Y,IAAKu7B,EAASv7B,IACdH,UAAU,kCACV6C,KAAM64B,EAAS74B,KACf42B,QAAM,EACNoC,UAAQ,GAEPl8B,EAAK+7B,EAAS/hB,QAkBiBmiB,CAAe37B,EAAKutB,IACnD4N,EAAeviB,IAAKpb,GACnB,kBAACqb,GAAA,EAAD,CACEhZ,UAAU,kCACVy5B,QAAM,EACNoC,UAAQ,GAEP98B,aAAcpB,GACb,kBAACsb,GAAA,EAAD,CAAiBsK,WAAW,QAAQpK,OAAQxb,IAE5C,kBAACyb,GAAA,EAAD,CAAemK,WAAW,QAAQ5kB,OAAQhB,OAI7C49B,GAAcC,EAAiB,GAChC,kBAAC,GAAD,CACE5B,MAAO4B,EACP3B,SAAS,OACT55B,QAASw7B,KAOnB,OACE,yBAAKz7B,UAAU,wBACb,yBAAKA,UAAU,kCACb,yBAAKA,UAAU,2BACb,yBAAKA,UAAU,yBACZu4B,GACC,kBAACY,GAAA,EAAD,CACEx7B,GAAG,sBACHlE,KAAM2/B,KACNb,cAAeA,EACfjvB,KAAMmvB,GAAqB/c,OAAOuR,EAAMgC,UACxCoK,QAAM,EACNC,OAAQX,KAKE,WAAf1L,EAAMS,MACL,uBAAG1tB,UAAU,kCACVL,EAAK,sBAIV,kBAAC4Y,GAAA,EAAD,CACEvY,UAAU,OACVu0B,MAAO50B,EAAK,kBACZwG,MAAO8mB,EAAMe,OAAOrU,MACpB/N,SArHV,SAAsBmwB,GACpB,MAAM,cAAEpyB,GAAkBoyB,EAC1B5B,EAAS,CAAEl0B,KAAM,WAAY6oB,QAASnlB,EAAcxD,MAAM0uB,UAoHlDtb,MAAO0T,EAAM1T,OAAS0T,EAAM1T,QAAUwgB,GAAiBA,QAAiBz4B,KAI5E,yBAAKtB,UAAU,gCACZitB,EAAM1T,OAAS0T,EAAM1T,QAAUygB,IAC9B,uBAAGh6B,UAAU,+CACVitB,EAAM1T,OAIX,wBAAIvZ,UAAU,6BAA6BL,EAAK,kBAEhD,kBAACqZ,GAAA,EAAD,CACEhZ,UAAU,gDACV6C,KAAK,MACL5C,QAASm6B,GAERz6B,EAAK,mBAGP07B,EAAY,aAGf,yBAAKr7B,UAAU,gCACb,wBAAIA,UAAU,6BAA6BL,EAAK,kBAEhD,kBAACqZ,GAAA,EAAD,CACEhZ,UAAU,gDACV6C,KAAK,MACL5C,QAASo6B,GAER16B,EAAK,mBAGP07B,EAAY,cAIjB,kBAAC,GAAD,CACErwB,UAAWiiB,EAAM8B,UACjBpjB,SAAUshB,EAAM5D,UAChBppB,QA3JN,WACE,MAAM,MAAE0Z,GAAUsT,EAAMe,OAEnBrU,EAKAmU,EAAgBtvB,QAAWP,OAAO6tB,KAAK6O,GAAmBn8B,QAK/D27B,EAAS,CAAEl0B,KAAM,eAAgB6oB,SAAS,IACvB,SAAf7B,EAAMS,KACR4M,EAAe,CAAE38B,GAAIsvB,EAAMgC,SAAU+M,aAAc/O,EAAMe,SAEzDqK,EAAc,CAAErK,OAAQf,EAAMe,SAGhC7yB,WAAW,KACT+oB,KAhHiB,MAoGjBiW,EAAS,CAAEl0B,KAAM,WAAY6oB,QAASkL,KALtCG,EAAS,CAAEl0B,KAAM,WAAY6oB,QAASiL,MAwJpCx3B,UAA0B,SAAf0qB,EAAMS,KAAkB,eAAiB,iBAEnDT,EAAM5D,UACL,kBAAC9Z,EAAA,EAAD,CAASjN,MAAM,UAEf,uBAAGtC,UAAU,oB,uBCnFRyG,mBAzKkC,EAC/CinB,OACA9V,UACAqkB,cACApO,oBACAqO,cACAC,sBACAC,4BACAC,iBACAxjB,iBAGA,MAAMzN,EAAWlE,YAAyB,MACpCo1B,EAAqB,aAAT5O,EAAsBL,GAAsBC,GACxDiP,EAAiBN,EAAYz9B,OAASqvB,EAAkBrvB,OAjBzC,GAkBfg+B,EAAcP,EAAYz9B,QAnBhB,IAqBhBkD,YAAU,KACRvG,WAAW,KACTP,sBAAsB,KACpBwQ,EAASnD,QAASyP,WA1BH,MA6BlB,IAEH,MAAM+kB,EAAkB/8B,YAAa/B,IACnC,MAAM++B,EAAiB,IAAIT,GACvBS,EAAerjC,SAASsE,GAC1B++B,EAAeC,OAAOD,EAAerqB,QAAQ1U,GAAK,GAElD++B,EAAe9e,KAAKjgB,GAEtBw+B,EAAoBO,IACnB,CAACT,EAAaE,IAEXS,EAAsBl9B,YAAaS,IACvC,MAAM08B,EAAuB,IAAIhP,GAC7BgP,EAAqBxjC,SAAS8G,GAChC08B,EAAqBF,OAAOE,EAAqBxqB,QAAQlS,GAAM,GAE/D08B,EAAqBjf,KAAKzd,GAE5Bi8B,EAA0BS,IACzB,CAAChP,EAAmBuO,IAEjB/jB,EAAqB3Y,YAAamC,IACtC,MAAM,MAAEsE,GAAUtE,EAAE8H,cACpB0yB,EAAel2B,IACd,CAACk2B,IAEE18B,EAAOC,cAgEb,MAAOsY,EAAaC,GAAWC,aAAkBS,EAAYjB,EAASxgB,QAAQ8kC,IAE9E,OACE,yBAAKl8B,UAAU,qCACb,yBAAKA,UAAU,+BACZ6tB,EAAkB9U,KAnEzB,SAAgC5Y,GAC9B,MAAM28B,EAAeR,EAAUX,KAAK,EAAGx7B,IAAKy7B,KAAcz7B,IAAQy7B,GAClE,GAAKkB,EAIL,OACE,kBAAChU,GAAA,EAAD,CACEjmB,KAAMi6B,EAAaj6B,KACnB8W,MAAOha,EAAKm9B,EAAanjB,OACzBojB,YAAaR,EACbS,UAAQ,EACR/8B,QAAS28B,EACT5T,SAAU8T,EAAa38B,SAuDtB87B,EAAYljB,IAAI,CAACpb,EAAIggB,IACpB,kBAACmL,GAAA,EAAD,CACEC,aAAcprB,EACdo/B,YAAaR,GAAkB5e,EAAIse,EAAYz9B,OA7H3B,EA8HpBw+B,UAAQ,EACR/8B,QAASw8B,EACTzT,SAAUrrB,KAGZ6+B,EAQA,uBAAGx8B,UAAU,oBAAoBM,IAAI,QACjC,6CARJ,kBAACiY,GAAA,EAAD,CACEhO,IAAKa,EACLjF,MAAO+1B,EACPtwB,SAAUyM,EACVG,YAAa7Y,EAAK,aAQxB,kBAACgZ,GAAA,EAAD,CACE3Y,UAAU,4BACV8pB,aAAa,aACblR,MAAOV,EACPW,WAAYV,KAETD,IAAgBA,EAAY1Z,QAAU0Z,EAAY7e,SAASue,EAAQ,MACpE,oCACE,wBAAIzX,IAAI,UAAUH,UAAU,wBAAwBL,EAAK,oBACxD28B,EAAUvjB,KAjFrB,SAAwB9S,GACtB,OACE,kBAAC+S,GAAA,EAAD,CACE7Y,IAAK8F,EAAK9F,IACVH,UAAU,sDACVC,QAAS,IAAM28B,EAAoB32B,EAAK9F,KACxCkG,QAAM,GAEN,uBAAGrG,UAAY,QAAOiG,EAAKpD,OAC3B,wBAAI7C,UAAU,YAAYM,IAAI,QAAQX,EAAKsG,EAAK0T,QAChD,kBAACsjB,GAAA,EAAD,CACE1I,MAAM,GACN2I,QAASrP,EAAkBx0B,SAAS4M,EAAK9F,KACzCkC,OAAK,QAqEH,yBAAKlC,IAAI,UAAUH,UAAU,wBAC7B,wBAAIG,IAAI,UAAUH,UAAU,wBAAwBL,EAAK,iBAI5DuY,GAAeA,EAAY1Z,OAC1B0Z,EAAYa,KArEpB,SAAoBpb,GAClB,MAAMw/B,EAAalB,EAAY5iC,SAASsE,GAExC,OACE,kBAACqb,GAAA,EAAD,CACE7Y,IAAKxC,EACLqC,UAAU,iDACVC,QAAS,IAAMw8B,EAAgB9+B,GAC/B0I,QAAM,EACNsF,UAAWwxB,GAAcX,GAExBz9B,aAAcpB,GACb,kBAACsb,GAAA,EAAD,CAAiBE,OAAQxb,IAEzB,kBAACyb,GAAA,EAAD,CAAeza,OAAQhB,EAAIy/B,cAAY,IAEzC,kBAACH,GAAA,EAAD,CACE1I,MAAM,GACN2I,QAASC,EACT96B,OAAK,QAmDH6V,IAAgBA,EAAY1Z,OAC9B,uBAAGwB,UAAU,aAAaG,IAAI,cAA9B,yBAEA,kBAACkZ,GAAA,EAAD,CAASlZ,IAAI,gBCrDRsG,mBAAKhI,YACjBC,IACC,MACEkY,OACEC,KAAMC,EADD,QAELC,EAFK,iBAGLsmB,IAEA3+B,EAEJ,MAAO,CACLoY,YACAC,QAASA,EAAQG,OACjBmmB,iBAAkBA,EAAiBnmB,OACnComB,kBAAmBD,EAAiBjmB,SACpCD,gBAAiBJ,EAAQK,WAG7B,CAAChY,EAAWC,IAA2BC,YAAKD,EAAS,CAAC,kBAlBpCZ,CAnH0D,EAC5EivB,OACAT,QACAkN,WACArjB,YACAC,UACAsmB,mBACAlmB,kBACAmmB,oBACA/lB,oBAEA,MAAM,WAAEqX,GAAe3B,GACjB,gBAAEW,EAAF,kBAAmBC,GAAsBJ,GAAkBR,EAAOS,GAAM,GAExE/tB,EAAOC,cACPgX,EAAQ3U,YAAQ,KACpB,MAAMs7B,EAAmBxmB,EACrBymB,aAAgB1mB,EAAWC,EAASsmB,EAAkB,YACtD/7B,EACEm8B,EAAqBtmB,EACvBqmB,aAAgB1mB,EAAWK,EAAiBmmB,EAAmB,iBAC/Dh8B,EAEJ,GAAKi8B,GAAqBE,EAI1B,MAAO,IACDF,EACA,IAAIA,EAAiBG,eAAgBH,EAAiBI,YACtD,MAEAF,EAAqBA,EAAmBE,WAAa,KAE1D,CAAC7mB,EAAWC,EAASsmB,EAAkBlmB,EAAiBmmB,IAErDM,EAAe37B,YAAQ,KAC3B,GAAK2U,EAIL,OAAOA,EACJY,OAAQpX,IACNwuB,GACE5W,aAAYC,YAAatY,EAAMS,GAAOwuB,IACtChB,EAAgBv0B,SAAS+G,EAAKzC,KAElCob,IAAI,EAAGpb,QAASA,IAClB,CAACiZ,EAAOgY,EAAYjvB,EAAMiuB,IAEvBvV,EAAqB3Y,YAAam+B,IACtC1D,EAAS,CACPl0B,KAAM,gBACN6oB,QAAS+O,KAEV,CAAC1D,IAEE2D,EAA0Bp+B,YAAaq+B,IAEzC5D,EADW,aAATzM,EACO,CACPznB,KAAM,oBACN6oB,QAAS,IAAK7B,EAAMc,eAAgBD,gBAAiBiQ,IAG9C,CACP93B,KAAM,oBACN6oB,QAAS,IAAK7B,EAAMiB,eAAgBD,gBAAiB8P,MAGxD,CAACrQ,EAAMT,EAAOkN,IAEX6D,EAAgCt+B,YAAaosB,IACjD,MAAMmS,EAAsC,GAC5CnS,EAAKoS,QAAS/9B,IACZ89B,EAAW99B,IAAO,IAIlBg6B,EADW,aAATzM,EACO,CACPznB,KAAM,oBACN6oB,QAAS,CACPhB,gBAAiBF,KACdqQ,IAIE,CACPh4B,KAAM,oBACN6oB,QAAS,CACPb,gBAAiBL,KACdqQ,MAIR,CAACvQ,EAAME,EAAiBuM,IAE3B,OAAKyD,EAKH,kBAAC,GAAD,CACElQ,KAAMA,EACN9V,QAASgmB,EACT3B,YAAarO,EACbC,kBAAmBA,EACnBqO,YAAatN,EACbuN,oBAAqB2B,EACrB1B,0BAA2B4B,EAC3B3B,eAAgBhkB,EAChBQ,WAAYtB,IAbP,kBAAC8B,GAAA,EAAD,S,OChBI5S,mBAhGuB,EACpC8oB,gBACAtC,QACAkN,WACA3G,iBACAtP,cAEA,MAAMia,EAAcz+B,YAAY,KAE5B6vB,IAAkBgB,IAAgB0C,qBAC/B1D,IAAkBgB,IAAgB2C,mBAErC/3B,WAAW,KACTg/B,EAAS,CAAEl0B,KAAM,WAvBG,KA4BtBspB,IAAkBgB,IAAgB4C,sBAC/B5D,IAAkBgB,IAAgB6C,qBAUvClP,IARqB,WAAf+I,EAAMS,KACR8F,EAAejD,IAAgB0C,qBAE/BO,EAAejD,IAAgB2C,oBAMlC,CACDjG,EAAMS,KAAMyM,EACZ5K,EAAerL,EAASsP,IAGpBsF,EAAqBp5B,YAAY,KACrCy6B,EAAS,CAAEl0B,KAAM,UACjButB,EAAejD,IAAgB0C,sBAC9B,CAACO,EAAgB2G,IAEdiE,EAAmB1+B,YAAasuB,IACpCmM,EAAS,CAAEl0B,KAAM,aAAc6oB,QAASd,IACxCwF,EAAejD,IAAgB2C,oBAC9B,CAACiH,EAAU3G,IAER6K,EAAyB3+B,YAAY,KACzCy6B,EAAS,CAAEl0B,KAAM,uBACjButB,EAAejD,IAAgB4C,uBAC9B,CAACgH,EAAU3G,IAER8K,EAAyB5+B,YAAY,KACzCy6B,EAAS,CAAEl0B,KAAM,uBACjButB,EAAejD,IAAgB6C,uBAC9B,CAAC+G,EAAU3G,IAEd,OAAQjE,GACN,KAAKgB,IAAgByC,QACnB,OACE,kBAAC,GAAD,CACEkF,eAAgBY,EAChBX,aAAciG,IAGpB,KAAK7N,IAAgB0C,oBACrB,KAAK1C,IAAgB2C,kBACnB,OACE,kBAAC,GAAD,CACEjG,MAAOA,EACPkN,SAAUA,EACVC,mBAAoBiE,EACpBhE,mBAAoBiE,EACpBpa,QAASia,IAGf,KAAK5N,IAAgB4C,qBACnB,OACE,kBAAC,GAAD,CACEzF,KAAK,WACLT,MAAOA,EACPkN,SAAUA,IAGhB,KAAK5J,IAAgB6C,qBACnB,OACE,kBAAC,GAAD,CACE1F,KAAK,WACLT,MAAOA,EACPkN,SAAUA,IAIhB,QACE,U,iBCnBS1zB,mBA9EmB,EAChC83B,UACAC,QACAjK,QACApuB,QACAwF,WACAC,eAEA,MAAM6yB,EAAe/+B,YAAaq8B,IAChCnwB,EAAS7B,OAAOgyB,EAAMpyB,cAAcxD,SACnC,CAACyF,IAEE5L,EAAY0L,aAChB,cACAC,GAAY,YAGR+yB,EAAaz8B,YAAQ,KACzB,GAAIs8B,EACF,OAAQp4B,GAASo4B,EAAQ//B,OAAS,GAAM,IACnC,GAAIggC,EAAO,CAChB,MAAMG,GAAwBH,EAAM7kC,IAAM6kC,EAAMz4B,MAAQy4B,EAAMx4B,MAAQ,GACtE,OAASG,EAAQq4B,EAAMz4B,KAAO44B,EAAwB,IAExD,OAAO,GACN,CAACx4B,EAAOo4B,EAASC,KAEbz4B,EAAKpM,EAAKqM,GAAQ/D,YAAQ,IAC3Bs8B,EACK,CAAC,EAAGA,EAAQ//B,OAAS,EAAG,GACtBggC,EACF,CAACA,EAAMz4B,IAAKy4B,EAAM7kC,IAAK6kC,EAAMx4B,MAAQ,GAGvC,CAAC,EAAG,EAAG,GACb,CAACw4B,EAAOD,IAEX,OACE,yBAAKv+B,UAAWA,GACbu0B,GACC,yBAAKv0B,UAAU,kBACb,0BAAMA,UAAU,SAASu0B,GACxBiK,GACC,0BAAMx+B,UAAU,SAASmG,IAI/B,yBAAKnG,UAAU,eACb,yBACEA,UAAU,oBAEVlF,MAAQ,UAAS4jC,OAEnB,2BACE34B,IAAKA,EACLpM,IAAKA,EACLwM,MAAOA,EACPH,KAAMA,EACNC,KAAK,QACL2F,SAAU6yB,IAEXF,GACC,yBAAKv+B,UAAU,kBACZu+B,EAAQxlB,IAAI,CAAC6lB,EAAQrpB,IACpB,yBACEvV,UAAW0L,aAAe,6BAA8B6J,IAAUpP,GAAS,UAC3ElG,QAAS,IAAM2L,EAAS2J,IAEvBqpB,S,6BCvCFn4B,mBA7B+B,EAC5ChN,OAAOolC,KACPC,aACAC,0BAGA,MAAMx0B,EAAMrD,YAAuB,MAE7B83B,EAAiBC,aAAkB10B,EAAKw0B,GAExCG,EAAa,aAAYJ,EAAWnhC,GACpCwhC,EAAatsB,YAASqsB,GAAYF,EAAgBlsB,iBAAessB,SACjE,sBAAEC,EAAF,qBAAyBr2B,GAAyBs2B,aAAsBH,EAAY,QAE1F,OACE,yBAAK50B,IAAKA,EAAKvK,UAAU,sBACrBq/B,GAAyBE,aAAgBT,EAAWnlB,MAAO,GAC5D0lB,GAAyBF,GACxB,kBAAChG,GAAA,EAAD,CACEx7B,GAAIuhC,EACJzlC,KAAMA,EACN8+B,cAAe4G,EACfn/B,UAAWgJ,OCPNvC,mBAnBuB,EAAGq4B,aAAYC,0BAEnD,MAAMx0B,EAAMrD,YAAuB,MAE7B83B,EAAiBC,aAAkB10B,EAAKw0B,GAExCp+B,EAAYkS,YAASisB,EAAWU,cAAiB,aAAYV,EAAWnhC,IAAOqhC,IAC/E,sBAAEK,EAAF,qBAAyBr2B,GAAyBs2B,aAAsB3+B,EAAW,QAEzF,OACE,yBAAK4J,IAAKA,EAAKvK,UAAU,sBACrBq/B,GAAyBE,aAAgBT,EAAWnlB,MAAO,GAC5D0lB,GACC,yBAAKpiC,IAAK0D,EAAWX,UAAWgJ,EAAsBqG,IAAI,Q,OC+FnD5I,mBA5FqB,EAClCg5B,UAAShmC,OAAMslC,sBAAqBW,YAAW/lB,QAAO3Z,YAAWC,UAAS+oB,WAAU2W,oBAGpF,MAAMp1B,EAAMrD,YAAuB,MAE7B04B,EAAkB,UAASH,EAAQ9hC,GACnCkiC,EAAmB,kBAAiBJ,EAAQ9hC,GAE5CqhC,EAAiBC,aAAkB10B,EAAKw0B,GAExCxrB,EAAeksB,EAAQK,UAAYL,EAAQK,UAAUC,aAAUz+B,EAC/D0+B,EAAiBntB,YAAY+sB,EAAF,WAA4BZ,EAAgBlsB,iBAAeC,SAEtFktB,EAAajB,IAAmBU,EAChCP,EAAatsB,YAAS4sB,EAAQS,YAAcN,GAAiBK,EAAYntB,iBAAessB,SACvF3G,EAAmB0H,EAAYC,GAAgB9d,aAAQlrB,QAAQ+nC,IAChEkB,EAAkB5H,GAAqBwH,GAEvC,kBACJK,EACAjB,sBAAuBkB,EACvBv3B,qBAAsBw3B,GACpBlB,aAAsBU,GAAkBK,EAAiB,QAG7D3+B,YAAU,KACHu+B,GACHG,KAED,CAACA,EAAcH,IAelB,MAAMQ,EAAgB/0B,aACpB,gBACA+zB,EAAQS,YAAc,WACtBL,EACA7/B,GAGIlF,EAAQwlC,GAAqB/sB,EAAgB,0BAAyBA,OAAoB,GAEhG,OACE,yBACEhJ,IAAKA,EACLvK,UAAWygC,EACX9mB,MAAOA,GAAU8lB,GAAWA,EAAQiB,MAEpC5lC,MAAOA,EACP6lC,kBAAiBlB,EAAQ9hC,GACzBsC,QA9BJ,WACMA,GACFA,EAAQ+oB,KA8BPuX,IAAwBF,GAEvB,yBAAKpjC,IAAK+iC,EAAgBhgC,UAAWwgC,IAEtCP,GAAcd,GACb,kBAAChG,GAAA,EAAD,CACEx7B,GAAIiiC,EACJrH,cAAe4G,EACf71B,MAAI,EACJ7P,KAAMA,EACNmnC,eAAa,EACbtH,OAAQ6G,IAGXR,GACC,kBAACv9B,EAAA,EAAD,CACEpC,UAAU,wBACVsC,MAAM,OACND,OAAK,EACLpC,QA7CR,SAA2B4B,GACzBA,EAAEC,kBACFD,EAAE4M,iBAEFkxB,EAAeF,KA2CT,uBAAGz/B,UAAU,mB,OC1BRyG,mBAlE0B,EACvCq4B,aACAC,sBACA9+B,cAEA,MAAMN,EAAOC,cAEb,IAAKk/B,IAAeA,EAAW+B,SAC7B,OAGF,MAAMC,EAAehC,EAAW+B,UAAY/B,EAAW+B,SAAS,GAEhE,OAAI/B,EAAWU,eAAiBsB,EAE5B,kBAAC9nB,GAAA,EAAD,CACEygB,QAAM,EACNz5B,UAAU,qBACV67B,UAAWiF,EACX7gC,QAAS,IAAM6gC,GAAgB7gC,EAAQ6gC,IAEvC,kBAAC1+B,EAAA,EAAD,CACEG,UAAWu8B,EAAWnlB,MACtBrX,MAAM,eAELw8B,EAAWoB,WACV,kBAAC,GAAD,CACEzmC,KAAMsnC,KACNjC,WAAYA,EACZC,oBAAqBA,IAGvB,kBAAC,GAAD,CACED,WAAYA,EACZC,oBAAqBA,KAI3B,yBAAK/+B,UAAU,uBACb,yBAAKA,UAAU,SAAS8+B,EAAWnlB,OACnC,yBAAK3Z,UAAU,YAAYL,EAAK,2BAA4Bm/B,EAAWlF,MAAO,QAMlF,kBAAC5gB,GAAA,EAAD,CACEygB,QAAM,EACNz5B,UAAU,qBACVC,QAAS,IAAMA,EAAQ6gC,IAEvB,kBAAC,GAAD,CACErB,QAASqB,EACTrnC,KAAMsnC,KACNpnB,MAAOmlB,EAAWnlB,MAClBolB,oBAAqBA,IAEvB,yBAAK/+B,UAAU,uBACb,yBAAKA,UAAU,SAAS8+B,EAAWnlB,OACnC,yBAAK3Z,UAAU,YAAYL,EAAK,2BAA4Bm/B,EAAWlF,MAAO,U,UCjDxF,MAAMoH,GAA0B,CAC9B,mBACA,gBACA,iBAmMav6B,mBAAKhI,YACjBC,IACQ,IACFY,YAAKZ,EAAOmR,SAASC,MACtB,CACE,kBACA,iBACA,sBACA,sCACA,wCACA,kCACA,oCACA,qBACA,uBACA,wBACA,uBAEJmxB,cAAeviC,EAAOmiC,SAASK,MAAMC,OACrCC,gBAAiB1iC,EAAOmiC,SAASQ,WAGrC,CAACjiC,EAAWC,IAA2BC,YAAKD,EAAS,CACnD,mBAAoB,kBAAmB,sBAtBvBZ,CAhM+C,EACjE+0B,iBACAyN,gBACAG,kBACAE,kBACA1xB,iBACA2xB,sBACAC,sCACAC,wCACAC,kCACAC,oCACAC,qBACAC,uBACAC,wBACAC,qBACAC,mBACAC,kBACAC,wBAGA,MAAMC,EAAqBj7B,YAAuB,OAC1Ck7B,QAASC,GAAiCC,aAAwB,CAAEC,QAASJ,KAC9EK,EAAaC,EAAWC,GAAcpgB,gBACtCmd,EAASkD,GAAcxhC,cAExBxB,EAAOC,cAEPgjC,EAAyBx7B,SAO3B9F,EAP0C,CAC5C,CAAE6E,MAAO,QAASouB,MAAO50B,EAAK,2BAA4BkjC,SAAU,6BACpE,CACE18B,MAAO,aACPouB,MAAO50B,EAAKmjC,IAAY,6BAA+B,+BACvDD,SAAU,sBAIdnhC,YAAU,KACRugC,KACC,CAACA,IAEJvgC,YAAU,KACJu/B,GAAiBA,EAAcziC,QACjC0jC,KAED,CAACjB,EAAeiB,IAEnB,MAAMa,EAA6BrjC,YAAasjC,IAC9ChC,GAAwB9C,QAAQ,CAAC+E,EAAGtlB,KAClCnjB,SAASC,KAAKC,UAAUkZ,OAAQ,mBAAkB+J,EAAKqlB,IAAarlB,KAGtEqkB,EAAiB,CAAEpyB,eAAgBozB,KAClC,CAAChB,IAEEkB,EAA8BxjC,YAAayjC,IAC/C3oC,SAAS4oC,gBAAgBtoC,MAAMuoC,YAAY,sBAA0BF,EAAF,MAEnEnB,EAAiB,CAAEV,gBAAiB6B,KACnC,CAACnB,IAEEsB,EAAwB5jC,YAAayG,IACzCw8B,EAAWx8B,GACXs8B,KACC,CAACA,IAEEc,EAActC,GAAiBA,EAAcloB,IAAKpb,MAC/CyjC,GAAmBA,EAAgBzjC,IAAOyjC,EAAgBzjC,GAAI6lC,gBAAgBpC,EAAgBzjC,IACpG6Z,OAAOpgB,SAEV,OACE,yBAAK4I,UAAU,kCACb,yBAAKA,UAAU,sBACb,wBAAIA,UAAU,wBAAwBL,EAAK,aAE3C,kBAAC,GAAD,CACE40B,MAAO50B,EAAK,YAEZ6+B,MAAO,CAAEz4B,IAAK,GAAIpM,IAAK,IACvBwM,MAAOm7B,EACP11B,SAAUs3B,IAGZ,kBAAClqB,GAAA,EAAD,CACEnW,KAAK,QACL5C,QAAS,IAAMuzB,EAAejD,IAAgBM,wBAE7ClxB,EAAK,oBAIV,yBAAKK,UAAU,iBACb,wBAAIA,UAAU,wBAAd,mBAGA,uBAAGA,UAAU,6BAAb,yCAEA,kBAAC,GAAD,CACEu+B,QAASyC,GACT76B,MAAOyJ,EACPhE,SAAUm3B,KAIbH,GACC,yBAAK5iC,UAAU,iBACb,wBAAIA,UAAU,wBAAwBL,EAAK,aAE3C,kBAAC8jC,GAAA,EAAD,CACE/sB,KAAK,yBACL6nB,QAASqE,EACTh3B,SAAWzF,GAAU67B,EAAiB,CAAET,oBAAqBp7B,IAC7Du9B,SAAUnC,KAKhB,yBAAKvhC,UAAU,iBACb,wBAAIA,UAAU,wBAAwBL,EAAK,sBAE3C,kBAACs9B,GAAA,EAAD,CACE1I,MAAO50B,EAAK,YACZu9B,QAASsE,EACTmC,QAAUC,GAAc5B,EAAiB,CAAER,oCAAqCoC,MAElF,kBAAC3G,GAAA,EAAD,CACE1I,MAAO50B,EAAK,4BACZu9B,QAASuE,EACTkC,QAAUC,GAAc5B,EAAiB,CAAEP,sCAAuCmC,MAEpF,kBAAC3G,GAAA,EAAD,CACE1I,MAAO50B,EAAK,0BACZu9B,QAASwE,EACTiC,QAAUC,GAAc5B,EAAiB,CAAEN,gCAAiCkC,MAE9E,kBAAC3G,GAAA,EAAD,CACE1I,MAAO50B,EAAK,kBACZu9B,QAASyE,EACTgC,QAAUC,GAAc5B,EAAiB,CAAEL,kCAAmCiC,OAIlF,yBAAK5jC,UAAU,iBACb,wBAAIA,UAAU,wBAAwBL,EAAK,kBAE3C,kBAACs9B,GAAA,EAAD,CACE1I,MAAO50B,EAAK,YACZu9B,QAAS0E,EACT+B,QAAUC,GAAc5B,EAAiB,CAAEJ,mBAAoBgC,MAEjE,kBAAC3G,GAAA,EAAD,CACE1I,MAAO50B,EAAK,eACZu9B,QAAS2E,EACT8B,QAAUC,GAAc5B,EAAiB,CAAEH,qBAAsB+B,OAIrE,yBAAK5jC,UAAU,iBACb,wBAAIA,UAAU,wBAAwBL,EAAK,qBAE3C,kBAACs9B,GAAA,EAAD,CACE1I,MAAO50B,EAAK,mBACZu9B,QAAS4E,EACT6B,QAAUC,GAAc5B,EAAiB,CAAEF,sBAAuB8B,MAEpE,kBAAC3G,GAAA,EAAD,CACE1I,MAAO50B,EAAK,wBACZu9B,QAAS6E,EACT4B,QAAUC,GAAc5B,EAAiB,CAAED,mBAAoB6B,MAGjE,yBAAK5jC,UAAU,OAAOuK,IAAK43B,GACxBoB,GAAeA,EAAYxqB,IAAK+lB,GAC/B,kBAAC,GAAD,CACE3+B,IAAK2+B,EAAWnhC,GAChBmhC,WAAYA,EACZC,oBAAqBsD,EACrBpiC,QAASqjC,MAId7D,GACC,kBAAC,KAAD,CACEt9B,OAAQqgC,EACRqB,YAAapE,EACbz4B,QAAS07B,SC/NrB,IAAIoB,GAEG,SAASC,GAAsBC,EAAS,IAAKC,EAA8BC,GAAa,GACxFJ,KACHA,GAAetpC,SAASsC,cAAc,SACtCgnC,GAAaK,aAAa,OAAQ,SAGpCL,GAAaK,aAAa,SAAUH,GAEhCE,EACFJ,GAAaM,gBAAgB,YAE7BN,GAAaK,aAAa,WAAY,YAIxCL,GAAaO,SAAW,KACxBP,GAAa39B,MAAQ,GACrB29B,GAAaO,SAAWJ,EAExBH,GAAaQ,Q,aCPR,SAASC,GAAQC,GACtB,MAAO,CACLC,SAASD,EAAME,UAAU,EAAG,GAAI,IAChCD,SAASD,EAAME,UAAU,EAAG,GAAI,IAChCD,SAASD,EAAME,UAAU,EAAG,GAAI,KAS7B,SAASC,GAAQH,GACtB,MAAMI,EAAKJ,EAAM,GAAGh2B,SAAS,IACvBq2B,EAAKL,EAAM,GAAGh2B,SAAS,IACvBs2B,EAAKN,EAAM,GAAGh2B,SAAS,IAC7B,OAAqB,GAAbo2B,EAAGpmC,OAAc,IAAMomC,EAAKA,IAAoB,GAAbC,EAAGrmC,OAAc,IAAMqmC,EAAKA,IAAoB,GAAbC,EAAGtmC,OAAc,IAAMsmC,EAAKA,GAcrG,SAASC,IAASC,EAAGC,EAAG3c,IAC7B0c,GAAK,IACLC,GAAK,IACL3c,GAAK,IAEL,IACI4c,EAAYC,EADZxrC,EAAMD,KAAKC,IAAIqrC,EAAGC,EAAG3c,GAAIviB,EAAMrM,KAAKqM,IAAIi/B,EAAGC,EAAG3c,GACvB8c,EAAYzrC,EAEnC+kB,EAAI/kB,EAAMoM,EAGd,GAFAo/B,EAAW,GAAPxrC,EAAW,EAAI+kB,EAAI/kB,EAEnBA,GAAOoM,EACTm/B,EAAI,MACC,CACL,OAAQvrC,GACN,KAAKqrC,EACHE,GAAKD,EAAI3c,GAAK5J,GAAKumB,EAAI3c,EAAI,EAAI,GAC/B,MACF,KAAK2c,EACHC,GAAK5c,EAAI0c,GAAKtmB,EAAI,EAClB,MACF,KAAK4J,EACH4c,GAAKF,EAAIC,GAAKvmB,EAAI,EAItBwmB,GAAK,EAGP,MAAO,CAACA,EAAGC,EAAGC,GAcT,SAASC,IAASH,EAAGC,EAAGC,IAC7B,IAAIJ,EAAYC,EAAY3c,EAExB3K,EAAIjkB,KAAK4K,MAAU,EAAJ4gC,GACfI,EAAQ,EAAJJ,EAAQvnB,EACZ4nB,EAAIH,GAAK,EAAID,GACbK,EAAIJ,GAAK,EAAIE,EAAIH,GACjBM,EAAIL,GAAK,GAAK,EAAIE,GAAKH,GAE3B,OAAQxnB,EAAI,GACV,KAAK,EACHqnB,EAAII,EACJH,EAAIQ,EACJnd,EAAIid,EACJ,MACF,KAAK,EACHP,EAAIQ,EACJP,EAAIG,EACJ9c,EAAIid,EACJ,MACF,KAAK,EACHP,EAAIO,EACJN,EAAIG,EACJ9c,EAAImd,EACJ,MACF,KAAK,EACHT,EAAIO,EACJN,EAAIO,EACJld,EAAI8c,EACJ,MACF,KAAK,EACHJ,EAAIS,EACJR,EAAIM,EACJjd,EAAI8c,EACJ,MACF,KAAK,EACHJ,EAAII,EACJH,EAAIM,EACJjd,EAAIkd,EAIR,MAAO,CACL9rC,KAAK2I,MAAU,IAAJ2iC,GACXtrC,KAAK2I,MAAU,IAAJ4iC,GACXvrC,KAAK2I,MAAU,IAAJimB,IAuDR,SAASod,GAAgBC,GAC9B,IAAKC,EAAKC,EAAY1/B,GAAS4+B,GAAQY,GAOvC,OALAE,EAAansC,KAAKqM,IAAI,EAAG8/B,EAAa,IAAO,IAAO,EAAIA,IACxD1/B,EAAQA,EAAQ,GACZzM,KAAKC,IAAI,EAAW,IAARwM,GACZzM,KAAKC,IAAI,EAAGD,KAAKqM,IAAI,EAAG,EAAY,IAARI,IAExB,QAAa,IAANy/B,MAA2B,IAAbC,OAA8B,IAAR1/B,U,8BClFtCM,mBAtFqB,EAClCq/B,YACAC,QACA5I,aACAl9B,cAEA,MAAM,KAAE+lC,EAAF,SAAQxrC,GAAasrC,EACrBlG,EAAkB,YAAWplC,EAASmD,GACtC2V,EAAe9Y,EAASwlC,eACxBA,EAAiBntB,YAAY+sB,EAAF,WAC3BqG,EAAWC,aACf1rC,EAASslC,WAAatlC,EAASslC,UAAUC,QACzC3oC,QAAQ4oC,IACR,IAEI,kBACJM,EADI,sBACejB,EADf,qBACsCr2B,GACxCs2B,aAAsBU,GAAkB1sB,EAAc,SACnD6yB,EAAmBC,GAAwBjlC,aAAS,IAEzDR,UAAW0lC,EADP,iBACkB7kC,GACpBC,YAA6Bm+B,GAAiBuG,GAC5CG,GAAyD,IAAnCn7B,YAAYg7B,IAChCr9B,aAAcC,EAAqBC,qBAAsBC,GAAsBC,YACpFi9B,IAAsBE,GAAcL,IAASO,SAC9CjlC,EACAglC,EACA,QAGIE,EAAct/B,cACpBs/B,EAAYv+B,QAAU89B,EAEtB,MAAMU,EAAe/mC,YAAY,KAC/B,WACE,MAAMgnC,QAAaC,aAAUN,SACvBO,KAAcC,IAAsBL,EAAYv+B,QAAUy+B,GAChEzmC,EAAQ+lC,IAHV,IAKC,CAACK,EAAWpmC,EAAS+lC,IAExBtkC,YAAU,KACJ2kC,GACFI,KAED,CAACJ,EAAWI,IAEf,MAAM/hB,EAAchlB,YAAY,KAC1B2mC,EACFI,IAEAL,EAAsBrkC,IAAeA,IAEtC,CAACskC,EAAWI,IAETzmC,EAAY0L,aAChB,gBACAyxB,GAAc,YAGhB,OACE,yBAAKn9B,UAAWA,EAAWC,QAASykB,GAClC,yBAAK1kB,UAAU,eACZsgC,GACC,4BACE/1B,IAAK07B,EACLjmC,UAAU,cAGbq/B,GACC,yBACEpiC,IAAK+iC,GAAkB1sB,EACvBtT,UAAY,cAAagJ,EACzBqG,IAAI,KAGPtG,GACC,yBAAK/I,UAAW0L,aAAe,oBAAqBzC,IAClD,kBAAClG,EAAA,EAAD,CAAiBC,SAAUxB,EAAkBvB,QAASykB,S,OCpElE,MAEMjB,GAAe9f,YAAU+f,GAAOA,IAAM,KAAO,GAsHpCjd,mBAAKhI,YACjBC,IACC,MAAM,MAAEqnC,GAAUrnC,EAAOmR,SAASC,OAC5B,WAAEg3B,EAAF,UAAcC,GAAcroC,EAAOmR,SAASm3B,OAAOjB,IAAU,IAC7D,iBAAEkB,GAAqBvoC,EAAOmR,SAEpC,MAAO,CACLi3B,aACAC,YACAE,mBACAlB,UAGJ,CAAC3mC,EAAWC,IAA2BC,YAAKD,EAAS,CACnD,iBAAkB,kBAAmB,qBAdrBZ,CApHyD,EAC3E+0B,iBACAsT,aACAC,YACAE,mBACAlB,QACAmB,iBACAC,kBACAC,uBAEA,MAAMC,EAAWngC,cACjBmgC,EAASp/B,QAAU89B,EAGnBrkC,YAAU,KACR+hB,GAAa,KACXyjB,OAED,CAACA,IAEJ,MAAMI,EAAmB5nC,YAAamC,IACpC,MAAM,MAAE0lC,GAAU1lC,EAAEmI,OAEhBu9B,GAASA,EAAM/oC,OAAS,GAC1B2oC,EAAgBI,EAAM,KAEvB,CAACJ,IAEEK,EAAwB9nC,YAAY,KACxCqkC,GAjCoB,aAiCmBuD,GAAkB,IACxD,CAACA,IAEEG,EAAiB/nC,YAAY,KACjC8zB,EAAejD,IAAgBO,6BAC9B,CAAC0C,IAEEkU,EAAuBhoC,YAAY,KACvC0nC,EAAiB,CACfrB,QACAe,gBAAYxlC,EACZqmC,qBAAiBrmC,EACjBylC,WAAW,EACXa,aAAwB,SAAV7B,EAAmB8B,IAA2BC,OAE7D,CAACV,EAAkBrB,IAEhBgC,EAAwBroC,YAAasmC,IACzCoB,EAAiB,CAAErB,MAAOsB,EAASp/B,QAAS6+B,WAAYd,IACxD,MAAMgC,EAAmBf,GAAoBA,EAAiBtL,KAAMmK,GAAcA,EAAUE,OAASA,GACjGgC,GAAoBA,EAAiBxtC,SAASslC,WF8C/CmI,eAA+BvhC,GAEpC,MACMwhC,EAAuC,CAAC,EAAG,EAAG,GACpD,IAAIC,EACAzxC,EACAe,EAEA+G,EADAmf,GAAK,EAELyqB,EAAgC,CAAC,EAAG,EAAG,GACvCxO,EAAQ,EAEZ,MAAMyO,EAAS7tC,SAASsC,cAAc,UAChCwrC,EAAUD,EAAOE,YAAcF,EAAOE,WAAW,MACvD,IAAKD,EACH,OAAOJ,EAGT,MAAMl6B,QAAcw6B,aAAa9hC,GACjCjP,EAASuW,EAAMy6B,eAAiBz6B,EAAMlQ,cAAgBkQ,EAAMvW,OAC5Df,EAAQsX,EAAM06B,cAAgB16B,EAAM26B,aAAe36B,EAAMtX,MACzD2xC,EAAO5wC,OAASA,EAChB4wC,EAAO3xC,MAAQA,EAEf4xC,EAAQM,UAAU56B,EAAO,EAAG,GAE5B,IACEm6B,EAAOG,EAAQO,aAAa,EAAG,EAAGnyC,EAAOe,GACzC,MAAOoK,GACP,OAAOqmC,EAMT,IAHA1pC,EAAS2pC,EAAKA,KAAK3pC,QAGXmf,GAAKmrB,IAAiBtqC,KAC1Bo7B,EACFwO,EAAI,IAAMD,EAAKA,KAAKxqB,GACpByqB,EAAI,IAAMD,EAAKA,KAAKxqB,EAAI,GACxByqB,EAAI,IAAMD,EAAKA,KAAKxqB,EAAI,GAO1B,OAJAyqB,EAAI,GAAK1uC,KAAK4K,MAAM8jC,EAAI,GAAKxO,GAC7BwO,EAAI,GAAK1uC,KAAK4K,MAAM8jC,EAAI,GAAKxO,GAC7BwO,EAAI,GAAK1uC,KAAK4K,MAAM8jC,EAAI,GAAKxO,GAEtBwO,EE3FHW,CAAgBf,EAAiBxtC,SAASslC,UAAUC,SACjDlH,KAAMv2B,IACL,MAAMslC,EAAelC,GAAgBpjC,GAC/BqjC,EAAY,IAAGhB,GAAQriC,GAC7B8kC,EAAiB,CAAErB,MAAOsB,EAASp/B,QAAS0/B,gBAAiBhC,EAAUiC,oBAG5E,CAACX,EAAkBG,IAEhB4B,EAA4BtpC,YAAamC,IAC7CulC,EAAiB,CAAErB,MAAOsB,EAASp/B,QAAS8+B,UAAWllC,EAAEmI,OAAOkzB,WAC/D,CAACkK,IAEEznC,EAAOC,cAEPqpC,EAAchC,GAAoBA,EAAiB,IAAMA,EAAiB,GAAGjB,OAASO,IAE5F,OACE,yBAAKvmC,UAAU,4DACb,yBAAKA,UAAU,sBACb,kBAACgZ,GAAA,EAAD,CACEnW,KAAK,aACL7C,UAAU,OACV2L,SAAUs9B,EACVhpC,QAASunC,GAER7nC,EAAK,gBAGR,kBAACqZ,GAAA,EAAD,CACEnW,KAAK,WACL7C,UAAU,OACVC,QAASwnC,GAER9nC,EAAK,aAGR,kBAACqZ,GAAA,EAAD,CAAUnW,KAAK,WAAW5C,QAASynC,GAChC/nC,EAAK,yBAGR,kBAACs9B,GAAA,EAAD,CACE1I,MAAO50B,EAAK,qBACZu9B,QAAS9lC,QAAQ2vC,GACjBn7B,SAAUo9B,KAIb/B,EACC,yBAAKjnC,UAAU,uBACZinC,EAAiBluB,IAAK+sB,GACrB,kBAAC,GAAD,CACEA,UAAWA,EACXC,MAAOA,EACP5I,WAAY2J,IAAehB,EAAUE,KACrC/lC,QAAS8nC,MAKf,kBAAC1uB,GAAA,EAAD,U,OC3GR,MAAM6vB,GAAcnE,GAAQR,GAAQ,WAC9B4E,GAAoB,CACxB,UAAW,UAAW,UAAW,UAAW,UAAW,UACvD,UAAW,UAAW,UAAW,UAAW,UAAW,WAiMzD,SAASC,GAAcC,EAA+BC,GACpD,MAAO,CACLC,cAAe,CACb7vC,KAAK2I,MAAOgnC,EAAI,IAAOC,EAAME,UAAU9yC,MAAQ,IAC/CgD,KAAK2I,OAAO,EAAIgnC,EAAI,KAAOC,EAAME,UAAU/xC,OAAS,KAEtDgyC,YAAa/vC,KAAK2I,MAAMgnC,EAAI,IAAMC,EAAMI,QAAQhzC,MAAQ,KAI5D,SAASizC,IACP,cAAEJ,EAAF,YAAiBE,GACjBH,GAEA,MAAO,CACLG,GAAeH,EAAMI,QAAQhzC,MAAQ,GACrC6yC,EAAc,IAAMD,EAAME,UAAU9yC,MAAQ,GAC5C,EAAI6yC,EAAc,IAAMD,EAAME,UAAU/xC,OAAS,IA8EtCgP,mBAAKhI,YACjBC,IACC,MAAM,MAAEqnC,GAAUrnC,EAAOmR,SAASC,OAC5B,gBAAE63B,GAAoBjpC,EAAOmR,SAASm3B,OAAOjB,IAAU,GAC7D,MAAO,CACL4B,kBACA5B,UAGJ,CAAC3mC,EAAWC,IAA2BC,YAAKD,EAAS,CAAC,qBATpCZ,CA7RyD,EAC3EsnC,QACA4B,kBACAP,uBAEA,MAAMC,EAAWngC,cACjBmgC,EAASp/B,QAAU89B,EAEnB,MAAM6D,EAAe1iC,YAAuB,MAEtC2iC,EAAiB3iC,YAAuB,MAExC4iC,EAAe5iC,YAAuB,MACtC6iC,EAAgB7iC,aAAO,IAEtBmiC,EAAKW,GAAU7oC,YAyKxB,SAAuBwmC,GACrB,OAAOA,GAAmBA,EAAgBz0B,WAAW,KACjD6xB,GAAQR,GAAQoD,EAAgB3pB,QAAQ,IAAK,MAC7CkrB,GA5K2Be,CAActC,IAEvCuC,EAAShjC,YAAOmiC,GACtB3nC,YAAU,KACRwoC,EAAOjiC,QAAUohC,GAChB,CAACA,IAEJ,MAAOx8B,EAAYs9B,EAAgBC,GAAoB9nB,gBAChD+nB,EAAUC,GAAenpC,YAAS,KAClCopC,EAAUC,GAAerpC,YAAS,IAEnCspC,EAAWvjC,cACXwjC,EAAcxjC,cAGpBxF,YAAU,KAER,MAAM8nC,EAAY,CAChBmB,WAAYd,EAAe5hC,QAAS0iC,cACjCrrC,YAAKuqC,EAAe5hC,QAASlP,wBAAyB,CAAC,MAAO,QAAS,YAEtE2wC,EAAU,CACdiB,WAAYb,EAAa7hC,QAAS0iC,cAC/BrrC,YAAKwqC,EAAa7hC,QAASlP,wBAAyB,CAAC,WAK1D,SAAS6xC,EAAgB/oC,GACvB,MAAM0nC,EAAgB,CACpB7vC,KAAKqM,IAAIrM,KAAKC,IAAI,EAAGkI,EAAE8M,MAAS66B,EAAUmB,YAAanB,EAAU9yC,MAAQ,GACzEgD,KAAKqM,IAAIrM,KAAKC,IAAI,EAAGkI,EAAE+M,MAAS46B,EAAU/wC,IAAMmxC,EAAa3hC,QAASpK,WAAY2rC,EAAU/xC,OAAS,KAGjG,YAAEgyC,GAAgBL,GAAcc,EAAOjiC,QAASwiC,EAASxiC,SAE/D+hC,EAAOL,GAAc,CAAEJ,gBAAeE,eAAegB,EAASxiC,UAC9DkiC,IAWF,SAASU,EAAchpC,GACrB,MAAM,cAAE0nC,GAAkBH,GAAcc,EAAOjiC,QAASwiC,EAASxiC,SAC3DwhC,EAAc/vC,KAAKqM,IAAIrM,KAAKC,IAAI,EAAGkI,EAAE8M,MAAS+6B,EAAQiB,YAAajB,EAAQhzC,MAAQ,GAEzFszC,EAAOL,GAAc,CAAEJ,gBAAeE,eAAegB,EAASxiC,UAC9DkiC,IA3BFM,EAASxiC,QAAU,CAAEuhC,YAAWE,WAchC9zB,YAAci0B,EAAe5hC,QAAU,CACrC6iC,UAAWF,EACXG,OAAQH,EACRI,UAAWZ,EACXnqC,QAASmqC,EACTa,YAAY,IAWdr1B,YAAck0B,EAAa7hC,QAAU,CACnC6iC,UAAWD,EACXE,OAAQF,EACRG,UAAWZ,EACXnqC,QAASmqC,EACTa,YAAY,KAEb,CAACd,EAAgBC,IAEpB,MAAM,cAAEb,EAAgB,CAAC,EAAG,GAAtB,YAA0BE,EAAc,GAAMgB,EAASxiC,QAAUmhC,GAAcC,EAAKoB,EAASxiC,SAAW,GACxGijC,EAAMvG,GAAQU,GAAQgE,IACtBzD,EAAMyD,EAAI,GACV8B,EAASxG,GAAQU,GAAQ,CAACO,EAAK,EAAG,KAGxClkC,YAAU,KACR,MAAM0mC,EAAM/C,GAAQgE,GACd/mC,EAAS,IAAGqiC,GAAQyD,GAK1B,GAHAkC,EAAYlC,EAAIt9B,KAAK,OACrB0/B,EAAYloC,IAEPynC,EAAc9hC,QAAS,CAC1B,MAAM2/B,EAAelC,GAAgB0C,GACrChB,EAAiB,CACfrB,MAAOsB,EAASp/B,QAChB6+B,gBAAYxlC,EACZqmC,gBAAiBrlC,EACjBslC,iBAGJmC,EAAc9hC,SAAU,GACvB,CAACohC,EAAKjC,IAGT1lC,YAAU,MAyGZ,SACE2mC,EACAzC,EACA8E,EACAD,GAEA,IAAIW,EACAlG,EACAmG,EAECX,EAAYziC,SAAYwiC,EAASxiC,SAWpCmjC,EAAIX,EAASxiC,QAAQuhC,UAAU9yC,MAC/BwuC,EAAIuF,EAASxiC,QAAQuhC,UAAU/xC,OAC/B4zC,EAAMX,EAAYziC,UAXlBmjC,EAAI/C,EAAOM,YACXzD,EAAImD,EAAOvqC,aACXutC,EAAMhD,EAAOE,WAAW,MAExBF,EAAO3xC,MAAQ00C,EACf/C,EAAO5wC,OAASytC,EAEhBwF,EAAYziC,QAAUojC,GAOxB,MAAMC,EAAUD,EAAKE,gBAAgBH,EAAGlG,GAClCsG,EAASF,EAAQnD,KACjBsD,EAAMpG,GAAQ,CAACO,EAAK,EAAG,IAE7B,IAAIrwB,EAAQ,EAEZ,IAAK,IAAInI,EAAI,EAAGA,EAAI83B,EAAG93B,IAAK,CAC1B,MAAMs+B,EAAO,EAAIt+B,GAAK83B,EAAI,GACpByG,EAAK,CAAC,IAAMD,EAAM,IAAMA,EAAM,IAAMA,GACpCE,EAAK,CAACH,EAAI,GAAKC,EAAMD,EAAI,GAAKC,EAAMD,EAAI,GAAKC,GACnD,IAAK,IAAIv+B,EAAI,EAAGA,EAAIi+B,EAAGj+B,IAAK,CAC1B,MAAM0+B,EAAO1+B,GAAKi+B,EAAI,GACtBI,EAAOj2B,KAAWo2B,EAAG,IAAMC,EAAG,GAAKD,EAAG,IAAME,EAC5CL,EAAOj2B,KAAWo2B,EAAG,IAAMC,EAAG,GAAKD,EAAG,IAAME,EAC5CL,EAAOj2B,KAAWo2B,EAAG,IAAMC,EAAG,GAAKD,EAAG,IAAME,EAC5CL,EAAOj2B,KAAW,KAItB81B,EAAKS,aAAaR,EAAS,EAAG,GArJ5BS,CAAUlC,EAAe5hC,QAASlN,WAAiC6qC,EAAK8E,EAAaD,IACpF,CAAC7E,IAGJlkC,YAAU,MAoJZ,SAAiB2mC,GACf,MAAM+C,EAAI/C,EAAOM,YAEjBN,EAAO3xC,MAAQ00C,EACf/C,EAAO5wC,OAFG,EAGV,MAAM4zC,EAAMhD,EAAOE,WAAW,MAExB+C,EAAUD,EAAIE,gBAAgBH,EAL1B,GAMJI,EAASF,EAAQnD,KAEvB,IAAI5yB,EAAQ,EAEZ,IAAK,IAAIpI,EAAI,EAAGA,EAAIi+B,EAAGj+B,IAAK,CAC1B,MACMi7B,EAAM/C,GAAQ,CADRl4B,GAAKi+B,EAAI,GACK,EAAG,IAE7BI,EAAOj2B,KAAW6yB,EAAI,GACtBoD,EAAOj2B,KAAW6yB,EAAI,GACtBoD,EAAOj2B,KAAW6yB,EAAI,GAEtBoD,EAAOj2B,KAAW,IAGpB81B,EAAIS,aAAaR,EAAS,EAAG,GA1K3BU,CAAQlC,EAAa7hC,QAASlN,aAC7B,IAEH,MAAMkxC,EAAkBvsC,YAAamC,IACnC,MAAMqqC,EAAWrqC,EAAE8H,cAAcxD,MAAM6X,QAAQ,WAAY,IAAI4N,MAAM,EAAG,IAExE,GAAIsgB,EAASpmB,MAAM,mCAAoC,CACrD,MAAMsiB,EAAM8D,EAAS/jB,MAAM,KAAKpP,IAAKozB,GAAYpiC,OAAOoiC,EAAQtX,SAChEmV,EAAOjF,GAAQqD,IAGjBvmC,EAAE8H,cAAcxD,MAAQ+lC,GACvB,IAEGE,EAAkB1sC,YAAamC,IACnC,MAAMwqC,EAAWxqC,EAAE8H,cAAcxD,MAAM6X,QAAQ,gBAAiB,IAAI4N,MAAM,EAAG,GAEzEygB,EAASvmB,MAAM,uBACjBkkB,EAAOjF,GAAQR,GAAQ8H,EAASruB,QAAQ,IAAK,OAG/Cnc,EAAE8H,cAAcxD,MAAQkmC,GACvB,IAEGC,EAA6B5sC,YAAamC,IAC9CmoC,EAAOjF,GAAQR,GAAQ1iC,EAAE8H,cAAc4iC,QAAQjqC,MAAO0b,QAAQ,IAAK,QAClE,IAEGhe,EAAY0L,aAChB,gEACAmB,GAAc,eAGhB,OACE,yBAAKtC,IAAKq/B,EAAc5pC,UAAWA,GACjC,yBAAKA,UAAU,sBACb,yBAAKuK,IAAKs/B,EAAgB7pC,UAAU,gBAClC,iCACA,yBACEA,UAAU,SAEVlF,MAAQ,wBAAuByuC,EAAc,SAASA,EAAc,6BAA6B2B,QAGrG,yBAAK3gC,IAAKu/B,EAAc9pC,UAAU,cAChC,iCACA,yBACEA,UAAU,SAEVlF,MAAQ,yBAAwB2uC,4BAAsC0B,QAG1E,yBAAKnrC,UAAU,SACb,kBAACuY,GAAA,EAAD,CAAWpS,MAAOokC,EAAUhW,MAAM,MAAM3oB,SAAUwgC,IAClD,kBAAC7zB,GAAA,EAAD,CAAWpS,MAAOkkC,EAAU9V,MAAM,MAAM3oB,SAAUqgC,MAGtD,yBAAKjsC,UAAU,qBACZmpC,GAAkBpwB,IAAKzW,GACtB,yBACEtC,UAAWsC,IAAW,IAAG4oC,EAAQ,cAAW5pC,EAC5CkrC,aAAYlqC,EAEZxH,MAAQ,qBAAoBwH,KAC5BrC,QAASqsC,UCtFN7lC,mBAAKhI,YAAYC,IACvB,CACL+tC,6BAA8Br1C,QAAQsH,EAAOmR,SAASC,MAAM28B,8BAC5DC,8BAA+Bt1C,QAAQsH,EAAOmR,SAASC,MAAM48B,+BAC7DC,sBAAuBv1C,QAAQsH,EAAOmR,SAASC,MAAM68B,uBACrDC,uBAAwBx1C,QAAQsH,EAAOmR,SAASC,MAAM88B,wBACtDC,0BAA2Bz1C,QAAQsH,EAAOmR,SAASC,MAAM+8B,2BACzDC,2BAA4B11C,QAAQsH,EAAOmR,SAASC,MAAMg9B,4BAC1DC,8BAA+B31C,QAAQsH,EAAOmR,SAASC,MAAMi9B,iCAGjE,CAAC3tC,EAAWC,IAA2BC,YAAKD,EAAS,CACnD,2BACA,kCACA,+BAdkBZ,CAlH0C,EAC5DguC,+BACAC,gCACAC,wBACAC,yBACAC,4BACAC,6BACAC,gCACAC,2BACAC,kCACAC,iCAEAxrC,YAAU,KACRsrC,KACC,CAACA,IAEJ,MAAMG,EAAuBztC,YAAY,CACvCmC,EACAurC,EACAC,KAEA,MAAMC,EAA+B,YAAbF,GACnBX,IACc,UAAbW,EAAuBT,EAAwBE,GAC/CU,EAAyC,YAAbH,EAC9BV,EACc,UAAbU,EAAuBR,EAAyBE,EAErDI,EAA2B,CACzBE,cACgB,WAAZC,GAAwB,CAAEjsB,UAAWvf,EAAEmI,OAAOkzB,QAASsQ,mBAAoBD,MAC/D,iBAAZF,GAA8B,CAAEG,mBAAoB3rC,EAAEmI,OAAOkzB,QAAS9b,SAAUksB,MAErF,CACDR,EAA4BD,EAC5BD,EAAwBD,EACxBD,EAA+BD,EAC/BS,IAGIO,EAAkC/tC,YAAamC,IACnDorC,EAAgC,CAC9B7rB,UAAWvf,EAAEmI,OAAOkzB,WAErB,CAAC+P,IAEEttC,EAAOC,cAEb,OACE,yBAAKI,UAAU,kCACb,yBAAKA,UAAU,iBACb,wBAAIA,UAAU,wBAAwBL,EAAK,6BAE3C,kBAACs9B,GAAA,EAAD,CACE1I,MAAO50B,EAAK,gCACZkjC,SAAUljC,EAAK8sC,EAA+B,uBAAyB,yBACvEvP,QAASuP,EACT7gC,SAAW/J,IAAQsrC,EAAqBtrC,EAAG,UAAW,aAExD,kBAACo7B,GAAA,EAAD,CACE1I,MAAO50B,EAAK,kBACZkjC,SAAUljC,EAAK+sC,EAAgC,iBAAmB,mBAClExP,QAASwP,EACT9gC,SAAW/J,IAAQsrC,EAAqBtrC,EAAG,UAAW,oBAI1D,yBAAK7B,UAAU,iBACb,wBAAIA,UAAU,wBAAwBL,EAAK,iBAE3C,kBAACs9B,GAAA,EAAD,CACE1I,MAAO50B,EAAK,0BACZkjC,SAAUljC,EAAKgtC,EAAwB,uBAAyB,yBAChEzP,QAASyP,EACT/gC,SAAW/J,IAAQsrC,EAAqBtrC,EAAG,QAAS,aAEtD,kBAACo7B,GAAA,EAAD,CACE1I,MAAO50B,EAAK,kBACZkjC,SAAUljC,EAAKitC,EAAyB,iBAAmB,mBAC3D1P,QAAS0P,EACThhC,SAAW/J,IAAQsrC,EAAqBtrC,EAAG,QAAS,oBAIxD,yBAAK7B,UAAU,iBACb,wBAAIA,UAAU,wBAAwBL,EAAK,mBAE3C,kBAACs9B,GAAA,EAAD,CACE1I,MAAO50B,EAAK,4BACZkjC,SAAUljC,EAAKktC,EAA4B,uBAAyB,yBACpE3P,QAAS2P,EACTjhC,SAAW/J,IAAQsrC,EAAqBtrC,EAAG,YAAa,aAE1D,kBAACo7B,GAAA,EAAD,CACE1I,MAAO50B,EAAK,kBACZkjC,SAAUljC,EAAKmtC,EAA6B,iBAAmB,mBAC/D5P,QAAS4P,EACTlhC,SAAW/J,IAAQsrC,EAAqBtrC,EAAG,YAAa,oBAI5D,yBAAK7B,UAAU,iBACb,wBAAIA,UAAU,wBAAwBL,EAAK,eAE3C,kBAACs9B,GAAA,EAAD,CACE1I,MAAO50B,EAAK,iBACZu9B,QAAS6P,EACTnhC,SAAU6hC,SCyCLhnC,mBAAKhI,YACjBC,IACC,MACEmR,UACEC,OAAO,YAAE49B,GADD,QAERC,GAHE,QAKJC,EALI,eAMJC,GACEnvC,EAEJ,MAAO,CACLgvC,cACAI,aAAcF,EAAQG,WACtBC,cAAeH,EAAervC,OAC9ByvC,6BAA8BN,EAAQja,aAAeia,EAAQja,YAAYwa,WACzEC,0BAA2BR,EAAQS,UAAYT,EAAQS,SAASF,WAChEG,8BAA+BV,EAAQW,cAAgBX,EAAQW,aAAaJ,WAC5EK,4BAA6BZ,EAAQa,UAAYb,EAAQa,SAASN,WAClEO,4BAA6Bd,EAAQe,YAAcf,EAAQe,WAAWR,aAG1E,CAAC9uC,EAAWC,IAA2BC,YAAKD,EAAS,CACnD,sBAAuB,qBAAsB,wBAvB7BZ,CAnJ+C,EACjE+0B,iBACAka,cACAI,eACAE,gBACAC,+BACAE,4BACAE,gCACAE,8BACAE,8BACAE,sBACAC,sBACAC,yBAEAntC,YAAU,KACRktC,IACAC,IACAF,KACC,CAACC,EAAqBC,EAAoBF,IAE7C,MAAMhvC,EAAOC,cAEb,SAASkvC,EAAmBZ,GAC1B,OAAQA,GACN,IAAK,YACH,OAAOvuC,EAAK,gBAEd,IAAK,WACH,OAAOA,EAAK,eAEd,IAAK,SACH,OAAOA,EAAK,cAMlB,OACE,yBAAKK,UAAU,kCACb,yBAAKA,UAAU,sBACb,kBAACgZ,GAAA,EAAD,CACEnW,KAAK,cACL42B,QAAM,EACNx5B,QAAS,IAAMuzB,EAAejD,IAAgBwB,sBAE9C,yBAAK/xB,UAAU,uBACb,0BAAMA,UAAU,SAASL,EAAK,iBAC7BmuC,EAAe,GACd,0BAAM9tC,UAAU,WAAWM,IAAI,QAC5BX,EAAK,QAASmuC,MAKvB,kBAAC90B,GAAA,EAAD,CACEnW,KAAK,OACL42B,QAAM,EACNx5B,QAAS,IAAMuzB,EACbka,EAAcnd,IAAgB0B,aAAe1B,IAAgByB,gBAG/D,yBAAKhyB,UAAU,uBACb,0BAAMA,UAAU,SAASL,EAAK,wBAC9B,0BAAMK,UAAU,WAAWM,IAAI,QAC5BX,EAAK+tC,EAAc,aAAe,kBAIzC,kBAAC10B,GAAA,EAAD,CACEnW,KAAK,kBACL42B,QAAM,EACNx5B,QAAS,IAAMuzB,EAAejD,IAAgBuB,wBAE9C,yBAAK9xB,UAAU,uBACb,0BAAMA,UAAU,SAASL,EAAK,kBAC7BquC,EAAgB,GACf,0BAAMhuC,UAAU,WAAWM,IAAI,QACV,IAAlB0tC,EAAsB,YAAiBA,EAAF,gBAOhD,yBAAKhuC,UAAU,iBACb,wBAAIA,UAAU,6BAA6BL,EAAK,iBAEhD,kBAACqZ,GAAA,EAAD,CACEygB,QAAM,EACNx5B,QAAS,IAAMuzB,EAAejD,IAAgBQ,qBAE9C,yBAAK/wB,UAAU,uBACb,0BAAMA,UAAU,SAASL,EAAK,sBAC9B,0BAAMK,UAAU,WAAWM,IAAI,QAC5BwuC,EAAmBb,MAI1B,kBAACj1B,GAAA,EAAD,CACEygB,QAAM,EACNx5B,QAAS,IAAMuzB,EAAejD,IAAgBS,kBAE9C,yBAAKhxB,UAAU,uBACb,0BAAMA,UAAU,SAASL,EAAK,kBAC9B,0BAAMK,UAAU,WAAWM,IAAI,QAC5BwuC,EAAmBX,MAI1B,kBAACn1B,GAAA,EAAD,CACEygB,QAAM,EACNx5B,QAAS,IAAMuzB,EAAejD,IAAgBU,sBAE9C,yBAAKjxB,UAAU,uBACb,0BAAMA,UAAU,SAASL,EAAK,6BAC9B,0BAAMK,UAAU,WAAWM,IAAI,QAC5BwuC,EAAmBT,MAI1B,kBAACr1B,GAAA,EAAD,CACEygB,QAAM,EACNx5B,QAAS,IAAMuzB,EAAejD,IAAgBW,oBAE9C,yBAAKlxB,UAAU,uBACb,0BAAMA,UAAU,SAASL,EAAK,yBAC9B,0BAAMK,UAAU,WAAWM,IAAI,QAC5BwuC,EAAmBP,MAI1B,kBAACv1B,GAAA,EAAD,CACEygB,QAAM,EACNx5B,QAAS,IAAMuzB,EAAejD,IAAgBY,oBAE9C,yBAAKnxB,UAAU,uBACb,0BAAMA,UAAU,SAASL,EAAK,gBAC9B,0BAAMK,UAAU,WAAWM,IAAI,QAC5BwuC,EAAmBL,W,SCxFnBhoC,mBAAKhI,YACjBC,IACQ,CACLqwC,UAAWrwC,EAAOmR,SAASC,MAAMi/B,UACjCC,SAAUtwC,EAAOmR,SAASC,MAAMk/B,WAGpC,CAAC5vC,EAAWC,IAA2BC,YAAKD,EAAS,CACnD,gBAAiB,qBARDZ,CA1DqC,EACvDswC,YACAC,WACAC,gBACAjN,uBAEA,MAAOkN,EAAkBC,GAAuBhuC,YAAiB6tC,IAC1D3lB,EAAW+lB,EAAeC,GAAmB/sB,eAGpD5gB,YAAU,KACRutC,KACC,CAACA,IAEJ,MAAMxQ,EAAe/+B,YAAa4vC,IAChCH,EAAoBG,GACpBF,IAEAG,aAAYD,EAAU,KACpBD,IACArN,EAAiB,CAAEgN,SAAUM,OAE9B,CAACF,EAAeC,EAAiBrN,IAE9BzD,EAAUt8B,YAAQ,IACf8sC,EAoBX,SAAsBA,GACpB,MAAMS,GAAmBt3C,OAAOu3C,UAAUT,UAAY,MAAMU,cACtDC,EAAgBH,EAAgBI,OAAO,EAAG,GAEhD,OAAOb,EAAUh2B,IAAI,EAAGu2B,WAAUO,aAAYn5B,WAAzB,CACnBvQ,MAAOmpC,EACP/a,MAAOsb,EACPhN,SAAUnsB,KACR0R,KAAMC,IACDmnB,GAAoBnnB,EAAEliB,QAAUqpC,GAAmBnnB,EAAEliB,QAAUwpC,EAAsB,GAAJ,GA7BrEG,CAAaf,QAAaztC,EAC5C,CAACytC,IAEJ,OACE,yBAAK/uC,UAAU,kEACZu+B,EACC,kBAACkF,GAAA,EAAD,CACE/sB,KAAK,yBACL6nB,QAASA,EACTmF,SAAUwL,EACVa,cAAe1mB,EAAY6lB,OAAmB5tC,EAC9CsK,SAAU6yB,IAGZ,kBAACplB,GAAA,EAAD,UCzDD,SAAS22B,GAAcC,GAC5B,OAAQA,GACN,KAAK1f,IAAgBQ,mBACrB,KAAKR,IAAgBa,kCACrB,KAAKb,IAAgBkB,iCACnB,MAAO,cACT,KAAKlB,IAAgBS,gBACrB,KAAKT,IAAgBc,+BACrB,KAAKd,IAAgBmB,8BACnB,MAAO,WACT,KAAKnB,IAAgBU,oBACrB,KAAKV,IAAgBe,mCACrB,KAAKf,IAAgBoB,kCACnB,MAAO,eACT,KAAKpB,IAAgBW,kBACrB,KAAKX,IAAgBgB,iCACrB,KAAKhB,IAAgBqB,gCACnB,MAAO,WACT,KAAKrB,IAAgBY,kBACrB,KAAKZ,IAAgBiB,iCACrB,KAAKjB,IAAgBsB,gCACnB,MAAO,cCiLEprB,mBAAKhI,YAClB,CAACC,GAAUuxC,aACT,IAAIC,EAEJ,MACEt5B,OAASC,KAAMC,GACfjH,UAAU,QAAE89B,IACVjvC,EAEJ,OAAQuxC,GACN,KAAK1f,IAAgBQ,mBACnBmf,EAAkBvC,EAAQja,YAC1B,MAEF,KAAKnD,IAAgBS,gBACnBkf,EAAkBvC,EAAQS,SAC1B,MAEF,KAAK7d,IAAgBU,oBACnBif,EAAkBvC,EAAQW,aAC1B,MAEF,KAAK/d,IAAgBW,kBACnBgf,EAAkBvC,EAAQa,SAC1B,MAEF,KAAKje,IAAgBY,kBACnB+e,EAAkBvC,EAAQe,WAI9B,OAAKwB,EAIE,IACFA,EACHp5B,aALO,IAQX,CAAC1X,EAAWC,IAA2BC,YAAKD,EAAS,CAAC,yBAxCpCZ,CA5KyD,EAC3EwxC,SACAzc,iBACA0a,aACAiC,eACAC,eACAC,eACAC,eACAx5B,YACAy5B,2BAEA,MAAM5wC,EAAOC,cAEP4wC,EAAoBvuC,YAAQ,KAChC,OAAQguC,GACN,KAAK1f,IAAgBU,oBACrB,KAAKV,IAAgBY,kBACnB,MAAO,CACL,CAAEhrB,MAAO,YAAaouB,MAAO50B,EAAK,iBAClC,CAAEwG,MAAO,WAAYouB,MAAO50B,EAAK,iBAGrC,QACE,MAAO,CACL,CAAEwG,MAAO,YAAaouB,MAAO50B,EAAK,iBAClC,CAAEwG,MAAO,WAAYouB,MAAO50B,EAAK,gBACjC,CAAEwG,MAAO,SAAUouB,MAAO50B,EAAK,iBAGpC,CAACA,EAAMswC,IAEJQ,EAAiB,CACrBC,iBAAiC,WAAfxC,EAClByC,kBAAkC,cAAfzC,GAGf0C,EAAaZ,GAAcC,GAE3BY,EAAa5uC,YAAQ,KACzB,OAAQguC,GACN,KAAK1f,IAAgBQ,mBACnB,OAAOpxB,EAAK,qBACd,KAAK4wB,IAAgBS,gBACnB,OAAOrxB,EAAK,iBACd,KAAK4wB,IAAgBU,oBACnB,OAAOtxB,EAAK,4BACd,KAAK4wB,IAAgBW,kBACnB,OAAOvxB,EAAK,wBACd,KAAK4wB,IAAgBY,kBACnB,OAAOxxB,EAAK,eACd,QACE,SAEH,CAACA,EAAMswC,IAEJa,EAAkB7uC,YAAQ,KAC9B,OAAQguC,GACN,KAAK1f,IAAgBS,gBACnB,OAAOrxB,EAAK,cACd,QACE,SAEH,CAACA,EAAMswC,IAEJc,EAAwB,MAC5B,OAAQd,GACN,KAAK1f,IAAgBQ,mBACnB,OAAOR,IAAgBa,kCACzB,KAAKb,IAAgBS,gBACnB,OAAOT,IAAgBc,+BACzB,KAAKd,IAAgBU,oBACnB,OAAOV,IAAgBe,mCACzB,KAAKf,IAAgBW,kBACnB,OAAOX,IAAgBgB,iCACzB,QACE,OAAOhB,IAAgBiB,mCAXC,GAexBwf,EAAuB,MAC3B,OAAQf,GACN,KAAK1f,IAAgBQ,mBACnB,OAAOR,IAAgBkB,iCACzB,KAAKlB,IAAgBS,gBACnB,OAAOT,IAAgBmB,8BACzB,KAAKnB,IAAgBU,oBACnB,OAAOV,IAAgBoB,kCACzB,KAAKpB,IAAgBW,kBACnB,OAAOX,IAAgBqB,gCACzB,QACE,OAAOrB,IAAgBsB,kCAXA,GAevBof,EAAehvC,YAAQ,IACtBkuC,GAAiBC,GAAiBt5B,EAIhCs5B,EAAac,OAAO,CAACC,EAAQxyC,IAC3BwyC,GAAUr6B,EAAUnY,GAAUmY,EAAUnY,GAAQyyC,aAAgB,GACtEjB,EAAa3xC,QALP,EAMR,CAAC4xC,EAAcD,EAAcr5B,IAE1Bu6B,EAAapvC,YAAQ,IACpBouC,GAAiBC,GAAiBx5B,EAIhCw5B,EAAaY,OAAO,CAACC,EAAQxyC,IAC3BwyC,GAAUr6B,EAAUnY,GAAUmY,EAAUnY,GAAQyyC,aAAgB,GACtEf,EAAa7xC,QALP,EAMR,CAAC8xC,EAAcD,EAAcv5B,IAE1Bw6B,EAAyB5xC,YAAayG,IAC1CoqC,EAAqB,CACnBK,aACA1C,WAAY/nC,KAEb,CAACyqC,EAAYL,IAEhB,OACE,yBAAKvwC,UAAU,kCACb,yBAAKA,UAAU,iBACb,wBAAIA,UAAU,wBAAwB6wC,GAEtC,kBAACpN,GAAA,EAAD,CACE/sB,KAAO,cAAak6B,EACpBrS,QAASiS,EACT5kC,SAAU0lC,EACV5N,SAAUwK,IAGX4C,GACC,uBAAG9wC,UAAU,oCAAoC8wC,IAIrD,yBAAK9wC,UAAU,iBACb,wBAAIA,UAAU,6BAA6BL,EAAK,sBAE/C8wC,EAAeE,mBACd,kBAAC33B,GAAA,EAAD,CACEygB,QAAM,EACN52B,KAAK,WACL5C,QAAS,KAAQuzB,EAAeud,KAEhC,yBAAK/wC,UAAU,iCACZixC,EAAe,GAAK,0BAAMjxC,UAAU,QAAhB,IAAyBixC,GAC9C,0BAAMjxC,UAAU,SAASL,EAAK,oBAC9B,0BAAMK,UAAU,YAAYL,EAAK,wBAItC8wC,EAAeC,kBACd,kBAAC13B,GAAA,EAAD,CACEygB,QAAM,EACN52B,KAAK,cACL5C,QAAS,KAAQuzB,EAAewd,KAEhC,yBAAKhxC,UAAU,iCACZqxC,EAAa,GAAK,0BAAMrxC,UAAU,QAAhB,IAA+BqxC,GAClD,0BAAMrxC,UAAU,SAASL,EAAK,mBAC9B,0BAAMK,UAAU,YAAYL,EAAK,6BCzD/C,SAAS4xC,GAAYC,GACnB,MAAO,CAACA,EAAQC,OAAQD,EAAQE,SAASl6B,OAAOpgB,SAAS0T,KAAK,MAGhE,SAAS6mC,GAAqBH,GAC5B,MAAQ,GAAEA,EAAQI,cAAcJ,EAAQI,YAAc,KAAO,MAAMJ,EAAQK,YAAYL,EAAQM,gBAGlFrrC,mBAAKhI,YACjBC,IAAD,CAA2BmvC,eAAgBnvC,EAAOmvC,iBAClD,CAACzuC,EAAWC,IAA2BC,YAAKD,EAAS,CACnD,qBAAsB,yBAA0B,+BAHhCZ,CAtHkD,EACpEovC,iBACAgB,qBACAkD,yBACAC,iCAEA,MAAOC,EAAiCC,EAA+BC,GAAkC7vB,eACzG5gB,YAAU,KACRmtC,KACC,CAACA,IAEJ,MAAMuD,EAA8B1yC,YAAa2yC,IAC/CN,EAAuB,CAAEM,UACxB,CAACN,IAEEO,EAA6B5yC,YAAY,KAC7CyyC,IACAH,KACC,CAACG,EAAgCH,IAE9BO,EAAiBtwC,YAAQ,IACtB4rC,EAAelS,KAAM6V,GAAYA,EAAQgB,WAC/C,CAAC3E,IAEE4E,EAAgBxwC,YAAQ,IACrB4rC,EAAer2B,OAAQg6B,IAAaA,EAAQgB,WAClD,CAAC3E,IAEEluC,EAAOC,cAsCb,SAAS8yC,EAAclB,GACrB,OACE,kBAACx4B,GAAA,EAAD,CACE7Y,IAAKqxC,EAAQa,KACbhsC,QAAM,EACNozB,QAAM,EACNrW,eAAgB,CAAC,CACfzJ,MAAO,YACP9W,KAAM,OACN8vC,QAAS,KACPP,EAA4BZ,EAAQa,UAIxC,yBAAKryC,UAAU,iCACb,0BAAMA,UAAU,QAAQulB,YAAoB5lB,EAA2B,IAArB6xC,EAAQoB,aAC1D,0BAAM5yC,UAAU,SAASwxC,EAAQqB,SACjC,0BAAM7yC,UAAU,wBAAwB2xC,GAAqBH,IAC7D,0BAAMxxC,UAAU,YAAYwxC,EAAQsB,GAApC,MAA2CvB,GAAYC,MAM/D,OACE,yBAAKxxC,UAAU,kCACZuyC,IA9DyBf,EA8Dce,EA5DxC,yBAAKvyC,UAAU,iBACb,wBAAIA,UAAU,6BAA6BL,EAAK,gCAEhD,kBAACqZ,GAAA,EAAD,CAAUygB,QAAM,EAACoC,UAAQ,GACvB,yBAAK77B,UAAU,uBACb,0BAAMA,UAAU,SAASwxC,EAAQqB,SACjC,0BAAM7yC,UAAU,wBAAwB2xC,GAAqBH,IAC7D,0BAAMxxC,UAAU,YAAYwxC,EAAQsB,GAApC,MAA2CvB,GAAYC,MAI3D,kBAACx4B,GAAA,EAAD,CACEhZ,UAAU,mBACV6C,KAAK,OACLwD,QAAM,EACNozB,QAAM,EACNx5B,QAASiyC,GAERvyC,EAAK,2BA4CT8yC,IAtCwBM,EAsCaN,EApCtC,yBAAKzyC,UAAU,iBACb,wBAAIA,UAAU,6BAAd,kBAEC+yC,EAASh6B,IAAI25B,KAmCfD,GACC,kBAACj4B,GAAA,EAAD,CACErY,OAAQ8vC,EACRjrC,QAASmrC,EACThvC,KAAK,yDACLsX,aAAa,+BACbC,eAAgB43B,EAChBhf,sBAAoB,IAZ1B,KAnCF,IAA6Byf,EA1BCvB,KCkEjB/qC,mBAAKhI,YACjBC,IACC,MACEkY,OACEC,KAAMm8B,GAERjvB,OACElN,KAAMo8B,GAERrF,SAAS,IACP7P,IAEAr/B,EAEJ,MAAO,CACLs0C,aACAC,aACAC,WAAYnV,IAGhB,CAAC3+B,EAAWC,IAA2BC,YAAKD,EAAS,CAAC,mBApBpCZ,CAzFgD,EAClEu0C,aACAC,aACAC,aACAC,qBAEA,MAAMC,EAAqB1zC,YAAa2zC,IACtCF,EAAe,CAAEE,eAChB,CAACF,IAEExzC,EAAOC,cAyCb,OACE,yBAAKI,UAAU,wBACb,yBAAKA,UAAU,oCACb,yBAAKA,UAAU,iBACb,uBAAGA,UAAU,8CACVL,EAAK,sBAIV,yBAAKK,UAAU,2BACZkzC,GAAcA,EAAW10C,OACxB,yBAAKwB,UAAU,oBACZkzC,EAAYn6B,IAAI,CAACs6B,EAAW11B,IAnDzC,SAAuB01B,EAAmB11B,EAAW21B,GACnD,MAAMC,EAAYx0C,aAAcs0C,GAC1BhzC,EAAOkzC,EAAYN,EAAWI,QAAa/xC,EAC3ClB,EAAQmzC,OAAoCjyC,EAAxB0xC,EAAWK,GAE/BrzC,EAAY0L,aAChB,6CACA6nC,EAAY,UAAY,SAG1B,OACE,kBAACv6B,GAAA,EAAD,CACE7Y,IAAKkzC,EACLrzC,UAAWA,EACXqG,QAAM,EACNozB,QAAM,EACNrW,eAAgB,CAAC,CACfzJ,MAAO,UACP9W,KAAM,SACN8vC,QAAS,KACPS,EAAmBC,MAGvBv4C,MAAQ,SAAQw4C,EAAiB31B,GAAK61B,UAEtC,kBAACtzC,EAAA,EAAD,CAAQzG,KAAK,SAAS4G,KAAMA,EAAMD,KAAMA,IACxC,yBAAKJ,UAAU,eAAeM,IAAI,QAChC,wBAAIA,IAAI,QAAQC,aAAYgzC,EAAYxrB,YAAgB1nB,GAAQ4X,YAAatY,EAAMS,KAAW,KAC7FC,GAAQA,EAAKqzB,aACZ,yBAAK1zB,UAAU,gBAAgBM,IAAI,QAAQmzB,aAA0BpzB,EAAKqzB,cAE3ErzB,IAASA,EAAKqzB,aAAerzB,EAAK2nB,UACjC,yBAAKhoB,UAAU,mBAAmBM,IAAI,QAAtC,IAA+CD,EAAK2nB,YAmBfyrB,CAAcJ,EAAW11B,EAAG,KAE/Du1B,IAAeA,EAAW10C,OAC5B,yBAAKwB,UAAU,cAAf,iBAIA,kBAACqZ,GAAA,EAAD,CAASlZ,IAAI,cAKnB,kBAAC,GAAD,CACE6K,SAAO,EACP/K,QAAS,OAETD,UAAU,kBACVuC,UAAU,sBAEV,uBAAGvC,UAAU,kB,UCrDNyG,mBAAKhI,YAAsBC,IACjC,CACLg1C,cAAeC,YAAoBj1C,EAAQ,QAF3BD,CAvCoC,EACtDi1C,gBAAelgB,qBAEf,MAAM7zB,EAAOC,cAEb,OACE,yBAAKI,UAAU,yCACb,yBAAKA,UAAU,2BACb,kBAAC4zC,GAAA,EAAD,CAAenU,QAASiU,IAExB,uBAAG1zC,UAAU,iCAAiCM,IAAI,QAC/CC,YAAWZ,EAAK,uBAAwB,CAAC,SAI9C,yBAAKK,UAAU,gCACb,kBAACgZ,GAAA,EAAD,CACEnW,KAAK,OACL5C,QAAS,IAAMuzB,EAAejD,IAAgBsC,6BAE7ClzB,EAAK,mBAER,kBAACqZ,GAAA,EAAD,CACEnW,KAAK,eACL5C,QAAS,IAAMuzB,EAAejD,IAAgBuC,eAE7CnzB,EAAK,oBAER,kBAACqZ,GAAA,EAAD,CACEnW,KAAK,QACL5C,QAAS,IAAMuzB,EAAejD,IAAgBwC,oCAE7CpzB,EAAK,0B,oBCsBD8G,mBArD6B,EAC1C8S,QACA8P,YACAwqB,mBACAr7B,cAAc,mBACd4W,OACA0kB,cACAC,aACA53B,eAEA,MAAO63B,EAAiBC,GAAsB9yC,YAAiB,KACxD+yC,EAAoBC,GAAyBhzC,aAAS,GAEvDizC,EAAe10C,YAAa20C,IAC5BR,GAAoBQ,IAAgBR,EACtCI,EAjBuB,6BAmBvB93B,EAASk4B,IAEV,CAACl4B,EAAU03B,IAERS,EAAmB50C,YAAY,KAC/Bq0C,GACFA,IAEFE,EAAmB,KAClB,CAACF,IAEEp0C,EAAOC,cAEb,OACE,yBAAKI,UAAU,yCACb,yBAAKA,UAAU,2BACb,kBAACu0C,GAAA,EAAD,CAAgBC,OAAK,EAACC,kBAAmBP,KAG3C,yBAAKl0C,UAAU,gCACb,kBAAC00C,GAAA,EAAD,CACEn7B,MAAOy6B,GAAmBz6B,EAC1B6V,KAAMA,EACN5W,YAAaA,EACbs7B,YAAaA,GAAen0C,EAAK,QACjCo0C,WAAYO,EACZjrB,UAAWA,EACXorB,kBAAmBP,EACnBS,2BAA4BR,EAC5Bh4B,SAAUi4B,QC7BL3tC,mBAAKhI,YAAsBC,IACjC,CACLg1C,cAAeC,YAAoBj1C,EAAQ,QAF3BD,CApBkC,EAAGi1C,gBAAekB,cACtE,MAAMj1C,EAAOC,cAEb,OACE,yBAAKI,UAAU,yCACb,yBAAKA,UAAU,2BACb,kBAAC4zC,GAAA,EAAD,CAAenU,QAASiU,IAExB,uBAAG1zC,UAAU,iCAAiCM,IAAI,QAC/CX,EAAK,+BAIV,yBAAKK,UAAU,gCACb,kBAACoC,EAAA,EAAD,CAAQnC,QAAS20C,GAAUj1C,EAAK,sCCAxC,MAAMk1C,GAAyBryC,IAAmB,IAAM,IAwHzCiE,mBAAKhI,YAAqB,CAACC,GAAUmE,WAC3C,CACL6wC,cAAeC,YAAoBj1C,EAAiB,UAATmE,EAAmB,KAAO,QAFrDpE,CAtH0C,EAC5Di1C,gBACAztC,OAAO,OACPojB,YACA9P,QACAf,cACAs8B,gBACAf,aACA53B,eAGA,MAAM/Q,EAAWlE,YAAyB,OAEnCf,EAAO4uC,GAAY5zC,YAAiB,KACpC6zC,EAAgBC,EAAoBC,GAAwB5yB,cAAQ,GAE3E5gB,YAAU,KACH0F,KACHjM,WAAW,KACTiQ,EAASnD,QAASyP,SACjBm9B,KAEJ,IAEH,MA2BMl1C,EAAOC,cAEb,OACE,yBAAKI,UAAU,yCACb,yBAAKA,UAAU,2BACb,kBAAC4zC,GAAA,EAAD,CAAenU,QAASiU,KAG1B,yBAAK1zC,UAAU,gCACb,0BAAMmtB,OAAO,GAAGhR,SA5BAta,IACpBA,EAAE4M,iBAEGrD,EAASnD,SAIdkU,EAAShW,KAsBH,kBAACoS,GAAA,EAAD,CACEhO,IAAKa,EACLjF,MAAOA,EACP6Y,UAAW/Y,EACXsuB,MAAO/b,EACPe,MAAOA,EACP3N,SA3CiB/J,IACrB0X,GAASw6B,GACXA,IAGFgB,EAASlzC,EAAEmI,OAAO7D,UAyCXA,EACC,kBAAC/D,EAAA,EAAD,CAAQ6D,KAAK,SAASojB,UAAWA,EAAWhjB,QAAM,GAAE1G,EAAK,aAEzD,kBAACyC,EAAA,EAAD,CACEyX,QAAM,EACNwP,UAAWA,EACXhjB,QAAM,EACNpG,QAAS60C,EAAgBG,EAnClB,KACjB94B,MAoCWxc,EAAK,mBAIXm1C,GACC,kBAACr8B,GAAA,EAAD,CACEzY,UAAU,SACVmC,OAAQ6yC,EACRr7B,MAAOha,EAAK,wBACZqH,QAASkuC,GAER30C,YAAWZ,EAAK,4BAA6B,CAAC,KAAM,oBACrD,yBAAKK,UAAU,kBACb,kBAACoC,EAAA,EAAD,CACEE,MAAM,SACN+D,QAAM,EACNwT,QAAM,EACN7Z,UAAU,wBACVC,QAnDY,KACxBi1C,IACA/4B,MAmDaxc,EAAK,kBAER,kBAACyC,EAAA,EAAD,CACEE,MAAM,UACN+D,QAAM,EACNwT,QAAM,EACN7Z,UAAU,wBACVC,QAASi1C,GAERv1C,EAAK,kBCjGP8G,mBAAKhI,YAAsBC,IACjC,CACLg1C,cAAeC,YAAoBj1C,EAAQ,QAF3BD,CA1B4C,EAC9Di1C,gBAAelgB,qBAEf,MAAM7zB,EAAOC,cAMb,OACE,yBAAKI,UAAU,yCACb,yBAAKA,UAAU,2BACb,kBAAC4zC,GAAA,EAAD,CAAenU,QAASiU,IAExB,uBAAG1zC,UAAU,iCAAiCM,IAAI,QAC/CX,EAAK,wCAIV,yBAAKK,UAAU,gCACb,kBAACoC,EAAA,EAAD,CAAQnC,QAfM,KAClBuzB,EAAejD,IAAgBI,WAcIhxB,EAAK,mDCb5C,MAAMk1C,GAAyBryC,IAAmB,IAAM,IA6DzCiE,mBAAKhI,YAAsBC,IACjC,CACLg1C,cAAeC,YAAoBj1C,EAAQ,MAC3Cy2C,WAAYz2C,EAAO02C,cAAcC,yBAHjB52C,CA3DsC,EACxDi1C,gBACAyB,aACA9rB,YACA9P,QACAw6B,aACA53B,eAGA,MAAM/Q,EAAWlE,YAAyB,OAEnCf,EAAO4uC,GAAY5zC,YAAiB,IAE3CO,YAAU,KACH0F,KACHjM,WAAW,KACTiQ,EAASnD,QAASyP,SACjBm9B,KAEJ,IAEH,MAAMl1C,EAAOC,cAiBb,OACE,yBAAKI,UAAU,yCACb,yBAAKA,UAAU,2BACb,kBAAC4zC,GAAA,EAAD,CAAenU,QAASiU,KAG1B,yBAAK1zC,UAAU,gCACb,kBAACuY,GAAA,EAAD,CACEpS,MAAOA,EACPoE,IAAKa,EACL4T,UAAU,UACVuV,MAAO50B,EAAK,iBACZ4Z,MAAOA,EACP3N,SA5BmB/J,IACrB0X,GAASw6B,GACXA,IAGF,MAAMuB,EAAWzzC,EAAEmI,OAAO7D,MAAMylB,MAAM,EAAGupB,GAErCG,EAAS92C,SAAW22C,GACtBh5B,EAASm5B,GAGXP,EAASO,GACTzzC,EAAEmI,OAAO7D,MAAQmvC,KAkBZjsB,GAAa,kBAAChQ,GAAA,EAAD,WC0OP5S,mBAAKhI,YACjBC,IAAD,IAA8BA,EAAO02C,gBACrC,CAACh2C,EAAWC,IAA2BC,YAAKD,EAAS,CACnD,iBAAkB,sBAAuB,gBAAiB,wBAC1D,gBAAiB,oBAJDZ,CA3R6C,EAC/D8wB,gBACAtC,QACAmC,OACA/F,YACA9P,QACA87B,yBACAlb,WACA3G,iBACA+hB,iBACAC,gBACAC,kBACAC,sBACAC,wBACAC,oBAEAl0C,YAAU,KACJ2zC,IACE9lB,IAAkBgB,IAAgBiC,sBACpCgB,EAAejD,IAAgBmC,2BACtBnD,IAAkBgB,IAAgBkC,oBAC3Ce,EAAejD,IAAgBoC,0BAGlC,CAACpD,EAAeiE,EAAgB6hB,IAEnC,MAAMQ,EAAoBn2C,YAAY,KACpCy6B,EAAS,CAAEl0B,KAAM,UACjButB,EAAejD,IAAgB2B,mBAC9B,CAACiI,EAAU3G,IAERsiB,EAAoBp2C,YAAayG,IACrCg0B,EAAS,CAAEl0B,KAAM,cAAe6oB,QAAS3oB,IACzCqtB,EAAejD,IAAgB8B,0BAC9B,CAAC8H,EAAU3G,IAERuiB,EAA2Br2C,YAAY,KAC3C8zB,EAAejD,IAAgB+B,uBAC9B,CAACkB,IAEEwiB,EAAwBt2C,YAAayG,IACzCg0B,EAAS,CAAEl0B,KAAM,UAAW6oB,QAAS3oB,IACrCqtB,EAAejD,IAAgBiC,wBAC9B,CAAC2H,EAAU3G,IAERyiB,EAAyBv2C,YAAayG,IAC1Cg0B,EAAS,CAAEl0B,KAAM,WAAY6oB,QAAS3oB,IACtCovC,EAAe,IACVtoB,EACHoC,MAAOlpB,EACP+vC,UAAW,KACT1iB,EAAejD,IAAgBqC,0BAGlC,CAACuH,EAAU3G,EAAgBvG,EAAOsoB,IAE/BY,EAA8Bz2C,YAAayG,IAC/Cg0B,EAAS,CAAEl0B,KAAM,qBAAsB6oB,QAAS3oB,IAChDqvC,EAAc,CACZtmB,gBAAiB/oB,EACjB+vC,UAAW,KACT1iB,EAAejD,IAAgB4B,4BAGlC,CAACqjB,EAAerb,EAAU3G,IAEvB4iB,EAA0B12C,YAAayG,IAC3Cg0B,EAAS,CAAEl0B,KAAM,cAAe6oB,QAAS3oB,IACzCqtB,EAAejD,IAAgB6B,6BAC9B,CAAC+H,EAAU3G,IAER6iB,EAA8B32C,YAAY,KAC9C8zB,EAAejD,IAAgBgC,0BAC9B,CAACiB,IAEE8iB,EAA2B52C,YAAayG,IAC5Cg0B,EAAS,CAAEl0B,KAAM,UAAW6oB,QAAS3oB,IACrCovC,EAAe,IACVtoB,EACHmC,KAAMjpB,EACN+vC,UAAW,KACT1iB,EAAejD,IAAgBqC,0BAGlC,CAACuH,EAAU3G,EAAgBvG,EAAOsoB,IAE/BgB,EAAgB72C,YAAayG,IACjCyvC,EAAc,CACZ1mB,gBAAiB/oB,EACjB+vC,UAAW,KACT1iB,EAAejD,IAAgBI,aAGlC,CAACilB,EAAepiB,IAEbgjB,EAAqC92C,YAAayG,IACtDg0B,EAAS,CAAEl0B,KAAM,qBAAsB6oB,QAAS3oB,IAChDqvC,EAAc,CACZtmB,gBAAiB/oB,EACjB+vC,UAAW,KACT1iB,EAAejD,IAAgBkC,wBAGlC,CAAC+iB,EAAerb,EAAU3G,IAEvBijB,EAAsB/2C,YAAayG,IACvCg0B,EAAS,CAAEl0B,KAAM,WAAY6oB,QAAS3oB,IACtCuvC,EAAoB,IACfzoB,EACHoC,MAAOlpB,EACP+vC,UAAW,KACT1iB,EAAejD,IAAgBqC,0BAGlC,CAACuH,EAAU3G,EAAgBvG,EAAOyoB,IAE/BgB,EAAkBh3C,YAAai3C,IACnChB,EAAsB,CAAEgB,UACvB,CAAChB,IAEEh2C,EAAOC,cAEb,OAAQ2vB,GACN,KAAKgB,IAAgByB,cACnB,OACE,kBAAC,GAAD,CACE4iB,QAASiB,IAIf,KAAKtlB,IAAgB2B,iBACnB,OACE,kBAAC,GAAD,CACE1Z,YAAa7Y,EAAK,iBAClBm0C,YAAan0C,EAAK,YAClBwc,SAAU25B,IAIhB,KAAKvlB,IAAgB8B,wBACnB,OACE,kBAAC,GAAD,CACEwhB,iBAAkB5mB,EAAMkC,SACxB3W,YAAa7Y,EAAK,yBAClBm0C,YAAan0C,EAAK,YAClBwc,SAAU45B,IAIhB,KAAKxlB,IAAgB+B,qBACnB,OACE,kBAAC,GAAD,CACEzvB,KAAK,OACL2V,YAAa7Y,EAAK,2BAClBwc,SAAU65B,IAIhB,KAAKzlB,IAAgBiC,sBACnB,OACE,kBAAC,GAAD,CACE3vB,KAAK,QACLoD,KAAK,QACLojB,UAAWA,EACX9P,MAAOA,EACPw6B,WAAY0B,EACZj9B,YAAa7Y,EAAK,sBAClBm1C,eAAa,EACb34B,SAAU85B,IAIhB,KAAK1lB,IAAgBmC,0BACnB,OACE,kBAAC,GAAD,CACErJ,UAAWA,EACX9P,MAAOA,EACPw6B,WAAY0B,EACZt5B,SAAUu6B,IAIhB,KAAKnmB,IAAgBqC,qBACnB,OACE,kBAAC,GAAD,CACEY,eAAgBA,IAItB,KAAKjD,IAAgB0B,aACnB,OACE,kBAAC,GAAD,CACEuB,eAAgBA,IAItB,KAAKjD,IAAgBsC,2BACnB,OACE,kBAAC,GAAD,CACExJ,UAAWA,EACX9P,MAAOA,EACPw6B,WAAY0B,EACZrmB,KAAMA,EACNjT,SAAUg6B,IAIhB,KAAK5lB,IAAgB4B,uBACnB,OACE,kBAAC,GAAD,CACE3Z,YAAa7Y,EAAK,+BAClBwc,SAAUi6B,IAIhB,KAAK7lB,IAAgB6B,2BACnB,OACE,kBAAC,GAAD,CACEyhB,iBAAkB5mB,EAAMkC,SACxB3W,YAAa7Y,EAAK,yBAClBwc,SAAUk6B,IAIhB,KAAK9lB,IAAgBgC,wBACnB,OACE,kBAAC,GAAD,CACElJ,UAAWA,EACX9P,MAAOA,EACPw6B,WAAY0B,EACZ5yC,KAAK,OACL2V,YAAa7Y,EAAK,2BAClBwc,SAAUm6B,IAIhB,KAAK/lB,IAAgBuC,aACnB,OACE,kBAAC,GAAD,CACEzJ,UAAWA,EACX9P,MAAOA,EACPw6B,WAAY0B,EACZrmB,KAAMA,EACNjT,SAAUo6B,IAIhB,KAAKhmB,IAAgBwC,kCACnB,OACE,kBAAC,GAAD,CACE1J,UAAWA,EACX9P,MAAOA,EACPw6B,WAAY0B,EACZrmB,KAAMA,EACNjT,SAAUq6B,IAIhB,KAAKjmB,IAAgBkC,mBACnB,OACE,kBAAC,GAAD,CACE5vB,KAAK,QACLoD,KAAK,QACLuS,YAAa7Y,EAAK,sBAClBwc,SAAUs6B,IAIhB,KAAKlmB,IAAgBoC,uBACnB,OACE,kBAAC,GAAD,CACEtJ,UAAWA,EACX9P,MAAOA,EACPw6B,WAAY0B,EACZt5B,SAAUu6B,IAIhB,QACE,WCjLSjwC,mBAhGc,EAC3BmwC,UACA3a,cACAC,cACA2a,oBACAC,eACAC,gBACA1tB,YACA8S,sBACAE,iBACAxjB,iBAGA,MAAMzN,EAAWlE,YAAyB,MACpCq1B,EAAiBN,EAAYz9B,OAjBd,GAmBrBkD,YAAU,KACRvG,WAAW,KACTP,sBAAsB,KACpBwQ,EAASnD,QAASyP,WAxBH,MA2BlB,IAEH,MAAM+kB,EAAkB/8B,YAAa/B,IACnC,MAAM++B,EAAiB,IAAIT,GACvBS,EAAerjC,SAASsE,GAC1B++B,EAAeC,OAAOD,EAAerqB,QAAQ1U,GAAK,GAElD++B,EAAe9e,KAAKjgB,GAEtBw+B,EAAoBO,GACpBL,EAAe,KACd,CAACJ,EAAaE,EAAqBE,IAEhChkB,EAAqB3Y,YAAamC,IACtC,MAAM,MAAEsE,GAAUtE,EAAE8H,cACpB0yB,EAAel2B,IACd,CAACk2B,KAEGnkB,EAAaC,GAAWC,aAAkBS,EAAY+9B,EAASx/C,QAAQ8kC,IAExEv8B,EAAOC,cAEb,OACE,yBAAKI,UAAU,UACb,yBAAKA,UAAU,+BACZi8B,EAAYljB,IAAI,CAACpb,EAAIggB,IACpB,kBAACmL,GAAA,EAAD,CACEC,aAAcprB,EACdo/B,YAAaR,GAAkB5e,EAAIse,EAAYz9B,OApD3B,EAqDpBw+B,UAAQ,EACR/8B,QAASw8B,EACTzT,SAAUrrB,KAGd,kBAAC4a,GAAA,EAAD,CACE5a,GAAIo5C,EACJxsC,IAAKa,EACLjF,MAAO+1B,EACPtwB,SAAUyM,EACVG,YAAaq+B,GAAqBl3C,EAAK,iBAI1CuY,GAAeA,EAAY1Z,OAC1B,kBAACma,GAAA,EAAD,CACE3Y,UAAU,4BACV4Y,MAAOV,EACPW,WAAYV,GAEXD,EAAYa,IAAKpb,GAChB,kBAACqb,GAAA,EAAD,CACE7Y,IAAKxC,EACLqC,UAAU,uCACVC,QAAS,IAAMw8B,EAAgB9+B,GAC/B0I,QAAM,GAEN,kBAAC42B,GAAA,EAAD,CAAU1I,MAAM,GAAG2I,QAASjB,EAAY5iC,SAASsE,KAChDoB,aAAcpB,GACb,kBAACsb,GAAA,EAAD,CAAiBE,OAAQxb,IAEzB,kBAACyb,GAAA,EAAD,CAAeza,OAAQhB,OAK5B0rB,IAAanR,GAAgBA,EAAY1Z,OAG5C,kBAAC6a,GAAA,EAAD,MAFA,uBAAGrZ,UAAU,cAAc82C,GAAgB,4BCoBnD,SAASE,GAA0Bt4C,EAAqBuxC,GACtD,MAAM,QAAEtC,GAAYjvC,EAAOmR,SAC3B,OAAQogC,GACN,KAAK1f,IAAgBa,kCACrB,KAAKb,IAAgBkB,iCACnB,OAAOkc,EAAQja,YACjB,KAAKnD,IAAgBc,+BACrB,KAAKd,IAAgBmB,8BACnB,OAAOic,EAAQS,SACjB,KAAK7d,IAAgBe,mCACrB,KAAKf,IAAgBoB,kCACnB,OAAOgc,EAAQW,aACjB,KAAK/d,IAAgBgB,iCACrB,KAAKhB,IAAgBqB,gCACnB,OAAO+b,EAAQa,SACjB,KAAKje,IAAgBsB,gCACrB,KAAKtB,IAAgBiB,iCACnB,OAAOmc,EAAQe,YAMNjoC,mBAAKhI,YAClB,CAACC,GAAUuxC,aACT,MACEr5B,OACEC,KAAMC,EADD,QAELC,EAFK,iBAGLsmB,GAJE,cAMJrmB,GACEtY,EAEJ,MAAO,CACLsY,gBACAF,YACAC,QAASA,EAAQG,OACjBmmB,iBAAkBA,EAAiBnmB,OACnComB,kBAAmBD,EAAiBjmB,SACpCD,gBAAiBJ,EAAQK,SACzBvH,SAAUmnC,GAA0Bt4C,EAAQuxC,KAGhD,CAAC7wC,EAAWC,IAA2BC,YAAKD,EAAS,CAAC,uBArBpCZ,CApIsE,EACxFuY,gBACAigC,cACAhH,SACApgC,WACAiH,YACAC,UACAsmB,mBACAlmB,kBACAmmB,oBACA4Z,qBACA1jB,qBAEA,MAAM7zB,EAAOC,cAEPu3C,EAAqBl1C,YAAQ,IAC5B4N,EAIDonC,EACK,IAAIpnC,EAASsgC,gBAAiBtgC,EAASugC,cAEvC,IAAIvgC,EAASwgC,gBAAiBxgC,EAASygC,cANvC,GAQR,CAAC2G,EAAapnC,KACV+U,EAAawyB,GAAkBj2C,YAAiB,KAChDk2C,EAAeC,GAAoBn2C,aAAkB,IACrDo2C,EAAuBC,GAA4Br2C,YAAmBg2C,GAEvEvgC,EAAQ3U,YAAQ,KACpB,MAAMs7B,EAAmBxmB,EACrBymB,aAAgB1mB,EAAWC,EAASsmB,EAAkB,YACtD/7B,EACEm8B,EAAqBtmB,EACvBqmB,aAAgB1mB,EAAWK,EAAiBmmB,EAAmB,iBAC/Dh8B,EAEJ,GAAKi8B,GAAqBE,EAI1B,MAAO,IACDF,EACA,IACGA,EAAiBG,eACjBH,EAAiBI,YAEpB,MAEAF,EAAqBA,EAAmBE,WAAa,KAE1D,CAAC7mB,EAAWC,EAASsmB,EAAkBlmB,EAAiBmmB,IAErDM,EAAe37B,YAAQ,KAC3B,GAAK2U,EAIL,OAAOA,EACJY,OAAQpX,IACLrB,aAAcqB,EAAKzC,KAAOyC,EAAKzC,KAAOqZ,GAAkBmT,aAAY/pB,OAEnEwkB,GACA5M,aAAYC,YAAatY,EAAMS,GAAOwkB,IACtCuyB,EAAmB99C,SAAS+G,EAAKzC,MAGrCob,IAAI,EAAGpb,QAASA,IAClB,CAACiZ,EAAOI,EAAerX,EAAMilB,EAAauyB,IAEvCM,EAAiC/3C,YAAayG,IAClDqxC,EAAyBrxC,GACzBmxC,GAAiB,IAChB,IAEGlD,EAAe10C,YAAY,KAC/Bw3C,EAAmB,CACjBtG,WAAYZ,GAAcC,GAC1BgH,YAAa7/C,QAAQ6/C,GACrBS,YAAaH,IAGf/jB,EAAejD,IAAgBI,UAC9B,CAACsmB,EAAaM,EAAuB/jB,EAAgByc,EAAQiH,IAEhE,OACE,yBAAKl3C,UAAU,wBACb,kBAAC,GAAD,CACE42C,QAAShZ,GAAgB,GACzB3B,YAAasb,EACbrb,YAAatX,EACbiyB,kBAAiCl3C,EAAds3C,EAAmB,6BAAqC,6BAC3EF,cAAc,0BACd5a,oBAAqBsb,EACrBpb,eAAgB+a,IAGlB,kBAAC,GAAD,CACEpsC,QAASqsC,EACTp3C,QAASm0C,EACT7xC,UAAyB5C,EAAds3C,EAAmB,uBAA+B,wBAE7D,uBAAGj3C,UAAU,0B,OClHrB,MAAM6rB,GAA0B5tB,OAAO6tB,KAAKyE,KAAiB/xB,OAAS,EAqMvDiI,mBA5LgB,EAC7B8oB,gBACAiE,iBACAtP,cAEA,MAAOyzB,EAAcC,GxCwMd/qB,GAAWgC,GAAgBF,KwCvM3BkpB,EAAYC,GvCiBZjrB,GAAWyC,GAAcX,IuCf1BwP,EAAcz+B,YAAY,KAE5B6vB,IAAkBgB,IAAgB0C,qBAC/B1D,IAAkBgB,IAAgB2C,mBAErC/3B,WAAW,KACTy8C,EAAgB,CAAE3xC,KAAM,WAtBJ,KA2BtBspB,IAAkBgB,IAAgB4C,sBAC/B5D,IAAkBgB,IAAgB6C,qBAUvClP,IAR4B,WAAtByzB,EAAajqB,KACf8F,EAAejD,IAAgB0C,qBAE/BO,EAAejD,IAAgB2C,oBAMlC,CACDykB,EAAajqB,KAAMkqB,EACnBroB,EAAerL,EAASsP,IAGpBukB,EAAmBr4C,YAAY,KACnCk4C,EAAgB,CAAE3xC,KAAM,gBACxBk4B,KACC,CAACyZ,EAAiBzZ,IA2HrB,SAAS6Z,IACP,OACE,oCACE,kBAAC,GAAD,CACEzoB,cAAeA,EACfrL,QAASia,EACT1O,aAAcsoB,EACdvoB,eAAgBmoB,EAAa1oB,WAhIrC,WACE,OAAQM,GACN,KAAKgB,IAAgB0nB,KACnB,OACE,kBAAC,GAAD,CAAczkB,eAAgBA,IAElC,KAAKjD,IAAgBC,YACnB,OACE,kBAAC,GAAD,MAEJ,KAAKD,IAAgBE,QACnB,OACE,kBAAC,GAAD,CAAiB+C,eAAgBA,IAErC,KAAKjD,IAAgBG,cACnB,OACE,kBAAC,GAAD,MAEJ,KAAKH,IAAgBI,QACnB,OACE,kBAAC,GAAD,CAAiB6C,eAAgBA,IAErC,KAAKjD,IAAgBK,SACnB,OACE,kBAAC,GAAD,MAEJ,KAAKL,IAAgBM,sBACnB,OACE,kBAAC,GAAD,CAA2B2C,eAAgBA,IAE/C,KAAKjD,IAAgBO,2BACnB,OACE,kBAAC,GAAD,CAAgC0C,eAAgBA,IAEpD,KAAKjD,IAAgBuB,sBACnB,OACE,kBAAC,GAAD,MAEJ,KAAKvB,IAAgBwB,oBACnB,OACE,kBAAC,GAAD,MAEJ,KAAKxB,IAAgBQ,mBACrB,KAAKR,IAAgBS,gBACrB,KAAKT,IAAgBU,oBACrB,KAAKV,IAAgBW,kBACrB,KAAKX,IAAgBY,kBACnB,OACE,kBAAC,GAAD,CAA2B8e,OAAQ1gB,EAAeiE,eAAgBA,IAGtE,KAAKjD,IAAgBa,kCACrB,KAAKb,IAAgBc,+BACrB,KAAKd,IAAgBe,mCACrB,KAAKf,IAAgBgB,iCACrB,KAAKhB,IAAgBiB,iCACnB,OACE,kBAAC,GAAD,CACEylB,aAAW,EACXhH,OAAQ1gB,EACRiE,eAAgBA,IAItB,KAAKjD,IAAgBkB,iCACrB,KAAKlB,IAAgBmB,8BACrB,KAAKnB,IAAgBoB,kCACrB,KAAKpB,IAAgBqB,gCACrB,KAAKrB,IAAgBsB,gCACnB,OACE,kBAAC,GAAD,CACEoe,OAAQ1gB,EACRiE,eAAgBA,IAItB,KAAKjD,IAAgByC,QACrB,KAAKzC,IAAgB0C,oBACrB,KAAK1C,IAAgB2C,kBACrB,KAAK3C,IAAgB4C,qBACrB,KAAK5C,IAAgB6C,qBACnB,OACE,kBAAC,GAAD,CACE7D,cAAeA,EACftC,MAAO0qB,EACPxd,SAAUyd,EACVpkB,eAAgBA,EAChBtP,QAASia,IAIf,KAAK5N,IAAgByB,cACrB,KAAKzB,IAAgB2B,iBACrB,KAAK3B,IAAgB8B,wBACrB,KAAK9B,IAAgB+B,qBACrB,KAAK/B,IAAgBiC,sBACrB,KAAKjC,IAAgBmC,0BACrB,KAAKnC,IAAgBqC,qBACrB,KAAKrC,IAAgB0B,aACrB,KAAK1B,IAAgBsC,2BACrB,KAAKtC,IAAgB4B,uBACrB,KAAK5B,IAAgB6B,2BACrB,KAAK7B,IAAgBgC,wBACrB,KAAKhC,IAAgBuC,aACrB,KAAKvC,IAAgBwC,kCACrB,KAAKxC,IAAgBkC,mBACrB,KAAKlC,IAAgBoC,uBACnB,OACE,kBAAC,GAAD,CACEpD,cAAeA,EACftC,MAAO4qB,EACP1d,SAAU2d,EACVtkB,eAAgBA,IAItB,QACE,QAaC0kB,IAKP,OACE,kBAAC1hC,EAAA,EAAD,CACE7Y,GAAG,WACH+Y,KAAMlU,IAAmB,eAAiB,aAC1CiU,UAAW8Y,EACX3C,YAAaf,IAEZmsB,KC5LP,MAAMv0B,GAAe9f,YAAU+f,GAAOA,IAAM,KAAO,GA+DpCjd,mBAAKhI,YACjBC,IACC,MAAQilB,QAASw0B,GAAez5C,EAAO0nB,aAAe,IAC9CvP,KAAMiN,GAAcplB,EAAOqlB,MAEnC,MAAO,CACLD,YACAq0B,eAGJ,CAAC/4C,EAAWC,IAA2BC,YAAKD,EAAS,CAAC,kBAAmB,aAVvDZ,CA7D2C,EAC7D+Y,SAAQsM,YAAWq0B,aAAY/zB,kBAAiBC,eAIhD3iB,YAAU,KACR+hB,GAAa,KACXW,QAIJ,MAAMM,EAAchlB,YACjB/B,IACC0mB,EAAS,CAAE1mB,QAEb,CAAC0mB,IAGGtN,EAAU9U,YAAQ,KACtB,IAAKk2C,EACH,OAGF,MAAMC,EAAY5gC,EAAS2gC,EAAW3gC,OAAQ7Z,IAC5C,MAAM0C,EAAOyjB,EAAUnmB,GACvB,IAAK0C,EACH,OAAO,EAET,MAAMynB,EAAWC,YAAgB1nB,GACjC,OAAOynB,GAAY9P,aAAY8P,EAAUtQ,KACtC2gC,EAEL,OAAOE,aAAYD,EAAWt0B,IAC7B,CAACtM,EAAQsM,EAAWq0B,KAEhBjgC,EAAaC,GAAWC,kBAAkB9W,EAAWyV,EAAS3f,QAAQogB,IAE7E,OACE,kBAACmB,GAAA,EAAD,CAAgBC,MAAOV,EAAaW,WAAYV,EAASnY,UAAU,2BAChEkY,GAAeA,EAAY1Z,OAC1B0Z,EAAYa,IAAKpb,GACf,kBAACqb,GAAA,EAAD,CACE7Y,IAAKxC,EACLqC,UAAU,sBACVC,QAAS,IAAMykB,EAAY/mB,GAC3B0I,QAAS7D,KAET,kBAACyW,GAAA,EAAD,CAAiBE,OAAQxb,EAAI26C,eAAa,EAAC/0B,WAAW,YAGxDrL,IAAgBA,EAAY1Z,OAC9B,uBAAGwB,UAAU,aAAaG,IAAI,aAAaG,IAAI,QAC5CkX,EAAOhZ,OAAS,mCAAqC,0BAGxD,kBAAC6a,GAAA,EAAD,CAASlZ,IAAI,gBCjDrB,MAAMsjB,GAAe9f,YAAU+f,GAAOA,IAAM,KAAO,GA8GpCjd,mBAAKhI,YACjBC,IACC,MAAQilB,QAASwC,GAAoBznB,EAAO0nB,aAAe,IACnDvP,KAAMiN,GAAcplB,EAAOqlB,OAC3BlN,KAAMC,GAAcpY,EAAOkY,OAC7B,cAAEI,GAAkBtY,GAGxB+oB,MAAO7C,EADH,eAEJyB,EAFI,cAGJC,EAHI,aAIJC,GACE7nB,EAAOulB,cACHN,QAAS8C,GAAkBH,GAAiB,IAC5C3C,QAASgD,GAAiBJ,GAAgB,GAElD,MAAO,CACLvP,gBACA8M,YACAhN,YACAqP,kBACAvB,cACA2zB,YAAalyB,GAAkBA,EAAezP,MAC9C6P,gBACAE,iBAGJ,CAACvnB,EAAWC,IAA2BC,YAAKD,EAAS,CAAC,kBAAmB,yBA3BvDZ,CA5G4C,EAC9DiiB,YACA83B,oBACAC,4BACAC,aACAx0B,UACAlN,gBACA8M,YACAhN,YACAqP,kBACAvB,cACA2zB,cACA5xB,eACAF,gBACArC,kBACAu0B,2BAIAj3C,YAAU,KACR+hB,GAAa,KACXW,QAIJ,MAAM/L,EAAqB3Y,YAAa+nB,IACtCkxB,EAAqB,CAAElxB,WACtB,CAACkxB,IAEE/a,EAAe37B,YAAQ,KAC3B,MAAMk2C,EAAahyB,EACftO,aAAYsO,EAAgB3O,OAAQ7Z,GAAOA,IAAOqZ,GAAgBF,GAClE,GAEJ,IAAK8N,EACH,OAAOuzB,EAGT,MAAMtwB,EAAkBswB,EAAW3gC,OAAQ7Z,IACzC,MAAM0C,EAAOyjB,EAAUnmB,GACvB,IAAK0C,EACH,OAAO,EAET,MAAMynB,EAAWC,YAAgB1nB,GACjC,OAAOynB,GAAY9P,aAAY8P,EAAUlD,KAG3C,OAAO/M,aACLoQ,YAAO,IACFJ,KACClB,GAAgB,MAChBF,GAAiB,KAEvB3P,GACA,EACA0hC,IAED,CACDryB,EAAiBvB,EAAa+B,EAAcF,EAAe3C,EAAWhN,EAAW0hC,EAAmBxhC,IAGhG4hC,EAAiBl5C,YAAY,MAC7B84C,EAAkBh6C,QAAUkiB,KAC9Bi4B,EAAqB,CAAElxB,MAAO,KAC9BixB,MAED,CAACF,EAAkBh6C,OAAQkiB,EAAWi4B,EAAsBD,IAEzD/4C,EAAOC,cAEb,OACE,yBAAKI,UAAU,kBACb,yBAAKA,UAAU,eACb,kBAACoC,EAAA,EAAD,CACEC,OAAK,EACL5I,KAAK,UACL6I,MAAM,cACNrC,QAASikB,EACT3hB,UAAU,uBAEV,uBAAGvC,UAAU,qBAEf,4BAAKL,EAAK,qBAEZ,yBAAKK,UAAU,wBACb,kBAAC,GAAD,CACE42C,QAAShZ,EACT3B,YAAauc,EACbtc,YAAatX,EACbiyB,kBAAmBl3C,EAAK,iBACxBo3C,cAAc,0BACd1tB,UAAWkvB,EACXpc,oBAAqBsc,EACrBpc,eAAgBhkB,IAGlB,kBAAC,GAAD,CACErN,QAAS5T,QAAQohD,EAAkBh6C,QAAUkiB,GAC7CzgB,QAAS24C,EACTr2C,UAAWme,EAAY,2BAA6B,0BAEpD,uBAAG1gB,UAAU,2BC6CRyG,mBAAKhI,YACjBC,IACC,MACEsE,SAAU61C,EACVt/B,MAAOu/B,GACLp6C,EAAOq6C,cAAgB,GAE3B,MAAO,CACLF,mBACAC,kBAGJ,CAAC15C,EAAWC,IAA2BC,YAAKD,EAAS,CACnD,kBAAmB,kBAbHZ,CAxJ4C,EAC9DiiB,YACAs4B,YACA90B,UACA20B,mBACAC,gBACAG,kBACAC,oBAEA,MAAMv5C,EAAOC,eAEN+Z,EAAOw/B,GAAYh4C,YAAS,KAC5Bi4C,EAAOC,GAAYl4C,YAAS,KAC5BnK,EAAOk/B,GAAY/0B,eACnBoY,EAAO0c,GAAY90B,cAMpBkoB,EAAYwvB,IAAqBS,IAAqB9iB,WAEtD+iB,EAAoB75C,YAAamC,IACrC,MAAM,MAAEsE,GAAUtE,EAAE8H,cACd2rC,EAAWnvC,EAAM6X,QAAQ,OAAQ,IAEvCm7B,EAAS7D,GAELA,IAAanvC,IACftE,EAAE8H,cAAcxD,MAAQmvC,IAEzB,IAEGkE,EAA0B95C,YAAamC,IAC3Cw3C,EAASx3C,EAAE8H,cAAcxD,QACxB,IAEGszC,EAAoB/5C,YAAY,KAC/Bia,EAAMnb,OAKPw6C,EAAUx6C,OA7CgB,IA8C5By3B,EA1B0B,oDA8B5BgjB,EAAgB,CACdt/B,QACA3iB,QACAgiD,cAZA/iB,EAvBwB,8BAqCzB,CAACtc,EAAOq/B,EAAWC,EAAiBjiD,EArCX,4BAEE,qDAqCxB0iD,EAAsBh6C,YAAY,KACjCia,EAAMnb,OAKX06C,EAAc,CACZv/B,QACAy/B,QACApiD,QACAgiD,cARA/iB,EAxC2B,iCAkD5B,CAACtc,EAAOu/B,EAAeE,EAAOpiD,EAAOgiD,EAlDT,iCAoD/Bt3C,YAAU,KACJm3C,IAAqBS,IAAqB3iB,UAC5CzS,GAAQ,IAET,CAAC20B,EAAkB30B,IAEtB,MAAMy1B,EAAgBb,IA3DM,8BA4D1Bv/B,GA3D6B,iCA2DIA,EAC7BA,OACAjY,GAGN,OACE,yBAAKtB,UAAU,WACb,yBAAKA,UAAU,eACb,kBAACoC,EAAA,EAAD,CACEC,OAAK,EACL5I,KAAK,UACL6I,MAAM,cACNrC,QAAS,IAAMikB,IACf3hB,UAAU,8BAEV,uBAAGvC,UAAU,qBAEf,4BAAKL,EAAK+gB,EAAY,aAAe,cAEvC,yBAAK1gB,UAAU,wBACb,kBAACq3B,GAAA,EAAD,CACEzrB,SAAUsqB,EACVvc,MAAOha,EAAK,cAEd,kBAAC4Y,GAAA,EAAD,CACEpS,MAAOwT,EACP/N,SAAU2tC,EACVhlB,MAAO50B,EAAK+gB,EAAY,mBAAqB,aAC7CnH,MAxFoB,8BAwFbA,GAvFgB,iCAuFiBA,EAAmCA,OAAQjY,IAEpFof,GACC,oCACE,kBAACnI,GAAA,EAAD,CACEpS,MAAOizC,EACPxtC,SAAU4tC,EACVjlB,MAAO50B,EAAK,oCAEd,uBAAGK,UAAU,QAAQL,EAAK,qBAI7Bg6C,GACC,uBAAG35C,UAAU,SAAS25C,GAGvBX,EAAUx6C,OAAS,GAClB,oCACE,wBAAIwB,UAAU,wBAAwBL,EAAK,6BAA8Bq5C,EAAUx6C,OAAQ,MAE3F,yBAAKwB,UAAU,mCACZg5C,EAAUjgC,IAAKpb,GACd,kBAACqb,GAAA,EAAD,CAAU6iB,UAAQ,EAAC77B,UAAU,uBAC3B,kBAACiZ,GAAA,EAAD,CAAiBE,OAAQxb,SAQrC,kBAAC,GAAD,CACEqN,QAA0B,IAAjB2O,EAAMnb,OACfyB,QAASygB,EAAYg5B,EAAsBD,EAC3C9tC,SAAU0d,EACV9mB,UAAWme,EAAY/gB,EAAK,8BAAgC,gBAE3D0pB,EACC,kBAAC9Z,EAAA,EAAD,CAASjN,MAAM,UAEf,uBAAGtC,UAAU,0B,OC/JvB,MAAM45C,GAAe37C,OAAO6tB,KAAK+tB,KAAmBr7C,OAAS,EAmD9CiI,mBAjDe,EAC5Bia,aAAY,EACZ6L,UACAutB,kBACA51B,cAEA,MAAO61B,EAAkBC,GAAuB74C,YAAmB,IAE7Dy3C,EAAiBl5C,YAAY,KACjCo6C,EAAgBp5B,EAAYm5B,IAAkBI,gBAAkBJ,IAAkBK,gBACjF,CAACx5B,EAAWo5B,IAEf,OACE,kBAACtjC,EAAA,EAAD,CACE7Y,GAAG,UACH+Y,KAAMlU,IAAmB,eAAiB,aAC1CoqB,YAAagtB,GACbnjC,UAAW8V,GAEV,KACC,OAAQA,GACN,KAAKstB,IAAkBM,gBACvB,KAAKN,IAAkBO,cACrB,OACE,kBAAC,GAAD,CACE15B,UAAWA,EACX83B,kBAAmBuB,EACnBtB,0BAA2BuB,EAC3BtB,WAAYE,EACZ10B,QAASA,IAGf,KAAK21B,IAAkBI,gBACvB,KAAKJ,IAAkBK,cACrB,OACE,kBAAC,GAAD,CACEx5B,UAAWA,EACXs4B,UAAWe,EACX71B,QAASA,IAGf,QACE,Y,iBC9BGzd,mBAtBqB,EAAGyd,cACrC,MAAMvkB,EAAOC,cAEb,OACE,yBAAKI,UAAU,iBACb,yBAAKA,UAAU,eACb,kBAACoC,EAAA,EAAD,CACEC,OAAK,EACL5I,KAAK,UACL6I,MAAM,cACNrC,QAASikB,EACT3hB,UAAU,uBAEV,uBAAGvC,UAAU,qBAEf,4BAAKL,EAAK,mBAEZ,kBAAC2rB,GAAA,EAAD,CAAU+uB,WAAW,WAAWC,YAAY,yBC9BlD,MAAMC,GAAwC,CAC5CC,MAAM,EACNC,WAAW,EACXC,IAAI,EACJC,SAAS,EACT1kC,MAAM,EACN2kC,WAAW,EACX5kC,OAAO,EACP6kC,YAAY,EACZ,KAAK,EACLC,QAAQ,EACRC,UAAU,EACVC,KAAK,EACLC,MAAM,EACNC,KAAK,GAGDzsC,GAAkB5M,IACtBA,EAAE4M,kBAGJ,SAAS0sC,GAA4Bt5C,GAC/B04C,GAAa14C,EAAE1B,MACjBsO,GAAe5M,GAIZ,SAASu5C,KAEd5gD,SAASoJ,iBAAiB,QAAS6K,GAAgB,CAAE4sC,SAAS,IAC9DnjD,OAAOojD,YAAc7sC,GACrBjU,SAAS+gD,UAAYJ,GAGhB,SAASK,KACdhhD,SAASqJ,oBAAoB,QAAS4K,IAEtCvW,OAAOojD,YAAc,KAErB9gD,SAAS+gD,UAAY,K,uBCkCvB,SAASE,GAAaC,EAAuBC,GAC3C,OAAID,EACK,4BAGLC,EACK,wBAGF,O,8BC8DMC,OA7F0B,EACvCz5C,SACA7L,UACAulD,SACAC,aACAC,gBACAC,WACAC,UACAC,SACAC,WACAt6B,YACAu6B,aACAC,iBACAC,mBACAC,UACAC,cACAC,YACAC,UACAC,SACAC,QACAt7B,UACAvgB,YACA0hB,WACAo6B,gBACAC,kBACAl3B,WACAm3B,SACAC,eACAh2C,UACAi2C,sBACAC,iBAEAx7C,YAAU,KACR2S,YApCuB,MAqCtB,CAAClS,IAEJ,MAAMg7C,ED5ED,SACL7mD,EAAqB8mD,EAA0BF,GAE/C,MAAM3e,EAAwB,GACxBp7B,EAAOk6C,YAAe/mD,GACtBU,EAAQka,YAAgB5a,GACxB4oC,EAAY79B,YAAoB/K,EAAS,UACzCqlD,EAAmB3kD,GAASkoC,GAAaoe,KACzCC,EAAYrlD,OAAOslD,eAezB,GAbI7B,GACFpd,EAAQ3gB,KAAK,CACX2W,MAAO,yBACPoe,QAAS,KACP8K,KAAkBve,EAAWpsB,iBAAeC,SAAS8lB,KAAK6kB,MAEtDN,GACFA,OAMJj6C,EAAM,CAER,MAAMu4C,EAAetkD,QACnBmmD,GACGA,EAAUI,YACVJ,EAAUI,WAAWC,YACpBL,EAAUI,WAAWC,WAA2BlgD,QAAQ,4BACD,KAAxD6/C,EAAU/uC,WAAWwP,QAAQ,kBAAmB,KAGrDugB,EAAQ3gB,KAAK,CACX2W,MAAOknB,GAAaC,EAAcC,GAClChJ,QAAS,KACP,MAAMkL,EAAgBnC,GAAgB6B,EAAYA,EAAU/uC,WAAarL,EACzE26C,aAAoBD,GAEhBT,GACFA,OAmBR,OAbIF,GACF3e,EAAQ3gB,KAAK,CACX2W,MAAO,gCACPoe,QAAS,KACPuK,IAEIE,GACFA,OAMD7e,ECiBawf,CAAsBznD,EAAS0Q,EAASw1C,EAAcU,OAAa57C,GAEjF08C,EAAoBt+C,YAAY,IAC7BlF,SAASmB,cAAe,+CAA8CrF,EAAQqH,QACpF,CAACrH,EAAQqH,KAENsgD,EAAiBv+C,YACrB,IAAMlF,SAASmB,cAAc,0BAC7B,IAGIuiD,EAAiBx+C,YACrB,IAAMlF,SAASmB,cAAc,+BAC7B,KAGI,UAAEgH,EAAF,UAAaw7C,EAAb,MAAwBrjD,GAAUsjD,aACtCvC,EACAmC,EACAC,EACAC,EA1DoB,GA4DnB1jD,SAASmB,cAAc,iBAAiCmC,cAGrD6B,EAAOC,cAEb,OACE,kBAACy+C,GAAA,EAAD,CACEl8C,OAAQA,EACRQ,UAAWA,EACXw7C,UAAWA,EACXrjD,MAAOA,EACPkF,UAAU,2BACVgH,QAASA,EACTi2C,oBAAqBA,GAEpBnB,GAAc,kBAACl5C,EAAA,EAAD,CAAUC,KAAK,eAAe5C,QAAS88C,GAASp9C,EAAK,wBACnEo8C,GAAiB,kBAACn5C,EAAA,EAAD,CAAUC,KAAK,WAAW5C,QAAS+8C,GAAer9C,EAAK,4BACxEq8C,GAAY,kBAACp5C,EAAA,EAAD,CAAUC,KAAK,QAAQ5C,QAASy8C,GAAU/8C,EAAK,UAC3Ds8C,GAAW,kBAACr5C,EAAA,EAAD,CAAUC,KAAK,OAAO5C,QAAS08C,GAASh9C,EAAK,SACxD08C,GAAkB,kBAACz5C,EAAA,EAAD,CAAUC,KAAK,WAAW5C,QAAS48C,GAAgBl9C,EAAK,mBAC1E28C,GACC,kBAAC15C,EAAA,EAAD,CAAUC,KAAK,WAAW5C,QAAS68C,GAAkBn9C,EAAK,iCAE3D48C,GAAWY,EAAYpkC,IAAKwlB,GAC3B,kBAAC37B,EAAA,EAAD,CAAUzC,IAAKo+B,EAAQhK,MAAO1xB,KAAK,OAAO5C,QAASs+B,EAAQoU,SAAUhzC,EAAK4+B,EAAQhK,SAEnF2nB,GAAU,kBAACt5C,EAAA,EAAD,CAAUC,KAAK,MAAM5C,QAAS28C,GAAQj9C,EAAK,cACrDw8C,GAAY,kBAACv5C,EAAA,EAAD,CAAUC,KAAK,QAAQ5C,QAASqhB,GAAU3hB,EAAK,gBAC3Dy8C,GAAc,kBAACx5C,EAAA,EAAD,CAAUC,KAAK,UAAU5C,QAASc,GAAYpB,EAAK,YACjE88C,GAAa,kBAAC75C,EAAA,EAAD,CAAUC,KAAK,SAAS5C,QAAS2lB,GAAWjmB,EAAK,kBAC9DkiB,GAAa,kBAACjf,EAAA,EAAD,CAAUkgB,aAAW,EAACjgB,KAAK,SAAS5C,QAASwiB,GAAW9iB,EAAK,aCmIlE8G,mBAAKhI,YAClB,CAACC,GAAUpI,UAASsrB,sBAClB,MAAM,SAAEpS,GAAa6P,YAAyB3gB,IAAW,IACnD,UACJ4/C,EADI,SAEJtC,EAFI,OAGJE,EAHI,SAIJC,EAJI,UAKJt6B,EALI,QAMJo6B,EANI,WAOJG,EAPI,eAQJC,EARI,iBASJC,EATI,QAUJC,EAVI,YAWJC,EAXI,UAYJC,GACGjtC,GAAY+P,YAA4B7gB,EAAQpI,EAASkZ,IAAc,GACtEyT,EAA+B,WAApBrB,EACX28B,EAAkC,cAApB38B,EAEpB,MAAO,CACL08B,YACAxC,WAAYyC,EACZxC,cAAewC,EACfvC,UAAW/4B,IAAas7B,GAAevC,EACvCE,QAASqC,GAAerC,EACxBC,UAAWoC,GAAepC,EAC1Bt6B,YACAo6B,SAAUh5B,GAAYg5B,EACtBG,YAAamC,GAAenC,EAC5BC,gBAAiBkC,GAAelC,EAChCC,kBAAmBiC,GAAejC,EAClCC,UACAC,aAAc+B,GAAe/B,EAC7BC,cAGJ,CAACr9C,EAAWC,IAA2BC,YAAKD,EAAS,CACnD,kBACA,eACA,aACA,kBACA,cACA,gBACA,yBACA,wBACA,oBACA,oBA/CgBZ,CAzNoD,EACtE0D,SACAyf,kBACAtrB,UACAypB,QACA87B,SACA70C,UACAi2C,sBACAqB,YACAxC,aACAC,gBACAC,WACAE,SACAC,WACAt6B,YACAo6B,UACAG,aACAC,iBACAC,mBACAC,UACAC,cACAC,YACA+B,kBACAC,eACA19B,aACAjQ,kBACA4tC,cACAC,gBACAC,yBACAC,wBACAC,oBACAC,sBAEA,MAAM,qBAAE/1C,GAAyBE,YAAkB/G,EAAQ86C,OAAqB37C,GAAW,IACpF09C,EAAYC,GAAiB99C,aAAS,IACtCghB,EAAmB+8B,GAAwB/9C,aAAS,IACpDg+C,EAAgBC,GAAqBj+C,aAAS,IAC9Ck+C,EAAgBC,EAAcC,GAAiBj9B,eAEhDgB,EAAe5jB,YAAY,KAC/Bu/C,GAAc,GACdC,GAAqB,IACpB,IAEGM,EAAY9/C,YAAY,KAC5Bu/C,GAAc,GACdj4C,KACC,CAACA,IAEEqb,EAAmB3iB,YAAY,KACnCw/C,GAAqB,GACrBl4C,KACC,CAACA,IAEEy4C,EAAgB//C,YAAY,KAChC0/C,GAAkB,GAClBp4C,KACC,CAACA,IAEE04C,EAAsBhgD,YAAY,KACtC6/C,IACAv4C,KACC,CAACu4C,EAAev4C,IAEb24C,EAAcjgD,YAAY,KAC9B8+C,EAAgB,CAAE5/C,UAAWtI,EAAQqH,KACrC6hD,KACC,CAAChB,EAAiBloD,EAAQqH,GAAI6hD,IAE3BI,EAAalgD,YAAY,KAC7B++C,EAAa,CAAE7/C,UAAWtI,EAAQqH,KAClC6hD,KACC,CAACf,EAAcnoD,EAAQqH,GAAI6hD,IAExBK,EAAYngD,YAAY,KAC5Bu/C,GAAc,GACdG,GAAkB,IACjB,IAEGU,EAAcpgD,YAAY,KAC9BqhB,EAAW,CAAEniB,UAAWtI,EAAQqH,GAAIsjB,SAAS,IAC7Cu+B,KACC,CAACz+B,EAAYzqB,EAAQqH,GAAI6hD,IAEtBxqC,EAAgBtV,YAAY,KAEhC,GADA8/C,IACIz/B,GAASA,EAAMI,SAAU,CAC3B,MAAMjO,EAAa6N,EAAMI,SAASpH,IAAI,EAAGpb,QAASA,GAClDmT,EAAgB,CAAEmE,WAAY3e,EAAQqI,OAAQuT,oBAE9CpB,EAAgB,CAAEmE,WAAY3e,EAAQqI,OAAQuT,WAAY,CAAC5b,EAAQqH,OAEpE,CAACmT,EAAiBxa,EAASkpD,EAAWz/B,IAEnCggC,GAAoBrgD,YAAY,KACpC8/C,IACAd,EAAY,CAAEjf,QAASnpC,EAAQi2B,QAAQkT,WACtC,CAAC+f,EAAWlpD,EAAQi2B,QAAQkT,QAASif,IAElCsB,GAAsBtgD,YAAY,KACtC8/C,IACAb,EAAc,CAAElf,QAASnpC,EAAQi2B,QAAQkT,WACxC,CAAC+f,EAAWlpD,EAAQi2B,QAAQkT,QAASkf,IAElCsB,GAAsBvgD,YAAY,KACtC,MAAMwgD,EAASngC,GAASA,EAAMI,SAC1B,CACAvhB,UAAWtI,EAAQqH,GACnBwiD,gBAAiBpgC,EAAMI,SAASpH,IAAI,EAAGpb,QAASA,GAChDyiD,WAAW,GAEX,CAAExhD,UAAWtI,EAAQqH,GAAIyiD,WAAW,GAExCxB,EAAuBsB,GACvBV,KACC,CAACA,EAAWlpD,EAAQqH,GAAIihD,EAAwB7+B,IAE7CsgC,GAA6B3gD,YAAY,KAC7Cm/C,EAAsB,CAAElgD,OAAQrI,EAAQqI,OAAQhB,GAAIrH,EAAQqH,KAC5D6hD,KACC,CAACA,EAAWlpD,EAAQqI,OAAQrI,EAAQqH,GAAIkhD,IAErCyB,GAAqB5gD,YAAY,KACrCu/C,GAAc,GACdK,KACC,CAACA,IAEEiB,GAA0B7gD,YAAae,IAC3Cq+C,EAAkB,CAChBngD,OAAQrI,EAAQqI,OAChBC,UAAWtI,EAAQqH,GACnB6iD,YAAa9mD,KAAK2I,MAAM5B,EAAKyd,UAAY,QAE1C,CAAC5nB,EAAQqI,OAAQrI,EAAQqH,GAAImhD,IAE1B2B,GAAiB/gD,YAAY,KACjCq/C,EAAgB,CACdngD,UAAWtI,EAAQqH,GACnBgB,OAAQrI,EAAQqI,SAElB6gD,KACC,CAACA,EAAWT,EAAiBzoD,EAAQqI,OAAQrI,EAAQqH,KAQxD,GANA+D,YAAU,KACR05C,KAEOI,IACN,IAEC8C,EAGF,YAFAkB,IAKF,MAAMkB,GAAmB,IAAIvlC,KAG7B,OAFAulC,GAAiBpjC,YAAYojC,GAAiBrlC,cAAgB,GAG5D,yBAAKrb,UAAW,CAAC,uBAAwBgJ,GAAsB8B,KAAK,MAClE,kBAAC,GAAD,CACExU,QAASA,EACT6L,OAAQ68C,EACRnD,OAAQA,EACRC,WAAYA,EACZC,cAAeA,EACfC,SAAUA,EACVn6B,UAAWA,EACXq6B,OAAQA,EACRC,SAAUA,EACVF,QAASA,EACTG,WAAYA,EACZC,eAAgBA,EAChBC,iBAAkBA,EAClBC,QAASA,EACTC,YAAaA,EACbC,UAAWA,EACXC,QAASiD,EACThD,OAAQiD,EACRhD,MAAOiD,EACPv+B,QAASw+B,EACT/+C,UAAWiU,EACXyN,SAAUa,EACVu5B,cAAekD,GACfjD,gBAAiBkD,GACjBp6B,SAAUq6B,GACVlD,OAAQsD,GACRrD,aAAcsD,GACdt5C,QAASw4C,EACTtC,WAAYuD,KAEd,kBAAC,GAAD,CACEt+C,OAAQggB,EACR/C,WAAgC,cAApBwC,EACZ5a,QAASqb,EACTtC,MAAOA,EACPzpB,QAASA,IAEX,kBAAC,GAAD,CACE6L,OAAQg9C,EACRvgD,UAAWtI,EAAQqH,GACnBgB,OAAQrI,EAAQqI,OAChBqI,QAASy4C,IAEX,kBAAC,GAAD,CACEt9C,OAAQk9C,EACRrjC,gBAAc,EACdJ,WAA2B,IAAftlB,EAAQmK,KACpBob,MAAO8kC,YAAcD,IACrB5kC,cAAY,EACZ9U,QAAS04C,EACTvjC,SAAUokC,S,OCnJH95C,mBAAKhI,YAClB,CAACC,GAAUmlC,kBACF,CAAE/E,WAAY8hB,aAAiBliD,EAAQmlC,EAAYgd,gBAE5D,CAACzhD,EAAWC,IAA2BC,YAAKD,EAAS,CACnD,eACA,mBACA,gBAPgBZ,CAlF+C,EACjE0D,SACA0hC,cACA/E,aACA93B,UACA85C,eACAC,mBACAC,kBAGA,MAAMpX,EAAe1iC,YAAuB,MACtCvH,EAAOC,eAGXwiC,QAASrD,GACPuD,aAAwB,CAAEC,QAASqH,EAAcqX,WAjBzB,IAiB4DC,YAAa/+C,IAErGT,YAAU,KACR,GAAIS,EAAQ,CACV,MAAM,aAAE0+C,EAAF,qBAAgBM,GAAyBtd,EAC/Cid,EAAa,CAAED,eAAcM,2BAE9B,CAACh/C,EAAQ0hC,EAAaid,IAEzB,MAAMra,EAAe/mC,YAAa+/B,IAChCA,EAAU,IACLA,EACH2hB,qBAAqB,GAGvBJ,EAAY,CAAEvhB,YACdz4B,KACC,CAACA,EAASg6C,IAEPK,EAAoB3hD,YAAY,KACpCqhD,EAAiB,CAAEF,aAAchd,EAAYgd,eAC7C75C,KACC,CAAC68B,EAAYgd,aAAc75C,EAAS+5C,IAEvC,OACE,kBAACtoC,GAAA,EAAD,CACEzY,UAAU,kBACVmC,OAAQA,EACR6E,QAASA,EACTs6C,gBAAc,EACd3nC,MAAOmlB,EAAaA,EAAWnlB,MAAQha,EAAK,uBAE3Cm/B,GAAcA,EAAW+B,SACxB,oCACE,yBAAKt2B,IAAKq/B,EAAc5pC,UAAU,0BAC/B8+B,EAAW+B,SAAS9nB,IAAK0mB,GACxB,kBAAC,GAAD,CACEA,QAASA,EACThmC,KAAM8nD,KACNxiB,oBAAqBA,EACrB9+B,QAASwmC,EACTzd,SAAUyW,MAIhB,yBAAKz/B,UAAU,kBACb,kBAACoC,EAAA,EAAD,CACE3I,KAAK,UACL+/B,OAAK,EACLl3B,MAAOw8B,EAAW0E,cAAgB,SAAW,UAC7CvjC,QAASohD,GAER1hD,EACCm/B,EAAW0E,cAAgB,iCAAmC,8BAC9D1E,EAAWlF,MACX,QAMR,kBAACvgB,GAAA,EAAD,U,iBC0EO5S,mBAAKhI,YAClB,CAACC,GAAUC,aACT,MAAMyB,EAAOnB,YAAWP,EAAQC,GAChC,OAAKyB,GAAQA,EAAKohD,aACT,GAGF,CACLphD,OACAqhD,QAASrhD,EAAKqhD,QACdlO,UAAWx0C,aAAcqB,EAAKzC,IAC9B+jD,cAAeC,YAAiBvhD,KAGpC,CAAChB,EAAWC,IAA2BC,YAAKD,EAAS,CACnD,uBACA,2BAhBgBZ,CAvImD,EACrEE,SACAwD,SACA05C,SACAn7B,YACAkhC,eACAC,YACAC,UACArF,YACAsF,WACA3hD,OACAmzC,YACAkO,UACAC,gBACAM,qBACAC,gBACAj7C,UACAi2C,sBACAiF,uBACAC,6BAEA,MAAOnD,EAAYC,GAAiB99C,aAAS,IACtCghB,EAAmB+8B,GAAwB/9C,aAAS,IACrD,EAAEgM,EAAF,EAAKC,GAAMyuC,EAEjB3yC,YAAkB/G,EAAQ86C,OAAqB37C,GAAW,GAE1D,MAAMgiB,EAAe5jB,YAAY,KAC/Bu/C,GAAc,GACdC,GAAqB,IACpB,IAEGM,EAAY9/C,YAAY,KAC5Bu/C,GAAc,GACdj4C,KACC,CAACA,IAEEqb,EAAmB3iB,YAAY,KACnCw/C,GAAqB,GACrBl4C,KACC,CAACA,IAEEo7C,EAAwB1iD,YAAY,KACxCwiD,EAAqB,CAAEvjD,SAAQ8iD,SAAUA,IACzCjC,KACC,CAAC7gD,EAAQ6gD,EAAWiC,EAASS,IAE1BG,EAAkB3iD,YAAY,KAClCsiD,IACAxC,KACC,CAACA,EAAWwC,IAETM,EAAe5iD,YAAY,KAC/BuiD,IACAzC,KACC,CAACA,EAAWyC,IAETM,EAAuB7iD,YAAY,KACvCyiD,IACA3C,KACC,CAACA,EAAW2C,IAEfzgD,YAAU,KACR05C,KAEOI,IACN,IAEH,MAAM77C,EAAOC,cAEb,OACE,kBAAC4iD,GAAA,EAAD,KACE,yBAAKxiD,UAAU,uBACb,kBAACq+C,GAAA,EAAD,CACEl8C,OAAQ68C,EACRr8C,UAAU,QACV7H,MAAQ,SAAQqS,YAAYC,OAC5BpG,QAASw4C,GAERh9C,KAAoBo/C,GACnB,kBAACh/C,EAAA,EAAD,CACEC,KAAM6d,EAAY,UAAY,QAC9BzgB,QAASoiD,GAER1iD,EAAK+gB,EAAY,YAAc,eAGnCle,KAAoBq/C,GACnB,kBAACj/C,EAAA,EAAD,CACEC,KAAK,SACL5C,QAASqiD,GAER3iD,EAAK,WAGTmiD,GACC,kBAACl/C,EAAA,EAAD,CACEC,KAAM4+C,EAAU,SAAW,OAC3BxhD,QAASmiD,GAERziD,EAAK8hD,EAAU,cAAgB,cAGnChF,GACC,kBAAC75C,EAAA,EAAD,CACEC,KAAK,SACL5C,QAASsiD,GAER5iD,EAAK,yBAGToiD,GACC,kBAACn/C,EAAA,EAAD,CACEkgB,aAAW,EACXjgB,KAAK,SACL5C,QAASqjB,GAER3jB,EAAK4zC,EACF,SACCmO,EAAgB,0BAA6BhhC,EAAY,eAAiB,sBAIpFtgB,GACC,kBAACojB,GAAA,EAAD,CACErhB,OAAQggB,EACRnb,QAASqb,EACTjiB,KAAMA,S,iBC5IlB,MAAMqiD,GAAwBzuB,YAAUtQ,GAAOA,IAAM,KAAK,GAoL3Cjd,mBAAKhI,YACjBC,IACC,MAAM0B,EAAOshB,YAAkBhjB,GAC/B,IAAK0B,EACH,MAAO,GAGT,MAAM,MAAEqnB,EAAF,QAASi7B,GAAYC,YAAwBjkD,IAAW,IACxD,WAAEqvC,EAAF,SAAcr9B,GAAagyC,GAAW,GAE5C,MAAO,CACLtiD,OACAqnB,QACAsmB,aACAr9B,aAGJ,CAACtR,EAAWC,IAA2BC,YAAKD,EAAS,CACnD,0BACA,0BACA,eACA,uBACA,yBAtBgBZ,CAlLuC,EACzD2X,WACAhW,OACAqnB,QACAsmB,aACAr9B,WACAkyC,0BACAC,0BACArjD,eACAsjD,uBACAC,2BAGA,MAAM33C,EAAWlE,YAAyB,OACnC87C,EAAcC,GAAmB9hD,YAAS,IAC1Ck+C,EAAgBC,EAAcC,GAAiBj9B,eAGtD5gB,YAAU,KACR,MAAM,eAAEwhD,GAAmBhrD,OAC3B,IAAKgrD,EACH,OAGF,MAAMC,EAAS3oD,SAASkB,eAAe,QACjCgI,EAAe,KACnB,MAAM,cAAE0/C,GAAkB5oD,SAC1B,GAAI4oD,GAAkBA,IAAkBh4C,EAASnD,QAAU,CACzD,MAAM,QAAEo7C,EAAF,OAAW5rD,GAAWyrD,EAC5BC,EAAOroD,MAAMR,UAAa,cAAa+oD,OACvCF,EAAOroD,MAAMrD,OAAYA,EAAF,KACvB+C,SAAS4oC,gBAAgBvlC,UAAYwlD,OAErCF,EAAOroD,MAAMR,UAAY,GACzB6oD,EAAOroD,MAAMrD,OAAS,IAM1B,OAFAyrD,EAAet/C,iBAAiB,SAAUF,GAEnC,KACLw/C,EAAer/C,oBAAoB,SAAUH,KAE9C,IAGHhC,YAAU,KACJtB,GAAQsQ,GAAYA,EAASlS,QAC/BgB,EAAa,CAAEb,OAAQyB,EAAKzC,GAAIiB,UAAW8R,EAASA,EAASlS,OAAS,KACtEykD,EAAgB,IAEhBA,GAAiB,IAElB,CAAC7iD,EAAMZ,EAAckR,IAGxBhP,YAAU,KACR4hD,MAAMC,KAAK/oD,SAAS+D,iBAAmC,UAAU2/B,QAASslB,IACxEA,EAAM73C,SAAWvU,QAAQgf,GAAYotC,IAAUp4C,EAASnD,WAG1Dq7C,MAAMC,KAAK/oD,SAAS+D,iBAAiC,yBAAyB2/B,QAASulB,IACrFA,EAAIC,gBAAkBttC,EAAW,QAAU,UAE5C,CAACA,IAGJ1U,YAAU,KACH0U,GACHhL,EAASnD,QAAS0P,QAEnB,CAACvB,IAEJvO,YAAgB,KACMrN,SAASmB,cAAgC,uBACjDgc,QACX,CAAC0nC,IAEJ,MAAMsE,EAAiCjkD,YAAakkD,IAClDhB,EAAwB,CAAEn7B,MAAOm8B,IAE7BA,EAASplD,QACXikD,GAAsBI,IAEvB,CAACA,EAAyBD,IAEvBiB,EAAmBnkD,YAAae,IACpCsiD,EAAqB,CAAEe,UAAWrjD,EAAKsjD,UAAY,MACnDxE,KACC,CAACA,EAAewD,IAEbiB,EAAWtkD,YAAY,KAC3B,GAAIU,GAAQsQ,EAAU,CACpB,MAAMuzC,EAAgBjB,EAAe,EACrCxjD,EAAa,CAAEb,OAAQyB,EAAKzC,GAAIiB,UAAW8R,EAASA,EAASlS,OAAS,EAAIylD,KAC1EhB,EAAgBgB,KAEjB,CAAC7jD,EAAM4iD,EAAcxjD,EAAckR,IAEhCwzC,EAAaxkD,YAAY,KAC7B,GAAIU,GAAQsQ,EAAU,CACpB,MAAMuzC,EAAgBjB,EAAe,EACrCxjD,EAAa,CAAEb,OAAQyB,EAAKzC,GAAIiB,UAAW8R,EAASA,EAASlS,OAAS,EAAIylD,KAC1EhB,EAAgBgB,KAEjB,CAAC7jD,EAAM4iD,EAAcxjD,EAAckR,IAEhC/Q,EAAOC,cAEb,OACE,yBAAKjC,GAAG,eAAeqC,UAAWoW,EAAW,SAAW,IACtD,yBAAKpW,UAAU,UACb,kBAACoC,EAAA,EAAD,CACE3I,KAAK,UACL4I,OAAK,EACLC,MAAM,cACNrC,QAAS6iD,GAET,uBAAG9iD,UAAU,qBAEf,kBAACmkD,GAAA,EAAD,CACE55C,IAAKa,EACLjF,MAAOshB,EACP7b,SAAU+3C,KAGd,yBAAK3jD,UAAU,UACb,yBAAKA,UAAU,WACZynB,EACC/W,GAAYA,EAASlS,OAClB,GAAEwkD,EAAe,QAAQjV,IACxBr9B,IAAaA,EAASlS,OACxB,aAEA,GAGF,kBAAC4D,EAAA,EAAD,CACEC,OAAK,EACL5I,KAAK,UACL6I,MAAM,cACNrC,QAASq/C,EACT/8C,UAAU,2BAEV,uBAAGvC,UAAU,oBAInB,kBAACoC,EAAA,EAAD,CACEC,OAAK,EACL5I,KAAK,UACL6I,MAAM,cACNrC,QAAS+jD,EACTr4C,UAAW+E,IAAaA,EAASlS,QAAUwkD,IAAiBtyC,EAASlS,OAAS,GAE9E,uBAAGwB,UAAU,aAEf,kBAACoC,EAAA,EAAD,CACEC,OAAK,EACL5I,KAAK,UACL6I,MAAM,cACNrC,QAASikD,EACTv4C,UAAW+E,IAAaA,EAASlS,QAA2B,IAAjBwkD,GAE3C,uBAAGhjD,UAAU,gBAGjB,kBAAC,GAAD,CACEmC,OAAQk9C,EACRtjC,YAAU,EACVE,kBAAmBtc,EAAK,cACxBqH,QAASu4C,EACTpjC,SAAU0nC,Q,iDCnNH,SAASO,GACtB5oD,EACA6oD,EACAC,EAAS,EACTC,GAAU,EACVC,GAAsB,EACtBC,GAAe,GAEf,MAAMC,EAAalpD,EAAUipD,EAAe,aAAe,aACrDE,EAAaD,EAAalpD,EAAUipD,EAAe,cAAgB,gBACnEG,EAA4C,iBAAvBP,EACvB7oD,EAAU+C,iBAA8B8lD,GACxCA,GACE,OAAE7lD,GAAWomD,EACbC,EAA2B,GACjC,IAAIC,GAAU,EAEd,IAAK,IAAInnC,EAAI,EAAGA,EAAInf,EAAQmf,IAAK,CAC/B,MAAM5f,EAAU6mD,EAAYjnC,GACtBonC,EAAKhnD,EAAQ0mD,EAAe,aAAe,aAC3CO,EAAKD,EAAKhnD,EAAQ0mD,EAAe,cAAgB,gBAKvD,GAJkBD,EACdQ,GAAMN,EAAaJ,GAAUU,GAAML,EAAaL,EAChDS,GAAMJ,EAAaL,GAAUU,GAAMN,EAAaJ,EAGlDO,EAAejnC,KAAKD,GACpBmnC,GAAU,OACL,GAAIA,IAAYP,EACrB,MAIJ,MAAO,CAAEK,cAAaC,kBCzBTI,OARf,SAAwBzpD,EAAwBuC,EAAsB0mD,GAAe,GACnF,MAAMC,EAAalpD,EAAUipD,EAAe,aAAe,aACrDE,EAAaD,EAAalpD,EAAUipD,EAAe,cAAgB,gBACnEM,EAAKhnD,EAAQ0mD,EAAe,aAAe,aAC3CO,EAAKD,EAAKhnD,EAAQ0mD,EAAe,cAAgB,gBACvD,OAAOM,EAAKL,GAAcM,EAAKL,G,2BC6JlBl+C,mBA3GsB,EACnCtE,SACAqV,SACAxQ,UACAk+C,mBACAphC,YACAqhC,0BAGA,MAAMvb,EAAe1iC,YAAuB,OACtC,aAAE4B,EAAF,qBAAgBE,GAAyBE,YAAkB/G,OAAQb,OAAWA,GAAW,GAEzF8jD,EAAmB1lD,YAAa2lD,IACpC,IAAKF,EACH,OAAQ,EAEV,MAAM/T,EAAe+T,EAAqB3mD,OAC1C,OAAO8mD,aAAclU,EAAciU,IAClC,CAACF,KAEGI,EAAsBC,GAA2BrkD,aAAU,GAE5DskD,EAAiB/lD,YAAY,CAACyG,EAAetE,KACjDA,EAAE4M,iBACF+2C,EAAyBjwC,GAAW6vC,EAAiB7vC,EAAQpP,KAC5D,CAACq/C,EAAyBJ,IAEvBM,EAAmBhmD,YAAY,CAACyZ,EAAgBwsC,GAAa,KACjE,MAAMtlD,EAAOyjB,GAAaA,EAAU3K,GAC/B9Y,GAIL6kD,EAAiB7kD,EAAMslD,IACtB,CAAC7hC,EAAWohC,IAETU,EAAsBlmD,YAAamC,IACvC,GAAIsjD,GAAuBA,EAAoB3mD,QAAU+mD,GAAwB,EAAG,CAClF,MAAMM,EAASV,EAAoBI,GAC/BM,IACFhkD,EAAE4M,iBACFi3C,EAAiBG,EAAO1sC,QAAQ,MAGnC,CAACgsC,EAAqBI,EAAsBG,IAE/ChkD,YAAU,IAAOS,EAASogB,aAAyB,CACjDG,MAAO1b,EACP8+C,KAAOjkD,GAAqB4jD,GAAgB,EAAG5jD,GAC/CkkD,OAASlkD,GAAqB4jD,EAAe,EAAG5jD,GAChDye,QAASslC,EACTI,MAAOJ,SACJtkD,EAAY,CAACa,EAAQ6E,EAASy+C,EAAgBG,IAEnDlkD,YAAU,KACJyjD,IAAwBA,EAAoB3mD,QAC9CwI,KAED,CAACm+C,EAAqBn+C,IAEzBtF,YAAU,KACR8jD,EAAwB,IACvB,CAAChuC,IAEJ9V,YAAU,MAhGZ,SAAwB6T,EAAeq0B,GACrC,MAAMpuC,EAAYouC,EAAa3hC,QAC/B,IAAKzM,GAAa+Z,EAAQ,EACxB,OAEF,MAAM,eAAEsvC,EAAF,YAAkBD,GAAgBR,GACtC5oD,EACA,uBAVoB,GAYpB,GACA,GAEF,IAAKopD,EAAYpmD,SAAWomD,EAAYrvC,GACtC,OAEF,MAAM0wC,EAAQpB,EAAe,GAC7B,IAAKA,EAAexrD,SAASkc,IACvBA,IAAU0wC,IAAUhB,GAAezpD,EAAWopD,EAAYqB,IAAU,CACxE,MAAMC,EAAW3wC,EAAQsvC,EAAeA,EAAermD,OAAS,GAAK,QAAU,MAC/E2nD,aAAiB3qD,EAAWopD,EAAYrvC,GAAQ2wC,EArB9B,KAmGlBE,CAAeb,EAAsB3b,IACpC,CAAC2b,IAEJ,MAAMc,EAAkBl7C,YACtBg6C,GAAuBA,EAAoB3mD,OACvC2mD,OACA7jD,EACJwH,GAEIw9C,EAAsBnB,IAAwBA,EAAoB3mD,OACpE6nD,EACAlB,EAEJ,IAAKr8C,GAAiBw9C,IAAwBA,EAAoB9nD,OAChE,OAGF,MAAMwB,EAAY0L,aAChB,gDACA1C,GAGF,OACE,yBAAKhJ,UAAWA,EAAWuK,IAAKq/B,GAC7B0c,GAAuBA,EAAoBvtC,IAAI,EAAGI,UAAU5D,IAC3D,kBAACyD,GAAA,EAAD,CACE7Y,IAAKgZ,EACLnZ,UAAU,kCACVC,QAAS,IAAMylD,EAAiBvsC,GAChCzB,MAAO6tC,IAAyBhwC,GAEhC,kBAAC0D,GAAA,EAAD,CACEE,OAAQA,EACRoK,WAAW,QACXJ,cAAY,S,iBC+FT1c,mBA/MuB,EACpC8/C,cACAC,UACAC,oBACAC,mBACA1vC,gBACA8M,YACA6iC,eACAC,kBACAC,iBACA9J,SACA+J,eACAC,cAGA,MAAMC,EAAiB9/C,YAAe,MAChC+/C,EAAkB97C,YAAYo7C,GAC9BW,EAAuBX,EAAY/nD,OAAS+nD,EAAcU,EAC1D9kD,EAAS/K,QAAQmvD,EAAY/nD,SAC5B2oD,EAAWC,EAAaC,GAAiB/kC,eAC1CglC,EAAUJ,GAAwBA,EAAqBK,MAAOl/B,GAAMA,EAAEm/B,OACtE7nD,EAAOC,eAEP,qBACJ6nD,EADI,cACkBC,EADlB,oBAEJC,EAFI,cAEiBC,EAFjB,uBAGJC,GACEC,aACFrB,GAAqBtkD,EACrBqkD,EACAI,EACAmB,IACArB,EACA1vC,EACA8M,IAEI,mBACJkkC,EADI,kBACgBC,EADhB,eACmCC,EADnC,YACmDC,GACrDC,aACFjmD,EACAqkD,EACAG,EACAoB,IACAnB,GAGFllD,YAAU,IAAOS,EAAS+S,YAAsB6xC,QAAWzlD,EAAY,CAACa,EAAQ4kD,IAEhF,MAAMsB,EAAkB3oD,YAAY,KAC9ByC,GACF46C,KAED,CAAC56C,EAAQ46C,IAsBNuL,EAAkB5oD,YAAamC,IACnCA,EAAE4M,iBACF44C,IAEA,MAAQkB,cAAc,MAAEhhB,IAAY1lC,EAEpC,GAAI0lC,GAASA,EAAM/oC,OAAQ,CACzB,MAAMgqD,EAAWlB,EACbhE,MAAMC,KAAKhc,GAAO/vB,OAAQixC,GACnBA,EAAKxiD,MAAQyiD,IAA+BrvD,SAASovD,EAAKxiD,OAEjEq9C,MAAMC,KAAKhc,GAEfuf,EAAa0B,GAAU,KAExB,CAAClB,EAASR,EAAcO,IAW3B,IAAKH,EACH,OAGF,MAAMyB,EAAezB,EAAqBK,MAAOl/B,GAAMA,EAAEugC,SAAS11C,WAAW,WACvE21C,EAAe3B,EAAqBK,MAAOl/B,GAAMA,EAAEugC,SAAS11C,WAAW,WAE7E,IAAIyG,EAAQ,GAgCZ,OA9BEA,EAAQha,EADNgpD,EACW,0BACJE,EACI,0BAEA,yBAJ2B3B,EAAqB1oD,OAAQ,KA+BrE,kBAACia,GAAA,EAAD,CACEtW,OAAQA,EACR6E,QAAS+/C,EACTruC,OA3BJ,WACE,GAAKwuC,EAIL,OACE,yBAAKlnD,UAAU,0BACb,kBAACoC,EAAA,EAAD,CAAQC,OAAK,EAACC,MAAM,cAAc7I,KAAK,UAAU8I,UAAU,qBAAqBtC,QAAS8mD,GACvF,uBAAG/mD,UAAU,gBAEf,yBAAKA,UAAU,eAAe2Z,GAC9B,kBAACvX,EAAA,EAAD,CACEE,MAAM,UACN7I,KAAK,UACLuG,UAAU,sBACVC,QAASooD,GAER1oD,EAAK,UAUFmpD,GACR9oD,UAAY,oBAAkBmnD,EAAY,UAAY,KAEtD,yBACEnnD,UAAU,cACV+oD,YAAa3B,EACb4B,OAAQV,EACRW,WA3DN,SAAwBpnD,GACtBA,EAAE4M,iBACF5M,EAAEC,kBAEEklD,EAAe/+C,SACjB/P,OAAOwN,aAAashD,EAAe/+C,UAuDjCihD,YAjGmBrnD,IACvB,MAAQsnD,cAAeC,EAAUp/C,OAAQq/C,GAAexnD,EAGnDwnD,EAA8B/wD,QAAQ,kBAAoB8wD,IAC7DpC,EAAe/+C,QAAU/P,OAAOiD,WAAWksD,EA7DnB,MAiEtBgC,GAAeA,EAA2B3rD,QAAQ,8BAIlD0rD,GACFvnD,EAAEC,kBAGJulD,MAiFIiC,0BAAyB3pD,EAAK,4BAA6B,KAE1D2nD,EACC,yBAAKtnD,UAAU,+BACZknD,EAAqBnuC,IAAKwwC,GACzBA,EAAWX,SAAS11C,WAAW,UAC3B,yBAAKjW,IAAKssD,EAAWr6C,QAASG,IAAI,KAClC,2BAAOpS,IAAKssD,EAAWr6C,QAAS1E,UAAQ,EAACG,OAAK,EAACD,MAAI,MAI3D,yBAAK1K,UAAU,kCACZknD,EAAqBnuC,IAAKwwC,GACzB,kBAACC,GAAA,EAAD,CACE9yC,KAAM6yC,EAAWE,SACjBC,UAAWC,aAAiBJ,EAAWE,SAAUF,EAAWX,UAC5DgB,YAAaL,EAAWvpB,eACxBvmC,KAAM8vD,EAAW9vD,KACjBoxB,SAAO,MAMf,yBAAK7qB,UAAU,8BACb,kBAAC,GAAD,CACEmC,OAAQslD,EACRzgD,QAAS2gD,EACTnwC,OAAQkwC,EACRxC,iBAAkB0C,EAClBzC,oBAAqB0C,EACrB/jC,UAAWA,IAEb,kBAAC,KAAD,CACE3hB,OAAQ6lD,EACR6B,OAAQ3B,EACRlhD,QAASihD,EACT6B,cAAe3B,EACftB,eAAgBA,IAElB,kBAACkD,GAAA,EAAD,CACEpsD,GAAG,qBACHqsD,KAAMxD,EACNyD,gBAAiBlC,IACjBvvC,YAAa7Y,EAAK,WAClBuqD,SAAUtD,EACV7J,OAAQA,EACRoN,eAAgBhoD,S,iBC6GbsE,mBA/TiB,EAAGtE,SAAQ46C,SAAQgK,cAEjD,MAAMqD,EAAmBljD,YAAyB,MAE5CmjD,EAAiBnjD,YAAuB,MAExCojD,EAAcpjD,YAAuB,OAEpCqjD,EAAUC,GAAerpD,YAAiB,KAC1Co9B,EAASksB,GAActpD,YAAmB,CAAC,MAC3CupD,EAAaC,GAAkBxpD,aAAS,IACxCypD,EAAmBC,GAAwB1pD,aAAS,IACpD2pD,EAAYC,GAAiB5pD,aAAS,IACtC6pD,EAAUC,GAAe9pD,eACzB+pD,EAAeC,GAAoBhqD,eACnCiqD,EAAWC,GAAgBlqD,aAAkB,GAE9CxB,EAAOC,cAEP0rD,EAAa5rD,YAAa6K,IAC1BpI,GAAUoI,EAAItC,SAChBsC,EAAItC,QAAQyP,SAEb,CAACvV,IAEJT,YAAU,IAAOS,EAAS+S,YAAsB6xC,QAAWzlD,EAAY,CAACa,EAAQ4kD,IAChFrlD,YAAU,KACHS,IACHqoD,EAAY,IACZC,EAAW,CAAC,KACZE,GAAe,GACfE,GAAqB,GACrBE,GAAc,GACdE,EAAY,IACZE,EAAiB,IACjBE,GAAa,KAEd,CAAClpD,IAEJT,YAAU,IAAM4pD,EAAWlB,GAAmB,CAACkB,EAAYnpD,IAE3D0F,YAAgB,KACd,MAAM0jD,EAAajB,EAAYriD,QAE3BsjD,GAAcP,IAAaO,EAAWC,YACxCD,EAAWC,UAAYR,IAExB,CAACA,IAEJ,MAAMS,EAAe/rD,YAAY,CAACgsD,EAAuB,MACvDjB,EAAW,IAAIiB,EAAY,KAC3B9wD,sBAAsB,KACpB,MAAM+wD,EAAOtB,EAAepiD,QACvB0jD,IAILA,EAAKjxD,UAAUkZ,OAAO,YAAa+3C,EAAKC,aA/DtB,KAgElBD,EAAKE,SAAS,CAAEpzD,IAAKkzD,EAAKC,aAAcE,SAAU,eAEnD,IAEGC,EAAersD,YAAY,KAE/B,GADA2rD,GAAa,IACRlpD,EACH,OAGF,MAAM6pD,EAAkBzB,EAAS11B,OAAO6P,UAAU,EAvE1B,KAwElBunB,EAAiB1tB,EAAQxlB,IAAKmzC,GAAMA,EAAEr3B,OAAO6P,UAAU,EAzEvC,MAyE8DltB,OAAQ00C,GAAMA,EAAE1tD,QAEpG,IAAKwtD,GAAmBC,EAAeztD,OAAS,EAY9C,OAXAgsD,EAAYwB,GACRC,EAAeztD,OACbytD,EAAeztD,OAAS,EAC1BitD,EAAaQ,GAEbxB,EAAWwB,GAGbR,SAEFJ,GAAa,GAIf,GAAIP,KAAgBI,IAAkBe,EAAeliD,OAAOmhD,KAE1D,YADAG,GAAa,GAIf,MAOMv8B,EAAsB,CAC1Bq9B,QAAS,CACP5B,SAAUyB,EACVI,QAVYH,EACblzC,IAAI,CAAC5V,EAAMoS,KAAP,CACHpS,KAAMA,EAAK0xB,OACX+J,OAAQljB,OAAOnG,MACXmG,OAAOnG,KAAW21C,GAAiB,CAAEmB,SAAS,UAO7C3B,GAAe,CAAE4B,UAAU,MAC5B1B,GAAqB,CAAE2B,gBAAgB,MACvCzB,GAAc,CAAE0B,MAAM,KAI9B,GAAI1B,EAAY,CACd,MAAM,KAAE3nD,EAAF,SAAQspD,GAAczB,GAAY0B,aAAkB1B,EAAStmB,UAAU,EA/GvD,OA+GoF,GAE1G5V,EAAQ09B,KAAO,CACbG,eAAgB,CAACzB,MACb/nD,GAAQ,CAAE6nD,SAAU7nD,MACpBspD,GAAY,CAAEG,iBAAkBH,IAIxC1P,EAAOjuB,IACN,CACD3sB,EACAooD,EACAhsB,EACAusB,EACAI,EACAR,EACAE,EACA7N,EACA0O,EACAT,IAGI6B,EAAentD,YAAY,CAAC6V,EAAepS,KAC/C,MAAMuoD,EAAa,IAAIntB,GACvBmtB,EAAWn2C,GAASpS,EAChBuoD,EAAWA,EAAWltD,OAAS,GAAGq2B,OAAOr2B,QAAUktD,EAAWltD,OA5I5C,GA6IpBitD,EAAaC,GAEbjB,EAAWiB,IAEZ,CAACntB,EAASktB,IAEPqB,EAAeptD,YAAa6V,IAChC,MAAMm2C,EAAa,IAAIntB,GACvBmtB,EAAW/uB,OAAOpnB,EAAO,GACzBk1C,EAAWiB,GACX9wD,sBAAsB,KACfyvD,EAAepiD,SAIpBoiD,EAAepiD,QAAQvN,UAAUkZ,OAAO,YAAay2C,EAAepiD,QAAQ2jD,aA7J1D,QA+JnB,CAACrtB,IAEEwuB,EAA4BrtD,YAAa41C,IAC7C6V,EAAiB7V,IAChB,CAAC6V,IAEE6B,EAA0BttD,YAAamC,IAC3C8oD,EAAe9oD,EAAEmI,OAAOkzB,UACvB,IAEG+vB,EAA8BvtD,YAAamC,IAC/CgpD,EAAqBhpD,EAAEmI,OAAOkzB,UAC7B,IAEGgwB,EAAuBxtD,YAAamC,IACxCkpD,EAAclpD,EAAEmI,OAAOkzB,UACtB,IAEGiwB,EAAiBztD,YAAamC,IAChB,KAAdA,EAAEurD,SACJrB,KAED,CAACA,IAEEsB,EAAmB3tD,YAAY,KACnC,GAAI0rD,IAAcb,EAAS11B,OAAOr2B,OAChC,OAAOmB,EAAK,8BAIb,CAACyrD,EAAWzrD,EAAM4qD,IAEf+C,EAAkB5tD,YAAa6V,IACnC,MAAM02C,EAAiB1tB,EAAQxlB,IAAKmzC,GAAMA,EAAEr3B,QAAQrd,OAAQ00C,GAAMA,EAAE1tD,QACpE,GAAI4sD,GAAaa,EAAeztD,OAAS,IAAM+/B,EAAQhpB,GAAOsf,OAAOr2B,OACnE,OAAOmB,EAAK,6BAGb,CAACyrD,EAAWzrD,EAAM4+B,IAqBrB,SAASgvB,IACP,OAAOhvB,EAAQxlB,IAAI,CAAC6lB,EAAQrpB,IAC1B,yBAAKvV,UAAU,kBACb,kBAACuY,GAAA,EAAD,CACEgc,MAAOhf,IAAUgpB,EAAQ//B,OAAS,GA7NlB,KA6NuB+/B,EAAQ//B,OAC3CmB,EAAK,cACLA,EAAK,wBACT4Z,MAAO+zC,EAAgB/3C,GACvBpP,MAAOy4B,EACPhzB,SAAW/J,GAAMgrD,EAAat3C,EAAO1T,EAAE8H,cAAcxD,OACrDqnD,WAAYL,IAEb53C,IAAUgpB,EAAQ//B,OAAS,GAC1B,kBAAC4D,EAAA,EAAD,CACEpC,UAAU,uBACVqC,OAAK,EACLC,MAAM,cACN7I,KAAK,UACL8I,UAAW5C,EAAK,UAChBM,QAAS,IAAM6sD,EAAav3C,IAE5B,uBAAGvV,UAAU,kBAoBvB,OACE,kBAACyY,GAAA,EAAD,CAAOtW,OAAQA,EAAQ6E,QAAS+/C,EAASruC,OA3DvC,yBAAK1Y,UAAU,0BACb,kBAACoC,EAAA,EAAD,CAAQC,OAAK,EAACC,MAAM,cAAc7I,KAAK,UAAU8I,UAAU,uBAAuBtC,QAAS8mD,GACzF,uBAAG/mD,UAAU,gBAEf,yBAAKA,UAAU,eAAeL,EAAK,YACnC,kBAACyC,EAAA,EAAD,CACEE,MAAM,UACN7I,KAAK,UACLuG,UAAU,sBACVC,QAAS8rD,GAERpsD,EAAK,YAgDqDK,UAAU,aACzE,kBAACuY,GAAA,EAAD,CACEhO,IAAK6/C,EACL71B,MAAO50B,EAAK,gBACZwG,MAAOokD,EACPhxC,MAAO8zC,IACPzhD,SAAW/J,GAAM2oD,EAAY3oD,EAAE8H,cAAcxD,OAC7CqnD,WAAYL,IAEd,yBAAKntD,UAAU,oBAEf,yBAAKA,UAAU,6BAA6BuK,IAAK8/C,GAC/C,wBAAIrqD,UAAU,kBAAd,WAECorD,GAvBP,WACE,MAAMa,EAAiB1tB,EAAQxlB,IAAKmzC,GAAMA,EAAEr3B,QAAQrd,OAAQ00C,GAAMA,EAAE1tD,QAEpE,OAAOssD,KAAgBI,IAAkBe,EAAeliD,OAAOmhD,MAC7D,uBAAGlrD,UAAU,SAASL,EAAK,6BAmBX8tD,GACb3C,EACC,kBAACrnB,GAAA,EAAD,CACE/sB,KAAK,gBACL6nB,QA/BDgvB,IACJx0C,IAAI,CAACwb,EAAOhf,KAAR,CAAqBpP,MAAOuV,OAAOnG,GAAQgf,QAAOm5B,OAAQn4C,IAAUgpB,EAAQ//B,OAAS,KA+BpFoN,SAAUmhD,IAGZQ,KAKJ,yBAAKvtD,UAAU,oBAEf,yBAAKA,UAAU,aACb,kBAACi9B,GAAA,EAAD,CACE1I,MAAO50B,EAAK,iBACZu9B,QAASwtB,EACT9+C,SAAUohD,IAEZ,kBAAC/vB,GAAA,EAAD,CACE1I,MAAO50B,EAAK,gBACZu9B,QAAS0tB,EACTj/C,SAAUm/C,EACVl/C,SAAUqhD,IAEZ,kBAAChwB,GAAA,EAAD,CACE1I,MAAO50B,EAAK,YACZu9B,QAAS4tB,EACTn/C,SAAUi/C,EACVh/C,SAAUshD,IAEXpC,GACC,oCACE,wBAAI9qD,UAAU,kBAAd,YACA,yBACEuK,IAAK+/C,EACLtqD,UAAU,eACV0jD,iBAAe,EACfpjD,IAAI,OACJsL,SAAW/J,GAAMopD,EAAYppD,EAAE8H,cAAc6hD,aAE/C,yBAAKxrD,UAAU,QAAQL,EAAK,oCCjVxC,IAAIguD,GAEW,SAASC,GACtBzrD,EAAiB6E,EAA6B6mD,EAJrB,KAMzB,MAAMC,EAAgB5mD,aAAO,GAE7BxF,YAAU,KACJisD,KACFjoD,aAAaioD,IACbA,QAAersD,GAGba,IAAWiF,MACbumD,GAAez1D,OAAOiD,WAAW,KAC1B2yD,EAAc7lD,SACjBjB,KAEkB,EAAnB6mD,KAEJ,CAAC1rD,EAAQ0rD,EAAkB7mD,IAqB9B,MAAO,CAnBkBtH,YAAY,KACnCouD,EAAc7lD,SAAU,GACvB,IAEsBvI,YAAY,KACnCouD,EAAc7lD,SAAU,EAEpB0lD,KACFjoD,aAAaioD,IACbA,QAAersD,GAGjBqsD,GAAez1D,OAAOiD,WAAW,KAC1B2yD,EAAc7lD,SACjBjB,KAED6mD,IACF,CAACA,EAAkB7mD,K,8BCdTP,mBAlBmB,EAAGi6B,QAAOhpB,QAAOzX,cACjD,MAAMykB,EAAchlB,YAAY,KAC9BO,EAAQygC,EAAMqtB,OAAQrtB,EAAM/iC,KAC3B,CAAC+iC,EAAOzgC,IAEX,OACE,yBACED,UAAY,gBAAc0X,EAAQ,QAAU,IAC5CzX,QAASykB,EACT/K,MAAQ,IAAG+mB,EAAMstB,MAAM,OAEtBC,IACG,0BAAMjuD,UAAU,cAAc0gC,EAAMqtB,QACpC,yBAAK9wD,IAAM,kBAAiByjC,EAAM1yB,YAAaqB,IAAI,GAAG6+C,QAAQ,YCmDzDznD,mBAnDqB,EAClC0nD,WAAU54C,QAAO64C,YAAWrvB,sBAAqBj2B,eAAcghD,oBAG/D,MAAMv/C,EAAMrD,YAAuB,MAEnCmnD,aAAe9jD,EAAKw0B,GAEpB,MAAM,qBAAE/1B,GAAyBE,YAAkBJ,OAAcxH,OAAWA,EAAW,QAEjF3B,EAAOC,cAEP0uD,EAAe9rD,IACjB9I,KAAK4K,OAAO1N,IAAWC,MAAMH,MAzBF,GAyBhB,IA3BiB,EA6B1Be,EAAS,GAAAiC,KAAK60D,KAAKJ,EAAStE,OAAOrrD,OAAS8vD,GAElD,OACE,yBACE/jD,IAAKA,EACLpK,IAAKguD,EAASxwD,GACdA,GAAK,kBAAiB4X,EACtBvV,UAAU,cAEV,uBAAGA,UAAU,kBAAkBM,IAAI,QAChCX,EAAqB,WAAhBwuD,EAASxwD,GAAkB,iBAAoB,QAAO4X,IAE9D,yBACEvV,UAAW0L,aAAe,uBAAwB1C,GAElDlO,MAAQ,WAAUrD,QAEjBqR,GAAgBqlD,EAAStE,OAAO9wC,IAAKrC,IACpC,MAAMgqB,EAAQ0tB,EAAU13C,GAGlB83C,EAAiB,OAAQ9tB,EAAQA,EAAQA,EAAM,GAErD,OACE,kBAAC,GAAD,CACEvgC,IAAKquD,EAAe7wD,GACpB+iC,MAAO8tB,EACPvuD,QAAS6pD,U,OC5BvB,MAAM2E,GAA4C,CAChDC,OAAQ,cACRC,OAAQ,aACRC,OAAQ,eACRC,MAAO,YACPC,SAAU,aACVC,OAAQ,WACRC,QAAS,YACTC,QAAS,gBACTC,MAAO,aAUHC,GAAmC,GAEzC,IAAIC,GACAC,GACAC,GAoKW7oD,mBAAKhI,YACjBC,GAAuBY,YAAKZ,EAAQ,CAAC,iBADpBD,CAlK2B,EAC7CuB,YAAW8pD,gBAAenD,mBAG1B,MAAM/c,EAAe1iC,YAAuB,MAEtCqoD,EAAYroD,YAAuB,OAElCsoD,EAAYC,GAAiBtuD,eAC7B0oD,EAAQ6F,GAAavuD,eACrBwuD,EAAqBC,GAA0BzuD,YAAS,IAEvDihC,QAASrD,GAAwBuD,aAAwB,CAC/DC,QAASqH,EACTqX,WAtB0B,KAuBxB4O,IACFA,EAAQ3xB,QAAS4xB,IACf,MAAM,GAAEnyD,GAAOmyD,EAAM9lD,OACrB,IAAKrM,IAAOA,EAAGuV,WAAW,mBACxB,OAGF,MAAMqC,EAAQxL,OAAOpM,EAAGqgB,QAAQ,kBAAmB,KACnDmxC,GAAsB55C,GAASu6C,EAAM9wB,iBAGvC,MAAM+wB,EAA0BZ,GAC7Bp2C,IAAI,CAACimB,EAAgBzpB,KAAjB,CAA8BA,QAAOypB,oBACzCxnB,OAAO,EAAGwnB,oBAAqBA,GAE7B+wB,EAAwBvxD,QAI7BoxD,EAAuBG,EAAwBr2D,KAAK4K,MAAMyrD,EAAwBvxD,OAAS,IAAI+W,SAGjGkP,aAAoB8qC,GAAY/sD,KAGhCd,YAAU,KACR,IAAK8tD,EACH,OAGF,MAAM92C,EAAS62C,EAAUtnD,QACzB,IAAKyQ,EACH,OAGF,MAAMs3C,EA3DkB,GA2DRL,EAA4Cj3C,EAAOiwB,YAAc,EAAIsnB,GAErFC,aAA2Bx3C,EAAQs3C,IAClC,CAACR,EAAYG,IAEhB,MAAMhwD,EAAOC,cAEPuwD,EAAgBluD,YAAQ,KAC5B,IAAKutD,EACH,OAAO5nC,KAET,MAAMwoC,EAAkB,IAAIZ,GAS5B,OARI7I,GAAgBA,EAAanoD,QAC/B4xD,EAAgBC,QAAQ,CACtB1yD,GAAI,SACJ+Y,KAAM/W,EAAK,kBACXkqD,OAAQlD,IAILyJ,GACN,CAACZ,EAAY7vD,EAAMgnD,IAGtBjlD,YAAU,KACRvG,WAAW,KACT,MAAMm1D,EAAO,KACXb,EAAcH,GAAUE,YAExBE,EAAUJ,GAAUzF,SAGlByF,GACFgB,IAoERroB,iBACOmnB,KACHA,GAAmB,kCACnBC,UAAsBD,IAAkBmB,QAExCjB,GAAYkB,aAAgBnB,KAG9B,OAAOD,GA1EDqB,GACG53B,KAAKy3B,IAnGa,MAsGxB,IAEH,MAAMI,EAAiBhxD,YAAa6V,IAClCq6C,EAAuBr6C,GACvB,MAAMo7C,EAAan2D,SAASkB,eAAgB,kBAAiB6Z,GAC7D4wC,aAAiBvc,EAAa3hC,QAAU0oD,EAAY,QAxGnC,GADU,MA0G1B,IAEGC,EAAoBlxD,YAAY,CAACghC,EAAehqB,KACpDozC,EAAcppB,EAAOhqB,IACpB,CAACozC,IAEEtgC,EAAoBC,aAAkB,GAAIonC,KAmBhD,MAAMC,EAAqBplD,aAAe,cAAe1L,GAEzD,OAAK6pD,GAAWrgC,EASd,yBAAKxpB,UAAW8wD,GACd,yBAAKvmD,IAAKglD,EAAWvvD,UAAU,sBAC5BmwD,EAAcp3C,KA9BrB,SAA8Bo1C,EAA6B54C,GACzD,MAAM1S,EAAO4rD,GAAkBN,EAASxwD,IAExC,OAAOkF,GACL,kBAACT,EAAA,EAAD,CACEpC,UAAY,sBAAoBuV,IAAUo6C,EAAsB,YAAc,IAC9EttD,OAAK,EACL0uD,OAAK,EACLzuD,MAAM,cACNrC,QAAS,IAAMywD,EAAen7C,GAC9BhT,UAAW4rD,EAASz3C,MAEpB,uBAAG1W,UAAW6C,SAoBhB,yBAAK0H,IAAKq/B,EAAc5pC,UAAU,8CAC/BmwD,EAAcp3C,IAAI,CAACo1C,EAAUxwC,IAC5B,kBAAC,GAAD,CACEwwC,SAAUA,EACV54C,MAAOoI,EACPywC,UAAWvE,EACX9qB,oBAAqBA,EACrBj2B,aAAc6mD,GAAuBhyC,EAAI,GAAKgyC,GAAuBhyC,EAAI,EACzEmsC,cAAe8G,OAnBrB,yBAAK5wD,UAAW8wD,GACd,kBAACz3C,GAAA,EAAD,UCtKR,MACM23C,GAAiBxuD,IAAmB,EAAI,GAsD/BiE,mBAnDkB,EAC/Bq4B,aACAmyB,cACA17C,QACAwpB,sBACAj2B,eACAooD,kBACAC,sBAGA,MAAM5mD,EAAMrD,YAAuB,MAEnCmnD,aAAe9jD,EAAKw0B,GAEpB,MAAM,qBAAE/1B,GAAyBE,YAAkBJ,OAAcxH,OAAWA,EAAW,QAEjF8vD,EAAiB5uD,IACnB9I,KAAK4K,OAAO1N,IAAWC,MAAMH,MAnBF,IAmBuC26D,KAAsBL,KArB1D,EAuB5Bv5D,EAASiC,KAAK60D,KAAKzvB,EAAWlF,MAAQw3B,IAAmBC,KAAsBL,IAErF,OACE,yBACEzmD,IAAKA,EACLpK,IAAK2+B,EAAWnhC,GAChBA,GAAK,eAAc4X,EACnBvV,UAAU,cAEV,uBAAGA,UAAU,mBAAmB8+B,EAAWnlB,OAC3C,yBACE3Z,UAAW0L,aAAe,uBAAwB1C,GAElDlO,MAAQ,WAAUrD,QAEjBqR,GAAgBg2B,EAAW+B,UAAY/B,EAAW+B,SAAS9nB,IAAK0mB,GAC/D,kBAAC,GAAD,CACEt/B,IAAKs/B,EAAQ9hC,GACb8hC,QAASA,EACThmC,KAAM43D,KACNtyB,oBAAqBA,EACrBW,WAAYuxB,EACZhxD,QAASixD,EACTloC,SAAUyW,EACVE,cAAiC,aAAlBb,EAAWnhC,GAAoBwzD,OAAkB7vD,S,OCrB5E,MAIMgwD,GAAqC,GAgO5B7qD,mBAAKhI,YACjBC,IACC,MAAM,SACJ2iC,EADI,MAEJH,EAFI,OAGJwtB,EAHI,SAIJ6C,GACE7yD,EAAOmiC,SAEX,MAAO,CACL2wB,eAAgB9C,EAAO7tB,SACvB4wB,iBAAkBF,EAAS1wB,SAC3BO,gBAAiBC,EACjBqwB,YAAaxwB,EAAMC,OACnBlB,WAAYvhC,EAAOmR,SAASC,MAAMiyB,qBAGtC,CAAC3iC,EAAWC,IAA2BC,YAAKD,EAAS,CACnD,kBACA,qBACA,uBACA,oBACA,mBACA,kBAvBgBZ,CA9N6C,EAC/DuB,YACAixD,cACAU,kBACAH,iBACAC,mBACAC,cACAtwB,kBACAnB,aACAixB,kBACAjvB,kBACA2vB,qBACAC,uBACA3vB,oBACA4vB,mBACAnT,oBAGA,MAAM/U,EAAe1iC,YAAuB,MAEtCqoD,EAAYroD,YAAuB,OAClC6qD,EAAgBC,GAAqB7wD,YAAiB,IAErDihC,QAASrD,GAAwBuD,aAAwB,CAC/DC,QAASqH,EACTqX,WA7BkC,KA8BhC4O,IACFA,EAAQ3xB,QAAS4xB,IACf,MAAM,GAAEnyD,GAAOmyD,EAAM9lD,OACrB,IAAKrM,IAAOA,EAAGuV,WAAW,gBACxB,OAGF,MAAMqC,EAAQxL,OAAOpM,EAAGqgB,QAAQ,eAAgB,KAChDszC,GAAwB/7C,GAASu6C,EAAM9wB,iBAGzC,MAAM+wB,EAA0BuB,GAC7Bv4C,IAAI,CAACimB,EAAgBzpB,KAAjB,CAA8BA,QAAOypB,oBACzCxnB,OAAO,EAAGwnB,oBAAqBA,GAE7B+wB,EAAwBvxD,QAI7BwzD,EAAkBjC,EAAwBr2D,KAAK4K,MAAMyrD,EAAwBvxD,OAAS,IAAI+W,UAEpF6sB,QAASC,GAAiCC,aAAwB,CAAEC,QAASgtB,IAE/E5vD,EAAOC,cAEPqyD,EAAiB76D,QAAQs6D,GAEzBQ,EAAUjwD,YAAQ,IACjByvD,EAIE,CACL,CACE/zD,GAAI,SACJgc,MAAOha,EAAK,kBACZkhC,SAAU2wB,EACV53B,MAAO43B,EAAehzD,QAExB,CACEb,GAAI,WACJgc,MAAOha,EAAK,oBACZkhC,SAAU4wB,EACV73B,MAAO63B,EAAiBjzD,WAEvBkzD,EAAY34C,IAAKpb,GAAOyjC,EAAgBzjC,IAAK6Z,OAAOpgB,UAhBhDwwB,KAkBR,CAAC8pC,EAAa/xD,EAAM6xD,EAAgBC,EAAkBrwB,IAEnD+wB,EAAkBlwD,YAAQ,IAC9BgwD,GAC2E,IAAxEC,EAAQ16C,OAAQ46C,GAAQA,EAAIvxB,UAAYuxB,EAAIvxB,SAASriC,QAAQA,OAC/D,CAAC0zD,EAASD,IAEbvwD,YAAU,KACJuvD,IACFhvB,IACA2vB,IACAC,MAED,CAACZ,EAAaY,EAAsBD,EAAoB3vB,IAE3DvgC,YAAU,KACJgwD,GAAeA,EAAYlzD,QAC7B0jC,KAED,CAACwvB,EAAaxvB,IAEjBzd,aAAoB8qC,GAGpB7tD,YAAU,KACR,IAAKuwD,EACH,OAGF,MAAMv5C,EAAS62C,EAAUtnD,QACzB,IAAKyQ,EACH,OAGF,MAAMs3C,EAhHkB,GAgHR+B,GAAwCr5C,EAAOiwB,YAAc,EAAIsnB,IAEjFC,aAA2Bx3C,EAAQs3C,IAClC,CAACiC,EAAgBF,IAEpB,MAAMnR,EAAmBlhD,YAAa6V,IACpCy8C,EAAkBz8C,GAClB,MAAM88C,EAAe73D,SAASkB,eAAgB,eAAc6Z,GAC5D4wC,aAAiBvc,EAAa3hC,QAAUoqD,EAAc,aAAS/wD,EAzHpC,MA0H1B,IAEGgxD,EAAsB5yD,YAAa+/B,IACvCyxB,EAAgBzxB,GAChBqyB,EAAiB,CAAEryB,aAClB,CAACqyB,EAAkBZ,IAEhBqB,EAAsB7yD,YAAa+/B,IACvCkf,EAAc,CAAElf,aACf,CAACkf,IAEEn1B,EAAoBC,aAAkB,GAAIC,MAqDhD,MAAM+W,EAAgB/0B,aAAe,gBAAiB1L,GAEtD,OAAKiyD,GAAmBzoC,IAAqB2oC,GAAoBR,EAe/D,yBAAK3xD,UAAWygC,GACd,yBACEl2B,IAAKglD,EACLvvD,UAAU,kDAETkyD,EAAQn5C,KAzEf,SAAqB+lB,EAAgCvpB,GACnD,MAAMurB,EAAehC,EAAW+B,UAAY/B,EAAW+B,SAAS,GAC1DjN,EAAkBloB,aACtB,uCACA6J,IAAUw8C,GAAkB,aAG9B,MAAsB,WAAlBjzB,EAAWnhC,IAAqC,aAAlBmhC,EAAWnhC,IAAqBmhC,EAAWU,eAAiBsB,EAE1F,kBAAC1+B,EAAA,EAAD,CACEjC,IAAK2+B,EAAWnhC,GAChBqC,UAAW4zB,EACXrxB,UAAWu8B,EAAWnlB,MACtBtX,OAAK,EACL0uD,MAAyB,WAAlBjyB,EAAWnhC,IAAqC,aAAlBmhC,EAAWnhC,GAChD2E,MAAM,cACNrC,QAAS,IAAM2gD,EAAiBrrC,IAEb,WAAlBupB,EAAWnhC,GACV,uBAAGqC,UAAU,gBACO,aAAlB8+B,EAAWnhC,GACb,uBAAGqC,UAAU,kBACX8+B,EAAWoB,WACb,kBAAC,GAAD,CACEpB,WAAYA,EACZC,oBAAqBsD,IAGvB,kBAAC,GAAD,CACEvD,WAAYA,EACZC,oBAAqBsD,KAO3B,kBAAC,GAAD,CACEliC,IAAK2+B,EAAWnhC,GAChB8hC,QAASqB,EACTrnC,KAAMolC,KACNllB,MAAOmlB,EAAWnlB,MAClB3Z,UAAW4zB,EACXmL,oBAAqBsD,EACrBpiC,QAAS2gD,EACT53B,SAAUzT,QA8Bd,yBAAKhL,IAAKq/B,EAAc5pC,UAAU,mCAC/BkyD,EAAQn5C,IAAI,CAAC+lB,EAAYnhB,IACxB,kBAAC,GAAD,CACExd,IAAK2+B,EAAWnhC,GAChBmhC,WAAYA,EACZmyB,YAAa75D,QAAQ6oC,GAAcgxB,GACnC17C,MAAOoI,EACPohB,oBAAqBA,EACrBj2B,aAAcipD,GAAkBp0C,EAAI,GAAKo0C,GAAkBp0C,EAAI,EAC/DuzC,gBAAiBoB,EACjBnB,gBAAiBoB,OA9BvB,yBAAKvyD,UAAWygC,GACZkxB,EAEEQ,EACF,yBAAKnyD,UAAU,mBAAf,+BAEA,kBAACqZ,GAAA,EAAD,MAJA,yBAAKrZ,UAAU,mBAAf,qD,wNC3IKyG,mBA7EiB,EAC9B+rD,MAAKzzB,sBAAqBmiB,aAAYjhD,cAGtC,MAAMsK,EAAMrD,YAAuB,MAE7BD,EAAWC,YAAyB,MAEpCs4B,EAAegzB,EAAI1yB,aAAe0yB,EAAI1yB,UAAUC,QAChDH,EAAkB,MAAK4yB,EAAI70D,GAE3BszD,EADiBhyB,aAAkB10B,EAAKw0B,KACPmiB,EACjClhB,EAAiBntB,YAAY+sB,EAAF,WAA4BqxB,EAAan+C,iBAAeC,SACnFkzB,EAAWC,aAAcssB,EAAI1yB,WAAa0yB,EAAI1yB,UAAUC,QAAS3oC,QAAQ4oC,IACzEyyB,EAAY5/C,YAAS+sB,GAAiBqxB,EAAan+C,iBAAeC,SAClE2/C,EAAoBt7D,QAAQ65D,GAAewB,IAC3C,qBAAEzpD,GAAyBs2B,aAAsBE,GAAgBQ,GAAkByyB,EAAW,SAC9F,WAAE9pD,EAAF,kBAAcC,GAAsBC,aAAa,GACjDE,EAAsBkoD,IAAgBtoD,EAE5CY,YAAgBtC,EAAU,CAACyrD,IAE3B,MAAMhuC,EAAchlB,YAClB,IAAMO,EAAQ,IACTuyD,EACHtjD,QAASujD,IAEX,CAACxyD,EAASuyD,EAAKC,IAGXzyD,EAAY0L,aAChB,YACA8mD,EAAI97D,OAAS87D,EAAI/6D,QAAU+6D,EAAI97D,MAAQ87D,EAAI/6D,OAAS,WAAa,aACjEuR,EACA42B,GAGF,OACE,yBACEr1B,IAAKA,EACLvK,UAAWA,EACXC,QAASykB,GAER8a,GACC,4BACEj1B,IAAK07B,EACLjmC,UAAU,eAGZw/B,GAAgBQ,GAChB,yBACE/iC,IAAK+iC,EACL3wB,IAAI,GACJrP,UAAU,eAGZ0yD,GAAqB1yB,IACrB,8BACEz1B,IAAKtD,EACLuD,UAAQ,EACRE,MAAI,EACJC,OAAK,EACLF,aAAW,EACXkoD,QAAQ,QAEJ/pD,GAEJ,4BAAQ3L,IAAKw1D,KAGhB1pD,GACC,kBAACwG,EAAA,EAAD,CAASjN,MAAO09B,GAAkBR,EAAe,QAAU,a,OChBpD/4B,mBAAKhI,YACjBC,IACQ,CACLk0D,UAAWl0D,EAAOm0D,KAAKC,MAAMD,OAGjC,CAACzzD,EAAWC,IAA2BC,YAAKD,EAAS,CAAC,kBANpCZ,CA9CyC,EAC3DuB,YACAixD,cACA8B,cACAH,YACAI,cACAC,oBAGA,MAAMrpB,EAAe1iC,YAAuB,OAG1Ck7B,QAASrD,GACPuD,aAAwB,CAAEC,QAASqH,EAAcspB,WAfzB,MAiB5BxxD,YAAU,KACJuvD,GACFgC,KAED,CAAChC,EAAagC,IAEjB,MAAMzpC,EAAoBC,aAAkB,GAAIC,MAEhD,OACE,yBAAKnf,IAAKq/B,EAAc5pC,UAAW0L,aAAe,yBAA0B1L,IACxE+yD,EAEEvpC,GAAqBopC,GAAaA,EAAUp0D,OAC9Co0D,EAAU75C,IAAKy5C,GACb,kBAAC,GAAD,CACEryD,IAAKqyD,EAAI70D,GACT60D,IAAKA,EACLzzB,oBAAqBA,EACrBmiB,YAAa+P,EACbhxD,QAAS+yD,KAGXxpC,GAAqBopC,EACvB,yBAAK5yD,UAAU,mBAAf,kBAEA,kBAACqZ,GAAA,EAAD,MAdA,yBAAKrZ,UAAU,mBAAf,iDCjDD,IAAKmzD,I,SAAAA,O,iBAAAA,I,uBAAAA,I,gBAAAA,Q,KAQL,MAAMC,GAAyBn1D,OAAOowB,OAAO8kC,IACjD37C,OAAQrR,GAA4C,iBAAVA,GAEvCktD,GAAwB,CAC5B,CAACF,GAAeG,OAAQ,aACxB,CAACH,GAAeI,UAAW,gBAC3B,CAACJ,GAAeK,MAAO,aAgEV/sD,mBA7DwB,EACrCylB,YAAWS,cAAa8mC,iBAAgBC,mBAExC,SAASC,EAAgBrnC,GACvB,OACE,kBAAClqB,EAAA,EAAD,CACEpC,UAAY,sBAAoBksB,IAAcI,EAAM,YAAc,IAClErsB,QAAS,IAAM0sB,EAAYL,GAC3B/pB,UAAW6wD,GAAuB9mC,GAClCjqB,OAAK,EACL0uD,OAAK,EACLzuD,MAAM,eAEN,uBAAGtC,UAAWqzD,GAAsB/mC,MAK1C,MAAMsnC,EAAmBl0D,YAAY,KACnCg0D,EAAaxnC,IAAcinC,GAAeI,SAAW,WAAa,SACjE,CAACrnC,EAAWwnC,IAMf,OACE,yBAAK1zD,UAAU,oBAAoBC,QALrC,SAAyB87B,GACvBA,EAAMj6B,oBAKHoqB,IAAcinC,GAAeG,OAC5B,kBAAClxD,EAAA,EAAD,CACEpC,UAAU,uBACVuC,UAAW2pB,IAAcinC,GAAeI,SAAW,kBAAoB,cACvElxD,OAAK,EACL0uD,OAAK,EACLzuD,MAAM,cACNrC,QAAS2zD,GAET,uBAAG5zD,UAAU,iBAIhB2zD,EAAgBR,GAAeG,OAC/BK,EAAgBR,GAAeI,UAC/BI,EAAgBR,GAAeK,MAE/BtnC,IAAcinC,GAAeG,OAC5B,kBAAClxD,EAAA,EAAD,CACEpC,UAAU,uBACVC,QAASwzD,EACTlxD,UAAU,gBACVF,OAAK,EACL0uD,OAAK,EACLzuD,MAAM,eAEN,uBAAGtC,UAAU,yB,OC1CvB,IAAI6zD,IAAc,EAkLHptD,mBAhLkB,EAC/BtE,SAAQ2xD,2BACRx6B,SAAQtyB,UACR8iD,gBAAeoH,kBAAiB8B,cAChCS,iBAAgBC,eAAc7M,qBAE9B,MAAO36B,EAAWC,GAAgBhrB,YAAiB,IAC5CwlD,EAAcoN,GAAmB5yD,YAAmB,KAEpD6yD,EAAkBC,GAAoBrG,GAAezrD,EAAQ6E,IAC9D,aAAE8B,EAAF,qBAAgBE,GAAyBE,YAAkB/G,EAAQ6E,GAAS,GAAO,IAEpF6sD,IAAe1xD,IAClB0xD,IAAc,GAGhBnyD,YAAU,KACR43B,KACC,CAACA,IAEJzxB,YAAgB,KACd,GAAKrF,IASL,OALIL,IACF3H,SAASC,KAAKC,UAAUC,IAAI,iCAC5BH,SAASC,KAAKC,UAAUC,IAAI,wBAGvB,KACDwH,GACF+xD,YAAQ,KACN15D,SAASC,KAAKC,UAAUO,OAAO,uBAC/BE,WAAW,KACTX,SAASC,KAAKC,UAAUO,OAAO,kCApDhB,SAyDtB,CAACkH,IAEJ,MAAMgyD,EAAkBjtD,YAAOy/C,GAC/BwN,EAAgBlsD,QAAU0+C,EAC1BjlD,YAAU,KACHyyD,EAAgBlsD,QAAQzJ,SAI7B21D,EAAgBlsD,QAAQi2B,QAASxnB,IAC/BmwC,EAAe,CAAEnmB,MAAOhqB,MAG1Bq9C,EAAgB,MACf,CAAC5xD,EAAQ+pB,EAAW26B,IAEvB,MAAM+J,EAAoBlxD,YAAY,CAACghC,EAAehqB,KACpDq9C,EAAiBlK,GACR,IAAIA,EAAQnzC,IAGrBozC,EAAcppB,IACb,CAACopB,IAEExH,EAAe5iD,YAAauG,IAChCe,IACA0sD,EAAaztD,IACZ,CAACe,EAAS0sD,IAEP/zD,EAAOC,eAEP,gBAAE+xD,EAAF,YAAmBoB,GAAgBe,EAEzC,SAASM,EAAch+C,EAAmBi+C,GACxC,OAAQnoC,GACN,KAAKinC,GAAeG,MAClB,OACE,kBAAC,GAAD,CACEtzD,UAAU,aACV8pD,cAAe8G,IAGrB,KAAKuC,GAAeI,SAClB,OACE,kBAAC,GAAD,CACEvzD,UAAU,aACVixD,cAAaU,IAAkBxvD,IAAWiU,GAAYi+C,IACtD1C,gBAAiBA,EACjBT,gBAAiBA,IAGvB,KAAKiC,GAAeK,KAClB,OACE,kBAAC,GAAD,CACExzD,UAAU,aACVixD,cAAa8B,IAAc5wD,IAAWiU,GAAYi+C,IAClDtB,YAAaA,EACbC,YAAaA,KAYvB,MAAMzmC,EACJ,oCACE,yBAAKvsB,UAAU,kBAAkBC,QANrC,SAAyB87B,GACvBA,EAAMj6B,oBAMD+xD,IACC,kBAACr9C,EAAA,EAAD,CAAYE,KAAK,QAAQD,UAAWyV,EAAWU,YAAawmC,GAAuB50D,QAChF41D,IAIN5xD,KACC,kBAACJ,EAAA,EAAD,CACEC,OAAK,EACL0uD,OAAK,EACLzuD,MAAM,cACNC,UAAW5C,EAAK,SAChBK,UAAU,sBACVvG,KAAK,OACLwG,QAAS+G,GAET,uBAAGhH,UAAU,gBAGjB,kBAAC,GAAD,CACEksB,UAAWA,EACXS,YAAaR,EACbsnC,eAAgBA,EAChBC,aAAcpR,KAKpB,GAAI9/C,IAAkB,CACpB,IAAKsG,EACH,OAGF,MAAM9I,EAAY0L,aAChB,yBACA1C,GAGF,OACE,kBAACw5C,GAAA,EAAD,KACE,yBAAKxiD,UAAWA,GACbusB,IAMT,OACE,kBAAC8xB,GAAA,EAAD,CACEl8C,OAAQA,EACRQ,UAAU,OACVw7C,UAAU,SACVn3C,QAASA,EACThH,UAAU,aACVi9C,oBAAqBj2C,EACrBstD,aAAeltD,SAAkC9F,EAAnB0yD,EAC9BO,aAAentD,SAAkC9F,EAAnB2yD,EAC9BO,mBAAoBptD,KAEnBmlB,K,OClIQ9lB,mBA7DkB,EAC/BtE,SAAQ2xD,2BAA0BW,eAAcC,eAAc1tD,cAE9D,MAAOgtD,EAAkBC,GAAoBrG,GAAezrD,EAAQ6E,GAE9DsgC,EAAmB5nC,YAAY,CAACmC,EAAUylD,KAC9C,MAAM,MAAE/f,GAAU1lC,EAAEmI,OAEhBu9B,GAASA,EAAM/oC,OAAS,GAC1Bi2D,EAAanR,MAAMC,KAAKhc,GAAQ+f,IAEjC,CAACmN,IAEEE,EAAoBj1D,YAAY,KACpCqkC,GACE2kB,IACC7mD,GAAMylC,EAAiBzlC,GAAG,KAE5B,CAACylC,IAEEstB,EAAuBl1D,YAAY,KACvCqkC,GAAsB,IAAMliC,GAAMylC,EAAiBzlC,GAAG,KACrD,CAACylC,IAEE3nC,EAAOC,eAEP,eAAEi1D,EAAF,eAAkBC,GAAmBhB,EAE3C,OACE,kBAACzV,GAAA,EAAD,CACEl8C,OAAQA,EACR4yD,WAAS,EACTpyD,UAAU,QACVw7C,UAAU,SACVn3C,QAASA,EACThH,UAAU,mBACVi9C,oBAAqBj2C,EACrBstD,aAAeltD,SAAkC9F,EAAnB0yD,EAC9BO,aAAentD,SAAkC9F,EAAnB2yD,EAC9BO,mBAAoBptD,MAMlBytD,GACA,kBAACjyD,EAAA,EAAD,CAAU5C,UAAU,iBAAiB2L,UAAQ,GAA7C,uDAEDkpD,GACC,oCACE,kBAACjyD,EAAA,EAAD,CAAUC,KAAK,QAAQ5C,QAAS00D,GAAoBh1D,EAAK,gCACzD,kBAACiD,EAAA,EAAD,CAAUC,KAAK,WAAW5C,QAAS20D,GAAnC,aAGHE,GACC,kBAAClyD,EAAA,EAAD,CAAUC,KAAK,OAAO5C,QAASy0D,GAAe/0D,EAAK,Y,OCe5C8G,mBAAKhI,YACjBC,IACC,MAAM,SAAEmiC,GAAaniC,EAAOmiC,SAASm0B,SAErC,MAAO,CAAEn0B,aAEX,CAACzhC,EAAWC,IAA2BC,YAAKD,EAAS,CAAC,0BANpCZ,CAzD8C,EAChE0D,SACA+uD,kBACArwB,WACAo0B,4BAGA,MAAMrrB,EAAe1iC,YAAuB,OACtC,aAAE4B,EAAF,qBAAgBE,GAAyBE,YAAkB/G,OAAQb,OAAWA,GAAW,GACzF4zD,EAAe/pD,YAAY01B,GAAU,GACrCs0B,EAAoBt0B,GAAYq0B,GAGpC9yB,QAASrD,GACPuD,aAAwB,CAAEC,QAASqH,EAAcqX,WAhBzB,MAkB5Bv/C,YAAU,IAAOS,EAAS+S,YAAsB+/C,QAAyB3zD,EAAY,CAACa,EAAQ8yD,IAE9F,MAQMj1D,EAAY0L,aAChB,gDACA1C,IACEmsD,GAAqBA,EAAkB32D,SAAW,UAGtD,OACE,yBACE+L,IAAKq/B,EACL5pC,UAAWA,EACXs0D,aAAeltD,SAAkC9F,EAlB5B,KACvB9G,SAASC,KAAKC,UAAUC,IAAI,cAkB1B45D,aAAentD,SAAkC9F,EAf5B,KACvB9G,SAASC,KAAKC,UAAUO,OAAO,eAgB5B6N,GAAgBqsD,EACfA,EAAkBp8C,IAAK0mB,GACrB,kBAAC,GAAD,CACEt/B,IAAKs/B,EAAQ9hC,GACb8hC,QAASA,EACThmC,KAAM43D,KACNtyB,oBAAqBA,EACrB9+B,QAASixD,EACTloC,SAAUyW,KAGZ32B,EACF,kBAACuQ,GAAA,EAAD,WACE/X,M,OClBKmF,mBAAKhI,YAClB,CAACC,GAAUE,gBACT,MAAM,OAAED,GAAW0gB,YAAyB3gB,IAAW,GACvD,OAAKC,EAIE,CAAErI,QAAS4I,YAAkBR,EAAQC,EAAQC,IAH3C,IAKX,CAACQ,EAAWC,IAA2BC,YAAKD,EAAS,CACnD,sBAVgBZ,CAzC+C,EACjE0D,SAAQ7L,UAAS0Q,UAASouD,wBAE1B,MAAOpB,EAAkBC,GAAoBrG,GAAezrD,EAAQ6E,GAEpE,GAAK1Q,GAAYA,EAAQ++D,gBAIzB,OACE,kBAAChX,GAAA,EAAD,CACEl8C,OAAQA,EACR4yD,WAAS,EACTpyD,UAAU,QACVw7C,UAAU,SACVn3C,QAASA,EACThH,UAAU,eACVi9C,oBAAqBj2C,EACrBstD,aAAeltD,SAAkC9F,EAAnB0yD,EAC9BO,aAAentD,SAAkC9F,EAAnB2yD,EAC9BO,mBAAoBptD,KAEpB,yBAAKpH,UAAU,WACZ1J,EAAQ++D,gBAAgBt8C,IAAKu8C,GAC5B,yBAAKt1D,UAAU,OACZs1D,EAAIv8C,IAAKw8C,GACR,kBAACnzD,EAAA,EAAD,CACEiE,QAAM,EACNsF,SAA0B,kBAAhB4pD,EAAOtvD,KACjBhG,QAAS,IAAMm1D,EAAkB,CAAEG,YAElCA,EAAOpyD,c,OCdTsD,mBA1BsB,EACnCtE,SAAQqzD,eAAcC,iBAAgBzuD,UAASi2C,0BAE/C,MAAO+W,EAAkBC,GAAoBrG,GAAezrD,EAAQ6E,GAE9DrH,EAAOC,cAEb,OACE,kBAACy+C,GAAA,EAAD,CACEl8C,OAAQA,EACR4yD,WAAS,EACTpyD,UAAU,QACVw7C,UAAU,SACVn+C,UAAU,iBACVgH,QAASA,EACTi2C,oBAAqBA,EACrBqX,aAAeltD,SAAkC9F,EAAnB0yD,EAC9BO,aAAentD,SAAkC9F,EAAnB2yD,EAC9BO,mBAAoBptD,KAEnBouD,GAAgB,kBAAC5yD,EAAA,EAAD,CAAUC,KAAK,OAAO5C,QAASu1D,GAAe71D,EAAK,qBACnE81D,GAAkB,kBAAC7yD,EAAA,EAAD,CAAUC,KAAK,WAAW5C,QAASw1D,GAAiB91D,EAAK,uB,qCC+GnE8G,mBA3FoB,EACjCtE,SACA0nD,SACA7iD,UACA8iD,gBACAjD,qBAGA,MAAMjd,EAAe1iC,YAAuB,OACtC,aAAE4B,EAAF,qBAAgBE,GAAyBE,YAAkB/G,OAAQb,OAAWA,GAAW,GACzFo0D,EAAsBC,aAAuB9L,EAAOrrD,OAASqrD,OAASvoD,EAZvD,MAYqF,IAEnGs0D,EAAeC,GAAoB10D,aAAU,GAEpDO,YAAU,KACRm0D,EAAiB,IAChB,CAAChM,IAEJnoD,YAAU,MAxDZ,SAAwB6T,EAAeq0B,GACrC,MAAMpuC,EAAYouC,EAAa3hC,QAC/B,IAAKzM,EACH,OAGF,MAAM,eAAEqpD,EAAF,YAAkBD,GAAgBR,GACtC5oD,EACA,eAXoB,GAapB,GACA,GACA,GAGF,IAAKopD,EAAYpmD,SAAWomD,EAAYrvC,GACtC,OAEF,MAAM0wC,EAAQpB,EAAe,GAC7B,IAAKA,EAAexrD,SAASkc,IACvBA,IAAU0wC,IAAUhB,GAAezpD,EAAWopD,EAAYqB,IAAQ,GAAQ,CAC9E,MACM+J,EAAuB,WADZz6C,EAAQsvC,EAAeA,EAAermD,OAAS,GAAK,QAAU,OAvBxD,GAwBgB+W,EAA6B,EAEpE26C,aAA2B10D,EAAWw0D,IAiCtC5J,CAAewP,EAAehsB,IAC7B,CAACgsB,IAEJ,MAAMxQ,EAAmB1lD,YAAa2lD,IACpC,IAAKwE,EAAOrrD,OACV,OAAQ,EAGV,MAAMs3D,EAAcjM,EAAOrrD,OAC3B,OAAO8mD,aAAcwQ,EAAazQ,IACjC,CAACwE,IAGEpE,EAAiB/lD,YAAY,CAACyG,EAAetE,KACjDA,EAAE4M,iBACFonD,EAAkBtgD,GAAW6vC,EAAiB7vC,EAAQpP,KACrD,CAAC0vD,EAAkBzQ,IAEhB2Q,EAAoBr2D,YAAamC,IACrC,GAAIgoD,EAAOrrD,QAAUo3D,GAAiB,EAAG,CACvC,MAAMl1B,EAAQmpB,EAAO+L,GACjBl1B,IACF7+B,EAAE4M,iBACFq7C,EAAcppB,EAAMqtB,QACpBlH,EAAe,CAAEnmB,MAAOA,EAAM/iC,QAGjC,CAACkpD,EAAgBgD,EAAQC,EAAe8L,IAE3Cl0D,YAAU,IAAOS,EAASogB,aAAyB,CACjDG,MAAO1b,EACPgvD,OAASn0D,GAAqB4jD,GAAgB,EAAG5jD,GACjDo0D,QAAUp0D,GAAqB4jD,EAAe,EAAG5jD,GACjDye,QAASy1C,SACNz0D,EAAY,CAACmkD,EAAgBsQ,EAAmB5zD,EAAQ6E,IAE7D,MAQMhH,EAAY0L,aAChB,gDACA1C,GAGF,OACE,yBACEuB,IAAKq/B,EACL5pC,UAAWA,EACXs0D,aAAeltD,SAAkC9F,EAjB5B,KACvB9G,SAASC,KAAKC,UAAUC,IAAI,cAiB1B45D,aAAentD,SAAkC9F,EAd5B,KACvB9G,SAASC,KAAKC,UAAUO,OAAO,eAe5B6N,GAAgB4sD,EACfA,EAAW38C,IAAI,CAAC2nB,EAAOnrB,IACrB,kBAAC,GAAD,CACEpV,IAAKugC,EAAM/iC,GACX+iC,MAAOA,EACPhpB,MAAOk+C,IAAkBrgD,EACzBtV,QAAS6pD,KAGXhhD,EACF,kBAACuQ,GAAA,EAAD,WACE/X,K,iBCDKmF,mBAAKhI,YAClB,CAACC,GAAUC,aACT,MAAMyB,EAAOnB,YAAWP,EAAQC,GAC1Bu3D,EAAe91D,GAAQiQ,YAAmB3R,EAAQ0B,EAAKzC,IAC7D,IAAKyC,IAAS81D,EACZ,MAAO,GAGT,MAAM,MAAEzuC,EAAF,QAASi7B,GAAYC,YAAwBjkD,IAAW,IACxD,WAAEqvC,EAAF,SAAcr9B,GAAagyC,GAAW,GAE5C,MAAO,CACLtiD,OACA81D,eACAzuC,QACAsmB,aACAr9B,aAGJ,CAAChS,EAAQW,IAA2BC,YAAKD,EAAS,CAAC,0BAA2B,iBAnB5DZ,CA7F2C,EAC7DE,SACA6Q,WACApP,OACA81D,eACAzuC,QACAsmB,aACAr9B,WACAmyC,0BACArjD,mBAEA,MAAMG,EAAOC,cAEPu2D,EAAel0D,YAAQ,KAC3B,KAAKwlB,GAAU/W,GAAaA,EAASlS,QAAW03D,GAC9C,OAAOtuC,KAGT,MAAM86B,EAAUhyC,EAASqI,IAAKpb,IAC5B,MAAMrH,EAAU4/D,EAAav4D,GAC7B,IAAKrH,EACH,OAGF,MAAM8/D,EAAa9/D,EAAQyZ,SAAW/Q,aAAWq3D,cAAa//D,EAAQyZ,eAAYzO,EAElF,IAAIg1D,EACJ,GAAIl2D,GAAQugB,aAAcvgB,GACxBk2D,EAAal2D,OACR,GAAI9J,EAAQigE,YAAa,CAC9B,MAAM,cAAEC,EAAF,WAAiBvhD,GAAe3e,EAAQigE,YAC9CD,EAAaE,GAAiBvhD,EAAahW,YAAWo3D,cAAaphD,QAAc3T,OAEjFg1D,EAAahgE,EAAQyZ,SAAW9Q,YAAWo3D,cAAa//D,EAAQyZ,eAAYzO,EAG9E,MAAO,CACLhL,UACA8/D,aACAE,aACAr2D,QAAS,IAAMT,EAAa,CAAEb,SAAQ6Q,WAAU5Q,UAAWjB,OAE5D6Z,OAAOpgB,SAEV,OAAOq/D,YAAQ/T,EAAS,EAAGpsD,aAAcA,EAAQmK,KAAM,SACtD,CAAC9B,EAAQ6Q,EAAUhQ,EAAckR,EAAUtQ,EAAM81D,EAAczuC,IAwBlE,OACE,kBAAC9O,GAAA,EAAD,CACE3Y,UAAU,4BACV4Y,MAAOu9C,EACPO,iBAAkB,EAClB79C,WAAYgqC,EACZl6B,YAAU,GAEV,uBAAG3oB,UAAU,cAAcM,IAAI,QAC3BmnB,EAEkB,IAAfsmB,GAAqBooB,EAAa33D,OAEpB,IAAfuvC,EACF,mBAEIooB,EAAa33D,SAAWuvC,GAAcooB,EAAa33D,SAAtD,kBAJDmB,EAAK,yBAFLA,EAAK,gCASRw2D,EAAap9C,IAzCS,EACzBziB,UAAS8/D,aAAYE,aAAYr2D,cAEjC,MAAM0Z,EAAQ28C,EAAar+C,YAAatY,EAAM22D,GAAcvuC,YAAgBquC,GACtEjzD,EAAOqiB,YAAsB7lB,EAAMrJ,GAEzC,OACE,kBAAC0iB,GAAA,EAAD,CAAUhZ,UAAU,gDAAgDC,QAASA,GAC3E,kBAACC,EAAA,EAAD,CAAQE,KAAMk2D,EAAYj2D,KAAM+1D,IAChC,yBAAKp2D,UAAU,QACb,yBAAKA,UAAU,SACb,wBAAIM,IAAI,QAAQqZ,GAASpZ,YAAWoZ,IACpC,kBAACg9C,GAAA,EAAD,CAAiBrgE,QAASA,KAE5B,yBAAK0J,UAAU,WAAWM,IAAI,QAC3BC,YAAW4C,EAAM,CAAC,QAAS,aAAc,CAAEsiB,UAAWgC,a,UCKpDhhB,mBAAKhI,YAClB,CAACC,GAAUmiD,mBACF,CACLuR,IAAKxR,aAAiBliD,EAAQmiD,GAC9B5gB,WAAY22B,aAAyBl4D,KAGzC,CAACU,EAAWC,IAA2BC,YAAKD,EAAS,CAAC,eAAgB,qBAPpDZ,CAlFgD,EAClEoiD,eAAc9hB,sBAAqBqzB,MAAKnyB,aAAY6gB,eAAcC,mBAAkB8V,kBAAiBC,oBAErG,MAAMn3D,EAAOC,cACPm3D,EAAU3E,GAAOh7D,QAAQg7D,EAAI5uB,eAC7BwzB,EAAoB5/D,QAAQg7D,GAAOA,EAAIvxB,WAEtC2B,EAAaC,EAAWC,GAAcpgB,eAE7C20C,aAAY,KACVH,EAAct0B,IACb,CAACA,EAAas0B,IAEjB,MAAM3B,EAAoBlzD,YAAQ,KAChC,IAAKmwD,EACH,MAAO,GAGT,MAAM8E,GAAmB9E,EAAI+E,QAAU,IAAIp+C,IAAI,EAAGpb,QAASA,GACrDy5D,EAAgBhF,EAAIvxB,SAAWuxB,EAAIvxB,SAASrpB,OAAO,EAAG7Z,SAAUu5D,EAAgB79D,SAASsE,IAAO,GAEtG,MAAO,IAAIy0D,EAAI+E,QAAU,MAAOC,GAAexrC,MAAM,EAvB7B,IAwBvB,CAACwmC,IAEJ1wD,YAAU,MAEHs1D,GAAqB7B,EAAkB32D,OA5BpB,GA6BtBsiD,EAAa,CAAED,kBAEhB,CAACmW,EAAmB7B,EAAkB32D,OAAQsiD,EAAcD,IAE/D,MAAMwW,EAAiB33D,YAAY,KACjCqhD,EAAiB,CAAEF,kBAClB,CAACE,EAAkBF,IAEtB,IAAKuR,EACH,OAGF,MAAMkF,EAAoBnC,EAAkB32D,OAAS,EAErD,OACE,yBAAK2B,IAAKiyD,EAAIz0D,GAAIqC,UAAU,eAC1B,yBAAKA,UAAU,sBACb,yBAAKA,UAAU,iBACb,wBAAIA,UAAU,QAAQM,IAAI,QAAQ8xD,EAAIz4C,OACtC,uBAAG3Z,UAAU,QAAQM,IAAI,QAAQX,EAAK,WAAYyyD,EAAIx4B,MAAO,OAE/D,kBAACx3B,EAAA,EAAD,CACEpC,UAAW+2D,EAAU,gBAAaz1D,EAClCgB,MAAM,UACN7I,KAAK,OACL8/B,MAAI,EACJC,OAAK,EACLv5B,QAASo3D,GAER13D,EAAKo3D,EAAU,qBAAuB,sBAG3C,yBAAK/2D,UAAU,qBACXs3D,GAAqB,kBAAC/nD,EAAA,EAAD,MACtB+nD,GAAqBnC,EAAkBp8C,IAAK0mB,GAC3C,kBAAC,GAAD,CACEA,QAASA,EACThmC,KAAM89D,KACNx4B,oBAAqBA,EACrBW,WAAYO,GAAcuC,GAAeq0B,EACzC52D,QAASwiC,MAId60B,GACC,kBAAC,KAAD,CACEn1D,OAAQqgC,EACRqB,YAAasxB,EAAkB,GAC/BnuD,QAAS07B,Q,OCvFnB,MAEMjf,GAAe9f,YAAU+f,GAAOA,IAAM,KAAO,GAoEpCjd,mBAAKhI,YACjBC,IACC,MAAM8R,EAAgBgnD,YAA2B94D,IAC3C,MAAE+oB,EAAF,UAAS2wB,GAAc5nC,GAAiB,IACxC,SAAEinD,GAAa/4D,EAAOmiC,SAE5B,MAAO,CACLpZ,QACAiwC,YAAaD,EAASt2B,OACtBiX,cAGJ,CAACh5C,EAAWC,IAA2BC,YAAKD,EAAS,CAAC,yBAZpCZ,CAlEkC,EACpDgpB,QACAiwC,cACAtf,YACAuf,2BAGA,MAAM/tB,EAAe1iC,YAAuB,OAErCs7B,EAAao1B,GAAkBz2D,aAAS,IAG7CihC,QAASrD,GACPuD,aAAwB,CAAEC,QAASqH,EAAcqX,WAjBzB,MA+D5B,OA1CAv/C,YAAU,KACR+hB,GAAa,KACXk0C,QAyCF,yBAAKptD,IAAKq/B,EAAc5pC,UAAU,+BArCpC,WACE,QAAcsB,IAAVmmB,EAIJ,OAAKA,GAASiwC,EACLA,EAAY3+C,IAAKpb,GACtB,kBAAC,GAAD,CACEwC,IAAKxC,EACLkjD,aAAcljD,EACdohC,oBAAqBA,EACrB83B,gBAAiBr0B,EACjBs0B,cAAec,KAKjBxf,EACGA,EAAU55C,OAIR45C,EAAUr/B,IAAKpb,GACpB,kBAAC,GAAD,CACEwC,IAAKxC,EACLkjD,aAAcljD,EACdohC,oBAAqBA,EACrB83B,gBAAiBr0B,EACjBs0B,cAAec,KATV,uBAAG53D,UAAU,eAAb,kBAcJ,kBAACqZ,GAAA,EAAD,MAKJ+6C,O,OC0BQ3tD,mBAAKhI,YACjBC,IACC,MAAM8R,EAAgBqnD,YAAuBn5D,IACvC,MAAE+oB,EAAF,QAASi7B,GAAYlyC,GAAiB,IACtC,OAAE7R,GAAW0gB,YAAyB3gB,IAAW,GACjD0B,EAAOzB,EAASM,YAAWP,EAAQC,QAAU2C,EAGnD,MAAO,CACLmmB,QACAi7B,UACAtiD,OACA03D,cANoB13D,EAAO23D,YAAoBr5D,EAAQ0B,QAAQkB,IASnE,CAAClC,EAAWC,IAA2BC,YAAKD,EAAS,CAAC,iBAAkB,cAAe,sBAfrEZ,CA7E8B,EAChDgpB,QACAi7B,UACAtiD,OACA03D,gBACAE,iBACAhX,cACAiX,wBAGA,MAAMruB,EAAe1iC,YAAuB,OAG1Ck7B,QAASrD,GACPuD,aAAwB,CAAEC,QAASqH,EAAcspB,WAhBzB,OAkBtB,YAAEH,GAAgBmF,YAA4B93D,EAAM03D,GAEpDK,EAAiBz4D,YAAa8yD,IAC9BO,GACF/R,EAAY,CAAEwR,QAGZprD,KACF6wD,EAAkB,CAAExwC,WAAOnmB,KAE5B,CAACyxD,EAAa/R,EAAaiX,IAExBt4D,EAAOC,cA6Bb,MAAMw4D,EAAahhE,aAAkBkK,IAAVmmB,GAAuBi7B,GAAWA,EAAQlkD,QAErE,OACE,yBAAKwB,UAAU,aACb,kBAAC2Y,GAAA,EAAD,CACEpO,IAAKq/B,EACL5pC,UAAW0L,aAAe,8BAA+B0sD,GAAc,QACvEx/C,MAAO8pC,EACP54B,aAAa,aACb4sC,iBArEkB,GAsElB/tC,YAAU,EACV9P,WAAYm/C,GAtClB,WACE,QAAc12D,IAAVmmB,EAIJ,OAAKi7B,EAMAA,EAAQlkD,OAMNkkD,EAAQ3pC,IAAKy5C,GAClB,kBAAC,GAAD,CACEryD,IAAKqyD,EAAI70D,GACT60D,IAAKA,EACLzzB,oBAAqBA,EACrB9+B,QAASk4D,KATT,uBAAGn4D,UAAU,cAAcM,IAAI,QAAQX,EAAK,gBAN5C,kBAAC0Z,GAAA,EAAD,MAiCC+6C,Q,OCoBM3tD,mBAAKhI,YAClB,CAACC,GAAU25D,aACT,MAAM,OAAEC,EAAF,QAAUC,GAAY75D,EAAO85D,YAEnC,MAAO,CACLF,OAAQA,GAAUA,EAAOD,EAAOz5B,QAChC65B,OAASF,GAAWA,EAAQF,EAAOz5B,SAAY,KAGnD,CAAClgC,EAAQW,IAA2BC,YAAKD,EAAS,CAAC,wBAAyB,WAAY,qBATtEZ,CAzFiD,EACnE2B,OACA9J,UACA+hE,SACAK,aACAC,cACAL,SACAG,SACAG,wBACAv0C,WACAw0C,uBAEA,MAAMC,EAAkB3tD,YAAoButD,EAAWK,cAChD1vC,EAAW2vC,GAAgB73D,aAAkB,GAC9C83D,EAAkB7hE,QAAQkhE,IAC1B,OAAE15B,EAAF,KAAUz7B,GAASk1D,EAEzB32D,YAAU,KAEHu3D,GAAmBH,IAAoBJ,EAAWK,aACrDH,EAAsB,CACpBx4D,OAAMxB,UAAWtI,EAAQqH,GAAIihC,SAAQ65B,SAAQS,MAxB/B,EAwBqDC,mBAAmB,KAIzF,CAACT,EAAWK,YAAaE,IAE5B,MAAMG,EAAsB15D,YAAY,KACtCs5D,GAAa,GACbJ,EAAsB,CACpBx4D,OAAMxB,UAAWtI,EAAQqH,GAAIihC,SAAQ65B,SAAQS,MAhC3B,MAkCnB,CAAC94D,EAAMw4D,EAAuBtiE,EAAQqH,GAAI86D,EAAQ75B,IAErDl9B,YAAU,KACRs3D,GAAa,IACZ,CAACV,IAEJ,MAAMe,EAAoB35D,YAAa/B,IACrC0mB,EAAS,CAAE1mB,OACXk7D,KACC,CAACA,EAAkBx0C,IAetB,OACE,yBAAKrkB,UAAU,qBACb,yBAAKA,UAAU,eACZs4D,EACGA,EAAOv/C,IAAKpb,GACZ,kBAACqb,GAAA,EAAD,CACE7Y,IAAKxC,EACLqC,UAAU,sBACVC,QAAS,IAAMo5D,EAAkB17D,IAEjC,kBAACsb,GAAA,EAAD,CACEsK,WAAW,OACXpK,OAAQxb,EACR26C,eAAa,EACbghB,kBAAgB,MAIpB,kBAACjgD,GAAA,EAAD,MACHi/C,GAhCP,WACE,MAAMiB,EAAkBb,EAAWK,YAAcT,EAAQ95D,OAEzD,OAAOk6D,EAAWK,YAjDA,GAiD+BQ,EAAkB,GACjE,kBAAC,GAAD,CACE3/B,MAAO2/B,EACP1/B,SAAS,QACTxQ,UAAWA,EACXppB,QAASm5D,IAwBEI,IAEb,yBAAKx5D,UAAU,eACb,0BAAMA,UAAU,eAAeM,IAAI,QAAQ6C,GAC3C,0BAAMnD,UAAU,mBAMDmG,EANiCuyD,EAAWK,aAM7BU,EAN0Cd,GAO/D,GAAMxyD,EAAQszD,EAAS,KAAKj1D,UAAY,GAPjD,OAMR,IAAuB2B,EAAeszD,K,OCtEvBhzD,mBAAKhI,YACjBC,IACC,MACE85D,aAAa,OAAE75D,EAAF,UAAUC,GADnB,aAEJ+lB,GACEjmB,EAEJ,IAAKC,IAAWC,EACd,MAAO,GAMT,MAAO,CACLwB,KAJWnB,YAAWP,EAAQC,GAK9BrI,QAJc4I,YAAkBR,EAAQC,EAAQC,GAKhD+lB,iBAjBclmB,CApCgB,EAClC2B,OACA9J,UACAquB,mBAEA,IAAKruB,IAAY8J,EACf,OAAO,kBAACiZ,GAAA,EAAD,MAGT,MAAM,QAAE8yC,EAAF,QAAWzJ,GAAYgX,YAAepjE,GAC5C,IAAKosD,EAAQA,QACX,OAGF,MAAMiX,EAAkBC,YAAqBlX,EAAQA,QAAS,UAE9D,OACE,yBAAK1iD,UAAU,eACb,wBAAIA,UAAU,gBAAgBM,IAAI,QAAQ6rD,EAAQ5B,UAClD,yBAAKvqD,UAAU,mCACZ2kB,GAAgBwnC,EAAQC,QAAQrzC,IAAKs/C,GACpC,kBAAC,GAAD,CACEl4D,IAAM,GAAE7J,EAAQqH,MAAM06D,EAAOz5B,SAC7Bx+B,KAAMA,EACN9J,QAASA,EACT+hE,OAAQA,EACRK,WAAYiB,EAAgBtB,EAAOz5B,QACnC+5B,YAAajW,EAAQiW,gBAGvBh0C,GAAgB,kBAACtL,GAAA,EAAD,W,OCyJX5S,mBAAKhI,YAClB,CAACC,GAAUya,aACT,MAAM9Y,EAAOrB,aAAWN,EAAQya,GAC1B/Y,EAAOnB,YAAWP,EAAQya,IAC1B,SAAEnW,GAAatE,EAAOm7D,WAE5B,MAAO,CAAEx5D,OAAMD,OAAM4C,aAEvB,CAACtE,EAAQW,IAA2BC,YAAKD,EAAS,CAChD,gBAAiB,aAAc,kBAAmB,WAAY,kBAT9CZ,CAjK0C,EAC5D0a,SACA9Y,OACAD,OACA4C,WACA82D,gBACAC,aACAC,gBACAC,kBACA51C,eAEA,MAAO61C,EAAoBC,EAAkBC,GAAqB93C,gBAC3DyT,EAAwBC,GAA6B70B,aAAS,IAC9DoY,EAAO0c,GAAY90B,cACpBxB,EAAOC,cAEPw1B,EAAmB/0B,GAAQA,EAAK80B,WAAmB,GACnDG,EAAkBj1B,GAAQA,EAAKg1B,UAAkB,GACjDglC,EAAiBj6D,EAAOA,EAAKqhD,aAAUngD,GAEtC6zB,EAAWgB,GAAgBh1B,YAASi0B,IACpCC,EAAUe,GAAej1B,YAASm0B,IAClCglC,EAAwBC,GAA6Bp5D,aAAUk5D,GAEtE34D,YAAU,KACR64D,GAA2BF,IAC1B,CAACA,IAEJ34D,YAAU,KACRs0B,GAA0B,GAC1BokC,KACC,CAACA,EAAmBjhD,IAEvBzX,YAAU,KACRy0B,EAAaf,GACbgB,EAAYd,IACX,CAACF,EAAkBE,EAAiBj1B,IAEvCqB,YAAU,KACJsB,IAAaw3D,IAAmB7jC,WAClCX,GAA0B,GAC1BC,OAAS30B,GACT84D,MAED,CAACA,EAAmBp3D,IAEvB,MAAM8zB,EAAwBp3B,YAAamC,IACzCs0B,EAAat0B,EAAEmI,OAAO7D,OACtB6vB,GAA0B,IACzB,IAEGe,EAAuBr3B,YAAamC,IACxCu0B,EAAYv0B,EAAEmI,OAAO7D,OACrB6vB,GAA0B,IACzB,IAEGykC,EAA2B/6D,YAAamC,IAC5C04D,EAA0B14D,EAAEmI,OAAOkzB,SACnClH,GAA0B,IACzB,IAEGiB,EAAoBv3B,YAAY,KACpC,MAAMw3B,EAAmB/B,EAAUN,OAC7BsC,EAAkB9B,EAASR,OAE5BqC,EAAiB14B,QACpBy3B,EApE2B,6BAuE7B6jC,EAAc,CACZ3gD,SACAsoC,SAAU6Y,EACVnlC,UAAW+B,EACX7B,SAAU8B,KAEX,CAAChC,EAAWE,EAAUykC,EAAe3gD,EAAQmhD,IAE1CI,EAAsBh7D,YAAY,KAClCU,EAAKu6D,aACPX,EAAc,CACZr7D,OAAQyB,EAAKzC,GACbi9D,MAAOx6D,EAAKu6D,YAAah9D,GACzByiB,oBAAoB,IAGxB25C,EAAW,CAAE5gD,WACbihD,IACAH,IACA51C,EAAS,CAAE1mB,QAAI2D,KACd,CAAClB,EAAKzC,GAAIyC,EAAKu6D,YAAaP,EAAmBH,EAAiBD,EAAeD,EAAY11C,EAAUlL,IAExG,IAAK9Y,EACH,OAGF,MAAMgpB,EAAYrmB,IAAaw3D,IAAmBhkC,WAElD,OACE,yBAAKx2B,UAAU,cACb,yBAAKA,UAAU,iBACb,yBAAKA,UAAU,WACb,kBAACiZ,GAAA,EAAD,CACEE,OAAQ9Y,EAAK1C,GACb4lB,WAAW,QACXrK,OAAO,gBACP2hD,cAAY,IAEd,kBAACtiD,GAAA,EAAD,CACE5a,GAAG,kBACH42B,MAAO50B,EAAK,iCACZiM,SAAUkrB,EACV3wB,MAAOgvB,EACP5b,MAlHqB,8BAkHdA,EAAqCA,OAAQjY,IAEtD,kBAACiX,GAAA,EAAD,CACE5a,GAAG,iBACH42B,MAAO50B,EAAK,gCACZiM,SAAUmrB,EACV5wB,MAAOkvB,IAET,yBAAKr1B,UAAU,gCACb,kBAACi9B,GAAA,EAAD,CACEC,QAASo9B,EACT/lC,MAAO50B,EAAK,iBACZkjC,SAAUljC,EAAK26D,EACX,gCACA,kCACJ1uD,SAAU6uD,MAIhB,yBAAKz6D,UAAU,WACb,kBAACgZ,GAAA,EAAD,CAAUnW,KAAK,SAASwD,QAAM,EAACyc,aAAW,EAAC7iB,QAASk6D,GACjDx6D,EAAK,oBAIZ,kBAAC,GAAD,CACEqL,QAAS+qB,EACT91B,QAASg3B,EACTtrB,SAAU0d,EACV9mB,UAAW5C,EAAK,SAEf0pB,EACC,kBAAC9Z,EAAA,EAAD,CAASjN,MAAM,UAEf,uBAAGtC,UAAU,gBAGjB,kBAACwa,GAAA,EAAD,CACErY,OAAQ+3D,EACRlzD,QAASozD,EACTj3D,KAAMxD,EAAK,2BACX8a,aAAc9a,EAAK,iBACnB+a,eAAgBggD,EAChBpnC,sBAAoB,QC0Gb7sB,mBAAKhI,YAClB,CAACC,GAAUC,aACT,MAAMyB,EAAOnB,YAAWP,EAAQC,IAC1B,SAAEqE,GAAatE,EAAOm7D,WACtBiB,EAAmB1jE,QAAQgJ,EAAKm1B,UAAYn1B,EAAKm1B,SAASwlC,cAEhE,MAAO,CACL36D,OACA4C,WACAg4D,aAAcp7C,aAAiBxf,GAC/B06D,mBACAG,cAAeC,YAAiB96D,EAAM,cACtC+6D,YAAaD,YAAiB96D,EAAM,cAGxC,CAAChB,EAAWC,IAA2BC,YAAKD,EAAS,CACnD,yBAA0B,aAAc,kBACxC,gBAAiB,eAAgB,gBAAiB,aAjBlCZ,CAxP2C,EAC7DE,SACAyB,OACA4C,WACAg4D,eACAF,mBACAG,gBACAE,cACA3nC,iBACA4nC,yBACAC,aACArB,gBACAsB,eACAC,gBACAtB,kBACA51C,eAEA,MAAO61C,EAAoBC,EAAkBC,GAAqB93C,eAC5Dk5C,EAAep7D,EAAKuZ,MACpB8hD,EAAer7D,EAAKm1B,UAAYn1B,EAAKm1B,SAAS6jB,OAAe,IAE5DrjB,EAAwBC,GAA6B70B,aAAS,IAC9DwY,EAAOw/B,GAAYh4C,YAASq6D,IAC5BpiB,EAAOC,GAAYl4C,YAASs6D,IAC5BzkE,EAAOk/B,GAAY/0B,eACnBoY,EAAO0c,GAAY90B,cACpBu6D,EAAY/oD,YAAkBvS,GAC9Bk2B,EAAuBzjB,YAAS6oD,GAAW,EAAO5oD,iBAAeC,SACjEpT,EAAOC,cAEb8B,YAAU,KACJsB,IAAaw3D,IAAmB7jC,WAClCX,GAA0B,GAC1BC,OAAS30B,KAEV,CAAC0B,IAEJ,MAAM24D,EAAsBj8D,YAAY,KACtC8zB,EAAeooC,IAAkBC,kBAChC,CAACroC,IAEEsoC,EAAwBp8D,YAAY,KACxC8zB,EAAeooC,IAAkBG,aAChC,CAACvoC,IAEEwoC,EAAyBt8D,YAAY,KACzC8zB,EAAeooC,IAAkBK,mBAChC,CAACzoC,IAEE0oC,EAA4Bx8D,YAAY,KAC5C8zB,EAAeooC,IAAkBO,qBAChC,CAAC3oC,IAEE4oC,EAAiB18D,YAAa+oD,IAClCvyB,EAASuyB,GACTzyB,GAA0B,IACzB,IAEGujB,EAAoB75C,YAAamC,IACrCs3C,EAASt3C,EAAEmI,OAAO7D,OAClB6vB,GAA0B,IACzB,IAEGqmC,EAAoB38D,YAAamC,IACrCw3C,EAASx3C,EAAEmI,OAAO7D,OAClB6vB,GAA0B,IACzB,IAEGsmC,EAAoB58D,YAAY,KACpC,MAAM68D,EAAe5iD,EAAMkb,OACrB2nC,EAAepjB,EAAMvkB,OAEtB0nC,EAAa/9D,OAKlB68D,EAAW,CACT18D,SACAgb,MAAO4iD,EACPnjB,MAAOojB,EACPxlE,UARAi/B,EA/EoB,+BAyFrB,CAACmjB,EAAOz6C,EAAQ3H,EAAO2iB,EAAO0hD,IAE3BoB,EAAqB/8D,YAAY,KACrC8zB,EAAeooC,IAAkBc,eAChC,CAAClpC,IAEEmpC,EAAyBj9D,YAAY,KACzC,IAAKU,EAAKm1B,SACR,OAGF,MAAM,mBAAEqnC,GAAuBx8D,EAAKm1B,SAEpC6lC,EAAuB,CAAEz8D,OAAQyB,EAAKzC,GAAIk/D,WAAYD,KACrD,CAACx8D,EAAMg7D,IAEJ0B,EAA0B76D,YAAQ,KACtC,IAAK7B,EAAK28D,oBACR,OAAO,EAGT,IAAIhvB,EAAa,CACf,eACA,YACA,aACA,YACA,aACA,cACA,eACAv2B,OACCrX,IAASC,EAAK28D,oBAAqB58D,IACpC3B,OAEF,MAAM,aAAEw+D,EAAF,SAAgBC,GAAa78D,EAAK28D,oBAOxC,OAJKC,GAAiBC,IACpBlvB,GAAc,GAGTA,GACN,CAAC3tC,IAEE88D,EAAe98D,EAAKm1B,UAAYn1B,EAAKm1B,SAAS4nC,cAAgB/8D,EAAKm1B,SAAS4nC,aAAa3+D,QAAW,EAEpG4+D,EAAoB19D,YAAY,KAChCs7D,EACFhB,EAAc,CAAEr7D,OAAQyB,EAAKzC,GAAIi9D,MAAOx6D,EAAKu6D,YAAah9D,GAAIyiB,oBAAoB,IACxEhgB,EAAKi9D,UAGf9B,EAAc,CAAE58D,OAAQyB,EAAKzC,KAF7B29D,EAAa,CAAE38D,OAAQyB,EAAKzC,KAI9By8D,IACAH,IACA51C,EAAS,CAAE1mB,QAAI2D,KACd,CACD05D,EAAc56D,EAAKi9D,UAAWj9D,EAAKzC,GAAIyC,EAAKu6D,YAC5CP,EAAmBH,EAAiBD,EAAesB,EAAcC,EAAel3C,IAGlF,GAAIjkB,EAAKohD,aACP,OAGF,MAAMn4B,GAAYrmB,IAAaw3D,IAAmBhkC,WAElD,OACE,yBAAKx2B,UAAU,cACb,yBAAKA,UAAU,iBACb,yBAAKA,UAAU,WACb,kBAACq3B,GAAA,EAAD,CACEf,qBAAsBA,EACtB1qB,SAAUwwD,EACVzwD,UAAWsvD,IAEb,kBAAC1iD,GAAA,EAAD,CACE5a,GAAG,cACH42B,MAAO50B,EAAK,aACZiM,SAAU2tC,EACVpzC,MAAOwT,EACPJ,MA1Kc,+BA0KPA,EAA8BA,OAAQjY,EAC7CqK,UAAWsvD,IAEb,kBAAC1iD,GAAA,EAAD,CACE5a,GAAG,cACHqC,UAAU,OACVu0B,MAAO50B,EAAK,0BACZiM,SAAUywD,EACVl2D,MAAOizC,EACPztC,UAAWsvD,IAEZ76D,EAAKi9D,WACJ,kBAACrkD,GAAA,EAAD,CAAUnW,KAAK,OAAO62B,WAAS,EAACrzB,QAAM,EAACpG,QAAS07D,GAC9C,0BAAM37D,UAAU,SAASL,EAAK,cAC9B,0BAAMK,UAAU,YAAYI,EAAK4nB,SAAWroB,EAAK,cAAgBA,EAAK,iBAGzEm7D,GACC,kBAAC9hD,GAAA,EAAD,CAAUnW,KAAK,UAAU62B,WAAS,EAACrzB,QAAM,EAACpG,QAAS67D,GACjD,0BAAM97D,UAAU,SAASL,EAAK,kBAC9B,0BAAMK,UAAU,YAAYL,EAAK,sBAGrC,kBAACqZ,GAAA,EAAD,CAAUnW,KAAK,cAAc62B,WAAS,EAACrzB,QAAM,EAACpG,QAAS+7D,EAAwBrwD,UAAWwvD,GACxF,0BAAMn7D,UAAU,SAASL,EAAK,uBAC9B,0BAAMK,UAAU,YAAY88D,EAA5B,IA/LoB,IAiMtB,kBAAC9jD,GAAA,EAAD,CAAUnW,KAAK,QAAQ62B,WAAS,EAACrzB,QAAM,EAACpG,QAASi8D,GAC/C,0BAAMl8D,UAAU,SAASL,EAAK,0BAC9B,0BAAMK,UAAU,YAAYs9D,aAAcJ,MAG9C,yBAAKl9D,UAAU,WACb,kBAACgZ,GAAA,EAAD,CAAUnW,KAAK,QAAQ62B,WAAS,EAACrzB,QAAM,EAACpG,QAASw8D,GAC/C,0BAAMz8D,UAAU,SAASL,EAAK,iBAC9B,0BAAMK,UAAU,YAAYs9D,aAAcl9D,EAAKgxC,gBAGhDhxC,EAAKm1B,UACJ,yBAAKv1B,UAAU,gCACb,kBAACi9B,GAAA,EAAD,CACEC,SAAU98B,EAAKm1B,SAASqnC,mBACxBroC,MAAO50B,EAAK,eACZiM,SAAU+wD,EACVhxD,UAAWwvD,MAKnB,yBAAKn7D,UAAU,WACb,kBAACgZ,GAAA,EAAD,CAAUnW,KAAK,SAASwD,QAAM,EAACyc,aAAW,EAAC7iB,QAASk6D,GACjDx6D,EAAK,iBAIZ,kBAAC,GAAD,CACEqL,QAAS+qB,EACT91B,QAASq8D,EACT3wD,SAAU0d,GACV9mB,UAAW5C,EAAK,SAEf0pB,GACC,kBAAC9Z,EAAA,EAAD,CAASjN,MAAM,UAEf,uBAAGtC,UAAU,gBAGjB,kBAACwa,GAAA,EAAD,CACErY,OAAQ+3D,EACRlzD,QAASozD,EACT9lD,UAAW/T,YACTy6D,IAAiB56D,EAAKi9D,UAClB19D,EAAK,2BACLA,EAAK,oCAAqCS,EAAKuZ,OACnD,CAAC,KAAM,oBAETc,aAAcugD,IAAiB56D,EAAKi9D,UAAY19D,EAAK,cAAgBA,EAAK,qBAC1E+a,eAAgB0iD,EAChB9pC,sBAAoB,QCLb7sB,mBAAKhI,YAClB,CAACC,GAAUC,aAGF,CAAEyB,KAFInB,YAAWP,EAAQC,GAEjBqY,cAAetY,EAAOsY,gBAEvC,CAAC5X,EAAWC,IAA2BC,YAAKD,EAAS,CAAC,kCANpCZ,CA1OsD,EACxE+0B,iBACA+pC,qBACAn9D,OACA4W,gBACAwmD,oCAEA,MAAOC,EAAaC,GAAkBv8D,YAA8B,KAC7Dw8D,EAAuBC,GAA4Bz8D,aAAS,IAC5DkoB,EAAW2vC,GAAgB73D,aAAS,GACrCxB,EAAOC,cAEPi+D,EAA0Bn+D,YAAY,KAC1C8zB,EAAeooC,IAAkBkC,oBAChC,CAACtqC,IAEEuqC,EAA0Br+D,YAAY,KAC1C8zB,EAAeooC,IAAkBoC,6BAChC,CAACxqC,IAEEyqC,EAA6Bv+D,YAAammD,IAC9C0X,EAAmB1X,EAAO1sC,OAAQ0sC,EAAOqY,mBAAqBlnD,GAC9Dwc,EAAeooC,IAAkBuC,uBAChC,CAACnnD,EAAeumD,EAAoB/pC,IAEvC9xB,YAAU,KACRg8D,EAAgBt9D,GAAQA,EAAK28D,qBAAwB,IACrDa,GAAyB,GACzBziE,WAAW,KACT69D,GAAa,IAtD0B,MAwDxC,CAAC54D,IAEJ,MAAMg+D,EAAyB1+D,YAAamC,IAC1C,MAAM,KAAE6U,GAAS7U,EAAEmI,OAEnB,SAASq0D,EAA0Bl4D,GACjC,OAAOA,QAAQ7E,EAGjBo8D,EAAgBn4B,IAAD,IACVA,EACH,CAAC7uB,GAAO2nD,EAA0B94B,EAAE7uB,OACvB,iBAATA,GAA2B,CAC7BumD,SAAUoB,EAA0B94B,EAAE7uB,QAG1CknD,GAAyB,IACxB,IAEGU,EAAwB5+D,YAAY,KACnCU,IAIL44D,GAAa,GACbwE,EAA8B,CAAE7+D,OAAQyB,EAAKzC,GAAI4gE,aAAcd,MAC9D,CAACr9D,EAAMq9D,EAAaD,IAEjBgB,EAAoBv8D,YAAQ,IAC3B7B,GAASA,EAAKm1B,UAAan1B,EAAKm1B,SAASkpC,cAIvCr+D,EAAKm1B,SAASkpC,cAAcjgE,OAH1B,EAIR,CAAC4B,IAEEs+D,EAAmBz8D,YAAQ,IAC1B7B,GAASA,EAAKm1B,UAAan1B,EAAKm1B,SAASopC,QAIvCv+D,EAAKm1B,SAASopC,QAAQnnD,OAAO,EAAG+mD,oBAAqBA,GAHnD,GAIR,CAACn+D,IAEEw+D,EAAsBl/D,YAAammD,IACvC,MAAM,aAAE0Y,GAAiB1Y,EACzB,IAAK0Y,IAAiBn+D,EACpB,OAGF,MAAM,oBAAE28D,GAAwB38D,EAEhC,OAAOnC,OAAO6tB,KAAKyyC,GAAcrtB,OAAO,CAACC,EAAQhxC,KAC/C,IACGo+D,EAAap+D,IACV48D,GAAuBA,EAAoB58D,IACpC,eAARA,GAAgC,iBAARA,GAAkC,cAARA,EAErD,OAAOgxC,EAGT,MAAM0tB,EAnHZ,SAAqC1+D,GACnC,OAAQA,GACN,IAAK,eACH,MAAO,yBACT,IAAK,YACH,MAAO,8BACT,IAAK,eACH,MAAO,iCACT,IAAK,aACH,MAAO,+BACT,IAAK,YACH,MAAO,8BACT,IAAK,aACH,MAAO,+BACT,IAAK,cACH,MAAO,8BACT,IAAK,cACH,MAAO,8BACT,QACE,QAgGgB2+D,CAA4B3+D,GAE5C,IAAK0+D,EACH,OAAO1tB,EAGT,MAAM4tB,EAAmBp/D,EAAKk/D,GAE9B,MAAQ,GAAE1tB,IAAUA,EAAO3yC,OAA6B,KAAIugE,EAAxBA,KACnC,KACF,CAAC3+D,EAAMT,IAEV,OACE,yBAAKK,UAAU,cACb,yBAAKA,UAAU,iBACb,yBAAKA,UAAU,WACb,wBAAIA,UAAU,mBAAmBL,EAAK,6BAEtC,yBAAKK,UAAU,yBACb,kBAACi9B,GAAA,EAAD,CACEvmB,KAAK,eACLwmB,SAAUugC,EAAYuB,aACtBzqC,MAAO50B,EAAK,wBACZs/D,UAAQ,EACRrzD,SAAUwyD,KAGd,yBAAKp+D,UAAU,yBACb,kBAACi9B,GAAA,EAAD,CACEvmB,KAAK,YACLwmB,SAAUugC,EAAYyB,UACtB3qC,MAAO50B,EAAK,6BACZs/D,UAAQ,EACRrzD,SAAUwyD,KAGd,yBAAKp+D,UAAU,yBACb,kBAACi9B,GAAA,EAAD,CACEvmB,KAAK,eACLwmB,SAAUugC,EAAYT,eAAiBS,EAAYR,SACnD1oC,MAAO50B,EAAK,gCACZs/D,UAAQ,EACRrzD,SAAUwyD,KAGd,yBAAKp+D,UAAU,yBACb,kBAACi9B,GAAA,EAAD,CACEvmB,KAAK,YACLwmB,SAAUugC,EAAY0B,UACtB5qC,MAAO50B,EAAK,6BACZs/D,UAAQ,EACRrzD,SAAUwyD,KAGd,yBAAKp+D,UAAU,yBACb,kBAACi9B,GAAA,EAAD,CACEvmB,KAAK,aACLwmB,SAAUugC,EAAY2B,WACtB7qC,MAAO50B,EAAK,8BACZs/D,UAAQ,EACRrzD,SAAUwyD,KAGd,yBAAKp+D,UAAU,yBACb,kBAACi9B,GAAA,EAAD,CACEvmB,KAAK,cACLwmB,SAAUugC,EAAY4B,YACtB9qC,MAAO50B,EAAK,+BACZs/D,UAAQ,EACRrzD,SAAUwyD,KAGd,yBAAKp+D,UAAU,yBACb,kBAACi9B,GAAA,EAAD,CACEvmB,KAAK,cACLwmB,SAAUugC,EAAY6B,YACtB/qC,MAAO50B,EAAK,+BACZs/D,UAAQ,EACRrzD,SAAUwyD,KAGd,yBAAKp+D,UAAU,yBACb,kBAACi9B,GAAA,EAAD,CACEvmB,KAAK,aACLwmB,SAAUugC,EAAY8B,WACtBhrC,MAAO50B,EAAK,8BACZs/D,UAAQ,EACRrzD,SAAUwyD,MAKhB,yBAAKp+D,UAAU,WACb,kBAACgZ,GAAA,EAAD,CAAUnW,KAAK,cAAc62B,WAAS,EAACrzB,QAAM,EAACozB,QAAM,EAACx5B,QAAS49D,GAC5D,0BAAM79D,UAAU,SAASL,EAAK,wBAC9B,0BAAMK,UAAU,YAAYw+D,KAIhC,yBAAKx+D,UAAU,WACb,wBAAIA,UAAU,mBAAmBL,EAAK,sBAEtC,kBAACqZ,GAAA,EAAD,CACEnW,KAAK,WACLwD,QAAM,EACNpG,QAAS89D,GAERp+D,EAAK,wBAGP++D,EAAiB3lD,IAAK8sC,GACrB,kBAAC7sC,GAAA,EAAD,CACE7Y,IAAK0lD,EAAO1sC,OACZnZ,UAAU,wCACVqG,QAAM,EACNpG,QAAS,IAAMg+D,EAA2BpY,IAE1C,kBAAC5sC,GAAA,EAAD,CACEE,OAAQ0sC,EAAO1sC,OACfD,OAAQ0lD,EAAoB/Y,SAOtC,kBAAC,GAAD,CACE76C,QAAS2yD,EACT19D,QAASq+D,EACT/7D,UAAW5C,EAAK,QAChBgM,SAAU0d,GAETA,EACC,kBAAC9Z,EAAA,EAAD,CAASjN,MAAM,UAEf,uBAAGtC,UAAU,oBC3LRyG,mBAAKhI,YAClB,CAACC,GAAUC,aACT,MAAMyB,EAAOnB,YAAWP,EAAQC,IACxBkY,KAAMiN,GAAcplB,EAAOqlB,MAEnC,MAAO,CAAE3jB,OAAM0jB,cAEjB,CAAC1kB,EAAWC,IAA2BC,YAAKD,EAAS,CAAC,iCAPpCZ,CAtEuD,EACzE2B,OACA0jB,YACA07C,mCAEA,MAAM7/D,EAAOC,cAEP6/D,EAAiBx9D,YAAQ,IACxB7B,GAASA,EAAKm1B,UAAan1B,EAAKm1B,SAASkpC,cAIvCr+D,EAAKm1B,SAASkpC,cAHZ,GAIR,CAACr+D,IAEEs/D,EAAehgE,YAAammD,IAChC,IAAKA,EAAO8Z,eACV,OAGF,MAAMC,EAAe97C,EAAU+hC,EAAO8Z,gBACtC,OAAKC,EAIEjgE,EAAK,gBAAiBooB,YAAgB63C,SAJ7C,GAKC,CAACjgE,EAAMmkB,IAEJ+7C,EAAoBngE,YAAammD,IACrC,GAAKzlD,EAIL,MAAO,CAAC,CACNuZ,MAAOha,EAAK,WACZkD,KAAM,SACNigB,aAAa,EACb6vB,QAAS,IAAM6sB,EAA6B,CAC1C7gE,OAAQyB,EAAKzC,GACbwb,OAAQ0sC,EAAO1sC,OACfolD,aAAc,QAGjB,CAAC5+D,EAAMS,EAAMo/D,IAEhB,OACE,yBAAKx/D,UAAU,cACb,yBAAKA,UAAU,iBACb,yBAAKA,UAAU,WACb,uBAAGA,UAAU,cAAcL,EAAK,oBAE/B8/D,EAAe1mD,IAAK8sC,GACnB,kBAAC7sC,GAAA,EAAD,CACE7Y,IAAK0lD,EAAO1sC,OACZnZ,UAAU,sBACVqG,QAAM,EACN+c,eAAgBy8C,EAAkBha,IAElC,kBAAC5sC,GAAA,EAAD,CACEE,OAAQ0sC,EAAO1sC,OACfD,OAAQwmD,EAAa7Z,aCqJtBp/C,mBAAKhI,YAClB,CAACC,GAAUC,aACT,MAAMyB,EAAOnB,YAAWP,EAAQC,IAC1B,SAAEqE,GAAatE,EAAOm7D,WAG5B,MAAO,CACLz5D,OACA4C,WACA88D,kBALwB1oE,QAAQgJ,GAAQA,EAAK0/D,mBAM7C7E,cAAeC,YAAiB96D,EAAM,gBAG1C,CAAChB,EAAWC,IAA2BC,YAAKD,EAAS,CACnD,mBAAoB,aAAc,kBAAmB,eAAgB,gBAAiB,aAdtEZ,CA/L6C,EAC/DE,SACAyB,OACA4C,WACA88D,oBACA7E,gBACAznC,iBACA6nC,aACA0E,mBACA9F,kBACAqB,eACAC,gBACAl3C,eAEA,MAAMm3C,EAAep7D,GAAQA,EAAKuZ,OAAe,GAC3C8hD,EAAer7D,GAAQA,EAAKm1B,UAAYn1B,EAAKm1B,SAAS6jB,OAAe,GACrE4mB,EAAgB5/D,GAAQA,EAAKm1B,UAAYn1B,EAAKm1B,SAASwlC,cAEtDb,EAAoBC,EAAkBC,GAAqB93C,gBAC3DyT,EAAwBC,GAA6B70B,aAAS,IAC9DwY,EAAOw/B,GAAYh4C,YAASq6D,IAC5BpiB,EAAOC,GAAYl4C,YAASs6D,IAC5BzkE,EAAOk/B,GAAY/0B,eACnBoY,EAAO0c,GAAY90B,cACpBu6D,EAAYt7D,GAAQuS,YAAkBvS,GACtCk2B,EAAuBzjB,YAAS6oD,GAAW,EAAO5oD,iBAAeC,SACjEpT,EAAOC,cAEb8B,YAAU,KACJsB,IAAaw3D,IAAmB7jC,WAClCX,GAA0B,GAC1BC,OAAS30B,KAEV,CAAC0B,IAEJ,MAAMk6D,EAAe98D,GAAQA,EAAKm1B,UAAYn1B,EAAKm1B,SAAS4nC,cAAgB/8D,EAAKm1B,SAAS4nC,aAAa3+D,QAAW,EAE5Gm9D,EAAsBj8D,YAAY,KACtC8zB,EAAeooC,IAAkBC,kBAChC,CAACroC,IAEEsoC,EAAwBp8D,YAAY,KACxC8zB,EAAeooC,IAAkBG,aAChC,CAACvoC,IAEE0oC,EAA4Bx8D,YAAY,KAC5C8zB,EAAeooC,IAAkBO,qBAChC,CAAC3oC,IAEE4oC,EAAiB18D,YAAa+oD,IAClCvyB,EAASuyB,GACTzyB,GAA0B,IACzB,IAEGujB,EAAoB75C,YAAamC,IACrCs3C,EAASt3C,EAAEmI,OAAO7D,OAClB6vB,GAA0B,IACzB,IAEGqmC,EAAoB38D,YAAamC,IACrCw3C,EAASx3C,EAAEmI,OAAO7D,OAClB6vB,GAA0B,IACzB,IAEGiqC,EAAsBvgE,YAAY,KACtC,MAAM68D,EAAe5iD,EAAMkb,OACrB2nC,EAAepjB,EAAMvkB,OAEtB0nC,EAAa/9D,OAKlB68D,EAAW,CACT18D,SACAgb,MAAO4iD,EACPnjB,MAAOojB,EACPxlE,UARAi/B,EAvEsB,iCAiFvB,CAACmjB,EAAOz6C,EAAQ3H,EAAO2iB,EAAO0hD,IAE3B6E,EAAyBxgE,YAAY,KACzCqgE,EAAiB,CAAEphE,SAAQk+D,WAAYiD,KACtC,CAACnhE,EAAQmhE,EAAmBC,IAEzBI,EAAyBzgE,YAAY,KACzC8zB,EAAeooC,IAAkBwE,qBAChC,CAAC5sC,IAGE6sC,EAAsB3gE,YAAY,KAClCU,EAAKi9D,UACP9B,EAAc,CAAE58D,OAAQyB,EAAKzC,KAE7B29D,EAAa,CAAE38D,OAAQyB,EAAKzC,KAG9By8D,IACAH,IACA51C,EAAS,CAAE1mB,QAAI2D,KACd,CAAClB,EAAKi9D,UAAWj9D,EAAKzC,GAAIy8D,EAAmBH,EAAiBqB,EAAcC,EAAel3C,IAE9F,GAAIjkB,EAAKohD,aACP,OAGF,MAAMn4B,EAAYrmB,IAAaw3D,IAAmBhkC,WAElD,OACE,yBAAKx2B,UAAU,cACb,yBAAKA,UAAU,iBACb,yBAAKA,UAAU,WACb,kBAACq3B,GAAA,EAAD,CACEf,qBAAsBA,EACtB1qB,SAAUwwD,EACVzwD,UAAWsvD,IAEb,kBAAC1iD,GAAA,EAAD,CACE5a,GAAG,gBACH42B,MAAO50B,EAAK,oBACZiM,SAAU2tC,EACVpzC,MAAOwT,EACPJ,MA5HgB,iCA4HTA,EAAgCA,OAAQjY,EAC/CqK,UAAWsvD,IAEb,kBAAC1iD,GAAA,EAAD,CACE5a,GAAG,gBACHqC,UAAU,OACVu0B,MAAO50B,EAAK,0BACZiM,SAAUywD,EACVl2D,MAAOizC,EACPztC,UAAWsvD,IAEZ76D,EAAKi9D,WACJ,kBAACrkD,GAAA,EAAD,CAAUnW,KAAK,OAAOwD,QAAM,EAACqzB,WAAS,EAACz5B,QAAS07D,GAC9C,0BAAM37D,UAAU,SAASL,EAAK,gBAC9B,0BAAMK,UAAU,YAAYI,EAAK4nB,SAAWroB,EAAK,cAAgBA,EAAK,iBAG1E,kBAACqZ,GAAA,EAAD,CAAUnW,KAAK,UAAU62B,WAAS,EAACrzB,QAAM,EAACpG,QAAS67D,EAAuBnwD,UAAWsvD,GACnF,0BAAMj7D,UAAU,SAASL,EAAK,eAC9B,0BAAMK,UAAU,YAA4BL,EAAhBqgE,EAAqB,mBAA2B,SAE9E,kBAAChnD,GAAA,EAAD,CAAUnW,KAAK,QAAQ62B,WAAS,EAACrzB,QAAM,EAACpG,QAASi8D,GAC/C,0BAAMl8D,UAAU,SAASL,EAAK,0BAC9B,0BAAMK,UAAU,YAAYk9D,IAE9B,yBAAKl9D,UAAU,gCACb,kBAACi9B,GAAA,EAAD,CACEC,QAAS4iC,EACTvrC,MAAO50B,EAAK,uBACZiM,SAAUs0D,MAIhB,yBAAKlgE,UAAU,WACb,kBAACgZ,GAAA,EAAD,CAAUnW,KAAK,QAAQ62B,WAAS,EAACrzB,QAAM,EAACpG,QAASkgE,GAC/C,0BAAMngE,UAAU,QAAQM,IAAI,QAAQX,EAAK,uBACzC,0BAAMK,UAAU,WAAWM,IAAI,QAAQX,EAAK,cAAeS,EAAKgxC,aAAe,QAGnF,yBAAKpxC,UAAU,WACb,kBAACgZ,GAAA,EAAD,CAAUnW,KAAK,SAASwD,QAAM,EAACyc,aAAW,EAAC7iB,QAASk6D,GACjD/5D,EAAKi9D,UAAY19D,EAAK,iBAAmBA,EAAK,mBAIrD,kBAAC,GAAD,CACEqL,QAAS+qB,EACT91B,QAASggE,EACTt0D,SAAU0d,EACV9mB,UAAW5C,EAAK,SAEf0pB,EACC,kBAAC9Z,EAAA,EAAD,CAASjN,MAAM,UAEf,uBAAGtC,UAAU,gBAGjB,kBAACwa,GAAA,EAAD,CACErY,OAAQ+3D,EACRlzD,QAASozD,EACTj3D,KAAM/C,EAAKi9D,UAAY19D,EAAK,sBAAwBA,EAAK,qBACzD8a,aAAcra,EAAKi9D,UAAY19D,EAAK,iBAAmBA,EAAK,gBAC5D+a,eAAgB2lD,EAChB/sC,sBAAoB,Q,SCvEb7sB,mBAAKhI,YAClB,CAACC,GAAUC,aACT,MAAMyB,EAAOnB,YAAWP,EAAQC,IAC1B,oBAAEw1B,GAAwBmsC,YAAiB5hE,EAAQC,GAEzD,MAAO,CACLyB,OACAsgB,UAAWC,aAAcvgB,GACzB4C,SAAUtE,EAAOm7D,WAAW72D,SAC5BmxB,wBAGJ,CAAC/0B,EAAWC,IAAYC,YAAKD,EAAS,CACpC,kBAAmB,mBAAoB,sBAbvBZ,CAtHqD,EACvE2B,OACAsgB,YACA1d,WACAmxB,sBACAosC,kBACAC,mBACAC,wBAEA,MAAMnU,EAAWl1D,QAAQgJ,EAAK4nB,UACxB04C,EAActgE,EAAKm1B,UAAYn1B,EAAKm1B,SAASorC,YAE5CC,EAAaC,GAAkB1/D,YAAsBmrD,EAAW,SAAW,YAC3EtkC,EAAUqM,GAAelzB,eACzB2/D,EAA2BC,EAAyBC,GAA4B1+C,eAEjF2+C,EACa,WAAhBL,GAA4B54C,GAAYmM,GACrB,YAAhBysC,GAA6BtU,EAGnC5qD,YAAU,KACJk/D,IAAgBF,GAClBD,KAED,CAACG,EAAaF,EAAaD,IAE9B,MAAMS,EAAqBxhE,YAAayG,IACtC06D,EAAe16D,IACd,IAEGg7D,EAAazhE,YAAY,KAC7B8gE,EAAiB,CAAEx4C,SAA0B,WAAhB44C,EAA2B54C,EAAW,MAClE,CAAC44C,EAAaJ,EAAkBx4C,IAE7Bo5C,EAA0B1hE,YAAY,KAC1CshE,IACAP,KACC,CAACO,EAA0BP,IAExB9gE,EAAOC,cACPyhE,EAAc3gD,EAAY,UAAY,OACtC4gD,EAAc5gD,EAAY,UAAY,QAEtC6d,EAAU,CACd,CAAEp4B,MAAO,UAAWouB,MAAO50B,EAAQ0hE,EAAF,WAAyBx+B,SAAUljC,EAAQ0hE,EAAF,gBAC1E,CAAEl7D,MAAO,SAAUouB,MAAO50B,EAAQ0hE,EAAF,UAAwBx+B,SAAUljC,EAAQ0hE,EAAF,gBAGpEh4C,EAAYrmB,IAAaw3D,IAAmBhkC,WAElD,OACE,yBAAKx2B,UAAU,cACb,yBAAKA,UAAU,iBACb,yBAAKA,UAAU,WACb,wBAAIA,UAAU,mBAAmBL,EAAQ2hE,EAAF,SACvC,kBAAC79B,GAAA,EAAD,CACEC,SAAUk9B,EACVlqD,KAAK,eACL6nB,QAASA,EACT3yB,SAAUs1D,KAGG,YAAhBN,EACC,yBAAK5gE,UAAU,WACZ0gE,EACC,oCACE,kBAACa,GAAA,EAAD,CAAU76D,IAAKg6D,EAAa1gE,UAAU,aAAamD,KAAMu9D,IACzD,uBAAG1gE,UAAU,gBAAgBL,EAAQ0hE,EAAF,oBAEnC,kBAACroD,GAAA,EAAD,CAAUnW,KAAK,SAASwD,QAAM,EAACyc,aAAW,EAAC7iB,QAAS8gE,GACjDphE,EAAK,eAER,kBAAC6a,GAAA,EAAD,CACErY,OAAQ2+D,EACR95D,QAASg6D,EACT79D,KAAMxD,EAAK,eACX8a,aAAc9a,EAAK,gBACnB+a,eAAgB0mD,EAChB9tC,sBAAoB,KAIxB,kBAACja,GAAA,EAAD,OAIJ,yBAAKrZ,UAAU,qBACb,kBAACs3B,GAAD,CACEpD,QAAM,EACND,gBAAiB7zB,EAAK4nB,SACtBqB,UAAWA,EACX8K,oBAAqBA,EACrBC,cAAemsC,EACf30D,SAAUyoB,IAEZ,uBAAGr0B,UAAU,eAAeM,IAAI,QAC7BX,EAAQ2hE,EAAF,qCAKf,kBAAC,GAAD,CACEt2D,QAASi2D,EACTt1D,SAAU0d,EACV9mB,UAAW5C,EAAK,QAChBM,QAASkhE,GAER93C,EACC,kBAAC9Z,EAAA,EAAD,CAASjN,MAAM,UAEf,uBAAGtC,UAAU,oBCoGRyG,mBAAKhI,YAClB,CAACC,GAAUC,aACT,MAAMyB,EAAOnB,YAAWP,EAAQC,IAC1B,iBAAE6iE,EAAkB3qD,KAAMm8B,GAAet0C,EAAOkY,MAKtD,MAAO,CACLxW,OACA4yC,aACAwuB,mBACAC,WARiBrhE,GAAQA,EAAKm1B,UAAYn1B,EAAKm1B,SAASwlC,aACtD97D,YAAWP,EAAQ0B,EAAKm1B,SAASwlC,mBACjCz5D,EAOFof,UAAWtgB,GAAQugB,aAAcvgB,KAGrC,CAAChB,EAAWC,IAA2BC,YAAKD,EAAS,CACnD,0BAA2B,sBAAuB,0BAjBlCZ,CApNgD,EAClE2B,OACAzB,SACAq0C,aACAyuB,aACAD,mBACA9gD,YACA8S,iBACAkuC,0BACAC,sBACAC,4BAEA,MAAOC,EAAeC,GAAoB3gE,eACnCo3B,EAAeC,GAAoBr3B,eACnCs3B,EAAmBC,GAAwBv3B,aAAS,GACrDw3B,EAAsBj5B,YAAY,IAAMg5B,GAAqB,GAAO,KACnEqpC,EAAgCC,EAA8BC,GAAiC3/C,gBAC/F4/C,EAA8BC,EAA4BC,GAA+B9/C,eAC1F3iB,EAAOC,cACPm7D,EAAe0G,GAAcA,EAAW9jE,GAE9C+D,YAAU,KACRggE,KACC,CAACA,IAEJhgE,YAAU,KACH62B,GACHK,aAAiB,oBAAoBC,KAAKL,IAE3C,CAACD,IAEJ,MAAM8pC,EAA4B3iE,YAAY,KAC5CuiE,IACAL,EAAsB,CAAEU,UAAW5hD,EAAY/hB,EAASo8D,IACnDr6C,GACH8S,EAAeooC,IAAkB2G,UAElC,CAACN,EAA+BL,EAAuBlhD,EAAW/hB,EAAQo8D,EAAcvnC,IAErFgvC,EAA0B9iE,YAAY,KAC1C0iE,IACAT,EAAoB,CAAEW,UAAW3jE,EAAQA,OAAQkjE,KAChD,CAACO,EAA6BT,EAAqBhjE,EAAQkjE,IAoB9D,SAASY,IACP,MAAMC,EAAc1vB,EAAW6uB,GAE/B,GAAKa,EAIL,OACE,yBAAK1iE,UAAU,gBACb,kBAACE,EAAA,EAAD,CACEzG,KAAK,OACL2G,KAAMsiE,IAER,yBAAK1iE,UAAU,eACZL,EAAK,uCAMd,SAASgjE,IACP,MAAMD,EAAc1vB,EAAW6uB,GAE/B,GAAKa,EAIL,OAAIA,EAAYE,eACPriE,YACJ,yBAAwBmiE,EAAY/oD,sCAAsCvZ,EAAMuZ,WACjF,CAAC,KAAM,oBAQJpZ,YAEJ,yBAAwBmiE,EAAY/oD,sCAAsCvZ,EAAMuZ,kFACjF,CAAC,KAAM,oBAqFX,OACE,yBAAK3Z,UAAU,cACb,yBAAKA,UAAU,iBACb,yBAAKA,UAAU,WACb,yBAAKA,UAAU,gBACZu4B,GACC,kBAACY,GAAA,EAAD,CACEx7B,GAAG,wBACHlE,KAAMopE,KACNtqC,cAAeA,EACfjvB,KAAMmvB,EACNY,QAAM,EACNC,OAAQX,KAIb8oC,GA3FL,6BACE,kBAACzoD,GAAA,EAAD,CACEhZ,UAAU,sBACV67B,UAAQ,GAER,kBAACziB,GAAA,EAAD,CAAeza,OAAQ8iE,EAAY9jE,MAErC,kBAACqb,GAAA,EAAD,CACEnW,KAAK,SACLwD,QAAM,EACNyc,aAAW,EACX7iB,QAAS+hE,GAERriE,EAAK+gB,EAAY,wBAA0B,4BAE9C,kBAAClG,GAAA,EAAD,CACErY,OAAQ4/D,EACR/6D,QAASi7D,EACTvpD,OAhFJ,yBAAK1Y,UAAU,gBACb,kBAACE,EAAA,EAAD,CACEzG,KAAK,OACL2G,KAAMqhE,IAER,yBAAKzhE,UAAU,eACZL,EAAK+gB,EAAY,wBAA0B,6BA2E5CpM,UAAW/T,YACTZ,EAAK+gB,EAAY,+BAAiC,6BAA8B+gD,EAAY9nD,OAC5F,CAAC,KAAM,oBAETc,aAAc9a,EAAK+gB,EAAY,wBAA0B,2BACzDhG,eAAgB2nD,EAChB/uC,sBAAoB,MAmElBmuC,GA3DN,6BACE,uBAAGzhE,UAAU,eAAeM,IAAI,QAAQX,EAAK,0BAE7C,yBAAKmjE,eAAa,GAChB,kBAAC9pD,GAAA,EAAD,CACE7Y,IAAI,eACJ0C,KAAK,QACLwD,QAAM,EACN08D,cAAe,EACf/iE,UAAU,mBAETL,EAAK,0BAEP6hE,EACCA,EAAiBzoD,IAAI,CAACpb,EAAIggB,IACxB,kBAAC3E,GAAA,EAAD,CACE7Y,IAAKxC,EACLolE,cAAeplD,EAAI,EACnB3d,UAAU,kCACVC,QAAS,KAxHrB6hE,EAwH+CnkE,GAvH/CwkE,MAyHY,kBAAC/oD,GAAA,EAAD,CAAeza,OAAQhB,MAI3B,kBAACirB,GAAA,EAAD,CAAczoB,IAAI,gBAAgB4iE,cAAe,EAAG5/D,KAAK,gCAG7D,uBAAGnD,UAAU,yBAAyBM,IAAI,QAAQX,EAAK,2BACvD,kBAAC6a,GAAA,EAAD,CACErY,OAAQ+/D,EACRl7D,QAASo7D,EACT1pD,OAAQ+pD,IACRnuD,UAAWquD,IACXloD,aAAc9a,EAAK,uBACnB+a,eAAgB8nD,EAChBQ,mBAAiB,WCiCZv8D,mBAAKhI,YAClB,CAACC,GAAUC,SAAQskE,8BACjB,MAAM7iE,EAAOnB,YAAWP,EAAQC,GAGhC,MAAO,CAAEyB,OAAM8iE,sBAFe9iE,EAAKi9D,WAAa4F,KAIlD,CAAC7jE,EAAWC,IAA2BC,YAAKD,EAAS,CAAC,iCAPpCZ,CA5N0D,EAC5E2B,OACA+iE,uBACA3vC,iBACAgsC,+BACA0D,0BAEA,MAAOzF,EAAaC,GAAkBv8D,YAA8B,KAC7Dw8D,EAAuBC,GAA4Bz8D,aAAS,IAC5DkoB,EAAW2vC,GAAgB73D,aAAS,IACpCiiE,EAA6BC,EAA2BC,GAA8BhhD,eACvF3iB,EAAOC,cAEP2jE,EAAqBthE,YAAQ,KACjC,GAAK7B,GAASA,EAAKm1B,UAAan1B,EAAKm1B,SAASopC,QAI9C,OAAOv+D,EAAKm1B,SAASopC,QAAQhjC,KAAK,EAAGxiB,YAAaA,IAAWgqD,IAC5D,CAAC/iE,EAAM+iE,IAEVzhE,YAAU,KACJtB,GAAQA,EAAKm1B,UAAY4tC,IAAyBI,GACpD/vC,EAAeooC,IAAkBK,mBAElC,CAAC77D,EAAMozB,EAAgB+vC,EAAoBJ,IAE9CzhE,YAAU,KACRg8D,EAAgB6F,GAAsBA,EAAmBhF,cAAkBn+D,GAAQA,EAAK28D,qBAAwB,IAChHa,GAAyB,GACzB5E,GAAa,IACZ,CAAC54D,EAAMmjE,IAEV,MAAMnF,EAAyB1+D,YAAamC,IAC1C,MAAM,KAAE6U,GAAS7U,EAAEmI,OAEnB,SAASq0D,EAA0Bl4D,GACjC,OAAOA,QAAQ7E,EAGjBo8D,EAAgBn4B,IAAD,IACVA,EACH,CAAC7uB,GAAO2nD,EAA0B94B,EAAE7uB,OACvB,iBAATA,GAA2B,CAC7BumD,SAAUoB,EAA0B94B,EAAE7uB,QAG1CknD,GAAyB,IACxB,IAEGU,EAAwB5+D,YAAY,KACnCU,GAAS+iE,IAIdnK,GAAa,GACbwG,EAA6B,CAC3B7gE,OAAQyB,EAAKzC,GACbwb,OAAQgqD,EACR5E,aAAcd,MAEf,CAACr9D,EAAM+iE,EAAsB1F,EAAa+B,IAEvCgE,EAAqB9jE,YAAY,KAChCU,GAAS+iE,GAId3D,EAA6B,CAC3B7gE,OAAQyB,EAAKzC,GACbwb,OAAQgqD,EACR5E,aAAc,CACZkF,cAAc,MAGjB,CAACrjE,EAAM+iE,EAAsB3D,IAE1BkE,EAAuBhkE,YAAaS,KACpC+iE,MAIC9iE,IAASA,EAAK28D,sBAIZ38D,EAAK28D,oBAAoB58D,GAC/B,CAACC,EAAM8iE,IAEV,GAAKK,EAIL,OACE,yBAAKvjE,UAAU,cACb,yBAAKA,UAAU,iBACb,yBAAKA,UAAU,WACb,kBAACgZ,GAAA,EAAD,CAAU6iB,UAAQ,EAAC77B,UAAU,uBAC3B,kBAACiZ,GAAA,EAAD,CAAiBE,OAAQoqD,EAAmBpqD,UAG9C,wBAAInZ,UAAU,wBAAwBL,EAAK,0BAE3C,yBAAKK,UAAU,yBACb,kBAACi9B,GAAA,EAAD,CACEvmB,KAAK,eACLwmB,SAAUugC,EAAYuB,aACtBzqC,MAAO50B,EAAK,wBACZs/D,UAAQ,EACRtzD,SAAU+3D,EAAqB,gBAC/B93D,SAAUwyD,KAGd,yBAAKp+D,UAAU,yBACb,kBAACi9B,GAAA,EAAD,CACEvmB,KAAK,YACLwmB,SAAUugC,EAAYyB,UACtB3qC,MAAO50B,EAAK,6BACZs/D,UAAQ,EACRtzD,SAAU+3D,EAAqB,aAC/B93D,SAAUwyD,KAGd,yBAAKp+D,UAAU,yBACb,kBAACi9B,GAAA,EAAD,CACEvmB,KAAK,eACLwmB,SAAUugC,EAAYT,eAAiBS,EAAYR,SACnD1oC,MAAO50B,EAAK,gCACZs/D,UAAQ,EACRtzD,SAAU+3D,EAAqB,gBAC/B93D,SAAUwyD,KAGd,yBAAKp+D,UAAU,yBACb,kBAACi9B,GAAA,EAAD,CACEvmB,KAAK,YACLwmB,SAAUugC,EAAY0B,UACtB5qC,MAAO50B,EAAK,6BACZs/D,UAAQ,EACRtzD,SAAU+3D,EAAqB,aAC/B93D,SAAUwyD,KAGd,yBAAKp+D,UAAU,yBACb,kBAACi9B,GAAA,EAAD,CACEvmB,KAAK,aACLwmB,SAAUugC,EAAY2B,WACtB7qC,MAAO50B,EAAK,8BACZs/D,UAAQ,EACRtzD,SAAU+3D,EAAqB,cAC/B93D,SAAUwyD,KAGd,yBAAKp+D,UAAU,yBACb,kBAACi9B,GAAA,EAAD,CACEvmB,KAAK,cACLwmB,SAAUugC,EAAY4B,YACtB9qC,MAAO50B,EAAK,+BACZs/D,UAAQ,EACRtzD,SAAU+3D,EAAqB,eAC/B93D,SAAUwyD,KAGd,yBAAKp+D,UAAU,yBACb,kBAACi9B,GAAA,EAAD,CACEvmB,KAAK,cACLwmB,SAAUugC,EAAY6B,YACtB/qC,MAAO50B,EAAK,+BACZs/D,UAAQ,EACRtzD,SAAU+3D,EAAqB,eAC/B93D,SAAUwyD,KAGd,yBAAKp+D,UAAU,yBACb,kBAACi9B,GAAA,EAAD,CACEvmB,KAAK,aACLwmB,SAAUugC,EAAY8B,WACtBhrC,MAAO50B,EAAK,8BACZs/D,UAAQ,EACRtzD,SAAU+3D,EAAqB,cAC/B93D,SAAUwyD,OAKd8E,GACA,yBAAKljE,UAAU,WACb,kBAACgZ,GAAA,EAAD,CAAUnW,KAAK,cAAcwD,QAAM,EAACyc,aAAW,EAAC7iB,QAASojE,GACtD1jE,EAAK,4BAMd,kBAAC,GAAD,CACEqL,QAAS2yD,EACT19D,QAASq+D,EACT/7D,UAAW5C,EAAK,QAChBgM,SAAU0d,GAETA,EACC,kBAAC9Z,EAAA,EAAD,CAASjN,MAAM,UAEf,uBAAGtC,UAAU,gBAIjB,kBAACwa,GAAA,EAAD,CACErY,OAAQihE,EACRp8D,QAASs8D,EACTngE,KAAK,oEACLsX,aAAa,SACbC,eAAgB8oD,EAChBlwC,sBAAoB,QCtIb7sB,mBAAKhI,YAClB,CAACC,GAAUC,aACT,MAAMyB,EAAOnB,YAAWP,EAAQC,IACxBkY,KAAMiN,GAAcplB,EAAOqlB,MAEnC,MAAO,CACL3jB,OACA4W,cAAetY,EAAOsY,cACtB0J,UAAWC,aAAcvgB,GACzB0jB,cATcrlB,CAtFwC,EAC1D2B,OACAsgB,YACA1J,gBACA8M,YACA0P,iBACA+pC,yBAEA,MAAM59D,EAAOC,cAMb,MAAMu9D,EAAel7D,YAAQ,IACtB7B,EAAKm1B,UAAan1B,EAAKm1B,SAAS4nC,aAI9B/8D,EAAKm1B,SAAS4nC,aAAa/0C,KAAK,CAACC,EAAGC,IACrCD,EAAEs7C,SACI,EACCr7C,EAAEq7C,QACJ,EAGF,GAVA,GAYR,CAACvjE,IAEEwjE,EAAyBlkE,YAAammD,IAC1C0X,EAAmB1X,EAAO1sC,OAAQ0sC,EAAOqY,mBAAqBlnD,GAC9Dwc,EAAeooC,IAAkBiI,kBAChC,CAAC7sD,EAAeumD,EAAoB/pC,IAEjCswC,EAAkBpkE,YAAammD,IACnC,GAAIA,EAAO8d,QACT,OAAOhkE,EAAK,kBAGd,MAAMokE,EAAiBle,EAAOqY,iBAAmBp6C,EAAU+hC,EAAOqY,uBAAoB58D,EAEtF,OAAIyiE,EACKpkE,EAAK,sBAAuBooB,YAAgBg8C,IAG9CpkE,EAAK,iBACX,CAACA,EAAMmkB,IAEV,OACE,yBAAK9jB,UAAU,cACb,yBAAKA,UAAU,iBACb,yBAAKA,UAAU,WACb,kBAACgZ,GAAA,EAAD,CAAUnW,KAAK,SAAS62B,WAAS,EAACrzB,QAAM,EAACpG,QA3CjD,WACEuzB,EAAeooC,IAAkBoI,sBA2CzB,0BAAMhkE,UAAU,SAASL,EAAK,aAC9B,0BAAMK,UAAU,YAAYL,EAAK+gB,EAAY,4BAA8B,yBAI/E,yBAAK1gB,UAAU,WACb,uBAAGA,UAAU,aAAaM,IAAI,QAC3BogB,EACG,8DACA,6DAGLy8C,EAAapkD,IAAK8sC,GACjB,kBAAC7sC,GAAA,EAAD,CACE7Y,IAAK0lD,EAAO1sC,OACZnZ,UAAU,sBACVqG,QAAM,EACNpG,QAAS,IAAM2jE,EAAuB/d,IAEtC,kBAAC5sC,GAAA,EAAD,CACEE,OAAQ0sC,EAAO1sC,OACfD,OAAQ4qD,EAAgBje,GACxBvN,eAAa,YCyCd7xC,mBAAKhI,YAClB,CAACC,GAAUC,aAGF,CAAEyB,KAFInB,YAAWP,EAAQC,KAFhBF,CA5HwC,EAAG2B,WAC7D,MAAMT,EAAOC,cAEPu9D,EAAel7D,YAAQ,IACtB7B,GAASA,EAAKm1B,UAAan1B,EAAKm1B,SAAS4nC,aAIvC/8D,EAAKm1B,SAAS4nC,aAAa/0C,KAAK,CAACC,EAAGC,IACrCD,EAAEs7C,SACI,EACCr7C,EAAEq7C,QACJ,EAGF,GAVA,GAYR,CAACvjE,IAEE0jE,EAAkBpkE,YAAammD,GAC/BA,EAAO8d,QACFhkE,EAAK,kBAGPA,EAAK,gBACX,CAACA,IAEJ,OACE,yBAAKK,UAAU,cACb,yBAAKA,UAAU,iBACb,yBAAKA,UAAU,2BACb,wBAAIA,UAAU,mBAAd,WAEA,yBAAKA,UAAU,yBACb,kBAACi9B,GAAA,EAAD,CACEvmB,KAAK,aACLwmB,SAAS,EACT3I,MAAO50B,EAAK,qBACZiM,cAAUtK,KAGd,yBAAKtB,UAAU,yBACb,kBAACi9B,GAAA,EAAD,CACEvmB,KAAK,aACLwmB,SAAS,EACT3I,MAAO50B,EAAK,2BACZiM,cAAUtK,KAGd,yBAAKtB,UAAU,yBACb,kBAACi9B,GAAA,EAAD,CACEvmB,KAAK,aACLwmB,SAAS,EACT3I,MAAO50B,EAAK,4BACZiM,cAAUtK,KAGd,yBAAKtB,UAAU,yBACb,kBAACi9B,GAAA,EAAD,CACEvmB,KAAK,aACLwmB,SAAS,EACT3I,MAAO50B,EAAK,6BACZiM,cAAUtK,KAGd,yBAAKtB,UAAU,yBACb,kBAACi9B,GAAA,EAAD,CACEvmB,KAAK,aACLwmB,SAAS,EACT3I,MAAO50B,EAAK,iCACZiM,cAAUtK,KAGd,yBAAKtB,UAAU,yBACb,kBAACi9B,GAAA,EAAD,CACEvmB,KAAK,aACLwmB,SAAS,EACT3I,MAAO50B,EAAK,gCACZiM,cAAUtK,KAGd,yBAAKtB,UAAU,yBACb,kBAACi9B,GAAA,EAAD,CACEvmB,KAAK,aACLwmB,SAAS,EACT3I,MAAO50B,EAAK,gCACZiM,cAAUtK,MAKhB,yBAAKtB,UAAU,2BACb,wBAAIA,UAAU,mBAAmBL,EAAK,6BAEtC,yBAAKK,UAAU,yBACb,kBAACi9B,GAAA,EAAD,CACEvmB,KAAK,aACLwmB,SAAS,EACT3I,MAAO50B,EAAK,qBACZiM,cAAUtK,KAIb67D,EAAapkD,IAAK8sC,GACjB,kBAAC7sC,GAAA,EAAD,CACE7Y,IAAK0lD,EAAO1sC,OACZnZ,UAAU,uCACVC,aAASqB,EACT+E,QAAM,GAEN,kBAAC42B,GAAA,EAAD,CAAU1I,MAAM,GAAG2I,SAAS,IAC5B,kBAACjkB,GAAA,EAAD,CACEE,OAAQ0sC,EAAO1sC,OACfD,OAAQ4qD,EAAgBje,GACxBvN,eAAa,YCkMd7xC,mBAAKhI,YAClB,CAACC,GAAUC,SAAQskE,8BACjB,MAAM7iE,EAAOnB,YAAWP,EAAQC,IACxBkY,KAAMiN,GAAcplB,EAAOqlB,OAC7B,cAAE/M,GAAkBtY,EAI1B,MAAO,CACL0B,OACA0jB,YACA9M,gBACA0J,UAPgBC,aAAcvgB,GAQ9B8iE,sBAP4B9iE,EAAKi9D,WAAa4F,KAUlD,CAAC7jE,EAAWC,IAA2BC,YAAKD,EAAS,CAAC,oBAhBpCZ,CA/RsD,EACxE0kE,uBACA3vC,iBACApzB,OACA0jB,YACA9M,gBACA0J,YACAwiD,sBACAe,sBAEA,MAAOxG,EAAaC,GAAkBv8D,YAA6B,KAC5D4tB,EAAWm1C,GAAgB/iE,aAAS,IACpCkoB,EAAW2vC,GAAgB73D,aAAS,IACpCgjE,EAAiCC,EAA+BC,GAAkC/hD,gBAClGgiD,EAAaC,GAAkBpjE,YAAS,IACzCxB,EAAOC,cAEP2jE,EAAqBthE,YAAQ,KACjC,GAAK7B,EAAKm1B,UAAan1B,EAAKm1B,SAAS4nC,aAIrC,OAAO/8D,EAAKm1B,SAAS4nC,aAAaxhC,KAAK,EAAGxiB,YAAaA,IAAWgqD,IACjE,CAAC/iE,EAAM+iE,IAEVzhE,YAAU,KACJtB,GAAQA,EAAKm1B,UAAY4tC,IAAyBI,GACpD/vC,EAAeooC,IAAkBO,qBAElC,CAAC/7D,EAAMozB,EAAgB+vC,EAAoBJ,IAE9CzhE,YAAU,KACRg8D,EAAgB6F,GAAsBA,EAAmBiB,aAAgB,IACzED,GAAiBhB,GAAsBA,EAAmBe,aAAgB,IAAI10B,OAAO,EAnCzD,KAoC5Bs0B,GAAa,GACblL,GAAa,IACZ,CAACuK,IAEJ,MAAMnF,EAAyB1+D,YAAamC,IAC1C,MAAM,KAAE6U,GAAS7U,EAAEmI,OAMnB0zD,EAAgBn4B,IAAD,UACVA,EACH,CAAC7uB,IANgCvQ,EAMCo/B,EAAE7uB,IAL7BvQ,QAAQ7E,IADjB,IAAmC6E,IAQnC+9D,GAAa,IACZ,IAEG5F,EAAwB5+D,YAAY,KACnCyjE,IAILnK,GAAa,GACbiL,EAAgB,CACdtlE,OAAQyB,EAAKzC,GACbwb,OAAQgqD,EACRqB,YAAa/G,EACb6G,kBAED,CAAClkE,EAAM+iE,EAAsB1F,EAAa6G,EAAaL,IAEpDQ,EAAqB/kE,YAAY,KAChCyjE,IAILc,EAAgB,CACdtlE,OAAQyB,EAAKzC,GACbwb,OAAQgqD,EACRqB,YAAa,KAEfH,MACC,CAACjkE,EAAKzC,GAAI0mE,EAAgClB,EAAsBc,IAE7DP,EAAuBhkE,YAAaS,IACpCyf,aAAiBxf,QAIjB8iE,GAAwB9iE,EAAKokE,eAIzBpkE,EAAKokE,YAAarkE,IACzB,CAACC,EAAM8iE,IAEJwB,EAAeziE,YAAQ,KAC3B,IAAKshE,EACH,OAGF,GAAIA,EAAmBI,QACrB,OAAOhkE,EAAK,kBAGd,MAAMokE,EAAiBR,EAAmBrF,iBACtCp6C,EAAUy/C,EAAmBrF,uBAC7B58D,EAEJ,OAAIyiE,EACKpkE,EAAK,sBAAuBooB,YAAgBg8C,IAG9CpkE,EAAK,iBACX,CAAC4jE,EAAoBz/C,EAAWnkB,IAE7BglE,EAA0BjlE,YAAamC,IAC3C,MAAM,MAAEsE,GAAUtE,EAAEmI,OACpBu6D,EAAep+D,GACf+9D,GAAa,IACZ,IAEH,GAAKX,EAIL,OACE,yBAAKvjE,UAAU,cACb,yBAAKA,UAAU,iBACb,yBAAKA,UAAU,WACb,kBAACgZ,GAAA,EAAD,CAAU6iB,UAAQ,EAAC77B,UAAU,uBAC3B,kBAACiZ,GAAA,EAAD,CACEE,OAAQoqD,EAAmBpqD,OAC3BD,OAAQwrD,EACRpsB,eAAa,KAIjB,wBAAIt4C,UAAU,wBAAwBL,EAAK,uBAE3C,yBAAKK,UAAU,yBACb,kBAACi9B,GAAA,EAAD,CACEvmB,KAAK,aACLwmB,UAAWugC,EAAY8B,WACvBhrC,MAAO50B,EAAK+gB,EAAY,6BAA+B,4BACvDu+C,UAAQ,EACRtzD,SAAU+3D,EAAqB,cAC/B93D,SAAUwyD,KAGb19C,GACC,yBAAK1gB,UAAU,yBACb,kBAACi9B,GAAA,EAAD,CACEvmB,KAAK,eACLwmB,UAAWugC,EAAYmH,aACvBrwC,MAAO50B,EAAK,yBACZs/D,UAAQ,EACRtzD,SAAU+3D,EAAqB,gBAC/B93D,SAAUwyD,KAIf19C,GACC,yBAAK1gB,UAAU,yBACb,kBAACi9B,GAAA,EAAD,CACEvmB,KAAK,eACLwmB,UAAWugC,EAAYoH,aACvBtwC,MAAO50B,EAAK,yBACZs/D,UAAQ,EACRtzD,SAAU+3D,EAAqB,gBAC/B93D,SAAUwyD,KAIhB,yBAAKp+D,UAAU,yBACb,kBAACi9B,GAAA,EAAD,CACEvmB,KAAK,iBACLwmB,UAAWugC,EAAYz9C,eACvBuU,MAAO50B,EAAK+gB,EAAY,0BAA4B,gCACpDu+C,UAAQ,EACRtzD,SAAU+3D,EAAqB,kBAC/B93D,SAAUwyD,MAGZ19C,GACA,yBAAK1gB,UAAU,yBACb,kBAACi9B,GAAA,EAAD,CACEvmB,KAAK,WACLwmB,UAAWugC,EAAYqH,SACvBvwC,MAAO50B,EAAK,qBACZs/D,UAAQ,EACRtzD,SAAU+3D,EAAqB,YAC/B93D,SAAUwyD,KAIhB,yBAAKp+D,UAAU,yBACb,kBAACi9B,GAAA,EAAD,CACEvmB,KAAK,cACLwmB,UAAWugC,EAAY4B,YACvB9qC,MAAO50B,EAAK,qBACZs/D,UAAQ,EACRtzD,SAAU+3D,EAAqB,eAC/B93D,SAAUwyD,MAGZ19C,GACA,yBAAK1gB,UAAU,yBACb,kBAACi9B,GAAA,EAAD,CACEvmB,KAAK,cACLwmB,UAAWugC,EAAY6B,YACvB/qC,MAAO50B,EAAK,wBACZs/D,UAAQ,EACRtzD,SAAU+3D,EAAqB,eAC/B93D,SAAUwyD,KAIhB,yBAAKp+D,UAAU,yBACb,kBAACi9B,GAAA,EAAD,CACEvmB,KAAK,YACLwmB,UAAWugC,EAAYsH,UACvBxwC,MAAO50B,EAAK,sBACZs/D,UAAQ,EACRtzD,SAAU+3D,EAAqB,aAC/B93D,SAAUwyD,MAGZ19C,GACA,yBAAK1gB,UAAU,yBACb,kBAACi9B,GAAA,EAAD,CACEvmB,KAAK,YACLwmB,UAAWugC,EAAYuH,UACvBzwC,MAAO50B,EAAK,4BACZs/D,UAAQ,EACRtzD,SAAU+3D,EAAqB,aAC/B93D,SAAUwyD,KAKf8E,GACC,uBAAGljE,UAAU,qBACVL,EAAK,kCAIR+gB,GACA,kBAACnI,GAAA,EAAD,CACE5a,GAAG,cACH42B,MAAO50B,EAAK,iBACZiM,SAAU+4D,EACVx+D,MAAOm+D,EACP34D,SAAUu3D,EACV+B,UA3PkB,KA+PrBjuD,IAAkBmsD,IAAyBD,GAC1C,kBAAClqD,GAAA,EAAD,CAAUnW,KAAK,SAASwD,QAAM,EAACyc,aAAW,EAAC7iB,QAASmkE,GACjDzkE,EAAK,2BAMd,kBAAC,GAAD,CACEqL,QAAS+jB,EACT9uB,QAASq+D,EACT/7D,UAAW5C,EAAK,QAChBgM,SAAU0d,GAETA,EACC,kBAAC9Z,EAAA,EAAD,CAASjN,MAAM,UAEf,uBAAGtC,UAAU,gBAIjB,kBAACwa,GAAA,EAAD,CACErY,OAAQgiE,EACRn9D,QAASq9D,EACTlhE,KAAK,+CACLsX,aAAa,UACbC,eAAgB+pD,EAChBnxC,sBAAoB,QCzPb7sB,mBAAKhI,YAClB,CAACC,GAAUC,aACT,MAAMyB,EAAOnB,YAAWP,EAAQC,IACxBkY,KAAMiN,GAAcplB,EAAOqlB,MAInC,MAAO,CACL46C,QAJcv+D,GAAQA,EAAKm1B,UAAYn1B,EAAKm1B,SAASopC,QAKrD76C,YACApD,UALgBtgB,GAAQugB,aAAcvgB,KAQ1C,CAAChB,EAAWC,IAA2BC,YAAKD,EAAS,CACnD,iBAdgBZ,CA9CkD,EACpEkgE,UACA76C,YACApD,YACAwkD,mBAEA,MAAMlsB,EAAY/2C,YAAQ,KACxB,GAAK08D,GAAY76C,EAIjB,OAAOu0B,aAAYsmB,EAAQ5lD,IAAI,EAAGI,YAAaA,GAAS2K,IACvD,CAAC66C,EAAS76C,IAEPu1C,EAAoB35D,YAAa/B,IACrCunE,EAAa,CAAEvnE,QACd,CAACunE,IAEJ,OACE,yBAAKllE,UAAU,cACb,yBAAKA,UAAU,iBACb,yBAAKA,UAAU,UAAU8iE,eAAa,GACnC9pB,EACCA,EAAUjgC,IAAI,CAACpb,EAAIggB,IACjB,kBAAC3E,GAAA,EAAD,CACE7Y,IAAKxC,EACLolE,cAAeplD,EACf3d,UAAU,kCACVC,QAAS,IAAMo5D,EAAkB17D,IAEjC,kBAACsb,GAAA,EAAD,CAAiBE,OAAQxb,EAAI26C,eAAa,MAI9C,kBAAC1vB,GAAA,EAAD,CACEm6C,cAAe,EACf5iE,IAAI,gBACJgD,KAAMud,EAAY,uBAAyB,2BCY1Cja,mBAAKhI,YAClB,CAACC,GAAUC,aACT,MAAMyB,EAAOnB,YAAWP,EAAQC,IACxBkY,KAAMiN,GAAcplB,EAAOqlB,MAInC,MAAO,CACL46C,QAJcv+D,GAAQA,EAAKm1B,UAAYn1B,EAAKm1B,SAASopC,QAKrD76C,YACApD,UALgBtgB,GAAQugB,aAAcvgB,KALxB3B,CAjDgD,EAClEqlB,YACA66C,UACAj+C,YACA8S,iBACA+pC,yBAEA,MAAMvkB,EAAY/2C,YAAQ,KACxB,GAAK08D,GAAY76C,EAIjB,OAAOu0B,aAAYsmB,EAAQnnD,OAAQquC,IAAYA,EAAO8d,SAAS5qD,IAAI,EAAGI,YAAaA,GAAS2K,IAC3F,CAAC66C,EAAS76C,IAEPm6C,EAA6Bv+D,YAAaylE,IAC9C5H,EAAmB4H,GACnB3xC,EAAeooC,IAAkBuC,uBAChC,CAACZ,EAAoB/pC,IAExB,OACE,yBAAKxzB,UAAU,cACb,yBAAKA,UAAU,iBACb,yBAAKA,UAAU,UAAU8iE,eAAa,GACnC9pB,EACCA,EAAUjgC,IAAI,CAACpb,EAAIggB,IACjB,kBAAC3E,GAAA,EAAD,CACE7Y,IAAKxC,EACLolE,cAAeplD,EACf3d,UAAU,kCACVC,QAAS,IAAMg+D,EAA2BtgE,IAE1C,kBAACsb,GAAA,EAAD,CAAiBE,OAAQxb,EAAI26C,eAAa,MAI9C,kBAAC1vB,GAAA,EAAD,CACEm6C,cAAe,EACf5iE,IAAI,gBACJgD,KAAMud,EAAY,uBAAyB,2BCyE1Cja,mBAAKhI,YACjBC,IAGQ,CACL0mE,eAHqBC,YAA4B3mE,KAFnCD,CAzG0B,EAC5CE,SACA4wB,gBACA4zC,uBACAF,0BACAzvC,iBACA+pC,qBACA6H,qBAEA,OAAQ71C,GACN,KAAKqsC,IAAkB2G,QACrB,OAAQ6C,GACN,IAAK,OACH,OAAO,kBAAC,GAAD,CAAYjlE,IAAKxB,EAAQwa,OAAQxa,IAC1C,IAAK,QACH,OAAO,kBAAC,GAAD,CAAawB,IAAKxB,EAAQA,OAAQA,EAAQ60B,eAAgBA,IACnE,IAAK,UACH,OAAO,kBAAC,GAAD,CAAerzB,IAAKxB,EAAQA,OAAQA,EAAQ60B,eAAgBA,IAGvE,MAGF,KAAKooC,IAAkBC,gBACrB,OACE,kBAAC,GAAD,CAAuBl9D,OAAQA,IAGnC,KAAKi9D,IAAkBG,WACrB,OACE,kBAAC,GAAD,CACEp9D,OAAQA,EACR60B,eAAgBA,IAItB,KAAKooC,IAAkBK,iBACrB,OACE,kBAAC,GAAD,CACEt9D,OAAQA,EACR60B,eAAgBA,EAChB+pC,mBAAoBA,IAI1B,KAAK3B,IAAkBkC,kBACrB,OACE,kBAAC,GAAD,CAAyBn/D,OAAQA,IAGrC,KAAKi9D,IAAkBoC,2BACrB,OACE,kBAAC,GAAD,CACEr/D,OAAQA,EACR4+D,mBAAoBA,EACpB/pC,eAAgBA,IAItB,KAAKooC,IAAkBuC,qBACrB,OACE,kBAAC,GAAD,CACEx/D,OAAQA,EACRwkE,qBAAsBA,EACtBF,wBAAyBA,EACzBzvC,eAAgBA,IAItB,KAAKooC,IAAkBO,mBACrB,OACE,kBAAC,GAAD,CACEx9D,OAAQA,EACR60B,eAAgBA,EAChB+pC,mBAAoBA,IAI1B,KAAK3B,IAAkBoI,mBACrB,OACE,kBAAC,GAAD,CACErlE,OAAQA,IAId,KAAKi9D,IAAkBiI,gBACrB,OACE,kBAAC,GAAD,CACEllE,OAAQA,EACRwkE,qBAAsBA,EACtBF,wBAAyBA,EACzBzvC,eAAgBA,IAItB,KAAKooC,IAAkBwE,mBACvB,KAAKxE,IAAkBc,aACrB,OACE,kBAAC,GAAD,CAAoB/9D,OAAQA,QCpIpC,MAAM2mE,GAAqC,CACzCC,IAAK,IACLC,IAAK,IACLC,IAAK,IACLC,IAAK,IACLC,IAAK,IACLC,IAAK,IACLC,IAAK,IACLC,IAAK,OAGA,SAASC,GAAgBC,GAC9B,OAAKA,GAGEV,GAAWU,IAFT,GCbX,MAAMC,GAAO,8BACPC,GAAc,uBACdC,GAAc,uBAEb,IAAKC,I,SAAAA,O,qBAAAA,I,eAAAA,I,4BAAAA,Q,KAMZ,MAAMC,GAAgC,CACpC,CAACD,GAASE,SAAU,GACpB,CAACF,GAASG,MAAO,OACjB,CAACH,GAASI,YAAa,cAGlB,SAASC,GAAeC,GAE7B,OADAA,EAAaA,EAAW1oD,QAAQ,MAAO,IACnCioD,GAAKvxC,KAAKgyC,GACLN,GAASG,KAEdL,GAAYxxC,KAAKgyC,IAAeP,GAAYzxC,KAAKgyC,GAC5CN,GAASI,WAEXJ,GAASE,Q,aCSlB,MAAM33C,GAA2B,CAC/Bg4C,YAAa,GACbC,YAAa,GACbC,KAAM,GACN55C,MAAO,GACP65C,YAAa,GACbC,SAAU,GACVj/C,SAAU,GACVuH,MAAO,GACP23C,MAAO,GACPC,SAAU,GACVP,WAAY,GACZQ,WAAY,GACZC,OAAQ,GACRC,IAAK,GACLC,eAAgB,GAChBC,WAAY,GACZC,UAAU,EACVC,iBAAiB,EACjBC,WAAY,IAGR36C,GAAgD,CAACG,EAAOE,KAC5D,OAAQA,EAAOlnB,MACb,IAAK,iBACH,MAAO,IACFgnB,EACH05C,YAAax5C,EAAO2B,QACpB24C,WAAY,IACPx6C,EAAMw6C,WACTd,iBAAarlE,IAGnB,IAAK,iBACH,MAAO,IACF2rB,EACH25C,YAAaz5C,EAAO2B,QACpB24C,WAAY,IACPx6C,EAAMw6C,WACTb,iBAAatlE,IAGnB,IAAK,aACH,MAAO,IACF2rB,EACH45C,KAAM15C,EAAO2B,QACb24C,WAAY,IACPx6C,EAAMw6C,WACTZ,UAAMvlE,IAGZ,IAAK,cACH,MAAO,IACF2rB,EACHA,MAAOE,EAAO2B,QACd24C,WAAY,IACPx6C,EAAMw6C,WACTx6C,WAAO3rB,IAGb,IAAK,gBACH,MAAO,IACF2rB,EACH65C,YAAa35C,EAAO2B,QACpBu4C,eAAgBK,GAAkBv6C,EAAO2B,SACzC24C,WAAY,IACPx6C,EAAMw6C,WACTX,iBAAaxlE,IAGnB,IAAK,iBACH,MAAO,IACF2rB,EACH85C,SAAU55C,EAAO2B,QACjB24C,WAAY,IACPx6C,EAAMw6C,WACTV,cAAUzlE,IAGhB,IAAK,iBACH,MAAO,IACF2rB,EACHnF,SAAUqF,EAAO2B,QACjB24C,WAAY,IACPx6C,EAAMw6C,WACT3/C,cAAUxmB,IAGhB,IAAK,cACH,MAAO,IACF2rB,EACHoC,MAAOlC,EAAO2B,QACd24C,WAAY,IACPx6C,EAAMw6C,WACTp4C,WAAO/tB,IAGb,IAAK,cACH,MAAO,IACF2rB,EACH+5C,MAAO75C,EAAO2B,QACd24C,WAAY,IACPx6C,EAAMw6C,WACTT,WAAO1lE,IAGb,IAAK,iBACH,MAAO,IAAK2rB,EAAOg6C,SAAU95C,EAAO2B,SACtC,IAAK,mBACH,MAAO,IACF7B,EACHy5C,WAAYv5C,EAAO2B,QACnB24C,WAAY,IACPx6C,EAAMw6C,WACTf,gBAAYplE,IAGlB,IAAK,mBACH,MAAO,IACF2rB,EACHi6C,WAAY/5C,EAAO2B,QACnB24C,WAAY,IACPx6C,EAAMw6C,WACTP,gBAAY5lE,IAGlB,IAAK,mBACH,MAAO,IACF2rB,EACHk6C,OAAQh6C,EAAO2B,QACf24C,WAAY,IACPx6C,EAAMw6C,WACTN,YAAQ7lE,IAGd,IAAK,gBACH,MAAO,IACF2rB,EACHm6C,IAAKj6C,EAAO2B,QACZ24C,WAAY,IACPx6C,EAAMw6C,WACTL,SAAK9lE,IAGX,IAAK,uBACH,MAAO,IACF2rB,EACHo6C,eAAgBl6C,EAAO2B,QACvB24C,WAAY,IACPx6C,EAAMw6C,WACTJ,oBAAgB/lE,IAGtB,IAAK,mBACH,MAAO,IACF2rB,EACHq6C,WAAYn6C,EAAO2B,QACnB24C,WAAY,IACPx6C,EAAMw6C,WACTH,gBAAYhmE,IAGlB,IAAK,iBACH,MAAO,IAAK2rB,EAAOs6C,SAAUp6C,EAAO2B,SACtC,IAAK,wBACH,MAAO,IAAK7B,EAAOu6C,gBAAiBr6C,EAAO2B,SAC7C,IAAK,iBACH,OAAI3B,EAAO2B,QAAQg4C,YACV,IACF75C,KACAE,EAAO2B,QACVu4C,eAAgBK,GAAkBv6C,EAAO2B,QAAQg4C,cAG9C,IAAK75C,KAAUE,EAAO2B,SAC/B,IAAK,gBACH,MAAO,IACF7B,EACHw6C,WAAY,IACPx6C,EAAMw6C,cACNt6C,EAAO2B,UAGhB,QACE,OAAO7B,IAIb,SAASy6C,GAAkBC,GACzB,MAAMj2B,EAAUk2B,KAAYjsC,KAAK,EAAGh+B,QAASA,IAAOgqE,GACpD,OAAOj2B,EAAUA,EAAQh7B,KAAO,GCvNnB,SAASmxD,GACtBt9D,EAAkCu9D,EAHX,KAKvBpmE,YAAU,KACJ0F,KAIJjM,WAAW,KACT+4D,YAAQ,KACF3pD,EAAItC,SACNsC,EAAItC,QAAQyP,WAGfowD,IACF,CAACv9D,EAAKu9D,ICoCIrhE,mBAzCeyiB,IAC5B,MAAM,GACJvrB,EADI,MAEJwI,EAFI,MAGJouB,EAHI,SAIJwzC,EAJI,MAKJxuD,EALI,IAMJhP,EANI,YAOJiO,EAPI,SAQJ5M,EARI,SASJU,GACE4c,EACE8+C,EAAYzuD,GAASgb,EACrBkM,EAAgB/0B,aACpB,cACAvF,GAAS,UACToT,GAAS,QACTyuD,GAAa,aACbD,GAAY,aACZ,eAGF,OACE,yBAAK/nE,UAAWygC,GACd,4BACEzgC,UAAU,eACVrC,GAAIA,EACJwI,MAAOA,GAAS,GAChByF,SAAUA,EACV4M,YAAaA,GAAe+b,EAC5BhqB,IAAKA,GAEJ+B,GAEF07D,GAAarqE,GACZ,2BAAOsqE,QAAStqE,GAAKqqE,M,OCqJdvhE,mBAlLoB,EACjCwmB,QACAi7C,YACAC,YACAC,WACAC,cACAluC,eAGA,MAAM/uB,EAAWlE,YAAyB,MAEpCohE,EAAWphE,YAAyB,MAEpCqhE,EAAmBrhE,YAA0B,MAEnDxF,YAAU,KACJ6mE,EAAiBtgE,SAChBsgE,EAAiBtgE,QAAQ9B,QAAU8mB,EAAM65C,cAC5CyB,EAAiBtgE,QAAQ9B,MAAQ8mB,EAAM65C,cAExC,CAAC75C,EAAM65C,cAEV,MAAMnnE,EAAOC,cAEbioE,GAAuBz8D,GAEvB,MAAMo9D,EAAuB9oE,YAAamC,IACxCs4B,EAAS,CAAEl0B,KAAM,iBAAkB6oB,QAASjtB,EAAEmI,OAAO7D,SACpD,CAACg0B,IAEEsuC,EAAuB/oE,YAAamC,IACxCs4B,EAAS,CAAEl0B,KAAM,iBAAkB6oB,QAASjtB,EAAEmI,OAAO7D,SACpD,CAACg0B,IAEEuuC,EAAmBhpE,YAAamC,IACpCs4B,EAAS,CAAEl0B,KAAM,aAAc6oB,QAASjtB,EAAEmI,OAAO7D,SAChD,CAACg0B,IAEEwuC,EAAoBjpE,YAAamC,IACrCs4B,EAAS,CAAEl0B,KAAM,cAAe6oB,QAASjtB,EAAEmI,OAAO7D,SACjD,CAACg0B,IAEEyuC,EAAsBlpE,YAAamC,IACvCs4B,EAAS,CAAEl0B,KAAM,gBAAiB6oB,QAASjtB,EAAEmI,OAAO7D,SACnD,CAACg0B,IAEE0uC,EAAuBnpE,YAAamC,IACxCs4B,EAAS,CAAEl0B,KAAM,iBAAkB6oB,QAASjtB,EAAEmI,OAAO7D,SACpD,CAACg0B,IAEE2uC,EAAuBppE,YAAamC,IACxCs4B,EAAS,CAAEl0B,KAAM,iBAAkB6oB,QAASjtB,EAAEmI,OAAO7D,SACpD,CAACg0B,IAEE4uC,EAAoBrpE,YAAamC,IACrCs4B,EAAS,CAAEl0B,KAAM,cAAe6oB,QAASjtB,EAAEmI,OAAO7D,SACjD,CAACg0B,IAEE6uC,EAAoBtpE,YAAamC,IACrC,IAAI,MAAEsE,GAAUtE,EAAEmI,OAClB7D,EAAS,IAAGA,EAAM6X,QAAQ,MAAO,IAC7BsqD,EAASrgE,UACXqgE,EAASrgE,QAAQ9B,MAAQA,GAE3Bg0B,EAAS,CAAEl0B,KAAM,cAAe6oB,QAAS3oB,KACxC,CAACg0B,IAEE8uC,EAAuBvpE,YAAamC,IACxCs4B,EAAS,CAAEl0B,KAAM,iBAAkB6oB,QAASjtB,EAAEmI,OAAO7D,SACpD,CAACg0B,KAEE,WAAEstC,GAAex6C,EACvB,OACE,yBAAKjtB,UAAU,gBACb,8BACGqoE,EACC,6BACE,4BAAK1oE,EAAK,2BACV,kBAAC4Y,GAAA,EAAD,CACEhO,IAAKa,EACLmpB,MAAM,oBACN3oB,SAAU48D,EACVriE,MAAO8mB,EAAM05C,YACb3nD,UAAU,OACVzF,MAAOkuD,EAAWd,cAEpB,kBAACpuD,GAAA,EAAD,CACEgc,MAAM,oBACN3oB,SAAU68D,EACVtiE,MAAO8mB,EAAM25C,YACb5nD,UAAU,OACVzF,MAAOkuD,EAAWb,cAEpB,kBAACruD,GAAA,EAAD,CACEgc,MAAM,OACN3oB,SAAU88D,EACVviE,MAAO8mB,EAAM45C,KACb7nD,UAAU,OACVzF,MAAOkuD,EAAWZ,OAEpB,kBAACtuD,GAAA,EAAD,CACEgc,MAAM,QACN3oB,SAAU+8D,EACVxiE,MAAO8mB,EAAMA,MACbjO,UAAU,OACVzF,MAAOkuD,EAAWx6C,QAEpB,kBAAC,GAAD,CACEsH,MAAM,UACN/b,YAAY,UACZ5M,SAAUg9D,EACVziE,MAAO8mB,EAAM65C,YACbiB,SAAU3wE,SAAQ,GAClBuG,GAAG,mBACH4b,MAAOkuD,EAAWX,YAClBv8D,IAAKg+D,GAEJX,KAAY7uD,IAAI,EAAGrC,OAAM/Y,QACxB,4BACEwI,MAAOxI,EACPqC,UAAU,eAET0W,KAKP,kBAAC6B,GAAA,EAAD,CACEgc,MAAM,YACN3oB,SAAUi9D,EACV1iE,MAAO8mB,EAAM85C,SACb/nD,UAAU,OACVzF,MAAOkuD,EAAWV,iBAGpBzlE,EACF8mE,GAAYF,GAAaC,EACzB,4BAAKxoE,EAAK,iCACR2B,EACF8mE,GACA,kBAAC7vD,GAAA,EAAD,CACEgc,MAAM,YACN3oB,SAAUk9D,EACV3iE,MAAO8mB,EAAMnF,SACb9I,UAAU,OACVzF,MAAOkuD,EAAW3/C,WAGpBogD,GACA,kBAAC3vD,GAAA,EAAD,CACEgc,MAAM,QACN3oB,SAAUm9D,EACV5iE,MAAO8mB,EAAMoC,MACbrQ,UAAU,QACVzF,MAAOkuD,EAAWp4C,QAGpB84C,GACA,kBAAC5vD,GAAA,EAAD,CACEgc,MAAM,eACN3oB,SAAUo9D,EACV7iE,MAAO8mB,EAAM+5C,MACbhoD,UAAU,MACVzF,MAAOkuD,EAAWT,MAClBz8D,IAAK+9D,IAGT,kBAACrrC,GAAA,EAAD,CACE1I,MAAO50B,EAAK,uBACZkjC,SAAUljC,EAAK,2BACfu9B,QAAS9lC,QAAQ61B,EAAMs6C,UACvB37D,SAAUq9D,Q,OC1ILxiE,mBAtCgB,EAC7BwmB,QACAi8C,kBACAlD,WACA7rC,eAEAz4B,YAAU,KACHwnE,IAAmBj8C,EAAMg6C,UAG9B9sC,EAAS,CAAEl0B,KAAM,iBAAkB6oB,QAASo6C,EAAgB,GAAGvrE,MAC9D,CAACurE,EAAiBj8C,EAAMg6C,SAAU9sC,IAErC,MAAMgvC,EAAuBzpE,YAAayG,IACxCg0B,EAAS,CAAEl0B,KAAM,iBAAkB6oB,QAAS3oB,KAC3C,CAACg0B,IAEEoE,EAAUt8B,YAAQ,IAAOinE,EAAgBnwD,IAAI,EAAGpb,GAAIwI,EAAOwT,MAAO4a,EAAO60C,aAA5B,CACjD70C,QACAsO,SAAW,GAAEmjC,KAAYtqD,OAAO0tD,EAAS,OACzCjjE,WACI,CAAC+iE,EAAiBlD,IAExB,OACE,yBAAKhmE,UAAU,YACb,8BACE,qDACA,kBAACyjC,GAAA,EAAD,CACE/sB,KAAK,mBACL6nB,QAASA,EACT3yB,SAAUu9D,EACVzlC,SAAUzW,EAAMg6C,e,OC+B1B,SAASoC,GAAkB1vD,EAAexT,EAAe6/D,EAAmBsD,GAAO,GACjF,OACE,yBAAKtpE,UAAY,oBAAkBspE,EAAO,uBAAyB,KACjE,yBAAKtpE,UAAU,SACX2Z,GAEJ,yBAAK3Z,UAAU,SACV,GAAEgmE,GAAY,OAAO7/D,EAAQ,KAAK3B,QAAQ,OAMrD,SAAS+kE,GAAmB1mE,EAAc8W,EAAewuB,GACvD,OACE,yBAAKnoC,UAAU,sBACb,uBAAGA,UAAW6C,GAAd,KACA,yBAAK7C,UAAU,QACb,yBAAKA,UAAU,SACX2Z,GAEJ,uBAAG3Z,UAAU,QACTmoC,KAOG1hC,mBAjFgB,EAC7B+iE,iBACAC,SACAC,iBACAC,eACA3D,WACA4D,iBAGA,MAAM,SAAEC,EAAF,MAAYlwD,EAAZ,KAAmBxW,GAAUqmE,GAAkB,IAC/C,cACJM,EADI,gBAEJC,EAFI,gBAGJC,EAHI,KAIJtzD,EAJI,MAKJswD,EALI,eAMJiD,GACGN,GAAgB,GACrB,OACE,yBAAK3pE,UAAU,YACb,yBAAKA,UAAU,yBACX6pE,GACA,yBAAK5sE,IAAK4sE,EAAUx6D,IAAI,KAE1B,yBAAKrP,UAAU,QACb,4BAAM2Z,GACN,2BAAKxW,KAGT,yBAAKnD,UAAU,cACXypE,GAAUA,EAAO1wD,IAAKmxD,GACtBb,GAAkBa,EAAK31C,MAAO21C,EAAKd,OAAQpD,GAAU,IAErD0D,GAAkBA,EAAe3wD,IAAKmxD,GACtCb,GAAkBa,EAAK31C,MAAO21C,EAAKd,OAAQpD,GAAU,SAEtC1kE,IAAfsoE,GACAP,GAAkB,QAASO,EAAY5D,GAAU,IAGrD,yBAAKhmE,UAAU,gBACZ8pE,GAAiBP,GAAmB,YAAaO,EAAe,kBAChEC,GAAmBR,GAAmB,kBAAmBQ,EAAiB,oBAC1EC,GAAmBT,GAAmB,gBAAiBS,EAAiB,oBACxEtzD,GAAQ6yD,GAAmB,YAAa7yD,EAAM,QAC9CswD,GAASuC,GAAmB,aAAcvC,EAAO,gBACjDiD,GAAkBV,GAAmB,aAAcU,EAAgB,uBC5B7DxjE,mBA/BoB,EAAGN,QAAOoT,QAAO3N,eAElD,MAAMu+D,EAAiBjjE,YAAyB,MAE1CwO,EAAgBhW,YAAamC,IACjC,GAAc,cAAVA,EAAE1B,KAA0D,MAAnCgG,EAAMikE,OAAOjkE,EAAM3H,OAAS,GAAY,CACnE,MAAM82C,EAAWnvC,EAAMylB,MAAM,EAAGzlB,EAAM3H,OAAS,GAC3C2rE,EAAeliE,UACjBkiE,EAAeliE,QAAQ9B,MAAQmvC,KAGlC,CAACnvC,IAEEs4B,EAAe/+B,YAAamC,IAChC+J,EC9BG,SAA0B43C,GAE/B,MAAM6mB,GADN7mB,EAAQA,EAAMxlC,QAAQ,SAAU,IAAI4N,MAAM,EAAG,IACzB9F,MAAM,WAO1B,OANIukD,GAASA,EAAM,IAAMtgE,OAAOsgE,EAAM,IAAM,KAC1CA,EAAM,GAAK,MAETA,GAASA,EAAM,IAA0B,IAApBA,EAAM,GAAG7rE,SAAiB6rE,EAAM,KACvDA,EAAM,GAAK,IAENA,EAAQA,EAAMv/D,KAAK,KAAO,GDqBtBw/D,CAAiBzoE,EAAEmI,OAAO7D,SAClC,CAACyF,IAEJ,OACE,kBAAC2M,GAAA,EAAD,CACEgc,MAAM,cACNhqB,IAAK4/D,EACLv+D,SAAU6yB,EACV8rC,UAAW70D,EACXvP,MAAOA,EACPoT,MAAOA,EACPyF,UAAU,UACVimD,UAlCmB,MERV,I,OAAA,IAA0B,mDCA1B,OAA0B,4CCmE1Bx+D,mBA1CkB,EAAGN,QAAOoT,QAAO3N,eAEhD,MAAM4+D,EAAgBtjE,YAAyB,MAE/C2gE,GAAuB2C,GAEvB,MAAOC,EAAUC,GAAevpE,YAAiBilE,GAASE,SAC1D5kE,YAAU,KACR,MAAMipE,EAAclE,GAAetgE,GACnCukE,EAAYC,IAEX,IAEH,MAAMlsC,EAAe/+B,YAAamC,IAChC,MAAMyzC,EH3BH,SAA0BkO,GAE/B,MAAM6mB,GADN7mB,EAAQA,EAAMxlC,QAAQ,SAAU,KACZ8H,MAAM,WAC1B,OAAOukD,EAAQA,EAAMv/D,KAAK,KAAO,GGwBd8/D,CAAiB/oE,EAAEmI,OAAO7D,OACrCwkE,EAAclE,GAAe5kE,EAAEmI,OAAO7D,OAC5CukE,EAAYC,GACZ/+D,EAAS0pC,GACLk1B,EAAcviE,UAChBuiE,EAAcviE,QAAQ9B,MAAQmvC,IAE/B,CAAC1pC,EAAU4+D,IAERK,EAqBR,SAAqBJ,GACnB,OAAQA,GACN,KAAKrE,GAASI,WACZ,OAAO,yBAAKvpE,IAAK6tE,GAAoBz7D,IAAI,KAC3C,KAAK+2D,GAASG,KACZ,OAAO,yBAAKtpE,IAAK8tE,GAAc17D,IAAI,KACrC,QACE,QA5Ba27D,CAAYP,GAE7B,OACE,yBAAKzqE,UAAU,aACb,0BAAMA,UAAU,cAAc6qE,GAC9B,kBAACtyD,GAAA,EAAD,CACEhO,IAAKigE,EACLj2C,MAAM,cACN3oB,SAAU6yB,EACVt4B,MAAOA,EACP6Y,UAAU,UACVhf,UAAWyqE,EAAW,iBAAmB,GACzClxD,MAAOA,EACP0rD,UA5CuB,Q,OC0IhBx+D,mBAlImB,EAChCwmB,QACAg+C,qBACAC,qBACAC,cACAC,UACAjxC,eAGA,MAAMouC,EAAmBrhE,YAA0B,MAEnDxF,YAAU,KACJ6mE,EAAiBtgE,SAChBsgE,EAAiBtgE,QAAQ9B,QAAU8mB,EAAMo6C,iBAC5CkB,EAAiBtgE,QAAQ9B,MAAQ8mB,EAAMo6C,iBAExC,CAACp6C,EAAMo6C,iBAEV,MAAMgE,EAAyB3rE,YAAayG,IAC1Cg0B,EAAS,CAAEl0B,KAAM,mBAAoB6oB,QAAS3oB,KAC7C,CAACg0B,IAEEmxC,EAAyB5rE,YAAamC,IAC1Cs4B,EAAS,CAAEl0B,KAAM,mBAAoB6oB,QAASjtB,EAAEmI,OAAO7D,MAAMolE,iBAC5D,CAACpxC,IAEEqxC,EAAqB9rE,YAAayG,IACtCg0B,EAAS,CAAEl0B,KAAM,mBAAoB6oB,QAAS3oB,KAC7C,CAACg0B,IAEEsxC,EAAkB/rE,YAAamC,IACnCs4B,EAAS,CAAEl0B,KAAM,gBAAiB6oB,QAASjtB,EAAEmI,OAAO7D,SACnD,CAACg0B,IAEEyuC,EAAsBlpE,YAAamC,IACvCs4B,EAAS,CAAEl0B,KAAM,uBAAwB6oB,QAASjtB,EAAEmI,OAAO7D,SAC1D,CAACg0B,IAEEuxC,EAA8BhsE,YAAamC,IAC/Cs4B,EAAS,CAAEl0B,KAAM,mBAAoB6oB,QAASjtB,EAAEmI,OAAO7D,SACtD,CAACg0B,IAEEwxC,EAA8BjsE,YAAamC,IAC/Cs4B,EAAS,CAAEl0B,KAAM,wBAAyB6oB,QAASjtB,EAAEmI,OAAO7D,SAC3D,CAACg0B,IAEEx6B,EAAOC,eAEP,WAAE6nE,EAAa,IAAOx6C,EAE5B,OACE,yBAAKjtB,UAAU,eACb,8BACE,4BAAKL,EAAK,qBACV,kBAAC,GAAD,CACEiM,SAAUy/D,EACVllE,MAAO8mB,EAAMy5C,WACbntD,MAAOkuD,EAAWf,aAElBwE,GACA,kBAAC3yD,GAAA,EAAD,CACEgc,MAAM,eACN3oB,SAAU0/D,EACVnlE,MAAO8mB,EAAMi6C,WACbloD,UAAU,OACVzF,MAAOkuD,EAAWP,aAGtB,6BAASlnE,UAAU,iBACjB,kBAAC,GAAD,CACEmG,MAAO8mB,EAAMk6C,OACbv7D,SAAU4/D,EACVjyD,MAAOkuD,EAAWN,SAEpB,kBAAC5uD,GAAA,EAAD,CACEgc,MAAM,WACN3oB,SAAU6/D,EACVtlE,MAAO8mB,EAAMm6C,IACbpoD,UAAU,UACVimD,UAAW,EACX1rD,MAAOkuD,EAAWL,OAGpB+D,GAAeC,EACf,4BAAKzrE,EAAK,+BACR2B,EACF6pE,GACA,kBAAC,GAAD,CACE52C,MAAM,UACN/b,YAAY,UACZ5M,SAAUg9D,EACVziE,MAAO8mB,EAAMo6C,eACbU,SAAU3wE,SAAQ,GAClBuG,GAAG,kBACH4b,MAAOkuD,EAAWJ,eAClB98D,IAAKg+D,GAGHX,KAAY7uD,IAAI,EAAGrC,UACjB,4BACEvQ,MAAOuQ,EACP1W,UAAU,eAET0W,KAMT00D,GACA,kBAAC7yD,GAAA,EAAD,CACEgc,MAAM,YACN3oB,SAAU8/D,EACVvlE,MAAO8mB,EAAMq6C,WACbtoD,UAAU,OACVzF,MAAOkuD,EAAWH,aAGpB2D,GACA,kBAAChuC,GAAA,EAAD,CACE1I,MAAO50B,EAAK,qCACZu9B,QAASjQ,EAAMu6C,gBACf57D,SAAU+/D,Q,OCwNPllE,mBAAKhI,YACjBC,IACC,MAAM,KACJsH,EADI,gBAEJkjE,EAFI,UAGJ0C,EAHI,mBAIJX,EAJI,QAKJY,EALI,eAMJrC,EANI,eAOJsC,EAPI,aAQJC,EARI,gBASJC,EATI,MAUJzyD,GACE7a,EAAOutE,QAELC,EAAkB90E,QAAQy0E,KAAaC,GA/VxB,WA+V0CA,KACzD,mBAAEZ,EAAF,YAAsBC,EAAtB,QAAmCC,GAAaW,GAAgB,IAChE,cACJI,EADI,eAEJC,EAFI,eAGJC,EAHI,yBAIJC,EAJI,SAKJC,EALI,gBAMJC,EANI,gBAOJC,EAPI,SAQJzG,EARI,OASJyD,GACGoC,GAAW,GAEhB,MAAO,CACL7lE,OACAkjE,kBACA0C,YACAX,qBACAa,iBACAE,kBACAG,gBACAG,2BACAF,iBACAC,iBACAE,WACAC,kBACAC,kBACAzG,WACAyD,SACAyC,kBACA1C,iBACA0B,qBACAC,cACAC,UACA7xD,QACAmzD,aAAchuE,EAAO+a,SAGzB,CAACra,EAAWC,IACHC,YAAKD,EAAS,CACnB,wBACA,kBACA,iBACA,sBACA,sBA5DcZ,CAjT0D,EAC5E0D,SACA6E,UACAhB,OACAkjE,kBACA0C,YACAX,qBACAkB,gBACAG,2BACAF,iBACAC,iBACAG,kBACAC,kBACAzG,WACAgG,kBACAE,kBACA1C,iBACAsC,iBACArC,SACAyB,qBACAC,cACAC,UACA7xD,QACAmzD,eACAC,wBACAC,kBACAC,iBACAC,sBACAC,wBAEA,MAAOC,EAAcC,GZ2IdpgD,GAAWC,GAAS6B,IY1IrBu+C,EAAenH,GAAgBC,IAC9B38C,EAAW2vC,GAAgB73D,aAAS,GACrCxB,EAAOC,cAEb8B,YAAU,MACJsE,GAAQuT,GAASmzD,IACnB1T,GAAa,IAEd,CAAChzD,EAAMuT,EAAOmzD,IAEjBhrE,YAAU,KACR,GAAI6X,GAASA,EAAM4zD,MACjBF,EAAgB,CACdhnE,KAAM,gBACN6oB,QAAS,CACP,CAACvV,EAAM4zD,OAAQ5zD,EAAM6zD,mBAK3B,GAAIV,GAAgBA,EAAaluE,OAAQ,CACvC,MAAMib,EAAS4zD,aAAiBX,GAChCO,EAAgB,CACdhnE,KAAM,gBACN6oB,QAAS,IACJrV,OAIR,CAACF,EAAOmzD,EAAcO,IAEzBvrE,YAAU,KACR,GAAIkqE,EAAW,CACb,MACEl1D,KAAMoR,EADF,MACYk/C,EADZ,MACmB33C,EADnB,gBAC0B26C,GAC5B4B,EACJqB,EAAgB,CACdhnE,KAAM,iBACN6oB,QAAS,CACPhH,WACAk/C,MAAOA,GAA6B,MAApBA,EAAMoD,OAAO,GACxB,IAAGpD,EACJA,EACJ33C,WACI26C,GAAmB,QAI5B,CAAC4B,EAAWqB,IAEf,MAAMK,EAAwB5tE,YAAY,KACxCqtE,KACC,CAACA,IAEEnD,EAAa3nE,YAAQ,IACrB+D,IAASunE,IAAYC,SAChB,EAoSb,SAAuB/D,EAAkB,GAAIP,EAA+CuE,GAC1F,MAAM/D,EAAiBR,EACnBwE,GAAkBxE,EAAiBuE,GACnC,GACJ,IAAIhU,EAAQ,EACZ,MAAMkU,EAAclE,EAAOmE,OAAOlE,GAAkB,IAIpD,OAHAjQ,EAAQkU,EAAYz8B,OAAO,CAAC28B,EAAKC,IACxBD,EAAMC,EAAI1E,OAChB3P,GACIA,EA1SEsU,CAActE,EAAQP,EAAiB8D,EAAa/F,UAC1D,CAACjhE,EAAMgnE,EAAa/F,SAAUwC,EAAQP,IAEnCS,EAAe1nE,YAAQ,KAC3B,GAAI+D,IAASunE,IAAYC,SAGzB,OAsSJ,SAAyBvgD,EAAkBi8C,EAA+Ca,GACxF,MACMD,EAAiB,GbxalB,SAA4BpD,GACjC,MAAM+D,EAAWhE,GAAeC,GAChC,OAAOL,GAAMoE,IAAuB,GaqafuD,CAAmB/gD,EAAMy5C,gBACJz5C,EAAMy5C,WAAW96C,OAAO,KAC5Do+C,EAAkB/8C,EAAM05C,YACzB,GAAE15C,EAAM05C,gBAAgB15C,EAAM45C,SAAS55C,EAAM65C,mBAC9CxlE,GACE,MAAE0lE,EAAOl/C,SAAUpR,GAASuW,EAC5BwgD,EAAiBvE,EAAkB+E,GAAmB/E,EAAiBj8C,EAAMg6C,eAAY3lE,EACzF2oE,EAAiBwD,EAAiBA,EAAe9zD,WAAQrY,EAC/D,MAAO,CACLwoE,gBACAC,kBACAC,kBACAtzD,OACAswD,QACAiD,kBArTOiE,CAAgBlB,EAAc9D,EAAiB4C,GAAkB,KACvE,CAAC9lE,EAAMgnE,EAAc9D,EAAiB4C,IA2EzC,MAAMqC,EAAkBzuE,YAAY,KAClC,MAAM,SAAE6nE,GAAayF,EACfoB,EA2OV,SAAwBpB,GACtB,MAAM,YACJrG,EADI,YAEJC,EAFI,KAGJC,EAHI,MAIJ55C,EAJI,YAKJ65C,EALI,SAMJC,EACAj/C,SAAUpR,EAPN,MAQJswD,EARI,MASJ33C,GACE29C,EAWJ,MAAO,CACLt2D,OACAswD,QACA33C,QACA26C,gBAbsB,CACtBrD,cACAC,cACAC,OACA55C,QACA65C,cACAC,aA9PoBsH,CAAerB,GACnCL,EAAsB,CAAEyB,cAAa7G,cACpC,CAACoF,EAAuBK,IAErBsB,EAAkB5uE,YAAY,KAClC,MAAM6uE,EAoQV,SAAwBvB,GACtB,MAAM,WACJtG,EADI,WACQQ,EADR,OACoBC,EADpB,IAC4BC,EAD5B,eACiCC,EADjC,WACiDC,GACnD0F,GACGwB,EAAaC,GAActH,EAAOh/C,MAAM,KAW/C,MAAO,CACLggB,KAXW,CACXu+B,aACAQ,aACAsH,cACAC,aACArH,MACA11B,QAAS21B,EACTqH,IAAKpH,IAhReqH,CAAe3B,GACnCF,EAAoB,CAClByB,iBAED,CAACzB,EAAqBE,IAEnB4B,EAAWlvE,YAAY,KAC3BktE,EAAgB,CACdiC,iBAAkB7B,EAAa/F,SAC/BO,gBAAiBwF,EAAaxF,mBAE/B,CAACoF,EAAiBI,IAEf8B,EAAUpvE,YAAaqvE,IAC3BlC,EAAe,CAAE7mE,KAAM+oE,KACtB,CAAClC,IAEExrB,EAAoB3hD,YAAY,KAEpC,OADAs5D,GAAa,GACLhzD,GACN,KAAKunE,IAAYyB,aACf,OAAOb,IACT,KAAKZ,IAAY0B,SACf,OAAOH,EAAQvB,IAAY2B,aAC7B,KAAK3B,IAAY2B,YACf,OAAOZ,IACT,KAAKf,IAAYC,SACf,OAAOoB,IACT,QACE,MAAO,SAEV,CAAC5oE,EAAMmoE,EAAiBW,EAASR,EAAiBM,IAE/Ct2D,EAAcrW,YAAQ,KAC1B,OAAQ+D,GACN,KAAKunE,IAAYyB,aACf,OAAOrvE,EAAK,uBACd,KAAK4tE,IAAY0B,SACf,OAAOtvE,EAAK,yBACd,KAAK4tE,IAAY2B,YACf,OAAOvvE,EAAK,mBACd,KAAK4tE,IAAYC,SACf,OAAO7tE,EAAK,mBACd,QACE,MAAO,KAEV,CAACqG,EAAMrG,IAEJwvE,EAAaltE,YAAQ,KACzB,OAAQ+D,GACN,KAAKunE,IAAYC,SACf,OAAO7tE,EAAK,oBAAsB,GAAEutE,KAAgBtD,EAAa,KAAKplE,QAAQ,MAChF,QACE,OAAO7E,EAAK,UAEf,CAACqG,EAAMrG,EAAMutE,EAActD,IAE9B,OAAIsC,EAEA,kBAACzzD,GAAA,EAAD,CACEzY,UAAU,QACVmC,OAAQA,EACR6E,QAASA,GAET,iGAC0E,6BAD1E,iDAIA,kBAAC5E,EAAA,EAAD,CACEyX,QAAM,EACN5Z,QAAS+G,GAERrH,EAAK,QAOZ,kBAAC8Y,GAAA,EAAD,CACEzY,UAAU,eACVmC,OAAQA,EACR6E,QAASA,GAET,yBAAKhH,UAAU,UACb,kBAACoC,EAAA,EAAD,CACEpC,UAAU,eACVsC,MAAM,cACND,OAAK,EACL5I,KAAK,UACLwG,QAAS+G,EACTzE,UAAU,SAEV,uBAAGvC,UAAU,gBAEf,4BAAKsY,SAEGhX,IAAT0E,EACC,kBAACwQ,EAAA,EAAD,CAAYE,KAAK,QAAQD,UAAWzQ,GACjC,IACC,yBAAKhG,UAAU,yBA9JzB,SAA4BovE,GAC1B,OAAQA,GACN,KAAK7B,IAAYyB,aACf,OACE,kBAAC,GAAD,CACE/hD,MAAO+/C,EACP7yC,SAAU8yC,EACV5E,YAAajxE,QAAQk1E,GACrBpE,UAAW9wE,QAAQi1E,GAAkBI,GACrCtE,UAAW/wE,QAAQg1E,GAAkBI,GACrCpE,SAAUhxE,QAAQ+0E,KAGxB,KAAKoB,IAAY0B,SACf,OACE,kBAAC,GAAD,CACEhiD,MAAO+/C,EACP7yC,SAAU8yC,EACV/D,gBAAiBA,GAAmB,GACpClD,SAAUkH,IAGhB,KAAKK,IAAY2B,YACf,OACE,kBAAC,GAAD,CACEjiD,MAAO+/C,EACP7yC,SAAU8yC,EACVhC,mBAAoB7zE,SAAS40E,GAAmBf,GAChDC,mBAAoBA,EACpBC,YAAaA,EACbC,QAASA,IAGf,KAAKmC,IAAYC,SACf,OACE,kBAAC,GAAD,CACE/D,OAAQA,EACRC,eAAgBsD,EAAa/F,UAAYiC,EACrCwE,GAAkBxE,EAAiB8D,EAAa/F,eAChD3lE,EACJsoE,WAAYA,EACZJ,eAAgBA,EAChBG,aAAcA,EACd3D,SAAUkH,IAGhB,QACE,QAgHOmC,CAAmBrpE,KAK1B,yBAAKhG,UAAU,iBACb,kBAACuP,EAAA,EAAD,CAASjN,MAAM,UAGnB,yBAAKtC,UAAU,UACb,kBAACoC,EAAA,EAAD,CACE6D,KAAK,SACLhG,QAASohD,EACT11C,SAAU0d,EACVA,UAAWA,GAEV8lD,IAGJ51D,IAAUA,EAAM4zD,OAxMrB,WACE,GAAK5zD,EAGL,OACE,kBAACd,GAAA,EAAD,CACEzY,UAAU,QACVmC,OAAQ/K,QAAQmiB,GAChBvS,QAASsmE,GAET,4BAAK/zD,EAAMsP,aAAe,SAC1B,2BAAItP,EAAMsP,aAAe,SACzB,kBAACzmB,EAAA,EAAD,CACEyX,QAAM,EACN5Z,QAAS8sE,GAERptE,EAAK,QAwLgB2vE,OAsEhC,SAASrB,GAAmB/E,EAAmCqG,GAC7D,OAAOrG,EAAgBvtC,KAAK,EAAGh+B,QAASA,IAAO4xE,GAGjD,SAAS7B,GAAkBxE,EAAmCuE,GAC5D,MAAM7uC,EAASqvC,GAAmB/E,EAAiBuE,GACnD,OAAO7uC,EAASA,EAAO6qC,YAASnoE,ECjVnBmF,mBAAKhI,YACjBC,IACC,MAAM,QAAE8wE,GAAY9wE,EAAOutE,SACrB,SACJjG,EACAyD,OAAQgG,EAFJ,KAGJC,EAHI,YAIJC,EAJI,iBAKJC,EALI,eAMJlG,EANI,eAOJO,EAPI,SAQJJ,EARI,KASJ1mE,EATI,MAUJwW,GACG61D,GAAW,GAEhB,MAAO,CACLxJ,WACAyD,OAAQgG,EACRC,OACAC,cACAC,mBACAlG,iBACAO,iBACAJ,WACA1mE,OACAwW,UA1Bclb,CA1D4B,EAC9C0D,SACA6E,UACAyiE,SACAC,iBACAiG,cACA3J,WACA0J,OACA7F,WACA1mE,OACAwW,QACAi2D,mBACA3F,qBAEA,MAAMtqE,EAAOC,cACPstE,EAAenH,GAAgBC,GAC/B2D,EAAe1nE,YAAQ,IAyE/B,SAAyB6nE,EACvB4F,EAKAzF,GACA,IAAKyF,EACH,MAAO,CAAE5F,iBAEX,MAAM,gBAAEE,GAAoB0F,EACtBG,EAAc7F,GAAmBA,EAAgBrD,YAClD,GAAEqD,EAAgBrD,gBAAgBqD,EAAgBnD,SAASmD,EAAgBlD,mBAC5ExlE,GACE,MAAE0lE,EAAF,KAAStwD,GAASg5D,EACxB,MAAO,CACL5F,gBACAC,gBAAiB,SACjBC,gBAAiB6F,EACjBn5D,OACAswD,QACAiD,kBA7FOiE,CAAgB0B,EAAkBF,EAAMzF,GAC9C,CAACyF,EAAMzF,EAAgB2F,IAC1B,OACE,kBAACn3D,GAAA,EAAD,CACEzY,UAAU,oCACVmC,OAAQA,EACR6E,QAASA,GAET,6BACE,yBAAKhH,UAAU,UACb,kBAACoC,EAAA,EAAD,CACEpC,UAAU,eACVsC,MAAM,cACND,OAAK,EACL5I,KAAK,UACLwG,QAAS+G,EACTzE,UAAU,SAEV,uBAAGvC,UAAU,gBAEf,gCAAML,EAAK,kBAAX,MAEF,yBAAKK,UAAU,iCACb,kBAAC,GAAD,CACEypE,OAAQA,EACRC,eAAgBA,EAChBE,WAAY+F,EACZnG,eAAgB,CACdK,WACA1mE,OACAwW,SAEFgwD,aAAcA,EACd3D,SAAUkH,W,yGCtEf,MAAM4C,EAA0B,CACrCC,WCpBa,IAA0B,gEDqBvCC,eErBa,IAA0B,oEFsBvCC,YGtBa,IAA0B,iEHuBvCC,WIvBa,IAA0B,gEJwBvCC,WKxBa,IAA0B,kDLyBvCC,WMzBa,IAA0B,kDN0BvCC,iBO1Ba,IAA0B,8DP6B1B,SAASz3C,EAAiBliB,GACvC,MAAM45D,EAAOR,EAAwBp5D,GAAMsH,QAAQ9lB,OAAOq4E,SAASn6E,OAAQ,IAE3E,OAAOqnD,IAAmB,OAAM6yB,EAAQx9D,iBAAessB,U,0GQjBzD,MAAMoxC,EAAiE,CACrEvqE,KAAM,OACNwqE,QAAS,GACTC,OAAQ,OACRC,QAAQ,GAIV,IAAIC,EACAC,EAWAC,EAgGWrqE,kBAxDiB,EAAGgiD,OAAM78C,WAAU5E,cACjD,MAAO+pE,EAAgBC,GAAqB7vE,aAAS,GAErDO,YAAU,KACH+mD,IAIAsoB,EA9CT9oC,eAA2BgpC,GACzB,IACE,MAAMC,EAAgB12E,SAASkB,eAAe,eAC9C,IAAKw1E,EACH,OAGF,MAAM,YAAEvoC,EAAF,aAAe7qC,GAAiBozE,EAEtCJ,EAAU,IAAIF,EAAQM,EAAe,CACnCC,YAAY,EACZC,SAAU,CACR16E,MAAOiyC,EACPlxC,OAAQqG,GAEVuzE,SAAU,CACR36E,MAAOiyC,EAAc,GACrBlxC,OAAQqG,EAAe,GACvBmI,KAAM,YAIV,MAAM85B,QAAgBuxC,YAAcL,SAC9BH,EAAQS,KAAK,CAAE7qE,IAAKq5B,IAC1B,MAAOyxC,GACHC,KAEFC,QAAQn4D,MAAMi4D,IAyBhBG,CAAYlpB,GA/DhBxgB,iBAME,OALK4oC,IACHA,EAAiB,oDACjBD,SAAiBC,GAAgBtgB,SAG5BsgB,EAoDHe,GAAgB/4C,KAAK,IAAMm4C,GAAkB,MAM9C,CAACvoB,EAAMsoB,IAEV,MAAMpxE,EAAOC,cAab,OACE,kBAAC6Y,EAAA,EAAD,CACEtW,OAAQ/K,QAAQqxD,GAChBzhD,QAASA,EACT2S,MAAM,qBACN3Z,UAAU,YACVshD,gBAAc,GAEbyvB,EACC,yBAAKpzE,GAAG,gBAER,kBAAC0b,EAAA,EAAD,MAEF,kBAACjX,EAAA,EAAD,CACEpC,UAAU,iBACVqC,OAAK,EACLC,MAAM,UACNrC,QA5BNgoC,iBACE,IAAK6oC,EACH,OAGF,MAAM3/B,QAA8B2/B,EAAQ3/B,OAAOq/B,GAC7CqB,EAA+B,iBAAX1gC,EAAsBA,EAAS2gC,YAAW3gC,EAAQ,cAE5EvlC,EAASimE,IAqBLtvE,UAAW5C,EAAK,cAEhB,uBAAGK,UAAU,mB,OC3CNyG,gBAhEsB,EACnCkT,QAAQ,8BACRhO,WACA2qB,uBACA1qB,eAEA,MAAOmmE,EAAcC,GAAmB7wE,eACjC8wE,EAAgBC,GAAqB/wE,YAA6Bm1B,GAEzE50B,YAAU,KACRwwE,EAAkB57C,IACjB,CAACA,IA2BJ,MAAM67C,EAAiBzmE,YACrBumE,GAAkB,SAClBtmE,GAAY,YAGd,OACE,yBAAK3L,UAAU,kBACb,2BACEA,UAAWmyE,EACXtzD,KAAK,SACLC,SAAU,EACVnF,MAAOA,GAEP,2BACE1T,KAAK,OACL2F,SAxCR,SAA0BmwB,GACxB,MAAM/xB,EAAS+xB,EAAM/xB,OAEhBA,GAAWA,EAAOu9B,OAAUv9B,EAAOu9B,MAAM,KAI9CyqC,EAAgBhoE,EAAOu9B,MAAM,IAC7Bv9B,EAAO7D,MAAQ,KAiCT69B,OAAO,0BAET,uBAAGhkC,UAAU,oBACZiyE,GAAkB,yBAAKh1E,IAAKg1E,EAAgB5iE,IAAI,YAEnD,kBAAC,EAAD,CAAWo5C,KAAMspB,EAAc/qE,QAzBnC,WACEgrE,OAAgB1wE,IAwB4CsK,SAnC9D,SAA0BimE,GACxBG,OAAgB1wE,GAChBsK,EAASimE,GAELI,GACFG,IAAIC,gBAAgBJ,GAEtBC,EAAkBE,IAAIE,gBAAgBT,W,+DCjD1C,kDAiBA,MACMU,EAAuC,CAAC,EAAG,IAC3CC,EAAwC,CAAC,EAAG,IAC5CC,EAAsC,CAAC,GAAI,GAC3CC,EAAelwE,IAAmBmwE,KAA2BC,KAsDpDnsE,gBApDsB,EAAGguC,oBAAmBD,YACzD,MAAOq+B,EAAiBC,GAAsB3xE,eACvC4xE,EAAgBC,GAAqB7xE,eACrC8xE,EAAqBC,GAA0B/xE,aAAS,IACxDgyE,EAAaC,GAAkBjyE,aAAS,GAE/CO,YAAU,KACHmxE,EAGH13E,WAAW,IAAMi4E,GAAe,GAhBP,KAczBx6C,YAAiB,eAAeC,KAAKi6C,IAItC,CAACD,IAEJnxE,YAAU,KACHqxE,GACHn6C,YAAiB,cAAcC,KAAKm6C,IAErC,CAACD,IAEJ,MAAMM,EAAwB3zE,YAAY,IAAMwzE,GAAuB,GAAO,IAE9E,OACE,yBAAKv1E,GAAG,SAASqC,UAAWw0C,EAAQ,MAAQ,KACxCy+B,GACA,yBAAKjzE,UAAU,mBAEhB6yE,GACC,kBAAC,IAAD,CACEl1E,GAAG,cACHlE,KAAM+6C,EAAQ8+B,KAAsBZ,EACpC1yE,UAAWmzE,EAAc,SAAW,QACpC56C,cAAes6C,EACfU,YAAahB,EACbl5C,QAAM,EACNC,OAAQ+5C,IAGXN,GACC,kBAAC,IAAD,CACEp1E,GAAG,aACHlE,KAAM+6C,EAAQ8+B,KAAsBZ,EACpC1yE,UAAWmzE,EAAc,QAAU,SACnC56C,cAAew6C,EACfQ,YAAa9+B,EAAoB+9B,EAAsBC,EACvDp5C,QAAM,Q,6BCnEhB,wCAuBA,MAAMwb,EAAyBryC,IAAmB,IAAM,IAkGzCiE,gBAhGoB,EACjC4iB,aAAY,EACZorB,oBACAl7B,QACA6V,OACA5W,cAAc,WACds7B,cAAc,OACdC,aACAY,6BACA6+B,gBACAr3D,eAGA,MAAM/Q,EAAWlE,YAAyB,OAEnCioB,EAAUskD,GAAetyE,YAAS,KAClCuyE,EAAWC,GAAgBxyE,aAAS,GAgD3C,OA9CAO,YAAU,KACH0F,KACHjM,WAAW,KACTiQ,EAASnD,QAASyP,SACjBm9B,IAEJ,IAEHnzC,YAAU,KACJ6X,GACF3e,sBAAsB,KACpBwQ,EAASnD,QAASyP,QAClBtM,EAASnD,QAAS2rE,YAGrB,CAACr6D,IAgCF,0BAAM4T,OAAO,GAAGhR,SAblB,SAAsB4f,GACpBA,EAAMttB,iBAEF4a,GAIAqqD,GACFv3D,EAASgT,IAK6B0kD,aAAa,OACnD,yBAAK7zE,UAAW0L,YAAe,6BAA8ByjB,GAAY,UAAW5V,GAAS,UAC3F,2BACEhP,IAAKa,EACLpL,UAAU,eACViG,KAAMwuC,EAAoB,OAAS,WACnC92C,GAAG,mBACHwI,MAAOgpB,GAAY,GACnB0kD,aAAa,mBACbjoE,SAvCR,SAA0B/J,GACpB0X,GACFw6B,IAGF,MAAM,OAAE/pC,GAAWnI,EACnB4xE,EAAYzpE,EAAO7D,OACnBwtE,EAAa3pE,EAAO7D,MAAM3H,QAAUs1E,KAChCN,GACFA,EAAcxpE,EAAO7D,UAgCnB,+BAAQoT,GAAS6V,GAAQ5W,GACzB,yBACExY,UAAU,kBACVC,QA/BR,WACE00C,GAA4BF,IA+BtB51B,KAAK,SACLC,SAAU,EACVnF,MAAM,8BAEN,uBAAG3Z,UAAWy0C,EAAoB,WAAa,sBAGlDi/B,GACC,kBAAC,IAAD,CAAQztE,KAAK,SAASI,QAAM,EAACgjB,UAAWA,GACrCyqB,O","file":"3.d4466bb252b9014004b6.js","sourcesContent":["import { ApiMessage } from '../../../api/types';\nimport { MediaViewerOrigin } from '../../../types';\n\nimport { ANIMATION_END_DELAY } from '../../../config';\nimport { getMessageContent, getPhotoFullDimensions, getVideoDimensions } from '../../../modules/helpers';\nimport {\n AVATAR_FULL_DIMENSIONS,\n calculateDimensions,\n getMediaViewerAvailableDimensions,\n MEDIA_VIEWER_MEDIA_QUERY,\n REM,\n} from '../../common/helpers/mediaDimensions';\n\nimport windowSize from '../../../util/windowSize';\n\nconst ANIMATION_DURATION = 200;\n\nexport function animateOpening(\n hasFooter: boolean, origin: MediaViewerOrigin, bestImageData: string, message?: ApiMessage,\n) {\n const { mediaEl: fromImage } = getNodes(origin, message);\n if (!fromImage) {\n return;\n }\n\n const { width: windowWidth } = windowSize.get();\n\n let isVideo = false;\n let mediaSize;\n if (message) {\n const { photo, video, webPage } = getMessageContent(message);\n isVideo = Boolean(video);\n mediaSize = video ? getVideoDimensions(video)! : getPhotoFullDimensions((photo || webPage!.photo)!)!;\n } else {\n mediaSize = AVATAR_FULL_DIMENSIONS;\n }\n\n // eslint-disable-next-line max-len\n const {\n width: availableWidth, height: availableHeight,\n } = getMediaViewerAvailableDimensions(hasFooter, isVideo);\n const { width: toWidth, height: toHeight } = calculateDimensions(\n availableWidth, availableHeight, mediaSize.width, mediaSize.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, {\n FC, useCallback, useEffect, useMemo, useState,\n} from '../../lib/teact/teact';\n\nimport { ApiMessage } from '../../api/types';\n\nimport { IS_MOBILE_SCREEN } from '../../util/environment';\nimport download from '../../util/download';\nimport { getMessageMediaHash } from '../../modules/helpers';\nimport useMediaWithDownloadProgress from '../../hooks/useMediaWithDownloadProgress';\nimport useLang from '../../hooks/useLang';\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 [isVideoDownloadAllowed, setIsVideoDownloadAllowed] = useState(false);\n const videoMediaHash = isVideo && message ? getMessageMediaHash(message, 'download') : undefined;\n const {\n mediaData: videoBlobUrl, downloadProgress,\n } = useMediaWithDownloadProgress(videoMediaHash, !isVideoDownloadAllowed);\n\n // Download with browser when fully loaded\n useEffect(() => {\n if (isVideoDownloadAllowed && videoBlobUrl) {\n download(videoBlobUrl, fileName!);\n setIsVideoDownloadAllowed(false);\n }\n }, [fileName, videoBlobUrl, isVideoDownloadAllowed]);\n\n // Cancel download on slide change\n useEffect(() => {\n setIsVideoDownloadAllowed(false);\n }, [videoMediaHash]);\n\n const handleVideoDownloadClick = useCallback((e: React.SyntheticEvent) => {\n e.stopPropagation();\n setIsVideoDownloadAllowed((isAllowed) => !isAllowed);\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_MOBILE_SCREEN) {\n return (\n
\n \n {!isAvatar && (\n \n {lang('Forward')}\n \n )}\n {isVideo ? (\n \n {isVideoDownloadAllowed ? `${Math.round(downloadProgress * 100)}% Downloading...` : 'Download'}\n \n ) : (\n \n {lang('AccActionDownload')}\n \n )}\n \n {isVideoDownloadAllowed && }\n
\n );\n }\n\n return (\n
\n {!isAvatar && (\n <>\n \n \n \n \n )}\n {isVideo ? (\n \n {isVideoDownloadAllowed ? (\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';\nimport { throttle } from '../../util/schedulers';\nimport { TextPart } from '../common/helpers/renderMessageText';\nimport { REM } from '../common/helpers/mediaDimensions';\n\nimport './MediaViewerFooter.scss';\n\nconst RESIZE_THROTTLE_MS = 500;\n\ntype OwnProps = {\n text: TextPart | TextPart[];\n onClick: () => void;\n isHideable: boolean;\n};\n\nconst MediaViewerFooter: FC = ({ text = '', isHideable, onClick }) => {\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 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_MOBILE_SCREEN } 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_MOBILE_SCREEN) {\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 { IDimensions } from '../../modules/helpers';\n\nimport { IS_IOS, IS_MOBILE_SCREEN, 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';\n\nimport './VideoPlayer.scss';\n\ntype OwnProps = {\n url?: string;\n isGif?: boolean;\n posterData?: string;\n posterSize?: IDimensions;\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\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 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 {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_MOBILE_SCREEN } 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,\n} from '../../api/types';\nimport { MediaViewerOrigin } from '../../types';\n\nimport { ANIMATION_END_DELAY } from '../../config';\nimport { IS_IOS, IS_MOBILE_SCREEN, IS_TOUCH_ENV } from '../../util/environment';\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 getMessageMediaFilename,\n getMessageMediaFormat,\n getMessageMediaHash,\n getMessageMediaThumbDataUri,\n getMessagePhoto,\n getMessageVideo,\n getMessageWebPagePhoto,\n getPhotoFullDimensions,\n getVideoDimensions,\n IDimensions,\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';\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 // eslint-disable-next-line no-null/no-null\n const animationKey = useRef(null);\n const isOpen = Boolean(avatarOwner || messageId);\n const webPagePhoto = message ? getMessageWebPagePhoto(message) : undefined;\n const photo = message ? getMessagePhoto(message) : undefined;\n const video = message ? getMessageVideo(message) : undefined;\n const isWebPagePhoto = Boolean(webPagePhoto);\n const isPhoto = Boolean(photo || webPagePhoto);\n const isVideo = Boolean(video);\n const isGif = video ? video.isGif : undefined;\n const isFromSharedMedia = origin === MediaViewerOrigin.SharedMedia;\n const isFromSearch = origin === MediaViewerOrigin.SearchResult;\n const slideAnimation = animationLevel >= 1 ? 'mv-slide' : 'none';\n const headerAnimation = animationLevel === 2 ? 'slide-fade' : 'none';\n const isGhostAnimation = animationLevel === 2;\n const fileName = avatarOwner\n ? `avatar${avatarOwner.id}-${profilePhotoIndex}.jpg`\n : message && getMessageMediaFilename(message);\n const prevSenderId = usePrevious(senderId);\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 const messageIds = useMemo(() => {\n return isWebPagePhoto && messageId\n ? [messageId]\n : getChatMediaMessageIds(chatMessages || {}, collectionIds || [], isFromSharedMedia);\n }, [isWebPagePhoto, 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 if (isOpen && (!prevSenderId || prevSenderId !== senderId || !animationKey.current)) {\n animationKey.current = selectedMediaMessageIndex;\n }\n\n function getMediaHash(full?: boolean) {\n if (avatarOwner && profilePhotoIndex !== undefined) {\n const { photos } = avatarOwner;\n return photos && photos[profilePhotoIndex]\n ? `photo${photos[profilePhotoIndex].id}?size=c`\n : getChatAvatarHash(avatarOwner, full ? 'big' : 'normal');\n }\n\n return message && getMessageMediaHash(message, full ? '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 avatarOwner && 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 photoDimensions = isPhoto ? getPhotoFullDimensions((\n isWebPagePhoto ? getMessageWebPagePhoto(message!) : getMessagePhoto(message!)\n )!) : undefined;\n const videoDimensions = isVideo ? getVideoDimensions(getMessageVideo(message!)!) : undefined;\n\n useEffect(() => {\n if (!IS_MOBILE_SCREEN) {\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!, 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,\n message, prevMessage, prevAvatarOwner, bestImageData, prevBestImageData,\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 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) {\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 {\n close();\n }\n } : undefined,\n });\n }, [close, isGif, isZoomed, selectNextMedia, selectPreviousMedia, canPanZoomWrap]);\n\n const handlePan = useCallback((x: number, y: number) => {\n setPanDelta({ x, y });\n }, []);\n\n const lang = useLang();\n\n function renderSlide(isActive: boolean) {\n if (avatarOwner) {\n return (\n
\n {renderPhoto(\n fullMediaData || blobUrlPreview,\n calculateMediaViewerDimensions(AVATAR_FULL_DIMENSIONS, false),\n !IS_MOBILE_SCREEN && !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(photoDimensions!, hasFooter),\n !IS_MOBILE_SCREEN && !isZoomed,\n )}\n {isVideo && (\n \n )}\n {textParts && (\n \n )}\n
\n );\n }\n\n return undefined;\n }\n\n function renderSenderInfo() {\n return (\n \n );\n }\n\n return (\n \n {() => (\n <>\n
\n {IS_MOBILE_SCREEN && (\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?: IDimensions, 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_MOBILE_SCREEN } from '../../util/environment';\nimport {\n getCanPostInChat, getChatTitle, isChatPrivate, sortChatIds,\n} from '../../modules/helpers';\nimport searchWords from '../../util/searchWords';\nimport { pick } from '../../util/iteratees';\nimport useInfiniteScroll from '../../hooks/useInfiniteScroll';\nimport useLang from '../../hooks/useLang';\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 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 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_MOBILE_SCREEN) {\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 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, currentUserId ? [currentUserId] : undefined);\n }, [activeListIds, archivedListIds, chatsById, currentUserId, filter, lang]);\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 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 },\n currentUserId,\n } = global;\n\n return {\n chatsById,\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 } from '../../api/types';\n\nimport getReadableErrorText from '../../util/getReadableErrorText';\nimport { pick } from '../../util/iteratees';\nimport useLang from '../../hooks/useLang';\n\nimport Modal from '../ui/Modal';\nimport Button from '../ui/Button';\n\nimport './Errors.scss';\n\ntype StateProps = {\n errors: ApiError[];\n};\n\ntype DispatchProps = Pick;\n\nconst Errors: FC = ({ errors, dismissError }) => {\n const lang = useLang();\n\n if (!errors.length) {\n return undefined;\n }\n\n return (\n
\n {errors.map((error) => (\n \n

{getReadableErrorText(error)}

\n \n \n ))}\n
\n );\n};\n\nfunction getErrorHeader(error: ApiError) {\n if (error.isSlowMode) {\n return 'Slowmode enabled';\n }\n\n return 'Something went wrong';\n}\n\nexport default memo(withGlobal(\n (global): StateProps => pick(global, ['errors']),\n (setGlobal, actions): DispatchProps => pick(actions, ['dismissError']),\n)(Errors));\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 {\n formatMonthAndYear, formatHumanDate, formatTime,\n} from '../../util/dateFormat';\nimport { IS_MOBILE_SCREEN } from '../../util/environment';\nimport useLang, { LangFn } from '../../hooks/useLang';\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 = ['M', 'T', 'W', 'T', 'F', 'S', 'S'];\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\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 (isOpen) {\n setSelectedDate(defaultSelectedDate);\n }\n }, [isOpen, defaultSelectedDate]);\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 {formatMonthAndYear(lang, selectedDate, IS_MOBILE_SCREEN)}\n

\n\n \n \n \n\n \n \n \n
\n
\n\n
\n
\n {WEEKDAY_LETTERS.map((letter) => (\n
\n {letter}\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();\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 = formatHumanDate(lang, date, true);\n\n if (day === 'Today') {\n return lang('Conversation.ScheduleMessage.SendToday', formatTime(date));\n }\n\n return lang('Conversation.ScheduleMessage.SendOn', day).replace('%@', formatTime(date));\n}\n\nexport default memo(CalendarModal);\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')}

\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';\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 return (\n \n

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

\n \n \n \n );\n};\n\nexport default memo(UnpinAllMessagesModal);\n","import React, { FC, useCallback, memo } 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';\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 DeleteSelectedMessagesModal: 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 handleDeleteMessageForAll = useCallback(() => {\n deleteMessages({ messageIds: selectedMessageIds, shouldDeleteForAll: true });\n exitMessageSelectMode();\n onClose();\n }, [deleteMessages, exitMessageSelectMode, 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 exitMessageSelectMode();\n onClose();\n }, [\n isSchedule, exitMessageSelectMode, onClose, deleteScheduledMessages, selectedMessageIds, deleteMessages,\n ]);\n\n const lang = useLang();\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)(DeleteSelectedMessagesModal));\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 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 DeleteSelectedMessagesModal from './DeleteSelectedMessagesModal';\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};\n\ntype DispatchProps = Pick;\n\nconst MessageSelectToolbar: FC = ({\n canPost,\n isActive,\n messageListType,\n isSchedule,\n selectedMessagesCount,\n canDeleteMessages,\n exitMessageSelectMode,\n openForwardMenuForSelectedMessages,\n}) => {\n const [isDeleteModalOpen, openDeleteModal, closeDeleteModal] = useFlag();\n\n useEffect(() => {\n return isActive && !isDeleteModalOpen\n ? captureKeyboardListeners({\n onBackspace: openDeleteModal,\n onDelete: openDeleteModal,\n onEsc: exitMessageSelectMode,\n })\n : undefined;\n }, [isActive, isDeleteModalOpen, 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 \n \n {lang('Delete')}\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\n return {\n isSchedule: messageListType === 'scheduled',\n selectedMessagesCount: selectSelectedMessagesCount(global),\n canDeleteMessages: canDelete,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['exitMessageSelectMode', 'openForwardMenuForSelectedMessages']),\n)(MessageSelectToolbar));\n","import React, { FC, memo } 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 } from '../../../modules/helpers';\nimport { selectChat, selectUser, selectIsChatPinned } from '../../../modules/selectors';\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};\n\nconst LeftSearchResultChat: FC = ({\n chatId,\n chat,\n privateChatUser,\n isPinned,\n withUsername,\n onClick,\n}) => {\n const [isDeleteModalOpen, openDeleteModal, closeDeleteModal] = useFlag();\n\n const contextActions = useChatContextActions({\n chat,\n privateChatUser,\n isPinned,\n handleDelete: openDeleteModal,\n });\n\n if (!chat) {\n return undefined;\n }\n\n return (\n onClick(chatId)}\n contextActions={contextActions}\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\n return {\n chat,\n privateChatUser,\n isPinned,\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, !topUserIds);\n\n const handleClick = useCallback(\n (id: number) => {\n openChat({ id });\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)}>\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_MOBILE_SCREEN } 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';\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 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 ...(privateChatUserId && { privateChatUser: selectUser(global, privateChatUserId) }),\n lastSyncTime: global.lastSyncTime,\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_MOBILE_SCREEN } 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 });\n\n if (id !== currentUserId) {\n addRecentlyFoundChatId({ id });\n }\n\n if (!IS_MOBILE_SCREEN) {\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 }, [searchQuery, localContactIds, currentUserId, lang, localChatIds, localUserIds, chatsById, usersById]);\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]), 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 { currentUserId, messages, lastSyncTime } = 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';\n\nexport type StateProps = {\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 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 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

{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)(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 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

{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('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,\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';\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 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 currentContent = GlobalSearchContent.ChatList,\n chatId,\n setGlobalSearchContent,\n setGlobalSearchDate,\n onReset,\n}) => {\n const [activeTab, setActiveTab] = useState(0);\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 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_MOBILE_SCREEN } 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('EnterPassword')}

;\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 Delete Folder\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 useLang from '../../../hooks/useLang';\n\nimport ListItem from '../../ui/ListItem';\nimport Avatar from '../../common/Avatar';\n\ntype OwnProps = {\n onScreenSelect: (screen: SettingsScreens) => void;\n};\n\ntype StateProps = {\n currentUser?: ApiUser;\n};\n\nconst SettingsMain: FC = ({\n onScreenSelect,\n currentUser,\n}) => {\n const lang = useLang();\n\n return (\n
\n
\n {currentUser && (\n
\n \n

{getUserFullName(currentUser)}

\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('GeneralSettings')}\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 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 { 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 } 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';\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 currentAvatarHash,\n currentFirstName,\n currentLastName,\n currentBio,\n currentUsername,\n progress,\n isUsernameAvailable,\n loadCurrentUser,\n updateProfile,\n checkUsername,\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 // 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 const lang = useLang();\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 } 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';\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};\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 chatsById,\n usersById,\n orderedFolderIds,\n foldersById,\n recommendedChatFolders,\n notifySettings,\n notifyExceptions,\n loadRecommendedChatFolders,\n addChatFolder,\n showError,\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 showError({\n error: {\n message: 'DIALOG_FILTERS_TOO_MUCH',\n },\n });\n\n return;\n }\n\n onCreateFolder();\n }, [foldersById, showError, onCreateFolder]);\n\n const lang = useLang();\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 showError({\n error: {\n message: 'DIALOG_FILTERS_TOO_MUCH',\n },\n });\n\n return;\n }\n\n addChatFolder({ folder });\n }, [foldersById, addChatFolder, showError]);\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

{lang('FilterRecommended')}

\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', 'showError']),\n)(SettingsFoldersMain));\n","import React, { FC } from '../../lib/teact/teact';\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 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, useState, useEffect, useMemo,\n} from '../../../../lib/teact/teact';\nimport { withGlobal } from '../../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../../global/types';\n\nimport { STICKER_SIZE_FOLDER_SETTINGS } from '../../../../config';\nimport { pick, findIntersectionWithSet } from '../../../../util/iteratees';\nimport { isChatPrivate } from '../../../../modules/helpers';\nimport getAnimationData from '../../../common/helpers/animatedAssets';\nimport {\n FoldersState,\n FolderEditDispatch,\n INCLUDED_CHAT_TYPES,\n EXCLUDED_CHAT_TYPES,\n selectChatFilters,\n} from '../../../../hooks/reducers/useFoldersReducer';\nimport useLang from '../../../../hooks/useLang';\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 onReset: () => 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 onReset,\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 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

{lang('FilterChatTypes')}

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

{lang('FilterChats')}

\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';\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';\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};\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 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 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 { FoldersState, FolderEditDispatch } 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 state: FoldersState;\n dispatch: FolderEditDispatch;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\nconst SettingsFolders: FC = ({\n currentScreen,\n state,\n dispatch,\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';\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 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_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';\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 onScreenSelect: (screen: SettingsScreens) => void;\n};\n\ntype StateProps = ISettings['byKey'] & {\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 onScreenSelect,\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('--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);\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

Choose the desired animations amount.

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

{lang('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 [\n 'messageTextSize',\n 'animationLevel',\n 'messageSendKeyCombo',\n 'shouldAutoDownloadMediaFromContacts',\n 'shouldAutoDownloadMediaInPrivateChats',\n 'shouldAutoDownloadMediaInGroups',\n 'shouldAutoDownloadMediaInChannels',\n 'shouldAutoPlayGifs',\n 'shouldAutoPlayVideos',\n 'shouldSuggestStickers',\n 'shouldLoopStickers',\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 useLang from '../../../hooks/useLang';\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 onScreenSelect: (screen: SettingsScreens) => 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 onScreenSelect,\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 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 } = global.settings.byKey;\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 useFlag from '../../../hooks/useFlag';\nimport buildClassName from '../../../util/buildClassName';\n\nimport InputText from '../../ui/InputText';\n\nimport './SettingsGeneralBackgroundColor.scss';\n\ntype OwnProps = {\n onScreenSelect: (screen: SettingsScreens) => 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 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 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 } = global.settings.byKey;\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';\n\nimport { pick } from '../../../util/iteratees';\nimport useLang from '../../../hooks/useLang';\n\nimport Checkbox from '../../ui/Checkbox';\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 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 return (\n
\n
\n

{lang('AutodownloadPrivateChats')}

\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';\n\nimport ListItem from '../../ui/ListItem';\n\ntype OwnProps = {\n onScreenSelect: (screen: SettingsScreens) => void;\n};\n\ntype StateProps = {\n hasPassword?: boolean;\n blockedCount: number;\n sessionsCount: number;\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 onScreenSelect,\n hasPassword,\n blockedCount,\n sessionsCount,\n visibilityPrivacyPhoneNumber,\n visibilityPrivacyLastSeen,\n visibilityPrivacyProfilePhoto,\n visibilityPrivacyForwarding,\n visibilityPrivacyGroupChats,\n loadPrivacySettings,\n loadBlockedContacts,\n loadAuthorizations,\n}) => {\n useEffect(() => {\n loadBlockedContacts();\n loadAuthorizations();\n loadPrivacySettings();\n }, [loadBlockedContacts, loadAuthorizations, loadPrivacySettings]);\n\n const lang = useLang();\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 );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const {\n settings: {\n byKey: { hasPassword },\n privacy,\n },\n blocked,\n activeSessions,\n } = global;\n\n return {\n hasPassword,\n blockedCount: blocked.totalCount,\n sessionsCount: activeSessions.length,\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',\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 } 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';\n\ntype StateProps = Pick;\n\ntype DispatchProps = Pick;\n\nconst SettingsLanguage: FC = ({\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 setSettingOption({ language: langCode });\n });\n }, [markIsLoading, unmarkIsLoading, setSettingOption]);\n\n const options = useMemo(() => {\n return languages ? buildOptions(languages) : undefined;\n }, [languages]);\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';\n\nimport ListItem from '../../ui/ListItem';\nimport RadioGroup from '../../ui/RadioGroup';\nimport { getPrivacyKey } from './helper/privacy';\n\ntype OwnProps = {\n screen: SettingsScreens;\n onScreenSelect: (screen: SettingsScreens) => void;\n};\n\ntype StateProps = Partial & {\n chatsById?: Record;\n usersById?: Record;\n};\n\ntype DispatchProps = Pick;\n\nconst SettingsPrivacyVisibility: FC = ({\n screen,\n onScreenSelect,\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 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';\n\nimport { pick } from '../../../util/iteratees';\nimport { formatPastTimeShort } from '../../../util/dateFormat';\nimport useFlag from '../../../hooks/useFlag';\nimport useLang from '../../../hooks/useLang';\n\nimport ListItem from '../../ui/ListItem';\nimport ConfirmDialog from '../../ui/ConfirmDialog';\n\ntype StateProps = {\n activeSessions: ApiSession[];\n};\n\ntype DispatchProps = Pick;\n\nconst SettingsPrivacyActiveSessions: FC = ({\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 function renderCurrentSession(session: ApiSession) {\n return (\n
\n

{lang('AuthSessions.CurrentSession')}

\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

Other Sessions

\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\n {otherSessions && renderOtherSessions(otherSessions)}\n\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 => ({ activeSessions: global.activeSessions }),\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';\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';\n\nimport ListItem from '../../ui/ListItem';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\nimport Avatar from '../../common/Avatar';\nimport Loading from '../../ui/Loading';\n\ntype StateProps = {\n chatsByIds: Record;\n usersByIds: Record;\n blockedIds: number[];\n};\n\ntype DispatchProps = Pick;\n\nconst SettingsPrivacyBlockedUsers: FC = ({\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 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';\n\nimport ListItem from '../../../ui/ListItem';\nimport AnimatedEmoji from '../../../common/AnimatedEmoji';\nimport renderText from '../../../common/helpers/renderText';\n\ntype OwnProps = {\n onScreenSelect: (screen: SettingsScreens) => void;\n};\n\ntype StateProps = {\n animatedEmoji: ApiSticker;\n};\n\nconst SettingsTwoFaEnabled: FC = ({\n animatedEmoji, onScreenSelect,\n}) => {\n const lang = useLang();\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 useLang from '../../../../hooks/useLang';\n\nimport PasswordMonkey from '../../../common/PasswordMonkey';\nimport PasswordForm from '../../../common/PasswordForm';\n\ntype OwnProps = {\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};\n\nconst EQUAL_PASSWORD_ERROR = 'Passwords Should Be Equal';\n\nconst SettingsTwoFaPassword: FC = ({\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 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';\n\nimport { selectAnimatedEmoji } from '../../../../modules/selectors';\nimport useLang from '../../../../hooks/useLang';\n\nimport Button from '../../../ui/Button';\nimport AnimatedEmoji from '../../../common/AnimatedEmoji';\n\ntype OwnProps = {\n onStart: NoneToVoidFunction;\n};\n\ntype StateProps = {\n animatedEmoji: ApiSticker;\n};\n\nconst SettingsTwoFaStart: FC = ({ animatedEmoji, onStart }) => {\n const lang = useLang();\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';\n\nimport { IS_MOBILE_SCREEN, IS_TOUCH_ENV } from '../../../../util/environment';\nimport { selectAnimatedEmoji } from '../../../../modules/selectors';\nimport useFlag from '../../../../hooks/useFlag';\nimport useLang from '../../../../hooks/useLang';\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};\n\ntype StateProps = {\n animatedEmoji: ApiSticker;\n};\n\nconst FOCUS_DELAY_TIMEOUT_MS = IS_MOBILE_SCREEN ? 550 : 400;\n\nconst SettingsTwoFaSkippableForm: FC = ({\n animatedEmoji,\n type = 'text',\n isLoading,\n error,\n placeholder,\n shouldConfirm,\n clearError,\n onSubmit,\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 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';\n\nimport Button from '../../../ui/Button';\nimport AnimatedEmoji from '../../../common/AnimatedEmoji';\n\ntype OwnProps = {\n onScreenSelect: (screen: SettingsScreens) => void;\n};\n\ntype StateProps = {\n animatedEmoji: ApiSticker;\n};\n\nconst SettingsTwoFaCongratulations: FC = ({\n animatedEmoji, onScreenSelect,\n}) => {\n const lang = useLang();\n\n const handleClick = () => {\n onScreenSelect(SettingsScreens.Privacy);\n };\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';\n\nimport { IS_MOBILE_SCREEN, IS_TOUCH_ENV } from '../../../../util/environment';\nimport { selectAnimatedEmoji } from '../../../../modules/selectors';\nimport useLang from '../../../../hooks/useLang';\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};\n\ntype StateProps = {\n animatedEmoji: ApiSticker;\n codeLength: number;\n};\n\nconst FOCUS_DELAY_TIMEOUT_MS = IS_MOBILE_SCREEN ? 550 : 400;\n\nconst SettingsTwoFaEmailCode: FC = ({\n animatedEmoji,\n codeLength,\n isLoading,\n error,\n clearError,\n onSubmit,\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 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 dispatch: TwoFaDispatch;\n onScreenSelect: (screen: SettingsScreens) => void;\n};\n\ntype StateProps = GlobalState['twoFaSettings'];\n\ntype DispatchProps = Pick;\n\nconst SettingsTwoFa: FC = ({\n currentScreen,\n state,\n hint,\n isLoading,\n error,\n waitingEmailCodeLength,\n dispatch,\n onScreenSelect,\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, 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 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 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, 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';\n\nimport Picker from '../../common/Picker';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\n\nexport type OwnProps = {\n isAllowList?: boolean;\n screen: SettingsScreens;\n onScreenSelect: (screen: SettingsScreens) => 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 onScreenSelect,\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 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 { IS_MOBILE_SCREEN } 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\nexport type OwnProps = {\n currentScreen: SettingsScreens;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\nconst Settings: FC = ({\n currentScreen,\n onScreenSelect,\n onReset,\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() {\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() {\n return (\n <>\n \n {renderCurrentSectionContent()}\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_MOBILE_SCREEN } 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';\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};\n\ntype StateProps = {\n usersById: Record;\n contactIds?: number[];\n};\n\ntype DispatchProps = Pick;\n\nconst runThrottled = throttle((cb) => cb(), 60000, true);\n\nconst ContactList: FC = ({\n filter, usersById, contactIds, loadContactList, openChat,\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 handleClick = useCallback(\n (id: number) => {\n openChat({ id });\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);\n }, [filter, usersById, contactIds]);\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_MOBILE_SCREEN}\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 };\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, sortChatIds } from '../../../modules/helpers';\nimport useLang from '../../../hooks/useLang';\n\nimport Picker from '../../common/Picker';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\nimport Button from '../../ui/Button';\n\nexport type OwnProps = {\n isChannel?: 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 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 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 ]),\n chatsById,\n false,\n selectedMemberIds,\n );\n }, [\n localContactIds, searchQuery, localUserIds, globalUserIds, usersById, chatsById, selectedMemberIds, currentUserId,\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 const lang = useLang();\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';\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 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 memberIds,\n onReset,\n creationProgress,\n creationError,\n createGroupChat,\n createChannel,\n}) => {\n const lang = useLang();\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 { IS_MOBILE_SCREEN } 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 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 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 {() => {\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';\n\nimport Button from '../ui/Button';\nimport ChatList from './main/ChatList';\n\nimport './ArchivedChats.scss';\n\nexport type OwnProps = {\n onReset: () => void;\n};\n\nconst ArchivedChats: FC = ({ onReset }) => {\n const lang = useLang();\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\nconst preventDefault = (e: Event) => {\n e.preventDefault();\n};\n\nfunction preventDefaultForScrollKeys(e: KeyboardEvent) {\n if (IGNORED_KEYS[e.key]) {\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 { getMessageMediaHash, getMessagePhoto, getMessageText } 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 const mediaHash = getMessageMediaHash(message, 'inline')!;\n const canImageBeCopied = photo && mediaHash && CLIPBOARD_ITEM_SUPPORTED;\n const selection = window.getSelection();\n\n if (canImageBeCopied) {\n options.push({\n label: 'lng_context_copy_image',\n handler: () => {\n mediaLoader.fetch(mediaHash, ApiMediaFormat.BlobUrl).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, canImageBeCopied),\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, canImageBeCopied: boolean): string {\n if (hasSelection) {\n return 'lng_context_copy_selected';\n }\n\n if (canImageBeCopied) {\n return 'lng_context_copy_text';\n }\n\n return 'Copy';\n}\n","import React, { FC, useCallback, useEffect } 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 { dispatchHeavyAnimationEvent } from '../../../hooks/useHeavyAnimationCheck';\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 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 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 ANIMATION_DURATION = 200;\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 canForward,\n canFaveSticker,\n canUnfaveSticker,\n canCopy,\n canCopyLink,\n canSelect,\n onReply,\n onEdit,\n onPin,\n onUnpin,\n onForward,\n onDelete,\n onFaveSticker,\n onUnfaveSticker,\n onSelect,\n onSend,\n onReschedule,\n onClose,\n onCloseAnimationEnd,\n onCopyLink,\n}) => {\n useEffect(() => {\n dispatchHeavyAnimationEvent(ANIMATION_DURATION);\n }, [isOpen]);\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 && {lang('MessageScheduleEditTime')}}\n {canReply && {lang('Reply')}}\n {canEdit && {lang('Edit')}}\n {canFaveSticker && {lang('AddToFavorites')}}\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 {canDelete && {lang('Delete')}}\n \n );\n};\n\nexport default MessageContextMenu;\n","import React, {\n FC, memo, useCallback, useEffect, 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 PinMessageModal from '../../common/PinMessageModal';\nimport MessageContextMenu from './MessageContextMenu';\nimport CalendarModal from '../../common/CalendarModal';\nimport { getDayStartAt } from '../../../util/dateFormat';\n\nexport type OwnProps = {\n isOpen: boolean;\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 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 message,\n album,\n anchor,\n onClose,\n onCloseAnimationEnd,\n noOptions,\n canSendNow,\n canReschedule,\n canReply,\n canPin,\n canUnpin,\n canDelete,\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 loadMessageLink,\n}) => {\n const { transitionClassNames } = useShowTransition(isOpen, onCloseAnimationEnd, undefined, false);\n const [isMenuOpen, setIsMenuOpen] = useState(true);\n const [isDeleteModalOpen, setIsDeleteModalOpen] = 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 closeMenu = useCallback(() => {\n setIsMenuOpen(false);\n onClose();\n }, [onClose]);\n\n const closeDeleteModal = useCallback(() => {\n setIsDeleteModalOpen(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 loadMessageLink({\n messageId: message.id,\n chatId: message.chatId,\n });\n closeMenu();\n }, [closeMenu, loadMessageLink, message.chatId, message.id]);\n\n useEffect(() => {\n disableScrolling();\n\n return enableScrolling;\n }, []);\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\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 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 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 'loadMessageLink',\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';\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_MOBILE_SCREEN } from '../../util/environment';\nimport { disableScrolling, enableScrolling } from '../../util/scrollLock';\nimport { selectChat } from '../../modules/selectors';\nimport { pick } from '../../util/iteratees';\nimport { isChatPrivate, getCanDeleteChat } 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 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 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}) => {\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 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_MOBILE_SCREEN && canSubscribe && (\n \n {lang(isChannel ? 'Subscribe' : 'Join Group')}\n \n )}\n {IS_MOBILE_SCREEN && 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: chat.isMuted,\n isPrivate: isChatPrivate(chat.id),\n canDeleteChat: getCanDeleteChat(chat),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'updateChatMutedState',\n 'enterMessageSelectMode',\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 useFlag from '../../hooks/useFlag';\nimport useLang from '../../hooks/useLang';\n\nimport Button from '../ui/Button';\nimport SearchInput from '../ui/SearchInput';\nimport CalendarModal from '../common/CalendarModal';\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};\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 setLocalTextSearchQuery,\n searchTextMessagesLocal,\n focusMessage,\n closeLocalTextSearch,\n searchMessagesByDate,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef(null);\n const [focusedIndex, setFocusedIndex] = useState(0);\n const [isCalendarOpen, openCalendar, closeCalendar] = useFlag();\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 }, [isCalendarOpen]);\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 handleJumpToDate = useCallback((date: Date) => {\n searchMessagesByDate({ timestamp: date.valueOf() / 1000 });\n closeCalendar();\n }, [closeCalendar, searchMessagesByDate]);\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 const lang = useLang();\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 \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 };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'setLocalTextSearchQuery',\n 'searchTextMessagesLocal',\n 'focusMessage',\n 'closeLocalTextSearch',\n 'searchMessagesByDate',\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 React, {\n FC, useCallback, useEffect, useState, useRef, memo,\n} from '../../../lib/teact/teact';\nimport usePrevious from '../../../hooks/usePrevious';\n\nimport { ApiChatMember, ApiUser } from '../../../api/types';\n\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport buildClassName from '../../../util/buildClassName';\nimport captureKeyboardListeners from '../../../util/captureKeyboardListeners';\nimport findInViewport from '../../../util/findInViewport';\nimport isFullyVisible from '../../../util/isFullyVisible';\nimport fastSmoothScroll from '../../../util/fastSmoothScroll';\nimport cycleRestrict from '../../../util/cycleRestrict';\n\nimport ListItem from '../../ui/ListItem';\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\n\nimport './MentionTooltip.scss';\n\nconst VIEWPORT_MARGIN = 8;\nconst SCROLL_MARGIN = 10;\n\nfunction setItemVisible(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 '.chat-item-clickable',\n VIEWPORT_MARGIN,\n true,\n true,\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\nexport type OwnProps = {\n isOpen: boolean;\n filter: string;\n onClose: () => void;\n onInsertUserName: (user: ApiUser, forceFocus?: boolean) => void;\n filteredChatMembers?: ApiChatMember[];\n usersById?: Record;\n};\n\nconst MentionTooltip: FC = ({\n isOpen,\n filter,\n onClose,\n onInsertUserName,\n usersById,\n filteredChatMembers,\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 (!filteredChatMembers) {\n return -1;\n }\n const membersCount = filteredChatMembers!.length;\n return cycleRestrict(membersCount, newIndex);\n }, [filteredChatMembers]);\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 (filteredChatMembers && filteredChatMembers.length && selectedMentionIndex > -1) {\n const member = filteredChatMembers[selectedMentionIndex];\n if (member) {\n e.preventDefault();\n handleUserSelect(member.userId, true);\n }\n }\n }, [filteredChatMembers, 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 (filteredChatMembers && !filteredChatMembers.length) {\n onClose();\n }\n }, [filteredChatMembers, onClose]);\n\n useEffect(() => {\n setSelectedMentionIndex(0);\n }, [filter]);\n\n useEffect(() => {\n setItemVisible(selectedMentionIndex, containerRef);\n }, [selectedMentionIndex]);\n\n const prevChatMembers = usePrevious(\n filteredChatMembers && filteredChatMembers.length\n ? filteredChatMembers\n : undefined,\n shouldRender,\n );\n const renderedChatMembers = filteredChatMembers && !filteredChatMembers.length\n ? prevChatMembers\n : filteredChatMembers;\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(({ userId }, index) => (\n handleUserSelect(userId)}\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';\nimport { CONTENT_TYPES_FOR_QUICK_UPLOAD, EDITABLE_INPUT_MODAL_ID } from '../../../config';\n\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 canSuggestMembers?: boolean;\n canSuggestEmoji?: boolean;\n currentUserId?: number;\n groupChatMembers?: ApiChatMember[];\n usersById?: Record;\n recentEmojis: string[];\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 canSuggestMembers,\n groupChatMembers,\n currentUserId,\n usersById,\n recentEmojis,\n onCaptionUpdate,\n addRecentEmoji,\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 = renderingAttachments && renderingAttachments.every((a) => a.quick);\n const lang = useLang();\n\n const {\n isMentionTooltipOpen, mentionFilter,\n closeMentionTooltip, insertMention,\n mentionFilteredMembers,\n } = useMentionTooltip(\n canSuggestMembers && isOpen,\n caption,\n onCaptionUpdate,\n EDITABLE_INPUT_MODAL_ID,\n groupChatMembers,\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 );\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.includes(file.type);\n })\n : Array.from(files);\n\n onFileAppend(newFiles, false);\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

Options

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

Solution

\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,\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) {\n closeTimeout = window.setTimeout(() => {\n if (!isMouseInside.current) {\n onClose();\n }\n }, menuCloseTimeout * 2);\n }\n }, [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(() => {\n onClick(emoji.native, emoji.id);\n }, [emoji, onClick]);\n\n return (\n \n {IS_EMOJI_SUPPORTED\n ? {emoji.native}\n : \"\"}\n
\n );\n};\n\nexport default memo(EmojiButton);\n","import React, { FC, memo, useRef } from '../../../lib/teact/teact';\n\nimport { IS_MOBILE_SCREEN } 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_MOBILE_SCREEN\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 { MEMO_EMPTY_ARRAY } from '../../../util/memo';\nimport { IS_MOBILE_SCREEN } from '../../../util/environment';\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, !IS_MOBILE_SCREEN);\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_MOBILE_SCREEN } 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_MOBILE_SCREEN ? 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_MOBILE_SCREEN\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 { 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);\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 onClick: (gif: ApiVideo) => void;\n};\n\nconst GifButton: FC = ({\n gif, observeIntersection, isDisabled, 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 className = buildClassName(\n 'GifButton',\n gif.width && gif.height && gif.width < gif.height ? 'vertical' : 'horizontal',\n transitionClassNames,\n localMediaHash,\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 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 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 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';\n\nimport { ApiSticker, ApiVideo } from '../../../api/types';\n\nimport { IAllowedAttachmentOptions } from '../../../modules/helpers';\nimport { IS_MOBILE_SCREEN, 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) => void;\n onGifSelect: (gif: ApiVideo) => void;\n onRemoveSymbol: () => void;\n onSearchOpen: (type: 'stickers' | 'gifs') => void;\n addRecentEmoji: AnyToVoidFunction;\n};\n\nlet isActivated = false;\n\nconst SymbolMenu: FC = ({\n isOpen, allowedAttachmentOptions,\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);\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_MOBILE_SCREEN) {\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 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_MOBILE_SCREEN && (\n \n \n \n )}\n \n \n );\n\n if (IS_MOBILE_SCREEN) {\n if (!shouldRender) {\n return undefined;\n }\n\n const className = buildClassName(\n 'SymbolMenu mobile-menu',\n transitionClassNames,\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(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 CONTENT_TYPES_FOR_QUICK_UPLOAD,\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 {lang('AttachmentMenu.PhotoOrVideo')}\n Document\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;\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 CLOSE_DURATION = 350;\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(-1);\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 -1;\n }\n\n const emojisCount = emojis.length;\n return cycleRestrict(emojisCount, newIndex);\n }, [emojis]);\n\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 > -1) {\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 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, useMemo, memo } 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';\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};\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 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 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, 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';\n\nimport Loading from '../ui/Loading';\nimport StickerSetResult from './StickerSetResult';\n\nimport './StickerSearch.scss';\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 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 [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 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';\n\nimport InfiniteScroll from '../ui/InfiniteScroll';\nimport GifButton from '../common/GifButton';\nimport Loading from '../ui/Loading';\n\nimport './GifSearch.scss';\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 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 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};\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';\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\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 {getPercentage(answerVote.votersCount, totalVoters)}%\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';\n\nimport PollAnswerResults from './PollAnswerResults';\nimport Loading from '../ui/Loading';\n\nimport './PollResults.scss';\n\ntype StateProps = {\n chat?: ApiChat;\n message?: ApiMessage;\n lastSyncTime?: number;\n};\n\nconst PollResults: FC = ({\n chat,\n message,\n lastSyncTime,\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 { selectChat, selectUser } from '../../../modules/selectors';\nimport useFlag from '../../../hooks/useFlag';\nimport useLang from '../../../hooks/useLang';\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};\n\ntype StateProps = {\n user?: ApiUser;\n chat: ApiChat;\n progress?: ManagementProgress;\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 updateContact,\n deleteUser,\n deleteHistory,\n closeManagement,\n openChat,\n}) => {\n const [isDeleteDialogOpen, openDeleteDialog, closeDeleteDialog] = useFlag();\n const [isProfileFieldsTouched, setIsProfileFieldsTouched] = useState(false);\n const [error, setError] = useState();\n const lang = useLang();\n\n const currentFirstName = user ? (user.firstName || '') : '';\n const currentLastName = user ? (user.lastName || '') : '';\n const currentIsMuted = chat ? chat.isMuted : undefined;\n\n const [firstName, setFirstName] = useState(currentFirstName);\n const [lastName, setLastName] = useState(currentLastName);\n const [isNotificationsEnabled, setIsNotificationsEnabled] = useState(!currentIsMuted);\n\n useEffect(() => {\n setIsNotificationsEnabled(!currentIsMuted);\n }, [currentIsMuted]);\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 if (chat.lastMessage) {\n deleteHistory({\n chatId: chat.id,\n maxId: chat.lastMessage!.id,\n shouldDeleteForAll: false,\n });\n }\n deleteUser({ userId });\n closeDeleteDialog();\n closeManagement();\n openChat({ id: undefined });\n }, [chat.id, chat.lastMessage, 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\n return { user, chat, progress };\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';\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};\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 deleteHistory,\n leaveChannel,\n deleteChannel,\n closeManagement,\n openChat,\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 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 deleteHistory({ chatId: chat.id, maxId: chat.lastMessage!.id, shouldDeleteForAll: false });\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, chat.lastMessage,\n closeDeleteDialog, closeManagement, deleteHistory, leaveChannel, deleteChannel, 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 {enabledPermissionsCount}/{TOTAL_PERMISSIONS_COUNT}\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\n return {\n chat,\n progress,\n isBasicGroup: isChatBasicGroup(chat),\n hasLinkedChannel,\n canChangeInfo: getHasAdminRight(chat, 'changeInfo'),\n canBanUsers: getHasAdminRight(chat, 'banUsers'),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'togglePreHistoryHidden', 'updateChat', 'closeManagement',\n 'deleteHistory', 'leaveChannel', 'deleteChannel', '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';\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};\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}) => {\n const [permissions, setPermissions] = useState({});\n const [havePermissionChanged, setHavePermissionChanged] = useState(false);\n const [isLoading, setIsLoading] = useState(false);\n const lang = useLang();\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 keyof ApiChatBannedRights]),\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';\n\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\nimport ListItem from '../../ui/ListItem';\n\ntype OwnProps = {\n chatId: number;\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}) => {\n const lang = useLang();\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';\n\nimport './Management.scss';\n\ntype OwnProps = {\n chatId: number;\n onScreenSelect: (screen: ManagementScreens) => void;\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}) => {\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 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';\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};\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 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 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

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

\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';\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};\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 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 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';\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};\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}) => {\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 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 keyof ApiChatBannedRights]),\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: keyof ApiChatBannedRights) => {\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';\nimport { getUserFullName, isChatChannel } from '../../../modules/helpers';\n\nimport { selectChat } from '../../../modules/selectors';\nimport useLang from '../../../hooks/useLang';\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};\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}) => {\n const lang = useLang();\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';\n\nimport ListItem from '../../ui/ListItem';\nimport Checkbox from '../../ui/Checkbox';\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\n\ntype OwnProps = {\n chatId: number;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n};\n\nconst ManageGroupRecentActions: FC = ({ chat }) => {\n const lang = useLang();\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';\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};\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}) => {\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 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';\n\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\nimport NothingFound from '../../common/NothingFound';\nimport ListItem from '../../ui/ListItem';\n\ntype OwnProps = {\n chatId: number;\n};\n\ntype StateProps = {\n usersById: Record;\n members?: ApiChatMember[];\n isChannel?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst ManageGroupMembers: FC = ({\n members,\n usersById,\n isChannel,\n openUserInfo,\n}) => {\n const memberIds = useMemo(() => {\n if (!members || !usersById) {\n return undefined;\n }\n\n return sortUserIds(members.map(({ userId }) => userId), usersById);\n }, [members, usersById]);\n\n const handleMemberClick = useCallback((id: number) => {\n openUserInfo({ id });\n }, [openUserInfo]);\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 };\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';\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};\n\ntype StateProps = {\n usersById: Record;\n members?: ApiChatMember[];\n isChannel?: boolean;\n};\n\nconst ManageGroupUserPermissionsCreate: FC = ({\n usersById,\n members,\n isChannel,\n onScreenSelect,\n onChatMemberSelect,\n}) => {\n const memberIds = useMemo(() => {\n if (!members || !usersById) {\n return undefined;\n }\n\n return sortUserIds(members.filter((member) => !member.isOwner).map(({ userId }) => userId), usersById);\n }, [members, 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 };\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};\n\ntype StateProps = {\n managementType?: ManagementType;\n};\n\nconst Management: FC = ({\n chatId,\n currentScreen,\n selectedChatMemberId,\n isPromotedByCurrentUser,\n onScreenSelect,\n onChatMemberSelect,\n managementType,\n}) => {\n switch (currentScreen) {\n case ManagementScreens.Initial: {\n switch (managementType) {\n case 'user':\n return ;\n case 'group':\n return ;\n case 'channel':\n return ;\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 } from '../../api/types';\n\nimport { pick } from '../../util/iteratees';\nimport { getCurrencySign } from '../middle/helpers/getCurrencySign';\nimport { detectCardTypeText } from '../common/helpers/detectCardType';\nimport { getShippingError } 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 globalErrors?: ApiError[];\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 globalErrors,\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 || globalErrors) {\n setIsLoading(false);\n }\n }, [step, error, globalErrors]);\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 (globalErrors && globalErrors.length) {\n const errors = getShippingError(globalErrors);\n paymentDispatch({\n type: 'setFormErrors',\n payload: {\n ...errors,\n },\n });\n }\n }, [error, globalErrors, 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 T 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 globalErrors: global.errors,\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_MOBILE_SCREEN } 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_MOBILE_SCREEN ? 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_MOBILE_SCREEN } from '../../util/environment';\nimport buildClassName from '../../util/buildClassName';\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_MOBILE_SCREEN ? 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\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.292f70afdd30b166608d.css b/dist/4.292f70afdd30b166608d.css new file mode 100644 index 000000000..fbbdfb677 --- /dev/null +++ b/dist/4.292f70afdd30b166608d.css @@ -0,0 +1 @@ +.Switcher{display:inline-flex;align-items:center;position:relative;margin:0}.Switcher.disabled{opacity:.5}.Switcher.disabled,.Switcher.inactive{pointer-events:none}.Switcher.no-animation .widget,.Switcher.no-animation .widget:after,body.animation-level-0 .Switcher .widget,body.animation-level-0 .Switcher .widget:after{transition:none!important}.Switcher.no-animation .widget:active:after,body.animation-level-0 .Switcher .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:.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:.2s ease-out;border:.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}#LeftMainHeader{position:relative}#LeftMainHeader .animated-menu-icon{position:absolute}#LeftMainHeader .animated-menu-icon,#LeftMainHeader .animated-menu-icon:after,#LeftMainHeader .animated-menu-icon:before{width:1.125rem;height:.125rem;border-radius:.125rem;background-color:var(--color-text-secondary);transition:transform .25s;transform:rotate(0)}#LeftMainHeader .animated-menu-icon:after,#LeftMainHeader .animated-menu-icon:before{position:absolute;left:0;content:""}#LeftMainHeader .animated-menu-icon:before{top:-.3125rem}#LeftMainHeader .animated-menu-icon:after{top:.3125rem}#LeftMainHeader .animated-menu-icon.state-back{transform:rotate(180deg)}#LeftMainHeader .animated-menu-icon.state-back:before{transform:rotate(45deg) scaleX(.75) translate(.375rem,-.1875rem)}#LeftMainHeader .animated-menu-icon.state-back:after{transform:rotate(-45deg) scaleX(.75) translate(.375rem,.1875rem)}#LeftMainHeader .animated-menu-icon.no-animation,#LeftMainHeader .animated-menu-icon.no-animation:after,#LeftMainHeader .animated-menu-icon.no-animation:before{transition:none}#LeftMainHeader .archived-badge{min-width:1.5rem;height:1.5rem;margin-left:auto;background:var(--color-gray);border-radius:.75rem;padding:0 .45rem;color:#fff;font-size:.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}.Transition>div:not(.active) #LeftMainHeader .Menu .bubble,body.animating-right-column #LeftMainHeader .Menu .bubble{transition:none!important}#ConnectionState{flex:0 0 auto;display:flex;align-items:center;margin:0 .5rem .5rem;padding:.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}}.NewChatButton{position:absolute;right:1rem;bottom:1rem;transform:translateY(5rem);transition:transform .25s cubic-bezier(.34,1.56,.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:translateZ(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-close,.NewChatButton>.Button .icon-new-chat-filled{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 ease-out forwards}.NewChatButton>.Button.active .icon-close{animation:grow-icon .4s ease-out}.NewChatButton>.Button.active .icon-new-chat-filled{animation:hide-icon .4s ease-out forwards}#LeftColumn-main{height:100%;position:relative;display:flex;flex-direction:column;overflow:hidden;z-index:1}#LeftColumn-main>.Transition{flex:1;overflow:hidden}#LeftColumn-main .ChatFolders{height:100%;display:flex;flex-direction:column;overflow:hidden}#LeftColumn-main .ChatFolders .tabs-placeholder{height:2.625rem;transition:height .15s 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:.625rem;padding-right:.625rem}#LeftColumn-main .ChatFolders .Tab>span{padding-left:.5rem;padding-right:.5rem}#LeftColumn-main .ChatFolders>.Transition{flex:1;overflow:hidden}#LeftColumn-main .chat-list,#LeftColumn-main .LeftSearch,#LeftColumn-main .RecentContacts,#LeftColumn-main .search-content{height:100%;overflow-y:auto}#LeftColumn{overflow:hidden}#NewChat{height:100%}.left-header{height:var(--header-height);padding:.375rem 1.25rem .5rem .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:.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:.5rem}}.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-pause,.AudioPlayer .toggle-play .icon-play{opacity:1;transform:scale(1);transition:opacity .4s,transform .6s cubic-bezier(.34,1.56,.64,1)}.AudioPlayer .toggle-play.loading .icon-pause,.AudioPlayer .toggle-play.loading .icon-play,.AudioPlayer .toggle-play.pause .icon-play,.AudioPlayer .toggle-play.play .icon-pause{opacity:0;transform:scale(.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:.875rem!important;line-height:1rem;height:1rem;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.AudioPlayer-content .subtitle{font-size:.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}.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:.5rem;position:relative;transform:translateZ(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:-.5rem;margin-right:.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 .375rem;border-radius:.625rem;font-size:.75rem;line-height:1.25rem;font-weight:500;text-align:center;position:absolute;top:-.25rem;right:-.5rem;background:var(--color-gray);color:#fff;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 .AudioPlayer,body.animation-level-0 .MiddleHeader .header-tools .HeaderActions,body.animation-level-0 .MiddleHeader .header-tools .HeaderPinnedMessage-wrapper{transition:none!important}@media (min-width:1276px) and (max-width:1439px){.MiddleHeader .header-tools .HeaderActions{transform:translateZ(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:translateZ(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 .AudioPlayer,.MiddleHeader:not(.tools-stacked) .header-tools .HeaderPinnedMessage-wrapper{opacity:1}#Main.right-column-open .MiddleHeader:not(.tools-stacked) .header-tools .AudioPlayer,#Main.right-column-open .MiddleHeader:not(.tools-stacked) .header-tools .HeaderPinnedMessage-wrapper{opacity:0}}.MiddleHeader.tools-stacked .header-tools .AudioPlayer,.MiddleHeader.tools-stacked .header-tools .HeaderPinnedMessage-wrapper{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:.375rem .5rem .375rem .75rem;background:var(--color-background)}.MiddleHeader.tools-stacked .header-tools .AudioPlayer:before,.MiddleHeader.tools-stacked .header-tools .HeaderPinnedMessage-wrapper:before{content:"";display:block;position:absolute;top:-.1875rem;left:0;right:0;height:.125rem;box-shadow:0 .125rem .125rem var(--color-light-shadow)}.MiddleHeader.tools-stacked .header-tools .AudioPlayer .HeaderPinnedMessage,.MiddleHeader.tools-stacked .header-tools .HeaderPinnedMessage-wrapper .HeaderPinnedMessage{max-width:unset;margin-top:-.1875rem}.MiddleHeader.tools-stacked .header-tools .AudioPlayer{height:3.25rem;flex-direction:row;padding:.375rem .5rem}.MiddleHeader.tools-stacked .header-tools .AudioPlayer-content{padding: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:.125rem;bottom:.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 .AudioPlayer,#Main.right-column-open .MiddleHeader.tools-stacked .header-tools .HeaderPinnedMessage-wrapper{padding-right:calc(.5rem + var(--right-column-width))}}.MiddleHeader.tools-stacked.animated .header-tools .AudioPlayer,.MiddleHeader.tools-stacked.animated .header-tools .HeaderPinnedMessage-wrapper{animation:fade-in var(--layer-transition) forwards}body.animation-level-0 .MiddleHeader.tools-stacked.animated .header-tools .AudioPlayer,body.animation-level-0 .MiddleHeader.tools-stacked.animated .header-tools .HeaderPinnedMessage-wrapper{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}@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:.25rem;margin-top:.05rem}.MiddleHeader .ChatInfo .status,.MiddleHeader .ChatInfo .user-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:.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:-.25rem;margin-bottom:-.25rem;padding:.25rem .25rem .25rem .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:.125rem 0;width:.125rem;min-width:.125rem;overflow:hidden}.MiddleHeader .HeaderPinnedMessage .pinned-message-border .pinned-message-border-wrapper-1{height:2.25rem;width:.125rem;border-radius:.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:.125rem;background:var(--color-primary);border-radius:.0625rem;will-change:transform;transition:transform .25s ease-in-out}.MiddleHeader .HeaderPinnedMessage .message-text{overflow:hidden;margin-inline-start:.375rem;margin-top:.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:.875rem;line-height:1rem;height:1rem;color:var(--color-primary);margin-bottom:.125rem;white-space:pre;text-align:initial}.MiddleHeader .HeaderPinnedMessage .message-text p{font-size:.875rem;line-height:1.125rem;height:1.125rem;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin:0}.MiddleHeader .HeaderPinnedMessage .emoji-small{width:1rem;height:1rem}.MiddleHeader .HeaderPinnedMessage>img{width:2.25rem;height:2.25rem;object-fit:cover;border-radius:.25rem;margin-inline-start:.375rem;margin-top:.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 .HeaderActions .Button,.MiddleHeader .HeaderPinnedMessage-wrapper .Button{margin-left:.25rem}.MiddleHeader .HeaderActions .Button.tiny,.MiddleHeader .HeaderPinnedMessage-wrapper .Button.tiny{margin-right:.625rem}@media (max-width:600px){.MiddleHeader .AudioPlayer,.MiddleHeader .HeaderPinnedMessage-wrapper{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:.375rem .5rem .375rem .75rem;background:var(--color-background)}.MiddleHeader .AudioPlayer:before,.MiddleHeader .HeaderPinnedMessage-wrapper:before{content:"";display:block;position:absolute;top:-.1875rem;left:0;right:0;height:.125rem;box-shadow:0 .125rem .125rem var(--color-light-shadow)}.MiddleHeader .AudioPlayer .HeaderPinnedMessage,.MiddleHeader .HeaderPinnedMessage-wrapper .HeaderPinnedMessage{max-width:unset;margin-top:-.1875rem}.MiddleHeader .AudioPlayer{height:3.25rem;flex-direction:row;padding:.375rem .5rem}.MiddleHeader .AudioPlayer-content{padding: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:.125rem;bottom:.125rem}.MiddleHeader .HeaderPinnedMessage .message-text{max-width:none}.MiddleHeader .AudioPlayer,.MiddleHeader .HeaderPinnedMessage-wrapper{transform:translateZ(0)}}@media (min-width:925px) and (max-width:1149.9px){.MiddleHeader .AudioPlayer,.MiddleHeader .HeaderPinnedMessage-wrapper{position:absolute}}@keyframes fade-in{0%{opacity:0}to{opacity:1}}.EmbeddedMessage{display:flex;align-items:center;font-size:.875rem;line-height:1.125rem;margin:0 -.25rem .0625rem;padding:.1875rem .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:.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:.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-text{overflow:hidden;margin-inline-start:.5rem;display:flex;flex-direction:column-reverse}.EmbeddedMessage .message-text .message-title{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-bottom:.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:1.125rem!important;height:1.125rem!important;vertical-align:-4px!important}.EmbeddedMessage .embedded-action-message{color:var(--accent-color);opacity:.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:.5625rem;margin:0 0 -.125rem -.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)}.MessageMeta{position:absolute;height:1.25rem;bottom:0;right:0;display:flex;align-items:center;background:hsla(0,0%,60%,.6);border-radius:.625rem;padding:0 .25rem;color:#fff;cursor:pointer;max-width:100%}.MessageMeta .message-signature,.MessageMeta .message-time,.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:.375rem}.MessageMeta .icon-channelviews{margin-left:.125rem;margin-right:.375rem;font-size:1.125rem;position:relative;top:-.0625rem}.has-solid-background .MessageMeta{color:rgba(var(--color-text-meta-rgb),.75);background:none}.media:not(.text) .MessageMeta,.Message .custom-shape .MessageMeta{background:rgba(0,0,0,.2);--color-accent-own:#fff;--color-accent:#fff;color:#fff!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:.935rem;right:.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:.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}.Sticker:not(.inactive){cursor:pointer}.Sticker.inactive{pointer-events:none}.Contact{display:flex;align-items:center;padding:.25rem}.Contact.interactive{cursor:pointer}.Contact .Avatar{margin-right:.8rem}.Contact .contact-info{padding:.5rem .5rem .5rem 0;white-space:nowrap;overflow:hidden}.Contact .contact-info .contact-name{font-size:1rem;line-height:1rem;margin-bottom:.25rem;font-weight:500}.Contact .contact-info .contact-phone{line-height:1rem;color:var(--secondary-color)}.PollOption{display:flex;flex-flow:row nowrap;margin-bottom:.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:.25rem;min-width:.5rem;border-radius:.125rem;margin-top:.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}to{opacity:1}}.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:.125rem 0;word-break:break-word}.Poll .poll-type,.Poll .poll-voters-count{color:var(--secondary-color);font-size:.875rem}.Poll .poll-type{margin-bottom:.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:.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:.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:.4375rem;background-color:var(--accent-color)}.Poll .Checkbox input:checked~.Checkbox-main:before,.Poll .Checkbox input:checked~.Radio-main:before,.Poll .Radio input:checked~.Checkbox-main:before,.Poll .Radio input:checked~.Radio-main:before{border-color:var(--accent-color)}.Poll .Checkbox .Spinner,.Poll .Radio .Spinner{left:.125rem}.Poll .Checkbox .Checkbox-main:after{left:.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:initial}.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-answers,.Poll .poll-results{padding-top:.25rem;padding-bottom:.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}.WebPage{margin-top:.25rem;margin-bottom:.125rem;padding-left:.625rem;font-size:.875rem;line-height:1.125rem;max-width:29rem;position:relative}.WebPage:before{content:"";display:block;position:absolute;top:0;bottom:0;left:0;width:2px;background:var(--accent-color);border-radius:2px}.WebPage-text{display:flex;flex-direction:column;align-items:flex-start}.WebPage .media-inner{margin:0 0 .375rem!important}.WebPage .media-inner,.WebPage .media-inner.small-image img,.WebPage .media-inner 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-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-description:last-child:after,.WebPage:not(.with-square-photo) .site-name:last-child:after,.WebPage:not(.with-square-photo) .site-title:last-child:after{content:"";display:inline-block;width:var(--meta-safe-area-size);height:.5rem}.WebPage .site-description,.WebPage .site-name,.WebPage .site-title{word-break:break-word}.WebPage .site-name{color:var(--accent-color)}.WebPage .site-name,.WebPage .site-title{font-weight:500;margin-bottom:.125rem}.WebPage .site-description{line-height:1rem;margin-bottom:0}.WebPage:dir(rtl){padding-inline-start:.625rem}.WebPage:dir(rtl):before{left:auto;right:0}.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,.6);border-radius:var(--border-radius-messages-small);color:var(--color-text);font-weight:500}.Album{position:relative;overflow:hidden}.message-content.media.text .Album{margin:-.3125rem -.5rem .3125rem}.forwarded-message .Album{margin-bottom:.125rem}.message-content.media.text .forwarded-message .Album{margin: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}.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:#fff;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}.InlineButtons{display:flex;flex-direction:column}.InlineButtons .row{display:flex;flex-direction:row}.InlineButtons .Button{flex:1;width:auto;margin:.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 .2s}.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:.75rem;position:absolute;right:.125rem;top:.125rem;display:block;transform:rotate(-45deg)}.InlineButtons .row:first-of-type .Button{margin-top:.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)}.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:0 100%;background-image:url("data:image/svg+xml;charset=utf-8,%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(.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:.375rem .3125rem .25rem;align-items:flex-start;color:#fff;background-color:rgba(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,.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 .icon-comments,.custom-shape .CommentButton .icon-next,.custom-shape .CommentButton .label,.custom-shape .CommentButton .recent-repliers{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}.audio .CommentButton,.is-forwarded .CommentButton,.poll .CommentButton,.text .CommentButton,.voice .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.has-solid-background.is-forwarded .CommentButton,.message-content.has-solid-background.text .CommentButton,.message-content.poll .CommentButton,.message-content.voice .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}.Message{display:flex;align-items:flex-end;margin-bottom:.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-size:calc(var(--meta-safe-area-base) + var(--meta-safe-author-width));--deleting-translate-x:-50%;--select-message-scale:0.9;--select-background-color:#fff}.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:.625rem}.Message.last-in-list{margin-bottom:.4375rem}.Message.is-in-selection-mode .Album{border:1px solid var(--select-background-color);background-color:var(--select-background-color)}.Message.has-inline-buttons .message-content{border-bottom-right-radius:var(--border-radius-messages-small)}.Message:not(.own){padding-left:2.5rem}.Message:not(.own).is-thread-top,.no-avatars .Message:not(.own){padding-left:0}@media (max-width:600px){.Message:not(.own){padding-left:2.875rem}.Message:not(.own).is-thread-top,.no-avatars .Message:not(.own){padding-left:.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)}@media (max-width:600px){.Message.own{padding-right:.25rem}}.Message.is-deleting>.Avatar,.Message.is-deleting>.message-content-wrapper{transition:opacity .2s ease,transform .2s ease-in;opacity:0;transform:scale(.3) translateX(var(--deleting-translate-x));transform-origin:bottom}.Message.has-views{--meta-safe-area-size:calc(var(--meta-safe-area-base) + var(--meta-safe-author-width) + 4rem)}.Message.was-edited{--meta-safe-area-size:calc(var(--meta-safe-area-base) + var(--meta-safe-author-width) + 2.5rem)}.Message.was-edited.has-views{--meta-safe-area-size:calc(var(--meta-safe-area-base) + var(--meta-safe-author-width) + 7.5rem)}.select-mode-active .Message{cursor:pointer;-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:-.25rem;bottom:-.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 .File.file-is-selected .message-select-control,.Message.is-selected .message-select-control.group-select.is-selected{background:var(--color-green)}.Message.has-menu-open.is-in-document-group .File .file-icon,.Message.is-in-document-group .File.file-is-selected .file-icon{--background-color:var(--color-background-selected)}.Message.own.has-menu-open.is-in-document-group .File .file-icon,.Message.own.is-in-document-group .File.file-is-selected .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+PHBhdGggZD0iTTguMjE4IDcuNWw1LjYzMy01LjYzM2EuNTA4LjUwOCAwIDEwLS43MTgtLjcxOEw3LjUgNi43ODIgMS44NjcgMS4xNDlhLjUwOC41MDggMCAxMC0uNzE4LjcxOEw2Ljc4MiA3LjVsLTUuNjMzIDUuNjMzYS41MDguNTA4IDAgMTAuNzE4LjcxOEw3LjUgOC4yMThsNS42MzMgNS42MzNhLjUwNi41MDYgMCAwMC43MTggMCAuNTA4LjUwOCAwIDAwMC0uNzE4TDguMjE4IDcuNXoiIGZpbGw9IiNGRkYiIHN0cm9rZT0iI0E0NUQzNyIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPjwvc3ZnPg==)}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{top:.438rem;right:.438rem;left:unset}.Message .album-item-select-wrapper .media-inner{border:0 solid var(--select-background-color);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-forwarding .message-select-control,.Message.is-selected .message-select-control{background:var(--color-green)}.Message.is-forwarding .Menu .bubble,.Message.is-selected .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:#fff}.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:.688rem;background:#fff;border:.125rem solid rgba(0,0,0,.2);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:.25rem;width:1.5rem;height:1.5rem;border:2px solid #fff;border-radius:50%;z-index:var(--z-message-select-control);display:flex;align-items:center;justify-content:center;color:#fff;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:hsla(0,0%,100%,.5)}.Message .Avatar{margin-right:.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}.Album,.media-inner,.message-content,.message-content.custom-shape .media-inner img,.message-content.media .media-inner img,.message-content.media .media-inner video{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),.Message:not(.own):not(.first-in-group):not(.last-in-group){--border-bottom-left-radius:var(--border-radius-messages-small)}.Message:not(.own).last-in-group:not(.first-in-group),.Message:not(.own):not(.first-in-group):not(.last-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),.Message.own:not(.first-in-group):not(.last-in-group){--border-bottom-right-radius:var(--border-radius-messages-small)}.Message.own.last-in-group:not(.first-in-group),.Message.own:not(.first-in-group):not(.last-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) .Album,.Message .message-content.has-replies:not(.custom-shape) .media-inner,.Message .message-content.text .Album,.Message .message-content.text .media-inner{--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).force-sender-name .Album,.Message .message-content:not(.custom-shape).is-reply .Album,.Message .message-content:not(.custom-shape).is-reply .media-inner,.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:.25rem}.Message .message-action-button{position:absolute;bottom:0;color:#fff;background-color:rgba(0,0,0,.2);opacity:0;transition:opacity .2s ease}@media (pointer:coarse){.Message .message-action-button{opacity:1!important}}.Message .message-action-button:active,.Message .message-action-button:focus,.Message .message-action-button:hover{background-color:rgba(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:69vw}}.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.document>.MessageMeta,.message-content .text-content>.MessageMeta{position:relative;top:.4375rem;bottom:auto!important;float:right;line-height:1;margin-left:.4375rem;margin-right:-.5rem}.message-content.document:dir(rtl)>.MessageMeta,.message-content .text-content: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{position:relative;top:auto;bottom:-.5rem!important}.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)}.message-content:not(.custom-shape)>.content-inner{min-width:0}.message-content .matching-text-highlight{background:#cae3f7;border-radius:.25rem;padding:0 .125rem}.message-content .message-title{white-space:nowrap;font-size:.875rem;font-weight:500;line-height:1.25rem;color:var(--accent-color);unicode-bidi:plaintext;display:flex}.message-content .message-title,.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:.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)}.message-content .message-title+.File{margin-top:.25rem}.message-content .message-title .via{padding:0 .2rem;font-weight:400}.message-content .message-title .admin-title{flex:1;margin-left:1rem;text-align:right;font-weight:400;font-size:.75rem;margin-top:-.1rem;color:rgba(var(--color-text-meta-rgb),.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)}.is-album .message-content,.message-content.has-solid-background{background:var(--background-color)}.message-content.has-solid-background{padding:.3125rem .5rem .375rem}.message-content.has-solid-background .forwarded-message>.text-content:not(.with-meta):last-child:after{content:"";display:inline-block;width:var(--meta-safe-area-size);height:1rem}.message-content:not(.has-appendix) .svg-appendix{display:none}.message-content .svg-appendix{position:absolute;bottom:-.1875rem;width:.5625rem;height:1.25rem}.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 .5s 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:.313rem}.message-content.audio .Embedded,.message-content.audio .message-title,.message-content.voice .Embedded,.message-content.voice .message-title{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;margin-bottom:-.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));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.media .media-inner{display:flex;justify-content:center;align-items:center}.message-content.media .media-inner.interactive{cursor:pointer}.message-content.media .media-inner.interactive.dark video{background-color:#232323}.message-content.media.round.is-reply{width:auto!important}.message-content.media.force-sender-name .Album,.message-content.media.force-sender-name .media-inner,.message-content.media.is-reply .Album,.message-content.media.is-reply .media-inner,.message-content.media.is-via-bot .media-inner,.message-content.media.text .media-inner{margin-left:-.5rem;margin-right:-.5rem}.message-content.media.text .media-inner{margin-top:-.3125rem}.message-content.media.force-sender-name .Album,.message-content.media.is-reply .Album,.message-content.media.is-reply .media-inner,.message-content.media .message-title~.media-inner{margin-top:.375rem;margin-bottom:-.375rem}.message-content.media.text .Album,.message-content.media.text .media-inner{margin-bottom:.375rem}.message-content.media .media-loading{display:flex;align-items:center;justify-content:center}.message-content.media .media-loading:not(.open){opacity:.5;transform:scale(0);transition:opacity .3s ease,transform .3s ease}.message-content.media .icon-download,.message-content.media .icon-large-play{position:absolute;display:flex;align-items:center;justify-content:center;color:#fff;opacity:.7;transition:opacity .15s}.message-content.media .icon-download:hover,.message-content.media .icon-large-play:hover{opacity:1}.message-content.media .icon-download:before,.message-content.media .icon-large-play:before{display:flex;align-items:center;justify-content:center;width:3.375rem;height:3.375rem;border-radius:50%;background:rgba(0,0,0,.25)}.message-content.media .icon-download{font-size:1.5rem}.message-content.media .icon-large-play{font-size:2.5rem}.message-content.media .message-media-duration,.message-content.media .message-upload-progress{background:rgba(0,0,0,.25);color:#fff;font-size:.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{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:.5rem;border-radius:var(--border-radius-messages)}@media (max-width:600px){.message-content.custom-shape .reply-message .EmbeddedMessage{max-width:calc(90vw - 13rem)}}.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:.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:not(.custom-shape) .forwarded-message{position:relative;margin-top:.25rem;padding-left:.625rem}.message-content:not(.custom-shape) .forwarded-message:before{content:"";display:block;position:absolute;top:0;bottom:0;left:.05rem;width:2px;background:var(--accent-color);border-radius:2px}.message-content:not(.custom-shape) .forwarded-message:dir(rtl){padding-inline-start:.625rem}.message-content:not(.custom-shape) .forwarded-message:dir(rtl):before{left:auto;right:.05rem}.forwarded-message>.media-inner{margin:0 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:normal}.text-entity-link:active,.text-entity-link:hover,.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}.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(0deg,transparent 0,#000 .5rem);mask-image:linear-gradient(0deg,transparent 0,#000 .5rem)}@media (pointer:coarse){.MessageList{-webkit-user-select:none;-webkit-touch-callout:none;user-select:none;touch-callout:none}}.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 .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.6875rem}.MessageList.select-mode-active .last-in-list.ActionMessage,.MessageList.type-pinned .last-in-list.ActionMessage{padding-bottom:.0625rem}@media (max-width:600px){.MessageList.select-mode-active .last-in-list,.MessageList.type-pinned .last-in-list{margin-bottom:4.3125rem}}.MessageList .ActionMessage,.MessageList .Message{position:relative;opacity:1;transform:scale(1);transition:opacity .2s ease,transform .2s ease}.MessageList .ActionMessage:not(.open),.MessageList .Message:not(.open){transform:scale(.8);opacity:0}.MessageList .ActionMessage.open.shown,.MessageList .Message.open.shown{transform:none}.MessageList .ActionMessage:before,.MessageList .Message:before{content:"";position:absolute;top:-.3125rem;bottom:-.3125rem;left:-50vw;right:-50vw;background:#000;z-index:-1;opacity:0;transition:opacity var(--select-transition)}body.animation-level-0 .MessageList .ActionMessage:before,body.animation-level-0 .MessageList .Message:before{transition:none!important}.MessageList .ActionMessage:not(.last-in-group):before,.MessageList .Message:not(.last-in-group):before{bottom:-.1875rem}.MessageList .ActionMessage:not(.first-in-group):before,.MessageList .Message:not(.first-in-group):before{top:-.1875rem}.MessageList .ActionMessage.focused:before,.MessageList .Message.focused:before{transition:none!important}.MessageList .ActionMessage.focused:before,.MessageList .ActionMessage.has-menu-open:before,.MessageList .ActionMessage.is-forwarding:before,.MessageList .ActionMessage.is-selected:before,.MessageList .Message.focused:before,.MessageList .Message.has-menu-open:before,.MessageList .Message.is-forwarding:before,.MessageList .Message.is-selected:before{opacity:.1}.MessageList>.empty{width:100%;height:100%;display:flex;align-items:center;justify-content:center}.MessageList .ActionMessage,.MessageList .empty,.MessageList .local-action-message,.MessageList .sticky-date{text-align:center}.MessageList .ActionMessage>span,.MessageList .empty>span,.MessageList .local-action-message>span,.MessageList .sticky-date>span{display:inline-block;background:var(--pattern-color);color:#fff;font-size:.9375rem;font-weight:500;line-height:1.5rem;padding:0 .5rem;border-radius:.75rem;word-break:break-word}.MessageList .ActionMessage.rich>span,.MessageList .empty.rich>span,.MessageList .local-action-message.rich>span,.MessageList .sticky-date.rich>span{max-width:80%;text-align:left}.MessageList .ActionMessage.rich a,.MessageList .ActionMessage.rich a:visited,.MessageList .empty.rich a,.MessageList .empty.rich a:visited,.MessageList .local-action-message.rich a,.MessageList .local-action-message.rich a:visited,.MessageList .sticky-date.rich a,.MessageList .sticky-date.rich a:visited{color:var(--color-links-darker)!important}.MessageList .ActionMessage.rich a:active,.MessageList .ActionMessage.rich a:hover,.MessageList .empty.rich a:active,.MessageList .empty.rich a:hover,.MessageList .local-action-message.rich a:active,.MessageList .local-action-message.rich a:hover,.MessageList .sticky-date.rich a:active,.MessageList .sticky-date.rich a:hover{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.animation-level-0 .MessageList .sticky-date{transition:none}.MessageList.scrolled .sticky-date{position:sticky;top:.625rem}.has-header-tools .MessageList .sticky-date{top:3.75rem}.MessageList .ActionMessage,.MessageList .local-action-message{margin-top:.5rem;margin-bottom:.5rem}.MessageList .ActionMessage .action-link{cursor:pointer}.MessageList .ActionMessage .action-link:hover{text-decoration:underline}.MessageList .sticky-date+.ActionMessage{margin-top:-.5rem}@media (min-width:1276px){.MessageList{width:100%;transform:translateZ(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)}#Main.right-column-open .MessageList:not(.select-mode-active),body.animating-right-column .MessageList:not(.select-mode-active),body:not(.animating-right-column) #Main.right-column-open .MessageList.select-mode-active{width:calc(100% - var(--right-column-width))}#Main.right-column-open .MessageList:not(.select-mode-active) .messages-container,body.animating-right-column .MessageList:not(.select-mode-active) .messages-container,body:not(.animating-right-column) #Main.right-column-open .MessageList.select-mode-active .messages-container{width:100%}}@media (max-width:600px){.MessageList{transition:transform var(--layer-transition)}body.enable-symbol-menu-transforms .MessageList{transform:translateZ(0)}body.is-symbol-menu-open .MessageList{transform:translate3d(0,calc(-1*(var(--symbol-menu-height) + var(--symbol-menu-footer-height))),0)}}.animating>div>.MessageList,.MessageList.has-focusing,.MessageList.select-mode-active,body.has-context-menu .MessageList{padding-right:0}.animating>div>.MessageList::-webkit-scrollbar,.MessageList.has-focusing::-webkit-scrollbar,.MessageList.select-mode-active::-webkit-scrollbar,body.has-context-menu .MessageList::-webkit-scrollbar{width:0}@supports (scrollbar-width:none){.animating>div>.MessageList,.MessageList.has-focusing,.MessageList.select-mode-active,body.has-context-menu .MessageList{padding-right:.6875rem;scrollbar-width:none}}.is-safari.has-context-menu .messages-layout .MessageList,.is-safari .MessageList.has-focusing,.is-safari .MessageList.select-mode-active{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 .25s cubic-bezier(.34,1.56,.64,1),opacity .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:.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(2.5rem)}.ScrollDownButton .unread-count{min-width:1.5rem;height:1.5rem;padding:0 .45rem;border-radius:.75rem;font-size:.875rem;line-height:1.5rem;font-weight:500;text-align:center;position:absolute;top:-.3rem;right:-.3rem;background:var(--color-green);color:#fff;pointer-events:none}@media (max-width:600px){.ScrollDownButton .unread-count{top:-.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))}}.ComposerEmbeddedMessage{height:2.625rem;transition:height .15s ease-out,opacity .15s ease-out}.ComposerEmbeddedMessage:not(.open){height:0!important}.ComposerEmbeddedMessage body.animation-level-0{transition:none!important}.ComposerEmbeddedMessage>div{display:flex;align-items:center;padding-right:.625rem;padding-top:.45rem}.ComposerEmbeddedMessage>div>.Button{flex-shrink:0;background:none!important;width:2.125rem;height:2.125rem;margin:0 .625rem;padding:0;align-self:center}.WebPagePreview{height:2.625rem;transition:height .15s ease-out,opacity .15s ease-out;--accent-color:var(--color-primary)}.WebPagePreview:not(.open){height:0!important}.WebPagePreview>div{display:flex;align-items:center;padding-right:.625rem;padding-top:.45rem}.ComposerEmbeddedMessage+.WebPagePreview{margin-top:.75rem}.WebPagePreview>div>.Button{flex-shrink:0;background:none!important;width:2.125rem;height:2.125rem;margin:0 .625rem;padding:0;align-self:center}.WebPagePreview .WebPage{flex-grow:1;margin:.1875rem 0 .1875rem .125rem;max-width:calc(100% - 3.375rem)}.WebPagePreview .WebPage:before{top:.1rem;bottom:.05rem}.WebPagePreview .WebPage .site-description,.WebPagePreview .WebPage .site-title{flex:1;max-width:100%;max-height:1rem}.WebPagePreview .WebPage .site-title{margin-top:.125rem;margin-bottom:.1875rem}.WebPagePreview .WebPage .site-description{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.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>.Button{flex-shrink:0;margin-left:.5rem}@media (max-width:600px){.Composer>.Button{width:2.875rem;height:2.875rem}}.Composer>.Button .icon-check,.Composer>.Button .icon-microphone-alt,.Composer>.Button .icon-send{position:absolute}.Composer>.Button:not(:active):not(:focus):not(:hover) .icon-check,.Composer>.Button:not(:active):not(:focus):not(:hover) .icon-send{color:var(--color-primary)}.Composer>.Button.cancel{position:relative;z-index:1}.Composer>.Button.cancel.active,.Composer>.Button.cancel:hover{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-check,.Composer>.Button.send .icon-microphone-alt{animation:hide-icon .4s ease-out forwards}.Composer>.Button.record .icon-microphone-alt{animation:grow-icon .4s ease-out}.Composer>.Button.edit .icon-microphone-alt,.Composer>.Button.edit .icon-send,.Composer>.Button.record .icon-check,.Composer>.Button.record .icon-send{animation:hide-icon .4s ease-out forwards}.Composer>.Button.edit .icon-check{animation:grow-icon .4s ease-out}body.animation-level-0 .Composer>.Button .icon-check,body.animation-level-0 .Composer>.Button .icon-microphone-alt,body.animation-level-0 .Composer>.Button .icon-send,body.animation-level-1 .Composer>.Button .icon-check,body.animation-level-1 .Composer>.Button .icon-microphone-alt,body.animation-level-1 .Composer>.Button .icon-send{animation-duration:0ms!important}.Composer .mobile-symbol-menu-button{width:2.875rem;height:2.875rem;position:relative}.Composer .mobile-symbol-menu-button .icon-keyboard,.Composer .mobile-symbol-menu-button .icon-smile,.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 ease-out forwards}.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 ease-out forwards}.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 ease-out forwards}#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 .2s}#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>.Button{flex-shrink:0;background:none!important;width:3.375rem;height:3.375rem;margin:0;padding:.625rem;align-self:flex-end}@media (max-width:600px){.message-input-wrapper>.Button{width:2.875rem;height:2.875rem;margin: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:.1875rem solid var(--color-background);box-sizing:initial;width:.5rem;height:.5rem;border-radius:50%;background:var(--color-green-darker);box-shadow:-.375rem -.25rem 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}}#caption-input-text,#message-input-text{position:relative}#caption-input-text .form-control,#message-input-text .form-control{padding-top:calc(1rem - var(--border-width));padding-bottom:calc(1rem - var(--border-width));overflow:hidden;line-height:1.375rem;font-family:Roboto,-apple-system,Apple Color Emoji,Helvetica Neue,sans-serif;unicode-bidi:plaintext;text-align:initial}#caption-input-text .form-control.overflown,#message-input-text .form-control.overflown{overflow-y:auto;overflow-x:hidden}#caption-input-text .form-control.touched+.placeholder-text,#caption-input-text .form-control:focus+.placeholder-text,#message-input-text .form-control.touched+.placeholder-text,#message-input-text .form-control:focus+.placeholder-text{display:none}#caption-input-text .form-control.focus-disabled,#message-input-text .form-control.focus-disabled{pointer-events:none}#caption-input-text .placeholder-text,#message-input-text .placeholder-text{position:absolute;bottom:.9375rem;color:var(--color-placeholders);pointer-events:none;unicode-bidi:plaintext;text-align:initial}@media (max-width:600px){#caption-input-text .placeholder-text,#message-input-text .placeholder-text{bottom:.6875rem}}#caption-input-text[dir=rtl] .placeholder-text,#message-input-text[dir=rtl] .placeholder-text{right:0}#caption-input-text .text-entity-link,#message-input-text .text-entity-link{color:var(--color-links)!important;cursor:default;text-decoration:none}#caption-input-text .text-entity-link:active,#caption-input-text .text-entity-link:hover,#caption-input-text .text-entity-link:visited,#message-input-text .text-entity-link:active,#message-input-text .text-entity-link:hover,#message-input-text .text-entity-link:visited{color:var(--color-links-hover)!important}#caption-input-text .clone,#message-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-top:calc(1.15625rem - var(--border-width));padding-bottom:calc(1.15625rem - var(--border-width));transition:height .1s ease}@media (max-width:600px){#message-input-text .form-control{height:2.875rem;min-height:2.875rem;max-height:16rem;padding-top:calc(.84375rem - var(--border-width));padding-bottom:calc(.84375rem - var(--border-width))}}body.animation-level-0 #message-input-text .form-control{transition:none!important}#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:.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:.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}#middle-column-bg{position:absolute;top:0;left:0;bottom:0;right:0;overflow:hidden;z-index:-1}#middle-column-bg:after,#middle-column-bg:before{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:50%;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 .2s!important}body.animation-level-0 #middle-column-bg:after{transition:none}.custom-bg-color>#middle-column-bg:before{filter:blur(0);transform:scale(1.1)}.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:blur(0);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,body.animation-level-2 #middle-column-bg:before{margin:-16rem -5rem -20rem 0;overflow:hidden;transform:scale(1);transform-origin:left center;transition:transform var(--layer-transition)}body.animation-level-2 .custom-bg-image>#middle-column-bg:after{margin:-16rem -5rem -20rem -1rem;transition:transform var(--layer-transition)}body.animation-level-2 #Main.right-column-open :not(.custom-bg-image)>#middle-column-bg:after{transform:scale(.67)}}#MiddleColumn{display:flex;justify-content:center;height:100%;position:relative;z-index:1}@media (max-width:600px){#MiddleColumn{overflow:hidden}}#MiddleColumn .messages-layout{display:flex;flex-direction:column;align-items:center;position:relative}#MiddleColumn .messages-layout,#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(.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,body.animation-level-0 #MiddleColumn .messaging-disabled .messaging-disabled-inner span{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:translateZ(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 .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:-.5rem;left:0;right:0;height:1px;background:linear-gradient(90deg,hsla(0,0%,100%,0),hsla(0,0%,100%,.4) 2%,hsla(0,0%,100%,.4) 98%,hsla(0,0%,100%,0));opacity:0;transition:opacity .35s 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,hsla(0,0%,49.8%,0),hsla(0,0%,49.8%,.4) 2%,hsla(0,0%,49.8%,.4) 98%,hsla(0,0%,49.8%,0))}.Composer,.MessageSelectToolbar,.messaging-disabled{margin-bottom:1.25rem}@media (max-width:600px){.Composer,.MessageSelectToolbar,.messaging-disabled{margin-bottom:.5rem}}.Composer,.MessageSelectToolbar,.messaging-disabled,.unpin-all-button{width:100%;display:flex;justify-content:center;position:relative}.mask-image-disabled .MessageSelectToolbar-inner,.mask-image-disabled .messaging-disabled,.mask-image-disabled .unpin-all-button{box-shadow:0 .25rem .5rem .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 .15s,color .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:-.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:.75rem}}.mask-image-disabled .unpin-button-container:before{background:unset}.RightHeader{display:flex;align-items:center;height:var(--header-height);padding:.5rem .8125rem;pointer-events:auto}@media (max-width:600px){.RightHeader{padding:.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}.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.deleted-account,.ProfilePhoto.no-photo,.ProfilePhoto.saved-messages,.ProfilePhoto .spinner-wrapper{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}.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}.is-touch-env .ProfileInfo .navigation,.ProfileInfo .navigation:hover{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,.5),transparent);color:var(--color-white);display:flex;flex-direction:column;justify-content:flex-end}.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:.25rem;margin-top:-.125rem}.ProfileInfo .title .emoji{width:1.5rem;height:1.5rem;background-size:1.5rem}.ProfileInfo .status{font-size:.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)}.Profile{height:100%;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 -.0625rem 0 0 var(--color-background-secondary-accent);border-bottom:.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}.shared-media{display:flex;flex-direction:column-reverse}.shared-media .TabList{background:var(--color-background);top:-1px}.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 .message-upload-progress,.shared-media .content.links-list .ProgressSpinner{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:.5rem 1rem}@media (max-width:600px){.shared-media .content.members-list{padding:.5rem 0}}#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:nth-child(n+18){display:none!important}@media (max-width:1275px){#RightColumn{box-shadow:0 .25rem .5rem .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:.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:.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:#000;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:translateZ(0)}#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:#000;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:translateZ(0)}#Main:not(.middle-column-open) #LeftColumn:after{opacity:0;pointer-events:none}#Main.middle-column-open #LeftColumn .custom-scroll{overflow:hidden}#Main.history-animation-disabled #LeftColumn,#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,#Main.history-animation-disabled #RightColumn .overlay-backdrop,#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:translateZ(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,#Main.history-animation-disabled #MiddleColumn:after{transition:none}@media (max-width:600px){.SymbolMenu{transition:transform var(--layer-transition)}body.animation-level-0 .SymbolMenu{transition:none}body:not(.is-middle-column-open) .SymbolMenu{transform:translate3d(100vw,0,0)!important}} \ No newline at end of file diff --git a/dist/4.292f70afdd30b166608d.js b/dist/4.292f70afdd30b166608d.js new file mode 100644 index 000000000..806527927 --- /dev/null +++ b/dist/4.292f70afdd30b166608d.js @@ -0,0 +1,2 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[4],{101:function(e,t,a){"use strict";a.r(t),a.d(t,"Main",(function(){return An}));var s=a(2),n=a(1),c=a(0),r=(a(82),a(36)),o=a(6),i=a(38);Object(s.b)("openChat",(e,t,a)=>{const{id:n,threadId:c=-1,type:l="thread",noPushState:d}=a,b=Object(o.y)(e);return b&&b.chatId===n&&b.threadId===c&&b.type===l||(e=Object(r.n)(e),e={...e,messages:{...e.messages,contentToBeScheduled:void 0},...n!==e.forwardMessages.toChatId&&{forwardMessages:{}}},Object(s.g)(e),d||(void 0!==n?i.a.pushState({type:"chat",chatId:n,threadId:c,messageListType:l}):i.a.back())),Object(r.N)(e,n,c,l)}),Object(s.b)("openChatWithInfo",(e,t,a)=>{Object(s.g)({...e,isChatInfoShown:!0}),i.a.pushState({type:"right",contentKey:Object(o.mb)(e)}),t.openChat(a)}),Object(s.b)("resetChatCreation",e=>({...e,chatCreation:void 0}));var l=a(5),d=a(19),b=a(3);let u;Object(s.b)("setScrollOffset",(e,t,a)=>{const{chatId:s,threadId:n,scrollOffset:c}=a;return Object(r.x)(e,s,n,"scrollOffset",c)}),Object(s.b)("setReplyingToId",(e,t,a)=>{const{messageId:s}=a,n=Object(o.y)(e);if(!n)return;const{chatId:c,threadId:i}=n;return Object(r.x)(e,c,i,"replyingToId",s)}),Object(s.b)("setEditingId",(e,t,a)=>{const{messageId:s}=a,n=Object(o.y)(e);if(!n)return;const{chatId:c,threadId:i,type:l}=n,d="scheduled"===l?"editingScheduledId":"editingId";return Object(r.x)(e,c,i,d,s)}),Object(s.b)("editLastMessage",e=>{const{chatId:t,threadId:a}=Object(o.y)(e)||{};if(!t||!a)return;const s=Object(o.m)(e,t),n=Object(o.Gb)(e,t,a);if(!s||!n)return;const c=Object(b.g)(n,t=>Boolean(s[t]&&Object(o.b)(e,s[t],a).canEdit));return c?Object(r.x)(e,t,a,"editingId",c):void 0}),Object(s.b)("replyToNextMessage",(e,t,a)=>{const{targetIndexDelta:s}=a,{chatId:n,threadId:c}=Object(o.y)(e)||{};if(!n||!c)return;const r=Object(o.m)(e,n),i=Object(o.Gb)(e,n,c);if(!r||!i)return;const d=Object(o.lb)(e,n,c);let b;if(Object(o.W)(e,n,c)&&d){const e=Object.keys(r),t=e.indexOf(d.toString())+s;b=t<=e.length+1&&t>=0?Number(e[t]):void 0}else if(c===l.MAIN_THREAD_ID){const t=Object(o.f)(e,n);b=t&&t.lastMessage?t.lastMessage.id:void 0}else{const t=Object(o.Bb)(e,n,c);b=t?t.lastMessageId:void 0}t.setReplyingToId({messageId:b}),t.focusMessage({chatId:n,threadId:c,messageId:b})}),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,noPushState:r}=a,l=Object(o.V)(e);r||i.a.pushState({type:"right",contentKey:d.l.PollResults}),l?window.setTimeout(()=>{const e=Object(s.e)();Object(s.g)({...e,pollResults:{chatId:n,messageId:c,voters:{}}})},450):n===e.pollResults.chatId&&c===e.pollResults.messageId||Object(s.g)({...e,pollResults:{chatId:n,messageId:c,voters:{}}})}),Object(s.b)("closePollResults",(e,t,a)=>{const{noPushState:n}=a;n||i.a.back(),Object(s.g)({...e,pollResults:{}})}),Object(s.b)("focusLastMessage",(e,t)=>{const a=Object(o.y)(e);if(!a)return;const{chatId:s,threadId:n}=a;let c;if(n===l.MAIN_THREAD_ID){const t=Object(o.f)(e,s);c=t&&t.lastMessage?t.lastMessage.id:void 0}else{const t=Object(o.Bb)(e,s,n);c=t?t.lastMessageId:void 0}c&&t.focusMessage({chatId:s,threadId:n,messageId:c,noHighlight:!0})}),Object(s.b)("focusMessage",(e,t,a)=>{const{chatId:n,threadId:c=l.MAIN_THREAD_ID,messageListType:i="thread",noHighlight:b,groupedId:m,groupedChatId:h}=a;let{messageId:O}=a;if(void 0!==m){const t=Object(o.I)(e,h,m);t&&t.length&&([O]=t)}const j=Object(o.y)(e),g=!j||n!==j.chatId||c!==j.threadId||i!==j.type;u&&(clearTimeout(u),u=void 0),u=window.setTimeout(()=>{let e=Object(s.e)();e=Object(r.P)(e),e=Object(r.O)(e),Object(s.g)(e)},2e3),e=Object(r.P)(e,n,O,b),e=Object(r.O)(e,void 0),g&&(e=Object(r.O)(e,d.b.Static));const f=Object(o.Gb)(e,n,c);if(f&&f.includes(O))return Object(s.g)(e),void t.openChat({id:n,threadId:c});if(g&&(e=Object(r.x)(e,n,c,"viewportIds",void 0)),e=Object(r.x)(e,n,c,"outlyingIds",void 0),f&&!g){const t=O>f[0]?d.b.Down:d.b.Up;e=Object(r.O)(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.Z)(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.r)(e);return n?Object(r.m)(e,n.id,s):e}),Object(s.b)("toggleMessageSelection",(e,t,a)=>{const{messageId:s,groupedId:n,childMessageIds:c,withShift:i}=a,l=Object(o.y)(e);if(!l)return;const{chatId:d,threadId:b,type:u}=l;return Object(r.G)(e,d,b,u,s,n,c,i)}),Object(s.b)("exitMessageSelectMode",r.n),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.R)(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.R)(e,{recentlyFoundChatIds:[s]});const c=n.filter(e=>e!==s);return c.unshift(s),c.length>10&&c.pop(),Object(r.R)(e,{recentlyFoundChatIds:c})}),Object(s.b)("clearRecentlyFoundChats",e=>Object(r.R)(e,{recentlyFoundChatIds:void 0})),Object(s.b)("setGlobalSearchContent",(e,t,a)=>{const{content:s}=a;return Object(r.S)(e,s)}),Object(s.b)("setGlobalSearchChatId",(e,t,a)=>{const{id:s}=a;return Object(r.R)(e,{chatId:s,query:void 0,resultsByType:void 0})});var m=a(50),h=a(4);Object(s.b)("openLocalTextSearch",e=>{const{chatId:t,threadId:a}=Object(o.y)(e)||{};if(t&&a)return i.a.pushState({type:"right",contentKey:d.l.Search}),Object(r.Y)(e,t,a,!0)}),Object(s.b)("closeLocalTextSearch",(e,t,a)=>{const{noPushState:s}=a,{chatId:n,threadId:c}=Object(o.y)(e)||{};if(n&&c)return s||i.a.back(),e=Object(r.Y)(e,n,c,!1),e=Object(r.t)(e,n,c,void 0)}),Object(s.b)("setLocalTextSearchQuery",(e,t,a)=>{const{chatId:s,threadId:n}=Object(o.y)(e)||{};if(!s||!n)return;const{query:c}=a,i=Object(h.a)(s,n),{query:l}=e.localTextSearch.byChatThreadKey[i]||{};return c!==l&&(e=Object(r.t)(e,s,n,m.a)),e=Object(r.Y)(e,s,n,!0,c)}),Object(s.b)("setLocalMediaSearchType",(e,t,a)=>{const{chatId:s}=Object(o.y)(e)||{};if(!s)return;const{mediaType:n}=a;return Object(r.X)(e,s,n)}),Object(s.b)("setStickerSearchQuery",(e,t,a)=>{const{query:s,noPushState:n}=a,c=e.stickers.search.query;return n||c===s||(void 0!==s&&void 0===c?i.a.pushState({type:"right",contentKey:d.l.StickerSearch}):i.a.back()),{...e,stickers:{...e.stickers,search:{query:s,resultIds:void 0}}}}),Object(s.b)("setGifSearchQuery",(e,t,a)=>{const{query:s,noPushState:n}=a,c=e.gifs.search.query;return n||c===s||(void 0!==s?i.a.pushState({type:"right",contentKey:d.l.GifSearch}):i.a.back()),{...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.fb)(e,void 0)),Object(s.b)("setSettingOption",(e,t,a)=>Object(r.v)(e,a)),Object(s.b)("setThemeSettings",(e,t,a)=>{const{theme:s,...n}=a;return Object(r.w)(e,s,n)});var O=a(7),j=a(167);Object(s.b)("toggleChatInfo",(e,t,a)=>{const{noPushState:s}=a;return s||(e.isChatInfoShown?i.a.back():i.a.pushState({type:"right",contentKey:Object(o.mb)(e)})),{...e,isChatInfoShown:!e.isChatInfoShown}}),Object(s.b)("toggleManagement",(e,t,a)=>{const{chatId:s}=Object(o.y)(e)||{},{noPushState:n}=a;if(!s)return;const{isActive:c}=e.management.byChatId[s]||{};return n||(c?i.a.back():i.a.pushState({type:"right",contentKey:Object(o.mb)(e)})),{...e,management:{byChatId:{...e.management.byChatId,[s]:{...e.management.byChatId[s],isActive:!c}}}}}),Object(s.b)("closeManagement",e=>{const{chatId:t}=Object(o.y)(e)||{};if(t)return{...e,management:{byChatId:{...e.management.byChatId,[t]:{...e.management.byChatId[t],isActive:!1}}}}}),Object(s.b)("openChat",(e,t,a)=>{if(!O.g)return;const{id:s}=a;return{...e,isLeftColumnShown:void 0===s}}),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)("showError",(e,t,a)=>{const{error:s}=a;if(!Object(j.a)(s))return e;const n=[...e.errors],c=n.findIndex(e=>e.message===s.message);return-1!==c&&n.splice(c,1),n.push(s),{...e,errors:n}}),Object(s.b)("dismissError",e=>{const t=[...e.errors];return t.pop(),{...e,errors:t}}),Object(s.b)("toggleSafeLinkModal",(e,t,a)=>{const{url:s}=a;return{...e,safeLinkModalUrl:s}}),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.h)(e);return Object(r.i)(t)});a(83);var g=a(10),f=a(9);const p=Object(f.g)(e=>e(),1e3,!0),I=Object(f.g)(e=>e(),3e3,!0),v=Object(f.a)(e=>e(),500,!1,!0);async function y(e,t,a){const c=await Object(g.a)("fetchChats",{limit:n.j,offsetDate:a,archived:"archived"===e,withPinned:void 0===Object(s.e)().chats.orderedPinnedIds[e]});if(!c)return;const{chatIds:o}=c;o.length>0&&o[0]===t&&o.shift();let i=Object(s.e)();i=Object(r.f)(i,Object(b.c)(c.users,"id")),i=Object(r.M)(i,Object(b.c)(c.chats,"id")),i=Object(r.I)(i,e,o),i=Object(r.J)(i,e,c),Object.keys(c.draftsById).map(Number).forEach(e=>{i=Object(r.x)(i,e,l.MAIN_THREAD_ID,"draft",c.draftsById[e])}),Object.keys(c.replyingToById).map(Number).forEach(e=>{i=Object(r.x)(i,e,l.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 C(e){const t=await Object(g.a)("fetchFullChat",e);if(!t)return;const{users:a,fullInfo:n}=t;let c=Object(s.e)();a&&(c=Object(r.f)(c,Object(b.c)(a,"id"))),c=Object(r.H)(c,e.id,{fullInfo:n}),Object(s.g)(c)}async function E(e,t,a){const n=Object(s.e)(),c=Object(o.h)(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.r)(n);e.openChat({id:-1});const l=await Object(g.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.H)(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(!u)return;a.push(u.id),t.loadViewportMessages({chatId:u.id,threadId:l.MAIN_THREAD_ID})}})()}),Object(s.b)("openChat",(e,t,a)=>{const{id:s,threadId:n}=a,{currentUserId:c}=e,r=Object(o.f)(e,s);if(r&&r.hasUnreadMark&&t.toggleChatUnread({id:s}),r)Object(h.mb)(r)&&!r.isMin&&t.requestChatUpdate({chatId:s});else if(s===c)Object(g.a)("fetchChat",{type:"self"});else{const t=Object(o.Fb)(e,s);t&&Object(g.a)("fetchChat",{type:"user",user:t})}if(n!==l.MAIN_THREAD_ID){Object(o.Db)(e,s,n)||t.requestThreadInfoUpdate({chatId:s,threadId:n})}}),Object(s.b)("openSupportChat",(e,t)=>{const a=Object(o.zb)(e);t.openChat({id:a?a.id:-1}),a||(async()=>{const e=await Object(g.a)("fetchChat",{type:"support"});e&&t.openChat({id:e.chatId})})()}),Object(s.b)("openTipsChat",(e,t)=>{t.openChatByUsername({username:n.Cb})}),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.M)(e,t.id)).sort((e,t)=>e.lastMessage.date-t.lastMessage.date)[0]:void 0;p(c?()=>y(s,c.id,c.lastMessage.date):()=>y(s))}),Object(s.b)("loadFullChat",(e,t,a)=>{const{chatId:s,force:n}=a,c=Object(o.f)(e,s);c&&(n?C(c):v(()=>C(c)))}),Object(s.b)("loadTopChats",()=>{I(()=>y("active"))}),Object(s.b)("requestChatUpdate",(e,t,a)=>{const{chatId:s}=a,n=Object(o.f)(e,s);n&&Object(g.a)("requestChatUpdate",n)}),Object(s.b)("updateChatMutedState",(e,t,a)=>{const{chatId:s,isMuted:n}=a,c=Object(o.f)(e,s);c&&Object(g.a)("updateChatMutedState",{chat:c,isMuted: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:d.a.InProgress}});const c=await Object(g.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.H)(l,o,c),l={...l,chatCreation:{...l.chatCreation,progress:c?d.a.Complete:d.a.Error}},Object(s.g)(l),Object(s.d)().openChat({id:o}),o&&i&&n&&await Object(g.a)("editChatPhoto",{chatId:o,accessHash:i,photo:n})}(n,l.map(t=>Object(o.Fb)(e,t)).filter(Boolean),c,i)}),Object(s.b)("joinChannel",(e,t,a)=>{const{chatId:s}=a,n=Object(o.f)(e,s);if(!n)return;const{id:c,accessHash:r}=n;c&&r&&Object(g.a)("joinChannel",{channelId:c,accessHash:r})}),Object(s.b)("leaveChannel",(e,t,a)=>{const{chatId:s}=a,n=Object(o.f)(e,s);if(!n)return;const{id:c,accessHash:r}=n;c&&r&&Object(g.a)("leaveChannel",{channelId:c,accessHash:r})}),Object(s.b)("deleteChannel",(e,t,a)=>{const{chatId:s}=a,n=Object(o.f)(e,s);if(!n)return;const{id:c,accessHash:r}=n;c&&r&&Object(g.a)("deleteChannel",{channelId:c,accessHash:r})}),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:d.a.InProgress}});const n=await Object(g.a)("createGroupChat",{title:e,users:t});if(!n)return;const{id:c}=n;let o=Object(s.e)();o=Object(r.H)(o,c,n),o={...o,chatCreation:{...o.chatCreation,progress:n?d.a.Complete:d.a.Error}},Object(s.g)(o),Object(s.d)().openChat({id:c}),c&&a&&await Object(g.a)("editChatPhoto",{chatId:c,photo:a})}(n,c.map(t=>Object(o.Fb)(e,t)).filter(Boolean),i)}),Object(s.b)("toggleChatPinned",(e,t,a)=>{const{id:s,folderId:c}=a,r=Object(o.f)(e,s);if(r)if(c){const t=Object(o.i)(e,c);if(t){const a=!Object(o.M)(e,s,c),{pinnedChatIds:n,includedChatIds:r}=t,i=a?[s,...n||[]]:(n||[]).filter(e=>e!==s),l=[s,...r];Object(g.a)("editChatFolder",{id:c,folderUpdate:{...t,pinnedChatIds:i,includedChatIds:l}})}}else{const t=Object(o.j)(e,s),a=Object(o.M)(e,s,"archived"===t?n.h:void 0);Object(g.a)("toggleChatPinned",{chat:r,shouldBePinned:!a})}}),Object(s.b)("toggleChatArchived",(e,t,a)=>{const{id:s}=a,c=Object(o.f)(e,s);c&&Object(g.a)("toggleChatArchived",{chat:c,folderId:Object(h.hb)(c)?0:n.h})}),Object(s.b)("loadChatFolders",()=>{!async function(){const e=await Object(g.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(g.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.i)(e,s);c&&Object(g.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(g.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.h)}),Object(s.b)("deleteChatFolder",(e,t,a)=>{const{id:s}=a;Object(o.i)(e,s)&&async function(e){await Object(g.a)("deleteChatFolder",e)}(s)}),Object(s.b)("toggleChatUnread",(e,t,a)=>{const{id:s}=a,n=Object(o.f)(e,s);n&&(n.unreadCount?Object(g.a)("markMessageListRead",{chat:n,threadId:l.MAIN_THREAD_ID}):Object(g.a)("toggleDialogUnread",{chat:n,hasUnreadMark:!n.hasUnreadMark}))}),Object(s.b)("openTelegramLink",(e,t,a)=>{const{url:s}=a;let c=n.ib.exec(s);if(c){const e=c[1];(async()=>{const a=await Object(g.a)("openChatByInvite",e);a&&t.openChat({id:a.id})})()}else{c=n.jb.exec(s);const e=c[1],a=c[2]?Number(c[2]):void 0;E(t,e,a)}}),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(o.f)(e,s);c&&(async()=>{if(Object(h.ib)(c)){if(c=await Object(g.a)("migrateChat",c),!c)return;t.openChat({id:c.id})}Object(g.a)("togglePreHistoryHidden",{chat:c,isEnabled:n})})()}),Object(s.b)("updateChatDefaultBannedRights",(e,t,a)=>{const{chatId:s,bannedRights:n}=a,c=Object(o.f)(e,s);c&&Object(g.a)("updateChatDefaultBannedRights",{chat:c,bannedRights:n})}),Object(s.b)("updateChatMemberBannedRights",(e,t,a)=>{const{chatId:n,userId:c,bannedRights:i}=a;let l=Object(o.f)(e,n);const d=Object(o.Fb)(e,c);l&&d&&(async()=>{if(Object(h.ib)(l)){if(l=await Object(g.a)("migrateChat",l),!l)return;t.openChat({id:l.id})}await Object(g.a)("updateChatMemberBannedRights",{chat:l,user:d,bannedRights:i});const e=Object(s.e)(),a=Object(o.f)(e,n);if(!a||!a.fullInfo)return;const{members:b,kickedMembers:u}=a.fullInfo,m=!!i.viewMessages,O=!Object.keys(i).length;Object(s.g)(Object(r.H)(e,n,{fullInfo:{...a.fullInfo,...b&&m&&{members:b.filter(e=>e.userId!==c)},...b&&!m&&{members:b.map(e=>e.userId===c?{...e,bannedRights:i}:e)},...O&&u&&{kickedMembers:u.filter(e=>e.userId!==c)}}}))})()}),Object(s.b)("updateChatAdmin",(e,t,a)=>{const{chatId:n,userId:c,adminRights:i,customTitle:l}=a;let d=Object(o.f)(e,n);const b=Object(o.Fb)(e,c);d&&b&&(async()=>{if(Object(h.ib)(d)){if(d=await Object(g.a)("migrateChat",d),!d)return;t.openChat({id:d.id})}await Object(g.a)("updateChatAdmin",{chat:d,user:b,adminRights:i,customTitle:l});const e=Object(s.e)(),a=Object(o.f)(e,n);if(!a||!a.fullInfo)return;const{adminMembers:u}=a.fullInfo,m=!Object.keys(i).length;Object(s.g)(Object(r.H)(e,n,{fullInfo:{...a.fullInfo,...u&&m&&{adminMembers:u.filter(e=>e.userId!==c)},...u&&!m&&{adminMembers:u.map(e=>e.userId===c?{...e,adminRights:i,customTitle:l}:e)}}}))})()}),Object(s.b)("updateChat",(e,t,a)=>{const{chatId:n,title:c,about:i,photo:l}=a,b=Object(o.f)(e,n);b&&(async()=>{Object(s.g)(Object(r.bb)(Object(s.e)(),d.f.InProgress)),await Promise.all([b.title!==c?Object(g.a)("updateChatTitle",b,c):void 0,b.fullInfo&&b.fullInfo.about!==i?Object(g.a)("updateChatAbout",b,i):void 0,l?Object(g.a)("editChatPhoto",{chatId:n,accessHash:b.accessHash,photo:l}):void 0]),Object(s.g)(Object(r.bb)(Object(s.e)(),d.f.Complete))})()}),Object(s.b)("toggleSignatures",(e,t,a)=>{const{chatId:s,isEnabled:n}=a,c=Object(o.f)(e,s);c&&Object(g.a)("toggleSignatures",{chat:c,isEnabled:n})}),Object(s.b)("loadGroupsForDiscussion",()=>{(async()=>{const e=await Object(g.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.f)(e,s);let r=Object(o.f)(e,n);c&&r&&(async()=>{if(Object(h.ib)(r)){if(r=await Object(g.a)("migrateChat",r),!r)return;t.openChat({id:r.id})}let{fullInfo:e}=r;if(!e){const t=await Object(g.a)("fetchFullChat",r);if(!t)return;e=t.fullInfo}e.isPreHistoryHidden&&await Object(g.a)("togglePreHistoryHidden",{chat:r,isEnabled:!1}),Object(g.a)("setDiscussionGroup",{channel:c,chat:r})})()}),Object(s.b)("unlinkDiscussionGroup",(e,t,a)=>{const{channelId:s}=a,n=Object(o.f)(e,s);if(!n)return;let c;n.fullInfo&&n.fullInfo.linkedChatId&&(c=Object(o.f)(e,n.fullInfo.linkedChatId)),(async()=>{await Object(g.a)("setDiscussionGroup",{channel:n}),c&&C(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.y)(e)||{},a=t?Object(o.f)(e,t):void 0;if(!a||Object(h.ib)(a))return;const n=a.fullInfo&&a.fullInfo.members&&a.fullInfo.members.length||void 0,c=await Object(g.a)("fetchMembers",a.id,a.accessHash,"recent",n);if(!c)return;const{members:i,users:l}=c;i&&i.length&&(e=Object(s.e)(),e=Object(r.f)(e,Object(b.c)(l,"id")),e=Object(r.H)(e,a.id,{fullInfo:{...a.fullInfo,members:[...(a.fullInfo||{}).members||[],...i||[]]}}),Object(s.g)(e))})()});var w=a(151);const M=new Map,S=Object(f.g)(e=>e(),1e3,!0);async function k(e,t,a,c,i=!1,l=!1){const u=e.id;let m;switch(c){case d.e.Backwards:m=void 0;break;case d.e.Around:m=-(Math.round(n.W/2)+1);break;case d.e.Forwards:m=-(n.W+1)}const h=await Object(g.a)("fetchMessages",{chat:Object(o.Cb)(Object(s.e)(),u,t),offsetId:a,addOffset:m,limit:n.W,threadId:t});if(!h)return;const{messages:O,users:j,chats:f,threadInfos:p}=h,I=Object(b.c)(O,"id"),v=Object.keys(I).map(Number);let y=Object(s.e)();y=Object(r.b)(y,u,I),y=i?Object(r.db)(y,u,t,v):Object(r.V)(y,u,t,v),y=Object(r.f)(y,Object(b.c)(j,"id")),y=Object(r.c)(y,Object(b.c)(f,"id")),y=Object(r.lb)(y,u,p);let C=Object(o.X)(y,u,t);const E=Object(o.fb)(y,u,t);if(i&&C&&E&&Object(b.b)(C,E)&&(y=Object(r.V)(y,u,t,E),C=Object(o.X)(y,u,t),y=Object(r.x)(y,u,t,"outlyingIds",void 0),i=!1),!l){const e=i?E:C,{newViewportIds:s}=N(e,a,c);y=Object(r.z)(y,u,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===d.e.Backwards?c:c+1||s,o=r-n.W,i=r+n.W-1,l=e.slice(Math.max(0,o),i+1);let b,u;switch(a){case d.e.Backwards:b=r>0,u=o>=0;break;case d.e.Forwards:b=r0,u=l.length===n.W}return{newViewportIds:l,areSomeLocal:b,areAllLocal:u}}async function P(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&&await Object(f.f)();const n=Object(s.e)(),c=Object(o.y)(n);if(!c)return;const{threadId:r}=c;e.replyingTo||r===l.MAIN_THREAD_ID||(e.replyingTo=Object(o.Db)(n,e.chat.id,r)),await Object(g.a)("sendMessage",e,a),a&&t&&M.delete(t)}Object(s.b)("loadViewportMessages",(e,t,a)=>{const{direction:s=d.e.Around,isBudgetPreload:c=!1}=a||{};let{chatId:i,threadId:l}=a||{};if(!i){const t=Object(o.y)(e);if(!t)return;i=t.chatId,l=t.threadId}const b=Object(o.f)(e,i);if(!b||b.isRestricted)return;const u=Object(o.Gb)(e,i,l),m=Object(o.X)(e,i,l),h=Object(o.fb)(e,i,l);if(u&&u.length&&s!==d.e.Around){const a=s===d.e.Backwards?u[0]:u[u.length-1],n=Boolean(h),o=n?h:m,{newViewportIds:O,areSomeLocal:j,areAllLocal:g}=N(o,a,s);if(j&&(e=Object(r.z)(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,b,l,s,a),c)return}else{const t=Object(o.H)(e,i)||Object(o.kb)(e,i,l),a=Boolean(t&&m&&!m.includes(t)),s=(a?h:m)||[],{newViewportIds:u,areSomeLocal:O,areAllLocal:j}=N(s,t,d.e.Around);O&&u.length>=n.W&&(e=Object(r.z)(e,i,l,u)),j||k(b,l,t,d.e.Around,a,c)}return e}),Object(s.b)("loadMessage",(e,t,a)=>{const{chatId:n,messageId:c,replyOriginForId:i}=a,d=Object(o.f)(e,n);d&&async function(e,t,a){const n=await Object(g.a)("fetchMessage",{chat:e,messageId:t});if(!n)return;if(n===l.MESSAGE_DELETED){if(a){let t=Object(s.e)();const n=Object(o.k)(t,e.id,a);t=Object(r.L)(t,e.id,a,{...n,replyToMessageId:void 0}),Object(s.g)(t)}return}let c=Object(s.e)();c=Object(r.L)(c,e.id,t,n.message),c=Object(r.f)(c,Object(b.c)(n.users,"id")),Object(s.g)(c)}(d,c,i)}),Object(s.b)("sendMessage",(e,t,a)=>{const s=Object(o.y)(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.f)(e,c);t.setReplyingToId({messageId:void 0}),t.clearWebPagePreview({chatId:c,threadId:r,value:!1});const d={...a,chat:l,replyingTo:Object(o.lb)(e,c,r),noWebPage:Object(o.bb)(e,c,r)},u=!a.attachments||a.attachments.length<=1,m=!u&&a.attachments&&a.attachments.length>1;if(u){const{attachments:e,...t}=d;P({...t,attachment:e?e[0]:void 0})}else if(m){const{text:e,entities:t,attachments:a,...s}=d,c=Object(b.n)(a,n.M);for(let a=0;a0?o:void 0}),r.forEach(e=>{P({...s,attachment:e,groupedId:o})})}}else{const{text:e,entities:t,attachments:a,replyingTo:s,...n}=d;e&&P({...n,text:e,entities:t,replyingTo:s}),a.forEach(e=>{P({...n,attachment:e})})}}),Object(s.b)("editMessage",(e,t,a)=>{const{text:s,entities:n}=a,c=Object(o.y)(e);if(!c)return;const{chatId:r,threadId:i,type:l}=c,d=Object(o.f)(e,r),b=Object(o.D)(e,r,i,l);d&&b&&(Object(g.a)("editMessage",{chat:d,message:b,text:s,entities:n,noWebPage:Object(o.bb)(e,r,i)}),t.setEditingId({messageId:void 0}))}),Object(s.b)("cancelSendingMessage",(e,t,a)=>{const{chatId:s,messageId:n}=a,c=Object(o.k)(e,s,n),r=c&&M.get(c.previousLocalId||c.id);r&&Object(g.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:d}=c,b=Object(o.f)(e,s);return n===l.MAIN_THREAD_ID&&Object(g.a)("saveDraft",{chat:b,text:i,entities:d,replyToMsgId:Object(o.lb)(e,s,n)}),Object(r.x)(e,s,n,"draft",c)}),Object(s.b)("clearDraft",(e,t,a)=>{const{chatId:s,threadId:n,localOnly:c}=a;if(!Object(o.B)(e,s,n))return;const i=Object(o.f)(e,s);return c||n!==l.MAIN_THREAD_ID||Object(g.a)("clearDraft",i),Object(r.x)(e,s,n,"draft",void 0)}),Object(s.b)("toggleMessageWebPage",(e,t,a)=>{const{chatId:s,threadId:n,noWebPage:c}=a;return Object(r.x)(e,s,n,"noWebPage",c)}),Object(s.b)("pinMessage",(e,t,a)=>{const s=Object(o.r)(e);if(!s)return;const{messageId:n,isUnpin:c,isOneSide:r,isSilent:i}=a;Object(g.a)("pinMessage",{chat:s,messageId:n,isUnpin:c,isOneSide:r,isSilent:i})}),Object(s.b)("unpinAllMessages",(e,t,a)=>{const n=Object(o.f)(e,a.chatId);n&&async function(e){await Object(g.a)("unpinAllMessages",{chat:e});let t=Object(s.e)();t=Object(r.x)(t,e.id,l.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.y)(e);if(!c)return;const{chatId:r,threadId:i}=c,l=Object(o.f)(e,r);Object(g.a)("deleteMessages",{chat:l,messageIds:s,shouldDeleteForAll:n});const d=Object(o.C)(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.y)(e);if(!n)return;const{chatId:c}=n,r=Object(o.f)(e,c);Object(g.a)("deleteScheduledMessages",{chat:r,messageIds:s});const i=Object(o.E)(e,c);s.includes(i)&&t.setEditingId({messageId:void 0})}),Object(s.b)("deleteHistory",(e,t,a)=>{const{chatId:s,maxId:n,shouldDeleteForAll:c}=a,r=Object(o.f)(e,s);r&&Object(g.a)("deleteHistory",{chat:r,shouldDeleteForAll:c,maxId:n})}),Object(s.b)("markMessageListRead",(e,t,a)=>{const s=Object(o.y)(e);if(!s)return;const{chatId:n,threadId:c}=s,r=Object(o.Cb)(e,n,c);if(!r)return;const{maxId:i}=a;S(()=>{Object(g.a)("markMessageListRead",{chat:r,threadId:c,maxId:i})})}),Object(s.b)("markMessagesRead",(e,t,a)=>{const s=Object(o.r)(e);if(!s)return;const{messageIds:n}=a;Object(g.a)("markMessagesRead",{chat:s,messageIds:n})}),Object(s.b)("loadWebPagePreview",(e,t,a)=>{const{text:n}=a;!async function(e){const t=await Object(g.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.f)(e,s);r&&Object(g.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(g.a)("loadPollOptionResults",{chat:e,messageId:t,option:a,offset:n,limit:c});if(!i)return;let l=Object(s.e)();l=Object(r.f)(l,Object(b.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.f)(e,t):void 0,r=n?Object(o.f)(e,n):void 0,i=t&&a?a.sort((e,t)=>e-t).map(a=>Object(o.k)(e,t,a)).filter(Boolean):void 0;c&&r&&i&&i.length&&function(e,t,a){Object(g.a)("forwardMessages",{fromChat:e,toChat:t,messages:a}),Object(s.g)({...Object(s.e)(),forwardMessages:{}})}(c,r,i)}),Object(s.b)("loadScheduledHistory",e=>{const t=Object(o.r)(e);if(!t)return;const{hash:a}=e.scheduledMessages.byChatId[t.id]||{};!async function(e,t){const a=await Object(g.a)("fetchScheduledHistory",{chat:e,hash:t});if(!a)return;const{hash:n,messages:c}=a,o=Object(b.c)(c,"id"),i=Object.keys(o).map(Number).sort((e,t)=>t-e);let d=Object(s.e)();d=Object(r.u)(d,e.id,o,n),d=Object(r.x)(d,e.id,l.MAIN_THREAD_ID,"scheduledIds",i),Object(s.g)(d)}(t,a)}),Object(s.b)("sendScheduledMessages",(e,t,a)=>{const{chatId:s,id:n}=a,c=Object(o.f)(e,s);c&&Object(g.a)("sendScheduledMessages",{chat:c,ids:[n]})}),Object(s.b)("rescheduleMessage",(e,t,a)=>{const{chatId:s,messageId:n,scheduledAt:c}=a,r=Object(o.f)(e,s),i=r&&Object(o.ob)(e,r.id,n);r&&i&&Object(g.a)("rescheduleMessage",{chat:r,message:i,scheduledAt:c})}),Object(s.b)("requestThreadInfoUpdate",(e,t,a)=>{const{chatId:s,threadId:n}=a,c=Object(o.Cb)(e,s,n);c&&Object(g.a)("requestThreadInfoUpdate",{chat:c,threadId:n})}),Object(s.b)("loadPinnedMessages",(e,t,a)=>{const{chatId:n}=a,c=Object(o.f)(e,n);c&&async function(e){const t=await Object(g.a)("fetchPinnedMessages",{chat:e});if(!t)return;const{messages:a,chats:n,users:c}=t,o=Object(b.c)(a,"id"),i=Object.keys(o).map(Number).sort((e,t)=>t-e);let d=Object(s.e)();d=Object(r.b)(d,e.id,o),d=Object(r.x)(d,e.id,l.MAIN_THREAD_ID,"pinnedIds",i),d=Object(r.f)(d,Object(b.c)(c,"id")),d=Object(r.c)(d,Object(b.c)(n,"id")),Object(s.g)(d)}(c)}),Object(s.b)("loadMessageLink",(e,t,a)=>{const{messageId:s,chatId:n}=a,c=Object(o.f)(e,n),r=Object(o.k)(e,n,s);c&&r&&(async()=>{const e=await Object(g.a)("fetchMessageLink",{chat:c,message:r});e&&Object(w.c)(e.link)})()});var T=a(51);const A=Object(f.g)(e=>e(),500,!1);async function x(e,t){const a=await Object(g.a)("searchGifs",{query:e,offset:t});a&&Object(s.g)(Object(r.Q)(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(g.a)("fetchStickerSets",{hash:e});if(!t)return;Object(s.g)(Object(r.ib)(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.e)(500)})()}),Object(s.b)("loadRecentStickers",e=>{const{hash:t}=e.stickers.recent||{};!async function(e=0){const t=await Object(g.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(g.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(g.a)("fetchFeaturedStickers",{hash:e});if(!t)return;Object(s.g)(Object(r.ib)(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.wb)(e,n);if(!t)return;c=t.accessHash}!async function(e,t){const a=await Object(g.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.hb)(i,n.id,{...n,stickers:c,packs:o});const l=i.stickers.forEmoji.emoji;l&&o[l]&&(i=Object(r.o)(i));Object(s.g)(i)}(n,c)}),Object(s.b)("loadAnimatedEmojis",()=>{!async function(){const e=await Object(g.a)("fetchAnimatedEmojis");if(!e)return;const{set:t,stickers:a}=e;Object(s.g)(Object(r.q)(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(g.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(g.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(g.a)("faveSticker",{sticker:e,unfave:!0})}(n)}),Object(s.b)("toggleStickerSet",(e,t,a)=>{const{stickerSetId:s}=a,n=Object(o.wb)(e,s);if(!n)return;const{accessHash:c,installedDate:r}=n;Object(g.a)(r?"uninstallStickerSet":"installStickerSet",{stickerSetId:s,accessHash:c})}),Object(s.b)("setStickerSearchQuery",(e,t,a)=>{const{query:n}=a;n&&A(()=>{!async function(e,t=0){const a=await Object(g.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(T.a)(a,e)&&i.unshift(t)}});Object(s.g)(Object(r.ib)(n,"search",a.hash,a.sets,i))}(n)})}),Object(s.b)("setGifSearchQuery",(e,t,a)=>{const{query:s}=a;"string"==typeof s&&A(()=>{x(s)})}),Object(s.b)("searchMoreGifs",e=>{const{query:t,offset:a}=e.gifs.search;"string"==typeof t&&A(()=>{x(t,a)})}),Object(s.b)("loadStickersForEmoji",(e,t,a)=>{const{emoji:n}=a,{hash:c}=e.stickers.forEmoji;A(()=>{!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(g.a)("fetchStickersForEmoji",{emoji:e,hash:t});if(a=Object(s.e)(),!n||a.stickers.forEmoji.emoji!==e)return;a=Object(r.jb)(a,e,n.stickers,n.hash),Object(s.g)(a)}(n,c)})}),Object(s.b)("clearStickersForEmoji",e=>({...e,stickers:{...e.stickers,forEmoji:{}}}));var R=a(35);const L=Object(f.g)(e=>e(),500,!1);async function F(e="",t,a,c,i,l){let d;if(c){const s=await Object(g.a)("searchMessagesLocal",{chatOrUser:c,query:e,type:t,limit:n.y,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(g.a)("searchMessagesGlobal",{query:e,offsetRate:a,limit:n.y,type:t,maxDate:i,minDate:l});let u=Object(s.e)();const m=Object(o.t)(u);if(!d||""!==e&&e!==m)return void Object(s.g)(Object(r.T)(u,{messages:!1}));const{messages:h,users:O,chats:j,totalCount:f,nextRate:p}=d;j.length&&(u=Object(r.c)(u,Object(b.c)(j,"id"))),O.length&&(u=Object(r.f)(u,Object(b.c)(O,"id"))),h.length&&(u=Object(r.d)(u,h)),u=Object(r.U)(u,h,f,t,p),Object(s.g)(u)}async function D(){const e=await Object(g.a)("fetchChats",{limit:n.j,archived:!0,withPinned:!0});if(!e)return;let t=Object(s.e)();t=Object(r.ob)(t,Object(b.c)(e.users,"id")),t=Object(r.M)(t,Object(b.c)(e.chats,"id")),t=Object(r.r)(t,"archived",e.chatIds),t=Object(r.J)(t,"archived",e),Object(s.g)(t)}async function B(){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.Fb)(e,t)).filter(Boolean),c=await Object(g.a)("fetchUsers",{users:n});c&&(e=Object(s.e)(),e=Object(r.ob)(e,Object(b.c)(c,"id")),Object(s.g)(e))}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(g.a)("searchChats",{query:e});let a=Object(s.e)();const n=Object(o.t)(a);if(!t||!n||e!==n)return void Object(s.g)(Object(r.T)(a,{chats:!1}));const{localChats:c,localUsers:i,globalChats:l,globalUsers:d}=t;(c.length||l.length)&&(a=Object(r.c)(a,Object(b.c)([...c,...l],"id")));(i.length||d.length)&&(a=Object(r.f)(a,Object(b.c)([...i,...d],"id")));a=Object(r.T)(a,{chats:!1}),a=Object(r.R)(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(R.m)(n):n,i=Object(r.R)(e,{date:n,query:"",resultsByType:{...e.globalSearch.resultsByType,text:{totalCount:void 0,foundIds:[],nextOffsetId:0}}});Object(s.g)(i);const{chatId:l}=e.globalSearch;F("","text",void 0,l?Object(o.f)(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(R.m)(r):r,{type:l}=a,{nextOffsetId:d}=n&&n[l]||{};F(s,l,d,c?Object(o.f)(e,c):void 0,i,r)}),Object(s.b)("searchTextMessagesLocal",e=>{const{chatId:t,threadId:a}=Object(o.y)(e)||{},c=t?Object(o.f)(e,t):void 0,i=Object(o.A)(e);if(!c||!i||!a)return;const{query:d,results:u}=i,m=u?u.nextOffsetId:void 0;let h;if(a!==l.MAIN_THREAD_ID){const s=Object(o.Bb)(e,t,a);h=s?s.topMessageId:void 0}!async function(e,t,a,c,i){const l=await Object(g.a)("searchMessagesLocal",{chatOrUser:e,type:"text",query:c,topMessageId:a,limit:n.Y,offsetId:i});if(!l)return;const{messages:d,users:u,totalCount:m,nextOffsetId:h}=l,O=Object(b.c)(d,"id"),j=Object.keys(O).map(Number);let f=Object(s.e)();const p=Object(o.A)(f);if(!p||c&&c!==p.query)return;f=Object(r.b)(f,e.id,O),f=Object(r.f)(f,Object(b.c)(u,"id")),f=Object(r.Z)(f,e.id,t,j,m,h),Object(s.g)(f)}(c,a,h,d,m)}),Object(s.b)("searchMediaMessagesLocal",e=>{const t=Object(o.w)(e),a=t?e.users.byId[t]||e.chats.byId[t]:void 0,c=Object(o.v)(e);if(!a||!c)return;const{currentType:i,resultsByType:l}=c,d=i&&l&&l[i],u=d?d.nextOffsetId:void 0;i&&async function(e,t,a){const c=await Object(g.a)("searchMessagesLocal",{chatOrUser:e,type:t,limit:n.ob,offsetId:a});if(!c)return;const{messages:i,users:l,totalCount:d,nextOffsetId:u}=c,m=Object(b.c)(i,"id"),h=Object.keys(m).map(Number);let O=Object(s.e)();if(!Object(o.v)(O))return;O=Object(r.b)(O,e.id,m),O=Object(r.f)(O,Object(b.c)(l,"id")),O=Object(r.W)(O,e.id,t,h,d,u),Object(s.g)(O)}(a,i,u)}),Object(s.b)("searchMessagesByDate",(e,t,a)=>{const{timestamp:n}=a,{chatId:c}=Object(o.y)(e)||{};if(!c)return;const r=Object(o.f)(e,c);r&&async function(e,t){const a=await Object(g.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.y)(e)||{};if(!n)return;if(e.management.progress===d.f.InProgress)return;const{username:c}=a;(async()=>{e=Object(r.bb)(e,d.f.InProgress),e=Object(r.ab)(e,n,{isUsernameAvailable:void 0}),Object(s.g)(e);const t=await Object(g.a)("checkChatUsername",{username:c});e=Object(s.e)(),e=Object(r.bb)(e,t?d.f.Complete:d.f.Error),e=Object(r.ab)(e,n,{isUsernameAvailable:t}),Object(s.g)(e)})()}),Object(s.b)("updatePublicLink",(e,t,a)=>{const{chatId:n}=Object(o.y)(e)||{};let c=n&&Object(o.f)(e,n);if(!n||!c)return;const{username:i}=a;(async()=>{if(e=Object(r.bb)(e,d.f.InProgress),Object(s.g)(e),Object(h.ib)(c)){if(c=await Object(g.a)("migrateChat",c),!c)return;t.openChat({id:c.id})}const a=await Object(g.a)("setChatUsername",{chat:c,username:i});e=Object(s.e)(),e=Object(r.bb)(e,a?d.f.Complete:d.f.Error),e=Object(r.ab)(e,n,{isUsernameAvailable:void 0}),Object(s.g)(e)})()}),Object(s.b)("updatePrivateLink",e=>{const{chatId:t}=Object(o.y)(e)||{},a=t&&Object(o.f)(e,t);t&&a&&Object(g.a)("updatePrivateLink",{chat:a})}),Object(s.b)("sync",(e,t)=>{!async function(e){n.p&&console.log(">>> START SYNC");await Object(g.a)("fetchCurrentUser");const t=await async function(){const e=await Object(g.a)("fetchChats",{limit:n.j,withPinned:!0});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.Fb)(t,e)).filter(Boolean),m=d.map(e=>Object(o.f)(t,e)).filter(Boolean),{chatId:O}=Object(o.y)(t)||{};if(O){const e=Object(o.f)(t,O);if(e&&!d.includes(O)&&m.push(e),Object(h.lb)(O)){const e=Object(o.Fb)(t,O);e&&!d.includes(O)&&u.push(e)}}u.push(...e.users),m.push(...e.chats),t=Object(r.s)(t,Object(b.c)(m,"id")),t=Object(r.r)(t,"active",e.chatIds),t={...t,chats:{...t.chats}},t=Object(r.J)(t,"active",e),Object.keys(e.draftsById).map(Number).forEach(a=>{t=Object(r.x)(t,a,l.MAIN_THREAD_ID,"draft",e.draftsById[a])}),Object.keys(e.replyingToById).map(Number).forEach(a=>{t=Object(r.x)(t,a,l.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||[],c=Object(s.e)();const{chatId:i}=Object(o.y)(c)||{},d=Object.keys(c.messages.byChatId).map(Number).reduce((e,t)=>{const a=Object(o.B)(c,t,l.MAIN_THREAD_ID);return a?{...e,[t]:a}:e},{});if(i){const e=await(u=c.chats.byId[i],Object(g.a)("fetchMessages",{chat:u,threadId:l.MAIN_THREAD_ID,offsetId:u.lastReadInboxMessageId,addOffset:-(Math.round(n.W/2)+1),limit:n.W}));c=Object(s.e)();const{chatId:d}=Object(o.y)(c)||{};if(e&&d===i){const s=c.messages.byChatId[i],n=Object(b.c)(e.messages,"id"),o=Object.keys(n).map(Number);c={...c,messages:{...c.messages,byChatId:{[i]:{byId:n,threadsById:{[l.MAIN_THREAD_ID]:{...s&&s.threadsById[l.MAIN_THREAD_ID],listedIds:o,viewportIds:o,outlyingIds:void 0}}}}}},c=Object(r.M)(c,Object(b.c)(e.chats,"id")),c=Object(r.lb)(c,i,e.threadInfos),t=!0,a=Array.prototype.concat(a,e.users)}}var u;t||(c={...c,messages:{...c.messages,byChatId:{}}});Object.keys(d).map(Number).forEach(e=>{c=Object(r.x)(c,e,l.MAIN_THREAD_ID,"draft",d[e])}),e?c=Object(r.y)(c,Object(b.c)(a,"id")):a&&(c=Object(r.ob)(c,Object(b.c)(a,"id")));Object(s.g)(c);const{chatId:m,messageId:h}=c.audioPlayer;m&&h&&!Object(o.k)(c,m,h)&&Object(s.d)().closeAudioPlayer()}(t),Object(s.g)({...Object(s.e)(),lastSyncTime:Date.now()}),n.p&&console.log(">>> FINISH SYNC");e()}(t.afterSync)}),Object(s.b)("afterSync",(e,t)=>{!async function(e){n.p&&console.log(">>> START AFTER-SYNC");e.loadFavoriteStickers(),await Promise.all([B(),D()]),await Object(g.a)("fetchCurrentUser"),n.p&&console.log(">>> FINISH AFTER-SYNC")}(t)});const U=Object(f.a)(e=>e(),500,!1,!0);function H(e,{visibility:t,allowedIds:a,deniedIds:s}){const{users:{byId:n},chats:{byId:c}}=e,r={visibility:t};let o,i;const l=e=>{if(!Object(h.lb)(e))return;const{id:t,accessHash:a}=n[e]||{};return t?{id:t,accessHash:a}:void 0},d=e=>{if(Object(h.lb)(e))return;const t=c[e];return t?{id:t.id}:void 0};return"contacts"!==t&&"nobody"!==t||(o=a.map(l).filter(Boolean),i=a.map(d).filter(Boolean),o.length>0&&(r.allowedUsers=o),i.length>0&&(r.allowedChats=i)),"everybody"!==t&&"contacts"!==t||(o=s.map(l).filter(Boolean),i=s.map(d).filter(Boolean),o.length>0&&(r.blockedUsers=o),i.length>0&&(r.blockedChats=i)),r}Object(s.b)("loadFullUser",(e,t,a)=>{const{userId:s}=a,n=Object(o.Fb)(e,s);if(!n)return;const{id:c,accessHash:r}=n;U(()=>Object(g.a)("fetchFullUser",{id:c,accessHash:r}))}),Object(s.b)("loadUser",(e,t,a)=>{const{userId:n}=a,c=Object(o.Fb)(e,n);c&&(async()=>{const t=await Object(g.a)("fetchUsers",{users:[c]});t&&(e=Object(s.e)(),e=Object(r.ob)(e,Object(b.c)(t,"id")),Object(s.g)(e))})()}),Object(s.b)("loadTopUsers",e=>{const{hash:t,lastRequestedAt:a}=e.topPeers;(!a||Date.now()-a>6e4)&&async function(e){const t=await Object(g.a)("fetchTopUsers",{hash:e});if(!t)return;const{hash:a,ids:n,users:c}=t;let o=Object(s.e)();o=Object(r.f)(o,Object(b.c)(c,"id")),o={...o,topPeers:{...o.topPeers,hash:a,userIds:n,lastRequestedAt:Date.now()}},Object(s.g)(o)}(t)}),Object(s.b)("loadContactList",e=>{const{hash:t}=e.contactList||{};!async function(e){const t=await Object(g.a)("fetchContactList",{hash:e});if(!t)return;let a=Object(r.f)(Object(s.e)(),Object(b.c)(t.users,"id"));a=Object(r.c)(a,Object(b.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(g.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.Fb)(c,e);if(!i)return;Object(s.d)().updateChatMutedState({chatId:e,isMuted:t}),Object(s.g)(Object(r.bb)(Object(s.e)(),d.f.InProgress));await Object(g.a)("updateContact",{phone:i.phoneNumber,firstName:a,lastName:n})&&Object(s.g)(Object(r.nb)(Object(s.e)(),i.id,{firstName:a,lastName:n}));Object(s.g)(Object(r.bb)(Object(s.e)(),d.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.Fb)(t,e);if(!a)return;const{id:n,accessHash:c}=a;await Object(g.a)("deleteUser",{id:n,accessHash:c})}(n)}),Object(s.b)("loadProfilePhotos",(e,t,a)=>{const{profileId:n}=a,c=Object(h.lb)(n),i=c?Object(o.Fb)(e,n):void 0,l=c?void 0:Object(o.f)(e,n);(async()=>{const e=await Object(g.a)("fetchProfilePhotos",i,l);if(!e||!e.photos)return;let t=Object(s.e)();c?t=Object(r.nb)(t,n,{photos:e.photos}):(t=Object(r.f)(t,Object(b.c)(e.users,"id")),t=Object(r.H)(t,n,{photos:e.photos})),Object(s.g)(t)})()}),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.ib)||c.value.match(n.jb)?t.openTelegramLink({url:c.value}):t.toggleSafeLinkModal({url:c.value});break;case"callback":{const t=Object(o.r)(e);if(!t)return;!async function(e,t,a){const n=await Object(g.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)().showError({error:{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.r)(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.k)(e,a.id,s)),t.openPaymentModal({messageId:s}));break}}}),Object(s.b)("sendBotCommand",(e,t,a)=>{const{command:s}=a,{currentUserId:n}=e,c=Object(o.r)(e);n&&c&&async function(e,t,a){await Object(g.a)("sendMessage",{chat:e,text:a})}(c,0,s)}),Object(s.b)("updateProfile",(e,t,a)=>{const{photo:n,firstName:c,lastName:i,bio:l,username:b}=a;(async()=>{const{currentUserId:t}=e;if(t){if(Object(s.g)({...Object(s.e)(),profileEdit:{progress:d.j.InProgress}}),n&&await Object(g.a)("updateProfilePhoto",n),c||i||l){if(await Object(g.a)("updateProfile",{firstName:c,lastName:i,about:l})){e=Object(s.e)();const a=t&&Object(o.Fb)(e,t);a&&Object(s.g)(Object(r.nb)(e,a.id,{firstName:c,lastName:i,fullInfo:{...a.fullInfo,bio:l}}))}}if(b){await Object(g.a)("updateUsername",b)&&t&&Object(s.g)(Object(r.nb)(Object(s.e)(),t,{username:b}))}Object(s.g)({...Object(s.e)(),profileEdit:{progress:d.j.Complete}})}})()}),Object(s.b)("checkUsername",(e,t,a)=>{const{username:n}=a;(async()=>{if(e.profileEdit&&e.profileEdit.progress===d.j.InProgress)return;Object(s.g)({...e,profileEdit:{progress:e.profileEdit?e.profileEdit.progress:d.j.Idle,isUsernameAvailable:void 0}});const t=await Object(g.a)("checkUsername",n);e=Object(s.e)(),Object(s.g)({...e,profileEdit:{...e.profileEdit,isUsernameAvailable:t}})})()}),Object(s.b)("loadWallpapers",()=>{(async()=>{const e=await Object(g.a)("fetchWallpapers",0);if(!e)return;const t=Object(s.e)();Object(s.g)({...t,settings:{...t.settings,loadedWallpapers:e.wallpapers}})})()}),Object(s.b)("uploadWallpaper",(e,t,a)=>{const n=a,c=URL.createObjectURL(n);Object(s.g)({...e,settings:{...e.settings,loadedWallpapers:[{slug:d.n,document:{fileName:"",size:n.size,mimeType:n.type,previewBlobUrl:c}},...e.settings.loadedWallpapers||[]]}}),(async()=>{const t=await Object(g.a)("uploadWallpaper",n);if(!t)return;const{wallpaper:a}=t;if(!(e=Object(s.e)()).settings.loadedWallpapers)return;const r=e.settings.loadedWallpapers[0];if(!r||r.slug!==d.n)return;const o={...a,document:{...a.document,previewBlobUrl:c}};Object(s.g)({...e,settings:{...e.settings,loadedWallpapers:[o,...e.settings.loadedWallpapers.slice(1)]}})})()}),Object(s.b)("loadBlockedContacts",()=>{(async()=>{const e=await Object(g.a)("fetchBlockedContacts");if(!e)return;let t=Object(s.e)();e.users&&e.users.length&&(t=Object(r.f)(t,Object(b.c)(e.users,"id"))),e.chats&&e.chats.length&&(t=Object(r.M)(t,Object(b.c)(e.chats,"id"))),t={...t,blocked:{...t.blocked,ids:[...t.blocked.ids||[],...e.blockedIds],totalCount:e.totalCount}},Object(s.g)(t)})()}),Object(s.b)("blockContact",(e,t,a)=>{const{contactId:n}=a;(async()=>{if(!await Object(g.a)("blockContact",n))return;const e=Object(s.e)();Object(s.g)(Object(r.a)(e,n))})()}),Object(s.b)("unblockContact",(e,t,a)=>{const{contactId:n}=a;let c;if(Object(h.lb)(n)){const t=Object(o.Fb)(e,n);if(!t)return;c=t.accessHash}(async()=>{if(!await Object(g.a)("unblockContact",n,c))return;const e=Object(s.e)();Object(s.g)(Object(r.p)(e,n))})()}),Object(s.b)("loadAuthorizations",()=>{(async()=>{const e=await Object(g.a)("fetchAuthorizations");e&&Object(s.g)({...Object(s.e)(),activeSessions:e})})()}),Object(s.b)("terminateAuthorization",(e,t,a)=>{const{hash:n}=a;(async()=>{if(!await Object(g.a)("terminateAuthorization",n))return;const e=Object(s.e)();Object(s.g)({...e,activeSessions:e.activeSessions.filter(e=>e.hash!==n)})})()}),Object(s.b)("terminateAllAuthorizations",()=>{(async()=>{if(!await Object(g.a)("terminateAllAuthorizations"))return;const e=Object(s.e)();Object(s.g)({...e,activeSessions:e.activeSessions.filter(e=>e.isCurrent)})})()}),Object(s.b)("loadNotificationExceptions",()=>{Object(g.a)("fetchNotificationExceptions")}),Object(s.b)("loadNotificationSettings",()=>{(async()=>{const e=await Object(g.a)("fetchNotificationSettings");e&&Object(s.g)(Object(r.v)(Object(s.e)(),e))})()}),Object(s.b)("updateNotificationSettings",(e,t,a)=>{const{peerType:n,isSilent:c,shouldShowPreviews:o}=a;(async()=>{await Object(g.a)("updateNotificationSettings",n,{isSilent:c,shouldShowPreviews:o})&&Object(s.g)(Object(r.cb)(Object(s.e)(),n,c,o))})()}),Object(s.b)("updateContactSignUpNotification",(e,t,a)=>{const{isSilent:n}=a;(async()=>{await Object(g.a)("updateContactSignUpNotification",n)&&Object(s.g)(Object(r.v)(Object(s.e)(),{hasContactJoinedNotifications:!n}))})()}),Object(s.b)("loadLanguages",()=>{(async()=>{const e=await Object(g.a)("fetchLanguages");e&&Object(s.g)(Object(r.v)(Object(s.e)(),{languages:e}))})()}),Object(s.b)("loadPrivacySettings",()=>{(async()=>{const[e,t,a,n,c]=await Promise.all([Object(g.a)("fetchPrivacySettings","phoneNumber"),Object(g.a)("fetchPrivacySettings","lastSeen"),Object(g.a)("fetchPrivacySettings","profilePhoto"),Object(g.a)("fetchPrivacySettings","forwards"),Object(g.a)("fetchPrivacySettings","chatInvite")]);if(!(e&&t&&a&&n&&c))return;const r=Object(s.e)();r.settings.privacy.phoneNumber=e,r.settings.privacy.lastSeen=t,r.settings.privacy.profilePhoto=a,r.settings.privacy.forwards=n,r.settings.privacy.chatInvite=c,Object(s.g)(r)})()}),Object(s.b)("setPrivacyVisibility",(e,t,a)=>{const{privacyKey:n,visibility:c}=a,{privacy:{[n]:r}}=e.settings;if(!r)return;const o=H(e,{visibility:c,allowedIds:[...r.allowUserIds,...r.allowChatIds],deniedIds:[...r.blockUserIds,...r.blockChatIds]});(async()=>{const e=await Object(g.a)("setPrivacySettings",n,o);if(e){const t=Object(s.e)();t.settings.privacy[n]=e,Object(s.g)(t)}})()}),Object(s.b)("setPrivacySettings",(e,t,a)=>{const{privacyKey:n,isAllowList:c,contactsIds:r}=a,{privacy:{[n]:o}}=e.settings;if(!o)return;const i=H(e,{visibility:o.visibility,allowedIds:c?r:[...o.allowUserIds,...o.allowChatIds],deniedIds:c?[...o.blockUserIds,...o.blockChatIds]:r});(async()=>{const e=await Object(g.a)("setPrivacySettings",n,i);if(e){const t=Object(s.e)();t.settings.privacy[n]=e,Object(s.g)(t)}})()}),Object(s.b)("loadPasswordInfo",()=>{(async()=>{const e=await Object(g.a)("getPasswordInfo");if(!e)return;let t=Object(s.e)();t=Object(r.v)(t,{hasPassword:e.hasPassword}),t=Object(r.mb)(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.mb)(e,{isLoading:!0,error:void 0})),(async()=>{const e=await Object(g.a)("checkPassword",n);Object(s.g)(Object(r.mb)(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.mb)(e,{isLoading:!0,error:void 0})),(async()=>{const e=await Object(g.a)("clearPassword",n);Object(s.g)(Object(r.mb)(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.mb)(e,{isLoading:!0,error:void 0})),(async()=>{const e=await Object(g.a)("updatePassword",n,c,o,i);Object(s.g)(Object(r.mb)(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.mb)(e,{isLoading:!0,error:void 0})),(async()=>{const e=await Object(g.a)("updateRecoveryEmail",n,c);Object(s.g)(Object(r.mb)(Object(s.e)(),{isLoading:!1,waitingEmailCodeLength:void 0})),e&&o()})()}),Object(s.b)("provideTwoFaEmailCode",(e,t,a)=>{const{code:s}=a;Object(g.a)("provideRecoveryEmailCode",s)}),Object(s.b)("clearTwoFaError",e=>Object(r.mb)(e,{error:void 0}));var q=a(59);Object(s.b)("validateRequestedInfo",(e,t,a)=>{const{requestInfo:n,saveInfo:c}=a,i=Object(o.gb)(e);i&&async function(e,t,a){const n=await Object(g.a)("validateRequestedInfo",{messageId:e,requestInfo:t,shouldSave:a});if(!n)return;const{id:c,shippingOptions:o}=n;if(!c)return;let i=Object(r.E)(Object(s.e)(),c);o?(i=Object(r.gb)(i,o),i=Object(r.C)(i,d.i.Shipping)):i=Object(r.C)(i,d.i.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(g.a)("getPaymentForm",{messageId:e});if(!t)return;let a=Object(r.B)(Object(s.e)(),t),n=d.i.PaymentInfo;a.payment.invoice&&(a.payment.invoice.shippingAddressRequested||a.payment.invoice.nameRequested||a.payment.invoice.phoneRequested||a.payment.invoice.emailRequested)&&(n=d.i.ShippingInfo);a=Object(r.C)(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(g.a)("getReceipt",t);if(!n)return;let c=Object(s.e)();const i=Object(o.k)(c,a,e);c=Object(r.D)(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.jb)(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(q.b)(c.error),t=Object(s.e)();return void Object(s.g)({...t,payment:{...t.payment,error:{...e}}})}let o=Object(r.F)(Object(s.e)(),{type:c.type,id:c.id});o=Object(r.C)(o,d.i.Checkout),Object(s.g)(o)}(i,n)}),Object(s.b)("sendPaymentForm",(e,t,a)=>{const{shippingOptionId:n,saveCredentials:c}=a,i=Object(o.gb)(e),l=Object(o.hb)(e),d=Object(o.jb)(e),b=Object(o.yb)(e);i&&d&&async function(e,t,a,n){if(await Object(g.a)("sendPaymentForm",{messageId:e,credentials:t,requestedInfoId:a,shippingOptionId:n})){const e=Object(r.h)(Object(s.e)());Object(s.g)(Object(r.i)(e))}}(i,{save:c,data:b},l,n)}),Object(s.b)("setPaymentStep",(e,t,a={})=>Object(r.C)(e,a.step||d.i.ShippingInfo)),Object(s.b)("setInvoiceMessageInfo",(e,t,a)=>Object(r.A)(e,a));a(84);var G=a(28),_=a(76);const W=Object(f.g)(e=>e(),1e3,!0);Object(s.b)("apiUpdate",(e,t,a)=>{switch(a["@type"]){case"updateChat":{a.noTopChatsRequest||Object(o.L)(e,a.id)||t.loadTopChats();const n=Object(r.H)(e,a.id,a.chat,a.newProfilePhoto);Object(s.g)(n);const c=Object(o.q)(n);W(()=>Object(_.a)(c));break}case"updateChatJoin":{const n=Object(o.j)(e,a.id);if(!n)break;e=Object(r.I)(e,n,[a.id]),e=Object(r.H)(e,a.id,{isNotJoined:!1}),Object(s.g)(e);const c=Object(o.f)(e,a.id);c&&t.requestChatUpdate({chatId:c.id});break}case"updateChatLeave":{const t=Object(o.j)(e,a.id);if(!t)break;const{[t]:n}=e.chats.listIds;n&&(e=Object(r.r)(e,t,n.filter(e=>e!==a.id))),e=Object(r.H)(e,a.id,{isNotJoined:!0}),Object(s.g)(e);break}case"updateChatInbox":Object(s.g)(Object(r.H)(e,a.id,a.chat));break;case"updateChatTypingStatus":{const{id:t,typingStatus:n}=a;Object(s.g)(Object(r.H)(e,t,{typingStatus:n})),setTimeout(()=>{const e=Object(s.e)(),a=Object(o.f)(e,t);a&&n&&a.typingStatus&&a.typingStatus.timestamp===n.timestamp&&Object(s.g)(Object(r.H)(e,t,{typingStatus:void 0}))},6e3);break}case"newMessage":{const{message:n}=a,{chatId:c,threadId:i,type:d}=Object(o.y)(e)||{};if(n.senderId===e.currentUserId&&!n.isFromScheduled)return;const b=Object(o.f)(e,a.chatId);if(!b)return;const u="thread"===d&&i===l.MAIN_THREAD_ID&&a.chatId===c;u?setTimeout(()=>{t.requestChatUpdate({chatId:a.chatId})},1e3):Object(s.g)(Object(r.H)(e,a.chatId,{unreadCount:b.unreadCount?b.unreadCount+1:1,...a.message.hasUnreadMention&&{unreadMentionsCount:b.unreadMentionsCount?b.unreadMentionsCount+1:1}}));const m=Object(o.q)(Object(s.e)());Object(_.a)(m),Object(G.b)({chat:b,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.p)(e,t),n=Object(o.f)(e,s);n&&n.unreadMentionsCount&&(e=Object(r.H)(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.H)(e,a.id,{fullInfo:{...n.fullInfo,...t}}));break}case"updatePinnedChatIds":{const{ids:t,folderId:c}=a,r=c===n.h?"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.j)(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.L){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.K)(e,t,n));break}case"updateChatFolder":{const{id:t,folder:n}=a,{byId:c,orderedIds:r}=e.chatFolders,o=n?{...c,[t]:n}:Object(b.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.H)(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.H)(e,t,{photos:c.photos.filter(e=>!n.includes(e.id))}));break}}});function V(e,t,a,s,n=!1){const c=n?Object(o.ob)(e,t,a):Object(o.k)(e,t,a);if(c&&s.content){const{photo:e,video:t,sticker:a,document:n}=Object(h.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.eb)(e,t,a,s):Object(r.L)(e,t,a,s)}function $(e,t){const{id:a,chatId:s}=t;if(e=Object(r.V)(e,s,l.MAIN_THREAD_ID,[a]),Object(o.W)(e,s,l.MAIN_THREAD_ID)){const t=Object(o.G)(e,s,l.MAIN_THREAD_ID),n=Object(r.g)(e,s,l.MAIN_THREAD_ID,a),c=Object(o.Gb)(n,s,l.MAIN_THREAD_ID);t&&!c.includes(t)||(e=n)}const{threadInfo:n,firstMessageId:c}=Object(o.Ab)(e,s,t)||{};return!c&&Object(h.sb)(t)||n&&(e=Object(r.V)(e,s,n.threadId,[a]),Object(o.W)(e,s,n.threadId)&&(e=Object(r.g)(e,s,n.threadId,a),c||(e=Object(r.x)(e,s,n.threadId,"firstMessageId",t.id)),n.lastMessageId||(e=Object(r.x)(e,s,n.threadId,"threadInfo",{...n,lastMessageId:t.id})))),e}function z(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.H)(e,t,{lastMessage:a})}function Q(e,t){const a=Object(o.m)(e,t),s=Object(o.X)(e,t,l.MAIN_THREAD_ID);if(!a||!s)return;let n=s.length;for(;n--;){const e=a[s[n]];if(!e.isDeleting)return e}}function K(e,t,a,n){if(e){t.forEach(t=>{const a=Q(n=Object(r.L)(n,e,t,{isDeleting:!0}),e);a&&(n=z(n,e,a,!0))}),Object(s.g)(n),a.requestChatUpdate({chatId:e});const c=[];return t.forEach(t=>{const a=Object(o.k)(n,e,t);if(!a)return;const{threadInfo:s}=Object(o.Ab)(n,e,a)||{};s&&c.push(s.threadId)}),Object(b.o)(c).forEach(t=>{a.requestThreadInfoUpdate({chatId:e,threadId:t})}),void setTimeout(()=>{Object(s.g)(Object(r.j)(Object(s.e)(),e,t))},350)}const c=[];t.forEach(e=>{const t=Object(o.p)(n,e);if(t){c.push(t);const a=Q(n=Object(r.L)(n,t,e,{isDeleting:!0}),t);a&&(n=z(n,t,a,!0)),setTimeout(()=>{Object(s.g)(Object(r.j)(Object(s.e)(),t,[e]))},350)}}),Object(s.g)(n),Object(b.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=$(e=V(e,n,c,i),i),i.threadInfo&&(e=Object(r.kb)(e,i.threadInfo.chatId,i.threadInfo.threadId,i.threadInfo)),Object(s.g)(e);const l=Object(o.k)(e,n,c);if(Object(o.a)(e,n,i)){if(i.isOutgoing&&(!i.content||!i.content.action)){const a=Object(o.y)(e);a&&t.focusMessage({chatId:n,threadId:a.threadId,messageId:i.id,noHighlight:!0})}const{threadInfo:a}=Object(o.Ab)(e,n,i)||{};a&&t.requestThreadInfoUpdate({chatId:n,threadId:a.threadId}),i.isOutgoing||setTimeout(()=>{Object(s.g)(z(Object(s.e)(),n,l))},350)}else Object(s.g)(z(Object(s.e)(),n,l));Object(o.L)(e,n)||t.loadTopChats();break}case"newScheduledMessage":{const{chatId:t,id:n,message:c}=a;e=V(e,t,n,c,!0);const i=Object(o.nb)(e,t)||[];e=Object(r.x)(e,t,l.MAIN_THREAD_ID,"scheduledIds",Object(b.o)([...i,n])),Object(s.g)(e);break}case"updateMessage":{const{chatId:t,id:n,message:c}=a;if(!Object(o.k)(e,t,n))return;e=V(e,t,n,c);const i=Object(o.k)(e,t,n);c.threadInfo&&(e=Object(r.kb)(e,c.threadInfo.chatId,c.threadInfo.threadId,c.threadInfo)),e=z(e,t,i),Object(s.g)(e);break}case"updateScheduledMessage":{const{chatId:t,id:n,message:c}=a;if(!Object(o.ob)(e,t,n))return;e=V(e,t,n,c,!0);const i=Object.keys(Object(o.pb)(e,t)||{}).map(Number).sort((e,t)=>t-e);e=Object(r.x)(e,t,l.MAIN_THREAD_ID,"scheduledIds",i),Object(s.g)(e);break}case"updateMessageSendSucceeded":{const{chatId:t,localId:n,message:c}=a;e=$(e,c);const i=Object(o.k)(e,t,n);e=Object(r.j)(e,t,[n]),c.isScheduled&&(e=Object(r.k)(e,t,[n])),e=Object(r.L)(e,t,c.id,{...i,...c,previousLocalId:n});const l=Object(o.k)(e,t,c.id);e=z(e,t,l),Object(s.g)(e);break}case"updateScheduledMessageSendSucceeded":{const{chatId:t,localId:n,message:c}=a,i=Object(o.nb)(e,t)||[];e=Object(r.x)(e,t,l.MAIN_THREAD_ID,"scheduledIds",[...i,c.id]);const d=Object(o.ob)(e,t,n);e=Object(r.k)(e,t,[n]),e=Object(r.eb)(e,t,c.id,{...d,...c,previousLocalId:n}),Object(s.g)(e);break}case"updatePinnedIds":{const{chatId:t,isPinned:n,messageIds:c}=a,i=Object(o.ib)(e,t)||[],d=n?[...i,...c].sort((e,t)=>t-e):i.filter(e=>!c.includes(e));Object(s.g)(Object(r.x)(e,t,l.MAIN_THREAD_ID,"pinnedIds",d));break}case"updateThreadInfo":{const{chatId:t,threadId:n,threadInfo:c,firstMessageId:i}=a,l={...Object(o.Bb)(e,t,n),...c};if(!l.threadId)return;e=Object(r.kb)(e,t,n,l),i&&(e=Object(r.x)(e,t,n,"firstMessageId",i)),Object(s.g)(e);break}case"resetMessages":{const{id:n}=a,c=Object(o.m)(e,n);c&&!Object(h.lb)(n)&&(e=Object(r.j)(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;K(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.eb)(n,e,t,{isDeleting:!0})}),Object(s.g)(n),setTimeout(()=>{n=Object(r.k)(Object(s.e)(),e,t);const a=Object(o.pb)(n,e);n=Object(r.x)(n,e,l.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;K(s,Object.keys(e.messages.byChatId[s].byId).map(Number),t,e);break}case"updateCommonBoxMessages":{const{ids:t,messageUpdate:n}=a;t.forEach(t=>{const a=Object(o.p)(e,t);a&&(e=Object(r.L)(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.L)(e,t,a,c)}),Object(s.g)(e);break}case"updateMessagePoll":{const{pollId:t,pollUpdate:n}=a,c=Object(o.l)(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.L)(e,c.chatId,c.id,{content:{...c.content,poll:t}}))}break}case"updateMessagePollVote":{const{pollId:t,userId:n,options:c}=a,i=Object(o.l)(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.L)(e,i.chatId,i.id,{content:{...i.content,poll:{...l,results:{...l.results,recentVoterIds:m,totalVoters:h,results:O}}}}));break}}});const Y=Object(f.g)((function(){let e=Object(s.e)();J.forEach(([t,a])=>{e=Object(r.nb)(e,t,{status:a})}),Object(s.g)(e),J=[]}),3e3,!0);let J=[];Object(s.b)("apiUpdate",(e,t,a)=>{switch(a["@type"]){case"deleteUser":return Object(r.l)(e,a.id);case"updateUser":return Object(r.nb)(e,a.id,a.user);case"updateUserStatus":return s=a.userId,n=a.status,J.push([s,n]),void Y();case"updateUserFullInfo":{const{id:t,fullInfo:s}=a,n=e.users.byId[t];if(!n)return;return Object(r.nb)(e,t,{fullInfo:{...n.fullInfo,...s}})}}var s,n}),Object(s.b)("apiUpdate",(e,t,a)=>{switch(a["@type"]){case"updateStickerSet":return Object(r.hb)(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.p)(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.cb)(e,a.peerType,a.isSilent,a.shouldShowPreviews);case"updateNotifyExceptions":{const{id:t,isMuted:n,isSilent:c,shouldShowPreviews:o}=a;e.chats.byId[t]&&(e=Object(r.H)(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 X=a(48),Z=a(8),ee=a(34),te=a(129),ae=a(116),se=a(33),ne=a(47),ce=a(108),re=a(75),oe=a(24),ie=a(61),le=a(42),de=a(31),be=a(152),ue=a(139);a(195);var me=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(Z.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(196);const he=[0,1,2];var Oe=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,{theme:o,animationLevel:i}=e.settings.byKey;return{searchQuery:t,isLoading:!!a&&Boolean(a.chats||a.messages),currentUserId:c,chatsById:r,globalSearchChatId:s,searchDate:n,theme:o,animationLevel:i}},(e,t)=>Object(b.l)(t,["openChat","openTipsChat","setGlobalSearchDate","setGlobalSearchChatId","setSettingOption"]))(({content:e,contactsFilter:t,onSearchQuery:a,onSelectSettings:s,onSelectContacts:r,onSelectArchived:o,onOpenMenu:i,onCloseMenu:l,setGlobalSearchChatId:b,onReset:u,searchQuery:m,isLoading:j,shouldSkipTransition:g,currentUserId:f,globalSearchChatId:p,searchDate:I,theme:v,animationLevel:y,chatsById:C,openChat:E,openTipsChat:w,setGlobalSearchDate:M,setSettingOption:S})=>{const k=Object(oe.a)(),N=e===d.d.ChatList,P={date:void 0},T={id:void 0},A=Object(c.p)(()=>I?Object(R.a)(new Date(1e3*I)):void 0,[I]),x=Object(c.p)(()=>N&&C?Object.values(C).reduce((e,t)=>Object(h.hb)(t)&&t.unreadCount?e+1:e,0):0,[N,C]),L=Object(c.p)(()=>({onTrigger:e,isOpen:t})=>c.a.createElement(de.a,{round:!0,ripple:N&&!O.g,size:"smaller",color:"translucent",className:t?"active":"",onClick:N?e:()=>u(),ariaLabel:N?k("AccDescrOpenMenu2"):"Return to chat list"},c.a.createElement("div",{className:Object(Z.a)("animated-menu-icon",!N&&"state-back",g&&"no-animation")})),[N,k,u,g]),F=Object(c.m)(()=>{m||a("")},[m,a]),D=Object(c.m)(()=>{E({id:f})},[f,E]),B=Object(c.m)(e=>{e.stopPropagation();const t="light"===v?"dark":"light";S({theme:t}),Object(re.a)(t,y>0)},[y,S,v]),U=Object(c.m)(e=>{e.stopPropagation();const t=0===y?2:0;he.forEach((e,a)=>{document.body.classList.toggle("animation-level-"+a,t===a)}),S({animationLevel:t})},[y,S]),H=Boolean(p)||e===d.d.GlobalSearch||e===d.d.Contacts,q=e===d.d.Contacts?k("SearchFriends"):k("Search"),[G,_]=Object(c.r)(!1);return Object(ae.a)((e,t,a)=>{a&&"left"===a.type&&a.isMenuOpen&&t&&(_(!0),setTimeout(()=>_(!1),300))}),c.a.createElement("div",{className:"LeftMainHeader"},c.a.createElement("div",{id:"LeftMainHeader",className:"left-header"},c.a.createElement(ie.a,{trigger:L,footer:`${n.f} ${n.g}`,forceOpen:G,onOpen:i,onClose:l},c.a.createElement(le.a,{icon:"saved-messages",onClick:D},k("SavedMessages")),c.a.createElement(le.a,{icon:"archive",onClick:o},c.a.createElement("span",{className:"menu-item-name"},k("ArchivedChats")),x>0&&c.a.createElement("div",{className:"archived-badge"},x)),c.a.createElement(le.a,{icon:"user",onClick:r},k("Contacts")),c.a.createElement(le.a,{icon:"settings",onClick:s},k("Settings")),c.a.createElement(le.a,{icon:"darkmode",onClick:B},c.a.createElement("span",{className:"menu-item-name"},k("lng_menu_night_mode")),c.a.createElement(me,{id:"darkmode",label:k("dark"===v?"lng_settings_disable_night_theme":"lng_settings_enable_night_theme"),checked:"dark"===v,noAnimation:!0})),c.a.createElement(le.a,{icon:"animations",onClick:U},c.a.createElement("span",{className:"menu-item-name capitalize"},k("Appearance.Animations").toLowerCase()),c.a.createElement(me,{id:"animations",label:"Toggle Animations",checked:y>0})),c.a.createElement(le.a,{icon:"help",onClick:w},k("TelegramFeatures")),c.a.createElement(le.a,{icon:"bug",href:n.x},"Report Bug"),c.a.createElement(le.a,{icon:"char-K",href:"https://web.telegram.org/k/"},"Switch to WebK"),c.a.createElement(le.a,{icon:"char-W",href:"https://web.telegram.org/"},"Switch to Webogram")),c.a.createElement(be.a,{inputId:"telegram-search-input",parentContainerClassName:"LeftSearch",className:p||I?"with-picker-item":"",value:t||m,focused:H,isLoading:j,placeholder:q,canClose:Boolean(p||I),onChange:a,onReset:u,onFocus:F},A&&c.a.createElement(ue.a,{icon:"calendar",title:A,canClose:!0,isMinimized:Boolean(p),className:"search-date",onClick:M,clickArg:P}),p&&c.a.createElement(ue.a,{chatOrUserId:p,onClick:b,canClose:!0,clickArg:T}))))})),je=a(20);a(197);var ge=Object(s.h)(e=>Object(b.l)(e,["connectionState"]))(({connectionState:e})=>{const t=Object(oe.a)();return"connectionStateConnecting"===e&&c.a.createElement("div",{id:"ConnectionState",dir:t.isRtl?"rtl":void 0},c.a.createElement(je.a,{color:"black"}),c.a.createElement("div",{className:"state-text"},t("WaitingForNetwork")))}),fe=a(130),pe=a(39),Ie=a(25),ve=(e,t,a)=>{const s=Object(c.q)(),n=(e=>Object(c.p)(()=>Object(f.g)(e=>e(),e),[e]))(t),r=Object(Ie.a)();return Object(pe.a)(()=>{let t=!0;n(()=>{s.current=e(),t||r()}),t=!1},a),s.current},ye=a(166),Ce=a(187);var Ee=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.db)(e),notifyExceptions:Object(o.cb)(e),activeChatFolder:c,currentUserId:r}},(e,t)=>Object(b.l)(t,["loadChatFolders","setActiveChatFolder","openChat"]))(({chatsById:e,usersById:t,chatFoldersById:a,notifySettings:s,notifyExceptions:n,orderedFolderIds:r,activeChatFolder:o,currentUserId:i,lastSyncTime:l,loadChatFolders:d,setActiveChatFolder:u,openChat:m})=>{const j=Object(c.q)(null),g=Object(oe.a)();Object(c.n)(()=>{l&&d()},[l,d]);const f=Object(c.p)(()=>r?r.map(e=>a[e]||{}).filter(Boolean):void 0,[a,r]),p=ve(()=>{if(!f||!f.length)return;const a=Object.keys(e).map(Number),c=f.map(c=>{const{unreadDialogsCount:r,hasActiveDialogs:o}=Object(h.p)(e,t,c,a,s,n)||{};return{id:c.id,badgeCount:r,isBadgeActive:o}});return Object(b.c)(c,"id")},3e3,[f,e,t,s,n]),I=Object(c.p)(()=>{if(f&&f.length)return[{title: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&&o>=I.length&&u(0)},[o,I,u]),Object(c.n)(()=>{if(j.current&&O.l&&I&&I.length)return Object(fe.b)(j.current,{onSwipe:(e,t)=>{t===fe.a.Left?u(Math.min(o+1,I.length-1)):t===fe.a.Right&&u(Math.max(0,o-1))}})},[o,I,u]);const y=Object(c.q)();y.current=0!==o,Object(c.n)(()=>y.current?Object(ne.a)(()=>{y.current&&u(0)}):void 0,[o,u]),Object(c.n)(()=>{const e=e=>{if(e.metaKey&&e.code.startsWith("Digit")&&I){const[,t]=e.code.match(/Digit(\d)/)||[];if(!t)return;if("0"===t)return void m({id:i});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:E}=Object(ee.a)(!r,void 0,!0);function w(e){const t=Object.values(a).find(({title:e})=>e===I[o].title);return t&&0!==o?c.a.createElement(Ce.a,{folderType:"folder",folderId:t.id,noChatsText:g("FilterNoChatsToDisplay"),isActive:e}):c.a.createElement(Ce.a,{folderType:"all",isActive:e})}return c.a.createElement("div",{className:"ChatFolders"},I&&I.length?c.a.createElement(ye.a,{tabs:I,activeTab:o,onSwitchTab:v}):C?c.a.createElement("div",{className:Object(Z.a)("tabs-placeholder",E)}):void 0,c.a.createElement(ce.b,{ref:j,name:g.isRtl?"slide-reversed":"slide",activeKey:o,renderCount:I?I.length:void 0},w))})),we=a(11),Me=a(17),Se=a(16);var ke=Object(c.h)(e=>{const t=Object(Me.a)(we.a.Extra,"LeftSearch");return t?c.a.createElement(t,e):c.a.createElement(Se.a,null)});var Ne=Object(c.h)(e=>{const t=Object(Me.a)(we.a.Extra,"ContactList");return t?c.a.createElement(t,e):c.a.createElement(Se.a,null)}),Pe=a(52);a(208);let Te;var Ae=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(oe.a)(),i=Object(Z.a)("NewChatButton",e&&"revealed",n&&"menu-is-open"),l=Object(c.m)(()=>{Te&&(clearTimeout(Te),Te=void 0)},[]),d=Object(c.m)(()=>{Te&&(clearTimeout(Te),Te=void 0),Te=window.setTimeout(()=>{r(!1)},750)},[]);return c.a.createElement("div",{className:i,onMouseEnter:l,onMouseLeave:d},c.a.createElement(de.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(Pe.a,{isOpen:n,positionX:"right",positionY:"bottom",autoClose:!0,onClose:()=>{r(!1)}},c.a.createElement(le.a,{icon:"channel",onClick:a},o("NewChannel")),c.a.createElement(le.a,{icon:"group",onClick:s},o("NewGroup")),c.a.createElement(le.a,{icon:"user",onClick:t},o("NewMessageTitle"))))});a(209);const xe=Object.keys(d.d).length/2;let Re;var Le=Object(c.h)(({content:e,searchQuery:t,searchDate:a,contactsFilter:s,shouldSkipTransition:n,onSearchQuery:r,onContentChange:o,onReset:i,onOpenMenu:l,onCloseMenu:b})=>{const[u,m]=Object(c.r)(O.l),h=Object(c.q)(!1),j=Object(c.m)(()=>{o(d.d.Settings)},[o]),g=Object(c.m)(()=>{o(d.d.Contacts)},[o]),f=Object(c.m)(()=>{o(d.d.NewChannelStep1)},[o]),p=Object(c.m)(()=>{o(d.d.NewGroupStep1)},[o]),I=Object(c.m)(()=>{o(d.d.Archived)},[o]),v=Object(c.m)(()=>{e===d.d.ChatList&&(h.current=!0,m(!0))},[e]),y=Object(c.m)(()=>{h.current=!1,Re&&(clearTimeout(Re),Re=void 0),Re=window.setTimeout(()=>{h.current||m(!1)},250)},[]);return Object(c.n)(()=>{let t;return e!==d.d.ChatList?t=window.setTimeout(()=>{m(!1)},250):(h.current||O.l)&&m(!0),()=>{t&&(clearTimeout(t),t=void 0)}},[e]),c.a.createElement("div",{id:"LeftColumn-main",onMouseEnter:O.l?void 0:v,onMouseLeave:O.l?void 0:y},c.a.createElement(Oe,{content:e,contactsFilter:s,onSearchQuery:r,onSelectSettings:j,onSelectContacts:g,onSelectArchived:I,onOpenMenu:l,onCloseMenu:b,onReset:i,shouldSkipTransition:n}),c.a.createElement(ge,null),c.a.createElement(ce.b,{name:n?"none":"zoom-fade",renderCount:xe,activeKey:e},n=>{switch(e){case d.d.ChatList:return c.a.createElement(Ee,null);case d.d.GlobalSearch:return c.a.createElement(ke,{searchQuery:t,searchDate:a,isActive:n,onReset:i});case d.d.Contacts:return c.a.createElement(Ne,{filter:s});default:return}}),c.a.createElement(Ae,{isShown:u,onNewPrivateChat:g,onNewChannel:f,onNewGroup:p}))});var Fe=Object(c.h)(e=>{const t=Object(Me.a)(we.a.Extra,"Settings");return t?c.a.createElement(t,e):c.a.createElement(Se.a,null)});var De=Object(c.h)(e=>{const t=Object(Me.a)(we.a.Extra,"NewChat");return t?c.a.createElement(t,e):c.a.createElement(Se.a,null)});var Be,Ue=Object(c.h)(e=>{const t=Object(Me.a)(we.a.Extra,"ArchivedChats");return t?c.a.createElement(t,e):c.a.createElement(Se.a,null)});a(210);!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"}(Be||(Be={}));const He=Object.keys(Be).length/2;var qe=Object(c.h)(Object(s.h)(e=>{const{globalSearch:{query:t,date:a},chatFolders:{activeChatFolder:s}}=e;return{searchQuery:t,searchDate:a,activeChatFolder:s}},(e,t)=>Object(b.l)(t,["setGlobalSearchQuery","setGlobalSearchChatId","resetChatCreation","setGlobalSearchDate","loadPasswordInfo","clearTwoFaError"]))(({searchQuery:e,searchDate:t,activeChatFolder:a,setGlobalSearchQuery:s,setGlobalSearchChatId:n,resetChatCreation:r,setGlobalSearchDate:o,loadPasswordInfo:l,clearTwoFaError:b})=>{const[u,m]=Object(c.r)(d.d.ChatList),[h,j]=Object(c.r)(d.m.Main),[g,f]=Object(c.r)(""),[p,I,v]=Object(se.a)(),y=Object(c.m)(e=>{e!==d.d.ChatList&&e!==d.d.NewChannelStep2&&e!==d.d.NewGroupStep2&&i.a.pushState({type:"left",contentKey:e,isMenuOpen:p}),m(e)},[p]),C=Object(c.m)((e,t=!1)=>{j(e),t||i.a.pushState({type:"left",contentKey:d.d.Settings,screen:e,isMenuOpen:p})},[p]),[E,w]=Object(c.r)(0);let M=Be.Main;switch(u){case d.d.Archived:M=Be.Archived;break;case d.d.Settings:M=Be.Settings;break;case d.d.NewChannelStep1:case d.d.NewChannelStep2:M=Be.NewChannel;break;case d.d.NewGroupStep1:case d.d.NewGroupStep2:M=Be.NewGroup}const S=Object(c.m)((e,t=!1)=>{if(u===d.d.NewGroupStep2&&!e)return t||i.a.back(),void y(d.d.NewGroupStep1);if(u===d.d.NewGroupStep1){const e=document.getElementById("new-group-picker-search");e&&e.blur()}if(u===d.d.Settings)switch(t||i.a.back(),h){case d.m.EditProfile:case d.m.Folders:case d.m.General:case d.m.Notifications:case d.m.Privacy:case d.m.Language:return void C(d.m.Main,t);case d.m.GeneralChatBackground:return void C(d.m.General,t);case d.m.GeneralChatBackgroundColor:return void C(d.m.GeneralChatBackground,t);case d.m.PrivacyPhoneNumber:case d.m.PrivacyLastSeen:case d.m.PrivacyProfilePhoto:case d.m.PrivacyForwarding:case d.m.PrivacyGroupChats:case d.m.PrivacyActiveSessions:case d.m.PrivacyBlockedUsers:case d.m.TwoFaDisabled:case d.m.TwoFaEnabled:case d.m.TwoFaCongratulations:return void C(d.m.Privacy,t);case d.m.PrivacyPhoneNumberAllowedContacts:case d.m.PrivacyPhoneNumberDeniedContacts:return void C(d.m.PrivacyPhoneNumber,t);case d.m.PrivacyLastSeenAllowedContacts:case d.m.PrivacyLastSeenDeniedContacts:return void C(d.m.PrivacyLastSeen,t);case d.m.PrivacyProfilePhotoAllowedContacts:case d.m.PrivacyProfilePhotoDeniedContacts:return void C(d.m.PrivacyProfilePhoto,t);case d.m.PrivacyForwardingAllowedContacts:case d.m.PrivacyForwardingDeniedContacts:return void C(d.m.PrivacyForwarding,t);case d.m.PrivacyGroupChatsAllowedContacts:case d.m.PrivacyGroupChatsDeniedContacts:return void C(d.m.PrivacyGroupChats,t);case d.m.TwoFaNewPassword:return void C(d.m.TwoFaDisabled,t);case d.m.TwoFaNewPasswordConfirm:return void C(d.m.TwoFaNewPassword,t);case d.m.TwoFaNewPasswordHint:return void C(d.m.TwoFaNewPasswordConfirm,t);case d.m.TwoFaNewPasswordEmail:return void C(d.m.TwoFaNewPasswordHint,t);case d.m.TwoFaNewPasswordEmailCode:return void C(d.m.TwoFaNewPasswordEmail,t);case d.m.TwoFaChangePasswordCurrent:case d.m.TwoFaTurnOff:case d.m.TwoFaRecoveryEmailCurrentPassword:return void C(d.m.TwoFaEnabled,t);case d.m.TwoFaChangePasswordNew:return void C(d.m.TwoFaChangePasswordCurrent,t);case d.m.TwoFaChangePasswordConfirm:return void C(d.m.TwoFaChangePasswordNew,t);case d.m.TwoFaChangePasswordHint:return void C(d.m.TwoFaChangePasswordConfirm,t);case d.m.TwoFaRecoveryEmail:return void C(d.m.TwoFaRecoveryEmailCurrentPassword,t);case d.m.TwoFaRecoveryEmailCode:return void C(d.m.TwoFaRecoveryEmail,t);case d.m.FoldersCreateFolder:case d.m.FoldersEditFolder:return void C(d.m.Folders,t)}t||i.a.back(),u!==d.d.ChatList||0!==a?(y(d.d.ChatList),f(""),s({query:""}),o({date:void 0}),n({id:void 0}),r(),setTimeout(()=>{w(Date.now())},250)):y(d.d.GlobalSearch)},[u,a,y,h,C,s,o,n,r]),[k,N]=Object(c.r)(!1);Object(ae.a)((e,t,a)=>{a&&"left"===a.type&&(t&&(N(!0),setTimeout(()=>{N(!1)},ce.a[O.g?"slide-layers":"push-slide"])),S(!1,!0))});const P=Object(c.m)(t=>{u!==d.d.Contacts?(y(d.d.GlobalSearch),t!==e&&s({query:t})):f(t)},[u,y,e,s]);return Object(c.n)(()=>u!==d.d.ChatList||0===a?Object(ne.a)(()=>S()):void 0,[a,u,S]),Object(c.n)(()=>{b(),h===d.m.Privacy&&l()},[b,l,h]),c.a.createElement(ce.b,{id:"LeftColumn",name:k?"none":O.g?"slide-layers":"push-slide",renderCount:He,activeKey:M},a=>{switch(M){case Be.Archived:return c.a.createElement(Ue,{isActive:a,onReset:S});case Be.Settings:return c.a.createElement(Fe,{currentScreen:h,onScreenSelect:C,onReset:S,shouldSkipTransition:k});case Be.NewChannel:return c.a.createElement(De,{key:E,isChannel:!0,content:u,onContentChange:y,onReset:S});case Be.NewGroup:return c.a.createElement(De,{key:E,content:u,onContentChange:y,onReset:S});default:return c.a.createElement(Le,{content:u,searchQuery:e,searchDate:t,contactsFilter:g,onContentChange:y,onSearchQuery:P,onReset:S,shouldSkipTransition:k,onOpenMenu:I,onCloseMenu:v})}})})),Ge=a(137),_e=a(12),We=a(13),Ve=a(55);var $e=()=>{const[e,t]=Object(c.r)(Ve.a.get());return Object(c.n)(()=>{const e=Object(f.g)(()=>{t(Ve.a.get())},250,!1);return window.addEventListener("resize",e),()=>{window.removeEventListener("resize",e)}},[]),e},ze=a(173);function Qe(e,t){const a=e<=n.eb?16:32,s=function(e){if(e>n.bb){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.ab){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.eb?54:64,r=t?s-a-c:s-a,o=e>n.eb?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}}var Ke=a(132),Ye=a(142),Je=a(133),Xe=a(49),Ze=a(106),et=a(121);var tt=Object(c.h)(e=>{const{isOpen:t}=e,a=Object(Me.a)(we.a.Extra,"HeaderMenuContainer",!t);return a?c.a.createElement(a,e):void 0});var at=Object(c.h)(Object(s.h)((e,{chatId:t,threadId:a,messageListType:s})=>{const n=Object(o.f)(e,t),c=Boolean(n&&Object(h.jb)(n));if(n&&n.isRestricted)return{noMenu:!0};const r=Object(o.O)(e,t),i="thread"===s&&a===l.MAIN_THREAD_ID,d="thread"===s&&a!==l.MAIN_THREAD_ID,b=Object(o.V)(e),u=Boolean(Object(o.K)(e,t)),m=Boolean(i&&n&&(c||Object(h.nb)(n))&&n.isNotJoined),j=i||d,g=i&&!r&&!m,f=!Object(o.R)(e),p=i&&!m;return{noMenu:!(O.g&&m||O.g&&j||g||f||p),isChannel:c,isRightColumnShown:b,canStartBot:u,canSubscribe:m,canSearch:j,canMute:g,canSelect:f,canLeave:p}},(e,t)=>Object(b.l)(t,["joinChannel","sendBotCommand","openLocalTextSearch"]))(({chatId:e,threadId:t,noMenu:a,isChannel:s,canStartBot:n,canSubscribe:r,canSearch:o,canMute:i,canSelect:l,canLeave:d,isRightColumnShown:b,joinChannel:u,sendBotCommand:m,openLocalTextSearch:h})=>{const j=Object(c.q)(null),[g,f]=Object(c.r)(!1),[p,I]=Object(c.r)(void 0),v=Object(c.m)(()=>{f(!0);const e=j.current.getBoundingClientRect();I({x:e.right,y:e.bottom})},[]),y=Object(c.m)(()=>{f(!1)},[]),C=Object(c.m)(()=>{I(void 0)},[]),E=Object(c.m)(()=>{u({chatId:e})},[u,e]),w=Object(c.m)(()=>{m({command:"/start"})},[m]),M=Object(c.m)(()=>{if(h(),O.g){document.querySelector("#MobileSearch input").focus()}else setTimeout(()=>{const e=document.querySelector(".RightHeader .SearchInput input");e&&e.focus()},400)},[h]),S=Object(oe.a)();return c.a.createElement("div",{className:"HeaderActions"},!O.g&&r&&c.a.createElement(de.a,{size:"tiny",ripple:!0,fluid:!0,onClick:E},S(s?"Subscribe":"Join Group")),!O.g&&n&&c.a.createElement(de.a,{size:"tiny",ripple:!0,fluid:!0,onClick:w},S("Start")),!O.g&&o&&c.a.createElement(de.a,{round:!0,ripple:b,color:"translucent",size:"smaller",onClick:M,ariaLabel:"Search in this chat"},c.a.createElement("i",{className:"icon-search"})),(O.g||!r)&&c.a.createElement(de.a,{ref:j,className:g?"active":"",round:!0,ripple:!O.g,size:"smaller",color:"translucent",disabled:a,ariaLabel:"More actions",onClick:v},c.a.createElement("i",{className:"icon-more"})),p&&c.a.createElement(tt,{chatId:e,threadId:t,isOpen:g,anchor:p,isChannel:s,canSubscribe:r,canSearch:o,canMute:i,canSelect:l,canLeave:d,onSubscribeChannel:E,onSearchClick:M,onClose:y,onCloseAnimationEnd:C}))})),st=a(112),nt=a(22),ct=a(105),rt=a(44);function ot(e){const t=e&&Object(h.E)(e),{sticker:a}=e&&e.content||{},s=t&&a&&!Object(O.p)()&&t.includes("image/webp"),[r,o]=Object(c.r)(rt.a),i=e&&e.id;return Object(c.o)(()=>{s&&Object(rt.c)("b64-"+i,t).then(o).catch(e=>{n.p&&console.error(e)})},[i,s,t]),s?r:t}var it=a(114),lt=a(43);function dt(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 bt=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=dt(0,0,2,t,1)+dt(0,12,2,t+1,1)+dt(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(Z.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 ut=Object(c.h)(({message:e,count:t,index:a,customTitle:s,className:n,onUnpinMessage:r,onClick:o,onAllPinnedClick:i})=>{const l=Object(oe.a)(),d=ot(e),b=Object(ct.a)(Object(h.D)(e,"pictogram")),u=Object(h.N)(l,e,Boolean(d)),[m,O,j]=Object(se.a)(),g=Object(c.m)(()=>{j(),r&&r(e.id)},[j,r,e.id]);return c.a.createElement("div",{className:Object(Z.a)("HeaderPinnedMessage-wrapper",n)},t>1&&c.a.createElement(de.a,{round:!0,size:"smaller",color:"translucent",className:"pin-list-button",ariaLabel:l("EventLogFilterPinnedMessages"),onClick:i},c.a.createElement("i",{className:"icon-pin-list"})),r&&c.a.createElement(de.a,{round:!0,size:"smaller",color:"translucent",ariaLabel:l("UnpinMessageAlertTitle"),className:"unpin-button",onClick:O},c.a.createElement("i",{className:"icon-close"})),c.a.createElement(it.a,{isOpen:m,onClose:j,text:"Would you like to unpin this message?",confirmLabel:"Unpin",confirmHandler:g}),c.a.createElement("div",{className:"HeaderPinnedMessage",onClick:o,dir:l.isRtl?"rtl":void 0},c.a.createElement(bt,{count:t,index:a}),d&&function(e,t){const{width:a,height:s}=Object(st.k)();return c.a.createElement("img",{src:t||e,width:a,height:s,alt:""})}(d,b),c.a.createElement("div",{className:"message-text"},c.a.createElement("div",{className:"title",dir:"auto"},s||`${l("PinnedMessage")} ${a>0?"#"+(t-a):""}`),c.a.createElement("p",{dir:"auto"},Object(nt.a)(u))),c.a.createElement(lt.a,null)))}),mt=a(53),ht=a(174);a(213);var Ot=Object(s.h)((e,{message:t})=>({sender:Object(o.sb)(e,t)}),(e,t)=>Object(b.l)(t,["focusMessage","closeAudioPlayer"]))(({message:e,className:t,noUi:a,sender:s,focusMessage:n,closeAudioPlayer:r})=>{const o=Object(oe.a)(),i=s?Object(h.V)(o,s):void 0,l=mt.c(Object(h.D)(e,"inline")),{playPause:d,isPlaying:b}=Object(ht.a)(Object(h.A)(e),Object(h.r)(e),l,void 0,void 0,!0),u=Object(c.m)(()=>{n({chatId:e.chatId,messageId:e.id})},[n,e.chatId,e.id]),m=Object(c.m)(()=>{b&&d(),r()},[r,b,d]);if(a)return;const j=Object(h.u)(e);return c.a.createElement("div",{className:Object(Z.a)("AudioPlayer",t),dir:o.isRtl?"rtl":void 0},c.a.createElement(de.a,{round:!0,ripple:!O.g,color:"translucent",size:"smaller",className:Object(Z.a)("toggle-play",b?"pause":"play"),onClick:d,ariaLabel:b?"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:u},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(nt.a)(t||s)),a&&c.a.createElement("div",{className:"subtitle",dir:"auto"},Object(nt.a)(a)))}(j):function(e,t){return c.a.createElement(c.a.Fragment,null,c.a.createElement("div",{className:"title",dir:"auto"},t&&Object(nt.a)(t)),c.a.createElement("div",{className:"subtitle",dir:"auto"},e))}(o("AttachAudio"),i),c.a.createElement(lt.a,null)),c.a.createElement(de.a,{round:!0,className:"player-close",color:"translucent",size:"smaller",onClick:m,ariaLabel:"Close player"},c.a.createElement("i",{className:"icon-close"})))});a(214);var jt=Object(c.h)(Object(s.h)((e,{chatId:t,threadId:a,messageListType:s})=>{const{isLeftColumnShown:n,lastSyncTime:c}=e,{byId:r}=e.chats,i=Object(o.f)(e,t),{typingStatus:d}=i||{},{chatId:b,messageId:u}=e.audioPlayer,m=b&&u?Object(o.k)(e,b,u):void 0,h=Object(o.Cb)(e,t,a);let O;if("pinned"===s){const a=Object(o.ib)(e,t);O=a&&a.length}else if("scheduled"===s){const a=Object(o.nb)(e,t);O=a&&a.length}else if("thread"===s&&a!==l.MAIN_THREAD_ID){const s=Object(o.Bb)(e,t,a);s&&(O=s.messagesCount)}const j={typingStatus:d,isLeftColumnShown:n,isRightColumnShown:Object(o.V)(e),isSelectModeActive:Object(o.R)(e),audioMessage:m,chat:i,chatsById:r,originChatId:h?h.id:t,messagesCount:O,isChatWithSelf:Object(o.O)(e,t),isChatWithBot:i&&Object(o.N)(e,i),lastSyncTime:c,notifySettings:Object(o.db)(e),notifyExceptions:Object(o.cb)(e)},g=Object(o.m)(e,t);if("thread"!==s||!g)return j;if(Object.assign(j,{messagesById:g}),a!==l.MAIN_THREAD_ID){const s=Object(o.Db)(e,t,a),n=s?Object(o.k)(e,t,s):void 0,c=n?Object(o.J)(e,n):void 0;return{...j,pinnedMessageIds:s,canUnpin:!1,topMessageSender:c}}const f=Object(o.ib)(e,t);if(f&&f.length){const t=g[f[0]],{canUnpin:s}=t&&Object(o.b)(e,t,a)||{};return{...j,pinnedMessageIds:f,canUnpin:s}}return j},(e,t)=>Object(b.l)(t,["openChatWithInfo","pinMessage","focusMessage","openChat","loadPinnedMessages","toggleLeftColumn","exitMessageSelectMode"]))(({chatId:e,threadId:t,messageListType:a,pinnedMessageIds:s,messagesById:r,canUnpin:o,topMessageSender:i,typingStatus:d,isSelectModeActive:b,isLeftColumnShown:u,isRightColumnShown:m,audioMessage:j,chat:g,chatsById:f,originChatId:p,messagesCount:I,isChatWithSelf:v,isChatWithBot:y,lastSyncTime:C,notifySettings:E,notifyExceptions:w,openChatWithInfo:M,pinMessage:S,focusMessage:k,openChat:N,loadPinnedMessages:P,toggleLeftColumn:T,exitMessageSelectMode:A})=>{const x=Object(oe.a)(),[R,L]=Object(c.r)(0),F=Array.isArray(s)?s[R]:s,D=r&&F?r[F]:void 0,B=Array.isArray(s)?s.length:s?1:0,U=g&&Object(h.l)(x,g).length,H=i?Object(h.V)(x,i):void 0;Object(c.n)(()=>{t===l.MAIN_THREAD_ID&&C&&P({chatId:e})},[e,P,C,t]),Object(c.n)(()=>{L(0)},[s]),Object(Ye.a)(e,F,D);const{width:q}=$e(),G=q<=n.ab,_=q>=n.eb&&u,W=Object(c.q)(null),V=Object(c.q)(!0),$=Object(c.m)(()=>{M({id:e})},[M,e]),z=Object(c.m)(t=>{S({chatId:e,messageId:t,isUnpin:!0})},[S,e]),Q=Object(c.m)(()=>{if(D){k({chatId:D.chatId,threadId:t,messageId:D.id});const e=Object(Ke.a)(B,R+1);L(e)}},[D,k,t,B,R]),K=Object(c.m)(()=>{N({id:e,threadId:l.MAIN_THREAD_ID,type:"pinned"})},[N,e]),Y=Object(c.m)(()=>{if(O.g){const e=document.getElementById(n.v);e&&e.blur()}t!==l.MAIN_THREAD_ID||"thread"!==a?("scheduled"===a&&b&&A(),N({id:p,threadId:l.MAIN_THREAD_ID})):O.g?N({id:void 0}):T()},[N,p,t,a,T,b,A]),J=Object(c.p)(()=>{if(!G||!f)return;let e=!1;const t=Object.values(f).reduce((t,a)=>{if(Object(h.hb)(a))return t;const s=a.unreadCount||0;return!s||Object(h.Cb)(a,E,w)&&!a.unreadMentionsCount||(e=!0),t+s},0);return t?{isActive:e,totalCount:t}:void 0},[G,f,E,w]),X=q>=n.ab&&qn.eb&&q30),te=X||q>n.bb&&q{const e=W.current;if(e)return te&&ue?void(m||X?(V.current&&(e.classList.add("tools-stacked","animated"),V.current=!1),setTimeout(()=>{e.classList.remove("animated")},350)):(e.classList.remove("tools-stacked"),V.current=!0)):(e.classList.remove("tools-stacked","animated"),void(V.current=!0))},[te,ue,X,m]),c.a.createElement("div",{className:"MiddleHeader",ref:W},c.a.createElement(ce.b,{name:"slide-fade",activeKey:"thread"===a?t:1},me),c.a.createElement("div",{className:"header-tools"},re&&le&&!ae&&c.a.createElement(ut,{key:e,message:le,count:B,index:R,customTitle:be,className:ie,onUnpinMessage:o?z:void 0,onClick:Q,onAllPinnedClick:K}),ae&&ne&&c.a.createElement(Ot,{key:Object(h.A)(ne),message:ne,className:se}),c.a.createElement(at,{chatId:e,threadId:t,messageListType:a})))})),gt=a(157);function ft(e){return"albumId"in e}function pt(e,t){let a,s=[],n={originalDate:e[0].date,datetime:Number(Object(R.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(R.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(h.db)(r)||Object(h.db)(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)&&(s=[],n.senderGroups.push(s))}}),c}var It=a(104);function vt(){const[e,t]=Object(se.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 yt=a(153),Ct=a(122);let Et=!1;var wt=({containerRef:e,className:t,messageIds:a,focusingId:s,loadMoreForwards:r,loadMoreBackwards:o,isViewportNewest:i,firstUnreadId:l,onFabToggle:d,onNotchToggle:b,children:u})=>{const m=Object(c.q)(null),h=Object(c.q)(null),O=Object(c.q)(null),j=Object(c.m)(()=>{if(Et)return;if(!a||!a.length)return d(!1),void b(!1);if(!i)return d(!0),void b(!0);const{offsetHeight:t,scrollHeight:s,scrollTop:n}=e.current,c=s-n-t,r=c<=0;d(l?!r:!(c<=50)),b(!r)},[a,i,e,d,l,b]),{observe:g,freeze:f,unfreeze:p}=Object(It.a)({rootRef:e,margin:n.V},t=>{if(!r||!o)return;const a=t.find(({isIntersecting:e})=>e);if(!a)return;const{target:s}=a;"backwards-trigger"===s.className?(Object(yt.a)(e.current),o()):"forwards-trigger"===s.className&&(Object(yt.a)(e.current),r())});Object(It.c)(m,g),Object(It.c)(h,g);const{observe:I,freeze:v,unfreeze:y}=Object(It.a)({rootRef:e,margin:50},j);Object(It.c)(O,I);const{observe:C}=Object(It.a)({rootRef:e},j);return Object(It.c)(O,C),Object(pe.a)(()=>{s?(f(),v()):(y(),p())},[s]),Object(pe.a)(()=>{Et=!0,setTimeout(()=>{Et=!1},100)},[a]),Object(c.n)(j,[l]),c.a.createElement("div",{className:t,teactFastList:!0},c.a.createElement("div",{ref:m,key:"backwards-trigger",className:"backwards-trigger"}),u,c.a.createElement("div",{ref:h,key:"forwards-trigger",className:"forwards-trigger"}),c.a.createElement("div",{ref:O,key:"fab-trigger",className:"fab-trigger"}))},Mt=a(143),St=a(144);function kt(e){return"number"==typeof e}function Nt(e,t){return e?t?238:175:100}function Pt(e){const t=Object(h.tb)(e),a=Object(h.qb)(e),s=Object(h.G)(e)||Object(h.R)(e),n=Object(h.P)(e),c=Boolean(Object(h.R)(e)),{width:r,height:o}=s?Object(st.f)(s,t,a,c):Object(st.h)(n,t,a),i=Nt(Boolean(Object(h.O)(e)));let l=1;re+t,t)}function Dt(e,t,a){return ea?a:e}function Bt(e){const t={width:0,height:0};return e.forEach(({dimensions:e,sides:a})=>{a&xt&&(t.width=e.width+e.x),a&Rt&&(t.height=e.height+e.y)}),t}function Ut(e,t,a,s){const c=a.messages.map(e=>{const t=Pt(e);return t.width/t.height});const r=function(e){return e.map(e=>e>1.2?"w":e<.8?"n":"q").join("")}(c),o=function(e){return e.reduce((e,t)=>t+e,1)/e.length}(c),i=c.length,l=c.some(e=>e>2),d=function(e,t,a){return a<=n.eb?a/100*69-(t?1.625:0)*st.c:((e?30:29)-(t?1.625:0))*st.c}(e,t,s);let b;const u={ratios:c,proportions:r,averageRatio:o,maxWidth:d,minWidth:100,maxHeight:d,spacing:2};return b=i>=5||l?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?Dt(e,1,2.75):Dt(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=Ft(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:Lt|At|xt},{dimensions:{x:0,y:c+s,width:a,height:c},sides:Lt|Rt|xt}]}(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:At|Lt|Rt},{dimensions:{x:c+s,y:0,width:c,height:r},sides:At|xt|Rt}]}(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:At|Lt|Rt},{dimensions:{x:i+n,y:0,width:o,height:l},sides:At|xt|Rt}]}(e)}(u):3===i?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:At|Lt|Rt},{dimensions:{x:d+a,y:0,width:l,height:i},sides:At|xt},{dimensions:{x:d+a,y:i+a,width:l,height:o},sides:Rt|xt}]}(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:Lt|At|xt},{dimensions:{x:0,y:r+n,width:o,height:i},sides:Rt|Lt},{dimensions:{x:o+n,y:r+n,width:c-o-n,height:i},sides:Rt|xt}]}(e)}(u):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:Lt|At|xt},{dimensions:{x:0,y:r+a,width:i,height:b},sides:Rt|Lt},{dimensions:{x:i+a,y:r+a,width:d,height:b},sides:Rt},{dimensions:{x:i+a+d+a,y:r+a,width:l,height:b},sides:xt|Rt}]}(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:At|Lt|Rt},{dimensions:{x:r+s,y:0,width:b,height:i},sides:At|xt},{dimensions:{x:r+s,y:i+s,width:b,height:l},sides:xt},{dimensions:{x:r+s,y:i+l+2*s,width:b,height:d},sides:Rt|xt}]}(e)}(u),{layout:b,containerStyle:Bt(b)}}let Ht;function qt(e){return Ht||(Ht=document.createElement("span"),Ht.style.font='400 12px Roboto, "Helvetica Neue", "Apple Color Emoji", sans-serif',Ht.style.whiteSpace="nowrap",Ht.style.position="absolute",Ht.style.left="-999px",Ht.style.opacity=".01",document.body.appendChild(Ht)),Ht.innerHTML=e,Ht.offsetWidth}function Gt(e,t,a,s,n){Object(c.o)(()=>{if(a&&e.current){const t=e.current.closest(".MessageList");Object(Ct.a)(t,e.current,n?"end":"center",20,void 0===s?1500:1e3,s)}},[e,t,a,s,n])}var _t=a(109),Wt=a(66);var Vt=Object(c.h)(e=>{const{isOpen:t}=e,a=Object(Me.a)(we.a.Extra,"ContextMenuContainer",!t);return a?c.a.createElement(a,e):void 0});var $t=Object(c.h)(Object(s.h)((e,{message:t})=>{const a=t.senderId,{targetUserId:s,targetChatId:n}=t.content.action||{},c=t.replyToMessageId,r=c?Object(o.k)(e,t.chatId,c):void 0,i=Object(o.T)(e,t),{direction:l,noHighlight:d}=i&&e.focusedMessage||{},b=Object(o.f)(e,t.chatId);return{sender:b&&(Object(h.jb)(b)||a===t.chatId)?b:a?Object(o.Fb)(e,a):void 0,...s&&{targetUser:Object(o.Fb)(e,s)},targetChatId:n,targetMessage:r,isFocused:i,...i&&{focusDirection:l,noFocusHighlight:d}}})(({message:e,observeIntersection:t,isEmbedded:a,appearanceOrder:s=0,isLastInList:n,sender:r,targetUser:o,targetMessage:i,targetChatId:l,isFocused:d,focusDirection:b,noFocusHighlight:u})=>{const m=Object(c.q)(null);Object(It.c)(m,t),Object(Ye.a)(e.chatId,e.replyToMessageId,i),Gt(m,e.chatId,d,b,u);const h=Object(oe.a)(),O=s<=0,[j,g]=Object(se.a)(O);Object(c.n)(()=>{O||setTimeout(g,10*s)},[s,g,O]);const{transitionClassNames:f}=Object(ee.a)(j,void 0,O,!1),p=Object(Wt.a)(h,e,r,o,i,l,a?{isEmbedded:!0,asPlain:!0}:void 0),{isContextMenuOpen:I,contextMenuPosition:v,handleBeforeContextMenu:y,handleContextMenu:C,handleContextMenuClose:E,handleContextMenuHide:w}=Object(Mt.a)(m),M=void 0!==v;if(a)return c.a.createElement("span",{className:"embedded-action-message"},Object(nt.a)(p));const S=Object(Z.a)("ActionMessage message-list-item",d&&!u&&"focused",M&&"has-menu-open",n&&"last-in-list",f);return c.a.createElement("div",{ref:m,id:"message"+e.id,className:S,"data-message-id":e.id,onMouseDown:y,onContextMenu:C},c.a.createElement("span",null,p),v&&c.a.createElement(Vt,{isOpen:I,anchor:v,message:e,messageListType:"thread",onClose:E,onCloseAnimationEnd:w}))}));a(215);var zt=({className:e,message:t,sender:a,title:s,customText:n,observeIntersection:r,onClick:o})=>{const i=Object(c.q)(null),l=Object(It.b)(i,r),d=Object(ct.a)(t&&Object(h.D)(t,"pictogram"),!l),b=t&&"sticker-reply-thumb"+t.id,u=ot(t),m=Boolean(t&&Object(h.I)(t)),O=Object(oe.a)(),j=a&&Object(h.V)(O,a);return c.a.createElement("div",{ref:i,className:Object(Z.a)("EmbeddedMessage",e),onClick:t?o:void 0},u&&function(e,t,a,s){const{width:n,height:r}=Object(st.k)();return c.a.createElement("img",{id:e,src:a||t,width:n,height:r,alt:"",className:s?"round":""})}(b,u,d,m),c.a.createElement("div",{className:"message-text"},c.a.createElement("p",{dir:"auto"},t?Object(h.db)(t)?c.a.createElement($t,{message:t,isEmbedded:!0}):Object(nt.a)(Object(h.N)(O,t,Boolean(u))):n||" "),c.a.createElement("div",{className:"message-title",dir:"auto"},Object(nt.a)(j||s||" "))))},Qt=a(158),Kt=a(165),Yt=a(170);a(219);var Jt=Object(c.h)(({message:e,outgoingStatus:t,signature:a,onClick:s})=>{const n=Object(oe.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(Xe.b)(e.views)),c.a.createElement("i",{className:"icon-channelviews"})),a&&c.a.createElement("span",{className:"message-signature"},Object(nt.a)(a)),c.a.createElement("span",{className:"message-time"},e.isEdited&&n("EditedMessage")+" ",Object(R.h)(1e3*e.date)),t&&c.a.createElement(Yt.a,{status:t}))}),Xt=a(111),Zt=a(113),ea=a(159);a(220);var ta=({message:e,observeIntersection:t,observeIntersectionForPlaying:a,shouldLoop:s,lastSyncTime:r})=>{const o=Object(c.q)(null),[i,l,d]=Object(se.a)(),b=e.content.sticker,{isAnimated:u,stickerSetId:m}=b,O=m===n.T,j=Object(It.b)(o,t),g=Object(It.b)(o,a),f=b.isPreloadedGlobally?"sticker"+b.id:Object(h.D)(e,"inline"),p=ot(e),I=Object(ct.a)(f,!j,Object(h.C)(e,"inline",!0),r),v=Boolean(I),[y,C]=Object(se.a)(v),E=u?y:v,{shouldRenderFullMedia:w,transitionClassNames:M}=Object(Xt.a)(E,"slow"),{width:S,height:k}=Object(st.l)(b),N=Object(Z.a)("thumbnail",!p&&"empty"),P=Object(Z.a)("Sticker media-inner",O&&"inactive");return c.a.createElement("div",{ref:o,className:P,onClick:O?void 0:l},!E&&c.a.createElement("img",{id:"sticker-thumb-"+e.id,src:p,width:S,height:k,alt:"",className:N}),!u&&w&&c.a.createElement("img",{id:"sticker-"+e.id,src:I,width:S,height:k,alt:"",className:Object(Z.a)("full-media",M)}),u&&v&&c.a.createElement(Zt.a,{key:f,className:Object(Z.a)("full-media",M),id:f,animationData:I,size:S,play:g,noLoop:!s,onLoad:C}),c.a.createElement(ea.a,{isOpen:i,fromSticker:b,onClose:d}))},aa=a(126),sa=a(118),na=a(160);function ca(e,t){return Object(na.a)(Object(h.E)(e),Boolean(t),O.g&&!O.c)}var ra=a(37);var oa=async(e,t,a,s)=>s?"rgba(255,255,255,1)":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(119);var la=({id:e,message:t,observeIntersection:a,shouldAutoLoad:s,isInSelectMode:n,isSelected:r,uploadProgress:o,size:i="inline",dimensions:l,nonInteractive:d,shouldAffectAppendix:b,onClick:u,onCancelUpload:m})=>{const O=Object(c.q)(null),j=(Object(h.G)(t)||Object(h.R)(t)).blobUrl,g=Object(It.b)(O,a),[f,p]=Object(c.r)(s),I=f&&g,{mediaData:v,downloadProgress:y}=Object(sa.a)(Object(h.D)(t,i),!I),C=j||v,E=ca(t,C),{isUploading:w,isTransferring:M,transferProgress:S}=Object(h.s)(t,o||y,I&&!C),k=!1===Object(ra.a)(f),{shouldRender:N,transitionClassNames:P}=Object(ee.a)(M,void 0,k,"slow"),{shouldRenderThumb:T,shouldRenderFullMedia:A,transitionClassNames:x}=Object(Xt.a)(C,"slow"),R=Object(c.m)(()=>{w?m&&m(t):C?u&&u(t.id):p(e=>!e)},[C,w,t,m,u]),L=Object(h.tb)(t);Object(c.o)(()=>{if(!b)return;const e=O.current.closest(".message-content");C?oa(C,L,0,r).then(t=>{e.style.setProperty("--appendix-bg",t),e.setAttribute("data-has-custom-appendix","")}):e.classList.add("has-appendix-thumb")},[C,L,b,n,r]);const{width:F,height:D,isSmall:B}=l||Pt(t),U=Object(Z.a)("media-inner",!w&&!d&&"interactive",B&&"small-image",F===D&&"square-image"),H=l?`width: ${F}px; height: ${D}px; left: ${l.x}px; top: ${l.y}px;`:"";return c.a.createElement("div",{id:e,ref:O,className:U,style:H,onClick:w?void 0:R},T&&c.a.createElement("canvas",{ref:E,className:"thumbnail",style:`width: ${F}px; height: ${D}px`}),A&&c.a.createElement("img",{src:C,className:"full-media "+x,width:F,height:D,alt:""}),N&&c.a.createElement("div",{className:"media-loading "+P},c.a.createElement(ia.a,{progress:S,onClick:w?R:void 0})),!C&&!f&&c.a.createElement("i",{className:"icon-download"}),M&&c.a.createElement("span",{className:"message-upload-progress"},Math.round(100*S),"%"))},da=a(135),ba=a(134);function ua(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(ba.a)(e.current)},[e]);Object(X.a)(s,n)}var ma=a(145),ha=(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(ba.a)(e.current),a.current=!1,s.current=!1},[t,e]),o=Object(c.m)(()=>{Object(f.b)(r)},[r]);document.hasFocus()||n(),Object(te.a)(n,o)};function Oa(){return(Oa=Object.assign||function(e){for(var t=1;t{const b=Object(c.q)(null),u=Object(c.q)(null),m=t.content.video,O=m.blobUrl,j=Boolean(O)||Object(h.b)(m),g=Object(It.b)(b,a),[f,p]=Object(c.r)(s),I=Boolean(f&&g&&o),[v,y]=Object(c.r)(n),C=Object(ct.a)(Object(h.D)(t,"pictogram"),!(g&&o),Object(h.C)(t,"pictogram"),o),E=ca(t),{mediaData:w,downloadProgress:M}=Object(sa.a)(Object(h.D)(t,"inline"),!I,Object(h.C)(t,"inline"),o),S=O||w,k=Boolean(j&&g&&S),{isBuffered:N,bufferingHandlers:P}=Object(da.a)(!s),{isUploading:T,isTransferring:A,transferProgress:x}=Object(h.s)(t,r||M,I&&j&&!N),L=!1===Object(ra.a)(f),{shouldRender:F,transitionClassNames:D}=Object(ee.a)(A,void 0,L),{shouldRenderThumb:B,transitionClassNames:U}=Object(Xt.a)(S,"slow"),[H,q]=Object(c.r)(0),G=Object(c.m)(e=>{q(Math.max(0,e.currentTarget.currentTime-1))},[]),_=Object(h.tb)(t),W=Object(h.qb)(t),{width:V,height:$}=i||Object(st.h)(m,_,W);ua(u,Boolean(k&&n)),ha(u,v),Object(ma.a)(u,[k]);const z=Object(c.m)(()=>{T?d&&d(t):j&&!S?p(e=>!e):j&&S&&!v?(y(!0),u.current.play()):l&&l(t.id)},[T,j,S,v,l,d,t]),Q=Object(Z.a)("media-inner dark",!T&&"interactive"),K=Object(Z.a)("full-media",U),Y=i?`width: ${V}px; height: ${$}px; left: ${i.x}px; top: ${i.y}px;`:"",J=k,X=!j&&w,te=!j||f&&!v&&!F,ae=j&&!f;return c.a.createElement("div",{ref:b,id:e,className:Q,style:Y,onClick:T?void 0:z},(!k||B)&&c.a.createElement("canvas",{ref:E,className:"thumbnail",style:`width: ${V}px; height: ${$}px;`}),C&&c.a.createElement("img",{src:C,className:"thumbnail",style:`width: ${V}px; height: ${$}px;`,alt:""}),J&&c.a.createElement("video",Oa({ref:u,className:K,width:V,height:$,autoPlay:v,muted:!0,loop:!0,playsInline:!0},P,{onTimeUpdate:G}),c.a.createElement("source",{src:S})),X&&c.a.createElement("img",{src:w,className:"full-media "+U,width:V,height:$,alt:""}),te&&c.a.createElement("i",{className:"icon-large-play"}),F&&c.a.createElement("div",{className:"media-loading "+D},c.a.createElement(ia.a,{progress:x,onClick:T?z:void 0})),ae&&c.a.createElement("i",{className:"icon-download"}),A&&!j?c.a.createElement("span",{className:"message-upload-progress"},Math.round(100*x),"%"):A&&j?c.a.createElement("span",{className:"message-upload-progress"},"..."):c.a.createElement("div",{className:"message-media-duration"},m.isGif?"GIF":Object(R.e)(m.duration-H)))},ga=a(18);a(222);var fa=Object(s.h)((e,{contact:t})=>({user:Object(o.Fb)(e,t.userId)}),(e,t)=>Object(b.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(Z.a)("Contact",Boolean(o)&&"interactive"),onClick:o?i:void 0},c.a.createElement(_t.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(ga.c)(r))))}),pa=a(46);var Ia=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(pa.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})))}),va=a(124),ya=a(178);a(225);function Ca(e,t){return t>0?(e/t*100).toFixed():0}var Ea=({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?Ca(o.votersCount,a||0):0,[b,u]=Object(c.r)(r?0:d),m=Object(c.q)(null),h=o?Ca(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(Z.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(nt.a)(e.text)),c.a.createElement("div",{className:Object(Z.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(226);var wa=Object(c.h)(Object(s.h)((e,{poll:t})=>{const{recentVoterIds:a}=t.results,{byId:s}=e.users;return a&&0!==a.length?{recentVoterIds:a,usersById:s}:{}},(e,t)=>Object(b.l)(t,["loadMessage","openPollResults"]))(({message:e,poll:t,recentVoterIds:a,usersById:s,loadMessage:n,onSendVote:r,openPollResults:o})=>{const{id:i,chatId:l}=e,{summary:d,results:b}=t,[u,m]=Object(c.r)(!1),[h,O]=Object(c.r)([]),[j,g]=Object(c.r)(!1),[f,p]=Object(c.r)(!1),[I,v]=Object(c.r)(!d.closed&&d.closeDate&&d.closeDate>0?Math.min(d.closeDate-Math.floor(Date.now()/1e3),d.closePeriod):0),y=Object(c.q)(null),{results:C,totalVoters:E}=b,w=C&&C.some(e=>e.isChosen),M=!d.closed&&!w,S=!M&&d.isPublic&&Number(b.totalVoters)>0,k=M&&d.multipleChoice,N=C?Math.max(...C.map(e=>e.votersCount)):E,P=C?C.reduce((e,t)=>(t.isCorrect&&e.push(t.option),e),[]):[],T=d.answers.map(e=>({label:e.text,value:e.option,hidden:Boolean(d.quiz&&d.closePeriod&&I<=0)}));Object(c.n)(()=>{u&&t.results.results&&t.results.results.some(e=>e.isChosen)&&m(!1)},[u,t.results.results]),Object(c.n)(()=>{I>0&&setTimeout(()=>v(I-1),1e3);const e=y.current;if(e){const t=12*Math.PI,a=e.lastElementChild,s=e.firstElementChild;if(I<=5&&e.classList.add("hurry-up"),a&&s){const e=(d.closePeriod-I)/d.closePeriod*t;s.textContent=Object(R.e)(I),a.firstElementChild.setAttribute("stroke-dashoffset","-"+e)}else e.innerHTML=`\n ${Object(R.e)(I)}\n \n \n `}},[I,d.closePeriod]),Object(c.n)(()=>{d.quiz&&(I<=0||w&&!d.closed)&&n({chatId:l,messageId:i})},[l,I,w,n,i,d.closed,d.quiz]),Object(c.n)(()=>{let e;return d.quiz&&!d.closed&&d.closePeriod&&d.closePeriod>0&&(e=window.setTimeout(()=>{n({chatId:l,messageId:i})},1e3*d.closePeriod)),()=>{e&&window.clearTimeout(e)}},[M,l,n,i,d.closePeriod,d.closed,d.quiz]);const A=Object(c.p)(()=>a?a.reduce((e,t)=>{const a=s[t];return a&&e.push(a),e},[]):[],[s,a]),x=Object(c.m)(e=>{O([e]),m(!0),p(!0),r([e])},[r]),L=Object(c.m)(e=>{O(e)},[]),F=Object(c.m)(()=>{m(!0),p(!0),r(h)},[r,h]),D=Object(c.m)(()=>{o({chatId:l,messageId:i})},[l,i,o]),B=Object(c.m)(()=>{g(!0)},[]),U=Object(c.m)(()=>{g(!1),p(!1)},[]);Object(c.n)(()=>{if(f&&w&&d.quiz&&b.results&&t.results.solution){b.results.find(e=>e.isChosen&&e.isCorrect)||g(!0)}},[w,f,b.results,d.quiz,t.results.solution]);const H=Object(oe.a)();return c.a.createElement("div",{className:"Poll",dir:H.isRtl?"auto":"ltr"},j&&t.results.solution&&c.a.createElement(ya.a,{message:Object(St.b)(t.results.solution,t.results.solutionEntities),duration:5e3,onDismiss:U,containerId:"#middle-column-portals"}),c.a.createElement("div",{className:"poll-question"},Object(nt.a)(d.question)),c.a.createElement("div",{className:"poll-type"},H(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"}(d)),A.length>0&&c.a.createElement("div",{className:"poll-recent-voters"},A.map(e=>c.a.createElement(_t.a,{size:"micro",user:e}))),I>0&&M&&c.a.createElement("div",{ref:y,className:"poll-countdown"}),d.quiz&&t.results.solution&&!M&&c.a.createElement(de.a,{round:!0,size:"tiny",color:"translucent",className:"poll-quiz-help",disabled:j,onClick:B,ariaLabel:"Show Solution"},c.a.createElement("i",{className:"icon-lamp"}))),M&&c.a.createElement("div",{className:"poll-answers"},k?c.a.createElement(Ia,{options:T,onChange:L,disabled:e.isScheduled||u,loadingOptions:u?h:void 0,round:!0}):c.a.createElement(va.a,{name:"poll-"+i,options:T,onChange:x,disabled:e.isScheduled||u,loadingOption:u?h[0]:void 0})),!M&&c.a.createElement("div",{className:"poll-results"},d.answers.map((function(e){return c.a.createElement(Ea,{key:e.option,shouldAnimate:f,answer:e,voteResults:C,totalVoters:E,maxVotersCount:N,correctResults:P})}))),!S&&!k&&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")}(H,d.quiz,b.totalVoters)),k&&c.a.createElement(de.a,{isText:!0,disabled:0===h.length,size:"tiny",onClick:F},H("PollSubmitVotes")),S&&c.a.createElement(de.a,{isText:!0,size:"tiny",onClick:D},H("PollViewResults")))})),Ma=a(40),Sa=a(56);a(227);var ka=Object(c.h)(({message:e,observeIntersection:t,shouldAutoLoad:a,inPreview:s,onMediaClick:n,onCancelMediaTransfer:r})=>{const o=Object(h.Q)(e);let i=!1;if(o&&o.photo){const{width:t,height:a}=Pt(e);i=t===a}const l=Object(c.m)(()=>{n()},[n]);if(!o)return;const{siteName:d,url:b,displayUrl:u,title:m,description:O,photo:j}=o,g=j&&n&&!i&&!o.hasDocument,f=Object(Ma.a)(O,170),p=Object(Z.a)("WebPage",j?i&&"with-square-photo":!s&&"without-photo");return c.a.createElement("div",{className:p,"data-initial":(d||u)[0],dir:"auto"},j&&c.a.createElement(la,{message:e,observeIntersection:t,shouldAutoLoad:a,size:i?"pictogram":"inline",nonInteractive:!g,onClick:g?l:void 0,onCancelUpload:r}),c.a.createElement("div",{className:"WebPage-text"},c.a.createElement(Sa.a,{className:"site-name",url:b,text:d||u}),!s&&m&&c.a.createElement("p",{className:"site-title"},Object(nt.a)(m)),f&&c.a.createElement("p",{className:"site-description"},Object(nt.a)(f,["emoji","br"]))))});a(228);var Na=Object(c.h)(({message:e})=>{const t=Object(h.z)(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(nt.a)(a)),s&&c.a.createElement("p",null,Object(nt.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(nt.a)(n,["emoji","br"]))))});function Pa(e){return Object(c.h)(Object(s.h)((e,t)=>{const{message:a}=t;return{isInSelectMode:Object(o.R)(e),isSelected:Object(o.U)(e,a.id)}},(e,t)=>Object(b.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(Z.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(229);const Ta=Pa(la),Aa=Pa(ja);var xa=Object(s.h)(e=>({uploadsById:e.fileUploads.byMessageLocalId}),(e,t)=>Object(b.l)(t,["cancelSendingMessage"]))(({album:e,observeIntersection:t,shouldAutoLoad:a,shouldAutoPlay:s,hasCustomAppendix:n,lastSyncTime:r,isOwn:o,albumLayout:i,onMediaClick:l,uploadsById:d,cancelSendingMessage:b})=>{const u=e.messages.length,m=Object(c.m)(e=>{b({chatId:e.chatId,messageId:e.id})},[b]);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,b){const{photo:O,video:j}=Object(h.v)(e),g=d[e.previousLocalId||e.id],f=g?g.progress:void 0,{dimensions:p,sides:I}=i.layout[b];if(O){const s=n&&(o?b===u-1:Boolean(I&Lt&&I&Rt));return c.a.createElement(Ta,{id:"album-media-"+e.id,message:e,observeIntersection:t,shouldAutoLoad:a,shouldAffectAppendix:s,uploadProgress:f,dimensions:p,onClick:l,onCancelUpload:m})}if(j)return c.a.createElement(Aa,{id:"album-media-"+e.id,message:e,observeIntersection:t,shouldAutoLoad:a,shouldAutoPlay:s,uploadProgress:f,lastSyncTime:r,dimensions:p,onClick:l,onCancelUpload:m})})))});a(230);function Ra(){return(Ra=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),l=e.content.video,d=Object(It.b)(r,t),[b,u]=Object(c.r)(a&&s),m=Boolean(b&&d&&n),{mediaData:O,downloadProgress:j}=Object(sa.a)(Object(h.D)(e,"inline"),!m,Object(h.C)(e,"inline"),n),g=ca(e,O),{isBuffered:f,bufferingHandlers:p}=Object(da.a)(),I=b&&!f,v=!1===Object(ra.a)(b),{shouldRender:y,transitionClassNames:C}=Object(ee.a)(I||!f,void 0,v),{shouldRenderThumb:E,transitionClassNames:w}=Object(Xt.a)(O,"slow"),[M,S]=Object(c.r)(!1),[k,N]=Object(c.r)(0);Object(c.n)(()=>{if(!M)return;const e=188*Math.PI,t=e-k*e,a=i.current,s=o.current,n=s.firstElementChild;n?n.firstElementChild.setAttribute("stroke-dashoffset",t.toString()):s.innerHTML=`\n \n `,N(a.currentTime/a.duration)},[M,k]);const P=Boolean(O&&d),T=()=>{S(!1),N(0),Object(ba.a)(i.current),requestAnimationFrame(()=>{o.current.innerHTML=""})},A=(x=T,()=>{La&&La(),La=x});var x;Object(c.n)(()=>{i.current&&(P?Object(ba.a)(i.current):i.current.pause())},[P]),ua(i,P),ha(i,Boolean(O)),Object(ma.a)(i,[O]);const L=Object(c.m)(()=>{if(!O)return void u(e=>!e);const e=i.current;M?e.paused?Object(ba.a)(e):e.pause():(A(),e.currentTime=0,S(!0))},[A,M,O]),F=Object(c.m)(e=>{const t=e.currentTarget;N(t.currentTime/t.duration)},[]),D=Object(Z.a)("full-media",w);return c.a.createElement("div",{ref:r,className:"RoundVideo media-inner",onClick:L},E&&c.a.createElement("div",{className:"thumbnail-wrapper"},c.a.createElement("canvas",{ref:g,className:"thumbnail",style:`width: ${st.d}px; height: ${st.d}px`})),O&&c.a.createElement("div",{className:"video-wrapper"},c.a.createElement("video",Ra({ref:i,className:D,width:st.d,height:st.d,autoPlay:!0,muted:!M,loop:!M,playsInline:!0,onEnded:M?T:void 0},p,{onTimeUpdate:M?F:void 0}),c.a.createElement("source",{src:O}))),c.a.createElement("div",{className:"progress",ref:o}),y&&c.a.createElement("div",{className:"media-loading "+C},c.a.createElement(ia.a,{progress:j})),!O&&!b&&c.a.createElement("i",{className:"icon-large-play"}),c.a.createElement("div",{className:"message-media-duration"},M?Object(R.e)(i.current.currentTime):Object(R.e)(l.duration),(!M||i.current.paused)&&c.a.createElement("i",{className:"icon-muted-chat"})))};a(231);var Da=({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(de.a,{size:"tiny",ripple:!0,disabled:"NOT_SUPPORTED"===e.type,onClick:()=>t({button:e})},e.text,"url"===e.type&&c.a.createElement("i",{className:"icon-arrow-right"}))))));a(232);var Ba=Object(c.h)(Object(s.h)((e,{message:t})=>{const{threadId:a,chatId:s}=t.threadInfo,n=Object(o.Bb)(e,s,a)||t.threadInfo,{byId:c}=e.users,{byId:r}=e.chats;return{threadInfo:n,usersById:c,chatsById:r}},(e,t)=>Object(b.l)(t,["openChat"]))(({disabled:e,threadInfo:t,usersById:a,chatsById:s,openChat:n})=>{const r=Object(oe.a)(),{threadId:o,chatId:i,messagesCount:l,lastMessageId:d,lastReadInboxMessageId:b,recentReplierIds:u}=t,m=Object(c.m)(()=>{n({id:i,threadId:o})},[n,i,o]);if(void 0===l)return;const O=u&&u.map(e=>Object(h.lb)(e)?a[e]:s[e]).filter(Boolean);const j=Boolean(b&&d&&b0&&c.a.createElement("div",{className:"recent-repliers",dir:r.isRtl?"rtl":"ltr"},O.map(e=>c.a.createElement(_t.a,{key:e.id,size:"small",user:Object(h.lb)(e.id)?e:void 0,chat:Object(h.lb)(e.id)?void 0:e}))),c.a.createElement("div",{className:"label",dir:"auto"},l?r("Comments",l,"i"):r("LeaveAComment")),c.a.createElement("i",{className:"icon-next"}))}));a(233);function Ua(e){const t=qa(e.currentTarget);t&&t.setAttribute("data-is-document-group-hover","")}function Ha(e){const t=qa(e.currentTarget);t&&t.removeAttribute("data-is-document-group-hover")}function qa(e){let t=e;do{t=t.nextElementSibling}while(t&&!t.classList.contains("last-in-document-group"));return t}var Ga=Object(c.h)(Object(s.h)((e,t)=>{const{focusedMessage:a,forwardMessages:s,lastSyncTime:n}=e,{message:c,album:r,withSenderName:i,withAvatar:l,threadId:d,messageListType:b}=t,{id:u,chatId:m,viaBotId:O,replyToMessageId:j,isOutgoing:g}=c,f=Object(o.f)(e,m),p=Object(o.O)(e,m),I=f&&Object(h.jb)(f),v=!p&&Object(h.eb)(c),y=i||l||v?Object(o.sb)(e,c):void 0,C=Object(o.J)(e,c),E=O?Object(o.Fb)(e,O):void 0,w=d?Object(o.Db)(e,m,d):void 0,M=c.id===w,S=j===w,k=j&&!S?Object(o.k)(e,m,j):void 0,N=k&&Object(o.sb)(e,k),P=Object(o.Eb)(e,c),T="thread"===b&&(r?r.messages.some(t=>Object(o.T)(e,t)):Object(o.T)(e,c)),{direction:A,noHighlight:x}=T&&a||{},R=s.messageIds&&s.messageIds.includes(u),{query:L}=Object(o.A)(e)||{},F=Object(h.L)(c);let D;return D=r&&r.messages?r.messages.every(({id:t})=>Object(o.U)(e,t)):Object(o.U)(e,u),{forceSenderName:v,sender:y,originSender:C,botSender:E,shouldHideReply:S,isThreadTop:M,replyMessage:k,replyMessageSender:N,...g&&{outgoingStatus:Object(o.eb)(e,c,"scheduled"===b)},..."number"==typeof P&&{uploadProgress:P},isFocused:T,...T&&{focusDirection:A,noFocusHighlight:x},isForwarding:R,isChatWithSelf:p,isChannel:I,lastSyncTime:n,highlight:L,isSingleEmoji:Boolean(F),animatedEmoji:F?Object(o.c)(e,F):void 0,isInSelectMode:Object(o.R)(e),isSelected:D,isGroupSelected:!!c.groupedId&&!c.isInAlbum&&Object(o.P)(e,m,c.groupedId),threadId:d,isPinnedList:"pinned"===b,shouldAutoLoadMedia:f?Object(o.tb)(e,c,f,y):void 0,shouldAutoPlayMedia:Object(o.ub)(e,c),shouldLoopStickers:Object(o.vb)(e)}},(e,t)=>Object(b.l)(t,["focusMessage","openMediaViewer","openAudioPlayer","cancelSendingMessage","openUserInfo","openChat","markMessagesRead","sendPollVote","toggleMessageSelection","setReplyingToId","openForwardMenu","clickInlineButton"]))(({message:e,observeIntersectionForBottom:t,observeIntersectionForMedia:a,observeIntersectionForAnimatedStickers:s,album:n,withAvatar:r,withSenderName:o,noComments:i,appearanceOrder:b,isFirstInGroup:u,isLastInGroup:m,isFirstInDocumentGroup:O,isLastInDocumentGroup:j,isLastInList:g,forceSenderName:f,sender:p,originSender:I,botSender:v,isThreadTop:y,shouldHideReply:C,replyMessage:E,replyMessageSender:w,outgoingStatus:M,uploadProgress:S,isFocused:k,focusDirection:N,noFocusHighlight:P,isForwarding:T,isChatWithSelf:A,isChannel:x,lastSyncTime:R,highlight:L,animatedEmoji:F,isInSelectMode:D,isSelected:B,isGroupSelected:U,threadId:H,messageListType:q,isPinnedList:G,shouldAutoLoadMedia:_,shouldAutoPlayMedia:W,shouldLoopStickers:V,focusMessage:$,openMediaViewer:z,openAudioPlayer:Q,openUserInfo:K,openChat:Y,cancelSendingMessage:J,markMessagesRead:X,sendPollVote:te,toggleMessageSelection:ae,setReplyingToId:ne,openForwardMenu:ce,clickInlineButton:re})=>{const ie=Object(c.q)(null),le=Object(c.q)(null),be=Object(c.q)(null);Object(It.c)(le,t);const{width:ue}=$e(),{isContextMenuOpen:me,contextMenuPosition:he,handleBeforeContextMenu:Oe,handleContextMenu:je,handleContextMenuClose:ge,handleContextMenuHide:fe}=Object(Mt.a)(ie,!1,!0),pe=b<=0,[Ie,ve]=Object(se.a)(pe);Object(c.n)(()=>{pe||setTimeout(ve,10*b)},[b,ve,pe]);const{transitionClassNames:ye}=Object(ee.a)(Ie,void 0,pe,!1),{chatId:Ce,id:Ee,threadInfo:we}=e,Me=Object(h.tb)(e),Se="scheduled"===q||e.isScheduled,ke=Object(h.ub)(e)&&!C,Ne=Boolean(we)&&"thread"===q,{forwardInfo:Pe,viaBotId:Te}=e,Ae=Pe&&!A&&!Pe.isLinkedChannelPost,xe=!!e.groupedId&&!e.isInAlbum,Re=Boolean(n)&&n.messages.length>1,{text:Le,photo:Fe,video:De,audio:Be,voice:Ue,document:He,sticker:qe,contact:Ge,poll:_e,webPage:We,invoice:Ve}=Object(h.v)(e),ze=Object(h.x)(e),Qe=Object(St.a)(e,L,kt(ze)),Ke=void 0!==he,Je=Object(Z.a)("Message message-list-item",u&&"first-in-group",m&&"last-in-group",O&&"first-in-document-group",j&&"last-in-document-group",g&&"last-in-list",Me&&"own",Boolean(e.views)&&"has-views",e.isEdited&&"was-edited",ke&&"has-reply",Ke&&"has-menu-open",k&&!P&&"focused",T&&"is-forwarding",e.isDeleting&&"is-deleting",xe&&"is-in-document-group",Re&&"is-album",e.hasUnreadMention&&"has-unread-mention",B&&"is-selected",D&&"is-in-selection-mode",y&&"is-thread-top",Boolean(e.inlineButtons)&&"has-inline-buttons",ye),Xe=function(e,{hasReply:t,customShape:a,isLastInGroup:s,asForwarded:n,hasThread:c,forceSenderName:r,hasComments:o}={}){const{text:i,photo:l,video:d,audio:b,voice:u,document:m,poll:O,webPage:j,contact:g}=Object(h.v)(e),f=["message-content"],p=(l||d)&&!i,I=Boolean(e.viaBotId);return kt(a)?f.push("emoji-only emoji-only-"+a):i&&f.push("text"),a&&(f.push("custom-shape"),d&&d.isRound&&f.push("round"),o&&f.push("has-comments")),l||d?f.push("media"):b?f.push("audio"):u?f.push("voice"):m?f.push("document"):g?f.push("contact"):O?f.push("poll"):j&&(f.push("web-page"),j.photo&&f.push("media")),n&&!a&&f.push("is-forwarded"),t&&f.push("is-reply"),c&&f.push("has-replies"),I&&f.push("is-via-bot"),r&&f.push("force-sender-name"),a||(f.push("has-shadow"),(t||n||!p||I||r)&&f.push("has-solid-background"),!s||!l&&p||f.push("has-appendix")),f.join(" ")}(e,{hasReply:ke,customShape:ze,isLastInGroup:m,asForwarded:Ae,hasThread:Ne,forceSenderName:f,hasComments:e.threadInfo&&e.threadInfo.messagesCount>0}),Ze=!Pe||!A&&p?p:I,et=Pe?I:p,tt=x&&e.adminTitle||Pe&&!Ae&&Pe.adminTitle||void 0,at=e.threadInfo&&(!xe||j)&&"thread"===q&&!i,ct=Xe.includes("has-appendix");Object(Ye.a)(Ce,ke?e.replyToMessageId:void 0,E,e.id),Gt(ie,Ce,k,N,P),Object(c.o)(()=>{be.current&&(be.current.innerHTML=Me?'':'')},[Me,ct]);const rt=Object(c.m)(t=>{t.stopPropagation(),ae({messageId:Ee,groupedId:e.groupedId})},[Ee,e.groupedId,ae]),ot=Object(c.m)(e=>{const t=Re&&n&&n.messages?{messageId:Ee,childMessageIds:n.messages.map(({id:e})=>e),withShift:e&&e.shiftKey}:{messageId:Ee,withShift:e&&e.shiftKey};ae(t)},[ae,Ee,Re,n]),it=Object(c.m)(()=>{ne({messageId:Ee})},[ne,Ee]),lt=Object(c.m)(e=>{e.stopPropagation()},[]),dt=Object(c.m)(()=>{Ze&&(Object(h.lb)(Ze.id)?K({id:Ze.id}):Y({id:Ze.id}))},[Ze,K,Y]),bt=Object(c.m)(()=>{et&&(Object(h.lb)(et.id)?K({id:et.id}):Y({id:et.id}))},[et,K,Y]),ut=Object(c.m)(()=>{v&&K({id:v.id})},[v,K]),mt=Object(c.m)(()=>{$({chatId:Ce,threadId:H,messageId:e.replyToMessageId})},[$,Ce,H,e.replyToMessageId]),ht=Object(c.m)(()=>{z({chatId:Ce,threadId:H,messageId:Ee,origin:Se?d.h.ScheduledInline:d.h.Inline})},[Ce,H,Ee,z,Se]),Ot=Object(c.m)(()=>{Q({chatId:Ce,messageId:Ee})},[Ce,Ee,Q]),jt=Object(c.m)(e=>{z({chatId:Ce,threadId:H,messageId:e,origin:Se?d.h.ScheduledAlbum:d.h.Album})},[Ce,H,z,Se]),gt=Object(c.m)(()=>{X({messageIds:[Ee]})},[Ee,X]),ft=Object(c.m)(()=>{J({chatId:Ce,messageId:Ee})},[J,Ce,Ee]),pt=Object(c.m)(e=>{te({chatId:Ce,messageId:Ee,options:e})},[Ce,Ee,te]),vt=Object(c.m)(()=>{ce({fromChatId:Ce,groupedId:e.groupedId})},[ce,Ce,e.groupedId]),yt=Object(c.m)(()=>{if(n&&n.messages){const e=n.messages.map(({id:e})=>e);ce({fromChatId:Ce,messageIds:e})}else ce({fromChatId:Ce,messageIds:[Ee]})},[n,ce,Ce,Ee]),Ct=Object(c.m)(()=>{$({chatId:Ce,threadId:l.MAIN_THREAD_ID,messageId:Ee})},[$,Ce,Ee]),Et=Object(c.m)(()=>{$(xe?{chatId:Pe.fromChatId,groupedId:e.groupedId,groupedChatId:Ce}:{chatId:Pe.fromChatId,messageId:Pe.fromMessageId})},[$,Pe,e,Ce,xe]),wt=Object(oe.a)();let Tt,At="",xt=!1;const Rt=Object(c.p)(()=>Re?Ut(Me,Boolean(Ae),n,ue):void 0,[Re,ue,Me,Ae,n]),Lt=Ae?28:0;if(Re||!Fe&&!De)Rt&&(Tt=Math.max(Nt(Boolean(Le),at),Rt.containerStyle.width),Tt-Rt.containerStyle.width>18&&(xt=!0));else{let t;Fe?t=Pt(e).width:De&&(t=De.isRound?st.d:Pt(e).width),t&&(Tt=Math.max(Nt(Boolean(Le),at),t),Tt-t>18&&(xt=!0))}Tt&&(At=`width: ${Tt+Lt}px`);const Ft=Object(c.p)(()=>tt?qt(tt):void 0,[tt]),Dt=!(Ke||D||T)&&(!xe||j),Bt=Dt&&x&&!Se,Ht=Dt&&(Pe&&(Pe.isChannelPost||A&&!Me)&&Pe.fromMessageId||G);return c.a.createElement("div",{ref:ie,id:"message"+Ee,className:Je,style:Ft?`--meta-safe-author-width: ${Ft}px`:void 0,"data-message-id":Ee,onClick:D?ot:void 0,onDoubleClick:D?void 0:it,onMouseDown:D?void 0:Oe,onContextMenu:D?void 0:je,onMouseEnter:xe&&!j?Ua:void 0,onMouseLeave:xe&&!j?Ha:void 0},c.a.createElement("div",{ref:le,className:"bottom-marker","data-message-id":Ee,"data-last-message-id":n?n.messages[n.messages.length-1].id:void 0,"data-has-unread-mention":e.hasUnreadMention}),!xe&&c.a.createElement("div",{className:"message-select-control"},B&&c.a.createElement("i",{className:"icon-select"})),j&&c.a.createElement("div",{className:Object(Z.a)("message-select-control group-select",U&&"is-selected"),onClick:rt},U&&c.a.createElement("i",{className:"icon-select"})),r&&function(){const e=Ze&&Object(h.lb)(Ze.id),t=Ze&&e?Ze:void 0,a=Ze&&!e?Ze:void 0,s=!Ze&&Pe?Pe.hiddenUserName:void 0;return c.a.createElement(_t.a,{size:"small",user:t,chat:a,text:s,lastSyncTime:R,onClick:t||a?dt:void 0})}(),c.a.createElement("div",{className:"message-content-wrapper",onClick:D&&xe?ot:void 0},c.a.createElement("div",{className:Xe,style:At,dir:"auto"},ct&&c.a.createElement("div",{className:"svg-appendix",ref:be}),Ae&&!ze&&(!xe||O)&&c.a.createElement("div",{className:"message-title"},wt("ForwardedMessage")),function(){const t=Object(Z.a)("content-inner",Ae&&!ze&&"forwarded-message",ke&&"reply-message",xt&&"no-media-corners"),r=m&&!Qe&&!Ae&&!Ne,i=!We&&!F&&Qe;return c.a.createElement("div",{className:t,onDoubleClick:lt,dir:"auto"},function(){if(ze||!(o&&!Fe&&!De||Ae||Te||f)||xe&&!O)return;let t,a;et?(t=Object(h.V)(wt,et),Ae||(a="color-"+Object(h.X)(et))):Pe&&Pe.hiddenUserName&&(t=Pe.hiddenUserName);return c.a.createElement("div",{className:"message-title",dir:"ltr"},t?c.a.createElement("span",{className:Object(Z.a)(et&&"interactive",a),onClick:et?bt:void 0,dir:"auto"},Object(nt.a)(t)):v?void 0:" ",v&&c.a.createElement(c.a.Fragment,null,c.a.createElement("span",{className:"via"},wt("ViaBot")),c.a.createElement("span",{className:"interactive",onClick:ut},Object(nt.a)("@"+v.username))),Pe&&Pe.isLinkedChannelPost?c.a.createElement("span",{className:"admin-title",dir:"auto"},wt("DiscussChannel")):e.adminTitle&&!x?c.a.createElement("span",{className:"admin-title",dir:"auto"},e.adminTitle):void 0)}(),ke&&c.a.createElement(zt,{message:E,sender:w,observeIntersection:a,onClick:mt}),qe&&c.a.createElement(ta,{message:e,observeIntersection:a,observeIntersectionForPlaying:s,shouldLoop:V,lastSyncTime:R}),F&&c.a.createElement(aa.a,{isInline:!0,sticker:F,observeIntersection:a,lastSyncTime:R}),Re&&c.a.createElement(xa,{album:n,albumLayout:Rt,observeIntersection:a,shouldAutoLoad:_,shouldAutoPlay:W,isOwn:Me,hasCustomAppendix:r,lastSyncTime:R,onMediaClick:jt}),!Re&&Fe&&c.a.createElement(la,{message:e,observeIntersection:a,shouldAutoLoad:_,uploadProgress:S,shouldAffectAppendix:r,onClick:ht,onCancelUpload:ft}),!Re&&De&&De.isRound&&c.a.createElement(Fa,{message:e,observeIntersection:a,shouldAutoLoad:_,shouldAutoPlay:W,lastSyncTime:R}),!Re&&De&&!De.isRound&&c.a.createElement(ja,{message:e,observeIntersection:a,shouldAutoLoad:_,shouldAutoPlay:W,uploadProgress:S,lastSyncTime:R,onClick:ht,onCancelUpload:ft}),(Be||Ue)&&c.a.createElement(Kt.a,{message:e,uploadProgress:S,lastSyncTime:R,isSelectable:xe,isSelected:B,onPlay:Ot,onReadMedia:!Ue||Me&&!A?void 0:gt,onCancelUpload:ft}),He&&c.a.createElement(Qt.a,{message:e,observeIntersection:a,uploadProgress:S,isSelectable:xe,isSelected:B,onCancelUpload:ft}),Ge&&c.a.createElement(fa,{contact:Ge}),_e&&c.a.createElement(wa,{message:e,poll:_e,onSendVote:pt}),!F&&Qe&&c.a.createElement("p",{className:"text-content "+(i?"with-meta":""),dir:"auto"},Qe,i&&c.a.createElement(Jt,{message:e,outgoingStatus:M,signature:tt,onClick:ot})),We&&c.a.createElement(ka,{message:e,observeIntersection:a,shouldAutoLoad:_,onMediaClick:ht,onCancelMediaTransfer:ft}),Ve&&c.a.createElement(Na,{message:e}))}(),(!xe||j)&&!(!We&&!F&&Qe)&&c.a.createElement(Jt,{message:e,outgoingStatus:M,signature:tt,onClick:ot}),Bt?c.a.createElement(de.a,{className:"message-action-button",color:"translucent-white",round:!0,size:"tiny",ariaLabel:wt("lng_context_forward_msg"),onClick:j?vt:yt},c.a.createElement("i",{className:"icon-share-filled"})):Ht?c.a.createElement(de.a,{className:"message-action-button",color:"translucent-white",round:!0,size:"tiny",ariaLabel:"Focus message",onClick:G?Ct:Et},c.a.createElement("i",{className:"icon-arrow-right"})):void 0,at&&c.a.createElement(Ba,{message:e,disabled:i}),Xe.includes("has-appendix")&&c.a.createElement("div",{className:"svg-appendix",ref:be})),e.inlineButtons&&c.a.createElement(Da,{message:e,onClick:re})),he&&c.a.createElement(Vt,{isOpen:me,anchor:he,message:e,album:n,messageListType:q,onClose:ge,onCloseAnimationEnd:fe}))}));a(234);const _a=O.b?1e3:350,Wa=O.g?300:500,Va=Object(f.a)(e=>e(),200,!1);var $a=Object(c.h)(Object(s.h)((e,{chatId:t,threadId:a,type:s})=>{const n=Object(o.f)(e,t);if(!n)return{};const c=Object(o.x)(e,t,a,s),r="scheduled"===s?Object(o.pb)(e,t):Object(o.m)(e,t),i=Object(o.Db)(e,t,a);if(a!==l.MAIN_THREAD_ID&&!(r&&i&&r[i]))return{};const{isRestricted:d,restrictionReason:b,lastMessage:u}=n,m=Object(o.H)(e,t),O=a===l.MAIN_THREAD_ID&&!c&&!n.unreadCount&&!m&&u&&!u.groupedId;let j;if(Object(o.K)(e,t)){const a=Object(o.g)(e,t);j=a.fullInfo?a.fullInfo.botDescription||"NoMessages":"Updating bot info..."}return{isChatLoaded:!0,isRestricted:d,restrictionReason:b,isChannelChat:Object(h.jb)(n),isChatWithSelf:Object(o.O)(e,t),messageIds:c,messagesById:r,firstUnreadId:Object(o.G)(e,t,a),isViewportNewest:"thread"!==s||Object(o.W)(e,t,a),threadFirstMessageId:Object(o.F)(e,t,a),focusingId:m,isSelectModeActive:Object(o.R)(e),animationLevel:e.settings.byKey.animationLevel,...O&&{lastMessage:u},botDescription:j,threadTopMessageId:i,hasLinkedChat:n.fullInfo&&"linkedChatId"in n.fullInfo?Boolean(n.fullInfo.linkedChatId):void 0}},(e,t)=>Object(b.l)(t,["loadViewportMessages","markMessageListRead","markMessagesRead","setScrollOffset"]))(({chatId:e,threadId:t,type:a,hasTools:r,onFabToggle:i,onNotchToggle:l,isChatLoaded:u,isChannelChat:m,canPost:O,isChatWithSelf:j,messageIds:g,messagesById:p,firstUnreadId:I,isViewportNewest:v,threadFirstMessageId:y,isRestricted:C,restrictionReason:E,focusingId:w,isSelectModeActive:M,animationLevel:S,loadViewportMessages:k,markMessageListRead:N,markMessagesRead:P,setScrollOffset:T,lastMessage:A,botDescription:x,threadTopMessageId:L,hasLinkedChat:F})=>{const D=Object(c.q)(null),B=Object(c.q)("thread"===a&&Object(o.qb)(Object(s.e)(),e,t)||0),U=Object(c.q)(),H=Object(c.q)(),q=Object(c.q)(),G=Object(c.q)(),_=Object(c.q)(),W=Object(c.q)(),V=Object(c.q)(!1),$=Object(c.q)(!g),[z,Q]=Object(c.r)(),[K,Y]=Object(c.r)(Boolean(w)),J=Boolean(g);Object(pe.a)(()=>{J&&Object(f.d)(()=>{$.current=!1})},[J]),Object(pe.a)(()=>{_.current=I,G.current||(G.current=I)},[I]);const{observe:ee,freeze:te,unfreeze:ae}=Object(It.a)({rootRef:D,throttleMs:_a,margin:Wa}),{observe:se,freeze:ne,unfreeze:ce}=Object(It.a)({rootRef:D},e=>{if("thread"!==a)return;let t=0;const s=[];e.forEach(e=>{const{isIntersecting:a,target:n}=e;if(!a)return;const{dataset:c}=n,r=Number(c.lastMessageId||c.messageId);r>t&&(t=r),c.hasUnreadMention&&s.push(r)}),_.current&&t>=_.current&&N({maxId:t}),s.length&&P({messageIds:s})});Object(pe.a)(()=>{W.current=w,w?(te(),ne()):(ce(),ae())},[w]);const{observe:re}=Object(It.a)({rootRef:D,throttleMs:_a});Object(c.n)(()=>{w?Y(!0):setTimeout(()=>{Y(!1)},200)},[w]);const ie=Object(c.p)(()=>{if(!g||!p)return;const e=!L||g[0]&&y!==g[0]?g:[L,...g];if(!e.length)return;const t=e.map(e=>p[e]);return pt(Object(b.k)(t,["date","id"]),G.current)},[g,p,y,L]),[le,de,be]=Object(c.p)(()=>"thread"===a?[Object(f.a)(()=>k({direction:d.e.Backwards}),1e3,!0,!1),Object(f.a)(()=>k({direction:d.e.Forwards}),1e3,!0,!1),Object(f.a)(()=>k({direction:d.e.Around}),1e3,!0,!1)]:[],[k,g]),{isScrolled:ue,updateStickyDates:me}=vt(),he=Object(c.m)(()=>{if(V.current)return void(V.current=!1);const s=D.current;W.current||me(s,r),Va(()=>{Object(f.b)(()=>{s.parentElement&&(B.current=s.scrollHeight-s.scrollTop,"thread"===a&&T({chatId:e,threadId:t,scrollOffset:B.current}))})})},[me,r,a,T,e,t]);Object(c.n)(()=>{if(!("ResizeObserver"in window))return;const e=new ResizeObserver(([e])=>{e.target.offsetParent&&Q(e.contentRect.height)});return e.observe(D.current),()=>{e.disconnect()}},[]);const{height:Oe}=$e();Object(c.n)(()=>{D.current.dataset.normalHeight=String(D.current.offsetHeight)},[Oe]),Object(c.n)(()=>{if(!be||!u||C||w)return;const e=D.current;(!g||g.length{if(!g||!q.current)return;const e=q.current.filter(e=>g.includes(Number(e.dataset.messageId))),t=e[1]||e[0];t&&(U.current=t.id,H.current=t.getBoundingClientRect().top)},[g,v,z,r]),Object(gt.a)(([e,t,a])=>{const s=D.current;if(q.current=Array.from(s.querySelectorAll(".message-list-item")),!s.offsetParent)return;const c=v&&g&&g.length{s.parentElement&&s.parentElement.classList.remove("force-messages-scroll")},1e3));const{scrollTop:o,scrollHeight:i,offsetHeight:l}=s,d=B.current,b=q.current[q.current.length-1],u=b?b.offsetHeight:0,m=v&&t&&d-(a||l)-u<=100;let h;const O=g&&e&&g[0]!==e[0],j=g&&e&&g[g.length-1]!==e[e.length-1],p=g&&W.current===g[g.length-1];if(m&&j&&!O&&!p&&(b&&Object(f.b)(()=>{Object(Ct.a)(s,b,"end",20,void 0,void 0,void 0,!0)}),h=i-l,B.current=Math.max(i-h,l),!c))return;const I=void 0!==a&&a!==z,y=U.current&&s.querySelector("#"+U.current),C=!y&&G.current&&s.querySelector(".unread-divider");if(m&&I){if(Object(Ct.b)())return;h=i-l}else if(y){h=o+(y.getBoundingClientRect().top-(H.current||0))}else h=C?C.offsetTop-(r?60:10):i-d;Object(yt.a)(s,h),W.current||(V.current=!0,Object(f.b)(()=>{V.current=!1})),B.current=Math.max(i-h,l)},[g,v,z,r]),Object(c.n)(()=>{(!S||S>0)&&Object(X.b)(200+n.c)},[S,M]);const je=Object(oe.a)(),ge=Boolean(e&&Object(h.lb)(e)),fe=Boolean(!ge&&!m||j),Ie=Object(Z.a)("MessageList custom-scroll",!fe&&"no-avatars",m&&"no-avatars",!O&&"no-composer","pinned"===a&&"type-pinned",M&&"select-mode-active",K&&"has-focusing",ue&&"scrolled");return c.a.createElement("div",{ref:D,className:Ie,onScroll:he},C?c.a.createElement("div",{className:"empty"},c.a.createElement("span",null,E?E.text:"This is a private "+(m?"channel":"chat"))):x?c.a.createElement("div",{className:"empty rich"},c.a.createElement("span",null,Object(nt.a)(je(x),["br","emoji","links"]))):g&&!ie?c.a.createElement("div",{className:"empty"},c.a.createElement("span",null,je("NoMessages"))):g&&ie||A?c.a.createElement(wt,{containerRef:D,className:"messages-container",messageIds:g||[A.id],focusingId:w,loadMoreForwards:de,loadMoreBackwards:le,isViewportNewest:v,firstUnreadId:I,onFabToggle:i,onNotchToggle:l},function(e,t,a,s,r,o,i,l,d,u,m,O,j,g=!1,f=!1){const p=c.a.createElement("div",{className:Object(Z.a)("unread-divider","local-action-message"),key:"unread-messages"},c.a.createElement("span",null,e("UnreadMessages"))),I=f?0:t.reduce((e,t)=>e+Object(b.h)(t.senderGroups).length,0);let v=0;const y=t.map((t,O,f)=>{const y=t.senderGroups.map((t,n,g)=>{if(1===t.length&&!ft(t[0])&&Object(h.db)(t[0])){const e=t[0],s=n===g.length-1&&O===f.length-1;return Object(b.e)([e.id===l.current&&p,c.a.createElement($t,{key:e.id,message:e,observeIntersection:a,appearanceOrder:I-++v,isLastInList:s})])}let y;return Object(b.h)(t.map((C,E)=>{const w=ft(C)?C.mainMessage:C,M=ft(C)?C:void 0,S=Object(h.tb)(w),k=ft(C),N=t[E+1];w.previousLocalId&&i.current==="message"+w.previousLocalId&&(i.current="message"+w.id);const P=!k&&w.groupedId?w.groupedId:void 0,T=N&&!ft(N)?N.groupedId:void 0,A={isFirstInGroup:0===E,isLastInGroup:E===t.length-1,isFirstInDocumentGroup:Boolean(P&&P!==y),isLastInDocumentGroup:Boolean(P&&P!==T),isLastInList:E===t.length-1&&n===g.length-1&&O===f.length-1};y=P;const x=Object(h.F)(w),R="scheduled"!==u?x:`${w.date}_${x}`;return Object(b.e)([w.id===l.current?p:void 0,c.a.createElement(Ga,{key:R,message:w,observeIntersectionForBottom:a,observeIntersectionForMedia:s,observeIntersectionForAnimatedStickers:r,album:M,withAvatar:A.isLastInGroup&&o&&!S&&!(w.id===m),withSenderName:A.isFirstInGroup&&o&&!S,threadId:d,messageListType:u,noComments:!1===j,appearanceOrder:I-++v,isFirstInGroup:A.isFirstInGroup,isLastInGroup:A.isLastInGroup,isFirstInDocumentGroup:A.isFirstInDocumentGroup,isLastInDocumentGroup:A.isLastInDocumentGroup,isLastInList:A.isLastInList}),w.id===m&&c.a.createElement("div",{className:"local-action-message",key:"discussion-started"},c.a.createElement("span",null,e("DiscussionStarted")))])}))});return c.a.createElement("div",{className:"message-date-group",key:t.datetime,teactFastList:!0},c.a.createElement("div",{className:"sticky-date",key:"date-header"},c.a.createElement("span",{dir:"auto"},g&&t.originalDate===n.mb&&e("MessageScheduledUntilOnline"),g&&t.originalDate!==n.mb&&e("MessageScheduledOn",Object(R.c)(e,t.datetime,void 0,!0)),!g&&Object(R.c)(e,t.datetime))),Object(b.h)(y))});return Object(b.h)(y)}(je,ie||pt([A]),se,ee,re,fe,U,G,t,a,L,0,F,!!ie&&"scheduled"===a,!ie||!$.current)):c.a.createElement(Se.a,{color:"white"}))}));a(235);var za=Object(c.h)(Object(s.h)(e=>{const t=Object(o.y)(e);if(!t)return{};const{chatId:a,threadId:s,type:n}=t,c=Object(o.f)(e,a);return{messageListType:n,unreadCount:c&&s===l.MAIN_THREAD_ID&&"thread"===n?c.unreadCount:void 0}},(e,t)=>Object(b.l)(t,["focusLastMessage"]))(({isShown:e,canPost:t,messageListType:a,unreadCount:s,focusLastMessage:n})=>{const r=Object(oe.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(Ct.a)(e,a,"end",20)}},[e,a,n]),l=Object(Z.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(de.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(Xe.b)(s))))})),Qa=a(127),Ka=a(136);async function Ya(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(We.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),Ya(e,c,!0,s)):Ya(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(We.h)(n);o={width:e,height:t,duration:a}}i=await Object(We.c)(n)}return{blobUrl:n,filename:e,mimeType:c,size:r,quick:o,previewBlobUrl:i,...s}}var Ja=a(179),Xa=a.p+"8ccc0b555efcec3616377aea078dda16.js";const Za={encoderPath:Xa,reuseWorker:!0},es={type:"audio/ogg"};let ts,as,ss;async function ns(){return ts||(ts=a.e(9).then(a.t.bind(null,315,7)),as=(await ts).default,ss=new as(Za)),ts}async function cs(e){await async function(){await ns(),await ss.start()}();const t=Date.now();let a;const s=[],n=[];ss.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}}(ss,t=>{n.push(255*t),e(t)});return{stop:()=>new Promise((e,r)=>{ss.onstop=()=>{e({blob:new Blob(s,es),duration:Math.round(((a||Date.now())-t)/1e3),waveform:n})},ss.onerror=r;const o=Math.max(0,t+1e3-Date.now());setTimeout(()=>{ss.stop(),c()},o)}),pause:()=>{const e=Math.max(0,t+1e3-Date.now());setTimeout(()=>{ss.pause(),a=Date.now(),c()},e)}}}const rs=["image/png","image/jpeg","image/gif"];function os(e){const{text:t,entities:a}=e||{};if(!t)return"";const s=Object(St.b)(t,a,void 0,void 0,!0);return Array.isArray(s)?s.join(""):s}let is,ls;var ds=a(63);var bs=a(180),us=a(188);var ms=Object(c.h)(e=>{const{isOpen:t}=e,a=Object(Me.a)(we.a.Extra,"DeleteMessageModal",!t);return a?c.a.createElement(a,e):void 0});function hs(){return(hs=Object.assign||function(e){for(var t=1;t{const a=Object(c.q)(!1),s=Object(c.m)(()=>{if(a.current=!0,js)return js=!1,void e();Os&&(clearTimeout(Os),Os=void 0),Os=window.setTimeout(()=>{a.current&&e()},200)},[e]),n=Object(c.m)(()=>{a.current=!1},[]);return c.a.createElement(de.a,hs({},t,{onMouseEnter:O.l?void 0:s,onMouseLeave:O.l?void 0:n,onClick:O.l?e:void 0}))});var fs=Object(c.h)(e=>{const{isOpen:t}=e,a=Object(Me.a)(we.a.Extra,"AttachMenu",!t);return a?c.a.createElement(a,e):void 0});var ps=Object(c.h)(e=>{const{isOpen:t}=e,a=Object(Me.a)(we.a.Extra,"SymbolMenu",!t);return a?c.a.createElement(a,e):void 0});var Is=Object(c.h)(e=>{const{isOpen:t}=e,a=Object(Me.a)(we.a.Extra,"MentionTooltip",!t);return a?c.a.createElement(a,e):void 0});var vs=Object(c.h)(e=>{const{isOpen:t}=e,a=Object(Me.a)(we.a.Extra,"CustomSendMenu",!t);return a?c.a.createElement(a,e):void 0});var ys=e=>{const{isOpen:t}=e,a=Object(Me.a)(we.a.Extra,"StickerTooltip",!t);return a?c.a.createElement(a,e):void 0},Cs=a(181);var Es=Object(c.h)(e=>{const{isOpen:t}=e,a=Object(Me.a)(we.a.Extra,"BotKeyboardMenu",!t);return a?c.a.createElement(a,e):void 0}),ws=a(182),Ms=a(117);a(237);var Ss=Object(c.h)(Object(s.h)(e=>{const{chatId:t,threadId:a,type:s}=Object(o.y)(e)||{};if(!t||!a||!s)return{};const{currentUserId:n,forwardMessages:{fromChatId:c,toChatId:r,messageIds:i}}=e,l=Object(o.lb)(e,t,a),d="scheduled"===s?Object(o.E)(e,t):Object(o.C)(e,t,a),b=e.settings.byKey.animationLevel>=1,u=r===t;let m,O;if(l?m=Object(o.k)(e,t,l):d?m=Object(o.D)(e,t,a,s):u&&1===i.length&&(m=Object(o.k)(e,c,i[0])),l&&m){const{forwardInfo:a}=m,s=t===n;a&&(a.isChannelPost||s)&&(O=Object(o.J)(e,m)),O||(O=Object(o.sb)(e,m))}else u&&(O=Object(h.lb)(c)?Object(o.Fb)(e,c):Object(o.f)(e,c));return{replyingToId:l,editingId:d,message:m,sender:O,shouldAnimate:b,forwardedMessagesCount:u?i.length:void 0}},(e,t)=>Object(b.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(Ms.a)([r],r?300:void 0),{shouldRender:m,transitionClassNames:h}=Object(ee.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(ne.a)(O):void 0,[b,O]);const j=Object(c.m)(()=>{l({chatId:a.chatId,messageId:a.id})},[l,a]),g=Object(Z.a)("ComposerEmbeddedMessage",h),f=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(de.a,{round:!0,color:"translucent",ariaLabel:"Cancel replying",onClick:O},c.a.createElement("i",{className:"icon-close"})),c.a.createElement(zt,{className:"inside-input",message:a,sender:s,customText:f,title:t?"Edit Message":void 0,onClick:j})))}));var ks=Object(c.h)(e=>{const{attachments:t}=e,a=Object(Me.a)(we.a.Extra,"AttachmentModal",!t.length);return a?c.a.createElement(a,e):void 0});var Ns=Object(c.h)(e=>{const{isOpen:t}=e,a=Object(Me.a)(we.a.Extra,"PollModal",!t);return a?c.a.createElement(a,e):void 0});var Ps=Object(c.h)(e=>{const{isOpen:t}=e,a=Object(Me.a)(we.a.Extra,"DropArea",!t);return a?c.a.createElement(a,e):void 0});a(238);const Ts=new RegExp(n.hb,"i");var As=Object(c.h)(Object(s.h)((e,{chatId:t,threadId:a})=>{const s=Object(o.bb)(e,t,a);return{webPagePreview:e.webPagePreview,noWebPage:s}},(e,t)=>Object(b.l)(t,["loadWebPagePreview","clearWebPagePreview","toggleMessageWebPage"]))(({chatId:e,threadId:t,messageText:a,disabled:s,webPagePreview:n,noWebPage:r,loadWebPagePreview:o,clearWebPagePreview:i,toggleMessageWebPage:d})=>{const b=Object(c.p)(()=>{const{text:e,entities:t}=Object(Ka.a)(a),s=t&&t.find(({type:e})=>e===l.ApiMessageEntityTypes.TextUrl);if(s)return s.url;const n=e.match(Ts);return n?n[0]:void 0},[a]);Object(c.n)(()=>{b?o({text:b}):(i(),d({chatId:e,threadId:t}))},[e,d,i,b,o,t]),Object(pe.a)(()=>{i(),d({chatId:e,threadId:t})},[e]);const u=Boolean(n&&a.length&&!r&&!s),{shouldRender:m,transitionClassNames:h}=Object(ee.a)(u),O=Object(Je.a)(n);if(!m||!O)return;const{photo:j,...g}=O,f={content:{webPage:g}};return c.a.createElement("div",{className:Object(Z.a)("WebPagePreview",h)},c.a.createElement("div",null,c.a.createElement(de.a,{round:!0,color:"translucent",ariaLabel:"Clear Webpage Preview",onClick:()=>{d({chatId:e,threadId:t,noWebPage:!0})}},c.a.createElement("i",{className:"icon-close"})),c.a.createElement(ka,{message:f,inPreview:!0})))})),xs=a(120);var Rs=Object(c.h)(e=>{const{isOpen:t}=e,a=Object(Me.a)(we.a.Extra,"CalendarModal",!t);return a?c.a.createElement(a,e):void 0});var Ls=Object(c.h)(e=>{const{isOpen:t}=e,a=Object(Me.a)(we.a.Extra,"PaymentModal",!t);return a?c.a.createElement(a,e):void 0});var Fs,Ds=Object(c.h)(e=>{const{isOpen:t}=e,a=Object(Me.a)(we.a.Extra,"ReceiptModal",!t);return a?c.a.createElement(a,e):void 0});a(239);!function(e){e.Send="send",e.Record="record",e.Edit="edit"}(Fs||(Fs={}));var Bs=Object(c.h)(Object(s.h)((e,{chatId:t,threadId:a,messageListType:s})=>{const n=Object(o.f)(e,t),c=n&&Object(o.o)(e,n),r=n?Object(o.N)(e,n):void 0,i=Object(o.O)(e,t),d=r&&Object(o.ab)(e,t),b=Object(o.nb)(e,t);return{editingMessage:Object(o.D)(e,t,a,s),connectionState:e.connectionState,draft:Object(o.B)(e,t,a),chat:n,isChatWithBot:r,isChatWithSelf:i,canScheduleUntilOnline:!i&&!r&&n&&c&&Object(h.lb)(t)&&c.status&&Boolean(c.status.wasOnline),isRightColumnShown:Object(o.V)(e),isSelectModeActive:Object(o.R)(e),withScheduledButton:a===l.MAIN_THREAD_ID&&"thread"===s&&Boolean(b&&b.length),shouldSchedule:"scheduled"===s,botKeyboardMessageId:d?d.id:void 0,isForwarding:t===e.forwardMessages.toChatId,canSuggestMembers:n&&Object(h.kb)(n),isPollModalOpen:e.isPollModalOpen,stickersForEmoji:e.stickers.forEmoji.stickers,groupChatMembers:n&&n.fullInfo&&n.fullInfo.members,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}},(e,t)=>Object(b.l)(t,["sendMessage","editMessage","saveDraft","clearDraft","showError","setStickerSearchQuery","setGifSearchQuery","forwardMessages","openPollModal","closePollModal","closePaymentModal","clearReceipt","loadScheduledHistory","openChat","addRecentEmoji"]))(({dropAreaState:e,shouldSchedule:t,canScheduleUntilOnline:a,onDropHide:r,editingMessage:o,chatId:i,threadId:d,messageListType:b,draft:u,chat:m,connectionState:j,isChatWithBot:g,isChatWithSelf:p,isRightColumnShown:I,isSelectModeActive:v,isForwarding:y,canSuggestMembers:C,isPollModalOpen:E,isPaymentModalOpen:w,isReceiptModalOpen:M,botKeyboardMessageId:S,withScheduledButton:k,stickersForEmoji:N,groupChatMembers:P,currentUserId:T,usersById:A,lastSyncTime:x,contentToBeScheduled:L,shouldSuggestStickers:F,recentEmojis:D,sendMessage:B,editMessage:U,saveDraft:H,clearDraft:q,showError:G,setStickerSearchQuery:_,setGifSearchQuery:W,forwardMessages:V,openPollModal:$,closePollModal:z,loadScheduledHistory:Q,closePaymentModal:K,openChat:Y,clearReceipt:J,addRecentEmoji:X})=>{const ee=Object(c.q)(null),[te,ae]=Object(c.r)(""),ce=Object(c.q)(),re=Object(ra.a)(e),[ie,le,be]=Object(se.a)(),[ue,me]=Object(c.r)(),he=Object(c.q)(te);Object(c.n)(()=>{he.current=te},[te]),Object(c.n)(()=>{ce.current=void 0},[i]),Object(c.n)(()=>{i&&x&&d===l.MAIN_THREAD_ID&&Q()},[i,Q,x,d]),Object(c.o)(()=>{ee.current&&(ee.current.innerHTML='')},[]),Object(c.n)(()=>{L&&(me(L),le())},[L,le]);const[Oe,ge]=Object(c.r)([]),[fe,pe,Ie]=Object(se.a)(),[ve,ye,Ce]=Object(se.a)(),[Ee,we,Me]=Object(se.a)(),[Se,ke,Ne]=Object(se.a)(),[Pe,Te]=Object(se.a)(),[Ae,xe,Re]=Object(se.a)(),{startRecordingVoice:Le,stopRecordingVoice:Fe,pauseRecordingVoice:De,activeVoiceRecording:Be,currentRecordTime:Ue,recordButtonRef:He,startRecordTimeRef:qe}=(()=>{const e=Object(c.q)(null),[t,a]=Object(c.r)(),s=Object(c.q)(),[n,r]=Object(c.r)();Object(c.n)(()=>{O.e&&ns()},[]);const o=Object(c.m)(async()=>{try{const{stop:t,pause:n}=await cs(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(ne.a)(l):void 0,[t,l]),{startRecordingVoice:o,pauseRecordingVoice:i,stopRecordingVoice:l,activeVoiceRecording:t,currentRecordTime:n,recordButtonRef:e,startRecordTimeRef:s}})(),_e=o?Fs.Edit:!O.m||Be||te&&!Oe.length||y?Fs.Send:Fs.Record,We=!t,{isMentionTooltipOpen:Ve,mentionFilter:$e,closeMentionTooltip:ze,insertMention:Qe,mentionFilteredMembers:Ke}=Object(us.a)(C&&!Oe.length,te,ae,void 0,P,T,A),{isContextMenuOpen:Ye,handleContextMenu:Je,handleContextMenuClose:Xe,handleContextMenuHide:Ze}=Object(Mt.a)(He,!(_e===Fs.Send&&We)),et=Object(c.p)(()=>Object(h.c)(m,g),[m,g]),tt=m&&Object(h.gb)(m),at=Object(h.k)(m),{isStickerTooltipOpen:st,closeStickerTooltip:ct}=function(e,t,a){const{loadStickersForEmoji:n,clearStickersForEmoji:r}=Object(s.d)(),o=O.d&&1===Object(ds.a)(t)||!O.d&&Boolean(t.match(/^]*?>$/g)),i=Boolean(a)&&o;return Object(c.n)(()=>{e&&o?n({emoji:t}):!i&&o||r()},[t,o,r,n,e]),{isStickerTooltipOpen:i,closeStickerTooltip:r}}(Boolean(F&&et.canSendStickers&&!Oe.length),te,N),{isEmojiTooltipOpen:rt,closeEmojiTooltip:ot,filteredEmojis:it,insertEmoji:lt}=Object(bs.a)(Boolean(F&&et.canSendStickers&&!Oe.length),te,D,void 0,ae),dt=Object(c.m)((e,t=n.v)=>{const a=window.getSelection(),s=document.getElementById(t),c=Object(nt.a)(e,["escape_html","emoji_html","br_html"]).join("").replace(/\u200b+/g,"​");if(a.rangeCount){const t=a.getRangeAt(0);if(Object(Ja.a)(t))return void(O.d?document.execCommand("insertText",!1,e):(!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),t.removeAllRanges(),t.addRange(a))}}(c),s.dispatchEvent(new Event("input",{bubbles:!0}))));ae(`${he.current}${c}`),O.g||requestAnimationFrame(()=>{Object(Qa.a)(s)})}else ae(`${he.current}${c}`)},[]),bt=Object(c.m)(()=>{const e=window.getSelection();if(e.rangeCount){const t=e.getRangeAt(0);if(Object(Ja.a)(t))return void document.execCommand("delete",!1)}ae(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}(he.current))},[]),ut=Object(c.m)(()=>{ae(""),ge([]),ct(),be(),me(void 0),ze(),ot(),O.g?setTimeout(()=>Me(),350):Me()},[ct,be,ze,ot,Me]),mt=Object(ra.a)(i);Object(c.n)(()=>{mt&&i!==mt&&(Fe(),ut())},[i,mt,ut,Fe]);const ht=((e,t,a,s,r,o)=>{Object(c.n)(()=>{a?(t(os(a.content.text)),requestAnimationFrame(()=>{const e=document.getElementById(n.v);Object(Qa.a)(e,!0)})):t("")},[a,t]);return Object(c.m)(()=>{const{text:t,entities:n}=Object(Ka.a)(e.current);a&&(t||Object(h.cb)(a)?(o({messageId:a.id,text:t,entities:n}),s()):r())},[o,a,e,r,s])})(he,ae,o,ut,ke,U);((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(Ka.a)(r.current)}):d({chatId:e,threadId:t})},[d,i,r,l]),u=Object(c.p)(()=>Object(f.a)(e=>e(),n.u,!1),[t]),m=Object(ra.a)(t),h=Object(ra.a)(a);Object(c.n)(()=>(is=t,ls=a,()=>{is=void 0,ls=void 0,b(t,a)}),[t,a,b]),Object(c.n)(()=>{t===m&&a===h||e&&(o(os(e)),requestAnimationFrame(()=>{const e=document.getElementById(n.v);Object(Qa.a)(e,!0)}))},[t,a,e,o,b,m,h]);const O=Object(ra.a)(s);Object(c.n)(()=>{t&&a&&m===t&&h===a&&O!==s&&(s.length?u(()=>{is===t&&ls===a&&b(t,a)}):b(t,a))},[t,s,m,O,h,u,a,b]),Object(c.n)(()=>{function e(){t&&a&&b(t,a)}return window.addEventListener("blur",e),()=>{window.removeEventListener("blur",e)}},[t,a,b])})(u,i,d,te,he,ae,o,H,q),((e,t,a)=>{Object(c.n)(()=>{async function s(s){if(!s.clipboardData)return;const c=document.activeElement;if(c&&"INPUT"===c.tagName&&![n.v,n.w].includes(c.id))return;const{items:r}=s.clipboardData,o=Array.from(r).find(e=>rs.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 Ya(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])})(dt,ge,o);const Ot=Object(c.m)(async(e,t)=>{ge(await Promise.all(e.map(e=>Ya(e.name,e,t))))},[]),jt=Object(c.m)(async(e,t)=>{ge([...Oe,...await Promise.all(e.map(e=>Ya(e.name,e,t)))])},[Oe]),gt=Object(c.m)(()=>{ge([])},[]),ft=Object(c.m)(async(e=!1,t)=>{if("connectionStateReady"!==j)return;let a=Oe;if(Be){const e=await Fe();if(e){const{blob:t,duration:s,waveform:n}=e;a=[await Ya("wonderful-voice-message.ogg",t,!1,{voice:{duration:s,waveform:n}})]}}const{text:s,entities:c}=Object(Ka.a)(he.current);if(a.length||s||y)if(a.length&&s&&s.length>1024){const e=s.length-1024;G({error:{message:"CAPTION_TOO_LONG_PLEASE_REMOVE_CHARACTERS",textParams:{"{EXTRA_CHARS_COUNT}":e,"{PLURAL_S}":e>1?"s":""}}})}else{if(a.length||s){if(at&&!tt){const e=Math.floor(Date.now()/1e3),t=ce.current&&Math.floor(e-ce.current),a=at.nextSendDate&&at.nextSendDate>e;if(t&&t{e={...e,isPreloadedGlobally:!0},t?(me({sticker:e}),le()):(B({sticker:e}),requestAnimationFrame(ut))},[t,le,B,ut]),It=Object(c.m)(e=>{t?(me({gif:e}),le()):(B({gif:e}),requestAnimationFrame(ut))},[t,le,B,ut]),vt=Object(c.m)(e=>{t?(me({poll:e}),z(),le()):(B({poll:e}),z())},[z,le,B,t]),yt=Object(c.m)(()=>{t?(me({isSilent:!0}),le()):ft(!0)},[ft,le,t]),Ct=Object(c.m)(e=>{const{isSilent:t,...a}=ue||{},s=Math.round(Math.max(e.getTime(),Date.now()+6e4)/1e3);ue&&0!==Object.keys(a).length?(B({...ue,scheduledAt:s}),requestAnimationFrame(ut)):ft(!!t,s),be()},[be,ft,ut,ue,B]),Et=Object(c.m)(()=>{Ct(new Date(1e3*n.mb))},[Ct]),wt=Object(c.m)(()=>{be(),me(void 0)},[be]),St=Object(c.m)(e=>{"stickers"===e?(_({query:""}),W({query:void 0})):(W({query:""}),_({query:void 0}))},[_,W]),kt=Object(c.m)(()=>{const e=document.getElementById(n.v);O.g&&e===document.activeElement?(e.blur(),setTimeout(()=>{we()},100)):we()},[we]),Nt=Object(c.m)(()=>{Y({id:i,threadId:d,type:"scheduled"})},[Y,i,d]);Object(c.n)(()=>{I&&O.g&&Me()},[I,Me]),Object(c.n)(()=>{v?xe():setTimeout(()=>{Re()},200)},[v,Re,xe]);const Pt=Object(c.m)(()=>{switch(_e){case Fs.Send:t?(Be&&De(),le()):(ft(),requestAnimationFrame(ut));break;case Fs.Record:Le();break;case Fs.Edit:ht()}},[_e,ut,t,Le,ht,Be,le,De,ft]),Tt=Object(oe.a)(),At=_e===Fs.Record&&!et.canAttachMedia,xt=Object(ra.a)(o,!0),Rt=o||xt,Lt=new Date;Lt.setSeconds(0),Lt.setMilliseconds(0);const Ft=new Date;Ft.setFullYear(Ft.getFullYear()+1);let Dt="SendMessage";switch(_e){case Fs.Edit:Dt="Save edited message";break;case Fs.Record:Dt=At?"Conversation.DefaultRestrictedMedia":"AccDescrVoiceMessage"}const Bt=Object(Z.a)("Composer",!v&&"shown",Ae&&"hover-disabled"),Ut=Object(Z.a)("mobile-symbol-menu-button",Pe?Ee&&"menu-opened":Ee&&"is-loading");return c.a.createElement("div",{className:Bt},et.canAttachMedia&&c.a.createElement(xs.a,{containerId:"#middle-column-portals"},c.a.createElement(Ps,{isOpen:e!==Ge.a.None,withQuick:[e,re].includes(Ge.a.QuickFile),onHide:r,onFileSelect:Ot})),c.a.createElement(ks,{attachments:Oe,caption:Oe.length?te:"",canSuggestMembers:C,groupChatMembers:P,currentUserId:T,usersById:A,recentEmojis:D,onCaptionUpdate:ae,addRecentEmoji:X,onSend:t?le:ft,onFileAppend:jt,onClear:gt}),c.a.createElement(Ns,{isOpen:Boolean(E),onClear:z,onSend:vt}),c.a.createElement(Ls,{isOpen:Boolean(w),onClose:K}),c.a.createElement(Ds,{isOpen:Boolean(M),onClose:J}),Rt&&c.a.createElement(ms,{isOpen:Se,isSchedule:"scheduled"===b,onClose:Ne,message:Rt}),c.a.createElement(Is,{isOpen:Ve,filter:$e,onClose:ze,onInsertUserName:Qe,filteredChatMembers:Ke,usersById:A}),c.a.createElement("div",{id:"message-compose"},c.a.createElement("div",{className:"svg-appendix",ref:ee}),c.a.createElement(Ss,null),c.a.createElement(As,{chatId:i,threadId:d,messageText:Oe.length?"":te,disabled:!et.canAttachEmbedLinks}),c.a.createElement("div",{className:"message-input-wrapper"},O.g?c.a.createElement(de.a,{className:Ut,round:!0,color:"translucent",onClick:Ee?Me:kt,ariaLabel:"Choose emoji, sticker or GIF"},c.a.createElement("i",{className:"icon-smile"}),c.a.createElement("i",{className:"icon-keyboard"}),c.a.createElement(je.a,{color:"gray"})):c.a.createElement(gs,{className:""+(Ee?"activated":""),round:!0,faded:!0,color:"translucent",onActivate:we,ariaLabel:"Choose emoji, sticker or GIF"},c.a.createElement("i",{className:"icon-smile"})),c.a.createElement(ws.a,{id:"message-input-text",html:Oe.length?"":te,placeholder:Be&&window.innerWidth<=600?"":Tt("Message"),shouldSetFocus:Ee,shouldSupressFocus:O.g&&Ee,shouldSupressTextFormatter:rt||Ve,onUpdate:ae,onSend:_e===Fs.Edit?ht:t?le:ft,onSupressedFocus:Me}),k&&c.a.createElement(de.a,{round:!0,faded:!0,className:"scheduled-button",color:"translucent",onClick:Nt,ariaLabel:"Open scheduled messages"},c.a.createElement("i",{className:"icon-schedule"})),S&&!Be&&!o&&c.a.createElement(gs,{className:""+(fe?"activated":""),round:!0,faded:!0,color:"translucent",onActivate:pe,ariaLabel:"Open bot command keyboard"},c.a.createElement("i",{className:"icon-bot-command"})),!Be&&!o&&c.a.createElement(gs,{className:""+(ve?"activated":""),round:!0,faded:!0,color:"translucent",onActivate:ye,ariaLabel:"Add an attachment"},c.a.createElement("i",{className:"icon-attach"})),Be&&Ue&&c.a.createElement("span",{className:"recording-state"},Object(R.i)(Ue-qe.current)),c.a.createElement(ys,{isOpen:st,onStickerSelect:pt}),c.a.createElement(Cs.a,{isOpen:rt,emojis:it,onClose:ot,onEmojiSelect:lt,addRecentEmoji:X}),c.a.createElement(fs,{isOpen:ve,allowedAttachmentOptions:et,onFileSelect:Ot,onPollCreate:$,onClose:Ce}),S&&c.a.createElement(Es,{messageId:S,isOpen:fe,onClose:Ie}),c.a.createElement(ps,{isOpen:Ee,allowedAttachmentOptions:et,onLoad:Te,onClose:Me,onEmojiSelect:dt,onStickerSelect:pt,onGifSelect:It,onRemoveSymbol:bt,onSearchOpen:St,addRecentEmoji:X}))),Be&&c.a.createElement(de.a,{round:!0,color:"danger",className:"cancel",onClick:Fe,ariaLabel:"Cancel voice recording"},c.a.createElement("i",{className:"icon-delete"})),c.a.createElement(de.a,{ref:He,round:!0,color:"secondary",className:`${_e} ${Be?"recording":""}`,disabled:At,ariaLabel:Tt(Dt),onClick:Pt,onContextMenu:_e===Fs.Send&&We?Je:void 0},c.a.createElement("i",{className:"icon-send"}),c.a.createElement("i",{className:"icon-microphone-alt"}),c.a.createElement("i",{className:"icon-check"})),We&&c.a.createElement(vs,{isOpen:Ye,onSilentSend:p?void 0:yt,onScheduleSend:t?void 0:le,onClose:Xe,onCloseAnimationEnd:Ze}),c.a.createElement(Rs,{isOpen:ie,withTimePicker:!0,selectedAt:Lt.getTime(),maxAt:Object(R.k)(Ft),isFutureMode:!0,secondButtonLabel:a?"Send When Online":void 0,onClose:wt,onSubmit:Ct,onSecondButtonClick:a?Et:void 0}))}));var Us=Object(c.h)(e=>{const{isActive:t}=e,a=Object(Me.a)(we.a.Extra,"MobileSearch",!t,!0);return a?c.a.createElement(a,e):void 0});var Hs=Object(c.h)(e=>{const{isActive:t}=e,a=Object(Me.a)(we.a.Extra,"MessageSelectToolbar",!t);return a?c.a.createElement(a,e):void 0});var qs=Object(c.h)(e=>{const{isOpen:t}=e,a=Object(Me.a)(we.a.Extra,"UnpinAllMessagesModal",!t);return a?c.a.createElement(a,e):void 0});a(240);const Gs=O.g?450+n.c:void 0;function _s(e){return"file"===e.kind&&e.type&&n.l.includes(e.type)}var Ws=Object(c.h)(Object(s.h)(e=>{const{theme:t}=e.settings.byKey,{isBlurred:a,background:s,backgroundColor:n,patternColor:c}=e.settings.themes[t]||{},r=Object(o.y)(e),{chats:{listIds:i}}=e,d={theme:t,customBackground:s,backgroundColor:n,patternColor:c,isRightColumnShown:Object(o.V)(e),isBackgroundBlurred:a,isMobileSearchActive:Boolean(O.g&&Object(o.A)(e)),isSelectModeActive:Object(o.R)(e),animationLevel:e.settings.byKey.animationLevel};if(!r||!i.active)return d;const{chatId:b,threadId:u,type:m}=r,j=Object(o.f)(e,b),g=Object(o.ib)(e,b),{chatId:f,messageId:p}=e.audioPlayer,I=j&&Object(h.e)(j,u),v=Object(o.K)(e,b),y="pinned"===m;return{...d,chatId:b,threadId:u,messageListType:m,isPrivate:Object(h.lb)(b),canPost:!y&&(!j||I)&&(!v||O.g),isPinnedMessageList:y,messageSendingRestrictionReason:j&&Object(h.K)(j),hasPinnedOrAudioMessage:u!==l.MAIN_THREAD_ID||Boolean(g&&g.length)||Boolean(f&&p),pinnedMessagesCount:g?g.length:0}},(e,t)=>Object(b.l)(t,["openChat","unpinAllMessages","loadUser"]))(({chatId:e,threadId:t,messageListType:a,isPrivate:s,isPinnedMessageList:r,canPost:o,messageSendingRestrictionReason:i,hasPinnedOrAudioMessage:d,pinnedMessagesCount:b,customBackground:u,theme:m,backgroundColor:h,patternColor:j,isRightColumnShown:g,isBackgroundBlurred:f,isMobileSearchActive:p,isSelectModeActive:I,animationLevel:v,openChat:y,unpinAllMessages:C,loadUser:E})=>{const{width:w}=$e(),[M,S]=Object(c.r)(Ge.a.None),[k,N]=Object(c.r)(),[P,T]=Object(c.r)(),[A,x]=Object(c.r)(!1),R=d&&(wn.bb&&w=n.ab&&we?Object(ne.a)(()=>{y({id:void 0})}):void 0,[e,y]),Object(c.n)(()=>{S(Ge.a.None),N(void 0),T(void 0)},[e]),Object(c.n)(()=>{s&&E({userId:e})},[e,s,E]);const q=Object(c.m)(e=>{if(O.l)return;const{items:t}=e.dataTransfer||{},a=t&&Array.from(t).every(_s);S(a?Ge.a.QuickFile:Ge.a.Document)},[]),G=Object(c.m)(()=>{S(Ge.a.None)},[]),_=Object(c.m)(()=>{x(!0)},[]),W=Object(c.m)(()=>{x(!1)},[]),V=Object(c.m)(()=>{C({chatId:e}),W(),y({id:e})},[C,y,W,e]),$=((e,t)=>{const[a,s]=Object(c.r)(t);return Object(c.n)(()=>{t&&(t.startsWith("#")?s(t):_e.c(n.m,e,_e.a.Blob).then(e=>{const t=URL.createObjectURL(e);Object(We.g)(t).then(()=>{s(`url(${t})`)})}))},[t,e]),t?a:void 0})(m,u),z=Object(Z.a)(U&&"has-header-tools",u&&"custom-bg-image",h&&"custom-bg-color",u&&f&&"blurred",O.n?"mask-image-disabled":"mask-image-enabled"),Q=Object(Z.a)("messaging-disabled",!I&&"shown"),{composerHiddenScale:K,toolbarHiddenScale:Y,composerTranslateX:J,toolbarTranslateX:X,unpinHiddenScale:ee,toolbarForUnpinHiddenScale:te}=Object(c.p)(()=>Qe(w,B),[B,w]),ae=Object(oe.a)(),se=Object(Z.a)("middle-column-footer",!B&&"no-composer",B&&P&&!I&&"with-notch");return c.a.createElement("div",{id:"MiddleColumn",className:z,style:`\n --composer-hidden-scale: ${K};\n --toolbar-hidden-scale: ${Y};\n --unpin-hidden-scale: ${ee};\n --toolbar-unpin-hidden-scale: ${te};\n --composer-translate-x: ${J}px;\n --toolbar-translate-x: ${X}px;\n --pattern-color: ${j};\n --theme-background-color:\n ${h||("dark"===m?n.n:n.J)};\n `},c.a.createElement("div",{id:"middle-column-bg",style:$?"--custom-background: "+$:void 0}),c.a.createElement("div",{id:"middle-column-portals"}),L&&F&&c.a.createElement(c.a.Fragment,null,c.a.createElement("div",{className:"messages-layout",onDragEnter:B?q:void 0},c.a.createElement(jt,{chatId:L,threadId:F,messageListType:D}),c.a.createElement(ce.b,{name:v===n.e?"slide":"fade",activeKey:"thread"===D&&F===l.MAIN_THREAD_ID?1:2,shouldCleanup:!0},()=>c.a.createElement(c.a.Fragment,null,c.a.createElement($a,{key:`${L}-${F}-${D}`,chatId:L,threadId:F,type:D,canPost:B,hasTools:U,onFabToggle:N,onNotchToggle:T}),c.a.createElement("div",{className:se},B&&c.a.createElement(Bs,{chatId:L,threadId:F,messageListType:D,dropAreaState:M,onDropHide:G}),r&&c.a.createElement("div",{className:"unpin-button-container",dir:ae.isRtl?"rtl":void 0},c.a.createElement(de.a,{size:"tiny",fluid:!0,color:"secondary",className:"unpin-all-button",onClick:_},c.a.createElement("i",{className:"icon-unpin"}),c.a.createElement("span",null,ae("Chat.Pinned.UnpinAll",b,"i")))),!r&&!B&&i&&c.a.createElement("div",{className:Q},c.a.createElement("div",{className:"messaging-disabled-inner"},c.a.createElement("span",null,i))),c.a.createElement(Hs,{messageListType:D,isActive:I,canPost:B})))),c.a.createElement(za,{isShown:H,canPost:B})),O.g&&c.a.createElement(Us,{isActive:Boolean(p)})),e&&c.a.createElement(qs,{isOpen:A,chatId:e,pinnedMessagesCount:b,onClose:W,onUnpin:V}))}));a(241);const Vs=Object(f.a)(e=>e(),200,!1);var $s;!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"}($s||($s={}));var zs=Object(c.h)(Object(s.h)((e,{chatId:t,isProfile:a,isManagement:s})=>{const{query:n}=Object(o.A)(e)||{},{query:c}=Object(o.z)(e)||{},{query:r}=Object(o.s)(e)||{},i=t?Object(o.f)(e,t):void 0,l=i&&Object(h.jb)(i);return{canManage:Boolean(!s&&a&&i&&!Object(o.O)(e,i.id)&&(Object(h.lb)(i.id)||(Object(h.gb)(i)||i.isCreator)&&!i.isNotJoined)),isChannel:l,messageSearchQuery:n,stickerSearchQuery:c,gifSearchQuery:r}},(e,t)=>Object(b.l)(t,["setLocalTextSearchQuery","setStickerSearchQuery","setGifSearchQuery","searchTextMessagesLocal","toggleManagement","searchMessagesByDate"]))(({isColumnOpen:e,isProfile:t,isSearch:a,isManagement:s,isStickerSearch:n,isGifSearch:r,isPollResults:o,profileState:i,managementScreen:l,canManage:b,isChannel:u,onClose:m,messageSearchQuery:h,stickerSearchQuery:j,gifSearchQuery:g,setLocalTextSearchQuery:f,setStickerSearchQuery:p,setGifSearchQuery:I,searchTextMessagesLocal:v,toggleManagement:y,searchMessagesByDate:C,shouldSkipAnimation:E})=>{var w;const M=Object(c.q)(null),[S,k,N]=Object(se.a)(),P=Object(c.m)(e=>{f({query:e}),e.length&&Vs(v)},[v,f]),T=Object(c.m)(e=>{C({timestamp:e.valueOf()/1e3}),N()},[N,C]),A=Object(c.m)(e=>{p({query:e,noPushState:!0})},[p]),x=Object(c.m)(e=>{I({query:e,noPushState:!0})},[I]),[R,L]=Object(c.r)(!e);Object(c.n)(()=>{setTimeout(()=>{L(!e)},300)},[e]);const F=Object(oe.a)(),D=t?i===d.k.Profile?$s.Profile:i===d.k.SharedMedia?$s.SharedMedia:i===d.k.MemberList?$s.MemberList:-1:a?$s.Search:o?$s.PollResults:n?$s.StickerSearch:r?$s.GifSearch:s?l===d.g.Initial?$s.ManageInitial:l===d.g.ChatPrivacyType?$s.ManageChatPrivacyType:l===d.g.Discussion?$s.ManageDiscussion:l===d.g.ChannelSubscribers?$s.ManageChannelSubscribers:l===d.g.GroupPermissions?$s.ManageGroupPermissions:l===d.g.ChatAdministrators?$s.ManageChatAdministrators:l===d.g.GroupRemovedUsers?$s.ManageGroupRemovedUsers:l===d.g.GroupUserPermissionsCreate?$s.ManageGroupUserPermissionsCreate:l===d.g.GroupUserPermissions?$s.ManageGroupUserPermissions:l===d.g.GroupRecentActions?$s.ManageGroupRecentActions:l===d.g.ChatAdminRights?$s.ManageGroupAdminRights:l===d.g.GroupMembers?$s.ManageGroupMembers:void 0:void 0,B=null!==(w=Object(Je.a)(D,!0))&&void 0!==w?w:-1;function U(){if(-1!==B)switch(B){case $s.PollResults:return c.a.createElement("h3",null,F("PollResults"));case $s.Search:return c.a.createElement(c.a.Fragment,null,c.a.createElement(be.a,{parentContainerClassName:"RightSearch",value:h,onChange:P}),c.a.createElement(de.a,{round:!0,size:"smaller",color:"translucent",onClick:k,ariaLabel:"Search messages by date"},c.a.createElement("i",{className:"icon-calendar"})));case $s.ManageInitial:return c.a.createElement("h3",null,F("Edit"));case $s.ManageChatPrivacyType:return c.a.createElement("h3",null,F(u?"ChannelTypeHeader":"GroupTypeHeader"));case $s.ManageDiscussion:return c.a.createElement("h3",null,F("Discussion"));case $s.ManageChatAdministrators:return c.a.createElement("h3",null,F("ChannelAdministrators"));case $s.ManageGroupRecentActions:return c.a.createElement("h3",null,F("Group.Info.AdminLog"));case $s.ManageGroupAdminRights:return c.a.createElement("h3",null,F("EditAdminRights"));case $s.ManageGroupPermissions:return c.a.createElement("h3",null,F("ChannelPermissions"));case $s.ManageGroupRemovedUsers:return c.a.createElement("h3",null,F("ChannelBlockedUsers"));case $s.ManageGroupUserPermissionsCreate:return c.a.createElement("h3",null,F("ChannelAddException"));case $s.ManageGroupUserPermissions:return c.a.createElement("h3",null,F("UserRestrictions"));case $s.StickerSearch:return c.a.createElement(be.a,{value:j,placeholder:F("SearchStickersHint"),onChange:A});case $s.GifSearch:return c.a.createElement(be.a,{value:g,placeholder:F("SearchGifsTitle"),onChange:x});case $s.SharedMedia:return c.a.createElement("h3",null,F("SharedMedia"));case $s.ManageChannelSubscribers:return c.a.createElement("h3",null,F("ChannelSubscribers"));case $s.MemberList:case $s.ManageGroupMembers:return c.a.createElement("h3",null,F("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(de.a,{round:!0,color:"translucent",size:"smaller",ariaLabel:F("Edit"),onClick:y},c.a.createElement("i",{className:"icon-edit"}))))}}const H=O.g||D===$s.SharedMedia||D===$s.MemberList||s,q=Object(Z.a)("animated-close-icon",(R||E)&&"no-transition");return Object(c.n)(()=>{M.current.classList.toggle("state-back",H)},[H]),c.a.createElement("div",{className:"RightHeader"},c.a.createElement(de.a,{className:"close-button",round:!0,color:"translucent",size:"smaller",onClick:m,ariaLabel:F(H?"Common.Back":"Common.Close")},c.a.createElement("div",{ref:M,className:q})),c.a.createElement(ce.b,{name:R||E?"none":"slide-fade",activeKey:B},U),!O.g&&c.a.createElement(Rs,{isOpen:S,isPastMode:!0,submitButtonLabel:F("JumpToDate"),onClose:N,onSubmit:T}))})),Qs=a(125);function Ks(e,t,a,s,r,o,i,l,d,b,u){const m="members"!==s&&r?r:s,O=Object(c.p)(()=>{if(o&&i)return Object(h.Eb)(o.map(({userId:e})=>e),i)},[o,i]),[j,g,f]=function(e,t,a,s){const[c,r]=Object(Qs.a)(a?t:void 0,s,void 0,n.S),o=!c||!s||c[0]===s[0];return[c,r,!o]}(0,t,u,O),[p,I,v]=Ys("media",m,a,u,l,d),[y,C,E]=Ys("documents",m,a,u,l,d),[w,M,S]=Ys("links",m,a,u,l,d),[k,N,P]=Ys("audio",m,a,u,l,d);let T,A,x=!1;switch(m){case"members":T=j,A=g,x=f;break;case"media":T=p,A=I,x=v;break;case"documents":T=y,A=C,x=E;break;case"links":T=w,A=M,x=S;break;case"audio":T=k,A=N,x=P}return[m,T,A,x]}function Ys(e,t,a,s,r,o){const i=Object(c.q)();Object(pe.a)(()=>{t===e&&r&&o&&(i.current=Object(h.w)(r,o,e).reverse())},[r,o,t,e]);const[l,d]=Object(Qs.a)(s?a:void 0,i.current,void 0,"media"===e?n.ob:n.Y);return[l,d,!(!l||!i.current||l[0]===i.current[0])]}var Js=a(57);const Xs=Object(f.g)(e=>e(),250,!1);let Zs=!1;var en=a(110),tn=a(103);var an=a(131),sn=a(189);a(242);var nn=Object(c.h)(({chat:e,user:t,photo:a,isFirstPhoto:s,isSavedMessages:n,lastSyncTime:r,onClick:o})=>{const i=Object(oe.a)(),d=t&&Object(h.pb)(t);function b(s="big",c){if(a&&!c)return`photo${a.id}?size=c`;let r;return n||d||(t?r=Object(h.f)(t,s):e&&(r=Object(h.f)(e,s))),r}const u=b(),m=Object(ct.a)(u,!1,l.ApiMediaFormat.BlobUrl,r),O=Object(ct.a)(!m&&s?b("normal",!0):void 0,!1,l.ApiMediaFormat.BlobUrl,r),j=Object(sn.a)(!m&&a&&a.thumbnail&&a.thumbnail.dataUri),g=m||O||j,f=Object(ra.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(h.Z)(t);p=e?Object(Xe.c)(e,2):void 0}else if(!g&&e){const t=Object(h.l)(i,e);p=t&&Object(Xe.c)(t,Object(h.lb)(e.id)?2:1)}else p=c.a.createElement("div",{className:"spinner-wrapper"},c.a.createElement(je.a,{color:"white"}));const I=Object(Z.a)("ProfilePhoto","color-bg-"+Object(h.X)(t||e),n&&"saved-messages",d&&"deleted-account",!n&&!g&&"no-photo");return c.a.createElement("div",{className:I,onClick:g?o:void 0},f&&g&&f!==g&&c.a.createElement("img",{src:f,className:"prev-avatar-media",alt:"",decoding:"async"}),"string"==typeof p?Object(nt.a)(p,["hq_emoji"]):p)});a(243);var cn=Object(c.h)(Object(s.h)((e,{userId:t,forceShowSelf:a})=>{const{lastSyncTime:s}=e,n=Object(o.Fb)(e,t),c=Object(o.f)(e,t),r=!a&&n&&n.isSelf,{animationLevel:i}=e.settings.byKey;return{lastSyncTime:s,user:n,chat:c,isSavedMessages:r,animationLevel:i}},(e,t)=>Object(b.l)(t,["loadFullUser","openMediaViewer"]))(({user:e,chat:t,isSavedMessages:a,lastSyncTime:s,animationLevel:n,loadFullUser:r,openMediaViewer:o})=>{const{id:i}=e||{},{id:b}=t||{},u=e?Object(h.Z)(e):t?t.title:"",m=(e?e.photos:t?t.photos:void 0)||[],j=n>=1?"slide":"none",[g,f]=Object(c.r)(0),p=a||m.length<=1||0===g,I=a||m.length<=1||g===m.length-1;Object(c.n)(()=>{g>m.length&&f(Math.max(0,m.length-1))},[g,m.length]);const v=Object(oe.a)();Object(c.n)(()=>{s&&i&&r({userId:i})},[i,r,s]),function(e,t,a){Object(c.n)(()=>{t.slice(a,a+4).forEach(e=>{mt.c(`photo${e.id}?size=c`)||mt.b(`photo${e.id}?size=c`,l.ApiMediaFormat.BlobUrl)})},[a,t])}(0,m,g);const y=Object(c.m)(()=>{o({avatarOwnerId:i||b,profilePhotoIndex:g,origin:d.h.ProfileAvatar})},[o,i,b,g]),C=Object(c.m)(()=>{p||f(g-1)},[g,p]),E=Object(c.m)(()=>{I||f(g+1)},[g,I]);if(Object(c.n)(()=>{const e=document.querySelector(".profile-slide-container > .active, .profile-slide-container > .to");if(e)return Object(fe.b)(e,{excludedClosestSelector:".navigation",onSwipe:O.l?(e,t)=>{t===fe.a.Right?C():t===fe.a.Left&&E()}:void 0})},[E,C]),!e&&!t)return;function w(){const s=!a&&m&&m.length>0?m[g]:void 0;return c.a.createElement(nn,{key:g,user:e,chat:t,photo:s,isSavedMessages:a,isFirstPhoto:p,onClick:y})}const M=e&&e.isVerified||t&&t.isVerified;return c.a.createElement("div",{className:"ProfileInfo",dir:v.isRtl?"rtl":void 0},c.a.createElement("div",{className:"photo-wrapper"},function(){if(!(a||!m||m.length<=1))return c.a.createElement("div",{className:"photo-dashes"},m.map((e,t)=>c.a.createElement("span",{className:"photo-dash "+(t===g?"current":"")})))}(),c.a.createElement(ce.b,{activeKey:g,name:j,className:"profile-slide-container"},w),!p&&c.a.createElement("button",{type:"button",className:"navigation prev","aria-label":v("AccDescrPrevious"),onClick:C}),!I&&c.a.createElement("button",{type:"button",className:"navigation next","aria-label":v("Next"),onClick:E})),c.a.createElement("div",{className:"info",dir:v.isRtl?"rtl":"auto"},a?c.a.createElement("div",{className:"title"},c.a.createElement("h3",{dir:"auto"},v("SavedMessages"))):c.a.createElement("div",{className:"title"},c.a.createElement("h3",{dir:"auto"},u&&Object(nt.a)(u)),M&&c.a.createElement(an.a,null)),!a&&(e?c.a.createElement("div",{className:"status "+(Object(h.xb)(e)?"online":"")},c.a.createElement("span",{className:"user-status",dir:"auto"},Object(h.ab)(v,e))):c.a.createElement("span",{className:"status",dir:"auto"},Object(h.jb)(t)?v("Subscribers",t.membersCount,"i"):v("Members",t.membersCount,"i")))))}));var rn=Object(c.h)(Object(s.h)((e,{chatOrUserId:t})=>{const{lastSyncTime:a}=e,s=t?Object(o.f)(e,t):void 0;return{lastSyncTime:a,chat:s,user:Object(h.lb)(t)?Object(o.Fb)(e,t):void 0,canInviteUsers:s&&(!Object(h.jb)(s)&&!Object(h.yb)(s,"inviteUsers")||Object(h.q)(s,"inviteUsers"))}},(e,t)=>Object(b.l)(t,["loadFullUser","updateChatMutedState","showNotification"]))(({lastSyncTime:e,user:t,chat:a,forceShowSelf:s,canInviteUsers:n,loadFullUser:r,showNotification:o,updateChatMutedState:i})=>{const{id:l,fullInfo:d,username:b,phoneNumber:u,isSelf:m}=t||{},{id:O,isMuted:j,username:g}=a||{},f=Object(oe.a)();Object(c.n)(()=>{e&&l&&r({userId:l})},[r,l,e]);const p=Object(c.m)(()=>{i({chatId:O,isMuted:!j})},[O,j,i]);if(!a||a.isRestricted||m&&!s)return;function I(e,t){Object(w.c)(e),o({message:t+" was copied"})}const v=u&&Object(ga.c)(u),y=Object(h.h)(a),C=0===y.indexOf("http")?y:"http://"+y,E=b||g,M=d&&d.bio||Object(h.g)(a);return c.a.createElement("div",{className:"ChatExtra"},v&&!!v.length&&c.a.createElement(tn.a,{icon:"phone",multiline:!0,narrow:!0,ripple:!0,onClick:()=>I(v,f("Phone"))},c.a.createElement("span",{className:"title",dir:"auto"},v),c.a.createElement("span",{className:"subtitle"},f("Phone"))),E&&c.a.createElement(tn.a,{icon:"mention",multiline:!0,narrow:!0,ripple:!0,onClick:()=>I("@"+E,f("Username"))},c.a.createElement("span",{className:"title",dir:"auto"},Object(nt.a)(E)),c.a.createElement("span",{className:"subtitle"},f("Username"))),M&&!!M.length&&c.a.createElement(tn.a,{icon:"info",multiline:!0,narrow:!0,isStatic:!0},c.a.createElement("span",{className:"title",dir:"auto"},Object(nt.a)(M,["br","links","emoji"])),c.a.createElement("span",{className:"subtitle"},f(l?"UserBio":"Info"))),n&&!E&&!!y.length&&c.a.createElement(tn.a,{icon:"mention",multiline:!0,narrow:!0,ripple:!0,onClick:()=>I(y,f("SetUrlPlaceholder"))},c.a.createElement("div",{className:"title"},c.a.createElement(Sa.a,{url:C,className:"title",text:y})),c.a.createElement("span",{className:"subtitle"},f("SetUrlPlaceholder"))),c.a.createElement(tn.a,{icon:"unmute",ripple:!0,onClick:p},c.a.createElement("span",null,f("Notifications")),c.a.createElement(me,{id:"group-notifications",label:l?"Toggle User Notifications":"Toggle Chat Notifications",checked:!j,inactive:!0})))})),on=a(163),ln=a(183),dn=a(115);a(247);const bn=[{type:"media",title:"SharedMediaTab2"},{type:"documents",title:"SharedFilesTab2"},{type:"links",title:"SharedLinksTab2"},{type:"audio",title:"SharedMusicTab2"}];function un(e){return[`.shared-media-transition > div:only-child > .${e}-list > .scroll-item`,`.shared-media-transition > div.active > .${e}-list > .scroll-item`].join(", ")}var mn=Object(c.h)(Object(s.h)((e,{chatId:t,userId:a})=>{const s=Object(o.f)(e,t),n=Object(o.m)(e,a||t),{currentType:c,resultsByType:r}=Object(o.v)(e)||{},{foundIds:i}=r&&c&&r[c]||{},{byId:l}=e.users,d=s&&Object(h.kb)(s),b=s&&Object(h.jb)(s),u=d||b&&Object(h.gb)(s),m=s&&s.fullInfo&&s.fullInfo.members,O=u&&s&&s.fullInfo&&!s.fullInfo.canViewMembers;let j;return a?j=a:Object(h.lb)(t)&&(j=t),{isChannel:b,resolvedUserId:j,chatMessages:n,foundIds:i,mediaSearchType:c,hasMembersTab:u,areMembersHidden:O,...u&&m&&{members:m,usersById:l},isRightColumnShown:Object(o.V)(e),isRestricted:s&&s.isRestricted,lastSyncTime:e.lastSyncTime}},(e,t)=>Object(b.l)(t,["setLocalMediaSearchType","loadMoreMembers","searchMediaMessagesLocal","openMediaViewer","openAudioPlayer","openUserInfo","focusMessage","loadProfilePhotos"]))(({chatId:e,profileState:t,onProfileStateChange:a,isChannel:s,resolvedUserId:r,chatMessages:o,foundIds:i,mediaSearchType:b,hasMembersTab:u,areMembersHidden:m,members:h,usersById:j,isRightColumnShown:g,isRestricted:f,lastSyncTime:p,setLocalMediaSearchType:I,loadMoreMembers:v,searchMediaMessagesLocal:y,openMediaViewer:C,openAudioPlayer:E,openUserInfo:w,focusMessage:M,loadProfilePhotos:S})=>{const k=Object(c.q)(null),N=Object(c.q)(null),P=Object(oe.a)(),[T,A]=Object(c.r)(0),x=Object(c.p)(()=>[...u?[{type:"members",title:s?"ChannelSubscribers":"GroupMembers"}]:[],...bn],[u,s]),R=x[T].type,[L,F,D,B]=Ks(0,v,y,R,b,h,j,o,i,0,p),U=x.findIndex(({type:e})=>e===L),{handleScroll:H}=function(e,t,a,s){Object(Js.a)(([a])=>{if(a&&a!==t){const a=e.current,n=a.querySelector(".TabList");a.scrollTop{Zs=!1},350))}},[t,s]),Object(Js.a)(([t])=>{if(a!==d.k.Profile||a===t)return;const n=e.current;if(!n)return;const c=n.querySelector(".TabList");!c||c.offsetTop>n.scrollTop||(Zs=!0,Object(Ct.a)(n,n.firstElementChild,"start",void 0,2*n.offsetHeight),setTimeout(()=>{Zs=!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=d.k.Profile;a.scrollTop>=n.offsetTop&&(c="members"===t?d.k.MemberList:d.k.SharedMedia),s(c)},[e,s,t]);return Object(c.n)(()=>{Zs||n()},[n,t]),{handleScroll:Object(c.m)(()=>{Zs||Xs(n)},[n])}}(k,R,t,a),{applyTransitionFix:q,releaseTransitionFix:G}=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])}}(k),[_,W]=(()=>{const[e,t]=Object(c.r)(!1);return[e,Object(c.m)(()=>{t(e=>!e)},[])]})(),V=Object(c.m)(()=>{G(),W()},[G,W]);Object(c.n)(()=>{I({mediaType:R})},[I,R]);const $=r||e;Object(c.n)(()=>{p&&S({profileId:$})},[S,$,p]);const z=Object(c.m)(e=>{C({chatId:$,threadId:l.MAIN_THREAD_ID,messageId:e,origin:d.h.SharedMedia})},[$,C]),Q=Object(c.m)(e=>{E({chatId:$,messageId:e})},[$,E]),K=Object(c.m)(e=>{w({id:e})},[w]),Y=Object(c.m)(e=>{M({chatId:$,messageId:e})},[$,M]);let J;Object(c.n)(()=>{if(N.current&&O.l)return Object(fe.b)(N.current,{onSwipe:(e,t)=>{t===fe.a.Left?A(Math.min(T+1,x.length-1)):t===fe.a.Right&&A(Math.max(0,T-1))}})},[T,x.length]);const X="members"===L||!u&&"media"===L;X?J=g?0:1e3:F||(J=n.pb);const Z=Object(Ms.a)([e,L],J);function ee(){if(!F||!Z||!o){const e=X&&F&&!Z;return c.a.createElement("div",{className:"content empty-list"},!e&&c.a.createElement(je.a,null))}if(!F.length){let e;switch(L){case"members":e=m?"You have no access to group members list.":"No members found";break;case"documents":e=P("lng_media_file_empty_search");break;case"links":e=P("lng_media_link_empty_search");break;case"audio":e=P("lng_media_song_empty_search");break;default:e=P("SharedMedia.EmptyTitle")}return c.a.createElement("div",{className:"content empty-list"},c.a.createElement(dn.a,{text:e}))}return c.a.createElement("div",{className:`content ${L}-list`,dir:P.isRtl&&"media"===L?"rtl":void 0,teactFastList:!0},"media"===L?F.map(e=>o[e]&&c.a.createElement(on.a,{key:e,message:o[e],onClick:z})):"documents"===L?F.map(e=>o[e]&&c.a.createElement(Qt.a,{key:e,message:o[e],withDate:!0,smaller:!0,className:"scroll-item",onDateClick:Y})):"links"===L?F.map(e=>o[e]&&c.a.createElement(ln.a,{key:e,message:o[e],onMessageClick:Y})):"audio"===L?F.map(e=>o[e]&&c.a.createElement(Kt.a,{key:e,renderingFor:"sharedMedia",message:o[e],date:o[e].date,lastSyncTime:p,className:"scroll-item",onPlay:Q,onDateClick:Y})):"members"===L?F.map((e,t)=>c.a.createElement(tn.a,{key:e,teactOrderKey:t,className:"chat-item-clickable scroll-item",onClick:()=>K(e)},c.a.createElement(Ze.a,{userId:e,forceShowSelf:!0}))):void 0)}return c.a.createElement(en.a,{ref:k,className:"Profile custom-scroll",itemSelector:un(L),items:Z?F:void 0,cacheBuster:_,sensitiveArea:n.gb,preloadBackwards:Z?"members"===L?n.S:n.ob:0,noScrollRestoreOnTop:!0,noFastList:!0,onLoadMore:D,onScroll:H},!B&&function(e,t){return c.a.createElement("div",{className:"profile-info"},c.a.createElement(cn,{userId:t||e,forceShowSelf:t!==e}),c.a.createElement(rn,{chatOrUserId:t||e,forceShowSelf:t!==e}))}(e,r),!f&&c.a.createElement("div",{className:"shared-media"},c.a.createElement(ce.b,{ref:N,name:P.isRtl?"slide-reversed":"slide",activeKey:U,renderCount:x.length,shouldRestoreHeight:!0,className:"shared-media-transition",onStart:q,onStop:V},ee),c.a.createElement(ye.a,{big:!0,activeTab:T,tabs:x,onSwitchTab:A})))}));var hn=Object(c.h)(e=>{const t=Object(Me.a)(we.a.Extra,"RightSearch");return t?c.a.createElement(t,e):c.a.createElement(Se.a,null)});var On=Object(c.h)(e=>{const t=Object(Me.a)(we.a.Extra,"Management");return t?c.a.createElement(t,e):c.a.createElement(Se.a,null)});var jn=Object(c.h)(()=>{const e=Object(Me.a)(we.a.Extra,"StickerSearch");return e?c.a.createElement(e,null):c.a.createElement(Se.a,null)});var gn=Object(c.h)(()=>{const e=Object(Me.a)(we.a.Extra,"GifSearch");return e?c.a.createElement(e,null):c.a.createElement(Se.a,null)});var fn=Object(c.h)(()=>{const e=Object(Me.a)(we.a.Extra,"PollResults");return e?c.a.createElement(e,null):c.a.createElement(Se.a,null)});a(248);const pn=Object.keys(d.l).length/2,In=Object.keys(d.g).length/2;function vn(){const e=document.querySelector(".RightHeader .SearchInput input");e&&e.blur()}var yn=Object(c.h)(Object(s.h)(e=>{const{chatId:t,threadId:a}=Object(o.y)(e)||{},s=Object(o.d)(e);return{contentKey:Object(o.mb)(e),chatId:t,threadId:a,currentProfileUserId:e.users.selectedId,isChatSelected:Boolean(t&&s)}},(e,t)=>Object(b.l)(t,["openUserInfo","toggleChatInfo","toggleManagement","closeLocalTextSearch","setStickerSearchQuery","setGifSearchQuery","closePollResults"]))(({contentKey:e,chatId:t,threadId:a,currentProfileUserId:s,isChatSelected:r,toggleChatInfo:o,toggleManagement:l,openUserInfo:b,closeLocalTextSearch:u,setStickerSearchQuery:m,setGifSearchQuery:h,closePollResults:O})=>{var j;const{width:g}=$e(),[f,p]=Object(c.r)(d.k.Profile),[I,v]=Object(c.r)(d.g.Initial),[y,C]=Object(c.r)(),[E,w]=Object(c.r)(),M=f!==d.k.Profile,S=void 0!==e,k=e===d.l.ChatInfo||e===d.l.UserInfo,N=e===d.l.Search,P=e===d.l.Management,T=e===d.l.StickerSearch,A=e===d.l.GifSearch,x=e===d.l.PollResults,R=g<=n.bb,[L,F]=Object(c.r)(!S),D=null!==(j=Object(Je.a)(e,!0,!r))&&void 0!==j?j:-1,B=Object(c.m)((t=!1)=>{switch(e){case d.l.ChatInfo:if(M&&(p(d.k.Profile),!t))break;o({noPushState:t},!0);break;case d.l.UserInfo:if(M&&(p(d.k.Profile),!t))break;b({id:void 0});break;case d.l.Management:switch(I){case d.g.Initial:l({noPushState:t},!0);break;case d.g.ChatPrivacyType:case d.g.Discussion:case d.g.GroupPermissions:case d.g.GroupType:case d.g.ChatAdministrators:case d.g.ChannelSubscribers:case d.g.GroupMembers:t||i.a.back(),v(d.g.Initial);break;case d.g.GroupUserPermissionsCreate:case d.g.GroupRemovedUsers:case d.g.GroupUserPermissions:t||i.a.back(),v(d.g.GroupPermissions),C(void 0),w(void 0);break;case d.g.ChatAdminRights:case d.g.GroupRecentActions:t||i.a.back(),v(d.g.ChatAdministrators)}break;case d.l.Search:vn(),u({noPushState:t});break;case d.l.StickerSearch:vn(),m({query:void 0,noPushState:t});break;case d.l.GifSearch:vn(),h({query:void 0,noPushState:t});break;case d.l.PollResults:O({noPushState:t})}},[e,M,o,b,O,I,l,u,m,h]),U=Object(c.m)(()=>{B(!1)},[B]);Object(ae.a)((e,t,a)=>{a&&"right"===a.type&&(t&&(F(!0),setTimeout(()=>F(!1),300)),B(!0))});const H=Object(c.m)((e,t)=>{C(e),w(t)},[]),q=Object(c.m)(t=>{t!==I&&(i.a.pushState({type:"right",contentKey:e}),v(t))},[e,I]);function G(){if(-1!==D)switch(D){case d.l.ChatInfo:case d.l.UserInfo:return c.a.createElement(mn,{key:s||t,chatId:t,userId:s,profileState:f,onProfileStateChange:p});case d.l.Search:return c.a.createElement(hn,{chatId:t,threadId:a});case d.l.Management:return c.a.createElement(On,{chatId:t,currentScreen:I,isPromotedByCurrentUser:E,selectedChatMemberId:y,onScreenSelect:q,onChatMemberSelect:H});case d.l.StickerSearch:return c.a.createElement(jn,null);case d.l.GifSearch:return c.a.createElement(gn,null);case d.l.PollResults:return c.a.createElement(fn,null)}}return Object(c.n)(()=>S?Object(ne.a)(B):void 0,[S,B]),Object(c.n)(()=>{setTimeout(()=>{F(!S)},300)},[S]),Object(c.n)(()=>{S&&R&&B()},[R]),Object(gt.a)(([a,s])=>{(a===d.l.ChatInfo&&e===d.l.UserInfo||a===d.l.UserInfo&&e===d.l.ChatInfo||s!==t)&&(p(d.k.Profile),v(d.g.Initial))},[e,t]),c.a.createElement("div",{id:"RightColumn-wrapper",className:r?void 0:"is-hidden"},R&&c.a.createElement("div",{className:"overlay-backdrop",onClick:B}),c.a.createElement("div",{id:"RightColumn"},c.a.createElement(zs,{chatId:t,isColumnOpen:S,isProfile:k,isSearch:N,isManagement:P,isStickerSearch:T,isGifSearch:A,isPollResults:x,profileState:f,managementScreen:I,onClose:U,shouldSkipAnimation:L}),c.a.createElement(ce.b,{name:L?"none":"zoom-fade",renderCount:pn+In,activeKey:P?pn+I:D},G)))}));var Cn=Object(c.h)(({isOpen:e})=>{const t=Object(Me.a)(we.a.Extra,"MediaViewer",!e);return t?c.a.createElement(t,null):void 0});var En=Object(c.h)(({isOpen:e})=>{const t=Object(Me.a)(we.a.Extra,"Notifications",!e);return t?c.a.createElement(t,null):void 0});var wn=Object(c.h)(({isOpen:e})=>{const t=Object(Me.a)(we.a.Extra,"Errors",!e);return t?c.a.createElement(t,null):void 0});var Mn=Object(c.h)(e=>{const{isOpen:t}=e,a=Object(Me.a)(we.a.Extra,"ForwardPicker",!t);return a?c.a.createElement(a,e):void 0});var Sn=Object(c.h)(e=>{const{url:t}=e,a=Object(Me.a)(we.a.Extra,"SafeLinkModal",!t);return a?c.a.createElement(a,e):void 0});a(249);let kn,Nn,Pn=!1;function Tn(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")})}var An=Object(c.h)(Object(s.h)(e=>{const{chatId:t,messageId:a}=e.audioPlayer,s=t&&a?Object(o.k)(e,t,a):void 0;return{animationLevel:e.settings.byKey.animationLevel,lastSyncTime:e.lastSyncTime,isLeftColumnShown:e.isLeftColumnShown,isRightColumnShown:Object(o.V)(e),isMediaViewerOpen:Object(o.S)(e),isForwardModalOpen:Object(o.Q)(e),hasNotifications:Boolean(e.notifications.length),hasErrors:Boolean(e.errors.length),audioMessage:s,safeLinkModalUrl:e.safeLinkModalUrl}},(e,t)=>Object(b.l)(t,["loadAnimatedEmojis","openChat"]))(({lastSyncTime:e,loadAnimatedEmojis:t,openChat:a,isLeftColumnShown:r,isRightColumnShown:i,isMediaViewerOpen:l,isForwardModalOpen:d,animationLevel:b,hasNotifications:u,hasErrors:m,audioMessage:h,safeLinkModalUrl:O})=>{n.p&&!Pn&&(Pn=!0,console.log(">>> RENDER MAIN")),Object(c.n)(()=>{e&&t()},[e,t]);const[j,g]=Object(c.r)(!1),{transitionClassNames:f}=Object(ee.a)(!r,void 0,!0,void 0,j),{transitionClassNames:p}=Object(ee.a)(i,void 0,!0,void 0,j),I=Object(Z.a)(f.replace(/([\w-]+)/g,"middle-column-$1"),p.replace(/([\w-]+)/g,"right-column-$1"),j&&"history-animation-disabled");function v(e){e.preventDefault(),e.stopPropagation()}return Object(c.n)(()=>{document.body.classList.toggle("is-middle-column-open",I.includes("middle-column-open")),document.body.classList.toggle("is-right-column-shown",I.includes("right-column-open"))},[I]),Object(c.n)(()=>{b>0&&(document.body.classList.add("animating-right-column"),Object(X.b)(350+n.c),kn&&(clearTimeout(kn),kn=void 0),kn=window.setTimeout(()=>{document.body.classList.remove("animating-right-column"),kn=void 0},350+n.c))},[b,i]),Object(te.a)(()=>{const e=Object(o.q)(Object(s.e)());let t=0;clearInterval(Nn),Nn=window.setInterval(()=>{if(document.title.includes(n.E))Tn(!1);else{if(t%2==0){const t=Object(o.q)(Object(s.e)())-e;t>0&&(document.title=`${t} notification${t>1?"s":""}`,Tn(!0))}else document.title=n.fb,Tn(!1);t++}},1e3)},()=>{clearInterval(Nn),Nn=void 0,document.title.includes(n.E)||(document.title=n.fb),Tn(!1)}),Object(ae.a)((e,t)=>{const{state:s}=e;if("right"!==s.type)if("chat"===s.type){const{chatId:e,threadId:t,messageListType:n}=s;a({id:e,threadId:t,type:n,noPushState:!0},!0)}else a({id:void 0,noPushState:!0},!0);t&&(g(!0),setTimeout(()=>{g(!1)},n.pb))}),c.a.createElement("div",{id:"Main",className:I,onDrop:v,onDragOver:v},c.a.createElement(qe,null),c.a.createElement(Ws,null),c.a.createElement(yn,null),c.a.createElement(Cn,{isOpen:l}),c.a.createElement(Mn,{isOpen:d}),c.a.createElement(En,{isOpen:u}),c.a.createElement(wn,{isOpen:m}),h&&c.a.createElement(Ot,{key:h.id,message:h,noUi:!0}),c.a.createElement(Sn,{url:O}))}));n.p&&console.log(">>> FINISH LOAD MAIN BUNDLE"),Object(s.e)().connectionState||Object(s.d)().initApi()},195:function(e,t,a){},196:function(e,t,a){},197:function(e,t,a){},208:function(e,t,a){},209:function(e,t,a){},210:function(e,t,a){},213:function(e,t,a){},214:function(e,t,a){},215:function(e,t,a){},219:function(e,t,a){},220:function(e,t,a){},222:function(e,t,a){},225:function(e,t,a){},226:function(e,t,a){},227:function(e,t,a){},228:function(e,t,a){},229:function(e,t,a){},230:function(e,t,a){},231:function(e,t,a){},232:function(e,t,a){},233:function(e,t,a){},234:function(e,t,a){},235: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){},247:function(e,t,a){},248:function(e,t,a){},249:function(e,t,a){}}]); +//# sourceMappingURL=4.292f70afdd30b166608d.js.map \ No newline at end of file diff --git a/dist/4.292f70afdd30b166608d.js.map b/dist/4.292f70afdd30b166608d.js.map new file mode 100644 index 000000000..7edc4b610 --- /dev/null +++ b/dist/4.292f70afdd30b166608d.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["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/localSearch.ts","webpack:///./src/modules/actions/ui/stickerSearch.ts","webpack:///./src/modules/actions/ui/users.ts","webpack:///./src/modules/actions/ui/settings.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/actions/api/settings.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/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/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/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/hooks/useStickyDates.ts","webpack:///./src/hooks/useDebounce.ts","webpack:///./src/components/middle/MessageScroll.tsx","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/MessageList.tsx","webpack:///./src/components/middle/ScrollDownButton.tsx","webpack:///./src/components/middle/composer/helpers/buildAttachment.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/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/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/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/RightColumn.tsx","webpack:///./src/components/mediaViewer/MediaViewer.async.tsx","webpack:///./src/components/main/Notifications.async.tsx","webpack:///./src/components/main/Errors.async.tsx","webpack:///./src/components/main/ForwardPicker.async.tsx","webpack:///./src/components/main/SafeLinkModal.async.tsx","webpack:///./src/components/main/Main.tsx","webpack:///./src/bundles/main.ts"],"names":["addReducer","global","actions","payload","id","threadId","type","noPushState","currentMessageList","selectCurrentMessageList","chatId","exitMessageSelectMode","messages","contentToBeScheduled","undefined","forwardMessages","toChatId","setGlobal","HistoryWrapper","pushState","messageListType","back","updateCurrentMessageList","isChatInfoShown","contentKey","selectRightColumnContentKey","openChat","chatCreation","blurTimeout","scrollOffset","replaceThreadParam","messageId","paramName","chatMessages","selectChatMessages","viewportIds","selectViewportIds","lastOwnEditableMessageId","findLast","Boolean","selectAllowedMessageActions","canEdit","targetIndexDelta","replyingToId","selectReplyingToId","selectIsViewportNewest","chatMessageKeys","Object","keys","newIndex","indexOf","toString","length","Number","MAIN_THREAD_ID","chat","selectChat","lastMessage","threadInfo","selectThreadInfo","lastMessageId","setReplyingToId","focusMessage","avatarOwnerId","profilePhotoIndex","origin","mediaViewer","audioPlayer","shouldOpenInstantly","selectIsRightColumnShown","RightColumnContent","PollResults","window","setTimeout","newGlobal","getGlobal","pollResults","voters","noHighlight","groupedId","groupedChatId","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","isPollModalOpen","query","globalSearch","updateGlobalSearch","globalResults","localResults","resultsByType","fetchingStatus","chats","recentlyFoundChatIds","newRecentIds","filter","unshift","pop","content","updateGlobalSearchContent","Search","updateLocalTextSearch","replaceLocalTextSearchResults","chatThreadKey","buildChatThreadKey","currentQuery","localTextSearch","byChatThreadKey","MEMO_EMPTY_ARRAY","mediaType","updateLocalMediaSearchType","previousQuery","stickers","search","StickerSearch","resultIds","gifs","GifSearch","offsetId","results","updateSelectedUserId","replaceSettings","theme","settings","replaceThemeSettings","isActive","prevIsActive","management","byChatId","IS_MOBILE_SCREEN","isLeftColumnShown","action","emoji","recentEmojis","newEmojis","e","sticker","recent","hash","newStickers","s","notification","newNotifications","notifications","existingNotificationIndex","findIndex","n","message","splice","push","error","getReadableErrorText","newErrors","errors","existingErrorIndex","err","url","safeLinkModalUrl","payment","isPaymentModalOpen","clearPayment","closeInvoice","runThrottledForLoadChats","throttle","cb","runThrottledForLoadTopChats","runDebouncedForLoadFullChat","debounce","async","loadChats","listType","offsetDate","result","callApi","limit","CHAT_LIST_LOAD_SLICE","archived","withPinned","orderedPinnedIds","chatIds","shift","addUsers","buildCollectionByKey","users","updateChats","updateChatListIds","updateChatListSecondaryInfo","draftsById","map","forEach","replyingToById","isFullyLoaded","loadFullChat","fullInfo","updateChat","openChatByUsername","username","channelPostId","localChat","selectChatByUsername","isMin","previousChat","showNotification","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","TIPS_USERNAME","oldestChat","selectIsChatPinned","sort","chat1","chat2","date","force","isMuted","title","about","photo","memberIds","progress","ChatCreationProgress","InProgress","createdChannel","channelId","accessHash","Complete","Error","getDispatch","createChannel","createdChat","createGroupChat","folderId","folder","selectChatFolder","shouldBePinned","pinnedChatIds","includedChatIds","newPinnedIds","pinnedId","newIncludedChatIds","folderUpdate","selectChatListType","isPinned","ARCHIVED_FOLDER_ID","isChatArchived","chatFolders","loadChatFolders","recommendedChatFolders","recommended","loadRecommendedChatFolders","emoticon","orderedIds","maxId","recommendedId","description","newFolder","createChatFolder","Math","max","apply","deleteChatFolder","unreadCount","match","RE_TME_INVITE_LINK","exec","RE_TME_LINK","isEnabled","isChatBasicGroup","bannedRights","userId","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","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","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","localOnly","selectDraft","isUnpin","isOneSide","isSilent","unpinAllMessages","shouldDeleteForAll","editingId","selectEditingId","selectEditingScheduledId","webPagePreview","loadWebPagePreview","options","option","shouldResetVoters","v","a","offsets","nextOffset","loadPollOptionResults","fromChat","toChat","b","scheduledMessages","historyHash","replaceScheduledMessages","loadScheduledHistory","selectScheduledMessage","loadPinnedMessages","copyTextToClipboard","link","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","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","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","draftsByChatId","acc","lastReadInboxMessageId","newCurrentChatId","currentMessageListInfo","threadsById","Array","prototype","concat","replaceUsers","audioChatId","audioMessageId","closeAudioPlayer","loadAndReplaceMessages","lastSyncTime","sync","afterSync","runDebouncedForFetchFullUser","buildInputPrivacyRules","visibility","allowedIds","deniedIds","usersById","chatsById","rules","collectUsers","collectChats","allowedUsers","allowedChats","blockedUsers","blockedChats","lastRequestedAt","topPeers","usersHash","loadTopUsers","getCompareString","lastName","firstName","collator","Intl","Collator","sortedUsers","compare","isSelf","loadContactList","updateChatMutedState","phone","phoneNumber","updateUser","updateContact","deleteUser","profileId","isPrivate","photos","button","sendBotCommand","command","openTelegramLink","toggleSafeLinkModal","data","alert","isError","showError","answerCallbackButton","openPollModal","getReceipt","receiptMessageId","getPaymentForm","setInvoiceMessageInfo","openPaymentModal","bio","profileEdit","ProfileEditProgress","currentUser","Idle","loadedWallpapers","wallpapers","file","previewBlobUrl","URL","createObjectURL","slug","UPLOADING_WALLPAPER_SLUG","document","fileName","size","mimeType","wallpaper","firstWallpaper","withLocalMedia","blocked","blockedIds","contactId","addBlockedContact","removeBlockedContact","activeSessions","session","isCurrent","peerType","shouldShowPreviews","updateNotifySettings","hasContactJoinedNotifications","languages","phoneNumberSettings","lastSeenSettings","profilePhotoSettings","forwardsSettings","chatInviteSettings","privacy","lastSeen","profilePhoto","forwards","chatInvite","privacyKey","allowUserIds","allowChatIds","blockUserIds","blockChatIds","isAllowList","contactsIds","hasPassword","updateTwoFaSettings","hint","currentPassword","onSuccess","isLoading","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","updateWithLocalMedia","isScheduled","currentMessage","video","getMessageContent","blobUrl","thumbnail","isPreloadedGlobally","updateScheduledMessage","updateListedAndViewportIds","firstUnreadId","selectFirstUnreadId","addViewportId","firstMessageId","selectThreadByMessage","isMessageLocal","updateChatLastMessage","currentLastMessage","findLastMessage","isDeleting","deleteMessages","newLastMessage","threadIdsToUpdate","unique","deleteChatMessages","chatsIdsToUpdate","commonBoxChatId","updateThreadInfo","newMessage","isMessageInCurrentMessageList","isOutgoing","scheduledIds","selectScheduledIds","selectScheduledMessages","deleteChatScheduledMessages","currentPinnedIds","selectPinnedIds","newTheadInfo","messagesById","deleteScheduledMessages","pollId","pollUpdate","selectChatMessageByPollId","poll","updatedPoll","updatedResults","isChosen","chosenAnswers","chosenAnswer","chosenAnswerIndex","recentVoterIds","totalVoters","newRecentVoterIds","newTotalVoters","newResults","targetOption","targetOptionIndex","updatedOption","votersCount","flushStatusUpdatesThrottled","pendingStatusUpdates","statusUpdate","status","targetUser","isBlocked","key","addNotifyException","twoFaSettings","memo","name","label","checked","disabled","inactive","noAnimation","onChange","onCheck","handleChange","useCallback","currentTarget","className","buildClassName","ANIMATION_LEVEL_OPTIONS","withGlobal","searchQuery","animationLevel","byKey","globalSearchChatId","searchDate","contactsFilter","onSearchQuery","onSelectSettings","onSelectContacts","onSelectArchived","onOpenMenu","onCloseMenu","setGlobalSearchChatId","onReset","shouldSkipTransition","openTipsChat","setGlobalSearchDate","setSettingOption","lang","useLang","hasMenu","LeftColumnContent","ChatList","clearedDateSearchParam","clearedChatSearchParam","selectedSearchDate","useMemo","formatDateToString","archivedUnreadChatsCount","values","total","MainButton","onTrigger","isOpen","Button","ripple","color","onClick","ariaLabel","handleSearchFocus","handleSelectSaved","handleDarkModeToggle","stopPropagation","newTheme","switchTheme","handleAnimationLevelChange","newLevel","_","body","classList","toggle","isSearchFocused","GlobalSearch","Contacts","searchInputPlaceholder","forceOpenDropdown","setForceOpenDropdown","useState","useHistoryBack","event","previousHistoryState","isMenuOpen","DropdownMenu","trigger","footer","APP_NAME","APP_VERSION","forceOpen","onOpen","onClose","MenuItem","icon","toLowerCase","href","FEEDBACK_URL","SearchInput","inputId","parentContainerClassName","focused","placeholder","canClose","onFocus","PickerSelectedItem","isMinimized","clickArg","chatOrUserId","connectionState","dir","isRtl","Spinner","resolverFn","ms","dependencies","valueRef","useRef","runThrottled","useThrottle","forceUpdate","useForceUpdate","useOnChange","isSync","current","orderedFolderIds","notifySettings","selectNotifySettings","notifyExceptions","selectNotifyExceptions","setActiveChatFolder","transitionRef","useEffect","displayedFolders","folderCountersById","useThrottledMemo","counters","unreadDialogsCount","hasActiveDialogs","getFolderUnreadDialogs","badgeCount","isBadgeActive","folderTabs","handleSwitchTab","IS_TOUCH_ENV","captureEvents","onSwipe","SwipeDirection","Left","min","Right","isNotInAllTabRef","captureEscKeyListener","handleKeyDown","metaKey","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","Loading","ContactList","closeTimeout","isShown","onNewPrivateChat","onNewChannel","onNewGroup","setIsMenuOpen","fabClassName","handleMouseEnter","handleMouseLeave","onMouseEnter","onMouseLeave","tabIndex","Menu","positionX","positionY","autoClose","TRANSITION_RENDER_COUNT","onContentChange","isNewChatButtonShown","setIsNewChatButtonShown","isMouseInside","handleSelectSettings","Settings","handleSelectContacts","handleSelectNewChannel","NewChannelStep1","handleSelectNewGroup","NewGroupStep1","handleSelectArchived","Archived","autoCloseTimeout","NewChat","ContentType","ArchivedChats","RENDER_COUNT","setGlobalSearchQuery","resetChatCreation","loadPasswordInfo","clearTwoFaError","setContent","settingsScreen","setSettingsScreen","SettingsScreens","Main","setContactsFilter","openMenu","closeMenu","useFlag","setContentWithHistory","NewChannelStep2","NewGroupStep2","setSettingsScreenWithHistory","screen","lastResetTime","setLastResetTime","contentType","NewChannel","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","setShouldSkipTransition","ANIMATION_DURATION","handleSearchQuery","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","HeaderMenuContainer","isChatChannel","noMenu","isChatWithSelf","selectIsChatWithSelf","isMainThread","isDiscussionThread","isRightColumnShown","canStartBot","selectIsChatBotNotStarted","canSubscribe","isChatSuperGroup","canSearch","canMute","canSelect","selectIsInSelectMode","canLeave","joinChannel","openLocalTextSearch","menuButtonRef","menuPosition","setMenuPosition","handleHeaderMenuOpen","rect","getBoundingClientRect","x","right","y","bottom","handleHeaderMenuClose","handleHeaderMenuHide","handleSubscribeClick","handleStartBot","handleSearchClick","querySelector","focus","searchInput","fluid","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","renderAudio","subtitle","renderVoice","audioMessage","originChat","messagesCount","pinnedIds","state","isSelectModeActive","originChatId","isChatWithBot","selectIsChatWithBot","assign","pinnedMessageId","topMessageSender","selectForwardedSender","pinnedMessageIds","canUnpin","firstPinnedMessage","openChatWithInfo","pinMessage","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","nextMessageDatetime","isActionMessage","forwardInfo","senderUserId","hiddenUserName","inlineButtons","useStickyDates","isScrolled","markIsScrolled","runDebounced","shouldRunFirst","shouldRunLast","updateStickyDates","container","hasTools","contains","fastRaf","currentStuck","stuckDateEl","allElements","querySelectorAll","containerTop","scrollTop","el","offsetTop","offsetHeight","top","findStuckDate","isFabFrozen","MessageScroll","focusingId","loadMoreForwards","loadMoreBackwards","isViewportNewest","onFabToggle","onNotchToggle","children","backwardsTriggerRef","forwardsTriggerRef","fabTriggerRef","toggleScrollTools","scrollHeight","scrollBottom","isAtBottom","observe","observeIntersection","freeze","freezeForLoadMore","unfreeze","unfreezeForLoadMore","useIntersectionObserver","rootRef","margin","MESSAGE_LIST_SENSITIVE_AREA","entries","triggerEntry","isIntersecting","target","resetScroll","useOnIntersect","observeIntersectionForFab","freezeForFab","unfreezeForFab","observeIntersectionForNotch","teactFastList","isEmojiOnlyMessage","customShape","getMinMediaWidth","hasText","hasCommentButton","calculateMediaDimensions","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","REM","getMaxWidth","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","position","left","opacity","appendChild","offsetWidth","useFocusMessage","elementRef","isFocused","focusDirection","noFocusHighlight","messagesContainer","closest","fastSmoothScroll","ContextMenuContainer","targetUserId","targetChatId","targetMessageId","targetMessage","selectIsMessageFocused","focusedMessage","isEmbedded","appearanceOrder","isLastInList","noAppearanceAnimation","markShown","renderActionMessageText","asPlain","isContextMenuOpen","contextMenuPosition","handleBeforeContextMenu","handleContextMenu","handleContextMenuClose","handleContextMenuHide","useContextMenuHandlers","isContextMenuShown","data-message-id","onMouseDown","onContextMenu","EmbeddedMessage","customText","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","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","getCustomAppendixBg","appendixBg","setProperty","setAttribute","ProgressSpinner","useHeavyAnimationCheckForVideo","playerRef","shouldPlayRef","safePlay","useHeavyAnimationCheck","isPlayAllowed","wasPlaying","isFrozen","freezePlaying","paused","unfreezePlaying","unfreezePlayingOnRaf","hasFocus","useBackgroundMode","Video","shouldAutoPlay","videoRef","canPlayInline","canMessagePlayVideoInline","setIsPlayAllowed","isInline","isBuffered","bufferingHandlers","useBuffering","playProgress","setPlayProgress","handleTimeUpdate","currentTime","usePauseOnInactive","useVideoCleanup","videoClassName","shouldRenderInlineVideo","shouldRenderHqPreview","shouldRenderPlayButton","shouldRenderDownloadButton","autoPlay","muted","loop","playsInline","onTimeUpdate","isGif","formatMediaDuration","duration","contact","openUserInfo","Avatar","formatPhoneNumberWithCode","selected","loadingOptions","setValues","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","hasDocument","truncatedDescription","trimText","data-initial","SafeLink","getMessageInvoice","photoUrl","withSelectControl","WrapedComponent","ownProps","selectIsMessageSelected","handleMessageSelect","shiftKey","newProps","PhotoWithSelect","VideoWithSelect","uploadsById","hasCustomAppendix","albumLayout","cancelSendingMessage","mediaCount","handleCancelUpload","containerWidth","containerHeight","fileUpload","currentOnRelease","RoundVideo","playingProgressRef","shouldSpinnerRender","isActivated","setIsActivated","setProgress","playerEl","playingProgressEl","stopPlaying","requestAnimationFrame","capturePlaying","onRelease","ROUND_VIDEO_DIMENSIONS","onEnded","InlineButtons","recentReplierIds","recentRepliers","hasUnread","data-cnt","handleDocumentGroupMouseEnter","lastGroupElement","getLastElementInDocumentGroup","handleDocumentGroupMouseLeave","removeAttribute","nextElementSibling","withSenderName","withAvatar","viaBotId","forceSenderName","isAnonymousOwnMessage","originSender","botSender","threadTopMessageId","isThreadTop","shouldHideReply","replyMessageSender","selectUploadProgress","isForwarding","highlight","singleEmoji","getMessageSingleEmoji","every","selectOutgoingStatus","isSingleEmoji","animatedEmoji","selectAnimatedEmoji","isGroupSelected","selectIsDocumentGroupSelected","isPinnedList","shouldAutoLoadMedia","selectShouldAutoLoadMedia","shouldAutoPlayMedia","selectShouldAutoPlayMedia","shouldLoopStickers","selectShouldLoopStickers","observeIntersectionForBottom","observeIntersectionForMedia","observeIntersectionForAnimatedStickers","noComments","isFirstInGroup","isLastInGroup","isFirstInDocumentGroup","isLastInDocumentGroup","openMediaViewer","openAudioPlayer","markMessagesRead","sendPollVote","clickInlineButton","bottomMarkerRef","appendixRef","hasReply","isReplyMessage","hasThread","asForwarded","isLinkedChannelPost","isInDocumentGroup","voice","getMessageCustomShape","textParts","renderMessageText","containerClassName","contentClassName","hasComments","classNames","isMediaWithNoText","isViaBot","isRound","buildContentClassName","avatarPeer","senderPeer","adminTitle","withCommentButton","withAppendix","handleGroupDocumentMessagesSelect","handleContainerDoubleClick","handleContentDoubleClick","handleAvatarClick","handleSenderClick","handleViaBotClick","handleReplyClick","MediaViewerOrigin","ScheduledInline","Inline","handleAudioPlay","handleAlbumMediaClick","albumMessageId","ScheduledAlbum","Album","handleReadMedia","handleVoteSend","handleGroupForward","handleForward","handleFocus","handleFocusForwarded","fromMessageId","calculatedWidth","noMediaCorners","extraPadding","metaSafeAuthorWidth","canShowActionButton","canForward","canFocus","isChannelPost","onDoubleClick","data-last-message-id","data-has-unread-mention","isAvatarPeerUser","avatarUser","avatarChat","hiddenName","renderAvatar","shouldInlineMeta","senderColor","getUserColorKey","renderSenderName","AnimatedEmoji","Audio","isSelectable","onPlay","onReadMedia","Document","renderContent","INTERSECTION_THROTTLE_FOR_MEDIA","IS_ANDROID","INTERSECTION_MARGIN_FOR_MEDIA","runDebouncedForScroll","selectCurrentMessageIds","restrictionReason","withLastMessageWhenPreloading","botDescription","chatBot","selectChatBot","isChatLoaded","isChannelChat","threadFirstMessageId","selectFirstMessageId","hasLinkedChat","markMessageListRead","setScrollOffset","scrollOffsetRef","selectScrollOffset","anchorIdRef","anchorTopRef","listItemElementsRef","memoUnreadDividerBeforeIdRef","memoFirstUnreadIdRef","memoFocusingIdRef","isScrollTopJustUpdatedRef","shouldAnimateAppearanceRef","setContainerHeight","hasFocusing","setHasFocusing","onTickEnd","freezeForMedia","unfreezeForMedia","throttleMs","observeIntersectionForReading","freezeForReading","unfreezeForReading","mentionIds","entry","dataset","messageGroups","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","unreadDivider","isAnimatingScroll","dispatchHeavyAnimationEvent","ANIMATION_END_DELAY","withUsers","onScroll","currentAnchorIdRef","isSchedule","messageCountToAnimate","messageGroup","flatten","appearanceIndex","dateGroup","dateGroupIndex","dateGroupsArray","senderGroup","senderGroupIndex","senderGroupsArray","compact","currentDocumentGroupId","messageIndex","isMessageAlbum","documentGroupId","nextDocumentGroupId","originalId","getMessageOriginalId","SCHEDULED_WHEN_ONLINE","formatHumanDate","renderMessages","focusLastMessage","messageElements","lastMessageElement","buildAttachment","filename","blob","isQuick","quick","preloadImage","newBlob","toBlob","squeezeImage","revokeObjectURL","videoWidth","videoHeight","preloadVideo","createPosterForVideo","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","subscribeToAnalyzer","stop","reject","onstop","Blob","onerror","delayStop","CLIPBOARD_ACCEPTED_TYPES","getMessageTextAsHtml","formattedText","currentThreadId","DeleteMessageModal","openTimeout","isFirstTimeActivation","onActivate","buttonProps","AttachMenu","SymbolMenu","MentionTooltip","CustomSend","StickerTooltipAsync","StickerTooltip","BotKeyboardMenu","forwardMessageIds","forwardedMessagesCount","exitForwardMode","canAnimate","useAsyncRendering","clearEmbedded","handleMessageClick","AttachmentModal","PollModal","DropArea","RE_LINK","RegExp","RE_LINK_TEMPLATE","messageText","toggleMessageWebPage","parseMessageInput","linkEntity","ApiMessageEntityTypes","TextUrl","textMatch","renderingWebPage","webPageWithoutPhoto","messageStub","CalendarModal","PaymentModal","MainButtonState","ReceiptModal","chatUser","selectChatUser","messageWithActualBotKeyboard","selectNewestMessageWithBotKeyboardButtons","editingMessage","canScheduleUntilOnline","wasOnline","withScheduledButton","shouldSchedule","botKeyboardMessageId","canSuggestMembers","isChatGroup","stickersForEmoji","groupChatMembers","isReceiptModalOpen","shouldSuggestStickers","dropAreaState","onDropHide","editMessage","saveDraft","clearDraft","setStickerSearchQuery","setGifSearchQuery","closePollModal","closePaymentModal","clearReceipt","addRecentEmoji","html","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_IOS","voiceRecording","tickVolume","boxShadow","useVoiceRecording","mainButtonState","Edit","IS_VOICE_RECORDING_SUPPORTED","Send","Record","canShowCustomSendMenu","isMentionTooltipOpen","mentionFilter","closeMentionTooltip","insertMention","mentionFilteredMembers","useMentionTooltip","isCustomSendMenuOpen","allowedAttachmentOptions","getAllowedAttachmentOptions","isChatAdmin","slowMode","getChatSlowModeOptions","isStickerTooltipOpen","closeStickerTooltip","clearStickersForEmoji","IS_EMOJI_SUPPORTED","parseEmojiOnlyString","hasStickers","useStickerTooltip","canSendStickers","isEmojiTooltipOpen","closeEmojiTooltip","filteredEmojis","insertEmoji","useEmojiTooltip","insertTextAndUpdateCursor","selection","getSelection","newHtml","replace","rangeCount","selectionRange","getRangeAt","isSelectionInsideInput","execCommand","range","deleteContents","fragment","createContextualFragment","lastInsertedNode","lastChild","insertNode","setStartAfter","setEndAfter","removeAllRanges","addRange","insertHtmlInSelection","dispatchEvent","Event","bubbles","focusEditableElement","removeSymbol","tempInput","contentEditable","textLength","createRange","setStart","setEnd","removeChild","deleteLastCharacterOutsideSelection","resetComposer","prevChatId","handleEditComplete","editedMessage","hasMessageMedia","useEditing","updateDraft","draftChatId","draftThreadId","runDebouncedForSaveDraft","DRAFT_DEBOUNCE","prevThreadId","prevHtml","handleBlur","useDraft","handlePaste","clipboardData","input","activeElement","tagName","EDITABLE_INPUT_MODAL_ID","items","media","getAsFile","pastedText","getData","substring","useClipboardPaste","handleFileSelect","files","handleAppendFiles","handleClearAttachment","handleSend","currentAttachments","record","extraLength","textParams","nowSeconds","secondsSinceLastMessage","nextSendDateNotReached","nextSendDate","seconds","secondsRemaining","isSlowMode","handleStickerSelect","handleGifSelect","gif","handlePollSend","handleSilentSend","handleMessageSchedule","restArgs","getTime","handleMessageScheduleUntilOnline","handleCloseCalendar","handleSearchOpen","handleSymbolMenuOpen","handleAllScheduledClick","mainButtonHandler","areVoiceMessagesNotAllowed","canAttachMedia","prevEditedMessage","renderedEditedMessage","scheduledDefaultDate","setSeconds","setMilliseconds","scheduledMaxDate","setFullYear","getFullYear","sendButtonAriaLabel","symbolMenuButtonClassName","Portal","DropAreaState","None","withQuick","QuickFile","onHide","onFileSelect","caption","onCaptionUpdate","onSend","onFileAppend","onClear","onInsertUserName","filteredChatMembers","canAttachEmbedLinks","faded","MessageInput","innerWidth","shouldSetFocus","shouldSupressFocus","shouldSupressTextFormatter","onUpdate","onSupressedFocus","formatVoiceRecordDuration","onStickerSelect","emojis","onEmojiSelect","onPollCreate","onGifSelect","onRemoveSymbol","onSearchOpen","onSilentSend","onScheduleSend","withTimePicker","selectedAt","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","messageSendingRestrictionReason","getMessageSendingRestrictionReason","hasPinnedOrAudioMessage","loadUser","setDropAreaState","isFabShown","setIsFabShown","isNotchShown","setIsNotchShown","isUnpinModalOpen","setIsUnpinModalOpen","renderingChatId","usePrevDuringAnimation","renderingThreadId","renderingMessageListType","renderingCanPost","renderingHasTools","renderingIsFabShown","handleDragEnter","dataTransfer","shouldDrawQuick","handleHideDropArea","handleOpenUnpinModal","closeUnpinModal","handleUnpinAllMessages","customBackgroundValue","settingValue","setValue","cacheApi","CUSTOM_BG_CACHE_NAME","useCustomBackground","MASK_IMAGE_DISABLED","messagingDisabledClassName","footerClassName","DARK_THEME_BG_COLOR","LIGHT_THEME_BG_COLOR","onDragEnter","ANIMATION_LEVEL_MAX","shouldCleanup","onUnpin","runDebouncedForSearch","HeaderContent","isProfile","isManagement","messageSearchQuery","stickerSearchQuery","selectCurrentStickerSearch","gifSearchQuery","selectCurrentGifSearch","canManage","isCreator","isColumnOpen","isSearch","isStickerSearch","isGifSearch","isPollResults","profileState","managementScreen","setLocalTextSearchQuery","searchTextMessagesLocal","toggleManagement","shouldSkipAnimation","backButtonRef","handleMessageSearchQueryChange","handleJumpToDate","valueOf","handleStickerSearchQueryChange","handleGifSearchQueryChange","ProfileState","Profile","SharedMedia","MemberList","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","isPastMode","submitButtonLabel","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","excludedClosestSelector","renderPhoto","isVerifiedIconShown","isVerified","renderPhotoTabs","aria-label","VerifiedIcon","isUserOnline","getUserStatus","canInviteUsers","isUserRightBanned","getHasAdminRight","currentIsMuted","chatUsername","handleNotificationChange","copy","entity","formattedNumber","getChatLink","printedUsername","getChatDescription","ListItem","multiline","narrow","isStatic","TABS","buildInfiniteScrollItemSelector","isGroup","hasMembersTab","areMembersHidden","canViewMembers","resolvedUserId","onProfileStateChange","setLocalMediaSearchType","searchMediaMessagesLocal","loadProfilePhotos","setActiveTab","useEffectWithPrevDeps","prevTabType","tabsEl","prevProfileState","tabListEl","determineProfileState","useProfileState","applyTransitionFix","releaseTransitionFix","transitionElSelector","setMinHeight","transitionEl","minHeight","overflowY","scrollBarWidth","clientWidth","marginRight","useTransitionFixes","cacheBuster","resetCacheBuster","setCacheBuster","useCacheBuster","handleTransitionStop","handleSelectMedia","handlePlayAudio","handleMemberClick","handleMessageFocus","renderingDelay","isFirstTab","SLIDE_TRANSITION_DURATION","canRenderContents","renderSharedMedia","noSpinner","NothingFound","Media","withDate","smaller","onDateClick","WebLink","onMessageClick","renderingFor","teactOrderKey","InfiniteScroll","itemSelector","sensitiveArea","PROFILE_SENSITIVE_AREA","preloadBackwards","noScrollRestoreOnTop","noFastList","onLoadMore","renderProfileInfo","shouldRestoreHeight","onStart","onStop","big","RightSearch","Management","MAIN_SCREENS_COUNT","MANAGEMENT_SCREENS_COUNT","blurSearchInput","areActiveChatsLoaded","selectAreActiveChatsLoaded","currentProfileUserId","selectedId","isChatSelected","toggleChatInfo","closeLocalTextSearch","closePollResults","setProfileState","setManagementScreen","selectedChatMemberId","setSelectedChatMemberId","isPromotedByCurrentUser","setIsPromotedByCurrentUser","isScrolledDown","ChatInfo","UserInfo","isOverlaying","close","GroupType","handleSelectChatMember","memberId","isPromoted","handleManagementScreenSelect","onChatMemberSelect","prevContentKey","MediaViewer","Errors","ForwardPicker","SafeLinkModal","rightColumnAnimationTimeout","notificationInterval","DEBUG_isLogged","updateIcon","asUnread","isMediaViewerOpen","selectIsMediaViewerOpen","isForwardModalOpen","selectIsForwardModalOpen","hasNotifications","hasErrors","isHistoryAnimationDisabled","setIsHistoryAnimationDisabled","middleColumnTransitionClassNames","rightColumnTransitionClassNames","stopEvent","initialUnread","clearInterval","setInterval","INACTIVE_MARKER","newUnread","PAGE_TITLE","onDrop","onDragOver","initApi"],"mappings":"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","file":"4.292f70afdd30b166608d.js","sourcesContent":["import { addReducer, setGlobal } from '../../../lib/teact/teactn';\nimport {\n exitMessageSelectMode,\n updateCurrentMessageList,\n} from '../../reducers';\nimport { selectCurrentMessageList, selectRightColumnContentKey } from '../../selectors';\nimport { HistoryWrapper } from '../../../util/history';\n\naddReducer('openChat', (global, actions, payload) => {\n const {\n id, threadId = -1, type = 'thread', noPushState,\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 = exitMessageSelectMode(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 if (!noPushState) {\n if (id !== undefined) {\n HistoryWrapper.pushState({\n type: 'chat',\n chatId: id,\n threadId,\n messageListType: type,\n });\n } else {\n HistoryWrapper.back();\n }\n }\n }\n\n return updateCurrentMessageList(global, id, threadId, type);\n});\n\naddReducer('openChatWithInfo', (global, actions, payload) => {\n setGlobal({\n ...global,\n isChatInfoShown: true,\n });\n\n HistoryWrapper.pushState({\n type: 'right',\n contentKey: selectRightColumnContentKey(global),\n });\n\n actions.openChat(payload);\n});\n\naddReducer('resetChatCreation', (global) => {\n return {\n ...global,\n chatCreation: undefined,\n };\n});\n","import { addReducer, getGlobal, setGlobal } from '../../../lib/teact/teactn';\n\nimport { MAIN_THREAD_ID } from '../../../api/types';\nimport { FocusDirection, RightColumnContent } from '../../../types';\n\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, selectIsViewportNewest, selectReplyingToId,\n} from '../../selectors';\nimport { findLast } from '../../../util/iteratees';\nimport { HistoryWrapper } from '../../../util/history';\n\nconst FOCUS_DURATION = 2000;\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, noPushState } = payload!;\n\n const shouldOpenInstantly = selectIsRightColumnShown(global);\n\n if (!noPushState) {\n HistoryWrapper.pushState({\n type: 'right',\n contentKey: RightColumnContent.PollResults,\n });\n }\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, actions, payload) => {\n const { noPushState } = payload;\n\n if (!noPushState) {\n HistoryWrapper.back();\n }\n\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('focusMessage', (global, actions, payload) => {\n const {\n chatId, threadId = MAIN_THREAD_ID, messageListType = 'thread', noHighlight, groupedId, groupedChatId,\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 }, FOCUS_DURATION);\n\n global = updateFocusedMessage(global, chatId, messageId, noHighlight);\n global = updateFocusDirection(global, undefined);\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 undefined;\n }\n\n const { chatId, threadId, type: messageListType } = currentMessageList;\n\n return toggleMessageSelection(\n global, chatId, threadId, messageListType, messageId, groupedId, childMessageIds, withShift,\n );\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\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 { HistoryWrapper } from '../../../util/history';\nimport { RightColumnContent } from '../../../types';\n\naddReducer('openLocalTextSearch', (global) => {\n const { chatId, threadId } = selectCurrentMessageList(global) || {};\n if (!chatId || !threadId) {\n return undefined;\n }\n\n HistoryWrapper.pushState({\n type: 'right',\n contentKey: RightColumnContent.Search,\n });\n\n return updateLocalTextSearch(global, chatId, threadId, true);\n});\n\naddReducer('closeLocalTextSearch', (global, actions, payload) => {\n const { noPushState } = payload;\n const { chatId, threadId } = selectCurrentMessageList(global) || {};\n if (!chatId || !threadId) {\n return undefined;\n }\n\n if (!noPushState) {\n HistoryWrapper.back();\n }\n\n global = updateLocalTextSearch(global, chatId, threadId, false);\n global = replaceLocalTextSearchResults(global, chatId, threadId, undefined);\n return global;\n});\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","import { addReducer } from '../../../lib/teact/teactn';\nimport { HistoryWrapper } from '../../../util/history';\nimport { RightColumnContent } from '../../../types';\n\naddReducer('setStickerSearchQuery', (global, actions, payload) => {\n const { query, noPushState } = payload!;\n const previousQuery = global.stickers.search.query;\n\n if (!noPushState && previousQuery !== query) {\n if (query !== undefined && previousQuery === undefined) {\n HistoryWrapper.pushState({\n type: 'right',\n contentKey: RightColumnContent.StickerSearch,\n });\n } else {\n HistoryWrapper.back();\n }\n }\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, noPushState } = payload!;\n const previousQuery = global.gifs.search.query;\n\n if (!noPushState && previousQuery !== query) {\n if (query !== undefined) {\n HistoryWrapper.pushState({\n type: 'right',\n contentKey: RightColumnContent.GifSearch,\n });\n } else {\n HistoryWrapper.back();\n }\n }\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 } 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","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 { addReducer } from '../../../lib/teact/teactn';\n\nimport { GlobalState } from '../../../global/types';\n\nimport { IS_MOBILE_SCREEN } from '../../../util/environment';\nimport getReadableErrorText from '../../../util/getReadableErrorText';\nimport { selectCurrentMessageList, selectRightColumnContentKey } from '../../selectors';\nimport { HistoryWrapper } from '../../../util/history';\n\nconst MAX_STORED_EMOJIS = 18; // Represents two rows of recent emojis\n\naddReducer('toggleChatInfo', (global, actions, payload) => {\n const { noPushState } = payload;\n\n if (!noPushState) {\n if (global.isChatInfoShown) {\n HistoryWrapper.back();\n } else {\n HistoryWrapper.pushState({\n type: 'right',\n contentKey: selectRightColumnContentKey(global),\n });\n }\n }\n\n return {\n ...global,\n isChatInfoShown: !global.isChatInfoShown,\n };\n});\n\naddReducer('toggleManagement', (global, actions, payload): GlobalState | undefined => {\n const { chatId } = selectCurrentMessageList(global) || {};\n const { noPushState } = payload;\n\n if (!chatId) {\n return undefined;\n }\n\n const { isActive: prevIsActive } = global.management.byChatId[chatId] || {};\n\n if (!noPushState) {\n if (prevIsActive) {\n HistoryWrapper.back();\n } else {\n HistoryWrapper.pushState({\n type: 'right',\n contentKey: selectRightColumnContentKey(global),\n });\n }\n }\n\n return {\n ...global,\n management: {\n byChatId: {\n ...global.management.byChatId,\n [chatId]: {\n ...global.management.byChatId[chatId],\n isActive: !prevIsActive,\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, actions, payload) => {\n if (!IS_MOBILE_SCREEN) {\n return undefined;\n }\n\n const { id } = payload!;\n\n return {\n ...global,\n isLeftColumnShown: id === undefined,\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('showError', (global, actions, payload) => {\n const { error } = payload!;\n\n // Filter out errors that we don't want to show to the user\n if (!getReadableErrorText(error)) {\n return global;\n }\n\n const newErrors = [...global.errors];\n const existingErrorIndex = newErrors.findIndex((err) => err.message === error.message);\n if (existingErrorIndex !== -1) {\n newErrors.splice(existingErrorIndex, 1);\n }\n\n newErrors.push(error);\n\n return {\n ...global,\n errors: newErrors,\n };\n});\n\naddReducer('dismissError', (global) => {\n const newErrors = [...global.errors];\n\n newErrors.pop();\n\n return {\n ...global,\n errors: newErrors,\n };\n});\n\naddReducer('toggleSafeLinkModal', (global, actions, payload) => {\n const { url: safeLinkModalUrl } = payload;\n\n return {\n ...global,\n safeLinkModalUrl,\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 { 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} 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) => {\n actions.openChatByUsername({ username: TIPS_USERNAME });\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 { chatId } = payload!;\n const chat = selectChat(global, chatId);\n if (!chat) {\n return;\n }\n\n void callApi('requestChatUpdate', chat);\n});\n\naddReducer('updateChatMutedState', (global, actions, payload) => {\n const { chatId, isMuted } = payload!;\n const chat = selectChat(global, chatId);\n if (!chat) {\n return;\n }\n\n void callApi('updateChatMutedState', { chat, isMuted });\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('leaveChannel', (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('leaveChannel', { channelId, accessHash });\n }\n});\n\naddReducer('deleteChannel', (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('deleteChannel', { channelId, accessHash });\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 chat = selectChat(global, id);\n if (chat) {\n if (chat.unreadCount) {\n void callApi('markMessageListRead', { 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 chat = await callApi('openChatByInvite', hash);\n\n if (!chat) {\n return;\n }\n\n actions.openChat({ id: chat.id });\n })();\n } else {\n match = RE_TME_LINK.exec(url)!;\n\n const username = match[1];\n const channelPostId = match[2] ? Number(match[2]) : undefined;\n\n void openChatByUsername(actions, username, channelPostId);\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\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 });\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} 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 { copyTextToClipboard } from '../../../util/clipboard';\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 { 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),\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 return replaceThreadParam(global, chatId, threadId, 'draft', draft);\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 return replaceThreadParam(global, chatId, threadId, 'draft', undefined);\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 const { chatId, maxId, shouldDeleteForAll } = payload!;\n const chat = selectChat(global, chatId);\n if (!chat) {\n return;\n }\n\n void callApi('deleteHistory', { chat, shouldDeleteForAll, maxId });\n});\n\naddReducer('markMessageListRead', (global, actions, payload) => {\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', { chat, threadId, maxId });\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}) {\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) {\n await rafPromise();\n }\n\n const global = getGlobal();\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 });\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\naddReducer('loadMessageLink', (global, actions, payload) => {\n const { messageId, chatId } = payload;\n const chat = selectChat(global, chatId);\n const message = selectChatMessage(global, chatId, messageId);\n\n if (!chat || !message) {\n return;\n }\n\n (async () => {\n const result = await callApi('fetchMessageLink', { chat, message });\n\n if (result) {\n copyTextToClipboard(result.link);\n }\n })();\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 { 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\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,\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 });\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(\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 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 });\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 } = 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\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 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 } 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} from '../../reducers';\n\nconst runDebouncedForFetchFullUser = debounce((cb) => cb(), 500, false, true);\nconst TOP_PEERS_REQUEST_COOLDOWN = 60000; // 1 min\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 { hash, lastRequestedAt } = global.topPeers;\n\n if (!lastRequestedAt || Date.now() - 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(),\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","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} 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 } = payload!;\n\n (async () => {\n const result = await callApi('blockContact', contactId);\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', () => {\n callApi('fetchNotificationExceptions');\n});\n\naddReducer('loadNotificationSettings', () => {\n (async () => {\n const result = await callApi('fetchNotificationSettings');\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","import { addReducer, getDispatch } from '../../../lib/teact/teactn';\n\nimport { ApiChat } from '../../../api/types';\n\nimport { RE_TME_INVITE_LINK, RE_TME_LINK } from '../../../config';\nimport { callApi } from '../../../api/gramjs';\nimport { selectChatMessage, selectCurrentChat } from '../../selectors';\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 } = payload;\n const { currentUserId } = global;\n const chat = selectCurrentChat(global);\n if (!currentUserId || !chat) {\n return;\n }\n\n void sendBotCommand(chat, currentUserId, command);\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().showError({ error: { 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} 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});\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} 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 (!message.isOutgoing) {\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 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 ids = Object.keys(global.messages.byChatId[chatId].byId).map(Number);\n\n deleteMessages(chatId, ids, actions, global);\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 global = updateListedIds(global, chatId, MAIN_THREAD_ID, [id]);\n\n if (selectIsViewportNewest(global, chatId, MAIN_THREAD_ID)) {\n // Always keep the first uread 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 const { threadInfo, firstMessageId } = selectThreadByMessage(global, chatId, message) || {};\n\n if (!firstMessageId && isMessageLocal(message)) {\n return global;\n }\n\n if (threadInfo) {\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 if (!threadInfo.lastMessageId) {\n global = replaceThreadParam(global, chatId, threadInfo.threadId, 'threadInfo', {\n ...threadInfo,\n lastMessageId: message.id,\n });\n }\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 unique(threadIdsToUpdate).forEach((threadId) => {\n actions.requestThreadInfoUpdate({ chatId, threadId });\n });\n\n setTimeout(() => {\n setGlobal(deleteChatMessages(getGlobal(), chatId, ids));\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 id, isMuted, isSilent, shouldShowPreviews,\n } = update;\n const chat = global.chats.byId[id];\n\n if (chat) {\n global = updateChat(global, id, { isMuted });\n }\n\n setGlobal(addNotifyException(global, id, { 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 { 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, useState,\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 { APP_NAME, APP_VERSION, FEEDBACK_URL } from '../../../config';\nimport { IS_MOBILE_SCREEN } from '../../../util/environment';\nimport buildClassName from '../../../util/buildClassName';\nimport { pick } from '../../../util/iteratees';\nimport { isChatArchived } from '../../../modules/helpers';\nimport { formatDateToString } from '../../../util/dateFormat';\nimport switchTheme from '../../../util/switchTheme';\nimport useLang from '../../../hooks/useLang';\nimport useHistoryBack 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 onOpenMenu: NoneToVoidFunction;\n onCloseMenu: NoneToVoidFunction;\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];\nconst MENU_ANIMATION_DURATION = 300;\n\nconst LEGACY_VERSION = 'https://web.telegram.org/';\nconst WEBK_VERSION = 'https://web.telegram.org/k/';\n\nconst LeftMainHeader: FC = ({\n content,\n contactsFilter,\n onSearchQuery,\n onSelectSettings,\n onSelectContacts,\n onSelectArchived,\n onOpenMenu,\n onCloseMenu,\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 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 });\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 switchTheme(newTheme, animationLevel > 0);\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 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 const [forceOpenDropdown, setForceOpenDropdown] = useState(false);\n\n useHistoryBack((event, noAnimation, previousHistoryState) => {\n if (previousHistoryState && previousHistoryState.type === 'left' && previousHistoryState.isMenuOpen\n && noAnimation) {\n setForceOpenDropdown(true);\n setTimeout(() => setForceOpenDropdown(false), MENU_ANIMATION_DURATION);\n }\n });\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 \n Switch to WebK\n \n \n Switch to Webogram\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 { theme, 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,\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, { FC } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalState } from '../../global/types';\n\nimport { pick } from '../../util/iteratees';\nimport useLang from '../../hooks/useLang';\n\nimport Spinner from '../ui/Spinner';\n\nimport './ConnectionState.scss';\n\ntype StateProps = Pick;\n\nconst ConnectionState: FC = ({ connectionState }) => {\n const lang = useLang();\n\n const isConnecting = connectionState === 'connectionStateConnecting';\n\n return isConnecting && (\n
\n \n
{lang('WaitingForNetwork')}
\n
\n );\n};\n\nexport default withGlobal(\n (global): StateProps => pick(global, ['connectionState']),\n)(ConnectionState);\n","import { useRef } from '../lib/teact/teact';\n\nimport useThrottle from './useThrottle';\nimport useOnChange from './useOnChange';\nimport useForceUpdate from './useForceUpdate';\n\nexport default (resolverFn: () => R, ms: number, dependencies: D) => {\n const valueRef = useRef();\n const runThrottled = useThrottle(ms);\n const forceUpdate = useForceUpdate();\n\n useOnChange(() => {\n let isSync = true;\n runThrottled(() => {\n valueRef.current = resolverFn();\n\n if (!isSync) {\n forceUpdate();\n }\n });\n isSync = false;\n }, dependencies);\n\n return valueRef.current;\n};\n","import { useMemo } from '../lib/teact/teact';\n\nimport { throttle } from '../util/schedulers';\n\nexport default (ms: number) => {\n return useMemo(() => {\n return throttle((cb) => cb(), ms);\n }, [ms]);\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 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('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 useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.metaKey && 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 });\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, memo, useState, useRef, useCallback, useEffect,\n} from '../../../lib/teact/teact';\n\nimport { LeftColumnContent } from '../../../types';\n\nimport { IS_TOUCH_ENV } from '../../../util/environment';\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';\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 onOpenMenu: NoneToVoidFunction;\n onCloseMenu: NoneToVoidFunction;\n};\n\ntype StateProps = {};\n\nconst TRANSITION_RENDER_COUNT = Object.keys(LeftColumnContent).length / 2;\nconst BUTTON_CLOSE_DELAY_MS = 250;\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 onOpenMenu,\n onCloseMenu,\n}) => {\n const [isNewChatButtonShown, setIsNewChatButtonShown] = useState(IS_TOUCH_ENV);\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 return (\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 \n
\n );\n};\n\nexport default memo(LeftMain);\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 useHistoryBack from '../../hooks/useHistoryBack';\nimport useFlag from '../../hooks/useFlag';\n\nimport { IS_MOBILE_SCREEN } from '../../util/environment';\nimport captureEscKeyListener from '../../util/captureEscKeyListener';\nimport { pick } from '../../util/iteratees';\n\nimport Transition, { ANIMATION_DURATION } 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';\nimport { HistoryWrapper } from '../../util/history';\n\nimport './LeftColumn.scss';\n\ntype StateProps = {\n searchQuery?: string;\n searchDate?: number;\n activeChatFolder: number;\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 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 [isMenuOpen, openMenu, closeMenu] = useFlag();\n\n const setContentWithHistory = useCallback((contentKey: LeftColumnContent) => {\n if (contentKey !== LeftColumnContent.ChatList\n && contentKey !== LeftColumnContent.NewChannelStep2\n && contentKey !== LeftColumnContent.NewGroupStep2) {\n HistoryWrapper.pushState({\n type: 'left',\n contentKey,\n isMenuOpen,\n });\n }\n setContent(contentKey);\n }, [isMenuOpen]);\n\n const setSettingsScreenWithHistory = useCallback((screen: SettingsScreens, noPushState = false) => {\n setSettingsScreen(screen);\n if (!noPushState) {\n HistoryWrapper.pushState({\n type: 'left',\n contentKey: LeftColumnContent.Settings,\n screen,\n isMenuOpen,\n });\n }\n }, [isMenuOpen]);\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, noPushState = false) => {\n if (\n content === LeftColumnContent.NewGroupStep2\n && !forceReturnToChatList\n ) {\n if (!noPushState) HistoryWrapper.back();\n setContentWithHistory(LeftColumnContent.NewGroupStep1);\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 if (!noPushState) {\n HistoryWrapper.back();\n }\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 setSettingsScreenWithHistory(SettingsScreens.Main, noPushState);\n return;\n\n case SettingsScreens.GeneralChatBackground:\n setSettingsScreenWithHistory(SettingsScreens.General, noPushState);\n return;\n case SettingsScreens.GeneralChatBackgroundColor:\n setSettingsScreenWithHistory(SettingsScreens.GeneralChatBackground, noPushState);\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 setSettingsScreenWithHistory(SettingsScreens.Privacy, noPushState);\n return;\n case SettingsScreens.PrivacyPhoneNumberAllowedContacts:\n case SettingsScreens.PrivacyPhoneNumberDeniedContacts:\n setSettingsScreenWithHistory(SettingsScreens.PrivacyPhoneNumber, noPushState);\n return;\n case SettingsScreens.PrivacyLastSeenAllowedContacts:\n case SettingsScreens.PrivacyLastSeenDeniedContacts:\n setSettingsScreenWithHistory(SettingsScreens.PrivacyLastSeen, noPushState);\n return;\n case SettingsScreens.PrivacyProfilePhotoAllowedContacts:\n case SettingsScreens.PrivacyProfilePhotoDeniedContacts:\n setSettingsScreenWithHistory(SettingsScreens.PrivacyProfilePhoto, noPushState);\n return;\n case SettingsScreens.PrivacyForwardingAllowedContacts:\n case SettingsScreens.PrivacyForwardingDeniedContacts:\n setSettingsScreenWithHistory(SettingsScreens.PrivacyForwarding, noPushState);\n return;\n case SettingsScreens.PrivacyGroupChatsAllowedContacts:\n case SettingsScreens.PrivacyGroupChatsDeniedContacts:\n setSettingsScreenWithHistory(SettingsScreens.PrivacyGroupChats, noPushState);\n return;\n case SettingsScreens.TwoFaNewPassword:\n setSettingsScreenWithHistory(SettingsScreens.TwoFaDisabled, noPushState);\n return;\n case SettingsScreens.TwoFaNewPasswordConfirm:\n setSettingsScreenWithHistory(SettingsScreens.TwoFaNewPassword, noPushState);\n return;\n case SettingsScreens.TwoFaNewPasswordHint:\n setSettingsScreenWithHistory(SettingsScreens.TwoFaNewPasswordConfirm, noPushState);\n return;\n case SettingsScreens.TwoFaNewPasswordEmail:\n setSettingsScreenWithHistory(SettingsScreens.TwoFaNewPasswordHint, noPushState);\n return;\n case SettingsScreens.TwoFaNewPasswordEmailCode:\n setSettingsScreenWithHistory(SettingsScreens.TwoFaNewPasswordEmail, noPushState);\n return;\n case SettingsScreens.TwoFaChangePasswordCurrent:\n case SettingsScreens.TwoFaTurnOff:\n case SettingsScreens.TwoFaRecoveryEmailCurrentPassword:\n setSettingsScreenWithHistory(SettingsScreens.TwoFaEnabled, noPushState);\n return;\n case SettingsScreens.TwoFaChangePasswordNew:\n setSettingsScreenWithHistory(SettingsScreens.TwoFaChangePasswordCurrent, noPushState);\n return;\n case SettingsScreens.TwoFaChangePasswordConfirm:\n setSettingsScreenWithHistory(SettingsScreens.TwoFaChangePasswordNew, noPushState);\n return;\n case SettingsScreens.TwoFaChangePasswordHint:\n setSettingsScreenWithHistory(SettingsScreens.TwoFaChangePasswordConfirm, noPushState);\n return;\n case SettingsScreens.TwoFaRecoveryEmail:\n setSettingsScreenWithHistory(SettingsScreens.TwoFaRecoveryEmailCurrentPassword, noPushState);\n return;\n case SettingsScreens.TwoFaRecoveryEmailCode:\n setSettingsScreenWithHistory(SettingsScreens.TwoFaRecoveryEmail, noPushState);\n return;\n\n case SettingsScreens.FoldersCreateFolder:\n case SettingsScreens.FoldersEditFolder:\n setSettingsScreenWithHistory(SettingsScreens.Folders, noPushState);\n return;\n default:\n break;\n }\n }\n\n if (!noPushState) {\n HistoryWrapper.back();\n }\n\n if (content === LeftColumnContent.ChatList && activeChatFolder === 0) {\n setContentWithHistory(LeftColumnContent.GlobalSearch);\n return;\n }\n\n setContentWithHistory(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, setContentWithHistory, settingsScreen, setSettingsScreenWithHistory,\n setGlobalSearchQuery, setGlobalSearchDate, setGlobalSearchChatId, resetChatCreation,\n ]);\n\n const [shouldSkipTransition, setShouldSkipTransition] = useState(false);\n useHistoryBack((event, noAnimation, previousHistoryState) => {\n if (previousHistoryState && previousHistoryState.type === 'left') {\n if (noAnimation) {\n setShouldSkipTransition(true);\n setTimeout(() => {\n setShouldSkipTransition(false);\n }, ANIMATION_DURATION[IS_MOBILE_SCREEN ? 'slide-layers' : 'push-slide']);\n }\n handleReset(false, true);\n }\n });\n\n const handleSearchQuery = useCallback((query: string) => {\n if (content === LeftColumnContent.Contacts) {\n setContactsFilter(query);\n return;\n }\n\n setContentWithHistory(LeftColumnContent.GlobalSearch);\n\n if (query !== searchQuery) {\n setGlobalSearchQuery({ query });\n }\n }, [content, setContentWithHistory, 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 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 } = global;\n return { searchQuery: query, searchDate: date, activeChatFolder };\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 { IDimensions } from '../modules/helpers';\n\nimport { throttle } from '../util/schedulers';\nimport windowSize from '../util/windowSize';\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 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_MOBILE_SCREEN } from '../../util/environment';\nimport { pick } from '../../util/iteratees';\nimport { isChatChannel, isChatSuperGroup } from '../../modules/helpers';\nimport {\n selectChat,\n selectIsChatBotNotStarted, 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 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 canSubscribe,\n canSearch,\n canMute,\n canSelect,\n canLeave,\n isRightColumnShown,\n joinChannel,\n sendBotCommand,\n openLocalTextSearch,\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 handleSearchClick = useCallback(() => {\n openLocalTextSearch();\n\n if (IS_MOBILE_SCREEN) {\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_MOBILE_SCREEN && canSubscribe && (\n \n {lang(isChannel ? 'Subscribe' : 'Join Group')}\n \n )}\n {!IS_MOBILE_SCREEN && canStartBot && (\n \n {lang('Start')}\n \n )}\n {!IS_MOBILE_SCREEN && canSearch && (\n \n \n \n )}\n {(IS_MOBILE_SCREEN || !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 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 canStartBot = 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_MOBILE_SCREEN && canSubscribe)\n || (IS_MOBILE_SCREEN && canSearch)\n || canMute\n || canSelect\n || canLeave\n );\n\n return {\n noMenu,\n isChannel,\n isRightColumnShown,\n canStartBot,\n canSubscribe,\n canSearch,\n canMute,\n canSelect,\n canLeave,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'joinChannel', 'sendBotCommand', 'openLocalTextSearch',\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_MOBILE_SCREEN } 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_MOBILE_SCREEN } 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 selectThreadOriginChat,\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};\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 originChatId: number;\n messagesCount?: number;\n isChatWithSelf?: boolean;\n isChatWithBot?: boolean;\n lastSyncTime?: number;\n notifySettings: NotifySettings;\n notifyExceptions?: Record;\n};\n\ntype DispatchProps = Pick;\n\nconst MiddleHeader: FC = ({\n chatId,\n threadId,\n messageListType,\n pinnedMessageIds,\n messagesById,\n canUnpin,\n topMessageSender,\n typingStatus,\n isSelectModeActive,\n isLeftColumnShown,\n isRightColumnShown,\n audioMessage,\n chat,\n chatsById,\n originChatId,\n messagesCount,\n isChatWithSelf,\n isChatWithBot,\n lastSyncTime,\n notifySettings,\n notifyExceptions,\n openChatWithInfo,\n pinMessage,\n focusMessage,\n openChat,\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) {\n loadPinnedMessages({ chatId });\n }\n }, [chatId, loadPinnedMessages, lastSyncTime, threadId]);\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 = windowWidth >= MOBILE_SCREEN_MAX_WIDTH && 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(() => {\n if (IS_MOBILE_SCREEN) {\n const messageInput = document.getElementById(EDITABLE_INPUT_ID);\n if (messageInput) {\n messageInput.blur();\n }\n }\n if (threadId === MAIN_THREAD_ID && messageListType === 'thread') {\n if (IS_MOBILE_SCREEN) {\n openChat({ id: undefined });\n } else {\n toggleLeftColumn();\n }\n\n return;\n }\n\n if (messageListType === 'scheduled' && isSelectModeActive) {\n exitMessageSelectMode();\n }\n openChat({ id: originChatId, threadId: MAIN_THREAD_ID });\n }, [openChat, originChatId, threadId, messageListType, toggleLeftColumn, isSelectModeActive, exitMessageSelectMode]);\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 && 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 } = 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 const originChat = selectThreadOriginChat(global, chatId, threadId);\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 originChatId: originChat ? originChat.id : chatId,\n messagesCount,\n isChatWithSelf: selectIsChatWithSelf(global, chatId),\n isChatWithBot: chat && selectIsChatWithBot(global, chat),\n lastSyncTime,\n notifySettings: selectNotifySettings(global),\n notifyExceptions: selectNotifyExceptions(global),\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 '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\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 nextMessageDatetime = Number(getDayStart(nextMessage.date * 1000));\n if (currentDateGroup.datetime !== nextMessageDatetime) {\n currentDateGroup = {\n originalDate: nextMessage.date,\n datetime: nextMessageDatetime,\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 ) {\n currentSenderGroup = [];\n currentDateGroup.senderGroups.push(currentSenderGroup);\n }\n }\n });\n\n return dateGroups;\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 { MutableRefObject } from 'react';\nimport React, {\n FC, useCallback, useEffect, useRef,\n} from '../../lib/teact/teact';\n\nimport { MESSAGE_LIST_SENSITIVE_AREA } from '../../config';\nimport resetScroll from '../../util/resetScroll';\nimport { useIntersectionObserver, useOnIntersect } from '../../hooks/useIntersectionObserver';\nimport useOnChange from '../../hooks/useOnChange';\n\ntype OwnProps = {\n containerRef: MutableRefObject;\n className: string;\n messageIds: number[];\n focusingId?: number;\n loadMoreForwards?: NoneToVoidFunction;\n loadMoreBackwards?: NoneToVoidFunction;\n isViewportNewest?: boolean;\n firstUnreadId?: number;\n onFabToggle: AnyToVoidFunction;\n onNotchToggle: AnyToVoidFunction;\n children: any;\n};\n\nconst FAB_THRESHOLD = 50;\nconst FAB_FREEZE_TIMEOUT = 100;\n\n// Local flag is used because `freeze/unfreeze` methods are controlled by heavy animation\nlet isFabFrozen = false;\n\nconst MessageScroll: FC = ({\n containerRef,\n className,\n messageIds,\n focusingId,\n loadMoreForwards,\n loadMoreBackwards,\n isViewportNewest,\n firstUnreadId,\n onFabToggle,\n onNotchToggle,\n children,\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 (isFabFrozen) {\n return;\n }\n\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(firstUnreadId ? !isAtBottom : !isNearBottom);\n onNotchToggle(!isAtBottom);\n }, [messageIds, isViewportNewest, containerRef, onFabToggle, firstUnreadId, onNotchToggle]);\n\n const {\n observe: observeIntersection,\n freeze: freezeForLoadMore,\n unfreeze: unfreezeForLoadMore,\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 } = useIntersectionObserver({\n rootRef: containerRef,\n }, toggleScrollTools);\n\n useOnIntersect(fabTriggerRef, observeIntersectionForNotch);\n\n // Do not load more and show FAB when focusing\n useOnChange(() => {\n if (focusingId) {\n freezeForLoadMore();\n freezeForFab();\n } else {\n unfreezeForFab();\n unfreezeForLoadMore();\n }\n }, [focusingId]);\n\n // Workaround for FAB flickering with tall incoming message\n useOnChange(() => {\n isFabFrozen = true;\n\n setTimeout(() => {\n isFabFrozen = false;\n }, FAB_FREEZE_TIMEOUT);\n }, [messageIds]);\n\n // Workaround for stuck FAB when many unread messages\n useEffect(toggleScrollTools, [firstUnreadId]);\n\n return (\n
\n
\n {children}\n \n \n
\n );\n};\n\nexport default MessageScroll;\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 }: {\n hasReply?: boolean;\n customShape?: boolean | number;\n isLastInGroup?: boolean;\n asForwarded?: boolean;\n hasThread?: boolean;\n forceSenderName?: boolean;\n hasComments?: 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 isMediaWithNoText = (photo || video) && !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 (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) {\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 (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_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 : MIN_MEDIA_WIDTH;\n}\n\nexport function calculateMediaDimensions(message: ApiMessage) {\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)\n : calculateVideoDimensions(video!, isOwn, isForwarded);\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 } from '../../../../api/types';\nimport { IDimensions } from '../../../../modules/helpers';\n\nimport { MOBILE_SCREEN_MAX_WIDTH } from '../../../../config';\nimport { REM } from '../../../common/helpers/mediaDimensions';\nimport { calculateMediaDimensions } from './mediaDimensions';\n\nconst MAX_WIDTH_MOBILE_VW = 69;\nconst MAX_WIDTH_DESK_OWN_REM = 30;\nconst MAX_WIDTH_DESK_REM = 29;\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: IDimensions;\n};\n\nfunction getMaxWidth(isOwn: boolean, isForwarded: boolean, windowWidth: number) {\n if (windowWidth <= MOBILE_SCREEN_MAX_WIDTH) {\n return (windowWidth / 100) * MAX_WIDTH_MOBILE_VW - (isForwarded ? 1.625 : 0) * REM;\n }\n\n const maxWidth = isOwn ? MAX_WIDTH_DESK_OWN_REM : MAX_WIDTH_DESK_REM;\n\n return (maxWidth - (isForwarded ? 1.625 : 0)) * REM;\n}\n\nfunction getRatios(messages: ApiMessage[]) {\n return messages.map(\n (message) => {\n const dimensions = calculateMediaDimensions(message) as IDimensions;\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: IDimensions = { 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 album: IAlbum,\n windowWidth: number,\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 = getMaxWidth(isOwn, isForwarded, windowWidth);\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","let element: HTMLSpanElement | undefined;\n\nexport default function calculateAuthorWidth(text: string) {\n if (!element) {\n element = document.createElement('span');\n element.style.font = '400 12px Roboto, \"Helvetica Neue\", \"Apple Color Emoji\", 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 { useLayoutEffect } from '../../../../lib/teact/teact';\nimport fastSmoothScroll from '../../../../util/fastSmoothScroll';\nimport { FocusDirection } from '../../../../types';\n\n// This is the max scroll offset within existing viewport.\nconst FOCUS_MAX_OFFSET = 1500;\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' : 'center',\n FOCUS_MARGIN,\n focusDirection === undefined ? FOCUS_MAX_OFFSET : RELOCATED_FOCUS_OFFSET,\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, 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';\n\ntype OwnProps = {\n message: ApiMessage;\n observeIntersection?: ObserveFn;\n isEmbedded?: boolean;\n appearanceOrder?: number;\n isLastInList?: boolean;\n};\n\ntype StateProps = {\n sender?: ApiUser | ApiChat;\n targetUser?: ApiUser;\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 sender,\n targetUser,\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 content = renderActionMessageText(\n lang,\n message,\n sender,\n targetUser,\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 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 userId = message.senderId;\n const { targetUserId, 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 sender,\n ...(targetUserId && { targetUser: selectUser(global, targetUserId) }),\n targetChatId,\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_MOBILE_SCREEN } 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_MOBILE_SCREEN && !IS_CANVAS_FILTER_SUPPORTED,\n );\n}\n","const SELECTED_APPENDIX_BACKGROUND = 'rgba(255,255,255,1)';\n\nexport default async (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 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 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);\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 canMessagePlayVideoInline,\n getMediaTransferState,\n getMessageMediaFormat,\n getMessageMediaHash,\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 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 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 = message.content.video!;\n const localBlobUrl = video.blobUrl;\n const canPlayInline = Boolean(localBlobUrl) || canMessagePlayVideoInline(video);\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 thumbRef = useBlurredMediaThumbRef(message);\n const { mediaData, downloadProgress } = useMediaWithDownloadProgress(\n getMessageMediaHash(message, 'inline'),\n !shouldDownload,\n getMessageMediaFormat(message, 'inline'),\n lastSyncTime,\n );\n\n const fullMediaData = localBlobUrl || mediaData;\n const isInline = Boolean(canPlayInline && isIntersecting && fullMediaData);\n\n const { isBuffered, bufferingHandlers } = useBuffering(!shouldAutoLoad);\n const { isUploading, isTransferring, transferProgress } = getMediaTransferState(\n message,\n uploadProgress || downloadProgress,\n shouldDownload && (canPlayInline && !isBuffered),\n );\n const wasDownloadDisabled = usePrevious(isDownloadAllowed) === false;\n const {\n shouldRender: shouldRenderSpinner,\n transitionClassNames: spinnerClassNames,\n } = useShowTransition(isTransferring, undefined, wasDownloadDisabled);\n const { shouldRenderThumb, 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 isOwn = isOwnMessage(message);\n const isForwarded = isForwardedMessage(message);\n const { width, height } = dimensions || calculateVideoDimensions(video, isOwn, isForwarded);\n\n useHeavyAnimationCheckForVideo(videoRef, Boolean(isInline && shouldAutoPlay));\n\n usePauseOnInactive(videoRef, isPlayAllowed);\n\n useVideoCleanup(videoRef, [isInline]);\n\n const handleClick = useCallback(() => {\n if (isUploading) {\n if (onCancelUpload) {\n onCancelUpload(message);\n }\n } else if (canPlayInline && !fullMediaData) {\n setIsDownloadAllowed((isAllowed) => !isAllowed);\n } else if (canPlayInline && fullMediaData && !isPlayAllowed) {\n setIsPlayAllowed(true);\n videoRef.current!.play();\n } else if (onClick) {\n onClick(message.id);\n }\n }, [isUploading, canPlayInline, 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 const shouldRenderInlineVideo = isInline;\n const shouldRenderHqPreview = !canPlayInline && mediaData;\n const shouldRenderPlayButton = !canPlayInline || (isDownloadAllowed && !isPlayAllowed && !shouldRenderSpinner);\n const shouldRenderDownloadButton = canPlayInline && !isDownloadAllowed;\n\n return (\n \n {(!isInline || shouldRenderThumb)\n && (\n \n )}\n {previewBlobUrl && (\n \n )}\n\n {shouldRenderInlineVideo && (\n \n \n \n )}\n {shouldRenderHqPreview && (\n \n )}\n {shouldRenderPlayButton && (\n \n )}\n {shouldRenderSpinner && (\n
\n \n
\n )}\n {shouldRenderDownloadButton && (\n \n )}\n {isTransferring && !canPlayInline ? (\n {Math.round(transferProgress * 100)}%\n ) : isTransferring && canPlayInline ? (\n ...\n ) : (\n
\n {video.isGif ? 'GIF' : formatMediaDuration(video.duration - playProgress)}\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};\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}) => {\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), 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 { byId: usersById } = global.users;\n if (!recentVoterIds || recentVoterIds.length === 0) {\n return {};\n }\n\n return {\n recentVoterIds,\n usersById,\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';\n\nimport './WebPage.scss';\n\nconst MAX_TEXT_LENGTH = 170; // symbols\n\ntype OwnProps = {\n message: ApiMessage;\n observeIntersection?: ObserveFn;\n shouldAutoLoad?: boolean;\n inPreview?: boolean;\n onMediaClick?: () => void;\n onCancelMediaTransfer?: () => void;\n};\n\nconst WebPage: FC = ({\n message,\n observeIntersection,\n shouldAutoLoad,\n inPreview,\n onMediaClick,\n onCancelMediaTransfer,\n}) => {\n const webPage = getMessageWebPage(message);\n\n let isSquarePhoto = false;\n if (webPage && webPage.photo) {\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 } = webPage;\n\n const isMediaInteractive = photo && onMediaClick && !isSquarePhoto && !webPage.hasDocument;\n const truncatedDescription = trimText(description, MAX_TEXT_LENGTH);\n\n const className = buildClassName(\n 'WebPage',\n photo\n ? (isSquarePhoto && 'with-square-photo')\n : (!inPreview && 'without-photo'),\n );\n\n return (\n \n {photo && (\n \n )}\n
\n \n {!inPreview && title && (\n

{renderText(title)}

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

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

\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(WrapedComponent: FC) {\n const Component: 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 )(Component));\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';\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 requestAnimationFrame(() => {\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\n usePauseOnInactive(playerRef, Boolean(mediaData));\n\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 playerEl.currentTime = 0;\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 && (\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 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 {button.text}\n {button.type === 'url' && }\n \n ))}\n
\n ))}\n
\n );\n};\n\nexport default InlineButtons;\n","import React, { FC, memo, useCallback } 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 } 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};\n\ntype DispatchProps = Pick;\n\nconst CommentButton: FC = ({\n disabled, threadInfo, usersById, chatsById, openChat,\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 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 { byId: usersById } = global.users;\n const { byId: chatsById } = global.chats;\n\n return {\n threadInfo,\n usersById,\n chatsById,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'openChat',\n ]),\n)(CommentButton));\n","import { MouseEvent as ReactMouseEvent } from 'react';\nimport 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 { FocusDirection, IAlbum, MediaViewerOrigin } from '../../../types';\n\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, selectShouldLoopStickers,\n} from '../../../modules/selectors';\nimport {\n getMessageContent,\n isOwnMessage,\n isReplyMessage,\n isAnonymousOwnMessage,\n isChatPrivate,\n getMessageCustomShape,\n isChatChannel,\n getMessageSingleEmoji, getSenderTitle, getUserColorKey,\n} from '../../../modules/helpers';\nimport buildClassName from '../../../util/buildClassName';\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 renderText from '../../common/helpers/renderText';\nimport calculateAuthorWidth from './helpers/calculateAuthorWidth';\nimport { ObserveFn, useOnIntersect } from '../../../hooks/useIntersectionObserver';\nimport useFocusMessage from './hooks/useFocusMessage';\nimport useWindowSize from '../../../hooks/useWindowSize';\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 withAvatar?: boolean;\n withSenderName?: boolean;\n threadId: number;\n messageListType: MessageListType;\n noComments: boolean;\n appearanceOrder: number;\n} & MessagePositionProperties;\n\ntype StateProps = {\n forceSenderName?: boolean;\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;\n\nconst Message: FC = ({\n message,\n observeIntersectionForBottom,\n observeIntersectionForMedia,\n observeIntersectionForAnimatedStickers,\n album,\n withAvatar,\n withSenderName,\n noComments,\n appearanceOrder,\n isFirstInGroup,\n isLastInGroup,\n isFirstInDocumentGroup,\n isLastInDocumentGroup,\n isLastInList,\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}) => {\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\n useOnIntersect(bottomMarkerRef, observeIntersectionForBottom);\n\n const { width: windowWidth } = useWindowSize();\n\n const {\n isContextMenuOpen, contextMenuPosition,\n handleBeforeContextMenu, handleContextMenu,\n handleContextMenuClose, handleContextMenuHide,\n } = useContextMenuHandlers(ref, false, true);\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 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 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 });\n const avatarPeer = forwardInfo && (isChatWithSelf || !sender) ? originSender : sender;\n const senderPeer = forwardInfo ? originSender : sender;\n const signature = (\n (isChannel && message.adminTitle) || (forwardInfo && !asForwarded && forwardInfo.adminTitle) || undefined\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: ReactMouseEvent) => {\n e.stopPropagation();\n\n toggleMessageSelection({\n messageId,\n groupedId: message.groupedId,\n });\n }, [messageId, message.groupedId, toggleMessageSelection]);\n\n const handleMessageSelect = useCallback((e?: ReactMouseEvent) => {\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 }, [toggleMessageSelection, messageId, isAlbum, album]);\n\n const handleContainerDoubleClick = useCallback(() => {\n setReplyingToId({ messageId });\n }, [setReplyingToId, messageId]);\n\n const handleContentDoubleClick = useCallback((e: ReactMouseEvent) => {\n e.stopPropagation();\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 return;\n }\n\n if (isChatPrivate(senderPeer.id)) {\n openUserInfo({ id: senderPeer.id });\n } else {\n openChat({ id: senderPeer.id });\n }\n }, [senderPeer, 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({ chatId, threadId, messageId: message.replyToMessageId });\n }, [focusMessage, chatId, threadId, message.replyToMessageId]);\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 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 const lang = useLang();\n\n let style = '';\n let calculatedWidth;\n let noMediaCorners = false;\n const albumLayout = useMemo(() => {\n return isAlbum ? calculateAlbumLayout(isOwn, Boolean(asForwarded), album!, windowWidth) : undefined;\n }, [isAlbum, windowWidth, isOwn, asForwarded, 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).width;\n } else if (video) {\n if (video.isRound) {\n width = ROUND_VIDEO_DIMENSIONS;\n } else {\n width = calculateMediaDimensions(message).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\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 && (\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) {\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 const metaSafeAuthorWidth = useMemo(() => {\n return signature ? calculateAuthorWidth(signature) : undefined;\n }, [signature]);\n\n const canShowActionButton = (\n !(isContextMenuShown || isInSelectMode || isForwarding)\n && (!isInDocumentGroup || isLastInDocumentGroup)\n );\n const canForward = canShowActionButton && isChannel && !isScheduled;\n const canFocus = canShowActionButton && (\n (forwardInfo && (forwardInfo.isChannelPost || (isChatWithSelf && !isOwn)) && forwardInfo.fromMessageId)\n || isPinnedList\n );\n\n return (\n \n \n {!isInDocumentGroup && (\n
\n {isSelected && }\n
\n )}\n {isLastInDocumentGroup && (\n \n {isGroupSelected && (\n \n )}\n \n )}\n {withAvatar && renderAvatar()}\n \n \n {withAppendix && (
)}\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 {contentClassName.includes('has-appendix') &&
}\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\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 forceSenderName,\n sender,\n originSender,\n botSender,\n shouldHideReply,\n isThreadTop,\n replyMessage,\n replyMessageSender,\n ...(isOutgoing && { outgoingStatus: selectOutgoingStatus(global, message, messageListType === 'scheduled') }),\n ...(typeof uploadProgress === 'number' && { uploadProgress }),\n isFocused,\n ...(isFocused && { focusDirection, noFocusHighlight }),\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 };\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 ]),\n)(Message));\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, SCHEDULED_WHEN_ONLINE } from '../../config';\nimport { IS_ANDROID, IS_MOBILE_SCREEN } from '../../util/environment';\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, selectCurrentMessageIds,\n} from '../../modules/selectors';\nimport {\n getMessageOriginalId,\n isActionMessage,\n isChatChannel,\n isChatPrivate,\n isOwnMessage,\n} from '../../modules/helpers';\nimport {\n compact,\n flatten,\n orderBy,\n pick,\n} from '../../util/iteratees';\nimport {\n fastRaf, debounce, onTickEnd,\n} from '../../util/schedulers';\nimport { formatHumanDate } from '../../util/dateFormat';\nimport useLayoutEffectWithPrevDeps from '../../hooks/useLayoutEffectWithPrevDeps';\nimport buildClassName from '../../util/buildClassName';\nimport { groupMessages, MessageDateGroup, isAlbum } from './helpers/groupMessages';\nimport { ObserveFn, useIntersectionObserver } from '../../hooks/useIntersectionObserver';\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, { LangFn } from '../../hooks/useLang';\nimport useWindowSize from '../../hooks/useWindowSize';\n\nimport Loading from '../ui/Loading';\nimport MessageScroll from './MessageScroll';\nimport Message from './message/Message';\nimport ActionMessage from './ActionMessage';\n\nimport './MessageList.scss';\n\ntype OwnProps = {\n chatId: number;\n threadId: number;\n type: MessageListType;\n canPost: 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 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 INTERSECTION_THROTTLE_FOR_MEDIA = IS_ANDROID ? 1000 : 350;\nconst INTERSECTION_MARGIN_FOR_MEDIA = IS_MOBILE_SCREEN ? 300 : 500;\nconst FOCUSING_DURATION = 1000;\nconst BOTTOM_FOCUS_MARGIN = 20;\nconst SELECT_MODE_ANIMATION_DURATION = 200;\nconst FOCUSING_FADE_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 isChatWithSelf,\n messageIds,\n messagesById,\n firstUnreadId,\n isViewportNewest,\n threadFirstMessageId,\n isRestricted,\n restrictionReason,\n focusingId,\n isSelectModeActive,\n animationLevel,\n loadViewportMessages,\n markMessageListRead,\n markMessagesRead,\n setScrollOffset,\n lastMessage,\n botDescription,\n threadTopMessageId,\n hasLinkedChat,\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(!messageIds);\n\n const [containerHeight, setContainerHeight] = useState();\n const [hasFocusing, setHasFocusing] = useState(Boolean(focusingId));\n\n const areMessagesLoaded = Boolean(messageIds);\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 const {\n observe: observeIntersectionForMedia, freeze: freezeForMedia, unfreeze: unfreezeForMedia,\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 useOnChange(() => {\n memoFocusingIdRef.current = focusingId;\n\n if (focusingId) {\n freezeForMedia();\n freezeForReading();\n } else {\n unfreezeForReading();\n unfreezeForMedia();\n }\n }, [focusingId]);\n\n const { observe: observeIntersectionForAnimatedStickers } = useIntersectionObserver({\n rootRef: containerRef,\n throttleMs: INTERSECTION_THROTTLE_FOR_MEDIA,\n });\n\n useEffect(() => {\n if (focusingId) {\n setHasFocusing(true);\n } else {\n setTimeout(() => {\n setHasFocusing(false);\n }, FOCUSING_FADE_ANIMATION_DURATION);\n }\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]);\n return groupMessages(orderBy(listedMessages, ['date', 'id']), memoUnreadDividerBeforeIdRef.current);\n }, [messageIds, messagesById, threadFirstMessageId, threadTopMessageId]);\n\n const [loadMoreBackwards, loadMoreForwards, loadMoreAround] = useMemo(\n () => (type === 'thread' ? [\n debounce(() => loadViewportMessages({ direction: LoadMoreDirection.Backwards }), 1000, true, false),\n debounce(() => loadViewportMessages({ direction: LoadMoreDirection.Forwards }), 1000, true, false),\n debounce(() => loadViewportMessages({ direction: LoadMoreDirection.Around }), 1000, true, false),\n ] : []),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [loadViewportMessages, messageIds],\n );\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 useEffect(() => {\n containerRef.current!.dataset.normalHeight = String(containerRef.current!.offsetHeight);\n }, [windowHeight]);\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) {\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]);\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 = unreadDivider.offsetTop - (hasTools ? UNREAD_DIVIDER_TOP_WITH_TOOLS : UNREAD_DIVIDER_TOP);\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 useEffect(() => {\n if (!animationLevel || animationLevel > 0) {\n dispatchHeavyAnimationEvent(SELECT_MODE_ANIMATION_DURATION + ANIMATION_END_DELAY);\n }\n }, [animationLevel, isSelectModeActive]);\n\n const lang = useLang();\n\n const isPrivate = Boolean(chatId && isChatPrivate(chatId));\n const withUsers = Boolean((!isPrivate && !isChannelChat) || isChatWithSelf);\n\n const className = buildClassName(\n 'MessageList custom-scroll',\n !withUsers && 'no-avatars',\n isChannelChat && 'no-avatars',\n !canPost && 'no-composer',\n type === 'pinned' && 'type-pinned',\n isSelectModeActive && 'select-mode-active',\n hasFocusing && 'has-focusing',\n isScrolled && 'scrolled',\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 {renderMessages(\n lang,\n messageGroups || groupMessages([lastMessage!]),\n observeIntersectionForReading,\n observeIntersectionForMedia,\n observeIntersectionForAnimatedStickers,\n withUsers,\n anchorIdRef,\n memoUnreadDividerBeforeIdRef,\n threadId,\n type,\n threadTopMessageId,\n threadFirstMessageId,\n hasLinkedChat,\n messageGroups ? type === 'scheduled' : false,\n !messageGroups || !shouldAnimateAppearanceRef.current,\n )}\n \n ) : (\n \n )}\n
\n );\n};\n\nfunction renderMessages(\n lang: LangFn,\n messageGroups: MessageDateGroup[],\n observeIntersectionForReading: ObserveFn,\n observeIntersectionForMedia: ObserveFn,\n observeIntersectionForAnimatedStickers: ObserveFn,\n withUsers: boolean,\n currentAnchorIdRef: { current: string | undefined },\n memoFirstUnreadIdRef: { current: number | undefined },\n threadId: number,\n type: MessageListType,\n threadTopMessageId?: number,\n threadFirstMessageId?: number,\n hasLinkedChat?: boolean,\n isSchedule = false,\n noAppearanceAnimation = false,\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 && currentAnchorIdRef.current === `message${message.previousLocalId}`) {\n currentAnchorIdRef.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
\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 flatten(dateGroups);\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\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 isSelectModeActive: selectIsInSelectMode(global),\n animationLevel: global.settings.byKey.animationLevel,\n ...(withLastMessageWhenPreloading && { lastMessage }),\n botDescription,\n threadTopMessageId,\n hasLinkedChat: chat.fullInfo && ('linkedChatId' in chat.fullInfo)\n ? Boolean(chat.fullInfo.linkedChatId)\n : undefined,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadViewportMessages',\n 'markMessageListRead',\n 'markMessagesRead',\n 'setScrollOffset',\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 focusLastMessage,\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 focusLastMessage();\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, focusLastMessage]);\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, ['focusLastMessage']),\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","export default __webpack_public_path__ + \"8ccc0b555efcec3616377aea078dda16.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 && input.tagName === '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';\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 requestAnimationFrame(() => {\n const messageInput = document.getElementById(EDITABLE_INPUT_ID)!;\n focusEditableElement(messageInput, true);\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 // Subscribe and handle `window.blur`\n useEffect(() => {\n function handleBlur() {\n if (chatId && threadId) {\n updateDraft(chatId, threadId);\n }\n }\n\n window.addEventListener('blur', handleBlur);\n\n return () => {\n window.removeEventListener('blur', handleBlur);\n };\n }, [chatId, threadId, updateDraft]);\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 './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 ApiSticker,\n ApiVideo,\n ApiNewPoll,\n ApiMessage,\n ApiFormattedText,\n ApiChat,\n ApiChatMember,\n ApiUser,\n MAIN_THREAD_ID,\n} from '../../../api/types';\n\nimport { EDITABLE_INPUT_ID, SCHEDULED_WHEN_ONLINE } from '../../../config';\nimport { IS_VOICE_RECORDING_SUPPORTED, IS_MOBILE_SCREEN, IS_EMOJI_SUPPORTED } 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 isChatGroup,\n isChatPrivate,\n isChatAdmin,\n} from '../../../modules/helpers';\nimport { 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';\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';\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 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 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 canSuggestMembers?: 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} & 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 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 canSuggestMembers,\n isPollModalOpen,\n isPaymentModalOpen,\n isReceiptModalOpen,\n botKeyboardMessageId,\n withScheduledButton,\n stickersForEmoji,\n groupChatMembers,\n currentUserId,\n usersById,\n lastSyncTime,\n contentToBeScheduled,\n shouldSuggestStickers,\n recentEmojis,\n sendMessage,\n editMessage,\n saveDraft,\n clearDraft,\n showError,\n setStickerSearchQuery,\n setGifSearchQuery,\n forwardMessages,\n openPollModal,\n closePollModal,\n loadScheduledHistory,\n closePaymentModal,\n openChat,\n clearReceipt,\n addRecentEmoji,\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\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) {\n loadScheduledHistory();\n }\n }, [chatId, loadScheduledHistory, lastSyncTime, threadId]);\n\n useLayoutEffect(() => {\n if (!appendixRef.current) {\n return;\n }\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 mentionFilteredMembers,\n } = useMentionTooltip(\n canSuggestMembers && !attachments.length,\n html,\n setHtml,\n undefined,\n groupChatMembers,\n currentUserId,\n usersById,\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 );\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 );\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 if (selection.rangeCount) {\n const selectionRange = selection.getRangeAt(0);\n if (isSelectionInsideInput(selectionRange)) {\n if (IS_EMOJI_SUPPORTED) {\n // Insertion will trigger `onChange` in MessageInput, so no need to setHtml in state\n document.execCommand('insertText', false, text);\n } else {\n insertHtmlInSelection(newHtml);\n messageInput.dispatchEvent(new Event('input', { bubbles: true }));\n }\n return;\n }\n\n setHtml(`${htmlRef.current!}${newHtml}`);\n\n if (!IS_MOBILE_SCREEN) {\n // If selection is outside of input, set cursor at the end of input\n requestAnimationFrame(() => {\n focusEditableElement(messageInput);\n });\n }\n } else {\n setHtml(`${htmlRef.current!}${newHtml}`);\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)) {\n document.execCommand('delete', false);\n return;\n }\n }\n\n setHtml(deleteLastCharacterOutsideSelection(htmlRef.current!));\n }, []);\n\n const resetComposer = useCallback(() => {\n setHtml('');\n setAttachments([]);\n closeStickerTooltip();\n closeCalendar();\n setScheduledMessageArgs(undefined);\n closeMentionTooltip();\n closeEmojiTooltip();\n\n if (IS_MOBILE_SCREEN) {\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 showError({\n error: {\n message: 'CAPTION_TOO_LONG_PLEASE_REMOVE_CHARACTERS',\n textParams: {\n '{EXTRA_CHARS_COUNT}': extraLength,\n '{PLURAL_S}': extraLength > 1 ? 's' : '',\n },\n },\n });\n return;\n }\n\n if (currentAttachments.length || text) {\n if (slowMode && !isAdmin) {\n const nowSeconds = Math.floor(Date.now() / 1000);\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 showError({\n error: {\n message: `A wait of ${secondsRemaining} seconds is required before sending another message in this chat`,\n isSlowMode: true,\n },\n });\n\n const messageInput = document.getElementById(EDITABLE_INPUT_ID)!;\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);\n\n clearDraft({ chatId, localOnly: true });\n\n // Wait until message animation starts\n requestAnimationFrame(resetComposer);\n }, [\n activeVoiceRecording, attachments, connectionState, chatId, slowMode, isForwarding, isAdmin,\n sendMessage, stopRecordingVoice, resetComposer, clearDraft, showError, forwardMessages,\n ]);\n\n const handleStickerSelect = useCallback((sticker: ApiSticker) => {\n sticker = {\n ...sticker,\n isPreloadedGlobally: true,\n };\n\n if (shouldSchedule) {\n setScheduledMessageArgs({ sticker });\n openCalendar();\n } else {\n sendMessage({ sticker });\n requestAnimationFrame(resetComposer);\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(resetComposer);\n }\n }, [shouldSchedule, openCalendar, sendMessage, resetComposer]);\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) => {\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\n if (!scheduledMessageArgs || Object.keys(restArgs).length === 0) {\n handleSend(!!isSilent, scheduledAt);\n } else {\n sendMessage({\n ...scheduledMessageArgs,\n scheduledAt,\n });\n requestAnimationFrame(resetComposer);\n }\n closeCalendar();\n }, [closeCalendar, handleSend, resetComposer, scheduledMessageArgs, sendMessage]);\n\n const handleMessageScheduleUntilOnline = useCallback(() => {\n handleMessageSchedule(new Date(SCHEDULED_WHEN_ONLINE * 1000));\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_MOBILE_SCREEN || 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_MOBILE_SCREEN) {\n closeSymbolMenu();\n }\n }, [isRightColumnShown, closeSymbolMenu]);\n\n useEffect(() => {\n if (isSelectModeActive) {\n disableHover();\n } else {\n setTimeout(() => {\n enableHover();\n }, SELECT_MODE_TRANSITION_MS);\n }\n }, [isSelectModeActive, enableHover, disableHover]);\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(resetComposer);\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 lang = useLang();\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 isSymbolMenuLoaded\n ? (isSymbolMenuOpen && 'menu-opened')\n : (isSymbolMenuOpen && 'is-loading'),\n );\n\n return (\n
\n {allowedAttachmentOptions.canAttachMedia && (\n \n \n \n )}\n \n \n \n \n {renderedEditedMessage && (\n \n )}\n \n
\n
\n \n \n
\n {IS_MOBILE_SCREEN ? (\n \n \n \n \n \n ) : (\n \n \n \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\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 canSuggestMembers: chat && isChatGroup(chat),\n isPollModalOpen: global.isPollModalOpen,\n stickersForEmoji: global.stickers.forEmoji.stickers,\n groupChatMembers: chat && chat.fullInfo && chat.fullInfo.members,\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 };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'sendMessage',\n 'editMessage',\n 'saveDraft',\n 'clearDraft',\n 'showError',\n 'setStickerSearchQuery',\n 'setGifSearchQuery',\n 'forwardMessages',\n 'openPollModal',\n 'closePollModal',\n 'closePaymentModal',\n 'clearReceipt',\n 'loadScheduledHistory',\n 'openChat',\n 'addRecentEmoji',\n ]),\n)(Composer));\n","import {\n useCallback, useEffect, useRef, useState,\n} from '../../../../lib/teact/teact';\n\nimport { IS_IOS } 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) {\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) {\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 (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]);\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 selection.removeAllRanges();\n selection.addRange(range);\n }\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 { MAIN_THREAD_ID } from '../../api/types';\nimport { GlobalActions, MessageListType } 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} from '../../config';\nimport { IS_MOBILE_SCREEN, IS_TOUCH_ENV, MASK_IMAGE_DISABLED } from '../../util/environment';\nimport { DropAreaState } from './composer/DropArea';\nimport {\n selectChat,\n selectCurrentMessageList,\n selectCurrentTextSearch,\n selectIsChatBotNotStarted,\n selectIsInSelectMode,\n selectIsRightColumnShown,\n selectPinnedIds,\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';\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 canPost?: boolean;\n messageSendingRestrictionReason?: string;\n hasPinnedOrAudioMessage?: boolean;\n pinnedMessagesCount?: number;\n theme: ThemeKey;\n customBackground?: string;\n backgroundColor?: string;\n patternColor?: string;\n isRightColumnShown?: boolean;\n isBackgroundBlurred?: boolean;\n isMobileSearchActive?: boolean;\n isSelectModeActive?: boolean;\n animationLevel?: number;\n};\n\ntype DispatchProps = Pick;\n\nconst CLOSE_ANIMATION_DURATION = IS_MOBILE_SCREEN ? 450 + ANIMATION_END_DELAY : undefined;\n\nfunction canBeQuicklyUploaded(item: DataTransferItem) {\n return item.kind === 'file' && item.type && CONTENT_TYPES_FOR_QUICK_UPLOAD.includes(item.type);\n}\n\nconst MiddleColumn: FC = ({\n chatId,\n threadId,\n messageListType,\n isPrivate,\n isPinnedMessageList,\n canPost,\n messageSendingRestrictionReason,\n hasPinnedOrAudioMessage,\n pinnedMessagesCount,\n customBackground,\n theme,\n backgroundColor,\n patternColor,\n isRightColumnShown,\n isBackgroundBlurred,\n isMobileSearchActive,\n isSelectModeActive,\n animationLevel,\n openChat,\n unpinAllMessages,\n loadUser,\n}) => {\n const { width: windowWidth } = useWindowSize();\n\n const [dropAreaState, setDropAreaState] = useState(DropAreaState.None);\n const [isFabShown, setIsFabShown] = useState();\n const [isNotchShown, setIsNotchShown] = useState();\n const [isUnpinModalOpen, setIsUnpinModalOpen] = useState(false);\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 (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).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 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 // 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 lang = useLang();\n\n const footerClassName = buildClassName(\n 'middle-column-footer',\n !renderingCanPost && 'no-composer',\n renderingCanPost && isNotchShown && !isSelectModeActive && 'with-notch',\n );\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_MOBILE_SCREEN && }\n \n )}\n {chatId && (\n \n )}\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { theme } = global.settings.byKey;\n const {\n isBlurred: isBackgroundBlurred, background: customBackground, backgroundColor, patternColor,\n } = global.settings.themes[theme] || {};\n\n const currentMessageList = selectCurrentMessageList(global);\n const { chats: { listIds } } = global;\n\n const state: StateProps = {\n theme,\n customBackground,\n backgroundColor,\n patternColor,\n isRightColumnShown: selectIsRightColumnShown(global),\n isBackgroundBlurred,\n isMobileSearchActive: Boolean(IS_MOBILE_SCREEN && selectCurrentTextSearch(global)),\n isSelectModeActive: selectIsInSelectMode(global),\n animationLevel: global.settings.byKey.animationLevel,\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\n return {\n ...state,\n chatId,\n threadId,\n messageListType,\n isPrivate: isChatPrivate(chatId),\n canPost: !isPinnedMessageList && (!chat || canPost) && (!isBotNotStarted || IS_MOBILE_SCREEN),\n isPinnedMessageList,\n messageSendingRestrictionReason: chat && getMessageSendingRestrictionReason(chat),\n hasPinnedOrAudioMessage: (\n threadId !== MAIN_THREAD_ID\n || Boolean(pinnedIds && pinnedIds.length)\n || Boolean(audioChatId && audioMessageId)\n ),\n pinnedMessagesCount: pinnedIds ? pinnedIds.length : 0,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'openChat', 'unpinAllMessages', 'loadUser',\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_MOBILE_SCREEN } 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 useFlag from '../../hooks/useFlag';\nimport useLang from '../../hooks/useLang';\n\nimport CalendarModal from '../common/CalendarModal.async';\nimport SearchInput from '../ui/SearchInput';\nimport Button from '../ui/Button';\nimport Transition from '../ui/Transition';\nimport './RightHeader.scss';\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 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}\n\nconst RightHeader: FC = ({\n isColumnOpen,\n isProfile,\n isSearch,\n isManagement,\n isStickerSearch,\n isGifSearch,\n isPollResults,\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 searchMessagesByDate,\n shouldSkipAnimation,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const backButtonRef = useRef(null);\n\n const [isCalendarOpen, openCalendar, closeCalendar] = useFlag();\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 handleJumpToDate = useCallback((date: Date) => {\n searchMessagesByDate({ timestamp: date.valueOf() / 1000 });\n closeCalendar();\n }, [closeCalendar, searchMessagesByDate]);\n\n const handleStickerSearchQueryChange = useCallback((query: string) => {\n setStickerSearchQuery({ query, noPushState: true });\n }, [setStickerSearchQuery]);\n\n const handleGifSearchQueryChange = useCallback((query: string) => {\n setGifSearchQuery({ query, noPushState: true });\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 ) : 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 \n \n \n \n );\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_MOBILE_SCREEN\n || contentKey === HeaderContent.SharedMedia\n || contentKey === HeaderContent.MemberList\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 {!IS_MOBILE_SCREEN && (\n \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 'searchMessagesByDate',\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) {\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);\n }, [groupChatMembers, 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} & Pick;\n\ntype DispatchProps = Pick;\n\nconst PrivateChatInfo: FC = ({\n user,\n chat,\n isSavedMessages,\n lastSyncTime,\n animationLevel,\n loadFullUser,\n openMediaViewer,\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(\n '.profile-slide-container > .active, .profile-slide-container > .to',\n );\n if (!element) {\n return undefined;\n }\n\n return captureEvents(element, {\n excludedClosestSelector: '.navigation',\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)}\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 } = 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,\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 { selectChat, selectUser } from '../../modules/selectors';\nimport {\n getChatDescription, getChatLink, getHasAdminRight, isChatChannel, isChatPrivate, isUserRightBanned,\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 SafeLink from '../common/SafeLink';\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} & Pick;\n\ntype DispatchProps = Pick;\n\nconst ChatExtra: FC = ({\n lastSyncTime,\n user,\n chat,\n forceShowSelf,\n canInviteUsers,\n loadFullUser,\n showNotification,\n updateChatMutedState,\n}) => {\n const {\n id: userId,\n fullInfo,\n username,\n phoneNumber,\n isSelf,\n } = user || {};\n const {\n id: chatId,\n isMuted: currentIsMuted,\n username: chatUsername,\n } = 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: !currentIsMuted });\n }, [chatId, currentIsMuted, 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 url = link.indexOf('http') === 0 ? link : `http://${link}`;\n const printedUsername = username || chatUsername;\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 {printedUsername && (\n copy(`@${printedUsername}`, lang('Username'))}\n >\n {renderText(printedUsername)}\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 && !printedUsername && !!link.length && (\n copy(link, lang('SetUrlPlaceholder'))}>\n
\n \n
\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\n const canInviteUsers = chat && (\n (!isChatChannel(chat) && !isUserRightBanned(chat, 'inviteUsers'))\n || getHasAdminRight(chat, 'inviteUsers')\n );\n\n return {\n lastSyncTime, chat, user, canInviteUsers,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadFullUser', 'updateChatMutedState', 'showNotification',\n ]),\n)(ChatExtra));\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 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 isChatAdmin, isChatChannel, isChatGroup, isChatPrivate,\n} from '../../modules/helpers';\nimport {\n selectChatMessages,\n selectChat,\n selectCurrentMediaSearch,\n selectIsRightColumnShown,\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';\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 isChannel?: boolean;\n resolvedUserId?: number;\n chatMessages?: Record;\n foundIds?: number[];\n mediaSearchType?: SharedMediaType;\n hasMembersTab?: boolean;\n areMembersHidden?: boolean;\n members?: ApiChatMember[];\n usersById?: Record;\n isRightColumnShown: boolean;\n isRestricted?: boolean;\n lastSyncTime?: 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 isChannel,\n resolvedUserId,\n chatMessages,\n foundIds,\n mediaSearchType,\n hasMembersTab,\n areMembersHidden,\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}) => {\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\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,\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 // 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 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 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 >\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};\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\n let resolvedUserId;\n if (userId) {\n resolvedUserId = userId;\n } else if (isChatPrivate(chatId)) {\n resolvedUserId = chatId;\n }\n\n return {\n isChannel,\n resolvedUserId,\n chatMessages,\n foundIds,\n mediaSearchType,\n hasMembersTab,\n areMembersHidden,\n ...(hasMembersTab && members && {\n members,\n usersById,\n }),\n isRightColumnShown: selectIsRightColumnShown(global),\n isRestricted: chat && chat.isRestricted,\n lastSyncTime: global.lastSyncTime,\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 ]),\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, memo, useCallback, useEffect, useState,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport { ManagementScreens, ProfileState, RightColumnContent } 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 { HistoryWrapper } from '../../util/history';\n\nimport './RightColumn.scss';\n\ntype StateProps = {\n contentKey?: RightColumnContent;\n chatId?: number;\n threadId?: number;\n currentProfileUserId?: number;\n isChatSelected: 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}) => {\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 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((noPushState = false) => {\n switch (contentKey) {\n case RightColumnContent.ChatInfo:\n if (isScrolledDown) {\n setProfileState(ProfileState.Profile);\n if (!noPushState) break;\n }\n toggleChatInfo({ noPushState }, true);\n break;\n case RightColumnContent.UserInfo:\n if (isScrolledDown) {\n setProfileState(ProfileState.Profile);\n if (!noPushState) break;\n }\n openUserInfo({ id: undefined });\n break;\n case RightColumnContent.Management: {\n switch (managementScreen) {\n case ManagementScreens.Initial:\n toggleManagement({ noPushState }, true);\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 if (!noPushState) {\n HistoryWrapper.back();\n }\n setManagementScreen(ManagementScreens.Initial);\n break;\n case ManagementScreens.GroupUserPermissionsCreate:\n case ManagementScreens.GroupRemovedUsers:\n case ManagementScreens.GroupUserPermissions:\n if (!noPushState) {\n HistoryWrapper.back();\n }\n\n setManagementScreen(ManagementScreens.GroupPermissions);\n setSelectedChatMemberId(undefined);\n setIsPromotedByCurrentUser(undefined);\n break;\n case ManagementScreens.ChatAdminRights:\n case ManagementScreens.GroupRecentActions:\n if (!noPushState) {\n HistoryWrapper.back();\n }\n\n setManagementScreen(ManagementScreens.ChatAdministrators);\n break;\n }\n\n break;\n }\n case RightColumnContent.Search: {\n blurSearchInput();\n closeLocalTextSearch({ noPushState });\n break;\n }\n case RightColumnContent.StickerSearch:\n blurSearchInput();\n setStickerSearchQuery({ query: undefined, noPushState });\n break;\n case RightColumnContent.GifSearch: {\n blurSearchInput();\n setGifSearchQuery({ query: undefined, noPushState });\n break;\n }\n case RightColumnContent.PollResults:\n closePollResults({ noPushState });\n break;\n }\n }, [\n contentKey, isScrolledDown, toggleChatInfo, openUserInfo, closePollResults,\n managementScreen, toggleManagement, closeLocalTextSearch, setStickerSearchQuery, setGifSearchQuery,\n ]);\n\n const handleClose = useCallback(() => {\n close(false);\n }, [close]);\n\n useHistoryBack((event, noAnimation, previousHistoryState) => {\n if (previousHistoryState && previousHistoryState.type === 'right') {\n if (noAnimation) {\n setShouldSkipTransition(true);\n setTimeout(() => setShouldSkipTransition(false), COLUMN_CLOSE_DELAY_MS);\n }\n close(true);\n }\n });\n\n const handleSelectChatMember = useCallback((memberId, isPromoted) => {\n setSelectedChatMemberId(memberId);\n setIsPromotedByCurrentUser(isPromoted);\n }, []);\n\n const handleManagementScreenSelect = useCallback((screen: ManagementScreens) => {\n if (screen !== managementScreen) {\n HistoryWrapper.pushState({ type: 'right', contentKey });\n setManagementScreen(screen);\n }\n }, [contentKey, managementScreen]);\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 // eslint-disable-next-line consistent-return\n function renderContent() {\n if (renderingContentKey === -1) {\n return undefined;\n }\n\n switch (renderingContentKey) {\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 };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'openUserInfo',\n 'toggleChatInfo',\n 'toggleManagement',\n 'closeLocalTextSearch',\n 'setStickerSearchQuery',\n 'setGifSearchQuery',\n 'closePollResults',\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 ErrorsAsync: FC = ({ isOpen }) => {\n const Errors = useModuleLoader(Bundles.Extra, 'Errors', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return Errors ? : undefined;\n};\n\nexport default memo(ErrorsAsync);\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, {\n FC, useEffect, memo, useState,\n} from '../../lib/teact/teact';\nimport { getGlobal, withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport { ApiMessage } from '../../api/types';\n\nimport '../../modules/actions/all';\nimport {\n ANIMATION_END_DELAY, DEBUG, INACTIVE_MARKER, PAGE_TITLE, SLIDE_TRANSITION_DURATION,\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 useShowTransition from '../../hooks/useShowTransition';\nimport useBackgroundMode from '../../hooks/useBackgroundMode';\nimport useHistoryBack from '../../hooks/useHistoryBack';\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 Errors from './Errors.async';\nimport ForwardPicker from './ForwardPicker.async';\nimport SafeLinkModal from './SafeLinkModal.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 hasErrors: boolean;\n audioMessage?: ApiMessage;\n safeLinkModalUrl?: string;\n};\n\ntype DispatchProps = Pick;\n\nconst ANIMATION_DURATION = 350;\nconst NOTIFICATION_INTERVAL = 1000;\n\nlet rightColumnAnimationTimeout: number | undefined;\nlet notificationInterval: number | undefined;\n\nlet DEBUG_isLogged = false;\n\nconst Main: FC = ({\n lastSyncTime,\n loadAnimatedEmojis,\n openChat,\n isLeftColumnShown,\n isRightColumnShown,\n isMediaViewerOpen,\n isForwardModalOpen,\n animationLevel,\n hasNotifications,\n hasErrors,\n audioMessage,\n safeLinkModalUrl,\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 loadAnimatedEmojis();\n }\n }, [lastSyncTime, loadAnimatedEmojis]);\n\n const [isHistoryAnimationDisabled, setIsHistoryAnimationDisabled] = useState(false);\n\n const {\n transitionClassNames: middleColumnTransitionClassNames,\n } = useShowTransition(!isLeftColumnShown, undefined, true, undefined, isHistoryAnimationDisabled);\n\n const {\n transitionClassNames: rightColumnTransitionClassNames,\n } = useShowTransition(isRightColumnShown, undefined, true, undefined, isHistoryAnimationDisabled);\n\n\n const className = buildClassName(\n middleColumnTransitionClassNames.replace(/([\\w-]+)/g, 'middle-column-$1'),\n rightColumnTransitionClassNames.replace(/([\\w-]+)/g, 'right-column-$1'),\n isHistoryAnimationDisabled && 'history-animation-disabled',\n );\n\n useEffect(() => {\n // For animating Symbol Menu on mobile\n document.body.classList.toggle('is-middle-column-open', className.includes('middle-column-open'));\n // For animating components in portals (i.e. Notification)\n document.body.classList.toggle('is-right-column-shown', className.includes('right-column-open'));\n }, [className]);\n\n // Add `body` classes when toggling right column\n useEffect(() => {\n if (animationLevel > 0) {\n document.body.classList.add('animating-right-column');\n dispatchHeavyAnimationEvent(ANIMATION_DURATION + ANIMATION_END_DELAY);\n\n if (rightColumnAnimationTimeout) {\n clearTimeout(rightColumnAnimationTimeout);\n rightColumnAnimationTimeout = undefined;\n }\n\n rightColumnAnimationTimeout = window.setTimeout(() => {\n document.body.classList.remove('animating-right-column');\n rightColumnAnimationTimeout = undefined;\n }, ANIMATION_DURATION + ANIMATION_END_DELAY);\n }\n }, [animationLevel, isRightColumnShown]);\n\n useBackgroundMode(() => {\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 document.title = `${newUnread} notification${newUnread > 1 ? 's' : ''}`;\n updateIcon(true);\n }\n } else {\n document.title = PAGE_TITLE;\n updateIcon(false);\n }\n\n index++;\n }, NOTIFICATION_INTERVAL);\n }, () => {\n clearInterval(notificationInterval);\n notificationInterval = undefined;\n\n if (!document.title.includes(INACTIVE_MARKER)) {\n document.title = PAGE_TITLE;\n }\n\n updateIcon(false);\n });\n\n function stopEvent(e: React.MouseEvent) {\n e.preventDefault();\n e.stopPropagation();\n }\n\n useHistoryBack((event, noAnimation) => {\n const { state } = event;\n\n if (state.type !== 'right') {\n if (state.type === 'chat') {\n const { chatId: id, threadId, messageListType: type } = state;\n\n openChat({\n id, threadId, type, noPushState: true,\n }, true);\n } else {\n openChat({\n id: undefined,\n noPushState: true,\n }, true);\n }\n }\n\n // Must disable pane closing animation for back/forward gestures on iOS\n if (noAnimation) {\n setIsHistoryAnimationDisabled(true);\n\n setTimeout(() => {\n setIsHistoryAnimationDisabled(false);\n }, SLIDE_TRANSITION_DURATION);\n }\n });\n\n return (\n
\n \n \n \n \n \n \n \n {audioMessage && }\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\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 hasErrors: Boolean(global.errors.length),\n audioMessage,\n safeLinkModalUrl: global.safeLinkModalUrl,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['loadAnimatedEmojis', 'openChat']),\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.b0768c144c69fa913166.css b/dist/4.b0768c144c69fa913166.css deleted file mode 100644 index 3aa81c226..000000000 --- a/dist/4.b0768c144c69fa913166.css +++ /dev/null @@ -1 +0,0 @@ -.Switcher{display:inline-flex;align-items:center;position:relative;margin:0}.Switcher.disabled{opacity:.5}.Switcher.disabled,.Switcher.inactive{pointer-events:none}.Switcher.no-animation .widget,.Switcher.no-animation .widget:after,body.animation-level-0 .Switcher .widget,body.animation-level-0 .Switcher .widget:after{transition:none!important}.Switcher.no-animation .widget:active:after,body.animation-level-0 .Switcher .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:.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:.2s ease-out;border:.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}#LeftMainHeader{position:relative}#LeftMainHeader .animated-menu-icon{position:absolute}#LeftMainHeader .animated-menu-icon,#LeftMainHeader .animated-menu-icon:after,#LeftMainHeader .animated-menu-icon:before{width:1.125rem;height:.125rem;border-radius:.125rem;background-color:var(--color-text-secondary);transition:transform .25s;transform:rotate(0)}#LeftMainHeader .animated-menu-icon:after,#LeftMainHeader .animated-menu-icon:before{position:absolute;left:0;content:""}#LeftMainHeader .animated-menu-icon:before{top:-.3125rem}#LeftMainHeader .animated-menu-icon:after{top:.3125rem}#LeftMainHeader .animated-menu-icon.state-back{transform:rotate(180deg)}#LeftMainHeader .animated-menu-icon.state-back:before{transform:rotate(45deg) scaleX(.75) translate(.375rem,-.1875rem)}#LeftMainHeader .animated-menu-icon.state-back:after{transform:rotate(-45deg) scaleX(.75) translate(.375rem,.1875rem)}#LeftMainHeader .archived-badge{min-width:1.5rem;height:1.5rem;margin-left:auto;background:var(--color-gray);border-radius:.75rem;padding:0 .45rem;color:#fff;font-size:.875rem;line-height:1.5rem;font-weight:500;text-align:center;flex-shrink:0}#LeftMainHeader .Menu .bubble{min-width:17rem}.Transition>div:not(.active) #LeftMainHeader .Menu .bubble,body.animating-right-column #LeftMainHeader .Menu .bubble{transition:none!important}#ConnectionState{flex:0 0 auto;display:flex;align-items:center;margin:0 .5rem .5rem;padding:.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-left:1.9rem;white-space:nowrap}@media (max-width:950px){#ConnectionState>.state-text{margin-left:1.2rem}}.NewChatButton{position:absolute;right:1rem;bottom:1rem;transform:translateY(5rem);transition:transform .25s cubic-bezier(.34,1.56,.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:translateZ(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-close,.NewChatButton>.Button .icon-new-chat-filled{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 ease-out forwards}.NewChatButton>.Button.active .icon-close{animation:grow-icon .4s ease-out}.NewChatButton>.Button.active .icon-new-chat-filled{animation:hide-icon .4s ease-out forwards}#LeftColumn-main{height:100%;position:relative;display:flex;flex-direction:column;overflow:hidden;z-index:1}#LeftColumn-main>.Transition{flex:1;overflow:hidden}#LeftColumn-main .ChatFolders{height:100%;display:flex;flex-direction:column;overflow:hidden}#LeftColumn-main .ChatFolders .tabs-placeholder{height:2.625rem;transition:height .15s 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:.625rem;padding-right:.625rem}#LeftColumn-main .ChatFolders .Tab>span{padding-left:.5rem;padding-right:.5rem}#LeftColumn-main .ChatFolders>.Transition{flex:1;overflow:hidden}#LeftColumn-main .chat-list,#LeftColumn-main .LeftSearch,#LeftColumn-main .RecentContacts,#LeftColumn-main .search-content{height:100%;overflow-y:auto}#LeftColumn{overflow:hidden}#NewChat{height:100%}.left-header{height:var(--header-height);padding:.375rem 1.25rem .5rem .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:.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:.5rem}}.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-pause,.AudioPlayer .toggle-play .icon-play{opacity:1;transform:scale(1);transition:opacity .4s,transform .6s cubic-bezier(.34,1.56,.64,1)}.AudioPlayer .toggle-play.loading .icon-pause,.AudioPlayer .toggle-play.loading .icon-play,.AudioPlayer .toggle-play.pause .icon-play,.AudioPlayer .toggle-play.play .icon-pause{opacity:0;transform:scale(.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:.875rem!important;line-height:1rem;height:1rem;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.AudioPlayer-content .subtitle{font-size:.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}.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:.5rem;position:relative;transform:translateZ(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:-.5rem;margin-right:.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 .375rem;border-radius:.625rem;font-size:.75rem;line-height:1.25rem;font-weight:500;text-align:center;position:absolute;top:-.25rem;right:-.5rem;background:var(--color-gray);color:#fff;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 .AudioPlayer,body.animation-level-0 .MiddleHeader .header-tools .HeaderActions,body.animation-level-0 .MiddleHeader .header-tools .HeaderPinnedMessage-wrapper{transition:none!important}@media (min-width:1276px) and (max-width:1439px){.MiddleHeader .header-tools .HeaderActions{transform:translateZ(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:translateZ(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 .AudioPlayer,.MiddleHeader:not(.tools-stacked) .header-tools .HeaderPinnedMessage-wrapper{opacity:1}#Main.right-column-open .MiddleHeader:not(.tools-stacked) .header-tools .AudioPlayer,#Main.right-column-open .MiddleHeader:not(.tools-stacked) .header-tools .HeaderPinnedMessage-wrapper{opacity:0}}.MiddleHeader.tools-stacked .header-tools .AudioPlayer,.MiddleHeader.tools-stacked .header-tools .HeaderPinnedMessage-wrapper{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:.375rem .5rem .375rem .75rem;background:var(--color-background)}.MiddleHeader.tools-stacked .header-tools .AudioPlayer:before,.MiddleHeader.tools-stacked .header-tools .HeaderPinnedMessage-wrapper:before{content:"";display:block;position:absolute;top:-.1875rem;left:0;right:0;height:.125rem;box-shadow:0 .125rem .125rem var(--color-light-shadow)}.MiddleHeader.tools-stacked .header-tools .AudioPlayer .HeaderPinnedMessage,.MiddleHeader.tools-stacked .header-tools .HeaderPinnedMessage-wrapper .HeaderPinnedMessage{max-width:unset;margin-top:-.1875rem}.MiddleHeader.tools-stacked .header-tools .AudioPlayer{height:3.25rem;flex-direction:row;padding:.375rem .5rem}.MiddleHeader.tools-stacked .header-tools .AudioPlayer-content{padding: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:.125rem;bottom:.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 .AudioPlayer,#Main.right-column-open .MiddleHeader.tools-stacked .header-tools .HeaderPinnedMessage-wrapper{padding-right:calc(.5rem + var(--right-column-width))}}.MiddleHeader.tools-stacked.animated .header-tools .AudioPlayer,.MiddleHeader.tools-stacked.animated .header-tools .HeaderPinnedMessage-wrapper{animation:fade-in var(--layer-transition) forwards}body.animation-level-0 .MiddleHeader.tools-stacked.animated .header-tools .AudioPlayer,body.animation-level-0 .MiddleHeader.tools-stacked.animated .header-tools .HeaderPinnedMessage-wrapper{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}@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:.25rem;margin-top:.05rem}.MiddleHeader .ChatInfo .status,.MiddleHeader .ChatInfo .user-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:.875rem;line-height:1.125rem;margin:0;color:var(--color-text-secondary);overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.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:-.25rem;margin-bottom:-.25rem;padding:.25rem .25rem .25rem .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:.125rem 0;width:.125rem;min-width:.125rem;overflow:hidden}.MiddleHeader .HeaderPinnedMessage .pinned-message-border .pinned-message-border-wrapper-1{height:2.25rem;width:.125rem;border-radius:.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:.125rem;background:var(--color-primary);border-radius:.0625rem;will-change:transform;transition:transform .25s ease-in-out}.MiddleHeader .HeaderPinnedMessage .message-text{overflow:hidden;margin-left:.4rem;margin-top:.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:.875rem;line-height:1rem;height:1rem;color:var(--color-primary);margin-bottom:.125rem;white-space:pre}.MiddleHeader .HeaderPinnedMessage .message-text p{font-size:.875rem;line-height:1.125rem;height:1.125rem;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin:0}.MiddleHeader .HeaderPinnedMessage .emoji-small{width:1rem;height:1rem}.MiddleHeader .HeaderPinnedMessage>img{width:2.25rem;height:2.25rem;object-fit:cover;border-radius:.25rem;margin-left:.4rem;margin-top:.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 .HeaderActions .Button,.MiddleHeader .HeaderPinnedMessage-wrapper .Button{margin-left:.25rem}.MiddleHeader .HeaderActions .Button.tiny,.MiddleHeader .HeaderPinnedMessage-wrapper .Button.tiny{margin-right:.625rem}@media (max-width:600px){.MiddleHeader .AudioPlayer,.MiddleHeader .HeaderPinnedMessage-wrapper{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:.375rem .5rem .375rem .75rem;background:var(--color-background)}.MiddleHeader .AudioPlayer:before,.MiddleHeader .HeaderPinnedMessage-wrapper:before{content:"";display:block;position:absolute;top:-.1875rem;left:0;right:0;height:.125rem;box-shadow:0 .125rem .125rem var(--color-light-shadow)}.MiddleHeader .AudioPlayer .HeaderPinnedMessage,.MiddleHeader .HeaderPinnedMessage-wrapper .HeaderPinnedMessage{max-width:unset;margin-top:-.1875rem}.MiddleHeader .AudioPlayer{height:3.25rem;flex-direction:row;padding:.375rem .5rem}.MiddleHeader .AudioPlayer-content{padding: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:.125rem;bottom:.125rem}.MiddleHeader .HeaderPinnedMessage .message-text{max-width:none}.MiddleHeader .AudioPlayer,.MiddleHeader .HeaderPinnedMessage-wrapper{transform:translateZ(0)}}@media (min-width:925px) and (max-width:1149.9px){.MiddleHeader .AudioPlayer,.MiddleHeader .HeaderPinnedMessage-wrapper{position:absolute}}@keyframes fade-in{0%{opacity:0}to{opacity:1}}.EmbeddedMessage{display:flex;align-items:center;font-size:.875rem;line-height:1.125rem;margin:0 -.25rem .0625rem;padding:.1875rem .25rem .1875rem .4375rem;border-radius:var(--border-radius-messages-small);position:relative;overflow:hidden;cursor:pointer}body.animation-level-1 .EmbeddedMessage .ripple-container{display:none}.custom-shape .EmbeddedMessage{max-width:15rem;padding:.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-left:.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-text{overflow:hidden;margin-left:.5rem}.EmbeddedMessage .message-text .message-title{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-bottom:.125rem}.EmbeddedMessage .message-text p{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;height:1.125rem;margin-bottom:0}.EmbeddedMessage .message-text p:after{content:none;display:none}.EmbeddedMessage .message-text .emoji{width:1.125rem!important;height:1.125rem!important;vertical-align:-4px!important}.EmbeddedMessage .embedded-action-message{color:var(--accent-color);opacity:.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-left:.5625rem;margin:0 0 -.125rem -.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-left:.375rem}.EmbeddedMessage.inside-input .message-title{font-weight:500;color:var(--accent-color)}.MessageMeta{position:absolute;height:1.25rem;bottom:0;right:0;display:flex;align-items:center;background:hsla(0,0%,60%,.6);border-radius:.625rem;padding:0 .25rem;color:#fff;cursor:pointer;max-width:100%}.MessageMeta .message-signature,.MessageMeta .message-time,.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:.375rem}.MessageMeta .icon-channelviews{margin-left:.125rem;margin-right:.375rem;font-size:1.125rem;position:relative;top:-.0625rem}.has-solid-background .MessageMeta{color:rgba(var(--color-text-meta-rgb),.75);background:none}.media:not(.text) .MessageMeta,.Message .custom-shape .MessageMeta{background:rgba(0,0,0,.2);--color-accent-own:#fff;--color-accent:#fff;color:#fff!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:.935rem;right:.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:.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}.Sticker:not(.inactive){cursor:pointer}.Sticker.inactive{pointer-events:none}.Contact{display:flex;align-items:center;padding:.25rem}.Contact.interactive{cursor:pointer}.Contact .Avatar{margin-right:.8rem}.Contact .contact-info{padding:.5rem .5rem .5rem 0;white-space:nowrap;overflow:hidden}.Contact .contact-info .contact-name{font-size:1rem;line-height:1rem;margin-bottom:.25rem;font-weight:500}.Contact .contact-info .contact-phone{line-height:1rem;color:var(--secondary-color)}.PollOption{display:flex;flex-flow:row nowrap;margin-bottom:.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-right:.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:.25rem;min-width:.5rem;border-radius:.125rem;margin-top:.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}to{opacity:1}}.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:.125rem 0;word-break:break-word}.Poll .poll-type,.Poll .poll-voters-count{color:var(--secondary-color);font-size:.875rem}.Poll .poll-type{margin-bottom:.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:.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:.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:.4375rem;background-color:var(--accent-color)}.Poll .Checkbox input:checked~.Checkbox-main:before,.Poll .Checkbox input:checked~.Radio-main:before,.Poll .Radio input:checked~.Checkbox-main:before,.Poll .Radio input:checked~.Radio-main:before{border-color:var(--accent-color)}.Poll .Checkbox .Spinner,.Poll .Radio .Spinner{left:.125rem}.Poll .Checkbox .Checkbox-main:after{left:.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:initial}.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-answers,.Poll .poll-results{padding-top:.25rem;padding-bottom:.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}.WebPage{margin-top:.25rem;margin-bottom:.125rem;padding-left:.625rem;font-size:.875rem;line-height:1.125rem;max-width:29rem;position:relative}.WebPage:before{content:"";display:block;position:absolute;top:0;bottom:0;left:0;width:2px;background:var(--accent-color);border-radius:2px}.WebPage-text{display:flex;flex-direction:column;align-items:flex-start}.WebPage .media-inner{margin:0 0 .375rem!important}.WebPage .media-inner,.WebPage .media-inner.small-image img,.WebPage .media-inner 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-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:not(.with-square-photo) .site-description:last-child:after,.WebPage:not(.with-square-photo) .site-name:last-child:after,.WebPage:not(.with-square-photo) .site-title:last-child:after{content:"";display:inline-block;width:var(--meta-safe-area-size);height:.5rem}.WebPage .site-description,.WebPage .site-name,.WebPage .site-title{word-break:break-word}.WebPage .site-name{color:var(--accent-color)}.WebPage .site-name,.WebPage .site-title{font-weight:500;margin-bottom:.125rem}.WebPage .site-description{line-height:1rem;margin-bottom:0}.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,.6);border-radius:var(--border-radius-messages-small);color:var(--color-text);font-weight:500}.Album{position:relative;overflow:hidden}.message-content.media.text .Album{margin:-.3125rem -.5rem .3125rem}.forwarded-message .Album{margin-bottom:.125rem}.message-content.media.text .forwarded-message .Album{margin: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}.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:#fff;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}.InlineButtons{display:flex;flex-direction:column}.InlineButtons .row{display:flex;flex-direction:row}.InlineButtons .Button{flex:1;width:auto;margin:.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 .2s}.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:.75rem;position:absolute;right:.125rem;top:.125rem;display:block;transform:rotate(-45deg)}.InlineButtons .row:first-of-type .Button{margin-top:.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)}.CommentButton{--background-color:var(--color-background);--hover-color:var(--color-chat-hover);display:flex;width:100%;align-items:center;padding:.5625rem .25rem .5625rem .625rem;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:0 100%;background-image:url("data:image/svg+xml;charset=utf-8,%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(.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:.375rem .3125rem .25rem;align-items:flex-start;color:#fff;background-color:rgba(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,.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 .icon-comments,.custom-shape .CommentButton .icon-next,.custom-shape .CommentButton .label,.custom-shape .CommentButton .recent-repliers{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}.audio .CommentButton,.is-forwarded .CommentButton,.poll .CommentButton,.text .CommentButton,.voice .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.has-solid-background.is-forwarded .CommentButton,.message-content.has-solid-background.text .CommentButton,.message-content.poll .CommentButton,.message-content.voice .CommentButton{margin-right:0;width:calc(100% + 1rem)}.CommentButton .icon-comments-sticker{display:none}.CommentButton .icon-comments{font-size:1.5625rem;line-height:2rem;margin-right:.875rem}.CommentButton .icon-next{margin-left:auto;font-size:1.5rem}.CommentButton .recent-repliers{display:inline-flex;align-items:center;margin-right:.5rem;margin-left:-.125rem}.CommentButton .recent-repliers .Avatar{transition:border .15s;border:2px solid var(--color-background);margin-right:0;z-index:3}.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-left:-.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-left:.75rem}.CommentButton.disabled{cursor:default;pointer-events:none}.Message{display:flex;align-items:flex-end;margin-bottom:.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-size:calc(var(--meta-safe-area-base) + var(--meta-safe-author-width));--deleting-translate-x:-50%;--select-message-scale:0.9;--select-background-color:#fff}.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:.625rem}.Message.last-in-list{margin-bottom:.4375rem}.Message.is-in-selection-mode .Album{border:1px solid var(--select-background-color);background-color:var(--select-background-color)}.Message.has-inline-buttons .message-content{border-bottom-right-radius:var(--border-radius-messages-small)}.Message:not(.own){padding-left:2.5rem}.Message:not(.own).is-thread-top,.no-avatars .Message:not(.own){padding-left:0}@media (max-width:600px){.Message:not(.own){padding-left:2.875rem}.Message:not(.own).is-thread-top,.no-avatars .Message:not(.own){padding-left:.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)}@media (max-width:600px){.Message.own{padding-right:.25rem}}.Message.is-deleting>.Avatar,.Message.is-deleting>.message-content-wrapper{transition:opacity .2s ease,transform .2s ease-in;opacity:0;transform:scale(.3) translateX(var(--deleting-translate-x));transform-origin:bottom}.Message.has-views{--meta-safe-area-size:calc(var(--meta-safe-area-base) + var(--meta-safe-author-width) + 4rem)}.Message.was-edited{--meta-safe-area-size:calc(var(--meta-safe-area-base) + var(--meta-safe-author-width) + 2.5rem)}.Message.was-edited.has-views{--meta-safe-area-size:calc(var(--meta-safe-area-base) + var(--meta-safe-author-width) + 7.5rem)}.select-mode-active .Message{cursor:pointer;-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:-.25rem;bottom:-.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 .File.file-is-selected .message-select-control,.Message.is-selected .message-select-control.group-select.is-selected{background:var(--color-green)}.Message.has-menu-open.is-in-document-group .File .file-icon,.Message.is-in-document-group .File.file-is-selected .file-icon{--background-color:var(--color-background-selected)}.Message.own.has-menu-open.is-in-document-group .File .file-icon,.Message.own.is-in-document-group .File.file-is-selected .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+PHBhdGggZD0iTTguMjE4IDcuNWw1LjYzMy01LjYzM2EuNTA4LjUwOCAwIDEwLS43MTgtLjcxOEw3LjUgNi43ODIgMS44NjcgMS4xNDlhLjUwOC41MDggMCAxMC0uNzE4LjcxOEw2Ljc4MiA3LjVsLTUuNjMzIDUuNjMzYS41MDguNTA4IDAgMTAuNzE4LjcxOEw3LjUgOC4yMThsNS42MzMgNS42MzNhLjUwNi41MDYgMCAwMC43MTggMCAuNTA4LjUwOCAwIDAwMC0uNzE4TDguMjE4IDcuNXoiIGZpbGw9IiNGRkYiIHN0cm9rZT0iI0E0NUQzNyIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPjwvc3ZnPg==)}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{top:.438rem;right:.438rem;left:unset}.Message .album-item-select-wrapper .media-inner{border:0 solid var(--select-background-color);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-forwarding .message-select-control,.Message.is-selected .message-select-control{background:var(--color-green)}.Message.is-forwarding .Menu .bubble,.Message.is-selected .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:#fff}.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:.688rem;background:#fff;border:.125rem solid rgba(0,0,0,.2);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:.25rem;width:1.5rem;height:1.5rem;border:2px solid #fff;border-radius:50%;z-index:var(--z-message-select-control);display:flex;align-items:center;justify-content:center;color:#fff;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:hsla(0,0%,100%,.5)}.Message .Avatar{margin-right:.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}.Album,.media-inner,.message-content,.message-content.custom-shape .media-inner img,.message-content.media .media-inner img,.message-content.media .media-inner video{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),.Message:not(.own):not(.first-in-group):not(.last-in-group){--border-bottom-left-radius:var(--border-radius-messages-small)}.Message:not(.own).last-in-group:not(.first-in-group),.Message:not(.own):not(.first-in-group):not(.last-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),.Message.own:not(.first-in-group):not(.last-in-group){--border-bottom-right-radius:var(--border-radius-messages-small)}.Message.own.last-in-group:not(.first-in-group),.Message.own:not(.first-in-group):not(.last-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) .Album,.Message .message-content.has-replies:not(.custom-shape) .media-inner,.Message .message-content.text .Album,.Message .message-content.text .media-inner{--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).force-sender-name .Album,.Message .message-content:not(.custom-shape).is-reply .Album,.Message .message-content:not(.custom-shape).is-reply .media-inner,.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:.25rem}.Message .message-action-button{position:absolute;bottom:0;color:#fff;background-color:rgba(0,0,0,.2);opacity:0;transition:opacity .2s ease}@media (pointer:coarse){.Message .message-action-button{opacity:1!important}}.Message .message-action-button:active,.Message .message-action-button:focus,.Message .message-action-button:hover{background-color:rgba(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:69vw}}.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.document>.MessageMeta,.message-content .text-content>.MessageMeta{position:relative;top:.4375rem;bottom:auto!important;float:right;line-height:1;margin-left:.4375rem;margin-right:-.5rem}.message-content.document:dir(rtl)>.MessageMeta,.message-content .text-content:dir(rtl)>.MessageMeta{float:left;margin-left:-.25rem;margin-right:.4375rem}.message-content.document:not(.text)>.MessageMeta{position:absolute;top:auto;bottom:0!important;right:.5rem}.message-content.document:not(.text):dir(rtl)>.MessageMeta{right:auto;left:.5rem}.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)}.message-content:not(.custom-shape)>.content-inner{min-width:0}.message-content .matching-text-highlight{background:#cae3f7;border-radius:.25rem;padding:0 .125rem}.message-content .message-title{white-space:nowrap;font-size:.875rem;font-weight:500;line-height:1.25rem;color:var(--accent-color);unicode-bidi:plaintext;display:flex}.message-content .message-title,.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:.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)}.message-content .message-title+.File{margin-top:.25rem}.message-content .message-title .via{padding:0 .2rem;font-weight:400}.message-content .message-title .admin-title{flex:1;margin-inline-start:1rem;text-align:end;font-weight:400;font-size:.75rem;margin-top:-.1rem;color:rgba(var(--color-text-meta-rgb),.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)}.is-album .message-content,.message-content.has-solid-background{background:var(--background-color)}.message-content.has-solid-background{padding:.3125rem .5rem .375rem}.message-content.has-solid-background .forwarded-message>.text-content:not(.with-meta):last-child:after{content:"";display:inline-block;width:var(--meta-safe-area-size);height:1rem}.message-content:not(.has-appendix) .svg-appendix{display:none}.message-content .svg-appendix{position:absolute;bottom:-.1875rem;width:.5625rem;height:1.25rem}.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 .5s 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:.313rem}.message-content.audio .Embedded,.message-content.audio .message-title,.message-content.voice .Embedded,.message-content.voice .message-title{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;margin-bottom:-.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));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.media .media-inner{display:flex;justify-content:center;align-items:center}.message-content.media .media-inner.interactive{cursor:pointer}.message-content.media .media-inner.interactive.dark video{background-color:#232323}.message-content.media.round.is-reply{width:auto!important}.message-content.media.force-sender-name .Album,.message-content.media.force-sender-name .media-inner,.message-content.media.is-reply .Album,.message-content.media.is-reply .media-inner,.message-content.media.is-via-bot .media-inner,.message-content.media.text .media-inner{margin-left:-.5rem;margin-right:-.5rem}.message-content.media.text .media-inner{margin-top:-.3125rem}.message-content.media.force-sender-name .Album,.message-content.media.is-reply .Album,.message-content.media.is-reply .media-inner,.message-content.media .message-title~.media-inner{margin-top:.375rem;margin-bottom:-.375rem}.message-content.media.text .Album,.message-content.media.text .media-inner{margin-bottom:.375rem}.message-content.media .media-loading{display:flex;align-items:center;justify-content:center}.message-content.media .media-loading:not(.open){opacity:.5;transform:scale(0);transition:opacity .3s ease,transform .3s ease}.message-content.media .icon-download,.message-content.media .icon-large-play{position:absolute;display:flex;align-items:center;justify-content:center;color:#fff;opacity:.7;transition:opacity .15s}.message-content.media .icon-download:hover,.message-content.media .icon-large-play:hover{opacity:1}.message-content.media .icon-download:before,.message-content.media .icon-large-play:before{display:flex;align-items:center;justify-content:center;width:3.375rem;height:3.375rem;border-radius:50%;background:rgba(0,0,0,.25)}.message-content.media .icon-download{font-size:1.5rem}.message-content.media .icon-large-play{font-size:2.5rem}.message-content.media .message-media-duration,.message-content.media .message-upload-progress{background:rgba(0,0,0,.25);color:#fff;font-size:.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{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}.message-content.custom-shape .reply-message>p{margin-bottom:0}.message-content.custom-shape .reply-message .EmbeddedMessage{margin-left:.5rem;border-radius:var(--border-radius-messages)}@media (max-width:600px){.message-content.custom-shape .reply-message .EmbeddedMessage{max-width:calc(90vw - 13rem)}}.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:.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:not(.custom-shape) .forwarded-message{position:relative;margin-top:.25rem;padding-left:.625rem}.message-content:not(.custom-shape) .forwarded-message:before{content:"";display:block;position:absolute;top:0;bottom:0;left:.05rem;width:2px;background:var(--accent-color);border-radius:2px}.forwarded-message>.media-inner{margin:0 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:normal}.text-entity-link:active,.text-entity-link:hover,.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}.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(0deg,transparent 0,#000 .5rem);mask-image:linear-gradient(0deg,transparent 0,#000 .5rem)}@media (pointer:coarse){.MessageList{-webkit-user-select:none;-webkit-touch-callout:none;user-select:none;touch-callout:none}}.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 .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.6875rem}.MessageList.select-mode-active .last-in-list.ActionMessage,.MessageList.type-pinned .last-in-list.ActionMessage{padding-bottom:.0625rem}@media (max-width:600px){.MessageList.select-mode-active .last-in-list,.MessageList.type-pinned .last-in-list{margin-bottom:4.3125rem}}.MessageList .ActionMessage,.MessageList .Message{position:relative;opacity:1;transform:scale(1);transition:opacity .2s ease,transform .2s ease}.MessageList .ActionMessage:not(.open),.MessageList .Message:not(.open){transform:scale(.8);opacity:0}.MessageList .ActionMessage.open.shown,.MessageList .Message.open.shown{transform:none}.MessageList .ActionMessage:before,.MessageList .Message:before{content:"";position:absolute;top:-.3125rem;bottom:-.3125rem;left:-50vw;right:-50vw;background:#000;z-index:-1;opacity:0;transition:opacity var(--select-transition)}body.animation-level-0 .MessageList .ActionMessage:before,body.animation-level-0 .MessageList .Message:before{transition:none!important}.MessageList .ActionMessage:not(.last-in-group):before,.MessageList .Message:not(.last-in-group):before{bottom:-.1875rem}.MessageList .ActionMessage:not(.first-in-group):before,.MessageList .Message:not(.first-in-group):before{top:-.1875rem}.MessageList .ActionMessage.focused:before,.MessageList .Message.focused:before{transition:none!important}.MessageList .ActionMessage.focused:before,.MessageList .ActionMessage.has-menu-open:before,.MessageList .ActionMessage.is-forwarding:before,.MessageList .ActionMessage.is-selected:before,.MessageList .Message.focused:before,.MessageList .Message.has-menu-open:before,.MessageList .Message.is-forwarding:before,.MessageList .Message.is-selected:before{opacity:.1}.MessageList>.empty{width:100%;height:100%;display:flex;align-items:center;justify-content:center}.MessageList .ActionMessage,.MessageList .empty,.MessageList .local-action-message,.MessageList .sticky-date{text-align:center}.MessageList .ActionMessage>span,.MessageList .empty>span,.MessageList .local-action-message>span,.MessageList .sticky-date>span{display:inline-block;background:var(--pattern-color);color:#fff;font-size:.9375rem;font-weight:500;line-height:1.5rem;padding:0 .5rem;border-radius:.75rem;word-break:break-word}.MessageList .ActionMessage.rich>span,.MessageList .empty.rich>span,.MessageList .local-action-message.rich>span,.MessageList .sticky-date.rich>span{max-width:80%;text-align:left}.MessageList .ActionMessage.rich a,.MessageList .ActionMessage.rich a:visited,.MessageList .empty.rich a,.MessageList .empty.rich a:visited,.MessageList .local-action-message.rich a,.MessageList .local-action-message.rich a:visited,.MessageList .sticky-date.rich a,.MessageList .sticky-date.rich a:visited{color:var(--color-links-darker)!important}.MessageList .ActionMessage.rich a:active,.MessageList .ActionMessage.rich a:hover,.MessageList .empty.rich a:active,.MessageList .empty.rich a:hover,.MessageList .local-action-message.rich a:active,.MessageList .local-action-message.rich a:hover,.MessageList .sticky-date.rich a:active,.MessageList .sticky-date.rich a:hover{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.animation-level-0 .MessageList .sticky-date{transition:none}.MessageList.scrolled .sticky-date{position:sticky;top:.625rem}.has-header-tools .MessageList .sticky-date{top:3.75rem}.MessageList .ActionMessage,.MessageList .local-action-message{margin-top:.5rem;margin-bottom:.5rem}.MessageList .ActionMessage .action-link{cursor:pointer}.MessageList .ActionMessage .action-link:hover{text-decoration:underline}.MessageList .sticky-date+.ActionMessage{margin-top:-.5rem}@media (min-width:1276px){.MessageList{width:100%;transform:translateZ(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)}#Main.right-column-open .MessageList:not(.select-mode-active),body.animating-right-column .MessageList:not(.select-mode-active),body:not(.animating-right-column) #Main.right-column-open .MessageList.select-mode-active{width:calc(100% - var(--right-column-width))}#Main.right-column-open .MessageList:not(.select-mode-active) .messages-container,body.animating-right-column .MessageList:not(.select-mode-active) .messages-container,body:not(.animating-right-column) #Main.right-column-open .MessageList.select-mode-active .messages-container{width:100%}}@media (max-width:600px){.MessageList{transition:transform var(--layer-transition)}body.enable-symbol-menu-transforms .MessageList{transform:translateZ(0)}body.is-symbol-menu-open .MessageList{transform:translate3d(0,calc(-1*(var(--symbol-menu-height) + var(--symbol-menu-footer-height))),0)}}.animating>div>.MessageList,.MessageList.has-focusing,.MessageList.select-mode-active,body.has-context-menu .MessageList{padding-right:0}.animating>div>.MessageList::-webkit-scrollbar,.MessageList.has-focusing::-webkit-scrollbar,.MessageList.select-mode-active::-webkit-scrollbar,body.has-context-menu .MessageList::-webkit-scrollbar{width:0}@supports (scrollbar-width:none){.animating>div>.MessageList,.MessageList.has-focusing,.MessageList.select-mode-active,body.has-context-menu .MessageList{padding-right:.6875rem;scrollbar-width:none}}.is-safari.has-context-menu .messages-layout .MessageList,.is-safari .MessageList.has-focusing,.is-safari .MessageList.select-mode-active{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 .25s cubic-bezier(.34,1.56,.64,1),opacity .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:.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(2.5rem)}.ScrollDownButton .unread-count{min-width:1.5rem;height:1.5rem;padding:0 .45rem;border-radius:.75rem;font-size:.875rem;line-height:1.5rem;font-weight:500;text-align:center;position:absolute;top:-.3rem;right:-.3rem;background:var(--color-green);color:#fff;pointer-events:none}@media (max-width:600px){.ScrollDownButton .unread-count{top:-.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))}}.ComposerEmbeddedMessage{height:2.625rem;transition:height .15s ease-out,opacity .15s ease-out}.ComposerEmbeddedMessage:not(.open){height:0!important}.ComposerEmbeddedMessage body.animation-level-0{transition:none!important}.ComposerEmbeddedMessage>div{display:flex;align-items:center;padding-right:.625rem;padding-top:.45rem}.ComposerEmbeddedMessage>div>.Button{flex-shrink:0;background:none!important;width:2.125rem;height:2.125rem;margin:0 .625rem;padding:0;align-self:center}.WebPagePreview{height:2.625rem;transition:height .15s ease-out,opacity .15s ease-out;--accent-color:var(--color-primary)}.WebPagePreview:not(.open){height:0!important}.WebPagePreview>div{display:flex;align-items:center;padding-right:.625rem;padding-top:.45rem}.ComposerEmbeddedMessage+.WebPagePreview{margin-top:.75rem}.WebPagePreview>div>.Button{flex-shrink:0;background:none!important;width:2.125rem;height:2.125rem;margin:0 .625rem;padding:0;align-self:center}.WebPagePreview .WebPage{flex-grow:1;margin:.1875rem 0 .1875rem .125rem;max-width:calc(100% - 3.375rem)}.WebPagePreview .WebPage:before{top:.1rem;bottom:.05rem}.WebPagePreview .WebPage .site-description,.WebPagePreview .WebPage .site-title{flex:1;max-width:100%;max-height:1rem}.WebPagePreview .WebPage .site-title{margin-top:.125rem;margin-bottom:.1875rem}.WebPagePreview .WebPage .site-description{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.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>.Button{flex-shrink:0;margin-left:.5rem}@media (max-width:600px){.Composer>.Button{width:2.875rem;height:2.875rem}}.Composer>.Button .icon-check,.Composer>.Button .icon-microphone-alt,.Composer>.Button .icon-send{position:absolute}.Composer>.Button:not(:active):not(:focus):not(:hover) .icon-check,.Composer>.Button:not(:active):not(:focus):not(:hover) .icon-send{color:var(--color-primary)}.Composer>.Button.cancel{position:relative;z-index:1}.Composer>.Button.cancel.active,.Composer>.Button.cancel:hover{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-check,.Composer>.Button.send .icon-microphone-alt{animation:hide-icon .4s ease-out forwards}.Composer>.Button.record .icon-microphone-alt{animation:grow-icon .4s ease-out}.Composer>.Button.edit .icon-microphone-alt,.Composer>.Button.edit .icon-send,.Composer>.Button.record .icon-check,.Composer>.Button.record .icon-send{animation:hide-icon .4s ease-out forwards}.Composer>.Button.edit .icon-check{animation:grow-icon .4s ease-out}body.animation-level-0 .Composer>.Button .icon-check,body.animation-level-0 .Composer>.Button .icon-microphone-alt,body.animation-level-0 .Composer>.Button .icon-send,body.animation-level-1 .Composer>.Button .icon-check,body.animation-level-1 .Composer>.Button .icon-microphone-alt,body.animation-level-1 .Composer>.Button .icon-send{animation-duration:0ms!important}.Composer .mobile-symbol-menu-button{width:2.875rem;height:2.875rem;position:relative}.Composer .mobile-symbol-menu-button .icon-keyboard,.Composer .mobile-symbol-menu-button .icon-smile,.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 ease-out forwards}.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 ease-out forwards}.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 ease-out forwards}#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 .2s}#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>.Button{flex-shrink:0;background:none!important;width:3.375rem;height:3.375rem;margin:0;padding:.625rem;align-self:flex-end}@media (max-width:600px){.message-input-wrapper>.Button{width:2.875rem;height:2.875rem;margin: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:.1875rem solid var(--color-background);box-sizing:initial;width:.5rem;height:.5rem;border-radius:50%;background:var(--color-green-darker);box-shadow:-.375rem -.25rem 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}}#caption-input-text,#message-input-text{position:relative}#caption-input-text .form-control,#message-input-text .form-control{padding-top:calc(1rem - var(--border-width));padding-bottom:calc(1rem - var(--border-width));overflow:hidden;line-height:1.375rem;font-family:Roboto,-apple-system,Apple Color Emoji,Helvetica Neue,sans-serif;unicode-bidi:plaintext;text-align:initial}#caption-input-text .form-control.overflown,#message-input-text .form-control.overflown{overflow-y:auto;overflow-x:hidden}#caption-input-text .form-control.touched+.placeholder-text,#caption-input-text .form-control:focus+.placeholder-text,#message-input-text .form-control.touched+.placeholder-text,#message-input-text .form-control:focus+.placeholder-text{display:none}#caption-input-text .form-control.focus-disabled,#message-input-text .form-control.focus-disabled{pointer-events:none}#caption-input-text .placeholder-text,#message-input-text .placeholder-text{position:absolute;bottom:.9375rem;color:var(--color-placeholders);pointer-events:none;unicode-bidi:plaintext;text-align:initial}@media (max-width:600px){#caption-input-text .placeholder-text,#message-input-text .placeholder-text{bottom:.6875rem}}#caption-input-text .text-entity-link,#message-input-text .text-entity-link{color:var(--color-links)!important;cursor:default;text-decoration:none}#caption-input-text .text-entity-link:active,#caption-input-text .text-entity-link:hover,#caption-input-text .text-entity-link:visited,#message-input-text .text-entity-link:active,#message-input-text .text-entity-link:hover,#message-input-text .text-entity-link:visited{color:var(--color-links-hover)!important}#caption-input-text .clone,#message-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-top:calc(1.15625rem - var(--border-width));padding-bottom:calc(1.15625rem - var(--border-width));transition:height .1s ease}@media (max-width:600px){#message-input-text .form-control{height:2.875rem;min-height:2.875rem;max-height:16rem;padding-top:calc(.84375rem - var(--border-width));padding-bottom:calc(.84375rem - var(--border-width))}}body.animation-level-0 #message-input-text .form-control{transition:none!important}#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:.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:.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}#middle-column-bg{position:absolute;top:0;left:0;bottom:0;right:0;overflow:hidden;z-index:-1}#middle-column-bg:after,#middle-column-bg:before{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:50%;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 .2s!important}body.animation-level-0 #middle-column-bg:after{transition:none}.custom-bg-color>#middle-column-bg:before{filter:blur(0);transform:scale(1.1)}.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:blur(0);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,body.animation-level-2 #middle-column-bg:before{margin:-16rem -5rem -20rem 0;overflow:hidden;transform:scale(1);transform-origin:left center;transition:transform var(--layer-transition)}body.animation-level-2 .custom-bg-image>#middle-column-bg:after{margin:-16rem -5rem -20rem -1rem;transition:transform var(--layer-transition)}body.animation-level-2 #Main.right-column-open :not(.custom-bg-image)>#middle-column-bg:after{transform:scale(.67)}}#MiddleColumn{display:flex;justify-content:center;height:100%;position:relative;z-index:1}@media (max-width:600px){#MiddleColumn{overflow:hidden}}#MiddleColumn .messages-layout{display:flex;flex-direction:column;align-items:center;position:relative}#MiddleColumn .messages-layout,#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(.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,body.animation-level-0 #MiddleColumn .messaging-disabled .messaging-disabled-inner span{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:translateZ(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 .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:-.5rem;left:0;right:0;height:1px;background:linear-gradient(90deg,hsla(0,0%,100%,0),hsla(0,0%,100%,.4) 2%,hsla(0,0%,100%,.4) 98%,hsla(0,0%,100%,0));opacity:0;transition:opacity .35s 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,hsla(0,0%,49.8%,0),hsla(0,0%,49.8%,.4) 2%,hsla(0,0%,49.8%,.4) 98%,hsla(0,0%,49.8%,0))}.Composer,.MessageSelectToolbar,.messaging-disabled{margin-bottom:1.25rem}@media (max-width:600px){.Composer,.MessageSelectToolbar,.messaging-disabled{margin-bottom:.5rem}}.Composer,.MessageSelectToolbar,.messaging-disabled,.unpin-all-button{width:100%;display:flex;justify-content:center;position:relative}.mask-image-disabled .MessageSelectToolbar-inner,.mask-image-disabled .messaging-disabled,.mask-image-disabled .unpin-all-button{box-shadow:0 .25rem .5rem .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 .15s,color .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-right:.75rem;margin-left:-.438rem;color:var(--color-text-secondary);font-size:1.5rem;transition:color .15s}@media (max-width:600px){.unpin-button-container{padding-bottom:.75rem}}.mask-image-disabled .unpin-button-container:before{background:unset}.RightHeader{display:flex;align-items:center;height:var(--header-height);padding:.5rem .8125rem;pointer-events:auto}@media (max-width:600px){.RightHeader{padding:.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}.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.deleted-account,.ProfilePhoto.no-photo,.ProfilePhoto.saved-messages,.ProfilePhoto .spinner-wrapper{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}.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}.is-touch-env .ProfileInfo .navigation,.ProfileInfo .navigation:hover{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,.5),transparent);color:var(--color-white);display:flex;flex-direction:column;justify-content:flex-end}.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:.25rem;margin-top:-.125rem}.ProfileInfo .title .emoji{width:1.5rem;height:1.5rem;background-size:1.5rem}.ProfileInfo .status{font-size:.875rem;opacity:.5}.Profile{height:100%;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 -.0625rem 0 0 var(--color-background-secondary-accent);border-bottom:.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}.shared-media{display:flex;flex-direction:column-reverse}.shared-media .TabList{background:var(--color-background);top:-1px}.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 .message-upload-progress,.shared-media .content.links-list .ProgressSpinner{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:.5rem 1rem}@media (max-width:600px){.shared-media .content.members-list{padding:.5rem 0}}#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:nth-child(n+18){display:none!important}@media (max-width:1275px){#RightColumn{box-shadow:0 .25rem .5rem .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:.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:.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:#000;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:translateZ(0)}#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:#000;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:translateZ(0)}#Main:not(.middle-column-open) #LeftColumn:after{opacity:0;pointer-events:none}#Main.middle-column-open #LeftColumn .custom-scroll{overflow:hidden}}@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)}}#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:translateZ(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)}}@media (max-width:600px){.SymbolMenu{transition:transform var(--layer-transition)}body.animation-level-0 .SymbolMenu{transition:none}body:not(.is-middle-column-open) .SymbolMenu{transform:translate3d(100vw,0,0)!important}} \ No newline at end of file diff --git a/dist/4.b0768c144c69fa913166.js b/dist/4.b0768c144c69fa913166.js deleted file mode 100644 index 90c3ebc7a..000000000 --- a/dist/4.b0768c144c69fa913166.js +++ /dev/null @@ -1,2 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[4],{192:function(e,t,a){},193:function(e,t,a){},194:function(e,t,a){},206:function(e,t,a){},207:function(e,t,a){},208:function(e,t,a){},211:function(e,t,a){},212:function(e,t,a){},213:function(e,t,a){},217:function(e,t,a){},218:function(e,t,a){},220:function(e,t,a){},223:function(e,t,a){},224:function(e,t,a){},225:function(e,t,a){},226:function(e,t,a){},227:function(e,t,a){},228:function(e,t,a){},229:function(e,t,a){},230:function(e,t,a){},231:function(e,t,a){},232:function(e,t,a){},233: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){},245:function(e,t,a){},246:function(e,t,a){},247:function(e,t,a){},97:function(e,t,a){"use strict";a.r(t),a.d(t,"Main",(function(){return Pn}));var s=a(2),n=a(1),c=a(0),r=(a(78),a(34)),o=a(6);window.addEventListener("popstate",e=>{if(!e.state)return;const{chatId:t,threadId:a,messageListType:n}=e.state;Object(s.d)().openChat({id:t,threadId:a,type:n,noPushState:!0})}),Object(s.b)("openChat",(e,t,a)=>{const{id:n,threadId:c=-1,type:i="thread",noPushState:l}=a,d=Object(o.y)(e);return d&&d.chatId===n&&d.threadId===c&&d.type===i||(e=Object(r.n)(e),e={...e,messages:{...e.messages,contentToBeScheduled:void 0},...n!==e.forwardMessages.toChatId&&{forwardMessages:{}}},Object(s.g)(e),l||window.history.pushState({chatId:n,threadId:c,messageListType:i},"")),Object(r.N)(e,n,c,i)}),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}));var i=a(5),l=a(19),d=a(3);let b;Object(s.b)("setScrollOffset",(e,t,a)=>{const{chatId:s,threadId:n,scrollOffset:c}=a;return Object(r.x)(e,s,n,"scrollOffset",c)}),Object(s.b)("setReplyingToId",(e,t,a)=>{const{messageId:s}=a,n=Object(o.y)(e);if(!n)return;const{chatId:c,threadId:i}=n;return Object(r.x)(e,c,i,"replyingToId",s)}),Object(s.b)("setEditingId",(e,t,a)=>{const{messageId:s}=a,n=Object(o.y)(e);if(!n)return;const{chatId:c,threadId:i,type:l}=n,d="scheduled"===l?"editingScheduledId":"editingId";return Object(r.x)(e,c,i,d,s)}),Object(s.b)("editLastMessage",e=>{const{chatId:t,threadId:a}=Object(o.y)(e)||{};if(!t||!a)return;const s=Object(o.m)(e,t),n=Object(o.Gb)(e,t,a);if(!s||!n)return;const c=Object(d.g)(n,t=>Boolean(s[t]&&Object(o.b)(e,s[t],a).canEdit));return c?Object(r.x)(e,t,a,"editingId",c):void 0}),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.V)(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.y)(e);if(!a)return;const{chatId:s,threadId:n}=a;let c;if(n===i.MAIN_THREAD_ID){const t=Object(o.f)(e,s);c=t&&t.lastMessage?t.lastMessage.id:void 0}else{const t=Object(o.Bb)(e,s,n);c=t?t.lastMessageId:void 0}c&&t.focusMessage({chatId:s,threadId:n,messageId:c,noHighlight:!0})}),Object(s.b)("focusMessage",(e,t,a)=>{const{chatId:n,threadId:c=i.MAIN_THREAD_ID,messageListType:d="thread",noHighlight:u,groupedId:m,groupedChatId:h}=a;let{messageId:O}=a;if(void 0!==m){const t=Object(o.I)(e,h,m);t&&t.length&&([O]=t)}const j=Object(o.y)(e),g=!j||n!==j.chatId||c!==j.threadId||d!==j.type;b&&(clearTimeout(b),b=void 0),b=window.setTimeout(()=>{let e=Object(s.e)();e=Object(r.P)(e),e=Object(r.O)(e),Object(s.g)(e)},2e3),e=Object(r.P)(e,n,O,u),e=Object(r.O)(e,void 0),g&&(e=Object(r.O)(e,l.b.Static));const f=Object(o.Gb)(e,n,c);if(f&&f.includes(O))return Object(s.g)(e),void t.openChat({id:n,threadId:c});if(g&&(e=Object(r.x)(e,n,c,"viewportIds",void 0)),e=Object(r.x)(e,n,c,"outlyingIds",void 0),f&&!g){const t=O>f[0]?l.b.Down:l.b.Up;e=Object(r.O)(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.Z)(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.r)(e);return n?Object(r.m)(e,n.id,s):e}),Object(s.b)("toggleMessageSelection",(e,t,a)=>{const{messageId:s,groupedId:n,childMessageIds:c,withShift:i}=a,l=Object(o.y)(e);if(!l)return;const{chatId:d,threadId:b,type:u}=l;return Object(r.G)(e,d,b,u,s,n,c,i)}),Object(s.b)("exitMessageSelectMode",r.n),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.R)(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.R)(e,{recentlyFoundChatIds:[s]});const c=n.filter(e=>e!==s);return c.unshift(s),c.length>10&&c.pop(),Object(r.R)(e,{recentlyFoundChatIds:c})}),Object(s.b)("clearRecentlyFoundChats",e=>Object(r.R)(e,{recentlyFoundChatIds:void 0})),Object(s.b)("setGlobalSearchContent",(e,t,a)=>{const{content:s}=a;return Object(r.S)(e,s)}),Object(s.b)("setGlobalSearchChatId",(e,t,a)=>{const{id:s}=a;return Object(r.R)(e,{chatId:s,query:void 0,resultsByType:void 0})});var u=a(47),m=a(4);Object(s.b)("openLocalTextSearch",e=>{const{chatId:t,threadId:a}=Object(o.y)(e)||{};if(t&&a)return Object(r.Y)(e,t,a,!0)}),Object(s.b)("closeLocalTextSearch",e=>{const{chatId:t,threadId:a}=Object(o.y)(e)||{};if(t&&a)return e=Object(r.Y)(e,t,a,!1),e=Object(r.t)(e,t,a,void 0)}),Object(s.b)("setLocalTextSearchQuery",(e,t,a)=>{const{chatId:s,threadId:n}=Object(o.y)(e)||{};if(!s||!n)return;const{query:c}=a,i=Object(m.a)(s,n),{query:l}=e.localTextSearch.byChatThreadKey[i]||{};return c!==l&&(e=Object(r.t)(e,s,n,u.a)),e=Object(r.Y)(e,s,n,!0,c)}),Object(s.b)("setLocalMediaSearchType",(e,t,a)=>{const{chatId:s}=Object(o.y)(e)||{};if(!s)return;const{mediaType:n}=a;return Object(r.X)(e,s,n)}),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.fb)(e,void 0)),Object(s.b)("setSettingOption",(e,t,a)=>Object(r.v)(e,a)),Object(s.b)("setThemeSettings",(e,t,a)=>{const{theme:s,...n}=a;return Object(r.w)(e,s,n)});var h=a(7),O=a(164);Object(s.b)("toggleChatInfo",e=>({...e,isChatInfoShown:!e.isChatInfoShown})),Object(s.b)("toggleManagement",e=>{const{chatId:t}=Object(o.y)(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.y)(e)||{};if(t)return{...e,management:{byChatId:{...e.management.byChatId,[t]:{...e.management.byChatId[t],isActive:!1}}}}}),Object(s.b)("openChat",(e,t,a)=>{if(!h.g)return;const{id:s}=a;return{...e,isLeftColumnShown:void 0===s}}),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)("showError",(e,t,a)=>{const{error:s}=a;if(!Object(O.a)(s))return e;const n=[...e.errors],c=n.findIndex(e=>e.message===s.message);return-1!==c&&n.splice(c,1),n.push(s),{...e,errors:n}}),Object(s.b)("dismissError",e=>{const t=[...e.errors];return t.pop(),{...e,errors:t}}),Object(s.b)("toggleSafeLinkModal",(e,t,a)=>{const{url:s}=a;return{...e,safeLinkModalUrl:s}}),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.h)(e);return Object(r.i)(t)});a(79);var j=a(10),g=a(9);const f=Object(g.g)(e=>e(),1e3,!0),p=Object(g.g)(e=>e(),3e3,!0),I=Object(g.a)(e=>e(),500,!1,!0);async function v(e,t,a){const c=await Object(j.a)("fetchChats",{limit:n.j,offsetDate:a,archived:"archived"===e,withPinned:void 0===Object(s.e)().chats.orderedPinnedIds[e]});if(!c)return;const{chatIds:o}=c;o.length>0&&o[0]===t&&o.shift();let l=Object(s.e)();l=Object(r.f)(l,Object(d.c)(c.users,"id")),l=Object(r.M)(l,Object(d.c)(c.chats,"id")),l=Object(r.I)(l,e,o),l=Object(r.J)(l,e,c),Object.keys(c.draftsById).map(Number).forEach(e=>{l=Object(r.x)(l,e,i.MAIN_THREAD_ID,"draft",c.draftsById[e])}),Object.keys(c.replyingToById).map(Number).forEach(e=>{l=Object(r.x)(l,e,i.MAIN_THREAD_ID,"replyingToId",c.replyingToById[e])}),0!==o.length||l.chats.isFullyLoaded[e]||(l={...l,chats:{...l.chats,isFullyLoaded:{...l.chats.isFullyLoaded,[e]:!0}}}),Object(s.g)(l)}async function y(e){const t=await Object(j.a)("fetchFullChat",e);if(!t)return;const{users:a,fullInfo:n}=t;let c=Object(s.e)();a&&(c=Object(r.f)(c,Object(d.c)(a,"id"))),c=Object(r.H)(c,e.id,{fullInfo:n}),Object(s.g)(c)}async function E(e,t,a){const n=Object(s.e)(),c=Object(o.h)(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.r)(n);e.openChat({id:-1});const l=await Object(j.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.H)(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!==l&&!a.includes(e));if(!u)return;a.push(u.id),t.loadViewportMessages({chatId:u.id,threadId:i.MAIN_THREAD_ID})}})()}),Object(s.b)("openChat",(e,t,a)=>{const{id:s,threadId:n}=a,{currentUserId:c}=e,r=Object(o.f)(e,s);if(r&&r.hasUnreadMark&&t.toggleChatUnread({id:s}),r)Object(m.mb)(r)&&!r.isMin&&t.requestChatUpdate({chatId:s});else if(s===c)Object(j.a)("fetchChat",{type:"self"});else{const t=Object(o.Fb)(e,s);t&&Object(j.a)("fetchChat",{type:"user",user:t})}if(n!==i.MAIN_THREAD_ID){Object(o.Db)(e,s,n)||t.requestThreadInfoUpdate({chatId:s,threadId:n})}}),Object(s.b)("openSupportChat",(e,t)=>{const a=Object(o.zb)(e);t.openChat({id:a?a.id:-1}),a||(async()=>{const e=await Object(j.a)("fetchChat",{type:"support"});e&&t.openChat({id:e.chatId})})()}),Object(s.b)("openTipsChat",(e,t)=>{t.openChatByUsername({username:n.Cb})}),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.M)(e,t.id)).sort((e,t)=>e.lastMessage.date-t.lastMessage.date)[0]:void 0;f(c?()=>v(s,c.id,c.lastMessage.date):()=>v(s))}),Object(s.b)("loadFullChat",(e,t,a)=>{const{chatId:s,force:n}=a,c=Object(o.f)(e,s);c&&(n?y(c):I(()=>y(c)))}),Object(s.b)("loadTopChats",()=>{p(()=>v("active"))}),Object(s.b)("requestChatUpdate",(e,t,a)=>{const{chatId:s}=a,n=Object(o.f)(e,s);n&&Object(j.a)("requestChatUpdate",n)}),Object(s.b)("updateChatMutedState",(e,t,a)=>{const{chatId:s,isMuted:n}=a,c=Object(o.f)(e,s);c&&Object(j.a)("updateChatMutedState",{chat:c,isMuted:n})}),Object(s.b)("createChannel",(e,t,a)=>{const{title:n,about:c,photo:i,memberIds:d}=a;!async function(e,t,a,n){Object(s.g)({...Object(s.e)(),chatCreation:{progress:l.a.InProgress}});const c=await Object(j.a)("createChannel",{title:e,about:a,users:t});if(!c)return;const{id:o,accessHash:i}=c;let d=Object(s.e)();d=Object(r.H)(d,o,c),d={...d,chatCreation:{...d.chatCreation,progress:c?l.a.Complete:l.a.Error}},Object(s.g)(d),Object(s.d)().openChat({id:o}),o&&i&&n&&await Object(j.a)("editChatPhoto",{chatId:o,accessHash:i,photo:n})}(n,d.map(t=>Object(o.Fb)(e,t)).filter(Boolean),c,i)}),Object(s.b)("joinChannel",(e,t,a)=>{const{chatId:s}=a,n=Object(o.f)(e,s);if(!n)return;const{id:c,accessHash:r}=n;c&&r&&Object(j.a)("joinChannel",{channelId:c,accessHash:r})}),Object(s.b)("leaveChannel",(e,t,a)=>{const{chatId:s}=a,n=Object(o.f)(e,s);if(!n)return;const{id:c,accessHash:r}=n;c&&r&&Object(j.a)("leaveChannel",{channelId:c,accessHash:r})}),Object(s.b)("deleteChannel",(e,t,a)=>{const{chatId:s}=a,n=Object(o.f)(e,s);if(!n)return;const{id:c,accessHash:r}=n;c&&r&&Object(j.a)("deleteChannel",{channelId:c,accessHash:r})}),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:l.a.InProgress}});const n=await Object(j.a)("createGroupChat",{title:e,users:t});if(!n)return;const{id:c}=n;let o=Object(s.e)();o=Object(r.H)(o,c,n),o={...o,chatCreation:{...o.chatCreation,progress:n?l.a.Complete:l.a.Error}},Object(s.g)(o),Object(s.d)().openChat({id:c}),c&&a&&await Object(j.a)("editChatPhoto",{chatId:c,photo:a})}(n,c.map(t=>Object(o.Fb)(e,t)).filter(Boolean),i)}),Object(s.b)("toggleChatPinned",(e,t,a)=>{const{id:s,folderId:c}=a,r=Object(o.f)(e,s);if(r)if(c){const t=Object(o.i)(e,c);if(t){const a=!Object(o.M)(e,s,c),{pinnedChatIds:n,includedChatIds:r}=t,i=a?[s,...n||[]]:(n||[]).filter(e=>e!==s),l=[s,...r];Object(j.a)("editChatFolder",{id:c,folderUpdate:{...t,pinnedChatIds:i,includedChatIds:l}})}}else{const t=Object(o.j)(e,s),a=Object(o.M)(e,s,"archived"===t?n.h:void 0);Object(j.a)("toggleChatPinned",{chat:r,shouldBePinned:!a})}}),Object(s.b)("toggleChatArchived",(e,t,a)=>{const{id:s}=a,c=Object(o.f)(e,s);c&&Object(j.a)("toggleChatArchived",{chat:c,folderId:Object(m.hb)(c)?0:n.h})}),Object(s.b)("loadChatFolders",()=>{!async function(){const e=await Object(j.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(j.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.i)(e,s);c&&Object(j.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(j.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.h)}),Object(s.b)("deleteChatFolder",(e,t,a)=>{const{id:s}=a;Object(o.i)(e,s)&&async function(e){await Object(j.a)("deleteChatFolder",e)}(s)}),Object(s.b)("toggleChatUnread",(e,t,a)=>{const{id:s}=a,n=Object(o.f)(e,s);n&&(n.unreadCount?Object(j.a)("markMessageListRead",{chat:n,threadId:i.MAIN_THREAD_ID}):Object(j.a)("toggleDialogUnread",{chat:n,hasUnreadMark:!n.hasUnreadMark}))}),Object(s.b)("openTelegramLink",(e,t,a)=>{const{url:s}=a;let c=n.ib.exec(s);if(c){const e=c[1];(async()=>{const a=await Object(j.a)("openChatByInvite",e);a&&t.openChat({id:a.id})})()}else{c=n.jb.exec(s);const e=c[1],a=c[2]?Number(c[2]):void 0;E(t,e,a)}}),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(o.f)(e,s);c&&(async()=>{if(Object(m.ib)(c)){if(c=await Object(j.a)("migrateChat",c),!c)return;t.openChat({id:c.id})}Object(j.a)("togglePreHistoryHidden",{chat:c,isEnabled:n})})()}),Object(s.b)("updateChatDefaultBannedRights",(e,t,a)=>{const{chatId:s,bannedRights:n}=a,c=Object(o.f)(e,s);c&&Object(j.a)("updateChatDefaultBannedRights",{chat:c,bannedRights:n})}),Object(s.b)("updateChatMemberBannedRights",(e,t,a)=>{const{chatId:n,userId:c,bannedRights:i}=a;let l=Object(o.f)(e,n);const d=Object(o.Fb)(e,c);l&&d&&(async()=>{if(Object(m.ib)(l)){if(l=await Object(j.a)("migrateChat",l),!l)return;t.openChat({id:l.id})}await Object(j.a)("updateChatMemberBannedRights",{chat:l,user:d,bannedRights:i});const e=Object(s.e)(),a=Object(o.f)(e,n);if(!a||!a.fullInfo)return;const{members:b,kickedMembers:u}=a.fullInfo,h=!!i.viewMessages,O=!Object.keys(i).length;Object(s.g)(Object(r.H)(e,n,{fullInfo:{...a.fullInfo,...b&&h&&{members:b.filter(e=>e.userId!==c)},...b&&!h&&{members:b.map(e=>e.userId===c?{...e,bannedRights:i}:e)},...O&&u&&{kickedMembers:u.filter(e=>e.userId!==c)}}}))})()}),Object(s.b)("updateChatAdmin",(e,t,a)=>{const{chatId:n,userId:c,adminRights:i,customTitle:l}=a;let d=Object(o.f)(e,n);const b=Object(o.Fb)(e,c);d&&b&&(async()=>{if(Object(m.ib)(d)){if(d=await Object(j.a)("migrateChat",d),!d)return;t.openChat({id:d.id})}await Object(j.a)("updateChatAdmin",{chat:d,user:b,adminRights:i,customTitle:l});const e=Object(s.e)(),a=Object(o.f)(e,n);if(!a||!a.fullInfo)return;const{adminMembers:u}=a.fullInfo,h=!Object.keys(i).length;Object(s.g)(Object(r.H)(e,n,{fullInfo:{...a.fullInfo,...u&&h&&{adminMembers:u.filter(e=>e.userId!==c)},...u&&!h&&{adminMembers:u.map(e=>e.userId===c?{...e,adminRights:i,customTitle:l}:e)}}}))})()}),Object(s.b)("updateChat",(e,t,a)=>{const{chatId:n,title:c,about:i,photo:d}=a,b=Object(o.f)(e,n);b&&(async()=>{Object(s.g)(Object(r.bb)(Object(s.e)(),l.f.InProgress)),await Promise.all([b.title!==c?Object(j.a)("updateChatTitle",b,c):void 0,b.fullInfo&&b.fullInfo.about!==i?Object(j.a)("updateChatAbout",b,i):void 0,d?Object(j.a)("editChatPhoto",{chatId:n,accessHash:b.accessHash,photo:d}):void 0]),Object(s.g)(Object(r.bb)(Object(s.e)(),l.f.Complete))})()}),Object(s.b)("toggleSignatures",(e,t,a)=>{const{chatId:s,isEnabled:n}=a,c=Object(o.f)(e,s);c&&Object(j.a)("toggleSignatures",{chat:c,isEnabled:n})}),Object(s.b)("loadGroupsForDiscussion",()=>{(async()=>{const e=await Object(j.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.f)(e,s);let r=Object(o.f)(e,n);c&&r&&(async()=>{if(Object(m.ib)(r)){if(r=await Object(j.a)("migrateChat",r),!r)return;t.openChat({id:r.id})}let{fullInfo:e}=r;if(!e){const t=await Object(j.a)("fetchFullChat",r);if(!t)return;e=t.fullInfo}e.isPreHistoryHidden&&await Object(j.a)("togglePreHistoryHidden",{chat:r,isEnabled:!1}),Object(j.a)("setDiscussionGroup",{channel:c,chat:r})})()}),Object(s.b)("unlinkDiscussionGroup",(e,t,a)=>{const{channelId:s}=a,n=Object(o.f)(e,s);if(!n)return;let c;n.fullInfo&&n.fullInfo.linkedChatId&&(c=Object(o.f)(e,n.fullInfo.linkedChatId)),(async()=>{await Object(j.a)("setDiscussionGroup",{channel:n}),c&&y(c)})()}),Object(s.b)("loadMoreMembers",e=>{(async()=>{const{chatId:t}=Object(o.y)(e)||{},a=t?Object(o.f)(e,t):void 0;if(!a||Object(m.ib)(a))return;const n=a.fullInfo&&a.fullInfo.members&&a.fullInfo.members.length||void 0,c=await Object(j.a)("fetchMembers",a.id,a.accessHash,"recent",n);if(!c)return;const{members:i,users:l}=c;i&&i.length&&(e=Object(s.e)(),e=Object(r.f)(e,Object(d.c)(l,"id")),e=Object(r.H)(e,a.id,{fullInfo:{...a.fullInfo,members:[...(a.fullInfo||{}).members||[],...i||[]]}}),Object(s.g)(e))})()});var C=a(148);const w=new Map,M=Object(g.g)(e=>e(),1e3,!0);async function S(e,t,a,c,i=!1,b=!1){const u=e.id;let m;switch(c){case l.e.Backwards:m=void 0;break;case l.e.Around:m=-(Math.round(n.W/2)+1);break;case l.e.Forwards:m=-(n.W+1)}const h=await Object(j.a)("fetchMessages",{chat:Object(o.Cb)(Object(s.e)(),u,t),offsetId:a,addOffset:m,limit:n.W,threadId:t});if(!h)return;const{messages:O,users:g,chats:f,threadInfos:p}=h,I=Object(d.c)(O,"id"),v=Object.keys(I).map(Number);let y=Object(s.e)();y=Object(r.b)(y,u,I),y=i?Object(r.db)(y,u,t,v):Object(r.V)(y,u,t,v),y=Object(r.f)(y,Object(d.c)(g,"id")),y=Object(r.c)(y,Object(d.c)(f,"id")),y=Object(r.lb)(y,u,p);let E=Object(o.X)(y,u,t);const C=Object(o.fb)(y,u,t);if(i&&E&&C&&Object(d.b)(E,C)&&(y=Object(r.V)(y,u,t,C),E=Object(o.X)(y,u,t),y=Object(r.x)(y,u,t,"outlyingIds",void 0),i=!1),!b){const e=i?C:E,{newViewportIds:s}=k(e,a,c);y=Object(r.z)(y,u,t,s)}Object(s.g)(y)}function k(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===l.e.Backwards?c:c+1||s,o=r-n.W,i=r+n.W-1,d=e.slice(Math.max(0,o),i+1);let b,u;switch(a){case l.e.Backwards:b=r>0,u=o>=0;break;case l.e.Forwards:b=r0,u=d.length===n.W}return{newViewportIds:d,areSomeLocal:b,areAllLocal:u}}async function N(e){let t;const a=e.attachment?(e,n)=>{w.has(n)||(t=n,w.set(n,a));const c=Object(s.e)();Object(s.g)({...c,fileUploads:{byMessageLocalId:{...c.fileUploads.byMessageLocalId,[n]:{progress:e}}}})}:void 0;e.replyingTo&&await Object(g.f)();const n=Object(s.e)(),c=Object(o.y)(n);if(!c)return;const{threadId:r}=c;e.replyingTo||r===i.MAIN_THREAD_ID||(e.replyingTo=Object(o.Db)(n,e.chat.id,r)),await Object(j.a)("sendMessage",e,a),a&&t&&w.delete(t)}Object(s.b)("loadViewportMessages",(e,t,a)=>{const{direction:s=l.e.Around,isBudgetPreload:c=!1}=a||{};let{chatId:i,threadId:d}=a||{};if(!i){const t=Object(o.y)(e);if(!t)return;i=t.chatId,d=t.threadId}const b=Object(o.f)(e,i);if(!b||b.isRestricted)return;const u=Object(o.Gb)(e,i,d),m=Object(o.X)(e,i,d),h=Object(o.fb)(e,i,d);if(u&&u.length&&s!==l.e.Around){const a=s===l.e.Backwards?u[0]:u[u.length-1],n=Boolean(h),o=n?h:m,{newViewportIds:O,areSomeLocal:j,areAllLocal:g}=k(o,a,s);if(j&&(e=Object(r.z)(e,i,d,O)),async function(e,t,a,s,n,c,r,o){t||await S(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,b,d,s,a),c)return}else{const t=Object(o.H)(e,i)||Object(o.kb)(e,i,d),a=Boolean(t&&m&&!m.includes(t)),s=(a?h:m)||[],{newViewportIds:u,areSomeLocal:O,areAllLocal:j}=k(s,t,l.e.Around);O&&u.length>=n.W&&(e=Object(r.z)(e,i,d,u)),j||S(b,d,t,l.e.Around,a,c)}return e}),Object(s.b)("loadMessage",(e,t,a)=>{const{chatId:n,messageId:c,replyOriginForId:l}=a,b=Object(o.f)(e,n);b&&async function(e,t,a){const n=await Object(j.a)("fetchMessage",{chat:e,messageId:t});if(!n)return;if(n===i.MESSAGE_DELETED){if(a){let t=Object(s.e)();const n=Object(o.k)(t,e.id,a);t=Object(r.L)(t,e.id,a,{...n,replyToMessageId:void 0}),Object(s.g)(t)}return}let c=Object(s.e)();c=Object(r.L)(c,e.id,t,n.message),c=Object(r.f)(c,Object(d.c)(n.users,"id")),Object(s.g)(c)}(b,c,l)}),Object(s.b)("sendMessage",(e,t,a)=>{const s=Object(o.y)(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.f)(e,c);t.setReplyingToId({messageId:void 0}),t.clearWebPagePreview({chatId:c,threadId:r,value:!1});const b={...a,chat:l,replyingTo:Object(o.lb)(e,c,r),noWebPage:Object(o.bb)(e,c,r)},u=!a.attachments||a.attachments.length<=1,m=!u&&a.attachments&&a.attachments.length>1;if(u){const{attachments:e,...t}=b;N({...t,attachment:e?e[0]:void 0})}else if(m){const{text:e,entities:t,attachments:a,...s}=b,c=Object(d.n)(a,n.M);for(let a=0;a0?o:void 0}),r.forEach(e=>{N({...s,attachment:e,groupedId:o})})}}else{const{text:e,entities:t,attachments:a,replyingTo:s,...n}=b;e&&N({...n,text:e,entities:t,replyingTo:s}),a.forEach(e=>{N({...n,attachment:e})})}}),Object(s.b)("editMessage",(e,t,a)=>{const{text:s,entities:n}=a,c=Object(o.y)(e);if(!c)return;const{chatId:r,threadId:i,type:l}=c,d=Object(o.f)(e,r),b=Object(o.D)(e,r,i,l);d&&b&&(Object(j.a)("editMessage",{chat:d,message:b,text:s,entities:n,noWebPage:Object(o.bb)(e,r,i)}),t.setEditingId({messageId:void 0}))}),Object(s.b)("cancelSendingMessage",(e,t,a)=>{const{chatId:s,messageId:n}=a,c=Object(o.k)(e,s,n),r=c&&w.get(c.previousLocalId||c.id);r&&Object(j.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:l,entities:d}=c,b=Object(o.f)(e,s);return n===i.MAIN_THREAD_ID&&Object(j.a)("saveDraft",{chat:b,text:l,entities:d,replyToMsgId:Object(o.lb)(e,s,n)}),Object(r.x)(e,s,n,"draft",c)}),Object(s.b)("clearDraft",(e,t,a)=>{const{chatId:s,threadId:n,localOnly:c}=a;if(!Object(o.B)(e,s,n))return;const l=Object(o.f)(e,s);return c||n!==i.MAIN_THREAD_ID||Object(j.a)("clearDraft",l),Object(r.x)(e,s,n,"draft",void 0)}),Object(s.b)("toggleMessageWebPage",(e,t,a)=>{const{chatId:s,threadId:n,noWebPage:c}=a;return Object(r.x)(e,s,n,"noWebPage",c)}),Object(s.b)("pinMessage",(e,t,a)=>{const s=Object(o.r)(e);if(!s)return;const{messageId:n,isUnpin:c,isOneSide:r,isSilent:i}=a;Object(j.a)("pinMessage",{chat:s,messageId:n,isUnpin:c,isOneSide:r,isSilent:i})}),Object(s.b)("unpinAllMessages",(e,t,a)=>{const n=Object(o.f)(e,a.chatId);n&&async function(e){await Object(j.a)("unpinAllMessages",{chat:e});let t=Object(s.e)();t=Object(r.x)(t,e.id,i.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.y)(e);if(!c)return;const{chatId:r,threadId:i}=c,l=Object(o.f)(e,r);Object(j.a)("deleteMessages",{chat:l,messageIds:s,shouldDeleteForAll:n});const d=Object(o.C)(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.y)(e);if(!n)return;const{chatId:c}=n,r=Object(o.f)(e,c);Object(j.a)("deleteScheduledMessages",{chat:r,messageIds:s});const i=Object(o.E)(e,c);s.includes(i)&&t.setEditingId({messageId:void 0})}),Object(s.b)("deleteHistory",(e,t,a)=>{const{chatId:s,maxId:n,shouldDeleteForAll:c}=a,r=Object(o.f)(e,s);r&&Object(j.a)("deleteHistory",{chat:r,shouldDeleteForAll:c,maxId:n})}),Object(s.b)("markMessageListRead",(e,t,a)=>{const s=Object(o.y)(e);if(!s)return;const{chatId:n,threadId:c}=s,r=Object(o.Cb)(e,n,c);if(!r)return;const{maxId:i}=a;M(()=>{Object(j.a)("markMessageListRead",{chat:r,threadId:c,maxId:i})})}),Object(s.b)("markMessagesRead",(e,t,a)=>{const s=Object(o.r)(e);if(!s)return;const{messageIds:n}=a;Object(j.a)("markMessagesRead",{chat:s,messageIds:n})}),Object(s.b)("loadWebPagePreview",(e,t,a)=>{const{text:n}=a;!async function(e){const t=await Object(j.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.f)(e,s);r&&Object(j.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:b}=a;!async function(e,t,a,n,c,o){const i=await Object(j.a)("loadPollOptionResults",{chat:e,messageId:t,option:a,offset:n,limit:c});if(!i)return;let l=Object(s.e)();l=Object(r.f)(l,Object(d.c)(i.users,"id"));const{voters:b}=l.pollResults;Object(s.g)({...l,pollResults:{...l.pollResults,voters:{...b,[a]:[...!o&&b&&b[a]?b[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,b)}),Object(s.b)("forwardMessages",e=>{const{fromChatId:t,messageIds:a,toChatId:n}=e.forwardMessages,c=t?Object(o.f)(e,t):void 0,r=n?Object(o.f)(e,n):void 0,i=t&&a?a.sort((e,t)=>e-t).map(a=>Object(o.k)(e,t,a)).filter(Boolean):void 0;c&&r&&i&&i.length&&function(e,t,a){Object(j.a)("forwardMessages",{fromChat:e,toChat:t,messages:a}),Object(s.g)({...Object(s.e)(),forwardMessages:{}})}(c,r,i)}),Object(s.b)("loadScheduledHistory",e=>{const t=Object(o.r)(e);if(!t)return;const{hash:a}=e.scheduledMessages.byChatId[t.id]||{};!async function(e,t){const a=await Object(j.a)("fetchScheduledHistory",{chat:e,hash:t});if(!a)return;const{hash:n,messages:c}=a,o=Object(d.c)(c,"id"),l=Object.keys(o).map(Number).sort((e,t)=>t-e);let b=Object(s.e)();b=Object(r.u)(b,e.id,o,n),b=Object(r.x)(b,e.id,i.MAIN_THREAD_ID,"scheduledIds",l),Object(s.g)(b)}(t,a)}),Object(s.b)("sendScheduledMessages",(e,t,a)=>{const{chatId:s,id:n}=a,c=Object(o.f)(e,s);c&&Object(j.a)("sendScheduledMessages",{chat:c,ids:[n]})}),Object(s.b)("rescheduleMessage",(e,t,a)=>{const{chatId:s,messageId:n,scheduledAt:c}=a,r=Object(o.f)(e,s),i=r&&Object(o.ob)(e,r.id,n);r&&i&&Object(j.a)("rescheduleMessage",{chat:r,message:i,scheduledAt:c})}),Object(s.b)("requestThreadInfoUpdate",(e,t,a)=>{const{chatId:s,threadId:n}=a,c=Object(o.Cb)(e,s,n);c&&Object(j.a)("requestThreadInfoUpdate",{chat:c,threadId:n})}),Object(s.b)("loadPinnedMessages",(e,t,a)=>{const{chatId:n}=a,c=Object(o.f)(e,n);c&&async function(e){const t=await Object(j.a)("fetchPinnedMessages",{chat:e});if(!t)return;const{messages:a,chats:n,users:c}=t,o=Object(d.c)(a,"id"),l=Object.keys(o).map(Number).sort((e,t)=>t-e);let b=Object(s.e)();b=Object(r.b)(b,e.id,o),b=Object(r.x)(b,e.id,i.MAIN_THREAD_ID,"pinnedIds",l),b=Object(r.f)(b,Object(d.c)(c,"id")),b=Object(r.c)(b,Object(d.c)(n,"id")),Object(s.g)(b)}(c)}),Object(s.b)("loadMessageLink",(e,t,a)=>{const{messageId:s,chatId:n}=a,c=Object(o.f)(e,n),r=Object(o.k)(e,n,s);c&&r&&(async()=>{const e=await Object(j.a)("fetchMessageLink",{chat:c,message:r});e&&Object(C.c)(e.link)})()});var P=a(48);const T=Object(g.g)(e=>e(),500,!1);async function A(e,t){const a=await Object(j.a)("searchGifs",{query:e,offset:t});a&&Object(s.g)(Object(r.Q)(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(j.a)("fetchStickerSets",{hash:e});if(!t)return;Object(s.g)(Object(r.ib)(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(g.e)(500)})()}),Object(s.b)("loadRecentStickers",e=>{const{hash:t}=e.stickers.recent||{};!async function(e=0){const t=await Object(j.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(j.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(j.a)("fetchFeaturedStickers",{hash:e});if(!t)return;Object(s.g)(Object(r.ib)(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.wb)(e,n);if(!t)return;c=t.accessHash}!async function(e,t){const a=await Object(j.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.hb)(i,n.id,{...n,stickers:c,packs:o});const l=i.stickers.forEmoji.emoji;l&&o[l]&&(i=Object(r.o)(i));Object(s.g)(i)}(n,c)}),Object(s.b)("loadAnimatedEmojis",()=>{!async function(){const e=await Object(j.a)("fetchAnimatedEmojis");if(!e)return;const{set:t,stickers:a}=e;Object(s.g)(Object(r.q)(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(j.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(j.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(j.a)("faveSticker",{sticker:e,unfave:!0})}(n)}),Object(s.b)("toggleStickerSet",(e,t,a)=>{const{stickerSetId:s}=a,n=Object(o.wb)(e,s);if(!n)return;const{accessHash:c,installedDate:r}=n;Object(j.a)(r?"uninstallStickerSet":"installStickerSet",{stickerSetId:s,accessHash:c})}),Object(s.b)("setStickerSearchQuery",(e,t,a)=>{const{query:n}=a;n&&T(()=>{!async function(e,t=0){const a=await Object(j.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(P.a)(a,e)&&i.unshift(t)}});Object(s.g)(Object(r.ib)(n,"search",a.hash,a.sets,i))}(n)})}),Object(s.b)("setGifSearchQuery",(e,t,a)=>{const{query:s}=a;"string"==typeof s&&T(()=>{A(s)})}),Object(s.b)("searchMoreGifs",e=>{const{query:t,offset:a}=e.gifs.search;"string"==typeof t&&T(()=>{A(t,a)})}),Object(s.b)("loadStickersForEmoji",(e,t,a)=>{const{emoji:n}=a,{hash:c}=e.stickers.forEmoji;T(()=>{!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(j.a)("fetchStickersForEmoji",{emoji:e,hash:t});if(a=Object(s.e)(),!n||a.stickers.forEmoji.emoji!==e)return;a=Object(r.jb)(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(33);const L=Object(g.g)(e=>e(),500,!1);async function R(e="",t,a,c,i,l){let b;if(c){const s=await Object(j.a)("searchMessagesLocal",{chatOrUser:c,query:e,type:t,limit:n.y,offsetId:a,minDate:l,maxDate:i});if(s){const{messages:e,users:t,totalCount:a,nextOffsetId:n}=s;b={messages:e,users:t,chats:[],totalCount:a,nextRate:n}}}else b=await Object(j.a)("searchMessagesGlobal",{query:e,offsetRate:a,limit:n.y,type:t,maxDate:i,minDate:l});let u=Object(s.e)();const m=Object(o.t)(u);if(!b||""!==e&&e!==m)return void Object(s.g)(Object(r.T)(u,{messages:!1}));const{messages:h,users:O,chats:g,totalCount:f,nextRate:p}=b;g.length&&(u=Object(r.c)(u,Object(d.c)(g,"id"))),O.length&&(u=Object(r.f)(u,Object(d.c)(O,"id"))),h.length&&(u=Object(r.d)(u,h)),u=Object(r.U)(u,h,f,t,p),Object(s.g)(u)}async function F(){const e=await Object(j.a)("fetchChats",{limit:n.j,archived:!0,withPinned:!0});if(!e)return;let t=Object(s.e)();t=Object(r.ob)(t,Object(d.c)(e.users,"id")),t=Object(r.M)(t,Object(d.c)(e.chats,"id")),t=Object(r.r)(t,"archived",e.chatIds),t=Object(r.J)(t,"archived",e),Object(s.g)(t)}async function D(){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.Fb)(e,t)).filter(Boolean),c=await Object(j.a)("fetchUsers",{users:n});c&&(e=Object(s.e)(),e=Object(r.ob)(e,Object(d.c)(c,"id")),Object(s.g)(e))}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(j.a)("searchChats",{query:e});let a=Object(s.e)();const n=Object(o.t)(a);if(!t||!n||e!==n)return void Object(s.g)(Object(r.T)(a,{chats:!1}));const{localChats:c,localUsers:i,globalChats:l,globalUsers:b}=t;(c.length||l.length)&&(a=Object(r.c)(a,Object(d.c)([...c,...l],"id")));(i.length||b.length)&&(a=Object(r.f)(a,Object(d.c)([...i,...b],"id")));a=Object(r.T)(a,{chats:!1}),a=Object(r.R)(a,{localResults:{chatIds:c.map(({id:e})=>e),userIds:i.map(({id:e})=>e)},globalResults:{...a.globalSearch.globalResults,chatIds:b.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.R)(e,{date:n,query:"",resultsByType:{...e.globalSearch.resultsByType,text:{totalCount:void 0,foundIds:[],nextOffsetId:0}}});Object(s.g)(i);const{chatId:l}=e.globalSearch;R("","text",void 0,l?Object(o.f)(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]||{};R(s,l,d,c?Object(o.f)(e,c):void 0,i,r)}),Object(s.b)("searchTextMessagesLocal",e=>{const{chatId:t,threadId:a}=Object(o.y)(e)||{},c=t?Object(o.f)(e,t):void 0,l=Object(o.A)(e);if(!c||!l||!a)return;const{query:b,results:u}=l,m=u?u.nextOffsetId:void 0;let h;if(a!==i.MAIN_THREAD_ID){const s=Object(o.Bb)(e,t,a);h=s?s.topMessageId:void 0}!async function(e,t,a,c,i){const l=await Object(j.a)("searchMessagesLocal",{chatOrUser:e,type:"text",query:c,topMessageId:a,limit:n.Y,offsetId:i});if(!l)return;const{messages:b,users:u,totalCount:m,nextOffsetId:h}=l,O=Object(d.c)(b,"id"),g=Object.keys(O).map(Number);let f=Object(s.e)();const p=Object(o.A)(f);if(!p||c&&c!==p.query)return;f=Object(r.b)(f,e.id,O),f=Object(r.f)(f,Object(d.c)(u,"id")),f=Object(r.Z)(f,e.id,t,g,m,h),Object(s.g)(f)}(c,a,h,b,m)}),Object(s.b)("searchMediaMessagesLocal",e=>{const t=Object(o.w)(e),a=t?e.users.byId[t]||e.chats.byId[t]:void 0,c=Object(o.v)(e);if(!a||!c)return;const{currentType:i,resultsByType:l}=c,b=i&&l&&l[i],u=b?b.nextOffsetId:void 0;i&&async function(e,t,a){const c=await Object(j.a)("searchMessagesLocal",{chatOrUser:e,type:t,limit:n.ob,offsetId:a});if(!c)return;const{messages:i,users:l,totalCount:b,nextOffsetId:u}=c,m=Object(d.c)(i,"id"),h=Object.keys(m).map(Number);let O=Object(s.e)();if(!Object(o.v)(O))return;O=Object(r.b)(O,e.id,m),O=Object(r.f)(O,Object(d.c)(l,"id")),O=Object(r.W)(O,e.id,t,h,b,u),Object(s.g)(O)}(a,i,u)}),Object(s.b)("searchMessagesByDate",(e,t,a)=>{const{timestamp:n}=a,{chatId:c}=Object(o.y)(e)||{};if(!c)return;const r=Object(o.f)(e,c);r&&async function(e,t){const a=await Object(j.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.y)(e)||{};if(!n)return;if(e.management.progress===l.f.InProgress)return;const{username:c}=a;(async()=>{e=Object(r.bb)(e,l.f.InProgress),e=Object(r.ab)(e,n,{isUsernameAvailable:void 0}),Object(s.g)(e);const t=await Object(j.a)("checkChatUsername",{username:c});e=Object(s.e)(),e=Object(r.bb)(e,t?l.f.Complete:l.f.Error),e=Object(r.ab)(e,n,{isUsernameAvailable:t}),Object(s.g)(e)})()}),Object(s.b)("updatePublicLink",(e,t,a)=>{const{chatId:n}=Object(o.y)(e)||{};let c=n&&Object(o.f)(e,n);if(!n||!c)return;const{username:i}=a;(async()=>{if(e=Object(r.bb)(e,l.f.InProgress),Object(s.g)(e),Object(m.ib)(c)){if(c=await Object(j.a)("migrateChat",c),!c)return;t.openChat({id:c.id})}const a=await Object(j.a)("setChatUsername",{chat:c,username:i});e=Object(s.e)(),e=Object(r.bb)(e,a?l.f.Complete:l.f.Error),e=Object(r.ab)(e,n,{isUsernameAvailable:void 0}),Object(s.g)(e)})()}),Object(s.b)("updatePrivateLink",e=>{const{chatId:t}=Object(o.y)(e)||{},a=t&&Object(o.f)(e,t);t&&a&&Object(j.a)("updatePrivateLink",{chat:a})}),Object(s.b)("sync",(e,t)=>{!async function(e){n.p&&console.log(">>> START SYNC");await Object(j.a)("fetchCurrentUser");const t=await async function(){const e=await Object(j.a)("fetchChats",{limit:n.j,withPinned:!0});if(!e)return;let t=Object(s.e)();const{recentlyFoundChatIds:a}=t.globalSearch,{userIds:c}=t.contactList||{},{currentUserId:l}=t,b=[...a||[],...c||[],...l?[l]:[]],u=b.map(e=>Object(o.Fb)(t,e)).filter(Boolean),h=b.map(e=>Object(o.f)(t,e)).filter(Boolean),{chatId:O}=Object(o.y)(t)||{};if(O){const e=Object(o.f)(t,O);if(e&&!b.includes(O)&&h.push(e),Object(m.lb)(O)){const e=Object(o.Fb)(t,O);e&&!b.includes(O)&&u.push(e)}}u.push(...e.users),h.push(...e.chats),t=Object(r.s)(t,Object(d.c)(h,"id")),t=Object(r.r)(t,"active",e.chatIds),t={...t,chats:{...t.chats}},t=Object(r.J)(t,"active",e),Object.keys(e.draftsById).map(Number).forEach(a=>{t=Object(r.x)(t,a,i.MAIN_THREAD_ID,"draft",e.draftsById[a])}),Object.keys(e.replyingToById).map(Number).forEach(a=>{t=Object(r.x)(t,a,i.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||[],c=Object(s.e)();const{chatId:l}=Object(o.y)(c)||{},b=Object.keys(c.messages.byChatId).map(Number).reduce((e,t)=>{const a=Object(o.B)(c,t,i.MAIN_THREAD_ID);return a?{...e,[t]:a}:e},{});if(l){const e=await(u=c.chats.byId[l],Object(j.a)("fetchMessages",{chat:u,threadId:i.MAIN_THREAD_ID,offsetId:u.lastReadInboxMessageId,addOffset:-(Math.round(n.W/2)+1),limit:n.W}));c=Object(s.e)();const{chatId:b}=Object(o.y)(c)||{};if(e&&b===l){const s=c.messages.byChatId[l],n=Object(d.c)(e.messages,"id"),o=Object.keys(n).map(Number);c={...c,messages:{...c.messages,byChatId:{[l]:{byId:n,threadsById:{[i.MAIN_THREAD_ID]:{...s&&s.threadsById[i.MAIN_THREAD_ID],listedIds:o,viewportIds:o,outlyingIds:void 0}}}}}},c=Object(r.M)(c,Object(d.c)(e.chats,"id")),c=Object(r.lb)(c,l,e.threadInfos),t=!0,a=Array.prototype.concat(a,e.users)}}var u;t||(c={...c,messages:{...c.messages,byChatId:{}}});Object.keys(b).map(Number).forEach(e=>{c=Object(r.x)(c,e,i.MAIN_THREAD_ID,"draft",b[e])}),e?c=Object(r.y)(c,Object(d.c)(a,"id")):a&&(c=Object(r.ob)(c,Object(d.c)(a,"id")));Object(s.g)(c);const{chatId:m,messageId:h}=c.audioPlayer;m&&h&&!Object(o.k)(c,m,h)&&Object(s.d)().closeAudioPlayer()}(t),Object(s.g)({...Object(s.e)(),lastSyncTime:Date.now()}),n.p&&console.log(">>> FINISH SYNC");e()}(t.afterSync)}),Object(s.b)("afterSync",(e,t)=>{!async function(e){n.p&&console.log(">>> START AFTER-SYNC");e.loadFavoriteStickers(),await Promise.all([D(),F()]),await Object(j.a)("fetchCurrentUser"),n.p&&console.log(">>> FINISH AFTER-SYNC")}(t)});const B=Object(g.a)(e=>e(),500,!1,!0);function U(e,{visibility:t,allowedIds:a,deniedIds:s}){const{users:{byId:n},chats:{byId:c}}=e,r={visibility:t};let o,i;const l=e=>{if(!Object(m.lb)(e))return;const{id:t,accessHash:a}=n[e]||{};return t?{id:t,accessHash:a}:void 0},d=e=>{if(Object(m.lb)(e))return;const t=c[e];return t?{id:t.id}:void 0};return"contacts"!==t&&"nobody"!==t||(o=a.map(l).filter(Boolean),i=a.map(d).filter(Boolean),o.length>0&&(r.allowedUsers=o),i.length>0&&(r.allowedChats=i)),"everybody"!==t&&"contacts"!==t||(o=s.map(l).filter(Boolean),i=s.map(d).filter(Boolean),o.length>0&&(r.blockedUsers=o),i.length>0&&(r.blockedChats=i)),r}Object(s.b)("loadFullUser",(e,t,a)=>{const{userId:s}=a,n=Object(o.Fb)(e,s);if(!n)return;const{id:c,accessHash:r}=n;B(()=>Object(j.a)("fetchFullUser",{id:c,accessHash:r}))}),Object(s.b)("loadUser",(e,t,a)=>{const{userId:n}=a,c=Object(o.Fb)(e,n);c&&(async()=>{const t=await Object(j.a)("fetchUsers",{users:[c]});t&&(e=Object(s.e)(),e=Object(r.ob)(e,Object(d.c)(t,"id")),Object(s.g)(e))})()}),Object(s.b)("loadTopUsers",e=>{const{hash:t,lastRequestedAt:a}=e.topPeers;(!a||Date.now()-a>6e4)&&async function(e){const t=await Object(j.a)("fetchTopUsers",{hash:e});if(!t)return;const{hash:a,ids:n,users:c}=t;let o=Object(s.e)();o=Object(r.f)(o,Object(d.c)(c,"id")),o={...o,topPeers:{...o.topPeers,hash:a,userIds:n,lastRequestedAt:Date.now()}},Object(s.g)(o)}(t)}),Object(s.b)("loadContactList",e=>{const{hash:t}=e.contactList||{};!async function(e){const t=await Object(j.a)("fetchContactList",{hash:e});if(!t)return;let a=Object(r.f)(Object(s.e)(),Object(d.c)(t.users,"id"));a=Object(r.c)(a,Object(d.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(j.a)("fetchCurrentUser")}),Object(s.b)("updateContact",(e,t,a)=>{const{userId:n,isMuted:c,firstName:i,lastName:d}=a;!async function(e,t,a,n){const c=Object(s.e)(),i=Object(o.Fb)(c,e);if(!i)return;Object(s.d)().updateChatMutedState({chatId:e,isMuted:t}),Object(s.g)(Object(r.bb)(Object(s.e)(),l.f.InProgress));await Object(j.a)("updateContact",{phone:i.phoneNumber,firstName:a,lastName:n})&&Object(s.g)(Object(r.nb)(Object(s.e)(),i.id,{firstName:a,lastName:n}));Object(s.g)(Object(r.bb)(Object(s.e)(),l.f.Complete))}(n,c,i,d)}),Object(s.b)("deleteUser",(e,t,a)=>{const{userId:n}=a;!async function(e){const t=Object(s.e)(),a=Object(o.Fb)(t,e);if(!a)return;const{id:n,accessHash:c}=a;await Object(j.a)("deleteUser",{id:n,accessHash:c})}(n)}),Object(s.b)("loadProfilePhotos",(e,t,a)=>{const{profileId:n}=a,c=Object(m.lb)(n),i=c?Object(o.Fb)(e,n):void 0,l=c?void 0:Object(o.f)(e,n);(async()=>{const e=await Object(j.a)("fetchProfilePhotos",i,l);if(!e||!e.photos)return;let t=Object(s.e)();c?t=Object(r.nb)(t,n,{photos:e.photos}):(t=Object(r.f)(t,Object(d.c)(e.users,"id")),t=Object(r.H)(t,n,{photos:e.photos})),Object(s.g)(t)})()}),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.ib)||c.value.match(n.jb)?t.openTelegramLink({url:c.value}):t.toggleSafeLinkModal({url:c.value});break;case"callback":{const t=Object(o.r)(e);if(!t)return;!async function(e,t,a){const n=await Object(j.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)().showError({error:{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.r)(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.k)(e,a.id,s)),t.openPaymentModal({messageId:s}));break}}}),Object(s.b)("sendBotCommand",(e,t,a)=>{const{command:s}=a,{currentUserId:n}=e,c=Object(o.r)(e);n&&c&&async function(e,t,a){await Object(j.a)("sendMessage",{chat:e,text:a})}(c,0,s)}),Object(s.b)("updateProfile",(e,t,a)=>{const{photo:n,firstName:c,lastName:i,bio:d,username:b}=a;(async()=>{const{currentUserId:t}=e;if(t){if(Object(s.g)({...Object(s.e)(),profileEdit:{progress:l.j.InProgress}}),n&&await Object(j.a)("updateProfilePhoto",n),c||i||d){if(await Object(j.a)("updateProfile",{firstName:c,lastName:i,about:d})){e=Object(s.e)();const a=t&&Object(o.Fb)(e,t);a&&Object(s.g)(Object(r.nb)(e,a.id,{firstName:c,lastName:i,fullInfo:{...a.fullInfo,bio:d}}))}}if(b){await Object(j.a)("updateUsername",b)&&t&&Object(s.g)(Object(r.nb)(Object(s.e)(),t,{username:b}))}Object(s.g)({...Object(s.e)(),profileEdit:{progress:l.j.Complete}})}})()}),Object(s.b)("checkUsername",(e,t,a)=>{const{username:n}=a;(async()=>{if(e.profileEdit&&e.profileEdit.progress===l.j.InProgress)return;Object(s.g)({...e,profileEdit:{progress:e.profileEdit?e.profileEdit.progress:l.j.Idle,isUsernameAvailable:void 0}});const t=await Object(j.a)("checkUsername",n);e=Object(s.e)(),Object(s.g)({...e,profileEdit:{...e.profileEdit,isUsernameAvailable:t}})})()}),Object(s.b)("loadWallpapers",()=>{(async()=>{const e=await Object(j.a)("fetchWallpapers",0);if(!e)return;const t=Object(s.e)();Object(s.g)({...t,settings:{...t.settings,loadedWallpapers:e.wallpapers}})})()}),Object(s.b)("uploadWallpaper",(e,t,a)=>{const n=a,c=URL.createObjectURL(n);Object(s.g)({...e,settings:{...e.settings,loadedWallpapers:[{slug:l.n,document:{fileName:"",size:n.size,mimeType:n.type,previewBlobUrl:c}},...e.settings.loadedWallpapers||[]]}}),(async()=>{const t=await Object(j.a)("uploadWallpaper",n);if(!t)return;const{wallpaper:a}=t;if(!(e=Object(s.e)()).settings.loadedWallpapers)return;const r=e.settings.loadedWallpapers[0];if(!r||r.slug!==l.n)return;const o={...a,document:{...a.document,previewBlobUrl:c}};Object(s.g)({...e,settings:{...e.settings,loadedWallpapers:[o,...e.settings.loadedWallpapers.slice(1)]}})})()}),Object(s.b)("loadBlockedContacts",()=>{(async()=>{const e=await Object(j.a)("fetchBlockedContacts");if(!e)return;let t=Object(s.e)();e.users&&e.users.length&&(t=Object(r.f)(t,Object(d.c)(e.users,"id"))),e.chats&&e.chats.length&&(t=Object(r.M)(t,Object(d.c)(e.chats,"id"))),t={...t,blocked:{...t.blocked,ids:[...t.blocked.ids||[],...e.blockedIds],totalCount:e.totalCount}},Object(s.g)(t)})()}),Object(s.b)("blockContact",(e,t,a)=>{const{contactId:n}=a;(async()=>{if(!await Object(j.a)("blockContact",n))return;const e=Object(s.e)();Object(s.g)(Object(r.a)(e,n))})()}),Object(s.b)("unblockContact",(e,t,a)=>{const{contactId:n}=a;let c;if(Object(m.lb)(n)){const t=Object(o.Fb)(e,n);if(!t)return;c=t.accessHash}(async()=>{if(!await Object(j.a)("unblockContact",n,c))return;const e=Object(s.e)();Object(s.g)(Object(r.p)(e,n))})()}),Object(s.b)("loadAuthorizations",()=>{(async()=>{const e=await Object(j.a)("fetchAuthorizations");e&&Object(s.g)({...Object(s.e)(),activeSessions:e})})()}),Object(s.b)("terminateAuthorization",(e,t,a)=>{const{hash:n}=a;(async()=>{if(!await Object(j.a)("terminateAuthorization",n))return;const e=Object(s.e)();Object(s.g)({...e,activeSessions:e.activeSessions.filter(e=>e.hash!==n)})})()}),Object(s.b)("terminateAllAuthorizations",()=>{(async()=>{if(!await Object(j.a)("terminateAllAuthorizations"))return;const e=Object(s.e)();Object(s.g)({...e,activeSessions:e.activeSessions.filter(e=>e.isCurrent)})})()}),Object(s.b)("loadNotificationExceptions",()=>{Object(j.a)("fetchNotificationExceptions")}),Object(s.b)("loadNotificationSettings",()=>{(async()=>{const e=await Object(j.a)("fetchNotificationSettings");e&&Object(s.g)(Object(r.v)(Object(s.e)(),e))})()}),Object(s.b)("updateNotificationSettings",(e,t,a)=>{const{peerType:n,isSilent:c,shouldShowPreviews:o}=a;(async()=>{await Object(j.a)("updateNotificationSettings",n,{isSilent:c,shouldShowPreviews:o})&&Object(s.g)(Object(r.cb)(Object(s.e)(),n,c,o))})()}),Object(s.b)("updateContactSignUpNotification",(e,t,a)=>{const{isSilent:n}=a;(async()=>{await Object(j.a)("updateContactSignUpNotification",n)&&Object(s.g)(Object(r.v)(Object(s.e)(),{hasContactJoinedNotifications:!n}))})()}),Object(s.b)("loadLanguages",()=>{(async()=>{const e=await Object(j.a)("fetchLanguages");e&&Object(s.g)(Object(r.v)(Object(s.e)(),{languages:e}))})()}),Object(s.b)("loadPrivacySettings",()=>{(async()=>{const[e,t,a,n,c]=await Promise.all([Object(j.a)("fetchPrivacySettings","phoneNumber"),Object(j.a)("fetchPrivacySettings","lastSeen"),Object(j.a)("fetchPrivacySettings","profilePhoto"),Object(j.a)("fetchPrivacySettings","forwards"),Object(j.a)("fetchPrivacySettings","chatInvite")]);if(!(e&&t&&a&&n&&c))return;const r=Object(s.e)();r.settings.privacy.phoneNumber=e,r.settings.privacy.lastSeen=t,r.settings.privacy.profilePhoto=a,r.settings.privacy.forwards=n,r.settings.privacy.chatInvite=c,Object(s.g)(r)})()}),Object(s.b)("setPrivacyVisibility",(e,t,a)=>{const{privacyKey:n,visibility:c}=a,{privacy:{[n]:r}}=e.settings;if(!r)return;const o=U(e,{visibility:c,allowedIds:[...r.allowUserIds,...r.allowChatIds],deniedIds:[...r.blockUserIds,...r.blockChatIds]});(async()=>{const e=await Object(j.a)("setPrivacySettings",n,o);if(e){const t=Object(s.e)();t.settings.privacy[n]=e,Object(s.g)(t)}})()}),Object(s.b)("setPrivacySettings",(e,t,a)=>{const{privacyKey:n,isAllowList:c,contactsIds:r}=a,{privacy:{[n]:o}}=e.settings;if(!o)return;const i=U(e,{visibility:o.visibility,allowedIds:c?r:[...o.allowUserIds,...o.allowChatIds],deniedIds:c?[...o.blockUserIds,...o.blockChatIds]:r});(async()=>{const e=await Object(j.a)("setPrivacySettings",n,i);if(e){const t=Object(s.e)();t.settings.privacy[n]=e,Object(s.g)(t)}})()}),Object(s.b)("loadPasswordInfo",()=>{(async()=>{const e=await Object(j.a)("getPasswordInfo");if(!e)return;let t=Object(s.e)();t=Object(r.v)(t,{hasPassword:e.hasPassword}),t=Object(r.mb)(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.mb)(e,{isLoading:!0,error:void 0})),(async()=>{const e=await Object(j.a)("checkPassword",n);Object(s.g)(Object(r.mb)(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.mb)(e,{isLoading:!0,error:void 0})),(async()=>{const e=await Object(j.a)("clearPassword",n);Object(s.g)(Object(r.mb)(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.mb)(e,{isLoading:!0,error:void 0})),(async()=>{const e=await Object(j.a)("updatePassword",n,c,o,i);Object(s.g)(Object(r.mb)(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.mb)(e,{isLoading:!0,error:void 0})),(async()=>{const e=await Object(j.a)("updateRecoveryEmail",n,c);Object(s.g)(Object(r.mb)(Object(s.e)(),{isLoading:!1,waitingEmailCodeLength:void 0})),e&&o()})()}),Object(s.b)("provideTwoFaEmailCode",(e,t,a)=>{const{code:s}=a;Object(j.a)("provideRecoveryEmailCode",s)}),Object(s.b)("clearTwoFaError",e=>Object(r.mb)(e,{error:void 0}));var H=a(56);Object(s.b)("validateRequestedInfo",(e,t,a)=>{const{requestInfo:n,saveInfo:c}=a,i=Object(o.gb)(e);i&&async function(e,t,a){const n=await Object(j.a)("validateRequestedInfo",{messageId:e,requestInfo:t,shouldSave:a});if(!n)return;const{id:c,shippingOptions:o}=n;if(!c)return;let i=Object(r.E)(Object(s.e)(),c);o?(i=Object(r.gb)(i,o),i=Object(r.C)(i,l.i.Shipping)):i=Object(r.C)(i,l.i.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(j.a)("getPaymentForm",{messageId:e});if(!t)return;let a=Object(r.B)(Object(s.e)(),t),n=l.i.PaymentInfo;a.payment.invoice&&(a.payment.invoice.shippingAddressRequested||a.payment.invoice.nameRequested||a.payment.invoice.phoneRequested||a.payment.invoice.emailRequested)&&(n=l.i.ShippingInfo);a=Object(r.C)(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(j.a)("getReceipt",t);if(!n)return;let c=Object(s.e)();const i=Object(o.k)(c,a,e);c=Object(r.D)(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.jb)(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(H.b)(c.error),t=Object(s.e)();return void Object(s.g)({...t,payment:{...t.payment,error:{...e}}})}let o=Object(r.F)(Object(s.e)(),{type:c.type,id:c.id});o=Object(r.C)(o,l.i.Checkout),Object(s.g)(o)}(i,n)}),Object(s.b)("sendPaymentForm",(e,t,a)=>{const{shippingOptionId:n,saveCredentials:c}=a,i=Object(o.gb)(e),l=Object(o.hb)(e),d=Object(o.jb)(e),b=Object(o.yb)(e);i&&d&&async function(e,t,a,n){if(await Object(j.a)("sendPaymentForm",{messageId:e,credentials:t,requestedInfoId:a,shippingOptionId:n})){const e=Object(r.h)(Object(s.e)());Object(s.g)(Object(r.i)(e))}}(i,{save:c,data:b},l,n)}),Object(s.b)("setPaymentStep",(e,t,a={})=>Object(r.C)(e,a.step||l.i.ShippingInfo)),Object(s.b)("setInvoiceMessageInfo",(e,t,a)=>Object(r.A)(e,a));a(80);var q=a(26),G=a(72);const _=Object(g.g)(e=>e(),1e3,!0);Object(s.b)("apiUpdate",(e,t,a)=>{switch(a["@type"]){case"updateChat":{a.noTopChatsRequest||Object(o.L)(e,a.id)||t.loadTopChats();const n=Object(r.H)(e,a.id,a.chat,a.newProfilePhoto);Object(s.g)(n);const c=Object(o.q)(n);_(()=>Object(G.a)(c));break}case"updateChatJoin":{const n=Object(o.j)(e,a.id);if(!n)break;e=Object(r.I)(e,n,[a.id]),e=Object(r.H)(e,a.id,{isNotJoined:!1}),Object(s.g)(e);const c=Object(o.f)(e,a.id);c&&t.requestChatUpdate({chatId:c.id});break}case"updateChatLeave":{const t=Object(o.j)(e,a.id);if(!t)break;const{[t]:n}=e.chats.listIds;n&&(e=Object(r.r)(e,t,n.filter(e=>e!==a.id))),e=Object(r.H)(e,a.id,{isNotJoined:!0}),Object(s.g)(e);break}case"updateChatInbox":Object(s.g)(Object(r.H)(e,a.id,a.chat));break;case"updateChatTypingStatus":{const{id:t,typingStatus:n}=a;Object(s.g)(Object(r.H)(e,t,{typingStatus:n})),setTimeout(()=>{const e=Object(s.e)(),a=Object(o.f)(e,t);a&&n&&a.typingStatus&&a.typingStatus.timestamp===n.timestamp&&Object(s.g)(Object(r.H)(e,t,{typingStatus:void 0}))},6e3);break}case"newMessage":{const{message:n}=a,{chatId:c,threadId:l,type:d}=Object(o.y)(e)||{};if(n.senderId===e.currentUserId&&!n.isFromScheduled)return;const b=Object(o.f)(e,a.chatId);if(!b)return;const u="thread"===d&&l===i.MAIN_THREAD_ID&&a.chatId===c;u?setTimeout(()=>{t.requestChatUpdate({chatId:a.chatId})},1e3):Object(s.g)(Object(r.H)(e,a.chatId,{unreadCount:b.unreadCount?b.unreadCount+1:1,...a.message.hasUnreadMention&&{unreadMentionsCount:b.unreadMentionsCount?b.unreadMentionsCount+1:1}}));const m=Object(o.q)(Object(s.e)());Object(G.a)(m),Object(q.b)({chat:b,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.p)(e,t),n=Object(o.f)(e,s);n&&n.unreadMentionsCount&&(e=Object(r.H)(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.H)(e,a.id,{fullInfo:{...n.fullInfo,...t}}));break}case"updatePinnedChatIds":{const{ids:t,folderId:c}=a,r=c===n.h?"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.j)(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.L){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.K)(e,t,n));break}case"updateChatFolder":{const{id:t,folder:n}=a,{byId:c,orderedIds:r}=e.chatFolders,o=n?{...c,[t]:n}:Object(d.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.H)(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.H)(e,t,{photos:c.photos.filter(e=>!n.includes(e.id))}));break}}});function W(e,t,a,s,n=!1){const c=n?Object(o.ob)(e,t,a):Object(o.k)(e,t,a);if(c&&s.content){const{photo:e,video:t,sticker:a,document:n}=Object(m.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.eb)(e,t,a,s):Object(r.L)(e,t,a,s)}function $(e,t){const{id:a,chatId:s}=t;if(e=Object(r.V)(e,s,i.MAIN_THREAD_ID,[a]),Object(o.W)(e,s,i.MAIN_THREAD_ID)){const t=Object(o.G)(e,s,i.MAIN_THREAD_ID),n=Object(r.g)(e,s,i.MAIN_THREAD_ID,a),c=Object(o.Gb)(n,s,i.MAIN_THREAD_ID);t&&!c.includes(t)||(e=n)}const{threadInfo:n,firstMessageId:c}=Object(o.Ab)(e,s,t)||{};return!c&&Object(m.sb)(t)||n&&(e=Object(r.V)(e,s,n.threadId,[a]),Object(o.W)(e,s,n.threadId)&&(e=Object(r.g)(e,s,n.threadId,a),c||(e=Object(r.x)(e,s,n.threadId,"firstMessageId",t.id)),n.lastMessageId||(e=Object(r.x)(e,s,n.threadId,"threadInfo",{...n,lastMessageId:t.id})))),e}function V(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.H)(e,t,{lastMessage:a})}function z(e,t){const a=Object(o.m)(e,t),s=Object(o.X)(e,t,i.MAIN_THREAD_ID);if(!a||!s)return;let n=s.length;for(;n--;){const e=a[s[n]];if(!e.isDeleting)return e}}function Q(e,t,a,n){if(e){t.forEach(t=>{const a=z(n=Object(r.L)(n,e,t,{isDeleting:!0}),e);a&&(n=V(n,e,a,!0))}),Object(s.g)(n),a.requestChatUpdate({chatId:e});const c=[];return t.forEach(t=>{const a=Object(o.k)(n,e,t);if(!a)return;const{threadInfo:s}=Object(o.Ab)(n,e,a)||{};s&&c.push(s.threadId)}),Object(d.o)(c).forEach(t=>{a.requestThreadInfoUpdate({chatId:e,threadId:t})}),void setTimeout(()=>{Object(s.g)(Object(r.j)(Object(s.e)(),e,t))},350)}const c=[];t.forEach(e=>{const t=Object(o.p)(n,e);if(t){c.push(t);const a=z(n=Object(r.L)(n,t,e,{isDeleting:!0}),t);a&&(n=V(n,t,a,!0)),setTimeout(()=>{Object(s.g)(Object(r.j)(Object(s.e)(),t,[e]))},350)}}),Object(s.g)(n),Object(d.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=$(e=W(e,n,c,i),i),i.threadInfo&&(e=Object(r.kb)(e,i.threadInfo.chatId,i.threadInfo.threadId,i.threadInfo)),Object(s.g)(e);const l=Object(o.k)(e,n,c);if(Object(o.a)(e,n,i)){if(i.isOutgoing&&(!i.content||!i.content.action)){const a=Object(o.y)(e);a&&t.focusMessage({chatId:n,threadId:a.threadId,messageId:i.id,noHighlight:!0})}const{threadInfo:a}=Object(o.Ab)(e,n,i)||{};a&&t.requestThreadInfoUpdate({chatId:n,threadId:a.threadId}),i.isOutgoing||setTimeout(()=>{Object(s.g)(V(Object(s.e)(),n,l))},350)}else Object(s.g)(V(Object(s.e)(),n,l));Object(o.L)(e,n)||t.loadTopChats();break}case"newScheduledMessage":{const{chatId:t,id:n,message:c}=a;e=W(e,t,n,c,!0);const l=Object(o.nb)(e,t)||[];e=Object(r.x)(e,t,i.MAIN_THREAD_ID,"scheduledIds",Object(d.o)([...l,n])),Object(s.g)(e);break}case"updateMessage":{const{chatId:t,id:n,message:c}=a;if(!Object(o.k)(e,t,n))return;e=W(e,t,n,c);const i=Object(o.k)(e,t,n);c.threadInfo&&(e=Object(r.kb)(e,c.threadInfo.chatId,c.threadInfo.threadId,c.threadInfo)),e=V(e,t,i),Object(s.g)(e);break}case"updateScheduledMessage":{const{chatId:t,id:n,message:c}=a;if(!Object(o.ob)(e,t,n))return;e=W(e,t,n,c,!0);const l=Object.keys(Object(o.pb)(e,t)||{}).map(Number).sort((e,t)=>t-e);e=Object(r.x)(e,t,i.MAIN_THREAD_ID,"scheduledIds",l),Object(s.g)(e);break}case"updateMessageSendSucceeded":{const{chatId:t,localId:n,message:c}=a;e=$(e,c);const i=Object(o.k)(e,t,n);e=Object(r.j)(e,t,[n]),c.isScheduled&&(e=Object(r.k)(e,t,[n])),e=Object(r.L)(e,t,c.id,{...i,...c,previousLocalId:n});const l=Object(o.k)(e,t,c.id);e=V(e,t,l),Object(s.g)(e);break}case"updateScheduledMessageSendSucceeded":{const{chatId:t,localId:n,message:c}=a,l=Object(o.nb)(e,t)||[];e=Object(r.x)(e,t,i.MAIN_THREAD_ID,"scheduledIds",[...l,c.id]);const d=Object(o.ob)(e,t,n);e=Object(r.k)(e,t,[n]),e=Object(r.eb)(e,t,c.id,{...d,...c,previousLocalId:n}),Object(s.g)(e);break}case"updatePinnedIds":{const{chatId:t,isPinned:n,messageIds:c}=a,l=Object(o.ib)(e,t)||[],d=n?[...l,...c].sort((e,t)=>t-e):l.filter(e=>!c.includes(e));Object(s.g)(Object(r.x)(e,t,i.MAIN_THREAD_ID,"pinnedIds",d));break}case"updateThreadInfo":{const{chatId:t,threadId:n,threadInfo:c,firstMessageId:i}=a,l={...Object(o.Bb)(e,t,n),...c};if(!l.threadId)return;e=Object(r.kb)(e,t,n,l),i&&(e=Object(r.x)(e,t,n,"firstMessageId",i)),Object(s.g)(e);break}case"resetMessages":{const{id:n}=a,c=Object(o.m)(e,n);c&&!Object(m.lb)(n)&&(e=Object(r.j)(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;Q(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.eb)(n,e,t,{isDeleting:!0})}),Object(s.g)(n),setTimeout(()=>{n=Object(r.k)(Object(s.e)(),e,t);const a=Object(o.pb)(n,e);n=Object(r.x)(n,e,i.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;Q(s,Object.keys(e.messages.byChatId[s].byId).map(Number),t,e);break}case"updateCommonBoxMessages":{const{ids:t,messageUpdate:n}=a;t.forEach(t=>{const a=Object(o.p)(e,t);a&&(e=Object(r.L)(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.L)(e,t,a,c)}),Object(s.g)(e);break}case"updateMessagePoll":{const{pollId:t,pollUpdate:n}=a,c=Object(o.l)(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.L)(e,c.chatId,c.id,{content:{...c.content,poll:t}}))}break}case"updateMessagePollVote":{const{pollId:t,userId:n,options:c}=a,i=Object(o.l)(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.L)(e,i.chatId,i.id,{content:{...i.content,poll:{...l,results:{...l.results,recentVoterIds:m,totalVoters:h,results:O}}}}));break}}});const K=Object(g.g)((function(){let e=Object(s.e)();Y.forEach(([t,a])=>{e=Object(r.nb)(e,t,{status:a})}),Object(s.g)(e),Y=[]}),3e3,!0);let Y=[];Object(s.b)("apiUpdate",(e,t,a)=>{switch(a["@type"]){case"deleteUser":return Object(r.l)(e,a.id);case"updateUser":return Object(r.nb)(e,a.id,a.user);case"updateUserStatus":return s=a.userId,n=a.status,Y.push([s,n]),void K();case"updateUserFullInfo":{const{id:t,fullInfo:s}=a,n=e.users.byId[t];if(!n)return;return Object(r.nb)(e,t,{fullInfo:{...n.fullInfo,...s}})}}var s,n}),Object(s.b)("apiUpdate",(e,t,a)=>{switch(a["@type"]){case"updateStickerSet":return Object(r.hb)(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.p)(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.cb)(e,a.peerType,a.isSilent,a.shouldShowPreviews);case"updateNotifyExceptions":{const{id:t,isMuted:n,isSilent:c,shouldShowPreviews:o}=a;e.chats.byId[t]&&(e=Object(r.H)(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 J=a(45),X=a(8),Z=a(32),ee=a(126),te=a(44),ae=a(105),se=a(71),ne=a(99),ce=a(58),re=a(38),oe=a(29),ie=a(149),le=a(136);a(192);var de=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(X.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(193);const be=[0,1,2];var ue=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,{theme:o,animationLevel:i}=e.settings.byKey;return{searchQuery:t,isLoading:!!a&&Boolean(a.chats||a.messages),currentUserId:c,chatsById:r,globalSearchChatId:s,searchDate:n,theme:o,animationLevel:i}},(e,t)=>Object(d.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:u,currentUserId:O,globalSearchChatId:j,searchDate:g,theme:f,animationLevel:p,chatsById:I,openChat:v,openTipsChat:y,setGlobalSearchDate:E,setSettingOption:C})=>{const w=Object(ne.a)(),M=e===l.d.ChatList,S={date:void 0},k={id:void 0},N=Object(c.p)(()=>g?Object(x.a)(new Date(1e3*g)):void 0,[g]),P=Object(c.p)(()=>M&&I?Object.values(I).reduce((e,t)=>Object(m.hb)(t)&&t.unreadCount?e+1:e,0):0,[M,I]),T=Object(c.p)(()=>({onTrigger:e,isOpen:t})=>c.a.createElement(oe.a,{round:!0,ripple:M&&!h.g,size:"smaller",color:"translucent",className:t?"active":"",onClick:M?e:()=>d(),ariaLabel:M?w("AccDescrOpenMenu2"):"Return to chat list"},c.a.createElement("div",{className:Object(X.a)("animated-menu-icon",!M&&"state-back")})),[M,w,d]),A=Object(c.m)(()=>{b||a("")},[b,a]),L=Object(c.m)(()=>{v({id:O})},[O,v]),R=Object(c.m)(e=>{e.stopPropagation();const t="light"===f?"dark":"light";C({theme:t}),Object(se.a)(t,p>0)},[p,C,f]),F=Object(c.m)(e=>{e.stopPropagation();const t=0===p?2:0;be.forEach((e,a)=>{document.body.classList.toggle("animation-level-"+a,t===a)}),C({animationLevel:t})},[p,C]),D=Boolean(j)||e===l.d.GlobalSearch||e===l.d.Contacts,B=e===l.d.Contacts?w("SearchFriends"):w("Search");return c.a.createElement("div",{className:"LeftMainHeader"},c.a.createElement("div",{id:"LeftMainHeader",className:"left-header"},c.a.createElement(ce.a,{trigger:T,footer:`${n.f} ${n.g}`},c.a.createElement(re.a,{icon:"saved-messages",onClick:L},w("SavedMessages")),c.a.createElement(re.a,{icon:"archive",onClick:o},c.a.createElement("span",{className:"menu-item-name"},w("ArchivedChats")),P>0&&c.a.createElement("div",{className:"archived-badge"},P)),c.a.createElement(re.a,{icon:"user",onClick:r},w("Contacts")),c.a.createElement(re.a,{icon:"settings",onClick:s},w("Settings")),c.a.createElement(re.a,{icon:"darkmode",onClick:R},c.a.createElement("span",{className:"menu-item-name"},w("lng_menu_night_mode")),c.a.createElement(de,{id:"darkmode",label:w("dark"===f?"lng_settings_disable_night_theme":"lng_settings_enable_night_theme"),checked:"dark"===f,noAnimation:!0})),c.a.createElement(re.a,{icon:"animations",onClick:F},c.a.createElement("span",{className:"menu-item-name capitalize"},w("Appearance.Animations").toLowerCase()),c.a.createElement(de,{id:"animations",label:"Toggle Animations",checked:p>0})),c.a.createElement(re.a,{icon:"help",onClick:y},w("TelegramFeatures")),c.a.createElement(re.a,{icon:"bug",href:n.x},"Report Bug"),c.a.createElement(re.a,{icon:"char-K",href:"https://web.telegram.org/k/"},"Switch to WebK"),c.a.createElement(re.a,{icon:"char-W",href:"https://web.telegram.org/"},"Switch to Webogram")),c.a.createElement(ie.a,{inputId:"telegram-search-input",className:j||g?"with-picker-item":"",value:t||b,focused:D,isLoading:u,placeholder:B,canClose:Boolean(j||g),onChange:a,onReset:d,onFocus:A},N&&c.a.createElement(le.a,{icon:"calendar",title:N,canClose:!0,isMinimized:Boolean(j),className:"search-date",onClick:E,clickArg:S}),j&&c.a.createElement(le.a,{chatOrUserId:j,onClick:i,canClose:!0,clickArg:k}))))})),me=a(20);a(194);var he=Object(s.h)(e=>Object(d.l)(e,["connectionState"]))(({connectionState:e})=>{const t=Object(ne.a)();return"connectionStateConnecting"===e&&c.a.createElement("div",{id:"ConnectionState"},c.a.createElement(me.a,{color:"black"}),c.a.createElement("div",{className:"state-text"},t("WaitingForNetwork")))}),Oe=a(127),je=a(108),ge=a(35),fe=(e,t,a)=>{const s=Object(c.q)(),n=(e=>Object(c.p)(()=>Object(g.g)(e=>e(),e),[e]))(t),r=Object(ge.a)();return Object(je.a)(()=>{let t=!0;n(()=>{s.current=e(),t||r()}),t=!1},a),s.current},pe=a(163),Ie=a(184);var ve=Object(c.h)(Object(s.h)(e=>{const{chats:{byId:t},users:{byId:a},chatFolders:{byId:s,orderedIds:n},lastSyncTime:c}=e;return{chatsById:t,usersById:a,chatFoldersById:s,orderedFolderIds:n,lastSyncTime:c,notifySettings:Object(o.db)(e),notifyExceptions:Object(o.cb)(e)}},(e,t)=>Object(d.l)(t,["loadChatFolders"]))(({chatsById:e,usersById:t,chatFoldersById:a,notifySettings:s,notifyExceptions:n,orderedFolderIds:r,lastSyncTime:o,loadChatFolders:i})=>{const l=Object(c.q)(null),b=Object(ne.a)(),[u,O]=Object(c.r)(0);Object(c.n)(()=>{o&&i()},[o,i]);const j=Object(c.p)(()=>r?r.map(e=>a[e]||{}).filter(Boolean):void 0,[a,r]),g=fe(()=>{if(!j||!j.length)return;const a=Object.keys(e).map(Number),c=j.map(c=>{const{unreadDialogsCount:r,hasActiveDialogs:o}=Object(m.p)(e,t,c,a,s,n)||{};return{id:c.id,badgeCount:r,isBadgeActive:o}});return Object(d.c)(c,"id")},3e3,[j,e,t,s,n]),f=Object(c.p)(()=>{if(j&&j.length)return[{title:b("FilterAllChats")},...j.map(e=>({title:e.title,...g&&g[e.id]}))]},[j,g,b]),p=Object(c.m)(e=>{O(e)},[]);Object(c.n)(()=>{f&&f.length&&u>=f.length&&O(0)},[u,f]),Object(c.n)(()=>{if(l.current&&h.l&&f&&f.length)return Object(Oe.b)(l.current,{onSwipe:(e,t)=>{t===Oe.a.Left?O(Math.min(u+1,f.length-1)):t===Oe.a.Right&&O(Math.max(0,u-1))}})},[u,f]);const I=Object(c.q)();I.current=0!==u,Object(c.n)(()=>Object(te.a)(()=>{I.current&&O(0)}),[]);const{shouldRender:v,transitionClassNames:y}=Object(Z.a)(!r,void 0,!0);function E(){const e=Object.values(a).find(({title:e})=>e===f[u].title);return e&&0!==u?c.a.createElement(Ie.a,{folderType:"folder",folderId:e.id,noChatsText:b("FilterNoChatsToDisplay")}):c.a.createElement(Ie.a,{folderType:"all"})}return c.a.createElement("div",{className:"ChatFolders"},f&&f.length?c.a.createElement(pe.a,{tabs:f,activeTab:u,onSwitchTab:p}):v?c.a.createElement("div",{className:Object(X.a)("tabs-placeholder",y)}):void 0,c.a.createElement(ae.a,{ref:l,name:"slide",activeKey:u,renderCount:f?f.length:void 0},E))})),ye=a(11),Ee=a(16),Ce=a(15);var we=Object(c.h)(e=>{const t=Object(Ee.a)(ye.a.Extra,"LeftSearch");return t?c.a.createElement(t,e):c.a.createElement(Ce.a,null)});var Me=Object(c.h)(e=>{const t=Object(Ee.a)(ye.a.Extra,"ContactList");return t?c.a.createElement(t,e):c.a.createElement(Ce.a,null)}),Se=a(49);a(206);let ke;var Ne=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(ne.a)(),i=Object(X.a)("NewChatButton",e&&"revealed",n&&"menu-is-open"),l=Object(c.m)(()=>{ke&&(clearTimeout(ke),ke=void 0)},[]),d=Object(c.m)(()=>{ke&&(clearTimeout(ke),ke=void 0),ke=window.setTimeout(()=>{r(!1)},750)},[]);return c.a.createElement("div",{className:i,onMouseEnter:l,onMouseLeave:d},c.a.createElement(oe.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(Se.a,{isOpen:n,positionX:"right",positionY:"bottom",autoClose:!0,onClose:()=>{r(!1)}},c.a.createElement(re.a,{icon:"channel",onClick:a},o("NewChannel")),c.a.createElement(re.a,{icon:"group",onClick:s},o("NewGroup")),c.a.createElement(re.a,{icon:"user",onClick:t},o("NewMessageTitle"))))});a(207);const Pe=Object.keys(l.d).length/2;let Te;var Ae=Object(c.h)(({content:e,searchQuery:t,searchDate:a,contactsFilter:s,onSearchQuery:n,onContentChange:r,onReset:o})=>{const[i,d]=Object(c.r)(h.l),b=Object(c.q)(!1),u=Object(c.m)(()=>{r(l.d.Settings)},[r]),m=Object(c.m)(()=>{r(l.d.Contacts)},[r]),O=Object(c.m)(()=>{r(l.d.NewChannelStep1)},[r]),j=Object(c.m)(()=>{r(l.d.NewGroupStep1)},[r]),g=Object(c.m)(()=>{r(l.d.Archived)},[r]),f=Object(c.m)(()=>{e===l.d.ChatList&&(b.current=!0,d(!0))},[e]),p=Object(c.m)(()=>{b.current=!1,Te&&(clearTimeout(Te),Te=void 0),Te=window.setTimeout(()=>{b.current||d(!1)},250)},[]);return Object(c.n)(()=>{let t;return e!==l.d.ChatList?t=window.setTimeout(()=>{d(!1)},250):(b.current||h.l)&&d(!0),()=>{t&&(clearTimeout(t),t=void 0)}},[e]),c.a.createElement("div",{id:"LeftColumn-main",onMouseEnter:h.l?void 0:f,onMouseLeave:h.l?void 0:p},c.a.createElement(ue,{content:e,contactsFilter:s,onSearchQuery:n,onSelectSettings:u,onSelectContacts:m,onSelectArchived:g,onReset:o}),c.a.createElement(he,null),c.a.createElement(ae.a,{name:"zoom-fade",renderCount:Pe,activeKey:e},()=>{switch(e){case l.d.ChatList:return c.a.createElement(ve,null);case l.d.GlobalSearch:return c.a.createElement(we,{searchQuery:t,searchDate:a,onReset:o});case l.d.Contacts:return c.a.createElement(Me,{filter:s});default:return}}),c.a.createElement(Ne,{isShown:i,onNewPrivateChat:m,onNewChannel:O,onNewGroup:j}))});var xe=Object(c.h)(e=>{const t=Object(Ee.a)(ye.a.Extra,"Settings");return t?c.a.createElement(t,e):c.a.createElement(Ce.a,null)});var Le=Object(c.h)(e=>{const t=Object(Ee.a)(ye.a.Extra,"NewChat");return t?c.a.createElement(t,e):c.a.createElement(Ce.a,null)});var Re,Fe=Object(c.h)(e=>{const t=Object(Ee.a)(ye.a.Extra,"ArchivedChats");return t?c.a.createElement(t,e):c.a.createElement(Ce.a,null)});a(208);!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"}(Re||(Re={}));const De=Object.keys(Re).length/2;var Be=Object(c.h)(Object(s.h)(e=>{const{query:t,date:a}=e.globalSearch;return{searchQuery:t,searchDate:a}},(e,t)=>Object(d.l)(t,["setGlobalSearchQuery","setGlobalSearchChatId","resetChatCreation","setGlobalSearchDate","loadPasswordInfo","clearTwoFaError"]))(({searchQuery:e,searchDate:t,setGlobalSearchQuery:a,setGlobalSearchChatId:s,resetChatCreation:n,setGlobalSearchDate:r,loadPasswordInfo:o,clearTwoFaError:i})=>{const[d,b]=Object(c.r)(l.d.ChatList),[u,m]=Object(c.r)(l.m.Main),[O,j]=Object(c.r)(""),[g,f]=Object(c.r)(0);let p=Re.Main;switch(d){case l.d.Archived:p=Re.Archived;break;case l.d.Settings:p=Re.Settings;break;case l.d.NewChannelStep1:case l.d.NewChannelStep2:p=Re.NewChannel;break;case l.d.NewGroupStep1:case l.d.NewGroupStep2:p=Re.NewGroup}const I=Object(c.m)(e=>{if(d!==l.d.NewGroupStep2||e){if(d===l.d.NewGroupStep1){const e=document.getElementById("new-group-picker-search");e&&e.blur()}if(d===l.d.Settings)switch(u){case l.m.EditProfile:case l.m.Folders:case l.m.General:case l.m.Notifications:case l.m.Privacy:case l.m.Language:return void m(l.m.Main);case l.m.GeneralChatBackground:return void m(l.m.General);case l.m.GeneralChatBackgroundColor:return void m(l.m.GeneralChatBackground);case l.m.PrivacyPhoneNumber:case l.m.PrivacyLastSeen:case l.m.PrivacyProfilePhoto:case l.m.PrivacyForwarding:case l.m.PrivacyGroupChats:case l.m.PrivacyActiveSessions:case l.m.PrivacyBlockedUsers:case l.m.TwoFaDisabled:case l.m.TwoFaEnabled:case l.m.TwoFaCongratulations:return void m(l.m.Privacy);case l.m.PrivacyPhoneNumberAllowedContacts:case l.m.PrivacyPhoneNumberDeniedContacts:return void m(l.m.PrivacyPhoneNumber);case l.m.PrivacyLastSeenAllowedContacts:case l.m.PrivacyLastSeenDeniedContacts:return void m(l.m.PrivacyLastSeen);case l.m.PrivacyProfilePhotoAllowedContacts:case l.m.PrivacyProfilePhotoDeniedContacts:return void m(l.m.PrivacyProfilePhoto);case l.m.PrivacyForwardingAllowedContacts:case l.m.PrivacyForwardingDeniedContacts:return void m(l.m.PrivacyForwarding);case l.m.PrivacyGroupChatsAllowedContacts:case l.m.PrivacyGroupChatsDeniedContacts:return void m(l.m.PrivacyGroupChats);case l.m.TwoFaNewPassword:return void m(l.m.TwoFaDisabled);case l.m.TwoFaNewPasswordConfirm:return void m(l.m.TwoFaNewPassword);case l.m.TwoFaNewPasswordHint:return void m(l.m.TwoFaNewPasswordConfirm);case l.m.TwoFaNewPasswordEmail:return void m(l.m.TwoFaNewPasswordHint);case l.m.TwoFaNewPasswordEmailCode:return void m(l.m.TwoFaNewPasswordEmail);case l.m.TwoFaChangePasswordCurrent:case l.m.TwoFaTurnOff:case l.m.TwoFaRecoveryEmailCurrentPassword:return void m(l.m.TwoFaEnabled);case l.m.TwoFaChangePasswordNew:return void m(l.m.TwoFaChangePasswordCurrent);case l.m.TwoFaChangePasswordConfirm:return void m(l.m.TwoFaChangePasswordNew);case l.m.TwoFaChangePasswordHint:return void m(l.m.TwoFaChangePasswordConfirm);case l.m.TwoFaRecoveryEmail:return void m(l.m.TwoFaRecoveryEmailCurrentPassword);case l.m.TwoFaRecoveryEmailCode:return void m(l.m.TwoFaRecoveryEmail);case l.m.FoldersCreateFolder:case l.m.FoldersEditFolder:return void m(l.m.Folders)}b(l.d.ChatList),j(""),a({query:""}),r({date:void 0}),s({id:void 0}),n(),setTimeout(()=>{f(Date.now())},250)}else b(l.d.NewGroupStep1)},[d,a,s,r,n,u]),v=Object(c.m)(t=>{d!==l.d.Contacts?(b(l.d.GlobalSearch),t!==e&&a({query:t})):j(t)},[d,a,e]);return Object(c.n)(()=>d!==l.d.ChatList?Object(te.a)(()=>I()):void 0,[d,I]),Object(c.n)(()=>{i(),u===l.m.Privacy&&o()},[i,o,u]),c.a.createElement(ae.a,{id:"LeftColumn",name:h.g?"slide-layers":"push-slide",renderCount:De,activeKey:p},()=>{switch(p){case Re.Archived:return c.a.createElement(Fe,{onReset:I});case Re.Settings:return c.a.createElement(xe,{currentScreen:u,onScreenSelect:m,onReset:I});case Re.NewChannel:return c.a.createElement(Le,{key:g,isChannel:!0,content:d,onContentChange:b,onReset:I});case Re.NewGroup:return c.a.createElement(Le,{key:g,content:d,onContentChange:b,onReset:I});default:return c.a.createElement(Ae,{content:d,searchQuery:e,searchDate:t,contactsFilter:O,onContentChange:b,onSearchQuery:v,onReset:I})}})})),Ue=a(134),He=a(12),qe=a(13),Ge=a(52);var _e=()=>{const[e,t]=Object(c.r)(Ge.a.get());return Object(c.n)(()=>{const e=Object(g.g)(()=>{t(Ge.a.get())},250,!1);return window.addEventListener("resize",e),()=>{window.removeEventListener("resize",e)}},[]),e},We=a(170);function $e(e,t){const a=e<=n.eb?16:32,s=function(e){if(e>n.bb){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.ab){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.eb?54:64,r=t?s-a-c:s-a,o=e>n.eb?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}}var Ve=a(129),ze=a(139),Qe=a(130),Ke=a(46),Ye=a(103),Je=a(118);var Xe=Object(c.h)(e=>{const{isOpen:t}=e,a=Object(Ee.a)(ye.a.Extra,"HeaderMenuContainer",!t);return a?c.a.createElement(a,e):void 0});var Ze=Object(c.h)(Object(s.h)((e,{chatId:t,threadId:a,messageListType:s})=>{const n=Object(o.f)(e,t),c=Boolean(n&&Object(m.jb)(n));if(n&&n.isRestricted)return{noMenu:!0};const r=Object(o.O)(e,t),l="thread"===s&&a===i.MAIN_THREAD_ID,d="thread"===s&&a!==i.MAIN_THREAD_ID,b=Object(o.V)(e),u=Boolean(Object(o.K)(e,t)),O=Boolean(l&&n&&(c||Object(m.nb)(n))&&n.isNotJoined),j=l||d,g=l&&!r&&!O,f=!Object(o.R)(e),p=l&&!O;return{noMenu:!(h.g&&O||h.g&&j||g||f||p),isChannel:c,isRightColumnShown:b,canStartBot:u,canSubscribe:O,canSearch:j,canMute:g,canSelect:f,canLeave:p}},(e,t)=>Object(d.l)(t,["joinChannel","sendBotCommand","openLocalTextSearch"]))(({chatId:e,threadId:t,noMenu:a,isChannel:s,canStartBot:n,canSubscribe:r,canSearch:o,canMute:i,canSelect:l,canLeave:d,isRightColumnShown:b,joinChannel:u,sendBotCommand:m,openLocalTextSearch:O})=>{const j=Object(c.q)(null),[g,f]=Object(c.r)(!1),[p,I]=Object(c.r)(void 0),v=Object(c.m)(()=>{f(!0);const e=j.current.getBoundingClientRect();I({x:e.right,y:e.bottom})},[]),y=Object(c.m)(()=>{f(!1)},[]),E=Object(c.m)(()=>{I(void 0)},[]),C=Object(c.m)(()=>{u({chatId:e})},[u,e]),w=Object(c.m)(()=>{m({command:"/start"})},[m]),M=Object(c.m)(()=>{if(O(),h.g){document.querySelector("#MobileSearch input").focus()}else setTimeout(()=>{const e=document.querySelector(".RightHeader .SearchInput input");e&&e.focus()},400)},[O]),S=Object(ne.a)();return c.a.createElement("div",{className:"HeaderActions"},!h.g&&r&&c.a.createElement(oe.a,{size:"tiny",ripple:!0,fluid:!0,onClick:C},S(s?"Subscribe":"Join Group")),!h.g&&n&&c.a.createElement(oe.a,{size:"tiny",ripple:!0,fluid:!0,onClick:w},S("Start")),!h.g&&o&&c.a.createElement(oe.a,{round:!0,ripple:b,color:"translucent",size:"smaller",onClick:M,ariaLabel:"Search in this chat"},c.a.createElement("i",{className:"icon-search"})),(h.g||!r)&&c.a.createElement(oe.a,{ref:j,className:g?"active":"",round:!0,ripple:!h.g,size:"smaller",color:"translucent",disabled:a,ariaLabel:"More actions",onClick:v},c.a.createElement("i",{className:"icon-more"})),p&&c.a.createElement(Xe,{chatId:e,threadId:t,isOpen:g,anchor:p,isChannel:s,canSubscribe:r,canSearch:o,canMute:i,canSelect:l,canLeave:d,onSubscribeChannel:C,onSearchClick:M,onClose:y,onCloseAnimationEnd:E}))})),et=a(110),tt=a(22),at=a(102),st=a(40);function nt(e){const t=e&&Object(m.E)(e),{sticker:a}=e&&e.content||{},s=t&&a&&!Object(h.p)()&&t.includes("image/webp"),[r,o]=Object(c.r)(st.a),i=e&&e.id;return Object(c.o)(()=>{s&&Object(st.c)("b64-"+i,t).then(o).catch(e=>{n.p&&console.error(e)})},[i,s,t]),s?r:t}var ct=a(112),rt=a(39),ot=a(31);function it(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 lt=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=it(0,0,2,t,1)+it(0,12,2,t+1,1)+it(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(X.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 dt=Object(c.h)(({message:e,count:t,index:a,customTitle:s,className:n,onUnpinMessage:r,onClick:o,onAllPinnedClick:i})=>{const l=Object(ne.a)(),d=nt(e),b=Object(at.a)(Object(m.D)(e,"pictogram")),u=Object(m.N)(l,e,Boolean(d)),[h,O,j]=Object(ot.a)(),g=Object(c.m)(()=>{j(),r&&r(e.id)},[j,r,e.id]);return c.a.createElement("div",{className:Object(X.a)("HeaderPinnedMessage-wrapper",n)},t>1&&c.a.createElement(oe.a,{round:!0,size:"smaller",color:"translucent",className:"pin-list-button",ariaLabel:l("EventLogFilterPinnedMessages"),onClick:i},c.a.createElement("i",{className:"icon-pin-list"})),r&&c.a.createElement(oe.a,{round:!0,size:"smaller",color:"translucent",ariaLabel:l("UnpinMessageAlertTitle"),className:"unpin-button",onClick:O},c.a.createElement("i",{className:"icon-close"})),c.a.createElement(ct.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},c.a.createElement(lt,{count:t,index:a}),d&&function(e,t){const{width:a,height:s}=Object(et.k)();return c.a.createElement("img",{src:t||e,width:a,height:s,alt:""})}(d,b),c.a.createElement("div",{className:"message-text"},c.a.createElement("div",{className:"title",dir:"auto"},s||`${l("PinnedMessage")} ${a>0?"#"+(t-a):""}`),c.a.createElement("p",{dir:"auto"},Object(tt.a)(u))),c.a.createElement(rt.a,null)))}),bt=a(50),ut=a(171);a(211);var mt=Object(s.h)((e,{message:t})=>({sender:Object(o.sb)(e,t)}),(e,t)=>Object(d.l)(t,["focusMessage","closeAudioPlayer"]))(({message:e,className:t,noUi:a,sender:s,focusMessage:n,closeAudioPlayer:r})=>{const o=Object(ne.a)(),i=s?Object(m.V)(o,s):void 0,l=bt.c(Object(m.D)(e,"inline")),{playPause:d,isPlaying:b}=Object(ut.a)(Object(m.A)(e),Object(m.r)(e),l,void 0,void 0,!0),u=Object(c.m)(()=>{n({chatId:e.chatId,messageId:e.id})},[n,e.chatId,e.id]),O=Object(c.m)(()=>{b&&d(),r()},[r,b,d]);if(a)return;const j=Object(m.u)(e);return c.a.createElement("div",{className:Object(X.a)("AudioPlayer",t)},c.a.createElement(oe.a,{round:!0,ripple:!h.g,color:"translucent",size:"smaller",className:Object(X.a)("toggle-play",b?"pause":"play"),onClick:d,ariaLabel:b?"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:u},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(tt.a)(t||s)),a&&c.a.createElement("div",{className:"subtitle",dir:"auto"},Object(tt.a)(a)))}(j):function(e,t){return c.a.createElement(c.a.Fragment,null,c.a.createElement("div",{className:"title",dir:"auto"},t&&Object(tt.a)(t)),c.a.createElement("div",{className:"subtitle",dir:"auto"},e))}(o("AttachAudio"),i),c.a.createElement(rt.a,null)),c.a.createElement(oe.a,{round:!0,className:"player-close",color:"translucent",size:"smaller",onClick:O,ariaLabel:"Close player"},c.a.createElement("i",{className:"icon-close"})))});a(212);var ht=Object(c.h)(Object(s.h)((e,{chatId:t,threadId:a,messageListType:s})=>{const{isLeftColumnShown:n,lastSyncTime:c}=e,{byId:r}=e.chats,l=Object(o.f)(e,t),{typingStatus:d}=l||{},{chatId:b,messageId:u}=e.audioPlayer,m=b&&u?Object(o.k)(e,b,u):void 0,h=Object(o.Cb)(e,t,a);let O;if("pinned"===s){const a=Object(o.ib)(e,t);O=a&&a.length}else if("scheduled"===s){const a=Object(o.nb)(e,t);O=a&&a.length}else if("thread"===s&&a!==i.MAIN_THREAD_ID){const s=Object(o.Bb)(e,t,a);s&&(O=s.messagesCount)}const j={typingStatus:d,isLeftColumnShown:n,isRightColumnShown:Object(o.V)(e),isSelectModeActive:Object(o.R)(e),audioMessage:m,chat:l,chatsById:r,originChatId:h?h.id:t,messagesCount:O,isChatWithSelf:Object(o.O)(e,t),isChatWithBot:l&&Object(o.N)(e,l),lastSyncTime:c,notifySettings:Object(o.db)(e),notifyExceptions:Object(o.cb)(e)},g=Object(o.m)(e,t);if("thread"!==s||!g)return j;if(Object.assign(j,{messagesById:g}),a!==i.MAIN_THREAD_ID){const s=Object(o.Db)(e,t,a),n=s?Object(o.k)(e,t,s):void 0,c=n?Object(o.J)(e,n):void 0;return{...j,pinnedMessageIds:s,canUnpin:!1,topMessageSender:c}}const f=Object(o.ib)(e,t);if(f&&f.length){const t=g[f[0]],{canUnpin:s}=t&&Object(o.b)(e,t,a)||{};return{...j,pinnedMessageIds:f,canUnpin:s}}return j},(e,t)=>Object(d.l)(t,["openChatWithInfo","pinMessage","focusMessage","openChat","loadPinnedMessages","toggleLeftColumn","exitMessageSelectMode"]))(({chatId:e,threadId:t,messageListType:a,pinnedMessageIds:s,messagesById:r,canUnpin:o,topMessageSender:l,typingStatus:d,isSelectModeActive:b,isLeftColumnShown:u,isRightColumnShown:O,audioMessage:j,chat:g,chatsById:f,originChatId:p,messagesCount:I,isChatWithSelf:v,isChatWithBot:y,lastSyncTime:E,notifySettings:C,notifyExceptions:w,openChatWithInfo:M,pinMessage:S,focusMessage:k,openChat:N,loadPinnedMessages:P,toggleLeftColumn:T,exitMessageSelectMode:A})=>{const x=Object(ne.a)(),[L,R]=Object(c.r)(0),F=Array.isArray(s)?s[L]:s,D=r&&F?r[F]:void 0,B=Array.isArray(s)?s.length:s?1:0,U=g&&Object(m.l)(x,g).length,H=l?Object(m.V)(x,l):void 0;Object(c.n)(()=>{t===i.MAIN_THREAD_ID&&E&&P({chatId:e})},[e,P,E,t]),Object(c.n)(()=>{R(0)},[s]),Object(ze.a)(e,F,D);const{width:q}=_e(),G=q<=n.ab,_=q>=n.eb&&u,W=Object(c.q)(null),$=Object(c.q)(!0),V=Object(c.m)(()=>{M({id:e})},[M,e]),z=Object(c.m)(t=>{S({chatId:e,messageId:t,isUnpin:!0})},[S,e]),Q=Object(c.m)(()=>{if(D){k({chatId:D.chatId,threadId:t,messageId:D.id});const e=Object(Ve.a)(B,L+1);R(e)}},[D,k,t,B,L]),K=Object(c.m)(()=>{N({id:e,threadId:i.MAIN_THREAD_ID,type:"pinned"})},[N,e]),Y=Object(c.m)(()=>{if(h.g){const e=document.getElementById(n.v);e&&e.blur()}t!==i.MAIN_THREAD_ID||"thread"!==a?("scheduled"===a&&b&&A(),N({id:p,threadId:i.MAIN_THREAD_ID})):h.g?N({id:void 0}):T()},[N,p,t,a,T,b,A]),J=Object(c.p)(()=>{if(!G||!f)return;let e=!1;const t=Object.values(f).reduce((t,a)=>{if(Object(m.hb)(a))return t;const s=a.unreadCount||0;return!s||Object(m.Cb)(a,C,w)&&!a.unreadMentionsCount||(e=!0),t+s},0);return t?{isActive:e,totalCount:t}:void 0},[G,f,C,w]),ee=q>=n.ab&&qn.eb&&q30),te=ee||q>n.bb&&q{const e=W.current;if(e)return te&&ue?void(O||ee?($.current&&(e.classList.add("tools-stacked","animated"),$.current=!1),setTimeout(()=>{e.classList.remove("animated")},350)):(e.classList.remove("tools-stacked"),$.current=!0)):(e.classList.remove("tools-stacked","animated"),void($.current=!0))},[te,ue,ee,O]),c.a.createElement("div",{className:"MiddleHeader",ref:W},c.a.createElement(ae.a,{name:"slide-fade",activeKey:"thread"===a?t:1},me),c.a.createElement("div",{className:"header-tools"},ie&&de&&!se&&c.a.createElement(dt,{key:e,message:de,count:B,index:L,customTitle:be,className:le,onUnpinMessage:o?z:void 0,onClick:Q,onAllPinnedClick:K}),se&&re&&c.a.createElement(mt,{key:Object(m.A)(re),message:re,className:ce}),c.a.createElement(Ze,{chatId:e,threadId:t,messageListType:a})))})),Ot=a(154);function jt(e){return"albumId"in e}function gt(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(m.db)(r)||Object(m.db)(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)&&(s=[],n.senderGroups.push(s))}}),c}var ft=a(101);function pt(){const[e,t]=Object(ot.a)(!1),a=(s=1e3,n=!1,Object(c.p)(()=>Object(g.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(g.b)(()=>{document.body.classList.add("is-scrolling-messages")}),a(()=>{Object(g.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 It=a(150),vt=a(119);let yt=!1;var Et=({containerRef:e,className:t,messageIds:a,focusingId:s,loadMoreForwards:r,loadMoreBackwards:o,isViewportNewest:i,firstUnreadId:l,onFabToggle:d,onNotchToggle:b,children:u})=>{const m=Object(c.q)(null),h=Object(c.q)(null),O=Object(c.q)(null),j=Object(c.m)(()=>{if(yt)return;if(!a||!a.length)return d(!1),void b(!1);if(!i)return d(!0),void b(!0);const{offsetHeight:t,scrollHeight:s,scrollTop:n}=e.current,c=s-n-t,r=c<=0;d(l?!r:!(c<=50)),b(!r)},[a,i,e,d,l,b]),{observe:g,freeze:f,unfreeze:p}=Object(ft.a)({rootRef:e,margin:n.V},t=>{if(!r||!o)return;const a=t.find(({isIntersecting:e})=>e);if(!a)return;const{target:s}=a;"backwards-trigger"===s.className?(Object(It.a)(e.current),o()):"forwards-trigger"===s.className&&(Object(It.a)(e.current),r())});Object(ft.c)(m,g),Object(ft.c)(h,g);const{observe:I,freeze:v,unfreeze:y}=Object(ft.a)({rootRef:e,margin:50},j);Object(ft.c)(O,I);const{observe:E}=Object(ft.a)({rootRef:e},j);return Object(ft.c)(O,E),Object(je.a)(()=>{s?(f(),v()):(y(),p())},[s]),Object(je.a)(()=>{yt=!0,setTimeout(()=>{yt=!1},100)},[a]),Object(c.n)(j,[l]),c.a.createElement("div",{className:t,teactFastList:!0},c.a.createElement("div",{ref:m,key:"backwards-trigger",className:"backwards-trigger"}),u,c.a.createElement("div",{ref:h,key:"forwards-trigger",className:"forwards-trigger"}),c.a.createElement("div",{ref:O,key:"fab-trigger",className:"fab-trigger"}))},Ct=a(140),wt=a(141);function Mt(e){return"number"==typeof e}function St(e,t){return e?t?238:175:100}function kt(e){const t=Object(m.tb)(e),a=Object(m.qb)(e),s=Object(m.G)(e)||Object(m.R)(e),n=Object(m.P)(e),c=Boolean(Object(m.R)(e)),{width:r,height:o}=s?Object(et.f)(s,t,a,c):Object(et.h)(n,t,a),i=St(Boolean(Object(m.O)(e)));let l=1;re+t,t)}function Rt(e,t,a){return ea?a:e}function Ft(e){const t={width:0,height:0};return e.forEach(({dimensions:e,sides:a})=>{a&Tt&&(t.width=e.width+e.x),a&At&&(t.height=e.height+e.y)}),t}function Dt(e,t,a,s){const c=a.messages.map(e=>{const t=kt(e);return t.width/t.height});const r=function(e){return e.map(e=>e>1.2?"w":e<.8?"n":"q").join("")}(c),o=function(e){return e.reduce((e,t)=>t+e,1)/e.length}(c),i=c.length,l=c.some(e=>e>2),d=function(e,t,a){return a<=n.eb?a/100*69-(t?1.625:0)*et.c:((e?30:29)-(t?1.625:0))*et.c}(e,t,s);let b;const u={ratios:c,proportions:r,averageRatio:o,maxWidth:d,minWidth:100,maxHeight:d,spacing:2};return b=i>=5||l?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?Rt(e,1,2.75):Rt(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=Lt(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:xt|Pt|Tt},{dimensions:{x:0,y:c+s,width:a,height:c},sides:xt|At|Tt}]}(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:Pt|xt|At},{dimensions:{x:c+s,y:0,width:c,height:r},sides:Pt|Tt|At}]}(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:Pt|xt|At},{dimensions:{x:i+n,y:0,width:o,height:l},sides:Pt|Tt|At}]}(e)}(u):3===i?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:Pt|xt|At},{dimensions:{x:d+a,y:0,width:l,height:i},sides:Pt|Tt},{dimensions:{x:d+a,y:i+a,width:l,height:o},sides:At|Tt}]}(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:xt|Pt|Tt},{dimensions:{x:0,y:r+n,width:o,height:i},sides:At|xt},{dimensions:{x:o+n,y:r+n,width:c-o-n,height:i},sides:At|Tt}]}(e)}(u):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:xt|Pt|Tt},{dimensions:{x:0,y:r+a,width:i,height:b},sides:At|xt},{dimensions:{x:i+a,y:r+a,width:d,height:b},sides:At},{dimensions:{x:i+a+d+a,y:r+a,width:l,height:b},sides:Tt|At}]}(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:Pt|xt|At},{dimensions:{x:r+s,y:0,width:b,height:i},sides:Pt|Tt},{dimensions:{x:r+s,y:i+s,width:b,height:l},sides:Tt},{dimensions:{x:r+s,y:i+l+2*s,width:b,height:d},sides:At|Tt}]}(e)}(u),{layout:b,containerStyle:Ft(b)}}let Bt;function Ut(e){return Bt||(Bt=document.createElement("span"),Bt.style.font='400 12px Roboto, "Helvetica Neue", "Apple Color Emoji", sans-serif',Bt.style.whiteSpace="nowrap",Bt.style.position="absolute",Bt.style.left="-999px",Bt.style.opacity=".01",document.body.appendChild(Bt)),Bt.innerHTML=e,Bt.offsetWidth}function Ht(e,t,a,s,n){Object(c.o)(()=>{if(a&&e.current){const t=e.current.closest(".MessageList");Object(vt.a)(t,e.current,n?"end":"center",20,void 0===s?1500:1e3,s)}},[e,t,a,s,n])}var qt=a(106),Gt=a(62);var _t=Object(c.h)(e=>{const{isOpen:t}=e,a=Object(Ee.a)(ye.a.Extra,"ContextMenuContainer",!t);return a?c.a.createElement(a,e):void 0});var Wt=Object(c.h)(Object(s.h)((e,{message:t})=>{const a=t.senderId,{targetUserId:s,targetChatId:n}=t.content.action||{},c=t.replyToMessageId,r=c?Object(o.k)(e,t.chatId,c):void 0,i=Object(o.T)(e,t),{direction:l,noHighlight:d}=i&&e.focusedMessage||{},b=Object(o.f)(e,t.chatId);return{sender:b&&(Object(m.jb)(b)||a===t.chatId)?b:a?Object(o.Fb)(e,a):void 0,...s&&{targetUser:Object(o.Fb)(e,s)},targetChatId:n,targetMessage:r,isFocused:i,...i&&{focusDirection:l,noFocusHighlight:d}}})(({message:e,observeIntersection:t,isEmbedded:a,appearanceOrder:s=0,isLastInList:n,sender:r,targetUser:o,targetMessage:i,targetChatId:l,isFocused:d,focusDirection:b,noFocusHighlight:u})=>{const m=Object(c.q)(null);Object(ft.c)(m,t),Object(ze.a)(e.chatId,e.replyToMessageId,i),Ht(m,e.chatId,d,b,u);const h=Object(ne.a)(),O=s<=0,[j,g]=Object(ot.a)(O);Object(c.n)(()=>{O||setTimeout(g,10*s)},[s,g,O]);const{transitionClassNames:f}=Object(Z.a)(j,void 0,O,!1),p=Object(Gt.a)(h,e,r,o,i,l,a?{isEmbedded:!0,asPlain:!0}:void 0),{isContextMenuOpen:I,contextMenuPosition:v,handleBeforeContextMenu:y,handleContextMenu:E,handleContextMenuClose:C,handleContextMenuHide:w}=Object(Ct.a)(m),M=void 0!==v;if(a)return c.a.createElement("span",{className:"embedded-action-message"},Object(tt.a)(p));const S=Object(X.a)("ActionMessage message-list-item",d&&!u&&"focused",M&&"has-menu-open",n&&"last-in-list",f);return c.a.createElement("div",{ref:m,id:"message"+e.id,className:S,"data-message-id":e.id,onMouseDown:y,onContextMenu:E},c.a.createElement("span",null,p),v&&c.a.createElement(_t,{isOpen:I,anchor:v,message:e,messageListType:"thread",onClose:C,onCloseAnimationEnd:w}))}));a(213);var $t=({className:e,message:t,sender:a,title:s,customText:n,observeIntersection:r,onClick:o})=>{const i=Object(c.q)(null),l=Object(ft.b)(i,r),d=Object(at.a)(t&&Object(m.D)(t,"pictogram"),!l),b=t&&"sticker-reply-thumb"+t.id,u=nt(t),h=Boolean(t&&Object(m.I)(t)),O=Object(ne.a)(),j=a&&Object(m.V)(O,a);return c.a.createElement("div",{ref:i,className:Object(X.a)("EmbeddedMessage",e),onClick:t?o:void 0},u&&function(e,t,a,s){const{width:n,height:r}=Object(et.k)();return c.a.createElement("img",{id:e,src:a||t,width:n,height:r,alt:"",className:s?"round":""})}(b,u,d,h),c.a.createElement("div",{className:"message-text"},c.a.createElement("div",{className:"message-title",dir:"auto"},Object(tt.a)(j||s||" ")),c.a.createElement("p",{dir:"auto"},t?Object(m.db)(t)?c.a.createElement(Wt,{message:t,isEmbedded:!0}):Object(tt.a)(Object(m.N)(O,t,Boolean(u))):n||" ")))},Vt=a(155),zt=a(162),Qt=a(167);a(217);var Kt=Object(c.h)(({message:e,outgoingStatus:t,signature:a,onClick:s})=>{const n=Object(ne.a)();return c.a.createElement("span",{className:"MessageMeta",onClick:s},Boolean(e.views)&&c.a.createElement(c.a.Fragment,null,c.a.createElement("span",{className:"message-views"},Object(Ke.b)(e.views)),c.a.createElement("i",{className:"icon-channelviews"})),a&&c.a.createElement("span",{className:"message-signature"},Object(tt.a)(a)),c.a.createElement("span",{className:"message-time"},e.isEdited&&n("EditedMessage")+" ",Object(x.h)(1e3*e.date)),t&&c.a.createElement(Qt.a,{status:t}))}),Yt=a(109),Jt=a(111),Xt=a(156);a(218);var Zt=({message:e,observeIntersection:t,observeIntersectionForPlaying:a,shouldLoop:s,lastSyncTime:r})=>{const o=Object(c.q)(null),[i,l,d]=Object(ot.a)(),b=e.content.sticker,{isAnimated:u,stickerSetId:h}=b,O=h===n.T,j=Object(ft.b)(o,t),g=Object(ft.b)(o,a),f=b.isPreloadedGlobally?"sticker"+b.id:Object(m.D)(e,"inline"),p=nt(e),I=Object(at.a)(f,!j,Object(m.C)(e,"inline",!0),r),v=Boolean(I),[y,E]=Object(ot.a)(v),C=u?y:v,{shouldRenderFullMedia:w,transitionClassNames:M}=Object(Yt.a)(C,"slow"),{width:S,height:k}=Object(et.l)(b),N=Object(X.a)("thumbnail",!p&&"empty"),P=Object(X.a)("Sticker media-inner",O&&"inactive");return c.a.createElement("div",{ref:o,className:P,onClick:O?void 0:l},!C&&c.a.createElement("img",{id:"sticker-thumb-"+e.id,src:p,width:S,height:k,alt:"",className:N}),!u&&w&&c.a.createElement("img",{id:"sticker-"+e.id,src:I,width:S,height:k,alt:"",className:Object(X.a)("full-media",M)}),u&&v&&c.a.createElement(Jt.a,{key:f,className:Object(X.a)("full-media",M),id:f,animationData:I,size:S,play:g,noLoop:!s,onLoad:E}),c.a.createElement(Xt.a,{isOpen:i,fromSticker:b,onClose:d}))},ea=a(123),ta=a(115),aa=a(157);function sa(e,t){return Object(aa.a)(Object(m.E)(e),Boolean(t),h.g&&!h.c)}var na=a(41);var ca=async(e,t,a,s)=>s?"rgba(255,255,255,1)":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 ra=a(116);var oa=({id:e,message:t,observeIntersection:a,shouldAutoLoad:s,isInSelectMode:n,isSelected:r,uploadProgress:o,size:i="inline",dimensions:l,nonInteractive:d,shouldAffectAppendix:b,onClick:u,onCancelUpload:h})=>{const O=Object(c.q)(null),j=(Object(m.G)(t)||Object(m.R)(t)).blobUrl,g=Object(ft.b)(O,a),[f,p]=Object(c.r)(s),I=f&&g,{mediaData:v,downloadProgress:y}=Object(ta.a)(Object(m.D)(t,i),!I),E=j||v,C=sa(t,E),{isUploading:w,isTransferring:M,transferProgress:S}=Object(m.s)(t,o||y,I&&!E),k=!1===Object(na.a)(f),{shouldRender:N,transitionClassNames:P}=Object(Z.a)(M,void 0,k,"slow"),{shouldRenderThumb:T,shouldRenderFullMedia:A,transitionClassNames:x}=Object(Yt.a)(E,"slow"),L=Object(c.m)(()=>{w?h&&h(t):E?u&&u(t.id):p(e=>!e)},[E,w,t,h,u]),R=Object(m.tb)(t);Object(c.o)(()=>{if(!b)return;const e=O.current.closest(".message-content");E?ca(E,R,0,r).then(t=>{e.style.setProperty("--appendix-bg",t),e.setAttribute("data-has-custom-appendix","")}):e.classList.add("has-appendix-thumb")},[E,R,b,n,r]);const{width:F,height:D,isSmall:B}=l||kt(t),U=Object(X.a)("media-inner",!w&&!d&&"interactive",B&&"small-image",F===D&&"square-image"),H=l?`width: ${F}px; height: ${D}px; left: ${l.x}px; top: ${l.y}px;`:"";return c.a.createElement("div",{id:e,ref:O,className:U,style:H,onClick:w?void 0:L},T&&c.a.createElement("canvas",{ref:C,className:"thumbnail",style:`width: ${F}px; height: ${D}px`}),A&&c.a.createElement("img",{src:E,className:"full-media "+x,width:F,height:D,alt:""}),N&&c.a.createElement("div",{className:"media-loading "+P},c.a.createElement(ra.a,{progress:S,onClick:w?L:void 0})),!E&&!f&&c.a.createElement("i",{className:"icon-download"}),M&&c.a.createElement("span",{className:"message-upload-progress"},Math.round(100*S),"%"))},ia=a(132),la=a(131);function da(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(la.a)(e.current)},[e]);Object(J.a)(s,n)}var ba=a(142),ua=(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(la.a)(e.current),a.current=!1,s.current=!1},[t,e]),o=Object(c.m)(()=>{Object(g.b)(r)},[r]);document.hasFocus()||n(),Object(ee.a)(n,o)};function ma(){return(ma=Object.assign||function(e){for(var t=1;t{const b=Object(c.q)(null),u=Object(c.q)(null),h=t.content.video,O=h.blobUrl,j=Boolean(O)||Object(m.b)(h),g=Object(ft.b)(b,a),[f,p]=Object(c.r)(s),I=Boolean(f&&g&&o),[v,y]=Object(c.r)(n),E=Object(at.a)(Object(m.D)(t,"pictogram"),!(g&&o),Object(m.C)(t,"pictogram"),o),C=sa(t),{mediaData:w,downloadProgress:M}=Object(ta.a)(Object(m.D)(t,"inline"),!I,Object(m.C)(t,"inline"),o),S=O||w,k=Boolean(j&&g&&S),{isBuffered:N,bufferingHandlers:P}=Object(ia.a)(!s),{isUploading:T,isTransferring:A,transferProgress:L}=Object(m.s)(t,r||M,I&&j&&!N),R=!1===Object(na.a)(f),{shouldRender:F,transitionClassNames:D}=Object(Z.a)(A,void 0,R),{shouldRenderThumb:B,transitionClassNames:U}=Object(Yt.a)(S,"slow"),[H,q]=Object(c.r)(0),G=Object(c.m)(e=>{q(Math.max(0,e.currentTarget.currentTime-1))},[]),_=Object(m.tb)(t),W=Object(m.qb)(t),{width:$,height:V}=i||Object(et.h)(h,_,W);da(u,Boolean(k&&n)),ua(u,v),Object(ba.a)(u,[k]);const z=Object(c.m)(()=>{T?d&&d(t):j&&!S?p(e=>!e):j&&S&&!v?(y(!0),u.current.play()):l&&l(t.id)},[T,j,S,v,l,d,t]),Q=Object(X.a)("media-inner dark",!T&&"interactive"),K=Object(X.a)("full-media",U),Y=i?`width: ${$}px; height: ${V}px; left: ${i.x}px; top: ${i.y}px;`:"",J=k,ee=!j&&w,te=!j||f&&!v&&!F,ae=j&&!f;return c.a.createElement("div",{ref:b,id:e,className:Q,style:Y,onClick:T?void 0:z},(!k||B)&&c.a.createElement("canvas",{ref:C,className:"thumbnail",style:`width: ${$}px; height: ${V}px;`}),E&&c.a.createElement("img",{src:E,className:"thumbnail",style:`width: ${$}px; height: ${V}px;`,alt:""}),J&&c.a.createElement("video",ma({ref:u,className:K,width:$,height:V,autoPlay:v,muted:!0,loop:!0,playsInline:!0},P,{onTimeUpdate:G}),c.a.createElement("source",{src:S})),ee&&c.a.createElement("img",{src:w,className:"full-media "+U,width:$,height:V,alt:""}),te&&c.a.createElement("i",{className:"icon-large-play"}),F&&c.a.createElement("div",{className:"media-loading "+D},c.a.createElement(ra.a,{progress:L,onClick:T?z:void 0})),ae&&c.a.createElement("i",{className:"icon-download"}),A&&!j?c.a.createElement("span",{className:"message-upload-progress"},Math.round(100*L),"%"):A&&j?c.a.createElement("span",{className:"message-upload-progress"},"..."):c.a.createElement("div",{className:"message-media-duration"},h.isGif?"GIF":Object(x.e)(h.duration-H)))},Oa=a(17);a(220);var ja=Object(s.h)((e,{contact:t})=>({user:Object(o.Fb)(e,t.userId)}),(e,t)=>Object(d.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(X.a)("Contact",Boolean(o)&&"interactive"),onClick:o?i:void 0},c.a.createElement(qt.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(Oa.c)(r))))}),ga=a(43);var fa=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(ga.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})))}),pa=a(121),Ia=a(175);a(223);function va(e,t){return t>0?(e/t*100).toFixed():0}var ya=({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?va(o.votersCount,a||0):0,[b,u]=Object(c.r)(r?0:d),m=Object(c.q)(null),h=o?va(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"},c.a.createElement("div",{className:"poll-option-share "+("100"===d?"limit-width":"")},d,"%",l&&c.a.createElement("span",{className:Object(X.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"},Object(tt.a)(e.text)),c.a.createElement("div",{className:Object(X.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(224);var Ea=Object(c.h)(Object(s.h)((e,{poll:t})=>{const{recentVoterIds:a}=t.results,{byId:s}=e.users;return a&&0!==a.length?{recentVoterIds:a,usersById:s}:{}},(e,t)=>Object(d.l)(t,["loadMessage","openPollResults"]))(({message:e,poll:t,recentVoterIds:a,usersById:s,loadMessage:n,onSendVote:r,openPollResults:o})=>{const{id:i,chatId:l}=e,{summary:d,results:b}=t,[u,m]=Object(c.r)(!1),[h,O]=Object(c.r)([]),[j,g]=Object(c.r)(!1),[f,p]=Object(c.r)(!1),[I,v]=Object(c.r)(!d.closed&&d.closeDate&&d.closeDate>0?Math.min(d.closeDate-Math.floor(Date.now()/1e3),d.closePeriod):0),y=Object(c.q)(null),{results:E,totalVoters:C}=b,w=E&&E.some(e=>e.isChosen),M=!d.closed&&!w,S=!M&&d.isPublic&&Number(b.totalVoters)>0,k=M&&d.multipleChoice,N=E?Math.max(...E.map(e=>e.votersCount)):C,P=E?E.reduce((e,t)=>(t.isCorrect&&e.push(t.option),e),[]):[],T=d.answers.map(e=>({label:e.text,value:e.option,hidden:Boolean(d.quiz&&d.closePeriod&&I<=0)}));Object(c.n)(()=>{u&&t.results.results&&t.results.results.some(e=>e.isChosen)&&m(!1)},[u,t.results.results]),Object(c.n)(()=>{I>0&&setTimeout(()=>v(I-1),1e3);const e=y.current;if(e){const t=12*Math.PI,a=e.lastElementChild,s=e.firstElementChild;if(I<=5&&e.classList.add("hurry-up"),a&&s){const e=(d.closePeriod-I)/d.closePeriod*t;s.textContent=Object(x.e)(I),a.firstElementChild.setAttribute("stroke-dashoffset","-"+e)}else e.innerHTML=`\n ${Object(x.e)(I)}\n \n \n `}},[I,d.closePeriod]),Object(c.n)(()=>{d.quiz&&(I<=0||w&&!d.closed)&&n({chatId:l,messageId:i})},[l,I,w,n,i,d.closed,d.quiz]),Object(c.n)(()=>{let e;return d.quiz&&!d.closed&&d.closePeriod&&d.closePeriod>0&&(e=window.setTimeout(()=>{n({chatId:l,messageId:i})},1e3*d.closePeriod)),()=>{e&&window.clearTimeout(e)}},[M,l,n,i,d.closePeriod,d.closed,d.quiz]);const A=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=>{O([e]),m(!0),p(!0),r([e])},[r]),R=Object(c.m)(e=>{O(e)},[]),F=Object(c.m)(()=>{m(!0),p(!0),r(h)},[r,h]),D=Object(c.m)(()=>{o({chatId:l,messageId:i})},[l,i,o]),B=Object(c.m)(()=>{g(!0)},[]),U=Object(c.m)(()=>{g(!1),p(!1)},[]);Object(c.n)(()=>{if(f&&w&&d.quiz&&b.results&&t.results.solution){b.results.find(e=>e.isChosen&&e.isCorrect)||g(!0)}},[w,f,b.results,d.quiz,t.results.solution]);const H=Object(ne.a)();return c.a.createElement("div",{className:"Poll",dir:"auto"},j&&t.results.solution&&c.a.createElement(Ia.a,{message:Object(wt.b)(t.results.solution,t.results.solutionEntities),duration:5e3,onDismiss:U,containerId:"#middle-column-portals"}),c.a.createElement("div",{className:"poll-question"},Object(tt.a)(d.question)),c.a.createElement("div",{className:"poll-type"},function(e){if(void 0===e.isPublic)return" ";if(e.quiz)return e.isPublic?"Quiz":"Anonymous Quiz";if(e.closed)return"Final results";return e.isPublic?"Poll":"Anonymous Poll"}(d),A.length>0&&c.a.createElement("div",{className:"poll-recent-voters"},A.map(e=>c.a.createElement(qt.a,{size:"micro",user:e}))),I>0&&M&&c.a.createElement("div",{ref:y,className:"poll-countdown"}),d.quiz&&t.results.solution&&!M&&c.a.createElement(oe.a,{round:!0,size:"tiny",color:"translucent",className:"poll-quiz-help",disabled:j,onClick:B,ariaLabel:"Show Solution"},c.a.createElement("i",{className:"icon-lamp"}))),M&&c.a.createElement("div",{className:"poll-answers"},k?c.a.createElement(fa,{options:T,onChange:R,disabled:e.isScheduled||u,loadingOptions:u?h:void 0,round:!0}):c.a.createElement(pa.a,{name:"poll-"+i,options:T,onChange:L,disabled:e.isScheduled||u,loadingOption:u?h[0]:void 0})),!M&&c.a.createElement("div",{className:"poll-results"},d.answers.map((function(e){return c.a.createElement(ya,{key:e.option,shouldAnimate:f,answer:e,voteResults:E,totalVoters:C,maxVotersCount:N,correctResults:P})}))),!S&&!k&&c.a.createElement("div",{className:"poll-voters-count"},function(e,t){if(!t)return e?"No answers yet":"No voters yet";return e?t+" answered":t+" voted"}(d.quiz,b.totalVoters)),k&&c.a.createElement(oe.a,{isText:!0,disabled:0===h.length,size:"tiny",onClick:F},H("PollSubmitVotes")),S&&c.a.createElement(oe.a,{isText:!0,size:"tiny",onClick:D},H("PollViewResults")))})),Ca=a(36),wa=a(53);a(225);var Ma=Object(c.h)(({message:e,observeIntersection:t,shouldAutoLoad:a,inPreview:s,onMediaClick:n,onCancelMediaTransfer:r})=>{const o=Object(m.Q)(e);let i=!1;if(o&&o.photo){const{width:t,height:a}=kt(e);i=t===a}const l=Object(c.m)(()=>{n()},[n]);if(!o)return;const{siteName:d,url:b,displayUrl:u,title:h,description:O,photo:j}=o,g=j&&n&&!i&&!o.hasDocument,f=Object(Ca.a)(O,170),p=Object(X.a)("WebPage",j?i&&"with-square-photo":!s&&"without-photo");return c.a.createElement("div",{className:p,"data-initial":(d||u)[0],dir:"auto"},j&&c.a.createElement(oa,{message:e,observeIntersection:t,shouldAutoLoad:a,size:i?"pictogram":"inline",nonInteractive:!g,onClick:g?l:void 0,onCancelUpload:r}),c.a.createElement("div",{className:"WebPage-text"},c.a.createElement(wa.a,{className:"site-name",url:b,text:d||u}),!s&&h&&c.a.createElement("p",{className:"site-title"},Object(tt.a)(h)),f&&c.a.createElement("p",{className:"site-description"},Object(tt.a)(f,["emoji","br"]))))});a(226);var Sa=Object(c.h)(({message:e})=>{const t=Object(m.z)(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(tt.a)(a)),s&&c.a.createElement("p",null,Object(tt.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(tt.a)(n,["emoji","br"]))))});function ka(e){return Object(c.h)(Object(s.h)((e,t)=>{const{message:a}=t;return{isInSelectMode:Object(o.R)(e),isSelected:Object(o.U)(e,a.id)}},(e,t)=>Object(d.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(X.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(227);const Na=ka(oa),Pa=ka(ha);var Ta=Object(s.h)(e=>({uploadsById:e.fileUploads.byMessageLocalId}),(e,t)=>Object(d.l)(t,["cancelSendingMessage"]))(({album:e,observeIntersection:t,shouldAutoLoad:a,shouldAutoPlay:s,hasCustomAppendix:n,lastSyncTime:r,isOwn:o,albumLayout:i,onMediaClick:l,uploadsById:d,cancelSendingMessage:b})=>{const u=e.messages.length,h=Object(c.m)(e=>{b({chatId:e.chatId,messageId:e.id})},[b]);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,b){const{photo:O,video:j}=Object(m.v)(e),g=d[e.previousLocalId||e.id],f=g?g.progress:void 0,{dimensions:p,sides:I}=i.layout[b];if(O){const s=n&&(o?b===u-1:Boolean(I&xt&&I&At));return c.a.createElement(Na,{id:"album-media-"+e.id,message:e,observeIntersection:t,shouldAutoLoad:a,shouldAffectAppendix:s,uploadProgress:f,dimensions:p,onClick:l,onCancelUpload:h})}if(j)return c.a.createElement(Pa,{id:"album-media-"+e.id,message:e,observeIntersection:t,shouldAutoLoad:a,shouldAutoPlay:s,uploadProgress:f,lastSyncTime:r,dimensions:p,onClick:l,onCancelUpload:h})})))});a(228);function Aa(){return(Aa=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),l=e.content.video,d=Object(ft.b)(r,t),[b,u]=Object(c.r)(a&&s),h=Boolean(b&&d&&n),{mediaData:O,downloadProgress:j}=Object(ta.a)(Object(m.D)(e,"inline"),!h,Object(m.C)(e,"inline"),n),g=sa(e,O),{isBuffered:f,bufferingHandlers:p}=Object(ia.a)(),I=b&&!f,v=!1===Object(na.a)(b),{shouldRender:y,transitionClassNames:E}=Object(Z.a)(I||!f,void 0,v),{shouldRenderThumb:C,transitionClassNames:w}=Object(Yt.a)(O,"slow"),[M,S]=Object(c.r)(!1),[k,N]=Object(c.r)(0);Object(c.n)(()=>{if(!M)return;const e=188*Math.PI,t=e-k*e,a=i.current,s=o.current,n=s.firstElementChild;n?n.firstElementChild.setAttribute("stroke-dashoffset",t.toString()):s.innerHTML=`\n \n `,N(a.currentTime/a.duration)},[M,k]);const P=Boolean(O&&d),T=()=>{S(!1),N(0),Object(la.a)(i.current),requestAnimationFrame(()=>{o.current.innerHTML=""})},A=(L=T,()=>{xa&&xa(),xa=L});var L;Object(c.n)(()=>{i.current&&(P?Object(la.a)(i.current):i.current.pause())},[P]),da(i,P),ua(i,Boolean(O)),Object(ba.a)(i,[O]);const R=Object(c.m)(()=>{if(!O)return void u(e=>!e);const e=i.current;M?e.paused?Object(la.a)(e):e.pause():(A(),e.currentTime=0,S(!0))},[A,M,O]),F=Object(c.m)(e=>{const t=e.currentTarget;N(t.currentTime/t.duration)},[]),D=Object(X.a)("full-media",w);return c.a.createElement("div",{ref:r,className:"RoundVideo media-inner",onClick:R},C&&c.a.createElement("div",{className:"thumbnail-wrapper"},c.a.createElement("canvas",{ref:g,className:"thumbnail",style:`width: ${et.d}px; height: ${et.d}px`})),O&&c.a.createElement("div",{className:"video-wrapper"},c.a.createElement("video",Aa({ref:i,className:D,width:et.d,height:et.d,autoPlay:!0,muted:!M,loop:!M,playsInline:!0,onEnded:M?T:void 0},p,{onTimeUpdate:M?F:void 0}),c.a.createElement("source",{src:O}))),c.a.createElement("div",{className:"progress",ref:o}),y&&c.a.createElement("div",{className:"media-loading "+E},c.a.createElement(ra.a,{progress:j})),!O&&!b&&c.a.createElement("i",{className:"icon-large-play"}),c.a.createElement("div",{className:"message-media-duration"},M?Object(x.e)(i.current.currentTime):Object(x.e)(l.duration),(!M||i.current.paused)&&c.a.createElement("i",{className:"icon-muted-chat"})))};a(229);var Ra=({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(oe.a,{size:"tiny",ripple:!0,disabled:"NOT_SUPPORTED"===e.type,onClick:()=>t({button:e})},e.text,"url"===e.type&&c.a.createElement("i",{className:"icon-arrow-right"}))))));a(230);var Fa=Object(c.h)(Object(s.h)((e,{message:t})=>{const{threadId:a,chatId:s}=t.threadInfo,n=Object(o.Bb)(e,s,a)||t.threadInfo,{byId:c}=e.users,{byId:r}=e.chats;return{threadInfo:n,usersById:c,chatsById:r}},(e,t)=>Object(d.l)(t,["openChat"]))(({disabled:e,threadInfo:t,usersById:a,chatsById:s,openChat:n})=>{const r=Object(ne.a)(),{threadId:o,chatId:i,messagesCount:l,lastMessageId:d,lastReadInboxMessageId:b,recentReplierIds:u}=t,h=Object(c.m)(()=>{n({id:i,threadId:o})},[n,i,o]);if(void 0===l)return;const O=u&&u.map(e=>Object(m.lb)(e)?a[e]:s[e]).filter(Boolean);const j=Boolean(b&&d&&b0&&c.a.createElement("div",{className:"recent-repliers"},O.map(e=>c.a.createElement(qt.a,{key:e.id,size:"small",user:Object(m.lb)(e.id)?e:void 0,chat:Object(m.lb)(e.id)?void 0:e}))),c.a.createElement("div",{className:"label",dir:"auto"},l?r("Comments",l,"i"):r("LeaveAComment")),c.a.createElement("i",{className:"icon-next"}))}));a(231);function Da(e){const t=Ua(e.currentTarget);t&&t.setAttribute("data-is-document-group-hover","")}function Ba(e){const t=Ua(e.currentTarget);t&&t.removeAttribute("data-is-document-group-hover")}function Ua(e){let t=e;do{t=t.nextElementSibling}while(t&&!t.classList.contains("last-in-document-group"));return t}var Ha=Object(c.h)(Object(s.h)((e,t)=>{const{focusedMessage:a,forwardMessages:s,lastSyncTime:n}=e,{message:c,album:r,withSenderName:i,withAvatar:l,threadId:d,messageListType:b}=t,{id:u,chatId:h,viaBotId:O,replyToMessageId:j,isOutgoing:g}=c,f=Object(o.f)(e,h),p=Object(o.O)(e,h),I=f&&Object(m.jb)(f),v=!p&&Object(m.eb)(c),y=i||l||v?Object(o.sb)(e,c):void 0,E=Object(o.J)(e,c),C=O?Object(o.Fb)(e,O):void 0,w=d?Object(o.Db)(e,h,d):void 0,M=c.id===w,S=j===w,k=j&&!S?Object(o.k)(e,h,j):void 0,N=k&&Object(o.sb)(e,k),P=Object(o.Eb)(e,c),T="thread"===b&&(r?r.messages.some(t=>Object(o.T)(e,t)):Object(o.T)(e,c)),{direction:A,noHighlight:x}=T&&a||{},L=s.messageIds&&s.messageIds.includes(u),{query:R}=Object(o.A)(e)||{},F=Object(m.L)(c);let D;return D=r&&r.messages?r.messages.every(({id:t})=>Object(o.U)(e,t)):Object(o.U)(e,u),{forceSenderName:v,sender:y,originSender:E,botSender:C,shouldHideReply:S,isThreadTop:M,replyMessage:k,replyMessageSender:N,...g&&{outgoingStatus:Object(o.eb)(e,c,"scheduled"===b)},..."number"==typeof P&&{uploadProgress:P},isFocused:T,...T&&{focusDirection:A,noFocusHighlight:x},isForwarding:L,isChatWithSelf:p,isChannel:I,lastSyncTime:n,highlight:R,isSingleEmoji:Boolean(F),animatedEmoji:F?Object(o.c)(e,F):void 0,isInSelectMode:Object(o.R)(e),isSelected:D,isGroupSelected:!!c.groupedId&&!c.isInAlbum&&Object(o.P)(e,h,c.groupedId),threadId:d,isPinnedList:"pinned"===b,shouldAutoLoadMedia:f?Object(o.tb)(e,c,f,y):void 0,shouldAutoPlayMedia:Object(o.ub)(e,c),shouldLoopStickers:Object(o.vb)(e)}},(e,t)=>Object(d.l)(t,["focusMessage","openMediaViewer","openAudioPlayer","cancelSendingMessage","openUserInfo","openChat","markMessagesRead","sendPollVote","toggleMessageSelection","setReplyingToId","openForwardMenu","clickInlineButton"]))(({message:e,observeIntersectionForBottom:t,observeIntersectionForMedia:a,observeIntersectionForAnimatedStickers:s,album:n,withAvatar:r,withSenderName:o,noComments:d,appearanceOrder:b,isFirstInGroup:u,isLastInGroup:h,isFirstInDocumentGroup:O,isLastInDocumentGroup:j,isLastInList:g,forceSenderName:f,sender:p,originSender:I,botSender:v,isThreadTop:y,shouldHideReply:E,replyMessage:C,replyMessageSender:w,outgoingStatus:M,uploadProgress:S,isFocused:k,focusDirection:N,noFocusHighlight:P,isForwarding:T,isChatWithSelf:A,isChannel:x,lastSyncTime:L,highlight:R,animatedEmoji:F,isInSelectMode:D,isSelected:B,isGroupSelected:U,threadId:H,messageListType:q,isPinnedList:G,shouldAutoLoadMedia:_,shouldAutoPlayMedia:W,shouldLoopStickers:$,focusMessage:V,openMediaViewer:z,openAudioPlayer:Q,openUserInfo:K,openChat:Y,cancelSendingMessage:J,markMessagesRead:ee,sendPollVote:te,toggleMessageSelection:ae,setReplyingToId:se,openForwardMenu:ce,clickInlineButton:re})=>{const ie=Object(c.q)(null),le=Object(c.q)(null),de=Object(c.q)(null);Object(ft.c)(le,t);const{width:be}=_e(),{isContextMenuOpen:ue,contextMenuPosition:me,handleBeforeContextMenu:he,handleContextMenu:Oe,handleContextMenuClose:je,handleContextMenuHide:ge}=Object(Ct.a)(ie,!1,!0),fe=b<=0,[pe,Ie]=Object(ot.a)(fe);Object(c.n)(()=>{fe||setTimeout(Ie,10*b)},[b,Ie,fe]);const{transitionClassNames:ve}=Object(Z.a)(pe,void 0,fe,!1),{chatId:ye,id:Ee,threadInfo:Ce}=e,we=Object(m.tb)(e),Me="scheduled"===q||e.isScheduled,Se=Object(m.ub)(e)&&!E,ke=Boolean(Ce)&&"thread"===q,{forwardInfo:Ne,viaBotId:Pe}=e,Te=Ne&&!A&&!Ne.isLinkedChannelPost,Ae=!!e.groupedId&&!e.isInAlbum,xe=Boolean(n)&&n.messages.length>1,{text:Le,photo:Re,video:Fe,audio:De,voice:Be,document:Ue,sticker:He,contact:qe,poll:Ge,webPage:We,invoice:$e}=Object(m.v)(e),Ve=Object(m.x)(e),Qe=Object(wt.a)(e,R,Mt(Ve)),Ke=void 0!==me,Ye=Object(X.a)("Message message-list-item",u&&"first-in-group",h&&"last-in-group",O&&"first-in-document-group",j&&"last-in-document-group",g&&"last-in-list",we&&"own",Boolean(e.views)&&"has-views",e.isEdited&&"was-edited",Se&&"has-reply",Ke&&"has-menu-open",k&&!P&&"focused",T&&"is-forwarding",e.isDeleting&&"is-deleting",Ae&&"is-in-document-group",xe&&"is-album",e.hasUnreadMention&&"has-unread-mention",B&&"is-selected",D&&"is-in-selection-mode",y&&"is-thread-top",Boolean(e.inlineButtons)&&"has-inline-buttons",ve),Je=function(e,{hasReply:t,customShape:a,isLastInGroup:s,asForwarded:n,hasThread:c,forceSenderName:r,hasComments:o}={}){const{text:i,photo:l,video:d,audio:b,voice:u,document:h,poll:O,webPage:j,contact:g}=Object(m.v)(e),f=["message-content"],p=(l||d)&&!i,I=Boolean(e.viaBotId);return Mt(a)?f.push("emoji-only emoji-only-"+a):i&&f.push("text"),a&&(f.push("custom-shape"),d&&d.isRound&&f.push("round"),o&&f.push("has-comments")),l||d?f.push("media"):b?f.push("audio"):u?f.push("voice"):h?f.push("document"):g?f.push("contact"):O?f.push("poll"):j&&(f.push("web-page"),j.photo&&f.push("media")),n&&!a&&f.push("is-forwarded"),t&&f.push("is-reply"),c&&f.push("has-replies"),I&&f.push("is-via-bot"),r&&f.push("force-sender-name"),a||(f.push("has-shadow"),(t||n||!p||I||r)&&f.push("has-solid-background"),!s||!l&&p||f.push("has-appendix")),f.join(" ")}(e,{hasReply:Se,customShape:Ve,isLastInGroup:h,asForwarded:Te,hasThread:ke,forceSenderName:f,hasComments:e.threadInfo&&e.threadInfo.messagesCount>0}),Xe=!Ne||!A&&p?p:I,Ze=Ne?I:p,at=x&&e.adminTitle||Ne&&!Te&&Ne.adminTitle||void 0,st=e.threadInfo&&(!Ae||j)&&"thread"===q&&!d,nt=Je.includes("has-appendix");Object(ze.a)(ye,Se?e.replyToMessageId:void 0,C,e.id),Ht(ie,ye,k,N,P),Object(c.o)(()=>{de.current&&(de.current.innerHTML=we?'':'')},[we,nt]);const ct=Object(c.m)(t=>{t.stopPropagation(),ae({messageId:Ee,groupedId:e.groupedId})},[Ee,e.groupedId,ae]),rt=Object(c.m)(e=>{const t=xe&&n&&n.messages?{messageId:Ee,childMessageIds:n.messages.map(({id:e})=>e),withShift:e&&e.shiftKey}:{messageId:Ee,withShift:e&&e.shiftKey};ae(t)},[ae,Ee,xe,n]),it=Object(c.m)(()=>{se({messageId:Ee})},[se,Ee]),lt=Object(c.m)(e=>{e.stopPropagation()},[]),dt=Object(c.m)(()=>{Xe&&(Object(m.lb)(Xe.id)?K({id:Xe.id}):Y({id:Xe.id}))},[Xe,K,Y]),bt=Object(c.m)(()=>{Ze&&(Object(m.lb)(Ze.id)?K({id:Ze.id}):Y({id:Ze.id}))},[Ze,K,Y]),ut=Object(c.m)(()=>{v&&K({id:v.id})},[v,K]),mt=Object(c.m)(()=>{V({chatId:ye,threadId:H,messageId:e.replyToMessageId})},[V,ye,H,e.replyToMessageId]),ht=Object(c.m)(()=>{z({chatId:ye,threadId:H,messageId:Ee,origin:Me?l.h.ScheduledInline:l.h.Inline})},[ye,H,Ee,z,Me]),Ot=Object(c.m)(()=>{Q({chatId:ye,messageId:Ee})},[ye,Ee,Q]),jt=Object(c.m)(e=>{z({chatId:ye,threadId:H,messageId:e,origin:Me?l.h.ScheduledAlbum:l.h.Album})},[ye,H,z,Me]),gt=Object(c.m)(()=>{ee({messageIds:[Ee]})},[Ee,ee]),pt=Object(c.m)(()=>{J({chatId:ye,messageId:Ee})},[J,ye,Ee]),It=Object(c.m)(e=>{te({chatId:ye,messageId:Ee,options:e})},[ye,Ee,te]),vt=Object(c.m)(()=>{ce({fromChatId:ye,groupedId:e.groupedId})},[ce,ye,e.groupedId]),yt=Object(c.m)(()=>{if(n&&n.messages){const e=n.messages.map(({id:e})=>e);ce({fromChatId:ye,messageIds:e})}else ce({fromChatId:ye,messageIds:[Ee]})},[n,ce,ye,Ee]),Et=Object(c.m)(()=>{V({chatId:ye,threadId:i.MAIN_THREAD_ID,messageId:Ee})},[V,ye,Ee]),Nt=Object(c.m)(()=>{V(Ae?{chatId:Ne.fromChatId,groupedId:e.groupedId,groupedChatId:ye}:{chatId:Ne.fromChatId,messageId:Ne.fromMessageId})},[V,Ne,e,ye,Ae]),Pt=Object(ne.a)();let Tt,At="",xt=!1;const Lt=Object(c.p)(()=>xe?Dt(we,Boolean(Te),n,be):void 0,[xe,be,we,Te,n]),Rt=Te?28:0;if(xe||!Re&&!Fe)Lt&&(Tt=Math.max(St(Boolean(Le),st),Lt.containerStyle.width),Tt-Lt.containerStyle.width>18&&(xt=!0));else{let t;Re?t=kt(e).width:Fe&&(t=Fe.isRound?et.d:kt(e).width),t&&(Tt=Math.max(St(Boolean(Le),st),t),Tt-t>18&&(xt=!0))}Tt&&(At=`width: ${Tt+Rt}px`);const Ft=Object(c.p)(()=>at?Ut(at):void 0,[at]),Bt=!(Ke||D||T)&&(!Ae||j),Gt=Bt&&x&&!Me,Wt=Bt&&(Ne&&(Ne.isChannelPost||A&&!we)&&Ne.fromMessageId||G);return c.a.createElement("div",{ref:ie,id:"message"+Ee,className:Ye,style:Ft?`--meta-safe-author-width: ${Ft}px`:void 0,"data-message-id":Ee,onClick:D?rt:void 0,onDoubleClick:D?void 0:it,onMouseDown:D?void 0:he,onContextMenu:D?void 0:Oe,onMouseEnter:Ae&&!j?Da:void 0,onMouseLeave:Ae&&!j?Ba:void 0},c.a.createElement("div",{ref:le,className:"bottom-marker","data-message-id":Ee,"data-last-message-id":n?n.messages[n.messages.length-1].id:void 0,"data-has-unread-mention":e.hasUnreadMention}),!Ae&&c.a.createElement("div",{className:"message-select-control"},B&&c.a.createElement("i",{className:"icon-select"})),j&&c.a.createElement("div",{className:Object(X.a)("message-select-control group-select",U&&"is-selected"),onClick:ct},U&&c.a.createElement("i",{className:"icon-select"})),r&&function(){const e=Xe&&Object(m.lb)(Xe.id),t=Xe&&e?Xe:void 0,a=Xe&&!e?Xe:void 0,s=!Xe&&Ne?Ne.hiddenUserName:void 0;return c.a.createElement(qt.a,{size:"small",user:t,chat:a,text:s,lastSyncTime:L,onClick:t||a?dt:void 0})}(),c.a.createElement("div",{className:"message-content-wrapper",onClick:D&&Ae?rt:void 0},c.a.createElement("div",{className:Je,style:At,dir:"auto"},nt&&c.a.createElement("div",{className:"svg-appendix",ref:de}),Te&&!Ve&&(!Ae||O)&&c.a.createElement("div",{className:"message-title"},Pt("ForwardedMessage")),function(){const t=Object(X.a)("content-inner",Te&&!Ve&&"forwarded-message",Se&&"reply-message",xt&&"no-media-corners"),r=h&&!Qe&&!Te&&!ke,i=!We&&!F&&Qe;return c.a.createElement("div",{className:t,onDoubleClick:lt,dir:"auto"},function(){if(Ve||!(o&&!Re&&!Fe||Te||Pe||f)||Ae&&!O)return;let t,a;Ze?(t=Object(m.V)(Pt,Ze),Te||(a="color-"+Object(m.X)(Ze))):Ne&&Ne.hiddenUserName&&(t=Ne.hiddenUserName);return c.a.createElement("div",{className:"message-title"},t?c.a.createElement("span",{className:Object(X.a)(Ze&&"interactive",a),onClick:Ze?bt:void 0},Object(tt.a)(t)):v?void 0:" ",v&&c.a.createElement(c.a.Fragment,null,c.a.createElement("span",{className:"via"},Pt("ViaBot")),c.a.createElement("span",{className:"interactive",onClick:ut},Object(tt.a)("@"+v.username))),Ne&&Ne.isLinkedChannelPost?c.a.createElement("span",{className:"admin-title"},Pt("DiscussChannel")):e.adminTitle&&!x?c.a.createElement("span",{className:"admin-title"},e.adminTitle):void 0)}(),Se&&c.a.createElement($t,{message:C,sender:w,observeIntersection:a,onClick:mt}),He&&c.a.createElement(Zt,{message:e,observeIntersection:a,observeIntersectionForPlaying:s,shouldLoop:$,lastSyncTime:L}),F&&c.a.createElement(ea.a,{isInline:!0,sticker:F,observeIntersection:a,lastSyncTime:L}),xe&&c.a.createElement(Ta,{album:n,albumLayout:Lt,observeIntersection:a,shouldAutoLoad:_,shouldAutoPlay:W,isOwn:we,hasCustomAppendix:r,lastSyncTime:L,onMediaClick:jt}),!xe&&Re&&c.a.createElement(oa,{message:e,observeIntersection:a,shouldAutoLoad:_,uploadProgress:S,shouldAffectAppendix:r,onClick:ht,onCancelUpload:pt}),!xe&&Fe&&Fe.isRound&&c.a.createElement(La,{message:e,observeIntersection:a,shouldAutoLoad:_,shouldAutoPlay:W,lastSyncTime:L}),!xe&&Fe&&!Fe.isRound&&c.a.createElement(ha,{message:e,observeIntersection:a,shouldAutoLoad:_,shouldAutoPlay:W,uploadProgress:S,lastSyncTime:L,onClick:ht,onCancelUpload:pt}),(De||Be)&&c.a.createElement(zt.a,{message:e,uploadProgress:S,lastSyncTime:L,isSelectable:Ae,isSelected:B,onPlay:Ot,onReadMedia:!Be||we&&!A?void 0:gt,onCancelUpload:pt}),Ue&&c.a.createElement(Vt.a,{message:e,observeIntersection:a,uploadProgress:S,isSelectable:Ae,isSelected:B,onCancelUpload:pt}),qe&&c.a.createElement(ja,{contact:qe}),Ge&&c.a.createElement(Ea,{message:e,poll:Ge,onSendVote:It}),!F&&Qe&&c.a.createElement("p",{className:"text-content "+(i?"with-meta":""),dir:"auto"},Qe,i&&c.a.createElement(Kt,{message:e,outgoingStatus:M,signature:at,onClick:rt})),We&&c.a.createElement(Ma,{message:e,observeIntersection:a,shouldAutoLoad:_,onMediaClick:ht,onCancelMediaTransfer:pt}),$e&&c.a.createElement(Sa,{message:e}))}(),(!Ae||j)&&!(!We&&!F&&Qe)&&c.a.createElement(Kt,{message:e,outgoingStatus:M,signature:at,onClick:rt}),Gt?c.a.createElement(oe.a,{className:"message-action-button",color:"translucent-white",round:!0,size:"tiny",ariaLabel:Pt("lng_context_forward_msg"),onClick:j?vt:yt},c.a.createElement("i",{className:"icon-share-filled"})):Wt?c.a.createElement(oe.a,{className:"message-action-button",color:"translucent-white",round:!0,size:"tiny",ariaLabel:"Focus message",onClick:G?Et:Nt},c.a.createElement("i",{className:"icon-arrow-right"})):void 0,st&&c.a.createElement(Fa,{message:e,disabled:d})),e.inlineButtons&&c.a.createElement(Ra,{message:e,onClick:re})),me&&c.a.createElement(_t,{isOpen:ue,anchor:me,message:e,album:n,messageListType:q,onClose:je,onCloseAnimationEnd:ge}))}));a(232);const qa=h.b?1e3:350,Ga=h.g?300:500,_a=Object(g.a)(e=>e(),200,!1);var Wa=Object(c.h)(Object(s.h)((e,{chatId:t,threadId:a,type:s})=>{const n=Object(o.f)(e,t);if(!n)return{};const c=Object(o.x)(e,t,a,s),r="scheduled"===s?Object(o.pb)(e,t):Object(o.m)(e,t),l=Object(o.Db)(e,t,a);if(a!==i.MAIN_THREAD_ID&&!(r&&l&&r[l]))return{};const{isRestricted:d,restrictionReason:b,lastMessage:u}=n,h=Object(o.H)(e,t),O=a===i.MAIN_THREAD_ID&&!c&&!n.unreadCount&&!h&&u&&!u.groupedId;let j;if(Object(o.K)(e,t)){const a=Object(o.g)(e,t);j=a.fullInfo?a.fullInfo.botDescription||"NoMessages":"Updating bot info..."}return{isChatLoaded:!0,isRestricted:d,restrictionReason:b,isChannelChat:Object(m.jb)(n),isChatWithSelf:Object(o.O)(e,t),messageIds:c,messagesById:r,firstUnreadId:Object(o.G)(e,t,a),isViewportNewest:"thread"!==s||Object(o.W)(e,t,a),threadFirstMessageId:Object(o.F)(e,t,a),focusingId:h,isSelectModeActive:Object(o.R)(e),animationLevel:e.settings.byKey.animationLevel,...O&&{lastMessage:u},botDescription:j,threadTopMessageId:l,hasLinkedChat:n.fullInfo&&"linkedChatId"in n.fullInfo?Boolean(n.fullInfo.linkedChatId):void 0}},(e,t)=>Object(d.l)(t,["loadViewportMessages","markMessageListRead","markMessagesRead","setScrollOffset"]))(({chatId:e,threadId:t,type:a,hasTools:r,onFabToggle:i,onNotchToggle:b,isChatLoaded:u,isChannelChat:h,canPost:O,isChatWithSelf:j,messageIds:f,messagesById:p,firstUnreadId:I,isViewportNewest:v,threadFirstMessageId:y,isRestricted:E,restrictionReason:C,focusingId:w,isSelectModeActive:M,animationLevel:S,loadViewportMessages:k,markMessageListRead:N,markMessagesRead:P,setScrollOffset:T,lastMessage:A,botDescription:L,threadTopMessageId:R,hasLinkedChat:F})=>{const D=Object(c.q)(null),B=Object(c.q)("thread"===a&&Object(o.qb)(Object(s.e)(),e,t)||0),U=Object(c.q)(),H=Object(c.q)(),q=Object(c.q)(),G=Object(c.q)(),_=Object(c.q)(),W=Object(c.q)(),$=Object(c.q)(!1),V=Object(c.q)(!f),[z,Q]=Object(c.r)(),[K,Y]=Object(c.r)(Boolean(w)),Z=Boolean(f);Object(je.a)(()=>{Z&&Object(g.d)(()=>{V.current=!1})},[Z]),Object(je.a)(()=>{_.current=I,G.current||(G.current=I)},[I]);const{observe:ee,freeze:te,unfreeze:ae}=Object(ft.a)({rootRef:D,throttleMs:qa,margin:Ga}),{observe:se,freeze:ce,unfreeze:re}=Object(ft.a)({rootRef:D},e=>{if("thread"!==a)return;let t=0;const s=[];e.forEach(e=>{const{isIntersecting:a,target:n}=e;if(!a)return;const{dataset:c}=n,r=Number(c.lastMessageId||c.messageId);r>t&&(t=r),c.hasUnreadMention&&s.push(r)}),_.current&&t>=_.current&&N({maxId:t}),s.length&&P({messageIds:s})});Object(je.a)(()=>{W.current=w,w?(te(),ce()):(re(),ae())},[w]);const{observe:oe}=Object(ft.a)({rootRef:D,throttleMs:qa});Object(c.n)(()=>{w?Y(!0):setTimeout(()=>{Y(!1)},200)},[w]);const ie=Object(c.p)(()=>{if(!f||!p)return;const e=!R||f[0]&&y!==f[0]?f:[R,...f];if(!e.length)return;const t=e.map(e=>p[e]);return gt(Object(d.k)(t,["date","id"]),G.current)},[f,p,y,R]),[le,de,be]=Object(c.p)(()=>"thread"===a?[Object(g.a)(()=>k({direction:l.e.Backwards}),1e3,!0,!1),Object(g.a)(()=>k({direction:l.e.Forwards}),1e3,!0,!1),Object(g.a)(()=>k({direction:l.e.Around}),1e3,!0,!1)]:[],[k,f]),{isScrolled:ue,updateStickyDates:me}=pt(),he=Object(c.m)(()=>{if($.current)return void($.current=!1);const s=D.current;W.current||me(s,r),_a(()=>{Object(g.b)(()=>{s.parentElement&&(B.current=s.scrollHeight-s.scrollTop,"thread"===a&&T({chatId:e,threadId:t,scrollOffset:B.current}))})})},[me,r,a,T,e,t]);Object(c.n)(()=>{if(!("ResizeObserver"in window))return;const e=new ResizeObserver(([e])=>{e.target.offsetParent&&Q(e.contentRect.height)});return e.observe(D.current),()=>{e.disconnect()}},[]);const{height:Oe}=_e();Object(c.n)(()=>{D.current.dataset.normalHeight=String(D.current.offsetHeight)},[Oe]),Object(c.n)(()=>{if(!be||!u||E||w)return;const e=D.current;(!f||f.length{if(!f||!q.current)return;const e=q.current.filter(e=>f.includes(Number(e.dataset.messageId))),t=e[1]||e[0];t&&(U.current=t.id,H.current=t.getBoundingClientRect().top)},[f,v,z,r]),Object(Ot.a)(([e,t,a])=>{const s=D.current;if(q.current=Array.from(s.querySelectorAll(".message-list-item")),!s.offsetParent)return;const c=v&&f&&f.length{s.parentElement&&s.parentElement.classList.remove("force-messages-scroll")},1e3));const{scrollTop:o,scrollHeight:i,offsetHeight:l}=s,d=B.current,b=q.current[q.current.length-1],u=b?b.offsetHeight:0,m=v&&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],p=f&&W.current===f[f.length-1];if(m&&j&&!O&&!p&&(b&&Object(g.b)(()=>{Object(vt.a)(s,b,"end",20,void 0,void 0,void 0,!0)}),h=i-l,B.current=Math.max(i-h,l),!c))return;const I=void 0!==a&&a!==z,y=U.current&&s.querySelector("#"+U.current),E=!y&&G.current&&s.querySelector(".unread-divider");if(m&&I){if(Object(vt.b)())return;h=i-l}else if(y){h=o+(y.getBoundingClientRect().top-(H.current||0))}else h=E?E.offsetTop-(r?60:10):i-d;Object(It.a)(s,h),W.current||($.current=!0,Object(g.b)(()=>{$.current=!1})),B.current=Math.max(i-h,l)},[f,v,z,r]),Object(c.n)(()=>{(!S||S>0)&&Object(J.b)(200+n.c)},[S,M]);const ge=Object(ne.a)(),fe=Boolean(e&&Object(m.lb)(e)),pe=Boolean(!fe&&!h||j),Ie=Object(X.a)("MessageList custom-scroll",!pe&&"no-avatars",h&&"no-avatars",!O&&"no-composer","pinned"===a&&"type-pinned",M&&"select-mode-active",K&&"has-focusing",ue&&"scrolled");return c.a.createElement("div",{ref:D,className:Ie,onScroll:he},E?c.a.createElement("div",{className:"empty"},c.a.createElement("span",null,C?C.text:"This is a private "+(h?"channel":"chat"))):L?c.a.createElement("div",{className:"empty rich"},c.a.createElement("span",null,Object(tt.a)(ge(L),["br","emoji","links"]))):f&&!ie?c.a.createElement("div",{className:"empty"},c.a.createElement("span",null,ge("NoMessages"))):f&&ie||A?c.a.createElement(Et,{containerRef:D,className:"messages-container",messageIds:f||[A.id],focusingId:w,loadMoreForwards:de,loadMoreBackwards:le,isViewportNewest:v,firstUnreadId:I,onFabToggle:i,onNotchToggle:b},function(e,t,a,s,r,o,i,l,b,u,h,O,j,g=!1,f=!1){const p=c.a.createElement("div",{className:Object(X.a)("unread-divider","local-action-message"),key:"unread-messages"},c.a.createElement("span",null,e("UnreadMessages"))),I=f?0:t.reduce((e,t)=>e+Object(d.h)(t.senderGroups).length,0);let v=0;const y=t.map((t,O,f)=>{const y=t.senderGroups.map((t,n,g)=>{if(1===t.length&&!jt(t[0])&&Object(m.db)(t[0])){const e=t[0],s=n===g.length-1&&O===f.length-1;return Object(d.e)([e.id===l.current&&p,c.a.createElement(Wt,{key:e.id,message:e,observeIntersection:a,appearanceOrder:I-++v,isLastInList:s})])}let y;return Object(d.h)(t.map((E,C)=>{const w=jt(E)?E.mainMessage:E,M=jt(E)?E:void 0,S=Object(m.tb)(w),k=jt(E),N=t[C+1];w.previousLocalId&&i.current==="message"+w.previousLocalId&&(i.current="message"+w.id);const P=!k&&w.groupedId?w.groupedId:void 0,T=N&&!jt(N)?N.groupedId:void 0,A={isFirstInGroup:0===C,isLastInGroup:C===t.length-1,isFirstInDocumentGroup:Boolean(P&&P!==y),isLastInDocumentGroup:Boolean(P&&P!==T),isLastInList:C===t.length-1&&n===g.length-1&&O===f.length-1};y=P;const x=Object(m.F)(w),L="scheduled"!==u?x:`${w.date}_${x}`;return Object(d.e)([w.id===l.current?p:void 0,c.a.createElement(Ha,{key:L,message:w,observeIntersectionForBottom:a,observeIntersectionForMedia:s,observeIntersectionForAnimatedStickers:r,album:M,withAvatar:A.isLastInGroup&&o&&!S&&!(w.id===h),withSenderName:A.isFirstInGroup&&o&&!S,threadId:b,messageListType:u,noComments:!1===j,appearanceOrder:I-++v,isFirstInGroup:A.isFirstInGroup,isLastInGroup:A.isLastInGroup,isFirstInDocumentGroup:A.isFirstInDocumentGroup,isLastInDocumentGroup:A.isLastInDocumentGroup,isLastInList:A.isLastInList}),w.id===h&&c.a.createElement("div",{className:"local-action-message",key:"discussion-started"},c.a.createElement("span",null,e("DiscussionStarted")))])}))});return c.a.createElement("div",{className:"message-date-group",key:t.datetime,teactFastList:!0},c.a.createElement("div",{className:"sticky-date",key:"date-header"},c.a.createElement("span",{dir:"auto"},g&&t.originalDate===n.mb&&e("MessageScheduledUntilOnline"),g&&t.originalDate!==n.mb&&e("MessageScheduledOn",Object(x.c)(e,t.datetime,void 0,!0)),!g&&Object(x.c)(e,t.datetime))),Object(d.h)(y))});return Object(d.h)(y)}(ge,ie||gt([A]),se,ee,oe,pe,U,G,t,a,R,0,F,!!ie&&"scheduled"===a,!ie||!V.current)):c.a.createElement(Ce.a,{color:"white"}))}));a(233);var $a=Object(c.h)(Object(s.h)(e=>{const t=Object(o.y)(e);if(!t)return{};const{chatId:a,threadId:s,type:n}=t,c=Object(o.f)(e,a);return{messageListType:n,unreadCount:c&&s===i.MAIN_THREAD_ID&&"thread"===n?c.unreadCount:void 0}},(e,t)=>Object(d.l)(t,["focusLastMessage"]))(({isShown:e,canPost:t,messageListType:a,unreadCount:s,focusLastMessage:n})=>{const r=Object(c.q)(null),o=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(vt.a)(e,a,"end",20)}},[e,a,n]),i=Object(X.a)("ScrollDownButton",e&&"revealed",!t&&"no-composer");return c.a.createElement("div",{ref:r,className:i},c.a.createElement("div",{className:"ScrollDownButton-inner"},c.a.createElement(oe.a,{color:"secondary",round:!0,onClick:o,ariaLabel:"Scroll to bottom"},c.a.createElement("i",{className:"icon-arrow-down"})),Boolean(s)&&c.a.createElement("div",{className:"unread-count"},Object(Ke.b)(s))))})),Va=a(124),za=a(133);async function Qa(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(qe.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),Qa(e,c,!0,s)):Qa(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(qe.h)(n);o={width:e,height:t,duration:a}}i=await Object(qe.c)(n)}return{blobUrl:n,filename:e,mimeType:c,size:r,quick:o,previewBlobUrl:i,...s}}var Ka=a(176),Ya=a.p+"8ccc0b555efcec3616377aea078dda16.js";const Ja={encoderPath:Ya,reuseWorker:!0},Xa={type:"audio/ogg"};let Za,es,ts;async function as(){return Za||(Za=a.e(9).then(a.t.bind(null,313,7)),es=(await Za).default,ts=new es(Ja)),Za}async function ss(e){await async function(){await as(),await ts.start()}();const t=Date.now();let a;const s=[],n=[];ts.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}}(ts,t=>{n.push(255*t),e(t)});return{stop:()=>new Promise((e,r)=>{ts.onstop=()=>{e({blob:new Blob(s,Xa),duration:Math.round(((a||Date.now())-t)/1e3),waveform:n})},ts.onerror=r;const o=Math.max(0,t+1e3-Date.now());setTimeout(()=>{ts.stop(),c()},o)}),pause:()=>{const e=Math.max(0,t+1e3-Date.now());setTimeout(()=>{ts.pause(),a=Date.now(),c()},e)}}}const ns=["image/png","image/jpeg","image/gif"];function cs(e){const{text:t,entities:a}=e||{};if(!t)return"";const s=Object(wt.b)(t,a,void 0,void 0,!0);return Array.isArray(s)?s.join(""):s}let rs,os;var is=a(59);var ls=a(177),ds=a(185);var bs=Object(c.h)(e=>{const{isOpen:t}=e,a=Object(Ee.a)(ye.a.Extra,"DeleteMessageModal",!t);return a?c.a.createElement(a,e):void 0});function us(){return(us=Object.assign||function(e){for(var t=1;t{const a=Object(c.q)(!1),s=Object(c.m)(()=>{if(a.current=!0,hs)return hs=!1,void e();ms&&(clearTimeout(ms),ms=void 0),ms=window.setTimeout(()=>{a.current&&e()},200)},[e]),n=Object(c.m)(()=>{a.current=!1},[]);return c.a.createElement(oe.a,us({},t,{onMouseEnter:h.l?void 0:s,onMouseLeave:h.l?void 0:n,onClick:h.l?e:void 0}))});var js=Object(c.h)(e=>{const{isOpen:t}=e,a=Object(Ee.a)(ye.a.Extra,"AttachMenu",!t);return a?c.a.createElement(a,e):void 0});var gs=Object(c.h)(e=>{const{isOpen:t}=e,a=Object(Ee.a)(ye.a.Extra,"SymbolMenu",!t);return a?c.a.createElement(a,e):void 0});var fs=Object(c.h)(e=>{const{isOpen:t}=e,a=Object(Ee.a)(ye.a.Extra,"MentionTooltip",!t);return a?c.a.createElement(a,e):void 0});var ps=Object(c.h)(e=>{const{isOpen:t}=e,a=Object(Ee.a)(ye.a.Extra,"CustomSendMenu",!t);return a?c.a.createElement(a,e):void 0});var Is=e=>{const{isOpen:t}=e,a=Object(Ee.a)(ye.a.Extra,"StickerTooltip",!t);return a?c.a.createElement(a,e):void 0},vs=a(178);var ys=Object(c.h)(e=>{const{isOpen:t}=e,a=Object(Ee.a)(ye.a.Extra,"BotKeyboardMenu",!t);return a?c.a.createElement(a,e):void 0}),Es=a(179),Cs=a(114);a(235);var ws=Object(c.h)(Object(s.h)(e=>{const{chatId:t,threadId:a,type:s}=Object(o.y)(e)||{};if(!t||!a||!s)return{};const{currentUserId:n,forwardMessages:{fromChatId:c,toChatId:r,messageIds:i}}=e,l=Object(o.lb)(e,t,a),d="scheduled"===s?Object(o.E)(e,t):Object(o.C)(e,t,a),b=e.settings.byKey.animationLevel>=1,u=r===t;let h,O;if(l?h=Object(o.k)(e,t,l):d?h=Object(o.D)(e,t,a,s):u&&1===i.length&&(h=Object(o.k)(e,c,i[0])),l&&h){const{forwardInfo:a}=h,s=t===n;a&&(a.isChannelPost||s)&&(O=Object(o.J)(e,h)),O||(O=Object(o.sb)(e,h))}else u&&(O=Object(m.lb)(c)?Object(o.Fb)(e,c):Object(o.f)(e,c));return{replyingToId:l,editingId:d,message:h,sender:O,shouldAnimate:b,forwardedMessagesCount:u?i.length:void 0}},(e,t)=>Object(d.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(Cs.a)([r],r?300:void 0),{shouldRender:m,transitionClassNames:h}=Object(Z.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(te.a)(O):void 0,[b,O]);const j=Object(c.m)(()=>{l({chatId:a.chatId,messageId:a.id})},[l,a]),g=Object(X.a)("ComposerEmbeddedMessage",h),f=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(oe.a,{round:!0,color:"translucent",ariaLabel:"Cancel replying",onClick:O},c.a.createElement("i",{className:"icon-close"})),c.a.createElement($t,{className:"inside-input",message:a,sender:s,customText:f,title:t?"Edit Message":void 0,onClick:j})))}));var Ms=Object(c.h)(e=>{const{attachments:t}=e,a=Object(Ee.a)(ye.a.Extra,"AttachmentModal",!t.length);return a?c.a.createElement(a,e):void 0});var Ss=Object(c.h)(e=>{const{isOpen:t}=e,a=Object(Ee.a)(ye.a.Extra,"PollModal",!t);return a?c.a.createElement(a,e):void 0});var ks=Object(c.h)(e=>{const{isOpen:t}=e,a=Object(Ee.a)(ye.a.Extra,"DropArea",!t);return a?c.a.createElement(a,e):void 0});a(236);const Ns=new RegExp(n.hb,"i");var Ps=Object(c.h)(Object(s.h)((e,{chatId:t,threadId:a})=>{const s=Object(o.bb)(e,t,a);return{webPagePreview:e.webPagePreview,noWebPage:s}},(e,t)=>Object(d.l)(t,["loadWebPagePreview","clearWebPagePreview","toggleMessageWebPage"]))(({chatId:e,threadId:t,messageText:a,disabled:s,webPagePreview:n,noWebPage:r,loadWebPagePreview:o,clearWebPagePreview:l,toggleMessageWebPage:d})=>{const b=Object(c.p)(()=>{const{text:e,entities:t}=Object(za.a)(a),s=t&&t.find(({type:e})=>e===i.ApiMessageEntityTypes.TextUrl);if(s)return s.url;const n=e.match(Ns);return n?n[0]:void 0},[a]);Object(c.n)(()=>{b?o({text:b}):(l(),d({chatId:e,threadId:t}))},[e,d,l,b,o,t]),Object(je.a)(()=>{l(),d({chatId:e,threadId:t})},[e]);const u=Boolean(n&&a.length&&!r&&!s),{shouldRender:m,transitionClassNames:h}=Object(Z.a)(u),O=Object(Qe.a)(n);if(!m||!O)return;const{photo:j,...g}=O,f={content:{webPage:g}};return c.a.createElement("div",{className:Object(X.a)("WebPagePreview",h)},c.a.createElement("div",null,c.a.createElement(oe.a,{round:!0,color:"translucent",ariaLabel:"Clear Webpage Preview",onClick:()=>{d({chatId:e,threadId:t,noWebPage:!0})}},c.a.createElement("i",{className:"icon-close"})),c.a.createElement(Ma,{message:f,inPreview:!0})))})),Ts=a(117);var As=Object(c.h)(e=>{const{isOpen:t}=e,a=Object(Ee.a)(ye.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(Ee.a)(ye.a.Extra,"PaymentModal",!t);return a?c.a.createElement(a,e):void 0});var Ls,Rs=Object(c.h)(e=>{const{isOpen:t}=e,a=Object(Ee.a)(ye.a.Extra,"ReceiptModal",!t);return a?c.a.createElement(a,e):void 0});a(237);!function(e){e.Send="send",e.Record="record",e.Edit="edit"}(Ls||(Ls={}));var Fs=Object(c.h)(Object(s.h)((e,{chatId:t,threadId:a,messageListType:s})=>{const n=Object(o.f)(e,t),c=n&&Object(o.o)(e,n),r=n?Object(o.N)(e,n):void 0,l=Object(o.O)(e,t),d=r&&Object(o.ab)(e,t),b=Object(o.nb)(e,t);return{editingMessage:Object(o.D)(e,t,a,s),connectionState:e.connectionState,draft:Object(o.B)(e,t,a),chat:n,isChatWithBot:r,isChatWithSelf:l,canScheduleUntilOnline:!l&&!r&&n&&c&&Object(m.lb)(t)&&c.status&&Boolean(c.status.wasOnline),isRightColumnShown:Object(o.V)(e),isSelectModeActive:Object(o.R)(e),withScheduledButton:a===i.MAIN_THREAD_ID&&"thread"===s&&Boolean(b&&b.length),shouldSchedule:"scheduled"===s,botKeyboardMessageId:d?d.id:void 0,isForwarding:t===e.forwardMessages.toChatId,canSuggestMembers:n&&Object(m.kb)(n),isPollModalOpen:e.isPollModalOpen,stickersForEmoji:e.stickers.forEmoji.stickers,groupChatMembers:n&&n.fullInfo&&n.fullInfo.members,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}},(e,t)=>Object(d.l)(t,["sendMessage","editMessage","saveDraft","clearDraft","showError","setStickerSearchQuery","setGifSearchQuery","forwardMessages","openPollModal","closePollModal","closePaymentModal","clearReceipt","loadScheduledHistory","openChat","addRecentEmoji"]))(({dropAreaState:e,shouldSchedule:t,canScheduleUntilOnline:a,onDropHide:r,editingMessage:o,chatId:l,threadId:d,messageListType:b,draft:u,chat:O,connectionState:j,isChatWithBot:f,isChatWithSelf:p,isRightColumnShown:I,isSelectModeActive:v,isForwarding:y,canSuggestMembers:E,isPollModalOpen:C,isPaymentModalOpen:w,isReceiptModalOpen:M,botKeyboardMessageId:S,withScheduledButton:k,stickersForEmoji:N,groupChatMembers:P,currentUserId:T,usersById:A,lastSyncTime:L,contentToBeScheduled:R,shouldSuggestStickers:F,recentEmojis:D,sendMessage:B,editMessage:U,saveDraft:H,clearDraft:q,showError:G,setStickerSearchQuery:_,setGifSearchQuery:W,forwardMessages:$,openPollModal:V,closePollModal:z,loadScheduledHistory:Q,closePaymentModal:K,openChat:Y,clearReceipt:J,addRecentEmoji:Z})=>{const ee=Object(c.q)(null),[ae,se]=Object(c.r)(""),ce=Object(c.q)(),re=Object(na.a)(e),[ie,le,de]=Object(ot.a)(),[be,ue]=Object(c.r)(),he=Object(c.q)(ae);Object(c.n)(()=>{he.current=ae},[ae]),Object(c.n)(()=>{ce.current=void 0},[l]),Object(c.n)(()=>{l&&L&&d===i.MAIN_THREAD_ID&&Q()},[l,Q,L,d]),Object(c.o)(()=>{ee.current&&(ee.current.innerHTML='')},[]),Object(c.n)(()=>{R&&(ue(R),le())},[R,le]);const[Oe,je]=Object(c.r)([]),[ge,fe,pe]=Object(ot.a)(),[Ie,ve,ye]=Object(ot.a)(),[Ee,Ce,we]=Object(ot.a)(),[Me,Se,ke]=Object(ot.a)(),[Ne,Pe]=Object(ot.a)(),[Te,Ae,xe]=Object(ot.a)(),{startRecordingVoice:Le,stopRecordingVoice:Re,pauseRecordingVoice:Fe,activeVoiceRecording:De,currentRecordTime:Be,recordButtonRef:He,startRecordTimeRef:qe}=(()=>{const e=Object(c.q)(null),[t,a]=Object(c.r)(),s=Object(c.q)(),[n,r]=Object(c.r)();Object(c.n)(()=>{h.e&&as()},[]);const o=Object(c.m)(async()=>{try{const{stop:t,pause:n}=await ss(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(te.a)(l):void 0,[t,l]),{startRecordingVoice:o,pauseRecordingVoice:i,stopRecordingVoice:l,activeVoiceRecording:t,currentRecordTime:n,recordButtonRef:e,startRecordTimeRef:s}})(),Ge=o?Ls.Edit:!h.m||De||ae&&!Oe.length||y?Ls.Send:Ls.Record,_e=!t,{isMentionTooltipOpen:We,mentionFilter:$e,closeMentionTooltip:Ve,insertMention:ze,mentionFilteredMembers:Qe}=Object(ds.a)(E&&!Oe.length,ae,se,void 0,P,T,A),{isContextMenuOpen:Ke,handleContextMenu:Ye,handleContextMenuClose:Je,handleContextMenuHide:Xe}=Object(Ct.a)(He,!(Ge===Ls.Send&&_e)),Ze=Object(c.p)(()=>Object(m.c)(O,f),[O,f]),et=O&&Object(m.gb)(O),at=Object(m.k)(O),{isStickerTooltipOpen:st,closeStickerTooltip:nt}=function(e,t,a){const{loadStickersForEmoji:n,clearStickersForEmoji:r}=Object(s.d)(),o=h.d&&1===Object(is.a)(t)||!h.d&&Boolean(t.match(/^]*?>$/g)),i=Boolean(a)&&o;return Object(c.n)(()=>{e&&o?n({emoji:t}):!i&&o||r()},[t,o,r,n,e]),{isStickerTooltipOpen:i,closeStickerTooltip:r}}(Boolean(F&&Ze.canSendStickers&&!Oe.length),ae,N),{isEmojiTooltipOpen:ct,closeEmojiTooltip:rt,filteredEmojis:it,insertEmoji:lt}=Object(ls.a)(Boolean(F&&Ze.canSendStickers&&!Oe.length),ae,D,void 0,se),dt=Object(c.m)((e,t=n.v)=>{const a=window.getSelection(),s=document.getElementById(t),c=Object(tt.a)(e,["escape_html","emoji_html","br_html"]).join("").replace(/\u200b+/g,"​");if(a.rangeCount){const t=a.getRangeAt(0);if(Object(Ka.a)(t))return void(h.d?document.execCommand("insertText",!1,e):(!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),t.removeAllRanges(),t.addRange(a))}}(c),s.dispatchEvent(new Event("input",{bubbles:!0}))));se(`${he.current}${c}`),h.g||requestAnimationFrame(()=>{Object(Va.a)(s)})}else se(`${he.current}${c}`)},[]),bt=Object(c.m)(()=>{const e=window.getSelection();if(e.rangeCount){const t=e.getRangeAt(0);if(Object(Ka.a)(t))return void document.execCommand("delete",!1)}se(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}(he.current))},[]),ut=Object(c.m)(()=>{se(""),je([]),nt(),de(),ue(void 0),Ve(),rt(),h.g?setTimeout(()=>we(),350):we()},[nt,de,Ve,rt,we]),mt=Object(na.a)(l);Object(c.n)(()=>{mt&&l!==mt&&(Re(),ut())},[l,mt,ut,Re]);const ht=((e,t,a,s,r,o)=>{Object(c.n)(()=>{a?(t(cs(a.content.text)),requestAnimationFrame(()=>{const e=document.getElementById(n.v);Object(Va.a)(e,!0)})):t("")},[a,t]);return Object(c.m)(()=>{const{text:t,entities:n}=Object(za.a)(e.current);a&&(t||Object(m.cb)(a)?(o({messageId:a.id,text:t,entities:n}),s()):r())},[o,a,e,r,s])})(he,se,o,ut,Se,U);((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(za.a)(r.current)}):d({chatId:e,threadId:t})},[d,i,r,l]),u=Object(c.p)(()=>Object(g.a)(e=>e(),n.u,!1),[t]),m=Object(na.a)(t),h=Object(na.a)(a);Object(c.n)(()=>(rs=t,os=a,()=>{rs=void 0,os=void 0,b(t,a)}),[t,a,b]),Object(c.n)(()=>{t===m&&a===h||e&&(o(cs(e)),requestAnimationFrame(()=>{const e=document.getElementById(n.v);Object(Va.a)(e,!0)}))},[t,a,e,o,b,m,h]);const O=Object(na.a)(s);Object(c.n)(()=>{t&&a&&m===t&&h===a&&O!==s&&(s.length?u(()=>{rs===t&&os===a&&b(t,a)}):b(t,a))},[t,s,m,O,h,u,a,b]),Object(c.n)(()=>{function e(){t&&a&&b(t,a)}return window.addEventListener("blur",e),()=>{window.removeEventListener("blur",e)}},[t,a,b])})(u,l,d,ae,he,se,o,H,q),((e,t,a)=>{Object(c.n)(()=>{async function s(s){if(!s.clipboardData)return;const c=document.activeElement;if(c&&"INPUT"===c.tagName&&![n.v,n.w].includes(c.id))return;const{items:r}=s.clipboardData,o=Array.from(r).find(e=>ns.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 Qa(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])})(dt,je,o);const Ot=Object(c.m)(async(e,t)=>{je(await Promise.all(e.map(e=>Qa(e.name,e,t))))},[]),jt=Object(c.m)(async(e,t)=>{je([...Oe,...await Promise.all(e.map(e=>Qa(e.name,e,t)))])},[Oe]),gt=Object(c.m)(()=>{je([])},[]),ft=Object(c.m)(async(e=!1,t)=>{if("connectionStateReady"!==j)return;let a=Oe;if(De){const e=await Re();if(e){const{blob:t,duration:s,waveform:n}=e;a=[await Qa("wonderful-voice-message.ogg",t,!1,{voice:{duration:s,waveform:n}})]}}const{text:s,entities:c}=Object(za.a)(he.current);if(a.length||s||y)if(a.length&&s&&s.length>1024){const e=s.length-1024;G({error:{message:"CAPTION_TOO_LONG_PLEASE_REMOVE_CHARACTERS",textParams:{"{EXTRA_CHARS_COUNT}":e,"{PLURAL_S}":e>1?"s":""}}})}else{if(a.length||s){if(at&&!et){const e=Math.floor(Date.now()/1e3),t=ce.current&&Math.floor(e-ce.current),a=at.nextSendDate&&at.nextSendDate>e;if(t&&t{e={...e,isPreloadedGlobally:!0},t?(ue({sticker:e}),le()):(B({sticker:e}),requestAnimationFrame(ut))},[t,le,B,ut]),It=Object(c.m)(e=>{t?(ue({gif:e}),le()):(B({gif:e}),requestAnimationFrame(ut))},[t,le,B,ut]),vt=Object(c.m)(e=>{t?(ue({poll:e}),z(),le()):(B({poll:e}),z())},[z,le,B,t]),yt=Object(c.m)(()=>{t?(ue({isSilent:!0}),le()):ft(!0)},[ft,le,t]),Et=Object(c.m)(e=>{const{isSilent:t,...a}=be||{},s=Math.round(Math.max(e.getTime(),Date.now()+6e4)/1e3);be&&0!==Object.keys(a).length?(B({...be,scheduledAt:s}),requestAnimationFrame(ut)):ft(!!t,s),de()},[de,ft,ut,be,B]),wt=Object(c.m)(()=>{Et(new Date(1e3*n.mb))},[Et]),Mt=Object(c.m)(()=>{de(),ue(void 0)},[de]),St=Object(c.m)(e=>{"stickers"===e?(_({query:""}),W({query:void 0})):(W({query:""}),_({query:void 0}))},[_,W]),kt=Object(c.m)(()=>{const e=document.getElementById(n.v);h.g&&e===document.activeElement?(e.blur(),setTimeout(()=>{Ce()},100)):Ce()},[Ce]),Nt=Object(c.m)(()=>{Y({id:l,threadId:d,type:"scheduled"})},[Y,l,d]);Object(c.n)(()=>{I&&h.g&&we()},[I,we]),Object(c.n)(()=>{v?Ae():setTimeout(()=>{xe()},200)},[v,xe,Ae]);const Pt=Object(c.m)(()=>{switch(Ge){case Ls.Send:t?(De&&Fe(),le()):(ft(),requestAnimationFrame(ut));break;case Ls.Record:Le();break;case Ls.Edit:ht()}},[Ge,ut,t,Le,ht,De,le,Fe,ft]),Tt=Object(ne.a)(),At=Ge===Ls.Record&&!Ze.canAttachMedia,xt=Object(na.a)(o,!0),Lt=o||xt,Rt=new Date;Rt.setSeconds(0),Rt.setMilliseconds(0);const Ft=new Date;Ft.setFullYear(Ft.getFullYear()+1);let Dt="Send message";switch(Ge){case Ls.Edit:Dt="Save edited message";break;case Ls.Record:Dt=At?"Posting media content is not allowed in this group.":"Record a voice message"}const Bt=Object(X.a)("Composer",!v&&"shown",Te&&"hover-disabled"),Ut=Object(X.a)("mobile-symbol-menu-button",Ne?Ee&&"menu-opened":Ee&&"is-loading");return c.a.createElement("div",{className:Bt},Ze.canAttachMedia&&c.a.createElement(Ts.a,{containerId:"#middle-column-portals"},c.a.createElement(ks,{isOpen:e!==Ue.a.None,withQuick:[e,re].includes(Ue.a.QuickFile),onHide:r,onFileSelect:Ot})),c.a.createElement(Ms,{attachments:Oe,caption:Oe.length?ae:"",canSuggestMembers:E,groupChatMembers:P,currentUserId:T,usersById:A,recentEmojis:D,onCaptionUpdate:se,addRecentEmoji:Z,onSend:t?le:ft,onFileAppend:jt,onClear:gt}),c.a.createElement(Ss,{isOpen:Boolean(C),onClear:z,onSend:vt}),c.a.createElement(xs,{isOpen:Boolean(w),onClose:K}),c.a.createElement(Rs,{isOpen:Boolean(M),onClose:J}),Lt&&c.a.createElement(bs,{isOpen:Me,isSchedule:"scheduled"===b,onClose:ke,message:Lt}),c.a.createElement(fs,{isOpen:We,filter:$e,onClose:Ve,onInsertUserName:ze,filteredChatMembers:Qe,usersById:A}),c.a.createElement("div",{id:"message-compose"},c.a.createElement("div",{className:"svg-appendix",ref:ee}),c.a.createElement(ws,null),c.a.createElement(Ps,{chatId:l,threadId:d,messageText:Oe.length?"":ae,disabled:!Ze.canAttachEmbedLinks}),c.a.createElement("div",{className:"message-input-wrapper"},h.g?c.a.createElement(oe.a,{className:Ut,round:!0,color:"translucent",onClick:Ee?we:kt,ariaLabel:"Choose emoji, sticker or GIF"},c.a.createElement("i",{className:"icon-smile"}),c.a.createElement("i",{className:"icon-keyboard"}),c.a.createElement(me.a,{color:"gray"})):c.a.createElement(Os,{className:""+(Ee?"activated":""),round:!0,faded:!0,color:"translucent",onActivate:Ce,ariaLabel:"Choose emoji, sticker or GIF"},c.a.createElement("i",{className:"icon-smile"})),c.a.createElement(Es.a,{id:"message-input-text",html:Oe.length?"":ae,placeholder:De&&window.innerWidth<=600?"":Tt("Message"),shouldSetFocus:Ee,shouldSupressFocus:h.g&&Ee,shouldSupressTextFormatter:ct||We,onUpdate:se,onSend:Ge===Ls.Edit?ht:t?le:ft,onSupressedFocus:we}),k&&c.a.createElement(oe.a,{round:!0,faded:!0,className:"scheduled-button",color:"translucent",onClick:Nt,ariaLabel:"Open scheduled messages"},c.a.createElement("i",{className:"icon-schedule"})),S&&!De&&!o&&c.a.createElement(Os,{className:""+(ge?"activated":""),round:!0,faded:!0,color:"translucent",onActivate:fe,ariaLabel:"Open bot command keyboard"},c.a.createElement("i",{className:"icon-bot-command"})),!De&&!o&&c.a.createElement(Os,{className:""+(Ie?"activated":""),round:!0,faded:!0,color:"translucent",onActivate:ve,ariaLabel:"Add an attachment"},c.a.createElement("i",{className:"icon-attach"})),De&&Be&&c.a.createElement("span",{className:"recording-state"},Object(x.i)(Be-qe.current)),c.a.createElement(Is,{isOpen:st,onStickerSelect:pt}),c.a.createElement(vs.a,{isOpen:ct,emojis:it,onClose:rt,onEmojiSelect:lt,addRecentEmoji:Z}),c.a.createElement(js,{isOpen:Ie,allowedAttachmentOptions:Ze,onFileSelect:Ot,onPollCreate:V,onClose:ye}),S&&c.a.createElement(ys,{messageId:S,isOpen:ge,onClose:pe}),c.a.createElement(gs,{isOpen:Ee,allowedAttachmentOptions:Ze,onLoad:Pe,onClose:we,onEmojiSelect:dt,onStickerSelect:pt,onGifSelect:It,onRemoveSymbol:bt,onSearchOpen:St,addRecentEmoji:Z}))),De&&c.a.createElement(oe.a,{round:!0,color:"danger",className:"cancel",onClick:Re,ariaLabel:"Cancel voice recording"},c.a.createElement("i",{className:"icon-delete"})),c.a.createElement(oe.a,{ref:He,round:!0,color:"secondary",className:`${Ge} ${De?"recording":""}`,disabled:At,ariaLabel:Dt,onClick:Pt,onContextMenu:Ge===Ls.Send&&_e?Ye:void 0},c.a.createElement("i",{className:"icon-send"}),c.a.createElement("i",{className:"icon-microphone-alt"}),c.a.createElement("i",{className:"icon-check"})),_e&&c.a.createElement(ps,{isOpen:Ke,onSilentSend:p?void 0:yt,onScheduleSend:t?void 0:le,onClose:Je,onCloseAnimationEnd:Xe}),c.a.createElement(As,{isOpen:ie,withTimePicker:!0,selectedAt:Rt.getTime(),maxAt:Object(x.k)(Ft),isFutureMode:!0,secondButtonLabel:a?"Send When Online":void 0,onClose:Mt,onSubmit:Et,onSecondButtonClick:a?wt:void 0}))}));var Ds=Object(c.h)(e=>{const{isActive:t}=e,a=Object(Ee.a)(ye.a.Extra,"MobileSearch",!t,!0);return a?c.a.createElement(a,e):void 0});var Bs=Object(c.h)(e=>{const{isActive:t}=e,a=Object(Ee.a)(ye.a.Extra,"MessageSelectToolbar",!t);return a?c.a.createElement(a,e):void 0});var Us=Object(c.h)(e=>{const{isOpen:t}=e,a=Object(Ee.a)(ye.a.Extra,"UnpinAllMessagesModal",!t);return a?c.a.createElement(a,e):void 0});a(238);const Hs=h.g?450+n.c:void 0;function qs(e){return"file"===e.kind&&e.type&&n.l.includes(e.type)}var Gs=Object(c.h)(Object(s.h)(e=>{const{theme:t}=e.settings.byKey,{isBlurred:a,background:s,backgroundColor:n,patternColor:c}=e.settings.themes[t]||{},r=Object(o.y)(e),{chats:{listIds:l}}=e,d={theme:t,customBackground:s,backgroundColor:n,patternColor:c,isRightColumnShown:Object(o.V)(e),isBackgroundBlurred:a,isMobileSearchActive:Boolean(h.g&&Object(o.A)(e)),isSelectModeActive:Object(o.R)(e),animationLevel:e.settings.byKey.animationLevel};if(!r||!l.active)return d;const{chatId:b,threadId:u,type:O}=r,j=Object(o.f)(e,b),g=Object(o.ib)(e,b),{chatId:f,messageId:p}=e.audioPlayer,I=j&&Object(m.e)(j,u),v=Object(o.K)(e,b),y="pinned"===O;return{...d,chatId:b,threadId:u,messageListType:O,isPrivate:Object(m.lb)(b),canPost:!y&&(!j||I)&&(!v||h.g),isPinnedMessageList:y,messageSendingRestrictionReason:j&&Object(m.K)(j),hasPinnedOrAudioMessage:u!==i.MAIN_THREAD_ID||Boolean(g&&g.length)||Boolean(f&&p),pinnedMessagesCount:g?g.length:0}},(e,t)=>Object(d.l)(t,["openChat","unpinAllMessages","loadUser"]))(({chatId:e,threadId:t,messageListType:a,isPrivate:s,isPinnedMessageList:r,canPost:o,messageSendingRestrictionReason:l,hasPinnedOrAudioMessage:d,pinnedMessagesCount:b,customBackground:u,theme:m,backgroundColor:O,patternColor:j,isRightColumnShown:g,isBackgroundBlurred:f,isMobileSearchActive:p,isSelectModeActive:I,animationLevel:v,openChat:y,unpinAllMessages:E,loadUser:C})=>{const{width:w}=_e(),[M,S]=Object(c.r)(Ue.a.None),[k,N]=Object(c.r)(),[P,T]=Object(c.r)(),[A,x]=Object(c.r)(!1),L=d&&(wn.bb&&w=n.ab&&we?Object(te.a)(()=>{y({id:void 0})}):void 0,[e,y]),Object(c.n)(()=>{S(Ue.a.None),N(void 0),T(void 0)},[e]),Object(c.n)(()=>{s&&C({userId:e})},[e,s,C]);const q=Object(c.m)(e=>{if(h.l)return;const{items:t}=e.dataTransfer||{},a=t&&Array.from(t).every(qs);S(a?Ue.a.QuickFile:Ue.a.Document)},[]),G=Object(c.m)(()=>{S(Ue.a.None)},[]),_=Object(c.m)(()=>{x(!0)},[]),W=Object(c.m)(()=>{x(!1)},[]),$=Object(c.m)(()=>{E({chatId:e}),W(),y({id:e})},[E,y,W,e]),V=((e,t)=>{const[a,s]=Object(c.r)(t);return Object(c.n)(()=>{t&&(t.startsWith("#")?s(t):He.c(n.m,e,He.a.Blob).then(e=>{const t=URL.createObjectURL(e);Object(qe.g)(t).then(()=>{s(`url(${t})`)})}))},[t,e]),t?a:void 0})(m,u),z=Object(X.a)(U&&"has-header-tools",u&&"custom-bg-image",O&&"custom-bg-color",u&&f&&"blurred",h.n?"mask-image-disabled":"mask-image-enabled"),Q=Object(X.a)("messaging-disabled",!I&&"shown"),{composerHiddenScale:K,toolbarHiddenScale:Y,composerTranslateX:J,toolbarTranslateX:Z,unpinHiddenScale:ee,toolbarForUnpinHiddenScale:se}=Object(c.p)(()=>$e(w,B),[B,w]),ce=Object(ne.a)(),re=Object(X.a)("middle-column-footer",!B&&"no-composer",B&&P&&!I&&"with-notch");return c.a.createElement("div",{id:"MiddleColumn",className:z,style:`\n --composer-hidden-scale: ${K};\n --toolbar-hidden-scale: ${Y};\n --unpin-hidden-scale: ${ee};\n --toolbar-unpin-hidden-scale: ${se};\n --composer-translate-x: ${J}px;\n --toolbar-translate-x: ${Z}px;\n --pattern-color: ${j};\n --theme-background-color:\n ${O||("dark"===m?n.n:n.J)};\n `},c.a.createElement("div",{id:"middle-column-bg",style:V?"--custom-background: "+V:void 0}),c.a.createElement("div",{id:"middle-column-portals"}),R&&F&&c.a.createElement(c.a.Fragment,null,c.a.createElement("div",{className:"messages-layout",onDragEnter:B?q:void 0},c.a.createElement(ht,{chatId:R,threadId:F,messageListType:D}),c.a.createElement(ae.a,{name:v===n.e?"slide":"fade",activeKey:"thread"===D&&F===i.MAIN_THREAD_ID?1:2,shouldCleanup:!0},()=>c.a.createElement(c.a.Fragment,null,c.a.createElement(Wa,{key:`${R}-${F}-${D}`,chatId:R,threadId:F,type:D,canPost:B,hasTools:U,onFabToggle:N,onNotchToggle:T}),c.a.createElement("div",{className:re},B&&c.a.createElement(Fs,{chatId:R,threadId:F,messageListType:D,dropAreaState:M,onDropHide:G}),r&&c.a.createElement("div",{className:"unpin-button-container"},c.a.createElement(oe.a,{size:"tiny",fluid:!0,color:"secondary",className:"unpin-all-button",onClick:_},c.a.createElement("i",{className:"icon-unpin"}),c.a.createElement("span",null,ce("Chat.Pinned.UnpinAll",b,"i")))),!r&&!B&&l&&c.a.createElement("div",{className:Q},c.a.createElement("div",{className:"messaging-disabled-inner"},c.a.createElement("span",null,l))),c.a.createElement(Bs,{messageListType:D,isActive:I,canPost:B})))),c.a.createElement($a,{isShown:H,canPost:B})),h.g&&c.a.createElement(Ds,{isActive:Boolean(p)})),e&&c.a.createElement(Us,{isOpen:A,chatId:e,pinnedMessagesCount:b,onClose:W,onUnpin:$}))}));a(239);const _s=Object(g.a)(e=>e(),200,!1);var Ws;!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"}(Ws||(Ws={}));var $s=Object(c.h)(Object(s.h)((e,{chatId:t,isProfile:a,isManagement:s})=>{const{query:n}=Object(o.A)(e)||{},{query:c}=Object(o.z)(e)||{},{query:r}=Object(o.s)(e)||{},i=t?Object(o.f)(e,t):void 0,l=i&&Object(m.jb)(i);return{canManage:Boolean(!s&&a&&i&&!Object(o.O)(e,i.id)&&(Object(m.lb)(i.id)||(Object(m.gb)(i)||i.isCreator)&&!i.isNotJoined)),isChannel:l,messageSearchQuery:n,stickerSearchQuery:c,gifSearchQuery:r}},(e,t)=>Object(d.l)(t,["setLocalTextSearchQuery","setStickerSearchQuery","setGifSearchQuery","searchTextMessagesLocal","toggleManagement","searchMessagesByDate"]))(({isColumnOpen:e,isProfile:t,isSearch:a,isManagement:s,isStickerSearch:n,isGifSearch:r,isPollResults:o,profileState:i,managementScreen:d,canManage:b,isChannel:u,onClose:m,messageSearchQuery:O,stickerSearchQuery:j,gifSearchQuery:g,setLocalTextSearchQuery:f,setStickerSearchQuery:p,setGifSearchQuery:I,searchTextMessagesLocal:v,toggleManagement:y,searchMessagesByDate:E})=>{var C;const w=Object(c.q)(null),[M,S,k]=Object(ot.a)(),N=Object(c.m)(e=>{f({query:e}),e.length&&_s(v)},[v,f]),P=Object(c.m)(e=>{E({timestamp:e.valueOf()/1e3}),k()},[k,E]),T=Object(c.m)(e=>{p({query:e})},[p]),A=Object(c.m)(e=>{I({query:e})},[I]),[x,L]=Object(c.r)(!e);Object(c.n)(()=>{setTimeout(()=>{L(!e)},300)},[e]);const R=Object(ne.a)(),F=t?i===l.k.Profile?Ws.Profile:i===l.k.SharedMedia?Ws.SharedMedia:i===l.k.MemberList?Ws.MemberList:-1:a?Ws.Search:o?Ws.PollResults:n?Ws.StickerSearch:r?Ws.GifSearch:s?d===l.g.Initial?Ws.ManageInitial:d===l.g.ChatPrivacyType?Ws.ManageChatPrivacyType:d===l.g.Discussion?Ws.ManageDiscussion:d===l.g.ChannelSubscribers?Ws.ManageChannelSubscribers:d===l.g.GroupPermissions?Ws.ManageGroupPermissions:d===l.g.ChatAdministrators?Ws.ManageChatAdministrators:d===l.g.GroupRemovedUsers?Ws.ManageGroupRemovedUsers:d===l.g.GroupUserPermissionsCreate?Ws.ManageGroupUserPermissionsCreate:d===l.g.GroupUserPermissions?Ws.ManageGroupUserPermissions:d===l.g.GroupRecentActions?Ws.ManageGroupRecentActions:d===l.g.ChatAdminRights?Ws.ManageGroupAdminRights:d===l.g.GroupMembers?Ws.ManageGroupMembers:void 0:void 0,D=null!==(C=Object(Qe.a)(F,!0))&&void 0!==C?C:-1;function B(){if(-1!==D)switch(D){case Ws.PollResults:return c.a.createElement("h3",null,R("PollResults"));case Ws.Search:return c.a.createElement(c.a.Fragment,null,c.a.createElement(ie.a,{value:O,onChange:N}),c.a.createElement(oe.a,{round:!0,size:"smaller",color:"translucent",onClick:S,ariaLabel:"Search messages by date"},c.a.createElement("i",{className:"icon-calendar"})));case Ws.ManageInitial:return c.a.createElement("h3",null,R("Edit"));case Ws.ManageChatPrivacyType:return c.a.createElement("h3",null,R(u?"ChannelTypeHeader":"GroupTypeHeader"));case Ws.ManageDiscussion:return c.a.createElement("h3",null,R("Discussion"));case Ws.ManageChatAdministrators:return c.a.createElement("h3",null,R("ChannelAdministrators"));case Ws.ManageGroupRecentActions:return c.a.createElement("h3",null,R("Group.Info.AdminLog"));case Ws.ManageGroupAdminRights:return c.a.createElement("h3",null,R("EditAdminRights"));case Ws.ManageGroupPermissions:return c.a.createElement("h3",null,R("ChannelPermissions"));case Ws.ManageGroupRemovedUsers:return c.a.createElement("h3",null,R("ChannelBlockedUsers"));case Ws.ManageGroupUserPermissionsCreate:return c.a.createElement("h3",null,R("ChannelAddException"));case Ws.ManageGroupUserPermissions:return c.a.createElement("h3",null,R("UserRestrictions"));case Ws.StickerSearch:return c.a.createElement(ie.a,{value:j,placeholder:R("SearchStickersHint"),onChange:T});case Ws.GifSearch:return c.a.createElement(ie.a,{value:g,placeholder:R("SearchGifsTitle"),onChange:A});case Ws.SharedMedia:return c.a.createElement("h3",null,R("SharedMedia"));case Ws.ManageChannelSubscribers:return c.a.createElement("h3",null,R("ChannelSubscribers"));case Ws.MemberList:case Ws.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(oe.a,{round:!0,color:"translucent",size:"smaller",ariaLabel:R("Edit"),onClick:y},c.a.createElement("i",{className:"icon-edit"}))))}}const U=h.g||F===Ws.SharedMedia||F===Ws.MemberList||s,H=Object(X.a)("animated-close-icon",x&&"no-transition");return Object(c.n)(()=>{w.current.classList.toggle("state-back",U)},[U]),c.a.createElement("div",{className:"RightHeader"},c.a.createElement(oe.a,{className:"close-button",round:!0,color:"translucent",size:"smaller",onClick:m,ariaLabel:R(U?"Common.Back":"Common.Close")},c.a.createElement("div",{ref:w,className:H})),c.a.createElement(ae.a,{name:x?"none":"slide-fade",activeKey:D},B),!h.g&&c.a.createElement(As,{isOpen:M,isPastMode:!0,submitButtonLabel:R("JumpToDate"),onClose:k,onSubmit:P}))})),Vs=a(122);function zs(e,t,a,s,r,o,i,l,d,b,u){const h="members"!==s&&r?r:s,O=Object(c.p)(()=>{if(o&&i)return Object(m.Eb)(o.map(({userId:e})=>e),i)},[o,i]),[j,g,f]=function(e,t,a,s){const[c,r]=Object(Vs.a)(a?t:void 0,s,void 0,n.S),o=!c||!s||c[0]===s[0];return[c,r,!o]}(0,t,u,O),[p,I,v]=Qs("media",h,a,u,l,d),[y,E,C]=Qs("documents",h,a,u,l,d),[w,M,S]=Qs("links",h,a,u,l,d),[k,N,P]=Qs("audio",h,a,u,l,d);let T,A,x=!1;switch(h){case"members":T=j,A=g,x=f;break;case"media":T=p,A=I,x=v;break;case"documents":T=y,A=E,x=C;break;case"links":T=w,A=M,x=S;break;case"audio":T=k,A=N,x=P}return[h,T,A,x]}function Qs(e,t,a,s,r,o){const i=Object(c.q)();Object(je.a)(()=>{t===e&&r&&o&&(i.current=Object(m.w)(r,o,e).reverse())},[r,o,t,e]);const[l,d]=Object(Vs.a)(s?a:void 0,i.current,void 0,"media"===e?n.ob:n.Y);return[l,d,!(!l||!i.current||l[0]===i.current[0])]}var Ks=a(54);const Ys=Object(g.g)(e=>e(),250,!1);let Js=!1;var Xs=a(107),Zs=a(100);var en=a(128),tn=a(186);a(240);var an=Object(c.h)(({chat:e,user:t,photo:a,isFirstPhoto:s,isSavedMessages:n,lastSyncTime:r,onClick:o})=>{const l=Object(ne.a)(),d=t&&Object(m.pb)(t);function b(s="big",c){if(a&&!c)return`photo${a.id}?size=c`;let r;return n||d||(t?r=Object(m.f)(t,s):e&&(r=Object(m.f)(e,s))),r}const u=b(),h=Object(at.a)(u,!1,i.ApiMediaFormat.BlobUrl,r),O=Object(at.a)(!h&&s?b("normal",!0):void 0,!1,i.ApiMediaFormat.BlobUrl,r),j=Object(tn.a)(!h&&a&&a.thumbnail&&a.thumbnail.dataUri),g=h||O||j,f=Object(na.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(m.Z)(t);p=e?Object(Ke.c)(e,2):void 0}else if(!g&&e){const t=Object(m.l)(l,e);p=t&&Object(Ke.c)(t,Object(m.lb)(e.id)?2:1)}else p=c.a.createElement("div",{className:"spinner-wrapper"},c.a.createElement(me.a,{color:"white"}));const I=Object(X.a)("ProfilePhoto","color-bg-"+Object(m.X)(t||e),n&&"saved-messages",d&&"deleted-account",!n&&!g&&"no-photo");return c.a.createElement("div",{className:I,onClick:g?o:void 0},f&&g&&f!==g&&c.a.createElement("img",{src:f,className:"prev-avatar-media",alt:"",decoding:"async"}),"string"==typeof p?Object(tt.a)(p,["hq_emoji"]):p)});a(241);var sn=Object(c.h)(Object(s.h)((e,{userId:t,forceShowSelf:a})=>{const{lastSyncTime:s}=e,n=Object(o.Fb)(e,t),c=Object(o.f)(e,t),r=!a&&n&&n.isSelf,{animationLevel:i}=e.settings.byKey;return{lastSyncTime:s,user:n,chat:c,isSavedMessages:r,animationLevel:i}},(e,t)=>Object(d.l)(t,["loadFullUser","openMediaViewer"]))(({user:e,chat:t,isSavedMessages:a,lastSyncTime:s,animationLevel:n,loadFullUser:r,openMediaViewer:o})=>{const{id:d}=e||{},{id:b}=t||{},u=e?Object(m.Z)(e):t?t.title:"",O=(e?e.photos:t?t.photos:void 0)||[],j=n>=1?"slide":"none",[g,f]=Object(c.r)(0),p=a||O.length<=1||0===g,I=a||O.length<=1||g===O.length-1;Object(c.n)(()=>{g>O.length&&f(Math.max(0,O.length-1))},[g,O.length]);const v=Object(ne.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=>{bt.c(`photo${e.id}?size=c`)||bt.b(`photo${e.id}?size=c`,i.ApiMediaFormat.BlobUrl)})},[a,t])}(0,O,g);const y=Object(c.m)(()=>{o({avatarOwnerId:d||b,profilePhotoIndex:g,origin:l.h.ProfileAvatar})},[o,d,b,g]),E=Object(c.m)(()=>{p||f(g-1)},[g,p]),C=Object(c.m)(()=>{I||f(g+1)},[g,I]);if(Object(c.n)(()=>{const e=document.querySelector(".profile-slide-container > .active, .profile-slide-container > .to");if(e)return Object(Oe.b)(e,{excludedClosestSelector:".navigation",onSwipe:h.l?(e,t)=>{t===Oe.a.Right?E():t===Oe.a.Left&&C()}:void 0})},[C,E]),!e&&!t)return;function w(){const s=!a&&O&&O.length>0?O[g]:void 0;return c.a.createElement(an,{key:g,user:e,chat:t,photo:s,isSavedMessages:a,isFirstPhoto:p,onClick:y})}const M=e&&e.isVerified||t&&t.isVerified;return c.a.createElement("div",{className:"ProfileInfo"},c.a.createElement("div",{className:"photo-wrapper"},function(){if(!(a||!O||O.length<=1))return c.a.createElement("div",{className:"photo-dashes"},O.map((e,t)=>c.a.createElement("span",{className:"photo-dash "+(t===g?"current":"")})))}(),c.a.createElement(ae.a,{activeKey:g,name:j,className:"profile-slide-container"},w),!p&&c.a.createElement("button",{type:"button",className:"navigation prev","aria-label":v("AccDescrPrevious"),onClick:E}),!I&&c.a.createElement("button",{type:"button",className:"navigation next","aria-label":v("Next"),onClick:C})),c.a.createElement("div",{className:"info"},a?c.a.createElement("div",{className:"title"},c.a.createElement("h3",{dir:"auto"},v("SavedMessages"))):c.a.createElement("div",{className:"title"},c.a.createElement("h3",{dir:"auto"},u&&Object(tt.a)(u)),M&&c.a.createElement(en.a,null)),!a&&(e?c.a.createElement("div",{className:"status "+(Object(m.xb)(e)?"online":"")},c.a.createElement("span",{className:"user-status",dir:"auto"},Object(m.ab)(v,e))):c.a.createElement("span",{className:"status",dir:"auto"},Object(m.jb)(t)?v("Subscribers",t.membersCount,"i"):v("Members",t.membersCount,"i")))))}));var nn=Object(c.h)(Object(s.h)((e,{chatOrUserId:t})=>{const{lastSyncTime:a}=e,s=t?Object(o.f)(e,t):void 0;return{lastSyncTime:a,chat:s,user:Object(m.lb)(t)?Object(o.Fb)(e,t):void 0,canInviteUsers:s&&(!Object(m.jb)(s)&&!Object(m.yb)(s,"inviteUsers")||Object(m.q)(s,"inviteUsers"))}},(e,t)=>Object(d.l)(t,["loadFullUser","updateChatMutedState","showNotification"]))(({lastSyncTime:e,user:t,chat:a,forceShowSelf:s,canInviteUsers:n,loadFullUser:r,showNotification:o,updateChatMutedState:i})=>{const{id:l,fullInfo:d,username:b,phoneNumber:u,isSelf:h}=t||{},{id:O,isMuted:j,username:g}=a||{},f=Object(ne.a)();Object(c.n)(()=>{e&&l&&r({userId:l})},[r,l,e]);const p=Object(c.m)(()=>{i({chatId:O,isMuted:!j})},[O,j,i]);if(!a||a.isRestricted||h&&!s)return;function I(e,t){Object(C.c)(e),o({message:t+" was copied"})}const v=u&&Object(Oa.c)(u),y=Object(m.h)(a),E=0===y.indexOf("http")?y:"http://"+y,w=b||g,M=d&&d.bio||Object(m.g)(a);return c.a.createElement("div",{className:"ChatExtra"},v&&!!v.length&&c.a.createElement(Zs.a,{icon:"phone",multiline:!0,narrow:!0,ripple:!0,onClick:()=>I(v,f("Phone"))},c.a.createElement("span",{className:"title",dir:"auto"},v),c.a.createElement("span",{className:"subtitle"},f("Phone"))),w&&c.a.createElement(Zs.a,{icon:"mention",multiline:!0,narrow:!0,ripple:!0,onClick:()=>I("@"+w,f("Username"))},c.a.createElement("span",{className:"title",dir:"auto"},Object(tt.a)(w)),c.a.createElement("span",{className:"subtitle"},f("Username"))),M&&!!M.length&&c.a.createElement(Zs.a,{icon:"info",multiline:!0,narrow:!0,isStatic:!0},c.a.createElement("span",{className:"title",dir:"auto"},Object(tt.a)(M,["br","links","emoji"])),c.a.createElement("span",{className:"subtitle"},f(l?"UserBio":"Info"))),n&&!w&&!!y.length&&c.a.createElement(Zs.a,{icon:"mention",multiline:!0,narrow:!0,ripple:!0,onClick:()=>I(y,f("SetUrlPlaceholder"))},c.a.createElement("div",{className:"title"},c.a.createElement(wa.a,{url:E,className:"title",text:y})),c.a.createElement("span",{className:"subtitle"},f("SetUrlPlaceholder"))),c.a.createElement(Zs.a,{icon:"unmute",ripple:!0,onClick:p},c.a.createElement("span",null,f("Notifications")),c.a.createElement(de,{id:"group-notifications",label:l?"Toggle User Notifications":"Toggle Chat Notifications",checked:!j,inactive:!0})))})),cn=a(160),rn=a(180),on=a(113);a(245);const ln=[{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 bn=Object(c.h)(Object(s.h)((e,{chatId:t,userId:a})=>{const s=Object(o.f)(e,t),n=Object(o.m)(e,a||t),{currentType:c,resultsByType:r}=Object(o.v)(e)||{},{foundIds:i}=r&&c&&r[c]||{},{byId:l}=e.users,d=s&&Object(m.kb)(s),b=s&&Object(m.jb)(s),u=d||b&&Object(m.gb)(s),h=s&&s.fullInfo&&s.fullInfo.members,O=u&&s&&s.fullInfo&&!s.fullInfo.canViewMembers;let j;return a?j=a:Object(m.lb)(t)&&(j=t),{isChannel:b,resolvedUserId:j,chatMessages:n,foundIds:i,mediaSearchType:c,hasMembersTab:u,areMembersHidden:O,...u&&h&&{members:h,usersById:l},isRightColumnShown:Object(o.V)(e),isRestricted:s&&s.isRestricted,lastSyncTime:e.lastSyncTime}},(e,t)=>Object(d.l)(t,["setLocalMediaSearchType","loadMoreMembers","searchMediaMessagesLocal","openMediaViewer","openAudioPlayer","openUserInfo","focusMessage","loadProfilePhotos"]))(({chatId:e,profileState:t,onProfileStateChange:a,isChannel:s,resolvedUserId:r,chatMessages:o,foundIds:d,mediaSearchType:b,hasMembersTab:u,areMembersHidden:m,members:O,usersById:j,isRightColumnShown:g,isRestricted:f,lastSyncTime:p,setLocalMediaSearchType:I,loadMoreMembers:v,searchMediaMessagesLocal:y,openMediaViewer:E,openAudioPlayer:C,openUserInfo:w,focusMessage:M,loadProfilePhotos:S})=>{const k=Object(c.q)(null),N=Object(c.q)(null),P=Object(ne.a)(),[T,A]=Object(c.r)(0),x=Object(c.p)(()=>[...u?[{type:"members",title:s?"ChannelSubscribers":"GroupMembers"}]:[],...ln],[u,s]),L=x[T].type,[R,F,D,B]=zs(0,v,y,L,b,O,j,o,d,0,p),U=x.findIndex(({type:e})=>e===R),{handleScroll:H}=function(e,t,a,s){Object(Ks.a)(([a])=>{if(a&&a!==t){const a=e.current,n=a.querySelector(".TabList");a.scrollTop{Js=!1},350))}},[t,s]),Object(Ks.a)(([t])=>{if(a!==l.k.Profile||a===t)return;const n=e.current;if(!n)return;const c=n.querySelector(".TabList");!c||c.offsetTop>n.scrollTop||(Js=!0,Object(vt.a)(n,n.firstElementChild,"start",void 0,2*n.offsetHeight),setTimeout(()=>{Js=!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=l.k.Profile;a.scrollTop>=n.offsetTop&&(c="members"===t?l.k.MemberList:l.k.SharedMedia),s(c)},[e,s,t]);return Object(c.n)(()=>{Js||n()},[n,t]),{handleScroll:Object(c.m)(()=>{Js||Ys(n)},[n])}}(k,L,t,a),{applyTransitionFix:q,releaseTransitionFix:G}=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])}}(k),[_,W]=(()=>{const[e,t]=Object(c.r)(!1);return[e,Object(c.m)(()=>{t(e=>!e)},[])]})(),$=Object(c.m)(()=>{G(),W()},[G,W]);Object(c.n)(()=>{I({mediaType:L})},[I,L]);const V=r||e;Object(c.n)(()=>{p&&S({profileId:V})},[S,V,p]);const z=Object(c.m)(e=>{E({chatId:V,threadId:i.MAIN_THREAD_ID,messageId:e,origin:l.h.SharedMedia})},[V,E]),Q=Object(c.m)(e=>{C({chatId:V,messageId:e})},[V,C]),K=Object(c.m)(e=>{w({id:e})},[w]),Y=Object(c.m)(e=>{M({chatId:V,messageId:e})},[V,M]);let J;Object(c.n)(()=>{if(N.current&&h.l)return Object(Oe.b)(N.current,{onSwipe:(e,t)=>{t===Oe.a.Left?A(Math.min(T+1,x.length-1)):t===Oe.a.Right&&A(Math.max(0,T-1))}})},[T,x.length]);const X="members"===R||!u&&"media"===R;X?J=g?0:1e3:F||(J=n.pb);const Z=Object(Cs.a)([e,R],J);function ee(){if(!F||!Z||!o){const e=X&&F&&!Z;return c.a.createElement("div",{className:"content empty-list"},!e&&c.a.createElement(me.a,null))}if(!F.length){let e;switch(R){case"members":e=m?"You have no access to group members list.":"No members found";break;case"documents":e=P("lng_media_file_empty_search");break;case"links":e=P("lng_media_link_empty_search");break;case"audio":e=P("lng_media_song_empty_search");break;default:e=P("SharedMedia.EmptyTitle")}return c.a.createElement("div",{className:"content empty-list"},c.a.createElement(on.a,{text:e}))}return c.a.createElement("div",{className:`content ${R}-list`,teactFastList:!0},"media"===R?F.map(e=>o[e]&&c.a.createElement(cn.a,{key:e,message:o[e],onClick:z})):"documents"===R?F.map(e=>o[e]&&c.a.createElement(Vt.a,{key:e,message:o[e],withDate:!0,smaller:!0,className:"scroll-item",onDateClick:Y})):"links"===R?F.map(e=>o[e]&&c.a.createElement(rn.a,{key:e,message:o[e],onMessageClick:Y})):"audio"===R?F.map(e=>o[e]&&c.a.createElement(zt.a,{key:e,renderingFor:"sharedMedia",message:o[e],date:o[e].date,lastSyncTime:p,className:"scroll-item",onPlay:Q,onDateClick:Y})):"members"===R?F.map((e,t)=>c.a.createElement(Zs.a,{key:e,teactOrderKey:t,className:"chat-item-clickable scroll-item",onClick:()=>K(e)},c.a.createElement(Ye.a,{userId:e,forceShowSelf:!0}))):void 0)}return c.a.createElement(Xs.a,{ref:k,className:"Profile custom-scroll",itemSelector:dn(R),items:Z?F:void 0,cacheBuster:_,sensitiveArea:n.gb,preloadBackwards:Z?"members"===R?n.S:n.ob:0,noScrollRestoreOnTop:!0,noFastList:!0,onLoadMore:D,onScroll:H},!B&&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,r),!f&&c.a.createElement("div",{className:"shared-media"},c.a.createElement(ae.a,{ref:N,name:"slide",activeKey:U,renderCount:x.length,shouldRestoreHeight:!0,className:"shared-media-transition",onStart:q,onStop:$},ee),c.a.createElement(pe.a,{big:!0,activeTab:T,tabs:x,onSwitchTab:A})))}));var un=Object(c.h)(e=>{const t=Object(Ee.a)(ye.a.Extra,"RightSearch");return t?c.a.createElement(t,e):c.a.createElement(Ce.a,null)});var mn=Object(c.h)(e=>{const t=Object(Ee.a)(ye.a.Extra,"Management");return t?c.a.createElement(t,e):c.a.createElement(Ce.a,null)});var hn=Object(c.h)(()=>{const e=Object(Ee.a)(ye.a.Extra,"StickerSearch");return e?c.a.createElement(e,null):c.a.createElement(Ce.a,null)});var On=Object(c.h)(()=>{const e=Object(Ee.a)(ye.a.Extra,"GifSearch");return e?c.a.createElement(e,null):c.a.createElement(Ce.a,null)});var jn=Object(c.h)(()=>{const e=Object(Ee.a)(ye.a.Extra,"PollResults");return e?c.a.createElement(e,null):c.a.createElement(Ce.a,null)});a(246);const gn=Object.keys(l.l).length/2,fn=Object.keys(l.g).length/2;function pn(){const e=document.querySelector(".RightHeader .SearchInput input");e&&e.blur()}var In=Object(c.h)(Object(s.h)(e=>{const{chatId:t,threadId:a}=Object(o.y)(e)||{},s=Object(o.d)(e);return{contentKey:Object(o.mb)(e),chatId:t,threadId:a,currentProfileUserId:e.users.selectedId,isChatSelected:Boolean(t&&s)}},(e,t)=>Object(d.l)(t,["openUserInfo","toggleChatInfo","toggleManagement","closeLocalTextSearch","setStickerSearchQuery","setGifSearchQuery","closePollResults"]))(({contentKey:e,chatId:t,threadId:a,currentProfileUserId:s,isChatSelected:r,toggleChatInfo:o,toggleManagement:i,openUserInfo:d,closeLocalTextSearch:b,setStickerSearchQuery:u,setGifSearchQuery:m,closePollResults:h})=>{var O;const{width:j}=_e(),[g,f]=Object(c.r)(l.k.Profile),[p,I]=Object(c.r)(l.g.Initial),[v,y]=Object(c.r)(),[E,C]=Object(c.r)(),w=g!==l.k.Profile,M=void 0!==e,S=e===l.l.ChatInfo||e===l.l.UserInfo,k=e===l.l.Search,N=e===l.l.Management,P=e===l.l.StickerSearch,T=e===l.l.GifSearch,A=e===l.l.PollResults,x=j<=n.bb,[L,R]=Object(c.r)(!M),F=null!==(O=Object(Qe.a)(e,!0,!r))&&void 0!==O?O:-1,D=Object(c.m)(()=>{switch(e){case l.l.ChatInfo:if(w){f(l.k.Profile);break}o();break;case l.l.UserInfo:if(w){f(l.k.Profile);break}d({id:void 0});break;case l.l.Management:switch(p){case l.g.Initial:i();break;case l.g.ChatPrivacyType:case l.g.Discussion:case l.g.GroupPermissions:case l.g.GroupType:case l.g.ChatAdministrators:case l.g.ChannelSubscribers:case l.g.GroupMembers:I(l.g.Initial);break;case l.g.GroupUserPermissionsCreate:case l.g.GroupRemovedUsers:case l.g.GroupUserPermissions:I(l.g.GroupPermissions),y(void 0),C(void 0);break;case l.g.ChatAdminRights:case l.g.GroupRecentActions:I(l.g.ChatAdministrators)}break;case l.l.Search:pn(),b();break;case l.l.StickerSearch:case l.l.GifSearch:pn(),u({query:void 0}),m({query:void 0});break;case l.l.PollResults:h()}},[e,w,o,d,h,p,i,b,u,m]),B=Object(c.m)((e,t)=>{y(e),C(t)},[]);function U(){if(-1!==F)switch(F){case l.l.ChatInfo:case l.l.UserInfo:return c.a.createElement(bn,{key:s||t,chatId:t,userId:s,profileState:g,onProfileStateChange:f});case l.l.Search:return c.a.createElement(un,{chatId:t,threadId:a});case l.l.Management:return c.a.createElement(mn,{chatId:t,currentScreen:p,isPromotedByCurrentUser:E,selectedChatMemberId:v,onScreenSelect:I,onChatMemberSelect:B});case l.l.StickerSearch:return c.a.createElement(hn,null);case l.l.GifSearch:return c.a.createElement(On,null);case l.l.PollResults:return c.a.createElement(jn,null)}}return Object(c.n)(()=>M?Object(te.a)(D):void 0,[M,D]),Object(c.n)(()=>{setTimeout(()=>{R(!M)},300)},[M]),Object(c.n)(()=>{M&&x&&D()},[x]),Object(Ot.a)(([a,s])=>{(a===l.l.ChatInfo&&e===l.l.UserInfo||a===l.l.UserInfo&&e===l.l.ChatInfo||s!==t)&&(f(l.k.Profile),I(l.g.Initial))},[e,t]),c.a.createElement("div",{id:"RightColumn-wrapper",className:r?void 0:"is-hidden"},x&&c.a.createElement("div",{className:"overlay-backdrop",onClick:D}),c.a.createElement("div",{id:"RightColumn"},c.a.createElement($s,{chatId:t,isColumnOpen:M,isProfile:S,isSearch:k,isManagement:N,isStickerSearch:P,isGifSearch:T,isPollResults:A,profileState:g,managementScreen:p,onClose:D}),c.a.createElement(ae.a,{name:L?"none":"zoom-fade",renderCount:gn+fn,activeKey:N?gn+p:F},U)))}));var vn=Object(c.h)(({isOpen:e})=>{const t=Object(Ee.a)(ye.a.Extra,"MediaViewer",!e);return t?c.a.createElement(t,null):void 0});var yn=Object(c.h)(({isOpen:e})=>{const t=Object(Ee.a)(ye.a.Extra,"Notifications",!e);return t?c.a.createElement(t,null):void 0});var En=Object(c.h)(({isOpen:e})=>{const t=Object(Ee.a)(ye.a.Extra,"Errors",!e);return t?c.a.createElement(t,null):void 0});var Cn=Object(c.h)(e=>{const{isOpen:t}=e,a=Object(Ee.a)(ye.a.Extra,"ForwardPicker",!t);return a?c.a.createElement(a,e):void 0});var wn=Object(c.h)(e=>{const{url:t}=e,a=Object(Ee.a)(ye.a.Extra,"SafeLinkModal",!t);return a?c.a.createElement(a,e):void 0});a(247);let Mn,Sn,kn=!1;function Nn(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")})}var Pn=Object(c.h)(Object(s.h)(e=>{const{chatId:t,messageId:a}=e.audioPlayer,s=t&&a?Object(o.k)(e,t,a):void 0;return{animationLevel:e.settings.byKey.animationLevel,lastSyncTime:e.lastSyncTime,isLeftColumnShown:e.isLeftColumnShown,isRightColumnShown:Object(o.V)(e),isMediaViewerOpen:Object(o.S)(e),isForwardModalOpen:Object(o.Q)(e),hasNotifications:Boolean(e.notifications.length),hasErrors:Boolean(e.errors.length),audioMessage:s,safeLinkModalUrl:e.safeLinkModalUrl}},(e,t)=>Object(d.l)(t,["loadAnimatedEmojis"]))(({lastSyncTime:e,loadAnimatedEmojis:t,isLeftColumnShown:a,isRightColumnShown:r,isMediaViewerOpen:i,isForwardModalOpen:l,animationLevel:d,hasNotifications:b,hasErrors:u,audioMessage:m,safeLinkModalUrl:h})=>{n.p&&!kn&&(kn=!0,console.log(">>> RENDER MAIN")),Object(c.n)(()=>{e&&t()},[e,t]);const{transitionClassNames:O}=Object(Z.a)(!a,void 0,!0),{transitionClassNames:j}=Object(Z.a)(r,void 0,!0),g=Object(X.a)(O.replace(/([\w-]+)/g,"middle-column-$1"),j.replace(/([\w-]+)/g,"right-column-$1"));function f(e){e.preventDefault(),e.stopPropagation()}return Object(c.n)(()=>{document.body.classList.toggle("is-middle-column-open",g.includes("middle-column-open")),document.body.classList.toggle("is-right-column-shown",g.includes("right-column-open"))},[g]),Object(c.n)(()=>{d>0&&(document.body.classList.add("animating-right-column"),Object(J.b)(350+n.c),Mn&&(clearTimeout(Mn),Mn=void 0),Mn=window.setTimeout(()=>{document.body.classList.remove("animating-right-column"),Mn=void 0},350+n.c))},[d,r]),Object(ee.a)(()=>{const e=Object(o.q)(Object(s.e)());let t=0;clearInterval(Sn),Sn=window.setInterval(()=>{if(document.title.includes(n.E))Nn(!1);else{if(t%2==0){const t=Object(o.q)(Object(s.e)())-e;t>0&&(document.title=`${t} notification${t>1?"s":""}`,Nn(!0))}else document.title=n.fb,Nn(!1);t++}},1e3)},()=>{clearInterval(Sn),Sn=void 0,document.title.includes(n.E)||(document.title=n.fb),Nn(!1)}),c.a.createElement("div",{id:"Main",className:g,onDrop:f,onDragOver:f},c.a.createElement(Be,null),c.a.createElement(Gs,null),c.a.createElement(In,null),c.a.createElement(vn,{isOpen:i}),c.a.createElement(Cn,{isOpen:l}),c.a.createElement(yn,{isOpen:b}),c.a.createElement(En,{isOpen:u}),m&&c.a.createElement(mt,{key:m.id,message:m,noUi:!0}),c.a.createElement(wn,{url:h}))}));n.p&&console.log(">>> FINISH LOAD MAIN BUNDLE"),Object(s.e)().connectionState||Object(s.d)().initApi()}}]); -//# sourceMappingURL=4.b0768c144c69fa913166.js.map \ No newline at end of file diff --git a/dist/4.b0768c144c69fa913166.js.map b/dist/4.b0768c144c69fa913166.js.map deleted file mode 100644 index 6654af0d9..000000000 --- a/dist/4.b0768c144c69fa913166.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["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/localSearch.ts","webpack:///./src/modules/actions/ui/stickerSearch.ts","webpack:///./src/modules/actions/ui/users.ts","webpack:///./src/modules/actions/ui/settings.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/actions/api/settings.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/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/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/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/hooks/useStickyDates.ts","webpack:///./src/hooks/useDebounce.ts","webpack:///./src/components/middle/MessageScroll.tsx","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/MessageList.tsx","webpack:///./src/components/middle/ScrollDownButton.tsx","webpack:///./src/components/middle/composer/helpers/buildAttachment.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/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/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/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/RightColumn.tsx","webpack:///./src/components/mediaViewer/MediaViewer.async.tsx","webpack:///./src/components/main/Notifications.async.tsx","webpack:///./src/components/main/Errors.async.tsx","webpack:///./src/components/main/ForwardPicker.async.tsx","webpack:///./src/components/main/SafeLinkModal.async.tsx","webpack:///./src/components/main/Main.tsx","webpack:///./src/bundles/main.ts"],"names":["window","addEventListener","e","state","chatId","id","threadId","messageListType","type","getDispatch","openChat","noPushState","addReducer","global","actions","payload","currentMessageList","selectCurrentMessageList","exitMessageSelectMode","messages","contentToBeScheduled","undefined","forwardMessages","toChatId","setGlobal","history","pushState","updateCurrentMessageList","isChatInfoShown","chatCreation","blurTimeout","scrollOffset","replaceThreadParam","messageId","paramName","chatMessages","selectChatMessages","viewportIds","selectViewportIds","lastOwnEditableMessageId","findLast","Boolean","selectAllowedMessageActions","canEdit","avatarOwnerId","profilePhotoIndex","origin","mediaViewer","audioPlayer","selectIsRightColumnShown","pollResults","voters","setTimeout","newGlobal","getGlobal","lastMessageId","MAIN_THREAD_ID","chat","selectChat","lastMessage","threadInfo","selectThreadInfo","focusMessage","noHighlight","groupedId","groupedChatId","ids","selectForwardedMessageIdsByGroupId","length","shouldSwitchChat","clearTimeout","updateFocusedMessage","updateFocusDirection","FocusDirection","Static","includes","direction","Down","Up","loadViewportMessages","fromChatId","messageIds","groupedMessageIds","selectMessageIdsByGroupId","isModalShown","closeMediaViewer","selectedMessages","openForwardMenu","selectCurrentChat","enterMessageSelectMode","childMessageIds","withShift","toggleMessageSelection","isPollModalOpen","query","globalSearch","updateGlobalSearch","globalResults","localResults","resultsByType","fetchingStatus","chats","recentlyFoundChatIds","newRecentIds","filter","unshift","pop","content","updateGlobalSearchContent","updateLocalTextSearch","replaceLocalTextSearchResults","chatThreadKey","buildChatThreadKey","currentQuery","localTextSearch","byChatThreadKey","MEMO_EMPTY_ARRAY","mediaType","updateLocalMediaSearchType","stickers","search","resultIds","gifs","offsetId","results","updateSelectedUserId","replaceSettings","theme","settings","replaceThemeSettings","management","byChatId","isActive","IS_MOBILE_SCREEN","isLeftColumnShown","action","emoji","recentEmojis","newEmojis","sticker","recent","hash","newStickers","s","notification","newNotifications","notifications","existingNotificationIndex","findIndex","n","message","splice","push","error","getReadableErrorText","newErrors","errors","existingErrorIndex","err","url","safeLinkModalUrl","payment","isPaymentModalOpen","clearPayment","closeInvoice","runThrottledForLoadChats","throttle","cb","runThrottledForLoadTopChats","runDebouncedForLoadFullChat","debounce","async","loadChats","listType","offsetDate","result","callApi","limit","CHAT_LIST_LOAD_SLICE","archived","withPinned","orderedPinnedIds","chatIds","shift","addUsers","buildCollectionByKey","users","updateChats","updateChatListIds","updateChatListSecondaryInfo","Object","keys","draftsById","map","Number","forEach","replyingToById","isFullyLoaded","loadFullChat","fullInfo","updateChat","openChatByUsername","username","channelPostId","localChat","selectChatByUsername","isMin","previousChat","showNotification","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","TIPS_USERNAME","oldestChat","selectIsChatPinned","sort","chat1","chat2","date","force","isMuted","title","about","photo","memberIds","progress","ChatCreationProgress","InProgress","createdChannel","channelId","accessHash","Complete","Error","createChannel","createdChat","createGroupChat","folderId","folder","selectChatFolder","shouldBePinned","pinnedChatIds","includedChatIds","newPinnedIds","pinnedId","newIncludedChatIds","folderUpdate","selectChatListType","isPinned","ARCHIVED_FOLDER_ID","isChatArchived","chatFolders","loadChatFolders","recommendedChatFolders","recommended","loadRecommendedChatFolders","emoticon","orderedIds","maxId","recommendedId","description","newFolder","createChatFolder","Math","max","apply","deleteChatFolder","unreadCount","match","RE_TME_INVITE_LINK","exec","RE_TME_LINK","isEnabled","isChatBasicGroup","bannedRights","userId","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","offset","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","rafPromise","delete","isRestricted","resolve","loadWithBudget","selectFocusedMessageId","selectRealLastReadId","replyOriginForId","MESSAGE_DELETED","replyMessage","selectChatMessage","updateChatMessage","replyToMessageId","loadMessage","scheduledAt","setReplyingToId","clearWebPagePreview","value","selectReplyingToId","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","localOnly","selectDraft","isUnpin","isOneSide","isSilent","unpinAllMessages","shouldDeleteForAll","editingId","selectEditingId","selectEditingScheduledId","webPagePreview","loadWebPagePreview","options","option","shouldResetVoters","v","a","indexOf","offsets","nextOffset","loadPollOptionResults","fromChat","toChat","b","scheduledMessages","historyHash","replaceScheduledMessages","loadScheduledHistory","selectScheduledMessage","loadPinnedMessages","copyTextToClipboard","link","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","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","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","draftsByChatId","acc","lastReadInboxMessageId","newCurrentChatId","currentMessageListInfo","threadsById","Array","prototype","concat","replaceUsers","audioChatId","audioMessageId","closeAudioPlayer","loadAndReplaceMessages","lastSyncTime","sync","afterSync","runDebouncedForFetchFullUser","buildInputPrivacyRules","visibility","allowedIds","deniedIds","usersById","chatsById","rules","collectUsers","collectChats","allowedUsers","allowedChats","blockedUsers","blockedChats","lastRequestedAt","topPeers","usersHash","loadTopUsers","getCompareString","lastName","firstName","collator","Intl","Collator","sortedUsers","compare","isSelf","loadContactList","updateChatMutedState","phone","phoneNumber","updateUser","updateContact","deleteUser","profileId","isPrivate","photos","button","sendBotCommand","command","openTelegramLink","toggleSafeLinkModal","data","alert","isError","showError","answerCallbackButton","openPollModal","getReceipt","receiptMessageId","getPaymentForm","setInvoiceMessageInfo","openPaymentModal","bio","profileEdit","ProfileEditProgress","currentUser","Idle","loadedWallpapers","wallpapers","file","previewBlobUrl","URL","createObjectURL","slug","UPLOADING_WALLPAPER_SLUG","document","fileName","size","mimeType","wallpaper","firstWallpaper","withLocalMedia","blocked","blockedIds","contactId","addBlockedContact","removeBlockedContact","activeSessions","session","isCurrent","peerType","shouldShowPreviews","updateNotifySettings","hasContactJoinedNotifications","languages","phoneNumberSettings","lastSeenSettings","profilePhotoSettings","forwardsSettings","chatInviteSettings","privacy","lastSeen","profilePhoto","forwards","chatInvite","privacyKey","allowUserIds","allowChatIds","blockUserIds","blockChatIds","isAllowList","contactsIds","hasPassword","updateTwoFaSettings","hint","currentPassword","onSuccess","isLoading","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","updateWithLocalMedia","isScheduled","currentMessage","video","getMessageContent","blobUrl","thumbnail","isPreloadedGlobally","updateScheduledMessage","updateListedAndViewportIds","selectIsViewportNewest","firstUnreadId","selectFirstUnreadId","addViewportId","firstMessageId","selectThreadByMessage","isMessageLocal","updateChatLastMessage","currentLastMessage","findLastMessage","isDeleting","deleteMessages","newLastMessage","threadIdsToUpdate","unique","deleteChatMessages","chatsIdsToUpdate","commonBoxChatId","updateThreadInfo","newMessage","isMessageInCurrentMessageList","isOutgoing","scheduledIds","selectScheduledIds","selectScheduledMessages","deleteChatScheduledMessages","currentPinnedIds","selectPinnedIds","newTheadInfo","messagesById","deleteScheduledMessages","pollId","pollUpdate","selectChatMessageByPollId","poll","updatedPoll","updatedResults","isChosen","chosenAnswers","chosenAnswer","chosenAnswerIndex","recentVoterIds","totalVoters","newRecentVoterIds","newTotalVoters","newResults","targetOption","targetOptionIndex","updatedOption","votersCount","flushStatusUpdatesThrottled","pendingStatusUpdates","statusUpdate","status","targetUser","isBlocked","key","addNotifyException","twoFaSettings","memo","name","label","checked","disabled","inactive","noAnimation","onChange","onCheck","handleChange","useCallback","currentTarget","className","buildClassName","ANIMATION_LEVEL_OPTIONS","withGlobal","searchQuery","animationLevel","byKey","globalSearchChatId","searchDate","contactsFilter","onSearchQuery","onSelectSettings","onSelectContacts","onSelectArchived","setGlobalSearchChatId","onReset","openTipsChat","setGlobalSearchDate","setSettingOption","lang","useLang","hasMenu","LeftColumnContent","ChatList","clearedDateSearchParam","clearedChatSearchParam","selectedSearchDate","useMemo","formatDateToString","archivedUnreadChatsCount","values","total","MainButton","onTrigger","isOpen","Button","ripple","color","onClick","ariaLabel","handleSearchFocus","handleSelectSaved","handleDarkModeToggle","stopPropagation","newTheme","switchTheme","handleAnimationLevelChange","newLevel","_","body","classList","toggle","isSearchFocused","GlobalSearch","Contacts","searchInputPlaceholder","DropdownMenu","trigger","footer","APP_NAME","APP_VERSION","MenuItem","icon","toLowerCase","href","FEEDBACK_URL","SearchInput","inputId","focused","placeholder","canClose","onFocus","PickerSelectedItem","isMinimized","clickArg","chatOrUserId","connectionState","Spinner","resolverFn","ms","dependencies","valueRef","useRef","runThrottled","useThrottle","forceUpdate","useForceUpdate","useOnChange","isSync","current","orderedFolderIds","notifySettings","selectNotifySettings","notifyExceptions","selectNotifyExceptions","transitionRef","activeTab","setActiveTab","useState","useEffect","displayedFolders","folderCountersById","useThrottledMemo","counters","unreadDialogsCount","hasActiveDialogs","getFolderUnreadDialogs","badgeCount","isBadgeActive","folderTabs","handleSwitchTab","IS_TOUCH_ENV","captureEvents","onSwipe","SwipeDirection","Left","min","Right","isNotInAllTabRef","captureEscKeyListener","shouldRender","shouldRenderPlaceholder","transitionClassNames","useShowTransition","renderCurrentTab","activeFolder","folderType","noChatsText","TabList","tabs","onSwitchTab","Transition","ref","activeKey","renderCount","props","LeftSearch","useModuleLoader","Bundles","Extra","Loading","ContactList","closeTimeout","isShown","onNewPrivateChat","onNewChannel","onNewGroup","isMenuOpen","setIsMenuOpen","fabClassName","handleMouseEnter","handleMouseLeave","onMouseEnter","onMouseLeave","tabIndex","Menu","positionX","positionY","autoClose","onClose","TRANSITION_RENDER_COUNT","onContentChange","isNewChatButtonShown","setIsNewChatButtonShown","isMouseInside","handleSelectSettings","Settings","handleSelectContacts","handleSelectNewChannel","NewChannelStep1","handleSelectNewGroup","NewGroupStep1","handleSelectArchived","Archived","autoCloseTimeout","NewChat","ContentType","ArchivedChats","RENDER_COUNT","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","currentScreen","onScreenSelect","isChannel","setSize","windowSize","handleResize","removeEventListener","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","HeaderMenuContainer","isChatChannel","noMenu","isChatWithSelf","selectIsChatWithSelf","isMainThread","isDiscussionThread","isRightColumnShown","canStartBot","selectIsChatBotNotStarted","canSubscribe","isChatSuperGroup","canSearch","canMute","canSelect","selectIsInSelectMode","canLeave","joinChannel","openLocalTextSearch","menuButtonRef","menuPosition","setMenuPosition","handleHeaderMenuOpen","rect","getBoundingClientRect","x","right","y","bottom","handleHeaderMenuClose","handleHeaderMenuHide","handleSubscribeClick","handleStartBot","handleSearchClick","querySelector","focus","searchInput","fluid","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","useFlag","handleUnpinMessage","ConfirmDialog","confirmLabel","confirmHandler","thumbDataUri","getPictogramDimensions","src","alt","renderPictogram","dir","renderText","RippleEffect","sender","selectSender","noUi","senderName","getSenderTitle","mediaData","mediaLoader","playPause","isPlaying","useAudioPlayer","getMessageKey","getMediaDuration","handleClick","handleClose","audio","getMessageAudio","performer","renderAudio","subtitle","renderVoice","audioMessage","originChat","messagesCount","pinnedIds","isSelectModeActive","originChatId","isChatWithBot","selectIsChatWithBot","assign","pinnedMessageId","topMessageSender","selectForwardedSender","pinnedMessageIds","canUnpin","firstPinnedMessage","openChatWithInfo","pinMessage","toggleLeftColumn","pinnedMessageIndex","setPinnedMessageIndex","isArray","pinnedMessage","pinnedMessagesCount","chatTitleLength","getChatTitle","topMessageTitle","useEnsureMessage","useWindowSize","isLeftColumnHideable","shouldShowCloseButton","componentRef","shouldAnimateTools","handleHeaderClick","handlePinnedMessageClick","newIndex","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","GroupChatInfo","asClose","unreadCountInfo","formatIntegerCompact","componentEl","add","remove","isAlbum","messageOrAlbum","groupMessages","currentAlbum","currentSenderGroup","currentDateGroup","originalDate","datetime","getDayStart","senderGroups","dateGroups","isInAlbum","mainMessage","albumId","nextMessage","nextMessageDatetime","isActionMessage","forwardInfo","senderUserId","hiddenUserName","inlineButtons","useStickyDates","isScrolled","markIsScrolled","runDebounced","shouldRunFirst","shouldRunLast","updateStickyDates","container","hasTools","contains","fastRaf","currentStuck","stuckDateEl","allElements","querySelectorAll","containerTop","scrollTop","el","offsetTop","offsetHeight","top","findStuckDate","isFabFrozen","MessageScroll","focusingId","loadMoreForwards","loadMoreBackwards","isViewportNewest","onFabToggle","onNotchToggle","children","backwardsTriggerRef","forwardsTriggerRef","fabTriggerRef","toggleScrollTools","scrollHeight","scrollBottom","isAtBottom","observe","observeIntersection","freeze","freezeForLoadMore","unfreeze","unfreezeForLoadMore","useIntersectionObserver","rootRef","margin","MESSAGE_LIST_SENSITIVE_AREA","entries","triggerEntry","isIntersecting","target","resetScroll","useOnIntersect","observeIntersectionForFab","freezeForFab","unfreezeForFab","observeIntersectionForNotch","teactFastList","isEmojiOnlyMessage","customShape","getMinMediaWidth","hasText","hasCommentButton","calculateMediaDimensions","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","REM","getMaxWidth","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","position","left","opacity","appendChild","offsetWidth","useFocusMessage","elementRef","isFocused","focusDirection","noFocusHighlight","messagesContainer","closest","fastSmoothScroll","ContextMenuContainer","targetUserId","targetChatId","targetMessageId","targetMessage","selectIsMessageFocused","focusedMessage","isEmbedded","appearanceOrder","isLastInList","noAppearanceAnimation","markShown","renderActionMessageText","asPlain","isContextMenuOpen","contextMenuPosition","handleBeforeContextMenu","handleContextMenu","handleContextMenuClose","handleContextMenuHide","useContextMenuHandlers","isContextMenuShown","data-message-id","onMouseDown","onContextMenu","EmbeddedMessage","customText","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","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","getCustomAppendixBg","appendixBg","setProperty","setAttribute","ProgressSpinner","useHeavyAnimationCheckForVideo","playerRef","shouldPlayRef","safePlay","useHeavyAnimationCheck","isPlayAllowed","wasPlaying","isFrozen","freezePlaying","paused","unfreezePlaying","unfreezePlayingOnRaf","hasFocus","useBackgroundMode","Video","shouldAutoPlay","videoRef","canPlayInline","canMessagePlayVideoInline","setIsPlayAllowed","isInline","isBuffered","bufferingHandlers","useBuffering","playProgress","setPlayProgress","handleTimeUpdate","currentTime","usePauseOnInactive","useVideoCleanup","videoClassName","shouldRenderInlineVideo","shouldRenderHqPreview","shouldRenderPlayButton","shouldRenderDownloadButton","autoPlay","muted","loop","playsInline","onTimeUpdate","isGif","formatMediaDuration","duration","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","hasDocument","truncatedDescription","trimText","data-initial","SafeLink","getMessageInvoice","photoUrl","withSelectControl","WrapedComponent","ownProps","selectIsMessageSelected","handleMessageSelect","shiftKey","newProps","PhotoWithSelect","VideoWithSelect","uploadsById","hasCustomAppendix","albumLayout","cancelSendingMessage","mediaCount","handleCancelUpload","containerWidth","containerHeight","fileUpload","currentOnRelease","RoundVideo","playingProgressRef","shouldSpinnerRender","isActivated","setIsActivated","setProgress","playerEl","playingProgressEl","toString","stopPlaying","requestAnimationFrame","capturePlaying","onRelease","ROUND_VIDEO_DIMENSIONS","onEnded","InlineButtons","recentReplierIds","recentRepliers","hasUnread","data-cnt","handleDocumentGroupMouseEnter","lastGroupElement","getLastElementInDocumentGroup","handleDocumentGroupMouseLeave","removeAttribute","nextElementSibling","withSenderName","withAvatar","viaBotId","forceSenderName","isAnonymousOwnMessage","originSender","botSender","threadTopMessageId","isThreadTop","shouldHideReply","replyMessageSender","selectUploadProgress","isForwarding","highlight","singleEmoji","getMessageSingleEmoji","every","selectOutgoingStatus","isSingleEmoji","animatedEmoji","selectAnimatedEmoji","isGroupSelected","selectIsDocumentGroupSelected","isPinnedList","shouldAutoLoadMedia","selectShouldAutoLoadMedia","shouldAutoPlayMedia","selectShouldAutoPlayMedia","shouldLoopStickers","selectShouldLoopStickers","observeIntersectionForBottom","observeIntersectionForMedia","observeIntersectionForAnimatedStickers","noComments","isFirstInGroup","isLastInGroup","isFirstInDocumentGroup","isLastInDocumentGroup","openMediaViewer","openAudioPlayer","markMessagesRead","sendPollVote","clickInlineButton","bottomMarkerRef","appendixRef","hasReply","isReplyMessage","hasThread","asForwarded","isLinkedChannelPost","isInDocumentGroup","voice","getMessageCustomShape","textParts","renderMessageText","containerClassName","contentClassName","hasComments","classNames","isMediaWithNoText","isViaBot","isRound","buildContentClassName","avatarPeer","senderPeer","adminTitle","withCommentButton","withAppendix","handleGroupDocumentMessagesSelect","handleContainerDoubleClick","handleContentDoubleClick","handleAvatarClick","handleSenderClick","handleViaBotClick","handleReplyClick","MediaViewerOrigin","ScheduledInline","Inline","handleAudioPlay","handleAlbumMediaClick","albumMessageId","ScheduledAlbum","Album","handleReadMedia","handleVoteSend","handleGroupForward","handleForward","handleFocus","handleFocusForwarded","fromMessageId","calculatedWidth","noMediaCorners","extraPadding","metaSafeAuthorWidth","canShowActionButton","canForward","canFocus","isChannelPost","onDoubleClick","data-last-message-id","data-has-unread-mention","isAvatarPeerUser","avatarUser","avatarChat","hiddenName","renderAvatar","shouldInlineMeta","senderColor","getUserColorKey","renderSenderName","AnimatedEmoji","Audio","isSelectable","onPlay","onReadMedia","Document","renderContent","INTERSECTION_THROTTLE_FOR_MEDIA","IS_ANDROID","INTERSECTION_MARGIN_FOR_MEDIA","runDebouncedForScroll","selectCurrentMessageIds","restrictionReason","withLastMessageWhenPreloading","botDescription","chatBot","selectChatBot","isChatLoaded","isChannelChat","threadFirstMessageId","selectFirstMessageId","hasLinkedChat","markMessageListRead","setScrollOffset","scrollOffsetRef","selectScrollOffset","anchorIdRef","anchorTopRef","listItemElementsRef","memoUnreadDividerBeforeIdRef","memoFirstUnreadIdRef","memoFocusingIdRef","isScrollTopJustUpdatedRef","shouldAnimateAppearanceRef","setContainerHeight","hasFocusing","setHasFocusing","onTickEnd","freezeForMedia","unfreezeForMedia","throttleMs","observeIntersectionForReading","freezeForReading","unfreezeForReading","mentionIds","entry","dataset","messageGroups","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","unreadDivider","isAnimatingScroll","dispatchHeavyAnimationEvent","ANIMATION_END_DELAY","withUsers","onScroll","currentAnchorIdRef","isSchedule","messageCountToAnimate","messageGroup","flatten","appearanceIndex","dateGroup","dateGroupIndex","dateGroupsArray","senderGroup","senderGroupIndex","senderGroupsArray","compact","currentDocumentGroupId","messageIndex","isMessageAlbum","documentGroupId","nextDocumentGroupId","originalId","getMessageOriginalId","SCHEDULED_WHEN_ONLINE","formatHumanDate","renderMessages","focusLastMessage","messageElements","lastMessageElement","buildAttachment","filename","blob","isQuick","quick","startsWith","preloadImage","newBlob","toBlob","squeezeImage","revokeObjectURL","videoWidth","videoHeight","preloadVideo","createPosterForVideo","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","subscribeToAnalyzer","stop","reject","onstop","Blob","onerror","delayStop","CLIPBOARD_ACCEPTED_TYPES","getMessageTextAsHtml","formattedText","currentThreadId","DeleteMessageModal","openTimeout","isFirstTimeActivation","onActivate","buttonProps","AttachMenu","SymbolMenu","MentionTooltip","CustomSend","StickerTooltipAsync","StickerTooltip","BotKeyboardMenu","forwardMessageIds","replyingToId","forwardedMessagesCount","exitForwardMode","canAnimate","useAsyncRendering","clearEmbedded","handleMessageClick","AttachmentModal","PollModal","DropArea","RE_LINK","RegExp","RE_LINK_TEMPLATE","messageText","toggleMessageWebPage","parseMessageInput","linkEntity","ApiMessageEntityTypes","TextUrl","textMatch","renderingWebPage","webPageWithoutPhoto","messageStub","CalendarModal","PaymentModal","MainButtonState","ReceiptModal","chatUser","selectChatUser","messageWithActualBotKeyboard","selectNewestMessageWithBotKeyboardButtons","editingMessage","canScheduleUntilOnline","wasOnline","withScheduledButton","shouldSchedule","botKeyboardMessageId","canSuggestMembers","isChatGroup","stickersForEmoji","groupChatMembers","isReceiptModalOpen","shouldSuggestStickers","dropAreaState","onDropHide","editMessage","saveDraft","clearDraft","setStickerSearchQuery","setGifSearchQuery","closePollModal","closePaymentModal","clearReceipt","addRecentEmoji","html","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_IOS","voiceRecording","tickVolume","boxShadow","useVoiceRecording","mainButtonState","Edit","IS_VOICE_RECORDING_SUPPORTED","Send","Record","canShowCustomSendMenu","isMentionTooltipOpen","mentionFilter","closeMentionTooltip","insertMention","mentionFilteredMembers","useMentionTooltip","isCustomSendMenuOpen","allowedAttachmentOptions","getAllowedAttachmentOptions","isChatAdmin","slowMode","getChatSlowModeOptions","isStickerTooltipOpen","closeStickerTooltip","clearStickersForEmoji","IS_EMOJI_SUPPORTED","parseEmojiOnlyString","hasStickers","useStickerTooltip","canSendStickers","isEmojiTooltipOpen","closeEmojiTooltip","filteredEmojis","insertEmoji","useEmojiTooltip","insertTextAndUpdateCursor","selection","getSelection","newHtml","replace","rangeCount","selectionRange","getRangeAt","isSelectionInsideInput","execCommand","range","deleteContents","fragment","createContextualFragment","lastInsertedNode","lastChild","insertNode","setStartAfter","setEndAfter","removeAllRanges","addRange","insertHtmlInSelection","dispatchEvent","Event","bubbles","focusEditableElement","removeSymbol","tempInput","contentEditable","textLength","createRange","setStart","setEnd","removeChild","deleteLastCharacterOutsideSelection","resetComposer","prevChatId","handleEditComplete","editedMessage","hasMessageMedia","useEditing","updateDraft","draftChatId","draftThreadId","runDebouncedForSaveDraft","DRAFT_DEBOUNCE","prevThreadId","prevHtml","handleBlur","useDraft","handlePaste","clipboardData","input","activeElement","tagName","EDITABLE_INPUT_MODAL_ID","items","media","getAsFile","pastedText","getData","substring","preventDefault","useClipboardPaste","handleFileSelect","files","handleAppendFiles","handleClearAttachment","handleSend","currentAttachments","record","extraLength","textParams","nowSeconds","secondsSinceLastMessage","nextSendDateNotReached","nextSendDate","seconds","secondsRemaining","isSlowMode","handleStickerSelect","handleGifSelect","gif","handlePollSend","handleSilentSend","handleMessageSchedule","restArgs","getTime","handleMessageScheduleUntilOnline","handleCloseCalendar","handleSearchOpen","handleSymbolMenuOpen","handleAllScheduledClick","mainButtonHandler","areVoiceMessagesNotAllowed","canAttachMedia","prevEditedMessage","renderedEditedMessage","scheduledDefaultDate","setSeconds","setMilliseconds","scheduledMaxDate","setFullYear","getFullYear","sendButtonAriaLabel","symbolMenuButtonClassName","Portal","DropAreaState","None","withQuick","QuickFile","onHide","onFileSelect","caption","onCaptionUpdate","onSend","onFileAppend","onClear","onInsertUserName","filteredChatMembers","canAttachEmbedLinks","faded","MessageInput","innerWidth","shouldSetFocus","shouldSupressFocus","shouldSupressTextFormatter","onUpdate","onSupressedFocus","formatVoiceRecordDuration","onStickerSelect","emojis","onEmojiSelect","onPollCreate","onGifSelect","onRemoveSymbol","onSearchOpen","onSilentSend","onScheduleSend","withTimePicker","selectedAt","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","messageSendingRestrictionReason","getMessageSendingRestrictionReason","hasPinnedOrAudioMessage","loadUser","setDropAreaState","isFabShown","setIsFabShown","isNotchShown","setIsNotchShown","isUnpinModalOpen","setIsUnpinModalOpen","renderingChatId","usePrevDuringAnimation","renderingThreadId","renderingMessageListType","renderingCanPost","renderingHasTools","renderingIsFabShown","handleDragEnter","dataTransfer","shouldDrawQuick","handleHideDropArea","handleOpenUnpinModal","closeUnpinModal","handleUnpinAllMessages","customBackgroundValue","settingValue","setValue","cacheApi","CUSTOM_BG_CACHE_NAME","useCustomBackground","MASK_IMAGE_DISABLED","messagingDisabledClassName","footerClassName","DARK_THEME_BG_COLOR","LIGHT_THEME_BG_COLOR","onDragEnter","ANIMATION_LEVEL_MAX","shouldCleanup","onUnpin","runDebouncedForSearch","HeaderContent","isProfile","isManagement","messageSearchQuery","stickerSearchQuery","selectCurrentStickerSearch","gifSearchQuery","selectCurrentGifSearch","canManage","isCreator","isColumnOpen","isSearch","isStickerSearch","isGifSearch","isPollResults","profileState","managementScreen","setLocalTextSearchQuery","searchTextMessagesLocal","toggleManagement","backButtonRef","handleMessageSearchQueryChange","handleJumpToDate","valueOf","handleStickerSearchQueryChange","handleGifSearchQueryChange","shouldSkipTransition","setShouldSkipTransition","contentKey","ProfileState","Profile","SharedMedia","MemberList","Search","PollResults","StickerSearch","GifSearch","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","isPastMode","submitButtonLabel","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","excludedClosestSelector","renderPhoto","isVerifiedIconShown","isVerified","renderPhotoTabs","aria-label","VerifiedIcon","isUserOnline","getUserStatus","canInviteUsers","isUserRightBanned","getHasAdminRight","currentIsMuted","chatUsername","handleNotificationChange","copy","entity","formattedNumber","getChatLink","printedUsername","getChatDescription","ListItem","multiline","narrow","isStatic","TABS","buildInfiniteScrollItemSelector","isGroup","hasMembersTab","areMembersHidden","canViewMembers","resolvedUserId","onProfileStateChange","setLocalMediaSearchType","searchMediaMessagesLocal","loadProfilePhotos","useEffectWithPrevDeps","prevTabType","tabsEl","prevProfileState","tabListEl","determineProfileState","useProfileState","applyTransitionFix","releaseTransitionFix","transitionElSelector","setMinHeight","transitionEl","minHeight","overflowY","scrollBarWidth","clientWidth","marginRight","useTransitionFixes","cacheBuster","resetCacheBuster","setCacheBuster","useCacheBuster","handleTransitionStop","handleSelectMedia","handlePlayAudio","handleMemberClick","handleMessageFocus","renderingDelay","isFirstTab","SLIDE_TRANSITION_DURATION","canRenderContents","renderSharedMedia","noSpinner","NothingFound","Media","withDate","smaller","onDateClick","WebLink","onMessageClick","renderingFor","teactOrderKey","InfiniteScroll","itemSelector","sensitiveArea","PROFILE_SENSITIVE_AREA","preloadBackwards","noScrollRestoreOnTop","noFastList","onLoadMore","renderProfileInfo","shouldRestoreHeight","onStart","onStop","big","RightSearch","Management","MAIN_SCREENS_COUNT","RightColumnContent","MANAGEMENT_SCREENS_COUNT","blurSearchInput","areActiveChatsLoaded","selectAreActiveChatsLoaded","selectRightColumnContentKey","currentProfileUserId","selectedId","isChatSelected","toggleChatInfo","closeLocalTextSearch","closePollResults","setProfileState","setManagementScreen","selectedChatMemberId","setSelectedChatMemberId","isPromotedByCurrentUser","setIsPromotedByCurrentUser","isScrolledDown","ChatInfo","UserInfo","isOverlaying","close","GroupType","handleSelectChatMember","memberId","isPromoted","onChatMemberSelect","prevContentKey","MediaViewer","Errors","ForwardPicker","SafeLinkModal","rightColumnAnimationTimeout","notificationInterval","DEBUG_isLogged","updateIcon","asUnread","isMediaViewerOpen","selectIsMediaViewerOpen","isForwardModalOpen","selectIsForwardModalOpen","hasNotifications","hasErrors","middleColumnTransitionClassNames","rightColumnTransitionClassNames","stopEvent","initialUnread","clearInterval","setInterval","INACTIVE_MARKER","newUnread","PAGE_TITLE","onDrop","onDragOver","initApi"],"mappings":"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","file":"4.b0768c144c69fa913166.js","sourcesContent":["import { addReducer, getDispatch, setGlobal } from '../../../lib/teact/teactn';\nimport {\n exitMessageSelectMode,\n updateCurrentMessageList,\n} from '../../reducers';\nimport { selectCurrentMessageList } from '../../selectors';\n\nwindow.addEventListener('popstate', (e) => {\n if (!e.state) {\n return;\n }\n\n const { chatId: id, threadId, messageListType: type } = e.state;\n\n getDispatch().openChat({\n id, threadId, type, noPushState: true,\n });\n});\n\naddReducer('openChat', (global, actions, payload) => {\n const {\n id, threadId = -1, type = 'thread', noPushState,\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 = exitMessageSelectMode(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 if (!noPushState) {\n window.history.pushState({ chatId: id, threadId, messageListType: type }, '');\n }\n }\n\n return updateCurrentMessageList(global, id, threadId, type);\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","import { addReducer, getGlobal, setGlobal } from '../../../lib/teact/teactn';\n\nimport { MAIN_THREAD_ID } from '../../../api/types';\nimport { FocusDirection } from '../../../types';\n\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} from '../../selectors';\nimport { findLast } from '../../../util/iteratees';\n\nconst FOCUS_DURATION = 2000;\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('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('focusMessage', (global, actions, payload) => {\n const {\n chatId, threadId = MAIN_THREAD_ID, messageListType = 'thread', noHighlight, groupedId, groupedChatId,\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 }, FOCUS_DURATION);\n\n global = updateFocusedMessage(global, chatId, messageId, noHighlight);\n global = updateFocusDirection(global, undefined);\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 undefined;\n }\n\n const { chatId, threadId, type: messageListType } = currentMessageList;\n\n return toggleMessageSelection(\n global, chatId, threadId, messageListType, messageId, groupedId, childMessageIds, withShift,\n );\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\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';\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', (global) => {\n const { chatId, threadId } = selectCurrentMessageList(global) || {};\n if (!chatId || !threadId) {\n return undefined;\n }\n\n global = updateLocalTextSearch(global, chatId, threadId, false);\n global = replaceLocalTextSearchResults(global, chatId, threadId, undefined);\n return global;\n});\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","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 } 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","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 { addReducer } from '../../../lib/teact/teactn';\n\nimport { GlobalState } from '../../../global/types';\n\nimport { IS_MOBILE_SCREEN } from '../../../util/environment';\nimport getReadableErrorText from '../../../util/getReadableErrorText';\nimport { selectCurrentMessageList } from '../../selectors';\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, actions, payload) => {\n if (!IS_MOBILE_SCREEN) {\n return undefined;\n }\n\n const { id } = payload!;\n\n return {\n ...global,\n isLeftColumnShown: id === undefined,\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('showError', (global, actions, payload) => {\n const { error } = payload!;\n\n // Filter out errors that we don't want to show to the user\n if (!getReadableErrorText(error)) {\n return global;\n }\n\n const newErrors = [...global.errors];\n const existingErrorIndex = newErrors.findIndex((err) => err.message === error.message);\n if (existingErrorIndex !== -1) {\n newErrors.splice(existingErrorIndex, 1);\n }\n\n newErrors.push(error);\n\n return {\n ...global,\n errors: newErrors,\n };\n});\n\naddReducer('dismissError', (global) => {\n const newErrors = [...global.errors];\n\n newErrors.pop();\n\n return {\n ...global,\n errors: newErrors,\n };\n});\n\naddReducer('toggleSafeLinkModal', (global, actions, payload) => {\n const { url: safeLinkModalUrl } = payload;\n\n return {\n ...global,\n safeLinkModalUrl,\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 { 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} 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) => {\n actions.openChatByUsername({ username: TIPS_USERNAME });\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 { chatId } = payload!;\n const chat = selectChat(global, chatId);\n if (!chat) {\n return;\n }\n\n void callApi('requestChatUpdate', chat);\n});\n\naddReducer('updateChatMutedState', (global, actions, payload) => {\n const { chatId, isMuted } = payload!;\n const chat = selectChat(global, chatId);\n if (!chat) {\n return;\n }\n\n void callApi('updateChatMutedState', { chat, isMuted });\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('leaveChannel', (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('leaveChannel', { channelId, accessHash });\n }\n});\n\naddReducer('deleteChannel', (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('deleteChannel', { channelId, accessHash });\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 chat = selectChat(global, id);\n if (chat) {\n if (chat.unreadCount) {\n void callApi('markMessageListRead', { 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 chat = await callApi('openChatByInvite', hash);\n\n if (!chat) {\n return;\n }\n\n actions.openChat({ id: chat.id });\n })();\n } else {\n match = RE_TME_LINK.exec(url)!;\n\n const username = match[1];\n const channelPostId = match[2] ? Number(match[2]) : undefined;\n\n void openChatByUsername(actions, username, channelPostId);\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\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\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 });\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} 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 { copyTextToClipboard } from '../../../util/clipboard';\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 { 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),\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 return replaceThreadParam(global, chatId, threadId, 'draft', draft);\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 return replaceThreadParam(global, chatId, threadId, 'draft', undefined);\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 const { chatId, maxId, shouldDeleteForAll } = payload!;\n const chat = selectChat(global, chatId);\n if (!chat) {\n return;\n }\n\n void callApi('deleteHistory', { chat, shouldDeleteForAll, maxId });\n});\n\naddReducer('markMessageListRead', (global, actions, payload) => {\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', { chat, threadId, maxId });\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}) {\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) {\n await rafPromise();\n }\n\n const global = getGlobal();\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 });\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\naddReducer('loadMessageLink', (global, actions, payload) => {\n const { messageId, chatId } = payload;\n const chat = selectChat(global, chatId);\n const message = selectChatMessage(global, chatId, messageId);\n\n if (!chat || !message) {\n return;\n }\n\n (async () => {\n const result = await callApi('fetchMessageLink', { chat, message });\n\n if (result) {\n copyTextToClipboard(result.link);\n }\n })();\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 { 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\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,\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 });\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(\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 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 });\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 } = 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\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 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 } 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} from '../../reducers';\n\nconst runDebouncedForFetchFullUser = debounce((cb) => cb(), 500, false, true);\nconst TOP_PEERS_REQUEST_COOLDOWN = 60000; // 1 min\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 { hash, lastRequestedAt } = global.topPeers;\n\n if (!lastRequestedAt || Date.now() - 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(),\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","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} 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 } = payload!;\n\n (async () => {\n const result = await callApi('blockContact', contactId);\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', () => {\n callApi('fetchNotificationExceptions');\n});\n\naddReducer('loadNotificationSettings', () => {\n (async () => {\n const result = await callApi('fetchNotificationSettings');\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","import { addReducer, getDispatch } from '../../../lib/teact/teactn';\n\nimport { ApiChat } from '../../../api/types';\n\nimport { RE_TME_INVITE_LINK, RE_TME_LINK } from '../../../config';\nimport { callApi } from '../../../api/gramjs';\nimport { selectChatMessage, selectCurrentChat } from '../../selectors';\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 } = payload;\n const { currentUserId } = global;\n const chat = selectCurrentChat(global);\n if (!currentUserId || !chat) {\n return;\n }\n\n void sendBotCommand(chat, currentUserId, command);\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().showError({ error: { 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} 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});\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} 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 (!message.isOutgoing) {\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 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 ids = Object.keys(global.messages.byChatId[chatId].byId).map(Number);\n\n deleteMessages(chatId, ids, actions, global);\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 global = updateListedIds(global, chatId, MAIN_THREAD_ID, [id]);\n\n if (selectIsViewportNewest(global, chatId, MAIN_THREAD_ID)) {\n // Always keep the first uread 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 const { threadInfo, firstMessageId } = selectThreadByMessage(global, chatId, message) || {};\n\n if (!firstMessageId && isMessageLocal(message)) {\n return global;\n }\n\n if (threadInfo) {\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 if (!threadInfo.lastMessageId) {\n global = replaceThreadParam(global, chatId, threadInfo.threadId, 'threadInfo', {\n ...threadInfo,\n lastMessageId: message.id,\n });\n }\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 unique(threadIdsToUpdate).forEach((threadId) => {\n actions.requestThreadInfoUpdate({ chatId, threadId });\n });\n\n setTimeout(() => {\n setGlobal(deleteChatMessages(getGlobal(), chatId, ids));\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 id, isMuted, isSilent, shouldShowPreviews,\n } = update;\n const chat = global.chats.byId[id];\n\n if (chat) {\n global = updateChat(global, id, { isMuted });\n }\n\n setGlobal(addNotifyException(global, id, { 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 { 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 { APP_NAME, APP_VERSION, FEEDBACK_URL } from '../../../config';\nimport { IS_MOBILE_SCREEN } from '../../../util/environment';\nimport buildClassName from '../../../util/buildClassName';\nimport { pick } from '../../../util/iteratees';\nimport { isChatArchived } from '../../../modules/helpers';\nimport { formatDateToString } from '../../../util/dateFormat';\nimport switchTheme from '../../../util/switchTheme';\nimport useLang from '../../../hooks/useLang';\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 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 LEGACY_VERSION = 'https://web.telegram.org/';\nconst WEBK_VERSION = 'https://web.telegram.org/k/';\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 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 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]);\n\n const handleSearchFocus = useCallback(() => {\n if (!searchQuery) {\n onSearchQuery('');\n }\n }, [searchQuery, onSearchQuery]);\n\n const handleSelectSaved = useCallback(() => {\n openChat({ id: currentUserId });\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 switchTheme(newTheme, animationLevel > 0);\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 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 \n Switch to WebK\n \n \n Switch to Webogram\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 { theme, 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,\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, { FC } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalState } from '../../global/types';\n\nimport { pick } from '../../util/iteratees';\nimport useLang from '../../hooks/useLang';\n\nimport Spinner from '../ui/Spinner';\n\nimport './ConnectionState.scss';\n\ntype StateProps = Pick;\n\nconst ConnectionState: FC = ({ connectionState }) => {\n const lang = useLang();\n\n const isConnecting = connectionState === 'connectionStateConnecting';\n\n return isConnecting && (\n
\n \n
{lang('WaitingForNetwork')}
\n
\n );\n};\n\nexport default withGlobal(\n (global): StateProps => pick(global, ['connectionState']),\n)(ConnectionState);\n","import { useRef } from '../lib/teact/teact';\n\nimport useThrottle from './useThrottle';\nimport useOnChange from './useOnChange';\nimport useForceUpdate from './useForceUpdate';\n\nexport default (resolverFn: () => R, ms: number, dependencies: D) => {\n const valueRef = useRef();\n const runThrottled = useThrottle(ms);\n const forceUpdate = useForceUpdate();\n\n useOnChange(() => {\n let isSync = true;\n runThrottled(() => {\n valueRef.current = resolverFn();\n\n if (!isSync) {\n forceUpdate();\n }\n });\n isSync = false;\n }, dependencies);\n\n return valueRef.current;\n};\n","import { useMemo } from '../lib/teact/teact';\n\nimport { throttle } from '../util/schedulers';\n\nexport default (ms: number) => {\n return useMemo(() => {\n return throttle((cb) => cb(), ms);\n }, [ms]);\n};\n","import React, {\n FC, memo, useCallback, useEffect, useMemo, useRef, useState,\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 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 lastSyncTime?: number;\n};\n\ntype DispatchProps = Pick;\n\nconst INFO_THROTTLE = 3000;\n\nconst ChatFolders: FC = ({\n chatsById,\n usersById,\n chatFoldersById,\n notifySettings,\n notifyExceptions,\n orderedFolderIds,\n lastSyncTime,\n loadChatFolders,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const transitionRef = useRef(null);\n\n const lang = useLang();\n\n const [activeTab, setActiveTab] = useState(0);\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('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 setActiveTab(index);\n }, []);\n\n // Prevent `activeTab` pointing at non-existing folder after update\n useEffect(() => {\n if (!folderTabs || !folderTabs.length) {\n return;\n }\n\n if (activeTab >= folderTabs.length) {\n setActiveTab(0);\n }\n }, [activeTab, folderTabs]);\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 setActiveTab(Math.min(activeTab + 1, folderTabs.length - 1));\n } else if (direction === SwipeDirection.Right) {\n setActiveTab(Math.max(0, activeTab - 1));\n }\n }),\n });\n }, [activeTab, folderTabs]);\n\n const isNotInAllTabRef = useRef();\n isNotInAllTabRef.current = activeTab !== 0;\n useEffect(() => captureEscKeyListener(() => {\n if (isNotInAllTabRef.current) {\n setActiveTab(0);\n }\n }), []);\n\n const {\n shouldRender: shouldRenderPlaceholder, transitionClassNames,\n } = useShowTransition(!orderedFolderIds, undefined, true);\n\n function renderCurrentTab() {\n const activeFolder = Object.values(chatFoldersById)\n .find(({ title }) => title === folderTabs![activeTab].title);\n\n if (!activeFolder || activeTab === 0) {\n return ;\n }\n\n return ;\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 },\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 };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['loadChatFolders']),\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, memo, useState, useRef, useCallback, useEffect,\n} from '../../../lib/teact/teact';\n\nimport { LeftColumnContent } from '../../../types';\n\nimport { IS_TOUCH_ENV } from '../../../util/environment';\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';\n\nimport './LeftMain.scss';\n\ntype OwnProps = {\n content: LeftColumnContent;\n searchQuery?: string;\n searchDate?: number;\n contactsFilter: string;\n onSearchQuery: (query: string) => void;\n onContentChange: (content: LeftColumnContent) => void;\n onReset: () => void;\n};\n\ntype StateProps = {};\n\nconst TRANSITION_RENDER_COUNT = Object.keys(LeftColumnContent).length / 2;\nconst BUTTON_CLOSE_DELAY_MS = 250;\nlet closeTimeout: number | undefined;\n\nconst LeftMain: FC = ({\n content,\n searchQuery,\n searchDate,\n contactsFilter,\n onSearchQuery,\n onContentChange,\n onReset,\n}) => {\n const [isNewChatButtonShown, setIsNewChatButtonShown] = useState(IS_TOUCH_ENV);\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 return (\n \n \n \n \n {() => {\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 \n
\n );\n};\n\nexport default memo(LeftMain);\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 { IS_MOBILE_SCREEN } 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};\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 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 (\n content === LeftColumnContent.NewGroupStep2\n && !forceReturnToChatList\n ) {\n setContent(LeftColumnContent.NewGroupStep1);\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 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 }, [content, setGlobalSearchQuery, setGlobalSearchChatId, setGlobalSearchDate, resetChatCreation, settingsScreen]);\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, setGlobalSearchQuery, searchQuery]);\n\n useEffect(\n () => (content !== LeftColumnContent.ChatList ? captureEscKeyListener(() => handleReset()) : undefined),\n [content, handleReset],\n );\n\n useEffect(() => {\n clearTwoFaError();\n\n if (settingsScreen === SettingsScreens.Privacy) {\n loadPasswordInfo();\n }\n }, [clearTwoFaError, loadPasswordInfo, settingsScreen]);\n\n return (\n \n {() => {\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 { query, date } = global.globalSearch;\n return { searchQuery: query, searchDate: date };\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 { IDimensions } from '../modules/helpers';\n\nimport { throttle } from '../util/schedulers';\nimport windowSize from '../util/windowSize';\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 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_MOBILE_SCREEN } from '../../util/environment';\nimport { pick } from '../../util/iteratees';\nimport { isChatChannel, isChatSuperGroup } from '../../modules/helpers';\nimport {\n selectChat,\n selectIsChatBotNotStarted, 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 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 canSubscribe,\n canSearch,\n canMute,\n canSelect,\n canLeave,\n isRightColumnShown,\n joinChannel,\n sendBotCommand,\n openLocalTextSearch,\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 handleSearchClick = useCallback(() => {\n openLocalTextSearch();\n\n if (IS_MOBILE_SCREEN) {\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_MOBILE_SCREEN && canSubscribe && (\n \n {lang(isChannel ? 'Subscribe' : 'Join Group')}\n \n )}\n {!IS_MOBILE_SCREEN && canStartBot && (\n \n {lang('Start')}\n \n )}\n {!IS_MOBILE_SCREEN && canSearch && (\n \n \n \n )}\n {(IS_MOBILE_SCREEN || !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 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 canStartBot = 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_MOBILE_SCREEN && canSubscribe)\n || (IS_MOBILE_SCREEN && canSearch)\n || canMute\n || canSelect\n || canLeave\n );\n\n return {\n noMenu,\n isChannel,\n isRightColumnShown,\n canStartBot,\n canSubscribe,\n canSearch,\n canMute,\n canSelect,\n canLeave,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'joinChannel', 'sendBotCommand', 'openLocalTextSearch',\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_MOBILE_SCREEN } 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_MOBILE_SCREEN } 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 selectThreadOriginChat,\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};\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 originChatId: number;\n messagesCount?: number;\n isChatWithSelf?: boolean;\n isChatWithBot?: boolean;\n lastSyncTime?: number;\n notifySettings: NotifySettings;\n notifyExceptions?: Record;\n};\n\ntype DispatchProps = Pick;\n\nconst MiddleHeader: FC = ({\n chatId,\n threadId,\n messageListType,\n pinnedMessageIds,\n messagesById,\n canUnpin,\n topMessageSender,\n typingStatus,\n isSelectModeActive,\n isLeftColumnShown,\n isRightColumnShown,\n audioMessage,\n chat,\n chatsById,\n originChatId,\n messagesCount,\n isChatWithSelf,\n isChatWithBot,\n lastSyncTime,\n notifySettings,\n notifyExceptions,\n openChatWithInfo,\n pinMessage,\n focusMessage,\n openChat,\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) {\n loadPinnedMessages({ chatId });\n }\n }, [chatId, loadPinnedMessages, lastSyncTime, threadId]);\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 = windowWidth >= MOBILE_SCREEN_MAX_WIDTH && 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(() => {\n if (IS_MOBILE_SCREEN) {\n const messageInput = document.getElementById(EDITABLE_INPUT_ID);\n if (messageInput) {\n messageInput.blur();\n }\n }\n if (threadId === MAIN_THREAD_ID && messageListType === 'thread') {\n if (IS_MOBILE_SCREEN) {\n openChat({ id: undefined });\n } else {\n toggleLeftColumn();\n }\n\n return;\n }\n\n if (messageListType === 'scheduled' && isSelectModeActive) {\n exitMessageSelectMode();\n }\n openChat({ id: originChatId, threadId: MAIN_THREAD_ID });\n }, [openChat, originChatId, threadId, messageListType, toggleLeftColumn, isSelectModeActive, exitMessageSelectMode]);\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 && 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 } = 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 const originChat = selectThreadOriginChat(global, chatId, threadId);\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 originChatId: originChat ? originChat.id : chatId,\n messagesCount,\n isChatWithSelf: selectIsChatWithSelf(global, chatId),\n isChatWithBot: chat && selectIsChatWithBot(global, chat),\n lastSyncTime,\n notifySettings: selectNotifySettings(global),\n notifyExceptions: selectNotifyExceptions(global),\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 '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\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 nextMessageDatetime = Number(getDayStart(nextMessage.date * 1000));\n if (currentDateGroup.datetime !== nextMessageDatetime) {\n currentDateGroup = {\n originalDate: nextMessage.date,\n datetime: nextMessageDatetime,\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 ) {\n currentSenderGroup = [];\n currentDateGroup.senderGroups.push(currentSenderGroup);\n }\n }\n });\n\n return dateGroups;\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 { MutableRefObject } from 'react';\nimport React, {\n FC, useCallback, useEffect, useRef,\n} from '../../lib/teact/teact';\n\nimport { MESSAGE_LIST_SENSITIVE_AREA } from '../../config';\nimport resetScroll from '../../util/resetScroll';\nimport { useIntersectionObserver, useOnIntersect } from '../../hooks/useIntersectionObserver';\nimport useOnChange from '../../hooks/useOnChange';\n\ntype OwnProps = {\n containerRef: MutableRefObject;\n className: string;\n messageIds: number[];\n focusingId?: number;\n loadMoreForwards?: NoneToVoidFunction;\n loadMoreBackwards?: NoneToVoidFunction;\n isViewportNewest?: boolean;\n firstUnreadId?: number;\n onFabToggle: AnyToVoidFunction;\n onNotchToggle: AnyToVoidFunction;\n children: any;\n};\n\nconst FAB_THRESHOLD = 50;\nconst FAB_FREEZE_TIMEOUT = 100;\n\n// Local flag is used because `freeze/unfreeze` methods are controlled by heavy animation\nlet isFabFrozen = false;\n\nconst MessageScroll: FC = ({\n containerRef,\n className,\n messageIds,\n focusingId,\n loadMoreForwards,\n loadMoreBackwards,\n isViewportNewest,\n firstUnreadId,\n onFabToggle,\n onNotchToggle,\n children,\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 (isFabFrozen) {\n return;\n }\n\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(firstUnreadId ? !isAtBottom : !isNearBottom);\n onNotchToggle(!isAtBottom);\n }, [messageIds, isViewportNewest, containerRef, onFabToggle, firstUnreadId, onNotchToggle]);\n\n const {\n observe: observeIntersection,\n freeze: freezeForLoadMore,\n unfreeze: unfreezeForLoadMore,\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 } = useIntersectionObserver({\n rootRef: containerRef,\n }, toggleScrollTools);\n\n useOnIntersect(fabTriggerRef, observeIntersectionForNotch);\n\n // Do not load more and show FAB when focusing\n useOnChange(() => {\n if (focusingId) {\n freezeForLoadMore();\n freezeForFab();\n } else {\n unfreezeForFab();\n unfreezeForLoadMore();\n }\n }, [focusingId]);\n\n // Workaround for FAB flickering with tall incoming message\n useOnChange(() => {\n isFabFrozen = true;\n\n setTimeout(() => {\n isFabFrozen = false;\n }, FAB_FREEZE_TIMEOUT);\n }, [messageIds]);\n\n // Workaround for stuck FAB when many unread messages\n useEffect(toggleScrollTools, [firstUnreadId]);\n\n return (\n
\n
\n {children}\n \n \n
\n );\n};\n\nexport default MessageScroll;\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 }: {\n hasReply?: boolean;\n customShape?: boolean | number;\n isLastInGroup?: boolean;\n asForwarded?: boolean;\n hasThread?: boolean;\n forceSenderName?: boolean;\n hasComments?: 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 isMediaWithNoText = (photo || video) && !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 (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) {\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 (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_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 : MIN_MEDIA_WIDTH;\n}\n\nexport function calculateMediaDimensions(message: ApiMessage) {\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)\n : calculateVideoDimensions(video!, isOwn, isForwarded);\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 } from '../../../../api/types';\nimport { IDimensions } from '../../../../modules/helpers';\n\nimport { MOBILE_SCREEN_MAX_WIDTH } from '../../../../config';\nimport { REM } from '../../../common/helpers/mediaDimensions';\nimport { calculateMediaDimensions } from './mediaDimensions';\n\nconst MAX_WIDTH_MOBILE_VW = 69;\nconst MAX_WIDTH_DESK_OWN_REM = 30;\nconst MAX_WIDTH_DESK_REM = 29;\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: IDimensions;\n};\n\nfunction getMaxWidth(isOwn: boolean, isForwarded: boolean, windowWidth: number) {\n if (windowWidth <= MOBILE_SCREEN_MAX_WIDTH) {\n return (windowWidth / 100) * MAX_WIDTH_MOBILE_VW - (isForwarded ? 1.625 : 0) * REM;\n }\n\n const maxWidth = isOwn ? MAX_WIDTH_DESK_OWN_REM : MAX_WIDTH_DESK_REM;\n\n return (maxWidth - (isForwarded ? 1.625 : 0)) * REM;\n}\n\nfunction getRatios(messages: ApiMessage[]) {\n return messages.map(\n (message) => {\n const dimensions = calculateMediaDimensions(message) as IDimensions;\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: IDimensions = { 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 album: IAlbum,\n windowWidth: number,\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 = getMaxWidth(isOwn, isForwarded, windowWidth);\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","let element: HTMLSpanElement | undefined;\n\nexport default function calculateAuthorWidth(text: string) {\n if (!element) {\n element = document.createElement('span');\n element.style.font = '400 12px Roboto, \"Helvetica Neue\", \"Apple Color Emoji\", 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 { useLayoutEffect } from '../../../../lib/teact/teact';\nimport fastSmoothScroll from '../../../../util/fastSmoothScroll';\nimport { FocusDirection } from '../../../../types';\n\n// This is the max scroll offset within existing viewport.\nconst FOCUS_MAX_OFFSET = 1500;\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' : 'center',\n FOCUS_MARGIN,\n focusDirection === undefined ? FOCUS_MAX_OFFSET : RELOCATED_FOCUS_OFFSET,\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, 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';\n\ntype OwnProps = {\n message: ApiMessage;\n observeIntersection?: ObserveFn;\n isEmbedded?: boolean;\n appearanceOrder?: number;\n isLastInList?: boolean;\n};\n\ntype StateProps = {\n sender?: ApiUser | ApiChat;\n targetUser?: ApiUser;\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 sender,\n targetUser,\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 content = renderActionMessageText(\n lang,\n message,\n sender,\n targetUser,\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 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 userId = message.senderId;\n const { targetUserId, 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 sender,\n ...(targetUserId && { targetUser: selectUser(global, targetUserId) }),\n targetChatId,\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
{renderText(senderTitle || title || NBSP)}
\n

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

\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_MOBILE_SCREEN } 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_MOBILE_SCREEN && !IS_CANVAS_FILTER_SUPPORTED,\n );\n}\n","const SELECTED_APPENDIX_BACKGROUND = 'rgba(255,255,255,1)';\n\nexport default async (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 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 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);\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 canMessagePlayVideoInline,\n getMediaTransferState,\n getMessageMediaFormat,\n getMessageMediaHash,\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 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 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 = message.content.video!;\n const localBlobUrl = video.blobUrl;\n const canPlayInline = Boolean(localBlobUrl) || canMessagePlayVideoInline(video);\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 thumbRef = useBlurredMediaThumbRef(message);\n const { mediaData, downloadProgress } = useMediaWithDownloadProgress(\n getMessageMediaHash(message, 'inline'),\n !shouldDownload,\n getMessageMediaFormat(message, 'inline'),\n lastSyncTime,\n );\n\n const fullMediaData = localBlobUrl || mediaData;\n const isInline = Boolean(canPlayInline && isIntersecting && fullMediaData);\n\n const { isBuffered, bufferingHandlers } = useBuffering(!shouldAutoLoad);\n const { isUploading, isTransferring, transferProgress } = getMediaTransferState(\n message,\n uploadProgress || downloadProgress,\n shouldDownload && (canPlayInline && !isBuffered),\n );\n const wasDownloadDisabled = usePrevious(isDownloadAllowed) === false;\n const {\n shouldRender: shouldRenderSpinner,\n transitionClassNames: spinnerClassNames,\n } = useShowTransition(isTransferring, undefined, wasDownloadDisabled);\n const { shouldRenderThumb, 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 isOwn = isOwnMessage(message);\n const isForwarded = isForwardedMessage(message);\n const { width, height } = dimensions || calculateVideoDimensions(video, isOwn, isForwarded);\n\n useHeavyAnimationCheckForVideo(videoRef, Boolean(isInline && shouldAutoPlay));\n\n usePauseOnInactive(videoRef, isPlayAllowed);\n\n useVideoCleanup(videoRef, [isInline]);\n\n const handleClick = useCallback(() => {\n if (isUploading) {\n if (onCancelUpload) {\n onCancelUpload(message);\n }\n } else if (canPlayInline && !fullMediaData) {\n setIsDownloadAllowed((isAllowed) => !isAllowed);\n } else if (canPlayInline && fullMediaData && !isPlayAllowed) {\n setIsPlayAllowed(true);\n videoRef.current!.play();\n } else if (onClick) {\n onClick(message.id);\n }\n }, [isUploading, canPlayInline, 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 const shouldRenderInlineVideo = isInline;\n const shouldRenderHqPreview = !canPlayInline && mediaData;\n const shouldRenderPlayButton = !canPlayInline || (isDownloadAllowed && !isPlayAllowed && !shouldRenderSpinner);\n const shouldRenderDownloadButton = canPlayInline && !isDownloadAllowed;\n\n return (\n \n {(!isInline || shouldRenderThumb)\n && (\n \n )}\n {previewBlobUrl && (\n \n )}\n\n {shouldRenderInlineVideo && (\n \n \n \n )}\n {shouldRenderHqPreview && (\n \n )}\n {shouldRenderPlayButton && (\n \n )}\n {shouldRenderSpinner && (\n
\n \n
\n )}\n {shouldRenderDownloadButton && (\n \n )}\n {isTransferring && !canPlayInline ? (\n {Math.round(transferProgress * 100)}%\n ) : isTransferring && canPlayInline ? (\n ...\n ) : (\n
\n {video.isGif ? 'GIF' : formatMediaDuration(video.duration - playProgress)}\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 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};\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}) => {\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), 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 {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(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 ? 'Quiz' : 'Anonymous Quiz';\n }\n\n if (summary.closed) {\n return 'Final results';\n }\n\n return summary.isPublic ? 'Poll' : 'Anonymous Poll';\n}\n\nfunction getReadableVotersCount(isQuiz: true | undefined, count?: number) {\n if (!count) {\n return isQuiz ? 'No answers yet' : 'No voters yet';\n }\n\n return isQuiz ? `${count} answered` : `${count} voted`;\n}\n\nexport default memo(withGlobal(\n (global, { poll }) => {\n const { recentVoterIds } = poll.results;\n const { byId: usersById } = global.users;\n if (!recentVoterIds || recentVoterIds.length === 0) {\n return {};\n }\n\n return {\n recentVoterIds,\n usersById,\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';\n\nimport './WebPage.scss';\n\nconst MAX_TEXT_LENGTH = 170; // symbols\n\ntype OwnProps = {\n message: ApiMessage;\n observeIntersection?: ObserveFn;\n shouldAutoLoad?: boolean;\n inPreview?: boolean;\n onMediaClick?: () => void;\n onCancelMediaTransfer?: () => void;\n};\n\nconst WebPage: FC = ({\n message,\n observeIntersection,\n shouldAutoLoad,\n inPreview,\n onMediaClick,\n onCancelMediaTransfer,\n}) => {\n const webPage = getMessageWebPage(message);\n\n let isSquarePhoto = false;\n if (webPage && webPage.photo) {\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 } = webPage;\n\n const isMediaInteractive = photo && onMediaClick && !isSquarePhoto && !webPage.hasDocument;\n const truncatedDescription = trimText(description, MAX_TEXT_LENGTH);\n\n const className = buildClassName(\n 'WebPage',\n photo\n ? (isSquarePhoto && 'with-square-photo')\n : (!inPreview && 'without-photo'),\n );\n\n return (\n \n {photo && (\n \n )}\n
\n \n {!inPreview && title && (\n

{renderText(title)}

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

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

\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(WrapedComponent: FC) {\n const Component: 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 )(Component));\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';\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 requestAnimationFrame(() => {\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\n usePauseOnInactive(playerRef, Boolean(mediaData));\n\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 playerEl.currentTime = 0;\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 && (\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 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 {button.text}\n {button.type === 'url' && }\n \n ))}\n
\n ))}\n
\n );\n};\n\nexport default InlineButtons;\n","import React, { FC, memo, useCallback } 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 } 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};\n\ntype DispatchProps = Pick;\n\nconst CommentButton: FC = ({\n disabled, threadInfo, usersById, chatsById, openChat,\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 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 { byId: usersById } = global.users;\n const { byId: chatsById } = global.chats;\n\n return {\n threadInfo,\n usersById,\n chatsById,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'openChat',\n ]),\n)(CommentButton));\n","import { MouseEvent as ReactMouseEvent } from 'react';\nimport 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 { FocusDirection, IAlbum, MediaViewerOrigin } from '../../../types';\n\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, selectShouldLoopStickers,\n} from '../../../modules/selectors';\nimport {\n getMessageContent,\n isOwnMessage,\n isReplyMessage,\n isAnonymousOwnMessage,\n isChatPrivate,\n getMessageCustomShape,\n isChatChannel,\n getMessageSingleEmoji, getSenderTitle, getUserColorKey,\n} from '../../../modules/helpers';\nimport buildClassName from '../../../util/buildClassName';\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 renderText from '../../common/helpers/renderText';\nimport calculateAuthorWidth from './helpers/calculateAuthorWidth';\nimport { ObserveFn, useOnIntersect } from '../../../hooks/useIntersectionObserver';\nimport useFocusMessage from './hooks/useFocusMessage';\nimport useWindowSize from '../../../hooks/useWindowSize';\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 withAvatar?: boolean;\n withSenderName?: boolean;\n threadId: number;\n messageListType: MessageListType;\n noComments: boolean;\n appearanceOrder: number;\n} & MessagePositionProperties;\n\ntype StateProps = {\n forceSenderName?: boolean;\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;\n\nconst Message: FC = ({\n message,\n observeIntersectionForBottom,\n observeIntersectionForMedia,\n observeIntersectionForAnimatedStickers,\n album,\n withAvatar,\n withSenderName,\n noComments,\n appearanceOrder,\n isFirstInGroup,\n isLastInGroup,\n isFirstInDocumentGroup,\n isLastInDocumentGroup,\n isLastInList,\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}) => {\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\n useOnIntersect(bottomMarkerRef, observeIntersectionForBottom);\n\n const { width: windowWidth } = useWindowSize();\n\n const {\n isContextMenuOpen, contextMenuPosition,\n handleBeforeContextMenu, handleContextMenu,\n handleContextMenuClose, handleContextMenuHide,\n } = useContextMenuHandlers(ref, false, true);\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 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 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 });\n const avatarPeer = forwardInfo && (isChatWithSelf || !sender) ? originSender : sender;\n const senderPeer = forwardInfo ? originSender : sender;\n const signature = (\n (isChannel && message.adminTitle) || (forwardInfo && !asForwarded && forwardInfo.adminTitle) || undefined\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: ReactMouseEvent) => {\n e.stopPropagation();\n\n toggleMessageSelection({\n messageId,\n groupedId: message.groupedId,\n });\n }, [messageId, message.groupedId, toggleMessageSelection]);\n\n const handleMessageSelect = useCallback((e?: ReactMouseEvent) => {\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 }, [toggleMessageSelection, messageId, isAlbum, album]);\n\n const handleContainerDoubleClick = useCallback(() => {\n setReplyingToId({ messageId });\n }, [setReplyingToId, messageId]);\n\n const handleContentDoubleClick = useCallback((e: ReactMouseEvent) => {\n e.stopPropagation();\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 return;\n }\n\n if (isChatPrivate(senderPeer.id)) {\n openUserInfo({ id: senderPeer.id });\n } else {\n openChat({ id: senderPeer.id });\n }\n }, [senderPeer, 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({ chatId, threadId, messageId: message.replyToMessageId });\n }, [focusMessage, chatId, threadId, message.replyToMessageId]);\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 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 const lang = useLang();\n\n let style = '';\n let calculatedWidth;\n let noMediaCorners = false;\n const albumLayout = useMemo(() => {\n return isAlbum ? calculateAlbumLayout(isOwn, Boolean(asForwarded), album!, windowWidth) : undefined;\n }, [isAlbum, windowWidth, isOwn, asForwarded, 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).width;\n } else if (video) {\n if (video.isRound) {\n width = ROUND_VIDEO_DIMENSIONS;\n } else {\n width = calculateMediaDimensions(message).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\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 && (\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) {\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 const metaSafeAuthorWidth = useMemo(() => {\n return signature ? calculateAuthorWidth(signature) : undefined;\n }, [signature]);\n\n const canShowActionButton = (\n !(isContextMenuShown || isInSelectMode || isForwarding)\n && (!isInDocumentGroup || isLastInDocumentGroup)\n );\n const canForward = canShowActionButton && isChannel && !isScheduled;\n const canFocus = canShowActionButton && (\n (forwardInfo && (forwardInfo.isChannelPost || (isChatWithSelf && !isOwn)) && forwardInfo.fromMessageId)\n || isPinnedList\n );\n\n return (\n \n \n {!isInDocumentGroup && (\n
\n {isSelected && }\n
\n )}\n {isLastInDocumentGroup && (\n \n {isGroupSelected && (\n \n )}\n \n )}\n {withAvatar && renderAvatar()}\n \n \n {withAppendix && (
)}\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
\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\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 forceSenderName,\n sender,\n originSender,\n botSender,\n shouldHideReply,\n isThreadTop,\n replyMessage,\n replyMessageSender,\n ...(isOutgoing && { outgoingStatus: selectOutgoingStatus(global, message, messageListType === 'scheduled') }),\n ...(typeof uploadProgress === 'number' && { uploadProgress }),\n isFocused,\n ...(isFocused && { focusDirection, noFocusHighlight }),\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 };\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 ]),\n)(Message));\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, SCHEDULED_WHEN_ONLINE } from '../../config';\nimport { IS_ANDROID, IS_MOBILE_SCREEN } from '../../util/environment';\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, selectCurrentMessageIds,\n} from '../../modules/selectors';\nimport {\n getMessageOriginalId,\n isActionMessage,\n isChatChannel,\n isChatPrivate,\n isOwnMessage,\n} from '../../modules/helpers';\nimport {\n compact,\n flatten,\n orderBy,\n pick,\n} from '../../util/iteratees';\nimport {\n fastRaf, debounce, onTickEnd,\n} from '../../util/schedulers';\nimport { formatHumanDate } from '../../util/dateFormat';\nimport useLayoutEffectWithPrevDeps from '../../hooks/useLayoutEffectWithPrevDeps';\nimport buildClassName from '../../util/buildClassName';\nimport { groupMessages, MessageDateGroup, isAlbum } from './helpers/groupMessages';\nimport { ObserveFn, useIntersectionObserver } from '../../hooks/useIntersectionObserver';\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, { LangFn } from '../../hooks/useLang';\nimport useWindowSize from '../../hooks/useWindowSize';\n\nimport Loading from '../ui/Loading';\nimport MessageScroll from './MessageScroll';\nimport Message from './message/Message';\nimport ActionMessage from './ActionMessage';\n\nimport './MessageList.scss';\n\ntype OwnProps = {\n chatId: number;\n threadId: number;\n type: MessageListType;\n canPost: 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 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 INTERSECTION_THROTTLE_FOR_MEDIA = IS_ANDROID ? 1000 : 350;\nconst INTERSECTION_MARGIN_FOR_MEDIA = IS_MOBILE_SCREEN ? 300 : 500;\nconst FOCUSING_DURATION = 1000;\nconst BOTTOM_FOCUS_MARGIN = 20;\nconst SELECT_MODE_ANIMATION_DURATION = 200;\nconst FOCUSING_FADE_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 isChatWithSelf,\n messageIds,\n messagesById,\n firstUnreadId,\n isViewportNewest,\n threadFirstMessageId,\n isRestricted,\n restrictionReason,\n focusingId,\n isSelectModeActive,\n animationLevel,\n loadViewportMessages,\n markMessageListRead,\n markMessagesRead,\n setScrollOffset,\n lastMessage,\n botDescription,\n threadTopMessageId,\n hasLinkedChat,\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(!messageIds);\n\n const [containerHeight, setContainerHeight] = useState();\n const [hasFocusing, setHasFocusing] = useState(Boolean(focusingId));\n\n const areMessagesLoaded = Boolean(messageIds);\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 const {\n observe: observeIntersectionForMedia, freeze: freezeForMedia, unfreeze: unfreezeForMedia,\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 useOnChange(() => {\n memoFocusingIdRef.current = focusingId;\n\n if (focusingId) {\n freezeForMedia();\n freezeForReading();\n } else {\n unfreezeForReading();\n unfreezeForMedia();\n }\n }, [focusingId]);\n\n const { observe: observeIntersectionForAnimatedStickers } = useIntersectionObserver({\n rootRef: containerRef,\n throttleMs: INTERSECTION_THROTTLE_FOR_MEDIA,\n });\n\n useEffect(() => {\n if (focusingId) {\n setHasFocusing(true);\n } else {\n setTimeout(() => {\n setHasFocusing(false);\n }, FOCUSING_FADE_ANIMATION_DURATION);\n }\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]);\n return groupMessages(orderBy(listedMessages, ['date', 'id']), memoUnreadDividerBeforeIdRef.current);\n }, [messageIds, messagesById, threadFirstMessageId, threadTopMessageId]);\n\n const [loadMoreBackwards, loadMoreForwards, loadMoreAround] = useMemo(\n () => (type === 'thread' ? [\n debounce(() => loadViewportMessages({ direction: LoadMoreDirection.Backwards }), 1000, true, false),\n debounce(() => loadViewportMessages({ direction: LoadMoreDirection.Forwards }), 1000, true, false),\n debounce(() => loadViewportMessages({ direction: LoadMoreDirection.Around }), 1000, true, false),\n ] : []),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [loadViewportMessages, messageIds],\n );\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 useEffect(() => {\n containerRef.current!.dataset.normalHeight = String(containerRef.current!.offsetHeight);\n }, [windowHeight]);\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) {\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]);\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 = unreadDivider.offsetTop - (hasTools ? UNREAD_DIVIDER_TOP_WITH_TOOLS : UNREAD_DIVIDER_TOP);\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 useEffect(() => {\n if (!animationLevel || animationLevel > 0) {\n dispatchHeavyAnimationEvent(SELECT_MODE_ANIMATION_DURATION + ANIMATION_END_DELAY);\n }\n }, [animationLevel, isSelectModeActive]);\n\n const lang = useLang();\n\n const isPrivate = Boolean(chatId && isChatPrivate(chatId));\n const withUsers = Boolean((!isPrivate && !isChannelChat) || isChatWithSelf);\n\n const className = buildClassName(\n 'MessageList custom-scroll',\n !withUsers && 'no-avatars',\n isChannelChat && 'no-avatars',\n !canPost && 'no-composer',\n type === 'pinned' && 'type-pinned',\n isSelectModeActive && 'select-mode-active',\n hasFocusing && 'has-focusing',\n isScrolled && 'scrolled',\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 {renderMessages(\n lang,\n messageGroups || groupMessages([lastMessage!]),\n observeIntersectionForReading,\n observeIntersectionForMedia,\n observeIntersectionForAnimatedStickers,\n withUsers,\n anchorIdRef,\n memoUnreadDividerBeforeIdRef,\n threadId,\n type,\n threadTopMessageId,\n threadFirstMessageId,\n hasLinkedChat,\n messageGroups ? type === 'scheduled' : false,\n !messageGroups || !shouldAnimateAppearanceRef.current,\n )}\n \n ) : (\n \n )}\n
\n );\n};\n\nfunction renderMessages(\n lang: LangFn,\n messageGroups: MessageDateGroup[],\n observeIntersectionForReading: ObserveFn,\n observeIntersectionForMedia: ObserveFn,\n observeIntersectionForAnimatedStickers: ObserveFn,\n withUsers: boolean,\n currentAnchorIdRef: { current: string | undefined },\n memoFirstUnreadIdRef: { current: number | undefined },\n threadId: number,\n type: MessageListType,\n threadTopMessageId?: number,\n threadFirstMessageId?: number,\n hasLinkedChat?: boolean,\n isSchedule = false,\n noAppearanceAnimation = false,\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 && currentAnchorIdRef.current === `message${message.previousLocalId}`) {\n currentAnchorIdRef.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
\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 flatten(dateGroups);\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\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 isSelectModeActive: selectIsInSelectMode(global),\n animationLevel: global.settings.byKey.animationLevel,\n ...(withLastMessageWhenPreloading && { lastMessage }),\n botDescription,\n threadTopMessageId,\n hasLinkedChat: chat.fullInfo && ('linkedChatId' in chat.fullInfo)\n ? Boolean(chat.fullInfo.linkedChatId)\n : undefined,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadViewportMessages',\n 'markMessageListRead',\n 'markMessagesRead',\n 'setScrollOffset',\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';\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 focusLastMessage,\n}) => {\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 focusLastMessage();\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, focusLastMessage]);\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, ['focusLastMessage']),\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","export default __webpack_public_path__ + \"8ccc0b555efcec3616377aea078dda16.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 && input.tagName === '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';\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 requestAnimationFrame(() => {\n const messageInput = document.getElementById(EDITABLE_INPUT_ID)!;\n focusEditableElement(messageInput, true);\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 // Subscribe and handle `window.blur`\n useEffect(() => {\n function handleBlur() {\n if (chatId && threadId) {\n updateDraft(chatId, threadId);\n }\n }\n\n window.addEventListener('blur', handleBlur);\n\n return () => {\n window.removeEventListener('blur', handleBlur);\n };\n }, [chatId, threadId, updateDraft]);\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 './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 ApiSticker,\n ApiVideo,\n ApiNewPoll,\n ApiMessage,\n ApiFormattedText,\n ApiChat,\n ApiChatMember,\n ApiUser,\n MAIN_THREAD_ID,\n} from '../../../api/types';\n\nimport { EDITABLE_INPUT_ID, SCHEDULED_WHEN_ONLINE } from '../../../config';\nimport { IS_VOICE_RECORDING_SUPPORTED, IS_MOBILE_SCREEN, IS_EMOJI_SUPPORTED } 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 isChatGroup,\n isChatPrivate,\n isChatAdmin,\n} from '../../../modules/helpers';\nimport { 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';\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';\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 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 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 canSuggestMembers?: 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} & 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 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 canSuggestMembers,\n isPollModalOpen,\n isPaymentModalOpen,\n isReceiptModalOpen,\n botKeyboardMessageId,\n withScheduledButton,\n stickersForEmoji,\n groupChatMembers,\n currentUserId,\n usersById,\n lastSyncTime,\n contentToBeScheduled,\n shouldSuggestStickers,\n recentEmojis,\n sendMessage,\n editMessage,\n saveDraft,\n clearDraft,\n showError,\n setStickerSearchQuery,\n setGifSearchQuery,\n forwardMessages,\n openPollModal,\n closePollModal,\n loadScheduledHistory,\n closePaymentModal,\n openChat,\n clearReceipt,\n addRecentEmoji,\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\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) {\n loadScheduledHistory();\n }\n }, [chatId, loadScheduledHistory, lastSyncTime, threadId]);\n\n useLayoutEffect(() => {\n if (!appendixRef.current) {\n return;\n }\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 mentionFilteredMembers,\n } = useMentionTooltip(\n canSuggestMembers && !attachments.length,\n html,\n setHtml,\n undefined,\n groupChatMembers,\n currentUserId,\n usersById,\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 );\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 );\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 if (selection.rangeCount) {\n const selectionRange = selection.getRangeAt(0);\n if (isSelectionInsideInput(selectionRange)) {\n if (IS_EMOJI_SUPPORTED) {\n // Insertion will trigger `onChange` in MessageInput, so no need to setHtml in state\n document.execCommand('insertText', false, text);\n } else {\n insertHtmlInSelection(newHtml);\n messageInput.dispatchEvent(new Event('input', { bubbles: true }));\n }\n return;\n }\n\n setHtml(`${htmlRef.current!}${newHtml}`);\n\n if (!IS_MOBILE_SCREEN) {\n // If selection is outside of input, set cursor at the end of input\n requestAnimationFrame(() => {\n focusEditableElement(messageInput);\n });\n }\n } else {\n setHtml(`${htmlRef.current!}${newHtml}`);\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)) {\n document.execCommand('delete', false);\n return;\n }\n }\n\n setHtml(deleteLastCharacterOutsideSelection(htmlRef.current!));\n }, []);\n\n const resetComposer = useCallback(() => {\n setHtml('');\n setAttachments([]);\n closeStickerTooltip();\n closeCalendar();\n setScheduledMessageArgs(undefined);\n closeMentionTooltip();\n closeEmojiTooltip();\n\n if (IS_MOBILE_SCREEN) {\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 showError({\n error: {\n message: 'CAPTION_TOO_LONG_PLEASE_REMOVE_CHARACTERS',\n textParams: {\n '{EXTRA_CHARS_COUNT}': extraLength,\n '{PLURAL_S}': extraLength > 1 ? 's' : '',\n },\n },\n });\n return;\n }\n\n if (currentAttachments.length || text) {\n if (slowMode && !isAdmin) {\n const nowSeconds = Math.floor(Date.now() / 1000);\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 showError({\n error: {\n message: `A wait of ${secondsRemaining} seconds is required before sending another message in this chat`,\n isSlowMode: true,\n },\n });\n\n const messageInput = document.getElementById(EDITABLE_INPUT_ID)!;\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);\n\n clearDraft({ chatId, localOnly: true });\n\n // Wait until message animation starts\n requestAnimationFrame(resetComposer);\n }, [\n activeVoiceRecording, attachments, connectionState, chatId, slowMode, isForwarding, isAdmin,\n sendMessage, stopRecordingVoice, resetComposer, clearDraft, showError, forwardMessages,\n ]);\n\n const handleStickerSelect = useCallback((sticker: ApiSticker) => {\n sticker = {\n ...sticker,\n isPreloadedGlobally: true,\n };\n\n if (shouldSchedule) {\n setScheduledMessageArgs({ sticker });\n openCalendar();\n } else {\n sendMessage({ sticker });\n requestAnimationFrame(resetComposer);\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(resetComposer);\n }\n }, [shouldSchedule, openCalendar, sendMessage, resetComposer]);\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) => {\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\n if (!scheduledMessageArgs || Object.keys(restArgs).length === 0) {\n handleSend(!!isSilent, scheduledAt);\n } else {\n sendMessage({\n ...scheduledMessageArgs,\n scheduledAt,\n });\n requestAnimationFrame(resetComposer);\n }\n closeCalendar();\n }, [closeCalendar, handleSend, resetComposer, scheduledMessageArgs, sendMessage]);\n\n const handleMessageScheduleUntilOnline = useCallback(() => {\n handleMessageSchedule(new Date(SCHEDULED_WHEN_ONLINE * 1000));\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_MOBILE_SCREEN || 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_MOBILE_SCREEN) {\n closeSymbolMenu();\n }\n }, [isRightColumnShown, closeSymbolMenu]);\n\n useEffect(() => {\n if (isSelectModeActive) {\n disableHover();\n } else {\n setTimeout(() => {\n enableHover();\n }, SELECT_MODE_TRANSITION_MS);\n }\n }, [isSelectModeActive, enableHover, disableHover]);\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(resetComposer);\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 lang = useLang();\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 = 'Send message';\n switch (mainButtonState) {\n case MainButtonState.Edit:\n sendButtonAriaLabel = 'Save edited message';\n break;\n case MainButtonState.Record:\n sendButtonAriaLabel = areVoiceMessagesNotAllowed\n ? 'Posting media content is not allowed in this group.'\n : 'Record a voice message';\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 isSymbolMenuLoaded\n ? (isSymbolMenuOpen && 'menu-opened')\n : (isSymbolMenuOpen && 'is-loading'),\n );\n\n return (\n
\n {allowedAttachmentOptions.canAttachMedia && (\n \n \n \n )}\n \n \n \n \n {renderedEditedMessage && (\n \n )}\n \n
\n
\n \n \n
\n {IS_MOBILE_SCREEN ? (\n \n \n \n \n \n ) : (\n \n \n \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\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 canSuggestMembers: chat && isChatGroup(chat),\n isPollModalOpen: global.isPollModalOpen,\n stickersForEmoji: global.stickers.forEmoji.stickers,\n groupChatMembers: chat && chat.fullInfo && chat.fullInfo.members,\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 };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'sendMessage',\n 'editMessage',\n 'saveDraft',\n 'clearDraft',\n 'showError',\n 'setStickerSearchQuery',\n 'setGifSearchQuery',\n 'forwardMessages',\n 'openPollModal',\n 'closePollModal',\n 'closePaymentModal',\n 'clearReceipt',\n 'loadScheduledHistory',\n 'openChat',\n 'addRecentEmoji',\n ]),\n)(Composer));\n","import {\n useCallback, useEffect, useRef, useState,\n} from '../../../../lib/teact/teact';\n\nimport { IS_IOS } 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) {\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) {\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 (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]);\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 selection.removeAllRanges();\n selection.addRange(range);\n }\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 { MAIN_THREAD_ID } from '../../api/types';\nimport { GlobalActions, MessageListType } 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} from '../../config';\nimport { IS_MOBILE_SCREEN, IS_TOUCH_ENV, MASK_IMAGE_DISABLED } from '../../util/environment';\nimport { DropAreaState } from './composer/DropArea';\nimport {\n selectChat,\n selectCurrentMessageList,\n selectCurrentTextSearch,\n selectIsChatBotNotStarted,\n selectIsInSelectMode,\n selectIsRightColumnShown,\n selectPinnedIds,\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';\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 canPost?: boolean;\n messageSendingRestrictionReason?: string;\n hasPinnedOrAudioMessage?: boolean;\n pinnedMessagesCount?: number;\n theme: ThemeKey;\n customBackground?: string;\n backgroundColor?: string;\n patternColor?: string;\n isRightColumnShown?: boolean;\n isBackgroundBlurred?: boolean;\n isMobileSearchActive?: boolean;\n isSelectModeActive?: boolean;\n animationLevel?: number;\n};\n\ntype DispatchProps = Pick;\n\nconst CLOSE_ANIMATION_DURATION = IS_MOBILE_SCREEN ? 450 + ANIMATION_END_DELAY : undefined;\n\nfunction canBeQuicklyUploaded(item: DataTransferItem) {\n return item.kind === 'file' && item.type && CONTENT_TYPES_FOR_QUICK_UPLOAD.includes(item.type);\n}\n\nconst MiddleColumn: FC = ({\n chatId,\n threadId,\n messageListType,\n isPrivate,\n isPinnedMessageList,\n canPost,\n messageSendingRestrictionReason,\n hasPinnedOrAudioMessage,\n pinnedMessagesCount,\n customBackground,\n theme,\n backgroundColor,\n patternColor,\n isRightColumnShown,\n isBackgroundBlurred,\n isMobileSearchActive,\n isSelectModeActive,\n animationLevel,\n openChat,\n unpinAllMessages,\n loadUser,\n}) => {\n const { width: windowWidth } = useWindowSize();\n\n const [dropAreaState, setDropAreaState] = useState(DropAreaState.None);\n const [isFabShown, setIsFabShown] = useState();\n const [isNotchShown, setIsNotchShown] = useState();\n const [isUnpinModalOpen, setIsUnpinModalOpen] = useState(false);\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 (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).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 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 // 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 lang = useLang();\n\n const footerClassName = buildClassName(\n 'middle-column-footer',\n !renderingCanPost && 'no-composer',\n renderingCanPost && isNotchShown && !isSelectModeActive && 'with-notch',\n );\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_MOBILE_SCREEN && }\n \n )}\n {chatId && (\n \n )}\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { theme } = global.settings.byKey;\n const {\n isBlurred: isBackgroundBlurred, background: customBackground, backgroundColor, patternColor,\n } = global.settings.themes[theme] || {};\n\n const currentMessageList = selectCurrentMessageList(global);\n const { chats: { listIds } } = global;\n\n const state: StateProps = {\n theme,\n customBackground,\n backgroundColor,\n patternColor,\n isRightColumnShown: selectIsRightColumnShown(global),\n isBackgroundBlurred,\n isMobileSearchActive: Boolean(IS_MOBILE_SCREEN && selectCurrentTextSearch(global)),\n isSelectModeActive: selectIsInSelectMode(global),\n animationLevel: global.settings.byKey.animationLevel,\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\n return {\n ...state,\n chatId,\n threadId,\n messageListType,\n isPrivate: isChatPrivate(chatId),\n canPost: !isPinnedMessageList && (!chat || canPost) && (!isBotNotStarted || IS_MOBILE_SCREEN),\n isPinnedMessageList,\n messageSendingRestrictionReason: chat && getMessageSendingRestrictionReason(chat),\n hasPinnedOrAudioMessage: (\n threadId !== MAIN_THREAD_ID\n || Boolean(pinnedIds && pinnedIds.length)\n || Boolean(audioChatId && audioMessageId)\n ),\n pinnedMessagesCount: pinnedIds ? pinnedIds.length : 0,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'openChat', 'unpinAllMessages', 'loadUser',\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_MOBILE_SCREEN } 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 useFlag from '../../hooks/useFlag';\nimport useLang from '../../hooks/useLang';\n\nimport CalendarModal from '../common/CalendarModal.async';\nimport SearchInput from '../ui/SearchInput';\nimport Button from '../ui/Button';\nimport Transition from '../ui/Transition';\nimport './RightHeader.scss';\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 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}\n\nconst RightHeader: FC = ({\n isColumnOpen,\n isProfile,\n isSearch,\n isManagement,\n isStickerSearch,\n isGifSearch,\n isPollResults,\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 searchMessagesByDate,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const backButtonRef = useRef(null);\n\n const [isCalendarOpen, openCalendar, closeCalendar] = useFlag();\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 handleJumpToDate = useCallback((date: Date) => {\n searchMessagesByDate({ timestamp: date.valueOf() / 1000 });\n closeCalendar();\n }, [closeCalendar, searchMessagesByDate]);\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 ) : 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 \n \n \n \n );\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_MOBILE_SCREEN\n || contentKey === HeaderContent.SharedMedia\n || contentKey === HeaderContent.MemberList\n || isManagement\n );\n\n const buttonClassName = buildClassName(\n 'animated-close-icon',\n shouldSkipTransition && '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 {!IS_MOBILE_SCREEN && (\n \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 'searchMessagesByDate',\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) {\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);\n }, [groupChatMembers, 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} & Pick;\n\ntype DispatchProps = Pick;\n\nconst PrivateChatInfo: FC = ({\n user,\n chat,\n isSavedMessages,\n lastSyncTime,\n animationLevel,\n loadFullUser,\n openMediaViewer,\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(\n '.profile-slide-container > .active, .profile-slide-container > .to',\n );\n if (!element) {\n return undefined;\n }\n\n return captureEvents(element, {\n excludedClosestSelector: '.navigation',\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)}\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 } = global;\n const user = selectUser(global, userId);\n const chat = selectChat(global, userId);\n const isSavedMessages = !forceShowSelf && user && user.isSelf;\n const {\n animationLevel,\n } = global.settings.byKey;\n\n return {\n lastSyncTime, user, chat, isSavedMessages, animationLevel,\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 { selectChat, selectUser } from '../../modules/selectors';\nimport {\n getChatDescription, getChatLink, getHasAdminRight, isChatChannel, isChatPrivate, isUserRightBanned,\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 SafeLink from '../common/SafeLink';\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} & Pick;\n\ntype DispatchProps = Pick;\n\nconst ChatExtra: FC = ({\n lastSyncTime,\n user,\n chat,\n forceShowSelf,\n canInviteUsers,\n loadFullUser,\n showNotification,\n updateChatMutedState,\n}) => {\n const {\n id: userId,\n fullInfo,\n username,\n phoneNumber,\n isSelf,\n } = user || {};\n const {\n id: chatId,\n isMuted: currentIsMuted,\n username: chatUsername,\n } = 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: !currentIsMuted });\n }, [chatId, currentIsMuted, 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 url = link.indexOf('http') === 0 ? link : `http://${link}`;\n const printedUsername = username || chatUsername;\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 {printedUsername && (\n copy(`@${printedUsername}`, lang('Username'))}\n >\n {renderText(printedUsername)}\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 && !printedUsername && !!link.length && (\n copy(link, lang('SetUrlPlaceholder'))}>\n
\n \n
\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\n const canInviteUsers = chat && (\n (!isChatChannel(chat) && !isUserRightBanned(chat, 'inviteUsers'))\n || getHasAdminRight(chat, 'inviteUsers')\n );\n\n return {\n lastSyncTime, chat, user, canInviteUsers,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadFullUser', 'updateChatMutedState', 'showNotification',\n ]),\n)(ChatExtra));\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 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 isChatAdmin, isChatChannel, isChatGroup, isChatPrivate,\n} from '../../modules/helpers';\nimport {\n selectChatMessages,\n selectChat,\n selectCurrentMediaSearch,\n selectIsRightColumnShown,\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';\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 isChannel?: boolean;\n resolvedUserId?: number;\n chatMessages?: Record;\n foundIds?: number[];\n mediaSearchType?: SharedMediaType;\n hasMembersTab?: boolean;\n areMembersHidden?: boolean;\n members?: ApiChatMember[];\n usersById?: Record;\n isRightColumnShown: boolean;\n isRestricted?: boolean;\n lastSyncTime?: 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 isChannel,\n resolvedUserId,\n chatMessages,\n foundIds,\n mediaSearchType,\n hasMembersTab,\n areMembersHidden,\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}) => {\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\n const lang = useLang();\n\n const [activeTab, setActiveTab] = useState(0);\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,\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 // 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 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 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 >\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};\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\n let resolvedUserId;\n if (userId) {\n resolvedUserId = userId;\n } else if (isChatPrivate(chatId)) {\n resolvedUserId = chatId;\n }\n\n return {\n isChannel,\n resolvedUserId,\n chatMessages,\n foundIds,\n mediaSearchType,\n hasMembersTab,\n areMembersHidden,\n ...(hasMembersTab && members && {\n members,\n usersById,\n }),\n isRightColumnShown: selectIsRightColumnShown(global),\n isRestricted: chat && chat.isRestricted,\n lastSyncTime: global.lastSyncTime,\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 ]),\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, memo, useCallback, useEffect, useState,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport { ManagementScreens, ProfileState, RightColumnContent } 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';\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';\n\nimport './RightColumn.scss';\n\ntype StateProps = {\n contentKey?: RightColumnContent;\n chatId?: number;\n threadId?: number;\n currentProfileUserId?: number;\n isChatSelected: 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}) => {\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 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(() => {\n switch (contentKey) {\n case RightColumnContent.ChatInfo:\n if (isScrolledDown) {\n setProfileState(ProfileState.Profile);\n break;\n }\n toggleChatInfo();\n break;\n case RightColumnContent.UserInfo:\n if (isScrolledDown) {\n setProfileState(ProfileState.Profile);\n break;\n }\n openUserInfo({ id: undefined });\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 case RightColumnContent.GifSearch: {\n blurSearchInput();\n setStickerSearchQuery({ query: undefined });\n setGifSearchQuery({ query: undefined });\n break;\n }\n case RightColumnContent.PollResults:\n closePollResults();\n break;\n }\n }, [\n contentKey, isScrolledDown, toggleChatInfo, openUserInfo, closePollResults,\n managementScreen, toggleManagement, closeLocalTextSearch, setStickerSearchQuery, setGifSearchQuery,\n ]);\n\n const handleSelectChatMember = useCallback((memberId, isPromoted) => {\n setSelectedChatMemberId(memberId);\n setIsPromotedByCurrentUser(isPromoted);\n }, []);\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 // eslint-disable-next-line consistent-return\n function renderContent() {\n if (renderingContentKey === -1) {\n return undefined;\n }\n\n switch (renderingContentKey) {\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 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 };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'openUserInfo',\n 'toggleChatInfo',\n 'toggleManagement',\n 'closeLocalTextSearch',\n 'setStickerSearchQuery',\n 'setGifSearchQuery',\n 'closePollResults',\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 ErrorsAsync: FC = ({ isOpen }) => {\n const Errors = useModuleLoader(Bundles.Extra, 'Errors', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return Errors ? : undefined;\n};\n\nexport default memo(ErrorsAsync);\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, useEffect, memo } from '../../lib/teact/teact';\nimport { getGlobal, withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport { ApiMessage } from '../../api/types';\n\nimport '../../modules/actions/all';\nimport {\n ANIMATION_END_DELAY, 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 useShowTransition from '../../hooks/useShowTransition';\nimport useBackgroundMode from '../../hooks/useBackgroundMode';\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 Errors from './Errors.async';\nimport ForwardPicker from './ForwardPicker.async';\nimport SafeLinkModal from './SafeLinkModal.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 hasErrors: boolean;\n audioMessage?: ApiMessage;\n safeLinkModalUrl?: string;\n};\n\ntype DispatchProps = Pick;\n\nconst ANIMATION_DURATION = 350;\nconst NOTIFICATION_INTERVAL = 1000;\n\nlet rightColumnAnimationTimeout: number | undefined;\nlet notificationInterval: number | undefined;\n\nlet DEBUG_isLogged = false;\n\nconst Main: FC = ({\n lastSyncTime,\n loadAnimatedEmojis,\n isLeftColumnShown,\n isRightColumnShown,\n isMediaViewerOpen,\n isForwardModalOpen,\n animationLevel,\n hasNotifications,\n hasErrors,\n audioMessage,\n safeLinkModalUrl,\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 loadAnimatedEmojis();\n }\n }, [lastSyncTime, loadAnimatedEmojis]);\n\n const {\n transitionClassNames: middleColumnTransitionClassNames,\n } = useShowTransition(!isLeftColumnShown, undefined, true);\n\n const {\n transitionClassNames: rightColumnTransitionClassNames,\n } = useShowTransition(isRightColumnShown, undefined, true);\n\n const className = buildClassName(\n middleColumnTransitionClassNames.replace(/([\\w-]+)/g, 'middle-column-$1'),\n rightColumnTransitionClassNames.replace(/([\\w-]+)/g, 'right-column-$1'),\n );\n\n useEffect(() => {\n // For animating Symbol Menu on mobile\n document.body.classList.toggle('is-middle-column-open', className.includes('middle-column-open'));\n // For animating components in portals (i.e. Notification)\n document.body.classList.toggle('is-right-column-shown', className.includes('right-column-open'));\n }, [className]);\n\n // Add `body` classes when toggling right column\n useEffect(() => {\n if (animationLevel > 0) {\n document.body.classList.add('animating-right-column');\n dispatchHeavyAnimationEvent(ANIMATION_DURATION + ANIMATION_END_DELAY);\n\n if (rightColumnAnimationTimeout) {\n clearTimeout(rightColumnAnimationTimeout);\n rightColumnAnimationTimeout = undefined;\n }\n\n rightColumnAnimationTimeout = window.setTimeout(() => {\n document.body.classList.remove('animating-right-column');\n rightColumnAnimationTimeout = undefined;\n }, ANIMATION_DURATION + ANIMATION_END_DELAY);\n }\n }, [animationLevel, isRightColumnShown]);\n\n useBackgroundMode(() => {\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 document.title = `${newUnread} notification${newUnread > 1 ? 's' : ''}`;\n updateIcon(true);\n }\n } else {\n document.title = PAGE_TITLE;\n updateIcon(false);\n }\n\n index++;\n }, NOTIFICATION_INTERVAL);\n }, () => {\n clearInterval(notificationInterval);\n notificationInterval = undefined;\n\n if (!document.title.includes(INACTIVE_MARKER)) {\n document.title = PAGE_TITLE;\n }\n\n updateIcon(false);\n });\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\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\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 hasErrors: Boolean(global.errors.length),\n audioMessage,\n safeLinkModalUrl: global.safeLinkModalUrl,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['loadAnimatedEmojis']),\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.1497ddf176dcb8025364.css b/dist/5.1497ddf176dcb8025364.css deleted file mode 100644 index 44dea25f9..000000000 --- a/dist/5.1497ddf176dcb8025364.css +++ /dev/null @@ -1 +0,0 @@ -#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) 50%}.Modal{position:relative;z-index:var(--z-modal)}.Modal.confirm .modal-dialog,.Modal.delete .modal-dialog,.Modal.error .modal-dialog,.Modal.pin .modal-dialog,.Modal.unpin-all .modal-dialog{max-width:23rem}.Modal.narrow .modal-dialog{max-width:20rem}.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,.25)}.Modal.transparent-backdrop .modal-backdrop{background-color:initial}.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 .25rem .5rem .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:translateZ(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;text-align:left;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:.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 .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}.CropModal .modal-dialog{width:calc(100% - 2rem);max-width:35rem;height:calc(100% - 1rem);max-height:35rem;position:relative}.CropModal #avatar-crop,.CropModal .modal-content{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 hsla(0,0%,100%,.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)}.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:#fff;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:after,.Transition>div:not(.active) .AvatarEditable label i,.Transition>div:not(.active) .AvatarEditable label input,body.animating-right-column .AvatarEditable label:after,body.animating-right-column .AvatarEditable label i,body.animating-right-column .AvatarEditable label input{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,.4)}.AvatarEditable label.disabled{pointer-events:none}.AvatarEditable label.disabled:after,.AvatarEditable label.disabled i{display:none} \ No newline at end of file diff --git a/dist/5.1497ddf176dcb8025364.js b/dist/5.1497ddf176dcb8025364.js deleted file mode 100644 index 7473b9c30..000000000 --- a/dist/5.1497ddf176dcb8025364.js +++ /dev/null @@ -1,2 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[5],{104:function(e,t,n){"use strict";var r=n(0),a=n(51);var o=n(8),c=n(45),i=n(32),l=n(54),u=n(99),s=n(29),f=n(117);n(145);t.a=e=>{const{title:t,className:n,isOpen:d,header:m,hasCloseButton:h,noBackdrop:b,children:p,onClose:v,onCloseAnimationEnd:g,onEnter:E}=e,{shouldRender:j,transitionClassNames:O}=Object(i.a)(d,g),y=Object(r.q)(null);Object(r.n)(()=>d?Object(a.a)({onEsc:v,onEnter:E}):void 0,[d,v,E]),Object(r.n)(()=>d&&y.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 r=n.findIndex(e=>e.isSameNode(document.activeElement));let a=0;r>=0&&(a=t.shiftKey?r>0?r-1:n.length-1:r{document.removeEventListener("keydown",t,!1)}}(y.current):void 0,[d]),Object(l.a)(([e])=>(document.body.classList.toggle("has-open-dialog",d),(d||!d&&void 0!==e)&&Object(c.b)(200),()=>{document.body.classList.remove("has-open-dialog")}),[d]);const w=Object(u.a)();if(!j)return;const N=Object(o.a)("Modal",n,O,b&&"transparent-backdrop");return r.a.createElement(f.a,null,r.a.createElement("div",{ref:y,className:N,tabIndex:-1,role:"dialog"},r.a.createElement("div",{className:"modal-container"},r.a.createElement("div",{className:"modal-backdrop",onClick:v}),r.a.createElement("div",{className:"modal-dialog"},m||(t?r.a.createElement("div",{className:"modal-header"},h&&r.a.createElement(s.a,{round:!0,color:"translucent",size:"smaller",ariaLabel:w("Close"),onClick:v},r.a.createElement("i",{className:"icon-close"})),r.a.createElement("div",{className:"modal-title"},t)):void 0),r.a.createElement("div",{className:"modal-content custom-scroll"},p)))))}},108:function(e,t,n){"use strict";var r=n(41);t.a=(e,t)=>{const n=Object(r.a)(t);n&&!t.some((e,t)=>e!==n[t])||e(n||[])}},111:function(e,t,n){"use strict";var r=n(0),a=n(9),o=n(8),c=n(45),i=n(126);let l,u;async function s(){return l||(l=n.e(7).then(n.bind(null,187)),u=(await l).default),l}setTimeout(s,5e3);t.a=Object(r.h)(({className:e,id:t,animationData:n,play:l,playSegment:f,speed:d,noLoop:m,size:h,quality:b,isLowPriority:p,onLoad:v})=>{const[g,E]=Object(r.r)(),j=Object(r.q)(null),O=Object(r.q)(!1),y=Object(r.q)(!1),w=Object(r.q)();w.current=l;const N=Object(r.q)();N.current=f,Object(r.n)(()=>{if(g||!n)return;const e=()=>{if(!j.current)return;const e=new u(t,j.current,n,{noLoop:m,size:h,quality:b,isLowPriority:p},v);d&&e.setSpeed(d),E(e)};u?e():s().then(()=>{Object(a.b)(()=>{j.current&&e()})})},[g,n,t,p,m,v,b,h,d]),Object(r.n)(()=>()=>{g&&g.destroy()},[g]);const k=Object(r.m)((e=!1)=>{g&&(w.current||N.current)&&(N.current?g.playSegment(N.current):e?g.goToAndPlay(0):g.play())},[g]),C=Object(r.m)(()=>{g&&g.pause()},[g]),L=Object(r.m)(()=>{y.current=!0,g&&(O.current||(O.current=g.isPlaying()),C())},[g,C]),A=Object(r.m)(()=>{O.current&&k(),O.current=!1,y.current=!1},[k]),M=Object(r.m)(()=>{Object(a.b)(A)},[A]);Object(r.n)(()=>{g&&(l||f?y.current?O.current=!0:k(m):y.current?O.current=!1:C())},[g,l,f,m,k,C]),Object(c.a)(L,A),Object(i.a)(L,M);const P=Object(o.a)("AnimatedSticker",e),T=h?`width: ${h}px; height: ${h}px;`:void 0;return r.a.createElement("div",{ref:j,className:P,style:T})})},117:function(e,t,n){"use strict";var r=n(0),a=n(61);t.a=({containerId:e,className:t,children:n})=>{const o=Object(r.q)(document.createElement("div"));return Object(r.o)(()=>{const n=document.querySelector(e||"#portals");if(!n)return;const r=o.current;return t&&r.classList.add(t),n.appendChild(r),()=>{a.a.render(void 0,r),n.removeChild(r)}},[t,e]),a.a.render(n,o.current)}},120:function(e,t,n){"use strict";n.d(t,"a",(function(){return c}));var r=n(5),a=n(50);const o={MonkeyIdle:n.p+"TwoFactorSetupMonkeyIdle.dea4a492c144df84ddab778dc8a3f0cd.tgs",MonkeyTracking:n.p+"TwoFactorSetupMonkeyTracking.eb5a7a6f166fb7589c12e6248561fb58.tgs",MonkeyClose:n.p+"TwoFactorSetupMonkeyClose.604c4c833d322b7e6c3ea19bef058241.tgs",MonkeyPeek:n.p+"TwoFactorSetupMonkeyPeek.1905436b042520363d7e59f5d7f903ab.tgs",FoldersAll:n.p+"FoldersAll.3f9f9e243d19f0fbf9aaaff11cbd4572.tgs",FoldersNew:n.p+"FoldersNew.9a40d71c0c8be70f5bd14ff2d7bc1593.tgs",DiscussionGroups:n.p+"DiscussionGroupsDucks.9ea453d1be9d1b0ee77a992f8e587485.tgs"};function c(e){const t=o[e].replace(window.location.origin,"");return a.b("file"+t,r.ApiMediaFormat.Lottie)}},125:function(e,t,n){"use strict";var r=n(0),a=n(8),o=n(1),c=n(13),i=n(99),l=n(29),u=n(104),s=n(15);n(146);const f={type:"blob",quality:.8,format:"jpeg",circle:!1};let d,m,h;var b=Object(r.h)(({file:e,onChange:t,onClose:a})=>{const[b,p]=Object(r.r)(!1);Object(r.n)(()=>{e&&(b?async function(e){try{const t=document.getElementById("avatar-crop");if(!t)return;const{offsetWidth:n,offsetHeight:r}=t;h=new d(t,{enableZoom:!0,boundary:{width:n,height:r},viewport:{width:n-16,height:r-16,type:"circle"}});const a=await Object(c.a)(e);await h.bind({url:a})}catch(e){o.p&&console.error(e)}}(e):async function(){return m||(m=Promise.all([n.e(6),n.e(8)]).then(n.bind(null,312)),d=(await m).default),m}().then(()=>p(!0)))},[e,b]);const v=Object(i.a)();return r.a.createElement(u.a,{isOpen:Boolean(e),onClose:a,title:"Drag to reposition",className:"CropModal",hasCloseButton:!0},b?r.a.createElement("div",{id:"avatar-crop"}):r.a.createElement(s.a,null),r.a.createElement(l.a,{className:"confirm-button",round:!0,color:"primary",onClick:async function(){if(!h)return;const e=await h.result(f),n="string"==typeof e?e:Object(c.b)(e,"avatar.jpg");t(n)},ariaLabel:v("CropImage")},r.a.createElement("i",{className:"icon-check"})))});n(147);t.a=Object(r.h)(({title:e="Change your profile picture",disabled:t,currentAvatarBlobUrl:n,onChange:o})=>{const[c,i]=Object(r.r)(),[l,u]=Object(r.r)(n);Object(r.n)(()=>{u(n)},[n]);const s=Object(a.a)(l&&"filled",t&&"disabled");return r.a.createElement("div",{className:"AvatarEditable"},r.a.createElement("label",{className:s,role:"button",tabIndex:0,title:e},r.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"}),r.a.createElement("i",{className:"icon-camera-add"}),l&&r.a.createElement("img",{src:l,alt:"Avatar"})),r.a.createElement(b,{file:c,onClose:function(){i(void 0)},onChange:function(e){i(void 0),o(e),l&&URL.revokeObjectURL(l),u(URL.createObjectURL(e))}}))})},126:function(e,t,n){"use strict";var r=n(0);t.a=(e,t)=>{Object(r.n)(()=>(document.hasFocus()||e(),window.addEventListener("blur",e),window.addEventListener("focus",t),()=>{window.removeEventListener("focus",t),window.removeEventListener("blur",e)}),[e,t])}},135:function(e,t,n){},143:function(e,t,n){"use strict";var r=n(0),a=n(1),o=n(7),c=n(120),i=n(111);n(135);const l=[0,50],u=[0,20],s=[20,0],f=o.g?a.rb:a.qb;t.a=Object(r.h)(({isPasswordVisible:e,isBig:t})=>{const[n,o]=Object(r.r)(),[d,m]=Object(r.r)(),[h,b]=Object(r.r)(!1),[p,v]=Object(r.r)(!1);Object(r.n)(()=>{n?setTimeout(()=>v(!0),2e3):Object(c.a)("MonkeyClose").then(o)},[n]),Object(r.n)(()=>{d||Object(c.a)("MonkeyPeek").then(m)},[d]);const g=Object(r.m)(()=>b(!0),[]);return r.a.createElement("div",{id:"monkey",className:t?"big":""},!h&&r.a.createElement("div",{className:"monkey-preview"}),n&&r.a.createElement(i.a,{id:"closeMonkey",size:t?a.Bb:f,className:p?"hidden":"shown",animationData:n,playSegment:l,noLoop:!0,onLoad:g}),d&&r.a.createElement(i.a,{id:"peekMonkey",size:t?a.Bb:f,className:p?"shown":"hidden",animationData:d,playSegment:e?u:s,noLoop:!0}))})},144:function(e,t,n){"use strict";var r=n(0),a=n(1),o=n(7),c=n(8),i=n(29);const l=o.g?550:400;t.a=Object(r.h)(({isLoading:e=!1,isPasswordVisible:t,error:n,hint:u,placeholder:s="Password",submitLabel:f="Next",clearError:d,onChangePasswordVisibility:m,onInputChange:h,onSubmit:b})=>{const p=Object(r.q)(null),[v,g]=Object(r.r)(""),[E,j]=Object(r.r)(!1);return Object(r.n)(()=>{o.l||setTimeout(()=>{p.current.focus()},l)},[]),Object(r.n)(()=>{n&&requestAnimationFrame(()=>{p.current.focus(),p.current.select()})},[n]),r.a.createElement("form",{action:"",onSubmit:function(t){t.preventDefault(),e||E&&b(v)},autoComplete:"off"},r.a.createElement("div",{className:Object(c.a)("input-group password-input",v&&"touched",n&&"error")},r.a.createElement("input",{ref:p,className:"form-control",type:t?"text":"password",id:"sign-in-password",value:v||"",autoComplete:"current-password",onChange:function(e){n&&d();const{target:t}=e;g(t.value),j(t.value.length>=a.Z),h&&h(t.value)}}),r.a.createElement("label",null,n||u||s),r.a.createElement("div",{className:"toggle-password",onClick:function(){m(!t)},role:"button",tabIndex:0,title:"Toggle password visibility"},r.a.createElement("i",{className:t?"icon-eye":"icon-eye-closed"}))),E&&r.a.createElement(i.a,{type:"submit",ripple:!0,isLoading:e},f))})},145:function(e,t,n){},146:function(e,t,n){},147:function(e,t,n){},98:function(e,t,n){"use strict";n.r(t),n.d(t,"AuthCode",(function(){return b})),n.d(t,"AuthPassword",(function(){return g})),n.d(t,"AuthRegister",(function(){return O})),n.d(t,"AuthQrCode",(function(){return C}));var r=n(0),a=n(2),o=n(7),c=n(3),i=n(42),l=n(15),u=n(1),s=n(120),f=n(111);n(135);const d=o.g?u.rb:u.qb;var m=Object(r.h)(({code:e,codeLength:t,trackingDirection:n,isTracking:a,isBig:o})=>{const[c,i]=Object(r.r)(),[l,m]=Object(r.r)(),[h,b]=Object(r.r)(!1),p=165/t;Object(r.n)(()=>{c||Object(s.a)("MonkeyIdle").then(i)},[c]),Object(r.n)(()=>{l||Object(s.a)("MonkeyTracking").then(m)},[l]);const v=Object(r.m)(()=>b(!0),[]);return r.a.createElement("div",{id:"monkey",className:o?"big":""},!h&&r.a.createElement("div",{className:"monkey-preview"}),c&&r.a.createElement(f.a,{id:"idleMonkey",size:o?u.Bb:d,className:a?"hidden":void 0,animationData:c,play:!a,onLoad:v}),l&&r.a.createElement(f.a,{id:"trackingMonkey",size:o?u.Bb:d,className:a?"shown":"hidden",animationData:l,playSegment:a?function(){const r=e&&e.length>1||n<0?15+p*(e.length-1):0,a=e.length===t?180:15+p*e.length;return n<1?[a,r]:[r,a]}():void 0,speed:2,noLoop:!0}))});function h(e){function t(){e()}return window.addEventListener("popstate",t),window.history.pushState({},""),()=>{window.removeEventListener("popstate",t),window.history.back()}}var b=Object(r.h)(Object(a.h)(e=>Object(c.l)(e,["authPhoneNumber","authIsCodeViaApp","authIsLoading","authError"]),(e,t)=>Object(c.l)(t,["setAuthCode","returnToAuthPhoneNumber","clearAuthError"]))(({authPhoneNumber:e,authIsCodeViaApp:t,authIsLoading:n,authError:a,setAuthCode:c,returnToAuthPhoneNumber:u,clearAuthError:s})=>{const f=Object(r.q)(null),[d,b]=Object(r.r)(""),[p,v]=Object(r.r)(!1),[g,E]=Object(r.r)(1);Object(r.n)(()=>{o.l||f.current.focus()},[]),h(u);const j=Object(r.m)(e=>{a&&s();const{currentTarget:t}=e;t.value=t.value.replace(/[^\d]+/,"").substr(0,5),t.value!==d&&(b(t.value),p?t.value.length||v(!1):v(!0),d&&d.length>t.value.length?E(-1):E(1),5===t.value.length&&c({code:t.value}))},[a,s,d,p,c]);return r.a.createElement("div",{id:"auth-code-form",className:"custom-scroll"},r.a.createElement("div",{className:"auth-form"},r.a.createElement(m,{code:d,codeLength:5,isTracking:p,trackingDirection:g}),r.a.createElement("h2",null,e,r.a.createElement("div",{className:"auth-number-edit",onClick:u,role:"button",tabIndex:0,title:"Sign In with another phone number"},r.a.createElement("i",{className:"icon-edit"}))),r.a.createElement("p",{className:"note"},t?r.a.createElement(r.a.Fragment,null,"We have sent the code to the Telegram app",r.a.createElement("br",null),"on your other device."):r.a.createElement(r.a.Fragment,null,"We have sent you an SMS",r.a.createElement("br",null),"with the code.")),r.a.createElement(i.a,{ref:f,id:"sign-in-code",label:"Code",onInput:j,value:d,error:a,autoComplete:"off",inputMode:"decimal"}),n&&r.a.createElement(l.a,null)))})),p=n(143),v=n(144);var g=Object(r.h)(Object(a.h)(e=>Object(c.l)(e,["authIsLoading","authError","authHint"]),(e,t)=>Object(c.l)(t,["setAuthPassword","clearAuthError"]))(({authIsLoading:e,authError:t,authHint:n,setAuthPassword:a,clearAuthError:o})=>{const[c,i]=Object(r.r)(!1),l=Object(r.m)(e=>{i(e)},[]),u=Object(r.m)(e=>{a({password:e})},[a]);return r.a.createElement("div",{id:"auth-password-form",className:"custom-scroll"},r.a.createElement("div",{className:"auth-form"},r.a.createElement(p.a,{isPasswordVisible:c}),r.a.createElement("h2",null,"Enter Your Password"),r.a.createElement("p",{className:"note"},"Your account is protected with",r.a.createElement("br",null),"an additional password."),r.a.createElement(v.a,{clearError:o,error:t,hint:n,isLoading:e,isPasswordVisible:c,onChangePasswordVisibility:l,onSubmit:u})))})),E=n(29),j=n(125);var O=Object(r.h)(Object(a.h)(e=>Object(c.l)(e,["authIsLoading","authError"]),(e,t)=>Object(c.l)(t,["signUp","clearAuthError","uploadProfilePhoto"]))(({authIsLoading:e,authError:t,signUp:n,clearAuthError:a,uploadProfilePhoto:o})=>{const[c,l]=Object(r.r)(!1),[u,s]=Object(r.r)(),[f,d]=Object(r.r)(""),[m,h]=Object(r.r)("");return r.a.createElement("div",{id:"auth-registration-form",className:"custom-scroll"},r.a.createElement("div",{className:"auth-form"},r.a.createElement("form",{action:"",method:"post",onSubmit:function(e){e.preventDefault(),n({firstName:f,lastName:m}),u&&o({file:u})}},r.a.createElement(j.a,{onChange:s}),r.a.createElement("h2",null,"Your Name"),r.a.createElement("p",{className:"note"},"Enter your name and add",r.a.createElement("br",null),"a profile picture."),r.a.createElement(i.a,{id:"registration-first-name",label:"Name",onChange:function(e){t&&a();const{target:n}=e;d(n.value),l(n.value.length>0)},value:f,error:t,autoComplete:"given-name"}),r.a.createElement(i.a,{id:"registration-last-name",label:"Last Name (optional)",onChange:function(e){const{target:t}=e;h(t.value)},value:m,autoComplete:"family-name"}),c&&r.a.createElement(E.a,{type:"submit",ripple:!0,isLoading:e},"Start Messaging"))))}));let y=null;class w{}w.render=function(e,t){y(e,t)},self.QrCreator=w,function(e){function t(t,n,r,a){var o={},c=e(r,n);c.u(t),c.J(),a=a||0;var i=c.h(),l=c.h()+2*a;return o.text=t,o.level=n,o.version=r,o.O=l,o.a=function(e,t){return t-=a,!(0>(e-=a)||e>=i||0>t||t>=i)&&c.a(e,t)},o}function n(e,t,n,r,a,o,c,i,l,u){function s(t,n,r,a,c,i,l){t?(e.lineTo(n+i,r+l),e.arcTo(n,r,a,c,o)):e.lineTo(n,r)}c?e.moveTo(t+o,n):e.moveTo(t,n),s(i,r,n,r,a,-o,0),s(l,r,a,t,a,0,-o),s(u,t,a,t,n,o,0),s(c,t,n,r,n,0,o)}function r(e,t,n,r,a,o,c,i,l,u){function s(t,n,r,a){e.moveTo(t+r,n),e.lineTo(t,n),e.lineTo(t,n+a),e.arcTo(t,n,t+r,n,o)}c&&s(t,n,o,o),i&&s(r,n,-o,o),l&&s(r,a,-o,-o),u&&s(t,a,o,-o)}function a(e,a){e:{var o=a.text,c=a.v,i=a.N,l=a.K,u=a.P;for(i=Math.max(1,i||1),l=Math.min(40,l||40);i<=l;i+=1)try{var s=t(o,c,i,u);break e}catch(e){}s=void 0}if(!s)return null;for(o=e.getContext("2d"),a.background&&(o.fillStyle=a.background,o.fillRect(a.left,a.top,a.size,a.size)),c=s.O,l=a.size/c,o.beginPath(),u=0;uMath.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)}a.forEach(([e,t])=>{o.addColorStop(e,t)}),e.fillStyle=o}}(o,a),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};y=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),a(t,n)):((e=document.createElement("canvas")).width=n.size,e.height=n.size,n=a(e,n),t.appendChild(n))}}(function(){function e(a,c){function i(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 l(e,n){for(var c=f=4*a+17,l=Array(c),h=0;h=v;v+=1)for(var g=-2;2>=g;g+=1)s[b+v][p+g]=-2==v||2==v||-2==g||2==g||0==v&&0==g}for(c=8;cl;l+=1)h=!e&&1==(c>>l&1),s[6>l?l:8>l?l+1:f-15+l][8]=h,s[8][8>l?f-l-1:9>l?15-l:14-l]=h;if(s[f-8][8]=!e,7<=a){for(c=r.A(a),l=0;18>l;l+=1)h=!e&&1==(c>>l&1),s[Math.floor(l/3)][l%3+f-8-3]=h;for(l=0;18>l;l+=1)h=!e&&1==(c>>l&1),s[l%3+f-8-3][Math.floor(l/3)]=h}if(null==d){for(e=o.I(a,u),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}(),l=0;l8*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 E=0;for(h=l=0,b=Array(e.length),p=Array(e.length),v=0;vv;v+=1)null==s[l][p-v]&&(g=!1,b>>h&1)),n(l,p-v)&&(g=!g),s[l][p-v]=g,-1==--h&&(b+=1,h=7));if(0>(l+=c)||f<=l){l-=c,c=-c;break}}}var u=n[c],s=null,f=0,d=null,m=[],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){l(!0,n);var a=r.D(h);(0==n||e>a)&&(e=a,t=n)}l(!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=a.g(o.c(0))-a.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=i;i+=1)if(!(0>r+i||t<=r+i))for(var l=-1;1>=l;l+=1)0>a+l||t<=a+l||(0!=i||0!=l)&&c==e.a(r+i,a+l)&&(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 a=0;aObject(c.l)(e,["connectionState","authQrCode"]),(e,t)=>Object(c.l)(t,["returnToAuthPhoneNumber"]))(({connectionState:e,authQrCode:t,returnToAuthPhoneNumber:n})=>{const a=Object(r.q)(null);return Object(r.n)(()=>{if(!t||"connectionStateReady"!==e)return;const n=a.current;n.innerHTML="",n.classList.remove("pre-animate"),N.render({text:"tg://login?token="+t.token,radius:.5,ecLevel:"M",fill:"#4E96D4",size:280},n)},[e,t]),h(n),r.a.createElement("div",{id:"auth-qr-form",className:"custom-scroll"},r.a.createElement("div",{className:"auth-form"},r.a.createElement("div",{className:Object(k.a)("qr-container",t&&"pre-animate"),ref:a},!t&&r.a.createElement(l.a,null)),r.a.createElement("h3",null," Log in to Telegram by QR Code"),r.a.createElement("ol",null,r.a.createElement("li",null,r.a.createElement("span",null,"Open Telegram on your phone")),r.a.createElement("li",null,r.a.createElement("span",null,"Go to ",r.a.createElement("b",null,"Settings")," > ",r.a.createElement("b",null,"Devices")," > ",r.a.createElement("b",null,"Scan QR"))),r.a.createElement("li",null,r.a.createElement("span",null,"Point your phone at this screen to confirm login"))),r.a.createElement(E.a,{isText:!0,onClick:n},"Log in by phone number")))}))},99:function(e,t,n){"use strict";var r=n(18),a=n(35),o=n(108);t.a=()=>{const e=Object(a.a)();return Object(o.a)(()=>r.a(e),[e]),r.b}}}]); -//# sourceMappingURL=5.1497ddf176dcb8025364.js.map \ No newline at end of file diff --git a/dist/5.1497ddf176dcb8025364.js.map b/dist/5.1497ddf176dcb8025364.js.map deleted file mode 100644 index 70f3cb5ac..000000000 --- a/dist/5.1497ddf176dcb8025364.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack:///./src/components/ui/Modal.tsx","webpack:///./src/util/trapFocus.ts","webpack:///./src/hooks/useOnChange.ts","webpack:///./src/components/common/AnimatedSticker.tsx","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/hooks/useBackgroundMode.ts","webpack:///./src/components/common/PasswordMonkey.tsx","webpack:///./src/components/common/PasswordForm.tsx","webpack:///./src/components/common/TrackingMonkey.tsx","webpack:///./src/hooks/useHistoryBack.ts","webpack:///./src/components/auth/AuthCode.tsx","webpack:///./src/components/auth/AuthPassword.tsx","webpack:///./src/components/auth/AuthRegister.tsx","webpack:///./node_modules/qr-creator/dist/qr-creator.es6.min.js","webpack:///./src/components/auth/AuthQrCode.tsx","webpack:///./src/hooks/useLang.ts"],"names":["Modal","props","title","className","isOpen","header","hasCloseButton","noBackdrop","children","onClose","onCloseAnimationEnd","onEnter","shouldRender","transitionClassNames","useShowTransition","modalRef","useRef","useEffect","captureKeyboardListeners","onEsc","undefined","current","element","handleKeyDown","e","key","preventDefault","stopPropagation","focusableElements","Array","from","querySelectorAll","length","currentFocusedIndex","findIndex","em","isSameNode","document","activeElement","newFocusedIndex","shiftKey","focus","addEventListener","removeEventListener","trapFocus","useEffectWithPrevDeps","prevIsOpen","body","classList","toggle","dispatchHeavyAnimationEvent","remove","lang","useLang","fullClassName","buildClassName","Portal","ref","tabIndex","role","onClick","Button","round","color","size","ariaLabel","cb","dependencies","prevDeps","usePrevious","some","d","i","lottiePromise","RLottie","async","ensureLottie","default","setTimeout","memo","id","animationData","play","playSegment","speed","noLoop","quality","isLowPriority","onLoad","animation","setAnimation","useState","container","wasPlaying","isFrozen","playRef","playSegmentRef","exec","newAnimation","setSpeed","then","fastRaf","destroy","playAnimation","useCallback","shouldRestart","goToAndPlay","pauseAnimation","pause","freezeAnimation","isPlaying","unfreezeAnimation","unfreezeAnimationOnRaf","useHeavyAnimationCheck","useBackgroundMode","style","containerId","elementRef","createElement","useLayoutEffect","querySelector","add","appendChild","TeactDOM","render","removeChild","ANIMATED_STICKERS_PATHS","MonkeyIdle","MonkeyTracking","MonkeyClose","MonkeyPeek","FoldersAll","FoldersNew","DiscussionGroups","getAnimationData","name","path","replace","window","location","origin","mediaLoader","ApiMediaFormat","Lottie","cropperResultOptions","type","format","circle","Croppie","croppiePromise","cropper","file","onChange","isCroppieReady","setIsCroppieReady","imgFile","cropContainer","getElementById","offsetWidth","offsetHeight","enableZoom","boundary","width","height","viewport","dataUri","blobToDataUri","bind","url","err","DEBUG","console","error","initCropper","ensureCroppie","Boolean","Loading","result","croppedImg","blobToFile","disabled","currentAvatarBlobUrl","selectedFile","setSelectedFile","croppedBlobUrl","setCroppedBlobUrl","labelClassName","event","target","files","value","accept","src","alt","URL","revokeObjectURL","createObjectURL","onBlur","onFocus","hasFocus","SEGMENT_COVER_EYES","SEGMENT_UNCOVER_EYE","SEGMENT_COVER_EYE","STICKER_SIZE","IS_MOBILE_SCREEN","STICKER_SIZE_AUTH_MOBILE","STICKER_SIZE_AUTH","isPasswordVisible","isBig","closeMonkeyData","setCloseMonkeyData","peekMonkeyData","setPeekMonkeyData","isFirstMonkeyLoaded","setIsFirstMonkeyLoaded","isPeekShown","setIsPeekShown","handleFirstMonkeyLoad","STICKER_SIZE_TWO_FA","FOCUS_DELAY_TIMEOUT_MS","isLoading","hint","placeholder","submitLabel","clearError","onChangePasswordVisibility","onInputChange","onSubmit","inputRef","password","setPassword","canSubmit","setCanSubmit","IS_TOUCH_ENV","requestAnimationFrame","select","action","autoComplete","MIN_PASSWORD_LENGTH","ripple","code","codeLength","trackingDirection","isTracking","idleMonkeyData","setIdleMonkeyData","trackingMonkeyData","setTrackingMonkeyData","TRACKING_FRAMES_PER_SYMBOL","AnimatedSticker","startFrame","endFrame","getTrackingFrames","useHistoryBack","handler","handlePopState","history","pushState","back","withGlobal","global","pick","setGlobal","actions","authPhoneNumber","authIsCodeViaApp","authIsLoading","authError","setAuthCode","returnToAuthPhoneNumber","clearAuthError","setCode","setIsTracking","setTrackingDirection","onCodeChange","currentTarget","substr","InputText","label","onInput","inputMode","authHint","setAuthPassword","showPassword","setShowPassword","handleChangePasswordVisibility","isVisible","handleSubmit","PasswordForm","signUp","uploadProfilePhoto","isButtonShown","setIsButtonShown","croppedFile","setCroppedFile","firstName","setFirstName","lastName","setLastName","method","AvatarEditable","G","H","w","B","self","QrCreator","t","c","a","b","h","u","J","r","text","level","version","O","C","g","x","f","lineTo","arcTo","moveTo","z","y","v","N","K","P","Math","max","min","getContext","background","fillStyle","fillRect","left","top","beginPath","p","q","k","m","D","E","n","l","floor","R","I","F","fill","colorStops","position","map","createLinearGradient","apply","Error","createRadialGradient","forEach","addColorStop","A","minVersion","maxVersion","ecLevel","radius","quiet","Object","assign","HTMLCanvasElement","clearRect","put","push","write","j","o","s","S","multiply","charCodeAt","L","M","Q","abs","connectionState","authQrCode","qrCodeRef","innerHTML","token","isText","forceUpdate","useForceUpdate","useOnChange","langProvider"],"mappings":"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AC,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,GAAG,GAAG,GAAG,GAA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","file":"5.1497ddf176dcb8025364.js","sourcesContent":["import React, { FC, useEffect, useRef } from '../../lib/teact/teact';\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';\n\nimport Button from './Button';\nimport Portal from './Portal';\n\nimport './Modal.scss';\n\nconst ANIMATION_DURATION = 200;\n\ntype OwnProps = {\n title?: string;\n className?: string;\n isOpen?: boolean;\n header?: FC;\n hasCloseButton?: boolean;\n noBackdrop?: boolean;\n children: any;\n onClose: () => void;\n onCloseAnimationEnd?: () => void;\n onEnter?: () => void;\n};\n\nconst Modal: FC = (props) => {\n const {\n title,\n className,\n isOpen,\n header,\n hasCloseButton,\n noBackdrop,\n children,\n onClose,\n onCloseAnimationEnd,\n onEnter,\n } = props;\n const { shouldRender, transitionClassNames } = useShowTransition(isOpen, onCloseAnimationEnd);\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 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 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","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 { 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 { useEffect } from '../lib/teact/teact';\n\nexport default (\n onBlur: AnyToVoidFunction,\n onFocus: AnyToVoidFunction,\n) => {\n useEffect(() => {\n if (!document.hasFocus()) {\n onBlur();\n }\n\n window.addEventListener('blur', onBlur);\n window.addEventListener('focus', onFocus);\n\n return () => {\n window.removeEventListener('focus', onFocus);\n window.removeEventListener('blur', onBlur);\n };\n }, [onBlur, onFocus]);\n};\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_MOBILE_SCREEN } 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_MOBILE_SCREEN ? 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_MOBILE_SCREEN } from '../../util/environment';\nimport buildClassName from '../../util/buildClassName';\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_MOBILE_SCREEN ? 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\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","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_MOBILE_SCREEN } 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_MOBILE_SCREEN ? 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","// This is unsafe and can be not chained as `popstate` event is asynchronous\n\nexport default function useHistoryBack(handler: NoneToVoidFunction) {\n function handlePopState() {\n handler();\n }\n\n window.addEventListener('popstate', handlePopState);\n window.history.pushState({}, '');\n\n return () => {\n window.removeEventListener('popstate', handlePopState);\n window.history.back();\n };\n}\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';\n\nimport InputText from '../ui/InputText';\nimport Loading from '../ui/Loading';\nimport TrackingMonkey from '../common/TrackingMonkey';\nimport useHistoryBack from '../../hooks/useHistoryBack';\n\ntype StateProps = Pick;\ntype DispatchProps = Pick;\n\nconst CODE_LENGTH = 5;\n\nconst AuthCode: FC = ({\n authPhoneNumber, authIsCodeViaApp, authIsLoading, authError, setAuthCode, returnToAuthPhoneNumber, clearAuthError,\n}) => {\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(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 {authIsCodeViaApp ? (\n <>\n We have sent the code to the Telegram app\n
on your other device.\n \n ) : (\n <>\n We have sent you an SMS\n
with the code.\n \n )}\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, ['setAuthCode', 'returnToAuthPhoneNumber', 'clearAuthError']),\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';\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 [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

Enter Your Password

\n

\n Your account is protected with\n
an additional password.\n

\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';\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 [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

Your Name

\n

\n Enter your name and add\n
a profile picture.\n

\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","/*\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;\ntype DispatchProps = Pick;\n\nconst DATA_PREFIX = 'tg://login?token=';\n\nconst AuthCode: FC = ({\n connectionState, authQrCode, returnToAuthPhoneNumber,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const qrCodeRef = useRef(null);\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 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 useHistoryBack(returnToAuthPhoneNumber);\n\n return (\n
\n
\n
\n {!authQrCode && }\n
\n

Log in to Telegram by QR Code

\n
    \n
  1. Open Telegram on your phone
  2. \n
  3. Go to Settings > Devices > Scan QR
  4. \n
  5. Point your phone at this screen to confirm login
  6. \n
\n \n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => pick(global, ['connectionState', 'authQrCode']),\n (setGlobal, actions): DispatchProps => pick(actions, ['returnToAuthPhoneNumber']),\n)(AuthCode));\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"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/5.f9d2e347c4ce9bda504f.css b/dist/5.f9d2e347c4ce9bda504f.css new file mode 100644 index 000000000..4c4d76028 --- /dev/null +++ b/dist/5.f9d2e347c4ce9bda504f.css @@ -0,0 +1 @@ +#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) 50%}.Modal{position:relative;z-index:var(--z-modal)}.Modal.confirm .modal-dialog,.Modal.delete .modal-dialog,.Modal.error .modal-dialog,.Modal.pin .modal-dialog,.Modal.unpin-all .modal-dialog{max-width:23rem}.Modal.narrow .modal-dialog{max-width:20rem}.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,.25)}.Modal.transparent-backdrop .modal-backdrop{background-color:initial}.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 .25rem .5rem .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:translateZ(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:.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-content,.Modal .modal-content>p,.Modal .modal-title{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}.CropModal .modal-dialog{width:calc(100% - 2rem);max-width:35rem;height:calc(100% - 1rem);max-height:35rem;position:relative}.CropModal #avatar-crop,.CropModal .modal-content{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 hsla(0,0%,100%,.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)}.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:#fff;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:after,.Transition>div:not(.active) .AvatarEditable label i,.Transition>div:not(.active) .AvatarEditable label input,body.animating-right-column .AvatarEditable label:after,body.animating-right-column .AvatarEditable label i,body.animating-right-column .AvatarEditable label input{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,.4)}.AvatarEditable label.disabled{pointer-events:none}.AvatarEditable label.disabled:after,.AvatarEditable label.disabled i{display:none} \ No newline at end of file diff --git a/dist/5.f9d2e347c4ce9bda504f.js b/dist/5.f9d2e347c4ce9bda504f.js new file mode 100644 index 000000000..11f7cd398 --- /dev/null +++ b/dist/5.f9d2e347c4ce9bda504f.js @@ -0,0 +1,2 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[5],{102:function(e,t,n){"use strict";n.r(t),n.d(t,"AuthCode",(function(){return p})),n.d(t,"AuthPassword",(function(){return E})),n.d(t,"AuthRegister",(function(){return y})),n.d(t,"AuthQrCode",(function(){return N}));var r=n(0),a=n(2),o=n(7),c=n(3),i=n(45),l=n(16),u=n(1),s=n(123),d=n(113);n(138);const f=o.g?u.rb:u.qb;var m=Object(r.h)(({code:e,codeLength:t,trackingDirection:n,isTracking:a,isBig:o})=>{const[c,i]=Object(r.r)(),[l,m]=Object(r.r)(),[h,b]=Object(r.r)(!1),p=165/t;Object(r.n)(()=>{c||Object(s.a)("MonkeyIdle").then(i)},[c]),Object(r.n)(()=>{l||Object(s.a)("MonkeyTracking").then(m)},[l]);const v=Object(r.m)(()=>b(!0),[]);return r.a.createElement("div",{id:"monkey",className:o?"big":""},!h&&r.a.createElement("div",{className:"monkey-preview"}),c&&r.a.createElement(d.a,{id:"idleMonkey",size:o?u.Bb:f,className:a?"hidden":void 0,animationData:c,play:!a,onLoad:v}),l&&r.a.createElement(d.a,{id:"trackingMonkey",size:o?u.Bb:f,className:a?"shown":"hidden",animationData:l,playSegment:a?function(){const r=e&&e.length>1||n<0?15+p*(e.length-1):0,a=e.length===t?180:15+p*e.length;return n<1?[a,r]:[r,a]}():void 0,speed:2,noLoop:!0}))}),h=n(116),b=n(38);var p=Object(r.h)(Object(a.h)(e=>Object(c.l)(e,["authPhoneNumber","authIsCodeViaApp","authIsLoading","authError"]),(e,t)=>Object(c.l)(t,["setAuthCode","returnToAuthPhoneNumber","clearAuthError","setShouldSkipUiLoaderTransition"]))(({authPhoneNumber:e,authIsCodeViaApp:t,authIsLoading:n,authError:a,setAuthCode:c,returnToAuthPhoneNumber:u,clearAuthError:s,setShouldSkipUiLoaderTransition:d})=>{const f=Object(r.q)(null),[p,v]=Object(r.r)(""),[g,E]=Object(r.r)(!1),[j,O]=Object(r.r)(1);Object(r.n)(()=>{o.l||f.current.focus()},[]);Object(h.a)((e,t)=>{d({shouldSkipUiLoaderTransition:t}),u()});const y=Object(r.m)(e=>{a&&s();const{currentTarget:t}=e;t.value=t.value.replace(/[^\d]+/,"").substr(0,5),t.value!==p&&(v(t.value),g?t.value.length||E(!1):E(!0),p&&p.length>t.value.length?O(-1):O(1),5===t.value.length&&c({code:t.value}))},[a,s,p,g,c]);return r.a.createElement("div",{id:"auth-code-form",className:"custom-scroll"},r.a.createElement("div",{className:"auth-form"},r.a.createElement(m,{code:p,codeLength:5,isTracking:g,trackingDirection:j}),r.a.createElement("h2",null,e,r.a.createElement("div",{className:"auth-number-edit",onClick:()=>{u(),b.a.back()},role:"button",tabIndex:0,title:"Sign In with another phone number"},r.a.createElement("i",{className:"icon-edit"}))),r.a.createElement("p",{className:"note"},t?r.a.createElement(r.a.Fragment,null,"We have sent the code to the Telegram app",r.a.createElement("br",null),"on your other device."):r.a.createElement(r.a.Fragment,null,"We have sent you an SMS",r.a.createElement("br",null),"with the code.")),r.a.createElement(i.a,{ref:f,id:"sign-in-code",label:"Code",onInput:y,value:p,error:a,autoComplete:"off",inputMode:"decimal"}),n&&r.a.createElement(l.a,null)))})),v=n(146),g=n(147);var E=Object(r.h)(Object(a.h)(e=>Object(c.l)(e,["authIsLoading","authError","authHint"]),(e,t)=>Object(c.l)(t,["setAuthPassword","clearAuthError"]))(({authIsLoading:e,authError:t,authHint:n,setAuthPassword:a,clearAuthError:o})=>{const[c,i]=Object(r.r)(!1),l=Object(r.m)(e=>{i(e)},[]),u=Object(r.m)(e=>{a({password:e})},[a]);return r.a.createElement("div",{id:"auth-password-form",className:"custom-scroll"},r.a.createElement("div",{className:"auth-form"},r.a.createElement(v.a,{isPasswordVisible:c}),r.a.createElement("h2",null,"Enter Your Password"),r.a.createElement("p",{className:"note"},"Your account is protected with",r.a.createElement("br",null),"an additional password."),r.a.createElement(g.a,{clearError:o,error:t,hint:n,isLoading:e,isPasswordVisible:c,onChangePasswordVisibility:l,onSubmit:u})))})),j=n(31),O=n(128);var y=Object(r.h)(Object(a.h)(e=>Object(c.l)(e,["authIsLoading","authError"]),(e,t)=>Object(c.l)(t,["signUp","clearAuthError","uploadProfilePhoto"]))(({authIsLoading:e,authError:t,signUp:n,clearAuthError:a,uploadProfilePhoto:o})=>{const[c,l]=Object(r.r)(!1),[u,s]=Object(r.r)(),[d,f]=Object(r.r)(""),[m,h]=Object(r.r)("");return r.a.createElement("div",{id:"auth-registration-form",className:"custom-scroll"},r.a.createElement("div",{className:"auth-form"},r.a.createElement("form",{action:"",method:"post",onSubmit:function(e){e.preventDefault(),n({firstName:d,lastName:m}),u&&o({file:u})}},r.a.createElement(O.a,{onChange:s}),r.a.createElement("h2",null,"Your Name"),r.a.createElement("p",{className:"note"},"Enter your name and add",r.a.createElement("br",null),"a profile picture."),r.a.createElement(i.a,{id:"registration-first-name",label:"Name",onChange:function(e){t&&a();const{target:n}=e;f(n.value),l(n.value.length>0)},value:d,error:t,autoComplete:"given-name"}),r.a.createElement(i.a,{id:"registration-last-name",label:"Last Name (optional)",onChange:function(e){const{target:t}=e;h(t.value)},value:m,autoComplete:"family-name"}),c&&r.a.createElement(j.a,{type:"submit",ripple:!0,isLoading:e},"Start Messaging"))))}));let w=null;class k{}k.render=function(e,t){w(e,t)},self.QrCreator=k,function(e){function t(t,n,r,a){var o={},c=e(r,n);c.u(t),c.J(),a=a||0;var i=c.h(),l=c.h()+2*a;return o.text=t,o.level=n,o.version=r,o.O=l,o.a=function(e,t){return t-=a,!(0>(e-=a)||e>=i||0>t||t>=i)&&c.a(e,t)},o}function n(e,t,n,r,a,o,c,i,l,u){function s(t,n,r,a,c,i,l){t?(e.lineTo(n+i,r+l),e.arcTo(n,r,a,c,o)):e.lineTo(n,r)}c?e.moveTo(t+o,n):e.moveTo(t,n),s(i,r,n,r,a,-o,0),s(l,r,a,t,a,0,-o),s(u,t,a,t,n,o,0),s(c,t,n,r,n,0,o)}function r(e,t,n,r,a,o,c,i,l,u){function s(t,n,r,a){e.moveTo(t+r,n),e.lineTo(t,n),e.lineTo(t,n+a),e.arcTo(t,n,t+r,n,o)}c&&s(t,n,o,o),i&&s(r,n,-o,o),l&&s(r,a,-o,-o),u&&s(t,a,o,-o)}function a(e,a){e:{var o=a.text,c=a.v,i=a.N,l=a.K,u=a.P;for(i=Math.max(1,i||1),l=Math.min(40,l||40);i<=l;i+=1)try{var s=t(o,c,i,u);break e}catch(e){}s=void 0}if(!s)return null;for(o=e.getContext("2d"),a.background&&(o.fillStyle=a.background,o.fillRect(a.left,a.top,a.size,a.size)),c=s.O,l=a.size/c,o.beginPath(),u=0;uMath.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)}a.forEach(([e,t])=>{o.addColorStop(e,t)}),e.fillStyle=o}}(o,a),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};w=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),a(t,n)):((e=document.createElement("canvas")).width=n.size,e.height=n.size,n=a(e,n),t.appendChild(n))}}(function(){function e(a,c){function i(e,t){for(var n=-1;7>=n;n+=1)if(!(-1>=e+n||d<=e+n))for(var r=-1;7>=r;r+=1)-1>=t+r||d<=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 l(e,n){for(var c=d=4*a+17,l=Array(c),h=0;h=v;v+=1)for(var g=-2;2>=g;g+=1)s[b+v][p+g]=-2==v||2==v||-2==g||2==g||0==v&&0==g}for(c=8;cl;l+=1)h=!e&&1==(c>>l&1),s[6>l?l:8>l?l+1:d-15+l][8]=h,s[8][8>l?d-l-1:9>l?15-l:14-l]=h;if(s[d-8][8]=!e,7<=a){for(c=r.A(a),l=0;18>l;l+=1)h=!e&&1==(c>>l&1),s[Math.floor(l/3)][l%3+d-8-3]=h;for(l=0;18>l;l+=1)h=!e&&1==(c>>l&1),s[l%3+d-8-3][Math.floor(l/3)]=h}if(null==f){for(e=o.I(a,u),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}(),l=0;l8*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 E=0;for(h=l=0,b=Array(e.length),p=Array(e.length),v=0;vv;v+=1)null==s[l][p-v]&&(g=!1,b>>h&1)),n(l,p-v)&&(g=!g),s[l][p-v]=g,-1==--h&&(b+=1,h=7));if(0>(l+=c)||d<=l){l-=c,c=-c;break}}}var u=n[c],s=null,d=0,f=null,m=[],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||d<=e||0>t||d<=t)throw Error(e+","+t);return s[e][t]},h:function(){return d},J:function(){for(var e=0,t=0,n=0;8>n;n+=1){l(!0,n);var a=r.D(h);(0==n||e>a)&&(e=a,t=n)}l(!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=a.g(o.c(0))-a.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=i;i+=1)if(!(0>r+i||t<=r+i))for(var l=-1;1>=l;l+=1)0>a+l||t<=a+l||(0!=i||0!=l)&&c==e.a(r+i,a+l)&&(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 a=0;aObject(c.l)(e,["connectionState","authQrCode"]),(e,t)=>Object(c.l)(t,["returnToAuthPhoneNumber","setShouldSkipUiLoaderTransition"]))(({connectionState:e,authQrCode:t,returnToAuthPhoneNumber:n,setShouldSkipUiLoaderTransition:a})=>{const o=Object(r.q)(null);Object(r.n)(()=>{if(!t||"connectionStateReady"!==e)return;const n=o.current;n.innerHTML="",n.classList.remove("pre-animate"),C.render({text:"tg://login?token="+t.token,radius:.5,ecLevel:"M",fill:"#4E96D4",size:280},n)},[e,t]);return Object(h.a)((e,t)=>{a({shouldSkipUiLoaderTransition:t}),n()}),r.a.createElement("div",{id:"auth-qr-form",className:"custom-scroll"},r.a.createElement("div",{className:"auth-form"},r.a.createElement("div",{className:Object(L.a)("qr-container",t&&"pre-animate"),ref:o},!t&&r.a.createElement(l.a,null)),r.a.createElement("h3",null," Log in to Telegram by QR Code"),r.a.createElement("ol",null,r.a.createElement("li",null,r.a.createElement("span",null,"Open Telegram on your phone")),r.a.createElement("li",null,r.a.createElement("span",null,"Go to ",r.a.createElement("b",null,"Settings")," > ",r.a.createElement("b",null,"Devices")," > ",r.a.createElement("b",null,"Scan QR"))),r.a.createElement("li",null,r.a.createElement("span",null,"Point your phone at this screen to confirm login"))),r.a.createElement(j.a,{isText:!0,onClick:()=>{b.a.back(),n()}},"Log in by phone number")))}))},107:function(e,t,n){"use strict";var r=n(0),a=n(38),o=n(54);var c=n(8),i=n(48),l=n(34),u=n(57),s=n(24),d=n(116),f=n(39),m=n(31),h=n(120);n(148);t.a=e=>{const{title:t,className:n,isOpen:b,header:p,hasCloseButton:v,noBackdrop:g,children:E,onClose:j,onCloseAnimationEnd:O,onEnter:y}=e,[w,k]=Object(r.r)(!1),[C,L]=Object(r.r)(!1),[N,A]=Object(r.r)(!0),{shouldRender:M,transitionClassNames:S}=Object(l.a)(b,O,C,void 0,C),T=Object(r.q)(null);Object(r.n)(()=>b?Object(o.a)({onEsc:j,onEnter:y}):void 0,[b,j,y]),Object(r.n)(()=>b&&T.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 r=n.findIndex(e=>e.isSameNode(document.activeElement));let a=0;r>=0&&(a=t.shiftKey?r>0?r-1:n.length-1:r{document.removeEventListener("keydown",t,!1)}}(T.current):void 0,[b]),Object(d.a)((e,t,n)=>{n&&"modal"===n.type&&(k(!0),t&&(L(!0),setTimeout(()=>L(!1),200)),j())}),Object(f.a)(()=>{N?A(!1):b?a.a.pushState({type:"modal"}):w?k(!1):a.a.back()},[b]),Object(u.a)(([e])=>(document.body.classList.toggle("has-open-dialog",b),(b||!b&&void 0!==e)&&Object(i.b)(200),()=>{document.body.classList.remove("has-open-dialog")}),[b]);const P=Object(s.a)();if(!M)return;const x=Object(c.a)("Modal",n,S,g&&"transparent-backdrop");return r.a.createElement(h.a,null,r.a.createElement("div",{ref:T,className:x,tabIndex:-1,role:"dialog"},r.a.createElement("div",{className:"modal-container"},r.a.createElement("div",{className:"modal-backdrop",onClick:j}),r.a.createElement("div",{className:"modal-dialog"},p||(t?r.a.createElement("div",{className:"modal-header"},v&&r.a.createElement(m.a,{round:!0,color:"translucent",size:"smaller",ariaLabel:P("Close"),onClick:j},r.a.createElement("i",{className:"icon-close"})),r.a.createElement("div",{className:"modal-title"},t)):void 0),r.a.createElement("div",{className:"modal-content custom-scroll"},E)))))}},113:function(e,t,n){"use strict";var r=n(0),a=n(9),o=n(8),c=n(48),i=n(129);let l,u;async function s(){return l||(l=n.e(7).then(n.bind(null,190)),u=(await l).default),l}setTimeout(s,5e3);t.a=Object(r.h)(({className:e,id:t,animationData:n,play:l,playSegment:d,speed:f,noLoop:m,size:h,quality:b,isLowPriority:p,onLoad:v})=>{const[g,E]=Object(r.r)(),j=Object(r.q)(null),O=Object(r.q)(!1),y=Object(r.q)(!1),w=Object(r.q)();w.current=l;const k=Object(r.q)();k.current=d,Object(r.n)(()=>{if(g||!n)return;const e=()=>{if(!j.current)return;const e=new u(t,j.current,n,{noLoop:m,size:h,quality:b,isLowPriority:p},v);f&&e.setSpeed(f),E(e)};u?e():s().then(()=>{Object(a.b)(()=>{j.current&&e()})})},[g,n,t,p,m,v,b,h,f]),Object(r.n)(()=>()=>{g&&g.destroy()},[g]);const C=Object(r.m)((e=!1)=>{g&&(w.current||k.current)&&(k.current?g.playSegment(k.current):e?g.goToAndPlay(0):g.play())},[g]),L=Object(r.m)(()=>{g&&g.pause()},[g]),N=Object(r.m)(()=>{y.current=!0,g&&(O.current||(O.current=g.isPlaying()),L())},[g,L]),A=Object(r.m)(()=>{O.current&&C(),O.current=!1,y.current=!1},[C]),M=Object(r.m)(()=>{Object(a.b)(A)},[A]);Object(r.n)(()=>{g&&(l||d?y.current?O.current=!0:C(m):y.current?O.current=!1:L())},[g,l,d,m,C,L]),Object(c.a)(N,A),Object(i.a)(N,M);const S=Object(o.a)("AnimatedSticker",e),T=h?`width: ${h}px; height: ${h}px;`:void 0;return r.a.createElement("div",{ref:j,className:S,style:T})})},116:function(e,t,n){"use strict";n.d(t,"a",(function(){return u}));var r=n(0),a=n(7),o=n(38);let c=!1;const i=e=>{const t=e.touches[0].pageX;(t<=60||t>=window.innerWidth-60)&&(c=!0)},l=()=>{c&&setTimeout(()=>{c=!1},200)};function u(e){const t=t=>{o.a.isHistoryChangedByUser?e(t,c,o.a.states[o.a.states.length-1]):setTimeout(()=>{o.a.isHistoryChangedByUser=!0},0)};Object(r.n)(()=>(window.addEventListener("popstate",t),()=>{window.removeEventListener("popstate",t)}))}a.e&&(console.log("Adding event listeners for useHistoryBack"),window.addEventListener("touchstart",i),window.addEventListener("touchend",l))},120:function(e,t,n){"use strict";var r=n(0),a=n(65);t.a=({containerId:e,className:t,children:n})=>{const o=Object(r.q)(document.createElement("div"));return Object(r.o)(()=>{const n=document.querySelector(e||"#portals");if(!n)return;const r=o.current;return t&&r.classList.add(t),n.appendChild(r),()=>{a.a.render(void 0,r),n.removeChild(r)}},[t,e]),a.a.render(n,o.current)}},123:function(e,t,n){"use strict";n.d(t,"a",(function(){return c}));var r=n(5),a=n(53);const o={MonkeyIdle:n.p+"TwoFactorSetupMonkeyIdle.dea4a492c144df84ddab778dc8a3f0cd.tgs",MonkeyTracking:n.p+"TwoFactorSetupMonkeyTracking.eb5a7a6f166fb7589c12e6248561fb58.tgs",MonkeyClose:n.p+"TwoFactorSetupMonkeyClose.604c4c833d322b7e6c3ea19bef058241.tgs",MonkeyPeek:n.p+"TwoFactorSetupMonkeyPeek.1905436b042520363d7e59f5d7f903ab.tgs",FoldersAll:n.p+"FoldersAll.3f9f9e243d19f0fbf9aaaff11cbd4572.tgs",FoldersNew:n.p+"FoldersNew.9a40d71c0c8be70f5bd14ff2d7bc1593.tgs",DiscussionGroups:n.p+"DiscussionGroupsDucks.9ea453d1be9d1b0ee77a992f8e587485.tgs"};function c(e){const t=o[e].replace(window.location.origin,"");return a.b("file"+t,r.ApiMediaFormat.Lottie)}},128:function(e,t,n){"use strict";var r=n(0),a=n(8),o=n(1),c=n(13),i=n(24),l=n(31),u=n(107),s=n(16);n(149);const d={type:"blob",quality:.8,format:"jpeg",circle:!1};let f,m,h;var b=Object(r.h)(({file:e,onChange:t,onClose:a})=>{const[b,p]=Object(r.r)(!1);Object(r.n)(()=>{e&&(b?async function(e){try{const t=document.getElementById("avatar-crop");if(!t)return;const{offsetWidth:n,offsetHeight:r}=t;h=new f(t,{enableZoom:!0,boundary:{width:n,height:r},viewport:{width:n-16,height:r-16,type:"circle"}});const a=await Object(c.a)(e);await h.bind({url:a})}catch(e){o.p&&console.error(e)}}(e):async function(){return m||(m=Promise.all([n.e(6),n.e(8)]).then(n.bind(null,314)),f=(await m).default),m}().then(()=>p(!0)))},[e,b]);const v=Object(i.a)();return r.a.createElement(u.a,{isOpen:Boolean(e),onClose:a,title:"Drag to reposition",className:"CropModal",hasCloseButton:!0},b?r.a.createElement("div",{id:"avatar-crop"}):r.a.createElement(s.a,null),r.a.createElement(l.a,{className:"confirm-button",round:!0,color:"primary",onClick:async function(){if(!h)return;const e=await h.result(d),n="string"==typeof e?e:Object(c.b)(e,"avatar.jpg");t(n)},ariaLabel:v("CropImage")},r.a.createElement("i",{className:"icon-check"})))});n(150);t.a=Object(r.h)(({title:e="Change your profile picture",disabled:t,currentAvatarBlobUrl:n,onChange:o})=>{const[c,i]=Object(r.r)(),[l,u]=Object(r.r)(n);Object(r.n)(()=>{u(n)},[n]);const s=Object(a.a)(l&&"filled",t&&"disabled");return r.a.createElement("div",{className:"AvatarEditable"},r.a.createElement("label",{className:s,role:"button",tabIndex:0,title:e},r.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"}),r.a.createElement("i",{className:"icon-camera-add"}),l&&r.a.createElement("img",{src:l,alt:"Avatar"})),r.a.createElement(b,{file:c,onClose:function(){i(void 0)},onChange:function(e){i(void 0),o(e),l&&URL.revokeObjectURL(l),u(URL.createObjectURL(e))}}))})},129:function(e,t,n){"use strict";var r=n(0);t.a=(e,t)=>{Object(r.n)(()=>(document.hasFocus()||e(),window.addEventListener("blur",e),window.addEventListener("focus",t),()=>{window.removeEventListener("focus",t),window.removeEventListener("blur",e)}),[e,t])}},138:function(e,t,n){},146:function(e,t,n){"use strict";var r=n(0),a=n(1),o=n(7),c=n(123),i=n(113);n(138);const l=[0,50],u=[0,20],s=[20,0],d=o.g?a.rb:a.qb;t.a=Object(r.h)(({isPasswordVisible:e,isBig:t})=>{const[n,o]=Object(r.r)(),[f,m]=Object(r.r)(),[h,b]=Object(r.r)(!1),[p,v]=Object(r.r)(!1);Object(r.n)(()=>{n?setTimeout(()=>v(!0),2e3):Object(c.a)("MonkeyClose").then(o)},[n]),Object(r.n)(()=>{f||Object(c.a)("MonkeyPeek").then(m)},[f]);const g=Object(r.m)(()=>b(!0),[]);return r.a.createElement("div",{id:"monkey",className:t?"big":""},!h&&r.a.createElement("div",{className:"monkey-preview"}),n&&r.a.createElement(i.a,{id:"closeMonkey",size:t?a.Bb:d,className:p?"hidden":"shown",animationData:n,playSegment:l,noLoop:!0,onLoad:g}),f&&r.a.createElement(i.a,{id:"peekMonkey",size:t?a.Bb:d,className:p?"shown":"hidden",animationData:f,playSegment:e?u:s,noLoop:!0}))})},147:function(e,t,n){"use strict";var r=n(0),a=n(1),o=n(7),c=n(8),i=n(24),l=n(31);const u=o.g?550:400;t.a=Object(r.h)(({isLoading:e=!1,isPasswordVisible:t,error:n,hint:s,placeholder:d="Password",submitLabel:f="Next",clearError:m,onChangePasswordVisibility:h,onInputChange:b,onSubmit:p})=>{const v=Object(r.q)(null),g=Object(i.a)(),[E,j]=Object(r.r)(""),[O,y]=Object(r.r)(!1);return Object(r.n)(()=>{o.l||setTimeout(()=>{v.current.focus()},u)},[]),Object(r.n)(()=>{n&&requestAnimationFrame(()=>{v.current.focus(),v.current.select()})},[n]),r.a.createElement("form",{action:"",onSubmit:function(t){t.preventDefault(),e||O&&p(E)},autoComplete:"off"},r.a.createElement("div",{className:Object(c.a)("input-group password-input",E&&"touched",n&&"error"),dir:g.isRtl?"rtl":void 0},r.a.createElement("input",{ref:v,className:"form-control",type:t?"text":"password",id:"sign-in-password",value:E||"",autoComplete:"current-password",onChange:function(e){n&&m();const{target:t}=e;j(t.value),y(t.value.length>=a.Z),b&&b(t.value)},dir:"auto"}),r.a.createElement("label",null,n||s||d),r.a.createElement("div",{className:"toggle-password",onClick:function(){h(!t)},role:"button",tabIndex:0,title:"Toggle password visibility"},r.a.createElement("i",{className:t?"icon-eye":"icon-eye-closed"}))),O&&r.a.createElement(l.a,{type:"submit",ripple:!0,isLoading:e},f))})},148:function(e,t,n){},149:function(e,t,n){},150:function(e,t,n){}}]); +//# sourceMappingURL=5.f9d2e347c4ce9bda504f.js.map \ No newline at end of file diff --git a/dist/5.f9d2e347c4ce9bda504f.js.map b/dist/5.f9d2e347c4ce9bda504f.js.map new file mode 100644 index 000000000..d012c45ed --- /dev/null +++ b/dist/5.f9d2e347c4ce9bda504f.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:///./node_modules/qr-creator/dist/qr-creator.es6.min.js","webpack:///./src/components/auth/AuthQrCode.tsx","webpack:///./src/components/ui/Modal.tsx","webpack:///./src/util/trapFocus.ts","webpack:///./src/components/common/AnimatedSticker.tsx","webpack:///./src/hooks/useHistoryBack.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/hooks/useBackgroundMode.ts","webpack:///./src/components/common/PasswordMonkey.tsx","webpack:///./src/components/common/PasswordForm.tsx"],"names":["STICKER_SIZE","IS_MOBILE_SCREEN","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","setShouldSkipUiLoaderTransition","inputRef","useRef","setCode","setIsTracking","setTrackingDirection","IS_TOUCH_ENV","current","focus","useHistoryBack","event","noAnimation","shouldSkipUiLoaderTransition","onCodeChange","e","currentTarget","target","value","replace","substr","onClick","HistoryWrapper","back","role","tabIndex","title","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","preventDefault","file","AvatarEditable","onChange","Button","type","ripple","G","H","render","w","B","self","QrCreator","t","c","a","b","h","u","J","r","d","text","level","version","O","C","g","x","f","lineTo","arcTo","moveTo","z","y","v","N","K","P","Math","max","min","getContext","background","fillStyle","fillRect","left","top","beginPath","p","q","k","m","D","E","n","l","floor","R","I","F","round","fill","colorStops","position","map","createLinearGradient","apply","Error","createRadialGradient","forEach","addColorStop","A","minVersion","maxVersion","ecLevel","radius","quiet","Object","assign","HTMLCanvasElement","width","height","clearRect","document","createElement","appendChild","Array","put","push","write","j","o","s","S","multiply","i","charCodeAt","L","M","Q","abs","connectionState","authQrCode","qrCodeRef","container","innerHTML","classList","remove","token","buildClassName","isText","Modal","props","isOpen","header","hasCloseButton","noBackdrop","children","onClose","onCloseAnimationEnd","onEnter","isClosedWithHistory","setIsClosedWithHistory","noAnimations","setNoAnimations","isFirstRender","setIsFirstRender","shouldRender","transitionClassNames","useShowTransition","modalRef","captureKeyboardListeners","onEsc","element","handleKeyDown","key","stopPropagation","focusableElements","from","querySelectorAll","currentFocusedIndex","findIndex","em","isSameNode","activeElement","newFocusedIndex","shiftKey","addEventListener","removeEventListener","trapFocus","previousHistoryState","setTimeout","useOnChange","pushState","useEffectWithPrevDeps","prevIsOpen","body","toggle","dispatchHeavyAnimationEvent","lang","useLang","fullClassName","Portal","color","ariaLabel","lottiePromise","RLottie","async","ensureLottie","default","quality","isLowPriority","animation","setAnimation","wasPlaying","isFrozen","playRef","playSegmentRef","exec","newAnimation","setSpeed","fastRaf","destroy","playAnimation","shouldRestart","goToAndPlay","pauseAnimation","pause","freezeAnimation","isPlaying","unfreezeAnimation","unfreezeAnimationOnRaf","useHeavyAnimationCheck","useBackgroundMode","style","isEdge","onTouchStart","touches","pageX","window","innerWidth","onTouchEnd","handler","onPopState","isHistoryChangedByUser","states","IS_IOS","console","log","containerId","elementRef","useLayoutEffect","querySelector","add","TeactDOM","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","viewport","dataUri","blobToDataUri","bind","url","err","DEBUG","initCropper","ensureCroppie","Boolean","result","croppedImg","blobToFile","disabled","currentAvatarBlobUrl","selectedFile","setSelectedFile","croppedBlobUrl","setCroppedBlobUrl","labelClassName","files","accept","src","alt","URL","revokeObjectURL","createObjectURL","onBlur","onFocus","hasFocus","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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AAC,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,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAClf,CAAC,GAAG,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,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,GA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","file":"5.f9d2e347c4ce9bda504f.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_MOBILE_SCREEN } 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_MOBILE_SCREEN ? 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';\n\nimport InputText from '../ui/InputText';\nimport Loading from '../ui/Loading';\nimport TrackingMonkey from '../common/TrackingMonkey';\nimport useHistoryBack from '../../hooks/useHistoryBack';\nimport { HistoryWrapper } from '../../util/history';\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 setShouldSkipUiLoaderTransition,\n}) => {\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 const handleBackToPhoneNumber = () => {\n returnToAuthPhoneNumber();\n HistoryWrapper.back();\n };\n\n useHistoryBack((event, noAnimation) => {\n setShouldSkipUiLoaderTransition({ shouldSkipUiLoaderTransition: noAnimation });\n returnToAuthPhoneNumber();\n });\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 {authIsCodeViaApp ? (\n <>\n We have sent the code to the Telegram app\n
on your other device.\n \n ) : (\n <>\n We have sent you an SMS\n
with the code.\n \n )}\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 'setShouldSkipUiLoaderTransition',\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';\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 [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

Enter Your Password

\n

\n Your account is protected with\n
an additional password.\n

\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';\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 [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

Your Name

\n

\n Enter your name and add\n
a profile picture.\n

\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","/*\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;\ntype DispatchProps = Pick;\n\nconst DATA_PREFIX = 'tg://login?token=';\n\nconst AuthCode: FC = ({\n connectionState,\n authQrCode,\n returnToAuthPhoneNumber,\n setShouldSkipUiLoaderTransition,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const qrCodeRef = useRef(null);\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 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 handleBackToPhoneNumber = () => {\n HistoryWrapper.back();\n returnToAuthPhoneNumber();\n };\n\n useHistoryBack((event, noAnimation) => {\n setShouldSkipUiLoaderTransition({ shouldSkipUiLoaderTransition: noAnimation });\n returnToAuthPhoneNumber();\n });\n\n return (\n
\n
\n
\n {!authQrCode && }\n
\n

Log in to Telegram by QR Code

\n
    \n
  1. Open Telegram on your phone
  2. \n
  3. Go to Settings > Devices > Scan QR
  4. \n
  5. Point your phone at this screen to confirm login
  6. \n
\n \n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => pick(global, ['connectionState', 'authQrCode']),\n (setGlobal, actions): DispatchProps => pick(actions, ['returnToAuthPhoneNumber', 'setShouldSkipUiLoaderTransition']),\n)(AuthCode));\n","import React, {\n FC, useEffect, useRef, useState,\n} from '../../lib/teact/teact';\n\nimport { HistoryWrapper } from '../../util/history';\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';\nimport useOnChange from '../../hooks/useOnChange';\n\nimport Button from './Button';\nimport Portal from './Portal';\n\nimport './Modal.scss';\n\nconst ANIMATION_DURATION = 200;\n\ntype OwnProps = {\n title?: string;\n className?: string;\n isOpen?: boolean;\n header?: FC;\n hasCloseButton?: boolean;\n noBackdrop?: boolean;\n children: any;\n onClose: () => void;\n onCloseAnimationEnd?: () => void;\n onEnter?: () => void;\n};\n\nconst Modal: FC = (props) => {\n const {\n title,\n className,\n isOpen,\n header,\n hasCloseButton,\n noBackdrop,\n children,\n onClose,\n onCloseAnimationEnd,\n onEnter,\n } = props;\n const [isClosedWithHistory, setIsClosedWithHistory] = useState(false);\n const [noAnimations, setNoAnimations] = useState(false);\n const [isFirstRender, setIsFirstRender] = useState(true);\n const {\n shouldRender,\n transitionClassNames,\n } = useShowTransition(isOpen, onCloseAnimationEnd, noAnimations, undefined, noAnimations);\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 useHistoryBack((event, noAnimation, previousHistoryState) => {\n if (previousHistoryState && previousHistoryState.type === 'modal') {\n setIsClosedWithHistory(true);\n if (noAnimation) {\n setNoAnimations(true);\n setTimeout(() => setNoAnimations(false), ANIMATION_DURATION);\n }\n onClose();\n }\n });\n\n useOnChange(() => {\n if (isFirstRender) {\n setIsFirstRender(false);\n return;\n }\n if (isOpen) {\n HistoryWrapper.pushState({\n type: 'modal',\n });\n } else if (!isClosedWithHistory) {\n HistoryWrapper.back();\n } else {\n setIsClosedWithHistory(false);\n }\n }, [isOpen]);\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","// This is unsafe and can be not chained as `popstate` event is asynchronous\n\nimport { useEffect } from '../lib/teact/teact';\nimport { IS_IOS } from '../util/environment';\nimport { HistoryWrapper } from '../util/history';\n\ntype HistoryBackFunction = ((event: PopStateEvent, noAnimation: boolean, previousHistoryState: any) => void);\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 = 60;\nconst SAFARI_EDGE_BACK_GESTURE_DURATION = 200;\nlet isEdge = false;\n\nconst onTouchStart = (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 isEdge = true;\n }\n};\n\nconst onTouchEnd = () => {\n if (isEdge) {\n setTimeout(() => {\n isEdge = false;\n }, SAFARI_EDGE_BACK_GESTURE_DURATION);\n }\n};\n\nif (IS_IOS) {\n // eslint-disable-next-line no-console\n console.log('Adding event listeners for useHistoryBack');\n window.addEventListener('touchstart', onTouchStart);\n window.addEventListener('touchend', onTouchEnd);\n}\n\nexport default function useHistoryBack(handler: NoneToVoidFunction | HistoryBackFunction) {\n const onPopState = (event: PopStateEvent) => {\n // Check if the event was caused by History API call or the user\n if (!HistoryWrapper.isHistoryChangedByUser) {\n // HACK: Handle multiple event listeners.\n // onTickChange doesn't work on Safari for some reason\n setTimeout(() => {\n HistoryWrapper.isHistoryChangedByUser = true;\n }, 0);\n return;\n }\n handler(event, isEdge, HistoryWrapper.states[HistoryWrapper.states.length - 1]);\n };\n\n\n useEffect(() => {\n window.addEventListener('popstate', onPopState);\n\n return () => {\n window.removeEventListener('popstate', onPopState);\n };\n });\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 { useEffect } from '../lib/teact/teact';\n\nexport default (\n onBlur: AnyToVoidFunction,\n onFocus: AnyToVoidFunction,\n) => {\n useEffect(() => {\n if (!document.hasFocus()) {\n onBlur();\n }\n\n window.addEventListener('blur', onBlur);\n window.addEventListener('focus', onFocus);\n\n return () => {\n window.removeEventListener('focus', onFocus);\n window.removeEventListener('blur', onBlur);\n };\n }, [onBlur, onFocus]);\n};\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_MOBILE_SCREEN } 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_MOBILE_SCREEN ? 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_MOBILE_SCREEN } 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_MOBILE_SCREEN ? 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/6.cfcac5af41fdc3e4930b.css b/dist/6.1712ed1ad0fe8fb0958d.css similarity index 100% rename from dist/6.cfcac5af41fdc3e4930b.css rename to dist/6.1712ed1ad0fe8fb0958d.css diff --git a/dist/6.cfcac5af41fdc3e4930b.js b/dist/6.1712ed1ad0fe8fb0958d.js similarity index 98% rename from dist/6.cfcac5af41fdc3e4930b.js rename to dist/6.1712ed1ad0fe8fb0958d.js index 7515f26bc..b4e22bb74 100644 --- a/dist/6.cfcac5af41fdc3e4930b.js +++ b/dist/6.1712ed1ad0fe8fb0958d.js @@ -1,2 +1,2 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[6],{183: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},306: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(307).setImmediate)},307: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(308),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(183))},308: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(309).setImmediate)},309: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(310),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(186))},310: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.2bacad1be7a118611b52.js b/dist/main.2bacad1be7a118611b52.js deleted file mode 100644 index c73c85d9f..000000000 --- a/dist/main.2bacad1be7a118611b52.js +++ /dev/null @@ -1,2 +0,0 @@ -!function(e){function t(t){for(var n,r,d=t[0],o=t[1],c=0,a=[];c=0&&I(e[t]);t--);return t+17&&console.warn(`[Teact] Slow component render: ${n}, ${Math.round(t)} ms`),O[n].renderTimes.push(t),O[n].renderCount++}}catch(t){Object(c.a)(t),u=e.renderedValue}if(e.isMounted&&u===e.renderedValue)return e.$element;e.renderedValue=u;const d=w(u);return e.$element=y(e,[d]),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.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 j(e),e.isMounted=!0,e.$element}function M(e){if(!e.isMounted||!e.onUpdate)return;const t=e.$element;j(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 N(e){const{cursor:t,byCursor:n}=f.hooks.state;var d;return void 0===n[t]&&(n[t]={value:e,nextValue:e,setter:(d=f,e=>{n[t].nextValue!==e&&(n[t].nextValue="function"==typeof e?e(n[t].value):e,d.prepareForFrame&&d.forceUpdate||(d.prepareForFrame=Object(u.h)(()=>function e(t){t.isMounted&&(t.hooks.state.byCursor.forEach(e=>{e.value=e.nextValue}),t.prepareForFrame=Object(u.h)(()=>e(t)),t.forceUpdate=Object(u.i)(()=>M(t)))}(d)),d.forceUpdate=Object(u.i)(()=>M(d))),d.prepareForFrame(),d.forceUpdate(),r.r&&console.log("[Teact.useState]",d.name,d.Component&&d.Component.DEBUG_contentComponentName?"> "+d.Component.DEBUG_contentComponentName:"",`Forced update at cursor #${t}, next value: `,n[t].nextValue))})}),f.hooks.state.cursor++,[n[t].value,n[t].setter]}function T(e,t,n){const{cursor:r,byCursor:u}=f.hooks.effects,d=f,o=()=>{if(!d.isMounted)return;const{cleanup:e}=u[r];if("function"==typeof e)try{e()}catch(e){Object(c.a)(e)}u[r].cleanup=t()};void 0!==u[r]&&n&&u[r].dependencies?n.some((e,t)=>e!==u[r].dependencies[t])&&e(o):e(o),u[r]={effect:t,dependencies:n,cleanup:u[r]?u[r].cleanup:void 0},f.hooks.effects.cursor++}function P(e,t){return T(u.b,e,t)}function D(e,t){return T(u.d,e,t)}function L(e,t){const{cursor:n,byCursor:r}=f.hooks.memos;let{current:u}=r[n]||{};return(void 0===r[n]||t.some((e,t)=>e!==r[n].dependencies[t]))&&(u=e()),r[n]={current:u,dependencies:t},f.hooks.memos.cursor++,u}function F(e,t){return L(()=>e,t)}function B(e){return L(()=>({current:e}),[])}function x(e,t=o.a,n=!1){return function(u){const d=B(u),c=B();return(!c.current||d.current&&!t(d.current,u))&&(r.p&&n&&console.log(`[Teact.memo] ${e.name}: Update is caused by:`,Object(o.b)(d.current,u).join(", ")),d.current=u,c.current=g(e,u)),c.current}}document.addEventListener("dblclick",()=>{console.log("COMPONENTS",Object(d.k)(Object.values(O),"renderCount","desc"))}),t.a={createElement:g,Fragment:s}},function(e,t,n){"use strict";n.d(t,"fb",(function(){return r})),n.d(t,"E",(function(){return u})),n.d(t,"f",(function(){return d})),n.d(t,"g",(function(){return o})),n.d(t,"p",(function(){return c})),n.d(t,"r",(function(){return a})),n.d(t,"F",(function(){return i})),n.d(t,"q",(function(){return s})),n.d(t,"D",(function(){return f})),n.d(t,"I",(function(){return l})),n.d(t,"A",(function(){return b})),n.d(t,"B",(function(){return h})),n.d(t,"z",(function(){return m})),n.d(t,"C",(function(){return p})),n.d(t,"N",(function(){return g})),n.d(t,"O",(function(){return y})),n.d(t,"P",(function(){return v})),n.d(t,"Q",(function(){return I})),n.d(t,"m",(function(){return w})),n.d(t,"G",(function(){return O})),n.d(t,"Z",(function(){return C})),n.d(t,"V",(function(){return E})),n.d(t,"W",(function(){return S})),n.d(t,"X",(function(){return M})),n.d(t,"i",(function(){return A})),n.d(t,"k",(function(){return k})),n.d(t,"j",(function(){return N})),n.d(t,"ob",(function(){return T})),n.d(t,"Y",(function(){return P})),n.d(t,"y",(function(){return D})),n.d(t,"S",(function(){return L})),n.d(t,"R",(function(){return F})),n.d(t,"gb",(function(){return B})),n.d(t,"Db",(function(){return x})),n.d(t,"a",(function(){return R})),n.d(t,"e",(function(){return U})),n.d(t,"d",(function(){return _})),n.d(t,"s",(function(){return G})),n.d(t,"u",(function(){return $})),n.d(t,"v",(function(){return W})),n.d(t,"w",(function(){return H})),n.d(t,"lb",(function(){return K})),n.d(t,"kb",(function(){return z})),n.d(t,"bb",(function(){return V})),n.d(t,"ab",(function(){return q})),n.d(t,"eb",(function(){return J})),n.d(t,"db",(function(){return Y})),n.d(t,"cb",(function(){return Q})),n.d(t,"K",(function(){return Z})),n.d(t,"c",(function(){return X})),n.d(t,"vb",(function(){return ee})),n.d(t,"wb",(function(){return te})),n.d(t,"qb",(function(){return ne})),n.d(t,"rb",(function(){return re})),n.d(t,"yb",(function(){return ue})),n.d(t,"ub",(function(){return de})),n.d(t,"zb",(function(){return oe})),n.d(t,"Ab",(function(){return ce})),n.d(t,"xb",(function(){return ae})),n.d(t,"Bb",(function(){return ie})),n.d(t,"sb",(function(){return se})),n.d(t,"tb",(function(){return fe})),n.d(t,"T",(function(){return le})),n.d(t,"U",(function(){return be})),n.d(t,"pb",(function(){return he})),n.d(t,"l",(function(){return me})),n.d(t,"hb",(function(){return pe})),n.d(t,"jb",(function(){return ge})),n.d(t,"ib",(function(){return ye})),n.d(t,"nb",(function(){return ve})),n.d(t,"b",(function(){return Ie})),n.d(t,"h",(function(){return we})),n.d(t,"M",(function(){return Oe})),n.d(t,"L",(function(){return je})),n.d(t,"mb",(function(){return Ce})),n.d(t,"H",(function(){return Ee})),n.d(t,"Cb",(function(){return Se})),n.d(t,"x",(function(){return Me})),n.d(t,"J",(function(){return Ae})),n.d(t,"n",(function(){return ke})),n.d(t,"o",(function(){return Ne})),n.d(t,"t",(function(){return Te}));const r="Telegram",u=" [Inactive]",d="Telegram WebZ",o="41070d0",c=!1,a=!1,i=!1,s="Shoot!\nSomething went wrong, please see the error details in Dev Tools Console.",f="GramJs:sessionId",l="user_auth",b=!1,h="tt-global-state",m=30,p=5e3,g=!1,y="tt-media",v="tt-media-avatars",I="tt-media-progressive",w="tt-custom-bg",O="tt-lang-packs-v3",j=(new Set(["newMessage","newScheduledMessage","deleteMessages","deleteScheduledMessages","deleteHistory"]),"undefined"!=typeof window&&window.innerHeight>=900),C=1,E=750,S=j?60:40,M=2*S,A=72,k=j?30:25,N=100,T=42,P=42,D=20,L=30,F=200,B=500,x=20,R=!1,U=2,_=U,G=16,$=1e4,W="editable-message-text",H="editable-message-text-modal",K=1440,z=1150,V=1275,q=925,J=600,Y=950,Q=450,Z=1e9,X=100,ee=13,te=11,ne=160,re=120,ue=64,de=48,oe=32,ce=64,ae=64,ie=160,se=140,fe=80,le="MEMOJI_STICKER",be=200,he=450,me="image/png,image/gif,image/jpeg,video/mp4,video/avi,video/quicktime",pe="((ftp|https?):\\/\\/)?((www\\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\\.[a-zA-Z0-9()]{1,6})\\b([-a-zA-Z0-9()@:%_+.~#?&/=]*)",ge=/^(?:https?:\/\/)?(?:t\.me\/)([\d\w_]+)(?:\/([\d]+))?$/gm,ye=/^(?:https?:\/\/)?(?:t\.me\/joinchat\/)([\d\w_]+)?$/gm,ve=777e3,Ie=0,we=1,Oe=10,je=5,Ce=2147483646,Ee=["android","ios","tdesktop","macos"],Se="TelegramTips",Me="https://bugs.telegram.org/?tag_ids=41&sort=time",Ae="#A2AF8E",ke="#0F0F0F",Ne="#0a0a0a8c",Te="rgba(90, 110, 70, 0.6)"},function(e,t,n){"use strict";n.d(t,"g",(function(){return y})),n.d(t,"e",(function(){return v})),n.d(t,"d",(function(){return I})),n.d(t,"b",(function(){return w})),n.d(t,"a",(function(){return O})),n.d(t,"f",(function(){return j})),n.d(t,"h",(function(){return C}));var r=n(0),u=n(1),d=n(35),o=n(25),c=n(9),a=n(23),i=n(3),s=n(21);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;const g=Object(c.i)((function(){h.forEach(e=>e(l))}));function y(e){"object"==typeof e&&e!==l&&(l=e,g())}function v(){return l}function I(){return m}function w(e,t){b[e]||(b[e]=[],m[e]=t=>{!function(e,t){b[e]&&b[e].forEach(e=>{const n=e(l,m,t);n&&y(n)})}(e,t)}),b[e].push(t)}function O(e){h.push(e)}function j(e){const t=h.indexOf(e);-1!==t&&h.splice(t,1)}function C(e=(()=>({})),t=(()=>({}))){return n=>function u(c){u.DEBUG_contentComponentName=n.name;const[i]=Object(r.r)(Object(o.a)(p)),b=Object(d.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(y,m)}}catch(e){Object(s.a)(e)}}return r.a.createElement(n,f({},h.mappedProps,c))}}u.p&&(window.getGlobal=v,document.addEventListener("dblclick",()=>{console.log("GLOBAL CONTAINERS",Object(i.k)(Object.values(p),"DEBUG_updates","desc"))}))},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 d(e,t){return t.reduce((t,n)=>(t[n]=e[n],t),{})}function o(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 d(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,d]=Array.isArray(n)?n:[n,n],[o,c]=t;let a,i;if("function"==typeof o?(a=o(e)||0,i=o(r)||0):"string"==typeof o&&(a=e[o]||0,i=r[o]||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"===d?t-n:n-t}}let u,d;return"function"==typeof t?(u=t(e)||0,d=t(r)||0):"string"==typeof t&&(u=e[t]||0,d=r[t]||0),"asc"===n?u-d:d-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 d})),n.d(t,"m",(function(){return o})),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,"Y",(function(){return r.b})),n.d(t,"Z",(function(){return r.c})),n.d(t,"ab",(function(){return r.d})),n.d(t,"xb",(function(){return r.g})),n.d(t,"pb",(function(){return r.e})),n.d(t,"wb",(function(){return r.f})),n.d(t,"Eb",(function(){return r.h})),n.d(t,"X",(function(){return r.a})),n.d(t,"lb",(function(){return u.w})),n.d(t,"kb",(function(){return u.v})),n.d(t,"ib",(function(){return u.t})),n.d(t,"nb",(function(){return u.y})),n.d(t,"jb",(function(){return u.u})),n.d(t,"ob",(function(){return u.z})),n.d(t,"m",(function(){return u.j})),n.d(t,"U",(function(){return u.p})),n.d(t,"l",(function(){return u.i})),n.d(t,"g",(function(){return u.e})),n.d(t,"h",(function(){return u.f})),n.d(t,"f",(function(){return u.d})),n.d(t,"mb",(function(){return u.x})),n.d(t,"gb",(function(){return u.r})),n.d(t,"q",(function(){return u.m})),n.d(t,"yb",(function(){return u.A})),n.d(t,"e",(function(){return u.c})),n.d(t,"c",(function(){return u.a})),n.d(t,"K",(function(){return u.o})),n.d(t,"k",(function(){return u.h})),n.d(t,"j",(function(){return u.g})),n.d(t,"hb",(function(){return u.s})),n.d(t,"Cb",(function(){return u.D})),n.d(t,"d",(function(){return u.b})),n.d(t,"Bb",(function(){return u.C})),n.d(t,"Ab",(function(){return u.B})),n.d(t,"p",(function(){return u.l})),n.d(t,"o",(function(){return u.k})),n.d(t,"fb",(function(){return u.q})),n.d(t,"J",(function(){return u.n})),n.d(t,"Db",(function(){return u.E})),n.d(t,"A",(function(){return i})),n.d(t,"zb",(function(){return s})),n.d(t,"F",(function(){return f})),n.d(t,"N",(function(){return l})),n.d(t,"O",(function(){return b})),n.d(t,"x",(function(){return h})),n.d(t,"L",(function(){return m})),n.d(t,"n",(function(){return p})),n.d(t,"tb",(function(){return g})),n.d(t,"ub",(function(){return y})),n.d(t,"qb",(function(){return v})),n.d(t,"db",(function(){return I})),n.d(t,"vb",(function(){return w})),n.d(t,"eb",(function(){return O})),n.d(t,"V",(function(){return j})),n.d(t,"W",(function(){return C})),n.d(t,"sb",(function(){return E})),n.d(t,"rb",(function(){return S})),n.d(t,"v",(function(){return k})),n.d(t,"cb",(function(){return N})),n.d(t,"G",(function(){return T})),n.d(t,"P",(function(){return P})),n.d(t,"I",(function(){return D})),n.d(t,"t",(function(){return L})),n.d(t,"u",(function(){return F})),n.d(t,"M",(function(){return B})),n.d(t,"y",(function(){return x})),n.d(t,"H",(function(){return R})),n.d(t,"z",(function(){return U})),n.d(t,"Q",(function(){return _})),n.d(t,"R",(function(){return G})),n.d(t,"E",(function(){return $})),n.d(t,"D",(function(){return W})),n.d(t,"C",(function(){return K})),n.d(t,"B",(function(){return z})),n.d(t,"b",(function(){return q})),n.d(t,"i",(function(){return J})),n.d(t,"S",(function(){return Y})),n.d(t,"T",(function(){return Q})),n.d(t,"bb",(function(){return Z})),n.d(t,"s",(function(){return X})),n.d(t,"w",(function(){return ee})),n.d(t,"r",(function(){return te})),n.d(t,"a",(function(){return ne}));var r=n(27),u=n(28),d=n(5),o=n(1),c=n(59);const a=new RegExp(o.hb,"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:d,audio:o,voice:c,document:a,sticker:i,contact:s,poll:f,invoice:l}=t.content;if(t.groupedId)return`${n?"":"🖼 "}${r?r.text:e("lng_in_dlg_album")}`;if(u)return`${n?"":"🖼 "}${r?r.text:e("AttachPhoto")}`;if(d)return`${n?"":"📹 "}${r?r.text:e(d.isGif?"AttachGif":"AttachVideo")}`;if(i)return`${i.emoji} ${e("AttachSticker")} `;if(o){return`${n?"":"🎧 "}${[o.title,o.performer].filter(Boolean).join(" — ")||r&&r.text||e("AttachMusic")}`}return c?`${n?"":"🎤 "}${r?r.text:e("AttachAudio")}`:a?`${n?"":"📎 "}${r?r.text:a.fileName}`:s?e("AttachContact"):f?`${n?"":"📊 "}${f.summary.question}`:l?"Invoice":r?r.text:"The message is not supported on this version of Telegram"}function b(e){const{text:t,sticker:n,photo:r,video:u,audio:d,voice:o,document:c,poll:a,webPage:i,contact:s,invoice:f}=e.content;return t?t.text:n||r||u||d||o||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:d,voice:o,document:a,poll:i,webPage:s,contact:f}=e.content;return!!(n||u&&u.isRound)||!(!t||r||u||d||o||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===d.ApiMessageEntityTypes.TextUrl);if(e&&(n=e.url.match(a)),!n&&(e=t.entities.find(e=>e.type===d.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 I(e){return!!e.content.action}function w(e){return e.chatId===o.nb&&E(e)}function O(e){return Boolean(e.senderId)&&e.senderId<0&&g(e)}function j(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>=o.K}function S(e){return e.content.action&&"historyClear"===e.content.action.type}var M=n(7),A=n(55);function k(e){return e.content}function N(e){return Boolean(T(e)||P(e)||x(e)||B(e)||function(e){return e.content.contact}(e)||R(e)||L(e)||F(e)||function(e){return e.content.voice}(e))}function T(e){return e.content.photo}function P(e){return e.content.video}function D(e){const{video:t}=e.content;return t&&t.isRound?t:void 0}function L(e){return e.content.action}function F(e){return e.content.audio}function B(e){return e.content.sticker}function x(e){return e.content.document}function R(e){return e.content.poll}function U(e){return e.content.invoice}function _(e){return e.content.webPage}function G(e){const t=_(e);return t?t.photo:void 0}function $(e){const t=function(e){const t=T(e)||P(e)||x(e)||B(e)||G(e);if(t)return t.thumbnail}(e);return t?t.dataUri:void 0}function W(e,t){const{photo:n,video:r,sticker:u,audio:d,voice:o,document:c}=e.content,a=G(e);if(!(n||r||u||a||d||o||c))return;const s=i(e);if(n||a)switch(t){case"micro":case"pictogram":return s+"?size=m";case"inline":if(V(e))return;return s+"?size=x";case"viewerPreview":return s+"?size=x";case"viewerFull":return s+"?size=z"}if(r)switch(t){case"micro":case"pictogram":return s+"?size=m";case"inline":if(V(e))return;return q(r)?H(r,s):s+"?size=z";case"viewerPreview":return s+"?size=m";case"viewerFull":return H(r,s);case"download":return s+"?download"}if(c)switch(t){case"micro":case"pictogram":case"inline":if(!Object(A.c)(c)||V(e))return;return s+"?size=m";default:return s}if(u)switch(t){case"micro":return;case"pictogram":return s+"?size=m";default:return s}if(d)switch(t){case"micro":case"pictogram":return;default:return H(d,s)}if(o)switch(t){case"micro":case"pictogram":return;default:return s}}function H(e,t){return M.i&&M.j?`${t}?fileSize=${e.size}&mimeType=${e.mimeType}`:t}function K(e,t){const{sticker:n,video:r,audio:u,voice:o}=e.content;return n&&"inline"===t&&n.isAnimated?d.ApiMediaFormat.Lottie:r&&M.i&&("viewerFull"===t||"inline"===t&&q(r))?d.ApiMediaFormat.Progressive:u||o?o&&!M.h?d.ApiMediaFormat.BlobUrl:d.ApiMediaFormat.Progressive:d.ApiMediaFormat.BlobUrl}function z(e){const{photo:t,video:n,webPage:r}=e.content;return t||r&&r.photo?`photo${e.date}.jpeg`:n?n.fileName:void 0}function V(e){const{photo:t,video:n,document:r}=e.content;return t&&t.blobUrl||n&&n.blobUrl||r&&r.previewBlobUrl}function q(e){return e.isGif||e.isRound||e.size<=10485760}function J(e,t,n=!1){const r=ee(e,t,"media");return n?r.reverse():r}function Y(e){return e.sizes.find(e=>"z"===e.type)||e.sizes.find(e=>"y"===e.type)||Q(e)}function Q(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 Z(e){if(e.width&&e.height)return e}function X(e,t,n=!1){const r=E(e);return{isUploading:r,isTransferring:r||n,transferProgress:Number(t)}}function ee(e,t,n){let r;switch(n){case"media":r=e=>{const t=P(e);return T(e)||t&&!t.isRound&&!t.isGif};break;case"documents":r=x;break;case"links":r=e=>_(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;default:return[]}return t.reduce((t,n)=>(e[n]&&r(e[n])&&t.push(n),t),[])}function te(e){const{audio:t,voice:n,video:r}=k(e),u=t||n||r;if(u)return u.duration}function ne(e,t){return`${e}_${t}`}n(56)},function(e,t,n){"use strict";var r=n(63);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(64);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 d=n(65);n.d(t,"ApiMessageEntityTypes",(function(){return d.a})),n.d(t,"MAIN_THREAD_ID",(function(){return d.b})),n.d(t,"MESSAGE_DELETED",(function(){return d.c}));var o=n(66);n.o(o,"ApiMediaFormat")&&n.d(t,"ApiMediaFormat",(function(){return o.ApiMediaFormat}));var c=n(67);n.d(t,"ApiMediaFormat",(function(){return c.a}));n(68),n(69)},function(e,t,n){"use strict";n.d(t,"S",(function(){return De})),n.d(t,"mb",(function(){return Le})),n.d(t,"V",(function(){return Fe})),n.d(t,"Fb",(function(){return a})),n.d(t,"f",(function(){return f})),n.d(t,"o",(function(){return l})),n.d(t,"O",(function(){return b})),n.d(t,"N",(function(){return h})),n.d(t,"zb",(function(){return m})),n.d(t,"n",(function(){return p})),n.d(t,"g",(function(){return g})),n.d(t,"K",(function(){return y})),n.d(t,"d",(function(){return v})),n.d(t,"L",(function(){return I})),n.d(t,"j",(function(){return w})),n.d(t,"i",(function(){return O})),n.d(t,"M",(function(){return j})),n.d(t,"h",(function(){return C})),n.d(t,"q",(function(){return E})),n.d(t,"y",(function(){return P})),n.d(t,"r",(function(){return D})),n.d(t,"m",(function(){return L})),n.d(t,"pb",(function(){return F})),n.d(t,"X",(function(){return x})),n.d(t,"fb",(function(){return R})),n.d(t,"x",(function(){return U})),n.d(t,"Gb",(function(){return _})),n.d(t,"ib",(function(){return G})),n.d(t,"nb",(function(){return $})),n.d(t,"qb",(function(){return W})),n.d(t,"lb",(function(){return H})),n.d(t,"C",(function(){return K})),n.d(t,"E",(function(){return z})),n.d(t,"B",(function(){return V})),n.d(t,"bb",(function(){return q})),n.d(t,"Bb",(function(){return J})),n.d(t,"F",(function(){return Y})),n.d(t,"Cb",(function(){return Q})),n.d(t,"Db",(function(){return Z})),n.d(t,"Ab",(function(){return X})),n.d(t,"a",(function(){return ee})),n.d(t,"W",(function(){return te})),n.d(t,"k",(function(){return ne})),n.d(t,"ob",(function(){return re})),n.d(t,"D",(function(){return ue})),n.d(t,"l",(function(){return de})),n.d(t,"H",(function(){return oe})),n.d(t,"T",(function(){return ce})),n.d(t,"eb",(function(){return ae})),n.d(t,"sb",(function(){return ie})),n.d(t,"J",(function(){return se})),n.d(t,"b",(function(){return fe})),n.d(t,"e",(function(){return le})),n.d(t,"Eb",(function(){return be})),n.d(t,"kb",(function(){return he})),n.d(t,"G",(function(){return me})),n.d(t,"Q",(function(){return pe})),n.d(t,"p",(function(){return ge})),n.d(t,"R",(function(){return ye})),n.d(t,"U",(function(){return ve})),n.d(t,"I",(function(){return Ie})),n.d(t,"Z",(function(){return we})),n.d(t,"P",(function(){return Oe})),n.d(t,"rb",(function(){return je})),n.d(t,"ab",(function(){return Ce})),n.d(t,"tb",(function(){return Ee})),n.d(t,"ub",(function(){return Se})),n.d(t,"vb",(function(){return Me})),n.d(t,"t",(function(){return Be})),n.d(t,"A",(function(){return Ae})),n.d(t,"w",(function(){return ke})),n.d(t,"v",(function(){return Ne})),n.d(t,"Y",(function(){return Te})),n.d(t,"u",(function(){return Pe})),n.d(t,"z",(function(){return M})),n.d(t,"s",(function(){return A})),n.d(t,"wb",(function(){return k})),n.d(t,"xb",(function(){return N})),n.d(t,"c",(function(){return T})),n.d(t,"gb",(function(){return xe})),n.d(t,"hb",(function(){return Re})),n.d(t,"jb",(function(){return Ue})),n.d(t,"yb",(function(){return _e})),n.d(t,"db",(function(){return i})),n.d(t,"cb",(function(){return s}));var r=n(19),u=n(7),d=n(5),o=n(1),c=n(4);function a(e,t){return e.users.byId[t]}function i(e){return e.settings.byKey}function s(e){return e.settings.notifyExceptions}function f(e,t){return e.chats.byId[t]}function l(e,t){const n=Object(c.U)(t);return!!n&&a(e,n)}function b(e,t){return t===e.currentUserId}function h(e,t){const n=l(e,t);return n&&Object(c.wb)(n)}function m(e){return Object.values(e.chats.byId).find(({isSupport:e})=>e)}function p(e,t){if(!Object(c.lb)(t.id)&&!Object(c.jb)(t)&&t.fullInfo)return t.fullInfo.members&&t.fullInfo.members.length!==o.R?t.fullInfo.members.reduce((t,{userId:n})=>e.users.byId[n]&&Object(c.xb)(e.users.byId[n])&&n!==e.currentUserId?t+1:t,0):t.fullInfo.onlineCount}function g(e,t){const n=f(e,t),r=n&&Object(c.U)(n),u=r&&a(e,r);if(u&&Object(c.wb)(u))return u}function y(e,t){const n=f(e,t),r=g(e,t);if(!n||!r)return!1;if(n.lastMessage&&Object(c.rb)(n.lastMessage))return!0;const u=e.messages.byChatId[t];if(!u)return!1;const{listedIds:o}=u.threadsById[d.MAIN_THREAD_ID]||{};return o&&!o.length}function v(e){return Boolean(e.chats.listIds.active)}function I(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=f(e,t);if(n&&I(e,t))return n.folderId===o.h?"archived":"active"}function O(e,t){return e.chatFolders.byId[t]}function j(e,t,n=o.b){const{active:r,archived:u}=e.chats.orderedPinnedIds;if(n===o.b)return!!r&&r.includes(t);if(n===o.h)return!!u&&u.includes(t);const{byId:d}=e.chatFolders,{pinnedChatIds:c}=d[n]||{};return!!c&&c.includes(t)}function C(e,t){const n=t.toLowerCase();return Object.values(e.chats.byId).find(e=>e.username&&e.username.toLowerCase()===n)}function E(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.Cb)(u,i(e),s(e))?t+u.unreadCount:t},0)}var S=n(3);function M(e){return e.stickers.search}function A(e){return e.gifs.search}function k(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 T(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 P(e){const{messageLists:t}=e.messages;if(t&&t.length)return t[t.length-1]}function D(e){const{chatId:t}=P(e)||{};return t?f(e,t):void 0}function L(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 d=u.threadsById[n];return d?d[r]:void 0}function x(e,t,n){return B(e,t,n,"listedIds")}function R(e,t,n){return B(e,t,n,"outlyingIds")}function U(e,t,n,r){switch(r){case"thread":return _(e,t,n);case"pinned":return G(e,t);case"scheduled":return $(e,t)}}function _(e,t,n){return B(e,t,n,"viewportIds")}function G(e,t){return B(e,t,d.MAIN_THREAD_ID,"pinnedIds")}function $(e,t){return B(e,t,d.MAIN_THREAD_ID,"scheduledIds")}function W(e,t,n){return B(e,t,n,"scrollOffset")}function H(e,t,n){return B(e,t,n,"replyingToId")}function K(e,t,n){return B(e,t,n,"editingId")}function z(e,t){return B(e,t,d.MAIN_THREAD_ID,"editingScheduledId")}function V(e,t,n){return B(e,t,n,"draft")}function q(e,t,n){return B(e,t,n,"noWebPage")}function J(e,t,n){return B(e,t,n,"threadInfo")}function Y(e,t,n){return B(e,t,n,"firstMessageId")}function Q(e,t,n){if(n===d.MAIN_THREAD_ID)return f(e,t);const r=J(e,t,n);return r?f(e,r.originChannelId||t):void 0}function Z(e,t,n){if(n===d.MAIN_THREAD_ID)return;const r=J(e,t,n);return r?r.topMessageId:void 0}function X(e,t,n){const r=e.messages.byChatId[t];if(!r)return;const{replyToMessageId:u,replyToTopMessageId:d}=n;return u||d?Object.values(r.threadsById).find(e=>e.threadInfo&&(u&&u===e.threadInfo.topMessageId||d&&d===e.threadInfo.topMessageId)):void 0}function ee(e,t,n){const r=P(e);if(!r)return!1;const{threadInfo:u}=X(e,t,n)||{};return t===r.chatId&&(r.threadId===d.MAIN_THREAD_ID||u&&r.threadId===u.threadId)}function te(e,t,n){const r=_(e,t,n);if(!r||!r.length)return!0;let u;if(n===d.MAIN_THREAD_ID){const n=f(e,t);if(!n||!n.lastMessage)return!0;u=n.lastMessage.id}else{const r=J(e,t,n);if(!r||!r.lastMessageId)return;u=r.lastMessageId}return u>=o.K&&!ne(e,t,u)||r[r.length-1]>=u}function ne(e,t,n){const r=L(e,t);return r?r[n]:void 0}function re(e,t,n){const r=F(e,t);return r?r[n]:void 0}function ue(e,t,n,r){if("scheduled"===r){const n=z(e,t);return n?re(e,t,n):void 0}{const r=K(e,t,n);return r?ne(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 oe(e,t){const{chatId:n,messageId:r}=e.focusedMessage||{};return n===t?r:void 0}function ce(e,t){const n=oe(e,t.chatId);return!!n&&(n===t.id||n===t.previousLocalId)}function ae(e,t,n=!1){return function(e,t){const{lastReadOutboxMessageId:n}=f(e,t.chatId)||{};return Object(c.sb)(t)||!n||n0?a(e,n):f(e,n)}function se(e,t){const{forwardInfo:n}=t;if(n)return n.isChannelPost&&n.fromChatId?f(e,n.fromChatId):n.senderUserId?a(e,n.senderUserId):void 0}function fe(e,t,n){const r=f(e,t.chatId);if(!r||r.isRestricted)return{};const u=Object(c.lb)(r.id),d=b(e,t.chatId),o=Object(c.ib)(r),a=Object(c.nb)(r),i=Object(c.jb)(r),s=Object(c.vb)(t),l=Object(c.tb)(t),h=Object(c.db)(t),{content:m}=t,p=(d||Date.now()-1e3*t.date<1728e5)&&!(m.sticker||m.contact||m.poll||m.action||m.audio||m.video&&m.video.isRound)&&!Object(c.qb)(t)&&!t.viaBotId,g=Object(c.e)(r,n)&&!s,y=u||r.isCreator||!i&&!Object(c.yb)(r,"pinMessages")||Object(c.q)(r,"pinMessages");let v=!h&&y,I=!1;const w=G(e,r.id);v&&(I=Boolean(w&&w.includes(t.id)),v=!I);const O=u||l||o||r.isCreator||Object(c.q)(r,"deleteMessages"),j=O&&!s&&(u&&!d||o&&(l||Object(c.q)(r,"deleteMessages"))),C=!h&&p&&(l||i&&(r.isCreator||Object(c.q)(r,"editMessages"))),E=!h&&!s,S=Boolean(t.content.sticker),M=S&&function(e,t){const{stickers:n}=e.stickers.favorite;return n&&n.some(({id:e})=>e===t.id)}(e,t.content.sticker),A=!h&&S&&!M,k=!h&&M,N=!h,T=!h&&(i||a),P=!h;return{noOptions:[g,C,v,I,O,j,E,A,k,N,T,P].every(e=>!e),canReply:g,canEdit:C,canPin:v,canUnpin:I,canDelete:O,canDeleteForAll:j,canForward:E,canFaveSticker:A,canUnfaveSticker:k,canCopy:N,canCopyLink:T,canSelect:P}}function le(e){const{messageIds:t}=e.selectedMessages||{},{chatId:n,threadId:r}=P(e)||{},u=n&&L(e,n);if(!u||!t||!r)return{};const d=t.map(t=>u[t]&&fe(e,u[t],r)).filter(Boolean);return{canDelete:d.every(e=>e.canDelete),canDeleteForAll:d.every(e=>e.canDeleteForAll)}}function be(e,t){const n=e.fileUploads.byMessageLocalId[t.previousLocalId||t.id];return n?n.progress:void 0}function he(e,t,n){if(n===d.MAIN_THREAD_ID){const n=f(e,t);if(!n)return;if(!n.lastReadInboxMessageId)return;return n.lastMessage?Object(c.sb)(n.lastMessage)?n.lastMessage.id:Math.min(n.lastMessage.id,n.lastReadInboxMessageId):n.lastReadInboxMessageId}{const r=J(e,t,n);if(!r)return;return r.lastReadInboxMessageId?Math.min(r.lastReadInboxMessageId,r.lastMessageId||1/0):r.topMessageId}}function me(e,t,n){const r=f(e,t);if(n===d.MAIN_THREAD_ID){if(!r)return}else{const r=J(e,t,n);if(!r||r.lastMessageId===r.lastReadInboxMessageId)return}const u=R(e,t,n),o=x(e,t,n),c=L(e,t);if(!c||!u&&!o)return;const a=he(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(o){const e=a?o.find(e=>e>a&&c[e]&&(!c[e].isOutgoing||c[e].isFromScheduled)):o[0];if(e)return e}}}function pe(e){const{forwardMessages:t}=e;return Boolean(t.isModalShown)}function ge(e,t){const n=Object.values(e.chats.byId).find(e=>Object(c.ob)(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=f(e,Number(n));return u&&Object(c.ob)(u)&&r[u.id].byId[t]}))}function ye(e){const{selectedMessages:t}=e;return Boolean(t)}function ve(e,t){const{messageIds:n}=e.selectedMessages||{};return!!n&&n.includes(t)}function Ie(e,t,n){const r=L(e,t);if(r)return Object.values(r).filter(e=>e.groupedId===n&&e.forwardInfo).map(({forwardInfo:e})=>e.fromMessageId)}function we(e,t,n){const r=L(e,t);if(r)return Object.keys(r).map(Number).filter(e=>r[e].groupedId===n)}function Oe(e,t,n){const{messageIds:r}=e.selectedMessages||{};if(!r)return!1;const u=we(e,t,n);return u&&u.every(e=>r.includes(e))}function je(e){const{messageIds:t}=e.selectedMessages||{};return t?t.length:0}function Ce(e,t){const n=f(e,t);if(!n)return;if(!h(e,n))return;const r=L(e,t),u=_(e,t,d.MAIN_THREAD_ID);if(!r||!u)return;const o=Object(S.g)(u,e=>!r[e].isOutgoing&&Boolean(r[e].keyboardButtons)),c=Object(S.g)(u,e=>Boolean(r[e].shouldHideKeyboardButtons));return o&&c&&c>o?void 0:o?r[o]:void 0}function Ee(e,t,n,r){const{shouldAutoDownloadMediaFromContacts:u,shouldAutoDownloadMediaInPrivateChats:d,shouldAutoDownloadMediaInGroups:o,shouldAutoDownloadMediaInChannels:a}=e.settings.byKey;return Boolean(d&&Object(c.lb)(n.id)||o&&Object(c.kb)(n)||a&&Object(c.jb)(n)||u&&r&&(r.id===e.currentUserId||function(e,t){return e.contactList&&e.contactList.userIds.includes(t.id)}(e,r)))}function Se(e,t){const n=Object(c.P)(t);if(!n)return;const{shouldAutoPlayVideos:r,shouldAutoPlayGifs:u}=e.settings.byKey,d=n.isGif||n.isRound;return r&&!d||u&&d}function Me(e){return e.settings.byKey.shouldLoopStickers}function Ae(e){const{chatId:t,threadId:n}=P(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 ke(e){const{byChatId:t}=e.localMediaSearch,{chatId:n}=P(e)||{},r=e.users.selectedId;return r&&t[r]?r:n}function Ne(e){const t=ke(e);if(t)return e.localMediaSearch.byChatId[t]}function Te(e,t){return e.management.byChatId[t]}function Pe(e){const{chatId:t,threadId:n}=P(e)||{};if(!t||!n)return;if(Object(c.lb)(t))return"user";const r=f(e,t);return r?Object(c.kb)(r)?"group":"channel":void 0}function De(e){const{mediaViewer:t}=e;return Boolean(t.messageId||t.avatarOwnerId)}function Le(e){const{users:t,isChatInfoShown:n}=e,d=function(e){const{pollResults:t}=e;return Boolean(t.messageId)}(e),o=Boolean(!u.g&&Ae(e)),c=function(e){const{chatId:t,threadId:n}=P(e)||{};if(!t||!n)return;const r=e.management.byChatId[t];return r&&r.isActive?r:void 0}(e),a=void 0!==M(e).query,i=void 0!==A(e).query,{chatId:s}=P(e)||{},f=t.selectedId,l=v(e),b=Boolean(f&&l),h=Boolean(s&&l)&&n;return d?r.l.PollResults:o?r.l.Search:c?r.l.Management:a?r.l.StickerSearch:i?r.l.GifSearch:b?r.l.UserInfo:h?r.l.ChatInfo:void 0}function Fe(e){return void 0!==Le(e)}function Be(e){return e.globalSearch.query}function xe(e){return e.payment.messageId}function Re(e){return e.payment.formId}function Ue(e){return e.payment.nativeParams?e.payment.nativeParams.publishableKey:void 0}function _e(e){return e.payment.stripeCredentials}},function(e,t,n){"use strict";n.d(t,"o",(function(){return u})),n.d(t,"f",(function(){return d})),n.d(t,"e",(function(){return o})),n.d(t,"b",(function(){return c})),n.d(t,"j",(function(){return a})),n.d(t,"l",(function(){return i})),n.d(t,"g",(function(){return s})),n.d(t,"m",(function(){return f})),n.d(t,"d",(function(){return l})),n.d(t,"k",(function(){return b})),n.d(t,"i",(function(){return h})),n.d(t,"h",(function(){return m})),n.d(t,"c",(function(){return p})),n.d(t,"a",(function(){return g})),n.d(t,"n",(function(){return y})),n.d(t,"p",(function(){return I}));var r=n(1);const u=function(){const{userAgent:e,platform:t}=window.navigator;let n;return-1!==["Macintosh","MacIntel","MacPPC","Mac68K"].indexOf(t)?n="Mac OS":-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}(),d="Mac OS"===u,o="iOS"===u,c="Android"===u,a=/^((?!chrome|android).)*safari/i.test(navigator.userAgent),i=window.matchMedia("(pointer: coarse)").matches,s=window.innerWidth<=r.eb||window.innerWidth<=r.db&&window.innerHeight<=r.cb,f=navigator.mediaDevices&&"getUserMedia"in navigator.mediaDevices&&(window.AudioContext||window.webkitAudioContext),l=(document.documentElement.style,u&&(d||o)),b="serviceWorker"in navigator,h=b,m=(window,Boolean((new Audio).canPlayType("audio/ogg; codecs=opus"))),p="filter"in(document.createElement("canvas").getContext("2d")||{}),g=window.devicePixelRatio||1,y=!0;let v;function I(){return Boolean(v)}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=>{v=e})},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(...d)=>{u?(clearTimeout(u),u=void 0):n&&e(...d),u=self.setTimeout(()=>{r&&e(...d),u=void 0},t)}}function u(e,t,n=!0){let r,u,d;return(...o)=>{u=!0,d=o,r||(n&&(u=!1,e(...d)),r=self.setInterval(()=>{if(!u)return self.clearInterval(r),void(r=void 0);u=!1,e(...d)},t))}}function d(e){return c(h,e)}function o(e){return c(m,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,"g",(function(){return u})),n.d(t,"i",(function(){return d})),n.d(t,"h",(function(){return o})),n.d(t,"d",(function(){return a})),n.d(t,"c",(function(){return i})),n.d(t,"e",(function(){return s})),n.d(t,"f",(function(){return f})),n.d(t,"b",(function(){return h}));const s=e=>new Promise(t=>{setTimeout(()=>t(),e)});function f(){return new Promise(e=>{h(e)})}let l,b;function h(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 m(e){h(e,!0)}},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(74),u=n.n(r),d=n(1),o=n(25);let c;const a=new Map,i=new Map;function s(e,t=""){return c||(d.p&&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});d.p&&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(o.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,"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(1);let u;!function(e){e[e.Auth=0]="Auth",e[e.Main=1]="Main",e[e.Extra=2]="Extra"}(u||(u={}));const d={},o={};async function c(e,t){if(!d[e]){switch(e){case u.Auth:d[u.Auth]=n.e(5).then(n.bind(null,98));break;case u.Main:r.p&&console.log(">>> START LOAD MAIN BUNDLE"),d[u.Main]=Promise.all([n.e(0),n.e(4)]).then(n.bind(null,97));break;case u.Extra:d[u.Extra]=Promise.all([n.e(0),n.e(3)]).then(n.bind(null,96))}d[e].then(f)}const c=await d[e];return o[e]||(o[e]=c),a(e,t)}function a(e,t){const n=o[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";n.d(t,"a",(function(){return u})),n.d(t,"c",(function(){return d})),n.d(t,"d",(function(){return o})),n.d(t,"b",(function(){return c}));const r=self.caches;let u;async function d(e,t,n){if(r)try{const d=new Request(t),o=await r.open(e),c=await o.match(d);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 o(e,t,n){if(r)try{const u="string"==typeof n||n instanceof Blob?n:JSON.stringify(n),d=new Request(t),o=new Response(u),c=await r.open(e);return await c.put(d,o)}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";n.d(t,"d",(function(){return d})),n.d(t,"a",(function(){return o})),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(9);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 d(e){const t=e.split(","),n=t[0].match(/:(.*?);/)[1],r=atob(t[1]);let u=r.length;const d=new Uint8Array(u);for(;u--;)d[u]=r.charCodeAt(u);return new Blob([d],{type:n})}function o(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.e)(2e3),new Promise((e,n)=>{t.onseeked=()=>{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";n.d(t,"b",(function(){return d}));const r=/\uFE0F/g,u=String.fromCharCode(8205);function d(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(20);n(87);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(11),d=n(35);t.a=(e,t,n=!1,o=!1)=>{const c=Object(u.c)(e,t),a=Object(d.a)();return o&&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";n.d(t,"d",(function(){return o})),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 d}));const r={},u=/(\d{1,3})(\d{1,3})?(\d{1,3})?(\d{1,3})?(\d{1,3})?/;var d="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 Caledonia\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 o(e){return d.find(t=>t.id===e)}function c(e){let t=e.replace(/[^\d+]+/g,"");t.startsWith("+")||(t="+"+t);const n=d.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,d,o)=>{const c=t&&"GB"===t.id?" ":"-";let a="";return n&&(a=""+n),r&&(a+=" "+r),u&&(a+=`${c}${u}`),d&&(a+=`${c}${d}`),o&&(a+=`${c}${o}`),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";n.d(t,"a",(function(){return y})),n.d(t,"c",(function(){return O})),n.d(t,"b",(function(){return j}));var r=n(1),u=n(12),d=n(10);var o=n(3),c=n.p+"en-extra.e73049da90714ecdae3233e8ffa74d39.json",a=n.p+"es-extra.b80575cdf988e1a7e3a915abe97f63b4.json",i=n.p+"it-extra.78e5568451a888818c7e2209e05a9602.json",s=n.p+"pl-extra.38fd67a6c26e58f5c912568332c7c074.json",f=n.p+"ru-extra.5761b75bfbe92bb46eb8bba9acbdbb4c.json",l=n(46);const b={en:c,es:a,it:i,pl:s,ru:f},h=["value","zeroValue","oneValue","twoValue","fewValue","manyValue","otherValue"],m={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},p=new Map;let g;const{addCallback:y,removeCallback:v,runCallbacks:I}=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 w;async function O(e,t){if(g&&e===w)return document.documentElement.lang=e,void(t&&t());const n=await async function(e){const t=await u.c(r.G,e,u.a.Json);if(t)return t;const n=await Object(d.a)("fetchLangPack",{sourceLangPacks:r.H,langCode:e});if(n)return await u.d(r.G,e,n.langPack),n.langPack;return}(e);if(n){if(b[e])try{const t=await fetch(b[e]),r=await t.json(),u=Object(o.i)(r,(e,t)=>({key:t,value:e}));Object.assign(n,u)}catch(e){r.p&&console.error(e)}p.clear(),w=e,g=n,document.documentElement.lang=e,t&&t(),I(g)}}function j(e,t,n){if(void 0!==t){const r=p.get(`${e}_${t}_${n}`);if(r)return r}if(!g)return e;const r=g[e];if(!r)return e;const u=r["number"==typeof t?function(e){const t=w&&m[w]?m[w](e):0;return h[t]}(t):"value"];if(!u||!u.trim()){const t=e.split(".");return t[t.length-1]}if(void 0!==t){const r=function(e,t){return e.replace(/%\d?\$?[sdf@]/,String(t))}(u,"i"===n?Object(l.a)(t):t);return p.set(`${e}_${t}_${n}`,r),r}return u}},function(e,t,n){"use strict";let r,u,d,o,c,a,i,s,f,l,b,h;n.d(t,"e",(function(){return r})),n.d(t,"b",(function(){return u})),n.d(t,"m",(function(){return d})),n.d(t,"d",(function(){return o})),n.d(t,"c",(function(){return c})),n.d(t,"l",(function(){return a})),n.d(t,"h",(function(){return i})),n.d(t,"a",(function(){return s})),n.d(t,"j",(function(){return f})),n.d(t,"f",(function(){return l})),n.d(t,"k",(function(){return b})),n.d(t,"i",(function(){return h})),n.d(t,"n",(function(){return m})),n.d(t,"g",(function(){return p})),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"}(d||(d={})),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"}(o||(o={})),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"}(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.Profile=0]="Profile",e[e.SharedMedia=1]="SharedMedia",e[e.MemberList=2]="MemberList"}(b||(b={})),function(e){e[e.ShippingInfo=0]="ShippingInfo",e[e.Shipping=1]="Shipping",e[e.PaymentInfo=2]="PaymentInfo",e[e.Checkout=3]="Checkout"}(h||(h={}));const m="UPLOADING_WALLPAPER_SLUG";let p;!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"}(p||(p={}))},function(e,t,n){"use strict";var r=n(0),u=n(8);n(83);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 a}));var r=n(1),u=n(9);window.addEventListener("error",c),window.addEventListener("unhandledrejection",c);const d=Date.now();let o=!1;function c(e){e.preventDefault(),a(e instanceof ErrorEvent?e.error:e.reason)}Object(u.g)(window.alert,1e3);function a(e){if(console.error(e),!o)return Date.now()-d<=5e3&&localStorage.getItem(r.B)?(localStorage.removeItem(r.B),o=!0,void window.location.reload()):void 0}},function(e,t,n){"use strict";n.d(t,"a",(function(){return b}));var r=n(0),u=n(14),d=n(1),o=n(7),c=n(60),a=n(8),i=n(70),s=n(53);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 d=e,o=n.highlight,d.reduce((e,t)=>{if("string"!=typeof t||!o)return[...e,t];const n=t.toLowerCase(),u=n.indexOf(o.toLowerCase()),d=n[u+o.length];if(u<0||d&&d.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+o.length))),c.push(t.substring(u+o.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)||[],...t.match(g)||[]];if(!n.length)return[...e,t];const u=[];let d=n.shift(),o=0;for(;d;){const e=t.indexOf(d,o);u.push(t.substring(o,e)),d.startsWith("@")?u.push(r.a.createElement(i.a,{username:d},d)):(d.endsWith("?")&&(d=d.slice(0,d.length-1)),u.push(r.a.createElement(s.a,{text:d,url:d}))),o=e+d.length,d=n.shift()}return u.push(t.substring(o)),[...e,...u]},[])}(e);case"simple_markdown":return y(e,"jsx");case"simple_markdown_html":return y(e,"html")}var d,o;return e},[e])}function h(e,t,n){return e.reduce((e,d)=>{if("string"!=typeof d)return[...e,d];const i=d.split(u.a),s=d.match(u.a)||[];return e.push(i[0]),s.reduce((e,d,s)=>{const f=Object(c.a)(Object(u.b)(d)),l=Object(a.a)("emoji","small"===t&&"emoji-small");"jsx"===n&&e.push(o.d?r.a.createElement("span",{className:"font-emoji"},d):r.a.createElement("img",{className:l,src:`./img-apple-${"big"===t?"160":"64"}/${f}.png`,alt:d})),"html"===n&&e.push(o.d?d:`${d}`);const b=2*s+2;return i[b]&&e.push(i[b]),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,d)=>{const o=n.trimLeft(),c=n.length-o.length;return e.push(String.fromCharCode(160).repeat(c)+o),u!==d.length-1&&e.push("jsx"===t?r.a.createElement("br",null):"
"),e},[])],[])}const p=new RegExp(d.hb,"ig"),g=/@[\w\d_-]+/gi;function y(e,t){return e.reduce((e,n)=>{if("string"!=typeof n)return[...e,n];const u=n.split(l),d=n.match(l)||[];return e.push(u[0]),d.reduce((e,n,d)=>{"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 o=2*d+2;return u[o]&&e.push(u[o]),e},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;ue[n]!==t[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),u=n(8);n(81);t.a=({children:e,className:t,onClick:n})=>{const d=Object(r.m)(e=>{e.preventDefault(),n(e)},[n]);return r.a.createElement("a",{href:"#",className:Object(u.a)("Link",t),dir:"auto",onClick:n?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 g})),n.d(t,"b",(function(){return y})),n.d(t,"a",(function(){return v}));var r=n(10),u=n(62),d=n(1),o=n(2),c=n(4),a=n(18),i=n(34),s=n(6),f=n(7);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?(d.p&&console.warn("[PUSH] The user has blocked push notifications."),!1):"PushManager"in window||(d.p&&console.warn("[PUSH] Push messaging isn't supported."),!1):(d.p&&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(o.e)(),n=Object(o.d)();if(e)try{const t=l(e);return await Object(r.a)("unregisterDevice",t),await e.unsubscribe(),void n.deleteDeviceToken()}catch(e){d.p&&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)}async function g(){if(async function(){const[e]=await Promise.all([Object(r.a)("fetchNotificationSettings"),Object(r.a)("fetchNotificationExceptions")]);e&&Object(o.g)(Object(i.v)(Object(o.e)(),e))}(),!b())return void await h();const e=await navigator.serviceWorker.ready;let t=await e.pushManager.getSubscription();if(function(e){const t=Object(o.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);d.p&&console.log("[PUSH] Received push subscription: ",n),await Object(r.a)("registerDevice",n),Object(o.d)().setDeviceToken(n)}catch(e){"denied"===Notification.permission?d.p&&console.warn("[PUSH] The user has blocked push notifications."):d.p&&(console.log("[PUSH] Unable to subscribe to push.",e),e.code===DOMException.ABORT_ERR&&await h())}}}function y({chat:e,message:t,isActiveChat:n}){if(!("Notification"in window?"denied"!==Notification.permission||(d.p&&console.warn("[PUSH] The user has blocked push notifications."),0):(d.p&&console.warn("[PUSH] This browser does not support desktop notification"),0)))return;if(!t.id)return;if(!function(e,t){const n=Object(o.e)();if(Object(c.Cb)(e,Object(s.db)(n),Object(s.cb)(n))||e.isNotJoined)return!1;if(t&&document.hasFocus())return!1;switch(e.type){case"chatTypePrivate":case"chatTypeSecret":return Boolean(n.settings.byKey.hasPrivateChatsNotifications);case"chatTypeBasicGroup":case"chatTypeSuperGroup":return Boolean(n.settings.byKey.hasGroupNotifications);case"chatTypeChannel":return Boolean(n.settings.byKey.hasBroadcastNotifications)}return!1}(e,n))return;const{title:r,body:i}=function(e,t){const n=Object(o.e)(),{senderId:r,replyToMessageId:d}=t,i=r?Object(s.Fb)(n,r):void 0,f=Object(c.t)(t),l=f&&d?Object(s.k)(n,e.id,d):void 0,{targetUserId:b,targetChatId:h}=f||{},m=b?Object(s.Fb)(n,b):void 0,p=Object(c.U)(e),g=p?Object(s.Fb)(n,p):void 0;let y;if(Object(c.db)(t)){const n=e&&(Object(c.jb)(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.J)(a.b,e.id,i),r=Object(c.N)(a.b,t);y=n?`${n}: ${r}`:r}return{title:Object(c.l)(a.b,e,g),body:y}}(e,t);if(b())navigator.serviceWorker.controller&&navigator.serviceWorker.controller.postMessage({type:"newMessageNotification",payload:{title:r,body:i,chatId:e.id,messageId:t.id}});else{const n=Object(o.d)(),u={body:i,icon:"icon-192x192.png",badge:"icon-192x192.png",tag:t.id.toString()};"vibrate"in navigator&&(u.vibrate=[200,100,200]);const d=new Notification(r,u);d.onclick=()=>{d.close(),n.focusMessage({chatId:e.id,messageId:t.id}),window.focus&&window.focus()}}}function v(){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(1),u=n(33),d=n(3);const o=[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){if(t.id===r.nb)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:n}=t.status;if(!n)return e("LastSeen.Offline");const r=new Date,d=new Date(1e3*n);if(d>=r)return e("LastSeen.JustNow");const o=new Date(r.getTime()-d.getTime());if(o.getTime()/1e3<60)return e("LastSeen.JustNow");if(o.getTime()/1e3<3600){return e("LastSeen.MinutesAgo",Math.floor(o.getTime()/1e3/60))}const c=new Date;if(c.setHours(0,0,0,0),d>c){if(o.getTime()/1e3<21600){return e("LastSeen.HoursAgo",Math.floor(o.getTime()/1e3/60/60))}return e("LastSeen.TodayAt",Object(u.h)(d))}const a=new Date;return a.setDate(r.getDate()-1),c.setHours(0,0,0,0),d>a?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.nb&&("userStatusOnline"===n.type&&"userTypeBot"!==u))}function f(e){return!(!e.status||"userTypeBot"===e.type||e.id===r.nb)&&("userTypeDeleted"===e.type||"userTypeUnknown"===e.type)}function l(e){return"userTypeBot"===e.type}function b(e,t,n){return Object(d.k)(e,e=>{const r=Date.now()/1e3;if(n&&n.includes(e))return r+172800-(n.length-n.indexOf(e));const u=t[e];if(!u||!u.status)return 0;if("userStatusOnline"===u.status.type)return u.status.expires;if("userStatusOffline"===u.status.type&&u.status.wasOnline)return u.status.wasOnline;switch(u.status.type){case"userStatusRecently":return r-86400;case"userStatusLastWeek":return r-604800;case"userStatusLastMonth":return r-18144e3;default:return 0}},"desc")}function h(e){const t=e?Math.abs(e.id)%7:0;return o[t]}},function(e,t,n){"use strict";n.d(t,"w",(function(){return c})),n.d(t,"v",(function(){return a})),n.d(t,"t",(function(){return i})),n.d(t,"y",(function(){return s})),n.d(t,"u",(function(){return f})),n.d(t,"z",(function(){return l})),n.d(t,"j",(function(){return b})),n.d(t,"p",(function(){return h})),n.d(t,"i",(function(){return m})),n.d(t,"e",(function(){return p})),n.d(t,"f",(function(){return g})),n.d(t,"d",(function(){return y})),n.d(t,"x",(function(){return v})),n.d(t,"r",(function(){return I})),n.d(t,"m",(function(){return w})),n.d(t,"A",(function(){return O})),n.d(t,"c",(function(){return j})),n.d(t,"a",(function(){return C})),n.d(t,"o",(function(){return E})),n.d(t,"h",(function(){return S})),n.d(t,"g",(function(){return M})),n.d(t,"s",(function(){return A})),n.d(t,"D",(function(){return k})),n.d(t,"b",(function(){return N})),n.d(t,"C",(function(){return T})),n.d(t,"B",(function(){return P})),n.d(t,"l",(function(){return D})),n.d(t,"k",(function(){return L})),n.d(t,"q",(function(){return F})),n.d(t,"n",(function(){return B})),n.d(t,"E",(function(){return x}));var r=n(5),u=n(1),d=n(3),o=n(27);function c(e){return e>0}function a(e){return i(e)||s(e)}function i(e){return"chatTypeBasicGroup"===e.type}function s(e){return"chatTypeSuperGroup"===e.type}function f(e){return"chatTypeChannel"===e.type}function l(e){return"chatTypePrivate"===e.type||"chatTypeBasicGroup"===e.type}function b(e){switch(e.type){case"chatTypePrivate":return"PrivateChat";case"chatTypeBasicGroup":case"chatTypeSuperGroup":return"AccDescrGroup";case"chatTypeChannel":return"AccDescrChannel";default:return"Chat"}}function h(e){if("chatTypePrivate"===e.type||"chatTypeSecret"===e.type)return e.id}function m(e,t,n,r=!1){return r||n&&t.id===n.id&&n.isSelf?e("SavedMessages"):t.title||e("HiddenName")}function p(e){if(e.fullInfo)return e.fullInfo.about}function g(e){const{username:t}=e,{inviteLink:n}=e.fullInfo||{};return n&&n.length?n:t?"t.me/"+t:""}function y(e,t="normal"){if(e.avatarHash)switch(t){case"big":return`profile${e.id}?${e.avatarHash}`;default:return`avatar${e.id}?${e.avatarHash}`}}function v(e){return!e.lastMessage}function I(e){return Boolean(e.adminRights)}function w(e,t){return!!e.adminRights&&e.adminRights[t]}function O(e,t){return Boolean(e.currentUserBannedRights&&e.currentUserBannedRights[t]||e.defaultBannedRights&&e.defaultBannedRights[t])}function j(e,t){return t!==r.MAIN_THREAD_ID||!(e.isRestricted||e.migratedTo||e.isNotJoined)&&(!!e.isCreator||(!!c(e.id)||(f(e)?w(e,"postMessages"):I(e)||!O(e,"sendMessages"))))}function C(e,t=!1){if(!e)return{canAttachMedia:!1,canAttachPolls:!1,canSendStickers:!1,canSendGifs:!1,canAttachEmbedLinks:!1};const n=I(e);return{canAttachMedia:n||!O(e,"sendMedia"),canAttachPolls:(n||!O(e,"sendPolls"))&&(!c(e.id)||t),canSendStickers:n||!O(e,"sendStickers"),canSendGifs:n||!O(e,"sendGifs"),canAttachEmbedLinks:n||!O(e,"embedLinks")}}function E(e){return e.currentUserBannedRights&&e.currentUserBannedRights.sendMessages?"You are not allowed to send messages in this chat.":e.defaultBannedRights&&e.defaultBannedRights.sendMessages?"Sending messages is not allowed in this chat.":void 0}function S(e){if(e&&e.fullInfo)return e.fullInfo.slowMode}function M(e){return Math.max(e.joinDate||0,e.lastMessage?e.lastMessage.date:0)}function A(e){return e.folderId===u.h}function k(e,t,n){return!(n&&n[e.id]&&!n[e.id].isMuted)&&(e.isMuted||c(e.id)&&!t.hasPrivateChatsNotifications||f(e)&&!t.hasBroadcastNotifications||a(e)&&!t.hasGroupNotifications)}function N(e){return i(e)||(s(e)||f(e))&&e.isCreator}function T(e,t,n,r,u,d){const o=n.excludedChatIds?new Set(n.excludedChatIds):void 0,i=n.excludedChatIds?new Set(n.includedChatIds):void 0,s=n.excludedChatIds?new Set(n.pinnedChatIds):void 0;return[(d||Object.keys(e).map(Number)).filter(d=>function(e,t,n,r,u,d,o,i){if(d&&d.has(e.id))return!1;if(o&&o.has(e.id))return!0;if(i&&i.has(e.id))return!0;if(A(e)&&t.excludeArchived)return!1;if(t.excludeMuted&&k(e,r,u))return!1;if(!e.unreadCount&&!e.unreadMentionsCount&&!e.hasUnreadMark&&t.excludeRead)return!1;if(c(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(a(e))return!!t.groups;if(f(e))return!!t.channels}return!1}(e[d],n,t,r,u,o,i,s)),n.pinnedChatIds]}function P(e,t,n,r="all"){function u(e){if(!e||!e.lastMessage||e.migratedTo)return!1;switch(r){case"all":if(A(e))return!1;break;case"archived":if(!A(e))return!1}return!e.isRestricted&&!e.isNotJoined}const o=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(d.k)(n?o.filter(e=>!n.includes(e.id)):o,M,"desc")}}function D(e,t,n,r,u,d){const[o]=T(e,t,n,u,d,r),c=o.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||!k(e,u,d)&&(e.unreadCount||e.hasUnreadMark))}}function L(e,t,n,r,u,d,o){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,d){const[o,c]=T(e,t,n,u,d,r),{pinnedChats:a,otherChats:i}=P(e,o,c,"folder");return a.length+i.length}(t,n,r,u,d,o))}return g.bots?e("FilterBots"):g.groups?e("FilterGroups"):g.channels?e("FilterChannels"):g.contacts?e("FilterContacts"):g.nonContacts?e("FilterNonContacts"):void 0}function F(e){return!!e&&e.id<0}function B(e,t,n){if(n&&!c(t))return n.isSelf?e("FromYou"):Object(o.b)(n)}function x(e,t,n=!1,r){return Object(d.k)(e,e=>{const u=t[e];if(!u)return 0;let d=0;return u.lastMessage&&(d+=u.lastMessage.date),n&&u.isVerified&&(d+=3e9),r&&r.includes(e)&&(d+=Date.now()+(r.length-r.indexOf(e))),d},"desc")}},function(e,t,n){"use strict";var r=n(0),u=n(8),d=n(20),o=n(39);n(85);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:I,ariaLabel:w,href:O,download:j,disabled:C,ripple:E,faded:S,tabIndex:M})=>{let A=Object(r.q)(null);e&&(A=e);const[k,N]=Object(r.r)(!1),T=Object(u.a)("Button",m,b,h,p&&"round",g&&"pill",y&&"fluid",C&&"disabled",v&&"text",I&&"loading",E&&"has-ripple",S&&"faded",k&&"clicked"),P=Object(r.m)(e=>{!C&&n&&n(e),N(!0),setTimeout(()=>{N(!1)},400)},[C,n]),D=Object(r.m)(e=>{e.preventDefault(),!C&&a&&a(e)},[a,C]);return O?r.a.createElement("a",{ref:A,className:T,href:O,title:w,download:j,tabIndex:M},l,!C&&E&&r.a.createElement(o.a,null)):r.a.createElement("button",{ref:A,type:t,className:T,onClick:P,onContextMenu:c,onMouseDown:D,onMouseEnter:i&&!C?i:void 0,onMouseLeave:s&&!C?s:void 0,onFocus:f&&!C?f:void 0,"aria-label":w,title:w,tabIndex:M},I?r.a.createElement("div",null,r.a.createElement("span",null,"Please wait.."),r.a.createElement(d.a,{color:v?"blue":"white"})):l,!C&&E&&r.a.createElement(o.a,null))}},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(1);const u=new Set(["scroll","mouseenter","mouseleave"]),d={},o=new Map,c={};function a(e,t,n){const r=s(t,e);f(r,e)?function(e,t,n){c[e]||(c[e]=0,document.addEventListener(e,h));(function(e){d[e]||(d[e]=new Map);return d[e]})(e).set(t,n),function(e){const t=o.get(e);if(t)return t;const n=new Set;return o.set(e,n),n}(t).add(e),c[e]++}(r,e,n):e.addEventListener(r,n)}function i(e,t,n){const r=s(t,e);f(r,e)?l(r,e):e.removeEventListener(r,n)}function s(e,t){const n=e.replace(/^on/,"").toLowerCase();return"change"===n&&"SELECT"!==t.tagName?"input":"doubleclick"===n?"dblclick":"focus"===n?"focusin":"blur"===n?"focusout":n}function f(e,t){return!u.has(e)&&"VIDEO"!==t.tagName&&"IFRAME"!==t.tagName}function l(e,t){c[e]--,c[e]||document.removeEventListener(e,h),d[e].delete(t),o.get(t).delete(e)}function b(e){const t=o.get(e);t&&(t.forEach(t=>l(t,e)),o.delete(e))}function h(e){const t=d[e.type];if(t){let n=!1,r=e.target;const u=()=>{n=!0},d=()=>{e.preventDefault()},o=new Proxy(e,{get:(e,t)=>"currentTarget"===t?r:"stopPropagation"===t||"stopImmediatePropagation"===t?u:"preventDefault"===t?d:Reflect.get(e,t)});for(;r&&r!==document.body;){const e=t.get(r);if(e&&(e(o),n))return;r=r.parentNode}}}r.p&&document.addEventListener("dblclick",()=>{console.log("DELEGATED EVENTS",{delegationRegistry:d,delegatedEventsByElement:o,documentEventCounters: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(8);t.a=(e=!1,t,n=!1,d="fast",o=!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},o?0:350)));const l=Boolean(i.current),b=e||l;return{shouldRender:b,transitionClassNames:Object(u.a)(d&&"opacity-transition",d,s&&"open",b&&"shown",l&&"closing")}}},function(e,t,n){"use strict";n.d(t,"j",(function(){return o})),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 w})),n.d(t,"m",(function(){return O}));const r=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],u=["January","February","March","April","May","June","July","August","September","October","November","December"],d=u.map(e=>e.toLowerCase());function o(e){const t=new Date(e);return t.setHours(0,0,0,0),t}function c(e){return o(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=o(new Date);if(n>=u)return s(n);const d=new Date(u);if(d.setDate(u.getDate()-7),n>=d)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 d="number"==typeof t?new Date(t):t,c=o(new Date);if(!u){if(i(d)===i(c))return(n?j:C)(e("Weekday.Today"));const t=new Date(c);if(t.setDate(c.getDate()-1),i(d)===i(t))return(n?j:C)(e("Weekday.Yesterday"));const u=new Date(c),o=new Date(c);if(u.setDate(c.getDate()-7),o.setDate(c.getDate()+7),d>=u&&d<=o){const t=r[d.getDay()];return n?j(e("Weekday.Short"+t)):C(e("Weekday."+t))}}const a=d.getFullYear()!==c.getFullYear(),s=e(n?a?"formatDateScheduleYear":"formatDateSchedule":a?"chatFullDate":"chatDate")||"d MMMM yyyy";return(n?j:C)(m(e,d,s))}function m(e,t,n){const r=t.getDate(),d=t.getMonth();return n.replace("LLLL",e(u[d])).replace("MMMM",e("Month.Gen"+u[d])).replace("MMM",e("Month.Short"+u[d])).replace("MM",String(d+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 d=(e=Math.floor(e/60))%60;return d>0&&t.push(String(d).padStart(2,"0")),t.push(String(u).padStart(d>0?2:1,"0")),t.push(String(r).padStart(2,"0")),`${t.join(":")},${String(n).padStart(2,"0")}`}function v(e){return e.toLocaleString("en-US",{year:"numeric",month:"short",day:"numeric"})}function I(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 w(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||!I(t,n-1,r||void 0)?void 0:`${r?r+"-":""}${String(n).padStart(2,"0")}-${String(t).padStart(2,"0")}`}const u=e.split(" "),o=t?u[0]:u[1],c=(t?u[1]:u[0]).toLowerCase(),a=d.findIndex(e=>e.startsWith(c));return-1!==a&&I(Number(o),a)?`${String(a+1).padStart(2,"0")}-${String(o).padStart(2,"0")}`:void 0}function O(e){return e+86400}function j(e){return`${e[0].toLowerCase()}${e.slice(1)}`}function C(e){return`${e[0].toUpperCase()}${e.slice(1)}`}},function(e,t,n){"use strict";n.d(t,"r",(function(){return d})),n.d(t,"I",(function(){return o})),n.d(t,"s",(function(){return c})),n.d(t,"H",(function(){return a})),n.d(t,"M",(function(){return i})),n.d(t,"c",(function(){return s})),n.d(t,"K",(function(){return f})),n.d(t,"J",(function(){return l})),n.d(t,"N",(function(){return m})),n.d(t,"x",(function(){return y})),n.d(t,"d",(function(){return v})),n.d(t,"b",(function(){return I})),n.d(t,"L",(function(){return w})),n.d(t,"eb",(function(){return O})),n.d(t,"j",(function(){return j})),n.d(t,"k",(function(){return C})),n.d(t,"V",(function(){return E})),n.d(t,"db",(function(){return S})),n.d(t,"g",(function(){return A})),n.d(t,"z",(function(){return k})),n.d(t,"kb",(function(){return N})),n.d(t,"lb",(function(){return T})),n.d(t,"u",(function(){return P})),n.d(t,"P",(function(){return D})),n.d(t,"O",(function(){return L})),n.d(t,"m",(function(){return F})),n.d(t,"G",(function(){return B})),n.d(t,"n",(function(){return x})),n.d(t,"ib",(function(){return R})),n.d(t,"hb",(function(){return U})),n.d(t,"Q",(function(){return _})),n.d(t,"q",(function(){return G})),n.d(t,"jb",(function(){return $})),n.d(t,"o",(function(){return W})),n.d(t,"y",(function(){return K})),n.d(t,"nb",(function(){return z})),n.d(t,"ob",(function(){return V})),n.d(t,"f",(function(){return q})),n.d(t,"fb",(function(){return J})),n.d(t,"l",(function(){return Y})),n.d(t,"R",(function(){return Z})),n.d(t,"S",(function(){return X})),n.d(t,"U",(function(){return ee})),n.d(t,"T",(function(){return te})),n.d(t,"Y",(function(){return ue})),n.d(t,"t",(function(){return de})),n.d(t,"Z",(function(){return oe})),n.d(t,"X",(function(){return ae})),n.d(t,"W",(function(){return ie})),n.d(t,"bb",(function(){return fe})),n.d(t,"ab",(function(){return le})),n.d(t,"v",(function(){return be})),n.d(t,"w",(function(){return he})),n.d(t,"e",(function(){return me})),n.d(t,"cb",(function(){return pe})),n.d(t,"a",(function(){return ge})),n.d(t,"p",(function(){return ye})),n.d(t,"mb",(function(){return ve})),n.d(t,"gb",(function(){return Ie})),n.d(t,"E",(function(){return we})),n.d(t,"C",(function(){return Oe})),n.d(t,"A",(function(){return je})),n.d(t,"F",(function(){return Ce})),n.d(t,"B",(function(){return Ee})),n.d(t,"D",(function(){return Se})),n.d(t,"h",(function(){return Me})),n.d(t,"i",(function(){return Ae}));var r=n(1),u=n(3);function d(e,t,n){return{...e,chats:{...e.chats,listIds:{...e.chats.listIds,[t]:n}}}}function o(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:d(e,t,[...r||[],...u])}function c(e,t){return{...e,chats:{...e.chats,byId:t}}}function a(e,t,n,r){const{byId:d}=e.chats,o=d[t],a=n.isMin&&o&&!o.isMin,i={...o,...a?Object(u.j)(n,["isMin","accessHash"]):n,...r&&{photos:[r,...o.photos||[]]}};return i.id&&i.type?c(e,{...d,[t]:i}):e}function i(e,t){return Object.keys(t).forEach(n=>{e=a(e,Number(n),t[Number(n)])}),e}function s(e,t){const{byId:n}=e.chats;return Object.keys(t).map(Number).forEach(r=>{(!n[r]||n[r].isMin&&!t[r].isMin)&&(e=a(e,r,t[r]))}),e}function f(e,t,n){const u=n===r.h?"archived":"active";let d=e.chats.listIds;return Object.keys(d).forEach(e=>{const n=d[e]||[];e!==u||n.includes(t)?e!==u&&n.includes(t)&&(d={...d,[e]:n.filter(e=>e!==t)}):d={...d,[e]:[...n,t]}}),e=a(e={...e,chats:{...e.chats,listIds:d}},t,{folderId:n||void 0})}function l(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 b=n(5),h=n(6);function m(e,t,n=b.MAIN_THREAD_ID,r="thread"){return{...e,messages:{...e.messages,messageLists:t?[{chatId:t,threadId:n,type:r}]:void 0}}}function p(e,t,n){return g(e,t,{byId:n})}function g(e,t,n){const r=e.messages.byChatId[t]||{byId:{},threadsById:{}};return{...e,messages:{...e.messages,byChatId:{...e.messages.byChatId,[t]:{...r,...n}}}}}function y(e,t,n,r,u){return function(e,t,n,r){const u=e.messages.byChatId[t];return g(e,t,{threadsById:{...u&&u.threadsById,[n]:{...u&&u.threadsById[n],...r}}})}(e,t,n,{[r]:u})}function v(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=I(e,t,n[t])}),e}function I(e,t,n){const r=Object(h.m)(e,t);return r&&Object.keys(n).every(e=>Boolean(r[Number(e)]))?e:p(e,t,{...n,...r})}function w(e,t,n,r){const u=Object(h.m)(e,t)||{},d={...u[n],...r};return d.id?p(e,t,{...u,[n]:d}):e}function O(e,t,n,r){const u=Object(h.pb)(e,t)||{},d={...u[n],...r};return d.id?P(e,t,{...u,[n]:d},void 0):e}function j(e,t,n){const r=Object(h.m)(e,t);if(!r)return e;const d=Object(u.j)(r,n),o=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=>{let u=Object(h.X)(e,t,r),d=Object(h.fb)(e,t,r),o=Object(h.Gb)(e,t,r),c=Object(h.ib)(e,t);n.forEach(e=>{u&&u.includes(e)&&(u=u.filter(t=>t!==e)),d&&d.includes(e)&&(d=d.filter(t=>t!==e)),o&&o.includes(e)&&(o=o.filter(t=>t!==e)),c&&c.includes(e)&&(c=c.filter(t=>t!==e))}),e=y(e,t,r,"listedIds",u),e=y(e,t,r,"outlyingIds",d),e=y(e,t,r,"viewportIds",o),e=y(e,t,r,"pinnedIds",c)}),o.length){const n=Object(h.y)(e),r=n&&n.chatId===t&&"thread"===n.type,u=n&&n.threadId;o.forEach(n=>{const{fromChatId:d,fromMessageId:o}=n.forwardInfo,c=Object(h.k)(e,d,o);r&&u===o&&(e=m(e,t)),c&&(e=w(e,d,o,{threadInfo:void 0}))})}return e=p(e,t,d)}function C(e,t,n){const r=Object(h.pb)(e,t);if(!r)return e;const d=Object(u.j)(r,n);let o=Object(h.nb)(e,t);return o&&(n.forEach(e=>{o.includes(e)&&(o=o.filter(t=>t!==e))}),e=y(e,t,b.MAIN_THREAD_ID,"scheduledIds",o)),e=P(e,t,d,void 0)}function E(e,t,n,r){const u=Object(h.X)(e,t,n),d=u&&u.length?r.filter(e=>!u.includes(e)):r;return u&&!d.length?e:y(e,t,n,"listedIds",M([...u||[],...d]))}function S(e,t,n,r){const u=Object(h.fb)(e,t,n),d=u&&u.length?r.filter(e=>!u.includes(e)):r;return u&&!d.length?e:y(e,t,n,"outlyingIds",M([...u||[],...d]))}function M(e){return e.sort((e,t)=>e-t)}function A(e,t,n,u){const d=Object(h.Gb)(e,t,n)||[];if(d.includes(u))return e;return y(e,t,n,"viewportIds",M([...d.length{e=N(e,t.chatId,t.threadId,t)}),e}function P(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 D(e,t,n,r=!1){return{...e,focusedMessage:{...e.focusedMessage,chatId:t,messageId:n,noHighlight:r}}}function L(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,d,o,c,a=!1){const{selectedMessages:i}=e;o&&(c=Object(h.Z)(e,t,o));const s=c||[d];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 o=Object(h.x)(e,t,n,r),c=o.indexOf(f[f.length-1]),a=o.indexOf(d),i=Math.min(c,a),s=Math.max(c,a),b=o.slice(i,s+1);l=Object(u.o)([...f,...b])}else l=[...f,...b];return l.length?{...e,selectedMessages:{...i,messageIds:l}}:x(e)}function x(e){return{...e,selectedMessages:void 0}}function R(e,t,n,r,d){const o=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)(o,"id")},[t]:{...e.stickers[t],hash:n,..."search"===t?{resultIds:d}:{setIds:r.map(({id:e})=>e)}}}}}function U(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 d;if(t||!u)d=n;else{const e=new Set(u.map(e=>e.id));d=[...u,...n.filter(t=>!e.has(t.id))]}return{...e,gifs:{...e.gifs,search:{...e.gifs.search,offset:r,results:d}}}}function G(e,t){return{...e,animatedEmojis:t}}function $(e,t,n,r){const d=[...Object(h.xb)(e,t),...n||[]],o=Object(u.o)(d.map(({id:e})=>e)),c=Object(u.c)(d,"id"),a=o.map(e=>c[e]);return{...e,stickers:{...e.stickers,forEmoji:{emoji:t,stickers:a,hash:r}}}}function W(e){const{emoji:t,stickers:n,hash:r}=e.stickers.forEmoji||{};return t?$(e,t,n,r):e}var H=n(47);function K(e,t){return{...e,users:{...e.users,byId:t}}}function z(e,t,n){const{byId:r}=e.users,{hash:d,userIds:o}=e.contactList||{},c=r[t],a=n.isMin&&c&&!c.isMin,i={...c,...a?Object(u.j)(n,["isMin","accessHash"]):n};return i.id&&i.type?(i.isContact&&o&&!o.includes(t)&&(e={...e,contactList:{hash:d||0,userIds:[t,...o]}}),K(e,{...r,[t]:i})):e}function V(e,t){return Object.keys(t).map(Number).forEach(n=>{e=z(e,n,t[n])}),e}function q(e,t){const{byId:n}=e.users;return Object.keys(t).map(Number).forEach(r=>{(!n[r]||n[r].isMin&&!t[r].isMin)&&(e=z(e,r,t[r]))}),e}function J(e,t){return e.users.selectedId===t?e:{...e,users:{...e.users,selectedId:t}}}function Y(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):H.a}},n)}const Q=e=>`${e.chatId}_${e.id}`;function Z(e,t){return{...e,globalSearch:{...e.globalSearch,...t}}}function X(e,t){return Z(e,{currentContent:t})}function ee(e,t,n,r,d){const{resultsByType:o}=e.globalSearch||{},c=t.reduce((e,t)=>(e[Q(t)]=t,e),{}),a=o&&o[r]?o[r].foundIds:void 0;if(void 0!==a&&Object.keys(c).every(e=>a.includes(Q(c[e]))))return te(e,{messages:!1});const i=a||[],s=t.map(e=>Q(e)),f=Array.prototype.concat(i,s),l=Object(u.a)(i,f)?i:f;return Z(e=te(e,{messages:!1}),{resultsByType:{...(e.globalSearch||{}).resultsByType,[r]:{totalCount:n,nextOffsetId:d,foundIds:l}}})}function te(e,t){return Z(e,{fetchingStatus:{...e.globalSearch.fetchingStatus,...t}})}var ne=n(4);function re(e,t,n){return{...e,localTextSearch:{byChatThreadKey:{...e.localTextSearch.byChatThreadKey,[t]:n}}}}function ue(e,t,n,r,u){const d=Object(ne.a)(t,n);return re(e,d,{...e.localTextSearch.byChatThreadKey[d],isActive:r,query:u})}function de(e,t,n,r,u,d){const o=Object(ne.a)(t,n);return re(e,o,{...e.localTextSearch.byChatThreadKey[o],results:{foundIds:r,totalCount:u,nextOffsetId:d}})}function oe(e,t,n,r,d,o){const c=Object(ne.a)(t,n),{results:a}=e.localTextSearch.byChatThreadKey[c]||{},i=a&&a.foundIds||[],s=se(Object(u.o)(Array.prototype.concat(i,r)));return de(e,t,n,Object(u.a)(i,s)?i:s,d,o)}function ce(e,t,n){return{...e,localMediaSearch:{byChatId:{...e.localMediaSearch.byChatId,[t]:n}}}}function ae(e,t,n){return ce(e,t,{...e.localMediaSearch.byChatId[t],currentType:n})}function ie(e,t,n,r,d,o){const{resultsByType:c}=e.localMediaSearch.byChatId[t]||{},a=c&&c[n]?c[n].foundIds:[],i=se(Object(u.o)(Array.prototype.concat(a,r)));return function(e,t,n,r,u,d){return ce(e,t,{...e.localMediaSearch.byChatId[t],resultsByType:{...(e.localMediaSearch.byChatId[t]||{}).resultsByType,[n]:{foundIds:r,totalCount:u,nextOffsetId:d}}})}(e,t,n,Object(u.a)(a,i)?a:i,d,o)}function se(e){return e.sort((e,t)=>e-t)}function fe(e,t){return{...e,management:{...e.management,progress:t}}}function le(e,t,n){return{...e,management:{...e.management,byChatId:{...e.management.byChatId,[t]:{...e.management.byChatId[t]||{},...n}}}}}function be(e,t){return{...e,settings:{...e.settings,byKey:{...e.settings.byKey,...t}}}}function he(e,t,n){return{...e,settings:{...e.settings,themes:{...e.settings.themes,[t]:{...e.settings.themes[t]||{},...n}}}}}function me(e,t,n){return{...e,settings:{...e.settings,notifyExceptions:{...e.settings.notifyExceptions,[t]:n}}}}function pe(e,t,n,r){switch(t){case"contact":return be(e,{...void 0!==n&&{hasPrivateChatsNotifications:!n},...void 0!==r&&{hasPrivateChatsMessagePreview:r}});case"group":return be(e,{...void 0!==n&&{hasGroupNotifications:!n},...void 0!==r&&{hasGroupMessagePreview:r}});case"broadcast":return be(e,{...void 0!==n&&{hasBroadcastNotifications:!n},...void 0!==r&&{hasBroadcastMessagePreview:r}});default:return}}function ge(e,t){return{...e,blocked:{...e.blocked,ids:[t,...e.blocked.ids],totalCount:e.blocked.totalCount+1}}}function ye(e,t){return{...e,blocked:{...e.blocked,ids:e.blocked.ids.filter(e=>e!==t),totalCount:e.blocked.totalCount-1}}}function ve(e,t){return{...e,twoFaSettings:{...e.twoFaSettings,...t}}}function Ie(e,t){return{...e,payment:{...e.payment,shippingOptions:t}}}function we(e,t){return{...e,payment:{...e.payment,formId:t}}}function Oe(e,t){return{...e,payment:{...e.payment,step:t}}}function je(e,t){if(!t.content||!t.content.invoice)return e;const{title:n,text:r,description:u,photoUrl:d}=t.content.invoice;return{...e,payment:{...e.payment,invoiceContent:{title:n,text:r,description:u,photoUrl:d}}}}function Ce(e,t){return{...e,payment:{...e.payment,stripeCredentials:{...t}}}}function Ee(e,t){return{...e,payment:{...e.payment,...t}}}function Se(e,t,n){if(!t||!n)return{...e,payment:{...e.payment,receipt:void 0}};const{invoice:r}=n.content,{photoUrl:u,text:d,title:o}=r||{};return{...e,payment:{...e.payment,receipt:{...t,photoUrl:u,text:d,title:o}}}}function Me(e){return{...e,payment:{}}}function Ae(e){return{...e,payment:{...e.payment,isPaymentModalOpen:!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";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-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-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-active":["#C8EBBC","#4F4A9F"],"--color-accent-own":["#4FAE4E","#FFFFFF"],"--color-message-meta-own":["#4FAE4EFF","#FFFFFF88"],"--color-own-links":["#52A1EF","#FFFFFF"],"--color-code-own":["#3C7940","#FFFFFF"]}')},function(e,t,n){"use strict";var r=n(0),u=n(8);n(90);t.a=e=>{const{icon:t,className:n,children:d,onClick:o,href:c,download:a,disabled:i,destructive:s,ariaLabel:f}=e,l=Object(r.m)(e=>{if(i||!o)return e.stopPropagation(),void e.preventDefault();o(e)},[i,o]),b=Object(r.m)(e=>{if(13===e.keyCode||32===e.keyCode)return i||!o?(e.stopPropagation(),void e.preventDefault()):void o(e)},[i,o]),h=Object(u.a)("MenuItem",n,i&&"disabled",s&&"destructive"),m=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 c?r.a.createElement("a",{tabIndex:0,className:h,href:c,download:a,"aria-label":f,title:f,target:c.startsWith(window.location.origin)?"_self":"_blank",rel:"noopener noreferrer"},m):r.a.createElement("div",{role:"button",tabIndex:0,className:h,onClick:l,onKeyDown:b,"aria-label":f,title:f},m)}},function(e,t,n){"use strict";var r=n(0),u=n(9);n(84);t.a=Object(r.h)(()=>{const[e,t]=Object(r.r)([]),n=Object(r.p)(()=>Object(u.a)(()=>{t([])},700,!1),[]),d=Object(r.m)(r=>{if(0!==r.button)return;const u=r.currentTarget,d=u.getBoundingClientRect(),o=u.offsetWidth/2;t([...e,{x:r.clientX-d.x-o/2,y:r.clientY-d.y-o/2,size:o}]),requestAnimationFrame(()=>{n()})},[e,n]);return r.a.createElement("div",{className:"ripple-container",onMouseDown:d},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";n.d(t,"a",(function(){return s})),n.d(t,"b",(function(){return f})),n.d(t,"c",(function(){return l}));var r=n(77),u=n.n(r),d=n(7),o=n(13),c=n(9);let a,i;const s="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=";async function f(e,t){for(b();!i.wasmReady;)await Object(c.e)(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(d.p)()||"data:image/webp"!==t.substr(0,15))return t;b();const n=await f(e,Object(o.d)(t));if(!n)throw new Error("Can't convert webp to png. Url: "+t);return Object(o.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);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";var r=n(0),u=n(8);t.a=Object(r.h)(({ref:e,id:t,className:n,value:d,label:o,error:c,success:a,disabled:i,readOnly:s,placeholder:f,autoComplete:l,inputMode:b,maxLength:h,onChange:m,onInput:p,onKeyPress:g,onKeyDown:y,onBlur:v})=>{const I=c||a||o,w=Object(u.a)("input-group",d&&"touched",c?"error":a&&"success",i&&"disabled",s&&"disabled",I&&"with-label",n);return r.a.createElement("div",{className:w},r.a.createElement("input",{ref:e,className:"form-control",type:"text",id:t,dir:"auto",value:d||"",placeholder:f,maxLength:h,autoComplete:l,inputMode:b,disabled:i,readOnly:s,onChange:m,onInput:p,onKeyPress:g,onKeyDown:y,onBlur:v}),I&&r.a.createElement("label",{htmlFor:t},I))})},function(e,t,n){"use strict";var r=n(0),u=n(8),d=n(20);n(86);t.a=Object(r.h)(({id:e,name:t,value:n,label:o,subLabel:c,checked:a,disabled:i,round:s,blocking:f,isLoading:l,onChange:b,onCheck:h})=>{const m=Object(r.m)(e=>{b&&b(e),h&&h(e.currentTarget.checked)},[b,h]),p=Object(u.a)("Checkbox",i&&"disabled",s&&"round",l&&"loading",f&&"blocking");return r.a.createElement("label",{className:p},r.a.createElement("input",{type:"checkbox",id:e,name:t,value:n,checked:a,disabled:i,onChange:m}),r.a.createElement("div",{className:"Checkbox-main"},r.a.createElement("span",{className:"label",dir:"auto"},o),c&&r.a.createElement("span",{className:"subLabel",dir:"auto"},c)),l&&r.a.createElement(d.a,null))})},function(e,t,n){"use strict";n.d(t,"a",(function(){return u}));var r=n(51);function u(e){return Object(r.a)({onEsc:e})}},function(e,t,n){"use strict";n.d(t,"b",(function(){return o}));var r=n(0);let u,d=!1;const o=e=>{document.dispatchEvent(new Event("tt-event-heavy-animation-start")),d=!0,u&&(clearTimeout(u),u=void 0),u=window.setTimeout(()=>{d=!1,document.dispatchEvent(new Event("tt-event-heavy-animation-end")),u=void 0},e)};t.a=(e,t)=>{Object(r.n)(()=>(d&&e(),document.addEventListener("tt-event-heavy-animation-start",e),document.addEventListener("tt-event-heavy-animation-end",t),()=>{document.removeEventListener("tt-event-heavy-animation-end",t),document.removeEventListener("tt-event-heavy-animation-start",e)}),[t,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 d(e){return e<1e3?e:e<1e6?u(e/1e3)+"K":u(e/1e6)+"M"}function o(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 d})),n.d(t,"c",(function(){return o}))},function(e,t,n){"use strict";n.d(t,"a",(function(){return r}));const r=[]},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";var r=n(0),u=n(32),d=n(73),o=n(54),c=n(44),a=n(8),i=n(45);n(88);t.a=({ref:e,containerRef:t,isOpen:n,className:s,style:f,children:l,positionX:b="left",positionY:h="top",autoClose:m=!1,footer:p,noCloseOnBackdrop:g=!1,onCloseAnimationEnd:y,onClose:v,onMouseEnter:I,onMouseLeave:w})=>{let O=Object(r.q)(null);e&&(O=e);const j=t||O,{transitionClassNames:C}=Object(u.a)(n,y);Object(r.n)(()=>n&&v?Object(c.a)(v):void 0,[n,v]),Object(o.a)(([e])=>{void 0!==e&&Object(i.b)(200)},[n]);const E=((e,t,n)=>{const[u,d]=Object(r.r)(-1);Object(r.n)(()=>{d(-1)},[t]);return Object(r.m)(t=>{const r=e.current;if(!r)return;if(13===t.keyCode&&n)return void n();if(38!==t.keyCode&&40!==t.keyCode)return;const o=document.activeElement,c=Array.from(r.children);let a=o&&c.indexOf(o)||u;if(38===t.keyCode&&a>0)a--;else if(40===t.keyCode&&a{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(40);const m={[r.ApiMediaFormat.DataUri]:o.a.Text,[r.ApiMediaFormat.BlobUrl]:o.a.Blob,[r.ApiMediaFormat.Lottie]:o.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.i?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.N){const n=e.startsWith("avatar")?u.P:u.O,r=await o.c(n,e,m[t]);if(r){let t=r;if("audio/ogg"!==r.type||a.h||(t=await b(t)),"image/webp"===r.type&&!Object(a.p)()&&t){const n=await Object(h.b)(e,t);n&&(t=n)}const n=w(t);return p.set(e,n),n}}if(t===r.ApiMediaFormat.Stream){const r=new MediaSource,u=URL.createObjectURL(r);let o=!1;return r.addEventListener("sourceopen",()=>{if(o)return;o=!0;const u=r.addSourceBuffer("audio/mpeg");Object(d.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(d.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.h){const e=await Object(c.e)(s);URL.revokeObjectURL(s);const t=await b(e);s=w(t),f=e.type}if("image/webp"===f&&!Object(a.p)()){const t=await Object(c.e)(s);URL.revokeObjectURL(s);const n=await Object(h.b)(e,t);n&&(s=w(n))}return p.set(e,s),s}(e,t,n).catch(e=>{u.p&&console.warn(e)}).finally(()=>{g.delete(e)});g.set(e,i)}return g.get(e)}function v(e){return p.get(e)}function I(e){Object(d.b)(e)}function w(e){return e instanceof Blob?URL.createObjectURL(e):e}a.i&&navigator.serviceWorker.addEventListener("message",async e=>{const{type:t,messageId:n,params:u}=e.data;if("requestPart"!==t)return;const o=await Object(d.a)("downloadMedia",{mediaFormat:r.ApiMediaFormat.Progressive,...u});if(!o)return;const{arrayBuffer:c,mimeType:a,fullSize:i}=o;navigator.serviceWorker.controller.postMessage({type:"partResponse",messageId:n,result:{arrayBuffer:c,mimeType:a,fullSize:i}},[c])})},function(e,t,n){"use strict";n.d(t,"a",(function(){return d}));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 d(e){return o()||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)}}),o()||document.removeEventListener("keydown",c,!1)}(e)}}function o(){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 i}));var r=n(9),u=n(1),d=n(7);const o=d.g&&s();let c=i();const a=Object(r.g)(()=>{c=i(),((c.width<=u.eb||c.width<=u.db&&c.height<=u.cb)!==d.g||d.g&&o!==s())&&window.location.reload()},250,!0);function i(){const e=.01*window.innerHeight;return document.documentElement.style.setProperty("--vh",e+"px"),{width:window.innerWidth,height:window.innerHeight}}function s(){return d.e?window.matchMedia("(orientation: landscape)").matches:window.matchMedia("screen and (min-device-aspect-ratio: 1/1) and (orientation: landscape)").matches}window.addEventListener("resize",a),window.addEventListener("orientationchange",a),t.a={get:()=>c}},function(e,t,n){"use strict";var r=n(0),u=n(2);const d=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 o(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=(I=e.charCodeAt(b++))-48<10?I-22:I-65<26?I-65:I-97<26?I-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=o(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 I;if(t)for(i=0,v=n.length;iObject(s.l)(t,["toggleSafeLinkModal","openTelegramLink"]))(({url:e,text:t,className:n,children:u,toggleSafeLinkModal:d,openTelegramLink:o})=>{const c=u||t,a=e!==c,s=Object(r.m)(t=>t.ctrlKey||t.altKey||t.shiftKey||t.metaKey||!e||!e.match(i.jb)&&!e.match(i.ib)?!a||(d({url:e}),t.preventDefault(),!1):(t.preventDefault(),o({url:e}),!1),[a,o,d,e]);if(!e)return;const h=Object(f.a)(n||"text-entity-link",t.length>50&&"long-word-break-all");return r.a.createElement("a",{href:l(e),title:b(e),target:"_blank",rel:"noopener noreferrer",className:h,onClick:s},c)}))},function(e,t,n){"use strict";var r=n(0),u=n(41);t.a=(e,t)=>{const n=Object(u.a)(t);return Object(r.n)(()=>e(n||[]),t)}},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 d})),n.d(t,"a",(function(){return o})),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 d(t,n)}function d(e,t){return e&&-1!==e.indexOf(".")?e.split(".").pop():t.split("/").pop()}function o(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 o}));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:d,fieldError:o,description:c}=u?r[u]:r[n];return{field:d,fieldError:o,description:c||t}}const d={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 o(e){return Object.values(e).reduce((e,t)=>{const n=d[t.message];return n&&(e={...e,[n.field]:n.fieldError}),e},{})}},function(e,t,n){"use strict";n.d(t,"b",(function(){return d})),n.d(t,"a",(function(){return o}));var r=n(9);let u;function d(e,t){t||(u&&!u.isCancelled&&(u.isCancelled=!0),u=t={isCancelled:!1}),Object(r.b)(()=>{!t.isCancelled&&e()&&d(e,t)})}function o(e){Object(r.b)(()=>{e()&&o(e)})}},function(e,t,n){"use strict";var r=n(0),u=n(49);n(89);t.a=({trigger:e,className:t,children:n,positionX:d="left",positionY:o="top",footer:c})=>{const a=Object(r.q)(null),i=Object(r.q)(null),[s,f]=Object(r.r)(!1);return r.a.createElement("div",{ref:i,className:"DropdownMenu "+(t||""),onKeyDown:e=>{const t=a.current;if(!s||40!==e.keyCode||!t)return;const n=document.activeElement,r=Array.from(t.children);n&&-1!==r.indexOf(n)||r[0].focus()}},e({onTrigger:()=>{f(!s)},isOpen:s}),r.a.createElement(u.a,{ref:a,containerRef:i,isOpen:s,className:t||"",positionX:d,positionY:o,footer:c,autoClose:!0,onClose:()=>{f(!1)}},n))}},function(e,t,n){"use strict";var r=n(14);const u=new RegExp(`^(?:${r.a.source})+$`,"");t.a=e=>{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 d})),n.d(t,"b",(function(){return o}));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 d(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 o(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 d.p&&Object(r.f)(e)&&!t&&console.warn("Missing `key` in `teactFastList`"),t}));let o=0;const c=e.children.reduce((e,r,d)=>{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[d],o=u&&"props"in u?u.props.key:void 0;if(!u||o)return f(n,r,void 0,t,-1),e;c="__indexKey#"+d}return e[c]={$element:r,index:o++,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,d=c[u];if(!d)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 o="props"in e?e.props.teactOrderKey:void 0,b=d.index!==l&&d.order!==o,h=b&&l>d.index;b&&!h||l++,s.push(f(n,d.$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),o=[],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&&o.push(u)}c&&n.appendChild(c);return o}(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:d}=e;if(!d.isMounted){b(e=Object(r.i)(d),t,n,u);const o=e.children[0];Object(r.d)(o)&&(e.children=[l(o,e,0,u)]),d.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,d=document.createElement(t);return"object"==typeof n.ref&&(n.ref.current=d),Object.keys(n).forEach(e=>{p(d,e,n[e])}),e.children=u.map((t,n)=>f(d,void 0,t,e,n)),d}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(),d=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),d}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(o.a)(e,t,n):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(o.c)(e,t,n):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),d=n(36),o=n(22),c=n(2),a=n(3),i=n(8),s=n(24);var f=Object(c.h)(void 0,(e,t)=>Object(a.l)(t,["openUserInfo"]))(({className:e,sender:t,openUserInfo:n,children:u})=>{const d=Object(r.m)(()=>{t&&n({id:t.id})},[t,n]);return t?r.a.createElement(s.a,{className:Object(i.a)("UserLink",e),onClick:d},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 d=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:d},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 d=Object(r.m)(()=>{t&&n({id:t})},[t,n]);return t?r.a.createElement(s.a,{className:Object(i.a)("ChatLink",e),onClick:d},u):u});function h(e,t,n,c,a,i,s={}){if(!t.content.action)return[];const{text:f}=t.content.action,h=[],g={...s,maxTextLength:16};let y,v=p(f,"%action_origin%",n?!s.isEmbedded&&function(e,t,n){return Object(u.fb)(t)?function(e,t,n){const c=Object(d.a)(Object(u.l)(e,t));if(n)return c;return r.a.createElement(b,{className:"action-link",chatId:t.id},t&&Object(o.a)(c))}(e,t,n):m(t,n)}(e,n,s.asPlain)||" ":"User");return y=v.pop(),h.push(...v),v=p(y,"%target_user%",c?m(c,s.asPlain):"User"),y=v.pop(),h.push(...v),v=p(y,"%message%",a?function(e,t,n={}){const c=Object(u.N)(e,t),{photo:a,video:i,document:s,sticker:f}=Object(u.v)(t),b=c&&!a&&!i&&!s&&!f;let h=Object(d.a)(c,n.maxTextLength);a?h="a photo":i?h=i.isGif?"a GIF":"a video":s?h="a document":f&&(h=`«${c}»`);if(n.asPlain)return b?`«${h}»`:h;if(b)return r.a.createElement("span",null,"«",r.a.createElement(l,{className:"action-link",message:t},Object(o.a)(h)),"»");return r.a.createElement(l,{className:"action-link",message:t},Object(o.a)(h))}(e,a,g):"a message"),y=v.pop(),h.push(...v),v=p(y,"%product%",a?function(e){return e.content&&e.content.invoice?e.content.invoice.title:"a product"}(a):"a product"),y=v.pop(),h.push(...v),v=p(y,"%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"),h.push(...v),s.asPlain?h.join("").trim():h}function m(e,t){const n=Object(d.a)(Object(u.Z)(e));return t?n:r.a.createElement(f,{className:"action-link",sender:e},e&&Object(o.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)),u.push(n),u.push(e.substring(r+t.length)),u}},function(e,t){},function(e,t){},function(e,t,n){"use strict";let r;n.d(t,"a",(function(){return r})),n.d(t,"b",(function(){return u})),n.d(t,"c",(function(){return d})),function(e){e.Bold="MessageEntityBold",e.Blockquote="MessageEntityBlockquote",e.BotCommand="MessageEntityBotCommand",e.Cashtag="MessageEntityCashtag",e.Code="MessageEntityCode",e.Email="MessageEntityEmail",e.Hashtag="MessageEntityHashtag",e.Italic="MessageEntityItalic",e.MentionName="MessageEntityMentionName",e.Mention="MessageEntityMention",e.Phone="MessageEntityPhone",e.Pre="MessageEntityPre",e.Strike="MessageEntityStrike",e.TextUrl="MessageEntityTextUrl",e.Url="MessageEntityUrl",e.Underline="MessageEntityUnderline",e.Unknown="MessageEntityUnknown"}(r||(r={}));const u=-1,d="MESSAGE_DELETED"},function(e,t){},function(e,t,n){"use strict";let r;n.d(t,"a",(function(){return r})),function(e){e[e.DataUri=0]="DataUri",e[e.BlobUrl=1]="BlobUrl",e[e.Lottie=2]="Lottie",e[e.Progressive=3]="Progressive",e[e.Stream=4]="Stream"}(r||(r={}))},function(e,t){},function(e,t){},function(e,t,n){"use strict";var r=n(0),u=n(2),d=n(3),o=n(6);t.a=Object(u.h)((e,{userId:t})=>({userOrChat:t?Object(o.Fb)(e,t):void 0}),(e,t)=>Object(d.l)(t,["openChat","openChatByUsername"]))(({username:e,userOrChat:t,children:n,openChat:u,openChatByUsername:d})=>r.a.createElement("a",{onClick:()=>{t?u({id:t.id}):e&&d({username:e.substring(1)})},className:"text-entity-link",dir:"auto"},n))},function(e,t,n){"use strict";var r=n(57),u=n(37);let d=!1;const o=/^#?([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=o.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 d=Math.round(c(u[e].r,u[t].r,n)),o=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(${d},${o},${a},${i/255})`:`rgb(${d},${o},${a})`)})}t.a=(e,t)=>{const n="dark"===e,u=d&&t,o=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")),d&&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),d=!0,u?Object(r.b)(()=>{const e=Math.min((Date.now()-a)/200,1);return s(o,c,function(e){return 1-(1-e)**3.5}(e)),e<1}):s(o,c)}},function(e,t,n){"use strict";n.d(t,"a",(function(){return u}));var r=n(1);function u(e){"function"==typeof window.navigator.setAppBadge&&window.navigator.setAppBadge(e).catch(e=>{r.p&&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+"c9c0072e811220ee46fd.worker.js")}},function(e,t,n){e.exports=function(){return new Worker(n.p+"01705582fc3eca0e007b.worker.js")}},function(e,t,n){e.exports=function(){return new Worker(n.p+"0dbbe0a906f6c2adf071.worker.js")}},function(e,t,n){e.exports=function(){return new Worker(n.p+"a66075669d8d0ac2d740.worker.js")}},function(e,t,n){"use strict";var r=n(2),u=n(7),d=n(18),o=n(71);Object(r.b)("init",e=>{const{theme:t,animationLevel:n,messageTextSize:r,language:c}=e.settings.byKey;Object(d.c)(c),document.documentElement.style.setProperty("--message-text-size",r+"px"),document.body.classList.add("initial"),document.body.classList.add("animation-level-"+n),document.body.classList.add(u.l?"is-touch-env":"is-pointer-env"),Object(o.a)(t,n>0),u.j&&document.body.classList.add("is-safari"),u.e?document.body.classList.add("is-ios"):u.b&&document.body.classList.add("is-android")}),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}))},function(e,t,n){"use strict";var r=n(2),u=n(1),d=n(10),o=n(26),c=n(12),a=n(72);Object(r.b)("initApi",(e,t)=>{let n=localStorage.getItem(u.D)||void 0;if(!n){const e=localStorage.getItem(u.I);if(e){const{dcID:t}=JSON.parse(e),r=localStorage.getItem(`dc${t}_auth_key`);if(r){n=`session:${t}:${r.replace(/"/g,"")}`}}}Object(d.c)(t.apiUpdate,n)}),Object(r.b)("setAuthPhoneNumber",(e,t,n)=>{const{phoneNumber:r}=n;return Object(d.a)("provideAuthPhoneNumber",r),{...e,authIsLoading:!0,authError:void 0}}),Object(r.b)("setAuthCode",(e,t,n)=>{const{code:r}=n;return Object(d.a)("provideAuthCode",r),{...e,authIsLoading:!0,authError:void 0}}),Object(r.b)("setAuthPassword",(e,t,n)=>{const{password:r}=n;return Object(d.a)("provideAuthPassword",r),{...e,authIsLoading:!0,authError:void 0}}),Object(r.b)("uploadProfilePhoto",(e,t,n)=>{const{file:r}=n;Object(d.a)("uploadProfilePhoto",r)}),Object(r.b)("signUp",(e,t,n)=>{const{firstName:r,lastName:u}=n;return Object(d.a)("provideAuthRegistration",{firstName:r,lastName:u}),{...e,authIsLoading:!0,authError:void 0}}),Object(r.b)("returnToAuthPhoneNumber",e=>(Object(d.a)("restartAuth"),{...e,authError:void 0})),Object(r.b)("gotToAuthQrCode",e=>(Object(d.a)("restartAuthWithQr"),{...e,authIsLoadingQrCode:!0,authError:void 0})),Object(r.b)("saveSession",(e,t,n)=>{const{sessionId:r,sessionJson:d}=n;localStorage.setItem(u.D,r),function(e,t){const{mainDcId:n,keys:r}=JSON.parse(e),d={dcID:n,id:t};localStorage.setItem(u.I,JSON.stringify(d)),localStorage.setItem("dc",n),Object.keys(r).forEach(e=>{localStorage.setItem(`dc${e}_auth_key`,`"${r[e]}"`)})}(d,e.currentUserId)}),Object(r.b)("signOut",()=>{(async()=>{await Object(o.d)(),await Object(d.a)("destroy"),Object(r.d)().reset()})()}),Object(r.b)("reset",()=>{localStorage.removeItem(u.D),localStorage.removeItem("dc5_auth_key"),localStorage.removeItem("dc4_auth_key"),localStorage.removeItem("dc3_auth_key"),localStorage.removeItem("dc2_auth_key"),localStorage.removeItem("dc1_auth_key"),localStorage.removeItem("dc"),localStorage.removeItem(u.I),c.b(u.O),c.b(u.P),c.b(u.Q),c.b(u.m),c.b(u.G);const e=u.G.replace(/\d+$/,""),t=(u.G.match(/\d+$/)||[0])[0];for(let n=0;n{(async()=>{await Object(d.a)("disconnect")})()}),Object(r.b)("loadNearestCountry",e=>{"connectionStateReady"===e.connectionState&&(async()=>{const e=await Object(d.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(2),u=n(1),d=n(26),o=n(34),c=n(18);Object(r.b)("apiUpdate",(e,t,n)=>{switch(u.p&&"updateUserStatus"!==n["@type"]&&console.log("[GramJs] UPDATE",n["@type"],{update:n}),n["@type"]){case"updateApiReady":!function(e){Object(d.c)(),Object(c.c)(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":{const{sessionId:u,sessionJson:d}=e;if(u&&t.authRememberMe&&Object(r.d)().saveSession({sessionId:u,sessionJson:d}),n)break;Object(r.g)({...t,isLoggingOut:!1,lastSyncTime:Date.now()});break}}}(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"updateCurrentUser":!function(e){const{currentUser:t}=e;Object(r.g)({...Object(o.nb)(Object(r.e)(),t.id,t),currentUserId:t.id}),function(e){const t=localStorage.getItem(u.I);if(!t)return;const n=JSON.parse(t);n.id=e,localStorage.setItem(u.I,JSON.stringify(n))}(t.id)}(n);break;case"error":"SESSION_REVOKED"===n.error.message&&t.signOut(),t.showError({error:n.error})}})},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(21),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(1),d=n(2),o=n(7),c=n(26);function a(e){const t=e.data;if(!t.type)return;const n=Object(d.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)()}o.k&&(window.addEventListener("load",async()=>{try{await navigator.serviceWorker.register(r),u.p&&console.log("[SW] ServiceWorker registered"),await navigator.serviceWorker.ready,navigator.serviceWorker.controller?(u.p&&console.log("[SW] ServiceWorker ready"),i()):(u.p&&console.error("[SW] ServiceWorker not available"),Object(d.d)().showError({error:{message:"SERVICE_WORKER_DISABLED"}}))}catch(e){u.p&&console.error("[SW] ServiceWorker registration failed: ",e)}}),window.addEventListener("focus",async()=>{await navigator.serviceWorker.ready,i()}));var s=n(61);const f={isLeftColumnShown:!0,isChatInfoShown:!1,uiReadyState:0,authRememberMe:!0,blocked:{ids:[],totalCount:0},users:{byId:{}},chats:{listIds:{},isFullyLoaded:{},orderedPinnedIds:{},totalCount:{},byId:{}},messages:{byChatId:{}},scheduledMessages:{byChatId:{}},chatFolders:{byId:{}},fileUploads:{byMessageLocalId:{}},recentEmojis:["grinning","kissing_heart","christmas_tree","brain","trophy"],stickers:{setsById:{},added:{},recent:{stickers:[]},favorite:{stickers:[]},featured:{setIds:[]},search:{},forEmoji:{}},gifs:{saved:{},search:{}},globalSearch:{},localTextSearch:{byChatThreadKey:{}},localMediaSearch:{byChatId:{}},management:{byChatId:{}},topPeers:{},mediaViewer:{},audioPlayer:{},forwardMessages:{},pollResults:{},payment:{},notifications:[],errors:[],activeSessions:[],settings:{byKey:{messageTextSize:u.s,animationLevel:u.d,messageSendKeyCombo:"enter",theme:"light",shouldAutoDownloadMediaFromContacts:!0,shouldAutoDownloadMediaInPrivateChats:!0,shouldAutoDownloadMediaInGroups:!0,shouldAutoDownloadMediaInChannels:!0,shouldAutoPlayGifs:!0,shouldAutoPlayVideos:!0,shouldSuggestStickers:!0,shouldLoopStickers:!0,language:"en"},themes:{light:{isBlurred:!0,patternColor:u.t},dark:{isBlurred:!0,patternColor:u.o}},privacy:{},notifyExceptions:{}},twoFaSettings:{}};var l=n(5),b=n(9),h=n(3),m=n(6);const p=Object(b.g)((function(){Object(b.c)(()=>{if(!g)return;const e=Object(d.e)();if(e.isLoggingOut)return;const t={...f,...Object(h.l)(e,["authState","authPhoneNumber","authRememberMe","authNearestCountry","currentUserId","contactList","chatFolders","topPeers","recentEmojis","push"]),isChatInfoShown:v(e),users:I(e),chats:w(e),messages:O(e),globalSearch:{recentlyFoundChatIds:e.globalSearch.recentlyFoundChatIds},settings:j(e)},n=JSON.stringify(t);localStorage.setItem(u.B,n)})}),1e3,!1);let g=!1;function y(e){if(!u.A){if(localStorage.getItem(u.D))return g=!0,Object(d.a)(p),function(e){u.p&&console.time("global-state-cache-read");const t=localStorage.getItem(u.B),n=t?JSON.parse(t):void 0;u.p&&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});return{...e,...n}}(e);g=!1}}function v(e){return window.innerWidth>u.bb&&e.isChatInfoShown}function I(e){const{users:{byId:t,selectedId:n}}=e,r=[...(e.chats.listIds.active||[]).slice(0,u.z).filter(e=>e>0),...Object.keys(t)].slice(0,u.C);return{byId:Object(h.l)(t,r),selectedId:window.innerWidth>u.bb?n:void 0}}function w(e){const t=[...(e.chats.listIds.active||[]).slice(0,u.z)],{chatId:n}=Object(m.y)(e)||{};return{...e.chats,byId:Object(h.l)(e.chats.byId,n?[...t,n]:t),listIds:{active:t},isFullyLoaded:{},orderedPinnedIds:{active:e.chats.orderedPinnedIds.active}}}function O(e){const t={},{chatId:n}=Object(m.y)(e)||{};[...(e.chats.listIds.active||[]).slice(0,u.z),...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(h.l)(r.byId,u.viewportIds),threadsById:{[l.MAIN_THREAD_ID]:u}})});const r=Object(m.y)(e);return{byChatId:t,messageLists:!r||o.g?void 0:[{...r,threadId:l.MAIN_THREAD_ID,type:"thread"}]}}function j(e){const{byKey:t,themes:n}=e.settings;return{byKey:t,themes:n,privacy:{},notifyExceptions:{}}}u.A||(Object(d.b)("saveSession",()=>{g=!0,Object(d.a)(p)}),Object(d.b)("reset",()=>{g=!1,Object(d.f)(p),localStorage.removeItem(u.B)})),Object(d.b)("init",()=>{const e=Object(h.d)(f),t=y(e)||e,n=Object(m.y)(t)||{};return window.history.replaceState(n,""),t});var C=n(0),E=n(52);const S=String(Date.now()+Math.random());let M;localStorage.setItem("tt-active-tab",S);const A=window.setInterval(()=>{M&&localStorage.getItem("tt-active-tab")!==S&&(M(),clearInterval(A))},2e3);var k=n(31),N=(n(78),n(79),n(80),n(28)),T=n(32),P=n(13);const D=["400 1em Roboto","500 1em Roboto"];function L(){if("fonts"in document)return Promise.all(D.map(e=>document.fonts.load(e)))}var F=n(50),B=n(11),x=n(8),R=(n(82),n.p+"telegram-logo.df3a91becaa9678c529b4c4cadd45204.svg"),U=n.p+"monkey.a3d5fcdc50b18dc55695f7dd4101a8c9.svg";function _(){const{listIds:e,byId:t}=Object(d.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(N.d)(n);return r?F.b(r,l.ApiMediaFormat.DataUri):void 0}))}const G={main:()=>Promise.all([Object(B.d)(B.a.Main,"Main").then(L),_()]),authPhoneNumber:()=>Promise.all([L(),Object(P.g)(R)]),authCode:()=>Object(P.g)(U),authPassword:()=>Object(P.g)(U),authQrCode:L};var $=Object(d.h)(e=>{const{theme:t}=e.settings.byKey,{background:n,backgroundColor:r}=e.settings.themes[t]||{};return{uiReadyState:e.uiReadyState,hasCustomBackground:Boolean(n),hasCustomBackgroundColor:Boolean(r),isRightColumnShown:Object(m.V)(e)}},(e,t)=>Object(h.l)(t,["setIsUiReady"]))(({page:e,children:t,hasCustomBackground:n,hasCustomBackgroundColor:r,isRightColumnShown:u,setIsUiReady:d})=>{const[o,c]=Object(k.a)(),{shouldRender:a,transitionClassNames:i}=Object(T.a)(!o,void 0,!0);return Object(C.n)(()=>{let t;return Promise.race([Object(b.e)(700),(async()=>{try{await G[e]()}catch(e){}})()]).then(()=>{c(),d({uiReadyState:1}),t=window.setTimeout(()=>{d({uiReadyState:2})},1e3)}),()=>{t&&(clearTimeout(t),t=void 0),d({uiReadyState:0})}},[]),C.a.createElement("div",{id:"UiLoader"},t,a&&C.a.createElement("div",{className:Object(x.a)("mask",i)},"main"===e?C.a.createElement(C.a.Fragment,null,C.a.createElement("div",{className:"left"}),C.a.createElement("div",{className:Object(x.a)("middle",n&&"custom-bg-image",r&&"custom-bg-color",u&&"with-right-column")}),u&&C.a.createElement("div",{className:"right"})):C.a.createElement("div",{className:"blank"})))}),W=n(17),H=n(29),K=n(43),z=n(42),V=n(15),q=n(48),J=n(22),Y=n(58),Q=n(38),Z=n(20);n(91);const X=200+u.c;var ee=Object(C.h)(({id:e,value:t,isLoading:n,onChange:r})=>{const u=Object(C.q)(null),[d,o]=Object(C.r)(),[c,a]=Object(C.r)(W.a);function i(e){o(e),a(function(e=""){return e.length?W.a.filter(t=>Object(q.a)(t.name,e)):W.a}(e))}const s=Object(C.m)(e=>{const{countryId:t}=e.currentTarget.firstElementChild.dataset,n=W.a.find(e=>e.id===t);n&&r(n),setTimeout(()=>i(void 0),X)},[r]),f=Object(C.m)(e=>{i(e.currentTarget.value)},[]),l=Object(C.m)(e=>{if(8!==e.keyCode)return;const n=e.currentTarget;t&&void 0===d&&(n.value=""),i(n.value)},[d,t]);return C.a.createElement(Y.a,{className:"CountryCodeInput",trigger:({onTrigger:r,isOpen:o})=>{const c=()=>{if(o)return;setTimeout(()=>{u.current.select()},50),r();const e=document.getElementById("auth-phone-number-form");e.scrollTo({top:e.scrollHeight,behavior:"smooth"})},a=void 0!==d?d:t&&t.name||"";return C.a.createElement("div",{className:Object(x.a)("input-group",t&&"touched")},C.a.createElement("input",{ref:u,className:Object(x.a)("form-control",o&&"focus"),type:"text",id:e,value:a,autoComplete:"off",onClick:c,onFocus:c,onInput:f,onKeyDown:l}),C.a.createElement("label",null,"Country"),n?C.a.createElement(Z.a,{color:"black"}):C.a.createElement("i",{onClick:c,className:Object(x.a)("css-icon-down",o&&"open")}))}},c.map(e=>C.a.createElement(Q.a,{key:e.id,className:t&&e.id===t.id?"selected":"",onClick:s},C.a.createElement("span",{"data-country-id":e.id}),C.a.createElement("span",{className:"country-flag"},Object(J.a)(e.flag,["hq_emoji"])),C.a.createElement("span",{className:"country-name"},e.name),C.a.createElement("span",{className:"country-code"},e.code))),!c.length&&C.a.createElement(Q.a,{key:"no-results",className:"no-results",disabled:!0},C.a.createElement("span",null,"No countries matched your filter.")))});let te=!1;var ne=Object(C.h)(Object(d.h)(e=>Object(h.l)(e,["connectionState","authState","authPhoneNumber","authIsLoading","authIsLoadingQrCode","authError","authRememberMe","authNearestCountry"]),(e,t)=>Object(h.l)(t,["setAuthPhoneNumber","setAuthRememberMe","clearAuthError","loadNearestCountry","gotToAuthQrCode"]))(({connectionState:e,authState:t,authPhoneNumber:n,authIsLoading:r,authIsLoadingQrCode:u,authError:d,authRememberMe:c,authNearestCountry:a,setAuthPhoneNumber:i,setAuthRememberMe:s,loadNearestCountry:f,clearAuthError:l,gotToAuthQrCode:b})=>{const h=Object(C.q)(null),[m,p]=Object(C.r)(),[g,y]=Object(C.r)(),[v,I]=Object(C.r)(!1),[w,O]=Object(C.r)(),j=m?`${m.code} ${g||""}`:g,E=j&&j.replace(/[^\d]+/g,"").length>=10;Object(C.n)(()=>{o.l||h.current.focus()},[m]),Object(C.n)(()=>{"connectionStateReady"!==e||a||f()},[e,a,f]),Object(C.n)(()=>{!a||m||v||p(Object(W.d)(a))},[m,a,v]);const S=Object(C.m)(e=>{const t=Object(W.e)(e),n=!m||t&&t.id!==m.id?t:m;e.length?(!m||n&&n.code!==m.code)&&p(n):p(void 0),y(Object(W.b)(e,n))},[m]);Object(C.n)(()=>{void 0===g&&n&&S(n)},[n,g,S]),Object(C.o)(()=>{h.current&&w&&h.current.setSelectionRange(...w)},[w]);const M=Object(C.m)(e=>{d&&l(),te||(te=!0,L(),Object(P.g)(U));const{value:t,selectionStart:n,selectionEnd:r}=e.target;O(n&&r&&r{s(e.target.checked)},[s]);const k="authorizationStateWaitPhoneNumber"===t;return C.a.createElement("div",{id:"auth-phone-number-form",className:"custom-scroll"},C.a.createElement("div",{className:"auth-form"},C.a.createElement("div",{id:"logo"}),C.a.createElement("h2",null,"Sign in to Telegram"),C.a.createElement("p",{className:"note"},"Please confirm your country and",C.a.createElement("br",null),"enter your phone number."),C.a.createElement("form",{action:"",onSubmit:function(e){e.preventDefault(),r||E&&i({phoneNumber:j})}},C.a.createElement(ee,{id:"sign-in-phone-code",value:m,isLoading:!a&&!m,onChange:p}),C.a.createElement(z.a,{ref:h,id:"sign-in-phone-number",label:"Phone Number",value:j,error:d,inputMode:"tel",onChange:M}),C.a.createElement(K.a,{id:"sign-in-keep-session",label:"Keep me signed in",checked:Boolean(c),onChange:A}),E&&(k?C.a.createElement(H.a,{type:"submit",ripple:!0,isLoading:r},"Next"):C.a.createElement(V.a,null)),k&&C.a.createElement(H.a,{isText:!0,ripple:!0,isLoading:u,onClick:b},"Log in by QR code"))))})),re=n(16);var ue=Object(C.h)(()=>{const e=Object(re.a)(B.a.Auth,"AuthCode");return e?C.a.createElement(e,null):C.a.createElement(V.a,null)});var de=Object(C.h)(()=>{const e=Object(re.a)(B.a.Auth,"AuthPassword");return e?C.a.createElement(e,null):C.a.createElement(V.a,null)});var oe=Object(C.h)(()=>{const e=Object(re.a)(B.a.Auth,"AuthRegister");return e?C.a.createElement(e,null):C.a.createElement(V.a,null)});var ce=Object(C.h)(()=>{const e=Object(re.a)(B.a.Auth,"AuthQrCode");return e?C.a.createElement(e,null):C.a.createElement(V.a,null)});n(92);var ae=Object(C.h)(Object(d.h)(e=>Object(h.l)(e,["authState"]),(e,t)=>Object(h.l)(t,["reset","initApi"]))(({authState:e,reset:t,initApi:n})=>{switch(Object(C.n)(()=>{t(),n()},[t,n]),Object(C.n)(()=>{},[]),e){case"authorizationStateWaitCode":return C.a.createElement($,{page:"authCode",key:"authCode"},C.a.createElement(ue,null));case"authorizationStateWaitPassword":return C.a.createElement($,{page:"authPassword",key:"authPassword"},C.a.createElement(de,null));case"authorizationStateWaitRegistration":return C.a.createElement(oe,null);case"authorizationStateWaitQrCode":return C.a.createElement($,{page:"authQrCode",key:"authQrCode"},C.a.createElement(ce,null));case"authorizationStateWaitPhoneNumber":default:return C.a.createElement($,{page:"authPhoneNumber",key:"authPhoneNumber"},C.a.createElement(ne,null))}}));var ie=Object(C.h)(()=>{const e=Object(re.a)(B.a.Main,"Main");return e?C.a.createElement(e,null):void 0}),se=n.p+"app-inactive.bc7953c2dfebcabce2c43ca7dc778a89.png";n(93);var fe=()=>C.a.createElement("div",{id:"AppInactive"},C.a.createElement("div",{className:"content"},C.a.createElement("img",{src:se,alt:""}),C.a.createElement("h3",{className:"title"},"Such error, many tabs"),C.a.createElement("div",{className:"description"},"Telegram supports only one active tab with the app.",C.a.createElement("br",null),"Please reload this page to continue using this tab or close it."),C.a.createElement("div",{className:"actions"},C.a.createElement(H.a,{isText:!0,ripple:!0,onClick:()=>{window.location.reload()}},"Reload app"))));function le(){return d.c.createElement($,{page:"main",key:"main"},d.c.createElement(ie,null))}var be=Object(d.h)(e=>Object(h.l)(e,["authState"]),(e,t)=>Object(h.l)(t,["disconnect"]))(({authState:e,disconnect:t})=>{const[n,r]=Object(k.a)(!1);if(Object(C.n)(()=>{Object(E.b)(),M=()=>{t(),document.title=`${u.fb}${u.E}`,r()}},[t,r]),n)return d.c.createElement(fe,null);if(e)switch(e){case"authorizationStateWaitPhoneNumber":case"authorizationStateWaitCode":case"authorizationStateWaitPassword":case"authorizationStateWaitRegistration":case"authorizationStateWaitQrCode":return d.c.createElement(ae,null);case"authorizationStateClosed":case"authorizationStateClosing":case"authorizationStateLoggingOut":case"authorizationStateReady":return le()}const o=localStorage.getItem(u.D),c=localStorage.getItem(u.I);return o||c?le():d.c.createElement(ae,null)});n(94);u.p&&console.log(">>> INIT"),Object(d.d)().init(),u.p&&console.log(">>> START INITIAL RENDER"),s.a.render(d.c.createElement(be,null),document.getElementById("root")),u.p&&console.log(">>> FINISH INITIAL RENDER"),document.addEventListener("dblclick",()=>{console.log("GLOBAL STATE",Object(d.e)())})}]); -//# sourceMappingURL=main.2bacad1be7a118611b52.js.map \ No newline at end of file diff --git a/dist/main.2bacad1be7a118611b52.js.map b/dist/main.2bacad1be7a118611b52.js.map deleted file mode 100644 index 10b6bf94a..000000000 --- a/dist/main.2bacad1be7a118611b52.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./src/lib/teact/teact.ts","webpack:///./src/config.ts","webpack:///./src/lib/teact/teactn.tsx","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/types/index.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/util/environment.ts","webpack:///./src/util/buildClassName.ts","webpack:///./src/util/schedulers.ts","webpack:///./src/api/gramjs/worker/provider.ts","webpack:///./src/util/moduleLoader.ts","webpack:///./src/util/cacheApi.ts","webpack:///./src/util/files.ts","webpack:///./src/lib/twemojiRegex.js","webpack:///./src/components/ui/Loading.tsx","webpack:///./src/hooks/useModuleLoader.ts","webpack:///./src/util/countries.ts","webpack:///./src/util/phoneNumber.ts","webpack:///./src/assets/lang/en-extra.json","webpack:///./src/assets/lang/es-extra.json","webpack:///./src/assets/lang/it-extra.json","webpack:///./src/assets/lang/pl-extra.json","webpack:///./src/assets/lang/ru-extra.json","webpack:///./src/util/langProvider.ts","webpack:///./src/util/callbacks.ts","webpack:///./src/types/index.ts","webpack:///./src/components/ui/Spinner.tsx","webpack:///./src/util/handleError.ts","webpack:///./src/components/common/helpers/renderText.tsx","webpack:///./src/util/arePropsShallowEqual.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/components/ui/Button.tsx","webpack:///./src/lib/teact/dom-events.ts","webpack:///./src/hooks/useFlag.ts","webpack:///./src/hooks/useShowTransition.ts","webpack:///./src/util/dateFormat.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/hooks/useForceUpdate.ts","webpack:///./src/util/trimText.ts","webpack:///./src/components/ui/MenuItem.tsx","webpack:///./src/components/ui/RippleEffect.tsx","webpack:///./src/util/webpToPng.ts","webpack:///./src/hooks/usePrevious.ts","webpack:///./src/components/ui/InputText.tsx","webpack:///./src/components/ui/Checkbox.tsx","webpack:///./src/util/captureEscKeyListener.ts","webpack:///./src/hooks/useHeavyAnimationCheck.ts","webpack:///./src/util/textFormat.ts","webpack:///./src/util/memo.ts","webpack:///./src/util/searchWords.ts","webpack:///./src/components/ui/Menu.tsx","webpack:///./src/hooks/useKeyboardListNavigation.ts","webpack:///./src/util/oggToWav.ts","webpack:///./src/util/mediaLoader.ts","webpack:///./src/util/captureKeyboardListeners.ts","webpack:///./src/util/windowSize.ts","webpack:///./src/lib/punycode.js","webpack:///./src/components/common/SafeLink.tsx","webpack:///./src/hooks/useEffectWithPrevDeps.ts","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/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/switchTheme.ts","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/api/initial.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/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:///./src/components/auth/AuthQrCode.async.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","exec","some","dependency","useEffect","fastRaf","useLayoutEffect","onTickEnd","useMemo","resolver","useCallback","newCallback","useRef","memo","areEqual","arePropsShallowEqual","withDebug","propsRef","renderedRef","getUnequalProps","join","addEventListener","orderBy","values","PAGE_TITLE","INACTIVE_MARKER","APP_NAME","APP_VERSION","process","IS_TEST","DEBUG_ALERT_MSG","GRAMJS_SESSION_ID_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","Set","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_MAX","ANIMATION_LEVEL_DEFAULT","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","STICKER_SIZE_INLINE_DESKTOP_FACTOR","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","MEMOJI_STICKER_ID","MENU_TRANSITION_DURATION","SLIDE_TRANSITION_DURATION","CONTENT_TYPES_FOR_QUICK_UPLOAD","RE_LINK_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","LANG_PACKS","TIPS_USERNAME","FEEDBACK_URL","LIGHT_THEME_BG_COLOR","DARK_THEME_BG_COLOR","DARK_THEME_PATTERN_COLOR","DEFAULT_PATTERN_COLOR","React","currentGlobal","reducers","callbacks","container","containers","mapStateToProps","mapReducersToProps","ownProps","mappedProps","newMappedProps","setGlobal","actions","Number","isNaN","DEBUG_componentName","keys","areMappedPropsChanged","DEBUG_updates","updateTime","Map","runCallbacksThrottled","cb","newGlobal","getGlobal","getDispatch","addReducer","reducer","payload","onDispatch","addCallback","removeCallback","index","indexOf","splice","withGlobal","TeactNContainer","id","generateIdFor","useForceUpdate","delete","set","buildCollectionByKey","collection","reduce","byKey","member","mapValues","callback","newByKey","pick","result","pickTruthy","omit","stringKeys","filter","has","orderKey","sort","a","b","Array","isArray","mode1","mode2","orderKey1","orderKey2","aValue1","bValue1","aValue2","bValue2","aValue","bValue","array","concat","unique","from","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","groupedId","isGif","emoji","title","performer","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","getMessageContent","hasMessageMedia","getMessagePhoto","getMessageVideo","getMessageDocument","getMessageSticker","getMessageContact","getMessagePoll","getMessageAction","getMessageAudio","getMessageVoice","getMessageRoundVideo","getMessageInvoice","getMessageWebPage","getMessageWebPagePhoto","getMessageMediaThumbDataUri","thumbnail","media","getMessageMediaThumbnail","dataUri","getMessageMediaHash","webPagePhoto","base","hasMessageLocalBlobUrl","canMessagePlayVideoInline","getVideoOrAudioBaseHash","getDocumentHasPreview","IS_PROGRESSIVE_SUPPORTED","IS_SAFARI","size","mimeType","getMessageMediaFormat","isAnimated","ApiMediaFormat","Lottie","Progressive","IS_OPUS_SUPPORTED","BlobUrl","getMessageMediaFilename","date","blobUrl","previewBlobUrl","getChatMediaMessageIds","messages","listedIds","reverseOrder","ids","getMessageContentIds","reverse","getPhotoFullDimensions","sizes","getPhotoInlineDimensions","getVideoDimensions","width","height","getMediaTransferState","progress","isDownloadNeeded","isUploading","isTransferring","transferProgress","messageIds","contentType","validator","matchLinkInMessageText","getMediaDuration","duration","buildChatThreadKey","threadId","selectUser","global","userId","users","byId","selectNotifySettings","settings","selectNotifyExceptions","notifyExceptions","selectChat","chats","selectChatUser","chat","getPrivateChatUserId","selectIsChatWithSelf","currentUserId","selectIsChatWithBot","user","isUserBot","selectSupportChat","isSupport","selectChatOnlineCount","isChatPrivate","isChatChannel","fullInfo","members","onlineCount","isUserOnline","selectChatBot","selectIsChatBotNotStarted","bot","lastMessage","messageInfo","byChatId","threadsById","MAIN_THREAD_ID","selectAreActiveChatsLoaded","listIds","active","selectIsChatListed","targetList","includes","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","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","isRestricted","isPrivate","isChatWithSelf","isBasicGroup","isChatBasicGroup","isSuperGroup","isChatSuperGroup","isChannel","isServiceNotification","isOwn","isAction","isMessageEditable","Date","viaBotId","canReply","getCanPostInChat","hasPinPermission","isCreator","isUserRightBanned","getHasAdminRight","canPin","canUnpin","pinnedMessageIds","canDelete","canDeleteForAll","canEdit","canForward","hasSticker","hasFavoriteSticker","favorite","selectIsStickerFavorite","canFaveSticker","canUnfaveSticker","canCopy","canCopyLink","canSelect","noOptions","ability","selectCanDeleteSelectedMessages","selectedMessageIds","selectedMessages","messageActions","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","isPollResults","pollResults","selectIsPollResultsOpen","isSearch","IS_MOBILE_SCREEN","isManagement","currentManagement","selectCurrentManagement","isStickerSearch","query","isGifSearch","currentChatId","areActiveChatsLoaded","isUserInfo","isChatInfo","RightColumnContent","PollResults","Search","Management","StickerSearch","GifSearch","UserInfo","ChatInfo","selectIsRightColumnShown","selectCurrentGlobalSearchQuery","globalSearch","selectPaymentMessageId","payment","selectPaymentRequestId","formId","selectProviderPublishableKey","nativeParams","publishableKey","selectStripeCredentials","stripeCredentials","PLATFORM_ENV","userAgent","platform","navigator","os","test","getPlatform","IS_MAC_OS","IS_IOS","IS_ANDROID","IS_TOUCH_ENV","matchMedia","matches","innerWidth","IS_VOICE_RECORDING_SUPPORTED","mediaDevices","AudioContext","webkitAudioContext","IS_EMOJI_SUPPORTED","documentElement","style","IS_SERVICE_WORKER_SUPPORTED","Audio","canPlayType","IS_CANVAS_FILTER_SUPPORTED","getContext","DPR","devicePixelRatio","MASK_IMAGE_DISABLED","isWebpSupportedCache","isWebpSupported","webp","Image","handleLoadOrError","hasWebp","parts","debounce","fn","ms","shouldRunFirst","shouldRunLast","waitingTimeout","args","self","throttle","interval","isPending","_args","setInterval","clearInterval","throttleWith","fastPrimaryRaf","waiting","onIdle","requestIdleCallback","pause","rafPromise","fastRafCallbacks","fastRafPrimaryCallbacks","isPrimary","requestAnimationFrame","currentCallbacks","currentPrimaryCallbacks","worker","requestStates","requestStatesByCallback","initApi","sessionInfo","Worker","update","requestState","response","callbackArgs","subscribeToWorker","makeRequest","callApi","fnName","cancelApiProgress","progressCallback","isCanceled","postMessage","assign","pop","catch","finally","Bundles","LOAD_PROMISES","MEMORY_CACHE","async","loadModule","bundleName","moduleName","Auth","Main","Extra","handleBundleLoad","bundle","getModuleFromMemory","listeners","addLoadListener","listener","cacheApi","caches","Type","fetch","cacheName","Request","cache","open","Blob","blob","substr","headers","Json","json","save","cacheData","JSON","stringify","Response","put","clear","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","canvas","videoWidth","videoHeight","drawImage","toDataURL","currentTime","fetchBlob","imgToCanvas","vs16RegExp","zeroWidthJoiner","fromCharCode","removeVS16s","rawEmoji","color","className","withBackground","noLoad","autoUpdate","formatsCache","defaultPhoneNumberFormat","parsed","str","flag","phoneFormat","format","formatValue","phoneNumberFormat","phoneNumberGroups","count","repeat","getPhoneNumberFormat","getCountryById","countryList","getCountryFromPhoneNumber","input","phoneNumber","startsWith","possibleCountries","country","formatPhoneNumber","_","p1","p2","p3","p4","p5","separator","output","formatPhoneNumberWithCode","numberWithPlus","EXTRA_PACK_PATHS","en","enExtraJson","es","esExtraJson","it","itExtraJson","pl","plExtraJson","ru","ruExtraJson","PLURAL_OPTIONS","PLURAL_RULES","ar","ca","de","fa","fr","ko","nl","pt_BR","tr","uk","uz","langPack","runCallbacks","createCallbackManager","currentLangCode","setLanguage","langCode","newLangPack","cached","remote","sourceLangPacks","fetchFromCacheOrRemote","pairs","extraLangPack","getTranslation","langString","template","amount","optionIndex","getPluralOption","trim","processTemplate","formatInteger","LoadMoreDirection","FocusDirection","SettingsScreens","LeftColumnContent","GlobalSearchContent","MediaViewerOrigin","ChatCreationProgress","ProfileEditProgress","ManagementProgress","ProfileState","PaymentStep","UPLOADING_WALLPAPER_SLUG","ManagementScreens","Spinner","buildClassName","handleErrorEvent","startedAt","isReloading","preventDefault","ErrorEvent","reason","alert","localStorage","getItem","removeItem","location","reload","APP_ENV","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","RE_MENTION","nextLink","endsWith","addLinks","replaceSimpleMarkdown","emojis","emojiResult","nativeToUnfified","alt","line","trimmedLine","trimLeft","indentLength","entityResult","currentProps","newProps","currentKeys","currentKeysLength","prop","Link","onClick","handleClick","dir","store","random","getDeviceToken","subscription","toJSON","endpoint","checkIfPushSupported","ServiceWorkerRegistration","Notification","permission","requestPermission","unsubscribeFromPush","dispatch","deviceToken","unsubscribe","deleteDeviceToken","serviceWorkerRegistration","serviceWorker","ready","pushManager","getSubscription","subscribe","replaceSettings","loadNotificationSettings","subscribedAt","checkIfShouldResubscribe","userVisibleOnly","setDeviceToken","DOMException","ABORT_ERR","showNewMessageNotification","isActiveChat","hasFocus","hasPrivateChatsNotifications","hasGroupNotifications","hasBroadcastNotifications","checkIfShouldNotify","body","messageSender","messageAction","actionTargetMessage","targetUserId","actionTargetUserId","targetChatId","actionTargetChatId","actionTargetUser","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","getTime","floor","today","setHours","formatTime","yesterday","setDate","getDate","formatFullDate","sortUserIds","usersById","priorityIds","expires","getUserColorKey","peer","abs","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","getChatSlowModeOptions","slowMode","getChatOrder","max","joinDate","isChatArchived","notifySettings","isMuted","getCanDeleteChat","prepareFolderListIds","chatsById","folder","chatIdsCache","excludedChatIds","includedChatIds","excludeArchived","excludeMuted","unreadMentionsCount","hasUnreadMark","excludeRead","bots","contacts","isContact","nonContacts","groups","channels","filterChatFolder","prepareChatList","folderType","chatFilter","listedChats","listIdsSet","pinnedChats","otherChats","getFolderUnreadDialogs","unreadDialogsCount","total","hasActiveDialogs","getFolderDescriptionText","emoticon","description","pinnedIds","getFolderChatsCount","isChat","chatOrUser","sortChatIds","chatIds","shouldPrioritizeVerified","priority","isVerified","Button","ref","onContextMenu","onMouseDown","onMouseEnter","onMouseLeave","onFocus","pill","fluid","isText","isLoading","ariaLabel","download","disabled","ripple","faded","tabIndex","elementRef","isClicked","setIsClicked","fullClassName","handleMouseDown","aria-label","NON_BUBBLEABLE_EVENTS","delegationRegistry","delegatedEventsByElement","documentEventCounters","element","propName","handler","eventName","resolveEventName","canUseEventDelegation","handleEvent","resolveDelegationRegistryForName","existing","newSet","resolveDelegatedEventsForElement","add","addDelegatedListener","removeEventListener","removeDelegatedListener","tagName","realEventName","eventNames","realEvent","events","furtherCallsPrevented","stopPropagation","Proxy","Reflect","setValue","isOpen","onCloseTransitionEnd","noOpenTransition","noCloseTransition","isClosed","setIsClosed","closeTimeoutRef","hasOpenClassName","setHasOpenClassName","isClosing","shouldRender","transitionClassNames","WEEKDAYS_FULL","MONTHS_FULL","MONTHS_FULL_LOWERCASE","month","getDayStart","datetime","getDayStartAt","toYearMonth","timestamp","getFullYear","getMonth","toIsoString","getHours","padStart","getMinutes","formatPastTimeShort","weekAgo","getDay","withYear","formatDate","formatMonthAndYear","isShort","formatHumanDate","noWeekdays","lowerFirst","upperFirst","weekAhead","weekDay","day","monthIndex","formatMediaDateTime","formatMediaDuration","hours","minutes","seconds","string","formatVoiceRecordDuration","durationInMs","milliseconds","formatDateToString","toLocaleString","year","isValidDate","MAX_MONTH_IN_YEAR","parseDateString","matchStringDate","matchEuropeStringDate","matchNumberDate","dateParts","findIndex","timestampPlusDay","MILISECONDS_IN_DAY","toUpperCase","replaceChatListIds","newIds","updateChatListIds","idsUpdate","replaceChats","newById","updateChat","chatUpdate","shouldOmitMinInfo","isMin","updatedChat","photos","updateChats","updatedById","addChats","addedById","updateChatListType","listType","currentListIds","listTypeKey","currentFolderList","updateChatListSecondaryInfo","info","totalCountKey","totalCount","totalChatCount","isFullyLoaded","updateCurrentMessageList","replaceChatMessages","updateMessageStore","replaceThreadParam","paramName","threadUpdate","updateThread","addMessages","addedByChatId","messagesByChatId","addChatMessagesById","newId","updateChatMessage","messageUpdate","updatedMessage","updateScheduledMessage","replaceScheduledMessages","deleteChatMessages","deletedForwardedPosts","isLinkedChannelPost","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","exitMessageSelectMode","updateStickerSets","category","sets","resultIds","updatedSets","stickerSet","setIds","updateStickerSet","stickerSetId","currentStickerSet","updateGifSearch","isNew","results","nextOffset","currentResults","newResults","currentIds","gif","replaceAnimatedEmojis","updateStickersForEmoji","remoteStickers","allStickers","uniqueIds","forEmoji","rebuildStickersForEmoji","replaceUsers","updateUser","userUpdate","contactUserIds","updatedUser","updateUsers","addUsers","updateSelectedUserId","deleteUser","MEMO_EMPTY_ARRAY","getComplexKey","updateGlobalSearch","searchStatePartial","updateGlobalSearchContent","currentContent","updateGlobalSearchResults","newFoundMessages","nextRate","resultsByType","newFoundMessagesById","foundIdsForType","foundIds","updateGlobalSearchFetchingStatus","prevFoundIds","newFoundIds","foundOrPrevFoundIds","nextOffsetId","newState","fetchingStatus","replaceLocalTextSearch","searchParams","updateLocalTextSearch","replaceLocalTextSearchResults","updateLocalTextSearchResults","orderFoundIds","replaceLocalMediaSearch","updateLocalMediaSearchType","currentType","updateLocalMediaSearchResults","replaceLocalMediaSearchResults","updateManagementProgress","updateManagement","newSettings","replaceThemeSettings","theme","themes","addNotifyException","notifyException","updateNotifySettings","peerType","isSilent","shouldShowPreviews","hasPrivateChatsMessagePreview","hasGroupMessagePreview","hasBroadcastMessagePreview","addBlockedContact","contactId","blocked","removeBlockedContact","updateTwoFaSettings","twoFaSettings","updateShippingOptions","shippingOptions","setRequestInfoId","setPaymentStep","step","setInvoiceMessageInfo","photoUrl","invoiceContent","setStripeCardInfo","cardInfo","setPaymentForm","form","setReceipt","receipt","messageInvoice","clearPayment","closeInvoice","isPaymentModalOpen","setTrigger","trigger","trimText","MenuItem","destructive","handleKeyDown","keyCode","data-char","origin","role","onKeyDown","ripples","setRipples","cleanUpDebounced","button","currentTarget","position","getBoundingClientRect","rippleSize","offsetWidth","x","clientX","y","clientY","EMPTY_IMAGE_DATA_URI","webpToPng","initWebpWorker","wasmReady","requests","getDecodePromise","ImageData","putImageData","toBlob","createPng","webpToPngBase64","pngBlob","WebpWorker","onmessage","handleLibWebpMessage","usePrevious","next","shouldSkipUndefined","label","success","readOnly","placeholder","autoComplete","inputMode","maxLength","onChange","onInput","onKeyPress","onBlur","labelText","htmlFor","subLabel","checked","blocking","onCheck","handleChange","captureEscKeyListener","captureKeyboardListener","onEsc","isAnimating","dispatchHeavyAnimationEvent","dispatchEvent","Event","handleAnimationStart","handleAnimationEnd","formatFixedNumber","number","toFixed","formatIntegerCompact","views","getFirstLetters","phrase","word","RE_NOT_LETTER","searchWords","haystack","needle","haystackWords","needleWord","haystackWord","Menu","containerRef","positionX","positionY","autoClose","footer","noCloseOnBackdrop","onCloseAnimationEnd","onClose","menuRef","backdropContainerRef","useShowTransition","useEffectWithPrevDeps","prevIsOpen","onSelectWithEnter","focusedIndex","setFocusedIndex","focusedElement","activeElement","elementChildren","newIndex","useKeyboardListNavigation","useVirtualBackdrop","bubbleClassName","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","getFromMemory","cancelProgress","mediaData","fullSize","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","IS_LANDSCAPE","isLandscape","windowSize","updateSizes","handleResize","vh","setProperty","utf16","len","RangeError","adapt","delta","numpoints","firsttime","k","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","prevDeps","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","getShippingError","errors","cur","currentInstance","animateSingle","tick","instance","isCancelled","animate","DropdownMenu","dropdownRef","setIsOpen","menu","onTrigger","RE_EMOJI_ONLY","twemojiRegex","DETECT_UP_TO","emojiCount","EXCLUDE_EMOJIS","unifiedToNative","unified","codePoints","parseInt","fromCodePoint","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","targetUser","targetMessage","textOptions","maxTextLength","unprocessed","processed","processPlaceholder","isEmbedded","renderChatContent","renderUserContent","renderOriginContent","showQuotes","messageText","renderMessageContent","renderProductContent","renderMigratedContent","replaceValue","placeholderPosition","MESSAGE_DELETED","openChatByUsername","isInitialized","HEX_COLOR_REGEX","lerp","start","end","interpolationRatio","colors","themeColors","hexToRgb","hex","g","applyColorAnimationStep","startIndex","endIndex","propertyColors","withAnimation","isDarkTheme","shouldAnimate","startAt","themeColorTag","querySelector","classList","remove","transition","updateAppBadge","setAppBadge","contains","animationLevel","messageTextSize","language","switchTheme","uiReadyState","authPhoneNumber","authRememberMe","authError","legacySessionJson","dcID","legacySessionMainDc","parse","legacySessionMainKeyRaw","apiUpdate","authIsLoading","password","file","authIsLoadingQrCode","sessionId","sessionJson","setItem","mainDcId","legacySession","dcId","exportLegacySession","reset","langChachePrefix","langCacheVersion","init","connectionState","authNearestCountry","onUpdateApiReady","wasAuthReady","authState","authorizationState","isLoggingOut","authIsCodeViaApp","isCodeViaApp","authHint","hint","authQrCode","qrCode","saveSession","lastSyncTime","onUpdateAuthorizationState","onUpdateAuthorizationError","sync","signOut","onUpdateConnectionState","currentUser","updateLegacySessionUserId","onUpdateCurrentUser","showError","ServiceWorkerNoSupportError","setPrototypeOf","scriptUrl","handleWorkerMessage","register","INITIAL_STATE","isLeftColumnShown","recentEmojis","added","recent","featured","saved","topPeers","audioPlayer","notifications","activeSessions","messageSendKeyCombo","shouldSuggestStickers","light","isBlurred","patternColor","dark","privacy","updateCacheThrottled","isAllowed","reducedGlobal","reduceShowChatInfo","reduceUsers","reduceChats","reduceMessages","recentlyFoundChatIds","reduceSettings","loadCache","initialState","time","timeEnd","readCache","idsToSave","cid","chatIdsToSave","mainThread","history","replaceState","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","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","gotToAuthQrCode","setCountry","setPhoneNumber","isTouched","setIsTouched","lastSelection","setLastSelection","fullNumber","canSubmit","parseFullNumber","newFullNumber","suggestedCountry","selectedCountry","setSelectionRange","handlePhoneNumberChange","selectionStart","selectionEnd","handleKeepSessionChange","isAuthReady","onSubmit","InputText","Checkbox","Loading","AuthCode","useModuleLoader","AuthPassword","AuthRegister","AuthQrCode","AppInactive","appInactivePath","renderMain","disconnect","isInactive","markInactive","hasSession","hasLegacySession","TeactDOM"],"mappings":"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","file":"main.2bacad1be7a118611b52.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\":\"46635a34d22085eb936c\",\"1\":\"7d08855d9784837f4e10\",\"3\":\"d4466bb252b9014004b6\",\"4\":\"b0768c144c69fa913166\",\"5\":\"1497ddf176dcb8025364\",\"6\":\"cfcac5af41fdc3e4930b\",\"7\":\"939146af5e88a5ed7b5d\",\"8\":\"4b6a0d226a59f4513906\",\"9\":\"cd351e40def6e292fca1\"}[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\":\"46635a34d22085eb936c\",\"1\":\"7d08855d9784837f4e10\",\"3\":\"d4466bb252b9014004b6\",\"4\":\"b0768c144c69fa913166\",\"5\":\"1497ddf176dcb8025364\",\"6\":\"cfcac5af41fdc3e4930b\",\"7\":\"939146af5e88a5ed7b5d\",\"8\":\"4b6a0d226a59f4513906\",\"9\":\"cd351e40def6e292fca1\"}[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 = 95);\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 = FC & {\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 = VirtualElementEmpty | VirtualElementText | VirtualElementTag | VirtualElementComponent;\nexport type VirtualRealElement = VirtualElementTag | 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 force cleaning as many objects as possible. Not sure this is needed at all.\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.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 // 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 })(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) {\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 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[]) {\n return useLayoutEffectBase(fastRaf, effect, dependencies);\n}\n\nexport function useLayoutEffect(effect: () => Function | void, dependencies?: any[]) {\n return useLayoutEffectBase(onTickEnd, effect, dependencies);\n}\n\nexport function useMemo(resolver: () => T, dependencies: any[]): 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 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, withDebug = false) {\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 && withDebug) {\n // eslint-disable-next-line no-console\n console.log(\n `[Teact.memo] ${Component.name}: 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","export const PAGE_TITLE = 'Telegram';\nexport const INACTIVE_MARKER = ' [Inactive]';\n\nexport const 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 GRAMJS_SESSION_ID_KEY = 'GramJs:sessionId';\nexport const LEGACY_SESSION_KEY = 'user_auth';\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-v3';\nexport const ASSET_CACHE_NAME = 'tt-assets';\n\nexport const API_UPDATE_THROTTLE = 300;\nexport const API_THROTTLE_RESET_UPDATES = new Set([\n 'newMessage', 'newScheduledMessage', 'deleteMessages', 'deleteScheduledMessages', 'deleteHistory',\n]);\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;\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 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 MEMOJI_STICKER_ID = 'MEMOJI_STICKER';\n\nexport const MENU_TRANSITION_DURATION = 200;\nexport const SLIDE_TRANSITION_DURATION = 450;\nexport const LAYERS_TRANSITION_DURATION = 450;\n\nexport const CONTENT_TYPES_FOR_QUICK_UPLOAD = 'image/png,image/gif,image/jpeg,video/mp4,video/avi,video/quicktime';\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,6})\\\\b([-a-zA-Z0-9()@:%_+.~#?&/=]*)';\nexport const RE_TME_LINK = /^(?:https?:\\/\\/)?(?:t\\.me\\/)([\\d\\w_]+)(?:\\/([\\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_PACK = 'android';\nexport const LANG_PACKS = ['android', 'ios', 'tdesktop', 'macos'];\nexport const TIPS_USERNAME = 'TelegramTips';\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 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\nexport function setGlobal(newGlobal?: GlobalState) {\n if (typeof newGlobal === 'object' && newGlobal !== currentGlobal) {\n currentGlobal = newGlobal;\n runCallbacksThrottled();\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) {\n if (reducers[name]) {\n reducers[name].forEach((reducer) => {\n const newGlobal = reducer(currentGlobal, actions, payload);\n if (newGlobal) {\n setGlobal(newGlobal);\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) => {\n onDispatch(name, payload);\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('GLOBAL CONTAINERS', orderBy(Object.values(containers), 'DEBUG_updates', 'desc'));\n });\n}\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');\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 if (message.groupedId) {\n return `${noEmoji ? '' : '🖼 '}${text ? text.text : lang('lng_in_dlg_album')}`;\n }\n\n if (photo) {\n return `${noEmoji ? '' : '🖼 '}${text ? text.text : lang('AttachPhoto')}`;\n }\n\n if (video) {\n return `${noEmoji ? '' : '📹 '}${text ? text.text : lang(video.isGif ? 'AttachGif' : 'AttachVideo')}`;\n }\n\n if (sticker) {\n return `${sticker.emoji} ${lang('AttachSticker')} `;\n }\n\n if (audio) {\n const caption = [audio.title, audio.performer].filter(Boolean).join(' — ') || (text && text.text);\n return `${noEmoji ? '' : '🎧 '}${caption || lang('AttachMusic')}`;\n }\n\n if (voice) {\n return `${noEmoji ? '' : '🎤 '}${text ? text.text : lang('AttachAudio')}`;\n }\n\n if (document) {\n return `${noEmoji ? '' : '📎 '}${text ? text.text : 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 text.text;\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","import {\n ApiAudio, ApiMediaFormat, ApiMessage, ApiMessageSearchType, ApiPhoto, ApiVideo,\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\nexport type IDimensions = {\n width: number;\n height: number;\n};\n\ntype Target = 'micro' | 'pictogram' | 'inline' | 'viewerPreview' | 'viewerFull' | 'download';\n\nconst MAX_INLINE_VIDEO_SIZE = 10 * 1024 ** 2; // 10 MB\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 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 getMessageMediaThumbnail(message: ApiMessage) {\n const media = getMessagePhoto(message)\n || getMessageVideo(message)\n || getMessageDocument(message)\n || getMessageSticker(message)\n || getMessageWebPagePhoto(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\n if (!(photo || video || sticker || webPagePhoto || audio || voice || document)) {\n return undefined;\n }\n\n const base = getMessageKey(message);\n\n if (photo || webPagePhoto) {\n switch (target) {\n case 'micro':\n case 'pictogram':\n return `${base}?size=m`;\n case 'inline':\n if (hasMessageLocalBlobUrl(message)) {\n return undefined;\n }\n\n return `${base}?size=x`;\n case 'viewerPreview':\n return `${base}?size=x`;\n case 'viewerFull':\n return `${base}?size=z`;\n }\n }\n\n if (video) {\n switch (target) {\n case 'micro':\n case 'pictogram':\n return `${base}?size=m`;\n case 'inline':\n if (hasMessageLocalBlobUrl(message)) {\n return undefined;\n }\n\n if (canMessagePlayVideoInline(video)) {\n return getVideoOrAudioBaseHash(video, base);\n }\n\n return `${base}?size=z`;\n case 'viewerPreview':\n return `${base}?size=m`;\n case 'viewerFull':\n return getVideoOrAudioBaseHash(video, base);\n case 'download':\n return `${base}?download`;\n }\n }\n\n if (document) {\n switch (target) {\n case 'micro':\n case 'pictogram':\n case 'inline':\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 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 if (sticker && target === 'inline' && sticker.isAnimated) {\n return ApiMediaFormat.Lottie;\n } else if (video && IS_PROGRESSIVE_SUPPORTED && (\n (target === 'viewerFull') || (target === 'inline' && canMessagePlayVideoInline(video))\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 getMessageMediaFilename(message: ApiMessage) {\n const { photo, video, webPage } = message.content;\n\n if (photo || (webPage && webPage.photo)) {\n return `photo${message.date}.jpeg`;\n }\n\n if (video) {\n return video.fileName;\n }\n\n return undefined;\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 canMessagePlayVideoInline(video: ApiVideo): boolean {\n return video.isGif || video.isRound || video.size <= MAX_INLINE_VIDEO_SIZE;\n}\n\nexport function getChatMediaMessageIds(\n messages: Record, listedIds: number[], reverseOrder = false,\n) {\n const ids = getMessageContentIds(messages, listedIds, 'media');\n\n return reverseOrder ? ids.reverse() : ids;\n}\n\nexport function getPhotoFullDimensions(photo: ApiPhoto): IDimensions | 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): IDimensions | 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): IDimensions | undefined {\n if (video.width && video.height) {\n return video as IDimensions;\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,\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 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;\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 { ApiDocument } from './messages';\n\nexport * from './users';\nexport * from './chats';\nexport * from './messages';\nexport * from './updates';\nexport * from './media';\nexport * from './payments';\nexport * from './settings';\n\nexport interface ApiOnProgress {\n (\n progress: number, // Float between 0 and 1.\n ...args: any[]\n ): void;\n\n isCanceled?: boolean;\n acceptsBuffer?: boolean;\n}\n\nexport interface ApiAttachment {\n blobUrl: string;\n filename: string;\n mimeType: string;\n size: number;\n quick?: {\n width: number;\n height: number;\n duration?: number;\n };\n voice?: {\n duration: number;\n waveform: number[];\n };\n previewBlobUrl?: string;\n}\n\nexport interface ApiWallpaper {\n slug: string;\n document: ApiDocument;\n}\n\nexport interface ApiSession {\n hash: string;\n isCurrent: boolean;\n isOfficialApp: boolean;\n isPasswordPending: boolean;\n deviceModel: string;\n platform: string;\n systemVersion: string;\n appName: string;\n appVersion: string;\n dateCreated: number;\n dateActive: number;\n ip: string;\n country: string;\n region: string;\n}\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\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} 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 && 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 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 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 isMessageEditable = (\n (isChatWithSelf || Date.now() - 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 canDeleteForAll = canDelete && !isServiceNotification && (\n (isPrivate && !isChatWithSelf)\n || (isBasicGroup && (\n isOwn || getHasAdminRight(chat, 'deleteMessages')\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 canDeleteForAll,\n canForward,\n canFaveSticker,\n canUnfaveSticker,\n canCopy,\n canCopyLink,\n canSelect,\n };\n}\n\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 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);\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 { RightColumnContent } from '../../types';\n\nimport { IS_MOBILE_SCREEN } 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 } = global;\n\n const isPollResults = selectIsPollResultsOpen(global);\n const isSearch = Boolean(!IS_MOBILE_SCREEN && 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 ) : 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","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","import {\n MOBILE_SCREEN_MAX_WIDTH,\n MOBILE_SCREEN_LANDSCAPE_MAX_HEIGHT,\n MOBILE_SCREEN_LANDSCAPE_MAX_WIDTH,\n} from '../config';\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: 'Mac OS' | 'iOS' | 'Windows' | 'Android' | 'Linux' | undefined;\n\n if (macosPlatforms.indexOf(platform) !== -1) {\n os = 'Mac OS';\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 === 'Mac OS';\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);\n\nexport const IS_TOUCH_ENV = window.matchMedia('(pointer: coarse)').matches;\n// Keep in mind the landscape orientation\nexport const IS_MOBILE_SCREEN = window.innerWidth <= MOBILE_SCREEN_MAX_WIDTH || (\n window.innerWidth <= MOBILE_SCREEN_LANDSCAPE_MAX_WIDTH && window.innerHeight <= MOBILE_SCREEN_LANDSCAPE_MAX_HEIGHT\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 = 'filter' in (document.createElement('canvas').getContext('2d') || {});\n\nexport const DPR = window.devicePixelRatio || 1;\n\nexport const MASK_IMAGE_DISABLED = true;\n\nlet 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","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","import Worker from 'worker-loader!./worker';\n\nimport { 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, sessionInfo = '') {\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: [sessionInfo],\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","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","// 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 const request = new Request(key);\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 const request = new Request(key);\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 { 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 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","// 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 { 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","// 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 Caledonia\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","export default __webpack_public_path__ + \"en-extra.e73049da90714ecdae3233e8ffa74d39.json\";","export default __webpack_public_path__ + \"es-extra.b80575cdf988e1a7e3a915abe97f63b4.json\";","export default __webpack_public_path__ + \"it-extra.78e5568451a888818c7e2209e05a9602.json\";","export default __webpack_public_path__ + \"pl-extra.38fd67a6c26e58f5c912568332c7c074.json\";","export default __webpack_public_path__ + \"ru-extra.5761b75bfbe92bb46eb8bba9acbdbb4c.json\";","import { ApiLangPack } from '../api/types';\n\nimport { DEBUG, LANG_CACHE_NAME, LANG_PACKS } from '../config';\nimport * as cacheApi from './cacheApi';\nimport { callApi } from '../api/gramjs';\nimport { createCallbackManager } from './callbacks';\nimport { mapValues } from './iteratees';\n\nimport enExtraJson from '../assets/lang/en-extra.json';\nimport esExtraJson from '../assets/lang/es-extra.json';\nimport itExtraJson from '../assets/lang/it-extra.json';\nimport plExtraJson from '../assets/lang/pl-extra.json';\nimport ruExtraJson from '../assets/lang/ru-extra.json';\nimport { formatInteger } from './textFormat';\n\nconst EXTRA_PACK_PATHS: Record = {\n en: enExtraJson as unknown as string,\n es: esExtraJson as unknown as string,\n it: itExtraJson as unknown as string,\n pl: plExtraJson as unknown as string,\n ru: ruExtraJson as unknown as string,\n};\n\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;\n\nconst {\n addCallback,\n removeCallback,\n runCallbacks,\n} = createCallbackManager();\n\nexport { addCallback, removeCallback };\n\nlet currentLangCode: string | undefined;\n\nexport async function setLanguage(langCode: string, callback?: NoneToVoidFunction) {\n if (langPack && langCode === currentLangCode) {\n document.documentElement.lang = langCode;\n if (callback) {\n callback();\n }\n\n return;\n }\n\n const newLangPack = await fetchFromCacheOrRemote(langCode);\n if (!newLangPack) {\n return;\n }\n\n if (EXTRA_PACK_PATHS[langCode]) {\n try {\n const response = await fetch(EXTRA_PACK_PATHS[langCode]);\n const pairs = await response.json();\n const extraLangPack = mapValues(pairs, (value, key) => ({ key, value }));\n\n Object.assign(newLangPack, extraLangPack);\n } catch (err) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.error(err);\n }\n }\n }\n\n cache.clear();\n\n currentLangCode = langCode;\n langPack = newLangPack;\n document.documentElement.lang = langCode;\n\n if (callback) {\n callback();\n }\n\n runCallbacks(langPack);\n}\n\nexport function getTranslation(key: string, value?: any, format?: 'i') {\n if (value !== undefined) {\n const cached = cache.get(`${key}_${value}_${format}`);\n if (cached) {\n return cached;\n }\n }\n\n if (!langPack) {\n return key;\n }\n\n const langString = langPack[key];\n if (!langString) {\n return key;\n }\n\n const template = langString[typeof value === 'number' ? getPluralOption(value) : 'value'];\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 cache.set(`${key}_${value}_${format}`, result);\n return result;\n }\n\n return template;\n}\n\nasync function fetchFromCacheOrRemote(langCode: string): Promise {\n const cached = await cacheApi.fetch(LANG_CACHE_NAME, langCode, cacheApi.Type.Json);\n if (cached) {\n return cached;\n }\n\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\nfunction getPluralOption(amount: number) {\n const optionIndex = currentLangCode && PLURAL_RULES[currentLangCode as keyof typeof PLURAL_RULES]\n ? PLURAL_RULES[currentLangCode as keyof typeof PLURAL_RULES](amount)\n : 0;\n\n return PLURAL_OPTIONS[optionIndex];\n}\n\nfunction processTemplate(template: string, value: any) {\n return template.replace(/%\\d?\\$?[sdf@]/, String(value));\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 {\n ApiLanguage, ApiMessage, ApiStickerSet, ApiShippingAddress,\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';\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 interface ISettings extends NotifySettings, Record {\n theme: ThemeKey;\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: 'en' | 'fr' | 'de' | 'it' | 'pt' | 'ru' | 'es' | 'uk';\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}\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 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","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, GLOBAL_STATE_CACHE_KEY } 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;\nconst STARTUP_TIMEOUT = 5000;\n\nconst startedAt = Date.now();\nlet isReloading = false;\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 (isReloading) {\n return;\n }\n\n // For startup errors, we just clean the cache and refresh the page\n if (Date.now() - startedAt <= STARTUP_TIMEOUT && localStorage.getItem(GLOBAL_STATE_CACHE_KEY)) {\n localStorage.removeItem(GLOBAL_STATE_CACHE_KEY);\n\n isReloading = true;\n window.location.reload();\n\n return;\n }\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","import React from '../../../lib/teact/teact';\nimport EMOJI_REGEX, { removeVS16s } from '../../../lib/twemojiRegex';\n\nimport { RE_LINK_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 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 IS_EMOJI_SUPPORTED\n ? {emoji}\n : (\n \n ),\n );\n }\n if (type === 'html') {\n emojiResult.push(\n IS_EMOJI_SUPPORTED\n ? emoji\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, 'ig');\nconst RE_MENTION = /@[\\w\\d_-]+/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) || []), ...(part.match(RE_MENTION) || [])];\n if (!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","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.filter((prop) => currentProps[prop] !== newProps[prop]);\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 onClick?: (e: React.MouseEvent) => void;\n};\n\nconst Link: FC = ({ children, className, onClick }) => {\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 } 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 { 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\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// Load notification settings from the api\nasync function loadNotificationSettings() {\n const [result] = await Promise.all([\n callApi('fetchNotificationSettings'),\n callApi('fetchNotificationExceptions'),\n ]);\n\n if (!result) return;\n setGlobal(replaceSettings(getGlobal(), result));\n}\n\nexport async function subscribe() {\n loadNotificationSettings();\n\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 const global = getGlobal();\n\n if (selectIsChatMuted(chat, selectNotifySettings(global), selectNotifyExceptions(global)) || chat.isNotJoined) {\n return false;\n }\n\n // Dont show notification for active chat if client has focus\n if (isActive && document.hasFocus()) return false;\n\n switch (chat.type) {\n case 'chatTypePrivate':\n case 'chatTypeSecret':\n return Boolean(global.settings.byKey.hasPrivateChatsNotifications);\n case 'chatTypeBasicGroup':\n case 'chatTypeSuperGroup':\n return Boolean(global.settings.byKey.hasGroupNotifications);\n case 'chatTypeChannel':\n return Boolean(global.settings.byKey.hasBroadcastNotifications);\n }\n return false;\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 targetUserId: actionTargetUserId,\n targetChatId: actionTargetChatId,\n } = messageAction || {};\n const actionTargetUser = actionTargetUserId ? selectUser(global, actionTargetUserId) : 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 actionTargetUser,\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 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 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) {\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();\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 if (wasOnlineDate > today) {\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 today.setHours(0, 0, 0, 0);\n if (wasOnlineDate > yesterday) {\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) {\n return orderBy(userIds, (id) => {\n const now = Date.now() / 1000;\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';\nimport { NotifyException, NotifySettings } from '../../types';\n\nimport { ARCHIVED_FOLDER_ID } from '../../config';\nimport { orderBy } from '../../util/iteratees';\nimport { getUserFirstOrLastName } from './users';\nimport { LangFn } from '../../hooks/useLang';\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 const { inviteLink } = chat.fullInfo || {};\n\n if (inviteLink && inviteLink.length) {\n return inviteLink;\n }\n\n return username ? `t.me/${username}` : '';\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(chat: ApiChat) {\n if (chat.currentUserBannedRights && chat.currentUserBannedRights.sendMessages) {\n return 'You are not allowed to send messages in this chat.';\n }\n if (chat.defaultBannedRights && chat.defaultBannedRights.sendMessages) {\n return 'Sending messages is not allowed in this chat.';\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\nexport function getChatOrder(chat: ApiChat) {\n return Math.max(chat.joinDate || 0, chat.lastMessage ? chat.lastMessage.date : 0);\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 (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 && 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 += 3e9; // ~100 years in seconds\n }\n\n if (priorityIds && priorityIds.includes(id)) {\n // Assuming that last message date can't be less than 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 priority += Date.now() + (priorityIds.length - priorityIds.indexOf(id));\n }\n\n return priority;\n }, 'desc');\n}\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 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}) => {\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 >\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 >\n {isLoading ? (\n
\n Please wait..\n \n
\n ) : children}\n {!disabled && ripple && (\n \n )}\n \n );\n};\n\nexport default Button;\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) {\n const eventName = resolveEventName(propName, element);\n if (canUseEventDelegation(eventName, element)) {\n addDelegatedListener(eventName, element, handler);\n } else {\n element.addEventListener(eventName, handler);\n }\n}\n\nexport function removeEventListener(element: HTMLElement, propName: string, handler: Handler) {\n const eventName = resolveEventName(propName, element);\n if (canUseEventDelegation(eventName, element)) {\n removeDelegatedListener(eventName, element);\n } else {\n element.removeEventListener(eventName, handler);\n }\n}\n\nfunction resolveEventName(propName: string, element: HTMLElement) {\n const eventName = propName.replace(/^on/, '').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) {\n return (\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, 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 { 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 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 const isClosing = Boolean(closeTimeoutRef.current);\n const shouldRender = isOpen || isClosing;\n const transitionClassNames = buildClassName(\n className && 'opacity-transition',\n className,\n hasOpenClassName && 'open',\n shouldRender && 'shown',\n isClosing && 'closing',\n );\n\n return {\n shouldRender,\n transitionClassNames,\n };\n};\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) {\n return date.toLocaleString(\n 'en-US',\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 { 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\nexport function updateChat(\n global: GlobalState, chatId: number, chatUpdate: Partial, photo?: ApiPhoto,\n): GlobalState {\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 global;\n }\n\n return replaceChats(global, {\n ...byId,\n [chatId]: updatedChat,\n });\n}\n\nexport function updateChats(global: GlobalState, updatedById: Record): GlobalState {\n Object.keys(updatedById).forEach((id) => {\n global = updateChat(global, Number(id), updatedById[Number(id)]);\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 Object.keys(addedById).map(Number).forEach((id) => {\n if (!byId[id] || (byId[id].isMin && !addedById[id].isMin)) {\n global = updateChat(global, id, addedById[id]);\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 { GlobalState, MessageListType, Thread } from '../../global/types';\nimport { ApiMessage, ApiThreadInfo, MAIN_THREAD_ID } from '../../api/types';\nimport { FocusDirection } from '../../types';\n\nimport { 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\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): GlobalState {\n return {\n ...global,\n messages: {\n ...global.messages,\n // TODO Support stack navigation\n messageLists: chatId ? [{ chatId, threadId, type }] : undefined,\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 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\n messageIds.forEach((messageId) => {\n if (listedIds && listedIds.includes(messageId)) {\n listedIds = listedIds.filter((id) => id !== messageId);\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 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\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}\nexport function updateUser(global: GlobalState, userId: number, userUpdate: Partial): GlobalState {\n const { byId } = global.users;\n const { hash, userIds: contactUserIds } = global.contactList || {};\n const user = byId[userId];\n const shouldOmitMinInfo = userUpdate.isMin && user && !user.isMin;\n const updatedUser = {\n ...user,\n ...(shouldOmitMinInfo ? omit(userUpdate, ['isMin', 'accessHash']) : userUpdate),\n };\n\n if (!updatedUser.id || !updatedUser.type) {\n return global;\n }\n\n if (updatedUser.isContact && (contactUserIds && !contactUserIds.includes(userId))) {\n global = {\n ...global,\n contactList: {\n hash: hash || 0,\n userIds: [userId, ...contactUserIds],\n },\n };\n }\n\n return replaceUsers(global, {\n ...byId,\n [userId]: updatedUser,\n });\n}\n\nexport function updateUsers(global: GlobalState, updatedById: Record): GlobalState {\n Object.keys(updatedById).map(Number).forEach((id) => {\n global = updateUser(global, id, updatedById[id]);\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 Object.keys(addedById).map(Number).forEach((id) => {\n if (!byId[id] || (byId[id].isMin && !addedById[id].isMin)) {\n global = updateUser(global, id, addedById[id]);\n }\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","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';\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 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 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 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","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","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';\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 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 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 { 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 { ChangeEvent, FormEvent, RefObject } from 'react';\nimport React, { FC, memo } from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\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};\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}) => {\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';\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 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","import { useEffect } from '../lib/teact/teact';\n\nconst ANIMATION_START_EVENT = 'tt-event-heavy-animation-start';\nconst ANIMATION_END_EVENT = 'tt-event-heavy-animation-end';\n\nlet timeout: number | undefined;\nlet isAnimating = false;\n\nexport const dispatchHeavyAnimationEvent = (duration: number) => {\n document.dispatchEvent(new Event(ANIMATION_START_EVENT));\n isAnimating = true;\n\n if (timeout) {\n clearTimeout(timeout);\n timeout = undefined;\n }\n\n timeout = window.setTimeout(() => {\n isAnimating = false;\n document.dispatchEvent(new Event(ANIMATION_END_EVENT));\n timeout = undefined;\n }, duration);\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","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","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 { 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';\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 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}) => {\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 { transitionClassNames } = useShowTransition(isOpen, onCloseAnimationEnd);\n\n useEffect(() => (isOpen && onClose ? captureEscKeyListener(onClose) : undefined), [isOpen, onClose]);\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);\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","import { RefObject } from 'react';\nimport { useState, useCallback, useEffect } from '../lib/teact/teact';\n\nexport default (\n elementRef: RefObject,\n isOpen: boolean,\n onSelectWithEnter?: () => void,\n) => {\n const [focusedIndex, setFocusedIndex] = useState(-1);\n\n useEffect(() => {\n setFocusedIndex(-1);\n }, [isOpen]);\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();\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(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 }, [focusedIndex, elementRef, onSelectWithEnter]);\n\n return handleKeyDown;\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","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 { 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_MOBILE_SCREEN } from './environment';\n\ntype IDimensions = {\n width: number;\n height: number;\n};\n\nconst IS_LANDSCAPE = IS_MOBILE_SCREEN && isLandscape();\n\nlet windowSize = updateSizes();\n\nconst handleResize = throttle(() => {\n windowSize = updateSizes();\n\n if ((isMobileScreen() !== IS_MOBILE_SCREEN) || (IS_MOBILE_SCREEN && IS_LANDSCAPE !== isLandscape())) {\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};\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 { withGlobal } from '../../lib/teact/teactn';\nimport convertPunycode from '../../lib/punycode';\nimport { GlobalActions } from '../../global/types';\n\nimport { DEBUG, RE_TME_INVITE_LINK, RE_TME_LINK } from '../../config';\nimport { pick } from '../../util/iteratees';\nimport buildClassName from '../../util/buildClassName';\n\ntype OwnProps = {\n url?: string;\n text: string;\n className?: string;\n children?: any;\n};\n\ntype DispatchProps = Pick;\n\nconst SafeLink: FC = ({\n url,\n text,\n className,\n children,\n toggleSafeLinkModal,\n openTelegramLink,\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(withGlobal(\n undefined,\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'toggleSafeLinkModal', 'openTelegramLink',\n ]),\n)(SafeLink));\n","import { useEffect } from '../lib/teact/teact';\nimport usePrevious from './usePrevious';\n\nexport default (cb: (args: PT) => void, dependencies: T) => {\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);\n};\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","const 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 getShippingError(errors: Record) {\n return Object.values(errors).reduce((acc, cur) => {\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 children: any;\n};\n\nconst DropdownMenu: FC = ({\n trigger,\n className,\n children,\n positionX = 'left',\n positionY = 'top',\n footer,\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 };\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 };\n\n return (\n \n {trigger({ onTrigger: toggleIsOpen, isOpen })}\n\n \n {children}\n \n
\n );\n};\n\nexport default DropdownMenu;\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);\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);\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 targetUser?: ApiUser,\n targetMessage?: ApiMessage,\n targetChatId?: number,\n options: ActionMessageTextOptions = {},\n) {\n if (!message.content.action) {\n return [];\n }\n const { text } = message.content.action;\n const content: TextPart[] = [];\n const textOptions: ActionMessageTextOptions = { ...options, maxTextLength: 16 };\n\n let unprocessed: string;\n let processed = processPlaceholder(\n text,\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 targetUser\n ? renderUserContent(targetUser, options.asPlain)\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 showQuotes = text && !photo && !video && !document && !sticker;\n let messageText = trimText(text as string, options.maxTextLength)!;\n\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 if (options.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[] {\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 content.push(replaceValue);\n content.push(text.substring(placeholderPosition + placeholder.length));\n\n return content;\n}\n","export interface ApiPhotoSize {\n type: 's' | 'm' | 'x' | 'y' | 'z';\n width: number;\n height: number;\n}\n\nexport interface ApiThumbnail {\n dataUri: string;\n height: number;\n width: number;\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}\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 targetUserId?: number;\n targetChatId?: number;\n type: 'historyClear' | 'other';\n photo?: ApiPhoto;\n}\n\nexport interface ApiWebPage {\n id: number;\n url: string;\n displayUrl: string;\n siteName?: string;\n title?: string;\n description?: string;\n photo?: ApiPhoto;\n hasDocument?: true;\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 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.\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 { 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 { 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__ + \"c9c0072e811220ee46fd.worker.js\");\n};","module.exports = function() {\n return new Worker(__webpack_public_path__ + \"01705582fc3eca0e007b.worker.js\");\n};","module.exports = function() {\n return new Worker(__webpack_public_path__ + \"0dbbe0a906f6c2adf071.worker.js\");\n};","module.exports = function() {\n return new Worker(__webpack_public_path__ + \"a66075669d8d0ac2d740.worker.js\");\n};","import { addReducer } from '../../../lib/teact/teactn';\n\nimport {\n IS_ANDROID, IS_IOS, IS_SAFARI, IS_TOUCH_ENV,\n} from '../../../util/environment';\nimport { setLanguage } from '../../../util/langProvider';\nimport switchTheme from '../../../util/switchTheme';\n\naddReducer('init', (global) => {\n const {\n theme, animationLevel, messageTextSize, language,\n } = global.settings.byKey;\n\n setLanguage(language);\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 > 0);\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 }\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","import {\n addReducer, getDispatch, getGlobal, setGlobal,\n} from '../../../lib/teact/teactn';\n\nimport { GlobalState } from '../../../global/types';\n\nimport {\n LANG_CACHE_NAME,\n CUSTOM_BG_CACHE_NAME,\n GRAMJS_SESSION_ID_KEY,\n MEDIA_CACHE_NAME,\n MEDIA_CACHE_NAME_AVATARS,\n MEDIA_PROGRESSIVE_CACHE_NAME,\n LEGACY_SESSION_KEY,\n} from '../../../config';\nimport { initApi, callApi } from '../../../api/gramjs';\nimport { unsubscribe } from '../../../util/notifications';\nimport * as cacheApi from '../../../util/cacheApi';\nimport { updateAppBadge } from '../../../util/appBadge';\n\naddReducer('initApi', (global: GlobalState, actions) => {\n let sessionInfo = localStorage.getItem(GRAMJS_SESSION_ID_KEY) || undefined;\n\n if (!sessionInfo) {\n const legacySessionJson = localStorage.getItem(LEGACY_SESSION_KEY);\n if (legacySessionJson) {\n const { dcID: legacySessionMainDc } = JSON.parse(legacySessionJson);\n const legacySessionMainKeyRaw = localStorage.getItem(`dc${legacySessionMainDc}_auth_key`);\n if (legacySessionMainKeyRaw) {\n const legacySessionMainDcKey = legacySessionMainKeyRaw.replace(/\"/g, '');\n sessionInfo = `session:${legacySessionMainDc}:${legacySessionMainDcKey}`;\n }\n }\n }\n\n void initApi(actions.apiUpdate, sessionInfo);\n});\n\naddReducer('setAuthPhoneNumber', (global, actions, payload) => {\n const { phoneNumber } = payload!;\n\n void callApi('provideAuthPhoneNumber', phoneNumber);\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('gotToAuthQrCode', (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 { sessionId, sessionJson } = payload!;\n localStorage.setItem(GRAMJS_SESSION_ID_KEY, sessionId);\n\n exportLegacySession(sessionJson, global.currentUserId!);\n});\n\naddReducer('signOut', () => {\n (async () => {\n await unsubscribe();\n await callApi('destroy');\n\n getDispatch().reset();\n })();\n});\n\naddReducer('reset', () => {\n localStorage.removeItem(GRAMJS_SESSION_ID_KEY);\n clearLegacySession();\n\n cacheApi.clear(MEDIA_CACHE_NAME);\n cacheApi.clear(MEDIA_CACHE_NAME_AVATARS);\n cacheApi.clear(MEDIA_PROGRESSIVE_CACHE_NAME);\n cacheApi.clear(CUSTOM_BG_CACHE_NAME);\n cacheApi.clear(LANG_CACHE_NAME);\n\n const langChachePrefix = LANG_CACHE_NAME.replace(/\\d+$/, '');\n const langCacheVersion = (LANG_CACHE_NAME.match(/\\d+$/) || [0])[0];\n for (let i = 0; i < langCacheVersion; i++) {\n cacheApi.clear(`${langChachePrefix}${i === 0 ? '' : i}`);\n }\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\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\nfunction exportLegacySession(sessionJson: string, currentUserId: number) {\n const { mainDcId, keys } = JSON.parse(sessionJson);\n const legacySession = { dcID: mainDcId, id: currentUserId };\n localStorage.setItem(LEGACY_SESSION_KEY, JSON.stringify(legacySession));\n localStorage.setItem('dc', mainDcId);\n Object.keys(keys).forEach((dcId) => {\n localStorage.setItem(`dc${dcId}_auth_key`, `\"${keys[dcId]}\"`);\n });\n}\n\nfunction clearLegacySession() {\n localStorage.removeItem('dc5_auth_key');\n localStorage.removeItem('dc4_auth_key');\n localStorage.removeItem('dc3_auth_key');\n localStorage.removeItem('dc2_auth_key');\n localStorage.removeItem('dc1_auth_key');\n localStorage.removeItem('dc');\n localStorage.removeItem(LEGACY_SESSION_KEY);\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 ApiUpdateCurrentUser,\n} from '../../../api/types';\nimport { DEBUG, LEGACY_SESSION_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') {\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 'updateCurrentUser':\n onUpdateCurrentUser(update);\n break;\n\n case 'error':\n if (update.error.message === 'SESSION_REVOKED') {\n actions.signOut();\n }\n\n actions.showError({ error: update.error });\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 const { sessionId, sessionJson } = update;\n if (sessionId && global.authRememberMe) {\n getDispatch().saveSession({ sessionId, sessionJson });\n }\n\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 onUpdateCurrentUser(update: ApiUpdateCurrentUser) {\n const { currentUser } = update;\n\n setGlobal({\n ...updateUser(getGlobal(), currentUser.id, currentUser),\n currentUserId: currentUser.id,\n });\n\n updateLegacySessionUserId(currentUser.id);\n}\n\nfunction updateLegacySessionUserId(currentUserId: number) {\n const legacySessionJson = localStorage.getItem(LEGACY_SESSION_KEY);\n if (!legacySessionJson) return;\n\n const legacySession = JSON.parse(legacySessionJson);\n legacySession.id = currentUserId;\n\n localStorage.setItem(LEGACY_SESSION_KEY, JSON.stringify(legacySession));\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_SERVICE_WORKER_SUPPORTED } from './environment';\nimport { notifyClientReady } from './notifications';\n\ntype WorkerAction = {\n type: string;\n payload: Record;\n};\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 getDispatch().showError({ error: { message: 'SERVICE_WORKER_DISABLED' } });\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';\n\nimport {\n ANIMATION_LEVEL_DEFAULT, DARK_THEME_PATTERN_COLOR, DEFAULT_MESSAGE_TEXT_SIZE_PX, DEFAULT_PATTERN_COLOR,\n} from '../config';\n\nexport const INITIAL_STATE: GlobalState = {\n isLeftColumnShown: true,\n isChatInfoShown: false,\n uiReadyState: 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 },\n\n scheduledMessages: {\n byChatId: {},\n },\n\n chatFolders: {\n byId: {},\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 gifs: {\n saved: {},\n search: {},\n },\n\n globalSearch: {},\n\n localTextSearch: {\n byChatThreadKey: {},\n },\n\n localMediaSearch: {\n byChatId: {},\n },\n\n management: {\n byChatId: {},\n },\n\n topPeers: {},\n\n mediaViewer: {},\n\n audioPlayer: {},\n\n forwardMessages: {},\n\n pollResults: {},\n\n payment: {},\n\n notifications: [],\n\n errors: [],\n\n activeSessions: [],\n\n settings: {\n byKey: {\n messageTextSize: DEFAULT_MESSAGE_TEXT_SIZE_PX,\n animationLevel: ANIMATION_LEVEL_DEFAULT,\n messageSendKeyCombo: 'enter',\n theme: 'light',\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","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 { 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 GRAMJS_SESSION_ID_KEY,\n MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN, GLOBAL_STATE_CACHE_USER_LIST_LIMIT,\n} from '../config';\nimport { IS_MOBILE_SCREEN } from '../util/environment';\nimport { pick } from '../util/iteratees';\nimport { INITIAL_STATE } from './initial';\nimport { selectCurrentMessageList } from '../modules/selectors';\n\nconst UPDATE_THROTTLE = 1000;\n\nconst updateCacheThrottled = throttle(updateCache, UPDATE_THROTTLE, false);\n\nlet isAllowed = false;\n\nexport function initCache() {\n if (GLOBAL_STATE_CACHE_DISABLED) {\n return;\n }\n\n addReducer('saveSession', () => {\n isAllowed = true;\n addCallback(updateCacheThrottled);\n });\n\n addReducer('reset', () => {\n isAllowed = false;\n removeCallback(updateCacheThrottled);\n localStorage.removeItem(GLOBAL_STATE_CACHE_KEY);\n });\n}\n\nexport function loadCache(initialState: GlobalState) {\n if (!GLOBAL_STATE_CACHE_DISABLED) {\n const hasActiveSession = localStorage.getItem(GRAMJS_SESSION_ID_KEY);\n if (hasActiveSession) {\n isAllowed = true;\n addCallback(updateCacheThrottled);\n return readCache(initialState);\n } else {\n isAllowed = false;\n }\n }\n\n return undefined;\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 for new settings 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 }\n\n return {\n ...initialState,\n ...cached,\n };\n}\n\nfunction updateCache() {\n onIdle(() => {\n if (!isAllowed) {\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 'chatFolders',\n 'topPeers',\n 'recentEmojis',\n 'push',\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 };\n\n const json = JSON.stringify(reducedGlobal);\n localStorage.setItem(GLOBAL_STATE_CACHE_KEY, json);\n });\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_MOBILE_SCREEN ? undefined : [{\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","import { addReducer } from '../lib/teact/teactn';\n\nimport { INITIAL_STATE } from './initial';\nimport { initCache, loadCache } from './cache';\nimport { cloneDeep } from '../util/iteratees';\nimport { selectCurrentMessageList } from '../modules/selectors';\n\ninitCache();\n\naddReducer('init', () => {\n const initial = cloneDeep(INITIAL_STATE);\n const newGlobal = loadCache(initial) || initial;\n\n const currentMessageList = selectCurrentMessageList(newGlobal) || {};\n window.history.replaceState(currentMessageList, '');\n\n return newGlobal;\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 } 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 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 && (\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 } = global.settings.byKey;\n const { background, backgroundColor } = global.settings.themes[theme] || {};\n\n return {\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 React, {\n FC, useState, memo, useCallback, useRef,\n} from '../../lib/teact/teact';\n\nimport { countryList } from '../../util/phoneNumber';\nimport searchWords from '../../util/searchWords';\nimport buildClassName from '../../util/buildClassName';\nimport renderText from '../common/helpers/renderText';\n\nimport DropdownMenu from '../ui/DropdownMenu';\nimport MenuItem from '../ui/MenuItem';\nimport Spinner from '../ui/Spinner';\n\nimport './CountryCodeInput.scss';\nimport { ANIMATION_END_DELAY } from '../../config';\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 // 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 No countries matched your filter.\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 { GlobalActions, GlobalState } from '../../global/types';\nimport React, {\n FC, memo, useCallback, useEffect, useLayoutEffect, useRef, useState,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\nimport { 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';\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;\ntype DispatchProps = Pick;\n\nconst MIN_NUMBER_LENGTH = 10;\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 setAuthPhoneNumber,\n setAuthRememberMe,\n loadNearestCountry,\n clearAuthError,\n gotToAuthQrCode,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef(null);\n\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\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 const suggestedCountry = getCountryFromPhoneNumber(newFullNumber);\n const selectedCountry = !country || (suggestedCountry && suggestedCountry.id !== country.id)\n ? suggestedCountry\n : country;\n\n if (!newFullNumber.length) {\n setCountry(undefined);\n } else if (!country || (selectedCountry && selectedCountry.code !== country.code)) {\n setCountry(selectedCountry);\n }\n\n setPhoneNumber(formatPhoneNumber(newFullNumber, selectedCountry));\n }, [country]);\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 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 parseFullNumber(value);\n }, [authError, clearAuthError, 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

Sign in to Telegram

\n

\n Please confirm your country and\n
enter your phone number.\n

\n
\n \n \n \n {canSubmit && (\n isAuthReady ? (\n \n ) : (\n \n )\n )}\n {isAuthReady && (\n \n )}\n \n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => pick(global, [\n 'connectionState',\n 'authState',\n 'authPhoneNumber',\n 'authIsLoading',\n 'authIsLoadingQrCode',\n 'authError',\n 'authRememberMe',\n 'authNearestCountry',\n ]),\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'setAuthPhoneNumber',\n 'setAuthRememberMe',\n 'clearAuthError',\n 'loadNearestCountry',\n 'gotToAuthQrCode',\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","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 AuthQrCodeAsync: FC = () => {\n const AuthQrCode = useModuleLoader(Bundles.Auth, 'AuthQrCode');\n\n return AuthQrCode ? : ;\n};\n\nexport default memo(AuthQrCodeAsync);\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';\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.async';\n\nimport './Auth.scss';\n\ntype StateProps = Pick;\ntype DispatchProps = Pick;\n\nconst Auth: FC = ({ authState, reset, initApi }) => {\n useEffect(() => {\n reset();\n initApi();\n }, [reset, initApi]);\n\n useEffect(() => {\n }, []);\n\n switch (authState) {\n case 'authorizationStateWaitCode':\n return ;\n case 'authorizationStateWaitPassword':\n return ;\n case 'authorizationStateWaitRegistration':\n return ;\n case 'authorizationStateWaitQrCode':\n return ;\n case 'authorizationStateWaitPhoneNumber':\n default:\n return ;\n }\n};\n\nexport default memo(withGlobal(\n (global): StateProps => pick(global, ['authState']),\n (global, actions): DispatchProps => pick(actions, ['reset', 'initApi']),\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 {\n GRAMJS_SESSION_ID_KEY, INACTIVE_MARKER, LEGACY_SESSION_KEY, PAGE_TITLE,\n} 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';\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 const hasSession = localStorage.getItem(GRAMJS_SESSION_ID_KEY);\n const hasLegacySession = localStorage.getItem(LEGACY_SESSION_KEY);\n\n return (hasSession || hasLegacySession) ? 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.4702343722882838bd74.css b/dist/main.4702343722882838bd74.css deleted file mode 100644 index 751ab29dc..000000000 --- a/dist/main.4702343722882838bd74.css +++ /dev/null @@ -1 +0,0 @@ -.Link,.Link:hover{color:inherit}#UiLoader{height:100%}@media (max-width:600px){#UiLoader{height:calc(var(--vh, 1vh)*100)}}#UiLoader .mask{position:fixed;top:0;left:0;right:0;margin:0 auto;width:100%;max-width:1680px;height:100%;z-index:var(--z-ui-loader-mask);display:flex}#UiLoader .mask .left{flex:1;background:var(--color-background);min-width:15.5rem;max-width:26.5rem}@media (min-width:1680px){#UiLoader .mask .left{border-left:1px solid var(--color-borders)}}@media (max-width:1275px){#UiLoader .mask .left{flex:2}}@media (max-width:925px){#UiLoader .mask .left{min-width:26.5rem}}@media (max-width:600px){#UiLoader .mask .left{max-width:none;width:100vw}}#UiLoader .mask .middle{flex:3;border-left:1px solid var(--color-borders);border-right:1px solid var(--color-borders);position:relative;z-index:1;overflow:hidden}#UiLoader .mask .middle:before{content:"";display:block;position:absolute;top:0;left:0;bottom:0;right:0;background:no-repeat 50%;background-size:cover;z-index:-1;transform-origin:left center}.theme-dark body.initial #UiLoader .mask .middle:before{background-color:#0f0f0f}.theme-light body.initial #UiLoader .mask .middle:before,body:not(.initial) #UiLoader .mask .middle:before{background-image:url(chat-bg.f607e788298d8a7de37a3b39b76c1efa.jpg)}#UiLoader .mask .middle.with-right-column:before{transform:scale(.67)}@media screen and (min-width:1276px){#UiLoader .mask .middle:before{margin:-16rem -5rem -20rem 0}}#UiLoader .mask .middle.custom-bg-image:before{margin:-1rem;background-image:none!important}@media (max-width:1275px){#UiLoader .mask .middle{flex:3;border-right:none}}@media (max-width:600px){#UiLoader .mask .middle{display:none}}#UiLoader .mask .right{position:absolute;top:0;right:0;z-index:1;height:100%;width:var(--right-column-width);min-width:15.5rem;max-width:26.5rem;border-left:1px solid var(--color-borders);background:var(--color-background)}#UiLoader .blank{flex:1;background:var(--color-background)}.Spinner{--spinner-size:2rem;position:relative;display:flex;align-items:center;justify-content:center;width:var(--spinner-size);height:var(--spinner-size)}.Spinner>div{position:absolute;top:0;left:0;right:0;bottom:0;background-repeat:no-repeat;background-size:100%;animation-name:spin;animation-duration:1s;animation-iteration-count:infinite;animation-timing-function:linear}.Spinner.with-background:before{content:"";position:absolute;left:-.125rem;top:-.125rem;bottom:-.125rem;right:-.125rem;border-radius:50%;background:rgba(0,0,0,.25)}.Spinner.white>div{background-image:var(--spinner-white-data)}.Spinner.white.with-background>div{background-image:var(--spinner-white-thin-data)}.Spinner.blue>div{background-image:var(--spinner-blue-data)}.theme-dark .Spinner.blue>div{background-image:var(--spinner-dark-blue-data)}.Spinner.black>div{background-image:var(--spinner-black-data)}.Spinner.green>div{background-image:var(--spinner-green-data)}.Spinner.gray>div{background-image:var(--spinner-gray-data)}@keyframes spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}@keyframes ripple-animation{0%{transform:scale(0);opacity:1}50%{opacity:1}to{opacity:0;transform:scale(2)}}.ripple-container{position:absolute;top:0;left:0;bottom:0;right:0}body.animation-level-0 .ripple-container{display:none}.ripple-container span{position:absolute;display:block;background-color:var(--ripple-color,rgba(0,0,0,.08));border-radius:50%;transform:scale(0);animation:ripple-animation .7s}.Button{outline:none!important;display:flex;align-items:center;justify-content:center;width:100%;height:3.5rem;border:0;border-radius:var(--border-radius-default);background:transparent;padding:.625rem;color:#fff;line-height:1.2;cursor:pointer;text-transform:uppercase;flex-shrink:0;position:relative;overflow:hidden;transition:background-color .15s,color .15s;text-decoration:none!important}.Button.clicked,.Button:active,body.animation-level-0 .Button{transition:none!important}.Button.disabled{opacity:.5!important;cursor:default;pointer-events:none}.Button.round{width:3.5rem;border-radius:50%}.Button.round i{font-size:1.5rem}.Button.primary{background:var(--color-primary);color:var(--color-white);--ripple-color:rgba(0,0,0,0.08)}.Button.primary:not(.disabled):not(:disabled).active,.Button.primary:not(.disabled):not(:disabled):active,.Button.primary:not(.disabled):not(:disabled):focus,.Button.primary:not(.disabled):not(:disabled):hover{background:var(--color-primary-shade)}body.animation-level-0 .Button.primary:not(.disabled):not(:disabled):active{background:var(--color-primary-shade-darker)}.Button.secondary{background:var(--color-background);color:rgba(var(--color-text-secondary-rgb),.75);--ripple-color:rgba(0,0,0,0.08)}.Button.secondary:not(.disabled):not(:disabled).active,.Button.secondary:not(.disabled):not(:disabled):active,.Button.secondary:not(.disabled):not(:disabled):focus,.Button.secondary:not(.disabled):not(:disabled):hover{background:var(--color-primary);color:#fff}body.animation-level-0 .Button.secondary:not(.disabled):not(:disabled):active{background:var(--color-primary-shade)}.Button.gray{background:var(--color-background);color:var(--color-text-secondary);--ripple-color:rgba(0,0,0,0.08)}.Button.gray:not(.disabled):not(:disabled).active,.Button.gray:not(.disabled):not(:disabled):active,.Button.gray:not(.disabled):not(:disabled):focus,.Button.gray:not(.disabled):not(:disabled):hover{color:var(--color-primary)}body.animation-level-0 .Button.gray:not(.disabled):not(:disabled):active{background:var(--color-chat-hover)}.Button.danger{background:var(--color-background);color:var(--color-error);--ripple-color:rgba(var(--color-error-rgb),.16)}.Button.danger:not(.disabled):not(:disabled).active,.Button.danger:not(.disabled):not(:disabled):active,.Button.danger:not(.disabled):not(:disabled):focus,.Button.danger:not(.disabled):not(:disabled):hover{background:var(--color-error);color:var(--color-white)}body.animation-level-0 .Button.danger:not(.disabled):not(:disabled):active{background:var(--color-error-shade)}.Button.text{background:none}.Button.text.primary{color:var(--color-primary);background:none}.Button.text.primary:not(.disabled):not(:disabled).active,.Button.text.primary:not(.disabled):not(:disabled):active,.Button.text.primary:not(.disabled):not(:disabled):focus,.Button.text.primary:not(.disabled):not(:disabled):hover{background:rgba(var(--color-primary-shade-rgb),.08)}body.animation-level-0 .Button.text.primary:not(.disabled):not(:disabled):active{background:rgba(var(--color-primary-shade-rgb),.16)}.Button.text.secondary{background:none;color:var(--color-text-secondary)}.Button.text.danger:not(.disabled):not(:disabled).active,.Button.text.danger:not(.disabled):not(:disabled):active,.Button.text.danger:not(.disabled):not(:disabled):focus,.Button.text.danger:not(.disabled):not(:disabled):hover{background:rgba(var(--color-error-rgb),.08);color:var(--color-error)}body.animation-level-0 .Button.text.danger:not(.disabled):not(:disabled):active{background:rgba(var(--color-error-rgb),.16)}.Button.faded{opacity:.75}.Button.faded.activated,.Button.faded:not(.disabled):not(:disabled).active,.Button.faded:not(.disabled):not(:disabled):active,.Button.faded:not(.disabled):not(:disabled):focus,.Button.faded:not(.disabled):not(:disabled):hover{opacity:1}.Button.translucent{background-color:initial;color:var(--color-text-secondary);--ripple-color:var(--color-interactive-element-hover)}.Button.translucent:not(.disabled):not(:disabled).active,.Button.translucent:not(.disabled):not(:disabled):active,.Button.translucent:not(.disabled):not(:disabled):focus,.Button.translucent:not(.disabled):not(:disabled):hover{background-color:var(--color-interactive-element-hover)}body.animation-level-0 .Button.translucent:not(.disabled):not(:disabled):active{background-color:rgba(var(--color-text-secondary-rgb),.16)}.Button.translucent.activated{color:var(--color-primary)}.Button.translucent-white{background-color:initial;color:hsla(0,0%,100%,.5);--ripple-color:hsla(0,0%,100%,0.08)}.Button.translucent-white:not(.disabled):not(:disabled).active,.Button.translucent-white:not(.disabled):not(:disabled):active,.Button.translucent-white:not(.disabled):not(:disabled):focus,.Button.translucent-white:not(.disabled):not(:disabled):hover{background-color:hsla(0,0%,100%,.08);color:#fff}body.animation-level-0 .Button.translucent-white:not(.disabled):not(:disabled):active{background-color:hsla(0,0%,100%,.16)}.Button.dark{background-color:rgba(0,0,0,.75);color:#fff;--ripple-color:hsla(0,0%,100%,0.08)}.Button.dark:not(.disabled):not(:disabled).active,.Button.dark:not(.disabled):not(:disabled):active,.Button.dark:not(.disabled):not(:disabled):focus,.Button.dark:not(.disabled):not(:disabled):hover{background-color:rgba(0,0,0,.85);color:#fff}body.animation-level-0 .Button.dark:not(.disabled):not(:disabled):active{background-color:rgba(0,0,0,.95)}.Button.smaller{height:2.75rem;padding:.3125rem}.Button.smaller.round{width:2.75rem}.Button.smaller.pill{height:2.5rem;border-radius:1.25rem;padding:.3125rem 1rem}.Button.smaller.with-icon{padding-left:.75rem;padding-right:1.25rem}.Button.smaller.with-icon i{font-size:1.5rem;margin-right:.5rem}@media (max-width:600px){.Button.smaller{height:2.5rem}.Button.smaller.round{width:2.5rem}}.Button.tiny{height:2.25rem;padding:.4375rem;border-radius:var(--border-radius-default-small);font-size:.875rem;font-weight:500}.Button.tiny.round{width:2.25rem;height:2.25rem;border-radius:50%}.Button.tiny i{font-size:1.25rem}.Button.tiny.pill{height:2rem;border-radius:1rem;padding:.3125rem 1rem;font-size:1rem}.Button.fluid{padding-left:1.75rem;padding-right:1.75rem;width:auto}.Button.fluid.tiny{padding-left:1.375rem;padding-right:1.375rem}.Button.pill{border-radius:1.75rem;padding-left:1.75rem;padding-right:1.75rem;text-transform:none}.Button.loading{position:relative;pointer-events:none}.Button.loading .Spinner{position:absolute;right:.875rem;top:.875rem;--spinner-size:1.8rem}.Button .emoji{vertical-align:-3px}.Checkbox{display:block;position:relative;padding-left:4.5rem;text-align:left;margin-bottom:1.5rem;line-height:1.5rem;cursor:pointer}.Checkbox.disabled{pointer-events:none;opacity:.5}.Checkbox.round .Checkbox-main:before{border-radius:50%}.Checkbox.round .Checkbox-main:after{background:var(--color-primary) url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTIiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTEzLjkuOEw1LjggOC45IDIuMSA1LjJjLS40LS40LTEuMS0uNC0xLjYgMC0uNC40LS40IDEuMSAwIDEuNkw1IDExLjJjLjQuNCAxLjEuNCAxLjYgMGw4LjktOC45Yy40LS40LjQtMS4xIDAtMS42LS41LS40LTEuMi0uNC0xLjYuMXoiIGZpbGw9IiNGRkYiLz48L3N2Zz4=) no-repeat 50% 50%;background-size:12px;border-radius:50%}.Checkbox.loading .Checkbox-main:after,.Checkbox.loading .Checkbox-main:before{opacity:0!important}.Checkbox.loading .Spinner{position:absolute;left:.375rem;top:.125rem;opacity:0;animation:fade-in .2s ease forwards;--spinner-size:1.25rem}.Checkbox.blocking input:not(:checked)~.Checkbox-main:before{border-color:var(--color-error)}.Checkbox.blocking input:not(:checked)~.Checkbox-main:after{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCI+PGcgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj48cGF0aCBkPSJNMCAwaDI0djI0SDB6Ii8+PHBhdGggZmlsbD0iI2U1MzkzNSIgZmlsbC1ydWxlPSJub256ZXJvIiBkPSJNMTggM2EzIDMgMCAwMTMgM3YxMmEzIDMgMCAwMS0zIDNINmEzIDMgMCAwMS0zLTNWNmEzIDMgMCAwMTMtM2gxMnptLTIgOEg4YTEgMSAwIDAwMCAyaDhhMSAxIDAgMDAwLTJ6Ii8+PC9nPjwvc3ZnPg==);opacity:1;background-size:1.375rem;background-position:-.125rem -.125rem}.Checkbox input{position:absolute;z-index:var(--z-below);opacity:0}.Checkbox .Checkbox-main:after,.Checkbox .Checkbox-main:before{content:"";display:block;position:absolute;left:1.1875rem;top:.1875rem;width:1.125rem;height:1.125rem}.Checkbox .Checkbox-main:before{border:2px solid var(--color-borders-input);border-radius:.25rem;background-color:var(--color-white);transition:border-color .1s ease,background-color .1s ease}.Checkbox .Checkbox-main:after{background:50% no-repeat url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTIiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTEzLjkuOEw1LjggOC45IDIuMSA1LjJjLS40LS40LTEuMS0uNC0xLjYgMC0uNC40LS40IDEuMSAwIDEuNkw1IDExLjJjLjQuNCAxLjEuNCAxLjYgMGw4LjktOC45Yy40LS40LjQtMS4xIDAtMS42LS41LS40LTEuMi0uNC0xLjYuMXoiIGZpbGw9IiNGRkYiLz48L3N2Zz4=);background-size:.875rem;opacity:0;transition:opacity .1s ease}.Checkbox .Checkbox-main .label{display:block}.Checkbox .Checkbox-main .subLabel{display:block;font-size:.875rem;line-height:1rem;color:var(--color-text-secondary)}.Checkbox input:checked~.Checkbox-main:before{border-color:var(--color-primary);background-color:var(--color-primary)}.Checkbox input:checked~.Checkbox-main:after{opacity:1}.Loading{display:flex;height:100%;align-items:center;justify-content:center}.Loading .Spinner{--spinner-size:2.75rem}.Menu.fluid .bubble{min-width:13.5rem;width:auto}.Menu .backdrop{position:fixed;left:-100vw;right:-100vw;top:-100vh;bottom:-100vh;z-index:var(--z-menu-backdrop)}.Menu .bubble{overflow:hidden;display:block;list-style:none;padding:.5rem 0;margin:0;position:absolute;background-color:var(--color-background);box-shadow:0 .25rem .5rem .125rem var(--color-default-shadow);border-radius:var(--border-radius-default);min-width:13.5rem;z-index:var(--z-menu-bubble);transform:scale(.2);transition:opacity .2s cubic-bezier(.2,0,.2,1),transform .2s cubic-bezier(.2,0,.2,1)!important;--offset-y:calc(100% + 0.5rem);--offset-x:0}.Menu .bubble.open{transform:scale(1)}.Menu .bubble.closing{transition:opacity .2s ease-in,transform .2s ease-in!important}body.animation-level-0 .Menu .bubble{transform:none!important;transition:opacity .15s!important}body.has-open-dialog .Menu .bubble{transition:none!important}.Menu .bubble.top{top:var(--offset-y)}.Menu .bubble.bottom{bottom:var(--offset-y)}.Menu .bubble.left{left:var(--offset-x)}.Menu .bubble.right{right:var(--offset-x)}.Menu .bubble.with-footer{padding-bottom:0}.Menu .footer{padding:.5rem 0;background:var(--color-chat-hover);color:var(--color-text-secondary);font-size:.8125rem;text-align:center}.DropdownMenu,.MenuItem{position:relative}.MenuItem{width:100%;background:none;border:none!important;box-shadow:none!important;outline:none!important;display:flex;padding:1rem;overflow:hidden;line-height:1.5rem;white-space:nowrap;color:var(--color-text);--ripple-color:rgba(0,0,0,0.08);cursor:pointer;unicode-bidi:plaintext}.MenuItem:focus,.MenuItem:hover{background-color:var(--color-chat-hover);text-decoration:none;color:inherit}.MenuItem i{font-size:1.5rem;color:var(--color-text-secondary)}.MenuItem .menu-item-name,.MenuItem i{margin-right:2rem}.MenuItem .menu-item-name.capitalize{text-transform:capitalize}.MenuItem.disabled{opacity:.5!important;cursor:default!important}.MenuItem.destructive{color:var(--color-error)}.MenuItem.destructive i{color:inherit}.MenuItem:not(.has-ripple):not(.disabled):active{background-color:var(--color-item-active);transition:none!important}.MenuItem>.Switcher{margin-left:auto}.CountryCodeInput .input-group{cursor:pointer;z-index:var(--z-country-code-input-group)}.CountryCodeInput .input-group .Spinner{position:absolute;top:1rem;right:.75rem;opacity:.5;--spinner-size:1.5rem}.CountryCodeInput .input-group .css-icon-down{position:absolute;top:1.125rem;right:1rem;width:.75rem;height:.75rem;border:2px solid var(--color-text-secondary);border-top:0;border-left:0;transform:scaleY(1) rotate(45deg);transition:color .2s ease,transform .2s ease,top .2s ease}.CountryCodeInput .input-group .css-icon-down.open{border-color:var(--color-primary);transform:scaleY(-1) rotate(45deg);top:1.5rem}.CountryCodeInput .bubble{width:100%;max-height:23.5rem;overflow-y:auto;transform-origin:top center!important;transform:scale(.95)}.CountryCodeInput .bubble.open{transform:scaleY(1)}.CountryCodeInput .MenuItem button{display:flex;align-items:center}.CountryCodeInput .MenuItem.no-results button{justify-content:center;padding:.5rem 1rem}.CountryCodeInput .MenuItem.no-results button span{font-size:.875rem}.CountryCodeInput .country-flag{font-size:2rem;margin-right:2rem}.CountryCodeInput .country-flag .emoji{width:2rem;height:2rem;display:inline-block;vertical-align:4px;margin:-.5rem .125rem}.CountryCodeInput .country-name{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-right:1rem;text-align:left}.CountryCodeInput .country-code{margin-left:auto;opacity:.5}.auth-form{width:100%;max-width:25.5rem;margin:0 auto;padding:6rem 1rem 1rem;text-align:center}@media (min-width:600px) and (min-height:450px){.auth-form{padding:6.8rem 1.5rem 1.5rem}}.auth-form #logo,.auth-form .AvatarEditable label{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){.auth-form #logo,.auth-form .AvatarEditable label{width:10rem;height:10rem;margin-bottom:2.5rem}}.auth-form #logo{background-size:100%;background:url(telegram-logo.df3a91becaa9678c529b4c4cadd45204.svg) 50% no-repeat}.auth-form h2{font-size:1.25rem;line-height:1}@media (min-width:600px){.auth-form h2{font-size:2rem;line-height:1.5}}.auth-form .note{font-size:.875rem;line-height:1.35;margin-bottom:2.5rem;color:var(--color-text-secondary)}@media (min-width:600px){.auth-form .note{font-size:1rem;margin-bottom:3rem}}#auth-code-form,#auth-password-form,#auth-phone-number-form,#auth-qr-form,#auth-registration-form{height:100%;overflow-y:auto}#auth-phone-number-form form{min-height:26.25rem}#auth-phone-number-form .Button{margin-top:2.75rem}#auth-phone-number-form .Button+.Button{margin-top:1rem}#auth-code-form h2,#auth-password-form h2,.auth-number-edit{display:flex;align-items:center;justify-content:center}.auth-number-edit{width:2.5rem;height:2.5rem;padding:.5rem;font-size:1.5rem;color:var(--color-text-secondary);opacity:.75;cursor:pointer}.auth-number-edit:focus,.auth-number-edit:hover{opacity:1}#auth-qr-form .qr-container{height:280px;opacity:1;transform:scale(1);transition:transform .3s cubic-bezier(.34,1.56,.64,1),opacity .3s}#auth-qr-form .qr-container.pre-animate{opacity:.5;transform:scale(.8)}#auth-qr-form h3{margin:1.5rem 0 1rem}#auth-qr-form ol{list-style:none;counter-reset:item;padding:0 2rem}#auth-qr-form ol li{counter-increment:item;text-align:left;margin:.75rem 0;display:flex}#auth-qr-form ol li:before{content:counter(item);display:flex;justify-content:center;align-items:center;min-width:1.4rem;height:1.4rem;padding:0;margin:0 .75rem 0 0;background:var(--color-primary);border-radius:50%;font-size:smaller;color:#fff}#sign-in-password{word-break:normal!important}#AppInactive{height:100%;display:flex;flex-direction:column;align-items:center;justify-content:center}#AppInactive .content{max-width:28rem;margin:auto;padding:1.5rem;text-align:center}#AppInactive .title{margin-top:1rem}#AppInactive .description{color:var(--color-text-secondary);font-size:.875rem}#AppInactive img{width:100%;max-width:20rem}#AppInactive .Button{margin-top:1rem}@font-face{font-family:Roboto;font-style:normal;font-weight:400;font-display:swap;src:local("Roboto"),local("Roboto-Regular"),url(KFOmCnqEu92Fr1Mu72xKKTU1Kvnz.499af208fa04aa805317cf014d869692.woff2) format("woff2");unicode-range:u+0460-052f,u+1c80-1c88,u+20b4,u+2de0-2dff,u+a640-a69f,u+fe2e-fe2f}@font-face{font-family:Roboto;font-style:normal;font-weight:400;font-display:swap;src:local("Roboto"),local("Roboto-Regular"),url(KFOmCnqEu92Fr1Mu5mxKKTU1Kvnz.6b69287db14836e8ccee577d6457b127.woff2) format("woff2");unicode-range:u+0400-045f,u+0490-0491,u+04b0-04b1,u+2116}@font-face{font-family:Roboto;font-style:normal;font-weight:400;font-display:swap;src:local("Roboto"),local("Roboto-Regular"),url(KFOmCnqEu92Fr1Mu7mxKKTU1Kvnz.350ec982325895563ada47d14c7936da.woff2) format("woff2");unicode-range:u+1f??}@font-face{font-family:Roboto;font-style:normal;font-weight:400;font-display:swap;src:local("Roboto"),local("Roboto-Regular"),url(KFOmCnqEu92Fr1Mu4WxKKTU1Kvnz.af30acd9d70ade5b828db02d25348da2.woff2) format("woff2");unicode-range:u+0370-03ff}@font-face{font-family:Roboto;font-style:normal;font-weight:400;font-display:swap;src:local("Roboto"),local("Roboto-Regular"),url(KFOmCnqEu92Fr1Mu7WxKKTU1Kvnz.62afd8a72052ca925aafb4006fddff88.woff2) format("woff2");unicode-range:u+0102-0103,u+0110-0111,u+1ea0-1ef9,u+20ab}@font-face{font-family:Roboto;font-style:normal;font-weight:400;font-display:swap;src:local("Roboto"),local("Roboto-Regular"),url(KFOmCnqEu92Fr1Mu7GxKKTU1Kvnz.009379f5feecd3ef689ad46e029b31e6.woff2) format("woff2");unicode-range:u+0100-024f,u+0259,u+1e??,u+2020,u+20a0-20ab,u+20ad-20cf,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-family:Roboto;font-style:normal;font-weight:400;font-display:swap;src:local("Roboto"),local("Roboto-Regular"),url(KFOmCnqEu92Fr1Mu4mxKKTU1Kg.465390c6e54c60f4a15ff698f372e858.woff2) format("woff2");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+2000-206f,u+2074,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}@font-face{font-family:Roboto;font-style:normal;font-weight:500;font-display:swap;src:local("Roboto Medium"),local("Roboto-Medium"),url(KFOlCnqEu92Fr1MmEU9fCRc4AMP6lbBP.66efaee062df58309edc4cdfaef3f094.woff2) format("woff2");unicode-range:u+0460-052f,u+1c80-1c88,u+20b4,u+2de0-2dff,u+a640-a69f,u+fe2e-fe2f}@font-face{font-family:Roboto;font-style:normal;font-weight:500;font-display:swap;src:local("Roboto Medium"),local("Roboto-Medium"),url(KFOlCnqEu92Fr1MmEU9fABc4AMP6lbBP.3e1bb90afe5eb4a94c5ffdb911fd21d0.woff2) format("woff2");unicode-range:u+0400-045f,u+0490-0491,u+04b0-04b1,u+2116}@font-face{font-family:Roboto;font-style:normal;font-weight:500;font-display:swap;src:local("Roboto Medium"),local("Roboto-Medium"),url(KFOlCnqEu92Fr1MmEU9fCBc4AMP6lbBP.acd64c8bf32762464b8f2c0600dc2b89.woff2) format("woff2");unicode-range:u+1f??}@font-face{font-family:Roboto;font-style:normal;font-weight:500;font-display:swap;src:local("Roboto Medium"),local("Roboto-Medium"),url(KFOlCnqEu92Fr1MmEU9fBxc4AMP6lbBP.cab892ae9aa422233ea43db289e0c038.woff2) format("woff2");unicode-range:u+0370-03ff}@font-face{font-family:Roboto;font-style:normal;font-weight:500;font-display:swap;src:local("Roboto Medium"),local("Roboto-Medium"),url(KFOlCnqEu92Fr1MmEU9fCxc4AMP6lbBP.01bafbfbc1e4ebe0139d259614d5c12d.woff2) format("woff2");unicode-range:u+0102-0103,u+0110-0111,u+1ea0-1ef9,u+20ab}@font-face{font-family:Roboto;font-style:normal;font-weight:500;font-display:swap;src:local("Roboto Medium"),local("Roboto-Medium"),url(KFOlCnqEu92Fr1MmEU9fChc4AMP6lbBP.d3c211af53a789d2f9fd79599baca39a.woff2) format("woff2");unicode-range:u+0100-024f,u+0259,u+1e??,u+2020,u+20a0-20ab,u+20ad-20cf,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-family:Roboto;font-style:normal;font-weight:500;font-display:swap;src:local("Roboto Medium"),local("Roboto-Medium"),url(KFOlCnqEu92Fr1MmEU9fBBc4AMP6lQ.324b1e6d0f5ae7c6ab42fed5516c7b3d.woff2) format("woff2");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+2000-206f,u+2074,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}*,:after,:before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;-ms-overflow-style:scrollbar;-webkit-tap-highlight-color:rgba(0,0,0,0)}article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:left;background-color:#fff}[tabindex="-1"]:focus{outline:none!important}hr{box-sizing:initial;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem;font-weight:500}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0}address{font-style:normal;line-height:inherit}address,dl,ol,ul{margin-bottom:1rem}dl,ol,ul{margin-top:0}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:500}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}dfn{font-style:italic}b,strong{font-weight:500}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:initial}sub{bottom:-.25em}sup{top:-.5em}a{color:var(--color-links);text-decoration:none;background-color:initial;-webkit-text-decoration-skip:objects}a:hover{color:#0056b3;text-decoration:underline}a:not([href]):not([tabindex]),a:not([href]):not([tabindex]):focus,a:not([href]):not([tabindex]):hover{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}code,kbd,pre,samp{font:.9375rem/1.25 Courier,Courier New,Nimbus Mono L,Courier\ 10 Pitch,FreeMono,sans-serif-monospace,monospace;font-size-adjust:.43}pre{margin-top:0;margin-bottom:1rem;overflow:auto;-ms-overflow-style:scrollbar}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg:not(:root){overflow:hidden}[role=button],a,area,button,input:not([type=range]),label,select,summary,textarea{touch-action:manipulation}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#868e96;text-align:left;caption-side:bottom}th{text-align:inherit}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=date],input[type=datetime-local],input[type=month],input[type=time]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:initial}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item}template{display:none}[hidden]{display:none!important}:root{--color-background:#fff;--color-background-selected:#f4f4f5;--color-background-secondary:#f4f4f5;--color-background-secondary-accent:#e4e4e5;--color-background-own:#eefedf;--color-background-own-selected:#d4fcae;--color-background-own-rgb:238,254,223;--color-text:#000;--color-text-lighter:#2e3939;--color-text-secondary:#707579;--color-text-secondary-rgb:112,117,121;--color-text-meta:#686c72;--color-text-meta-rgb:104,108,114;--color-text-meta-colored:#4fae4e;--color-text-green:#4fae4e;--color-text-green-rgb:79,174,78;--color-borders:#dadce0;--color-borders-input:#dadce0;--color-webpage-initial-background:#2e3939;--color-interactive-active:var(--color-primary);--color-interactive-inactive:rgba(var(--color-text-secondary-rgb),0.25);--color-interactive-buffered:rgba(var(--color-text-secondary-rgb),0.25);--color-interactive-element-hover:rgba(var(--color-text-secondary-rgb),0.08);--color-primary:#50a2e9;--color-primary-rgb:80,162,233;--color-primary-shade:#4a95d6;--color-primary-shade-darker:#4388c4;--color-primary-shade-rgb:74,149,214;--color-primary-opacity:rgba(var(--color-primary),0.50);--color-green:#4dcd5e;--color-green-darker:#41ac4f;--color-error:#e53935;--color-error-shade:#d33431;--color-error-rgb:229,57,53;--color-warning:#fb8c00;--color-yellow:#fdd764;--color-links:#52a1ef;--color-links-hover:#2d8dec;--color-links-darker:#157be0;--color-links-darker-hover:#1166ba;--color-own-links:#fff;--color-placeholders:#a2acb4;--color-pinned:#fff;--color-code:#4a729a;--color-code-bg:rgba(112,117,121,0.08);--color-code-own:#3c7940;--color-code-own-bg:rgba(112,117,121,0.08);--color-accent-own:#4fae4e;--color-message-meta-own:#4fae4e;--color-reply-hover:#f4f4f4;--color-reply-active:#e8e9ea;--color-reply-own-hover:#dbf4ce;--color-reply-own-active:#c8ebbc;--color-white:#fff;--color-gray:#c4c9cc;--color-chat-hover:#f4f4f5;--color-chat-active:#5b90e0;--color-item-active:#ededed;--color-selection-highlight:#3993fb;--color-selection-highlight-emoji:rgba(57,147,251,0.7);--color-user-1:#e17076;--color-user-2:#7bc862;--color-user-4:#65aadd;--color-user-5:#a695e7;--color-user-6:#ee7aae;--color-user-7:#6ec9cb;--color-user-8:#faa774;--color-default-shadow:hsla(0,0%,44.7%,0.25);--color-light-shadow:hsla(0,0%,44.7%,0.17);--border-radius-default:0.75rem;--border-radius-default-small:0.625rem;--border-radius-default-tiny:0.375rem;--border-radius-messages:0.75rem;--border-radius-messages-small:0.375rem;--messages-container-width:45.5rem;--right-column-width:26.5rem;--header-height:3.5rem;--symbol-menu-width:26.25rem;--symbol-menu-height:23.25rem;--symbol-menu-footer-height:3rem;--z-ui-loader-mask:2000;--z-notification:1000;--z-right-column:900;--z-header-menu:990;--z-header-menu-backdrop:980;--z-modal:1000;--z-media-viewer:1500;--z-drop-area:55;--z-animation-fade:50;--z-menu-bubble:21;--z-menu-backdrop:20;--z-message-highlighted:13;--z-message-context-menu:12;--z-mobile-search:11;--z-middle-header:10;--z-middle-footer:10;--z-country-code-input-group:10;--z-message-select-control:9;--z-message-select-area:8;--z-sticky-date:9;--z-register-add-avatar:5;--z-media-viewer-head:3;--z-below:-1;--spinner-white-data:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZD0iTTEwLjggMjIuNEM2IDIxLjkgMi4xIDE4IDEuNiAxMy4yLjkgNy4xIDUuNCAxLjkgMTEuMyAxLjVjLjQgMCAuNy0uMy43LS43IDAtLjQtLjQtLjgtLjgtLjhDNC44LjQtLjIgNS45IDAgMTIuNS4yIDE4LjYgNS40IDIzLjggMTEuNSAyNGM2LjYuMiAxMi00LjggMTIuNC0xMS4yIDAtLjQtLjMtLjgtLjgtLjgtLjQgMC0uNy4zLS43LjctLjMgNS45LTUuNSAxMC40LTExLjYgOS43eiIgZmlsbD0iI2ZmZiIvPjwvc3ZnPg==);--spinner-white-thin-data:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTEyIDIzQzUuOSAyMyAxIDE4LjEgMSAxMlM1LjkgMSAxMiAxVjBDNS40IDAgMCA1LjQgMCAxMnM1LjQgMTIgMTIgMTIgMTItNS40IDEyLTEyaC0xYzAgNi4xLTQuOSAxMS0xMSAxMXoiLz48L3N2Zz4=);--spinner-blue-data:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZD0iTTEwLjggMjIuNEM2IDIxLjkgMi4xIDE4IDEuNiAxMy4yLjkgNy4xIDUuNCAxLjkgMTEuMyAxLjVjLjQgMCAuNy0uMy43LS43IDAtLjQtLjQtLjgtLjgtLjhDNC44LjQtLjIgNS45IDAgMTIuNS4yIDE4LjYgNS40IDIzLjggMTEuNSAyNGM2LjYuMiAxMi00LjggMTIuNC0xMS4yIDAtLjQtLjMtLjgtLjgtLjgtLjQgMC0uNy4zLS43LjctLjMgNS45LTUuNSAxMC40LTExLjYgOS43eiIgZmlsbD0iIzRlYTRmNiIvPjwvc3ZnPg==);--spinner-dark-blue-data:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZD0iTTEwLjggMjIuNEM2IDIxLjkgMi4xIDE4IDEuNiAxMy4yLjkgNy4xIDUuNCAxLjkgMTEuMyAxLjVjLjQgMCAuNy0uMy43LS43IDAtLjQtLjQtLjgtLjgtLjhDNC44LjQtLjIgNS45IDAgMTIuNS4yIDE4LjYgNS40IDIzLjggMTEuNSAyNGM2LjYuMiAxMi00LjggMTIuNC0xMS4yIDAtLjQtLjMtLjgtLjgtLjgtLjQgMC0uNy4zLS43LjctLjMgNS45LTUuNSAxMC40LTExLjYgOS43eiIgZmlsbD0iIzgzNzhEQiIvPjwvc3ZnPg==);--spinner-black-data:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZD0iTTEwLjggMjIuNEM2IDIxLjkgMi4xIDE4IDEuNiAxMy4yLjkgNy4xIDUuNCAxLjkgMTEuMyAxLjVjLjQgMCAuNy0uMy43LS43IDAtLjQtLjQtLjgtLjgtLjhDNC44LjQtLjIgNS45IDAgMTIuNS4yIDE4LjYgNS40IDIzLjggMTEuNSAyNGM2LjYuMiAxMi00LjggMTIuNC0xMS4yIDAtLjQtLjMtLjgtLjgtLjgtLjQgMC0uNy4zLS43LjctLjMgNS45LTUuNSAxMC40LTExLjYgOS43eiIgZmlsbD0iIzJlMzkzOSIvPjwvc3ZnPg==);--spinner-green-data:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZD0iTTEwLjggMjIuNEM2IDIxLjkgMi4xIDE4IDEuNiAxMy4yLjkgNy4xIDUuNCAxLjkgMTEuMyAxLjVjLjQgMCAuNy0uMy43LS43IDAtLjQtLjQtLjgtLjgtLjhDNC44LjQtLjIgNS45IDAgMTIuNS4yIDE4LjYgNS40IDIzLjggMTEuNSAyNGM2LjYuMiAxMi00LjggMTIuNC0xMS4yIDAtLjQtLjMtLjgtLjgtLjgtLjQgMC0uNy4zLS43LjctLjMgNS45LTUuNSAxMC40LTExLjYgOS43eiIgZmlsbD0iIzRmYWU0ZSIvPjwvc3ZnPg==);--spinner-gray-data:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZD0iTTEwLjggMjIuNEM2IDIxLjkgMi4xIDE4IDEuNiAxMy4yLjkgNy4xIDUuNCAxLjkgMTEuMyAxLjVjLjQgMCAuNy0uMy43LS43IDAtLjQtLjQtLjgtLjgtLjhDNC44LjQtLjIgNS45IDAgMTIuNS4yIDE4LjYgNS40IDIzLjggMTEuNSAyNGM2LjYuMiAxMi00LjggMTIuNC0xMS4yIDAtLjQtLjMtLjgtLjgtLjgtLjQgMC0uNy4zLS43LjctLjMgNS45LTUuNSAxMC40LTExLjYgOS43eiIgZmlsbD0iIzcwNzU3OSIvPjwvc3ZnPg==);--drag-target-border:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg'%3E%3Crect width='100%25' height='100%25' fill='none' rx='8' ry='8' stroke='%23DDDFE0' stroke-width='4' stroke-dasharray='9.1, 10.5' stroke-dashoffset='3' stroke-linecap='round'/%3E%3C/svg%3E");--drag-target-border-hovered:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg'%3E%3Crect width='100%25' height='100%25' fill='none' rx='8' ry='8' stroke='%2363A2E3' stroke-width='4' stroke-dasharray='9.1, 10.5' stroke-dashoffset='3' stroke-linecap='round'/%3E%3C/svg%3E");--layer-transition:300ms cubic-bezier(0.33,1,0.68,1);--layer-blackout-opacity:0.3;--slide-transition:450ms cubic-bezier(0.25,1,0.5,1);--select-transition:200ms ease-out;--vh:1vh}@media (min-width:1276px) and (max-width:1680px){:root{--right-column-width:25vw}}@media (max-width:600px){:root{--right-column-width:100vw;--symbol-menu-width:100vw;--symbol-menu-height:14.6875rem;--layer-transition:450ms cubic-bezier(0.25,1,0.5,1)}}.m-0{margin:0!important}.mt-0,.my-0{margin-top:0!important}.mr-0,.mx-0{margin-right:0!important}.mb-0,.my-0{margin-bottom:0!important}.ml-0,.mx-0{margin-left:0!important}.m-1{margin:.25rem!important}.mt-1,.my-1{margin-top:.25rem!important}.mr-1,.mx-1{margin-right:.25rem!important}.mb-1,.my-1{margin-bottom:.25rem!important}.ml-1,.mx-1{margin-left:.25rem!important}.m-2{margin:.5rem!important}.mt-2,.my-2{margin-top:.5rem!important}.mr-2,.mx-2{margin-right:.5rem!important}.mb-2,.my-2{margin-bottom:.5rem!important}.ml-2,.mx-2{margin-left:.5rem!important}.m-3{margin:1rem!important}.mt-3,.my-3{margin-top:1rem!important}.mr-3,.mx-3{margin-right:1rem!important}.mb-3,.my-3{margin-bottom:1rem!important}.ml-3,.mx-3{margin-left:1rem!important}.m-4{margin:1.5rem!important}.mt-4,.my-4{margin-top:1.5rem!important}.mr-4,.mx-4{margin-right:1.5rem!important}.mb-4,.my-4{margin-bottom:1.5rem!important}.ml-4,.mx-4{margin-left:1.5rem!important}.m-5{margin:2rem!important}.mt-5,.my-5{margin-top:2rem!important}.mr-5,.mx-5{margin-right:2rem!important}.mb-5,.my-5{margin-bottom:2rem!important}.ml-5,.mx-5{margin-left:2rem!important}.m-6{margin:3rem!important}.mt-6,.my-6{margin-top:3rem!important}.mr-6,.mx-6{margin-right:3rem!important}.mb-6,.my-6{margin-bottom:3rem!important}.ml-6,.mx-6{margin-left:3rem!important}.p-0{padding:0!important}.pt-0,.py-0{padding-top:0!important}.pr-0,.px-0{padding-right:0!important}.pb-0,.py-0{padding-bottom:0!important}.pl-0,.px-0{padding-left:0!important}.p-1{padding:.25rem!important}.pt-1,.py-1{padding-top:.25rem!important}.pr-1,.px-1{padding-right:.25rem!important}.pb-1,.py-1{padding-bottom:.25rem!important}.pl-1,.px-1{padding-left:.25rem!important}.p-2{padding:.5rem!important}.pt-2,.py-2{padding-top:.5rem!important}.pr-2,.px-2{padding-right:.5rem!important}.pb-2,.py-2{padding-bottom:.5rem!important}.pl-2,.px-2{padding-left:.5rem!important}.p-3{padding:1rem!important}.pt-3,.py-3{padding-top:1rem!important}.pr-3,.px-3{padding-right:1rem!important}.pb-3,.py-3{padding-bottom:1rem!important}.pl-3,.px-3{padding-left:1rem!important}.p-4{padding:1.5rem!important}.pt-4,.py-4{padding-top:1.5rem!important}.pr-4,.px-4{padding-right:1.5rem!important}.pb-4,.py-4{padding-bottom:1.5rem!important}.pl-4,.px-4{padding-left:1.5rem!important}.p-5{padding:2rem!important}.pt-5,.py-5{padding-top:2rem!important}.pr-5,.px-5{padding-right:2rem!important}.pb-5,.py-5{padding-bottom:2rem!important}.pl-5,.px-5{padding-left:2rem!important}.p-6{padding:3rem!important}.pt-6,.py-6{padding-top:3rem!important}.pr-6,.px-6{padding-right:3rem!important}.pb-6,.py-6{padding-bottom:3rem!important}.pl-6,.px-6{padding-left:3rem!important}.input-group{position:relative;margin-bottom:1.5rem}.input-group label{display:block;padding:0 .25rem;position:absolute;left:.75rem;top:.95rem;background-color:var(--color-background);font-size:1rem;font-weight:400;color:var(--color-placeholders);transition:transform .15s ease-out,color .15s ease-out;cursor:text;pointer-events:none;transform-origin:left center;white-space:nowrap}.input-group.with-arrow:after{content:"";position:absolute;height:.75rem;width:.75rem;border-left:1px solid var(--color-text-secondary);border-bottom:1px solid var(--color-text-secondary);transform:rotate(-45deg);right:2rem;top:1rem}.input-group.error label,.input-group .form-control.focus+label,.input-group .form-control:focus+label,.input-group.success label,.input-group.touched label{transform:scale(.75) translate(-.5rem,-2.25rem)}.input-group .form-control::placeholder,.input-group input::placeholder{color:var(--color-placeholders)}.input-group.touched label{color:var(--color-text-secondary)}.input-group.error label{color:var(--color-error)!important}.input-group.success label{color:var(--color-text-green)!important}.input-group.disabled{opacity:.5;pointer-events:none}.form-control{--border-width:1px;display:block;width:100%;height:3.375rem;padding:calc(.75rem - var(--border-width)) calc(.9rem - var(--border-width));border:var(--border-width) solid var(--color-borders-input);border-radius:var(--border-radius-default);color:var(--color-text);background-color:var(--color-background);outline:none;transition:border-color .15s ease;word-break:break-word;-webkit-appearance:none;font-size:1rem;line-height:1.25rem}.form-control:hover{border-color:var(--color-primary)}.form-control:hover+label{color:var(--color-primary)}.form-control.focus,.form-control:focus{border-color:var(--color-primary);box-shadow:inset 0 0 0 1px var(--color-primary);caret-color:var(--color-primary)}.form-control.focus+label,.form-control:focus+label{color:var(--color-primary)}.form-control:disabled{background:none!important}.error .form-control{border-color:var(--color-error);box-shadow:inset 0 0 0 1px var(--color-error);caret-color:var(--color-error)}.success .form-control{border-color:var(--color-text-green);box-shadow:inset 0 0 0 1px var(--color-text-green);caret-color:var(--color-text-green)}select.form-control option{line-height:2rem}textarea.form-control{resize:none;overflow:hidden;line-height:1.3125rem;padding-top:calc(1rem - var(--border-width));padding-bottom:calc(1rem - var(--border-width))}.input-group.password-input{position:relative}.input-group.password-input .form-control{padding-right:3.375rem}.input-group.password-input .toggle-password{position:absolute;top:0;right:0;width:3.375rem;height:3.375rem;display:flex;align-items:center;justify-content:center;cursor:pointer;outline:none!important;color:var(--color-text-secondary);opacity:.7;font-size:1.5rem}.input-group.password-input .toggle-password:focus,.input-group.password-input .toggle-password:hover{opacity:1}@font-face{font-family:icomoon;src:url(icomoon.614a8c7d9a61b2762170dd8c484f6cbf.woff2) format("woff2"),url(icomoon.a3173a76102021a87cab628b6b1e6167.woff) format("woff");font-weight:400;font-style:normal;font-display:block}[class*=" icon-"],[class^=icon-]{font-family:icomoon!important;speak:none;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}[class*=" icon-char-"]:before,[class^=icon-char-]:before{font-family:Roboto,Helvetica Neue,sans-serif;content:attr(data-char);width:1.5rem;text-align:center;display:block}.icon-bug:before{content:"\e97e"}.icon-data:before{content:"\e97d"}.icon-darkmode:before{content:"\e979"}.icon-animations:before{content:"\e97a"}.icon-enter:before{content:"\e97b"}.icon-fontsize:before{content:"\e97c"}.icon-permissions:before{content:"\e976"}.icon-card:before{content:"\e977"}.icon-truck:before{content:"\e978"}.icon-share-filled:before{content:"\e95a"}.icon-bold:before{content:"\e961"}.icon-bot-command:before{content:"\e962"}.icon-calendar-filter:before{content:"\e963"}.icon-comments:before{content:"\e964"}.icon-comments-sticker:before{content:"\e965"}.icon-arrow-down:before{content:"\e966"}.icon-email:before{content:"\e967"}.icon-italic:before{content:"\e968"}.icon-link:before{content:"\e969"}.icon-mention:before{content:"\e96a"}.icon-monospace:before{content:"\e96b"}.icon-next:before{content:"\e96c"}.icon-password-off:before{content:"\e96d"}.icon-pin-list:before{content:"\e96e"}.icon-previous:before{content:"\e96f"}.icon-replace:before{content:"\e970"}.icon-schedule:before{content:"\e971"}.icon-strikethrough:before{content:"\e972"}.icon-underlined:before{content:"\e973"}.icon-zoom-in:before{content:"\e974"}.icon-zoom-out:before{content:"\e975"}.icon-select:before{content:"\e960"}.icon-folder:before{content:"\e913"}.icon-bots:before{content:"\e915"}.icon-calendar:before{content:"\e916"}.icon-cloud-download:before{content:"\e917"}.icon-colorize:before{content:"\e918"}.icon-forward:before{content:"\e927"}.icon-reply:before{content:"\e947"}.icon-help:before{content:"\e92a"}.icon-info:before{content:"\e92b"}.icon-info-filled:before{content:"\e91b"}.icon-delete-filled:before{content:"\e91c"}.icon-delete:before{content:"\e91d"}.icon-edit:before{content:"\e923"}.icon-new-chat-filled:before{content:"\e939"}.icon-send:before{content:"\e94a"}.icon-send-outline:before{content:"\e94b"}.icon-add-user-filled:before{content:"\e904"}.icon-add-user:before{content:"\e905"}.icon-delete-user:before{content:"\e91e"}.icon-microphone:before{content:"\e935"}.icon-microphone-alt:before{content:"\e93b"}.icon-poll:before{content:"\e938"}.icon-revote:before{content:"\e93a"}.icon-photo:before{content:"\e940"}.icon-document:before{content:"\e91f"}.icon-camera:before{content:"\e90e"}.icon-camera-add:before{content:"\e90f"}.icon-logout:before{content:"\e932"}.icon-saved-messages:before{content:"\e948"}.icon-settings:before{content:"\e94e"}.icon-phone:before{content:"\e93f"}.icon-attach:before{content:"\e909"}.icon-copy:before{content:"\e91a"}.icon-channel:before{content:"\e911"}.icon-group:before{content:"\e929"}.icon-user:before{content:"\e959"}.icon-non-contacts:before{content:"\e928"}.icon-active-sessions:before{content:"\e902"}.icon-admin:before{content:"\e906"}.icon-download:before{content:"\e921"}.icon-location:before{content:"\e930"}.icon-stop:before{content:"\e952"}.icon-archive:before{content:"\e908"}.icon-unarchive:before{content:"\e953"}.icon-readchats:before{content:"\e933"}.icon-unread:before{content:"\e957"}.icon-message:before{content:"\e934"}.icon-lock:before{content:"\e931"}.icon-unlock:before{content:"\e954"}.icon-mute:before{content:"\e937"}.icon-unmute:before{content:"\e955"}.icon-pin:before{content:"\e941"}.icon-unpin:before{content:"\e956"}.icon-smallscreen:before{content:"\e95e"}.icon-fullscreen:before{content:"\e95f"}.icon-large-pause:before{content:"\e92e"}.icon-large-play:before{content:"\e92f"}.icon-pause:before{content:"\e93d"}.icon-play:before{content:"\e943"}.icon-channelviews:before{content:"\e912"}.icon-message-succeeded:before{content:"\e900"}.icon-message-read:before{content:"\e901"}.icon-message-pending:before{content:"\e94c"}.icon-message-failed:before{content:"\e94d"}.icon-favorite:before{content:"\e93e"}.icon-keyboard:before{content:"\e944"}.icon-delete-left:before{content:"\e945"}.icon-recent:before{content:"\e946"}.icon-gifs:before{content:"\e94f"}.icon-stickers:before{content:"\e95b"}.icon-smile:before{content:"\e950"}.icon-animals:before{content:"\e907"}.icon-eats:before{content:"\e922"}.icon-sport:before{content:"\e951"}.icon-car:before{content:"\e910"}.icon-lamp:before{content:"\e92c"}.icon-language:before{content:"\e92d"}.icon-flag:before{content:"\e926"}.icon-more:before{content:"\e936"}.icon-search:before{content:"\e949"}.icon-remove:before{content:"\e95c"}.icon-add:before{content:"\e903"}.icon-check:before{content:"\e914"}.icon-close:before{content:"\e919"}.icon-arrow-left:before{content:"\e90d"}.icon-arrow-right:before{content:"\e93c"}.icon-down:before{content:"\e920"}.icon-up:before{content:"\e958"}.icon-eye-closed:before{content:"\e925"}.icon-eye:before{content:"\e924"}.icon-muted-chat:before{content:"\e95d"}.icon-avatar-archived-chats:before{content:"\e90a"}.icon-avatar-deleted-account:before{content:"\e90b"}.icon-avatar-saved-messages:before{content:"\e90c"}.icon-pinned-chat:before{content:"\e942"}.media-inner{position:relative}.media-inner img,.media-inner video{display:block;object-fit:cover}.media-inner video{background:no-repeat 50% 50%;background-size:contain}.media-inner .media-loading,.media-inner .thumbnail~.full-media,.media-inner .thumbnail~.thumbnail{position:absolute}.animated-close-icon{position:absolute;transform:rotate(-45deg)}.animated-close-icon,.animated-close-icon:after,.animated-close-icon:before{width:1.125rem;height:.125rem;border-radius:.125rem;background-color:var(--color-text-secondary);transition:transform var(--slide-transition)}.animated-close-icon:after,.animated-close-icon:before{position:absolute;left:0;top:0;content:""}.animated-close-icon:before{transform:rotate(90deg)}.animated-close-icon.no-transition,.animated-close-icon.no-transition:after,.animated-close-icon.no-transition:before{transition:none}.animated-close-icon.state-back{transform:rotate(180deg)}.animated-close-icon.state-back:before{transform:rotate(45deg) scaleX(.75) translateY(-.375rem)}.animated-close-icon.state-back:after{transform:rotate(-45deg) scaleX(.75) translateY(.375rem)}.chat-list{height:100%;overflow-y:auto;padding:.5rem .125rem .5rem .4375rem}.chat-list .scroll-container{position:relative}.chat-list .ListItem.chat-item-clickable{margin:0}@media (max-width:600px){.chat-list{padding-left:0;padding-right:0}}.chat-list .no-results{color:var(--color-text-meta);margin-top:2rem;text-align:center}div.color-bg-1{--color-user:var(--color-user-1)}div.color-bg-2{--color-user:var(--color-user-2)}div.color-bg-4{--color-user:var(--color-user-4)}div.color-bg-5{--color-user:var(--color-user-5)}div.color-bg-6{--color-user:var(--color-user-6)}div.color-bg-7{--color-user:var(--color-user-7)}div.color-bg-8{--color-user:var(--color-user-8)}div.saved-messages{--color-user:var(--color-primary)}div.deleted-account{--color-user:var(--color-gray)}html{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-rendering:optimizeSpeed}body,html{width:100%;height:100%;background:var(--color-background);margin:0;padding:0;font-size:16px;font-family:Roboto,Helvetica Neue,sans-serif;color:var(--color-text);overflow:hidden}@media (max-width:600px){body,html{height:calc(var(--vh, 1vh)*100)}}.font-emoji{font-family:Apple Color Emoji,sans-serif;font-style:normal}body.cursor-grabbing,body.cursor-grabbing *{cursor:grabbing!important}#root{height:100%;max-width:1680px;margin:0 auto}@media (max-width:600px){#root{height:calc(var(--vh, 1vh)*100)}}#middle-column-portals,#portals{position:absolute;top:0;left:0;right:0}.hidden{visibility:hidden}.no-selection{user-select:none;-webkit-user-select:none!important}.visually-hidden{position:absolute!important;width:0;height:0;overflow:hidden;clip:rect(0,0,0,0);z-index:-1}.not-implemented{opacity:.5}.not-implemented,.not-implemented *{cursor:not-allowed!important}*{box-sizing:border-box}.no-animations #root *,.no-animations #root :after,.no-animations #root :before{transition:none!important}.custom-scroll,.custom-scroll-x{scrollbar-width:thin;scrollbar-color:rgba(90,90,90,0) transparent;transition:scrollbar-color .3s ease;-webkit-overflow-scrolling:touch;pointer-events:auto}.custom-scroll-x::-webkit-scrollbar-thumb,.custom-scroll::-webkit-scrollbar-thumb{background-color:rgba(90,90,90,0);border-radius:.35rem}.custom-scroll-x:focus,.custom-scroll-x:focus-within,.custom-scroll-x:hover,.custom-scroll:focus,.custom-scroll:focus-within,.custom-scroll:hover{scrollbar-color:rgba(90,90,90,.3) transparent}.custom-scroll-x:focus-within::-webkit-scrollbar-thumb,.custom-scroll-x:focus::-webkit-scrollbar-thumb,.custom-scroll-x:hover::-webkit-scrollbar-thumb,.custom-scroll:focus-within::-webkit-scrollbar-thumb,.custom-scroll:focus::-webkit-scrollbar-thumb,.custom-scroll:hover::-webkit-scrollbar-thumb{background-color:rgba(90,90,90,.3)}.custom-scroll::-webkit-scrollbar{width:.375rem}.custom-scroll-x::-webkit-scrollbar{height:.35rem}.no-scrollbar{scrollbar-width:none}.no-scrollbar::-webkit-scrollbar{display:none}.emoji-small{background:no-repeat;background-size:1.25rem;color:transparent;display:inline-block;width:1.25rem;height:1.25rem;margin-right:1px;overflow:hidden}.emoji-small::selection{background-color:var(--color-selection-highlight-emoji);color:transparent}div[role=button]{outline:none!important;cursor:pointer}.opacity-transition{opacity:1;transition:opacity .15s ease}.opacity-transition:not(.open){opacity:0}.opacity-transition:not(.shown){display:none}.opacity-transition.slow{transition-duration:.3s}.color-primary{color:var(--color-primary)!important}.color-danger{color:var(--color-error)!important}.text-muted{color:var(--color-text-secondary)!important}@keyframes grow-icon{0%{transform:scale(.5);opacity:.8}50%{transform:scale(1.1);opacity:1}to{transform:scale(1)}}@keyframes hide-icon{0%{transform:scale(1);opacity:.4}to{transform:scale(.5);opacity:0}} \ No newline at end of file diff --git a/dist/main.9615bb0fe696e5cdc29b.css b/dist/main.9615bb0fe696e5cdc29b.css new file mode 100644 index 000000000..19956c099 --- /dev/null +++ b/dist/main.9615bb0fe696e5cdc29b.css @@ -0,0 +1 @@ +.Link,.Link:hover{color:inherit}#UiLoader{height:100%}@media (max-width:600px){#UiLoader{height:calc(var(--vh, 1vh)*100)}}#UiLoader .mask{position:fixed;top:0;left:0;right:0;margin:0 auto;width:100%;max-width:1680px;height:100%;z-index:var(--z-ui-loader-mask);display:flex}#UiLoader .mask .left{flex:1;background:var(--color-background);min-width:15.5rem;max-width:26.5rem}@media (min-width:1680px){#UiLoader .mask .left{border-left:1px solid var(--color-borders)}}@media (max-width:1275px){#UiLoader .mask .left{flex:2}}@media (max-width:925px){#UiLoader .mask .left{min-width:26.5rem}}@media (max-width:600px){#UiLoader .mask .left{max-width:none;width:100vw}}#UiLoader .mask .middle{flex:3;border-left:1px solid var(--color-borders);border-right:1px solid var(--color-borders);position:relative;z-index:1;overflow:hidden}#UiLoader .mask .middle:before{content:"";display:block;position:absolute;top:0;left:0;bottom:0;right:0;background:no-repeat 50%;background-size:cover;z-index:-1;transform-origin:left center}.theme-dark body.initial #UiLoader .mask .middle:before{background-color:#0f0f0f}.theme-light body.initial #UiLoader .mask .middle:before,body:not(.initial) #UiLoader .mask .middle:before{background-image:url(chat-bg.f607e788298d8a7de37a3b39b76c1efa.jpg)}#UiLoader .mask .middle.with-right-column:before{transform:scale(.67)}@media screen and (min-width:1276px){#UiLoader .mask .middle:before{margin:-16rem -5rem -20rem 0}}#UiLoader .mask .middle.custom-bg-image:before{margin:-1rem;background-image:none!important}@media (max-width:1275px){#UiLoader .mask .middle{flex:3;border-right:none}}@media (max-width:600px){#UiLoader .mask .middle{display:none}}#UiLoader .mask .right{position:absolute;top:0;right:0;z-index:1;height:100%;width:var(--right-column-width);min-width:15.5rem;max-width:26.5rem;border-left:1px solid var(--color-borders);background:var(--color-background)}#UiLoader .blank{flex:1;background:var(--color-background)}.Spinner{--spinner-size:2rem;position:relative;display:flex;align-items:center;justify-content:center;width:var(--spinner-size);height:var(--spinner-size)}.Spinner>div{position:absolute;top:0;left:0;right:0;bottom:0;background-repeat:no-repeat;background-size:100%;animation-name:spin;animation-duration:1s;animation-iteration-count:infinite;animation-timing-function:linear}.Spinner.with-background:before{content:"";position:absolute;left:-.125rem;top:-.125rem;bottom:-.125rem;right:-.125rem;border-radius:50%;background:rgba(0,0,0,.25)}.Spinner.white>div{background-image:var(--spinner-white-data)}.Spinner.white.with-background>div{background-image:var(--spinner-white-thin-data)}.Spinner.blue>div{background-image:var(--spinner-blue-data)}.theme-dark .Spinner.blue>div{background-image:var(--spinner-dark-blue-data)}.Spinner.black>div{background-image:var(--spinner-black-data)}.Spinner.green>div{background-image:var(--spinner-green-data)}.Spinner.gray>div{background-image:var(--spinner-gray-data)}@keyframes spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}@keyframes ripple-animation{0%{transform:scale(0);opacity:1}50%{opacity:1}to{opacity:0;transform:scale(2)}}.ripple-container{position:absolute;top:0;left:0;bottom:0;right:0}body.animation-level-0 .ripple-container{display:none}.ripple-container span{position:absolute;display:block;background-color:var(--ripple-color,rgba(0,0,0,.08));border-radius:50%;transform:scale(0);animation:ripple-animation .7s}.Button{outline:none!important;display:flex;align-items:center;justify-content:center;width:100%;height:3.5rem;border:0;border-radius:var(--border-radius-default);background:transparent;padding:.625rem;color:#fff;line-height:1.2;cursor:pointer;text-transform:uppercase;flex-shrink:0;position:relative;overflow:hidden;transition:background-color .15s,color .15s;text-decoration:none!important}.Button.clicked,.Button:active,body.animation-level-0 .Button{transition:none!important}.Button.disabled{opacity:.5!important;cursor:default;pointer-events:none}.Button.round{width:3.5rem;border-radius:50%}.Button.round i{font-size:1.5rem}.Button.primary{background:var(--color-primary);color:var(--color-white);--ripple-color:rgba(0,0,0,0.08)}.Button.primary:not(.disabled):not(:disabled).active,.Button.primary:not(.disabled):not(:disabled):active,.Button.primary:not(.disabled):not(:disabled):focus,.Button.primary:not(.disabled):not(:disabled):hover{background:var(--color-primary-shade)}body.animation-level-0 .Button.primary:not(.disabled):not(:disabled):active{background:var(--color-primary-shade-darker)}.Button.secondary{background:var(--color-background);color:rgba(var(--color-text-secondary-rgb),.75);--ripple-color:rgba(0,0,0,0.08)}.Button.secondary:not(.disabled):not(:disabled).active,.Button.secondary:not(.disabled):not(:disabled):active,.Button.secondary:not(.disabled):not(:disabled):focus,.Button.secondary:not(.disabled):not(:disabled):hover{background:var(--color-primary);color:#fff}body.animation-level-0 .Button.secondary:not(.disabled):not(:disabled):active{background:var(--color-primary-shade)}.Button.gray{background:var(--color-background);color:var(--color-text-secondary);--ripple-color:rgba(0,0,0,0.08)}.Button.gray:not(.disabled):not(:disabled).active,.Button.gray:not(.disabled):not(:disabled):active,.Button.gray:not(.disabled):not(:disabled):focus,.Button.gray:not(.disabled):not(:disabled):hover{color:var(--color-primary)}body.animation-level-0 .Button.gray:not(.disabled):not(:disabled):active{background:var(--color-chat-hover)}.Button.danger{background:var(--color-background);color:var(--color-error);--ripple-color:rgba(var(--color-error-rgb),.16)}.Button.danger:not(.disabled):not(:disabled).active,.Button.danger:not(.disabled):not(:disabled):active,.Button.danger:not(.disabled):not(:disabled):focus,.Button.danger:not(.disabled):not(:disabled):hover{background:var(--color-error);color:var(--color-white)}body.animation-level-0 .Button.danger:not(.disabled):not(:disabled):active{background:var(--color-error-shade)}.Button.text{background:none}.Button.text.primary{color:var(--color-primary);background:none}.Button.text.primary:not(.disabled):not(:disabled).active,.Button.text.primary:not(.disabled):not(:disabled):active,.Button.text.primary:not(.disabled):not(:disabled):focus,.Button.text.primary:not(.disabled):not(:disabled):hover{background:rgba(var(--color-primary-shade-rgb),.08)}body.animation-level-0 .Button.text.primary:not(.disabled):not(:disabled):active{background:rgba(var(--color-primary-shade-rgb),.16)}.Button.text.secondary{background:none;color:var(--color-text-secondary)}.Button.text.danger:not(.disabled):not(:disabled).active,.Button.text.danger:not(.disabled):not(:disabled):active,.Button.text.danger:not(.disabled):not(:disabled):focus,.Button.text.danger:not(.disabled):not(:disabled):hover{background:rgba(var(--color-error-rgb),.08);color:var(--color-error)}body.animation-level-0 .Button.text.danger:not(.disabled):not(:disabled):active{background:rgba(var(--color-error-rgb),.16)}.Button.faded{opacity:.75}.Button.faded.activated,.Button.faded:not(.disabled):not(:disabled).active,.Button.faded:not(.disabled):not(:disabled):active,.Button.faded:not(.disabled):not(:disabled):focus,.Button.faded:not(.disabled):not(:disabled):hover{opacity:1}.Button.translucent{background-color:initial;color:var(--color-text-secondary);--ripple-color:var(--color-interactive-element-hover)}.Button.translucent:not(.disabled):not(:disabled).active,.Button.translucent:not(.disabled):not(:disabled):active,.Button.translucent:not(.disabled):not(:disabled):focus,.Button.translucent:not(.disabled):not(:disabled):hover{background-color:var(--color-interactive-element-hover)}body.animation-level-0 .Button.translucent:not(.disabled):not(:disabled):active{background-color:rgba(var(--color-text-secondary-rgb),.16)}.Button.translucent.activated{color:var(--color-primary)}.Button.translucent-white{background-color:initial;color:hsla(0,0%,100%,.5);--ripple-color:hsla(0,0%,100%,0.08)}.Button.translucent-white:not(.disabled):not(:disabled).active,.Button.translucent-white:not(.disabled):not(:disabled):active,.Button.translucent-white:not(.disabled):not(:disabled):focus,.Button.translucent-white:not(.disabled):not(:disabled):hover{background-color:hsla(0,0%,100%,.08);color:#fff}body.animation-level-0 .Button.translucent-white:not(.disabled):not(:disabled):active{background-color:hsla(0,0%,100%,.16)}.Button.dark{background-color:rgba(0,0,0,.75);color:#fff;--ripple-color:hsla(0,0%,100%,0.08)}.Button.dark:not(.disabled):not(:disabled).active,.Button.dark:not(.disabled):not(:disabled):active,.Button.dark:not(.disabled):not(:disabled):focus,.Button.dark:not(.disabled):not(:disabled):hover{background-color:rgba(0,0,0,.85);color:#fff}body.animation-level-0 .Button.dark:not(.disabled):not(:disabled):active{background-color:rgba(0,0,0,.95)}.Button.smaller{height:2.75rem;padding:.3125rem}.Button.smaller.round{width:2.75rem}.Button.smaller.pill{height:2.5rem;border-radius:1.25rem;padding:.3125rem 1rem}.Button.smaller.with-icon{padding-left:.75rem;padding-right:1.25rem}.Button.smaller.with-icon i{font-size:1.5rem;margin-right:.5rem}.Button.smaller.with-icon[dir=rtl]{padding-left:1.25rem;padding-right:.75rem}.Button.smaller.with-icon[dir=rtl] i{margin-left:.5rem;margin-right:0}@media (max-width:600px){.Button.smaller{height:2.5rem}.Button.smaller.round{width:2.5rem}}.Button.tiny{height:2.25rem;padding:.4375rem;border-radius:var(--border-radius-default-small);font-size:.875rem;font-weight:500}.Button.tiny.round{width:2.25rem;height:2.25rem;border-radius:50%}.Button.tiny i{font-size:1.25rem}.Button.tiny.pill{height:2rem;border-radius:1rem;padding:.3125rem 1rem;font-size:1rem}.Button.fluid{padding-left:1.75rem;padding-right:1.75rem;width:auto}.Button.fluid.tiny{padding-left:1.375rem;padding-right:1.375rem}.Button.pill{border-radius:1.75rem;padding-left:1.75rem;padding-right:1.75rem;text-transform:none}.Button.loading{position:relative;pointer-events:none}.Button.loading .Spinner{position:absolute;right:.875rem;top:.875rem;--spinner-size:1.8rem}.Button .emoji{vertical-align:-3px}.Checkbox{display:block;position:relative;padding-left:4.5rem;text-align:left;margin-bottom:1.5rem;line-height:1.5rem;cursor:pointer}.Checkbox.disabled{pointer-events:none;opacity:.5}.Checkbox.round .Checkbox-main:before{border-radius:50%}.Checkbox.round .Checkbox-main:after{background:var(--color-primary) url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTIiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTEzLjkuOEw1LjggOC45IDIuMSA1LjJjLS40LS40LTEuMS0uNC0xLjYgMC0uNC40LS40IDEuMSAwIDEuNkw1IDExLjJjLjQuNCAxLjEuNCAxLjYgMGw4LjktOC45Yy40LS40LjQtMS4xIDAtMS42LS41LS40LTEuMi0uNC0xLjYuMXoiIGZpbGw9IiNGRkYiLz48L3N2Zz4=) no-repeat 50% 50%;background-size:12px;border-radius:50%}.Checkbox.loading .Checkbox-main:after,.Checkbox.loading .Checkbox-main:before{opacity:0!important}.Checkbox.loading .Spinner{position:absolute;left:.375rem;top:.125rem;opacity:0;animation:fade-in .2s ease forwards;--spinner-size:1.25rem}.Checkbox.blocking input:not(:checked)~.Checkbox-main:before{border-color:var(--color-error)}.Checkbox.blocking input:not(:checked)~.Checkbox-main:after{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCI+PGcgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj48cGF0aCBkPSJNMCAwaDI0djI0SDB6Ii8+PHBhdGggZmlsbD0iI2U1MzkzNSIgZmlsbC1ydWxlPSJub256ZXJvIiBkPSJNMTggM2EzIDMgMCAwMTMgM3YxMmEzIDMgMCAwMS0zIDNINmEzIDMgMCAwMS0zLTNWNmEzIDMgMCAwMTMtM2gxMnptLTIgOEg4YTEgMSAwIDAwMCAyaDhhMSAxIDAgMDAwLTJ6Ii8+PC9nPjwvc3ZnPg==);opacity:1;background-size:1.375rem;background-position:-.125rem -.125rem}.Checkbox input{position:absolute;z-index:var(--z-below);opacity:0}.Checkbox .Checkbox-main:after,.Checkbox .Checkbox-main:before{content:"";display:block;position:absolute;left:1.1875rem;top:.1875rem;width:1.125rem;height:1.125rem}.Checkbox .Checkbox-main:before{border:2px solid var(--color-borders-input);border-radius:.25rem;background-color:var(--color-white);transition:border-color .1s ease,background-color .1s ease}.Checkbox .Checkbox-main:after{background:50% no-repeat url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTIiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTEzLjkuOEw1LjggOC45IDIuMSA1LjJjLS40LS40LTEuMS0uNC0xLjYgMC0uNC40LS40IDEuMSAwIDEuNkw1IDExLjJjLjQuNCAxLjEuNCAxLjYgMGw4LjktOC45Yy40LS40LjQtMS4xIDAtMS42LS41LS40LTEuMi0uNC0xLjYuMXoiIGZpbGw9IiNGRkYiLz48L3N2Zz4=);background-size:.875rem;opacity:0;transition:opacity .1s ease}.Checkbox .Checkbox-main .label{display:block;text-align:initial}.Checkbox .Checkbox-main .subLabel{display:block;font-size:.875rem;line-height:1rem;color:var(--color-text-secondary)}.Checkbox input:checked~.Checkbox-main:before{border-color:var(--color-primary);background-color:var(--color-primary)}.Checkbox input:checked~.Checkbox-main:after{opacity:1}.Checkbox[dir=rtl]{padding-left:0;padding-right:4.5rem}.Checkbox[dir=rtl].loading .Spinner{left:auto;right:.375rem}.Checkbox[dir=rtl] .label,.Checkbox[dir=rtl] .subLabel{text-align:right}.Checkbox[dir=rtl] .Checkbox-main:after,.Checkbox[dir=rtl] .Checkbox-main:before{left:auto;right:1.1875rem}.Loading{display:flex;height:100%;align-items:center;justify-content:center}.Loading .Spinner{--spinner-size:2.75rem}.Menu.fluid .bubble{min-width:13.5rem;width:auto}.Menu .backdrop{position:fixed;left:-100vw;right:-100vw;top:-100vh;bottom:-100vh;z-index:var(--z-menu-backdrop)}.Menu .bubble{overflow:hidden;display:block;list-style:none;padding:.5rem 0;margin:0;position:absolute;background-color:var(--color-background);box-shadow:0 .25rem .5rem .125rem var(--color-default-shadow);border-radius:var(--border-radius-default);min-width:13.5rem;z-index:var(--z-menu-bubble);transform:scale(.2);transition:opacity .2s cubic-bezier(.2,0,.2,1),transform .2s cubic-bezier(.2,0,.2,1)!important;--offset-y:calc(100% + 0.5rem);--offset-x:0}.Menu .bubble.open{transform:scale(1)}.Menu .bubble.closing{transition:opacity .2s ease-in,transform .2s ease-in!important}body.animation-level-0 .Menu .bubble{transform:none!important;transition:opacity .15s!important}body.has-open-dialog .Menu .bubble{transition:none!important}.Menu .bubble.top{top:var(--offset-y)}.Menu .bubble.bottom{bottom:var(--offset-y)}.Menu .bubble.left{left:var(--offset-x)}.Menu .bubble.right{right:var(--offset-x)}.Menu .bubble.with-footer{padding-bottom:0}.Menu .footer{padding:.5rem 0;background:var(--color-chat-hover);color:var(--color-text-secondary);font-size:.8125rem;text-align:center}.DropdownMenu,.MenuItem{position:relative}.MenuItem{width:100%;background:none;border:none!important;box-shadow:none!important;outline:none!important;display:flex;padding:1rem;overflow:hidden;line-height:1.5rem;white-space:nowrap;color:var(--color-text);--ripple-color:rgba(0,0,0,0.08);cursor:pointer;unicode-bidi:plaintext}.MenuItem:focus,.MenuItem:hover{background-color:var(--color-chat-hover);text-decoration:none;color:inherit}.MenuItem i{font-size:1.5rem;color:var(--color-text-secondary)}.MenuItem .menu-item-name,.MenuItem i{margin-right:2rem}.MenuItem .menu-item-name.capitalize{text-transform:capitalize}.MenuItem.disabled{opacity:.5!important;cursor:default!important}.MenuItem.destructive{color:var(--color-error)}.MenuItem.destructive i{color:inherit}.MenuItem:not(.has-ripple):not(.disabled):active{background-color:var(--color-item-active);transition:none!important}.MenuItem>.Switcher{margin-left:auto}.MenuItem[dir=rtl] .menu-item-name,.MenuItem[dir=rtl] i{margin-left:2rem;margin-right:0}.MenuItem[dir=rtl]>.Switcher{margin-left:0;margin-right:auto}.CountryCodeInput .input-group{cursor:pointer;z-index:var(--z-country-code-input-group)}.CountryCodeInput .input-group .Spinner{position:absolute;top:1rem;right:.75rem;opacity:.5;--spinner-size:1.5rem}.CountryCodeInput .input-group .css-icon-down{position:absolute;top:1.125rem;right:1rem;width:.75rem;height:.75rem;border:2px solid var(--color-text-secondary);border-top:0;border-left:0;transform:scaleY(1) rotate(45deg);transition:color .2s ease,transform .2s ease,top .2s ease}.CountryCodeInput .input-group .css-icon-down.open{border-color:var(--color-primary);transform:scaleY(-1) rotate(45deg);top:1.5rem}.CountryCodeInput .bubble{width:100%;max-height:23.5rem;overflow-y:auto;transform-origin:top center!important;transform:scale(.95)}.CountryCodeInput .bubble.open{transform:scaleY(1)}.CountryCodeInput .MenuItem button{display:flex;align-items:center}.CountryCodeInput .MenuItem.no-results button{justify-content:center;padding:.5rem 1rem}.CountryCodeInput .MenuItem.no-results button span{font-size:.875rem}.CountryCodeInput .country-flag{font-size:2rem;margin-right:2rem}.CountryCodeInput .country-flag .emoji{width:2rem;height:2rem;display:inline-block;vertical-align:4px;margin:-.5rem .125rem}.CountryCodeInput .country-name{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-right:1rem;text-align:left}.CountryCodeInput .country-code{margin-left:auto;opacity:.5}.auth-form{width:100%;max-width:25.5rem;margin:0 auto;padding:6rem 1rem 1rem;text-align:center}@media (min-width:600px) and (min-height:450px){.auth-form{padding:6.8rem 1.5rem 1.5rem}}.auth-form #logo,.auth-form .AvatarEditable label{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){.auth-form #logo,.auth-form .AvatarEditable label{width:10rem;height:10rem;margin-bottom:2.5rem}}.auth-form #logo{background-size:100%;background:url(telegram-logo.df3a91becaa9678c529b4c4cadd45204.svg) 50% no-repeat}.auth-form h2{font-size:1.25rem;line-height:1}@media (min-width:600px){.auth-form h2{font-size:2rem;line-height:1.5}}.auth-form .note{font-size:.875rem;line-height:1.35;margin-bottom:2.5rem;color:var(--color-text-secondary)}@media (min-width:600px){.auth-form .note{font-size:1rem;margin-bottom:3rem}}#auth-code-form,#auth-password-form,#auth-phone-number-form,#auth-qr-form,#auth-registration-form{height:100%;overflow-y:auto}#auth-phone-number-form form{min-height:26.25rem}#auth-phone-number-form .Button{margin-top:2.75rem}#auth-phone-number-form .Button+.Button{margin-top:1rem}#auth-code-form h2,#auth-password-form h2,.auth-number-edit{display:flex;align-items:center;justify-content:center}.auth-number-edit{width:2.5rem;height:2.5rem;padding:.5rem;font-size:1.5rem;color:var(--color-text-secondary);opacity:.75;cursor:pointer}.auth-number-edit:focus,.auth-number-edit:hover{opacity:1}#auth-qr-form .qr-container{height:280px;opacity:1;transform:scale(1);transition:transform .3s cubic-bezier(.34,1.56,.64,1),opacity .3s}#auth-qr-form .qr-container.pre-animate{opacity:.5;transform:scale(.8)}#auth-qr-form h3{margin:1.5rem 0 1rem}#auth-qr-form ol{list-style:none;counter-reset:item;padding:0 2rem}#auth-qr-form ol li{counter-increment:item;text-align:left;margin:.75rem 0;display:flex}#auth-qr-form ol li:before{content:counter(item);display:flex;justify-content:center;align-items:center;min-width:1.4rem;height:1.4rem;padding:0;margin:0 .75rem 0 0;background:var(--color-primary);border-radius:50%;font-size:smaller;color:#fff}#sign-in-password{word-break:normal!important}#AppInactive{height:100%;display:flex;flex-direction:column;align-items:center;justify-content:center}#AppInactive .content{max-width:28rem;margin:auto;padding:1.5rem;text-align:center}#AppInactive .title{margin-top:1rem}#AppInactive .description{color:var(--color-text-secondary);font-size:.875rem}#AppInactive img{width:100%;max-width:20rem}#AppInactive .Button{margin-top:1rem}@font-face{font-family:Roboto;font-style:normal;font-weight:400;font-display:swap;src:local("Roboto"),local("Roboto-Regular"),url(KFOmCnqEu92Fr1Mu72xKKTU1Kvnz.499af208fa04aa805317cf014d869692.woff2) format("woff2");unicode-range:u+0460-052f,u+1c80-1c88,u+20b4,u+2de0-2dff,u+a640-a69f,u+fe2e-fe2f}@font-face{font-family:Roboto;font-style:normal;font-weight:400;font-display:swap;src:local("Roboto"),local("Roboto-Regular"),url(KFOmCnqEu92Fr1Mu5mxKKTU1Kvnz.6b69287db14836e8ccee577d6457b127.woff2) format("woff2");unicode-range:u+0400-045f,u+0490-0491,u+04b0-04b1,u+2116}@font-face{font-family:Roboto;font-style:normal;font-weight:400;font-display:swap;src:local("Roboto"),local("Roboto-Regular"),url(KFOmCnqEu92Fr1Mu7mxKKTU1Kvnz.350ec982325895563ada47d14c7936da.woff2) format("woff2");unicode-range:u+1f??}@font-face{font-family:Roboto;font-style:normal;font-weight:400;font-display:swap;src:local("Roboto"),local("Roboto-Regular"),url(KFOmCnqEu92Fr1Mu4WxKKTU1Kvnz.af30acd9d70ade5b828db02d25348da2.woff2) format("woff2");unicode-range:u+0370-03ff}@font-face{font-family:Roboto;font-style:normal;font-weight:400;font-display:swap;src:local("Roboto"),local("Roboto-Regular"),url(KFOmCnqEu92Fr1Mu7WxKKTU1Kvnz.62afd8a72052ca925aafb4006fddff88.woff2) format("woff2");unicode-range:u+0102-0103,u+0110-0111,u+1ea0-1ef9,u+20ab}@font-face{font-family:Roboto;font-style:normal;font-weight:400;font-display:swap;src:local("Roboto"),local("Roboto-Regular"),url(KFOmCnqEu92Fr1Mu7GxKKTU1Kvnz.009379f5feecd3ef689ad46e029b31e6.woff2) format("woff2");unicode-range:u+0100-024f,u+0259,u+1e??,u+2020,u+20a0-20ab,u+20ad-20cf,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-family:Roboto;font-style:normal;font-weight:400;font-display:swap;src:local("Roboto"),local("Roboto-Regular"),url(KFOmCnqEu92Fr1Mu4mxKKTU1Kg.465390c6e54c60f4a15ff698f372e858.woff2) format("woff2");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+2000-206f,u+2074,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}@font-face{font-family:Roboto;font-style:normal;font-weight:500;font-display:swap;src:local("Roboto Medium"),local("Roboto-Medium"),url(KFOlCnqEu92Fr1MmEU9fCRc4AMP6lbBP.66efaee062df58309edc4cdfaef3f094.woff2) format("woff2");unicode-range:u+0460-052f,u+1c80-1c88,u+20b4,u+2de0-2dff,u+a640-a69f,u+fe2e-fe2f}@font-face{font-family:Roboto;font-style:normal;font-weight:500;font-display:swap;src:local("Roboto Medium"),local("Roboto-Medium"),url(KFOlCnqEu92Fr1MmEU9fABc4AMP6lbBP.3e1bb90afe5eb4a94c5ffdb911fd21d0.woff2) format("woff2");unicode-range:u+0400-045f,u+0490-0491,u+04b0-04b1,u+2116}@font-face{font-family:Roboto;font-style:normal;font-weight:500;font-display:swap;src:local("Roboto Medium"),local("Roboto-Medium"),url(KFOlCnqEu92Fr1MmEU9fCBc4AMP6lbBP.acd64c8bf32762464b8f2c0600dc2b89.woff2) format("woff2");unicode-range:u+1f??}@font-face{font-family:Roboto;font-style:normal;font-weight:500;font-display:swap;src:local("Roboto Medium"),local("Roboto-Medium"),url(KFOlCnqEu92Fr1MmEU9fBxc4AMP6lbBP.cab892ae9aa422233ea43db289e0c038.woff2) format("woff2");unicode-range:u+0370-03ff}@font-face{font-family:Roboto;font-style:normal;font-weight:500;font-display:swap;src:local("Roboto Medium"),local("Roboto-Medium"),url(KFOlCnqEu92Fr1MmEU9fCxc4AMP6lbBP.01bafbfbc1e4ebe0139d259614d5c12d.woff2) format("woff2");unicode-range:u+0102-0103,u+0110-0111,u+1ea0-1ef9,u+20ab}@font-face{font-family:Roboto;font-style:normal;font-weight:500;font-display:swap;src:local("Roboto Medium"),local("Roboto-Medium"),url(KFOlCnqEu92Fr1MmEU9fChc4AMP6lbBP.d3c211af53a789d2f9fd79599baca39a.woff2) format("woff2");unicode-range:u+0100-024f,u+0259,u+1e??,u+2020,u+20a0-20ab,u+20ad-20cf,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-family:Roboto;font-style:normal;font-weight:500;font-display:swap;src:local("Roboto Medium"),local("Roboto-Medium"),url(KFOlCnqEu92Fr1MmEU9fBBc4AMP6lQ.324b1e6d0f5ae7c6ab42fed5516c7b3d.woff2) format("woff2");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+2000-206f,u+2074,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}*,:after,:before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;-ms-overflow-style:scrollbar;-webkit-tap-highlight-color:rgba(0,0,0,0)}article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:left;background-color:#fff}[tabindex="-1"]:focus{outline:none!important}hr{box-sizing:initial;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem;font-weight:500}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0}address{font-style:normal;line-height:inherit}address,dl,ol,ul{margin-bottom:1rem}dl,ol,ul{margin-top:0}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:500}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}dfn{font-style:italic}b,strong{font-weight:500}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:initial}sub{bottom:-.25em}sup{top:-.5em}a{color:var(--color-links);text-decoration:none;background-color:initial;-webkit-text-decoration-skip:objects}a:hover{color:#0056b3;text-decoration:underline}a:not([href]):not([tabindex]),a:not([href]):not([tabindex]):focus,a:not([href]):not([tabindex]):hover{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}code,kbd,pre,samp{font:.9375rem/1.25 Courier,Courier New,Nimbus Mono L,Courier\ 10 Pitch,FreeMono,sans-serif-monospace,monospace;font-size-adjust:.43}pre{margin-top:0;margin-bottom:1rem;overflow:auto;-ms-overflow-style:scrollbar}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg:not(:root){overflow:hidden}[role=button],a,area,button,input:not([type=range]),label,select,summary,textarea{touch-action:manipulation}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#868e96;text-align:left;caption-side:bottom}th{text-align:inherit}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=date],input[type=datetime-local],input[type=month],input[type=time]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:initial}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item}template{display:none}[hidden]{display:none!important}:root{--color-background:#fff;--color-background-selected:#f4f4f5;--color-background-secondary:#f4f4f5;--color-background-secondary-accent:#e4e4e5;--color-background-own:#eefedf;--color-background-own-selected:#d4fcae;--color-background-own-rgb:238,254,223;--color-text:#000;--color-text-lighter:#2e3939;--color-text-secondary:#707579;--color-text-secondary-rgb:112,117,121;--color-text-meta:#686c72;--color-text-meta-rgb:104,108,114;--color-text-meta-colored:#4fae4e;--color-text-green:#4fae4e;--color-text-green-rgb:79,174,78;--color-borders:#dadce0;--color-borders-input:#dadce0;--color-webpage-initial-background:#2e3939;--color-interactive-active:var(--color-primary);--color-interactive-inactive:rgba(var(--color-text-secondary-rgb),0.25);--color-interactive-buffered:rgba(var(--color-text-secondary-rgb),0.25);--color-interactive-element-hover:rgba(var(--color-text-secondary-rgb),0.08);--color-primary:#50a2e9;--color-primary-rgb:80,162,233;--color-primary-shade:#4a95d6;--color-primary-shade-darker:#4388c4;--color-primary-shade-rgb:74,149,214;--color-primary-opacity:rgba(var(--color-primary),0.50);--color-green:#4dcd5e;--color-green-darker:#41ac4f;--color-error:#e53935;--color-error-shade:#d33431;--color-error-rgb:229,57,53;--color-warning:#fb8c00;--color-yellow:#fdd764;--color-links:#52a1ef;--color-links-hover:#2d8dec;--color-links-darker:#157be0;--color-links-darker-hover:#1166ba;--color-own-links:#fff;--color-placeholders:#a2acb4;--color-pinned:#fff;--color-code:#4a729a;--color-code-bg:rgba(112,117,121,0.08);--color-code-own:#3c7940;--color-code-own-bg:rgba(112,117,121,0.08);--color-accent-own:#4fae4e;--color-message-meta-own:#4fae4e;--color-reply-hover:#f4f4f4;--color-reply-active:#e8e9ea;--color-reply-own-hover:#dbf4ce;--color-reply-own-active:#c8ebbc;--color-white:#fff;--color-gray:#c4c9cc;--color-chat-hover:#f4f4f5;--color-chat-active:#5b90e0;--color-item-active:#ededed;--color-selection-highlight:#3993fb;--color-selection-highlight-emoji:rgba(57,147,251,0.7);--color-user-1:#e17076;--color-user-2:#7bc862;--color-user-4:#65aadd;--color-user-5:#a695e7;--color-user-6:#ee7aae;--color-user-7:#6ec9cb;--color-user-8:#faa774;--color-default-shadow:hsla(0,0%,44.7%,0.25);--color-light-shadow:hsla(0,0%,44.7%,0.17);--border-radius-default:0.75rem;--border-radius-default-small:0.625rem;--border-radius-default-tiny:0.375rem;--border-radius-messages:0.75rem;--border-radius-messages-small:0.375rem;--messages-container-width:45.5rem;--right-column-width:26.5rem;--header-height:3.5rem;--symbol-menu-width:26.25rem;--symbol-menu-height:23.25rem;--symbol-menu-footer-height:3rem;--z-ui-loader-mask:2000;--z-notification:1000;--z-right-column:900;--z-header-menu:990;--z-header-menu-backdrop:980;--z-modal:1000;--z-media-viewer:1500;--z-drop-area:55;--z-animation-fade:50;--z-menu-bubble:21;--z-menu-backdrop:20;--z-message-highlighted:13;--z-message-context-menu:12;--z-mobile-search:11;--z-middle-header:10;--z-middle-footer:10;--z-country-code-input-group:10;--z-message-select-control:9;--z-message-select-area:8;--z-sticky-date:9;--z-register-add-avatar:5;--z-media-viewer-head:3;--z-below:-1;--spinner-white-data:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZD0iTTEwLjggMjIuNEM2IDIxLjkgMi4xIDE4IDEuNiAxMy4yLjkgNy4xIDUuNCAxLjkgMTEuMyAxLjVjLjQgMCAuNy0uMy43LS43IDAtLjQtLjQtLjgtLjgtLjhDNC44LjQtLjIgNS45IDAgMTIuNS4yIDE4LjYgNS40IDIzLjggMTEuNSAyNGM2LjYuMiAxMi00LjggMTIuNC0xMS4yIDAtLjQtLjMtLjgtLjgtLjgtLjQgMC0uNy4zLS43LjctLjMgNS45LTUuNSAxMC40LTExLjYgOS43eiIgZmlsbD0iI2ZmZiIvPjwvc3ZnPg==);--spinner-white-thin-data:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTEyIDIzQzUuOSAyMyAxIDE4LjEgMSAxMlM1LjkgMSAxMiAxVjBDNS40IDAgMCA1LjQgMCAxMnM1LjQgMTIgMTIgMTIgMTItNS40IDEyLTEyaC0xYzAgNi4xLTQuOSAxMS0xMSAxMXoiLz48L3N2Zz4=);--spinner-blue-data:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZD0iTTEwLjggMjIuNEM2IDIxLjkgMi4xIDE4IDEuNiAxMy4yLjkgNy4xIDUuNCAxLjkgMTEuMyAxLjVjLjQgMCAuNy0uMy43LS43IDAtLjQtLjQtLjgtLjgtLjhDNC44LjQtLjIgNS45IDAgMTIuNS4yIDE4LjYgNS40IDIzLjggMTEuNSAyNGM2LjYuMiAxMi00LjggMTIuNC0xMS4yIDAtLjQtLjMtLjgtLjgtLjgtLjQgMC0uNy4zLS43LjctLjMgNS45LTUuNSAxMC40LTExLjYgOS43eiIgZmlsbD0iIzRlYTRmNiIvPjwvc3ZnPg==);--spinner-dark-blue-data:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZD0iTTEwLjggMjIuNEM2IDIxLjkgMi4xIDE4IDEuNiAxMy4yLjkgNy4xIDUuNCAxLjkgMTEuMyAxLjVjLjQgMCAuNy0uMy43LS43IDAtLjQtLjQtLjgtLjgtLjhDNC44LjQtLjIgNS45IDAgMTIuNS4yIDE4LjYgNS40IDIzLjggMTEuNSAyNGM2LjYuMiAxMi00LjggMTIuNC0xMS4yIDAtLjQtLjMtLjgtLjgtLjgtLjQgMC0uNy4zLS43LjctLjMgNS45LTUuNSAxMC40LTExLjYgOS43eiIgZmlsbD0iIzgzNzhEQiIvPjwvc3ZnPg==);--spinner-black-data:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZD0iTTEwLjggMjIuNEM2IDIxLjkgMi4xIDE4IDEuNiAxMy4yLjkgNy4xIDUuNCAxLjkgMTEuMyAxLjVjLjQgMCAuNy0uMy43LS43IDAtLjQtLjQtLjgtLjgtLjhDNC44LjQtLjIgNS45IDAgMTIuNS4yIDE4LjYgNS40IDIzLjggMTEuNSAyNGM2LjYuMiAxMi00LjggMTIuNC0xMS4yIDAtLjQtLjMtLjgtLjgtLjgtLjQgMC0uNy4zLS43LjctLjMgNS45LTUuNSAxMC40LTExLjYgOS43eiIgZmlsbD0iIzJlMzkzOSIvPjwvc3ZnPg==);--spinner-green-data:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZD0iTTEwLjggMjIuNEM2IDIxLjkgMi4xIDE4IDEuNiAxMy4yLjkgNy4xIDUuNCAxLjkgMTEuMyAxLjVjLjQgMCAuNy0uMy43LS43IDAtLjQtLjQtLjgtLjgtLjhDNC44LjQtLjIgNS45IDAgMTIuNS4yIDE4LjYgNS40IDIzLjggMTEuNSAyNGM2LjYuMiAxMi00LjggMTIuNC0xMS4yIDAtLjQtLjMtLjgtLjgtLjgtLjQgMC0uNy4zLS43LjctLjMgNS45LTUuNSAxMC40LTExLjYgOS43eiIgZmlsbD0iIzRmYWU0ZSIvPjwvc3ZnPg==);--spinner-gray-data:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZD0iTTEwLjggMjIuNEM2IDIxLjkgMi4xIDE4IDEuNiAxMy4yLjkgNy4xIDUuNCAxLjkgMTEuMyAxLjVjLjQgMCAuNy0uMy43LS43IDAtLjQtLjQtLjgtLjgtLjhDNC44LjQtLjIgNS45IDAgMTIuNS4yIDE4LjYgNS40IDIzLjggMTEuNSAyNGM2LjYuMiAxMi00LjggMTIuNC0xMS4yIDAtLjQtLjMtLjgtLjgtLjgtLjQgMC0uNy4zLS43LjctLjMgNS45LTUuNSAxMC40LTExLjYgOS43eiIgZmlsbD0iIzcwNzU3OSIvPjwvc3ZnPg==);--drag-target-border:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg'%3E%3Crect width='100%25' height='100%25' fill='none' rx='8' ry='8' stroke='%23DDDFE0' stroke-width='4' stroke-dasharray='9.1, 10.5' stroke-dashoffset='3' stroke-linecap='round'/%3E%3C/svg%3E");--drag-target-border-hovered:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg'%3E%3Crect width='100%25' height='100%25' fill='none' rx='8' ry='8' stroke='%2363A2E3' stroke-width='4' stroke-dasharray='9.1, 10.5' stroke-dashoffset='3' stroke-linecap='round'/%3E%3C/svg%3E");--layer-transition:300ms cubic-bezier(0.33,1,0.68,1);--layer-blackout-opacity:0.3;--slide-transition:450ms cubic-bezier(0.25,1,0.5,1);--select-transition:200ms ease-out;--vh:1vh}@media (min-width:1276px) and (max-width:1680px){:root{--right-column-width:25vw}}@media (max-width:600px){:root{--right-column-width:100vw;--symbol-menu-width:100vw;--symbol-menu-height:14.6875rem;--layer-transition:450ms cubic-bezier(0.25,1,0.5,1)}}.m-0{margin:0!important}.mt-0,.my-0{margin-top:0!important}.mr-0,.mx-0{margin-right:0!important}.mb-0,.my-0{margin-bottom:0!important}.ml-0,.mx-0{margin-left:0!important}.m-1{margin:.25rem!important}.mt-1,.my-1{margin-top:.25rem!important}.mr-1,.mx-1{margin-right:.25rem!important}.mb-1,.my-1{margin-bottom:.25rem!important}.ml-1,.mx-1{margin-left:.25rem!important}.m-2{margin:.5rem!important}.mt-2,.my-2{margin-top:.5rem!important}.mr-2,.mx-2{margin-right:.5rem!important}.mb-2,.my-2{margin-bottom:.5rem!important}.ml-2,.mx-2{margin-left:.5rem!important}.m-3{margin:1rem!important}.mt-3,.my-3{margin-top:1rem!important}.mr-3,.mx-3{margin-right:1rem!important}.mb-3,.my-3{margin-bottom:1rem!important}.ml-3,.mx-3{margin-left:1rem!important}.m-4{margin:1.5rem!important}.mt-4,.my-4{margin-top:1.5rem!important}.mr-4,.mx-4{margin-right:1.5rem!important}.mb-4,.my-4{margin-bottom:1.5rem!important}.ml-4,.mx-4{margin-left:1.5rem!important}.m-5{margin:2rem!important}.mt-5,.my-5{margin-top:2rem!important}.mr-5,.mx-5{margin-right:2rem!important}.mb-5,.my-5{margin-bottom:2rem!important}.ml-5,.mx-5{margin-left:2rem!important}.m-6{margin:3rem!important}.mt-6,.my-6{margin-top:3rem!important}.mr-6,.mx-6{margin-right:3rem!important}.mb-6,.my-6{margin-bottom:3rem!important}.ml-6,.mx-6{margin-left:3rem!important}.p-0{padding:0!important}.pt-0,.py-0{padding-top:0!important}.pr-0,.px-0{padding-right:0!important}.pb-0,.py-0{padding-bottom:0!important}.pl-0,.px-0{padding-left:0!important}.p-1{padding:.25rem!important}.pt-1,.py-1{padding-top:.25rem!important}.pr-1,.px-1{padding-right:.25rem!important}.pb-1,.py-1{padding-bottom:.25rem!important}.pl-1,.px-1{padding-left:.25rem!important}.p-2{padding:.5rem!important}.pt-2,.py-2{padding-top:.5rem!important}.pr-2,.px-2{padding-right:.5rem!important}.pb-2,.py-2{padding-bottom:.5rem!important}.pl-2,.px-2{padding-left:.5rem!important}.p-3{padding:1rem!important}.pt-3,.py-3{padding-top:1rem!important}.pr-3,.px-3{padding-right:1rem!important}.pb-3,.py-3{padding-bottom:1rem!important}.pl-3,.px-3{padding-left:1rem!important}.p-4{padding:1.5rem!important}.pt-4,.py-4{padding-top:1.5rem!important}.pr-4,.px-4{padding-right:1.5rem!important}.pb-4,.py-4{padding-bottom:1.5rem!important}.pl-4,.px-4{padding-left:1.5rem!important}.p-5{padding:2rem!important}.pt-5,.py-5{padding-top:2rem!important}.pr-5,.px-5{padding-right:2rem!important}.pb-5,.py-5{padding-bottom:2rem!important}.pl-5,.px-5{padding-left:2rem!important}.p-6{padding:3rem!important}.pt-6,.py-6{padding-top:3rem!important}.pr-6,.px-6{padding-right:3rem!important}.pb-6,.py-6{padding-bottom:3rem!important}.pl-6,.px-6{padding-left:3rem!important}.input-group{position:relative;margin-bottom:1.5rem}.input-group label{display:block;padding:0 .25rem;position:absolute;left:.75rem;top:.95rem;background-color:var(--color-background);font-size:1rem;font-weight:400;color:var(--color-placeholders);transition:transform .15s ease-out,color .15s ease-out;cursor:text;pointer-events:none;transform-origin:left center;white-space:nowrap}.input-group.with-arrow:after{content:"";position:absolute;height:.75rem;width:.75rem;border-left:1px solid var(--color-text-secondary);border-bottom:1px solid var(--color-text-secondary);transform:rotate(-45deg);right:2rem;top:1rem}.input-group.error label,.input-group .form-control.focus+label,.input-group .form-control:focus+label,.input-group.success label,.input-group.touched label{transform:scale(.75) translate(-.5rem,-2.25rem)}.input-group .form-control::placeholder,.input-group input::placeholder{color:var(--color-placeholders)}.input-group.touched label{color:var(--color-text-secondary)}.input-group.error label{color:var(--color-error)!important}.input-group.success label{color:var(--color-text-green)!important}.input-group.disabled{opacity:.5;pointer-events:none}.input-group[dir=rtl] input{text-align:right}.input-group[dir=rtl] label{left:auto;right:.75rem}.input-group[dir=rtl].with-arrow:after{border-left:none;border-right:1px solid var(--color-text-secondary);right:auto;left:2rem}.input-group[dir=rtl].error label,.input-group[dir=rtl] .form-control.focus+label,.input-group[dir=rtl] .form-control:focus+label,.input-group[dir=rtl].success label,.input-group[dir=rtl].touched label{transform:scale(.75) translate(1.5rem,-2.25rem)}.form-control{--border-width:1px;display:block;width:100%;height:3.375rem;padding:calc(.75rem - var(--border-width)) calc(.9rem - var(--border-width));border:var(--border-width) solid var(--color-borders-input);border-radius:var(--border-radius-default);color:var(--color-text);background-color:var(--color-background);outline:none;transition:border-color .15s ease;word-break:break-word;-webkit-appearance:none;font-size:1rem;line-height:1.25rem}.form-control[dir]{text-align:initial}.form-control:hover{border-color:var(--color-primary)}.form-control:hover+label{color:var(--color-primary)}.form-control.focus,.form-control:focus{border-color:var(--color-primary);box-shadow:inset 0 0 0 1px var(--color-primary);caret-color:var(--color-primary)}.form-control.focus+label,.form-control:focus+label{color:var(--color-primary)}.form-control:disabled{background:none!important}.error .form-control{border-color:var(--color-error);box-shadow:inset 0 0 0 1px var(--color-error);caret-color:var(--color-error)}.success .form-control{border-color:var(--color-text-green);box-shadow:inset 0 0 0 1px var(--color-text-green);caret-color:var(--color-text-green)}select.form-control option{line-height:2rem}textarea.form-control{resize:none;overflow:hidden;line-height:1.3125rem;padding-top:calc(1rem - var(--border-width));padding-bottom:calc(1rem - var(--border-width))}.input-group.password-input{position:relative}.input-group.password-input .form-control{padding-right:3.375rem}.input-group.password-input .toggle-password{position:absolute;top:0;right:0;width:3.375rem;height:3.375rem;display:flex;align-items:center;justify-content:center;cursor:pointer;outline:none!important;color:var(--color-text-secondary);opacity:.7;font-size:1.5rem}.input-group.password-input .toggle-password:focus,.input-group.password-input .toggle-password:hover{opacity:1}.input-group.password-input[dir=rtl] .form-control{padding-left:3.375rem;padding-right:calc(.9rem - var(--border-width))}.input-group.password-input[dir=rtl] .toggle-password{left:0;right:auto}@font-face{font-family:icomoon;src:url(icomoon.614a8c7d9a61b2762170dd8c484f6cbf.woff2) format("woff2"),url(icomoon.a3173a76102021a87cab628b6b1e6167.woff) format("woff");font-weight:400;font-style:normal;font-display:block}[class*=" icon-"],[class^=icon-]{font-family:icomoon!important;speak:none;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}[class*=" icon-char-"]:before,[class^=icon-char-]:before{font-family:Roboto,Helvetica Neue,sans-serif;content:attr(data-char);width:1.5rem;text-align:center;display:block}.icon-bug:before{content:"\e97e"}.icon-data:before{content:"\e97d"}.icon-darkmode:before{content:"\e979"}.icon-animations:before{content:"\e97a"}.icon-enter:before{content:"\e97b"}.icon-fontsize:before{content:"\e97c"}.icon-permissions:before{content:"\e976"}.icon-card:before{content:"\e977"}.icon-truck:before{content:"\e978"}.icon-share-filled:before{content:"\e95a"}.icon-bold:before{content:"\e961"}.icon-bot-command:before{content:"\e962"}.icon-calendar-filter:before{content:"\e963"}.icon-comments:before{content:"\e964"}.icon-comments-sticker:before{content:"\e965"}.icon-arrow-down:before{content:"\e966"}.icon-email:before{content:"\e967"}.icon-italic:before{content:"\e968"}.icon-link:before{content:"\e969"}.icon-mention:before{content:"\e96a"}.icon-monospace:before{content:"\e96b"}.icon-next:before{content:"\e96c"}.icon-password-off:before{content:"\e96d"}.icon-pin-list:before{content:"\e96e"}.icon-previous:before{content:"\e96f"}.icon-replace:before{content:"\e970"}.icon-schedule:before{content:"\e971"}.icon-strikethrough:before{content:"\e972"}.icon-underlined:before{content:"\e973"}.icon-zoom-in:before{content:"\e974"}.icon-zoom-out:before{content:"\e975"}.icon-select:before{content:"\e960"}.icon-folder:before{content:"\e913"}.icon-bots:before{content:"\e915"}.icon-calendar:before{content:"\e916"}.icon-cloud-download:before{content:"\e917"}.icon-colorize:before{content:"\e918"}.icon-forward:before{content:"\e927"}.icon-reply:before{content:"\e947"}.icon-help:before{content:"\e92a"}.icon-info:before{content:"\e92b"}.icon-info-filled:before{content:"\e91b"}.icon-delete-filled:before{content:"\e91c"}.icon-delete:before{content:"\e91d"}.icon-edit:before{content:"\e923"}.icon-new-chat-filled:before{content:"\e939"}.icon-send:before{content:"\e94a"}.icon-send-outline:before{content:"\e94b"}.icon-add-user-filled:before{content:"\e904"}.icon-add-user:before{content:"\e905"}.icon-delete-user:before{content:"\e91e"}.icon-microphone:before{content:"\e935"}.icon-microphone-alt:before{content:"\e93b"}.icon-poll:before{content:"\e938"}.icon-revote:before{content:"\e93a"}.icon-photo:before{content:"\e940"}.icon-document:before{content:"\e91f"}.icon-camera:before{content:"\e90e"}.icon-camera-add:before{content:"\e90f"}.icon-logout:before{content:"\e932"}.icon-saved-messages:before{content:"\e948"}.icon-settings:before{content:"\e94e"}.icon-phone:before{content:"\e93f"}.icon-attach:before{content:"\e909"}.icon-copy:before{content:"\e91a"}.icon-channel:before{content:"\e911"}.icon-group:before{content:"\e929"}.icon-user:before{content:"\e959"}.icon-non-contacts:before{content:"\e928"}.icon-active-sessions:before{content:"\e902"}.icon-admin:before{content:"\e906"}.icon-download:before{content:"\e921"}.icon-location:before{content:"\e930"}.icon-stop:before{content:"\e952"}.icon-archive:before{content:"\e908"}.icon-unarchive:before{content:"\e953"}.icon-readchats:before{content:"\e933"}.icon-unread:before{content:"\e957"}.icon-message:before{content:"\e934"}.icon-lock:before{content:"\e931"}.icon-unlock:before{content:"\e954"}.icon-mute:before{content:"\e937"}.icon-unmute:before{content:"\e955"}.icon-pin:before{content:"\e941"}.icon-unpin:before{content:"\e956"}.icon-smallscreen:before{content:"\e95e"}.icon-fullscreen:before{content:"\e95f"}.icon-large-pause:before{content:"\e92e"}.icon-large-play:before{content:"\e92f"}.icon-pause:before{content:"\e93d"}.icon-play:before{content:"\e943"}.icon-channelviews:before{content:"\e912"}.icon-message-succeeded:before{content:"\e900"}.icon-message-read:before{content:"\e901"}.icon-message-pending:before{content:"\e94c"}.icon-message-failed:before{content:"\e94d"}.icon-favorite:before{content:"\e93e"}.icon-keyboard:before{content:"\e944"}.icon-delete-left:before{content:"\e945"}.icon-recent:before{content:"\e946"}.icon-gifs:before{content:"\e94f"}.icon-stickers:before{content:"\e95b"}.icon-smile:before{content:"\e950"}.icon-animals:before{content:"\e907"}.icon-eats:before{content:"\e922"}.icon-sport:before{content:"\e951"}.icon-car:before{content:"\e910"}.icon-lamp:before{content:"\e92c"}.icon-language:before{content:"\e92d"}.icon-flag:before{content:"\e926"}.icon-more:before{content:"\e936"}.icon-search:before{content:"\e949"}.icon-remove:before{content:"\e95c"}.icon-add:before{content:"\e903"}.icon-check:before{content:"\e914"}.icon-close:before{content:"\e919"}.icon-arrow-left:before{content:"\e90d"}.icon-arrow-right:before{content:"\e93c"}.icon-down:before{content:"\e920"}.icon-up:before{content:"\e958"}.icon-eye-closed:before{content:"\e925"}.icon-eye:before{content:"\e924"}.icon-muted-chat:before{content:"\e95d"}.icon-avatar-archived-chats:before{content:"\e90a"}.icon-avatar-deleted-account:before{content:"\e90b"}.icon-avatar-saved-messages:before{content:"\e90c"}.icon-pinned-chat:before{content:"\e942"}.media-inner{position:relative}.media-inner img,.media-inner video{display:block;object-fit:cover}.media-inner video{background:no-repeat 50% 50%;background-size:contain}.media-inner .media-loading,.media-inner .thumbnail~.full-media,.media-inner .thumbnail~.thumbnail{position:absolute}.animated-close-icon{position:absolute;transform:rotate(-45deg)}.animated-close-icon,.animated-close-icon:after,.animated-close-icon:before{width:1.125rem;height:.125rem;border-radius:.125rem;background-color:var(--color-text-secondary);transition:transform var(--slide-transition)}.animated-close-icon:after,.animated-close-icon:before{position:absolute;left:0;top:0;content:""}.animated-close-icon:before{transform:rotate(90deg)}.animated-close-icon.no-transition,.animated-close-icon.no-transition:after,.animated-close-icon.no-transition:before{transition:none}.animated-close-icon.state-back{transform:rotate(180deg)}.animated-close-icon.state-back:before{transform:rotate(45deg) scaleX(.75) translateY(-.375rem)}.animated-close-icon.state-back:after{transform:rotate(-45deg) scaleX(.75) translateY(.375rem)}.chat-list{background:var(--color-background);height:100%;overflow-y:auto;padding:.5rem .125rem .5rem .4375rem}.chat-list .scroll-container{position:relative}.chat-list .ListItem.chat-item-clickable{margin:0}@media (max-width:600px){.chat-list{padding-left:0;padding-right:0}}.chat-list .no-results{color:var(--color-text-meta);margin-top:2rem;text-align:center}div.color-bg-1{--color-user:var(--color-user-1)}div.color-bg-2{--color-user:var(--color-user-2)}div.color-bg-4{--color-user:var(--color-user-4)}div.color-bg-5{--color-user:var(--color-user-5)}div.color-bg-6{--color-user:var(--color-user-6)}div.color-bg-7{--color-user:var(--color-user-7)}div.color-bg-8{--color-user:var(--color-user-8)}div.saved-messages{--color-user:var(--color-primary)}div.deleted-account{--color-user:var(--color-gray)}html{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-rendering:optimizeSpeed}body,html{width:100%;height:100%;background:var(--color-background);margin:0;padding:0;font-size:16px;font-family:Roboto,Helvetica Neue,sans-serif;color:var(--color-text);overflow:hidden}@media (max-width:600px){body,html{height:calc(var(--vh, 1vh)*100)}}.font-emoji{font-family:Apple Color Emoji,sans-serif;font-style:normal}body.cursor-grabbing,body.cursor-grabbing *{cursor:grabbing!important}#root{height:100%;max-width:1680px;margin:0 auto}@media (max-width:600px){#root{height:calc(var(--vh, 1vh)*100)}}#middle-column-portals,#portals{position:absolute;top:0;left:0;right:0}.hidden{visibility:hidden}.no-selection{user-select:none;-webkit-user-select:none!important}.visually-hidden{position:absolute!important;width:0;height:0;overflow:hidden;clip:rect(0,0,0,0);z-index:-1}.not-implemented{opacity:.5}.not-implemented,.not-implemented *{cursor:not-allowed!important}*{box-sizing:border-box}.no-animations #root *,.no-animations #root :after,.no-animations #root :before{transition:none!important}.custom-scroll,.custom-scroll-x{scrollbar-width:thin;scrollbar-color:rgba(90,90,90,0) transparent;transition:scrollbar-color .3s ease;-webkit-overflow-scrolling:touch;pointer-events:auto}.custom-scroll-x::-webkit-scrollbar-thumb,.custom-scroll::-webkit-scrollbar-thumb{background-color:rgba(90,90,90,0);border-radius:.35rem}.custom-scroll-x:focus,.custom-scroll-x:focus-within,.custom-scroll-x:hover,.custom-scroll:focus,.custom-scroll:focus-within,.custom-scroll:hover{scrollbar-color:rgba(90,90,90,.3) transparent}.custom-scroll-x:focus-within::-webkit-scrollbar-thumb,.custom-scroll-x:focus::-webkit-scrollbar-thumb,.custom-scroll-x:hover::-webkit-scrollbar-thumb,.custom-scroll:focus-within::-webkit-scrollbar-thumb,.custom-scroll:focus::-webkit-scrollbar-thumb,.custom-scroll:hover::-webkit-scrollbar-thumb{background-color:rgba(90,90,90,.3)}.custom-scroll::-webkit-scrollbar{width:.375rem}.custom-scroll-x::-webkit-scrollbar{height:.35rem}.no-scrollbar{scrollbar-width:none}.no-scrollbar::-webkit-scrollbar{display:none}.emoji-small{background:no-repeat;background-size:1.25rem;color:transparent;display:inline-block;width:1.25rem;height:1.25rem;margin-inline-end:1px;overflow:hidden;flex-shrink:0}.emoji-small::selection{background-color:var(--color-selection-highlight-emoji);color:transparent}div[role=button]{outline:none!important;cursor:pointer}.opacity-transition{opacity:1;transition:opacity .15s ease}.opacity-transition:not(.open){opacity:0}.opacity-transition:not(.shown){display:none}.opacity-transition.slow{transition-duration:.3s}.color-primary{color:var(--color-primary)!important}.color-danger{color:var(--color-error)!important}.text-muted{color:var(--color-text-secondary)!important}@keyframes grow-icon{0%{transform:scale(.5);opacity:.8}50%{transform:scale(1.1);opacity:1}to{transform:scale(1)}}@keyframes hide-icon{0%{transform:scale(1);opacity:.4}to{transform:scale(.5);opacity:0}} \ No newline at end of file diff --git a/dist/main.bcfa4c2bdab21d30f0f4.js b/dist/main.bcfa4c2bdab21d30f0f4.js new file mode 100644 index 000000000..270594fe9 --- /dev/null +++ b/dist/main.bcfa4c2bdab21d30f0f4.js @@ -0,0 +1,2 @@ +!function(e){function t(t){for(var n,r,d=t[0],o=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`),I[n].renderTimes.push(t),I[n].renderCount++}}catch(t){Object(c.a)(t),u=e.renderedValue}if(e.isMounted&&u===e.renderedValue)return e.$element;e.renderedValue=u;const d=w(u);return e.$element=y(e,[d]),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.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 j(e),e.isMounted=!0,e.$element}function M(e){if(!e.isMounted||!e.onUpdate)return;const t=e.$element;j(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 d;return void 0===n[t]&&(n[t]={value:e,nextValue:e,setter:(d=f,e=>{n[t].nextValue!==e&&(n[t].nextValue="function"==typeof e?e(n[t].value):e,d.prepareForFrame&&d.forceUpdate||(d.prepareForFrame=Object(u.h)(()=>function e(t){t.isMounted&&(t.hooks.state.byCursor.forEach(e=>{e.value=e.nextValue}),t.prepareForFrame=Object(u.h)(()=>e(t)),t.forceUpdate=Object(u.i)(()=>M(t)))}(d)),d.forceUpdate=Object(u.i)(()=>M(d))),d.prepareForFrame(),d.forceUpdate(),r.r&&console.log("[Teact.useState]",d.name,d.Component&&d.Component.DEBUG_contentComponentName?"> "+d.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){const{cursor:r,byCursor:u}=f.hooks.effects,d=f,o=()=>{if(!d.isMounted)return;const{cleanup:e}=u[r];if("function"==typeof e)try{e()}catch(e){Object(c.a)(e)}u[r].cleanup=t()};void 0!==u[r]&&n&&u[r].dependencies?n.some((e,t)=>e!==u[r].dependencies[t])&&e(o):e(o),u[r]={effect:t,dependencies:n,cleanup:u[r]?u[r].cleanup:void 0},f.hooks.effects.cursor++}function P(e,t){return N(u.b,e,t)}function D(e,t){return N(u.d,e,t)}function L(e,t){const{cursor:n,byCursor:r}=f.hooks.memos;let{current:u}=r[n]||{};return(void 0===r[n]||t.some((e,t)=>e!==r[n].dependencies[t]))&&(u=e()),r[n]={current:u,dependencies:t},f.hooks.memos.cursor++,u}function F(e,t){return L(()=>e,t)}function B(e){return L(()=>({current:e}),[])}function x(e,t=o.a,n=!1){return function(u){const d=B(u),c=B();return(!c.current||d.current&&!t(d.current,u))&&(r.p&&n&&console.log(`[Teact.memo] ${e.name}: Update is caused by:`,Object(o.b)(d.current,u).join(", ")),d.current=u,c.current=g(e,u)),c.current}}document.addEventListener("dblclick",()=>{console.log("COMPONENTS",Object(d.k)(Object.values(I),"renderCount","desc"))}),t.a={createElement:g,Fragment:s}},function(e,t,n){"use strict";n.d(t,"fb",(function(){return r})),n.d(t,"E",(function(){return u})),n.d(t,"f",(function(){return d})),n.d(t,"g",(function(){return o})),n.d(t,"p",(function(){return c})),n.d(t,"r",(function(){return a})),n.d(t,"F",(function(){return i})),n.d(t,"q",(function(){return s})),n.d(t,"D",(function(){return f})),n.d(t,"I",(function(){return l})),n.d(t,"A",(function(){return b})),n.d(t,"B",(function(){return h})),n.d(t,"z",(function(){return m})),n.d(t,"C",(function(){return p})),n.d(t,"N",(function(){return g})),n.d(t,"O",(function(){return y})),n.d(t,"P",(function(){return v})),n.d(t,"Q",(function(){return O})),n.d(t,"m",(function(){return w})),n.d(t,"G",(function(){return I})),n.d(t,"Z",(function(){return C})),n.d(t,"V",(function(){return E})),n.d(t,"W",(function(){return S})),n.d(t,"X",(function(){return M})),n.d(t,"i",(function(){return A})),n.d(t,"k",(function(){return k})),n.d(t,"j",(function(){return T})),n.d(t,"ob",(function(){return N})),n.d(t,"Y",(function(){return P})),n.d(t,"y",(function(){return D})),n.d(t,"S",(function(){return L})),n.d(t,"R",(function(){return F})),n.d(t,"gb",(function(){return B})),n.d(t,"Db",(function(){return x})),n.d(t,"a",(function(){return R})),n.d(t,"e",(function(){return U})),n.d(t,"d",(function(){return _})),n.d(t,"s",(function(){return G})),n.d(t,"u",(function(){return $})),n.d(t,"v",(function(){return W})),n.d(t,"w",(function(){return K})),n.d(t,"lb",(function(){return H})),n.d(t,"kb",(function(){return z})),n.d(t,"bb",(function(){return V})),n.d(t,"ab",(function(){return q})),n.d(t,"eb",(function(){return J})),n.d(t,"db",(function(){return Y})),n.d(t,"cb",(function(){return Q})),n.d(t,"K",(function(){return Z})),n.d(t,"c",(function(){return X})),n.d(t,"vb",(function(){return ee})),n.d(t,"wb",(function(){return te})),n.d(t,"qb",(function(){return ne})),n.d(t,"rb",(function(){return re})),n.d(t,"yb",(function(){return ue})),n.d(t,"ub",(function(){return de})),n.d(t,"zb",(function(){return oe})),n.d(t,"Ab",(function(){return ce})),n.d(t,"xb",(function(){return ae})),n.d(t,"Bb",(function(){return ie})),n.d(t,"sb",(function(){return se})),n.d(t,"tb",(function(){return fe})),n.d(t,"T",(function(){return le})),n.d(t,"U",(function(){return be})),n.d(t,"pb",(function(){return he})),n.d(t,"l",(function(){return me})),n.d(t,"hb",(function(){return pe})),n.d(t,"jb",(function(){return ge})),n.d(t,"ib",(function(){return ye})),n.d(t,"nb",(function(){return ve})),n.d(t,"b",(function(){return Oe})),n.d(t,"h",(function(){return we})),n.d(t,"M",(function(){return Ie})),n.d(t,"L",(function(){return je})),n.d(t,"mb",(function(){return Ce})),n.d(t,"H",(function(){return Ee})),n.d(t,"Cb",(function(){return Se})),n.d(t,"x",(function(){return Me})),n.d(t,"J",(function(){return Ae})),n.d(t,"n",(function(){return ke})),n.d(t,"o",(function(){return Te})),n.d(t,"t",(function(){return Ne}));const r="Telegram",u=" [Inactive]",d="Telegram WebZ",o="9967724",c=!1,a=!1,i=!1,s="Shoot!\nSomething went wrong, please see the error details in Dev Tools Console.",f="GramJs:sessionId",l="user_auth",b=!1,h="tt-global-state",m=30,p=5e3,g=!1,y="tt-media",v="tt-media-avatars",O="tt-media-progressive",w="tt-custom-bg",I="tt-lang-packs-v4",j=(new Set(["newMessage","newScheduledMessage","deleteMessages","deleteScheduledMessages","deleteHistory"]),"undefined"!=typeof window&&window.innerHeight>=900),C=1,E=750,S=j?60:40,M=2*S,A=72,k=j?30:25,T=100,N=42,P=42,D=20,L=30,F=200,B=500,x=20,R=!1,U=2,_=U,G=16,$=1e4,W="editable-message-text",K="editable-message-text-modal",H=1440,z=1150,V=1275,q=925,J=600,Y=950,Q=450,Z=1e9,X=100,ee=13,te=11,ne=160,re=120,ue=64,de=48,oe=32,ce=64,ae=64,ie=160,se=140,fe=80,le="MEMOJI_STICKER",be=200,he=450,me="image/png,image/gif,image/jpeg,video/mp4,video/avi,video/quicktime",pe="((ftp|https?):\\/\\/)?((www\\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\\.[a-zA-Z0-9()]{1,6})\\b([-a-zA-Z0-9()@:%_+.~#?&/=]*)",ge=/^(?:https?:\/\/)?(?:t\.me\/)([\d\w_]+)(?:\/([\d]+))?$/gm,ye=/^(?:https?:\/\/)?(?:t\.me\/joinchat\/)([\d\w_]+)?$/gm,ve=777e3,Oe=0,we=1,Ie=10,je=5,Ce=2147483646,Ee=["android","ios","tdesktop","macos"],Se="TelegramTips",Me="https://bugs.telegram.org/?tag_ids=41&sort=time",Ae="#A2AF8E",ke="#0F0F0F",Te="#0a0a0a8c",Ne="rgba(90, 110, 70, 0.6)"},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 w})),n.d(t,"b",(function(){return I})),n.d(t,"a",(function(){return j})),n.d(t,"f",(function(){return C})),n.d(t,"h",(function(){return E}));var r=n(0),u=n(1),d=n(25),o=n(27),c=n(9),a=n(23),i=n(3),s=n(21);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.i)(g);function v(e,t=!1){"object"==typeof e&&e!==l&&(l=e,t?g():y())}function O(){return l}function w(){return m}function I(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 j(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(o.a)(p)),b=Object(d.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.p&&(window.getGlobal=O,document.addEventListener("dblclick",()=>{console.log("GLOBAL CONTAINERS",Object(i.k)(Object.values(p),"DEBUG_updates","desc"))}))},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 d(e,t){return t.reduce((t,n)=>(t[n]=e[n],t),{})}function o(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 d(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,d]=Array.isArray(n)?n:[n,n],[o,c]=t;let a,i;if("function"==typeof o?(a=o(e)||0,i=o(r)||0):"string"==typeof o&&(a=e[o]||0,i=r[o]||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"===d?t-n:n-t}}let u,d;return"function"==typeof t?(u=t(e)||0,d=t(r)||0):"string"==typeof t&&(u=e[t]||0,d=r[t]||0),"asc"===n?u-d:d-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 d})),n.d(t,"m",(function(){return o})),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,"Y",(function(){return r.b})),n.d(t,"Z",(function(){return r.c})),n.d(t,"ab",(function(){return r.d})),n.d(t,"xb",(function(){return r.g})),n.d(t,"pb",(function(){return r.e})),n.d(t,"wb",(function(){return r.f})),n.d(t,"Eb",(function(){return r.h})),n.d(t,"X",(function(){return r.a})),n.d(t,"lb",(function(){return u.w})),n.d(t,"kb",(function(){return u.v})),n.d(t,"ib",(function(){return u.t})),n.d(t,"nb",(function(){return u.y})),n.d(t,"jb",(function(){return u.u})),n.d(t,"ob",(function(){return u.z})),n.d(t,"m",(function(){return u.j})),n.d(t,"U",(function(){return u.p})),n.d(t,"l",(function(){return u.i})),n.d(t,"g",(function(){return u.e})),n.d(t,"h",(function(){return u.f})),n.d(t,"f",(function(){return u.d})),n.d(t,"mb",(function(){return u.x})),n.d(t,"gb",(function(){return u.r})),n.d(t,"q",(function(){return u.m})),n.d(t,"yb",(function(){return u.A})),n.d(t,"e",(function(){return u.c})),n.d(t,"c",(function(){return u.a})),n.d(t,"K",(function(){return u.o})),n.d(t,"k",(function(){return u.h})),n.d(t,"j",(function(){return u.g})),n.d(t,"hb",(function(){return u.s})),n.d(t,"Cb",(function(){return u.D})),n.d(t,"d",(function(){return u.b})),n.d(t,"Bb",(function(){return u.C})),n.d(t,"Ab",(function(){return u.B})),n.d(t,"p",(function(){return u.l})),n.d(t,"o",(function(){return u.k})),n.d(t,"fb",(function(){return u.q})),n.d(t,"J",(function(){return u.n})),n.d(t,"Db",(function(){return u.E})),n.d(t,"A",(function(){return i})),n.d(t,"zb",(function(){return s})),n.d(t,"F",(function(){return f})),n.d(t,"N",(function(){return l})),n.d(t,"O",(function(){return b})),n.d(t,"x",(function(){return h})),n.d(t,"L",(function(){return m})),n.d(t,"n",(function(){return p})),n.d(t,"tb",(function(){return g})),n.d(t,"ub",(function(){return y})),n.d(t,"qb",(function(){return v})),n.d(t,"db",(function(){return O})),n.d(t,"vb",(function(){return w})),n.d(t,"eb",(function(){return I})),n.d(t,"V",(function(){return j})),n.d(t,"W",(function(){return C})),n.d(t,"sb",(function(){return E})),n.d(t,"rb",(function(){return S})),n.d(t,"v",(function(){return k})),n.d(t,"cb",(function(){return T})),n.d(t,"G",(function(){return N})),n.d(t,"P",(function(){return P})),n.d(t,"I",(function(){return D})),n.d(t,"t",(function(){return L})),n.d(t,"u",(function(){return F})),n.d(t,"M",(function(){return B})),n.d(t,"y",(function(){return x})),n.d(t,"H",(function(){return R})),n.d(t,"z",(function(){return U})),n.d(t,"Q",(function(){return _})),n.d(t,"R",(function(){return G})),n.d(t,"E",(function(){return $})),n.d(t,"D",(function(){return W})),n.d(t,"C",(function(){return H})),n.d(t,"B",(function(){return z})),n.d(t,"b",(function(){return q})),n.d(t,"i",(function(){return J})),n.d(t,"S",(function(){return Y})),n.d(t,"T",(function(){return Q})),n.d(t,"bb",(function(){return Z})),n.d(t,"s",(function(){return X})),n.d(t,"w",(function(){return ee})),n.d(t,"r",(function(){return te})),n.d(t,"a",(function(){return ne}));var r=n(29),u=n(30),d=n(5),o=n(1),c=n(63);const a=new RegExp(o.hb,"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:d,audio:o,voice:c,document:a,sticker:i,contact:s,poll:f,invoice:l}=t.content;if(t.groupedId)return`${n?"":"🖼 "}${r?r.text:e("lng_in_dlg_album")}`;if(u)return`${n?"":"🖼 "}${r?r.text:e("AttachPhoto")}`;if(d)return`${n?"":"📹 "}${r?r.text:e(d.isGif?"AttachGif":"AttachVideo")}`;if(i)return`${i.emoji} ${e("AttachSticker")} `;if(o){return`${n?"":"🎧 "}${[o.title,o.performer].filter(Boolean).join(" — ")||r&&r.text||e("AttachMusic")}`}return c?`${n?"":"🎤 "}${r?r.text:e("AttachAudio")}`:a?`${n?"":"📎 "}${r?r.text:a.fileName}`:s?e("AttachContact"):f?`${n?"":"📊 "}${f.summary.question}`:l?"Invoice":r?r.text:"The message is not supported on this version of Telegram"}function b(e){const{text:t,sticker:n,photo:r,video:u,audio:d,voice:o,document:c,poll:a,webPage:i,contact:s,invoice:f}=e.content;return t?t.text:n||r||u||d||o||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:d,voice:o,document:a,poll:i,webPage:s,contact:f}=e.content;return!!(n||u&&u.isRound)||!(!t||r||u||d||o||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===d.ApiMessageEntityTypes.TextUrl);if(e&&(n=e.url.match(a)),!n&&(e=t.entities.find(e=>e.type===d.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 w(e){return e.chatId===o.nb&&E(e)}function I(e){return Boolean(e.senderId)&&e.senderId<0&&g(e)}function j(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>=o.K}function S(e){return e.content.action&&"historyClear"===e.content.action.type}var M=n(7),A=n(58);function k(e){return e.content}function T(e){return Boolean(N(e)||P(e)||x(e)||B(e)||function(e){return e.content.contact}(e)||R(e)||L(e)||F(e)||function(e){return e.content.voice}(e))}function N(e){return e.content.photo}function P(e){return e.content.video}function D(e){const{video:t}=e.content;return t&&t.isRound?t:void 0}function L(e){return e.content.action}function F(e){return e.content.audio}function B(e){return e.content.sticker}function x(e){return e.content.document}function R(e){return e.content.poll}function U(e){return e.content.invoice}function _(e){return e.content.webPage}function G(e){const t=_(e);return t?t.photo:void 0}function $(e){const t=function(e){const t=N(e)||P(e)||x(e)||B(e)||G(e);if(t)return t.thumbnail}(e);return t?t.dataUri:void 0}function W(e,t){const{photo:n,video:r,sticker:u,audio:d,voice:o,document:c}=e.content,a=G(e);if(!(n||r||u||a||d||o||c))return;const s=i(e);if(n||a)switch(t){case"micro":case"pictogram":return s+"?size=m";case"inline":if(V(e))return;return s+"?size=x";case"viewerPreview":return s+"?size=x";case"viewerFull":return s+"?size=z"}if(r)switch(t){case"micro":case"pictogram":return s+"?size=m";case"inline":if(V(e))return;return q(r)?K(r,s):s+"?size=z";case"viewerPreview":return s+"?size=m";case"viewerFull":return K(r,s);case"download":return s+"?download"}if(c)switch(t){case"micro":case"pictogram":case"inline":if(!Object(A.c)(c)||V(e))return;return s+"?size=m";default:return s}if(u)switch(t){case"micro":return;case"pictogram":return s+"?size=m";default:return s}if(d)switch(t){case"micro":case"pictogram":return;default:return K(d,s)}if(o)switch(t){case"micro":case"pictogram":return;default:return s}}function K(e,t){return M.i&&M.j?`${t}?fileSize=${e.size}&mimeType=${e.mimeType}`:t}function H(e,t){const{sticker:n,video:r,audio:u,voice:o}=e.content;return n&&"inline"===t&&n.isAnimated?d.ApiMediaFormat.Lottie:r&&M.i&&("viewerFull"===t||"inline"===t&&q(r))?d.ApiMediaFormat.Progressive:u||o?o&&!M.h?d.ApiMediaFormat.BlobUrl:d.ApiMediaFormat.Progressive:d.ApiMediaFormat.BlobUrl}function z(e){const{photo:t,video:n,webPage:r}=e.content;return t||r&&r.photo?`photo${e.date}.jpeg`:n?n.fileName:void 0}function V(e){const{photo:t,video:n,document:r}=e.content;return t&&t.blobUrl||n&&n.blobUrl||r&&r.previewBlobUrl}function q(e){return e.isGif||e.isRound||e.size<=10485760}function J(e,t,n=!1){const r=ee(e,t,"media");return n?r.reverse():r}function Y(e){return e.sizes.find(e=>"z"===e.type)||e.sizes.find(e=>"y"===e.type)||Q(e)}function Q(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 Z(e){if(e.width&&e.height)return e}function X(e,t,n=!1){const r=E(e);return{isUploading:r,isTransferring:r||n,transferProgress:Number(t)}}function ee(e,t,n){let r;switch(n){case"media":r=e=>{const t=P(e);return N(e)||t&&!t.isRound&&!t.isGif};break;case"documents":r=x;break;case"links":r=e=>_(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;default:return[]}return t.reduce((t,n)=>(e[n]&&r(e[n])&&t.push(n),t),[])}function te(e){const{audio:t,voice:n,video:r}=k(e),u=t||n||r;if(u)return u.duration}function ne(e,t){return`${e}_${t}`}n(59)},function(e,t,n){"use strict";var r=n(67);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(68);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 d=n(69);n.d(t,"ApiMessageEntityTypes",(function(){return d.a})),n.d(t,"MAIN_THREAD_ID",(function(){return d.b})),n.d(t,"MESSAGE_DELETED",(function(){return d.c}));var o=n(70);n.o(o,"ApiMediaFormat")&&n.d(t,"ApiMediaFormat",(function(){return o.ApiMediaFormat}));var c=n(71);n.d(t,"ApiMediaFormat",(function(){return c.a}));n(72),n(73)},function(e,t,n){"use strict";n.d(t,"S",(function(){return De})),n.d(t,"mb",(function(){return Le})),n.d(t,"V",(function(){return Fe})),n.d(t,"Fb",(function(){return a})),n.d(t,"f",(function(){return f})),n.d(t,"o",(function(){return l})),n.d(t,"O",(function(){return b})),n.d(t,"N",(function(){return h})),n.d(t,"zb",(function(){return m})),n.d(t,"n",(function(){return p})),n.d(t,"g",(function(){return g})),n.d(t,"K",(function(){return y})),n.d(t,"d",(function(){return v})),n.d(t,"L",(function(){return O})),n.d(t,"j",(function(){return w})),n.d(t,"i",(function(){return I})),n.d(t,"M",(function(){return j})),n.d(t,"h",(function(){return C})),n.d(t,"q",(function(){return E})),n.d(t,"y",(function(){return P})),n.d(t,"r",(function(){return D})),n.d(t,"m",(function(){return L})),n.d(t,"pb",(function(){return F})),n.d(t,"X",(function(){return x})),n.d(t,"fb",(function(){return R})),n.d(t,"x",(function(){return U})),n.d(t,"Gb",(function(){return _})),n.d(t,"ib",(function(){return G})),n.d(t,"nb",(function(){return $})),n.d(t,"qb",(function(){return W})),n.d(t,"lb",(function(){return K})),n.d(t,"C",(function(){return H})),n.d(t,"E",(function(){return z})),n.d(t,"B",(function(){return V})),n.d(t,"bb",(function(){return q})),n.d(t,"Bb",(function(){return J})),n.d(t,"F",(function(){return Y})),n.d(t,"Cb",(function(){return Q})),n.d(t,"Db",(function(){return Z})),n.d(t,"Ab",(function(){return X})),n.d(t,"a",(function(){return ee})),n.d(t,"W",(function(){return te})),n.d(t,"k",(function(){return ne})),n.d(t,"ob",(function(){return re})),n.d(t,"D",(function(){return ue})),n.d(t,"l",(function(){return de})),n.d(t,"H",(function(){return oe})),n.d(t,"T",(function(){return ce})),n.d(t,"eb",(function(){return ae})),n.d(t,"sb",(function(){return ie})),n.d(t,"J",(function(){return se})),n.d(t,"b",(function(){return fe})),n.d(t,"e",(function(){return le})),n.d(t,"Eb",(function(){return be})),n.d(t,"kb",(function(){return he})),n.d(t,"G",(function(){return me})),n.d(t,"Q",(function(){return pe})),n.d(t,"p",(function(){return ge})),n.d(t,"R",(function(){return ye})),n.d(t,"U",(function(){return ve})),n.d(t,"I",(function(){return Oe})),n.d(t,"Z",(function(){return we})),n.d(t,"P",(function(){return Ie})),n.d(t,"rb",(function(){return je})),n.d(t,"ab",(function(){return Ce})),n.d(t,"tb",(function(){return Ee})),n.d(t,"ub",(function(){return Se})),n.d(t,"vb",(function(){return Me})),n.d(t,"t",(function(){return Be})),n.d(t,"A",(function(){return Ae})),n.d(t,"w",(function(){return ke})),n.d(t,"v",(function(){return Te})),n.d(t,"Y",(function(){return Ne})),n.d(t,"u",(function(){return Pe})),n.d(t,"z",(function(){return M})),n.d(t,"s",(function(){return A})),n.d(t,"wb",(function(){return k})),n.d(t,"xb",(function(){return T})),n.d(t,"c",(function(){return N})),n.d(t,"gb",(function(){return xe})),n.d(t,"hb",(function(){return Re})),n.d(t,"jb",(function(){return Ue})),n.d(t,"yb",(function(){return _e})),n.d(t,"db",(function(){return i})),n.d(t,"cb",(function(){return s}));var r=n(19),u=n(7),d=n(5),o=n(1),c=n(4);function a(e,t){return e.users.byId[t]}function i(e){return e.settings.byKey}function s(e){return e.settings.notifyExceptions}function f(e,t){return e.chats.byId[t]}function l(e,t){const n=Object(c.U)(t);return!!n&&a(e,n)}function b(e,t){return t===e.currentUserId}function h(e,t){const n=l(e,t);return n&&Object(c.wb)(n)}function m(e){return Object.values(e.chats.byId).find(({isSupport:e})=>e)}function p(e,t){if(!Object(c.lb)(t.id)&&!Object(c.jb)(t)&&t.fullInfo)return t.fullInfo.members&&t.fullInfo.members.length!==o.R?t.fullInfo.members.reduce((t,{userId:n})=>e.users.byId[n]&&Object(c.xb)(e.users.byId[n])&&n!==e.currentUserId?t+1:t,0):t.fullInfo.onlineCount}function g(e,t){const n=f(e,t),r=n&&Object(c.U)(n),u=r&&a(e,r);if(u&&Object(c.wb)(u))return u}function y(e,t){const n=f(e,t),r=g(e,t);if(!n||!r)return!1;if(n.lastMessage&&Object(c.rb)(n.lastMessage))return!0;const u=e.messages.byChatId[t];if(!u)return!1;const{listedIds:o}=u.threadsById[d.MAIN_THREAD_ID]||{};return o&&!o.length}function v(e){return Boolean(e.chats.listIds.active)}function O(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=f(e,t);if(n&&O(e,t))return n.folderId===o.h?"archived":"active"}function I(e,t){return e.chatFolders.byId[t]}function j(e,t,n=o.b){const{active:r,archived:u}=e.chats.orderedPinnedIds;if(n===o.b)return!!r&&r.includes(t);if(n===o.h)return!!u&&u.includes(t);const{byId:d}=e.chatFolders,{pinnedChatIds:c}=d[n]||{};return!!c&&c.includes(t)}function C(e,t){const n=t.toLowerCase();return Object.values(e.chats.byId).find(e=>e.username&&e.username.toLowerCase()===n)}function E(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.Cb)(u,i(e),s(e))?t+u.unreadCount:t},0)}var S=n(3);function M(e){return e.stickers.search}function A(e){return e.gifs.search}function k(e,t){return e.stickers.setsById[t]}function T(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 N(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 P(e){const{messageLists:t}=e.messages;if(t&&t.length)return t[t.length-1]}function D(e){const{chatId:t}=P(e)||{};return t?f(e,t):void 0}function L(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 d=u.threadsById[n];return d?d[r]:void 0}function x(e,t,n){return B(e,t,n,"listedIds")}function R(e,t,n){return B(e,t,n,"outlyingIds")}function U(e,t,n,r){switch(r){case"thread":return _(e,t,n);case"pinned":return G(e,t);case"scheduled":return $(e,t)}}function _(e,t,n){return B(e,t,n,"viewportIds")}function G(e,t){return B(e,t,d.MAIN_THREAD_ID,"pinnedIds")}function $(e,t){return B(e,t,d.MAIN_THREAD_ID,"scheduledIds")}function W(e,t,n){return B(e,t,n,"scrollOffset")}function K(e,t,n){return B(e,t,n,"replyingToId")}function H(e,t,n){return B(e,t,n,"editingId")}function z(e,t){return B(e,t,d.MAIN_THREAD_ID,"editingScheduledId")}function V(e,t,n){return B(e,t,n,"draft")}function q(e,t,n){return B(e,t,n,"noWebPage")}function J(e,t,n){return B(e,t,n,"threadInfo")}function Y(e,t,n){return B(e,t,n,"firstMessageId")}function Q(e,t,n){if(n===d.MAIN_THREAD_ID)return f(e,t);const r=J(e,t,n);return r?f(e,r.originChannelId||t):void 0}function Z(e,t,n){if(n===d.MAIN_THREAD_ID)return;const r=J(e,t,n);return r?r.topMessageId:void 0}function X(e,t,n){const r=e.messages.byChatId[t];if(!r)return;const{replyToMessageId:u,replyToTopMessageId:d}=n;return u||d?Object.values(r.threadsById).find(e=>e.threadInfo&&(u&&u===e.threadInfo.topMessageId||d&&d===e.threadInfo.topMessageId)):void 0}function ee(e,t,n){const r=P(e);if(!r)return!1;const{threadInfo:u}=X(e,t,n)||{};return t===r.chatId&&(r.threadId===d.MAIN_THREAD_ID||u&&r.threadId===u.threadId)}function te(e,t,n){const r=_(e,t,n);if(!r||!r.length)return!0;let u;if(n===d.MAIN_THREAD_ID){const n=f(e,t);if(!n||!n.lastMessage)return!0;u=n.lastMessage.id}else{const r=J(e,t,n);if(!r||!r.lastMessageId)return;u=r.lastMessageId}return u>=o.K&&!ne(e,t,u)||r[r.length-1]>=u}function ne(e,t,n){const r=L(e,t);return r?r[n]:void 0}function re(e,t,n){const r=F(e,t);return r?r[n]:void 0}function ue(e,t,n,r){if("scheduled"===r){const n=z(e,t);return n?re(e,t,n):void 0}{const r=H(e,t,n);return r?ne(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 oe(e,t){const{chatId:n,messageId:r}=e.focusedMessage||{};return n===t?r:void 0}function ce(e,t){const n=oe(e,t.chatId);return!!n&&(n===t.id||n===t.previousLocalId)}function ae(e,t,n=!1){return function(e,t){const{lastReadOutboxMessageId:n}=f(e,t.chatId)||{};return Object(c.sb)(t)||!n||n0?a(e,n):f(e,n)}function se(e,t){const{forwardInfo:n}=t;if(n)return n.isChannelPost&&n.fromChatId?f(e,n.fromChatId):n.senderUserId?a(e,n.senderUserId):void 0}function fe(e,t,n){const r=f(e,t.chatId);if(!r||r.isRestricted)return{};const u=Object(c.lb)(r.id),d=b(e,t.chatId),o=Object(c.ib)(r),a=Object(c.nb)(r),i=Object(c.jb)(r),s=Object(c.vb)(t),l=Object(c.tb)(t),h=Object(c.db)(t),{content:m}=t,p=(d||Date.now()-1e3*t.date<1728e5)&&!(m.sticker||m.contact||m.poll||m.action||m.audio||m.video&&m.video.isRound)&&!Object(c.qb)(t)&&!t.viaBotId,g=Object(c.e)(r,n)&&!s,y=u||r.isCreator||!i&&!Object(c.yb)(r,"pinMessages")||Object(c.q)(r,"pinMessages");let v=!h&&y,O=!1;const w=G(e,r.id);v&&(O=Boolean(w&&w.includes(t.id)),v=!O);const I=u||l||o||r.isCreator||Object(c.q)(r,"deleteMessages"),j=I&&!s&&(u&&!d||o&&(l||Object(c.q)(r,"deleteMessages"))),C=!h&&p&&(l||i&&(r.isCreator||Object(c.q)(r,"editMessages"))),E=!h&&!s,S=Boolean(t.content.sticker),M=S&&function(e,t){const{stickers:n}=e.stickers.favorite;return n&&n.some(({id:e})=>e===t.id)}(e,t.content.sticker),A=!h&&S&&!M,k=!h&&M,T=!h,N=!h&&(i||a),P=!h;return{noOptions:[g,C,v,O,I,j,E,A,k,T,N,P].every(e=>!e),canReply:g,canEdit:C,canPin:v,canUnpin:O,canDelete:I,canDeleteForAll:j,canForward:E,canFaveSticker:A,canUnfaveSticker:k,canCopy:T,canCopyLink:N,canSelect:P}}function le(e){const{messageIds:t}=e.selectedMessages||{},{chatId:n,threadId:r}=P(e)||{},u=n&&L(e,n);if(!u||!t||!r)return{};const d=t.map(t=>u[t]&&fe(e,u[t],r)).filter(Boolean);return{canDelete:d.every(e=>e.canDelete),canDeleteForAll:d.every(e=>e.canDeleteForAll)}}function be(e,t){const n=e.fileUploads.byMessageLocalId[t.previousLocalId||t.id];return n?n.progress:void 0}function he(e,t,n){if(n===d.MAIN_THREAD_ID){const n=f(e,t);if(!n)return;if(!n.lastReadInboxMessageId)return;return n.lastMessage?Object(c.sb)(n.lastMessage)?n.lastMessage.id:Math.min(n.lastMessage.id,n.lastReadInboxMessageId):n.lastReadInboxMessageId}{const r=J(e,t,n);if(!r)return;return r.lastReadInboxMessageId?Math.min(r.lastReadInboxMessageId,r.lastMessageId||1/0):r.topMessageId}}function me(e,t,n){const r=f(e,t);if(n===d.MAIN_THREAD_ID){if(!r)return}else{const r=J(e,t,n);if(!r||r.lastMessageId===r.lastReadInboxMessageId)return}const u=R(e,t,n),o=x(e,t,n),c=L(e,t);if(!c||!u&&!o)return;const a=he(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(o){const e=a?o.find(e=>e>a&&c[e]&&(!c[e].isOutgoing||c[e].isFromScheduled)):o[0];if(e)return e}}}function pe(e){const{forwardMessages:t}=e;return Boolean(t.isModalShown)}function ge(e,t){const n=Object.values(e.chats.byId).find(e=>Object(c.ob)(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=f(e,Number(n));return u&&Object(c.ob)(u)&&r[u.id].byId[t]}))}function ye(e){const{selectedMessages:t}=e;return Boolean(t)}function ve(e,t){const{messageIds:n}=e.selectedMessages||{};return!!n&&n.includes(t)}function Oe(e,t,n){const r=L(e,t);if(r)return Object.values(r).filter(e=>e.groupedId===n&&e.forwardInfo).map(({forwardInfo:e})=>e.fromMessageId)}function we(e,t,n){const r=L(e,t);if(r)return Object.keys(r).map(Number).filter(e=>r[e].groupedId===n)}function Ie(e,t,n){const{messageIds:r}=e.selectedMessages||{};if(!r)return!1;const u=we(e,t,n);return u&&u.every(e=>r.includes(e))}function je(e){const{messageIds:t}=e.selectedMessages||{};return t?t.length:0}function Ce(e,t){const n=f(e,t);if(!n)return;if(!h(e,n))return;const r=L(e,t),u=_(e,t,d.MAIN_THREAD_ID);if(!r||!u)return;const o=Object(S.g)(u,e=>!r[e].isOutgoing&&Boolean(r[e].keyboardButtons)),c=Object(S.g)(u,e=>Boolean(r[e].shouldHideKeyboardButtons));return o&&c&&c>o?void 0:o?r[o]:void 0}function Ee(e,t,n,r){const{shouldAutoDownloadMediaFromContacts:u,shouldAutoDownloadMediaInPrivateChats:d,shouldAutoDownloadMediaInGroups:o,shouldAutoDownloadMediaInChannels:a}=e.settings.byKey;return Boolean(d&&Object(c.lb)(n.id)||o&&Object(c.kb)(n)||a&&Object(c.jb)(n)||u&&r&&(r.id===e.currentUserId||function(e,t){return e.contactList&&e.contactList.userIds.includes(t.id)}(e,r)))}function Se(e,t){const n=Object(c.P)(t);if(!n)return;const{shouldAutoPlayVideos:r,shouldAutoPlayGifs:u}=e.settings.byKey,d=n.isGif||n.isRound;return r&&!d||u&&d}function Me(e){return e.settings.byKey.shouldLoopStickers}function Ae(e){const{chatId:t,threadId:n}=P(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 ke(e){const{byChatId:t}=e.localMediaSearch,{chatId:n}=P(e)||{},r=e.users.selectedId;return r&&t[r]?r:n}function Te(e){const t=ke(e);if(t)return e.localMediaSearch.byChatId[t]}function Ne(e,t){return e.management.byChatId[t]}function Pe(e){const{chatId:t,threadId:n}=P(e)||{};if(!t||!n)return;if(Object(c.lb)(t))return"user";const r=f(e,t);return r?Object(c.kb)(r)?"group":"channel":void 0}function De(e){const{mediaViewer:t}=e;return Boolean(t.messageId||t.avatarOwnerId)}function Le(e){const{users:t,isChatInfoShown:n}=e,d=function(e){const{pollResults:t}=e;return Boolean(t.messageId)}(e),o=Boolean(!u.g&&Ae(e)),c=function(e){const{chatId:t,threadId:n}=P(e)||{};if(!t||!n)return;const r=e.management.byChatId[t];return r&&r.isActive?r:void 0}(e),a=void 0!==M(e).query,i=void 0!==A(e).query,{chatId:s}=P(e)||{},f=t.selectedId,l=v(e),b=Boolean(f&&l),h=Boolean(s&&l)&&n;return d?r.l.PollResults:o?r.l.Search:c?r.l.Management:a?r.l.StickerSearch:i?r.l.GifSearch:b?r.l.UserInfo:h?r.l.ChatInfo:void 0}function Fe(e){return void 0!==Le(e)}function Be(e){return e.globalSearch.query}function xe(e){return e.payment.messageId}function Re(e){return e.payment.formId}function Ue(e){return e.payment.nativeParams?e.payment.nativeParams.publishableKey:void 0}function _e(e){return e.payment.stripeCredentials}},function(e,t,n){"use strict";n.d(t,"o",(function(){return u})),n.d(t,"f",(function(){return d})),n.d(t,"e",(function(){return o})),n.d(t,"b",(function(){return c})),n.d(t,"j",(function(){return a})),n.d(t,"l",(function(){return i})),n.d(t,"g",(function(){return s})),n.d(t,"m",(function(){return f})),n.d(t,"d",(function(){return l})),n.d(t,"k",(function(){return b})),n.d(t,"i",(function(){return h})),n.d(t,"h",(function(){return m})),n.d(t,"c",(function(){return p})),n.d(t,"a",(function(){return g})),n.d(t,"n",(function(){return y})),n.d(t,"p",(function(){return O}));var r=n(1);const u=function(){const{userAgent:e,platform:t}=window.navigator;let n;return-1!==["Macintosh","MacIntel","MacPPC","Mac68K"].indexOf(t)?n="Mac OS":-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}(),d="Mac OS"===u,o="iOS"===u,c="Android"===u,a=/^((?!chrome|android).)*safari/i.test(navigator.userAgent),i=window.matchMedia("(pointer: coarse)").matches,s=window.innerWidth<=r.eb||window.innerWidth<=r.db&&window.innerHeight<=r.cb,f=navigator.mediaDevices&&"getUserMedia"in navigator.mediaDevices&&(window.AudioContext||window.webkitAudioContext),l=(document.documentElement.style,u&&(d||o)),b="serviceWorker"in navigator,h=b,m=(window,Boolean((new Audio).canPlayType("audio/ogg; codecs=opus"))),p="filter"in(document.createElement("canvas").getContext("2d")||{}),g=window.devicePixelRatio||1,y=!0;let v;function O(){return Boolean(v)}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=>{v=e})},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(...d)=>{u?(clearTimeout(u),u=void 0):n&&e(...d),u=self.setTimeout(()=>{r&&e(...d),u=void 0},t)}}function u(e,t,n=!0){let r,u,d;return(...o)=>{u=!0,d=o,r||(n&&(u=!1,e(...d)),r=self.setInterval(()=>{if(!u)return self.clearInterval(r),void(r=void 0);u=!1,e(...d)},t))}}function d(e){return c(h,e)}function o(e){return c(m,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,"g",(function(){return u})),n.d(t,"i",(function(){return d})),n.d(t,"h",(function(){return o})),n.d(t,"d",(function(){return a})),n.d(t,"c",(function(){return i})),n.d(t,"e",(function(){return s})),n.d(t,"f",(function(){return f})),n.d(t,"b",(function(){return h}));const s=e=>new Promise(t=>{setTimeout(()=>t(),e)});function f(){return new Promise(e=>{h(e)})}let l,b;function h(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 m(e){h(e,!0)}},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(78),u=n.n(r),d=n(1),o=n(27);let c;const a=new Map,i=new Map;function s(e,t=""){return c||(d.p&&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});d.p&&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(o.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,"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(1);let u;!function(e){e[e.Auth=0]="Auth",e[e.Main=1]="Main",e[e.Extra=2]="Extra"}(u||(u={}));const d={},o={};async function c(e,t){if(!d[e]){switch(e){case u.Auth:d[u.Auth]=n.e(5).then(n.bind(null,102));break;case u.Main:r.p&&console.log(">>> START LOAD MAIN BUNDLE"),d[u.Main]=Promise.all([n.e(0),n.e(4)]).then(n.bind(null,101));break;case u.Extra:d[u.Extra]=Promise.all([n.e(0),n.e(3)]).then(n.bind(null,100))}d[e].then(f)}const c=await d[e];return o[e]||(o[e]=c),a(e,t)}function a(e,t){const n=o[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";n.d(t,"a",(function(){return u})),n.d(t,"c",(function(){return d})),n.d(t,"d",(function(){return o})),n.d(t,"b",(function(){return c}));const r=self.caches;let u;async function d(e,t,n){if(r)try{const d=new Request(t),o=await r.open(e),c=await o.match(d);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 o(e,t,n){if(r)try{const u="string"==typeof n||n instanceof Blob?n:JSON.stringify(n),d=new Request(t),o=new Response(u),c=await r.open(e);return await c.put(d,o)}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";n.d(t,"d",(function(){return d})),n.d(t,"a",(function(){return o})),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(9);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 d(e){const t=e.split(","),n=t[0].match(/:(.*?);/)[1],r=atob(t[1]);let u=r.length;const d=new Uint8Array(u);for(;u--;)d[u]=r.charCodeAt(u);return new Blob([d],{type:n})}function o(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.e)(2e3),new Promise((e,n)=>{t.onseeked=()=>{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";n.d(t,"a",(function(){return v})),n.d(t,"b",(function(){return j})),n.d(t,"c",(function(){return C}));var r=n(1),u=n(12),d=n(10);var o=n(3),c=n.p+"en-extra.e73049da90714ecdae3233e8ffa74d39.json",a=n.p+"es-extra.b80575cdf988e1a7e3a915abe97f63b4.json",i=n.p+"it-extra.78e5568451a888818c7e2209e05a9602.json",s=n.p+"pl-extra.38fd67a6c26e58f5c912568332c7c074.json",f=n.p+"ru-extra.5761b75bfbe92bb46eb8bba9acbdbb4c.json",l=n(49),b=n(2);const h={en:c,es:a,it:i,pl:s,ru:f},m=["value","zeroValue","oneValue","twoValue","fewValue","manyValue","otherValue"],p={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},g=new Map;let y;const{addCallback:v,removeCallback:O,runCallbacks:w}=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 I;const j=(e,t,n)=>{if(void 0!==t){const r=g.get(`${e}_${t}_${n}`);if(r)return r}if(!y)return e;const r=y[e];if(!r)return e;const u=r["number"==typeof t?function(e){const t=I&&p[I]?p[I](e):0;return m[t]}(t):"value"];if(!u||!u.trim()){const t=e.split(".");return t[t.length-1]}if(void 0!==t){const r=function(e,t){return e.replace(/%\d?\$?[sdf@]/,String(t))}(u,"i"===n?Object(l.a)(t):t);return g.set(`${e}_${t}_${n}`,r),r}return u};async function C(e,t){if(y&&e===I)return void(t&&t());const n=await async function(e){const t=await u.c(r.G,e,u.a.Json);if(t)return t;const n=await Object(d.a)("fetchLangPack",{sourceLangPacks:r.H,langCode:e});if(n)return await u.d(r.G,e,n.langPack),n.langPack;return}(e);if(!n)return;if(h[e])try{const t=await fetch(h[e]),r=await t.json(),u=Object(o.i)(r,(e,t)=>({key:t,value:e}));Object.assign(n,u)}catch(e){r.p&&console.error(e)}g.clear(),I=e,y=n,document.documentElement.lang=e;const{languages:c}=Object(b.e)().settings.byKey,a=c?c.find(t=>t.langCode===e):void 0;j.isRtl=Boolean(a&&a.rtl),t&&t(),w(y)}},function(e,t,n){"use strict";n.d(t,"b",(function(){return d}));const r=/\uFE0F/g,u=String.fromCharCode(8205);function d(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(20);n(91);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(11),d=n(25);t.a=(e,t,n=!1,o=!1)=>{const c=Object(u.c)(e,t),a=Object(d.a)();return o&&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";n.d(t,"d",(function(){return o})),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 d}));const r={},u=/(\d{1,3})(\d{1,3})?(\d{1,3})?(\d{1,3})?(\d{1,3})?/;var d="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 Caledonia\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 o(e){return d.find(t=>t.id===e)}function c(e){let t=e.replace(/[^\d+]+/g,"");t.startsWith("+")||(t="+"+t);const n=d.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,d,o)=>{const c=t&&"GB"===t.id?" ":"-";let a="";return n&&(a=""+n),r&&(a+=" "+r),u&&(a+=`${c}${u}`),d&&(a+=`${c}${d}`),o&&(a+=`${c}${o}`),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";let r,u,d,o,c,a,i,s,f,l,b,h;n.d(t,"e",(function(){return r})),n.d(t,"b",(function(){return u})),n.d(t,"m",(function(){return d})),n.d(t,"d",(function(){return o})),n.d(t,"c",(function(){return c})),n.d(t,"l",(function(){return a})),n.d(t,"h",(function(){return i})),n.d(t,"a",(function(){return s})),n.d(t,"j",(function(){return f})),n.d(t,"f",(function(){return l})),n.d(t,"k",(function(){return b})),n.d(t,"i",(function(){return h})),n.d(t,"n",(function(){return m})),n.d(t,"g",(function(){return p})),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"}(d||(d={})),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"}(o||(o={})),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"}(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.Profile=0]="Profile",e[e.SharedMedia=1]="SharedMedia",e[e.MemberList=2]="MemberList"}(b||(b={})),function(e){e[e.ShippingInfo=0]="ShippingInfo",e[e.Shipping=1]="Shipping",e[e.PaymentInfo=2]="PaymentInfo",e[e.Checkout=3]="Checkout"}(h||(h={}));const m="UPLOADING_WALLPAPER_SLUG";let p;!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"}(p||(p={}))},function(e,t,n){"use strict";var r=n(0),u=n(8);n(87);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 a}));var r=n(1),u=n(9);window.addEventListener("error",c),window.addEventListener("unhandledrejection",c);const d=Date.now();let o=!1;function c(e){e.preventDefault(),a(e instanceof ErrorEvent?e.error:e.reason)}Object(u.g)(window.alert,1e3);function a(e){if(console.error(e),!o)return Date.now()-d<=5e3&&localStorage.getItem(r.B)?(localStorage.removeItem(r.B),o=!0,void window.location.reload()):void 0}},function(e,t,n){"use strict";n.d(t,"a",(function(){return b}));var r=n(0),u=n(15),d=n(1),o=n(7),c=n(64),a=n(8),i=n(74),s=n(56);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 d=e,o=n.highlight,d.reduce((e,t)=>{if("string"!=typeof t||!o)return[...e,t];const n=t.toLowerCase(),u=n.indexOf(o.toLowerCase()),d=n[u+o.length];if(u<0||d&&d.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+o.length))),c.push(t.substring(u+o.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)||[],...t.match(g)||[]];if(!n.length)return[...e,t];const u=[];let d=n.shift(),o=0;for(;d;){const e=t.indexOf(d,o);u.push(t.substring(o,e)),d.startsWith("@")?u.push(r.a.createElement(i.a,{username:d},d)):(d.endsWith("?")&&(d=d.slice(0,d.length-1)),u.push(r.a.createElement(s.a,{text:d,url:d}))),o=e+d.length,d=n.shift()}return u.push(t.substring(o)),[...e,...u]},[])}(e);case"simple_markdown":return y(e,"jsx");case"simple_markdown_html":return y(e,"html")}var d,o;return e},[e])}function h(e,t,n){return e.reduce((e,d)=>{if("string"!=typeof d)return[...e,d];const i=d.split(u.a),s=d.match(u.a)||[];return e.push(i[0]),s.reduce((e,d,s)=>{const f=Object(c.a)(Object(u.b)(d)),l=Object(a.a)("emoji","small"===t&&"emoji-small");"jsx"===n&&e.push(o.d?r.a.createElement("span",{className:"font-emoji"},d):r.a.createElement("img",{className:l,src:`./img-apple-${"big"===t?"160":"64"}/${f}.png`,alt:d})),"html"===n&&e.push(o.d?d:`${d}`);const b=2*s+2;return i[b]&&e.push(i[b]),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,d)=>{const o=n.trimLeft(),c=n.length-o.length;return e.push(String.fromCharCode(160).repeat(c)+o),u!==d.length-1&&e.push("jsx"===t?r.a.createElement("br",null):"
"),e},[])],[])}const p=new RegExp(d.hb,"ig"),g=/@[\w\d_-]+/gi;function y(e,t){return e.reduce((e,n)=>{if("string"!=typeof n)return[...e,n];const u=n.split(l),d=n.match(l)||[];return e.push(u[0]),d.reduce((e,n,d)=>{"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 o=2*d+2;return u[o]&&e.push(u[o]),e},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;ue[n]!==t[n])}n.d(t,"a",(function(){return r})),n.d(t,"b",(function(){return u}))},function(e,t,n){"use strict";var r=n(14),u=n(25),d=n(39);t.a=()=>{const e=Object(u.a)();return Object(d.a)(()=>r.a(e),[e]),r.b}},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(8);n(85);t.a=({children:e,className:t,isRtl:n,onClick:d})=>{const o=Object(r.m)(e=>{e.preventDefault(),d(e)},[d]);return r.a.createElement("a",{href:"#",className:Object(u.a)("Link",t),dir:n?"rtl":"auto",onClick:d?o: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 g})),n.d(t,"b",(function(){return y})),n.d(t,"a",(function(){return v}));var r=n(10),u=n(66),d=n(1),o=n(2),c=n(4),a=n(14),i=n(36),s=n(6),f=n(7);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?(d.p&&console.warn("[PUSH] The user has blocked push notifications."),!1):"PushManager"in window||(d.p&&console.warn("[PUSH] Push messaging isn't supported."),!1):(d.p&&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(o.e)(),n=Object(o.d)();if(e)try{const t=l(e);return await Object(r.a)("unregisterDevice",t),await e.unsubscribe(),void n.deleteDeviceToken()}catch(e){d.p&&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)}async function g(){if(async function(){const[e]=await Promise.all([Object(r.a)("fetchNotificationSettings"),Object(r.a)("fetchNotificationExceptions")]);e&&Object(o.g)(Object(i.v)(Object(o.e)(),e))}(),!b())return void await h();const e=await navigator.serviceWorker.ready;let t=await e.pushManager.getSubscription();if(function(e){const t=Object(o.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);d.p&&console.log("[PUSH] Received push subscription: ",n),await Object(r.a)("registerDevice",n),Object(o.d)().setDeviceToken(n)}catch(e){"denied"===Notification.permission?d.p&&console.warn("[PUSH] The user has blocked push notifications."):d.p&&(console.log("[PUSH] Unable to subscribe to push.",e),e.code===DOMException.ABORT_ERR&&await h())}}}function y({chat:e,message:t,isActiveChat:n}){if(!("Notification"in window?"denied"!==Notification.permission||(d.p&&console.warn("[PUSH] The user has blocked push notifications."),0):(d.p&&console.warn("[PUSH] This browser does not support desktop notification"),0)))return;if(!t.id)return;if(!function(e,t){const n=Object(o.e)();if(Object(c.Cb)(e,Object(s.db)(n),Object(s.cb)(n))||e.isNotJoined)return!1;if(t&&document.hasFocus())return!1;switch(e.type){case"chatTypePrivate":case"chatTypeSecret":return Boolean(n.settings.byKey.hasPrivateChatsNotifications);case"chatTypeBasicGroup":case"chatTypeSuperGroup":return Boolean(n.settings.byKey.hasGroupNotifications);case"chatTypeChannel":return Boolean(n.settings.byKey.hasBroadcastNotifications)}return!1}(e,n))return;const{title:r,body:i}=function(e,t){const n=Object(o.e)(),{senderId:r,replyToMessageId:d}=t,i=r?Object(s.Fb)(n,r):void 0,f=Object(c.t)(t),l=f&&d?Object(s.k)(n,e.id,d):void 0,{targetUserId:b,targetChatId:h}=f||{},m=b?Object(s.Fb)(n,b):void 0,p=Object(c.U)(e),g=p?Object(s.Fb)(n,p):void 0;let y;if(Object(c.db)(t)){const n=e&&(Object(c.jb)(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.J)(a.b,e.id,i),r=Object(c.N)(a.b,t);y=n?`${n}: ${r}`:r}return{title:Object(c.l)(a.b,e,g),body:y}}(e,t);if(b())navigator.serviceWorker.controller&&navigator.serviceWorker.controller.postMessage({type:"newMessageNotification",payload:{title:r,body:i,chatId:e.id,messageId:t.id}});else{const n=Object(o.d)(),u={body:i,icon:"icon-192x192.png",badge:"icon-192x192.png",tag:t.id.toString()};"vibrate"in navigator&&(u.vibrate=[200,100,200]);const d=new Notification(r,u);d.onclick=()=>{d.close(),n.focusMessage({chatId:e.id,messageId:t.id}),window.focus&&window.focus()}}}function v(){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(1),u=n(35),d=n(3);const o=[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){if(t.id===r.nb)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:n}=t.status;if(!n)return e("LastSeen.Offline");const r=new Date,d=new Date(1e3*n);if(d>=r)return e("LastSeen.JustNow");const o=new Date(r.getTime()-d.getTime());if(o.getTime()/1e3<60)return e("LastSeen.JustNow");if(o.getTime()/1e3<3600){return e("LastSeen.MinutesAgo",Math.floor(o.getTime()/1e3/60))}const c=new Date;if(c.setHours(0,0,0,0),d>c){if(o.getTime()/1e3<21600){return e("LastSeen.HoursAgo",Math.floor(o.getTime()/1e3/60/60))}return e("LastSeen.TodayAt",Object(u.h)(d))}const a=new Date;return a.setDate(r.getDate()-1),c.setHours(0,0,0,0),d>a?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.nb&&("userStatusOnline"===n.type&&"userTypeBot"!==u))}function f(e){return!(!e.status||"userTypeBot"===e.type||e.id===r.nb)&&("userTypeDeleted"===e.type||"userTypeUnknown"===e.type)}function l(e){return"userTypeBot"===e.type}function b(e,t,n){return Object(d.k)(e,e=>{const r=Date.now()/1e3;if(n&&n.includes(e))return r+172800-(n.length-n.indexOf(e));const u=t[e];if(!u||!u.status)return 0;if("userStatusOnline"===u.status.type)return u.status.expires;if("userStatusOffline"===u.status.type&&u.status.wasOnline)return u.status.wasOnline;switch(u.status.type){case"userStatusRecently":return r-86400;case"userStatusLastWeek":return r-604800;case"userStatusLastMonth":return r-18144e3;default:return 0}},"desc")}function h(e){const t=e?Math.abs(e.id)%7:0;return o[t]}},function(e,t,n){"use strict";n.d(t,"w",(function(){return c})),n.d(t,"v",(function(){return a})),n.d(t,"t",(function(){return i})),n.d(t,"y",(function(){return s})),n.d(t,"u",(function(){return f})),n.d(t,"z",(function(){return l})),n.d(t,"j",(function(){return b})),n.d(t,"p",(function(){return h})),n.d(t,"i",(function(){return m})),n.d(t,"e",(function(){return p})),n.d(t,"f",(function(){return g})),n.d(t,"d",(function(){return y})),n.d(t,"x",(function(){return v})),n.d(t,"r",(function(){return O})),n.d(t,"m",(function(){return w})),n.d(t,"A",(function(){return I})),n.d(t,"c",(function(){return j})),n.d(t,"a",(function(){return C})),n.d(t,"o",(function(){return E})),n.d(t,"h",(function(){return S})),n.d(t,"g",(function(){return M})),n.d(t,"s",(function(){return A})),n.d(t,"D",(function(){return k})),n.d(t,"b",(function(){return T})),n.d(t,"C",(function(){return N})),n.d(t,"B",(function(){return P})),n.d(t,"l",(function(){return D})),n.d(t,"k",(function(){return L})),n.d(t,"q",(function(){return F})),n.d(t,"n",(function(){return B})),n.d(t,"E",(function(){return x}));var r=n(5),u=n(1),d=n(3),o=n(29);function c(e){return e>0}function a(e){return i(e)||s(e)}function i(e){return"chatTypeBasicGroup"===e.type}function s(e){return"chatTypeSuperGroup"===e.type}function f(e){return"chatTypeChannel"===e.type}function l(e){return"chatTypePrivate"===e.type||"chatTypeBasicGroup"===e.type}function b(e){switch(e.type){case"chatTypePrivate":return"PrivateChat";case"chatTypeBasicGroup":case"chatTypeSuperGroup":return"AccDescrGroup";case"chatTypeChannel":return"AccDescrChannel";default:return"Chat"}}function h(e){if("chatTypePrivate"===e.type||"chatTypeSecret"===e.type)return e.id}function m(e,t,n,r=!1){return r||n&&t.id===n.id&&n.isSelf?e("SavedMessages"):t.title||e("HiddenName")}function p(e){if(e.fullInfo)return e.fullInfo.about}function g(e){const{username:t}=e,{inviteLink:n}=e.fullInfo||{};return n&&n.length?n:t?"t.me/"+t:""}function y(e,t="normal"){if(e.avatarHash)switch(t){case"big":return`profile${e.id}?${e.avatarHash}`;default:return`avatar${e.id}?${e.avatarHash}`}}function v(e){return!e.lastMessage}function O(e){return Boolean(e.adminRights)}function w(e,t){return!!e.adminRights&&e.adminRights[t]}function I(e,t){return Boolean(e.currentUserBannedRights&&e.currentUserBannedRights[t]||e.defaultBannedRights&&e.defaultBannedRights[t])}function j(e,t){return t!==r.MAIN_THREAD_ID||!(e.isRestricted||e.migratedTo||e.isNotJoined)&&(!!e.isCreator||(!!c(e.id)||(f(e)?w(e,"postMessages"):O(e)||!I(e,"sendMessages"))))}function C(e,t=!1){if(!e)return{canAttachMedia:!1,canAttachPolls:!1,canSendStickers:!1,canSendGifs:!1,canAttachEmbedLinks:!1};const n=O(e);return{canAttachMedia:n||!I(e,"sendMedia"),canAttachPolls:(n||!I(e,"sendPolls"))&&(!c(e.id)||t),canSendStickers:n||!I(e,"sendStickers"),canSendGifs:n||!I(e,"sendGifs"),canAttachEmbedLinks:n||!I(e,"embedLinks")}}function E(e){return e.currentUserBannedRights&&e.currentUserBannedRights.sendMessages?"You are not allowed to send messages in this chat.":e.defaultBannedRights&&e.defaultBannedRights.sendMessages?"Sending messages is not allowed in this chat.":void 0}function S(e){if(e&&e.fullInfo)return e.fullInfo.slowMode}function M(e){return Math.max(e.joinDate||0,e.lastMessage?e.lastMessage.date:0)}function A(e){return e.folderId===u.h}function k(e,t,n){return!(n&&n[e.id]&&!n[e.id].isMuted)&&(e.isMuted||c(e.id)&&!t.hasPrivateChatsNotifications||f(e)&&!t.hasBroadcastNotifications||a(e)&&!t.hasGroupNotifications)}function T(e){return i(e)||(s(e)||f(e))&&e.isCreator}function N(e,t,n,r,u,d){const o=n.excludedChatIds?new Set(n.excludedChatIds):void 0,i=n.excludedChatIds?new Set(n.includedChatIds):void 0,s=n.excludedChatIds?new Set(n.pinnedChatIds):void 0;return[(d||Object.keys(e).map(Number)).filter(d=>function(e,t,n,r,u,d,o,i){if(d&&d.has(e.id))return!1;if(o&&o.has(e.id))return!0;if(i&&i.has(e.id))return!0;if(A(e)&&t.excludeArchived)return!1;if(t.excludeMuted&&k(e,r,u))return!1;if(!e.unreadCount&&!e.unreadMentionsCount&&!e.hasUnreadMark&&t.excludeRead)return!1;if(c(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(a(e))return!!t.groups;if(f(e))return!!t.channels}return!1}(e[d],n,t,r,u,o,i,s)),n.pinnedChatIds]}function P(e,t,n,r="all"){function u(e){if(!e||!e.lastMessage||e.migratedTo)return!1;switch(r){case"all":if(A(e))return!1;break;case"archived":if(!A(e))return!1}return!e.isRestricted&&!e.isNotJoined}const o=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(d.k)(n?o.filter(e=>!n.includes(e.id)):o,M,"desc")}}function D(e,t,n,r,u,d){const[o]=N(e,t,n,u,d,r),c=o.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||!k(e,u,d)&&(e.unreadCount||e.hasUnreadMark))}}function L(e,t,n,r,u,d,o){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,d){const[o,c]=N(e,t,n,u,d,r),{pinnedChats:a,otherChats:i}=P(e,o,c,"folder");return a.length+i.length}(t,n,r,u,d,o))}return g.bots?e("FilterBots"):g.groups?e("FilterGroups"):g.channels?e("FilterChannels"):g.contacts?e("FilterContacts"):g.nonContacts?e("FilterNonContacts"):void 0}function F(e){return!!e&&e.id<0}function B(e,t,n){if(n&&!c(t))return n.isSelf?e("FromYou"):Object(o.b)(n)}function x(e,t,n=!1,r){return Object(d.k)(e,e=>{const u=t[e];if(!u)return 0;let d=0;return u.lastMessage&&(d+=u.lastMessage.date),n&&u.isVerified&&(d+=3e9),r&&r.includes(e)&&(d+=Date.now()+(r.length-r.indexOf(e))),d},"desc")}},function(e,t,n){"use strict";var r=n(0),u=n(8),d=n(20),o=n(43);n(89);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:w,href:I,download:j,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 I?r.a.createElement("a",{ref:k,className:P,href:I,title:w,download:j,tabIndex:M,dir:A?"rtl":void 0},l,!C&&E&&r.a.createElement(o.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":w,title:w,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(d.a,{color:v?"blue":"white"})):l,!C&&E&&r.a.createElement(o.a,null))}},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(1);const u=new Set(["scroll","mouseenter","mouseleave"]),d={},o=new Map,c={};function a(e,t,n){const r=s(t,e);f(r,e)?function(e,t,n){c[e]||(c[e]=0,document.addEventListener(e,h));(function(e){d[e]||(d[e]=new Map);return d[e]})(e).set(t,n),function(e){const t=o.get(e);if(t)return t;const n=new Set;return o.set(e,n),n}(t).add(e),c[e]++}(r,e,n):e.addEventListener(r,n)}function i(e,t,n){const r=s(t,e);f(r,e)?l(r,e):e.removeEventListener(r,n)}function s(e,t){const n=e.replace(/^on/,"").toLowerCase();return"change"===n&&"SELECT"!==t.tagName?"input":"doubleclick"===n?"dblclick":"focus"===n?"focusin":"blur"===n?"focusout":n}function f(e,t){return!u.has(e)&&"VIDEO"!==t.tagName&&"IFRAME"!==t.tagName}function l(e,t){c[e]--,c[e]||document.removeEventListener(e,h),d[e].delete(t),o.get(t).delete(e)}function b(e){const t=o.get(e);t&&(t.forEach(t=>l(t,e)),o.delete(e))}function h(e){const t=d[e.type];if(t){let n=!1,r=e.target;const u=()=>{n=!0},d=()=>{e.preventDefault()},o=new Proxy(e,{get:(e,t)=>"currentTarget"===t?r:"stopPropagation"===t||"stopImmediatePropagation"===t?u:"preventDefault"===t?d:Reflect.get(e,t)});for(;r&&r!==document.body;){const e=t.get(r);if(e&&(e(o),n))return;r=r.parentNode}}}r.p&&document.addEventListener("dblclick",()=>{console.log("DELEGATED EVENTS",{delegationRegistry:d,delegatedEventsByElement:o,documentEventCounters: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(8);t.a=(e=!1,t,n=!1,d="fast",o=!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},o?0:350)));const l=Boolean(i.current),b=e||l;return{shouldRender:b,transitionClassNames:Object(u.a)(d&&"opacity-transition",d,(s&&!o||o&&e)&&"open",b&&"shown",l&&"closing")}}},function(e,t,n){"use strict";n.d(t,"j",(function(){return o})),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 w})),n.d(t,"m",(function(){return I}));const r=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],u=["January","February","March","April","May","June","July","August","September","October","November","December"],d=u.map(e=>e.toLowerCase());function o(e){const t=new Date(e);return t.setHours(0,0,0,0),t}function c(e){return o(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=o(new Date);if(n>=u)return s(n);const d=new Date(u);if(d.setDate(u.getDate()-7),n>=d)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 d="number"==typeof t?new Date(t):t,c=o(new Date);if(!u){if(i(d)===i(c))return(n?j:C)(e("Weekday.Today"));const t=new Date(c);if(t.setDate(c.getDate()-1),i(d)===i(t))return(n?j:C)(e("Weekday.Yesterday"));const u=new Date(c),o=new Date(c);if(u.setDate(c.getDate()-7),o.setDate(c.getDate()+7),d>=u&&d<=o){const t=r[d.getDay()];return n?j(e("Weekday.Short"+t)):C(e("Weekday."+t))}}const a=d.getFullYear()!==c.getFullYear(),s=e(n?a?"formatDateScheduleYear":"formatDateSchedule":a?"chatFullDate":"chatDate")||"d MMMM yyyy";return(n?j:C)(m(e,d,s))}function m(e,t,n){const r=t.getDate(),d=t.getMonth();return n.replace("LLLL",e(u[d])).replace("MMMM",e("Month.Gen"+u[d])).replace("MMM",e("Month.Short"+u[d])).replace("MM",String(d+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 d=(e=Math.floor(e/60))%60;return d>0&&t.push(String(d).padStart(2,"0")),t.push(String(u).padStart(d>0?2:1,"0")),t.push(String(r).padStart(2,"0")),`${t.join(":")},${String(n).padStart(2,"0")}`}function v(e){return e.toLocaleString("en-US",{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 w(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(" "),o=t?u[0]:u[1],c=(t?u[1]:u[0]).toLowerCase(),a=d.findIndex(e=>e.startsWith(c));return-1!==a&&O(Number(o),a)?`${String(a+1).padStart(2,"0")}-${String(o).padStart(2,"0")}`:void 0}function I(e){return e+86400}function j(e){return`${e[0].toLowerCase()}${e.slice(1)}`}function C(e){return`${e[0].toUpperCase()}${e.slice(1)}`}},function(e,t,n){"use strict";n.d(t,"r",(function(){return d})),n.d(t,"I",(function(){return o})),n.d(t,"s",(function(){return c})),n.d(t,"H",(function(){return a})),n.d(t,"M",(function(){return i})),n.d(t,"c",(function(){return s})),n.d(t,"K",(function(){return f})),n.d(t,"J",(function(){return l})),n.d(t,"N",(function(){return m})),n.d(t,"x",(function(){return y})),n.d(t,"d",(function(){return v})),n.d(t,"b",(function(){return O})),n.d(t,"L",(function(){return w})),n.d(t,"eb",(function(){return I})),n.d(t,"j",(function(){return j})),n.d(t,"k",(function(){return C})),n.d(t,"V",(function(){return E})),n.d(t,"db",(function(){return S})),n.d(t,"g",(function(){return A})),n.d(t,"z",(function(){return k})),n.d(t,"kb",(function(){return T})),n.d(t,"lb",(function(){return N})),n.d(t,"u",(function(){return P})),n.d(t,"P",(function(){return D})),n.d(t,"O",(function(){return L})),n.d(t,"m",(function(){return F})),n.d(t,"G",(function(){return B})),n.d(t,"n",(function(){return x})),n.d(t,"ib",(function(){return R})),n.d(t,"hb",(function(){return U})),n.d(t,"Q",(function(){return _})),n.d(t,"q",(function(){return G})),n.d(t,"jb",(function(){return $})),n.d(t,"o",(function(){return W})),n.d(t,"y",(function(){return H})),n.d(t,"nb",(function(){return z})),n.d(t,"ob",(function(){return V})),n.d(t,"f",(function(){return q})),n.d(t,"fb",(function(){return J})),n.d(t,"l",(function(){return Y})),n.d(t,"R",(function(){return Z})),n.d(t,"S",(function(){return X})),n.d(t,"U",(function(){return ee})),n.d(t,"T",(function(){return te})),n.d(t,"Y",(function(){return ue})),n.d(t,"t",(function(){return de})),n.d(t,"Z",(function(){return oe})),n.d(t,"X",(function(){return ae})),n.d(t,"W",(function(){return ie})),n.d(t,"bb",(function(){return fe})),n.d(t,"ab",(function(){return le})),n.d(t,"v",(function(){return be})),n.d(t,"w",(function(){return he})),n.d(t,"e",(function(){return me})),n.d(t,"cb",(function(){return pe})),n.d(t,"a",(function(){return ge})),n.d(t,"p",(function(){return ye})),n.d(t,"mb",(function(){return ve})),n.d(t,"gb",(function(){return Oe})),n.d(t,"E",(function(){return we})),n.d(t,"C",(function(){return Ie})),n.d(t,"A",(function(){return je})),n.d(t,"F",(function(){return Ce})),n.d(t,"B",(function(){return Ee})),n.d(t,"D",(function(){return Se})),n.d(t,"h",(function(){return Me})),n.d(t,"i",(function(){return Ae}));var r=n(1),u=n(3);function d(e,t,n){return{...e,chats:{...e.chats,listIds:{...e.chats.listIds,[t]:n}}}}function o(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:d(e,t,[...r||[],...u])}function c(e,t){return{...e,chats:{...e.chats,byId:t}}}function a(e,t,n,r){const{byId:d}=e.chats,o=d[t],a=n.isMin&&o&&!o.isMin,i={...o,...a?Object(u.j)(n,["isMin","accessHash"]):n,...r&&{photos:[r,...o.photos||[]]}};return i.id&&i.type?c(e,{...d,[t]:i}):e}function i(e,t){return Object.keys(t).forEach(n=>{e=a(e,Number(n),t[Number(n)])}),e}function s(e,t){const{byId:n}=e.chats;return Object.keys(t).map(Number).forEach(r=>{(!n[r]||n[r].isMin&&!t[r].isMin)&&(e=a(e,r,t[r]))}),e}function f(e,t,n){const u=n===r.h?"archived":"active";let d=e.chats.listIds;return Object.keys(d).forEach(e=>{const n=d[e]||[];e!==u||n.includes(t)?e!==u&&n.includes(t)&&(d={...d,[e]:n.filter(e=>e!==t)}):d={...d,[e]:[...n,t]}}),e=a(e={...e,chats:{...e.chats,listIds:d}},t,{folderId:n||void 0})}function l(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 b=n(5),h=n(6);function m(e,t,n=b.MAIN_THREAD_ID,r="thread"){return{...e,messages:{...e.messages,messageLists:t?[{chatId:t,threadId:n,type:r}]:void 0}}}function p(e,t,n){return g(e,t,{byId:n})}function g(e,t,n){const r=e.messages.byChatId[t]||{byId:{},threadsById:{}};return{...e,messages:{...e.messages,byChatId:{...e.messages.byChatId,[t]:{...r,...n}}}}}function y(e,t,n,r,u){return function(e,t,n,r){const u=e.messages.byChatId[t];return g(e,t,{threadsById:{...u&&u.threadsById,[n]:{...u&&u.threadsById[n],...r}}})}(e,t,n,{[r]:u})}function v(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=O(e,t,n[t])}),e}function O(e,t,n){const r=Object(h.m)(e,t);return r&&Object.keys(n).every(e=>Boolean(r[Number(e)]))?e:p(e,t,{...n,...r})}function w(e,t,n,r){const u=Object(h.m)(e,t)||{},d={...u[n],...r};return d.id?p(e,t,{...u,[n]:d}):e}function I(e,t,n,r){const u=Object(h.pb)(e,t)||{},d={...u[n],...r};return d.id?P(e,t,{...u,[n]:d},void 0):e}function j(e,t,n){const r=Object(h.m)(e,t);if(!r)return e;const d=Object(u.j)(r,n),o=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=>{let u=Object(h.X)(e,t,r),d=Object(h.fb)(e,t,r),o=Object(h.Gb)(e,t,r),c=Object(h.ib)(e,t);n.forEach(e=>{u&&u.includes(e)&&(u=u.filter(t=>t!==e)),d&&d.includes(e)&&(d=d.filter(t=>t!==e)),o&&o.includes(e)&&(o=o.filter(t=>t!==e)),c&&c.includes(e)&&(c=c.filter(t=>t!==e))}),e=y(e,t,r,"listedIds",u),e=y(e,t,r,"outlyingIds",d),e=y(e,t,r,"viewportIds",o),e=y(e,t,r,"pinnedIds",c)}),o.length){const n=Object(h.y)(e),r=n&&n.chatId===t&&"thread"===n.type,u=n&&n.threadId;o.forEach(n=>{const{fromChatId:d,fromMessageId:o}=n.forwardInfo,c=Object(h.k)(e,d,o);r&&u===o&&(e=m(e,t)),c&&(e=w(e,d,o,{threadInfo:void 0}))})}return e=p(e,t,d)}function C(e,t,n){const r=Object(h.pb)(e,t);if(!r)return e;const d=Object(u.j)(r,n);let o=Object(h.nb)(e,t);return o&&(n.forEach(e=>{o.includes(e)&&(o=o.filter(t=>t!==e))}),e=y(e,t,b.MAIN_THREAD_ID,"scheduledIds",o)),e=P(e,t,d,void 0)}function E(e,t,n,r){const u=Object(h.X)(e,t,n),d=u&&u.length?r.filter(e=>!u.includes(e)):r;return u&&!d.length?e:y(e,t,n,"listedIds",M([...u||[],...d]))}function S(e,t,n,r){const u=Object(h.fb)(e,t,n),d=u&&u.length?r.filter(e=>!u.includes(e)):r;return u&&!d.length?e:y(e,t,n,"outlyingIds",M([...u||[],...d]))}function M(e){return e.sort((e,t)=>e-t)}function A(e,t,n,u){const d=Object(h.Gb)(e,t,n)||[];if(d.includes(u))return e;return y(e,t,n,"viewportIds",M([...d.length{e=T(e,t.chatId,t.threadId,t)}),e}function P(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 D(e,t,n,r=!1){return{...e,focusedMessage:{...e.focusedMessage,chatId:t,messageId:n,noHighlight:r}}}function L(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,d,o,c,a=!1){const{selectedMessages:i}=e;o&&(c=Object(h.Z)(e,t,o));const s=c||[d];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 o=Object(h.x)(e,t,n,r),c=o.indexOf(f[f.length-1]),a=o.indexOf(d),i=Math.min(c,a),s=Math.max(c,a),b=o.slice(i,s+1);l=Object(u.o)([...f,...b])}else l=[...f,...b];return l.length?{...e,selectedMessages:{...i,messageIds:l}}:x(e)}function x(e){return{...e,selectedMessages:void 0}}function R(e,t,n,r,d){const o=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)(o,"id")},[t]:{...e.stickers[t],hash:n,..."search"===t?{resultIds:d}:{setIds:r.map(({id:e})=>e)}}}}}function U(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 d;if(t||!u)d=n;else{const e=new Set(u.map(e=>e.id));d=[...u,...n.filter(t=>!e.has(t.id))]}return{...e,gifs:{...e.gifs,search:{...e.gifs.search,offset:r,results:d}}}}function G(e,t){return{...e,animatedEmojis:t}}function $(e,t,n,r){const d=[...Object(h.xb)(e,t),...n||[]],o=Object(u.o)(d.map(({id:e})=>e)),c=Object(u.c)(d,"id"),a=o.map(e=>c[e]);return{...e,stickers:{...e.stickers,forEmoji:{emoji:t,stickers:a,hash:r}}}}function W(e){const{emoji:t,stickers:n,hash:r}=e.stickers.forEmoji||{};return t?$(e,t,n,r):e}var K=n(50);function H(e,t){return{...e,users:{...e.users,byId:t}}}function z(e,t,n){const{byId:r}=e.users,{hash:d,userIds:o}=e.contactList||{},c=r[t],a=n.isMin&&c&&!c.isMin,i={...c,...a?Object(u.j)(n,["isMin","accessHash"]):n};return i.id&&i.type?(i.isContact&&o&&!o.includes(t)&&(e={...e,contactList:{hash:d||0,userIds:[t,...o]}}),H(e,{...r,[t]:i})):e}function V(e,t){return Object.keys(t).map(Number).forEach(n=>{e=z(e,n,t[n])}),e}function q(e,t){const{byId:n}=e.users;return Object.keys(t).map(Number).forEach(r=>{(!n[r]||n[r].isMin&&!t[r].isMin)&&(e=z(e,r,t[r]))}),e}function J(e,t){return e.users.selectedId===t?e:{...e,users:{...e.users,selectedId:t}}}function Y(e,t){const{byId:n}=e.users,{hash:r,userIds:u}=e.contactList||{};return delete n[t],H(e={...e,contactList:{hash:r||0,userIds:u?u.filter(e=>e!==t):K.a}},n)}const Q=e=>`${e.chatId}_${e.id}`;function Z(e,t){return{...e,globalSearch:{...e.globalSearch,...t}}}function X(e,t){return Z(e,{currentContent:t})}function ee(e,t,n,r,d){const{resultsByType:o}=e.globalSearch||{},c=t.reduce((e,t)=>(e[Q(t)]=t,e),{}),a=o&&o[r]?o[r].foundIds:void 0;if(void 0!==a&&Object.keys(c).every(e=>a.includes(Q(c[e]))))return te(e,{messages:!1});const i=a||[],s=t.map(e=>Q(e)),f=Array.prototype.concat(i,s),l=Object(u.a)(i,f)?i:f;return Z(e=te(e,{messages:!1}),{resultsByType:{...(e.globalSearch||{}).resultsByType,[r]:{totalCount:n,nextOffsetId:d,foundIds:l}}})}function te(e,t){return Z(e,{fetchingStatus:{...e.globalSearch.fetchingStatus,...t}})}var ne=n(4);function re(e,t,n){return{...e,localTextSearch:{byChatThreadKey:{...e.localTextSearch.byChatThreadKey,[t]:n}}}}function ue(e,t,n,r,u){const d=Object(ne.a)(t,n);return re(e,d,{...e.localTextSearch.byChatThreadKey[d],isActive:r,query:u})}function de(e,t,n,r,u,d){const o=Object(ne.a)(t,n);return re(e,o,{...e.localTextSearch.byChatThreadKey[o],results:{foundIds:r,totalCount:u,nextOffsetId:d}})}function oe(e,t,n,r,d,o){const c=Object(ne.a)(t,n),{results:a}=e.localTextSearch.byChatThreadKey[c]||{},i=a&&a.foundIds||[],s=se(Object(u.o)(Array.prototype.concat(i,r)));return de(e,t,n,Object(u.a)(i,s)?i:s,d,o)}function ce(e,t,n){return{...e,localMediaSearch:{byChatId:{...e.localMediaSearch.byChatId,[t]:n}}}}function ae(e,t,n){return ce(e,t,{...e.localMediaSearch.byChatId[t],currentType:n})}function ie(e,t,n,r,d,o){const{resultsByType:c}=e.localMediaSearch.byChatId[t]||{},a=c&&c[n]?c[n].foundIds:[],i=se(Object(u.o)(Array.prototype.concat(a,r)));return function(e,t,n,r,u,d){return ce(e,t,{...e.localMediaSearch.byChatId[t],resultsByType:{...(e.localMediaSearch.byChatId[t]||{}).resultsByType,[n]:{foundIds:r,totalCount:u,nextOffsetId:d}}})}(e,t,n,Object(u.a)(a,i)?a:i,d,o)}function se(e){return e.sort((e,t)=>e-t)}function fe(e,t){return{...e,management:{...e.management,progress:t}}}function le(e,t,n){return{...e,management:{...e.management,byChatId:{...e.management.byChatId,[t]:{...e.management.byChatId[t]||{},...n}}}}}function be(e,t){return{...e,settings:{...e.settings,byKey:{...e.settings.byKey,...t}}}}function he(e,t,n){return{...e,settings:{...e.settings,themes:{...e.settings.themes,[t]:{...e.settings.themes[t]||{},...n}}}}}function me(e,t,n){return{...e,settings:{...e.settings,notifyExceptions:{...e.settings.notifyExceptions,[t]:n}}}}function pe(e,t,n,r){switch(t){case"contact":return be(e,{...void 0!==n&&{hasPrivateChatsNotifications:!n},...void 0!==r&&{hasPrivateChatsMessagePreview:r}});case"group":return be(e,{...void 0!==n&&{hasGroupNotifications:!n},...void 0!==r&&{hasGroupMessagePreview:r}});case"broadcast":return be(e,{...void 0!==n&&{hasBroadcastNotifications:!n},...void 0!==r&&{hasBroadcastMessagePreview:r}});default:return}}function ge(e,t){return{...e,blocked:{...e.blocked,ids:[t,...e.blocked.ids],totalCount:e.blocked.totalCount+1}}}function ye(e,t){return{...e,blocked:{...e.blocked,ids:e.blocked.ids.filter(e=>e!==t),totalCount:e.blocked.totalCount-1}}}function ve(e,t){return{...e,twoFaSettings:{...e.twoFaSettings,...t}}}function Oe(e,t){return{...e,payment:{...e.payment,shippingOptions:t}}}function we(e,t){return{...e,payment:{...e.payment,formId:t}}}function Ie(e,t){return{...e,payment:{...e.payment,step:t}}}function je(e,t){if(!t.content||!t.content.invoice)return e;const{title:n,text:r,description:u,photoUrl:d}=t.content.invoice;return{...e,payment:{...e.payment,invoiceContent:{title:n,text:r,description:u,photoUrl:d}}}}function Ce(e,t){return{...e,payment:{...e.payment,stripeCredentials:{...t}}}}function Ee(e,t){return{...e,payment:{...e.payment,...t}}}function Se(e,t,n){if(!t||!n)return{...e,payment:{...e.payment,receipt:void 0}};const{invoice:r}=n.content,{photoUrl:u,text:d,title:o}=r||{};return{...e,payment:{...e.payment,receipt:{...t,photoUrl:u,text:d,title:o}}}}function Me(e){return{...e,payment:{}}}function Ae(e){return{...e,payment:{...e.payment,isPaymentModalOpen:!1}}}},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,"a",(function(){return r}));const r={states:[],isHistoryChangedByUser:!0,pushState(e){this.states.push(e),window.history.pushState(e,"")},back(){this.isHistoryChangedByUser=!1,window.history.back(),this.states.pop()}}},function(e,t,n){"use strict";var r=n(37);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 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-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-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-active":["#C8EBBC","#4F4A9F"],"--color-accent-own":["#4FAE4E","#FFFFFF"],"--color-message-meta-own":["#4FAE4EFF","#FFFFFF88"],"--color-own-links":["#52A1EF","#FFFFFF"],"--color-code-own":["#3C7940","#FFFFFF"]}')},function(e,t,n){"use strict";var r=n(0),u=n(8),d=n(24);n(94);t.a=e=>{const{icon:t,className:n,children:o,onClick:c,href:a,download:i,disabled:s,destructive:f,ariaLabel:l}=e,b=Object(d.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}),o);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},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(9);n(88);t.a=Object(r.h)(()=>{const[e,t]=Object(r.r)([]),n=Object(r.p)(()=>Object(u.a)(()=>{t([])},700,!1),[]),d=Object(r.m)(r=>{if(0!==r.button)return;const u=r.currentTarget,d=u.getBoundingClientRect(),o=u.offsetWidth/2;t([...e,{x:r.clientX-d.x-o/2,y:r.clientY-d.y-o/2,size:o}]),requestAnimationFrame(()=>{n()})},[e,n]);return r.a.createElement("div",{className:"ripple-container",onMouseDown:d},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";n.d(t,"a",(function(){return s})),n.d(t,"b",(function(){return f})),n.d(t,"c",(function(){return l}));var r=n(81),u=n.n(r),d=n(7),o=n(13),c=n(9);let a,i;const s="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=";async function f(e,t){for(b();!i.wasmReady;)await Object(c.e)(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(d.p)()||"data:image/webp"!==t.substr(0,15))return t;b();const n=await f(e,Object(o.d)(t));if(!n)throw new Error("Can't convert webp to png. Url: "+t);return Object(o.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(8),d=n(24);t.a=Object(r.h)(({ref:e,id:t,className:n,value:o,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})=>{const w=Object(d.a)(),I=a||i||c,j=Object(u.a)("input-group",o&&"touched",a?"error":i&&"success",s&&"disabled",f&&"disabled",I&&"with-label",n);return r.a.createElement("div",{className:j,dir:w.isRtl?"rtl":void 0},r.a.createElement("input",{ref:e,className:"form-control",type:"text",id:t,dir:"auto",value:o||"",placeholder:l,maxLength:m,autoComplete:b,inputMode:h,disabled:s,readOnly:f,onChange:p,onInput:g,onKeyPress:y,onKeyDown:v,onBlur:O}),I&&r.a.createElement("label",{htmlFor:t},I))})},function(e,t,n){"use strict";var r=n(0),u=n(8),d=n(24),o=n(20);n(90);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(d.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(o.a,null))})},function(e,t,n){"use strict";n.d(t,"a",(function(){return u}));var r=n(54);function u(e){return Object(r.a)({onEsc:e})}},function(e,t,n){"use strict";n.d(t,"b",(function(){return o}));var r=n(0);let u,d=!1;const o=e=>{document.dispatchEvent(new Event("tt-event-heavy-animation-start")),d=!0,u&&(clearTimeout(u),u=void 0),u=window.setTimeout(()=>{d=!1,document.dispatchEvent(new Event("tt-event-heavy-animation-end")),u=void 0},e)};t.a=(e,t)=>{Object(r.n)(()=>(d&&e(),document.addEventListener("tt-event-heavy-animation-start",e),document.addEventListener("tt-event-heavy-animation-end",t),()=>{document.removeEventListener("tt-event-heavy-animation-end",t),document.removeEventListener("tt-event-heavy-animation-start",e)}),[t,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 d(e){return e<1e3?e:e<1e6?u(e/1e3)+"K":u(e/1e6)+"M"}function o(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 d})),n.d(t,"c",(function(){return o}))},function(e,t,n){"use strict";n.d(t,"a",(function(){return r}));const r=[]},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";var r=n(0),u=n(34),d=n(62),o=n(77),c=n(57),a=n(47),i=n(8),s=n(48);n(92);t.a=({ref:e,containerRef:t,isOpen:n,className:f,style:l,children:b,positionX:h="left",positionY:m="top",autoClose:p=!1,footer:g,noCloseOnBackdrop:y=!1,onCloseAnimationEnd:v,onClose:O,onMouseEnter:w,onMouseLeave:I,shouldSkipTransition:j})=>{let C=Object(r.q)(null);e&&(C=e);const E=t||C,{transitionClassNames:S}=Object(u.a)(n,v,j,void 0,j);Object(r.n)(()=>n&&O?Object(a.a)(O):void 0,[n,O]),Object(c.a)(([e])=>{void 0!==e&&Object(s.b)(200)},[n]);const M=Object(d.a)(C,n,p?O:void 0);Object(o.a)(n,E,y?void 0:O);const A=Object(i.a)("bubble menu-container custom-scroll",m,h,g&&"with-footer",S);return r.a.createElement("div",{className:Object(i.a)("Menu no-selection",f),onKeyDown:n?M:void 0,onMouseEnter:w,onMouseLeave:n?I:void 0,style:l},n&&r.a.createElement("div",{className:"backdrop"}),r.a.createElement("div",{ref:C,className:A,style:`transform-origin: ${m} ${h}`,onClick:p?O:void 0},b,g&&r.a.createElement("div",{className:"footer"},g)))}},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(5),u=n(1),d=n(10),o=n(12),c=n(13),a=n(7),i=n(79),s=n.n(i),f=n(80),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(44);const m={[r.ApiMediaFormat.DataUri]:o.a.Text,[r.ApiMediaFormat.BlobUrl]:o.a.Blob,[r.ApiMediaFormat.Lottie]:o.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.i?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.N){const n=e.startsWith("avatar")?u.P:u.O,r=await o.c(n,e,m[t]);if(r){let t=r;if("audio/ogg"!==r.type||a.h||(t=await b(t)),"image/webp"===r.type&&!Object(a.p)()&&t){const n=await Object(h.b)(e,t);n&&(t=n)}const n=w(t);return p.set(e,n),n}}if(t===r.ApiMediaFormat.Stream){const r=new MediaSource,u=URL.createObjectURL(r);let o=!1;return r.addEventListener("sourceopen",()=>{if(o)return;o=!0;const u=r.addSourceBuffer("audio/mpeg");Object(d.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(d.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.h){const e=await Object(c.e)(s);URL.revokeObjectURL(s);const t=await b(e);s=w(t),f=e.type}if("image/webp"===f&&!Object(a.p)()){const t=await Object(c.e)(s);URL.revokeObjectURL(s);const n=await Object(h.b)(e,t);n&&(s=w(n))}return p.set(e,s),s}(e,t,n).catch(e=>{u.p&&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(d.b)(e)}function w(e){return e instanceof Blob?URL.createObjectURL(e):e}a.i&&navigator.serviceWorker.addEventListener("message",async e=>{const{type:t,messageId:n,params:u}=e.data;if("requestPart"!==t)return;const o=await Object(d.a)("downloadMedia",{mediaFormat:r.ApiMediaFormat.Progressive,...u});if(!o)return;const{arrayBuffer:c,mimeType:a,fullSize:i}=o;navigator.serviceWorker.controller.postMessage({type:"partResponse",messageId:n,result:{arrayBuffer:c,mimeType:a,fullSize:i}},[c])})},function(e,t,n){"use strict";n.d(t,"a",(function(){return d}));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 d(e){return o()||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)}}),o()||document.removeEventListener("keydown",c,!1)}(e)}}function o(){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 i}));var r=n(9),u=n(1),d=n(7);const o=d.g&&s();let c=i();const a=Object(r.g)(()=>{c=i(),((c.width<=u.eb||c.width<=u.db&&c.height<=u.cb)!==d.g||d.g&&o!==s())&&window.location.reload()},250,!0);function i(){const e=.01*window.innerHeight;return document.documentElement.style.setProperty("--vh",e+"px"),{width:window.innerWidth,height:window.innerHeight}}function s(){return d.e?window.matchMedia("(orientation: landscape)").matches:window.matchMedia("screen and (min-device-aspect-ratio: 1/1) and (orientation: landscape)").matches}window.addEventListener("resize",a),window.addEventListener("orientationchange",a),t.a={get:()=>c}},function(e,t,n){"use strict";var r=n(0),u=n(2);const d=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 o(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=o(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;iObject(s.l)(t,["toggleSafeLinkModal","openTelegramLink"]))(({url:e,text:t,className:n,children:u,isRtl:d,toggleSafeLinkModal:o,openTelegramLink:c})=>{const a=u||t,s=e!==a,h=Object(r.m)(t=>t.ctrlKey||t.altKey||t.shiftKey||t.metaKey||!e||!e.match(i.jb)&&!e.match(i.ib)?!s||(o({url:e}),t.preventDefault(),!1):(t.preventDefault(),c({url:e}),!1),[s,c,o,e]);if(!e)return;const m=Object(f.a)(n||"text-entity-link",t.length>50&&"long-word-break-all");return r.a.createElement("a",{href:l(e),title:b(e),target:"_blank",rel:"noopener noreferrer",className:m,onClick:h,dir:d?"rtl":"auto"},a)}))},function(e,t,n){"use strict";var r=n(0),u=n(37);t.a=(e,t)=>{const n=Object(u.a)(t);return Object(r.n)(()=>e(n||[]),t)}},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 d})),n.d(t,"a",(function(){return o})),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 d(t,n)}function d(e,t){return e&&-1!==e.indexOf(".")?e.split(".").pop():t.split("/").pop()}function o(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 o}));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:d,fieldError:o,description:c}=u?r[u]:r[n];return{field:d,fieldError:o,description:c||t}}const d={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 o(e){return Object.values(e).reduce((e,t)=>{const n=d[t.message];return n&&(e={...e,[n.field]:n.fieldError}),e},{})}},function(e,t,n){"use strict";n.d(t,"b",(function(){return d})),n.d(t,"a",(function(){return o}));var r=n(9);let u;function d(e,t){t||(u&&!u.isCancelled&&(u.isCancelled=!0),u=t={isCancelled:!1}),Object(r.b)(()=>{!t.isCancelled&&e()&&d(e,t)})}function o(e){Object(r.b)(()=>{e()&&o(e)})}},function(e,t,n){"use strict";var r=n(0),u=n(52);n(93);t.a=({trigger:e,className:t,children:n,positionX:d="left",positionY:o="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:d,positionY:o,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,d)=>{const[o,c]=Object(r.r)(-1);Object(r.n)(()=>{c(-1);const n=e.current;t&&n&&!d&&(n.tabIndex=-1,n.focus())},[e,t,d]);return Object(r.m)(t=>{const r=e.current;if(!r)return;if(13===t.keyCode&&n)return void n(o);if(38!==t.keyCode&&40!==t.keyCode)return;const d=document.activeElement,a=Array.from(u?r.querySelectorAll(u):r.children);let i=d&&a.indexOf(d)||o;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 d})),n.d(t,"b",(function(){return o}));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 d(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 o(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 d.p&&Object(r.f)(e)&&!t&&console.warn("Missing `key` in `teactFastList`"),t}));let o=0;const c=e.children.reduce((e,r,d)=>{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[d],o=u&&"props"in u?u.props.key:void 0;if(!u||o)return f(n,r,void 0,t,-1),e;c="__indexKey#"+d}return e[c]={$element:r,index:o++,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,d=c[u];if(!d)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 o="props"in e?e.props.teactOrderKey:void 0,b=d.index!==l&&d.order!==o,h=b&&l>d.index;b&&!h||l++,s.push(f(n,d.$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),o=[],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&&o.push(u)}c&&n.appendChild(c);return o}(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:d}=e;if(!d.isMounted){b(e=Object(r.i)(d),t,n,u);const o=e.children[0];Object(r.d)(o)&&(e.children=[l(o,e,0,u)]),d.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,d=document.createElement(t);return"object"==typeof n.ref&&(n.ref.current=d),Object.keys(n).forEach(e=>{p(d,e,n[e])}),e.children=u.map((t,n)=>f(d,void 0,t,e,n)),d}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(),d=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),d}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(o.a)(e,t,n):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(o.c)(e,t,n):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),d=n(40),o=n(22),c=n(2),a=n(3),i=n(8),s=n(26);var f=Object(c.h)(void 0,(e,t)=>Object(a.l)(t,["openUserInfo"]))(({className:e,sender:t,openUserInfo:n,children:u})=>{const d=Object(r.m)(()=>{t&&n({id:t.id})},[t,n]);return t?r.a.createElement(s.a,{className:Object(i.a)("UserLink",e),onClick:d},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 d=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:d},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 d=Object(r.m)(()=>{t&&n({id:t})},[t,n]);return t?r.a.createElement(s.a,{className:Object(i.a)("ChatLink",e),onClick:d},u):u});function h(e,t,n,c,a,i,s={}){if(!t.content.action)return[];const{text:f}=t.content.action,h=[],g={...s,maxTextLength:16};let y,v=p(f,"%action_origin%",n?!s.isEmbedded&&function(e,t,n){return Object(u.fb)(t)?function(e,t,n){const c=Object(d.a)(Object(u.l)(e,t));if(n)return c;return r.a.createElement(b,{className:"action-link",chatId:t.id},t&&Object(o.a)(c))}(e,t,n):m(t,n)}(e,n,s.asPlain)||" ":"User");return y=v.pop(),h.push(...v),v=p(y,"%target_user%",c?m(c,s.asPlain):"User"),y=v.pop(),h.push(...v),v=p(y,"%message%",a?function(e,t,n={}){const c=Object(u.N)(e,t),{photo:a,video:i,document:s,sticker:f}=Object(u.v)(t),b=c&&!a&&!i&&!s&&!f;let h=Object(d.a)(c,n.maxTextLength);a?h="a photo":i?h=i.isGif?"a GIF":"a video":s?h="a document":f&&(h=`«${c}»`);if(n.asPlain)return b?`«${h}»`:h;if(b)return r.a.createElement("span",null,"«",r.a.createElement(l,{className:"action-link",message:t},Object(o.a)(h)),"»");return r.a.createElement(l,{className:"action-link",message:t},Object(o.a)(h))}(e,a,g):"a message"),y=v.pop(),h.push(...v),v=p(y,"%product%",a?function(e){return e.content&&e.content.invoice?e.content.invoice.title:"a product"}(a):"a product"),y=v.pop(),h.push(...v),v=p(y,"%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"),h.push(...v),s.asPlain?h.join("").trim():h}function m(e,t){const n=Object(d.a)(Object(u.Z)(e));return t?n:r.a.createElement(f,{className:"action-link",sender:e},e&&Object(o.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)),u.push(n),u.push(e.substring(r+t.length)),u}},function(e,t){},function(e,t){},function(e,t,n){"use strict";let r;n.d(t,"a",(function(){return r})),n.d(t,"b",(function(){return u})),n.d(t,"c",(function(){return d})),function(e){e.Bold="MessageEntityBold",e.Blockquote="MessageEntityBlockquote",e.BotCommand="MessageEntityBotCommand",e.Cashtag="MessageEntityCashtag",e.Code="MessageEntityCode",e.Email="MessageEntityEmail",e.Hashtag="MessageEntityHashtag",e.Italic="MessageEntityItalic",e.MentionName="MessageEntityMentionName",e.Mention="MessageEntityMention",e.Phone="MessageEntityPhone",e.Pre="MessageEntityPre",e.Strike="MessageEntityStrike",e.TextUrl="MessageEntityTextUrl",e.Url="MessageEntityUrl",e.Underline="MessageEntityUnderline",e.Unknown="MessageEntityUnknown"}(r||(r={}));const u=-1,d="MESSAGE_DELETED"},function(e,t){},function(e,t,n){"use strict";let r;n.d(t,"a",(function(){return r})),function(e){e[e.DataUri=0]="DataUri",e[e.BlobUrl=1]="BlobUrl",e[e.Lottie=2]="Lottie",e[e.Progressive=3]="Progressive",e[e.Stream=4]="Stream"}(r||(r={}))},function(e,t){},function(e,t){},function(e,t,n){"use strict";var r=n(0),u=n(2),d=n(3),o=n(6);t.a=Object(u.h)((e,{userId:t})=>({userOrChat:t?Object(o.Fb)(e,t):void 0}),(e,t)=>Object(d.l)(t,["openChat","openChatByUsername"]))(({username:e,userOrChat:t,children:n,openChat:u,openChatByUsername:d})=>r.a.createElement("a",{onClick:()=>{t?u({id:t.id}):e&&d({username:e.substring(1)})},className:"text-entity-link",dir:"auto"},n))},function(e,t,n){"use strict";var r=n(60),u=n(41);let d=!1;const o=/^#?([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=o.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 d=Math.round(c(u[e].r,u[t].r,n)),o=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(${d},${o},${a},${i/255})`:`rgb(${d},${o},${a})`)})}t.a=(e,t)=>{const n="dark"===e,u=d&&t,o=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")),d&&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),d=!0,u?Object(r.b)(()=>{const e=Math.min((Date.now()-a)/200,1);return s(o,c,function(e){return 1-(1-e)**3.5}(e)),e<1}):s(o,c)}},function(e,t,n){"use strict";n.d(t,"a",(function(){return u}));var r=n(1);function u(e){"function"==typeof window.navigator.setAppBadge&&window.navigator.setAppBadge(e).catch(e=>{r.p&&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+"eb485bee0c151237dba8.worker.js")}},function(e,t,n){e.exports=function(){return new Worker(n.p+"01705582fc3eca0e007b.worker.js")}},function(e,t,n){e.exports=function(){return new Worker(n.p+"0dbbe0a906f6c2adf071.worker.js")}},function(e,t,n){e.exports=function(){return new Worker(n.p+"a66075669d8d0ac2d740.worker.js")}},function(e,t,n){"use strict";var r=n(2),u=n(7),d=n(14),o=n(75),c=n(38);Object(r.b)("init",e=>{const{theme:t,animationLevel:n,messageTextSize:r,language:c}=e.settings.byKey;Object(d.c)(c),document.documentElement.style.setProperty("--message-text-size",r+"px"),document.body.classList.add("initial"),document.body.classList.add("animation-level-"+n),document.body.classList.add(u.l?"is-touch-env":"is-pointer-env"),Object(o.a)(t,n>0),u.j&&document.body.classList.add("is-safari"),u.e?document.body.classList.add("is-ios"):u.b&&document.body.classList.add("is-android")}),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 c.a.pushState({type:"login",contentKey:"authCode"}),{...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)("setShouldSkipUiLoaderTransition",(e,t,n)=>{const{shouldSkipUiLoaderTransition:r}=n;return{...e,shouldSkipUiLoaderTransition:r}})},function(e,t,n){"use strict";var r=n(2),u=n(1),d=n(10),o=n(28),c=n(12),a=n(38),i=n(76);Object(r.b)("initApi",(e,t)=>{let n=localStorage.getItem(u.D)||void 0;if(!n){const e=localStorage.getItem(u.I);if(e){const{dcID:t}=JSON.parse(e),r=localStorage.getItem(`dc${t}_auth_key`);if(r){n=`session:${t}:${r.replace(/"/g,"")}`}}}Object(d.c)(t.apiUpdate,n)}),Object(r.b)("setAuthPhoneNumber",(e,t,n)=>{const{phoneNumber:r}=n;return Object(d.a)("provideAuthPhoneNumber",r),{...e,authIsLoading:!0,authError:void 0}}),Object(r.b)("setAuthCode",(e,t,n)=>{const{code:r}=n;return Object(d.a)("provideAuthCode",r),{...e,authIsLoading:!0,authError:void 0}}),Object(r.b)("setAuthPassword",(e,t,n)=>{const{password:r}=n;return Object(d.a)("provideAuthPassword",r),{...e,authIsLoading:!0,authError:void 0}}),Object(r.b)("uploadProfilePhoto",(e,t,n)=>{const{file:r}=n;Object(d.a)("uploadProfilePhoto",r)}),Object(r.b)("signUp",(e,t,n)=>{const{firstName:r,lastName:u}=n;return Object(d.a)("provideAuthRegistration",{firstName:r,lastName:u}),{...e,authIsLoading:!0,authError:void 0}}),Object(r.b)("returnToAuthPhoneNumber",e=>(Object(d.a)("restartAuth"),{...e,authError:void 0})),Object(r.b)("gotToAuthQrCode",e=>(Object(d.a)("restartAuthWithQr"),a.a.pushState({type:"login",contentKey:"authQr"}),{...e,authIsLoadingQrCode:!0,authError:void 0})),Object(r.b)("saveSession",(e,t,n)=>{const{sessionId:r,sessionJson:d}=n;localStorage.setItem(u.D,r),function(e,t){const{mainDcId:n,keys:r}=JSON.parse(e),d={dcID:n,id:t};localStorage.setItem(u.I,JSON.stringify(d)),localStorage.setItem("dc",n),Object.keys(r).forEach(e=>{localStorage.setItem(`dc${e}_auth_key`,`"${r[e]}"`)})}(d,e.currentUserId)}),Object(r.b)("signOut",()=>{(async()=>{await Object(o.d)(),await Object(d.a)("destroy"),Object(r.d)().reset()})()}),Object(r.b)("reset",()=>{localStorage.removeItem(u.D),localStorage.removeItem("dc5_auth_key"),localStorage.removeItem("dc4_auth_key"),localStorage.removeItem("dc3_auth_key"),localStorage.removeItem("dc2_auth_key"),localStorage.removeItem("dc1_auth_key"),localStorage.removeItem("dc"),localStorage.removeItem(u.I),c.b(u.O),c.b(u.P),c.b(u.Q),c.b(u.m);const e=u.G.replace(/\d+$/,""),t=(u.G.match(/\d+$/)||[0])[0];for(let n=0;n{(async()=>{await Object(d.a)("disconnect")})()}),Object(r.b)("loadNearestCountry",e=>{"connectionStateReady"===e.connectionState&&(async()=>{const e=await Object(d.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(2),u=n(1),d=n(28),o=n(36),c=n(14);Object(r.b)("apiUpdate",(e,t,n)=>{switch(u.p&&"updateUserStatus"!==n["@type"]&&console.log("[GramJs] UPDATE",n["@type"],{update:n}),n["@type"]){case"updateApiReady":!function(e){Object(d.c)(),Object(c.c)(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":{const{sessionId:u,sessionJson:d}=e;if(u&&t.authRememberMe&&Object(r.d)().saveSession({sessionId:u,sessionJson:d}),n)break;Object(r.g)({...t,isLoggingOut:!1,lastSyncTime:Date.now()});break}}}(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"updateCurrentUser":!function(e){const{currentUser:t}=e;Object(r.g)({...Object(o.nb)(Object(r.e)(),t.id,t),currentUserId:t.id}),function(e){const t=localStorage.getItem(u.I);if(!t)return;const n=JSON.parse(t);n.id=e,localStorage.setItem(u.I,JSON.stringify(n))}(t.id)}(n);break;case"error":"SESSION_REVOKED"===n.error.message&&t.signOut(),t.showError({error:n.error})}})},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(21),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(1),d=n(2),o=n(7),c=n(28);function a(e){const t=e.data;if(!t.type)return;const n=Object(d.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)()}o.k&&(window.addEventListener("load",async()=>{try{await navigator.serviceWorker.register(r),u.p&&console.log("[SW] ServiceWorker registered"),await navigator.serviceWorker.ready,navigator.serviceWorker.controller?(u.p&&console.log("[SW] ServiceWorker ready"),i()):(u.p&&console.error("[SW] ServiceWorker not available"),Object(d.d)().showError({error:{message:"SERVICE_WORKER_DISABLED"}}))}catch(e){u.p&&console.error("[SW] ServiceWorker registration failed: ",e)}}),window.addEventListener("focus",async()=>{await navigator.serviceWorker.ready,i()}));var s=n(65);const f={isLeftColumnShown:!0,isChatInfoShown:!1,uiReadyState:0,authRememberMe:!0,blocked:{ids:[],totalCount:0},users:{byId:{}},chats:{listIds:{},isFullyLoaded:{},orderedPinnedIds:{},totalCount:{},byId:{}},messages:{byChatId:{}},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:{}},gifs:{saved:{},search:{}},globalSearch:{},localTextSearch:{byChatThreadKey:{}},localMediaSearch:{byChatId:{}},management:{byChatId:{}},topPeers:{},mediaViewer:{},audioPlayer:{},forwardMessages:{},pollResults:{},payment:{},notifications:[],errors:[],activeSessions:[],settings:{byKey:{messageTextSize:u.s,animationLevel:u.d,messageSendKeyCombo:"enter",theme:"light",shouldAutoDownloadMediaFromContacts:!0,shouldAutoDownloadMediaInPrivateChats:!0,shouldAutoDownloadMediaInGroups:!0,shouldAutoDownloadMediaInChannels:!0,shouldAutoPlayGifs:!0,shouldAutoPlayVideos:!0,shouldSuggestStickers:!0,shouldLoopStickers:!0,language:"en"},themes:{light:{isBlurred:!0,patternColor:u.t},dark:{isBlurred:!0,patternColor:u.o}},privacy:{},notifyExceptions:{}},twoFaSettings:{}};var l=n(5),b=n(9),h=n(3),m=n(6);const p=Object(b.g)((function(){Object(b.c)(()=>{if(!g)return;const e=Object(d.e)();if(e.isLoggingOut)return;const t={...f,...Object(h.l)(e,["authState","authPhoneNumber","authRememberMe","authNearestCountry","currentUserId","contactList","chatFolders","topPeers","recentEmojis","push"]),isChatInfoShown:v(e),users:O(e),chats:w(e),messages:I(e),globalSearch:{recentlyFoundChatIds:e.globalSearch.recentlyFoundChatIds},settings:j(e)},n=JSON.stringify(t);localStorage.setItem(u.B,n)})}),1e3,!1);let g=!1;function y(e){if(!u.A){if(localStorage.getItem(u.D))return g=!0,Object(d.a)(p),function(e){u.p&&console.time("global-state-cache-read");const t=localStorage.getItem(u.B),n=t?JSON.parse(t):void 0;u.p&&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});return{...e,...n}}(e);g=!1}}function v(e){return window.innerWidth>u.bb&&e.isChatInfoShown}function O(e){const{users:{byId:t,selectedId:n}}=e,r=[...(e.chats.listIds.active||[]).slice(0,u.z).filter(e=>e>0),...Object.keys(t)].slice(0,u.C);return{byId:Object(h.l)(t,r),selectedId:window.innerWidth>u.bb?n:void 0}}function w(e){const t=[...(e.chats.listIds.active||[]).slice(0,u.z)],{chatId:n}=Object(m.y)(e)||{};return{...e.chats,byId:Object(h.l)(e.chats.byId,n?[...t,n]:t),listIds:{active:t},isFullyLoaded:{},orderedPinnedIds:{active:e.chats.orderedPinnedIds.active}}}function I(e){const t={},{chatId:n}=Object(m.y)(e)||{};[...(e.chats.listIds.active||[]).slice(0,u.z),...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(h.l)(r.byId,u.viewportIds),threadsById:{[l.MAIN_THREAD_ID]:u}})});const r=Object(m.y)(e);return{byChatId:t,messageLists:!r||o.g?void 0:[{...r,threadId:l.MAIN_THREAD_ID,type:"thread"}]}}function j(e){const{byKey:t,themes:n}=e.settings;return{byKey:t,themes:n,privacy:{},notifyExceptions:{}}}u.A||(Object(d.b)("saveSession",()=>{g=!0,Object(d.a)(p)}),Object(d.b)("reset",()=>{g=!1,Object(d.f)(p),localStorage.removeItem(u.B)})),Object(d.b)("init",()=>{const e=Object(h.d)(f),t=y(e)||e,n=Object(m.y)(t)||{};return window.history.replaceState(n,""),t});var C=n(0),E=n(55);const S=String(Date.now()+Math.random());let M;localStorage.setItem("tt-active-tab",S);const A=window.setInterval(()=>{M&&localStorage.getItem("tt-active-tab")!==S&&(M(),clearInterval(A))},2e3);var k=n(33),T=(n(82),n(83),n(84),n(30)),N=n(34),P=n(39),D=n(13);const L=["400 1em Roboto","500 1em Roboto"];function F(){if("fonts"in document)return Promise.all(L.map(e=>document.fonts.load(e)))}var B=n(53),x=n(11),R=n(8),U=(n(86),n.p+"telegram-logo.df3a91becaa9678c529b4c4cadd45204.svg"),_=n.p+"monkey.a3d5fcdc50b18dc55695f7dd4101a8c9.svg";function G(){const{listIds:e,byId:t}=Object(d.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(T.d)(n);return r?B.b(r,l.ApiMediaFormat.DataUri):void 0}))}const $={main:()=>Promise.all([Object(x.d)(x.a.Main,"Main").then(F),G()]),authPhoneNumber:()=>Promise.all([F(),Object(D.g)(U)]),authCode:()=>Object(D.g)(_),authPassword:()=>Object(D.g)(_),authQrCode:F};var W=Object(d.h)(e=>{const{theme:t}=e.settings.byKey,{background:n,backgroundColor:r}=e.settings.themes[t]||{};return{shouldSkipUiLoaderTransition:e.shouldSkipUiLoaderTransition,uiReadyState:e.uiReadyState,hasCustomBackground:Boolean(n),hasCustomBackgroundColor:Boolean(r),isRightColumnShown:Object(m.V)(e)}},(e,t)=>Object(h.l)(t,["setIsUiReady","setShouldSkipUiLoaderTransition"]))(({page:e,children:t,hasCustomBackground:n,hasCustomBackgroundColor:r,isRightColumnShown:u,shouldSkipUiLoaderTransition:d,setIsUiReady:o,setShouldSkipUiLoaderTransition:c})=>{const[a,i]=Object(k.a)(),{shouldRender:s,transitionClassNames:f}=Object(N.a)(!a,void 0,!0);return Object(C.n)(()=>{let t;return Promise.race([Object(b.e)(700),(async()=>{try{await $[e]()}catch(e){}})()]).then(()=>{i(),o({uiReadyState:1}),t=window.setTimeout(()=>{o({uiReadyState:2})},1e3)}),()=>{t&&(clearTimeout(t),t=void 0),o({uiReadyState:0})}},[]),Object(P.a)(()=>{d&&setTimeout(()=>{c({shouldSkipUiLoaderTransition:!1})},400)},[d]),C.a.createElement("div",{id:"UiLoader"},t,s&&!d&&C.a.createElement("div",{className:Object(R.a)("mask",f)},"main"===e?C.a.createElement(C.a.Fragment,null,C.a.createElement("div",{className:"left"}),C.a.createElement("div",{className:Object(R.a)("middle",n&&"custom-bg-image",r&&"custom-bg-color",u&&"with-right-column")}),u&&C.a.createElement("div",{className:"right"})):C.a.createElement("div",{className:"blank"})))}),K=n(18),H=n(31),z=n(46),V=n(45),q=n(16),J=n(51),Y=n(22),Q=n(61),Z=n(42),X=n(20);n(95);const ee=200+u.c;var te=Object(C.h)(({id:e,value:t,isLoading:n,onChange:r})=>{const u=Object(C.q)(null),[d,o]=Object(C.r)(),[c,a]=Object(C.r)(K.a);function i(e){o(e),a(function(e=""){return e.length?K.a.filter(t=>Object(J.a)(t.name,e)):K.a}(e))}const s=Object(C.m)(e=>{const{countryId:t}=e.currentTarget.firstElementChild.dataset,n=K.a.find(e=>e.id===t);n&&r(n),setTimeout(()=>i(void 0),ee)},[r]),f=Object(C.m)(e=>{i(e.currentTarget.value)},[]),l=Object(C.m)(e=>{if(8!==e.keyCode)return;const n=e.currentTarget;t&&void 0===d&&(n.value=""),i(n.value)},[d,t]);return C.a.createElement(Q.a,{className:"CountryCodeInput",trigger:({onTrigger:r,isOpen:o})=>{const c=()=>{if(o)return;setTimeout(()=>{u.current.select()},50),r();const e=document.getElementById("auth-phone-number-form");e.scrollTo({top:e.scrollHeight,behavior:"smooth"})},a=void 0!==d?d:t&&t.name||"";return C.a.createElement("div",{className:Object(R.a)("input-group",t&&"touched")},C.a.createElement("input",{ref:u,className:Object(R.a)("form-control",o&&"focus"),type:"text",id:e,value:a,autoComplete:"off",onClick:c,onFocus:c,onInput:f,onKeyDown:l}),C.a.createElement("label",null,"Country"),n?C.a.createElement(X.a,{color:"black"}):C.a.createElement("i",{onClick:c,className:Object(R.a)("css-icon-down",o&&"open")}))}},c.map(e=>C.a.createElement(Z.a,{key:e.id,className:t&&e.id===t.id?"selected":"",onClick:s},C.a.createElement("span",{"data-country-id":e.id}),C.a.createElement("span",{className:"country-flag"},Object(Y.a)(e.flag,["hq_emoji"])),C.a.createElement("span",{className:"country-name"},e.name),C.a.createElement("span",{className:"country-code"},e.code))),!c.length&&C.a.createElement(Z.a,{key:"no-results",className:"no-results",disabled:!0},C.a.createElement("span",null,"No countries matched your filter.")))});let ne=!1;var re=Object(C.h)(Object(d.h)(e=>Object(h.l)(e,["connectionState","authState","authPhoneNumber","authIsLoading","authIsLoadingQrCode","authError","authRememberMe","authNearestCountry"]),(e,t)=>Object(h.l)(t,["setAuthPhoneNumber","setAuthRememberMe","clearAuthError","loadNearestCountry","gotToAuthQrCode"]))(({connectionState:e,authState:t,authPhoneNumber:n,authIsLoading:r,authIsLoadingQrCode:u,authError:d,authRememberMe:c,authNearestCountry:a,setAuthPhoneNumber:i,setAuthRememberMe:s,loadNearestCountry:f,clearAuthError:l,gotToAuthQrCode:b})=>{const h=Object(C.q)(null),[m,p]=Object(C.r)(),[g,y]=Object(C.r)(),[v,O]=Object(C.r)(!1),[w,I]=Object(C.r)(),j=m?`${m.code} ${g||""}`:g,E=j&&j.replace(/[^\d]+/g,"").length>=10;Object(C.n)(()=>{o.l||h.current.focus()},[m]),Object(C.n)(()=>{"connectionStateReady"!==e||a||f()},[e,a,f]),Object(C.n)(()=>{!a||m||v||p(Object(K.d)(a))},[m,a,v]);const S=Object(C.m)(e=>{const t=Object(K.e)(e),n=!m||t&&t.id!==m.id?t:m;e.length?(!m||n&&n.code!==m.code)&&p(n):p(void 0),y(Object(K.b)(e,n))},[m]);Object(C.n)(()=>{void 0===g&&n&&S(n)},[n,g,S]),Object(C.o)(()=>{h.current&&w&&h.current.setSelectionRange(...w)},[w]);const M=Object(C.m)(e=>{d&&l(),ne||(ne=!0,F(),Object(D.g)(_));const{value:t,selectionStart:n,selectionEnd:r}=e.target;I(n&&r&&r{s(e.target.checked)},[s]);const k="authorizationStateWaitPhoneNumber"===t;return C.a.createElement("div",{id:"auth-phone-number-form",className:"custom-scroll"},C.a.createElement("div",{className:"auth-form"},C.a.createElement("div",{id:"logo"}),C.a.createElement("h2",null,"Sign in to Telegram"),C.a.createElement("p",{className:"note"},"Please confirm your country and",C.a.createElement("br",null),"enter your phone number."),C.a.createElement("form",{action:"",onSubmit:function(e){e.preventDefault(),r||E&&i({phoneNumber:j})}},C.a.createElement(te,{id:"sign-in-phone-code",value:m,isLoading:!a&&!m,onChange:p}),C.a.createElement(V.a,{ref:h,id:"sign-in-phone-number",label:"Phone Number",value:j,error:d,inputMode:"tel",onChange:M}),C.a.createElement(z.a,{id:"sign-in-keep-session",label:"Keep me signed in",checked:Boolean(c),onChange:A}),E&&(k?C.a.createElement(H.a,{type:"submit",ripple:!0,isLoading:r},"Next"):C.a.createElement(q.a,null)),k&&C.a.createElement(H.a,{isText:!0,ripple:!0,isLoading:u,onClick:b},"Log in by QR code"))))})),ue=n(17);var de=Object(C.h)(()=>{const e=Object(ue.a)(x.a.Auth,"AuthCode");return e?C.a.createElement(e,null):C.a.createElement(q.a,null)});var oe=Object(C.h)(()=>{const e=Object(ue.a)(x.a.Auth,"AuthPassword");return e?C.a.createElement(e,null):C.a.createElement(q.a,null)});var ce=Object(C.h)(()=>{const e=Object(ue.a)(x.a.Auth,"AuthRegister");return e?C.a.createElement(e,null):C.a.createElement(q.a,null)});var ae=Object(C.h)(()=>{const e=Object(ue.a)(x.a.Auth,"AuthQrCode");return e?C.a.createElement(e,null):C.a.createElement(q.a,null)});n(96);var ie=Object(C.h)(Object(d.h)(e=>Object(h.l)(e,["authState"]),(e,t)=>Object(h.l)(t,["reset","initApi"]))(({authState:e,reset:t,initApi:n})=>{switch(Object(C.n)(()=>{t(),n()},[t,n]),Object(C.n)(()=>{},[]),e){case"authorizationStateWaitCode":return C.a.createElement(W,{page:"authCode",key:"authCode"},C.a.createElement(de,null));case"authorizationStateWaitPassword":return C.a.createElement(W,{page:"authPassword",key:"authPassword"},C.a.createElement(oe,null));case"authorizationStateWaitRegistration":return C.a.createElement(ce,null);case"authorizationStateWaitQrCode":return C.a.createElement(W,{page:"authQrCode",key:"authQrCode"},C.a.createElement(ae,null));case"authorizationStateWaitPhoneNumber":default:return C.a.createElement(W,{page:"authPhoneNumber",key:"authPhoneNumber"},C.a.createElement(re,null))}}));var se=Object(C.h)(()=>{const e=Object(ue.a)(x.a.Main,"Main");return e?C.a.createElement(e,null):void 0}),fe=n.p+"app-inactive.bc7953c2dfebcabce2c43ca7dc778a89.png";n(97);var le=()=>C.a.createElement("div",{id:"AppInactive"},C.a.createElement("div",{className:"content"},C.a.createElement("img",{src:fe,alt:""}),C.a.createElement("h3",{className:"title"},"Such error, many tabs"),C.a.createElement("div",{className:"description"},"Telegram supports only one active tab with the app.",C.a.createElement("br",null),"Please reload this page to continue using this tab or close it."),C.a.createElement("div",{className:"actions"},C.a.createElement(H.a,{isText:!0,ripple:!0,onClick:()=>{window.location.reload()}},"Reload app"))));function be(){return d.c.createElement(W,{page:"main",key:"main"},d.c.createElement(se,null))}var he=Object(d.h)(e=>Object(h.l)(e,["authState"]),(e,t)=>Object(h.l)(t,["disconnect"]))(({authState:e,disconnect:t})=>{const[n,r]=Object(k.a)(!1);if(Object(C.n)(()=>{Object(E.b)(),M=()=>{t(),document.title=`${u.fb}${u.E}`,r()}},[t,r]),n)return d.c.createElement(le,null);if(e)switch(e){case"authorizationStateWaitPhoneNumber":case"authorizationStateWaitCode":case"authorizationStateWaitPassword":case"authorizationStateWaitRegistration":case"authorizationStateWaitQrCode":return d.c.createElement(ie,null);case"authorizationStateClosed":case"authorizationStateClosing":case"authorizationStateLoggingOut":case"authorizationStateReady":return be()}const o=localStorage.getItem(u.D),c=localStorage.getItem(u.I);return o||c?be():d.c.createElement(ie,null)});n(98);u.p&&console.log(">>> INIT"),Object(d.d)().init(),u.p&&console.log(">>> START INITIAL RENDER"),s.a.render(d.c.createElement(he,null),document.getElementById("root")),u.p&&console.log(">>> FINISH INITIAL RENDER"),document.addEventListener("dblclick",()=>{console.log("GLOBAL STATE",Object(d.e)())})}]); +//# sourceMappingURL=main.bcfa4c2bdab21d30f0f4.js.map \ No newline at end of file diff --git a/dist/main.bcfa4c2bdab21d30f0f4.js.map b/dist/main.bcfa4c2bdab21d30f0f4.js.map new file mode 100644 index 000000000..81d6fa1d3 --- /dev/null +++ b/dist/main.bcfa4c2bdab21d30f0f4.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./src/lib/teact/teact.ts","webpack:///./src/config.ts","webpack:///./src/lib/teact/teactn.tsx","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/types/index.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/util/environment.ts","webpack:///./src/util/buildClassName.ts","webpack:///./src/util/schedulers.ts","webpack:///./src/api/gramjs/worker/provider.ts","webpack:///./src/util/moduleLoader.ts","webpack:///./src/util/cacheApi.ts","webpack:///./src/util/files.ts","webpack:///./src/assets/lang/en-extra.json","webpack:///./src/assets/lang/es-extra.json","webpack:///./src/assets/lang/it-extra.json","webpack:///./src/assets/lang/pl-extra.json","webpack:///./src/assets/lang/ru-extra.json","webpack:///./src/util/langProvider.ts","webpack:///./src/util/callbacks.ts","webpack:///./src/lib/twemojiRegex.js","webpack:///./src/components/ui/Loading.tsx","webpack:///./src/hooks/useModuleLoader.ts","webpack:///./src/util/countries.ts","webpack:///./src/util/phoneNumber.ts","webpack:///./src/types/index.ts","webpack:///./src/components/ui/Spinner.tsx","webpack:///./src/util/handleError.ts","webpack:///./src/components/common/helpers/renderText.tsx","webpack:///./src/util/arePropsShallowEqual.ts","webpack:///./src/hooks/useLang.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/components/ui/Button.tsx","webpack:///./src/lib/teact/dom-events.ts","webpack:///./src/hooks/useFlag.ts","webpack:///./src/hooks/useShowTransition.ts","webpack:///./src/util/dateFormat.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/hooks/usePrevious.ts","webpack:///./src/util/history.ts","webpack:///./src/hooks/useOnChange.ts","webpack:///./src/util/trimText.ts","webpack:///./src/components/ui/MenuItem.tsx","webpack:///./src/components/ui/RippleEffect.tsx","webpack:///./src/util/webpToPng.ts","webpack:///./src/components/ui/InputText.tsx","webpack:///./src/components/ui/Checkbox.tsx","webpack:///./src/util/captureEscKeyListener.ts","webpack:///./src/hooks/useHeavyAnimationCheck.ts","webpack:///./src/util/textFormat.ts","webpack:///./src/util/memo.ts","webpack:///./src/util/searchWords.ts","webpack:///./src/components/ui/Menu.tsx","webpack:///./src/util/oggToWav.ts","webpack:///./src/util/mediaLoader.ts","webpack:///./src/util/captureKeyboardListeners.ts","webpack:///./src/util/windowSize.ts","webpack:///./src/lib/punycode.js","webpack:///./src/components/common/SafeLink.tsx","webpack:///./src/hooks/useEffectWithPrevDeps.ts","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/switchTheme.ts","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/api/initial.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/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:///./src/components/auth/AuthQrCode.async.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","exec","some","dependency","useEffect","fastRaf","useLayoutEffect","onTickEnd","useMemo","resolver","useCallback","newCallback","useRef","memo","areEqual","arePropsShallowEqual","withDebug","propsRef","renderedRef","getUnequalProps","join","addEventListener","orderBy","values","PAGE_TITLE","INACTIVE_MARKER","APP_NAME","APP_VERSION","process","IS_TEST","DEBUG_ALERT_MSG","GRAMJS_SESSION_ID_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","Set","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_MAX","ANIMATION_LEVEL_DEFAULT","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","STICKER_SIZE_INLINE_DESKTOP_FACTOR","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","MEMOJI_STICKER_ID","MENU_TRANSITION_DURATION","SLIDE_TRANSITION_DURATION","CONTENT_TYPES_FOR_QUICK_UPLOAD","RE_LINK_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","LANG_PACKS","TIPS_USERNAME","FEEDBACK_URL","LIGHT_THEME_BG_COLOR","DARK_THEME_BG_COLOR","DARK_THEME_PATTERN_COLOR","DEFAULT_PATTERN_COLOR","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","buildCollectionByKey","collection","reduce","byKey","member","mapValues","callback","newByKey","pick","result","pickTruthy","omit","stringKeys","filter","has","orderKey","sort","a","b","Array","isArray","mode1","mode2","orderKey1","orderKey2","aValue1","bValue1","aValue2","bValue2","aValue","bValue","array","concat","unique","from","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","groupedId","isGif","emoji","title","performer","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","getMessageContent","hasMessageMedia","getMessagePhoto","getMessageVideo","getMessageDocument","getMessageSticker","getMessageContact","getMessagePoll","getMessageAction","getMessageAudio","getMessageVoice","getMessageRoundVideo","getMessageInvoice","getMessageWebPage","getMessageWebPagePhoto","getMessageMediaThumbDataUri","thumbnail","media","getMessageMediaThumbnail","dataUri","getMessageMediaHash","webPagePhoto","base","hasMessageLocalBlobUrl","canMessagePlayVideoInline","getVideoOrAudioBaseHash","getDocumentHasPreview","IS_PROGRESSIVE_SUPPORTED","IS_SAFARI","size","mimeType","getMessageMediaFormat","isAnimated","ApiMediaFormat","Lottie","Progressive","IS_OPUS_SUPPORTED","BlobUrl","getMessageMediaFilename","date","blobUrl","previewBlobUrl","getChatMediaMessageIds","messages","listedIds","reverseOrder","ids","getMessageContentIds","reverse","getPhotoFullDimensions","sizes","getPhotoInlineDimensions","getVideoDimensions","width","height","getMediaTransferState","progress","isDownloadNeeded","isUploading","isTransferring","transferProgress","messageIds","contentType","validator","matchLinkInMessageText","getMediaDuration","duration","buildChatThreadKey","threadId","selectUser","global","userId","users","byId","selectNotifySettings","settings","selectNotifyExceptions","notifyExceptions","selectChat","chats","selectChatUser","chat","getPrivateChatUserId","selectIsChatWithSelf","currentUserId","selectIsChatWithBot","user","isUserBot","selectSupportChat","isSupport","selectChatOnlineCount","isChatPrivate","isChatChannel","fullInfo","members","onlineCount","isUserOnline","selectChatBot","selectIsChatBotNotStarted","bot","lastMessage","messageInfo","byChatId","threadsById","MAIN_THREAD_ID","selectAreActiveChatsLoaded","listIds","active","selectIsChatListed","targetList","includes","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","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","isRestricted","isPrivate","isChatWithSelf","isBasicGroup","isChatBasicGroup","isSuperGroup","isChatSuperGroup","isChannel","isServiceNotification","isOwn","isAction","isMessageEditable","Date","viaBotId","canReply","getCanPostInChat","hasPinPermission","isCreator","isUserRightBanned","getHasAdminRight","canPin","canUnpin","pinnedMessageIds","canDelete","canDeleteForAll","canEdit","canForward","hasSticker","hasFavoriteSticker","favorite","selectIsStickerFavorite","canFaveSticker","canUnfaveSticker","canCopy","canCopyLink","canSelect","noOptions","ability","selectCanDeleteSelectedMessages","selectedMessageIds","selectedMessages","messageActions","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","isPollResults","pollResults","selectIsPollResultsOpen","isSearch","IS_MOBILE_SCREEN","isManagement","currentManagement","selectCurrentManagement","isStickerSearch","query","isGifSearch","currentChatId","areActiveChatsLoaded","isUserInfo","isChatInfo","RightColumnContent","PollResults","Search","Management","StickerSearch","GifSearch","UserInfo","ChatInfo","selectIsRightColumnShown","selectCurrentGlobalSearchQuery","globalSearch","selectPaymentMessageId","payment","selectPaymentRequestId","formId","selectProviderPublishableKey","nativeParams","publishableKey","selectStripeCredentials","stripeCredentials","PLATFORM_ENV","userAgent","platform","navigator","os","test","getPlatform","IS_MAC_OS","IS_IOS","IS_ANDROID","IS_TOUCH_ENV","matchMedia","matches","innerWidth","IS_VOICE_RECORDING_SUPPORTED","mediaDevices","AudioContext","webkitAudioContext","IS_EMOJI_SUPPORTED","documentElement","style","IS_SERVICE_WORKER_SUPPORTED","Audio","canPlayType","IS_CANVAS_FILTER_SUPPORTED","getContext","DPR","devicePixelRatio","MASK_IMAGE_DISABLED","isWebpSupportedCache","isWebpSupported","webp","Image","handleLoadOrError","hasWebp","parts","debounce","fn","ms","shouldRunFirst","shouldRunLast","waitingTimeout","args","self","throttle","interval","isPending","_args","setInterval","clearInterval","throttleWith","fastPrimaryRaf","waiting","onIdle","requestIdleCallback","pause","rafPromise","fastRafCallbacks","fastRafPrimaryCallbacks","isPrimary","requestAnimationFrame","currentCallbacks","currentPrimaryCallbacks","worker","requestStates","requestStatesByCallback","initApi","sessionInfo","Worker","update","requestState","response","callbackArgs","subscribeToWorker","makeRequest","callApi","fnName","cancelApiProgress","progressCallback","isCanceled","postMessage","assign","pop","catch","finally","Bundles","LOAD_PROMISES","MEMORY_CACHE","async","loadModule","bundleName","moduleName","Auth","Main","Extra","handleBundleLoad","bundle","getModuleFromMemory","listeners","addLoadListener","listener","cacheApi","caches","Type","fetch","cacheName","Request","cache","open","Blob","blob","substr","headers","Json","json","save","cacheData","JSON","stringify","Response","put","clear","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","canvas","videoWidth","videoHeight","drawImage","toDataURL","currentTime","fetchBlob","imgToCanvas","EXTRA_PACK_PATHS","en","enExtraJson","es","esExtraJson","it","itExtraJson","pl","plExtraJson","ru","ruExtraJson","PLURAL_OPTIONS","PLURAL_RULES","ar","ca","de","fa","fr","ko","nl","pt_BR","tr","uk","uz","langPack","createCallbackManager","currentLangCode","getTranslation","format","cached","langString","template","amount","optionIndex","getPluralOption","trim","processTemplate","formatInteger","setLanguage","langCode","newLangPack","remote","sourceLangPacks","fetchFromCacheOrRemote","pairs","extraLangPack","languages","langInfo","isRtl","rtl","vs16RegExp","zeroWidthJoiner","fromCharCode","removeVS16s","rawEmoji","color","className","withBackground","noLoad","autoUpdate","formatsCache","defaultPhoneNumberFormat","parsed","str","flag","phoneFormat","formatValue","phoneNumberFormat","phoneNumberGroups","count","repeat","getPhoneNumberFormat","getCountryById","countryList","getCountryFromPhoneNumber","input","phoneNumber","startsWith","possibleCountries","country","formatPhoneNumber","_","p1","p2","p3","p4","p5","separator","output","formatPhoneNumberWithCode","numberWithPlus","LoadMoreDirection","FocusDirection","SettingsScreens","LeftColumnContent","GlobalSearchContent","MediaViewerOrigin","ChatCreationProgress","ProfileEditProgress","ManagementProgress","ProfileState","PaymentStep","UPLOADING_WALLPAPER_SLUG","ManagementScreens","Spinner","buildClassName","handleErrorEvent","startedAt","isReloading","preventDefault","ErrorEvent","reason","alert","localStorage","getItem","removeItem","location","reload","APP_ENV","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","RE_MENTION","nextLink","endsWith","addLinks","replaceSimpleMarkdown","emojis","emojiResult","nativeToUnfified","alt","line","trimmedLine","trimLeft","indentLength","entityResult","currentProps","newProps","currentKeys","currentKeysLength","prop","useOnChange","langProvider","setTrigger","trigger","Link","onClick","handleClick","dir","store","random","getDeviceToken","subscription","toJSON","endpoint","checkIfPushSupported","ServiceWorkerRegistration","Notification","permission","requestPermission","unsubscribeFromPush","dispatch","deviceToken","unsubscribe","deleteDeviceToken","serviceWorkerRegistration","serviceWorker","ready","pushManager","getSubscription","subscribe","replaceSettings","loadNotificationSettings","subscribedAt","checkIfShouldResubscribe","userVisibleOnly","setDeviceToken","DOMException","ABORT_ERR","showNewMessageNotification","isActiveChat","hasFocus","hasPrivateChatsNotifications","hasGroupNotifications","hasBroadcastNotifications","checkIfShouldNotify","body","messageSender","messageAction","actionTargetMessage","targetUserId","actionTargetUserId","targetChatId","actionTargetChatId","actionTargetUser","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","getTime","floor","today","setHours","formatTime","yesterday","setDate","getDate","formatFullDate","sortUserIds","usersById","priorityIds","expires","getUserColorKey","peer","abs","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","getChatSlowModeOptions","slowMode","getChatOrder","max","joinDate","isChatArchived","notifySettings","isMuted","getCanDeleteChat","prepareFolderListIds","chatsById","folder","chatIdsCache","excludedChatIds","includedChatIds","excludeArchived","excludeMuted","unreadMentionsCount","hasUnreadMark","excludeRead","bots","contacts","isContact","nonContacts","groups","channels","filterChatFolder","prepareChatList","folderType","chatFilter","listedChats","listIdsSet","pinnedChats","otherChats","getFolderUnreadDialogs","unreadDialogsCount","total","hasActiveDialogs","getFolderDescriptionText","emoticon","description","pinnedIds","getFolderChatsCount","isChat","chatOrUser","sortChatIds","chatIds","shouldPrioritizeVerified","priority","isVerified","Button","ref","onContextMenu","onMouseDown","onMouseEnter","onMouseLeave","onFocus","pill","fluid","isText","isLoading","ariaLabel","download","disabled","ripple","faded","tabIndex","elementRef","isClicked","setIsClicked","fullClassName","handleMouseDown","aria-label","NON_BUBBLEABLE_EVENTS","delegationRegistry","delegatedEventsByElement","documentEventCounters","element","propName","handler","eventName","resolveEventName","canUseEventDelegation","handleEvent","resolveDelegationRegistryForName","existing","newSet","resolveDelegatedEventsForElement","add","addDelegatedListener","removeEventListener","removeDelegatedListener","tagName","realEventName","eventNames","realEvent","events","furtherCallsPrevented","stopPropagation","Proxy","Reflect","setValue","isOpen","onCloseTransitionEnd","noOpenTransition","noCloseTransition","isClosed","setIsClosed","closeTimeoutRef","hasOpenClassName","setHasOpenClassName","isClosing","shouldRender","transitionClassNames","WEEKDAYS_FULL","MONTHS_FULL","MONTHS_FULL_LOWERCASE","month","getDayStart","datetime","getDayStartAt","toYearMonth","timestamp","getFullYear","getMonth","toIsoString","getHours","padStart","getMinutes","formatPastTimeShort","weekAgo","getDay","withYear","formatDate","formatMonthAndYear","isShort","formatHumanDate","noWeekdays","lowerFirst","upperFirst","weekAhead","weekDay","day","monthIndex","formatMediaDateTime","formatMediaDuration","hours","minutes","seconds","string","formatVoiceRecordDuration","durationInMs","milliseconds","formatDateToString","toLocaleString","year","isValidDate","MAX_MONTH_IN_YEAR","parseDateString","matchStringDate","matchEuropeStringDate","matchNumberDate","dateParts","findIndex","timestampPlusDay","MILISECONDS_IN_DAY","toUpperCase","replaceChatListIds","newIds","updateChatListIds","idsUpdate","replaceChats","newById","updateChat","chatUpdate","shouldOmitMinInfo","isMin","updatedChat","photos","updateChats","updatedById","addChats","addedById","updateChatListType","listType","currentListIds","listTypeKey","currentFolderList","updateChatListSecondaryInfo","info","totalCountKey","totalCount","totalChatCount","isFullyLoaded","updateCurrentMessageList","replaceChatMessages","updateMessageStore","replaceThreadParam","paramName","threadUpdate","updateThread","addMessages","addedByChatId","messagesByChatId","addChatMessagesById","newId","updateChatMessage","messageUpdate","updatedMessage","updateScheduledMessage","replaceScheduledMessages","deleteChatMessages","deletedForwardedPosts","isLinkedChannelPost","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","exitMessageSelectMode","updateStickerSets","category","sets","resultIds","updatedSets","stickerSet","setIds","updateStickerSet","stickerSetId","currentStickerSet","updateGifSearch","isNew","results","nextOffset","currentResults","newResults","currentIds","gif","replaceAnimatedEmojis","updateStickersForEmoji","remoteStickers","allStickers","uniqueIds","forEmoji","rebuildStickersForEmoji","replaceUsers","updateUser","userUpdate","contactUserIds","updatedUser","updateUsers","addUsers","updateSelectedUserId","deleteUser","MEMO_EMPTY_ARRAY","getComplexKey","updateGlobalSearch","searchStatePartial","updateGlobalSearchContent","currentContent","updateGlobalSearchResults","newFoundMessages","nextRate","resultsByType","newFoundMessagesById","foundIdsForType","foundIds","updateGlobalSearchFetchingStatus","prevFoundIds","newFoundIds","foundOrPrevFoundIds","nextOffsetId","newState","fetchingStatus","replaceLocalTextSearch","searchParams","updateLocalTextSearch","replaceLocalTextSearchResults","updateLocalTextSearchResults","orderFoundIds","replaceLocalMediaSearch","updateLocalMediaSearchType","currentType","updateLocalMediaSearchResults","replaceLocalMediaSearchResults","updateManagementProgress","updateManagement","newSettings","replaceThemeSettings","theme","themes","addNotifyException","notifyException","updateNotifySettings","peerType","isSilent","shouldShowPreviews","hasPrivateChatsMessagePreview","hasGroupMessagePreview","hasBroadcastMessagePreview","addBlockedContact","contactId","blocked","removeBlockedContact","updateTwoFaSettings","twoFaSettings","updateShippingOptions","shippingOptions","setRequestInfoId","setPaymentStep","step","setInvoiceMessageInfo","photoUrl","invoiceContent","setStripeCardInfo","cardInfo","setPaymentForm","form","setReceipt","receipt","messageInvoice","clearPayment","closeInvoice","isPaymentModalOpen","usePrevious","next","shouldSkipUndefined","HistoryWrapper","states","isHistoryChangedByUser","pushState","history","back","prevDeps","trimText","MenuItem","destructive","useLang","handleKeyDown","keyCode","data-char","origin","role","onKeyDown","ripples","setRipples","cleanUpDebounced","button","currentTarget","position","getBoundingClientRect","rippleSize","offsetWidth","x","clientX","y","clientY","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","labelText","htmlFor","subLabel","checked","blocking","onCheck","handleChange","captureEscKeyListener","captureKeyboardListener","onEsc","isAnimating","dispatchHeavyAnimationEvent","dispatchEvent","Event","handleAnimationStart","handleAnimationEnd","formatFixedNumber","number","toFixed","formatIntegerCompact","views","getFirstLetters","phrase","word","RE_NOT_LETTER","searchWords","haystack","needle","haystackWords","needleWord","haystackWord","Menu","containerRef","positionX","positionY","autoClose","footer","noCloseOnBackdrop","onCloseAnimationEnd","onClose","shouldSkipTransition","menuRef","backdropContainerRef","useShowTransition","useEffectWithPrevDeps","prevIsOpen","useKeyboardListNavigation","useVirtualBackdrop","bubbleClassName","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","getFromMemory","cancelProgress","mediaData","fullSize","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","IS_LANDSCAPE","isLandscape","windowSize","updateSizes","handleResize","vh","setProperty","utf16","len","RangeError","adapt","delta","numpoints","firsttime","k","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","getShippingError","errors","cur","currentInstance","animateSingle","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","parseInt","fromCodePoint","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","targetUser","targetMessage","textOptions","maxTextLength","unprocessed","processed","processPlaceholder","isEmbedded","renderChatContent","renderUserContent","renderOriginContent","showQuotes","messageText","renderMessageContent","renderProductContent","renderMigratedContent","replaceValue","placeholderPosition","MESSAGE_DELETED","openChatByUsername","isInitialized","HEX_COLOR_REGEX","lerp","start","end","interpolationRatio","colors","themeColors","hexToRgb","hex","g","applyColorAnimationStep","startIndex","endIndex","propertyColors","withAnimation","isDarkTheme","shouldAnimate","startAt","themeColorTag","querySelector","classList","remove","transition","updateAppBadge","setAppBadge","contains","animationLevel","messageTextSize","language","switchTheme","uiReadyState","contentKey","authPhoneNumber","authRememberMe","authError","shouldSkipUiLoaderTransition","legacySessionJson","dcID","legacySessionMainDc","parse","legacySessionMainKeyRaw","apiUpdate","authIsLoading","password","file","authIsLoadingQrCode","sessionId","sessionJson","setItem","mainDcId","legacySession","dcId","exportLegacySession","reset","langCachePrefix","langCacheVersion","init","connectionState","authNearestCountry","onUpdateApiReady","wasAuthReady","authState","authorizationState","isLoggingOut","authIsCodeViaApp","isCodeViaApp","authHint","hint","authQrCode","qrCode","saveSession","lastSyncTime","onUpdateAuthorizationState","onUpdateAuthorizationError","sync","signOut","onUpdateConnectionState","currentUser","updateLegacySessionUserId","onUpdateCurrentUser","showError","ServiceWorkerNoSupportError","setPrototypeOf","scriptUrl","handleWorkerMessage","register","INITIAL_STATE","isLeftColumnShown","activeChatFolder","recentEmojis","added","recent","featured","saved","topPeers","audioPlayer","notifications","activeSessions","messageSendKeyCombo","shouldSuggestStickers","light","isBlurred","patternColor","dark","privacy","updateCacheThrottled","isAllowed","reducedGlobal","reduceShowChatInfo","reduceUsers","reduceChats","reduceMessages","recentlyFoundChatIds","reduceSettings","loadCache","initialState","time","timeEnd","readCache","idsToSave","cid","chatIdsToSave","mainThread","replaceState","tabKey","SITE_FONTS","preloadFonts","font","fonts","load","preloadAvatars","mediaLoader","preloadTasks","main","telegramLogoPath","authCode","monkeyPath","authPassword","background","backgroundColor","hasCustomBackground","hasCustomBackgroundColor","isRightColumnShown","setIsUiReady","setShouldSkipUiLoaderTransition","isReady","markReady","useFlag","shouldRenderMask","safePreload","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","gotToAuthQrCode","setCountry","setPhoneNumber","isTouched","setIsTouched","lastSelection","setLastSelection","fullNumber","canSubmit","parseFullNumber","newFullNumber","suggestedCountry","selectedCountry","setSelectionRange","handlePhoneNumberChange","selectionStart","selectionEnd","handleKeepSessionChange","isAuthReady","onSubmit","InputText","Checkbox","Loading","AuthCode","useModuleLoader","AuthPassword","AuthRegister","AuthQrCode","AppInactive","appInactivePath","renderMain","disconnect","isInactive","markInactive","hasSession","hasLegacySession","TeactDOM"],"mappings":"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","file":"main.bcfa4c2bdab21d30f0f4.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\":\"3ae91f9dfe0fbe76ec81\",\"1\":\"c45de763c3ae52a66870\",\"3\":\"695679058d5b91efd31e\",\"4\":\"292f70afdd30b166608d\",\"5\":\"f9d2e347c4ce9bda504f\",\"6\":\"1712ed1ad0fe8fb0958d\",\"7\":\"04b88cbec82edb17cac3\",\"8\":\"11ac480e85dc7134677d\",\"9\":\"4196177a40c532909fe1\"}[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\":\"3ae91f9dfe0fbe76ec81\",\"1\":\"c45de763c3ae52a66870\",\"3\":\"695679058d5b91efd31e\",\"4\":\"292f70afdd30b166608d\",\"5\":\"f9d2e347c4ce9bda504f\",\"6\":\"1712ed1ad0fe8fb0958d\",\"7\":\"04b88cbec82edb17cac3\",\"8\":\"11ac480e85dc7134677d\",\"9\":\"4196177a40c532909fe1\"}[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 = 99);\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 = FC & {\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 = VirtualElementEmpty | VirtualElementText | VirtualElementTag | VirtualElementComponent;\nexport type VirtualRealElement = VirtualElementTag | 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 force cleaning as many objects as possible. Not sure this is needed at all.\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.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 // 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 })(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) {\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 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[]) {\n return useLayoutEffectBase(fastRaf, effect, dependencies);\n}\n\nexport function useLayoutEffect(effect: () => Function | void, dependencies?: any[]) {\n return useLayoutEffectBase(onTickEnd, effect, dependencies);\n}\n\nexport function useMemo(resolver: () => T, dependencies: any[]): 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 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, withDebug = false) {\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 && withDebug) {\n // eslint-disable-next-line no-console\n console.log(\n `[Teact.memo] ${Component.name}: 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","export const PAGE_TITLE = 'Telegram';\nexport const INACTIVE_MARKER = ' [Inactive]';\n\nexport const 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 GRAMJS_SESSION_ID_KEY = 'GramJs:sessionId';\nexport const LEGACY_SESSION_KEY = 'user_auth';\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-v4';\nexport const ASSET_CACHE_NAME = 'tt-assets';\n\nexport const API_UPDATE_THROTTLE = 300;\nexport const API_THROTTLE_RESET_UPDATES = new Set([\n 'newMessage', 'newScheduledMessage', 'deleteMessages', 'deleteScheduledMessages', 'deleteHistory',\n]);\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;\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 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 MEMOJI_STICKER_ID = 'MEMOJI_STICKER';\n\nexport const MENU_TRANSITION_DURATION = 200;\nexport const SLIDE_TRANSITION_DURATION = 450;\nexport const LAYERS_TRANSITION_DURATION = 450;\n\nexport const CONTENT_TYPES_FOR_QUICK_UPLOAD = 'image/png,image/gif,image/jpeg,video/mp4,video/avi,video/quicktime';\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,6})\\\\b([-a-zA-Z0-9()@:%_+.~#?&/=]*)';\nexport const RE_TME_LINK = /^(?:https?:\\/\\/)?(?:t\\.me\\/)([\\d\\w_]+)(?:\\/([\\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_PACK = 'android';\nexport const LANG_PACKS = ['android', 'ios', 'tdesktop', 'macos'];\nexport const TIPS_USERNAME = 'TelegramTips';\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 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('GLOBAL CONTAINERS', orderBy(Object.values(containers), 'DEBUG_updates', 'desc'));\n });\n}\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');\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 if (message.groupedId) {\n return `${noEmoji ? '' : '🖼 '}${text ? text.text : lang('lng_in_dlg_album')}`;\n }\n\n if (photo) {\n return `${noEmoji ? '' : '🖼 '}${text ? text.text : lang('AttachPhoto')}`;\n }\n\n if (video) {\n return `${noEmoji ? '' : '📹 '}${text ? text.text : lang(video.isGif ? 'AttachGif' : 'AttachVideo')}`;\n }\n\n if (sticker) {\n return `${sticker.emoji} ${lang('AttachSticker')} `;\n }\n\n if (audio) {\n const caption = [audio.title, audio.performer].filter(Boolean).join(' — ') || (text && text.text);\n return `${noEmoji ? '' : '🎧 '}${caption || lang('AttachMusic')}`;\n }\n\n if (voice) {\n return `${noEmoji ? '' : '🎤 '}${text ? text.text : lang('AttachAudio')}`;\n }\n\n if (document) {\n return `${noEmoji ? '' : '📎 '}${text ? text.text : 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 text.text;\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","import {\n ApiAudio, ApiMediaFormat, ApiMessage, ApiMessageSearchType, ApiPhoto, ApiVideo,\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\nexport type IDimensions = {\n width: number;\n height: number;\n};\n\ntype Target = 'micro' | 'pictogram' | 'inline' | 'viewerPreview' | 'viewerFull' | 'download';\n\nconst MAX_INLINE_VIDEO_SIZE = 10 * 1024 ** 2; // 10 MB\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 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 getMessageMediaThumbnail(message: ApiMessage) {\n const media = getMessagePhoto(message)\n || getMessageVideo(message)\n || getMessageDocument(message)\n || getMessageSticker(message)\n || getMessageWebPagePhoto(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\n if (!(photo || video || sticker || webPagePhoto || audio || voice || document)) {\n return undefined;\n }\n\n const base = getMessageKey(message);\n\n if (photo || webPagePhoto) {\n switch (target) {\n case 'micro':\n case 'pictogram':\n return `${base}?size=m`;\n case 'inline':\n if (hasMessageLocalBlobUrl(message)) {\n return undefined;\n }\n\n return `${base}?size=x`;\n case 'viewerPreview':\n return `${base}?size=x`;\n case 'viewerFull':\n return `${base}?size=z`;\n }\n }\n\n if (video) {\n switch (target) {\n case 'micro':\n case 'pictogram':\n return `${base}?size=m`;\n case 'inline':\n if (hasMessageLocalBlobUrl(message)) {\n return undefined;\n }\n\n if (canMessagePlayVideoInline(video)) {\n return getVideoOrAudioBaseHash(video, base);\n }\n\n return `${base}?size=z`;\n case 'viewerPreview':\n return `${base}?size=m`;\n case 'viewerFull':\n return getVideoOrAudioBaseHash(video, base);\n case 'download':\n return `${base}?download`;\n }\n }\n\n if (document) {\n switch (target) {\n case 'micro':\n case 'pictogram':\n case 'inline':\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 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 if (sticker && target === 'inline' && sticker.isAnimated) {\n return ApiMediaFormat.Lottie;\n } else if (video && IS_PROGRESSIVE_SUPPORTED && (\n (target === 'viewerFull') || (target === 'inline' && canMessagePlayVideoInline(video))\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 getMessageMediaFilename(message: ApiMessage) {\n const { photo, video, webPage } = message.content;\n\n if (photo || (webPage && webPage.photo)) {\n return `photo${message.date}.jpeg`;\n }\n\n if (video) {\n return video.fileName;\n }\n\n return undefined;\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 canMessagePlayVideoInline(video: ApiVideo): boolean {\n return video.isGif || video.isRound || video.size <= MAX_INLINE_VIDEO_SIZE;\n}\n\nexport function getChatMediaMessageIds(\n messages: Record, listedIds: number[], reverseOrder = false,\n) {\n const ids = getMessageContentIds(messages, listedIds, 'media');\n\n return reverseOrder ? ids.reverse() : ids;\n}\n\nexport function getPhotoFullDimensions(photo: ApiPhoto): IDimensions | 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): IDimensions | 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): IDimensions | undefined {\n if (video.width && video.height) {\n return video as IDimensions;\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,\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 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;\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 { ApiDocument } from './messages';\n\nexport * from './users';\nexport * from './chats';\nexport * from './messages';\nexport * from './updates';\nexport * from './media';\nexport * from './payments';\nexport * from './settings';\n\nexport interface ApiOnProgress {\n (\n progress: number, // Float between 0 and 1.\n ...args: any[]\n ): void;\n\n isCanceled?: boolean;\n acceptsBuffer?: boolean;\n}\n\nexport interface ApiAttachment {\n blobUrl: string;\n filename: string;\n mimeType: string;\n size: number;\n quick?: {\n width: number;\n height: number;\n duration?: number;\n };\n voice?: {\n duration: number;\n waveform: number[];\n };\n previewBlobUrl?: string;\n}\n\nexport interface ApiWallpaper {\n slug: string;\n document: ApiDocument;\n}\n\nexport interface ApiSession {\n hash: string;\n isCurrent: boolean;\n isOfficialApp: boolean;\n isPasswordPending: boolean;\n deviceModel: string;\n platform: string;\n systemVersion: string;\n appName: string;\n appVersion: string;\n dateCreated: number;\n dateActive: number;\n ip: string;\n country: string;\n region: string;\n}\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\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} 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 && 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 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 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 isMessageEditable = (\n (isChatWithSelf || Date.now() - 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 canDeleteForAll = canDelete && !isServiceNotification && (\n (isPrivate && !isChatWithSelf)\n || (isBasicGroup && (\n isOwn || getHasAdminRight(chat, 'deleteMessages')\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 canDeleteForAll,\n canForward,\n canFaveSticker,\n canUnfaveSticker,\n canCopy,\n canCopyLink,\n canSelect,\n };\n}\n\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 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);\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 { RightColumnContent } from '../../types';\n\nimport { IS_MOBILE_SCREEN } 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 } = global;\n\n const isPollResults = selectIsPollResultsOpen(global);\n const isSearch = Boolean(!IS_MOBILE_SCREEN && 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 ) : 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","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","import {\n MOBILE_SCREEN_MAX_WIDTH,\n MOBILE_SCREEN_LANDSCAPE_MAX_HEIGHT,\n MOBILE_SCREEN_LANDSCAPE_MAX_WIDTH,\n} from '../config';\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: 'Mac OS' | 'iOS' | 'Windows' | 'Android' | 'Linux' | undefined;\n\n if (macosPlatforms.indexOf(platform) !== -1) {\n os = 'Mac OS';\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 === 'Mac OS';\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);\n\nexport const IS_TOUCH_ENV = window.matchMedia('(pointer: coarse)').matches;\n// Keep in mind the landscape orientation\nexport const IS_MOBILE_SCREEN = window.innerWidth <= MOBILE_SCREEN_MAX_WIDTH || (\n window.innerWidth <= MOBILE_SCREEN_LANDSCAPE_MAX_WIDTH && window.innerHeight <= MOBILE_SCREEN_LANDSCAPE_MAX_HEIGHT\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 = 'filter' in (document.createElement('canvas').getContext('2d') || {});\n\nexport const DPR = window.devicePixelRatio || 1;\n\nexport const MASK_IMAGE_DISABLED = true;\n\nlet 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","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","import Worker from 'worker-loader!./worker';\n\nimport { 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, sessionInfo = '') {\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: [sessionInfo],\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","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","// 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 const request = new Request(key);\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 const request = new Request(key);\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 { 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 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","export default __webpack_public_path__ + \"en-extra.e73049da90714ecdae3233e8ffa74d39.json\";","export default __webpack_public_path__ + \"es-extra.b80575cdf988e1a7e3a915abe97f63b4.json\";","export default __webpack_public_path__ + \"it-extra.78e5568451a888818c7e2209e05a9602.json\";","export default __webpack_public_path__ + \"pl-extra.38fd67a6c26e58f5c912568332c7c074.json\";","export default __webpack_public_path__ + \"ru-extra.5761b75bfbe92bb46eb8bba9acbdbb4c.json\";","import { ApiLangPack } from '../api/types';\n\nimport { DEBUG, LANG_CACHE_NAME, LANG_PACKS } from '../config';\nimport * as cacheApi from './cacheApi';\nimport { callApi } from '../api/gramjs';\nimport { createCallbackManager } from './callbacks';\nimport { mapValues } from './iteratees';\n\nimport enExtraJson from '../assets/lang/en-extra.json';\nimport esExtraJson from '../assets/lang/es-extra.json';\nimport itExtraJson from '../assets/lang/it-extra.json';\nimport plExtraJson from '../assets/lang/pl-extra.json';\nimport ruExtraJson from '../assets/lang/ru-extra.json';\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}\n\nconst EXTRA_PACK_PATHS: Record = {\n en: enExtraJson as unknown as string,\n es: esExtraJson as unknown as string,\n it: itExtraJson as unknown as string,\n pl: plExtraJson as unknown as string,\n ru: ruExtraJson as unknown as string,\n};\n\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;\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 cached = cache.get(`${key}_${value}_${format}`);\n if (cached) {\n return cached;\n }\n }\n\n if (!langPack) {\n return key;\n }\n\n const langString = langPack[key];\n if (!langString) {\n return key;\n }\n\n const template = langString[typeof value === 'number' ? getPluralOption(value) : 'value'];\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 cache.set(`${key}_${value}_${format}`, result);\n return result;\n }\n\n return template;\n};\n\nexport async function setLanguage(langCode: string, callback?: NoneToVoidFunction) {\n if (langPack && langCode === currentLangCode) {\n if (callback) {\n callback();\n }\n\n return;\n }\n\n const newLangPack = await fetchFromCacheOrRemote(langCode);\n if (!newLangPack) {\n return;\n }\n\n if (EXTRA_PACK_PATHS[langCode]) {\n try {\n const response = await fetch(EXTRA_PACK_PATHS[langCode]);\n const pairs = await response.json();\n const extraLangPack = mapValues(pairs, (value, key) => ({ key, value }));\n\n Object.assign(newLangPack, extraLangPack);\n } catch (err) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.error(err);\n }\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\n if (callback) {\n callback();\n }\n\n runCallbacks(langPack);\n}\n\nasync function fetchFromCacheOrRemote(langCode: string): Promise {\n const cached = await cacheApi.fetch(LANG_CACHE_NAME, langCode, cacheApi.Type.Json);\n if (cached) {\n return cached;\n }\n\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\nfunction getPluralOption(amount: number) {\n const optionIndex = currentLangCode && PLURAL_RULES[currentLangCode as keyof typeof PLURAL_RULES]\n ? PLURAL_RULES[currentLangCode as keyof typeof PLURAL_RULES](amount)\n : 0;\n\n return PLURAL_OPTIONS[optionIndex];\n}\n\nfunction processTemplate(template: string, value: any) {\n return template.replace(/%\\d?\\$?[sdf@]/, String(value));\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","// 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 { 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","// 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 Caledonia\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 {\n ApiLanguage, ApiMessage, ApiStickerSet, ApiShippingAddress,\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';\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 interface ISettings extends NotifySettings, Record {\n theme: ThemeKey;\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: (\n 'en' | 'ar' | 'be' | 'ca' | 'nl' | 'fr' | 'de' | 'id' | 'it' | 'ko' | 'ms' | 'fa' | 'pl' | 'pt-br' | 'ru' | 'es'\n | 'tr' | 'uk' | 'uz'\n );\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}\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 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","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, GLOBAL_STATE_CACHE_KEY } 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;\nconst STARTUP_TIMEOUT = 5000;\n\nconst startedAt = Date.now();\nlet isReloading = false;\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 (isReloading) {\n return;\n }\n\n // For startup errors, we just clean the cache and refresh the page\n if (Date.now() - startedAt <= STARTUP_TIMEOUT && localStorage.getItem(GLOBAL_STATE_CACHE_KEY)) {\n localStorage.removeItem(GLOBAL_STATE_CACHE_KEY);\n\n isReloading = true;\n window.location.reload();\n\n return;\n }\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","import React from '../../../lib/teact/teact';\nimport EMOJI_REGEX, { removeVS16s } from '../../../lib/twemojiRegex';\n\nimport { RE_LINK_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 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 IS_EMOJI_SUPPORTED\n ? {emoji}\n : (\n \n ),\n );\n }\n if (type === 'html') {\n emojiResult.push(\n IS_EMOJI_SUPPORTED\n ? emoji\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, 'ig');\nconst RE_MENTION = /@[\\w\\d_-]+/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) || []), ...(part.match(RE_MENTION) || [])];\n if (!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","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.filter((prop) => currentProps[prop] !== newProps[prop]);\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 { 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 } 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 { 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\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// Load notification settings from the api\nasync function loadNotificationSettings() {\n const [result] = await Promise.all([\n callApi('fetchNotificationSettings'),\n callApi('fetchNotificationExceptions'),\n ]);\n\n if (!result) return;\n setGlobal(replaceSettings(getGlobal(), result));\n}\n\nexport async function subscribe() {\n loadNotificationSettings();\n\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 const global = getGlobal();\n\n if (selectIsChatMuted(chat, selectNotifySettings(global), selectNotifyExceptions(global)) || chat.isNotJoined) {\n return false;\n }\n\n // Dont show notification for active chat if client has focus\n if (isActive && document.hasFocus()) return false;\n\n switch (chat.type) {\n case 'chatTypePrivate':\n case 'chatTypeSecret':\n return Boolean(global.settings.byKey.hasPrivateChatsNotifications);\n case 'chatTypeBasicGroup':\n case 'chatTypeSuperGroup':\n return Boolean(global.settings.byKey.hasGroupNotifications);\n case 'chatTypeChannel':\n return Boolean(global.settings.byKey.hasBroadcastNotifications);\n }\n return false;\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 targetUserId: actionTargetUserId,\n targetChatId: actionTargetChatId,\n } = messageAction || {};\n const actionTargetUser = actionTargetUserId ? selectUser(global, actionTargetUserId) : 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 actionTargetUser,\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 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 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) {\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();\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 if (wasOnlineDate > today) {\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 today.setHours(0, 0, 0, 0);\n if (wasOnlineDate > yesterday) {\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) {\n return orderBy(userIds, (id) => {\n const now = Date.now() / 1000;\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';\nimport { NotifyException, NotifySettings } from '../../types';\n\nimport { ARCHIVED_FOLDER_ID } from '../../config';\nimport { orderBy } from '../../util/iteratees';\nimport { getUserFirstOrLastName } from './users';\nimport { LangFn } from '../../hooks/useLang';\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 const { inviteLink } = chat.fullInfo || {};\n\n if (inviteLink && inviteLink.length) {\n return inviteLink;\n }\n\n return username ? `t.me/${username}` : '';\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(chat: ApiChat) {\n if (chat.currentUserBannedRights && chat.currentUserBannedRights.sendMessages) {\n return 'You are not allowed to send messages in this chat.';\n }\n if (chat.defaultBannedRights && chat.defaultBannedRights.sendMessages) {\n return 'Sending messages is not allowed in this chat.';\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\nexport function getChatOrder(chat: ApiChat) {\n return Math.max(chat.joinDate || 0, chat.lastMessage ? chat.lastMessage.date : 0);\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 (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 && 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 += 3e9; // ~100 years in seconds\n }\n\n if (priorityIds && priorityIds.includes(id)) {\n // Assuming that last message date can't be less than 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 priority += Date.now() + (priorityIds.length - priorityIds.indexOf(id));\n }\n\n return priority;\n }, 'desc');\n}\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 { 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) {\n const eventName = resolveEventName(propName, element);\n if (canUseEventDelegation(eventName, element)) {\n addDelegatedListener(eventName, element, handler);\n } else {\n element.addEventListener(eventName, handler);\n }\n}\n\nexport function removeEventListener(element: HTMLElement, propName: string, handler: Handler) {\n const eventName = resolveEventName(propName, element);\n if (canUseEventDelegation(eventName, element)) {\n removeDelegatedListener(eventName, element);\n } else {\n element.removeEventListener(eventName, handler);\n }\n}\n\nfunction resolveEventName(propName: string, element: HTMLElement) {\n const eventName = propName.replace(/^on/, '').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) {\n return (\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, 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 { 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 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 const isClosing = Boolean(closeTimeoutRef.current);\n const shouldRender = isOpen || isClosing;\n const transitionClassNames = buildClassName(\n className && 'opacity-transition',\n className,\n ((hasOpenClassName && !noCloseTransition) || (noCloseTransition && isOpen)) && 'open',\n shouldRender && 'shown',\n isClosing && 'closing',\n );\n\n return {\n shouldRender,\n transitionClassNames,\n };\n};\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) {\n return date.toLocaleString(\n 'en-US',\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 { 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\nexport function updateChat(\n global: GlobalState, chatId: number, chatUpdate: Partial, photo?: ApiPhoto,\n): GlobalState {\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 global;\n }\n\n return replaceChats(global, {\n ...byId,\n [chatId]: updatedChat,\n });\n}\n\nexport function updateChats(global: GlobalState, updatedById: Record): GlobalState {\n Object.keys(updatedById).forEach((id) => {\n global = updateChat(global, Number(id), updatedById[Number(id)]);\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 Object.keys(addedById).map(Number).forEach((id) => {\n if (!byId[id] || (byId[id].isMin && !addedById[id].isMin)) {\n global = updateChat(global, id, addedById[id]);\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 { GlobalState, MessageListType, Thread } from '../../global/types';\nimport { ApiMessage, ApiThreadInfo, MAIN_THREAD_ID } from '../../api/types';\nimport { FocusDirection } from '../../types';\n\nimport { 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\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): GlobalState {\n return {\n ...global,\n messages: {\n ...global.messages,\n // TODO Support stack navigation\n messageLists: chatId ? [{ chatId, threadId, type }] : undefined,\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 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\n messageIds.forEach((messageId) => {\n if (listedIds && listedIds.includes(messageId)) {\n listedIds = listedIds.filter((id) => id !== messageId);\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 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\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}\nexport function updateUser(global: GlobalState, userId: number, userUpdate: Partial): GlobalState {\n const { byId } = global.users;\n const { hash, userIds: contactUserIds } = global.contactList || {};\n const user = byId[userId];\n const shouldOmitMinInfo = userUpdate.isMin && user && !user.isMin;\n const updatedUser = {\n ...user,\n ...(shouldOmitMinInfo ? omit(userUpdate, ['isMin', 'accessHash']) : userUpdate),\n };\n\n if (!updatedUser.id || !updatedUser.type) {\n return global;\n }\n\n if (updatedUser.isContact && (contactUserIds && !contactUserIds.includes(userId))) {\n global = {\n ...global,\n contactList: {\n hash: hash || 0,\n userIds: [userId, ...contactUserIds],\n },\n };\n }\n\n return replaceUsers(global, {\n ...byId,\n [userId]: updatedUser,\n });\n}\n\nexport function updateUsers(global: GlobalState, updatedById: Record): GlobalState {\n Object.keys(updatedById).map(Number).forEach((id) => {\n global = updateUser(global, id, updatedById[id]);\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 Object.keys(addedById).map(Number).forEach((id) => {\n if (!byId[id] || (byId[id].isMin && !addedById[id].isMin)) {\n global = updateUser(global, id, addedById[id]);\n }\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","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';\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 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 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 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","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","\nexport const HistoryWrapper: {\n pushState(data: any): void;\n back(): void;\n states: any[];\n isHistoryChangedByUser: boolean;\n} = {\n states: [],\n isHistoryChangedByUser: true,\n pushState(data: any) {\n this.states.push(data);\n\n window.history.pushState(data, '');\n },\n back() {\n this.isHistoryChangedByUser = false;\n window.history.back();\n this.states.pop();\n },\n};\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 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 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};\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}) => {\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","import { useEffect } from '../lib/teact/teact';\n\nconst ANIMATION_START_EVENT = 'tt-event-heavy-animation-start';\nconst ANIMATION_END_EVENT = 'tt-event-heavy-animation-end';\n\nlet timeout: number | undefined;\nlet isAnimating = false;\n\nexport const dispatchHeavyAnimationEvent = (duration: number) => {\n document.dispatchEvent(new Event(ANIMATION_START_EVENT));\n isAnimating = true;\n\n if (timeout) {\n clearTimeout(timeout);\n timeout = undefined;\n }\n\n timeout = window.setTimeout(() => {\n isAnimating = false;\n document.dispatchEvent(new Event(ANIMATION_END_EVENT));\n timeout = undefined;\n }, duration);\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","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","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 { 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';\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 useEffectWithPrevDeps(([prevIsOpen]) => {\n if (prevIsOpen !== undefined) {\n dispatchHeavyAnimationEvent(ANIMATION_DURATION);\n }\n }, [isOpen]);\n\n const handleKeyDown = useKeyboardListNavigation(menuRef, isOpen, autoClose ? onClose : undefined);\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","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","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 { 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_MOBILE_SCREEN } from './environment';\n\ntype IDimensions = {\n width: number;\n height: number;\n};\n\nconst IS_LANDSCAPE = IS_MOBILE_SCREEN && isLandscape();\n\nlet windowSize = updateSizes();\n\nconst handleResize = throttle(() => {\n windowSize = updateSizes();\n\n if ((isMobileScreen() !== IS_MOBILE_SCREEN) || (IS_MOBILE_SCREEN && IS_LANDSCAPE !== isLandscape())) {\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};\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 { withGlobal } from '../../lib/teact/teactn';\nimport convertPunycode from '../../lib/punycode';\nimport { GlobalActions } from '../../global/types';\n\nimport { DEBUG, RE_TME_INVITE_LINK, RE_TME_LINK } from '../../config';\nimport { pick } from '../../util/iteratees';\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\ntype DispatchProps = Pick;\n\nconst SafeLink: FC = ({\n url,\n text,\n className,\n children,\n isRtl,\n toggleSafeLinkModal,\n openTelegramLink,\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(withGlobal(\n undefined,\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'toggleSafeLinkModal', 'openTelegramLink',\n ]),\n)(SafeLink));\n","import { useEffect } from '../lib/teact/teact';\nimport usePrevious from './usePrevious';\n\nexport default (cb: (args: PT) => void, dependencies: T) => {\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);\n};\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","const 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 getShippingError(errors: Record) {\n return Object.values(errors).reduce((acc, cur) => {\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);\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);\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 targetUser?: ApiUser,\n targetMessage?: ApiMessage,\n targetChatId?: number,\n options: ActionMessageTextOptions = {},\n) {\n if (!message.content.action) {\n return [];\n }\n const { text } = message.content.action;\n const content: TextPart[] = [];\n const textOptions: ActionMessageTextOptions = { ...options, maxTextLength: 16 };\n\n let unprocessed: string;\n let processed = processPlaceholder(\n text,\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 targetUser\n ? renderUserContent(targetUser, options.asPlain)\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 showQuotes = text && !photo && !video && !document && !sticker;\n let messageText = trimText(text as string, options.maxTextLength)!;\n\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 if (options.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[] {\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 content.push(replaceValue);\n content.push(text.substring(placeholderPosition + placeholder.length));\n\n return content;\n}\n","export interface ApiPhotoSize {\n type: 's' | 'm' | 'x' | 'y' | 'z';\n width: number;\n height: number;\n}\n\nexport interface ApiThumbnail {\n dataUri: string;\n height: number;\n width: number;\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}\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 targetUserId?: number;\n targetChatId?: number;\n type: 'historyClear' | 'other';\n photo?: ApiPhoto;\n}\n\nexport interface ApiWebPage {\n id: number;\n url: string;\n displayUrl: string;\n siteName?: string;\n title?: string;\n description?: string;\n photo?: ApiPhoto;\n hasDocument?: true;\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 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.\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 { 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 { 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__ + \"eb485bee0c151237dba8.worker.js\");\n};","module.exports = function() {\n return new Worker(__webpack_public_path__ + \"01705582fc3eca0e007b.worker.js\");\n};","module.exports = function() {\n return new Worker(__webpack_public_path__ + \"0dbbe0a906f6c2adf071.worker.js\");\n};","module.exports = function() {\n return new Worker(__webpack_public_path__ + \"a66075669d8d0ac2d740.worker.js\");\n};","import { addReducer } from '../../../lib/teact/teactn';\n\nimport {\n IS_ANDROID, IS_IOS, IS_SAFARI, IS_TOUCH_ENV,\n} from '../../../util/environment';\nimport { setLanguage } from '../../../util/langProvider';\nimport switchTheme from '../../../util/switchTheme';\nimport { HistoryWrapper } from '../../../util/history';\n\naddReducer('init', (global) => {\n const {\n theme, animationLevel, messageTextSize, language,\n } = global.settings.byKey;\n\n setLanguage(language);\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 > 0);\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 }\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 HistoryWrapper.pushState({\n type: 'login',\n contentKey: 'authCode',\n });\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('setShouldSkipUiLoaderTransition', (global, actions, payload) => {\n const { shouldSkipUiLoaderTransition } = payload;\n\n return {\n ...global,\n shouldSkipUiLoaderTransition,\n };\n});\n","import {\n addReducer, getDispatch, getGlobal, setGlobal,\n} from '../../../lib/teact/teactn';\n\nimport { GlobalState } from '../../../global/types';\n\nimport {\n LANG_CACHE_NAME,\n CUSTOM_BG_CACHE_NAME,\n GRAMJS_SESSION_ID_KEY,\n MEDIA_CACHE_NAME,\n MEDIA_CACHE_NAME_AVATARS,\n MEDIA_PROGRESSIVE_CACHE_NAME,\n LEGACY_SESSION_KEY,\n} from '../../../config';\nimport { initApi, callApi } from '../../../api/gramjs';\nimport { unsubscribe } from '../../../util/notifications';\nimport * as cacheApi from '../../../util/cacheApi';\nimport { HistoryWrapper } from '../../../util/history';\nimport { updateAppBadge } from '../../../util/appBadge';\n\naddReducer('initApi', (global: GlobalState, actions) => {\n let sessionInfo = localStorage.getItem(GRAMJS_SESSION_ID_KEY) || undefined;\n\n if (!sessionInfo) {\n const legacySessionJson = localStorage.getItem(LEGACY_SESSION_KEY);\n if (legacySessionJson) {\n const { dcID: legacySessionMainDc } = JSON.parse(legacySessionJson);\n const legacySessionMainKeyRaw = localStorage.getItem(`dc${legacySessionMainDc}_auth_key`);\n if (legacySessionMainKeyRaw) {\n const legacySessionMainDcKey = legacySessionMainKeyRaw.replace(/\"/g, '');\n sessionInfo = `session:${legacySessionMainDc}:${legacySessionMainDcKey}`;\n }\n }\n }\n\n void initApi(actions.apiUpdate, sessionInfo);\n});\n\naddReducer('setAuthPhoneNumber', (global, actions, payload) => {\n const { phoneNumber } = payload!;\n\n void callApi('provideAuthPhoneNumber', phoneNumber);\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('gotToAuthQrCode', (global) => {\n void callApi('restartAuthWithQr');\n\n HistoryWrapper.pushState({\n type: 'login',\n contentKey: 'authQr',\n });\n\n return {\n ...global,\n authIsLoadingQrCode: true,\n authError: undefined,\n };\n});\n\naddReducer('saveSession', (global, actions, payload) => {\n const { sessionId, sessionJson } = payload!;\n localStorage.setItem(GRAMJS_SESSION_ID_KEY, sessionId);\n\n exportLegacySession(sessionJson, global.currentUserId!);\n});\n\naddReducer('signOut', () => {\n (async () => {\n await unsubscribe();\n await callApi('destroy');\n\n getDispatch().reset();\n })();\n});\n\naddReducer('reset', () => {\n localStorage.removeItem(GRAMJS_SESSION_ID_KEY);\n clearLegacySession();\n\n cacheApi.clear(MEDIA_CACHE_NAME);\n cacheApi.clear(MEDIA_CACHE_NAME_AVATARS);\n cacheApi.clear(MEDIA_PROGRESSIVE_CACHE_NAME);\n 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 cacheApi.clear(`${langCachePrefix}${i === 0 ? '' : i}`);\n }\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\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\nfunction exportLegacySession(sessionJson: string, currentUserId: number) {\n const { mainDcId, keys } = JSON.parse(sessionJson);\n const legacySession = { dcID: mainDcId, id: currentUserId };\n localStorage.setItem(LEGACY_SESSION_KEY, JSON.stringify(legacySession));\n localStorage.setItem('dc', mainDcId);\n Object.keys(keys).forEach((dcId) => {\n localStorage.setItem(`dc${dcId}_auth_key`, `\"${keys[dcId]}\"`);\n });\n}\n\nfunction clearLegacySession() {\n localStorage.removeItem('dc5_auth_key');\n localStorage.removeItem('dc4_auth_key');\n localStorage.removeItem('dc3_auth_key');\n localStorage.removeItem('dc2_auth_key');\n localStorage.removeItem('dc1_auth_key');\n localStorage.removeItem('dc');\n localStorage.removeItem(LEGACY_SESSION_KEY);\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 ApiUpdateCurrentUser,\n} from '../../../api/types';\nimport { DEBUG, LEGACY_SESSION_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') {\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 'updateCurrentUser':\n onUpdateCurrentUser(update);\n break;\n\n case 'error':\n if (update.error.message === 'SESSION_REVOKED') {\n actions.signOut();\n }\n\n actions.showError({ error: update.error });\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 const { sessionId, sessionJson } = update;\n if (sessionId && global.authRememberMe) {\n getDispatch().saveSession({ sessionId, sessionJson });\n }\n\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 onUpdateCurrentUser(update: ApiUpdateCurrentUser) {\n const { currentUser } = update;\n\n setGlobal({\n ...updateUser(getGlobal(), currentUser.id, currentUser),\n currentUserId: currentUser.id,\n });\n\n updateLegacySessionUserId(currentUser.id);\n}\n\nfunction updateLegacySessionUserId(currentUserId: number) {\n const legacySessionJson = localStorage.getItem(LEGACY_SESSION_KEY);\n if (!legacySessionJson) return;\n\n const legacySession = JSON.parse(legacySessionJson);\n legacySession.id = currentUserId;\n\n localStorage.setItem(LEGACY_SESSION_KEY, JSON.stringify(legacySession));\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_SERVICE_WORKER_SUPPORTED } from './environment';\nimport { notifyClientReady } from './notifications';\n\ntype WorkerAction = {\n type: string;\n payload: Record;\n};\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 getDispatch().showError({ error: { message: 'SERVICE_WORKER_DISABLED' } });\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';\n\nimport {\n ANIMATION_LEVEL_DEFAULT, DARK_THEME_PATTERN_COLOR, DEFAULT_MESSAGE_TEXT_SIZE_PX, DEFAULT_PATTERN_COLOR,\n} from '../config';\n\nexport const INITIAL_STATE: GlobalState = {\n isLeftColumnShown: true,\n isChatInfoShown: false,\n uiReadyState: 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 },\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 gifs: {\n saved: {},\n search: {},\n },\n\n globalSearch: {},\n\n localTextSearch: {\n byChatThreadKey: {},\n },\n\n localMediaSearch: {\n byChatId: {},\n },\n\n management: {\n byChatId: {},\n },\n\n topPeers: {},\n\n mediaViewer: {},\n\n audioPlayer: {},\n\n forwardMessages: {},\n\n pollResults: {},\n\n payment: {},\n\n notifications: [],\n\n errors: [],\n\n activeSessions: [],\n\n settings: {\n byKey: {\n messageTextSize: DEFAULT_MESSAGE_TEXT_SIZE_PX,\n animationLevel: ANIMATION_LEVEL_DEFAULT,\n messageSendKeyCombo: 'enter',\n theme: 'light',\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","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 { 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 GRAMJS_SESSION_ID_KEY,\n MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN, GLOBAL_STATE_CACHE_USER_LIST_LIMIT,\n} from '../config';\nimport { IS_MOBILE_SCREEN } from '../util/environment';\nimport { pick } from '../util/iteratees';\nimport { INITIAL_STATE } from './initial';\nimport { selectCurrentMessageList } from '../modules/selectors';\n\nconst UPDATE_THROTTLE = 1000;\n\nconst updateCacheThrottled = throttle(updateCache, UPDATE_THROTTLE, false);\n\nlet isAllowed = false;\n\nexport function initCache() {\n if (GLOBAL_STATE_CACHE_DISABLED) {\n return;\n }\n\n addReducer('saveSession', () => {\n isAllowed = true;\n addCallback(updateCacheThrottled);\n });\n\n addReducer('reset', () => {\n isAllowed = false;\n removeCallback(updateCacheThrottled);\n localStorage.removeItem(GLOBAL_STATE_CACHE_KEY);\n });\n}\n\nexport function loadCache(initialState: GlobalState) {\n if (!GLOBAL_STATE_CACHE_DISABLED) {\n const hasActiveSession = localStorage.getItem(GRAMJS_SESSION_ID_KEY);\n if (hasActiveSession) {\n isAllowed = true;\n addCallback(updateCacheThrottled);\n return readCache(initialState);\n } else {\n isAllowed = false;\n }\n }\n\n return undefined;\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 for new settings 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 }\n\n return {\n ...initialState,\n ...cached,\n };\n}\n\nfunction updateCache() {\n onIdle(() => {\n if (!isAllowed) {\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 'chatFolders',\n 'topPeers',\n 'recentEmojis',\n 'push',\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 };\n\n const json = JSON.stringify(reducedGlobal);\n localStorage.setItem(GLOBAL_STATE_CACHE_KEY, json);\n });\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_MOBILE_SCREEN ? undefined : [{\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","import { addReducer } from '../lib/teact/teactn';\n\nimport { INITIAL_STATE } from './initial';\nimport { initCache, loadCache } from './cache';\nimport { cloneDeep } from '../util/iteratees';\nimport { selectCurrentMessageList } from '../modules/selectors';\n\ninitCache();\n\naddReducer('init', () => {\n const initial = cloneDeep(INITIAL_STATE);\n const newGlobal = loadCache(initial) || initial;\n\n const currentMessageList = selectCurrentMessageList(newGlobal) || {};\n window.history.replaceState(currentMessageList, '');\n\n return newGlobal;\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 useOnChange from '../../hooks/useOnChange';\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 } 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;\nconst TRANSITION_TIME = 400;\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 shouldSkipUiLoaderTransition,\n setIsUiReady,\n setShouldSkipUiLoaderTransition,\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 useOnChange(() => {\n if (shouldSkipUiLoaderTransition) {\n setTimeout(() => {\n setShouldSkipUiLoaderTransition({ shouldSkipUiLoaderTransition: false });\n }, TRANSITION_TIME);\n }\n }, [shouldSkipUiLoaderTransition]);\n\n return (\n
\n {children}\n {shouldRenderMask && !shouldSkipUiLoaderTransition && (\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 } = global.settings.byKey;\n const { background, backgroundColor } = global.settings.themes[theme] || {};\n\n return {\n shouldSkipUiLoaderTransition: global.shouldSkipUiLoaderTransition,\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', 'setShouldSkipUiLoaderTransition']),\n)(UiLoader);\n","import React, {\n FC, useState, memo, useCallback, useRef,\n} from '../../lib/teact/teact';\n\nimport { countryList } from '../../util/phoneNumber';\nimport searchWords from '../../util/searchWords';\nimport buildClassName from '../../util/buildClassName';\nimport renderText from '../common/helpers/renderText';\n\nimport DropdownMenu from '../ui/DropdownMenu';\nimport MenuItem from '../ui/MenuItem';\nimport Spinner from '../ui/Spinner';\n\nimport './CountryCodeInput.scss';\nimport { ANIMATION_END_DELAY } from '../../config';\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 // 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 No countries matched your filter.\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 { GlobalActions, GlobalState } from '../../global/types';\nimport React, {\n FC, memo, useCallback, useEffect, useLayoutEffect, useRef, useState,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\nimport { 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';\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;\ntype DispatchProps = Pick;\n\nconst MIN_NUMBER_LENGTH = 10;\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 setAuthPhoneNumber,\n setAuthRememberMe,\n loadNearestCountry,\n clearAuthError,\n gotToAuthQrCode,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef(null);\n\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\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 const suggestedCountry = getCountryFromPhoneNumber(newFullNumber);\n const selectedCountry = !country || (suggestedCountry && suggestedCountry.id !== country.id)\n ? suggestedCountry\n : country;\n\n if (!newFullNumber.length) {\n setCountry(undefined);\n } else if (!country || (selectedCountry && selectedCountry.code !== country.code)) {\n setCountry(selectedCountry);\n }\n\n setPhoneNumber(formatPhoneNumber(newFullNumber, selectedCountry));\n }, [country]);\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 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 parseFullNumber(value);\n }, [authError, clearAuthError, 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

Sign in to Telegram

\n

\n Please confirm your country and\n
enter your phone number.\n

\n
\n \n \n \n {canSubmit && (\n isAuthReady ? (\n \n ) : (\n \n )\n )}\n {isAuthReady && (\n \n )}\n \n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => pick(global, [\n 'connectionState',\n 'authState',\n 'authPhoneNumber',\n 'authIsLoading',\n 'authIsLoadingQrCode',\n 'authError',\n 'authRememberMe',\n 'authNearestCountry',\n ]),\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'setAuthPhoneNumber',\n 'setAuthRememberMe',\n 'clearAuthError',\n 'loadNearestCountry',\n 'gotToAuthQrCode',\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","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 AuthQrCodeAsync: FC = () => {\n const AuthQrCode = useModuleLoader(Bundles.Auth, 'AuthQrCode');\n\n return AuthQrCode ? : ;\n};\n\nexport default memo(AuthQrCodeAsync);\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';\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.async';\n\nimport './Auth.scss';\n\ntype StateProps = Pick;\ntype DispatchProps = Pick;\n\nconst Auth: FC = ({ authState, reset, initApi }) => {\n useEffect(() => {\n reset();\n initApi();\n }, [reset, initApi]);\n\n useEffect(() => {\n }, []);\n\n switch (authState) {\n case 'authorizationStateWaitCode':\n return ;\n case 'authorizationStateWaitPassword':\n return ;\n case 'authorizationStateWaitRegistration':\n return ;\n case 'authorizationStateWaitQrCode':\n return ;\n case 'authorizationStateWaitPhoneNumber':\n default:\n return ;\n }\n};\n\nexport default memo(withGlobal(\n (global): StateProps => pick(global, ['authState']),\n (global, actions): DispatchProps => pick(actions, ['reset', 'initApi']),\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 {\n GRAMJS_SESSION_ID_KEY, INACTIVE_MARKER, LEGACY_SESSION_KEY, PAGE_TITLE,\n} 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';\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 const hasSession = localStorage.getItem(GRAMJS_SESSION_ID_KEY);\n const hasLegacySession = localStorage.getItem(LEGACY_SESSION_KEY);\n\n return (hasSession || hasLegacySession) ? 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 6556f3940..c2cf6210c 100644 --- a/dist/report.html +++ b/dist/report.html @@ -3,7 +3,7 @@ - telegram-t [12 Jun 2021 at 04:40] + telegram-t [12 Jun 2021 at 17:20] diff --git a/dist/serviceWorker.js.map b/dist/serviceWorker.js.map index 3fe69f0c3..e10bd0a2a 100644 --- a/dist/serviceWorker.js.map +++ b/dist/serviceWorker.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./src/config.ts","webpack:///./src/serviceWorker/progressive.ts","webpack:///./src/util/generateIdFor.ts","webpack:///./src/util/schedulers.ts","webpack:///./src/serviceWorker/pushNotification.ts","webpack:///./src/serviceWorker.ts","webpack:///./src/serviceWorker/assetCache.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","Set","window","innerHeight","requestStates","Map","async","respondForProgressive","e","url","request","range","headers","bytes","exec","start","Number","originalEnd","end","match","fileSize","mimeType","Response","Uint8Array","buffer","status","statusText","cacheKey","cachedArrayBuffer","cachedHeaders","cache","self","caches","open","Promise","all","then","arrayBuffer","undefined","json","fetchFromCache","partInfo","params","clientId","client","clients","messageId","store","id","String","Math","random","replace","generateIdFor","requestState","promise","race","ms","resolve","setTimeout","reject","Error","assign","set","catch","finally","delete","postMessage","type","requestPart","err","process","fullSize","partSize","min","byteLength","arrayBufferPart","slice","put","Request","JSON","stringify","saveToCache","Boolean","addEventListener","result","data","clickBuffer","shownNotifications","getChatId","custom","from_id","parseInt","chat_id","channel_id","getMessageId","msg_id","showNotification","chatId","body","title","registration","icon","badge","vibrate","focusChatMessage","payload","focus","error","ASSET_CACHE_PATTERN","waitUntil","skipWaiting","claim","respondWith","includes","startsWith","cached","remote","fetch","clone","respondWithCache","getPushData","mute","True","notification","description","getNotificationData","has","close","clientsInScope","matchAll","filter","scope","map","openWindow","length","newClient","notifyClients","source","add"],"mappings":"aACE,IAAIA,EAAmB,GAGvB,SAASC,EAAoBC,GAG5B,GAAGF,EAAiBE,GACnB,OAAOF,EAAiBE,GAAUC,QAGnC,IAAIC,EAASJ,EAAiBE,GAAY,CACzCG,EAAGH,EACHI,GAAG,EACHH,QAAS,IAUV,OANAI,EAAQL,GAAUM,KAAKJ,EAAOD,QAASC,EAAQA,EAAOD,QAASF,GAG/DG,EAAOE,GAAI,EAGJF,EAAOD,QAKfF,EAAoBQ,EAAIF,EAGxBN,EAAoBS,EAAIV,EAGxBC,EAAoBU,EAAI,SAASR,EAASS,EAAMC,GAC3CZ,EAAoBa,EAAEX,EAASS,IAClCG,OAAOC,eAAeb,EAASS,EAAM,CAAEK,YAAY,EAAMC,IAAKL,KAKhEZ,EAAoBkB,EAAI,SAAShB,GACX,oBAAXiB,QAA0BA,OAAOC,aAC1CN,OAAOC,eAAeb,EAASiB,OAAOC,YAAa,CAAEC,MAAO,WAE7DP,OAAOC,eAAeb,EAAS,aAAc,CAAEmB,OAAO,KAQvDrB,EAAoBsB,EAAI,SAASD,EAAOE,GAEvC,GADU,EAAPA,IAAUF,EAAQrB,EAAoBqB,IAC/B,EAAPE,EAAU,OAAOF,EACpB,GAAW,EAAPE,GAA8B,iBAAVF,GAAsBA,GAASA,EAAMG,WAAY,OAAOH,EAChF,IAAII,EAAKX,OAAOY,OAAO,MAGvB,GAFA1B,EAAoBkB,EAAEO,GACtBX,OAAOC,eAAeU,EAAI,UAAW,CAAET,YAAY,EAAMK,MAAOA,IACtD,EAAPE,GAA4B,iBAATF,EAAmB,IAAI,IAAIM,KAAON,EAAOrB,EAAoBU,EAAEe,EAAIE,EAAK,SAASA,GAAO,OAAON,EAAMM,IAAQC,KAAK,KAAMD,IAC9I,OAAOF,GAIRzB,EAAoB6B,EAAI,SAAS1B,GAChC,IAAIS,EAAST,GAAUA,EAAOqB,WAC7B,WAAwB,OAAOrB,EAAgB,SAC/C,WAA8B,OAAOA,GAEtC,OADAH,EAAoBU,EAAEE,EAAQ,IAAKA,GAC5BA,GAIRZ,EAAoBa,EAAI,SAASiB,EAAQC,GAAY,OAAOjB,OAAOkB,UAAUC,eAAe1B,KAAKuB,EAAQC,IAGzG/B,EAAoBkC,EAAI,GAIjBlC,EAAoBA,EAAoBmC,EAAI,G,sCC9CX,IAAIC,IAAI,CAChD,aAAc,sBAAuB,iBAAkB,0BAA2B,kBAM9C,oBAAXC,QAA0BA,OAAOC,YCpB5D,MAKMC,EAAgB,IAAIC,IAEnBC,eAAeC,EAAsBC,GAC1C,MAAM,IAAEC,GAAQD,EAAEE,QACZC,EAAQH,EAAEE,QAAQE,QAAQ9B,IAAI,SAC9B+B,EAAQ,wBAAwBC,KAAKH,GAAS,IAC9CI,EAAQC,OAAOH,EAAM,IACrBI,EAAcD,OAAOH,EAAM,IAEjC,IAAIK,EAAMD,EAMV,KALKC,GAAQA,EAAMH,EAAQ,EAdH,UAetBG,EAAMH,EAfgB,OAeY,GAItB,IAAVA,GAAuB,IAARG,EAAW,CAC5B,MAAMC,EAAQX,EAAEE,QAAQD,IAAIU,MAAM,oCAC5BC,EAAWD,GAASH,OAAOG,EAAM,IACjCE,EAAWF,GAASA,EAAM,GAEhC,GAAIC,GAAYC,EACd,OAAO,IAAIC,SAAS,IAAIC,WAAW,GAAGC,OAAQ,CAC5CC,OAAQ,IACRC,WAAY,kBACZd,QAAS,CACP,CAAC,gBAAkB,aAAYQ,GAC/B,CAAC,gBAAiB,SAClB,CAAC,iBAAkB,KACnB,CAAC,eAAgBC,MAMzB,MAAMM,EAAY,GAAElB,WAAaM,SAAaG,KACvCU,EAAmBC,SA0D5BvB,eAA8BqB,GAC5B,MAAMG,QAAcC,KAAKC,OAAOC,KD7FU,wBC+F1C,OAAOC,QAAQC,IAAI,CACjBL,EAAMX,MAASQ,EAAF,qBAA+BS,KAAMrD,GAAOA,EAAIA,EAAEsD,mBAAgBC,GAC/ER,EAAMX,MAASQ,EAAF,iBAA2BS,KAAMrD,GAAOA,EAAIA,EAAEwD,YAASD,KA/DeE,CAAeb,GASpG,GAAIC,EACF,OAAO,IAAIN,SAASM,EAAmB,CACrCH,OAAQ,IACRC,WAAY,kBACZd,QAASiB,IAIb,IAAIY,EACJ,IACEA,QAyDJnC,eACEE,EACAkC,GAEA,IAAKlC,EAAEmC,SACL,OAIF,MAAMC,QAAeb,KAAKc,QAAQ/D,IAAI0B,EAAEmC,UACxC,IAAKC,EACH,OAGF,MAAME,ECzJQC,KACd,IAAIC,EAEJ,GACEA,EAAKC,OAAOC,KAAKC,UAAUC,QAAQ,KAAM,YAClCL,EAAMjD,eAAekD,IAE9B,OAAOA,GDkJWK,CAAcjD,GAC1BkD,EAAe,GAEfC,EAAUrB,QAAQsB,KAAK,EEhCTC,EFlGD,IEkGgB,IAAIvB,QAASwB,IAChDC,WAAW,IAAMD,IAAWD,MFgCNrB,KAAK,IAAMF,QAAQ0B,OAAO,IAAIC,MAAM,wBACxD,IAAI3B,QAAkB,CAACwB,EAASE,KAC9BjF,OAAOmF,OAAOR,EAAc,CAAEI,UAASE,eEnCvBH,MFoDpB,OAbArD,EAAc2D,IAAIjB,EAAWQ,GAC7BC,EACGS,MAAM,QACNC,QAAQ,KACP7D,EAAc8D,OAAOpB,KAGzBF,EAAOuB,YAAY,CACjBC,KAAM,cACNtB,YACAJ,WAGKa,EA9FYc,CAAY7D,EAAG,CAAEC,MAAKM,QAAOG,QAC9C,MAAOoD,GD5ETC,ECmFA,IAAK9B,EACH,OAAO,IAAInB,SAAS,GAAI,CACtBG,OAAQ,IACRC,WAAY,qCAIhB,MAAM,YAAEW,EAAF,SAAemC,EAAf,SAAyBnD,GAAaoB,EAEtCgC,EAAWvB,KAAKwB,IAAIxD,EAAMH,EAAQ,EAAGsB,EAAYsC,YACvDzD,EAAMH,EAAQ0D,EAAW,EACzB,MAAMG,EAAkBvC,EAAYwC,MAAM,EAAGJ,GACvC7D,EAAU,CACd,CAAC,gBAAkB,SAAQG,KAASG,KAAOsD,KAC3C,CAAC,gBAAiB,SAClB,CAAC,iBAAkBvB,OAAOwB,IAC1B,CAAC,eAAgBpD,IAOnB,OAJyCoD,GD/EN,QC+E2CvD,EApFvD,SAyGzBZ,eAA2BqB,EAAkBU,EAA0BzB,GACrE,MAAMkB,QAAcC,KAAKC,OAAOC,KDtGU,wBCwGnCC,QAAQC,IAAI,CACjBL,EAAMgD,IAAI,IAAIC,QAAWpD,EAAF,qBAAgC,IAAIL,SAASe,IACpEP,EAAMgD,IAAI,IAAIC,QAAWpD,EAAF,iBAA4B,IAAIL,SAAS0D,KAAKC,UAAUrE,OAzB/EsE,CAAYvD,EAAUiD,EAAiBhE,GAGlC,IAAIU,SAASsD,EAAiB,CACnCnD,OAAQ,IACRC,WAAY,kBACZd,Y,IGhHCuE,EH+KLpD,KAAKqD,iBAAiB,UAAY5E,IAChC,MAAM,KAAE4D,EAAF,UAAQtB,EAAR,OAAmBuC,GAAW7E,EAAE8E,KAMtC,GAAa,iBAATlB,EAAyB,CAC3B,MAAMd,EAAelD,EAActB,IAAIgE,GACnCQ,GACFA,EAAaI,QAAQ2B,M,SGzLtBF,K,SAAAA,E,WAAAA,M,KA4BL,MAAMI,EAAgD,GAChDC,EAAqB,IAAIvF,IAc/B,SAASwF,EAAUH,GACjB,OAAIA,EAAKI,OAAOC,QACPC,SAASN,EAAKI,OAAOC,QAAS,IAGnCL,EAAKI,OAAOG,SAC8B,EAArCD,SAASN,EAAKI,OAAOG,QAAS,IAEnCP,EAAKI,OAAOI,YACiC,EAAxCF,SAASN,EAAKI,OAAOI,WAAY,SAD1C,EAMF,SAASC,EAAaT,GACpB,GAAKA,EAAKI,OAAOM,OACjB,OAAOJ,SAASN,EAAKI,OAAOM,OAAQ,IAYtC,SAASC,GAAiB,OACxBC,EADwB,UAExBpD,EAFwB,KAGxBqD,EAHwB,MAIxBC,IAEA,OAAOrE,KAAKsE,aAAaJ,iBAAiBG,EAAO,CAC/CD,OACAb,KAAM,CACJY,SACApD,aAEFwD,KAAM,mBACNC,MAAO,mBACPC,QAAS,CAAC,IAAK,IAAK,OA6BxBlG,eAAemG,EAAiB7D,EAAsB0C,GACpD,MAAM,OACJY,EADI,UAEJpD,GACEwC,EACJ,GAAKY,EAAL,CACAtD,EAAOuB,YAAY,CACjBC,KAAM,eACNsC,QAAS,CACPR,SACApD,eAIJ,UACQF,EAAO+D,QACb,MAAOC,GJ/HTrC,IKAF,MAAMsC,EAAsB,yDAE5B9E,KAAKqD,iBAAiB,UAAY5E,IAOhCA,EAAEsG,UAAU/E,KAAKgF,iBAGnBhF,KAAKqD,iBAAiB,WAAa5E,IAOjCA,EAAEsG,UCPK/E,KAAKC,OAAOkC,ONcW,cKN9B1D,EAAEsG,UAAU/E,KAAKc,QAAQmE,WAI3BjF,KAAKqD,iBAAiB,QAAU5E,IAC9BA,EAAEyG,YAAY,MACZ,MAAM,IAAExG,GAAQD,EAAEE,QAElB,OAAID,EAAIyG,SAAS,iBACR3G,EAAsBC,GAG3BC,EAAI0G,WAAW,SAAW1G,EAAIU,MAAM0F,GCnCrCvG,eAAgCE,GACrC,MAAMsB,QAAcC,KAAKC,OAAOC,KN4BF,aM3BxBmF,QAAetF,EAAMX,MAAMX,EAAEE,SAEnC,GAAI0G,EACF,OAAOA,EAGT,MAAMC,QAAeC,MAAM9G,EAAEE,SAG7B,OAFAoB,EAAMgD,IAAItE,EAAEE,QAAS2G,EAAOE,SAErBF,EDyBIG,CAAiBhH,GAGnB8G,MAAM9G,EAAEE,UAXH,MAgBhBqB,KAAKqD,iBAAiB,QD6Cf,SAAoB5E,GASzB,MAAM8E,EAnER,SAAqB9E,GACnB,IACE,OAAOA,EAAE8E,KAAK/C,OACd,MAAOqE,GAKP,eA2DWa,CAAYjH,GAGzB,IAAK8E,GAAQA,EAAKoC,OAASvC,EAAQwC,KAAM,OAEzC,MAAMC,EAzCR,SAA6BtC,GAC3B,MAAO,CACLY,OAAQT,EAAUH,GAClBxC,UAAWiD,EAAaT,GACxBc,MAAOd,EAAKc,OJnEQ,gBIoEpBD,KAAMb,EAAKuC,aAoCQC,CAAoBxC,GAGrCE,EAAmBuC,IAAIH,EAAa9E,WACtC0C,EAAmBtB,OAAO0D,EAAa9E,WAIzCtC,EAAEsG,UAAUb,EAAiB2B,OClE/B7F,KAAKqD,iBAAiB,qBD6Ff,SAAiC5E,GAEtCA,EAAEoH,aAAaI,QACf,MAAM,KAAE1C,GAAS9E,EAAEoH,aAkBnBpH,EAAEsG,UAjBoBxG,WACpB,MACM2H,SADgBlG,KAAKc,QAAQqF,SAAS,CAAE9D,KAAM,YACrB+D,OAAQvF,GAAWA,EAAOnC,MAAQsB,KAAKsE,aAAa+B,OAKnF,GAJA5H,EAAEsG,UAAU5E,QAAQC,IAAI8F,EAAeI,IAAKzF,IAC1C2C,EAAY3C,EAAOI,IAAMsC,EAClBmB,EAAiB7D,EAAQ0C,QAE7BvD,KAAKc,QAAQyF,YAAcL,EAAeM,OAAS,EAAG,OAG3D,MAAMC,QAAkBzG,KAAKc,QAAQyF,WAbxB/D,8BAcTiE,IAEFjD,EAAYiD,EAAUxF,IAAMsC,IAIpBmD,OCjHd1G,KAAKqD,iBAAiB,WDoHf,SAA6B5E,GAKlC,IAAKA,EAAE8E,KAAM,OACb,MAAMoD,EAASlI,EAAEkI,OAQjB,GAPoB,gBAAhBlI,EAAE8E,KAAKlB,MAELmB,EAAYmD,EAAO1F,MACrBxC,EAAEsG,UAAUL,EAAiBiC,EAAQnD,EAAYmD,EAAO1F,aACjDuC,EAAYmD,EAAO1F,KAGV,2BAAhBxC,EAAE8E,KAAKlB,KAAmC,CAE5C,MAAMwD,EAAiCpH,EAAE8E,KAAKoB,QAC9ClG,EAAEsG,UAAUb,EAAiB2B,IAC7BpC,EAAmBmD,IAAIf,EAAa9E","file":"serviceWorker.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 = 0);\n","export const PAGE_TITLE = 'Telegram';\nexport const INACTIVE_MARKER = ' [Inactive]';\n\nexport const 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 GRAMJS_SESSION_ID_KEY = 'GramJs:sessionId';\nexport const LEGACY_SESSION_KEY = 'user_auth';\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-v3';\nexport const ASSET_CACHE_NAME = 'tt-assets';\n\nexport const API_UPDATE_THROTTLE = 300;\nexport const API_THROTTLE_RESET_UPDATES = new Set([\n 'newMessage', 'newScheduledMessage', 'deleteMessages', 'deleteScheduledMessages', 'deleteHistory',\n]);\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;\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 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 MEMOJI_STICKER_ID = 'MEMOJI_STICKER';\n\nexport const MENU_TRANSITION_DURATION = 200;\nexport const SLIDE_TRANSITION_DURATION = 450;\nexport const LAYERS_TRANSITION_DURATION = 450;\n\nexport const CONTENT_TYPES_FOR_QUICK_UPLOAD = 'image/png,image/gif,image/jpeg,video/mp4,video/avi,video/quicktime';\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,6})\\\\b([-a-zA-Z0-9()@:%_+.~#?&/=]*)';\nexport const RE_TME_LINK = /^(?:https?:\\/\\/)?(?:t\\.me\\/)([\\d\\w_]+)(?:\\/([\\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_PACK = 'android';\nexport const LANG_PACKS = ['android', 'ios', 'tdesktop', 'macos'];\nexport const TIPS_USERNAME = 'TelegramTips';\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 { pause } from '../util/schedulers';\nimport generateIdFor from '../util/generateIdFor';\nimport {\n DEBUG,\n MEDIA_CACHE_MAX_BYTES,\n MEDIA_PROGRESSIVE_CACHE_DISABLED,\n MEDIA_PROGRESSIVE_CACHE_NAME,\n} from '../config';\n\ndeclare const self: ServiceWorkerGlobalScope;\n\ntype PartInfo = {\n type: 'PartInfo';\n arrayBuffer: ArrayBuffer;\n mimeType: 'string';\n fullSize: number;\n};\n\ntype RequestStates = {\n resolve: (response: PartInfo) => void;\n reject: () => void;\n};\n\nconst MB = 1024 * 1024;\nconst DEFAULT_PART_SIZE = 0.5 * MB;\nconst MAX_END_TO_CACHE = 2 * MB - 1; // We only cache the first 2 MB of each file\nconst PART_TIMEOUT = 30000;\n\nconst requestStates = new Map();\n\nexport async function respondForProgressive(e: FetchEvent) {\n const { url } = e.request;\n const range = e.request.headers.get('range');\n const bytes = /^bytes=(\\d+)-(\\d+)?$/g.exec(range || '')!;\n const start = Number(bytes[1]);\n const originalEnd = Number(bytes[2]);\n\n let end = originalEnd;\n if (!end || (end - start + 1) > DEFAULT_PART_SIZE) {\n end = start + DEFAULT_PART_SIZE - 1;\n }\n\n // Optimization for Safari\n if (start === 0 && end === 1) {\n const match = e.request.url.match(/fileSize=(\\d+)&mimeType=([\\w/]+)/);\n const fileSize = match && Number(match[1]);\n const mimeType = match && match[2];\n\n if (fileSize && mimeType) {\n return new Response(new Uint8Array(2).buffer, {\n status: 206,\n statusText: 'Partial Content',\n headers: [\n ['Content-Range', `bytes 0-1/${fileSize}`],\n ['Accept-Ranges', 'bytes'],\n ['Content-Length', '2'],\n ['Content-Type', mimeType],\n ],\n });\n }\n }\n\n const cacheKey = `${url}?start=${start}&end=${end}`;\n const [cachedArrayBuffer, cachedHeaders] = !MEDIA_PROGRESSIVE_CACHE_DISABLED ? await fetchFromCache(cacheKey) : [];\n\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log(\n `FETCH PROGRESSIVE ${cacheKey} (request: ${start}-${originalEnd}) CACHED: ${Boolean(cachedArrayBuffer)}`,\n );\n }\n\n if (cachedArrayBuffer) {\n return new Response(cachedArrayBuffer, {\n status: 206,\n statusText: 'Partial Content',\n headers: cachedHeaders,\n });\n }\n\n let partInfo;\n try {\n partInfo = await requestPart(e, { url, start, end });\n } catch (err) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.error('FETCH PROGRESSIVE', err);\n }\n }\n\n if (!partInfo) {\n return new Response('', {\n status: 500,\n statusText: 'Failed to fetch progressive part',\n });\n }\n\n const { arrayBuffer, fullSize, mimeType } = partInfo;\n\n const partSize = Math.min(end - start + 1, arrayBuffer.byteLength);\n end = start + partSize - 1;\n const arrayBufferPart = arrayBuffer.slice(0, partSize);\n const headers = [\n ['Content-Range', `bytes ${start}-${end}/${fullSize}`],\n ['Accept-Ranges', 'bytes'],\n ['Content-Length', String(partSize)],\n ['Content-Type', mimeType],\n ];\n\n if (!MEDIA_PROGRESSIVE_CACHE_DISABLED && partSize <= MEDIA_CACHE_MAX_BYTES && end < MAX_END_TO_CACHE) {\n saveToCache(cacheKey, arrayBufferPart, headers);\n }\n\n return new Response(arrayBufferPart, {\n status: 206,\n statusText: 'Partial Content',\n headers,\n });\n}\n\n// We can not cache 206 responses: https://github.com/GoogleChrome/workbox/issues/1644#issuecomment-638741359\nasync function fetchFromCache(cacheKey: string) {\n const cache = await self.caches.open(MEDIA_PROGRESSIVE_CACHE_NAME);\n\n return Promise.all([\n cache.match(`${cacheKey}&type=arrayBuffer`).then((r) => (r ? r.arrayBuffer() : undefined)),\n cache.match(`${cacheKey}&type=headers`).then((r) => (r ? r.json() : undefined)),\n ]);\n}\n\nasync function saveToCache(cacheKey: string, arrayBuffer: ArrayBuffer, headers: HeadersInit) {\n const cache = await self.caches.open(MEDIA_PROGRESSIVE_CACHE_NAME);\n\n return Promise.all([\n cache.put(new Request(`${cacheKey}&type=arrayBuffer`), new Response(arrayBuffer)),\n cache.put(new Request(`${cacheKey}&type=headers`), new Response(JSON.stringify(headers))),\n ]);\n}\n\nasync function requestPart(\n e: FetchEvent,\n params: { url: string; start: number; end: number },\n): Promise {\n if (!e.clientId) {\n return undefined;\n }\n\n // eslint-disable-next-line no-restricted-globals\n const client = await self.clients.get(e.clientId);\n if (!client) {\n return undefined;\n }\n\n const messageId = generateIdFor(requestStates);\n const requestState = {} as RequestStates;\n\n const promise = Promise.race([\n pause(PART_TIMEOUT).then(() => Promise.reject(new Error('ERROR_PART_TIMEOUT'))),\n new Promise((resolve, reject) => {\n Object.assign(requestState, { resolve, reject });\n }),\n ]);\n\n requestStates.set(messageId, requestState);\n promise\n .catch(() => undefined)\n .finally(() => {\n requestStates.delete(messageId);\n });\n\n client.postMessage({\n type: 'requestPart',\n messageId,\n params,\n });\n\n return promise;\n}\n\nself.addEventListener('message', (e) => {\n const { type, messageId, result } = e.data as {\n type: string;\n messageId: string;\n result: PartInfo;\n };\n\n if (type === 'partResponse') {\n const requestState = requestStates.get(messageId);\n if (requestState) {\n requestState.resolve(result);\n }\n }\n});\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","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","import { APP_NAME, DEBUG } from '../config';\n\ndeclare const self: ServiceWorkerGlobalScope;\n\nenum Boolean {\n True = '1',\n False = '0'\n}\n\ntype PushData = {\n custom: {\n msg_id?: string;\n channel_id?: string;\n chat_id?: string;\n from_id?: string;\n };\n mute: Boolean;\n badge: Boolean;\n loc_key: string;\n loc_args: string[];\n random_id: number;\n title: string;\n description: string;\n};\n\ntype NotificationData = {\n messageId?: number;\n chatId?: number;\n title: string;\n body: string;\n};\n\nconst clickBuffer: Record = {};\nconst shownNotifications = new Set();\n\nfunction getPushData(e: PushEvent | Notification): PushData | undefined {\n try {\n return e.data.json();\n } catch (error) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('[SW] Unable to parse push notification data', e.data);\n }\n return undefined;\n }\n}\n\nfunction getChatId(data: PushData) {\n if (data.custom.from_id) {\n return parseInt(data.custom.from_id, 10);\n }\n // Chats and channels have negative IDs\n if (data.custom.chat_id) {\n return parseInt(data.custom.chat_id, 10) * -1;\n }\n if (data.custom.channel_id) {\n return parseInt(data.custom.channel_id, 10) * -1;\n }\n return undefined;\n}\n\nfunction getMessageId(data: PushData) {\n if (!data.custom.msg_id) return undefined;\n return parseInt(data.custom.msg_id, 10);\n}\n\nfunction getNotificationData(data: PushData): NotificationData {\n return {\n chatId: getChatId(data),\n messageId: getMessageId(data),\n title: data.title || APP_NAME,\n body: data.description,\n };\n}\n\nfunction showNotification({\n chatId,\n messageId,\n body,\n title,\n}: NotificationData) {\n return self.registration.showNotification(title, {\n body,\n data: {\n chatId,\n messageId,\n },\n icon: 'icon-192x192.png',\n badge: 'icon-192x192.png',\n vibrate: [200, 100, 200],\n });\n}\n\nexport function handlePush(e: PushEvent) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('[SW] Push received event', e);\n if (e.data) {\n // eslint-disable-next-line no-console\n console.log('[SW] Push received with data', e.data.json());\n }\n }\n const data = getPushData(e);\n\n // Do not show muted notifications\n if (!data || data.mute === Boolean.True) return;\n\n const notification = getNotificationData(data);\n\n // Dont show already triggered notification\n if (shownNotifications.has(notification.messageId)) {\n shownNotifications.delete(notification.messageId);\n return;\n }\n\n e.waitUntil(showNotification(notification));\n}\n\nasync function focusChatMessage(client: WindowClient, data: { chatId?: number; messageId?: number }) {\n const {\n chatId,\n messageId,\n } = data;\n if (!chatId) return;\n client.postMessage({\n type: 'focusMessage',\n payload: {\n chatId,\n messageId,\n },\n });\n // Catch \"focus not allowed\" DOM Exceptions\n try {\n await client.focus();\n } catch (error) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.warn('[SW] ', error);\n }\n }\n}\n\nexport function handleNotificationClick(e: NotificationEvent) {\n const appUrl = process.env.APP_URL!;\n e.notification.close(); // Android needs explicit close.\n const { data } = e.notification;\n const notifyClients = async () => {\n const clients = await self.clients.matchAll({ type: 'window' }) as WindowClient[];\n const clientsInScope = clients.filter((client) => client.url === self.registration.scope);\n e.waitUntil(Promise.all(clientsInScope.map((client) => {\n clickBuffer[client.id] = data;\n return focusChatMessage(client, data);\n })));\n if (!self.clients.openWindow || clientsInScope.length > 0) return undefined;\n\n // If there is no opened client we need to open one and wait until it is fully loaded\n const newClient = await self.clients.openWindow(appUrl);\n if (newClient) {\n // Store notification data until client is fully loaded\n clickBuffer[newClient.id] = data;\n }\n return undefined;\n };\n e.waitUntil(notifyClients());\n}\n\nexport function handleClientMessage(e: ExtendableMessageEvent) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('[SW] New message from client', e);\n }\n if (!e.data) return;\n const source = e.source as WindowClient;\n if (e.data.type === 'clientReady') {\n // focus on chat message when client is fully ready\n if (clickBuffer[source.id]) {\n e.waitUntil(focusChatMessage(source, clickBuffer[source.id]));\n delete clickBuffer[source.id];\n }\n }\n if (e.data.type === 'newMessageNotification') {\n // store messageId for already shown notification\n const notification: NotificationData = e.data.payload;\n e.waitUntil(showNotification(notification));\n shownNotifications.add(notification.messageId);\n }\n}\n","import { DEBUG } from './config';\nimport { respondForProgressive } from './serviceWorker/progressive';\nimport { respondWithCache, clearAssetCache } from './serviceWorker/assetCache';\nimport { handlePush, handleNotificationClick, handleClientMessage } from './serviceWorker/pushNotification';\n\ndeclare const self: ServiceWorkerGlobalScope;\n\nconst ASSET_CACHE_PATTERN = /[0-9a-f]{20}.*\\.(js|css|woff2?|svg|png|jpg|json|wasm)$/;\n\nself.addEventListener('install', (e) => {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('ServiceWorker installed');\n }\n\n // Activate worker immediately\n e.waitUntil(self.skipWaiting());\n});\n\nself.addEventListener('activate', (e) => {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('ServiceWorker activated');\n }\n\n // Become available to all pages\n e.waitUntil(clearAssetCache());\n e.waitUntil(self.clients.claim());\n});\n\n// eslint-disable-next-line no-restricted-globals\nself.addEventListener('fetch', (e: FetchEvent) => {\n e.respondWith((() => {\n const { url } = e.request;\n\n if (url.includes('/progressive/')) {\n return respondForProgressive(e);\n }\n\n if (url.startsWith('http') && url.match(ASSET_CACHE_PATTERN)) {\n return respondWithCache(e);\n }\n\n return fetch(e.request);\n })());\n});\n\n\nself.addEventListener('push', handlePush);\nself.addEventListener('notificationclick', handleNotificationClick);\nself.addEventListener('message', handleClientMessage);\n","import { ASSET_CACHE_NAME } from '../config';\n\ndeclare const self: ServiceWorkerGlobalScope;\n\nexport async function respondWithCache(e: FetchEvent) {\n const cache = await self.caches.open(ASSET_CACHE_NAME);\n const cached = await cache.match(e.request);\n\n if (cached) {\n return cached;\n }\n\n const remote = await fetch(e.request);\n cache.put(e.request, remote.clone());\n\n return remote;\n}\n\nexport function clearAssetCache() {\n return self.caches.delete(ASSET_CACHE_NAME);\n}\n"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./src/config.ts","webpack:///./src/serviceWorker/progressive.ts","webpack:///./src/util/generateIdFor.ts","webpack:///./src/util/schedulers.ts","webpack:///./src/serviceWorker/pushNotification.ts","webpack:///./src/serviceWorker.ts","webpack:///./src/serviceWorker/assetCache.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","Set","window","innerHeight","requestStates","Map","async","respondForProgressive","e","url","request","range","headers","bytes","exec","start","Number","originalEnd","end","match","fileSize","mimeType","Response","Uint8Array","buffer","status","statusText","cacheKey","cachedArrayBuffer","cachedHeaders","cache","self","caches","open","Promise","all","then","arrayBuffer","undefined","json","fetchFromCache","partInfo","params","clientId","client","clients","messageId","store","id","String","Math","random","replace","generateIdFor","requestState","promise","race","ms","resolve","setTimeout","reject","Error","assign","set","catch","finally","delete","postMessage","type","requestPart","err","process","fullSize","partSize","min","byteLength","arrayBufferPart","slice","put","Request","JSON","stringify","saveToCache","Boolean","addEventListener","result","data","clickBuffer","shownNotifications","getChatId","custom","from_id","parseInt","chat_id","channel_id","getMessageId","msg_id","showNotification","chatId","body","title","registration","icon","badge","vibrate","focusChatMessage","payload","focus","error","ASSET_CACHE_PATTERN","waitUntil","skipWaiting","claim","respondWith","includes","startsWith","cached","remote","fetch","clone","respondWithCache","getPushData","mute","True","notification","description","getNotificationData","has","close","clientsInScope","matchAll","filter","scope","map","openWindow","length","newClient","notifyClients","source","add"],"mappings":"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","file":"serviceWorker.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 = 0);\n","export const PAGE_TITLE = 'Telegram';\nexport const INACTIVE_MARKER = ' [Inactive]';\n\nexport const 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 GRAMJS_SESSION_ID_KEY = 'GramJs:sessionId';\nexport const LEGACY_SESSION_KEY = 'user_auth';\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-v4';\nexport const ASSET_CACHE_NAME = 'tt-assets';\n\nexport const API_UPDATE_THROTTLE = 300;\nexport const API_THROTTLE_RESET_UPDATES = new Set([\n 'newMessage', 'newScheduledMessage', 'deleteMessages', 'deleteScheduledMessages', 'deleteHistory',\n]);\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;\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 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 MEMOJI_STICKER_ID = 'MEMOJI_STICKER';\n\nexport const MENU_TRANSITION_DURATION = 200;\nexport const SLIDE_TRANSITION_DURATION = 450;\nexport const LAYERS_TRANSITION_DURATION = 450;\n\nexport const CONTENT_TYPES_FOR_QUICK_UPLOAD = 'image/png,image/gif,image/jpeg,video/mp4,video/avi,video/quicktime';\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,6})\\\\b([-a-zA-Z0-9()@:%_+.~#?&/=]*)';\nexport const RE_TME_LINK = /^(?:https?:\\/\\/)?(?:t\\.me\\/)([\\d\\w_]+)(?:\\/([\\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_PACK = 'android';\nexport const LANG_PACKS = ['android', 'ios', 'tdesktop', 'macos'];\nexport const TIPS_USERNAME = 'TelegramTips';\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 { pause } from '../util/schedulers';\nimport generateIdFor from '../util/generateIdFor';\nimport {\n DEBUG,\n MEDIA_CACHE_MAX_BYTES,\n MEDIA_PROGRESSIVE_CACHE_DISABLED,\n MEDIA_PROGRESSIVE_CACHE_NAME,\n} from '../config';\n\ndeclare const self: ServiceWorkerGlobalScope;\n\ntype PartInfo = {\n type: 'PartInfo';\n arrayBuffer: ArrayBuffer;\n mimeType: 'string';\n fullSize: number;\n};\n\ntype RequestStates = {\n resolve: (response: PartInfo) => void;\n reject: () => void;\n};\n\nconst MB = 1024 * 1024;\nconst DEFAULT_PART_SIZE = 0.5 * MB;\nconst MAX_END_TO_CACHE = 2 * MB - 1; // We only cache the first 2 MB of each file\nconst PART_TIMEOUT = 30000;\n\nconst requestStates = new Map();\n\nexport async function respondForProgressive(e: FetchEvent) {\n const { url } = e.request;\n const range = e.request.headers.get('range');\n const bytes = /^bytes=(\\d+)-(\\d+)?$/g.exec(range || '')!;\n const start = Number(bytes[1]);\n const originalEnd = Number(bytes[2]);\n\n let end = originalEnd;\n if (!end || (end - start + 1) > DEFAULT_PART_SIZE) {\n end = start + DEFAULT_PART_SIZE - 1;\n }\n\n // Optimization for Safari\n if (start === 0 && end === 1) {\n const match = e.request.url.match(/fileSize=(\\d+)&mimeType=([\\w/]+)/);\n const fileSize = match && Number(match[1]);\n const mimeType = match && match[2];\n\n if (fileSize && mimeType) {\n return new Response(new Uint8Array(2).buffer, {\n status: 206,\n statusText: 'Partial Content',\n headers: [\n ['Content-Range', `bytes 0-1/${fileSize}`],\n ['Accept-Ranges', 'bytes'],\n ['Content-Length', '2'],\n ['Content-Type', mimeType],\n ],\n });\n }\n }\n\n const cacheKey = `${url}?start=${start}&end=${end}`;\n const [cachedArrayBuffer, cachedHeaders] = !MEDIA_PROGRESSIVE_CACHE_DISABLED ? await fetchFromCache(cacheKey) : [];\n\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log(\n `FETCH PROGRESSIVE ${cacheKey} (request: ${start}-${originalEnd}) CACHED: ${Boolean(cachedArrayBuffer)}`,\n );\n }\n\n if (cachedArrayBuffer) {\n return new Response(cachedArrayBuffer, {\n status: 206,\n statusText: 'Partial Content',\n headers: cachedHeaders,\n });\n }\n\n let partInfo;\n try {\n partInfo = await requestPart(e, { url, start, end });\n } catch (err) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.error('FETCH PROGRESSIVE', err);\n }\n }\n\n if (!partInfo) {\n return new Response('', {\n status: 500,\n statusText: 'Failed to fetch progressive part',\n });\n }\n\n const { arrayBuffer, fullSize, mimeType } = partInfo;\n\n const partSize = Math.min(end - start + 1, arrayBuffer.byteLength);\n end = start + partSize - 1;\n const arrayBufferPart = arrayBuffer.slice(0, partSize);\n const headers = [\n ['Content-Range', `bytes ${start}-${end}/${fullSize}`],\n ['Accept-Ranges', 'bytes'],\n ['Content-Length', String(partSize)],\n ['Content-Type', mimeType],\n ];\n\n if (!MEDIA_PROGRESSIVE_CACHE_DISABLED && partSize <= MEDIA_CACHE_MAX_BYTES && end < MAX_END_TO_CACHE) {\n saveToCache(cacheKey, arrayBufferPart, headers);\n }\n\n return new Response(arrayBufferPart, {\n status: 206,\n statusText: 'Partial Content',\n headers,\n });\n}\n\n// We can not cache 206 responses: https://github.com/GoogleChrome/workbox/issues/1644#issuecomment-638741359\nasync function fetchFromCache(cacheKey: string) {\n const cache = await self.caches.open(MEDIA_PROGRESSIVE_CACHE_NAME);\n\n return Promise.all([\n cache.match(`${cacheKey}&type=arrayBuffer`).then((r) => (r ? r.arrayBuffer() : undefined)),\n cache.match(`${cacheKey}&type=headers`).then((r) => (r ? r.json() : undefined)),\n ]);\n}\n\nasync function saveToCache(cacheKey: string, arrayBuffer: ArrayBuffer, headers: HeadersInit) {\n const cache = await self.caches.open(MEDIA_PROGRESSIVE_CACHE_NAME);\n\n return Promise.all([\n cache.put(new Request(`${cacheKey}&type=arrayBuffer`), new Response(arrayBuffer)),\n cache.put(new Request(`${cacheKey}&type=headers`), new Response(JSON.stringify(headers))),\n ]);\n}\n\nasync function requestPart(\n e: FetchEvent,\n params: { url: string; start: number; end: number },\n): Promise {\n if (!e.clientId) {\n return undefined;\n }\n\n // eslint-disable-next-line no-restricted-globals\n const client = await self.clients.get(e.clientId);\n if (!client) {\n return undefined;\n }\n\n const messageId = generateIdFor(requestStates);\n const requestState = {} as RequestStates;\n\n const promise = Promise.race([\n pause(PART_TIMEOUT).then(() => Promise.reject(new Error('ERROR_PART_TIMEOUT'))),\n new Promise((resolve, reject) => {\n Object.assign(requestState, { resolve, reject });\n }),\n ]);\n\n requestStates.set(messageId, requestState);\n promise\n .catch(() => undefined)\n .finally(() => {\n requestStates.delete(messageId);\n });\n\n client.postMessage({\n type: 'requestPart',\n messageId,\n params,\n });\n\n return promise;\n}\n\nself.addEventListener('message', (e) => {\n const { type, messageId, result } = e.data as {\n type: string;\n messageId: string;\n result: PartInfo;\n };\n\n if (type === 'partResponse') {\n const requestState = requestStates.get(messageId);\n if (requestState) {\n requestState.resolve(result);\n }\n }\n});\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","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","import { APP_NAME, DEBUG } from '../config';\n\ndeclare const self: ServiceWorkerGlobalScope;\n\nenum Boolean {\n True = '1',\n False = '0'\n}\n\ntype PushData = {\n custom: {\n msg_id?: string;\n channel_id?: string;\n chat_id?: string;\n from_id?: string;\n };\n mute: Boolean;\n badge: Boolean;\n loc_key: string;\n loc_args: string[];\n random_id: number;\n title: string;\n description: string;\n};\n\ntype NotificationData = {\n messageId?: number;\n chatId?: number;\n title: string;\n body: string;\n};\n\nconst clickBuffer: Record = {};\nconst shownNotifications = new Set();\n\nfunction getPushData(e: PushEvent | Notification): PushData | undefined {\n try {\n return e.data.json();\n } catch (error) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('[SW] Unable to parse push notification data', e.data);\n }\n return undefined;\n }\n}\n\nfunction getChatId(data: PushData) {\n if (data.custom.from_id) {\n return parseInt(data.custom.from_id, 10);\n }\n // Chats and channels have negative IDs\n if (data.custom.chat_id) {\n return parseInt(data.custom.chat_id, 10) * -1;\n }\n if (data.custom.channel_id) {\n return parseInt(data.custom.channel_id, 10) * -1;\n }\n return undefined;\n}\n\nfunction getMessageId(data: PushData) {\n if (!data.custom.msg_id) return undefined;\n return parseInt(data.custom.msg_id, 10);\n}\n\nfunction getNotificationData(data: PushData): NotificationData {\n return {\n chatId: getChatId(data),\n messageId: getMessageId(data),\n title: data.title || APP_NAME,\n body: data.description,\n };\n}\n\nfunction showNotification({\n chatId,\n messageId,\n body,\n title,\n}: NotificationData) {\n return self.registration.showNotification(title, {\n body,\n data: {\n chatId,\n messageId,\n },\n icon: 'icon-192x192.png',\n badge: 'icon-192x192.png',\n vibrate: [200, 100, 200],\n });\n}\n\nexport function handlePush(e: PushEvent) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('[SW] Push received event', e);\n if (e.data) {\n // eslint-disable-next-line no-console\n console.log('[SW] Push received with data', e.data.json());\n }\n }\n const data = getPushData(e);\n\n // Do not show muted notifications\n if (!data || data.mute === Boolean.True) return;\n\n const notification = getNotificationData(data);\n\n // Dont show already triggered notification\n if (shownNotifications.has(notification.messageId)) {\n shownNotifications.delete(notification.messageId);\n return;\n }\n\n e.waitUntil(showNotification(notification));\n}\n\nasync function focusChatMessage(client: WindowClient, data: { chatId?: number; messageId?: number }) {\n const {\n chatId,\n messageId,\n } = data;\n if (!chatId) return;\n client.postMessage({\n type: 'focusMessage',\n payload: {\n chatId,\n messageId,\n },\n });\n // Catch \"focus not allowed\" DOM Exceptions\n try {\n await client.focus();\n } catch (error) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.warn('[SW] ', error);\n }\n }\n}\n\nexport function handleNotificationClick(e: NotificationEvent) {\n const appUrl = process.env.APP_URL!;\n e.notification.close(); // Android needs explicit close.\n const { data } = e.notification;\n const notifyClients = async () => {\n const clients = await self.clients.matchAll({ type: 'window' }) as WindowClient[];\n const clientsInScope = clients.filter((client) => client.url === self.registration.scope);\n e.waitUntil(Promise.all(clientsInScope.map((client) => {\n clickBuffer[client.id] = data;\n return focusChatMessage(client, data);\n })));\n if (!self.clients.openWindow || clientsInScope.length > 0) return undefined;\n\n // If there is no opened client we need to open one and wait until it is fully loaded\n const newClient = await self.clients.openWindow(appUrl);\n if (newClient) {\n // Store notification data until client is fully loaded\n clickBuffer[newClient.id] = data;\n }\n return undefined;\n };\n e.waitUntil(notifyClients());\n}\n\nexport function handleClientMessage(e: ExtendableMessageEvent) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('[SW] New message from client', e);\n }\n if (!e.data) return;\n const source = e.source as WindowClient;\n if (e.data.type === 'clientReady') {\n // focus on chat message when client is fully ready\n if (clickBuffer[source.id]) {\n e.waitUntil(focusChatMessage(source, clickBuffer[source.id]));\n delete clickBuffer[source.id];\n }\n }\n if (e.data.type === 'newMessageNotification') {\n // store messageId for already shown notification\n const notification: NotificationData = e.data.payload;\n e.waitUntil(showNotification(notification));\n shownNotifications.add(notification.messageId);\n }\n}\n","import { DEBUG } from './config';\nimport { respondForProgressive } from './serviceWorker/progressive';\nimport { respondWithCache, clearAssetCache } from './serviceWorker/assetCache';\nimport { handlePush, handleNotificationClick, handleClientMessage } from './serviceWorker/pushNotification';\n\ndeclare const self: ServiceWorkerGlobalScope;\n\nconst ASSET_CACHE_PATTERN = /[0-9a-f]{20}.*\\.(js|css|woff2?|svg|png|jpg|json|wasm)$/;\n\nself.addEventListener('install', (e) => {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('ServiceWorker installed');\n }\n\n // Activate worker immediately\n e.waitUntil(self.skipWaiting());\n});\n\nself.addEventListener('activate', (e) => {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('ServiceWorker activated');\n }\n\n // Become available to all pages\n e.waitUntil(clearAssetCache());\n e.waitUntil(self.clients.claim());\n});\n\n// eslint-disable-next-line no-restricted-globals\nself.addEventListener('fetch', (e: FetchEvent) => {\n e.respondWith((() => {\n const { url } = e.request;\n\n if (url.includes('/progressive/')) {\n return respondForProgressive(e);\n }\n\n if (url.startsWith('http') && url.match(ASSET_CACHE_PATTERN)) {\n return respondWithCache(e);\n }\n\n return fetch(e.request);\n })());\n});\n\n\nself.addEventListener('push', handlePush);\nself.addEventListener('notificationclick', handleNotificationClick);\nself.addEventListener('message', handleClientMessage);\n","import { ASSET_CACHE_NAME } from '../config';\n\ndeclare const self: ServiceWorkerGlobalScope;\n\nexport async function respondWithCache(e: FetchEvent) {\n const cache = await self.caches.open(ASSET_CACHE_NAME);\n const cached = await cache.match(e.request);\n\n if (cached) {\n return cached;\n }\n\n const remote = await fetch(e.request);\n cache.put(e.request, remote.clone());\n\n return remote;\n}\n\nexport function clearAssetCache() {\n return self.caches.delete(ASSET_CACHE_NAME);\n}\n"],"sourceRoot":""} \ No newline at end of file