{"version":3,"file":"51.015549e15aab2a59d3a0.chunk.js","mappings":"6IAWA,MACMA,EAAgC,IAAIC,IAAI,CAAC,iBAAkB,kBAAmB,aAAc,qBAOnF,MAAMC,EAWnBC,YAAsBC,EAnBD,GAmBC,KAAAA,cAAAA,EAVf,KAAAC,QAAU,EACP,KAAAC,MAAoC,GACpC,KAAAC,UAAsC,IAAIN,IAE1C,KAAAO,YAA6B,KAC7B,KAAAC,cAA4B,KAE5B,KAAAC,KAAM,QAAO,KAAM,YAI3BC,KAAKC,cAAe,QAAS,IAAMD,KAAKE,iBAAiB,GAAG,GAGvDC,QACLH,KAAKJ,UAAUO,QAEfH,KAAKL,MAAMS,OAAS,EAOfC,OACFL,KAAKH,cAGRG,KAAKH,YAAc,IAAIS,SAAQ,CAACC,EAASC,KACvCR,KAAKF,cAAgBS,MAUlBE,SACDT,KAAKF,gBAETE,KAAKF,gBACLE,KAAKF,cAAgBE,KAAKH,YAAc,KAExCG,KAAKC,gBAGSS,YAAYC,G,qCAC1B,IAAGX,KAAKH,YAAR,CAIAG,KAAKJ,UAAUgB,IAAID,GAMnB,UAIQX,KAAKa,SAASF,GACpB,MAAMG,GACFzB,EAAc0B,IAAKD,MAAAA,OAAG,EAAHA,EAAkBE,OACvChB,KAAKD,IAAIkB,MAAM,wBAAyBH,GAI5Cd,KAAKJ,UAAUsB,OAAOP,GAMtBX,KAAKC,iB,+RAGGY,SAASF,GACjB,OAAOA,EAAKQ,OAGJC,UACR,OAAOpB,KAAKL,MAAM0B,QAGVC,WAAWC,EAA4BC,GAC/CxB,KAAKL,MAAM4B,GAAQC,GACnBxB,KAAKC,eAGGC,cAAcS,GACtB,MAAIX,KAAKL,MAAMS,QAAUJ,KAAKH,aAAgBG,KAAKP,cAAgB,GAAKO,KAAKJ,UAAU6B,MAAQzB,KAAKP,eAIpG,EAAG,CAOD,GANGkB,GACD,OAAiBX,KAAKL,MAAOgB,GAE7BA,EAAOX,KAAKoB,WAGXT,EAGD,MAFAX,KAAKU,YAAYC,GAKnBA,EAAO,WAEDX,KAAKJ,UAAU6B,KAAOzB,KAAKP,eAAiBO,KAAKL,MAAMS,QAI1DsB,KAAKF,GACVxB,KAAKsB,WAAW,OAAQE,GAGnBG,QAAQH,GACbxB,KAAKsB,WAAW,UAAWE,M,gCCjI/B,MAEA,EAF2C,CAAC,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,KAAM,EAAK,KAAM,EAAK,KAAM,EAAK,KAAM,EAAK,KAAM,EAAK,KAAM,EAAK,KAAM,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,KAAM,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,KAAM,EAAK,KAAM,EAAK,KAAM,EAAK,KAAM,EAAK,KAAM,EAAK,KAAM,EAAK,KAAM,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,MAAO,EAAK,MAAO,EAAK,KAAM,EAAK,KAAM,EAAK,KAAM,EAAK,KAAM,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,MAAO,EAAK,IAAK,EAAK,IAAK,EAAK,GAAI,EAAK,KAAM,EAAK,IAAK,EAAK,KAAM,EAA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","sources":["webpack://tweb/./src/components/lazyLoadQueueBase.ts","webpack://tweb/./src/config/latinizeMap.ts","webpack://tweb/./src/helpers/array/filterUnique.ts","webpack://tweb/./src/helpers/array/forEachReverse.ts","webpack://tweb/./src/helpers/array/insertInDescendSortedArray.ts","webpack://tweb/./src/helpers/assumeType.ts","webpack://tweb/./src/helpers/blob/readBlobAs.ts","webpack://tweb/./src/helpers/bytes/bytesCmp.ts","webpack://tweb/./src/helpers/bytes/bytesFromHex.ts","webpack://tweb/./src/helpers/bytes/convertToUint8Array.ts","webpack://tweb/./src/helpers/callbackify.ts","webpack://tweb/./src/helpers/getFileNameForUpload.ts","webpack://tweb/./src/helpers/object/getDeepProperty.ts","webpack://tweb/./src/helpers/object/getObjectKeysAndSort.ts","webpack://tweb/./src/helpers/schedulers/debounce.ts","webpack://tweb/./src/helpers/slicedArray.ts","webpack://tweb/./src/helpers/compareValue.ts","webpack://tweb/./src/helpers/long/compareLong.ts","webpack://tweb/./src/lib/appManagers/utils/chats/getParticipantPeerId.ts","webpack://tweb/./src/lib/appManagers/utils/chats/hasRights.ts","webpack://tweb/./src/lib/appManagers/utils/dialogs/getDialogIndex.ts","webpack://tweb/./src/lib/appManagers/utils/dialogs/getDialogIndexKey.ts","webpack://tweb/./src/lib/appManagers/utils/docs/getDocumentDownloadOptions.ts","webpack://tweb/./src/lib/appManagers/utils/docs/getDocumentInputFileLocation.ts","webpack://tweb/./src/lib/appManagers/utils/download/getDownloadFileNameFromOptions.ts","webpack://tweb/./src/lib/appManagers/utils/download/getDownloadMediaDetails.ts","webpack://tweb/./src/lib/appManagers/utils/webDocs/getWebDocumentDownloadOptions.ts","webpack://tweb/./src/lib/appManagers/utils/drafts/draftsAreEqual.ts","webpack://tweb/./src/lib/appManagers/utils/inlineBots/generateQId.ts","webpack://tweb/./src/lib/appManagers/utils/messageId/generateMessageId.ts","webpack://tweb/./src/lib/appManagers/utils/messageId/getServerMessageId.ts","webpack://tweb/./src/lib/appManagers/utils/messageId/clearMessageId.ts","webpack://tweb/./src/lib/appManagers/utils/messageId/index.ts","webpack://tweb/./src/lib/appManagers/utils/messages/filterMessagesByInputFilter.ts","webpack://tweb/./src/lib/appManagers/utils/messages/getAlbumText.ts","webpack://tweb/./src/lib/appManagers/utils/peers/getPeerId.ts","webpack://tweb/./src/lib/appManagers/utils/photos/getPhotoDownloadOptions.ts","webpack://tweb/./src/lib/appManagers/utils/reactions/reactionsEqual.ts","webpack://tweb/./src/lib/appManagers/utils/stickers/getStickerEffectThumb.ts","webpack://tweb/./src/lib/appManagers/utils/users/canSendToUser.ts","webpack://tweb/./src/lib/appManagers/utils/webDocs/isWebDocument.ts","webpack://tweb/./src/lib/mtproto/connectionStatus.ts","webpack://tweb/./src/lib/richTextProcessor/combineSameEntities.ts","webpack://tweb/./src/lib/richTextProcessor/encodeSpoiler.ts","webpack://tweb/./src/lib/richTextProcessor/spoiler.ts","webpack://tweb/./src/lib/richTextProcessor/findConflictingEntity.ts","webpack://tweb/./src/lib/richTextProcessor/fixEmoji.ts","webpack://tweb/./src/lib/richTextProcessor/matchUrl.ts","webpack://tweb/./src/lib/richTextProcessor/mergeEntities.ts","webpack://tweb/./src/config/tld.ts","webpack://tweb/./src/lib/richTextProcessor/checkBrackets.ts","webpack://tweb/./src/lib/richTextProcessor/getEmojiUnified.ts","webpack://tweb/./src/lib/richTextProcessor/parseEntities.ts","webpack://tweb/./src/lib/richTextProcessor/parseMarkdown.ts","webpack://tweb/./src/lib/richTextProcessor/sortEntities.ts","webpack://tweb/./src/lib/richTextProcessor/wrapPlainText.ts","webpack://tweb/./src/lib/searchIndex.ts","webpack://tweb/./src/helpers/array/flatten.ts"],"sourcesContent":["/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport indexOfAndSplice from '../helpers/array/indexOfAndSplice';\nimport {Middleware} from '../helpers/middleware';\nimport throttle from '../helpers/schedulers/throttle';\nimport {logger, LogTypes} from '../lib/logger';\n\nconst PARALLEL_LIMIT = 8;\nconst IGNORE_ERRORS: Set = new Set(['NO_ENTRY_FOUND', 'STORAGE_OFFLINE', 'MIDDLEWARE', 'NO_AUTO_DOWNLOAD']);\n\nexport type LazyLoadElementBase = {\n load: () => Promise,\n middleware?: Middleware\n};\n\nexport default class LazyLoadQueueBase {\n public queueId = 0;\n protected queue: Array = [];\n protected inProcess: Set = new Set();\n\n protected lockPromise: Promise = null;\n protected unlockResolve: () => void = null;\n\n protected log = logger('LL', LogTypes.Error);\n protected processQueue: () => void;\n\n constructor(protected parallelLimit = PARALLEL_LIMIT) {\n this.processQueue = throttle(() => this._processQueue(), 8, false);\n }\n\n public clear() {\n this.inProcess.clear(); // ацтеки забьются, будет плохо\n\n this.queue.length = 0;\n // unreachable code\n /* for(let item of this.inProcess) {\n this.lazyLoadMedia.push(item);\n } */\n }\n\n public lock() {\n if(this.lockPromise) return;\n\n // const perf = performance.now();\n this.lockPromise = new Promise((resolve, reject) => {\n this.unlockResolve = resolve;\n });\n\n /* if(DEBUG) {\n this.lockPromise.then(() => {\n this.log('was locked for:', performance.now() - perf);\n });\n } */\n }\n\n public unlock() {\n if(!this.unlockResolve) return;\n\n this.unlockResolve();\n this.unlockResolve = this.lockPromise = null;\n\n this.processQueue();\n }\n\n protected async processItem(item: LazyLoadElementBase) {\n if(this.lockPromise) {\n return;\n }\n\n this.inProcess.add(item);\n\n /* if(DEBUG) {\n this.log('will load media', this.lockPromise, item);\n } */\n\n try {\n // await new Promise((resolve) => setTimeout(resolve, 2e3));\n // await new Promise((resolve, reject) => window.requestAnimationFrame(() => window.requestAnimationFrame(resolve)));\n // await item.load(item.div);\n await this.loadItem(item);\n } catch(err) {\n if(!IGNORE_ERRORS.has((err as ApiError)?.type)) {\n this.log.error('loadMediaQueue error:', err/* , item */);\n }\n }\n\n this.inProcess.delete(item);\n\n /* if(DEBUG) {\n this.log('loaded media', item);\n } */\n\n this.processQueue();\n }\n\n protected loadItem(item: LazyLoadElementBase) {\n return item.load();\n }\n\n protected getItem() {\n return this.queue.shift();\n }\n\n protected addElement(method: 'push' | 'unshift', el: LazyLoadElementBase) {\n this.queue[method](el);\n this.processQueue();\n }\n\n protected _processQueue(item?: LazyLoadElementBase) {\n if(!this.queue.length || this.lockPromise || (this.parallelLimit > 0 && this.inProcess.size >= this.parallelLimit)) return;\n\n // console.log('_processQueue start');\n // let added = 0;\n do {\n if(item) {\n indexOfAndSplice(this.queue, item);\n } else {\n item = this.getItem();\n }\n\n if(item) {\n this.processItem(item);\n } else {\n break;\n }\n\n item = null;\n // ++added;\n } while(this.inProcess.size < this.parallelLimit && this.queue.length);\n // console.log('_processQueue end, added', added, this.queue.length);\n }\n\n public push(el: LazyLoadElementBase) {\n this.addElement('push', el);\n }\n\n public unshift(el: LazyLoadElementBase) {\n this.addElement('unshift', el);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\n// From https://raw.githubusercontent.com/FGRibreau/latenize/master/latinize_map.js\nconst LatinizeMap: {[k: string]: string} = {'Á': 'A', 'Ă': 'A', 'Ắ': 'A', 'Ặ': 'A', 'Ằ': 'A', 'Ẳ': 'A', 'Ẵ': 'A', 'Ǎ': 'A', 'Â': 'A', 'Ấ': 'A', 'Ậ': 'A', 'Ầ': 'A', 'Ẩ': 'A', 'Ẫ': 'A', 'Ä': 'A', 'Ǟ': 'A', 'Ȧ': 'A', 'Ǡ': 'A', 'Ạ': 'A', 'Ȁ': 'A', 'À': 'A', 'Ả': 'A', 'Ȃ': 'A', 'Ā': 'A', 'Ą': 'A', 'Å': 'A', 'Ǻ': 'A', 'Ḁ': 'A', 'Ⱥ': 'A', 'Ã': 'A', 'Ꜳ': 'AA', 'Æ': 'AE', 'Ǽ': 'AE', 'Ǣ': 'AE', 'Ꜵ': 'AO', 'Ꜷ': 'AU', 'Ꜹ': 'AV', 'Ꜻ': 'AV', 'Ꜽ': 'AY', 'Ḃ': 'B', 'Ḅ': 'B', 'Ɓ': 'B', 'Ḇ': 'B', 'Ƀ': 'B', 'Ƃ': 'B', 'Ć': 'C', 'Č': 'C', 'Ç': 'C', 'Ḉ': 'C', 'Ĉ': 'C', 'Ċ': 'C', 'Ƈ': 'C', 'Ȼ': 'C', 'Ď': 'D', 'Ḑ': 'D', 'Ḓ': 'D', 'Ḋ': 'D', 'Ḍ': 'D', 'Ɗ': 'D', 'Ḏ': 'D', 'Dz': 'D', 'Dž': 'D', 'Đ': 'D', 'Ƌ': 'D', 'DZ': 'DZ', 'DŽ': 'DZ', 'É': 'E', 'Ĕ': 'E', 'Ě': 'E', 'Ȩ': 'E', 'Ḝ': 'E', 'Ê': 'E', 'Ế': 'E', 'Ệ': 'E', 'Ề': 'E', 'Ể': 'E', 'Ễ': 'E', 'Ḙ': 'E', 'Ë': 'E', 'Ė': 'E', 'Ẹ': 'E', 'Ȅ': 'E', 'È': 'E', 'Ẻ': 'E', 'Ȇ': 'E', 'Ē': 'E', 'Ḗ': 'E', 'Ḕ': 'E', 'Ę': 'E', 'Ɇ': 'E', 'Ẽ': 'E', 'Ḛ': 'E', 'Ꝫ': 'ET', 'Ḟ': 'F', 'Ƒ': 'F', 'Ǵ': 'G', 'Ğ': 'G', 'Ǧ': 'G', 'Ģ': 'G', 'Ĝ': 'G', 'Ġ': 'G', 'Ɠ': 'G', 'Ḡ': 'G', 'Ǥ': 'G', 'Ḫ': 'H', 'Ȟ': 'H', 'Ḩ': 'H', 'Ĥ': 'H', 'Ⱨ': 'H', 'Ḧ': 'H', 'Ḣ': 'H', 'Ḥ': 'H', 'Ħ': 'H', 'Í': 'I', 'Ĭ': 'I', 'Ǐ': 'I', 'Î': 'I', 'Ï': 'I', 'Ḯ': 'I', 'İ': 'I', 'Ị': 'I', 'Ȉ': 'I', 'Ì': 'I', 'Ỉ': 'I', 'Ȋ': 'I', 'Ī': 'I', 'Į': 'I', 'Ɨ': 'I', 'Ĩ': 'I', 'Ḭ': 'I', 'Ꝺ': 'D', 'Ꝼ': 'F', 'Ᵹ': 'G', 'Ꞃ': 'R', 'Ꞅ': 'S', 'Ꞇ': 'T', 'Ꝭ': 'IS', 'Ĵ': 'J', 'Ɉ': 'J', 'Ḱ': 'K', 'Ǩ': 'K', 'Ķ': 'K', 'Ⱪ': 'K', 'Ꝃ': 'K', 'Ḳ': 'K', 'Ƙ': 'K', 'Ḵ': 'K', 'Ꝁ': 'K', 'Ꝅ': 'K', 'Ĺ': 'L', 'Ƚ': 'L', 'Ľ': 'L', 'Ļ': 'L', 'Ḽ': 'L', 'Ḷ': 'L', 'Ḹ': 'L', 'Ⱡ': 'L', 'Ꝉ': 'L', 'Ḻ': 'L', 'Ŀ': 'L', 'Ɫ': 'L', 'Lj': 'L', 'Ł': 'L', 'LJ': 'LJ', 'Ḿ': 'M', 'Ṁ': 'M', 'Ṃ': 'M', 'Ɱ': 'M', 'Ń': 'N', 'Ň': 'N', 'Ņ': 'N', 'Ṋ': 'N', 'Ṅ': 'N', 'Ṇ': 'N', 'Ǹ': 'N', 'Ɲ': 'N', 'Ṉ': 'N', 'Ƞ': 'N', 'Nj': 'N', 'Ñ': 'N', 'NJ': 'NJ', 'Ó': 'O', 'Ŏ': 'O', 'Ǒ': 'O', 'Ô': 'O', 'Ố': 'O', 'Ộ': 'O', 'Ồ': 'O', 'Ổ': 'O', 'Ỗ': 'O', 'Ö': 'O', 'Ȫ': 'O', 'Ȯ': 'O', 'Ȱ': 'O', 'Ọ': 'O', 'Ő': 'O', 'Ȍ': 'O', 'Ò': 'O', 'Ỏ': 'O', 'Ơ': 'O', 'Ớ': 'O', 'Ợ': 'O', 'Ờ': 'O', 'Ở': 'O', 'Ỡ': 'O', 'Ȏ': 'O', 'Ꝋ': 'O', 'Ꝍ': 'O', 'Ō': 'O', 'Ṓ': 'O', 'Ṑ': 'O', 'Ɵ': 'O', 'Ǫ': 'O', 'Ǭ': 'O', 'Ø': 'O', 'Ǿ': 'O', 'Õ': 'O', 'Ṍ': 'O', 'Ṏ': 'O', 'Ȭ': 'O', 'Ƣ': 'OI', 'Ꝏ': 'OO', 'Ɛ': 'E', 'Ɔ': 'O', 'Ȣ': 'OU', 'Ṕ': 'P', 'Ṗ': 'P', 'Ꝓ': 'P', 'Ƥ': 'P', 'Ꝕ': 'P', 'Ᵽ': 'P', 'Ꝑ': 'P', 'Ꝙ': 'Q', 'Ꝗ': 'Q', 'Ŕ': 'R', 'Ř': 'R', 'Ŗ': 'R', 'Ṙ': 'R', 'Ṛ': 'R', 'Ṝ': 'R', 'Ȑ': 'R', 'Ȓ': 'R', 'Ṟ': 'R', 'Ɍ': 'R', 'Ɽ': 'R', 'Ꜿ': 'C', 'Ǝ': 'E', 'Ś': 'S', 'Ṥ': 'S', 'Š': 'S', 'Ṧ': 'S', 'Ş': 'S', 'Ŝ': 'S', 'Ș': 'S', 'Ṡ': 'S', 'Ṣ': 'S', 'Ṩ': 'S', 'ẞ': 'SS', 'Ť': 'T', 'Ţ': 'T', 'Ṱ': 'T', 'Ț': 'T', 'Ⱦ': 'T', 'Ṫ': 'T', 'Ṭ': 'T', 'Ƭ': 'T', 'Ṯ': 'T', 'Ʈ': 'T', 'Ŧ': 'T', 'Ɐ': 'A', 'Ꞁ': 'L', 'Ɯ': 'M', 'Ʌ': 'V', 'Ꜩ': 'TZ', 'Ú': 'U', 'Ŭ': 'U', 'Ǔ': 'U', 'Û': 'U', 'Ṷ': 'U', 'Ü': 'U', 'Ǘ': 'U', 'Ǚ': 'U', 'Ǜ': 'U', 'Ǖ': 'U', 'Ṳ': 'U', 'Ụ': 'U', 'Ű': 'U', 'Ȕ': 'U', 'Ù': 'U', 'Ủ': 'U', 'Ư': 'U', 'Ứ': 'U', 'Ự': 'U', 'Ừ': 'U', 'Ử': 'U', 'Ữ': 'U', 'Ȗ': 'U', 'Ū': 'U', 'Ṻ': 'U', 'Ų': 'U', 'Ů': 'U', 'Ũ': 'U', 'Ṹ': 'U', 'Ṵ': 'U', 'Ꝟ': 'V', 'Ṿ': 'V', 'Ʋ': 'V', 'Ṽ': 'V', 'Ꝡ': 'VY', 'Ẃ': 'W', 'Ŵ': 'W', 'Ẅ': 'W', 'Ẇ': 'W', 'Ẉ': 'W', 'Ẁ': 'W', 'Ⱳ': 'W', 'Ẍ': 'X', 'Ẋ': 'X', 'Ý': 'Y', 'Ŷ': 'Y', 'Ÿ': 'Y', 'Ẏ': 'Y', 'Ỵ': 'Y', 'Ỳ': 'Y', 'Ƴ': 'Y', 'Ỷ': 'Y', 'Ỿ': 'Y', 'Ȳ': 'Y', 'Ɏ': 'Y', 'Ỹ': 'Y', 'Ź': 'Z', 'Ž': 'Z', 'Ẑ': 'Z', 'Ⱬ': 'Z', 'Ż': 'Z', 'Ẓ': 'Z', 'Ȥ': 'Z', 'Ẕ': 'Z', 'Ƶ': 'Z', 'IJ': 'IJ', 'Œ': 'OE', 'ᴀ': 'A', 'ᴁ': 'AE', 'ʙ': 'B', 'ᴃ': 'B', 'ᴄ': 'C', 'ᴅ': 'D', 'ᴇ': 'E', 'ꜰ': 'F', 'ɢ': 'G', 'ʛ': 'G', 'ʜ': 'H', 'ɪ': 'I', 'ʁ': 'R', 'ᴊ': 'J', 'ᴋ': 'K', 'ʟ': 'L', 'ᴌ': 'L', 'ᴍ': 'M', 'ɴ': 'N', 'ᴏ': 'O', 'ɶ': 'OE', 'ᴐ': 'O', 'ᴕ': 'OU', 'ᴘ': 'P', 'ʀ': 'R', 'ᴎ': 'N', 'ᴙ': 'R', 'ꜱ': 'S', 'ᴛ': 'T', 'ⱻ': 'E', 'ᴚ': 'R', 'ᴜ': 'U', 'ᴠ': 'V', 'ᴡ': 'W', 'ʏ': 'Y', 'ᴢ': 'Z', 'á': 'a', 'ă': 'a', 'ắ': 'a', 'ặ': 'a', 'ằ': 'a', 'ẳ': 'a', 'ẵ': 'a', 'ǎ': 'a', 'â': 'a', 'ấ': 'a', 'ậ': 'a', 'ầ': 'a', 'ẩ': 'a', 'ẫ': 'a', 'ä': 'a', 'ǟ': 'a', 'ȧ': 'a', 'ǡ': 'a', 'ạ': 'a', 'ȁ': 'a', 'à': 'a', 'ả': 'a', 'ȃ': 'a', 'ā': 'a', 'ą': 'a', 'ᶏ': 'a', 'ẚ': 'a', 'å': 'a', 'ǻ': 'a', 'ḁ': 'a', 'ⱥ': 'a', 'ã': 'a', 'ꜳ': 'aa', 'æ': 'ae', 'ǽ': 'ae', 'ǣ': 'ae', 'ꜵ': 'ao', 'ꜷ': 'au', 'ꜹ': 'av', 'ꜻ': 'av', 'ꜽ': 'ay', 'ḃ': 'b', 'ḅ': 'b', 'ɓ': 'b', 'ḇ': 'b', 'ᵬ': 'b', 'ᶀ': 'b', 'ƀ': 'b', 'ƃ': 'b', 'ɵ': 'o', 'ć': 'c', 'č': 'c', 'ç': 'c', 'ḉ': 'c', 'ĉ': 'c', 'ɕ': 'c', 'ċ': 'c', 'ƈ': 'c', 'ȼ': 'c', 'ď': 'd', 'ḑ': 'd', 'ḓ': 'd', 'ȡ': 'd', 'ḋ': 'd', 'ḍ': 'd', 'ɗ': 'd', 'ᶑ': 'd', 'ḏ': 'd', 'ᵭ': 'd', 'ᶁ': 'd', 'đ': 'd', 'ɖ': 'd', 'ƌ': 'd', 'ı': 'i', 'ȷ': 'j', 'ɟ': 'j', 'ʄ': 'j', 'dz': 'dz', 'dž': 'dz', 'é': 'e', 'ĕ': 'e', 'ě': 'e', 'ȩ': 'e', 'ḝ': 'e', 'ê': 'e', 'ế': 'e', 'ệ': 'e', 'ề': 'e', 'ể': 'e', 'ễ': 'e', 'ḙ': 'e', 'ë': 'e', 'ė': 'e', 'ẹ': 'e', 'ȅ': 'e', 'è': 'e', 'ẻ': 'e', 'ȇ': 'e', 'ē': 'e', 'ḗ': 'e', 'ḕ': 'e', 'ⱸ': 'e', 'ę': 'e', 'ᶒ': 'e', 'ɇ': 'e', 'ẽ': 'e', 'ḛ': 'e', 'ꝫ': 'et', 'ḟ': 'f', 'ƒ': 'f', 'ᵮ': 'f', 'ᶂ': 'f', 'ǵ': 'g', 'ğ': 'g', 'ǧ': 'g', 'ģ': 'g', 'ĝ': 'g', 'ġ': 'g', 'ɠ': 'g', 'ḡ': 'g', 'ᶃ': 'g', 'ǥ': 'g', 'ḫ': 'h', 'ȟ': 'h', 'ḩ': 'h', 'ĥ': 'h', 'ⱨ': 'h', 'ḧ': 'h', 'ḣ': 'h', 'ḥ': 'h', 'ɦ': 'h', 'ẖ': 'h', 'ħ': 'h', 'ƕ': 'hv', 'í': 'i', 'ĭ': 'i', 'ǐ': 'i', 'î': 'i', 'ï': 'i', 'ḯ': 'i', 'ị': 'i', 'ȉ': 'i', 'ì': 'i', 'ỉ': 'i', 'ȋ': 'i', 'ī': 'i', 'į': 'i', 'ᶖ': 'i', 'ɨ': 'i', 'ĩ': 'i', 'ḭ': 'i', 'ꝺ': 'd', 'ꝼ': 'f', 'ᵹ': 'g', 'ꞃ': 'r', 'ꞅ': 's', 'ꞇ': 't', 'ꝭ': 'is', 'ǰ': 'j', 'ĵ': 'j', 'ʝ': 'j', 'ɉ': 'j', 'ḱ': 'k', 'ǩ': 'k', 'ķ': 'k', 'ⱪ': 'k', 'ꝃ': 'k', 'ḳ': 'k', 'ƙ': 'k', 'ḵ': 'k', 'ᶄ': 'k', 'ꝁ': 'k', 'ꝅ': 'k', 'ĺ': 'l', 'ƚ': 'l', 'ɬ': 'l', 'ľ': 'l', 'ļ': 'l', 'ḽ': 'l', 'ȴ': 'l', 'ḷ': 'l', 'ḹ': 'l', 'ⱡ': 'l', 'ꝉ': 'l', 'ḻ': 'l', 'ŀ': 'l', 'ɫ': 'l', 'ᶅ': 'l', 'ɭ': 'l', 'ł': 'l', 'lj': 'lj', 'ſ': 's', 'ẜ': 's', 'ẛ': 's', 'ẝ': 's', 'ḿ': 'm', 'ṁ': 'm', 'ṃ': 'm', 'ɱ': 'm', 'ᵯ': 'm', 'ᶆ': 'm', 'ń': 'n', 'ň': 'n', 'ņ': 'n', 'ṋ': 'n', 'ȵ': 'n', 'ṅ': 'n', 'ṇ': 'n', 'ǹ': 'n', 'ɲ': 'n', 'ṉ': 'n', 'ƞ': 'n', 'ᵰ': 'n', 'ᶇ': 'n', 'ɳ': 'n', 'ñ': 'n', 'nj': 'nj', 'ó': 'o', 'ŏ': 'o', 'ǒ': 'o', 'ô': 'o', 'ố': 'o', 'ộ': 'o', 'ồ': 'o', 'ổ': 'o', 'ỗ': 'o', 'ö': 'o', 'ȫ': 'o', 'ȯ': 'o', 'ȱ': 'o', 'ọ': 'o', 'ő': 'o', 'ȍ': 'o', 'ò': 'o', 'ỏ': 'o', 'ơ': 'o', 'ớ': 'o', 'ợ': 'o', 'ờ': 'o', 'ở': 'o', 'ỡ': 'o', 'ȏ': 'o', 'ꝋ': 'o', 'ꝍ': 'o', 'ⱺ': 'o', 'ō': 'o', 'ṓ': 'o', 'ṑ': 'o', 'ǫ': 'o', 'ǭ': 'o', 'ø': 'o', 'ǿ': 'o', 'õ': 'o', 'ṍ': 'o', 'ṏ': 'o', 'ȭ': 'o', 'ƣ': 'oi', 'ꝏ': 'oo', 'ɛ': 'e', 'ᶓ': 'e', 'ɔ': 'o', 'ᶗ': 'o', 'ȣ': 'ou', 'ṕ': 'p', 'ṗ': 'p', 'ꝓ': 'p', 'ƥ': 'p', 'ᵱ': 'p', 'ᶈ': 'p', 'ꝕ': 'p', 'ᵽ': 'p', 'ꝑ': 'p', 'ꝙ': 'q', 'ʠ': 'q', 'ɋ': 'q', 'ꝗ': 'q', 'ŕ': 'r', 'ř': 'r', 'ŗ': 'r', 'ṙ': 'r', 'ṛ': 'r', 'ṝ': 'r', 'ȑ': 'r', 'ɾ': 'r', 'ᵳ': 'r', 'ȓ': 'r', 'ṟ': 'r', 'ɼ': 'r', 'ᵲ': 'r', 'ᶉ': 'r', 'ɍ': 'r', 'ɽ': 'r', 'ↄ': 'c', 'ꜿ': 'c', 'ɘ': 'e', 'ɿ': 'r', 'ś': 's', 'ṥ': 's', 'š': 's', 'ṧ': 's', 'ş': 's', 'ŝ': 's', 'ș': 's', 'ṡ': 's', 'ṣ': 's', 'ṩ': 's', 'ʂ': 's', 'ᵴ': 's', 'ᶊ': 's', 'ȿ': 's', 'ɡ': 'g', 'ß': 'ss', 'ᴑ': 'o', 'ᴓ': 'o', 'ᴝ': 'u', 'ť': 't', 'ţ': 't', 'ṱ': 't', 'ț': 't', 'ȶ': 't', 'ẗ': 't', 'ⱦ': 't', 'ṫ': 't', 'ṭ': 't', 'ƭ': 't', 'ṯ': 't', 'ᵵ': 't', 'ƫ': 't', 'ʈ': 't', 'ŧ': 't', 'ᵺ': 'th', 'ɐ': 'a', 'ᴂ': 'ae', 'ǝ': 'e', 'ᵷ': 'g', 'ɥ': 'h', 'ʮ': 'h', 'ʯ': 'h', 'ᴉ': 'i', 'ʞ': 'k', 'ꞁ': 'l', 'ɯ': 'm', 'ɰ': 'm', 'ᴔ': 'oe', 'ɹ': 'r', 'ɻ': 'r', 'ɺ': 'r', 'ⱹ': 'r', 'ʇ': 't', 'ʌ': 'v', 'ʍ': 'w', 'ʎ': 'y', 'ꜩ': 'tz', 'ú': 'u', 'ŭ': 'u', 'ǔ': 'u', 'û': 'u', 'ṷ': 'u', 'ü': 'u', 'ǘ': 'u', 'ǚ': 'u', 'ǜ': 'u', 'ǖ': 'u', 'ṳ': 'u', 'ụ': 'u', 'ű': 'u', 'ȕ': 'u', 'ù': 'u', 'ủ': 'u', 'ư': 'u', 'ứ': 'u', 'ự': 'u', 'ừ': 'u', 'ử': 'u', 'ữ': 'u', 'ȗ': 'u', 'ū': 'u', 'ṻ': 'u', 'ų': 'u', 'ᶙ': 'u', 'ů': 'u', 'ũ': 'u', 'ṹ': 'u', 'ṵ': 'u', 'ᵫ': 'ue', 'ꝸ': 'um', 'ⱴ': 'v', 'ꝟ': 'v', 'ṿ': 'v', 'ʋ': 'v', 'ᶌ': 'v', 'ⱱ': 'v', 'ṽ': 'v', 'ꝡ': 'vy', 'ẃ': 'w', 'ŵ': 'w', 'ẅ': 'w', 'ẇ': 'w', 'ẉ': 'w', 'ẁ': 'w', 'ⱳ': 'w', 'ẘ': 'w', 'ẍ': 'x', 'ẋ': 'x', 'ᶍ': 'x', 'ý': 'y', 'ŷ': 'y', 'ÿ': 'y', 'ẏ': 'y', 'ỵ': 'y', 'ỳ': 'y', 'ƴ': 'y', 'ỷ': 'y', 'ỿ': 'y', 'ȳ': 'y', 'ẙ': 'y', 'ɏ': 'y', 'ỹ': 'y', 'ź': 'z', 'ž': 'z', 'ẑ': 'z', 'ʑ': 'z', 'ⱬ': 'z', 'ż': 'z', 'ẓ': 'z', 'ȥ': 'z', 'ẕ': 'z', 'ᵶ': 'z', 'ᶎ': 'z', 'ʐ': 'z', 'ƶ': 'z', 'ɀ': 'z', 'ff': 'ff', 'ffi': 'ffi', 'ffl': 'ffl', 'fi': 'fi', 'fl': 'fl', 'ij': 'ij', 'œ': 'oe', 'st': 'st', 'ₐ': 'a', 'ₑ': 'e', 'ᵢ': 'i', 'ⱼ': 'j', 'ₒ': 'o', 'ᵣ': 'r', 'ᵤ': 'u', 'ᵥ': 'v', 'ₓ': 'x', 'Ё': 'YO', 'Й': 'I', 'Ц': 'TS', 'У': 'U', 'К': 'K', 'Е': 'E', 'Н': 'N', 'Г': 'G', 'Ш': 'SH', 'Щ': 'SCH', 'З': 'Z', 'Х': 'H', 'Ъ': '', 'ё': 'yo', 'й': 'i', 'ц': 'ts', 'у': 'u', 'к': 'k', 'е': 'e', 'н': 'n', 'г': 'g', 'ш': 'sh', 'щ': 'sch', 'з': 'z', 'х': 'h', 'ъ': '', 'Ф': 'F', 'Ы': 'I', 'В': 'V', 'А': 'A', 'П': 'P', 'Р': 'R', 'О': 'O', 'Л': 'L', 'Д': 'D', 'Ж': 'ZH', 'Э': 'E', 'ф': 'f', 'ы': 'i', 'в': 'v', 'а': 'a', 'п': 'p', 'р': 'r', 'о': 'o', 'л': 'l', 'д': 'd', 'ж': 'zh', 'э': 'e', 'Я': 'Ya', 'Ч': 'CH', 'С': 'S', 'М': 'M', 'И': 'I', 'Т': 'T', 'Ь': '', 'Б': 'B', 'Ю': 'YU', 'я': 'ya', 'ч': 'ch', 'с': 's', 'м': 'm', 'и': 'i', 'т': 't', 'ь': '', 'б': 'b', 'ю': 'yu'};\n\nexport default LatinizeMap;\n","export default function filterUnique>(arr: T): T {\n return [...new Set(arr)] as T;\n}\n","export default function forEachReverse(array: Array, callback: (value: T, index?: number, array?: Array) => void) {\n for(let length = array.length, i = length - 1; i >= 0; --i) {\n callback(array[i], i, array);\n }\n};\n","export default function insertInDescendSortedArray(array: Array, element: T, getProperty: K, pos?: number): number;\nexport default function insertInDescendSortedArray(array: Array, element: T, getProperty: (element: T) => number, pos?: number): number;\nexport default function insertInDescendSortedArray(array: Array, element: T, getProperty: K | ((element: T) => T[K]), pos?: number): number {\n if(typeof(getProperty) !== 'function') {\n const property = getProperty;\n getProperty = (element) => element[property];\n }\n\n const sortProperty: number = getProperty(element);\n\n if(pos === undefined) {\n pos = array.indexOf(element);\n if(pos !== -1) {\n const prev = array[pos - 1];\n const next = array[pos + 1];\n if((!prev || getProperty(prev) >= sortProperty) && (!next || getProperty(next) <= sortProperty)) {\n // console.warn('same pos', pos, sortProperty, prev, next);\n return pos;\n }\n\n array.splice(pos, 1);\n }\n }\n\n const len = array.length;\n if(!len || sortProperty <= getProperty(array[len - 1])) {\n return array.push(element) - 1;\n } else if(sortProperty >= getProperty(array[0])) {\n array.unshift(element);\n return 0;\n } else {\n for(let i = 0; i < len; i++) {\n if(sortProperty > getProperty(array[i])) {\n array.splice(i, 0, element);\n return i;\n }\n }\n }\n\n console.error('wtf', array, element);\n return array.indexOf(element);\n}\n","export default function assumeType(x: unknown): asserts x is T {\r\n return; // ¯\\_(ツ)_/¯\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// import { IS_WEB_WORKER } from \"../context\";\n\n// const id = IS_WEB_WORKER ? Math.random() * 0x1000 | 0 : 0;\nexport default function readBlobAs(blob: Blob, method: 'readAsText'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsDataURL'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsArrayBuffer'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsArrayBuffer' | 'readAsText' | 'readAsDataURL'): Promise {\n // const perf = performance.now();\n return new Promise((resolve) => {\n const reader = new FileReader();\n reader.addEventListener('loadend', (e) => {\n // console.log(`readBlobAs [${id}] ${method} time ${performance.now() - perf}`);\n resolve(e.target.result);\n });\n reader[method](blob);\n });\n}\n","export default function bytesCmp(bytes1: number[] | Uint8Array, bytes2: number[] | Uint8Array) {\n const len = bytes1.length;\n if(len !== bytes2.length) {\n return false;\n }\n\n for(let i = 0; i < len; ++i) {\n if(bytes1[i] !== bytes2[i]) {\n return false;\n }\n }\n\n return true;\n}\n","export default function bytesFromHex(hexString: string) {\n const len = hexString.length;\n const bytes = new Uint8Array(Math.ceil(len / 2));\n let start = 0;\n\n if(len % 2) { // read 0x581 as 0x0581\n bytes[start++] = parseInt(hexString.charAt(0), 16);\n }\n\n for(let i = start; i < len; i += 2) {\n bytes[start++] = parseInt(hexString.substr(i, 2), 16);\n }\n\n return bytes;\n}\n","export default function convertToUint8Array(bytes: Uint8Array | ArrayBuffer | number[] | string): Uint8Array {\n if(bytes instanceof Uint8Array) {\n return bytes;\n } else if(typeof(bytes) === 'string') {\n return new TextEncoder().encode(bytes);\n }\n\n return new Uint8Array(bytes);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {Awaited} from '../types';\n\nexport default function callbackify, R>(\n smth: T,\n callback: (result: Awaited) => R\n): Promise> | R {\n if(smth instanceof Promise) {\n // @ts-ignore\n return smth.then(callback);\n } else {\n return callback(smth as any);\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport tabId from '../config/tabId';\r\n\r\nlet uploadId = 0;\r\nexport default function getFileNameForUpload(file: File | Blob) {\r\n let fileName: string;\r\n const mimeType = file?.type;\r\n if(mimeType) { // the same like apiFileName in appMessagesManager for upload!\r\n const ext = `${tabId}_${uploadId++}.${mimeType.split('/')[1]}`;\r\n\r\n if(['image/jpeg', 'image/png', 'image/bmp'].indexOf(mimeType) >= 0) {\r\n fileName = 'photo' + ext;\r\n } else if(mimeType.indexOf('audio/') === 0 || ['video/ogg'].indexOf(mimeType) >= 0) {\r\n fileName = 'audio' + ext;\r\n } else if(mimeType.indexOf('video/') === 0) {\r\n fileName = 'video' + ext;\r\n } else {\r\n fileName = 'document' + ext;\r\n }\r\n } else {\r\n fileName = `upload-${tabId}_${uploadId++}`;\r\n }\r\n\r\n return fileName;\r\n}\r\n","export default function getDeepProperty(object: any, key: string) {\n const splitted = key.split('.');\n let o: any = object;\n splitted.forEach((key) => {\n if(!key) {\n return;\n }\n\n // @ts-ignore\n o = o[key];\n });\n\n return o;\n}\n","export default function getObjectKeysAndSort(object: {[key: string]: any} | Map, sort: 'asc' | 'desc' = 'asc') {\n if(!object) return [];\n const ids = object instanceof Map ? [...object.keys()] : Object.keys(object).map((i) => +i);\n if(sort === 'asc') return ids.sort((a, b) => a - b);\n else return ids.sort((a, b) => b - a);\n}\n","// * Jolly Cobra's schedulers\r\n\r\nimport ctx from '../../environment/ctx';\r\nimport {AnyFunction, Awaited} from '../../types';\r\nimport noop from '../noop';\r\n\r\nexport type DebounceReturnType = {\r\n (...args: Parameters): Promise>>;\r\n clearTimeout(): void;\r\n isDebounced(): boolean;\r\n};\r\n\r\nexport default function debounce(\r\n fn: F,\r\n ms: number,\r\n shouldRunFirst = true,\r\n shouldRunLast = true\r\n): DebounceReturnType {\r\n let waitingTimeout: number;\r\n let waitingPromise: Promise>>, resolve: (result: any) => void, reject: () => void;\r\n let hadNewCall = false;\r\n\r\n const invoke = (args: Parameters) => {\r\n const _resolve = resolve, _reject = reject;\r\n try {\r\n const result = fn.apply(null, args);\r\n _resolve(result);\r\n } catch(err) {\r\n console.error('debounce error', err);\r\n // @ts-ignore\r\n _reject(err);\r\n }\r\n };\r\n\r\n const debounce = (...args: Parameters) => {\r\n if(!waitingPromise) waitingPromise = new Promise((_resolve, _reject) => (resolve = _resolve, reject = _reject));\r\n\r\n if(waitingTimeout) {\r\n clearTimeout(waitingTimeout);\r\n hadNewCall = true;\r\n reject();\r\n waitingPromise = new Promise((_resolve, _reject) => (resolve = _resolve, reject = _reject));\r\n } else if(shouldRunFirst) {\r\n invoke(args);\r\n hadNewCall = false;\r\n }\r\n\r\n const _waitingTimeout = ctx.setTimeout(() => {\r\n // will run if should run last or first but with new call\r\n if(shouldRunLast && (!shouldRunFirst || hadNewCall)) {\r\n invoke(args);\r\n }\r\n\r\n // if debounce was called during invoking\r\n if(waitingTimeout === _waitingTimeout) {\r\n waitingTimeout = waitingPromise = resolve = reject = undefined;\r\n hadNewCall = false;\r\n }\r\n }, ms);\r\n\r\n waitingTimeout = _waitingTimeout;\r\n waitingPromise.catch(noop);\r\n return waitingPromise;\r\n };\r\n\r\n debounce.clearTimeout = () => {\r\n if(waitingTimeout) {\r\n ctx.clearTimeout(waitingTimeout);\r\n reject();\r\n waitingTimeout = waitingPromise = resolve = reject = undefined;\r\n hadNewCall = false;\r\n }\r\n };\r\n\r\n debounce.isDebounced = () => !!waitingTimeout;\r\n\r\n return debounce;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {MOUNT_CLASS_TO} from '../config/debug';\r\nimport indexOfAndSplice from './array/indexOfAndSplice';\r\nimport compareValue from './compareValue';\r\n\r\n/**\r\n * Descend sorted storage\r\n */\r\n\r\ntype ItemType = number | string;\r\n\r\nexport enum SliceEnd {\r\n None = 0,\r\n Top = 1,\r\n Bottom = 2,\r\n Both = SliceEnd.Top | SliceEnd.Bottom\r\n};\r\n\r\nexport interface Slice extends Array {\r\n // slicedArray: SlicedArray;\r\n end: SliceEnd;\r\n\r\n isEnd: (side: SliceEnd) => boolean;\r\n setEnd: (side: SliceEnd) => void;\r\n unsetEnd: (side: SliceEnd) => void;\r\n getEnds: () => {top: boolean, bottom: boolean, both: boolean};\r\n\r\n slice: (from?: number, to?: number) => Slice;\r\n splice: (start: number, deleteCount: number, ...items: ItemType[]) => Slice;\r\n}\r\n\r\nexport interface SliceConstructor {\r\n // new(...items: T[]): Slice;\r\n new(length: number): Slice;\r\n}\r\n\r\nexport type SliceSerialized = {\r\n values: Slice,\r\n isEnd: {\r\n top: boolean,\r\n bottom: boolean,\r\n both: boolean\r\n }\r\n};\r\n\r\nexport type SlicedArraySerialized = {\r\n slices: SliceSerialized[]\r\n};\r\n\r\nexport default class SlicedArray {\r\n private slices: Slice[]/* = [[7,6,5],[4,3,2],[1,0,-1]] */;\r\n private sliceConstructor: SliceConstructor;\r\n\r\n constructor() {\r\n // @ts-ignore\r\n this.sliceConstructor = SlicedArray.getSliceConstructor(this);\r\n\r\n const first = this.constructSlice();\r\n // first.setEnd(SliceEnd.Bottom);\r\n this.slices = [first];\r\n }\r\n\r\n private static getSliceConstructor(slicedArray: SlicedArray) {\r\n return class Slice extends Array implements Slice {\r\n // slicedArray: SlicedArray;\r\n end: SliceEnd = SliceEnd.None;\r\n\r\n /* constructor(...items: ItemType[]) {\r\n super(...items);\r\n //this.slicedArray = slicedArray;\r\n } */\r\n\r\n isEnd(side: SliceEnd): boolean {\r\n if((this.end & side) === side) {\r\n return true;\r\n }/* else if(!this.slicedArray) {\r\n return false;\r\n } */\r\n\r\n let isEnd = false;\r\n if(side === SliceEnd.Top) {\r\n const slice = slicedArray.last;\r\n isEnd = slice.end & side ? this.includes(slice[slice.length - 1])/* || !slice.length */ : false;\r\n } else if(side === SliceEnd.Bottom) {\r\n const slice = slicedArray.first;\r\n isEnd = slice.end & side ? this.includes(slice[0])/* || !slice.length */ : false;\r\n } else if(side === SliceEnd.Both) {\r\n return this.isEnd(SliceEnd.Top) && this.isEnd(SliceEnd.Bottom);\r\n }\r\n\r\n if(isEnd) {\r\n this.setEnd(side);\r\n }\r\n\r\n return isEnd;\r\n }\r\n\r\n getEnds() {\r\n return {\r\n top: this.isEnd(SliceEnd.Top),\r\n bottom: this.isEnd(SliceEnd.Bottom),\r\n both: this.isEnd(SliceEnd.Both)\r\n };\r\n }\r\n\r\n setEnd(side: SliceEnd) {\r\n this.end |= side;\r\n }\r\n\r\n unsetEnd(side: SliceEnd) {\r\n this.end &= ~side;\r\n }\r\n\r\n splice(start: number, deleteCount: number, ...items: ItemType[]) {\r\n const ret = super.splice(start, deleteCount, ...items);\r\n\r\n if(!this.length) {\r\n const slices = slicedArray.slices as ItemType[][];\r\n const idx = slices.indexOf(this);\r\n if(idx !== -1) {\r\n if(slices.length === 1) { // left empty slice without ends\r\n this.unsetEnd(SliceEnd.Both);\r\n } else { // delete this slice\r\n slices.splice(idx, 1);\r\n }\r\n }\r\n }\r\n\r\n return ret;\r\n }\r\n }\r\n }\r\n\r\n public constructSlice(...items: T[]) {\r\n // const slice = new Slice(this, ...items);\r\n // can't pass items directly to constructor because first argument is length\r\n const slice = new this.sliceConstructor(items.length);\r\n for(let i = 0, length = items.length; i < length; ++i) {\r\n slice[i] = items[i];\r\n }\r\n return slice;\r\n\r\n // ! code below will slow execution in 15 times\r\n /* const self = this;\r\n const p: Slice = new Proxy(slice, {\r\n get: function(target, name: any) {\r\n if(name === 'constructor') {\r\n const p = new Proxy(Slice, {\r\n construct: (target, args) => {\r\n return self.constructSlice(...args);\r\n }\r\n });\r\n\r\n return p;\r\n }\r\n\r\n return target[name];\r\n }\r\n });\r\n\r\n return p; */\r\n\r\n /*\r\n var p = slicedArray.constructSlice();\r\n p.length = 100000;\r\n p.fill(255);\r\n\r\n var a = new Array(100000);\r\n a.fill(255);\r\n\r\n var b = 0;\r\n var perf = performance.now();\r\n for(var i = 0; i < p.length; ++i) {\r\n b += p[i];\r\n }\r\n\r\n console.log('perf 1', performance.now() - perf);\r\n\r\n b = 0;\r\n perf = performance.now();\r\n for(var i = 0; i < a.length; ++i) {\r\n b += a[i];\r\n }\r\n\r\n console.log('perf 2', performance.now() - perf);\r\n */\r\n }\r\n\r\n public insertSlice(slice: T[], flatten = true) {\r\n if(!slice.length) {\r\n return;\r\n }\r\n\r\n const first = this.slices[0];\r\n if(!first.length) {\r\n first.push(...slice);\r\n return first;\r\n }\r\n\r\n const lowerBound = slice[slice.length - 1];\r\n const upperBound = slice[0];\r\n\r\n let foundSlice: Slice, lowerIndex = -1, upperIndex = -1, foundSliceIndex = 0;\r\n for(; foundSliceIndex < this.slices.length; ++foundSliceIndex) {\r\n foundSlice = this.slices[foundSliceIndex];\r\n lowerIndex = foundSlice.indexOf(lowerBound);\r\n upperIndex = foundSlice.indexOf(upperBound);\r\n\r\n if(upperIndex !== -1 && -1 !== lowerIndex) {\r\n break;\r\n } else if(upperIndex !== -1 || -1 !== lowerIndex) {\r\n break;\r\n }\r\n }\r\n\r\n if(upperIndex !== -1 && -1 !== lowerIndex) {\r\n\r\n } else if(upperIndex !== -1) { // ([1, 2, 3] | [1, 2, 3, 4, 5]) -> [1, 2, 3, 4, 5]\r\n const sliced = slice.slice(foundSlice.length - upperIndex);\r\n foundSlice.push(...sliced);\r\n } else if(lowerIndex !== -1) { // ([1, 2, 3] | [-1, 0, 1]) -> [-1, 0, 1, 2, 3]\r\n const sliced = slice.slice(0, slice.length - lowerIndex - 1);\r\n foundSlice.unshift(...sliced);\r\n } else {\r\n let insertIndex = 0;\r\n for(const length = this.slices.length; insertIndex < length; ++insertIndex) { // * maybe should iterate from the end, could be faster ?\r\n const s = this.slices[insertIndex];\r\n if(compareValue(slice[0], s[0]) === 1) {\r\n break;\r\n }\r\n }\r\n\r\n this.slices.splice(insertIndex, 0, this.constructSlice(...slice));\r\n foundSliceIndex = insertIndex;\r\n }\r\n\r\n if(flatten) {\r\n return this.flatten(foundSliceIndex);\r\n }\r\n }\r\n\r\n private flatten(foundSliceIndex: number) {\r\n if(this.slices.length >= 2) {\r\n for(let i = 0, length = this.slices.length; i < (length - 1); ++i) {\r\n const prevSlice = this.slices[i];\r\n const nextSlice = this.slices[i + 1];\r\n\r\n const upperIndex = prevSlice.indexOf(nextSlice[0]);\r\n if(upperIndex !== -1) {\r\n prevSlice.setEnd(nextSlice.end);\r\n this.slices.splice(i + 1, 1);\r\n\r\n if(i < foundSliceIndex) {\r\n --foundSliceIndex;\r\n }\r\n\r\n --length; // respect array bounds\r\n --i; // repeat from the same place\r\n\r\n this.insertSlice(nextSlice, false);\r\n }\r\n }\r\n }\r\n\r\n return this.slices[foundSliceIndex];\r\n }\r\n\r\n // *\r\n\r\n get first() {\r\n return this.slices[0];\r\n }\r\n\r\n get last() {\r\n return this.slices[this.slices.length - 1];\r\n }\r\n\r\n get slice() {\r\n return this.first;\r\n }\r\n\r\n get length() {\r\n return this.slice.length;\r\n }\r\n\r\n public findSlice(item: T) {\r\n for(let i = 0, length = this.slices.length; i < length; ++i) {\r\n const slice = this.slices[i];\r\n const index = slice.indexOf(item);\r\n if(index !== -1) {\r\n return {slice, index};\r\n }\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n public findSliceOffset(maxId: T) {\r\n let slice: Slice;\r\n for(let i = 0; i < this.slices.length; ++i) {\r\n let offset = 0;\r\n slice = this.slices[i];\r\n if(slice.length < 2) {\r\n continue;\r\n }\r\n\r\n for(; offset < slice.length; ++offset) {\r\n if(compareValue(maxId, slice[offset]) >= 0) {\r\n /* if(!offset) { // because can't find 3 in [[5,4], [2,1]]\r\n return undefined;\r\n } */\r\n\r\n return {\r\n slice,\r\n offset: maxId === slice[offset] ? offset : offset - 1\r\n };\r\n }\r\n }\r\n }\r\n\r\n if(slice && slice.isEnd(SliceEnd.Top)) {\r\n return {\r\n slice,\r\n offset: slice.length\r\n };\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n // * https://core.telegram.org/api/offsets\r\n public sliceMe(offsetId: T, add_offset: number, limit: number) {\r\n let slice = this.slice;\r\n let offset = 0;\r\n let sliceOffset = 0;\r\n\r\n if(offsetId) {\r\n const pos = this.findSliceOffset(offsetId);\r\n if(!pos) {\r\n return undefined;\r\n }\r\n\r\n slice = pos.slice;\r\n offset = sliceOffset = pos.offset;\r\n\r\n if(slice.includes(offsetId)) {\r\n sliceOffset += 1;\r\n }\r\n\r\n /* if(slice.includes(offsetId) && add_offset < 0) {\r\n add_offset += 1;\r\n } */\r\n }\r\n\r\n const sliceStart = Math.max(sliceOffset + add_offset, 0);\r\n const sliceEnd = sliceOffset + add_offset + limit;\r\n // const fixHalfBackLimit = add_offset && !(limit / add_offset % 2) && (sliceEnd % 2) ? 1 : 0;\r\n // sliceEnd += fixHalfBackLimit;\r\n\r\n const sliced = slice.slice(sliceStart, sliceEnd) as Slice;\r\n\r\n const topWasMeantToLoad = add_offset < 0 ? limit + add_offset : limit;\r\n const bottomWasMeantToLoad = Math.abs(add_offset);\r\n\r\n // can use 'slice' here to check because if it's end, then 'sliced' is out of 'slice'\r\n // useful when there is only 1 message in chat on its reopening\r\n const topFulfilled = (slice.length - sliceOffset) >= topWasMeantToLoad || (slice.isEnd(SliceEnd.Top) ? (sliced.setEnd(SliceEnd.Top), true) : false);\r\n const bottomFulfilled = (sliceOffset - bottomWasMeantToLoad) >= 0 || (slice.isEnd(SliceEnd.Bottom) ? (sliced.setEnd(SliceEnd.Bottom), true) : false);\r\n\r\n // if(topFulfilled) sliced.isEnd(SliceEnd.Top);\r\n // if(bottomFulfilled) sliced.isEnd(SliceEnd.Bottom);\r\n\r\n return {\r\n slice: sliced,\r\n offsetIdOffset: offset,\r\n fulfilled: SliceEnd.None | (topFulfilled && bottomFulfilled ? SliceEnd.Both : ((topFulfilled ? SliceEnd.Top : SliceEnd.None) | (bottomFulfilled ? SliceEnd.Bottom : SliceEnd.None)))\r\n };\r\n }\r\n\r\n public unshift(...items: T[]) {\r\n let slice = this.first;\r\n if(!slice.length) {\r\n slice.setEnd(SliceEnd.Bottom);\r\n } else if(!slice.isEnd(SliceEnd.Bottom)) {\r\n slice = this.constructSlice();\r\n slice.setEnd(SliceEnd.Bottom);\r\n this.slices.unshift(slice);\r\n }\r\n\r\n slice.unshift(...items);\r\n }\r\n\r\n public push(...items: T[]) {\r\n let slice = this.last;\r\n if(!slice.length) {\r\n slice.setEnd(SliceEnd.Top);\r\n } else if(!slice.isEnd(SliceEnd.Top)) {\r\n slice = this.constructSlice();\r\n slice.setEnd(SliceEnd.Top);\r\n this.slices.push(slice);\r\n }\r\n\r\n slice.push(...items);\r\n }\r\n\r\n public delete(item: T) {\r\n const found = this.findSlice(item);\r\n if(found) {\r\n found.slice.splice(found.index, 1);\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n public deleteSlice(slice: Slice) {\r\n indexOfAndSplice(this.slices, slice);\r\n }\r\n\r\n public toJSON() {\r\n const slices: SlicedArraySerialized['slices'] = this.slices.map((slice) => {\r\n return {\r\n values: slice.slice(),\r\n isEnd: slice.getEnds()\r\n };\r\n });\r\n\r\n const serialized: SlicedArraySerialized = {\r\n slices\r\n };\r\n\r\n return JSON.stringify(serialized);\r\n }\r\n\r\n public static fromJSON(json: string) {\r\n const parsed: SlicedArraySerialized = JSON.parse(json);\r\n const sliced = new SlicedArray();\r\n parsed.slices.forEach((slice) => {\r\n const inserted = sliced.insertSlice(slice.values) || sliced.first;\r\n if(slice.isEnd.top) inserted.setEnd(SliceEnd.Top);\r\n if(slice.isEnd.bottom) inserted.setEnd(SliceEnd.Bottom);\r\n });\r\n\r\n return sliced;\r\n }\r\n}\r\n\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.SlicedArray = SlicedArray);\r\n","import compareLong from './long/compareLong';\n\nexport default function compareValue(val1: string | number, val2: typeof val1) {\n if((val1 as number).toExponential) {\n const diff = (val1 as number) - (val2 as number);\n return diff < 0 ? -1 : (diff > 0 ? 1 : 0);\n }\n\n return compareLong(val1 as string, val2 as string);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function compareLong(str1: string, str2: string) {\n const str1Length = str1.length;\n if(str1Length !== str2.length) {\n const diff = str1Length - str2.length;\n return diff < 0 ? -1 : (diff > 0 ? 1 : 0);\n }\n\n const maxPartLength = 15;\n for(let i = 0; i < str1Length; i += maxPartLength) {\n const v1 = +str1.slice(i, i + maxPartLength);\n const v2 = +str2.slice(i, i + maxPartLength);\n const diff = v1 - v2;\n if(diff) {\n return diff;\n }\n }\n\n return 0;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {ChannelParticipant, ChatParticipant} from '../../../../layer';\nimport getPeerId from '../peers/getPeerId';\n\nexport default function getParticipantPeerId(participant: ChannelParticipant | ChatParticipant): PeerId {\n const peerId = (participant as ChannelParticipant.channelParticipantBanned).peer ?\n getPeerId((participant as ChannelParticipant.channelParticipantBanned).peer) :\n (participant as ChatParticipant.chatParticipant).user_id.toPeerId();\n return peerId;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {Chat, ChatAdminRights, ChatBannedRights} from '../../../../layer';\nimport {ChatRights} from '../../appChatsManager';\n\n/**\n * Check the user's ability to do an action in chat\n * @param id\n * @param action creator can still send messages to left channel. so this function shows server rights. see canSendToPeer for local rights in messages manager.\n * @param rights do not provide this parameter when checking rights for self\n * @param isThread\n * @returns\n */\nexport default function hasRights(chat: Chat, action: ChatRights, rights?: ChatAdminRights | ChatBannedRights, isThread?: boolean) {\n if(chat._ === 'chatEmpty') return false;\n\n if((chat as Chat.chat).pFlags.deactivated && action !== 'view_messages') {\n return false;\n }\n\n const isCheckingRightsForSelf = rights === undefined;\n if((chat as Chat.chat).pFlags.creator && isCheckingRightsForSelf) {\n return true;\n }\n\n if(chat._ === 'chatForbidden' ||\n chat._ === 'channelForbidden' ||\n // (chat as any).pFlags.kicked ||\n (chat.pFlags.left && !(chat as Chat.channel).pFlags.megagroup)) {\n return false;\n }\n\n // const adminRights = chat.admin_rights;\n // const bannedRights = (chat as Chat.channel).banned_rights || chat.default_banned_rights;\n\n if(!rights) {\n rights = chat.admin_rights || (chat as Chat.channel).banned_rights || chat.default_banned_rights;\n\n if(!rights) {\n return false;\n }\n }\n\n let myFlags: Partial<{[flag in keyof ChatBannedRights['pFlags'] | keyof ChatAdminRights['pFlags']]: true}> = {};\n if(rights) {\n myFlags = rights.pFlags as any;\n }\n\n // const adminFlags = adminRights?.pFlags || {};\n // const bannedFlags = bannedRights?.pFlags || {};\n\n switch(action) {\n case 'embed_links':\n case 'send_games':\n case 'send_gifs':\n case 'send_inline':\n case 'send_media':\n case 'send_messages':\n case 'send_polls':\n case 'send_stickers': {\n if(!isThread && chat.pFlags.left) {\n return false;\n }\n\n if(rights._ === 'chatBannedRights' && myFlags[action]) {\n return false;\n }\n\n if(chat._ === 'channel') {\n if(!chat.pFlags.megagroup && !myFlags.post_messages) {\n return false;\n }\n }\n\n break;\n }\n\n // * revoke foreign messages\n case 'delete_messages':\n case 'manage_call': {\n return !!myFlags[action];\n }\n\n case 'pin_messages': {\n return rights._ === 'chatAdminRights' ? myFlags[action] || !!myFlags.post_messages : !myFlags[action];\n }\n\n // case 'change_info': {\n // return adminRights || isCheckingRightsForSelf ? adminFlags[action] : !myFlags[action];\n // }\n\n case 'change_info':\n case 'invite_users': {\n return rights._ === 'chatAdminRights' ? myFlags[action] : !myFlags[action];\n }\n\n // * only creator can do that\n case 'change_type':\n case 'delete_chat': {\n return false;\n }\n\n case 'ban_users':\n case 'change_permissions': {\n return rights._ === 'chatAdminRights' && !!myFlags['ban_users'];\n }\n\n case 'view_participants': {\n return !!(chat._ === 'chat' || !chat.pFlags.broadcast || chat.pFlags.creator || chat.admin_rights);\n }\n }\n\n return true;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {Dialog} from '../../../../layer';\nimport getDialogIndexKey from './getDialogIndexKey';\n\nexport default function getDialogIndex(\n dialog: Dialog.dialog,\n indexKey: ReturnType = getDialogIndexKey(dialog.folder_id)\n) {\n return dialog?.[indexKey];\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {DialogFilter} from '../../../../layer';\n\nexport default function getDialogIndexKey(localId?: DialogFilter.dialogFilter['localId']) {\n return `index_${localId}` as const;\n // return filterId !== undefined && filterId > 1 ? `filter_${filterId}` as const : 'main' as const;\n // const indexStr = filterId > 1 ?\n // `index_${filterId}` as const :\n // 'index' as const;\n\n // return indexStr;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type {Document, PhotoSize, VideoSize} from '../../../../layer';\r\nimport type {DownloadOptions} from '../../../mtproto/apiFileManager';\r\nimport getDocumentInputFileLocation from './getDocumentInputFileLocation';\r\n\r\nexport default function getDocumentDownloadOptions(doc: Document.document, thumb?: PhotoSize.photoSize | VideoSize, queueId?: number, onlyCache?: boolean): DownloadOptions {\r\n const inputFileLocation = getDocumentInputFileLocation(doc, thumb?.type);\r\n\r\n let mimeType: MTMimeType;\r\n if(thumb?._ === 'photoSize') {\r\n mimeType = doc.sticker ? 'image/webp' : 'image/jpeg'/* doc.mime_type */;\r\n } else {\r\n mimeType = doc.mime_type || 'application/octet-stream';\r\n }\r\n\r\n return {\r\n dcId: doc.dc_id,\r\n location: inputFileLocation,\r\n size: thumb ? thumb.size : doc.size,\r\n mimeType,\r\n fileName: doc.file_name,\r\n queueId,\r\n onlyCache\r\n };\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {Document, InputFileLocation} from '../../../../layer';\r\n\r\nexport default function getDocumentInputFileLocation(doc: Document.document, thumbSize?: string): InputFileLocation.inputDocumentFileLocation {\r\n return {\r\n _: 'inputDocumentFileLocation',\r\n id: doc.id,\r\n access_hash: doc.access_hash,\r\n file_reference: doc.file_reference,\r\n thumb_size: thumbSize\r\n };\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {getFileNameByLocation} from '../../../../helpers/fileName';\r\nimport {DownloadOptions} from '../../../mtproto/apiFileManager';\r\n\r\nexport default function getDownloadFileNameFromOptions(options: DownloadOptions) {\r\n return getFileNameByLocation(options.location, options);\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type {DownloadMediaOptions, DownloadOptions} from '../../../mtproto/apiFileManager';\r\nimport getDocumentDownloadOptions from '../docs/getDocumentDownloadOptions';\r\nimport getPhotoDownloadOptions from '../photos/getPhotoDownloadOptions';\r\nimport getWebDocumentDownloadOptions from '../webDocs/getWebDocumentDownloadOptions';\r\nimport isWebDocument from '../webDocs/isWebDocument';\r\nimport getDownloadFileNameFromOptions from './getDownloadFileNameFromOptions';\r\n\r\nexport default function getDownloadMediaDetails(options: DownloadMediaOptions) {\r\n const {media, thumb, queueId, onlyCache} = options;\r\n\r\n let downloadOptions: DownloadOptions;\r\n if(media._ === 'document') downloadOptions = getDocumentDownloadOptions(media, thumb as any, queueId, onlyCache);\r\n else if(media._ === 'photo') downloadOptions = getPhotoDownloadOptions(media, thumb as any, queueId, onlyCache);\r\n else if(isWebDocument(media)) downloadOptions = getWebDocumentDownloadOptions(media);\r\n\r\n downloadOptions.downloadId = options.downloadId;\r\n\r\n const fileName = getDownloadFileNameFromOptions(downloadOptions);\r\n return {fileName, downloadOptions};\r\n}\r\n","import {WebDocument} from '../../../../layer';\nimport {DownloadOptions} from '../../../mtproto/apiFileManager';\n\nexport default function getWebDocumentDownloadOptions(webDocument: WebDocument): DownloadOptions {\n return {\n dcId: 0,\n location: {\n _: 'inputWebFileLocation',\n access_hash: (webDocument as WebDocument.webDocument).access_hash,\n url: webDocument.url\n },\n size: webDocument.size,\n mimeType: webDocument.mime_type\n };\n}\n","import deepEqual from '../../../../helpers/object/deepEqual';\nimport isObject from '../../../../helpers/object/isObject';\nimport {DraftMessage} from '../../../../layer';\n\nexport default function draftsAreEqual(draft1: DraftMessage, draft2: DraftMessage) {\n if(typeof(draft1) !== typeof(draft2)) {\n return false;\n }\n\n if(!isObject(draft1)) {\n return true;\n }\n\n if(draft1._ !== draft2._) {\n return false;\n }\n\n if(draft1._ === 'draftMessage' && draft2._ === draft1._) {\n if(draft1.reply_to_msg_id !== draft2.reply_to_msg_id) {\n return false;\n }\n\n if(!deepEqual(draft1.entities, draft2.entities)) {\n return false;\n }\n\n if(draft1.message !== draft2.message) {\n return false;\n }\n\n if(draft1.pFlags.no_webpage !== draft2.pFlags.no_webpage) {\n return false;\n }\n }\n\n return true;\n}\n","import {MessagesBotResults} from '../../../../layer';\n\nexport default function generateQId(queryId: MessagesBotResults.messagesBotResults['query_id'], resultId: string) {\n return queryId + '_' + resultId;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {MESSAGE_ID_OFFSET, MESSAGE_ID_INCREMENT} from '.';\n\nexport default function generateMessageId(messageId: number) {\n const q = MESSAGE_ID_OFFSET;\n if(messageId >= q) {\n return messageId;\n }\n\n return q + (messageId * MESSAGE_ID_INCREMENT);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport clearMessageId from './clearMessageId';\n\n/**\n * * will ignore outgoing offset\n */\nexport default function getServerMessageId(messageId: number) {\n return clearMessageId(messageId, true);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {MESSAGE_ID_OFFSET, MESSAGE_ID_INCREMENT} from '.';\n\nexport default function clearMessageId(messageId: number, toServer?: boolean) {\n const q = MESSAGE_ID_OFFSET;\n if(messageId < q) { // id 0 -> mid 0xFFFFFFFF, so 0xFFFFFFFF must convert to 0\n return messageId;\n }\n\n const l = MESSAGE_ID_INCREMENT - 1;\n const used = messageId & l;\n if(used !== l) {\n messageId -= used + 1;\n }\n\n return toServer ? (messageId - q) / MESSAGE_ID_INCREMENT : messageId;\n}\n","export const MESSAGE_ID_INCREMENT = 0x10000;\nexport const MESSAGE_ID_OFFSET = 0xFFFFFFFF;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {Message, MessageMedia, MessageEntity, MessageAction} from '../../../../layer';\nimport matchUrl from '../../../richTextProcessor/matchUrl';\nimport type {MyDocument} from '../../appDocsManager';\nimport type {MyInputMessagesFilter, MyMessage} from '../../appMessagesManager';\n\nexport default function filterMessagesByInputFilter(inputFilter: MyInputMessagesFilter, history: Array, limit: number) {\n if(inputFilter === 'inputMessagesFilterEmpty') {\n return history;\n }\n\n const foundMsgs: MyMessage[] = [];\n if(!history.length) {\n return foundMsgs;\n }\n\n let filtering = true;\n const neededContents: Partial<{\n [messageMediaType in MessageMedia['_']]: boolean\n }> & Partial<{\n avatar: boolean,\n url: boolean\n }> = {},\n neededDocTypes: MyDocument['type'][] = [],\n excludeDocTypes: MyDocument['type'][] = []/* ,\n neededFlags: string[] = [] */;\n\n switch(inputFilter) {\n case 'inputMessagesFilterPhotos':\n neededContents['messageMediaPhoto'] = true;\n break;\n\n case 'inputMessagesFilterPhotoVideo':\n neededContents['messageMediaPhoto'] = true;\n neededContents['messageMediaDocument'] = true;\n neededDocTypes.push('video');\n break;\n\n case 'inputMessagesFilterVideo':\n neededContents['messageMediaDocument'] = true;\n neededDocTypes.push('video');\n break;\n\n case 'inputMessagesFilterDocument':\n neededContents['messageMediaDocument'] = true;\n // excludeDocTypes.push('video');\n neededDocTypes.push(undefined, 'photo', 'pdf');\n break;\n\n case 'inputMessagesFilterVoice':\n neededContents['messageMediaDocument'] = true;\n neededDocTypes.push('voice');\n break;\n\n case 'inputMessagesFilterRoundVoice':\n neededContents['messageMediaDocument'] = true;\n neededDocTypes.push('round', 'voice');\n break;\n\n case 'inputMessagesFilterRoundVideo':\n neededContents['messageMediaDocument'] = true;\n neededDocTypes.push('round');\n break;\n\n case 'inputMessagesFilterMusic':\n neededContents['messageMediaDocument'] = true;\n neededDocTypes.push('audio');\n break;\n\n case 'inputMessagesFilterUrl':\n neededContents['url'] = true;\n break;\n\n case 'inputMessagesFilterChatPhotos':\n neededContents['avatar'] = true;\n break;\n\n /* case 'inputMessagesFilterPinned':\n neededFlags.push('pinned');\n break; */\n\n /* case 'inputMessagesFilterMyMentions':\n neededContents['mentioned'] = true;\n break; */\n\n default:\n filtering = false;\n break;\n /* return Promise.resolve({\n count: 0,\n next_rate: 0,\n history: [] as number[]\n }); */\n }\n\n if(!filtering) {\n return foundMsgs;\n }\n\n for(let i = 0, length = history.length; i < length; ++i) {\n const message: Message.message | Message.messageService = history[i];\n if(!message) continue;\n\n // || (neededContents['mentioned'] && message.totalEntities.find((e: any) => e._ === 'messageEntityMention'));\n\n let found = false;\n if(message._ === 'message') {\n if(message.media && neededContents[message.media._]/* && !message.fwd_from */) {\n const doc = (message.media as MessageMedia.messageMediaDocument).document as MyDocument;\n if(doc &&\n (\n (neededDocTypes.length && !neededDocTypes.includes(doc.type)) ||\n excludeDocTypes.includes(doc.type)\n )\n ) {\n continue;\n }\n\n found = true;\n } else if(neededContents['url'] && message.message) {\n const goodEntities = ['messageEntityTextUrl', 'messageEntityUrl'];\n if((message.totalEntities as MessageEntity[]).find((e) => goodEntities.includes(e._)) || matchUrl(message.message)) {\n found = true;\n }\n }\n } else if(neededContents['avatar'] &&\n message.action &&\n ([\n 'messageActionChannelEditPhoto' as const,\n 'messageActionChatEditPhoto' as const,\n 'messageActionChannelEditVideo' as const,\n 'messageActionChatEditVideo' as const\n ] as MessageAction['_'][]).includes(message.action._)) {\n found = true;\n }/* else if(neededFlags.find((flag) => message.pFlags[flag])) {\n found = true;\n } */\n\n if(found) {\n foundMsgs.push(message);\n if(foundMsgs.length >= limit) {\n break;\n }\n }\n }\n\n return foundMsgs;\n}\n","import assumeType from '../../../../helpers/assumeType';\nimport {Message, MessageEntity} from '../../../../layer';\n\nexport default function getAlbumText(messages: Message.message[]) {\n let foundMessages = 0, message: string, totalEntities: MessageEntity[], entities: MessageEntity[];\n for(const m of messages) {\n assumeType(m);\n if(m.message) {\n if(++foundMessages > 1) break;\n message = m.message;\n totalEntities = m.totalEntities;\n entities = m.entities;\n }\n }\n\n if(foundMessages > 1) {\n message = undefined;\n totalEntities = undefined;\n entities = undefined;\n }\n\n return {message, entities, totalEntities};\n}\n","import isObject from '../../../../helpers/object/isObject';\nimport {InputPeer, Peer} from '../../../../layer';\nimport {NULL_PEER_ID} from '../../../mtproto/mtproto_config';\n\nexport default function getPeerId(peerId: {user_id: UserId} | {channel_id: ChatId} | {chat_id: ChatId} | InputPeer | PeerId | string): PeerId {\n if(peerId !== undefined && ((peerId as string).isPeerId ? (peerId as string).isPeerId() : false)) return peerId as PeerId;\n // if(typeof(peerId) === 'string' && /^[uc]/.test(peerId)) return peerId as PeerId;\n // if(typeof(peerId) === 'number') return peerId;\n else if(isObject(peerId)) {\n const userId = (peerId as Peer.peerUser).user_id;\n if(userId !== undefined) {\n return userId.toPeerId(false);\n }\n\n const chatId = (peerId as Peer.peerChannel).channel_id || (peerId as Peer.peerChat).chat_id;\n if(chatId !== undefined) {\n return chatId.toPeerId(true);\n }\n\n return NULL_PEER_ID; // maybe it is an inputPeerSelf\n // } else if(!peerId) return 'u0';\n } else if(!peerId) return NULL_PEER_ID;\n\n const isUser = (peerId as string).charAt(0) === 'u';\n const peerParams = (peerId as string).substr(1).split('_');\n\n return isUser ? peerParams[0].toPeerId() : (peerParams[0] || '').toPeerId(true);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {PhotoSize, InputFileLocation} from '../../../../layer';\nimport type {DownloadOptions} from '../../../mtproto/apiFileManager';\nimport type {MyDocument} from '../../appDocsManager';\nimport type {MyPhoto} from '../../appPhotosManager';\n\nexport default function getPhotoDownloadOptions(photo: MyPhoto | MyDocument, photoSize: PhotoSize, queueId?: number, onlyCache?: boolean): DownloadOptions {\n const isDocument = photo._ === 'document';\n\n if(!photoSize || photoSize._ === 'photoSizeEmpty') {\n // console.error('no photoSize by photo:', photo);\n throw new Error('photoSizeEmpty!');\n }\n\n // maybe it's a thumb\n const isPhoto = !!((photoSize._ === 'photoSize' || photoSize._ === 'photoSizeProgressive') && photo.access_hash && photo.file_reference);\n const location: InputFileLocation.inputPhotoFileLocation | InputFileLocation.inputDocumentFileLocation = {\n _: isDocument ? 'inputDocumentFileLocation' : 'inputPhotoFileLocation',\n id: photo.id,\n access_hash: photo.access_hash,\n file_reference: photo.file_reference,\n thumb_size: photoSize.type\n };\n\n return {\n dcId: photo.dc_id,\n location,\n size: isPhoto ? (photoSize as PhotoSize.photoSize).size : undefined,\n mimeType: 'image/jpeg',\n queueId,\n onlyCache\n };\n}\n","import deepEqual from '../../../../helpers/object/deepEqual';\nimport {Reaction} from '../../../../layer';\n\nexport default function reactionsEqual(r1: Reaction, r2: Reaction) {\n return deepEqual(r1, r2);\n}\n","import {MyDocument} from '../../appDocsManager';\n\nexport default function getStickerEffectThumb(doc: MyDocument) {\n return doc.video_thumbs?.[0];\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {User} from '../../../../layer';\nimport {REPLIES_PEER_ID} from '../../../mtproto/mtproto_config';\n\nexport default function canSendToUser(user: User.user) {\n return !user.pFlags.deleted && user.id.toPeerId() !== REPLIES_PEER_ID;\n}\n","import {WebDocument} from '../../../../layer';\n\nexport default function isWebDocument(webDocument: any): webDocument is WebDocument {\n return !!(webDocument && (webDocument._ === 'webDocument' || webDocument._ === 'webDocumentNoProxy'));\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport enum ConnectionStatus {\r\n Connected,\r\n Connecting,\r\n Closed,\r\n TimedOut\r\n};\r\n\r\nexport type ConnectionStatusChange = {\r\n _: 'networkerStatus',\r\n status: ConnectionStatus,\r\n dcId: number,\r\n name: string,\r\n isFileNetworker: boolean,\r\n isFileDownload: boolean,\r\n isFileUpload: boolean,\r\n retryAt?: number\r\n};\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {MessageEntity} from '../../layer';\n\nconst CAN_COMBINE_ENTITIES: Set = new Set([\n 'messageEntityBold',\n 'messageEntityItalic',\n 'messageEntityCode',\n 'messageEntityPre',\n 'messageEntityUnderline',\n 'messageEntityStrike',\n 'messageEntityBlockquote',\n 'messageEntitySpoiler'\n]);\nexport default function combineSameEntities(entities: MessageEntity[]) {\n // entities = entities.slice();\n for(let i = 0; i < entities.length; ++i) {\n const entity = entities[i];\n\n let nextEntityIdx = -1;\n do {\n nextEntityIdx = entities.findIndex((e, _i) => {\n return CAN_COMBINE_ENTITIES.has(e._) && _i !== i && e._ === entity._ && (e.offset - entity.length) === entity.offset;\n });\n\n if(nextEntityIdx !== -1) {\n const nextEntity = entities[nextEntityIdx];\n entity.length += nextEntity.length;\n entities.splice(nextEntityIdx, 1);\n }\n } while(nextEntityIdx !== -1);\n }\n // return entities;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {MessageEntity} from '../../layer';\nimport spoiler from './spoiler';\n\nexport default function encodeSpoiler(text: string, entity: MessageEntity.messageEntitySpoiler) {\n const before = text.slice(0, entity.offset);\n const spoilerBefore = text.slice(entity.offset, entity.offset + entity.length);\n const spoilerAfter = spoiler(spoilerBefore)/* '▚'.repeat(entity.length) */;\n const after = text.slice(entity.offset + entity.length);\n text = before + spoilerAfter + after;\n return {text, entityText: spoilerAfter};\n};\n","export default function spoiler(text: string): string {\n const chars = '⠁⠂⠄⠈⠐⠠⡀⢀⠃⠅⠆⠉⠊⠌⠑⠒⠔⠘⠡⠢⠤⠨⠰⡁⡂⡄⡈⡐⡠⢁⢂⢄⢈⢐⢠⣀⠇⠋⠍⠎⠓⠕⠖⠙⠚⠜⠣⠥⠦⠩⠪⠬⠱⠲⠴⠸⡃⡅⡆⡉⡊⡌⡑⡒⡔⡘⡡⡢⡤⡨⡰⢃⢅⢆⢉⢊⢌⢑⢒⢔⢘⢡⢢⢤⢨⢰⣁⣂⣄⣈⣐⣠⠏⠗⠛⠝⠞⠧⠫⠭⠮⠳⠵⠶⠹⠺⠼⡇⡋⡍⡎⡓⡕⡖⡙⡚⡜⡣⡥⡦⡩⡪⡬⡱⡲⡴⡸⢇⢋⢍⢎⢓⢕⢖⢙⢚⢜⢣⢥⢦⢩⢪⢬⢱⢲⢴⢸⣃⣅⣆⣉⣊⣌⣑⣒⣔⣘⣡⣢⣤⣨⣰⠟⠯⠷⠻⠽⠾⡏⡗⡛⡝⡞⡧⡫⡭⡮⡳⡵⡶⡹⡺⡼⢏⢗⢛⢝⢞⢧⢫⢭⢮⢳⢵⢶⢹⢺⢼⣇⣋⣍⣎⣓⣕⣖⣙⣚⣜⣣⣥⣦⣩⣪⣬⣱⣲⣴⣸⠿⡟⡯⡷⡻⡽⡾⢟⢯⢷⢻⢽⢾⣏⣗⣛⣝⣞⣧⣫⣭⣮⣳⣵⣶⣹⣺⣼⡿⢿⣟⣯⣷⣻⣽⣾⣿';\n const charsLength = chars.length;\n\n const out: string[] = [];\n for(let i = 0; i < text.length; ++i) {\n const char = text.charCodeAt(i);\n out.push(chars[char % charsLength]);\n }\n\n return out.join('');\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {PASS_CONFLICTING_ENTITIES} from '.';\nimport {MessageEntity} from '../../layer';\n\nconst SINGLE_ENTITIES: Set = new Set(['messageEntityPre', 'messageEntityCode']);\n\nexport default function findConflictingEntity(currentEntities: MessageEntity[], newEntity: MessageEntity) {\n let singleEnd = -1;\n return currentEntities.find((currentEntity) => {\n if(SINGLE_ENTITIES.has(currentEntity._)) {\n singleEnd = currentEntity.offset + currentEntity.length;\n }\n\n if(newEntity.offset < singleEnd && !PASS_CONFLICTING_ENTITIES.has(newEntity._)) {\n return true;\n }\n\n const isConflictingTypes = newEntity._ === currentEntity._ ||\n (!PASS_CONFLICTING_ENTITIES.has(newEntity._) && !PASS_CONFLICTING_ENTITIES.has(currentEntity._));\n\n if(!isConflictingTypes) {\n return false;\n }\n\n const isConflictingOffset = newEntity.offset >= currentEntity.offset &&\n (newEntity.length + newEntity.offset) <= (currentEntity.length + currentEntity.offset);\n\n return isConflictingOffset;\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {MessageEntity} from '../../layer';\n\nexport default function fixEmoji(text: string, entities?: MessageEntity[]) {\n /* if(!IS_EMOJI_SUPPORTED) {\n return text;\n } */\n // '$`\\ufe0f'\n\n text = text.replace(/[\\u2640\\u2642\\u2764](?!\\ufe0f)/g, (match, offset, string) => {\n if(entities) {\n const length = match.length;\n\n offset += length;\n entities.forEach((entity) => {\n const end = entity.offset + entity.length;\n if(end === offset) { // current entity\n entity.length += length;\n } else if(end > offset) {\n entity.offset += length;\n }\n });\n }\n\n // console.log([match, offset, string]);\n return match + '\\ufe0f';\n });\n\n return text;\n}\n","import {URL_REG_EXP} from '.';\n\nexport default function matchUrl(text: string) {\n return !text ? null : text.match(URL_REG_EXP);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {MessageEntity} from '../../layer';\nimport findConflictingEntity from './findConflictingEntity';\nimport sortEntities from './sortEntities';\n\nexport default function mergeEntities(currentEntities: MessageEntity[], newEntities: MessageEntity[]) {\n const filtered = newEntities.filter((e) => {\n return !findConflictingEntity(currentEntities, e);\n });\n\n currentEntities.push(...filtered);\n sortEntities(currentEntities);\n // currentEntities.sort((a, b) => a.offset - b.offset);\n // currentEntities.sort((a, b) => (a.offset - b.offset) || (a._ === 'messageEntityCaret' && -1));\n\n // * fix splitted emoji. messageEntityTextUrl can split the emoji if starts before its end (e.g. on fe0f)\n // * have to fix even if emoji supported since it's being wrapped in span\n // if(!IS_EMOJI_SUPPORTED) {\n for(let i = 0; i < currentEntities.length; ++i) {\n const entity = currentEntities[i];\n if(entity._ === 'messageEntityEmoji') {\n const nextEntity = currentEntities[i + 1];\n if(nextEntity /* && nextEntity._ !== 'messageEntityCaret' */ && nextEntity.offset < (entity.offset + entity.length)) {\n entity.length = nextEntity.offset - entity.offset;\n }\n }\n }\n // }\n\n return currentEntities;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\n// From https://github.com/stephenmathieson/node-tlds/blob/master/index.js\nconst TLD = ['abogado', 'ac', 'academy', 'accountants', 'active', 'actor', 'ad', 'adult', 'ae', 'aero', 'af', 'ag', 'agency', 'ai', 'airforce', 'al', 'allfinanz', 'alsace', 'am', 'amsterdam', 'an', 'android', 'ao', 'apartments', 'aq', 'aquarelle', 'ar', 'archi', 'army', 'arpa', 'as', 'asia', 'associates', 'at', 'attorney', 'au', 'auction', 'audio', 'autos', 'aw', 'ax', 'axa', 'az', 'ba', 'band', 'bank', 'bar', 'barclaycard', 'barclays', 'bargains', 'bayern', 'bb', 'bd', 'be', 'beer', 'berlin', 'best', 'bf', 'bg', 'bh', 'bi', 'bid', 'bike', 'bingo', 'bio', 'biz', 'bj', 'black', 'blackfriday', 'bloomberg', 'blue', 'bm', 'bmw', 'bn', 'bnpparibas', 'bo', 'boo', 'boutique', 'br', 'brussels', 'bs', 'bt', 'budapest', 'build', 'builders', 'business', 'buzz', 'bv', 'bw', 'by', 'bz', 'bzh', 'ca', 'cab', 'cal', 'camera', 'camp', 'cancerresearch', 'canon', 'capetown', 'capital', 'caravan', 'cards', 'care', 'career', 'careers', 'cartier', 'casa', 'cash', 'cat', 'catering', 'cc', 'cd', 'center', 'ceo', 'cern', 'cf', 'cg', 'ch', 'channel', 'chat', 'cheap', 'christmas', 'chrome', 'church', 'ci', 'citic', 'city', 'ck', 'cl', 'claims', 'cleaning', 'click', 'clinic', 'clothing', 'club', 'cm', 'cn', 'co', 'coach', 'codes', 'coffee', 'college', 'cologne', 'com', 'community', 'company', 'computer', 'condos', 'construction', 'consulting', 'contractors', 'cooking', 'cool', 'coop', 'country', 'cr', 'credit', 'creditcard', 'cricket', 'crs', 'cruises', 'cu', 'cuisinella', 'cv', 'cw', 'cx', 'cy', 'cymru', 'cz', 'dabur', 'dad', 'dance', 'dating', 'day', 'dclk', 'de', 'deals', 'degree', 'delivery', 'democrat', 'dental', 'dentist', 'desi', 'design', 'dev', 'diamonds', 'diet', 'digital', 'direct', 'directory', 'discount', 'dj', 'dk', 'dm', 'dnp', 'do', 'docs', 'domains', 'doosan', 'durban', 'dvag', 'dz', 'eat', 'ec', 'edu', 'education', 'ee', 'eg', 'email', 'emerck', 'energy', 'engineer', 'engineering', 'enterprises', 'equipment', 'er', 'es', 'esq', 'estate', 'et', 'eu', 'eurovision', 'eus', 'events', 'everbank', 'exchange', 'expert', 'exposed', 'fail', 'farm', 'fashion', 'feedback', 'fi', 'finance', 'financial', 'firmdale', 'fish', 'fishing', 'fit', 'fitness', 'fj', 'fk', 'flights', 'florist', 'flowers', 'flsmidth', 'fly', 'fm', 'fo', 'foo', 'forsale', 'foundation', 'fr', 'frl', 'frogans', 'fund', 'furniture', 'futbol', 'ga', 'gal', 'gallery', 'garden', 'gb', 'gbiz', 'gd', 'ge', 'gent', 'gf', 'gg', 'ggee', 'gh', 'gi', 'gift', 'gifts', 'gives', 'gl', 'glass', 'gle', 'global', 'globo', 'gm', 'gmail', 'gmo', 'gmx', 'gn', 'goog', 'google', 'gop', 'gov', 'gp', 'gq', 'gr', 'graphics', 'gratis', 'green', 'gripe', 'gs', 'gt', 'gu', 'guide', 'guitars', 'guru', 'gw', 'gy', 'hamburg', 'hangout', 'haus', 'healthcare', 'help', 'here', 'hermes', 'hiphop', 'hiv', 'hk', 'hm', 'hn', 'holdings', 'holiday', 'homes', 'horse', 'host', 'hosting', 'house', 'how', 'hr', 'ht', 'hu', 'ibm', 'id', 'ie', 'ifm', 'il', 'im', 'immo', 'immobilien', 'in', 'industries', 'info', 'ing', 'ink', 'institute', 'insure', 'int', 'international', 'investments', 'io', 'iq', 'ir', 'irish', 'is', 'it', 'iwc', 'jcb', 'je', 'jetzt', 'jm', 'jo', 'jobs', 'joburg', 'jp', 'juegos', 'kaufen', 'kddi', 'ke', 'kg', 'kh', 'ki', 'kim', 'kitchen', 'kiwi', 'km', 'kn', 'koeln', 'kp', 'kr', 'krd', 'kred', 'kw', 'ky', 'kyoto', 'kz', 'la', 'lacaixa', 'land', 'lat', 'latrobe', 'lawyer', 'lb', 'lc', 'lds', 'lease', 'legal', 'lgbt', 'li', 'lidl', 'life', 'lighting', 'limited', 'limo', 'link', 'lk', 'loans', 'london', 'lotte', 'lotto', 'lr', 'ls', 'lt', 'ltda', 'lu', 'luxe', 'luxury', 'lv', 'ly', 'ma', 'madrid', 'maison', 'management', 'mango', 'market', 'marketing', 'marriott', 'mc', 'md', 'me', 'media', 'meet', 'melbourne', 'meme', 'memorial', 'menu', 'mg', 'mh', 'miami', 'mil', 'mini', 'mk', 'ml', 'mm', 'mn', 'mo', 'mobi', 'moda', 'moe', 'monash', 'money', 'mormon', 'mortgage', 'moscow', 'motorcycles', 'mov', 'mp', 'mq', 'mr', 'ms', 'mt', 'mu', 'museum', 'mv', 'mw', 'mx', 'my', 'mz', 'na', 'nagoya', 'name', 'navy', 'nc', 'ne', 'net', 'network', 'neustar', 'new', 'nexus', 'nf', 'ng', 'ngo', 'nhk', 'ni', 'nico', 'ninja', 'nl', 'no', 'np', 'nr', 'nra', 'nrw', 'ntt', 'nu', 'nyc', 'nz', 'okinawa', 'om', 'one', 'ong', 'onl', 'ooo', 'org', 'organic', 'osaka', 'otsuka', 'ovh', 'pa', 'paris', 'partners', 'parts', 'party', 'pe', 'pf', 'pg', 'ph', 'pharmacy', 'photo', 'photography', 'photos', 'physio', 'pics', 'pictures', 'pink', 'pizza', 'pk', 'pl', 'place', 'plumbing', 'pm', 'pn', 'pohl', 'poker', 'porn', 'post', 'pr', 'praxi', 'press', 'pro', 'prod', 'productions', 'prof', 'properties', 'property', 'ps', 'pt', 'pub', 'pw', 'py', 'qa', 'qpon', 'quebec', 're', 'realtor', 'recipes', 'red', 'rehab', 'reise', 'reisen', 'reit', 'ren', 'rentals', 'repair', 'report', 'republican', 'rest', 'restaurant', 'reviews', 'rich', 'rio', 'rip', 'ro', 'rocks', 'rodeo', 'rs', 'rsvp', 'ru', 'ruhr', 'rw', 'ryukyu', 'sa', 'saarland', 'sale', 'samsung', 'sarl', 'saxo', 'sb', 'sc', 'sca', 'scb', 'schmidt', 'schule', 'schwarz', 'science', 'scot', 'sd', 'se', 'services', 'sew', 'sexy', 'sg', 'sh', 'shiksha', 'shoes', 'shriram', 'si', 'singles', 'sj', 'sk', 'sky', 'sl', 'sm', 'sn', 'so', 'social', 'software', 'sohu', 'solar', 'solutions', 'soy', 'space', 'spiegel', 'sr', 'st', 'style', 'su', 'supplies', 'supply', 'support', 'surf', 'surgery', 'suzuki', 'sv', 'sx', 'sy', 'sydney', 'systems', 'sz', 'taipei', 'tatar', 'tattoo', 'tax', 'tc', 'td', 'technology', 'tel', 'temasek', 'tennis', 'tf', 'tg', 'th', 'tienda', 'tips', 'tires', 'tirol', 'tj', 'tk', 'tl', 'tm', 'tn', 'to', 'today', 'tokyo', 'tools', 'top', 'toshiba', 'town', 'toys', 'tp', 'tr', 'trade', 'training', 'travel', 'trust', 'tt', 'tui', 'tv', 'tw', 'tz', 'ua', 'ug', 'uk', 'university', 'uno', 'uol', 'us', 'uy', 'uz', 'va', 'vacations', 'vc', 've', 'vegas', 'ventures', 'versicherung', 'vet', 'vg', 'vi', 'viajes', 'video', 'villas', 'vision', 'vlaanderen', 'vn', 'vodka', 'vote', 'voting', 'voto', 'voyage', 'vu', 'wales', 'wang', 'watch', 'webcam', 'website', 'wed', 'wedding', 'wf', 'whoswho', 'wien', 'wiki', 'williamhill', 'wme', 'work', 'works', 'world', 'ws', 'wtc', 'wtf', '佛山', '集团', '在线', '한국', 'ভারত', '八卦', 'موقع', '公益', '公司', '移动', '我爱你', 'москва', 'қаз', 'онлайн', 'сайт', 'срб', '淡马锡', 'орг', '삼성', 'சிங்கப்பூர்', '商标', '商店', '商城', 'дети', 'мкд', '中文网', '中信', '中国', '中國', '谷歌', 'భారత్', 'ලංකා', 'ભારત', 'भारत', '网店', 'संगठन', '网络', 'укр', '香港', '台湾', '台灣', '手机', 'мон', 'الجزائر', 'عمان', 'ایران', 'امارات', 'بازار', 'الاردن', 'بھارت', 'المغرب', 'السعودية', 'مليسيا', 'شبكة', 'გე', '机构', '组织机构', 'ไทย', 'سورية', 'рус', 'рф', 'تونس', 'みんな', 'グーグル', '世界', 'ਭਾਰਤ', '网址', '游戏', 'vermögensberater', 'vermögensberatung', '企业', 'مصر', 'قطر', '广东', 'இலங்கை', 'இந்தியா', '新加坡', 'فلسطين', '政务', 'xxx', 'xyz', 'yachts', 'yandex', 'ye', 'yoga', 'yokohama', 'youtube', 'yt', 'za', 'zip', 'zm', 'zone', 'zuerich', 'zw'];\n\nexport default TLD;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nexport default function checkBrackets(url: string) {\n var urlLength = url.length;\n var urlOpenBrackets = url.split('(').length - 1;\n var urlCloseBrackets = url.split(')').length - 1;\n while(urlCloseBrackets > urlOpenBrackets &&\n url.charAt(urlLength - 1) === ')') {\n url = url.substr(0, urlLength - 1)\n urlCloseBrackets--;\n urlLength--;\n }\n if(urlOpenBrackets > urlCloseBrackets) {\n url = url.replace(/\\)+$/, '');\n }\n return url;\n}\n","import Emoji from '../../config/emoji';\nimport {encodeEmoji} from '../../vendor/emoji';\n\nexport default function getEmojiUnified(emojiCode: string) {\n const unified = encodeEmoji(emojiCode).replace(/-?fe0f/g, '');\n\n /* if(unified === '1f441-200d-1f5e8') {\n //unified = '1f441-fe0f-200d-1f5e8-fe0f';\n unified = '1f441-fe0f-200d-1f5e8';\n } */\n\n if(!Emoji.hasOwnProperty(unified)\n // && !emojiData.hasOwnProperty(unified.replace(/-?fe0f$/, ''))\n ) {\n // console.error('lol', unified);\n return;\n }\n\n return unified;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport {EMAIL_REG_EXP, FULL_REG_EXP} from '.';\nimport TLD from '../../config/tld';\nimport {MessageEntity} from '../../layer';\nimport checkBrackets from './checkBrackets';\nimport getEmojiUnified from './getEmojiUnified';\n\nexport default function parseEntities(text: string) {\n let match: any;\n let raw = text;\n const entities: MessageEntity[] = [];\n let matchIndex;\n let rawOffset = 0;\n // var start = tsNow()\n FULL_REG_EXP.lastIndex = 0;\n while((match = raw.match(FULL_REG_EXP))) {\n matchIndex = rawOffset + match.index;\n\n // console.log('parseEntities match:', match);\n\n if(match[3]) { // mentions\n entities.push({\n _: 'messageEntityMention',\n offset: matchIndex + match[1].length,\n length: match[2].length + match[3].length\n });\n } else if(match[4]) {\n if(EMAIL_REG_EXP.test(match[4])) { // email\n entities.push({\n _: 'messageEntityEmail',\n offset: matchIndex,\n length: match[4].length\n });\n } else {\n let url: string;\n let protocol = match[5];\n const tld = match[6];\n // let excluded = '';\n if(tld) { // URL\n if(!protocol && (tld.substr(0, 4) === 'xn--' || TLD.indexOf(tld.toLowerCase()) !== -1)) {\n protocol = 'http://';\n }\n\n if(protocol) {\n const balanced = checkBrackets(match[4]);\n if(balanced.length !== match[4].length) {\n // excluded = match[4].substring(balanced.length);\n match[4] = balanced;\n }\n\n url = (match[5] ? '' : protocol) + match[4];\n }\n } else { // IP address\n url = (match[5] ? '' : 'http://') + match[4];\n }\n\n if(url) {\n entities.push({\n _: 'messageEntityUrl',\n offset: matchIndex,\n length: match[4].length\n });\n }\n }\n } else if(match[7]) { // New line\n entities.push({\n _: 'messageEntityLinebreak',\n offset: matchIndex,\n length: 1\n });\n } else if(match[8]) { // Emoji\n const unified = getEmojiUnified(match[8]);\n if(unified) {\n entities.push({\n _: 'messageEntityEmoji',\n offset: matchIndex,\n length: match[8].length,\n unicode: unified\n });\n }\n } else if(match[11]) { // Hashtag\n entities.push({\n _: 'messageEntityHashtag',\n offset: matchIndex + (match[10] ? match[10].length : 0),\n length: match[11].length\n });\n } else if(match[13]) { // Bot command\n entities.push({\n _: 'messageEntityBotCommand',\n offset: matchIndex + (match[11] ? match[11].length : 0) + (match[12] ? match[12].length : 0),\n length: 1 + match[13].length + (match[14] ? 1 + match[14].length : 0),\n unsafe: true\n });\n }\n\n raw = raw.substr(match.index + match[0].length);\n rawOffset += match.index + match[0].length;\n }\n\n // if (entities.length) {\n // console.log('parse entities', text, entities.slice())\n // }\n return entities;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport {MARKDOWN_ENTITIES, MARKDOWN_REG_EXP} from '.';\nimport {MessageEntity} from '../../layer';\nimport combineSameEntities from './combineSameEntities';\nimport findConflictingEntity from './findConflictingEntity';\nimport mergeEntities from './mergeEntities';\n\nexport default function parseMarkdown(raw: string, currentEntities: MessageEntity[], noTrim?: boolean): string {\n /* if(!markdownTestRegExp.test(text)) {\n return noTrim ? text : text.trim();\n } */\n\n const entities: MessageEntity[] = [];\n let pushedEntity = false;\n const pushEntity = (entity: MessageEntity) => !findConflictingEntity(currentEntities, entity) ? (entities.push(entity), pushedEntity = true) : pushedEntity = false;\n\n const newTextParts: string[] = [];\n let rawOffset = 0, match;\n while(match = raw.match(MARKDOWN_REG_EXP)) {\n const matchIndex = rawOffset + match.index;\n newTextParts.push(raw.substr(0, match.index));\n const text = (match[3] || match[8] || match[11] || match[13]);\n rawOffset -= text.length;\n // text = text.replace(/^\\s+|\\s+$/g, '');\n rawOffset += text.length;\n\n let entity: MessageEntity;\n pushedEntity = false;\n if(text.match(/^`*$/)) {\n newTextParts.push(match[0]);\n } else if(match[3]) { // pre\n entity = {\n _: 'messageEntityPre',\n language: '',\n offset: matchIndex + match[1].length,\n length: text.length\n };\n\n if(pushEntity(entity)) {\n if(match[5] === '\\n') {\n match[5] = '';\n rawOffset -= 1;\n }\n\n newTextParts.push(match[1] + text + match[5]);\n\n rawOffset -= match[2].length + match[4].length;\n }\n } else if(match[7]) { // code|italic|bold\n const isSOH = match[6] === '\\x01';\n\n entity = {\n _: MARKDOWN_ENTITIES[match[7]] as (MessageEntity.messageEntityBold | MessageEntity.messageEntityCode | MessageEntity.messageEntityItalic | MessageEntity.messageEntitySpoiler)['_'],\n // offset: matchIndex + match[6].length,\n offset: matchIndex + (isSOH ? 0 : match[6].length),\n length: text.length\n };\n\n if(pushEntity(entity)) {\n if(!isSOH) {\n newTextParts.push(match[6] + text + match[9]);\n } else {\n newTextParts.push(text);\n }\n\n rawOffset -= match[7].length * 2 + (isSOH ? 2 : 0);\n }\n } else if(match[11]) { // custom mention\n entity = {\n _: 'messageEntityMentionName',\n user_id: match[10].toUserId(),\n offset: matchIndex,\n length: text.length\n };\n\n if(pushEntity(entity)) {\n newTextParts.push(text);\n\n rawOffset -= match[0].length - text.length;\n }\n } else if(match[12]) { // text url\n entity = {\n _: 'messageEntityTextUrl',\n url: match[14],\n offset: matchIndex,\n length: text.length\n };\n\n if(pushEntity(entity)) {\n newTextParts.push(text);\n\n rawOffset -= match[12].length - text.length;\n }\n }\n\n if(!pushedEntity) {\n newTextParts.push(match[0]);\n }\n\n raw = raw.substr(match.index + match[0].length);\n rawOffset += match.index + match[0].length;\n }\n\n newTextParts.push(raw);\n let newText = newTextParts.join('');\n if(!newText.replace(/\\s+/g, '').length) {\n newText = raw;\n entities.splice(0, entities.length);\n }\n\n // ! idk what it was here for\n // if(!entities.length && !noTrim) {\n // newText = newText.trim();\n // }\n\n mergeEntities(currentEntities, entities);\n combineSameEntities(currentEntities);\n\n let length = newText.length;\n if(!noTrim) {\n // trim left\n newText = newText.replace(/^\\s*/, '');\n\n let diff = length - newText.length;\n if(diff) {\n currentEntities.forEach((entity) => {\n entity.offset = Math.max(0, entity.offset - diff);\n });\n }\n\n // trim right\n newText = newText.replace(/\\s*$/, '');\n diff = length - newText.length;\n length = newText.length;\n if(diff) {\n currentEntities.forEach((entity) => {\n if((entity.offset + entity.length) > length) {\n entity.length = length - entity.offset;\n }\n });\n }\n }\n\n return newText;\n}\n","import {MessageEntity} from '../../layer';\n\nexport default function sortEntities(entities: MessageEntity[]) {\n entities.sort((a, b) => {\n return (a.offset - b.offset) || (b.length - a.length);\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {MessageEntity} from '../../layer';\nimport encodeSpoiler from './encodeSpoiler';\n\n/**\n * ! This function is still unsafe to use with .innerHTML\n */\nexport default function wrapPlainText(text: string, entities: MessageEntity[] = []) {\n entities.forEach((entity) => {\n if(entity._ === 'messageEntitySpoiler') {\n text = encodeSpoiler(text, entity).text;\n }\n });\n\n return text;\n // if(entities?.length) {\n // entities = entities.filter((entity) => entity._ === 'messageEntitySpoiler');\n // }\n\n // return wrapRichText(text, {\n // entities,\n // noEncoding: true,\n // noTextFormat: true,\n // noLinebreaks: true,\n // noLinks: true\n // }).textContent;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport {processSearchText, ProcessSearchTextOptions} from '../helpers/cleanSearchText';\nimport flatten from '../helpers/array/flatten';\n\nexport default class SearchIndex {\n private fullTexts: Map = new Map();\n\n // minChars can be 0 because it requires at least one word (one symbol) to be found\n constructor(private options?: ProcessSearchTextOptions, private minChars = 0) {\n }\n\n public indexObject(id: SearchWhat, searchText: string) {\n /* if(searchIndex.fullTexts.hasOwnProperty(id)) {\n return false;\n } */\n\n if(this.options && searchText.trim()) {\n searchText = processSearchText(searchText, this.options);\n }\n\n if(!searchText) {\n this.fullTexts.delete(id);\n return false;\n }\n\n this.fullTexts.set(id, searchText);\n\n /* const shortIndexes = searchIndex.shortIndexes;\n searchText.split(' ').forEach((searchWord) => {\n let len = Math.min(searchWord.length, 3),\n wordPart, i;\n for(i = 1; i <= len; i++) {\n wordPart = searchWord.substr(0, i);\n if(shortIndexes[wordPart] === undefined) {\n shortIndexes[wordPart] = [id];\n } else {\n shortIndexes[wordPart].push(id);\n }\n }\n }); */\n }\n\n private _search(query: string) {\n const newFoundObjs: Array<{fullText: string, fullTextLength: number, what: SearchWhat, foundChars: number}> = [];\n const fullTexts = this.fullTexts;\n const queryWords = query.split(' ');\n const queryWordsLength = queryWords.length;\n fullTexts.forEach((fullText, what) => {\n let found = true;\n let foundChars = 0;\n for(let i = 0; i < queryWordsLength; ++i) { // * verify that all words are found\n const word = queryWords[i];\n const idx = fullText.indexOf(word);\n if(idx === -1 || (idx !== 0 && fullText[idx - 1] !== ' '/* && !badCharsRe.test(fullText[idx - 1]) */)) { // * search only from word beginning\n found = false;\n break;\n }\n\n foundChars += word.length;\n }\n\n if(found) {\n foundChars += queryWordsLength - 1;\n const fullTextLength = fullText.length;\n if(this.minChars <= foundChars || fullTextLength <= foundChars) {\n newFoundObjs.push({fullText, fullTextLength, what, foundChars});\n }\n }\n });\n\n return newFoundObjs;\n }\n\n public search(query: string) {\n if(this.options) {\n query = processSearchText(query, this.options);\n }\n\n const queries = query.split('\\x01');\n const newFoundObjs = flatten(queries.map((query) => this._search(query)));\n\n newFoundObjs.sort((a, b) => a.fullTextLength - b.fullTextLength || b.foundChars - a.foundChars);\n\n // newFoundObjs.sort((a, b) => a.fullText.localeCompare(b.fullText));\n const newFoundObjs2: Set = new Set(newFoundObjs.map((o) => o.what));\n\n return newFoundObjs2;\n }\n}\n","export default function flatten(arr: T[][]): T[] {\n return arr.reduce((acc, val) => (acc.push(...val), acc), []);\n}\n"],"names":["IGNORE_ERRORS","Set","LazyLoadQueueBase","constructor","parallelLimit","queueId","queue","inProcess","lockPromise","unlockResolve","log","this","processQueue","_processQueue","clear","length","lock","Promise","resolve","reject","unlock","processItem","item","add","loadItem","err","has","type","error","delete","load","getItem","shift","addElement","method","el","size","push","unshift","filterUnique","arr","forEachReverse","array","callback","i","insertInDescendSortedArray","element","getProperty","pos","property","sortProperty","undefined","indexOf","prev","next","splice","len","console","assumeType","x","readBlobAs","blob","reader","FileReader","addEventListener","e","target","result","bytesCmp","bytes1","bytes2","bytesFromHex","hexString","bytes","Uint8Array","Math","ceil","start","parseInt","charAt","substr","convertToUint8Array","TextEncoder","encode","callbackify","smth","then","uploadId","getFileNameForUpload","file","fileName","mimeType","ext","split","getDeepProperty","object","key","splitted","o","forEach","getObjectKeysAndSort","sort","ids","Map","keys","Object","map","a","b","debounce","fn","ms","shouldRunFirst","shouldRunLast","waitingTimeout","waitingPromise","hadNewCall","invoke","args","_resolve","_reject","apply","clearTimeout","_waitingTimeout","catch","isDebounced","SliceEnd","compareValue","val1","val2","toExponential","diff","str1","str2","str1Length","slice","compareLong","SlicedArray","sliceConstructor","getSliceConstructor","first","constructSlice","slices","static","slicedArray","Array","end","None","isEnd","side","Top","last","includes","Bottom","Both","setEnd","getEnds","top","bottom","both","unsetEnd","deleteCount","items","ret","super","idx","insertSlice","flatten","lowerBound","upperBound","foundSlice","lowerIndex","upperIndex","foundSliceIndex","sliced","insertIndex","s","prevSlice","nextSlice","findSlice","index","findSliceOffset","maxId","offset","sliceMe","offsetId","add_offset","limit","sliceOffset","sliceStart","max","sliceEnd","topWasMeantToLoad","bottomWasMeantToLoad","abs","topFulfilled","bottomFulfilled","offsetIdOffset","fulfilled","found","deleteSlice","indexOfAndSplice","toJSON","serialized","values","JSON","stringify","json","parsed","parse","inserted","getParticipantPeerId","participant","peer","user_id","toPeerId","hasRights","chat","action","rights","isThread","_","pFlags","deactivated","isCheckingRightsForSelf","creator","left","megagroup","admin_rights","banned_rights","default_banned_rights","myFlags","post_messages","broadcast","getDialogIndex","dialog","indexKey","folder_id","getDialogIndexKey","localId","getDocumentDownloadOptions","doc","thumb","onlyCache","inputFileLocation","sticker","mime_type","dcId","dc_id","location","file_name","getDocumentInputFileLocation","thumbSize","id","access_hash","file_reference","thumb_size","getDownloadFileNameFromOptions","options","getDownloadMediaDetails","media","downloadOptions","webDocument","getPhotoDownloadOptions","isWebDocument","url","downloadId","draftsAreEqual","draft1","draft2","reply_to_msg_id","entities","message","no_webpage","generateQId","queryId","resultId","generateMessageId","messageId","q","getServerMessageId","toServer","l","used","clearMessageId","MESSAGE_ID_INCREMENT","MESSAGE_ID_OFFSET","filterMessagesByInputFilter","inputFilter","history","foundMsgs","filtering","neededContents","neededDocTypes","excludeDocTypes","document","goodEntities","totalEntities","find","getAlbumText","messages","foundMessages","m","getPeerId","peerId","isPeerId","userId","chatId","channel_id","chat_id","isUser","peerParams","photo","photoSize","isDocument","Error","isPhoto","reactionsEqual","r1","r2","getStickerEffectThumb","video_thumbs","canSendToUser","user","deleted","ConnectionStatus","CAN_COMBINE_ENTITIES","combineSameEntities","entity","nextEntityIdx","findIndex","_i","nextEntity","encodeSpoiler","text","before","spoilerAfter","chars","charsLength","out","char","charCodeAt","join","spoiler","after","entityText","SINGLE_ENTITIES","findConflictingEntity","currentEntities","newEntity","singleEnd","currentEntity","fixEmoji","replace","match","string","matchUrl","mergeEntities","newEntities","filtered","filter","checkBrackets","urlLength","urlOpenBrackets","urlCloseBrackets","getEmojiUnified","emojiCode","unified","parseEntities","raw","matchIndex","rawOffset","E","protocol","tld","toLowerCase","balanced","unicode","unsafe","parseMarkdown","noTrim","pushedEntity","pushEntity","newTextParts","language","isSOH","toUserId","newText","sortEntities","wrapPlainText","SearchIndex","minChars","fullTexts","indexObject","searchText","trim","set","_search","query","newFoundObjs","queryWords","queryWordsLength","fullText","what","foundChars","word","fullTextLength","search","reduce","acc","val"],"sourceRoot":""}