{"version":3,"sources":["webpack:///./src/helpers/blob/readBlobAsUint8Array.ts","webpack:///./src/helpers/blob/readBlobAsArrayBuffer.ts","webpack:///./src/lib/fileManager.ts","webpack:///./src/lib/cacheStorage.ts","webpack:///./src/components/telInputField.ts","webpack:///./src/helpers/dom/replaceContent.ts","webpack:///./src/components/inputField.ts","webpack:///./src/helpers/dom/selectElementContents.ts","webpack:///./src/components/scrollable.ts","webpack:///./src/components/checkboxField.ts","webpack:///./src/components/singleTransition.ts","webpack:///./src/helpers/dom/toggleDisability.ts","webpack:///./src/helpers/dom/getRichValue.ts","webpack:///./src/helpers/dom/findUpTag.ts","webpack:///./src/helpers/dom/findUpAttribute.ts","webpack:///./src/helpers/dom/getRichElementValue.ts","webpack:///./src/helpers/dom/isInputEmpty.ts","webpack:///./src/helpers/dom/placeCaretAtEnd.ts","webpack:///./src/helpers/blob/readBlobAs.ts"],"names":["readBlobAsUint8Array","blob","readBlobAs","readBlobAsArrayBuffer","then","buffer","Uint8Array","blobSupported","blobConstruct","e","this","fileWriter","bytes","Blob","arr","write","mimeType","saveFileCallback","blobParts","part","push","truncate","length","finalize","saveToStorage","dbName","useStorage","test","STORAGES","openDatabase","openDbPromise","caches","open","entryName","timeoutOperation","cache","delete","match","response","put","fileName","method","get","Response","headers","size","save","callback","Promise","resolve","reject","rejected","timeout","setTimeout","undefined","res","err","clearTimeout","fakeWriter","getFakeFileWriter","saveFile","catch","enabled","all","map","storage","deleteAll","TelInputField","options","super","label","name","pasted","lastValue","container","classList","add","telEl","input","HTMLInputElement","type","autocomplete","inputMode","pixelRatio","window","devicePixelRatio","letterSpacing","style","setProperty","originalFunc","setValueSilently","bind","value","addEventListener","remove","formattedPhoneNumber","Math","abs","setLabel","formatted","country","countryCode","leftPattern","replace","code","dataset","onInput","key","metaKey","ctrlKey","shiftKey","preventDefault","replaceContent","elem","node","innerHTML","firstChild","lastChild","replaceWith","textContent","append","init","document","findUpAttribute","target","text","entities","plainText","originalEvent","clipboardData","getData","usePlainText","html","trim","span","createElement","curChild","nextSibling","nodeType","nodeValue","richValue","getRichValue","entities2","parseEntities","filter","_","mergeEntities","wrapDraftText","execCommand","InputState","required","validate","maxLength","showLengthOn","min","round","placeholder","canBeEdited","processInput","labelText","firstElementChild","String","observer","MutationObserver","isInputEmpty","inputFake","onFakeInput","observe","characterData","childList","subtree","animate","setAttribute","className","border","labelEl","lastElementChild","showingLength","wasError","contains","inputLength","diff","isError","toggle","select","el","range","createRange","selectNodeContents","sel","getSelection","removeAllRanges","addRange","selectElementContents","labelOptions","setHeight","scrollHeight","newHeight","currentHeight","height","transitionDuration","log","fireFakeInput","originalValue","isValid","isChanged","silent","setDraftValue","state","Error","Valid","setState","ScrollableBase","logPrefix","onScrollMeasure","lastScrollPosition","lastScrollDirection","isHeavyAnimationInProgress","needCheckAfterAnimation","onScroll","cancelAnimationFrame","onScrolledTop","onScrolledBottom","splitUp","onAdditionalScroll","requestAnimationFrame","scrollPosition","scrollProperty","checkForTriggers","Array","from","children","forEach","c","removeHeavyAnimationListener","passive","capture","removeEventListener","element","Scrollable","onScrollOffset","withPaddingContainer","loadedAll","top","bottom","maxScrollTop","clientHeight","scrollTop","setListeners","elements","padding","prepend","offsetHeight","getDistanceToEnd","y","ScrollableX","splitCount","scrollHorizontally","deltaX","scrollWidth","clientWidth","scrollLeft","deltaY","CheckboxField","restriction","disabled","toggleDisability","id","checked","stateKey","getState","stateValue","stateValues","indexOf","setByKey","textArgs","box","checkSvg","createElementNS","setAttributeNS","use","bg","withRipple","withHover","event","Event","bubbles","cancelable","dispatchEvent","disable","SetTransition","forwards","duration","onTransitionEnd","useRafs","raf","settings","animationsEnabled","afterTimeout","removeAttribute","field","withEntities","lines","line","join","combineSameEntities","sortEntities","findUpTag","tag","closest","attribute","markdownTags","bold","entityName","underline","italic","monospace","strikethrough","link","mentionName","spoiler","BLOCK_TAG_NAMES","Set","getRichElementValue","selNode","selOffset","offset","substr","parentNode","parentElement","getAttribute","url","href","user_id","follow","toUserId","isSelected","isBlock","has","tagName","splice","HTMLImageElement","alt","isTableCell","matches","wasEntitiesLength","i","wasLength","hasAttribute","placeCaretAtEnd","ignoreTouchCheck","activeElement","focus","collapse","body","createTextRange","textRange","moveToElementText","reader","FileReader","result"],"mappings":"oJAQe,SAASA,EAAqBC,GAC3C,OCDa,SAA+BA,GAC5C,OAAO,OAAAC,EAAA,GAAWD,EAAM,qBDAjBE,CAAsBF,GAAMG,KAAKC,GAAU,IAAIC,WAAWD,I,0SE0DpD,UArDR,MAGL,cAFQ,KAAAE,eAAgB,EAGtB,IACE,OAAAC,EAAA,GAAc,GAAI,IAClB,MAAMC,GACNC,KAAKH,eAAgB,GAIlB,cACL,OAAOG,KAAKH,cAGP,MAAMI,EAA0DC,GACrE,OAAGA,aAAiBC,KACXb,EAAqBY,GAAOR,KAAKU,GAC/BH,EAAWI,MAAMD,IAGnBH,EAAWI,MAAMH,GAIrB,kBAAkBI,EAAkBC,GACzC,MAAMC,EAAwC,GAuB9C,MAtBuB,CACrBH,MAAaI,GAA8B,EAAD,gCACxC,IAAIT,KAAKH,cACP,MAAM,EAGRW,EAAUE,KAAKD,MAEjBE,SAAU,KACRH,EAAUI,OAAS,GAErBC,SAAU,CAACC,GAAgB,KACzB,MAAMvB,EAAO,OAAAO,EAAA,GAAcU,EAAWF,GAMtC,OAJGQ,GAAiBP,GAClBA,EAAiBhB,GAGZA,M,sSC7CA,MAAM,EAQnB,YAAoBwB,GAAA,KAAAA,SAJZ,KAAAC,YAAa,EAKhB,IAAMC,OACPjB,KAAKe,QAAU,SAGd,EAAuBG,SAASN,SACjCZ,KAAKgB,WAAa,EAAuBE,SAAS,GAAGF,YAGvDhB,KAAKmB,eACL,EAAuBD,SAASR,KAAKV,MAG/B,e,MACN,OAAyB,QAAlB,EAAAA,KAAKoB,qBAAa,QAAKpB,KAAKoB,cAAgBC,OAAOC,KAAKtB,KAAKe,QAG/D,OAAOQ,GACZ,OAAOvB,KAAKwB,iBAAkBC,GAAUA,EAAMC,OAAO,IAAMH,IAGtD,YACL,OAAOF,OAAOK,OAAO1B,KAAKe,QAGrB,IAAIQ,GACT,OAAOvB,KAAKwB,iBAAkBC,GAAUA,EAAME,MAAM,IAAMJ,IAGrD,KAAKA,EAAmBK,GAE7B,OAAO5B,KAAKwB,iBAAkBC,GAAUA,EAAMI,IAAI,IAAMN,EAAWK,IAG9D,QAAQE,EAAkBC,EAAmC,QAOlE,OAAO/B,KAAKgC,IAAIF,GAAUpC,KAAMkC,IAC9B,IAAIA,EAEF,KAAM,iBAOR,OAJgBA,EAASG,OAQtB,SAASD,EAAkBvC,GAE3BA,aAAgBY,OACnBZ,EAAO,OAAAO,EAAA,GAAcP,IAGvB,MAAMqC,EAAW,IAAIK,SAAS1C,EAAM,CAClC2C,QAAS,CACP,iBAAkB,GAAK3C,EAAK4C,QAIhC,OAAOnC,KAAKoC,KAAKN,EAAUF,GAAUlC,KAAK,IAAMH,GAG3C,iBAAoB8C,GACzB,OAAIrC,KAAKgB,WAIF,IAAIsB,QAAW,CAAMC,EAASC,IAAW,kCAC9C,IAAIC,GAAW,EACf,MAAMC,EAAUC,WAAW,KACzBH,IAEAC,GAAW,GACV,MAEH,IACE,MAAMhB,QAAczB,KAAKmB,eACzB,IAAIM,EAGF,MAFAzB,KAAKgB,YAAa,EAClBhB,KAAKoB,mBAAgBwB,EACf,YAGR,MAAMC,QAAYR,EAASZ,GAE3B,GAAGgB,EAAU,OACbF,EAAQM,GACR,MAAMC,GACNN,EAAOM,GAGTC,aAAaL,OA3BNJ,QAAQE,OAAO,mBA+BnB,cAAcV,EAAkBxB,GACrC,MAAM0C,EAAa,EAAYC,kBAAkB3C,EAAWf,GACnDS,KAAKkD,SAASpB,EAAUvC,GAAM4D,MAAM,IAAM5D,IAGnD,OAAO+C,QAAQC,QAAQS,GAGlB,qBAAqBI,GAC1B,OAAOd,QAAQe,IAAIrD,KAAKkB,SAASoC,IAAIC,IAGnC,GAFAA,EAAQvC,WAAaoC,GAEjBA,EACF,OAAOG,EAAQC,gBA3HN,EAAAtC,SAAqC,I,iCCftD,qEAYe,MAAMuC,UAAsB,IAIzC,YAAYC,EAER,IACFC,MAAM,OAAD,QACHC,MAAO,mCAEPC,KAAM,SACHH,IAVC,KAAAI,QAAS,EACV,KAAAC,UAAY,GAYjB/D,KAAKgE,UAAUC,UAAUC,IAAI,qBAE7B,IAAIC,EAAQnE,KAAKoE,MACjB,GAAGD,aAAiBE,iBAClBF,EAAMG,KAAO,MACbH,EAAMI,aAAe,qBAChB,CACLJ,EAAMK,UAAY,UAElB,MAAMC,EAAaC,OAAOC,iBAC1B,GAAGF,EAAa,EAAG,CACjB,IAAIG,EACD,WACDA,GAA8B,IAAdH,EACR,eACRG,EAAgB,GAGlBT,EAAMU,MAAMC,YAAY,mBAAoBF,EAAgB,MAG9D,MAAMG,EAAe/E,KAAKgF,iBAAiBC,KAAKjF,MAChDA,KAAKgF,iBAAoBE,IACvBH,EAAaG,GACb,YAAgBlF,KAAKoE,OAAO,IAIhCD,EAAMgB,iBAAiB,QAAS,KAE9BhB,EAAMF,UAAUmB,OAAO,SAEvB,MAAMF,EAAQlF,KAAKkF,MAUnB,IAAIG,EATSC,KAAKC,IAAIL,EAAMtE,OAASZ,KAAK+D,UAAUnD,QAC1C,IAAMZ,KAAK8D,QAAU,mBAC7B9D,KAAKgF,iBAAiBhF,KAAK+D,UAAYmB,GAGzClF,KAAK8D,QAAS,EAEd9D,KAAKwF,WAGL,IAAIC,EAAmBC,EAAsBC,EAA8BC,EAAc,GACnD,MAAnC5F,KAAKkF,MAAMW,QAAQ,MAAO,KAC3B7F,KAAKgF,iBAAiB,MAEtBK,EAAuB,YAAkBrF,KAAKkF,OAC9CO,EAAYJ,EAAqBI,UACjCC,EAAUL,EAAqBK,QAC/BE,EAAcP,EAAqBO,YACnCD,EAAcN,EAAqBS,KACnC9F,KAAKgF,iBAAiBhF,KAAK+D,UAAY0B,EAAY,IAAMA,EAAY,KAGvEtB,EAAM4B,QAAQH,YAAcA,EAI5BlC,EAAQsC,SAAWtC,EAAQsC,QAAQX,KAGrClB,EAAMgB,iBAAiB,QAAS,KAC9BnF,KAAK8D,QAAS,IAQhBK,EAAMgB,iBAAiB,WAAapF,IAElC,MAAMkG,EAAMlG,EAAEkG,IACd,GAAG,KAAKhF,KAAKgF,KAAUlG,EAAEmG,UAAWnG,EAAEoG,SAAoB,cAARF,IAAiC,MAARA,IAAelG,EAAEqG,UAE1F,OADArG,EAAEsG,kBACK,O,gCChGA,SAASC,EAAeC,EAAmBC,GACxD,GAAoB,iBAAX,EAEP,YADAD,EAAKE,UAAYD,GAKnB,MAAME,EAAaH,EAAKG,WACrBA,EACEH,EAAKI,YAAcD,EACpBA,EAAWE,YAAYJ,IAEvBD,EAAKM,YAAc,GACnBN,EAAKO,OAAON,IAGdD,EAAKO,OAAON,GAtBhB,mC,kICgBA,IAAIO,EAAO,KACTC,SAAS7B,iBAAiB,QAAUpF,IAClC,IAAI,OAAAkH,EAAA,GAAgBlH,EAAEmH,OAAQ,0BAC5B,OAIF,IAAIC,EAAcC,EADlBrH,EAAEsG,iBAIF,IAAIgB,GAAqBtH,EAAEuH,eAAiBvH,GAAGwH,cAAcC,QAAQ,cACjEC,GAAe,EAGfC,GAAgB3H,EAAEuH,eAAiBvH,GAAGwH,cAAcC,QAAQ,aAChE,GAAGE,EAAKC,OAAQ,CACdD,EAAOA,EAAK7B,QAAQ,2BAA4B,IAChD6B,EAAOA,EAAK7B,QAAQ,mBAAoB,IAExC,MAAMlE,EAAQ+F,EAAK/F,MAAM,2BACtBA,IACD+F,EAAO/F,EAAM,GAAGgG,QAGlB,IAAIC,EAAoBZ,SAASa,cAAc,QAC/CD,EAAKnB,UAAYiB,EAEjB,IAAII,EAAWF,EAAKlB,WACpB,KAAMoB,GAAU,CACd,IAAIC,EAAcD,EAASC,YACF,IAAtBD,EAASE,WACNF,EAASG,UAAUN,QACrBG,EAAS1C,UAIb0C,EAAWC,EAGb,MAAMG,EAAY,OAAAC,EAAA,GAAaP,GAAM,GACrC,GAAGM,EAAUhD,MAAMW,QAAQ,MAAO,IAAIjF,SAAWyG,EAAUxB,QAAQ,MAAO,IAAIjF,OAAQ,CACpFuG,EAAOe,EAAUhD,MACjBkC,EAAWc,EAAUd,SACrBK,GAAe,EAEf,IAAIW,EAAY,IAAkBC,cAAclB,GAChDiB,EAAYA,EAAUE,OAAOvI,GAAa,uBAARA,EAAEwI,GAAsC,2BAARxI,EAAEwI,GACpE,IAAkBC,cAAcpB,EAAUgB,IAI3CX,IACDN,EAAOE,EACPD,EAAW,IAAkBiB,cAAclB,GAC3CC,EAAWA,EAASkB,OAAOvI,GAAa,uBAARA,EAAEwI,GAAsC,2BAARxI,EAAEwI,IAGpEpB,EAAO,IAAkBsB,cAActB,EAAM,CAACC,aAE9C1C,OAAOsC,SAAS0B,YAAY,cAAc,EAAOvB,KAGnDJ,EAAO,MAoBT,IAAY4B,GAAZ,SAAYA,GACV,yBACA,qBACA,qBAHF,CAAYA,MAAU,KAuRP,IAlQf,MAeE,YAAmBjF,EAA6B,IAA7B,KAAAA,UACjB1D,KAAKgE,UAAYgD,SAASa,cAAc,OACxC7H,KAAKgE,UAAUC,UAAUC,IAAI,eAE7BlE,KAAK4I,SAAWlF,EAAQkF,SACxB5I,KAAK6I,SAAWnF,EAAQmF,cAECjG,IAAtBc,EAAQoF,gBAAoDlG,IAAzBc,EAAQqF,eAC5CrF,EAAQqF,aAAezD,KAAK0D,IAAI,GAAI1D,KAAK2D,MAAMvF,EAAQoF,UAAY,KAGrE,MAAM,YAACI,EAAW,UAAEJ,EAAS,aAAEC,EAAY,KAAElF,EAAI,UAAEwD,EAAS,YAAE8B,GAAc,GAAQzF,EAEpF,IAEIU,EAyEAgF,EA3EAxF,EAAQF,EAAQE,OAASF,EAAQ2F,UAGrC,GAAIhC,EA0CFrH,KAAKgE,UAAUyC,UAAY,8BACN5C,EAAO,SAASA,KAAU,yBAAyBD,EAAQ,cAAgB,wCAGhGQ,EAAQpE,KAAKgE,UAAUsF,sBA9CV,CACVvC,GACDA,IAGF/G,KAAKgE,UAAUyC,UAAY,iCACH8C,SAASJ,+CAGjC/E,EAAQpE,KAAKgE,UAAUsF,kBACvB,MAAME,EAAW,IAAIC,iBAAiB,KAGjCL,GACDA,MAKJhF,EAAMe,iBAAiB,QAAS,KAC3B,OAAAuE,EAAA,GAAatF,KACdA,EAAMqC,UAAY,IAGjBzG,KAAK2J,YACN3J,KAAK2J,UAAUlD,UAAYrC,EAAMqC,UACjCzG,KAAK4J,iBAKTJ,EAASK,QAAQzF,EAAO,CAAC0F,eAAe,EAAMC,WAAW,EAAMC,SAAS,IAErEtG,EAAQuG,UACT7F,EAAMH,UAAUC,IAAI,aAAc,gBAGlClE,KAAK2J,UAAY3C,SAASa,cAAc,OACxC7H,KAAK2J,UAAUO,aAAa,kBAAmB,QAC/ClK,KAAK2J,UAAUQ,UAAY/F,EAAM+F,UAAY,2BAqBjD,GAVA/F,EAAM8F,aAAa,MAAO,QAEvBhB,IACD,gBAAM9E,EAAO8E,OAAatG,EAAW,eAElC5C,KAAK2J,WACN,gBAAM3J,KAAK2J,UAAWT,OAAatG,EAAW,gBAI/CgB,GAASsF,EAAa,CACvB,MAAMkB,EAASpD,SAASa,cAAc,OACtCuC,EAAOnG,UAAUC,IAAI,sBACrBlE,KAAKgE,UAAU8C,OAAOsD,GAUxB,GAPGxG,IACD5D,KAAK4D,MAAQoD,SAASa,cAAc,SACpC7H,KAAKwF,WACLxF,KAAKgE,UAAU8C,OAAO9G,KAAK4D,QAI1BkF,EAAW,CACZ,MAAMuB,EAAUrK,KAAKgE,UAAUsG,iBAC/B,IAAIC,GAAgB,EAEpBnB,EAAe,KACb,MAAMoB,EAAWpG,EAAMH,UAAUwG,SAAS,SAEpCC,EAAcrD,EAAajD,EAA2Bc,MAAMtE,OAAS,IAAI,OAAAuH,EAAA,GAAa/D,GAAO,GAAOc,OAAOtE,OAC3G+J,EAAO7B,EAAY4B,EACnBE,EAAUD,EAAO,EACvBvG,EAAMH,UAAU4G,OAAO,QAASD,GAI7BA,GAAWD,GAAQ5B,GACpB/I,KAAKwF,WACL6E,EAAQvD,OAAO,KAAKgC,EAAY4B,MAC5BH,IAAeA,GAAgB,KAC1BC,IAAaI,GAAYL,KAClCvK,KAAKwF,WACL+E,GAAgB,IAIpBnG,EAAMe,iBAAiB,QAASiE,GAGlCpJ,KAAKoE,MAAQA,EAGR,SACDpE,KAAKkF,QAINlF,KAAK0D,QAAQ2D,UACbrH,KAAKoE,MAA2B0G,SClQxB,SAA+BC,GAC5C,MAAMC,EAAQhE,SAASiE,cACvBD,EAAME,mBAAmBH,GACzB,MAAMI,EAAMzG,OAAO0G,eACnBD,EAAIE,kBACJF,EAAIG,SAASN,GD+PTO,CAAsBvL,KAAKoE,QAIxB,WACLpE,KAAK4D,MAAMiD,YAAc,GACtB7G,KAAK0D,QAAQ2F,UACdrJ,KAAK4D,MAAM6C,UAAYzG,KAAK0D,QAAQ2F,UAEpCrJ,KAAK4D,MAAMkD,OAAO,eAAK9G,KAAK0D,QAAQE,MAAO5D,KAAK0D,QAAQ8H,eAIrD,YAAYC,GAAY,GAC7B,MAAOC,aAAcC,GAAiC3L,KAAK2J,UAMrDiC,GAAiB5L,KAAKoE,MAAMS,MAAMgH,OAAOhG,QAAQ,KAAM,IAC7D,GAAG+F,IAAkBD,EACnB,OAGF,MACMG,EAAqBxG,KAAK2D,MADG,GAEJ3D,KAAKyG,IAAIzG,KAAKC,IAAIoG,EAAYC,KAI7D5L,KAAKoE,MAAMS,MAAMiH,mBAAwBA,EAAH,KAEnCL,IACDzL,KAAKoE,MAAMS,MAAMgH,OAASF,EAAYA,EAAY,KAAO,IAI3D,YAAc3L,KAAKoE,MADD,sBACmB,EAAM0H,EAAoB,KAC7D9L,KAAKoE,MAAMH,UAAUmB,OAFL,wBAMpB,YACE,OAAOpF,KAAK0D,QAAQ2D,UAAarH,KAAKoE,MAA2Bc,MAAQ,OAAAiD,EAAA,GAAanI,KAAKoE,OAAO,GAAOc,MAI3G,UAAUA,GACRlF,KAAKgF,iBAAiBE,GAAO,GAE7B,YAAclF,KAAKoE,MAAO,SAGrB,iBAAiBc,EAAe8G,GAAgB,GAClDhM,KAAK0D,QAAQ2D,UACbrH,KAAKoE,MAA2Bc,MAAQA,GAEzClF,KAAKoE,MAAMqC,UAAYvB,EAEpBlF,KAAK2J,YACN3J,KAAK2J,UAAUlD,UAAYvB,EAExB8G,GACDhM,KAAK4J,gBAMN,YACL,OAAO5J,KAAKkF,QAAUlF,KAAKiM,cAGtB,UACL,OAAQjM,KAAKoE,MAAMH,UAAUwG,SAAS,YAClCzK,KAAK6I,UAAY7I,KAAK6I,eACtB7I,KAAK4I,WAAa,OAAAc,EAAA,GAAa1J,KAAKoE,QAGnC,kBACL,OAAOpE,KAAKkM,WAAalM,KAAKmM,YAGzB,cAAcjH,EAAQ,GAAIkH,GAAS,GACpCpM,KAAK0D,QAAQ2D,YACfnC,EAAQ,IAAkBuD,cAAcvD,IAGvCkH,EACDpM,KAAKgF,iBAAiBE,GAAO,GAE7BlF,KAAKkF,MAAQA,EAIV,iBAAiBA,EAAqC,GAAIkH,GAAS,GACxEpM,KAAKiM,cAAgB/G,EACrBlF,KAAKqM,cAAcnH,EAAOkH,GAGrB,SAASE,EAAmB1I,GAC9BA,IACD5D,KAAK4D,MAAMiD,YAAc,GACzB7G,KAAK4D,MAAMkD,OAAO,eAAKlD,EAAO5D,KAAK0D,QAAQ8H,gBAG7CxL,KAAKoE,MAAMH,UAAU4G,OAAO,WAAYyB,EAAQ3D,EAAW4D,QAC3DvM,KAAKoE,MAAMH,UAAU4G,OAAO,WAAYyB,EAAQ3D,EAAW6D,QAGtD,SAAS5I,GACd5D,KAAKyM,SAAS9D,EAAW4D,MAAO3I,M,gCErXpC,8GAsDO,MAAM8I,EAsBX,YAAmB3B,EAAiB4B,EAAY,GAAW3I,EAAyBgD,SAASa,cAAc,QAAxF,KAAAkD,KAAwC,KAAA/G,YAlBpD,KAAA4I,gBAA0B,EAE1B,KAAAC,mBAA6B,EAC7B,KAAAC,oBAA8B,EAM9B,KAAAC,4BAA6B,EAC1B,KAAAC,yBAA0B,EAqE7B,KAAAC,SAAW,KAOhB,GAAGjN,KAAK+M,2BAMN,OALG/M,KAAK4M,iBACNlI,OAAOwI,qBAAqBlN,KAAK4M,sBAGnC5M,KAAKgN,yBAA0B,IAK5BhN,KAAKmN,eAAkBnN,KAAKoN,kBAAsBpN,KAAKqN,SAAYrN,KAAKsN,sBAC1EtN,KAAK4M,iBAAiBlI,OAAOwI,qBAAqBlN,KAAK4M,iBAC1D5M,KAAK4M,gBAAkBlI,OAAO6I,sBAAsB,KAClDvN,KAAK4M,gBAAkB,EAEvB,MAAMY,EAAiBxN,KAAKgE,UAAUhE,KAAKyN,gBAC3CzN,KAAK8M,oBAAsB9M,KAAK6M,qBAAuBW,EAAiB,EAAKxN,KAAK6M,mBAAqBW,EAAiB,GAAK,EAC7HxN,KAAK6M,mBAAqBW,EAEvBxN,KAAKsN,oBAAmD,IAA7BtN,KAAK8M,qBACjC9M,KAAKsN,qBAGJtN,KAAK0N,kBACN1N,KAAK0N,uBA3FT1N,KAAKgE,UAAUC,UAAUC,IAAI,cAE7BlE,KAAK+L,IAAM,YAAO,UAAYY,EAAY,IAAMA,EAAY,IAAK,IAASJ,OAEvExB,IACD4C,MAAMC,KAAK7C,EAAG8C,UAAUC,QAAQC,GAAK/N,KAAKgE,UAAU8C,OAAOiH,IAE3DhD,EAAGjE,OAAO9G,KAAKgE,YAKZ,eACFhE,KAAKgO,+BAIRtJ,OAAOS,iBAAiB,SAAUnF,KAAKiN,SAAU,CAACgB,SAAS,IAC3DjO,KAAKgE,UAAUmB,iBAAiB,SAAUnF,KAAKiN,SAAU,CAACgB,SAAS,EAAMC,SAAS,IAElFlO,KAAKgO,6BAA+B,YAAuB,KACzDhO,KAAK+M,4BAA6B,EAE/B/M,KAAK4M,kBACN5M,KAAKgN,yBAA0B,EAC/BtI,OAAOwI,qBAAqBlN,KAAK4M,mBAElC,KACD5M,KAAK+M,4BAA6B,EAE/B/M,KAAKgN,0BACNhN,KAAKiN,WACLjN,KAAKgN,yBAA0B,MAK9B,kBACDhN,KAAKgO,+BAITtJ,OAAOyJ,oBAAoB,SAAUnO,KAAKiN,UAC1CjN,KAAKgE,UAAUmK,oBAAoB,SAAUnO,KAAKiN,SAAU,CAACiB,SAAS,IAEtElO,KAAKgO,gCAGA,OAAOI,GACZpO,KAAKgE,UAAU8C,OAAOsH,GAGjB,kBAAkB1K,GAEvB,OAAO,YAAiB,OAAD,wBAClBA,GAAO,CACVM,UAAWhE,KAAKgE,cA4CP,MAAMqK,UAAmB3B,EAKtC,YAAY3B,EAAiB4B,EAAY,GAAW2B,EAAiB,IAAKC,GACxE5K,MAAMoH,EAAI4B,GADwC,KAAA2B,iBAF7C,KAAAE,UAAiC,CAACC,KAAK,EAAMC,QAAQ,GAsBrD,KAAAhB,iBAAmB,KACxB,IAAK1N,KAAKmN,gBAAkBnN,KAAKoN,iBAAmB,OAEpD,GAAGpN,KAAK+M,2BAEN,YADA/M,KAAKiN,WAIP,MAAMvB,EAAe1L,KAAKgE,UAAU0H,aACpC,IAAIA,EACF,OAGF,MACMiD,EAAejD,EADA1L,KAAKgE,UAAU4K,aAE9BC,EAAY7O,KAAK6M,mBAIpB7M,KAAKmN,eAAiB0B,GAAa7O,KAAKsO,gBAAkBtO,KAAK8M,qBAAuB,GACvF9M,KAAKmN,gBAGJnN,KAAKoN,kBAAqBuB,EAAeE,GAAc7O,KAAKsO,gBAAkBtO,KAAK8M,qBAAuB,GAC3G9M,KAAKoN,oBAlCPpN,KAAKgE,UAAUC,UAAUC,IAAI,gBAC7BlE,KAAK8O,eACL9O,KAAKyN,eAAiB,YAGjB,oBAAoB1C,GACzB/K,KAAKqN,QAAUtC,EACf/K,KAAK+L,IAAI,uBAAwBhB,EAAI/K,MA+BhC,WAAW+O,IACf/O,KAAKqN,SAAWrN,KAAKgP,SAAWhP,KAAKgE,WAAWiL,WAAWF,GAGvD,UAAUA,IACd/O,KAAKqN,SAAWrN,KAAKgP,SAAWhP,KAAKgE,WAAW8C,UAAUiI,GAGtD,mBACL,OAAO/O,KAAK0L,aAAepG,KAAK2D,MAAMjJ,KAAK6O,UAAY7O,KAAKgE,UAAUkL,cAGxE,qBACE,OAAOlP,KAAKmP,oBAAsB,EAGpC,cAAcC,GACZpP,KAAKgE,UAAU6K,UAAYO,EAG7B,gBAEE,OAAOpP,KAAKgE,UAAU6K,UAGxB,mBACE,OAAO7O,KAAKgE,UAAU0H,cAInB,MAAM2D,UAAoB3C,EAC/B,YAAY3B,EAAiB4B,EAAY,GAAW2B,EAAiB,IAAYgB,EAAa,GAAWtL,EAAyBgD,SAASa,cAAc,QAKvJ,GAJAlE,MAAMoH,EAAI4B,EAAW3I,GAD6B,KAAAsK,iBAA6B,KAAAgB,aAAwB,KAAAtL,YAGvGhE,KAAKgE,UAAUC,UAAUC,IAAI,iBAEzB,qBAAoB,CACtB,MAAMqL,EAAsBxP,KACtBA,EAAEyP,QAAUxP,KAAKgE,UAAUyL,YAAczP,KAAKgE,UAAU0L,cAC1D1P,KAAKgE,UAAU2L,YAAc5P,EAAE6P,OAAS,EACxC,YAAY7P,KAIhBC,KAAKgE,UAAUmB,iBAAiB,QAASoK,EAAoB,CAACtB,SAAS,IAGzEjO,KAAKyN,eAAiB,gB,gCCrR1B,uEAyBe,MAAMoC,EAKnB,YAAYnM,EAAgC,IAC1C,MAAME,EAAQ5D,KAAK4D,MAAQoD,SAASa,cAAc,SAClDjE,EAAMK,UAAUC,IAAI,kBAEjBR,EAAQoM,aACTlM,EAAMK,UAAUC,IAAI,8BAGnBR,EAAQuF,OACTrF,EAAMK,UAAUC,IAAI,wBAGnBR,EAAQqM,UACT/P,KAAKgQ,kBAAiB,GAGxB,MAAM5L,EAAQpE,KAAKoE,MAAQ4C,SAASa,cAAc,SAoClD,IAAID,EAWJ,GA9CAxD,EAAMH,UAAUC,IAAI,wBACpBE,EAAME,KAAO,WACVZ,EAAQG,OACTO,EAAM6L,GAAK,SAAWvM,EAAQG,MAG7BH,EAAQwM,UACT9L,EAAM8L,SAAU,GAGfxM,EAAQyM,UACT,UAAgBC,WAAW1Q,KAAK4M,IAC9B,MAAM+D,EAAa,YAAgB/D,EAAO5I,EAAQyM,UAClD,IAAID,EAEFA,EADCxM,EAAQ4M,YAC6C,IAA5C5M,EAAQ4M,YAAYC,QAAQF,GAE5BA,EAGZrQ,KAAKgF,iBAAiBkL,GAEtB9L,EAAMe,iBAAiB,SAAU,KAC/B,IAAID,EAEFA,EADCxB,EAAQ4M,YACD5M,EAAQ4M,YAAYlM,EAAM8L,QAAU,EAAI,GAExC9L,EAAM8L,QAGhB,UAAgBM,SAAS9M,EAAQyM,SAAUjL,OAM9CxB,EAAQyD,MACTS,EAAO5H,KAAK4H,KAAOZ,SAASa,cAAc,QAC1CD,EAAK3D,UAAUC,IAAI,oBACnB,gBAAM0D,EAAMlE,EAAQyD,KAAMzD,EAAQ+M,WAElC7M,EAAMK,UAAUC,IAAI,4BAGtBN,EAAMkD,OAAO1C,GAEVV,EAAQmH,OAAQ,CACjBjH,EAAMK,UAAUC,IAAI,yBAEpB,MAAM2G,EAAS7D,SAASa,cAAc,OACtCgD,EAAO5G,UAAUC,IAAI,mBACrBN,EAAMkD,OAAO+D,OACR,CACL,MAAM6F,EAAM1J,SAASa,cAAc,OACnC6I,EAAIzM,UAAUC,IAAI,gBAElB,MAAMyM,EAAW3J,SAAS4J,gBAAgB,6BAA8B,OACxED,EAAS1M,UAAUC,IAAI,sBACvByM,EAASE,eAAe,KAAM,UAAW,aACzC,MAAMC,EAAM9J,SAAS4J,gBAAgB,6BAA8B,OACnEE,EAAID,eAAe,KAAM,OAAQ,UACjCC,EAAID,eAAe,KAAM,IAAK,MAC9BF,EAAS7J,OAAOgK,GAEhB,MAAMC,EAAK/J,SAASa,cAAc,OAClCkJ,EAAG9M,UAAUC,IAAI,2BAEjB,MAAMkG,EAASpD,SAASa,cAAc,OACtCuC,EAAOnG,UAAUC,IAAI,uBAErBwM,EAAI5J,OAAOsD,EAAQ2G,EAAIJ,GAEvB/M,EAAMkD,OAAO4J,GAGZ9I,GACDhE,EAAMkD,OAAOc,GAGZlE,EAAQsN,YACTpN,EAAMK,UAAUC,IAAI,kBAAmB,gBACvC,iBAAON,OAAOhB,OAAWA,GAAW,IAE5Bc,EAAQuN,WAChBrN,EAAMK,UAAUC,IAAI,gBAIxB,cACE,OAAOlE,KAAKoE,MAAM8L,QAGpB,YAAYA,GAKVlQ,KAAKgF,iBAAiBkL,GAEtB,MAAMgB,EAAQ,IAAIC,MAAM,SAAU,CAACC,SAAS,EAAMC,YAAY,IAC9DrR,KAAKoE,MAAMkN,cAAcJ,GAGpB,iBAAiBhB,GACtBlQ,KAAKoE,MAAM8L,QAAUA,EAGhB,iBAAiBqB,GAEtB,OADAvR,KAAK4D,MAAMK,UAAU4G,OAAO,oBAAqB0G,GAC1C,IAAMvR,KAAKgQ,kBAAkBuB,M,gCC5JxC,YAQA,MAAMC,EAAgB,CACpBpD,EACAjE,EACAsH,EACAC,EACAC,EACAC,KAEA,MAAM,QAAClP,EAAO,IAAEmP,GAAOzD,EAAQrI,QAgB/B,QAfenD,IAAZF,GACDK,cAAcL,QAGLE,IAARiP,IACDnN,OAAOwI,sBAAsB2E,GACzBD,UACKxD,EAAQrI,QAAQ8L,KAQxBD,GAAW,UAAUE,SAASC,mBAAqBL,EAMpD,YALAtD,EAAQrI,QAAQ8L,IAAM,GAAKnN,OAAO6I,sBAAsB,YAC/Ca,EAAQrI,QAAQ8L,IACvBL,EAAcpD,EAASjE,EAAWsH,EAAUC,EAAUC,EAAiBC,EAAU,MAMlFH,GAAYtH,GACbiE,EAAQnK,UAAUC,IAAIiG,GAGxB,MAAM6H,EAAe,YACZ5D,EAAQrI,QAAQrD,SACnB+O,GAAYtH,GACdiE,EAAQnK,UAAUmB,OAAO,YAAa+E,GAGxCiE,EAAQnK,UAAUmB,OAAO,aAEzBuM,GAAmBA,KAGrB,IAAI,UAAUG,SAASC,oBAAsBL,EAG3C,OAFAtD,EAAQnK,UAAUmB,OAAO,YAAa,kBACtC4M,IAIF5D,EAAQnK,UAAUC,IAAI,aAEtBkK,EAAQnK,UAAU4G,OAAO,aAAc4G,GACvCrD,EAAQrI,QAAQrD,QAAU,GAAKC,WAAWqP,EAAcN,IAG3C,O,gCC9DA,SAAS1B,EAAiBjB,EAAyBwC,GAOhE,OANGA,EACDxC,EAASjB,QAAQ/C,GAAMA,EAAGb,aAAa,WAAY,SAEnD6E,EAASjB,QAAQ/C,GAAMA,EAAGkH,gBAAgB,aAGrC,IAAMjC,EAAiBjB,GAAWwC,GAb3C,mC,gCCAA,8DAgBe,SAASpJ,EAAa+J,EAAoBC,GAAe,GACtE,MAAMC,EAAkB,GAClBC,EAAiB,GAEjBjL,EAA4B+K,EAAe,QAAKvP,EACtD,YAAoBsP,EAAOE,EAAOC,OAAMzP,OAAWA,EAAWwE,GAC3DiL,EAAKzR,QACNwR,EAAM1R,KAAK2R,EAAKC,KAAK,KAGvB,IAAIpN,EAAQkN,EAAME,KAAK,MAkBvB,OAjBApN,EAAQA,EAAMW,QAAQ,UAAW,MAE9BuB,aAAQ,EAARA,EAAUxG,UASX,IAAkB2R,oBAAoBnL,GACtC,IAAkBoL,aAAapL,IAK1B,CAAClC,QAAOkC,YAGjB,IAAee,aAAeA,G,gCCzCf,SAASsK,EAAU1H,EAAS2H,GACzC,OAAO3H,EAAG4H,QAAQD,GAPpB,mC,gCCMe,SAASzL,EAAgB8D,EAAS6H,GAC/C,OAAO7H,EAAG4H,QAAQ,IAAIC,MAPxB,mC,gCCAA,oEAoBO,MAAMC,EAAsD,CACjEC,KAAM,CACJnR,MAAO,+IACPoR,WAAY,qBAEdC,UAAW,CACTrR,MAAO,+BACPoR,WAAY,0BAEdE,OAAQ,CACNtR,MAAO,2BACPoR,WAAY,uBAEdG,UAAW,CACTvR,MAAO,gDACPoR,WAAY,oBAEdI,cAAe,CACbxR,MAAO,0CACPoR,WAAY,uBAEdK,KAAM,CACJzR,MAAO,iBACPoR,WAAY,wBAEdM,YAAa,CACX1R,MAAO,WACPoR,WAAY,4BAEdO,QAAS,CACP3R,MAAO,qBACPoR,WAAY,yBAoBVQ,EAAkB,IAAIC,IAAI,CAC9B,MACA,IACA,KACA,KACA,UACA,KACA,KACA,KACA,KACA,KACA,KACA,OAGa,SAASC,EAAoBjN,EAAmB4L,EAAiBC,EAAgBqB,EAAgBC,EAAoBvM,EAA4BwM,EAAS,CAACA,OAAQ,IAChL,GAAqB,IAAlBpN,EAAKwB,SAAgB,CACtB,IAAIC,EAAYzB,EAAKyB,UAerB,GANGyL,IAAYlN,EACb6L,EAAK3R,KAAKuH,EAAU4L,OAAO,EAAGF,GAAa,IAAS1L,EAAU4L,OAAOF,IAErEtB,EAAK3R,KAAKuH,GAGTb,GAAYa,EAAUrH,QACpB4F,EAAKsN,WAAY,CAClB,MAAMC,EAAgBvN,EAAKuN,cAG3B,IAAI,MAAMzP,KAAQuO,EAAc,CAC9B,MAAMH,EAAMG,EAAavO,GACnBqO,EAAUoB,EAAcpB,QAAQD,EAAI/Q,MAAQ,uBACF,QAA7CgR,aAAO,EAAPA,EAASqB,aAAa,sBAUH,yBAAnBtB,EAAIK,WACL3L,EAAS1G,KAAK,CACZ6H,EAAGmK,EAAIK,WACPkB,IAAMtB,EAA8BuB,KACpCN,OAAQA,EAAOA,OACfhT,OAAQqH,EAAUrH,SAEO,6BAAnB8R,EAAIK,WACZ3L,EAAS1G,KAAK,CACZ6H,EAAGmK,EAAIK,WACPa,OAAQA,EAAOA,OACfhT,OAAQqH,EAAUrH,OAClBuT,QAAUxB,EAAwB5M,QAAQqO,OAAOC,aAGnDjN,EAAS1G,KAAK,CACZ6H,EAAGmK,EAAIK,WACPa,OAAQA,EAAOA,OACfhT,OAAQqH,EAAUrH,WAQ5B,YADAgT,EAAOA,QAAU3L,EAAUrH,QAI7B,GAAqB,IAAlB4F,EAAKwB,SACN,OAGF,MAAMsM,EAAaZ,IAAYlN,EACzB+N,EAAUhB,EAAgBiB,IAAIhO,EAAKiO,SACzC,GAAGF,GAAWlC,EAAKzR,OACjBwR,EAAM1R,KAAK2R,EAAKC,KAAK,KACrBD,EAAKqC,OAAO,EAAGrC,EAAKzR,UAClBgT,EAAOA,YACJ,GAAGpN,aAAgBmO,iBAAkB,CAC1C,MAAMC,EAAMpO,EAAKoO,IACdA,IACDvC,EAAK3R,KAAKkU,GACVhB,EAAOA,QAAUgB,EAAIhU,QAItB0T,IAAeX,GAChBtB,EAAK3R,KAAK,KAGZ,MAAMmU,EAAcrO,EAAKsO,QArHH,iCAsHhBC,EAAoB3N,aAAQ,EAARA,EAAUxG,OAEpC,IAAIkH,EAAWtB,EAAKE,WACpB,KAAMoB,GACJ2L,EAAoB3L,EAAUsK,EAAOC,EAAMqB,EAASC,EAAWvM,EAAUwM,GACzE9L,EAAWA,EAASC,YAOtB,GAJGuM,GAAcX,GACftB,EAAK3R,KAAK,KAGTmU,GAAerO,EAAKuB,cACrBsK,EAAK3R,KAAK,OACRkT,EAAOA,YAGgBhR,IAAtBmS,GACD,IAAI,IAAIC,EAAID,EAAmBnU,EAASwG,EAASxG,OAAQoU,EAAIpU,IAAUoU,IACnE5N,EAAS4N,GAAGpU,OAKpB,MAAMqU,EAAY5C,EAAKzR,OACpB2T,GAAWU,IACZ7C,EAAM1R,KAAK2R,EAAKC,KAAK,KACrBD,EAAKqC,OAAO,EAAGO,KACbrB,EAAOA,QAGRqB,GAA8B,MAAjBzO,EAAKiO,SAAmBjO,EAAKuB,cAC3CqK,EAAM1R,KAAK,MACTkT,EAAOA,U,gCC9Mb,8CAQe,SAASlK,EAAa0E,GACnC,OAAGA,EAAQ8G,aAAa,oBAA0C,UAApB9G,EAAQqG,SAI5C,YAAarG,GAAS,GAAOlJ,MAAMyC,QAElCyG,EAA6BlJ,MAAMyC,S,gCCfhD,6CAae,SAASwN,EAAgBpK,EAAiBqK,GAAmB,GAC1E,IAAG,sBAAwBA,GAAoBpO,SAASqO,gBAAkBtK,EAK1E,GADAA,EAAGuK,aAC+B,IAAxB5Q,OAAO0G,mBAAgE,IAAzBpE,SAASiE,YAA6B,CAC5F,IAAID,EAAQhE,SAASiE,cACrBD,EAAME,mBAAmBH,GACzBC,EAAMuK,UAAS,GACf,IAAIpK,EAAMzG,OAAO0G,eACjBD,EAAIE,kBACJF,EAAIG,SAASN,QAER,QAA4C,IAAlChE,SAASwO,KAAKC,gBAAiC,CAE9D,IAAIC,EAAY1O,SAASwO,KAAKC,kBAC9BC,EAAUC,kBAAkB5K,GAC5B2K,EAAUH,UAAS,GACnBG,EAAU5K,Y,gCCpBC,SAAStL,EAAWD,EAAYwC,GAE7C,OAAO,IAAIO,QAAcC,IACvB,MAAMqT,EAAS,IAAIC,WACnBD,EAAOzQ,iBAAiB,UAAYpF,IAElCwC,EAAQxC,EAAEmH,OAAO4O,UAEnBF,EAAO7T,GAAQxC,KApBnB","file":"6.20c444db88e2e357fc97.chunk.js","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 readBlobAsArrayBuffer from \"./readBlobAsArrayBuffer\";\n\nexport default function readBlobAsUint8Array(blob: Blob) {\n return readBlobAsArrayBuffer(blob).then(buffer => new Uint8Array(buffer));\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 readBlobAs from \"./readBlobAs\";\n\nexport default function readBlobAsArrayBuffer(blob: Blob) {\n return readBlobAs(blob, 'readAsArrayBuffer');\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 * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport blobConstruct from \"../helpers/blob/blobConstruct\";\r\nimport readBlobAsUint8Array from \"../helpers/blob/readBlobAsUint8Array\";\r\n\r\nexport class FileManager {\r\n private blobSupported = true;\r\n \r\n constructor() {\r\n try {\r\n blobConstruct([], '');\r\n } catch(e) {\r\n this.blobSupported = false;\r\n }\r\n }\r\n \r\n public isAvailable() {\r\n return this.blobSupported;\r\n }\r\n \r\n public write(fileWriter: ReturnType, bytes: Uint8Array | Blob | string): Promise {\r\n if(bytes instanceof Blob) { // is file bytes\r\n return readBlobAsUint8Array(bytes).then(arr => {\r\n return fileWriter.write(arr);\r\n });\r\n } else {\r\n return fileWriter.write(bytes);\r\n }\r\n }\r\n\r\n public getFakeFileWriter(mimeType: string, saveFileCallback?: (blob: Blob) => Promise) {\r\n const blobParts: Array = [];\r\n const fakeFileWriter = {\r\n write: async(part: Uint8Array | string) => {\r\n if(!this.blobSupported) {\r\n throw false;\r\n }\r\n \r\n blobParts.push(part);\r\n },\r\n truncate: () => {\r\n blobParts.length = 0;\r\n },\r\n finalize: (saveToStorage = true) => {\r\n const blob = blobConstruct(blobParts, mimeType);\r\n\r\n if(saveToStorage && saveFileCallback) {\r\n saveFileCallback(blob);\r\n }\r\n \r\n return blob;\r\n }\r\n };\r\n \r\n return fakeFileWriter;\r\n }\r\n}\r\n\r\nexport default new FileManager();\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 Modes from '../config/modes';\r\nimport blobConstruct from '../helpers/blob/blobConstruct';\r\nimport FileManager from './fileManager';\r\n//import { MOUNT_CLASS_TO } from './mtproto/mtproto_config';\r\n//import { logger } from './polyfill';\r\n\r\nexport type CacheStorageDbName = 'cachedFiles' | 'cachedStreamChunks' | 'cachedAssets';\r\n\r\nexport default class CacheStorageController {\r\n private static STORAGES: CacheStorageController[] = [];\r\n private openDbPromise: Promise;\r\n\r\n private useStorage = true;\r\n\r\n //private log: ReturnType = logger('CS');\r\n\r\n constructor(private dbName: CacheStorageDbName) {\r\n if(Modes.test) {\r\n this.dbName += '_test';\r\n }\r\n\r\n if(CacheStorageController.STORAGES.length) {\r\n this.useStorage = CacheStorageController.STORAGES[0].useStorage;\r\n }\r\n \r\n this.openDatabase();\r\n CacheStorageController.STORAGES.push(this);\r\n }\r\n\r\n private openDatabase(): Promise {\r\n return this.openDbPromise ?? (this.openDbPromise = caches.open(this.dbName));\r\n }\r\n\r\n public delete(entryName: string) {\r\n return this.timeoutOperation((cache) => cache.delete('/' + entryName));\r\n }\r\n\r\n public deleteAll() {\r\n return caches.delete(this.dbName);\r\n }\r\n\r\n public get(entryName: string) {\r\n return this.timeoutOperation((cache) => cache.match('/' + entryName));\r\n }\r\n\r\n public save(entryName: string, response: Response) {\r\n // return new Promise((resolve) => {}); // DEBUG\r\n return this.timeoutOperation((cache) => cache.put('/' + entryName, response));\r\n }\r\n\r\n public getFile(fileName: string, method: 'blob' | 'json' | 'text' = 'blob'): Promise {\r\n /* if(method === 'blob') {\r\n return Promise.reject();\r\n } */\r\n\r\n // const str = `get fileName: ${fileName}`;\r\n // console.time(str);\r\n return this.get(fileName).then((response) => {\r\n if(!response) {\r\n //console.warn('getFile:', response, fileName);\r\n throw 'NO_ENTRY_FOUND';\r\n }\r\n\r\n const promise = response[method]();\r\n // promise.then(() => {\r\n // console.timeEnd(str);\r\n // });\r\n return promise;\r\n });\r\n }\r\n\r\n public saveFile(fileName: string, blob: Blob | Uint8Array) {\r\n //return Promise.resolve(blobConstruct([blob]));\r\n if(!(blob instanceof Blob)) {\r\n blob = blobConstruct(blob) as Blob;\r\n }\r\n\r\n const response = new Response(blob, {\r\n headers: {\r\n 'Content-Length': '' + blob.size\r\n }\r\n });\r\n \r\n return this.save(fileName, response).then(() => blob as Blob);\r\n }\r\n\r\n public timeoutOperation(callback: (cache: Cache) => Promise) {\r\n if(!this.useStorage) {\r\n return Promise.reject('STORAGE_OFFLINE');\r\n }\r\n\r\n return new Promise(async(resolve, reject) => {\r\n let rejected = false;\r\n const timeout = setTimeout(() => {\r\n reject();\r\n //console.warn('CACHESTORAGE TIMEOUT');\r\n rejected = true;\r\n }, 15e3);\r\n\r\n try {\r\n const cache = await this.openDatabase();\r\n if(!cache) {\r\n this.useStorage = false;\r\n this.openDbPromise = undefined;\r\n throw 'no cache?';\r\n }\r\n\r\n const res = await callback(cache);\r\n\r\n if(rejected) return;\r\n resolve(res);\r\n } catch(err) {\r\n reject(err);\r\n }\r\n\r\n clearTimeout(timeout);\r\n });\r\n }\r\n\r\n public getFileWriter(fileName: string, mimeType: string) {\r\n const fakeWriter = FileManager.getFakeFileWriter(mimeType, (blob) => {\r\n return this.saveFile(fileName, blob).catch(() => blob);\r\n });\r\n\r\n return Promise.resolve(fakeWriter);\r\n }\r\n\r\n public static toggleStorage(enabled: boolean) {\r\n return Promise.all(this.STORAGES.map(storage => {\r\n storage.useStorage = enabled;\r\n \r\n if(!enabled) {\r\n return storage.deleteAll();\r\n }\r\n }));\r\n }\r\n}\r\n\r\n//const cacheStorage = new CacheStorageController(); \r\n//MOUNT_CLASS_TO.cacheStorage = cacheStorage;\r\n//export default cacheStorage;\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 placeCaretAtEnd from \"../helpers/dom/placeCaretAtEnd\";\nimport { formatPhoneNumber } from \"../helpers/formatPhoneNumber\";\nimport { IS_APPLE, IS_ANDROID, IS_APPLE_MOBILE } from \"../environment/userAgent\";\nimport { HelpCountry, HelpCountryCode } from \"../layer\";\nimport InputField, { InputFieldOptions } from \"./inputField\";\n\nexport default class TelInputField extends InputField {\n private pasted = false;\n public lastValue = '';\n \n constructor(options: InputFieldOptions & {\n onInput?: (formatted: ReturnType) => void\n } = {}) {\n super({\n label: 'Contacts.PhoneNumber.Placeholder',\n //plainText: true,\n name: 'phone',\n ...options\n });\n\n this.container.classList.add('input-field-phone');\n\n let telEl = this.input;\n if(telEl instanceof HTMLInputElement) {\n telEl.type = 'tel';\n telEl.autocomplete = 'rr55RandomRR55';\n } else {\n telEl.inputMode = 'decimal';\n\n const pixelRatio = window.devicePixelRatio;\n if(pixelRatio > 1) {\n let letterSpacing: number;\n if(IS_APPLE) {\n letterSpacing = pixelRatio * -.16;\n } else if(IS_ANDROID) {\n letterSpacing = 0;\n }\n\n telEl.style.setProperty('--letter-spacing', letterSpacing + 'px');\n }\n\n const originalFunc = this.setValueSilently.bind(this);\n this.setValueSilently = (value) => {\n originalFunc(value);\n placeCaretAtEnd(this.input, true);\n };\n }\n\n telEl.addEventListener('input', () => {\n //console.log('input', this.value);\n telEl.classList.remove('error');\n \n const value = this.value;\n const diff = Math.abs(value.length - this.lastValue.length);\n if(diff > 1 && !this.pasted && IS_APPLE_MOBILE) {\n this.setValueSilently(this.lastValue + value);\n }\n \n this.pasted = false;\n \n this.setLabel();\n \n let formattedPhoneNumber: ReturnType;\n let formatted: string, country: HelpCountry, countryCode: HelpCountryCode, leftPattern = '';\n if(this.value.replace(/\\++/, '+') === '+') {\n this.setValueSilently('+');\n } else {\n formattedPhoneNumber = formatPhoneNumber(this.value);\n formatted = formattedPhoneNumber.formatted;\n country = formattedPhoneNumber.country;\n leftPattern = formattedPhoneNumber.leftPattern;\n countryCode = formattedPhoneNumber.code;\n this.setValueSilently(this.lastValue = formatted ? '+' + formatted : '');\n }\n \n telEl.dataset.leftPattern = leftPattern/* .replace(/X/g, '0') */;\n \n //console.log(formatted, country);\n\n options.onInput && options.onInput(formattedPhoneNumber);\n });\n \n telEl.addEventListener('paste', () => {\n this.pasted = true;\n //console.log('paste', telEl.value);\n });\n \n /* telEl.addEventListener('change', (e) => {\n console.log('change', telEl.value);\n }); */\n \n telEl.addEventListener('keypress', (e) => {\n //console.log('keypress', this.value);\n const key = e.key;\n if(/\\D/.test(key) && !(e.metaKey || e.ctrlKey) && key !== 'Backspace' && !(key === '+' && e.shiftKey/* && !this.value */)) {\n e.preventDefault();\n return false;\n }\n });\n \n /* telEl.addEventListener('focus', function(this: typeof telEl, e) {\n this.removeAttribute('readonly'); // fix autocomplete\n });*/\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\nexport default function replaceContent(elem: HTMLElement, node: string | Node) {\r\n if(typeof(node) === 'string') {\r\n elem.innerHTML = node;\r\n return;\r\n }\r\n\r\n // * children.length doesn't count text nodes\r\n const firstChild = elem.firstChild;\r\n if(firstChild) {\r\n if(elem.lastChild === firstChild) {\r\n firstChild.replaceWith(node);\r\n } else {\r\n elem.textContent = '';\r\n elem.append(node);\r\n }\r\n } else {\r\n elem.append(node);\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 simulateEvent from \"../helpers/dom/dispatchEvent\";\r\nimport findUpAttribute from \"../helpers/dom/findUpAttribute\";\r\nimport getRichValue from \"../helpers/dom/getRichValue\";\r\nimport isInputEmpty from \"../helpers/dom/isInputEmpty\";\r\nimport selectElementContents from \"../helpers/dom/selectElementContents\";\r\nimport { MessageEntity } from \"../layer\";\r\nimport { i18n, LangPackKey, _i18n } from \"../lib/langPack\";\r\nimport RichTextProcessor from \"../lib/richtextprocessor\";\r\nimport SetTransition from \"./singleTransition\";\r\n\r\nlet init = () => {\r\n document.addEventListener('paste', (e) => {\r\n if(!findUpAttribute(e.target, 'contenteditable=\"true\"')) {\r\n return;\r\n }\r\n\r\n e.preventDefault();\r\n let text: string, entities: MessageEntity[];\r\n\r\n // @ts-ignore\r\n let plainText: string = (e.originalEvent || e).clipboardData.getData('text/plain');\r\n let usePlainText = true;\r\n\r\n // @ts-ignore\r\n let html: string = (e.originalEvent || e).clipboardData.getData('text/html');\r\n if(html.trim()) {\r\n html = html.replace(//, '');\r\n html = html.replace(//, '');\r\n\r\n const match = html.match(/([\\s\\S]*)<\\/body>/);\r\n if(match) {\r\n html = match[1].trim();\r\n }\r\n\r\n let span: HTMLElement = document.createElement('span');\r\n span.innerHTML = html;\r\n\r\n let curChild = span.firstChild;\r\n while(curChild) { // * fix whitespace between elements like

asd

\\n

zxc

\r\n let nextSibling = curChild.nextSibling;\r\n if(curChild.nodeType === 3) {\r\n if(!curChild.nodeValue.trim()) {\r\n curChild.remove();\r\n }\r\n }\r\n\r\n curChild = nextSibling;\r\n }\r\n\r\n const richValue = getRichValue(span, true);\r\n if(richValue.value.replace(/\\s/g, '').length === plainText.replace(/\\s/g, '').length) {\r\n text = richValue.value;\r\n entities = richValue.entities;\r\n usePlainText = false;\r\n \r\n let entities2 = RichTextProcessor.parseEntities(text);\r\n entities2 = entities2.filter(e => e._ === 'messageEntityEmoji' || e._ === 'messageEntityLinebreak');\r\n RichTextProcessor.mergeEntities(entities, entities2);\r\n }\r\n }\r\n \r\n if(usePlainText) {\r\n text = plainText;\r\n entities = RichTextProcessor.parseEntities(text);\r\n entities = entities.filter(e => e._ === 'messageEntityEmoji' || e._ === 'messageEntityLinebreak');\r\n }\r\n\r\n text = RichTextProcessor.wrapDraftText(text, {entities});\r\n \r\n window.document.execCommand('insertHTML', false, text);\r\n });\r\n\r\n init = null;\r\n};\r\n\r\n// ! it doesn't respect symbols other than strongs\r\n/* const checkAndSetRTL = (input: HTMLElement) => {\r\n //const isEmpty = isInputEmpty(input);\r\n //console.log('input', isEmpty);\r\n\r\n //const char = [...getRichValue(input)][0];\r\n const char = (input instanceof HTMLInputElement ? input.value : input.innerText)[0];\r\n let direction = 'ltr';\r\n if(char && checkRTL(char)) {\r\n direction = 'rtl';\r\n }\r\n\r\n //console.log('RTL', direction, char);\r\n\r\n input.style.direction = direction;\r\n}; */\r\n\r\nexport enum InputState {\r\n Neutral = 0,\r\n Valid = 1,\r\n Error = 2\r\n};\r\n\r\nexport type InputFieldOptions = {\r\n placeholder?: LangPackKey, \r\n label?: LangPackKey, \r\n labelOptions?: any[],\r\n labelText?: string,\r\n name?: string, \r\n maxLength?: number, \r\n showLengthOn?: number,\r\n plainText?: true,\r\n animate?: boolean,\r\n required?: boolean,\r\n canBeEdited?: boolean,\r\n validate?: () => boolean\r\n};\r\n\r\nclass InputField {\r\n public container: HTMLElement;\r\n public input: HTMLElement;\r\n public inputFake: HTMLElement;\r\n public label: HTMLLabelElement;\r\n\r\n public originalValue: string;\r\n\r\n public required: boolean;\r\n public validate: () => boolean;\r\n\r\n //public onLengthChange: (length: number, isOverflow: boolean) => void;\r\n // protected wasInputFakeClientHeight: number;\r\n // protected showScrollDebounced: () => void;\r\n\r\n constructor(public options: InputFieldOptions = {}) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('input-field');\r\n\r\n this.required = options.required;\r\n this.validate = options.validate;\r\n\r\n if(options.maxLength !== undefined && options.showLengthOn === undefined) {\r\n options.showLengthOn = Math.min(40, Math.round(options.maxLength / 3));\r\n }\r\n\r\n const {placeholder, maxLength, showLengthOn, name, plainText, canBeEdited = true} = options;\r\n\r\n let label = options.label || options.labelText;\r\n\r\n let input: HTMLElement;\r\n if(!plainText) {\r\n if(init) {\r\n init();\r\n }\r\n\r\n this.container.innerHTML = `\r\n
\r\n `;\r\n\r\n input = this.container.firstElementChild as HTMLElement;\r\n const observer = new MutationObserver(() => {\r\n //checkAndSetRTL(input);\r\n\r\n if(processInput) {\r\n processInput();\r\n }\r\n });\r\n\r\n // * because if delete all characters there will br left\r\n input.addEventListener('input', () => {\r\n if(isInputEmpty(input)) {\r\n input.innerHTML = '';\r\n }\r\n\r\n if(this.inputFake) {\r\n this.inputFake.innerHTML = input.innerHTML;\r\n this.onFakeInput();\r\n }\r\n });\r\n \r\n // ! childList for paste first symbol\r\n observer.observe(input, {characterData: true, childList: true, subtree: true});\r\n\r\n if(options.animate) {\r\n input.classList.add('scrollable', 'scrollable-y');\r\n // this.wasInputFakeClientHeight = 0;\r\n // this.showScrollDebounced = debounce(() => this.input.classList.remove('no-scrollbar'), 150, false, true);\r\n this.inputFake = document.createElement('div');\r\n this.inputFake.setAttribute('contenteditable', 'true');\r\n this.inputFake.className = input.className + ' input-field-input-fake';\r\n }\r\n } else {\r\n this.container.innerHTML = `\r\n \r\n `;\r\n\r\n input = this.container.firstElementChild as HTMLElement;\r\n //input.addEventListener('input', () => checkAndSetRTL(input));\r\n }\r\n\r\n input.setAttribute('dir', 'auto');\r\n\r\n if(placeholder) {\r\n _i18n(input, placeholder, undefined, 'placeholder');\r\n\r\n if(this.inputFake) {\r\n _i18n(this.inputFake, placeholder, undefined, 'placeholder');\r\n }\r\n }\r\n\r\n if(label || placeholder) {\r\n const border = document.createElement('div');\r\n border.classList.add('input-field-border');\r\n this.container.append(border);\r\n }\r\n\r\n if(label) {\r\n this.label = document.createElement('label');\r\n this.setLabel();\r\n this.container.append(this.label);\r\n }\r\n\r\n let processInput: () => void;\r\n if(maxLength) {\r\n const labelEl = this.container.lastElementChild as HTMLLabelElement;\r\n let showingLength = false;\r\n\r\n processInput = () => {\r\n const wasError = input.classList.contains('error');\r\n // * https://stackoverflow.com/a/54369605 #2 to count emoji as 1 symbol\r\n const inputLength = plainText ? (input as HTMLInputElement).value.length : [...getRichValue(input, false).value].length;\r\n const diff = maxLength - inputLength;\r\n const isError = diff < 0;\r\n input.classList.toggle('error', isError);\r\n\r\n //this.onLengthChange && this.onLengthChange(inputLength, isError);\r\n\r\n if(isError || diff <= showLengthOn) {\r\n this.setLabel();\r\n labelEl.append(` (${maxLength - inputLength})`);\r\n if(!showingLength) showingLength = true;\r\n } else if((wasError && !isError) || showingLength) {\r\n this.setLabel();\r\n showingLength = false;\r\n }\r\n };\r\n\r\n input.addEventListener('input', processInput);\r\n }\r\n\r\n this.input = input;\r\n }\r\n\r\n public select() {\r\n if(!this.value) { // * avoid selecting whole empty field on iOS devices\r\n return;\r\n }\r\n\r\n if(this.options.plainText) {\r\n (this.input as HTMLInputElement).select(); // * select text\r\n } else {\r\n selectElementContents(this.input);\r\n }\r\n }\r\n\r\n public setLabel() {\r\n this.label.textContent = '';\r\n if(this.options.labelText) {\r\n this.label.innerHTML = this.options.labelText;\r\n } else {\r\n this.label.append(i18n(this.options.label, this.options.labelOptions));\r\n }\r\n }\r\n\r\n public onFakeInput(setHeight = true) {\r\n const {scrollHeight: newHeight/* , clientHeight */} = this.inputFake;\r\n /* if(this.wasInputFakeClientHeight && this.wasInputFakeClientHeight !== clientHeight) {\r\n this.input.classList.add('no-scrollbar'); // ! в сафари может вообще не появиться скролл после анимации, так как ему нужен полный reflow блока с overflow.\r\n this.showScrollDebounced();\r\n } */\r\n\r\n const currentHeight = +this.input.style.height.replace('px', '');\r\n if(currentHeight === newHeight) {\r\n return;\r\n }\r\n\r\n const TRANSITION_DURATION_FACTOR = 50;\r\n const transitionDuration = Math.round(\r\n TRANSITION_DURATION_FACTOR * Math.log(Math.abs(newHeight - currentHeight)),\r\n );\r\n\r\n // this.wasInputFakeClientHeight = clientHeight;\r\n this.input.style.transitionDuration = `${transitionDuration}ms`;\r\n\r\n if(setHeight) {\r\n this.input.style.height = newHeight ? newHeight + 'px' : '';\r\n }\r\n\r\n const className = 'is-changing-height';\r\n SetTransition(this.input, className, true, transitionDuration, () => {\r\n this.input.classList.remove(className);\r\n });\r\n }\r\n\r\n get value() {\r\n return this.options.plainText ? (this.input as HTMLInputElement).value : getRichValue(this.input, false).value;\r\n //return getRichValue(this.input);\r\n }\r\n\r\n set value(value: string) {\r\n this.setValueSilently(value, false);\r\n\r\n simulateEvent(this.input, 'input');\r\n }\r\n\r\n public setValueSilently(value: string, fireFakeInput = true) {\r\n if(this.options.plainText) {\r\n (this.input as HTMLInputElement).value = value;\r\n } else {\r\n this.input.innerHTML = value;\r\n \r\n if(this.inputFake) {\r\n this.inputFake.innerHTML = value;\r\n\r\n if(fireFakeInput) {\r\n this.onFakeInput();\r\n }\r\n }\r\n }\r\n }\r\n\r\n public isChanged() {\r\n return this.value !== this.originalValue;\r\n }\r\n\r\n public isValid() {\r\n return !this.input.classList.contains('error') && \r\n (!this.validate || this.validate()) && \r\n (!this.required || !isInputEmpty(this.input));\r\n }\r\n\r\n public isValidToChange() {\r\n return this.isValid() && this.isChanged();\r\n }\r\n\r\n public setDraftValue(value = '', silent = false) {\r\n if(!this.options.plainText) {\r\n value = RichTextProcessor.wrapDraftText(value);\r\n }\r\n\r\n if(silent) {\r\n this.setValueSilently(value, false); \r\n } else {\r\n this.value = value;\r\n }\r\n }\r\n\r\n public setOriginalValue(value: InputField['originalValue'] = '', silent = false) {\r\n this.originalValue = value;\r\n this.setDraftValue(value, silent);\r\n }\r\n\r\n public setState(state: InputState, label?: LangPackKey) {\r\n if(label) {\r\n this.label.textContent = '';\r\n this.label.append(i18n(label, this.options.labelOptions));\r\n }\r\n\r\n this.input.classList.toggle('error', !!(state & InputState.Error));\r\n this.input.classList.toggle('valid', !!(state & InputState.Valid));\r\n }\r\n\r\n public setError(label?: LangPackKey) {\r\n this.setState(InputState.Error, label);\r\n }\r\n}\r\n\r\nexport default InputField;\r\n","// https://stackoverflow.com/a/6150060\nexport default function selectElementContents(el: HTMLElement) {\n const range = document.createRange();\n range.selectNodeContents(el);\n const sel = window.getSelection();\n sel.removeAllRanges();\n sel.addRange(range);\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 { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\r\nimport { logger, LogTypes } from \"../lib/logger\";\r\nimport fastSmoothScroll, { ScrollOptions } from \"../helpers/fastSmoothScroll\";\r\nimport useHeavyAnimationCheck from \"../hooks/useHeavyAnimationCheck\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\n/*\r\nvar el = $0;\r\nvar height = 0;\r\nvar checkUp = false;\r\n\r\ndo {\r\n height += el.scrollHeight;\r\n} while(el = (checkUp ? el.previousElementSibling : el.nextElementSibling));\r\nconsole.log(height);\r\n*/\r\n\r\n/*\r\nArray.from($0.querySelectorAll('.bubble-content')).forEach(_el => {\r\n\t//_el.style.display = '';\t\r\n\t//return;\r\n\r\n\tlet el = _el.parentElement;\r\n\tlet height = el.scrollHeight;\r\n\tlet width = el.scrollWidth;\r\n\tel.style.width = width + 'px';\r\n\tel.style.height = height + 'px';\r\n\t_el.style.display = 'none';\r\n});\r\n*/\r\n\r\n/* const scrollables: Map = new Map();\r\nconst scrollsIntersector = new IntersectionObserver(entries => {\r\n for(let entry of entries) {\r\n const scrollable = scrollables.get(entry.target as HTMLElement);\r\n\r\n if(entry.isIntersecting) {\r\n scrollable.isVisible = true;\r\n } else {\r\n scrollable.isVisible = false;\r\n\r\n if(!isInDOM(entry.target)) {\r\n scrollsIntersector.unobserve(scrollable.container);\r\n scrollables.delete(scrollable.container);\r\n }\r\n }\r\n }\r\n}); */\r\n\r\nexport class ScrollableBase {\r\n protected log: ReturnType;\r\n\r\n public splitUp: HTMLElement;\r\n public onScrollMeasure: number = 0;\r\n\r\n public lastScrollPosition: number = 0;\r\n public lastScrollDirection: number = 0;\r\n\r\n public onAdditionalScroll: () => void;\r\n public onScrolledTop: () => void;\r\n public onScrolledBottom: () => void;\r\n\r\n public isHeavyAnimationInProgress = false;\r\n protected needCheckAfterAnimation = false;\r\n\r\n public checkForTriggers?: () => void;\r\n\r\n public scrollProperty: 'scrollTop' | 'scrollLeft';\r\n \r\n private removeHeavyAnimationListener: () => void;\r\n\r\n constructor(public el: HTMLElement, logPrefix = '', public container: HTMLElement = document.createElement('div')) {\r\n this.container.classList.add('scrollable');\r\n\r\n this.log = logger('SCROLL' + (logPrefix ? '-' + logPrefix : ''), LogTypes.Error);\r\n\r\n if(el) {\r\n Array.from(el.children).forEach(c => this.container.append(c));\r\n\r\n el.append(this.container);\r\n }\r\n //this.onScroll();\r\n }\r\n\r\n public setListeners() {\r\n if(this.removeHeavyAnimationListener) {\r\n return;\r\n }\r\n\r\n window.addEventListener('resize', this.onScroll, {passive: true});\r\n this.container.addEventListener('scroll', this.onScroll, {passive: true, capture: true});\r\n\r\n this.removeHeavyAnimationListener = useHeavyAnimationCheck(() => {\r\n this.isHeavyAnimationInProgress = true;\r\n\r\n if(this.onScrollMeasure) {\r\n this.needCheckAfterAnimation = true;\r\n window.cancelAnimationFrame(this.onScrollMeasure);\r\n }\r\n }, () => {\r\n this.isHeavyAnimationInProgress = false;\r\n\r\n if(this.needCheckAfterAnimation) {\r\n this.onScroll();\r\n this.needCheckAfterAnimation = false;\r\n }\r\n });\r\n }\r\n\r\n public removeListeners() {\r\n if(!this.removeHeavyAnimationListener) {\r\n return;\r\n }\r\n\r\n window.removeEventListener('resize', this.onScroll);\r\n this.container.removeEventListener('scroll', this.onScroll, {capture: true});\r\n\r\n this.removeHeavyAnimationListener();\r\n }\r\n\r\n public append(element: HTMLElement) {\r\n this.container.append(element);\r\n }\r\n\r\n public scrollIntoViewNew(options: Omit) {\r\n //return Promise.resolve();\r\n return fastSmoothScroll({\r\n ...options,\r\n container: this.container\r\n });\r\n }\r\n\r\n public onScroll = () => {\r\n //if(this.debug) {\r\n //this.log('onScroll call', this.onScrollMeasure);\r\n //}\r\n\r\n //return;\r\n\r\n if(this.isHeavyAnimationInProgress) {\r\n if(this.onScrollMeasure) {\r\n window.cancelAnimationFrame(this.onScrollMeasure);\r\n }\r\n\r\n this.needCheckAfterAnimation = true;\r\n return;\r\n }\r\n\r\n //if(this.onScrollMeasure || ((this.scrollLocked || (!this.onScrolledTop && !this.onScrolledBottom)) && !this.splitUp && !this.onAdditionalScroll)) return;\r\n if((!this.onScrolledTop && !this.onScrolledBottom) && !this.splitUp && !this.onAdditionalScroll) return;\r\n if(this.onScrollMeasure) window.cancelAnimationFrame(this.onScrollMeasure);\r\n this.onScrollMeasure = window.requestAnimationFrame(() => {\r\n this.onScrollMeasure = 0;\r\n\r\n const scrollPosition = this.container[this.scrollProperty];\r\n this.lastScrollDirection = this.lastScrollPosition === scrollPosition ? 0 : (this.lastScrollPosition < scrollPosition ? 1 : -1); // * 1 - bottom, -1 - top\r\n this.lastScrollPosition = scrollPosition;\r\n\r\n if(this.onAdditionalScroll && this.lastScrollDirection !== 0) {\r\n this.onAdditionalScroll();\r\n }\r\n \r\n if(this.checkForTriggers) {\r\n this.checkForTriggers();\r\n }\r\n });\r\n };\r\n}\r\n\r\nexport type SliceSides = 'top' | 'bottom';\r\nexport type SliceSidesContainer = {[k in SliceSides]: boolean};\r\n\r\nexport default class Scrollable extends ScrollableBase {\r\n public padding: HTMLElement;\r\n \r\n public loadedAll: SliceSidesContainer = {top: true, bottom: false};\r\n\r\n constructor(el: HTMLElement, logPrefix = '', public onScrollOffset = 300, withPaddingContainer?: boolean) {\r\n super(el, logPrefix);\r\n\r\n /* if(withPaddingContainer) {\r\n this.padding = document.createElement('div');\r\n this.padding.classList.add('scrollable-padding');\r\n Array.from(this.container.children).forEach(c => this.padding.append(c));\r\n this.container.append(this.padding);\r\n } */\r\n\r\n this.container.classList.add('scrollable-y');\r\n this.setListeners();\r\n this.scrollProperty = 'scrollTop';\r\n }\r\n\r\n public setVirtualContainer(el?: HTMLElement) {\r\n this.splitUp = el;\r\n this.log('setVirtualContainer:', el, this);\r\n }\r\n\r\n public checkForTriggers = () => {\r\n if((!this.onScrolledTop && !this.onScrolledBottom)) return;\r\n\r\n if(this.isHeavyAnimationInProgress) {\r\n this.onScroll();\r\n return;\r\n }\r\n\r\n const scrollHeight = this.container.scrollHeight;\r\n if(!scrollHeight) { // незачем вызывать триггеры если блок пустой или не виден\r\n return;\r\n }\r\n\r\n const clientHeight = this.container.clientHeight;\r\n const maxScrollTop = scrollHeight - clientHeight;\r\n const scrollTop = this.lastScrollPosition;\r\n\r\n //this.log('checkForTriggers:', scrollTop, maxScrollTop);\r\n\r\n if(this.onScrolledTop && scrollTop <= this.onScrollOffset && this.lastScrollDirection <= 0/* && direction === -1 */) {\r\n this.onScrolledTop();\r\n }\r\n\r\n if(this.onScrolledBottom && (maxScrollTop - scrollTop) <= this.onScrollOffset && this.lastScrollDirection >= 0/* && direction === 1 */) {\r\n this.onScrolledBottom();\r\n }\r\n };\r\n\r\n public prepend(...elements: (HTMLElement | DocumentFragment)[]) {\r\n (this.splitUp || this.padding || this.container).prepend(...elements);\r\n }\r\n\r\n public append(...elements: (HTMLElement | DocumentFragment)[]) {\r\n (this.splitUp || this.padding || this.container).append(...elements);\r\n }\r\n\r\n public getDistanceToEnd() {\r\n return this.scrollHeight - Math.round(this.scrollTop + this.container.offsetHeight);\r\n }\r\n\r\n get isScrolledDown() {\r\n return this.getDistanceToEnd() <= 1;\r\n }\r\n\r\n set scrollTop(y: number) {\r\n this.container.scrollTop = y;\r\n }\r\n \r\n get scrollTop() {\r\n //this.log.trace('get scrollTop');\r\n return this.container.scrollTop;\r\n }\r\n \r\n get scrollHeight() {\r\n return this.container.scrollHeight;\r\n }\r\n}\r\n\r\nexport class ScrollableX extends ScrollableBase {\r\n constructor(el: HTMLElement, logPrefix = '', public onScrollOffset = 300, public splitCount = 15, public container: HTMLElement = document.createElement('div')) {\r\n super(el, logPrefix, container);\r\n\r\n this.container.classList.add('scrollable-x');\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n const scrollHorizontally = (e: any) => {\r\n if(!e.deltaX && this.container.scrollWidth > this.container.clientWidth) {\r\n this.container.scrollLeft += e.deltaY / 4;\r\n cancelEvent(e);\r\n }\r\n };\r\n \r\n this.container.addEventListener('wheel', scrollHorizontally, {passive: false});\r\n }\r\n\r\n this.scrollProperty = 'scrollLeft';\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 appStateManager from \"../lib/appManagers/appStateManager\";\r\nimport { ripple } from \"./ripple\";\r\nimport { LangPackKey, _i18n } from \"../lib/langPack\";\r\nimport getDeepProperty from \"../helpers/object/getDeepProperty\";\r\n\r\nexport type CheckboxFieldOptions = {\r\n text?: LangPackKey,\r\n textArgs?: any[],\r\n name?: string, \r\n round?: boolean, \r\n toggle?: boolean,\r\n stateKey?: string,\r\n stateValues?: any[],\r\n disabled?: boolean,\r\n checked?: boolean,\r\n restriction?: boolean,\r\n withRipple?: boolean,\r\n withHover?: boolean,\r\n};\r\nexport default class CheckboxField {\r\n public input: HTMLInputElement;\r\n public label: HTMLLabelElement;\r\n public span: HTMLSpanElement;\r\n\r\n constructor(options: CheckboxFieldOptions = {}) {\r\n const label = this.label = document.createElement('label');\r\n label.classList.add('checkbox-field');\r\n\r\n if(options.restriction) {\r\n label.classList.add('checkbox-field-restriction');\r\n }\r\n\r\n if(options.round) {\r\n label.classList.add('checkbox-field-round');\r\n }\r\n\r\n if(options.disabled) {\r\n this.toggleDisability(true);\r\n }\r\n\r\n const input = this.input = document.createElement('input');\r\n input.classList.add('checkbox-field-input');\r\n input.type = 'checkbox';\r\n if(options.name) {\r\n input.id = 'input-' + options.name;\r\n }\r\n\r\n if(options.checked) {\r\n input.checked = true;\r\n }\r\n\r\n if(options.stateKey) {\r\n appStateManager.getState().then(state => {\r\n const stateValue = getDeepProperty(state, options.stateKey);\r\n let checked: boolean;\r\n if(options.stateValues) {\r\n checked = options.stateValues.indexOf(stateValue) === 1;\r\n } else {\r\n checked = stateValue;\r\n }\r\n\r\n this.setValueSilently(checked);\r\n\r\n input.addEventListener('change', () => {\r\n let value: any;\r\n if(options.stateValues) {\r\n value = options.stateValues[input.checked ? 1 : 0];\r\n } else {\r\n value = input.checked;\r\n }\r\n\r\n appStateManager.setByKey(options.stateKey, value);\r\n });\r\n });\r\n }\r\n\r\n let span: HTMLSpanElement;\r\n if(options.text) {\r\n span = this.span = document.createElement('span');\r\n span.classList.add('checkbox-caption');\r\n _i18n(span, options.text, options.textArgs);\r\n } else {\r\n label.classList.add('checkbox-without-caption');\r\n }\r\n\r\n label.append(input);\r\n\r\n if(options.toggle) {\r\n label.classList.add('checkbox-field-toggle');\r\n\r\n const toggle = document.createElement('div');\r\n toggle.classList.add('checkbox-toggle');\r\n label.append(toggle);\r\n } else {\r\n const box = document.createElement('div');\r\n box.classList.add('checkbox-box');\r\n \r\n const checkSvg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\r\n checkSvg.classList.add('checkbox-box-check');\r\n checkSvg.setAttributeNS(null, 'viewBox', '0 0 24 24');\r\n const use = document.createElementNS(\"http://www.w3.org/2000/svg\", \"use\");\r\n use.setAttributeNS(null, 'href', '#check');\r\n use.setAttributeNS(null, 'x', '-1');\r\n checkSvg.append(use);\r\n \r\n const bg = document.createElement('div');\r\n bg.classList.add('checkbox-box-background');\r\n \r\n const border = document.createElement('div');\r\n border.classList.add('checkbox-box-border');\r\n \r\n box.append(border, bg, checkSvg);\r\n \r\n label.append(box);\r\n }\r\n\r\n if(span) {\r\n label.append(span);\r\n }\r\n\r\n if(options.withRipple) {\r\n label.classList.add('checkbox-ripple', 'hover-effect');\r\n ripple(label, undefined, undefined, true);\r\n //label.prepend(input);\r\n } else if(options.withHover) {\r\n label.classList.add('hover-effect');\r\n }\r\n }\r\n\r\n get checked() {\r\n return this.input.checked;\r\n }\r\n\r\n set checked(checked: boolean) {\r\n /* if(this.checked === checked) {\r\n return;\r\n } */\r\n \r\n this.setValueSilently(checked);\r\n\r\n const event = new Event('change', {bubbles: true, cancelable: true});\r\n this.input.dispatchEvent(event);\r\n }\r\n\r\n public setValueSilently(checked: boolean) {\r\n this.input.checked = checked;\r\n }\r\n\r\n public toggleDisability(disable: boolean) {\r\n this.label.classList.toggle('checkbox-disabled', disable);\r\n return () => this.toggleDisability(!disable);\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 rootScope from \"../lib/rootScope\";\r\n\r\nconst SetTransition = (\r\n element: HTMLElement, \r\n className: string, \r\n forwards: boolean, \r\n duration: number, \r\n onTransitionEnd?: () => void, \r\n useRafs?: number\r\n) => {\r\n const {timeout, raf} = element.dataset;\r\n if(timeout !== undefined) {\r\n clearTimeout(+timeout);\r\n }\r\n\r\n if(raf !== undefined) {\r\n window.cancelAnimationFrame(+raf);\r\n if(!useRafs) {\r\n delete element.dataset.raf;\r\n }\r\n }\r\n\r\n // if(forwards && className && element.classList.contains(className) && !element.classList.contains('animating')) {\r\n // return;\r\n // }\r\n\r\n if(useRafs && rootScope.settings.animationsEnabled && duration) {\r\n element.dataset.raf = '' + window.requestAnimationFrame(() => {\r\n delete element.dataset.raf;\r\n SetTransition(element, className, forwards, duration, onTransitionEnd, useRafs - 1);\r\n });\r\n\r\n return;\r\n }\r\n\r\n if(forwards && className) {\r\n element.classList.add(className);\r\n }\r\n\r\n const afterTimeout = () => {\r\n delete element.dataset.timeout;\r\n if(!forwards && className) {\r\n element.classList.remove('backwards', className);\r\n }\r\n\r\n element.classList.remove('animating');\r\n \r\n onTransitionEnd && onTransitionEnd();\r\n };\r\n\r\n if(!rootScope.settings.animationsEnabled || !duration) {\r\n element.classList.remove('animating', 'backwards');\r\n afterTimeout();\r\n return;\r\n }\r\n\r\n element.classList.add('animating');\r\n\r\n element.classList.toggle('backwards', !forwards);\r\n element.dataset.timeout = '' + setTimeout(afterTimeout, duration);\r\n};\r\n\r\nexport default SetTransition;\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\nexport default function toggleDisability(elements: HTMLElement[], disable: boolean): () => void {\r\n if(disable) {\r\n elements.forEach(el => el.setAttribute('disabled', 'true'));\r\n } else {\r\n elements.forEach(el => el.removeAttribute('disabled'));\r\n }\r\n\r\n return () => toggleDisability(elements, !disable);\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 * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport { MessageEntity } from \"../../layer\";\r\nimport RichTextProcessor from \"../../lib/richtextprocessor\";\r\nimport getRichElementValue from \"./getRichElementValue\";\r\n\r\nexport default function getRichValue(field: HTMLElement, withEntities = true) {\r\n const lines: string[] = [];\r\n const line: string[] = [];\r\n\r\n const entities: MessageEntity[] = withEntities ? [] : undefined;\r\n getRichElementValue(field, lines, line, undefined, undefined, entities);\r\n if(line.length) {\r\n lines.push(line.join(''));\r\n }\r\n\r\n let value = lines.join('\\n');\r\n value = value.replace(/\\u00A0/g, ' ');\r\n\r\n if(entities?.length) {\r\n // ! cannot do that here because have the same check before the sending in RichTextProcessor.parseMarkdown\r\n /* const entity = entities[entities.length - 1];\r\n const length = value.length;\r\n const trimmedLength = value.trimRight().length;\r\n if(length !== trimmedLength) {\r\n entity.length -= length - trimmedLength;\r\n } */\r\n\r\n RichTextProcessor.combineSameEntities(entities);\r\n RichTextProcessor.sortEntities(entities);\r\n }\r\n\r\n //console.log('getRichValue:', value, entities);\r\n\r\n return {value, entities};\r\n}\r\n\r\nMOUNT_CLASS_TO.getRichValue = getRichValue;\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\nexport default function findUpTag(el: any, tag: string): HTMLElement {\r\n return el.closest(tag);\r\n /* if(el.tagName === tag) return el; // 03.02.2020\r\n\r\n while(el.parentElement) {\r\n el = el.parentElement;\r\n if(el.tagName === tag) \r\n return el;\r\n }\r\n return null; */\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\nexport default function findUpAttribute(el: any, attribute: string): HTMLElement {\r\n return el.closest(`[${attribute}]`);\r\n /* if(el.getAttribute(attribute) !== null) return el; // 03.02.2020\r\n\r\n while(el.parentElement) {\r\n el = el.parentElement;\r\n if(el.getAttribute(attribute) !== null) \r\n return el;\r\n }\r\n return null; */\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 * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { MessageEntity } from \"../../layer\";\r\n\r\nexport type MarkdownType = 'bold' | 'italic' | 'underline' | 'strikethrough' | 'monospace' | 'link' | 'mentionName' | 'spoiler';\r\nexport type MarkdownTag = {\r\n match: string,\r\n entityName: Extract;\r\n};\r\n\r\n// https://core.telegram.org/bots/api#html-style\r\nexport const markdownTags: {[type in MarkdownType]: MarkdownTag} = {\r\n bold: {\r\n match: '[style*=\"bold\"], [style*=\"font-weight: 700\"], [style*=\"font-weight: 600\"], [style*=\"font-weight:700\"], [style*=\"font-weight:600\"], b, strong',\r\n entityName: 'messageEntityBold'\r\n },\r\n underline: {\r\n match: '[style*=\"underline\"], u, ins',\r\n entityName: 'messageEntityUnderline'\r\n },\r\n italic: {\r\n match: '[style*=\"italic\"], i, em',\r\n entityName: 'messageEntityItalic'\r\n },\r\n monospace: {\r\n match: '[style*=\"monospace\"], [face=\"monospace\"], pre',\r\n entityName: 'messageEntityPre'\r\n },\r\n strikethrough: {\r\n match: '[style*=\"line-through\"], strike, del, s',\r\n entityName: 'messageEntityStrike'\r\n },\r\n link: {\r\n match: 'A:not(.follow)',\r\n entityName: 'messageEntityTextUrl'\r\n },\r\n mentionName: {\r\n match: 'A.follow',\r\n entityName: 'messageEntityMentionName'\r\n },\r\n spoiler: {\r\n match: '[style*=\"spoiler\"]',\r\n entityName: 'messageEntitySpoiler'\r\n }\r\n};\r\n\r\nconst tabulationMatch = '[style*=\"table-cell\"], th, td';\r\n\r\n/* export function getDepth(child: Node, container?: Node) {\r\n let depth = 0;\r\n\r\n do {\r\n if(child === container) {\r\n return depth;\r\n }\r\n\r\n ++depth;\r\n } while((child = child.parentNode) !== null);\r\n\r\n return depth;\r\n} */\r\n\r\nconst BLOCK_TAG_NAMES = new Set([\r\n 'DIV',\r\n 'P',\r\n 'BR',\r\n 'LI',\r\n 'SECTION',\r\n 'H6',\r\n 'H5',\r\n 'H4',\r\n 'H3',\r\n 'H2',\r\n 'H1',\r\n 'TR'\r\n]);\r\n\r\nexport default function getRichElementValue(node: HTMLElement, lines: string[], line: string[], selNode?: Node, selOffset?: number, entities?: MessageEntity[], offset = {offset: 0}) {\r\n if(node.nodeType === 3) { // TEXT\r\n let nodeValue = node.nodeValue;\r\n\r\n /* const tabulation = node.parentElement?.closest(tabulationMatch + ', [contenteditable]');\r\n if(tabulation?.getAttribute('contenteditable') === null) {\r\n nodeValue += ' ';\r\n // line.push('\\t');\r\n // ++offset.offset;\r\n } */\r\n\r\n if(selNode === node) {\r\n line.push(nodeValue.substr(0, selOffset) + '\\x01' + nodeValue.substr(selOffset));\r\n } else {\r\n line.push(nodeValue);\r\n }\r\n\r\n if(entities && nodeValue.length) {\r\n if(node.parentNode) {\r\n const parentElement = node.parentElement;\r\n \r\n // let closestTag: MarkdownTag, closestElementByTag: Element, closestDepth = Infinity;\r\n for(const type in markdownTags) {\r\n const tag = markdownTags[type as MarkdownType];\r\n const closest = parentElement.closest(tag.match + ', [contenteditable]');\r\n if(closest?.getAttribute('contenteditable') !== null) {\r\n /* const depth = getDepth(closest, parentElement.closest('[contenteditable]'));\r\n if(closestDepth > depth) {\r\n closestDepth = depth;\r\n closestTag = tag;\r\n closestElementByTag = closest;\r\n } */\r\n continue;\r\n }\r\n\r\n if(tag.entityName === 'messageEntityTextUrl') {\r\n entities.push({\r\n _: tag.entityName,\r\n url: (closest as HTMLAnchorElement).href,\r\n offset: offset.offset,\r\n length: nodeValue.length\r\n });\r\n } else if(tag.entityName === 'messageEntityMentionName') {\r\n entities.push({\r\n _: tag.entityName,\r\n offset: offset.offset,\r\n length: nodeValue.length,\r\n user_id: (closest as HTMLElement).dataset.follow.toUserId()\r\n });\r\n } else {\r\n entities.push({\r\n _: tag.entityName as any,\r\n offset: offset.offset,\r\n length: nodeValue.length\r\n });\r\n }\r\n }\r\n }\r\n }\r\n\r\n offset.offset += nodeValue.length;\r\n return;\r\n }\r\n\r\n if(node.nodeType !== 1) { // NON-ELEMENT\r\n return;\r\n }\r\n\r\n const isSelected = selNode === node;\r\n const isBlock = BLOCK_TAG_NAMES.has(node.tagName);\r\n if(isBlock && line.length) {\r\n lines.push(line.join(''));\r\n line.splice(0, line.length);\r\n ++offset.offset;\r\n } else if(node instanceof HTMLImageElement) {\r\n const alt = node.alt;\r\n if(alt) {\r\n line.push(alt);\r\n offset.offset += alt.length;\r\n }\r\n }\r\n\r\n if(isSelected && !selOffset) {\r\n line.push('\\x01');\r\n }\r\n\r\n const isTableCell = node.matches(tabulationMatch);\r\n const wasEntitiesLength = entities?.length;\r\n\r\n let curChild = node.firstChild as HTMLElement;\r\n while(curChild) {\r\n getRichElementValue(curChild, lines, line, selNode, selOffset, entities, offset);\r\n curChild = curChild.nextSibling as any;\r\n }\r\n\r\n if(isSelected && selOffset) {\r\n line.push('\\x01');\r\n }\r\n\r\n if(isTableCell && node.nextSibling) {\r\n line.push(' ');\r\n ++offset.offset;\r\n\r\n // * combine entities such as url after adding space\r\n if(wasEntitiesLength !== undefined) {\r\n for(let i = wasEntitiesLength, length = entities.length; i < length; ++i) {\r\n ++entities[i].length;\r\n }\r\n }\r\n }\r\n\r\n const wasLength = line.length;\r\n if(isBlock && wasLength) {\r\n lines.push(line.join(''));\r\n line.splice(0, wasLength);\r\n ++offset.offset;\r\n }\r\n\r\n if(wasLength && node.tagName === 'P' && node.nextSibling) {\r\n lines.push('');\r\n ++offset.offset;\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 getRichValue from \"./getRichValue\";\r\n\r\nexport default function isInputEmpty(element: HTMLElement) {\r\n if(element.hasAttribute('contenteditable') || element.tagName !== 'INPUT') {\r\n /* const value = element.innerText;\r\n\r\n return !value.trim() && !serializeNodes(Array.from(element.childNodes)).trim(); */\r\n return !getRichValue(element, false).value.trim();\r\n } else {\r\n return !(element as HTMLInputElement).value.trim();\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 * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\r\n\r\nexport default function placeCaretAtEnd(el: HTMLElement, ignoreTouchCheck = false) {\r\n if(IS_TOUCH_SUPPORTED && (!ignoreTouchCheck || document.activeElement !== el)) {\r\n return;\r\n }\r\n \r\n el.focus();\r\n if(typeof window.getSelection !== \"undefined\" && typeof document.createRange !== \"undefined\") {\r\n var range = document.createRange();\r\n range.selectNodeContents(el);\r\n range.collapse(false);\r\n var sel = window.getSelection();\r\n sel.removeAllRanges();\r\n sel.addRange(range);\r\n // @ts-ignore\r\n } else if(typeof document.body.createTextRange !== \"undefined\") {\r\n // @ts-ignore\r\n var textRange = document.body.createTextRange();\r\n textRange.moveToElementText(el);\r\n textRange.collapse(false);\r\n textRange.select();\r\n }\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"],"sourceRoot":""}