tweb/public/10.bc4f486ad464de65a8da.chunk.js.map
wang chenyu 0a61727f1b Check isComposing for send shortcut for IME users (#11)
* Check isComposing for send shortcut
2021-05-01 20:47:43 +03:00

1 line
250 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{"version":3,"sources":["webpack:///./src/components/button.ts","webpack:///./src/lib/appManagers/appStateManager.ts","webpack:///./src/components/misc.ts","webpack:///./src/components/inputField.ts","webpack:///./src/components/ripple.ts","webpack:///./src/lib/lottieLoader.ts","webpack:///./src/helpers/date.ts","webpack:///./src/pages/pagesManager.ts","webpack:///./src/pages/page.ts","webpack:///./src/components/appNavigationController.ts","webpack:///./src/hooks/useHeavyAnimationCheck.ts","webpack:///./src/components/animationIntersector.ts","webpack:///./src/helpers/fastSmoothScroll.ts","webpack:///./src/helpers/random.ts","webpack:///./src/pages/pageIm.ts","webpack:///./src/helpers/number.ts","webpack:///./src/helpers/sequentialDom.ts","webpack:///./src/countries.ts","webpack:///./src/lib/mtproto/serverTimeManager.ts","webpack:///./src/lib/mtproto/passwordManager.ts","webpack:///./src/pages/loginPage.ts","webpack:///./src/components/transition.ts","webpack:///./src/components/passwordInputField.ts","webpack:///./src/lib/filemanager.ts","webpack:///./src/lib/cacheStorage.ts","webpack:///./src/components/horizontalMenu.ts","webpack:///./src/helpers/dom/findUpAsChild.ts","webpack:///./src/components/monkeys/password.ts","webpack:///./src/helpers/animation.ts","webpack:///./src/pages/pagePassword.ts","webpack:///./src/lib/rlottie/rlottie.worker.ts"],"names":["className","options","button","document","createElement","asDiv","icon","noRipple","rippleSquare","classList","add","onlyMobile","disabled","setAttribute","text","append","STATE_VERSION","version","STATE_INIT","allDialogsLoaded","pinnedOrders","contactsList","updates","filters","maxSeenMsgId","stateCreatedTime","Date","now","recentEmoji","topPeers","recentSearch","authState","_","hiddenPinnedMessages","settings","messagesTextSize","sendShortcut","animationsEnabled","autoDownload","contacts","private","groups","channels","autoPlay","gifs","videos","stickers","suggest","loop","themes","name","background","type","blur","slug","highlightningColor","color","theme","notifications","sound","keepSigned","ALL_KEYS","Object","keys","REFRESH_KEYS","AppStateManager","super","log","neededPeers","Map","singlePeerMap","storages","users","storeName","chats","dialogs","storagesResults","this","loadSavedState","loaded","console","time","Promise","resolve","storagesKeys","storagesPromises","map","key","getAll","promises","concat","get","all","then","arr","state","i","length","value","undefined","pushToState","splice","auth","shift","broadcast","id","forEach","s","hasOwnProperty","nightTheme","find","t","missingKey","timeEnd","catch","first","split","direct","set","peerId","limit","has","Set","dispatchEvent","keepPeerSingle","existsPeerId","delete","size","appStateManager","putPreloader","elem","returnDiv","html","div","innerHTML","appendChild","insertAdjacentHTML","lastElementChild","setButtonLoader","remove","removeAttribute","sortedCountries","formatPhoneNumber","str","phoneCode","replace","slice","sort","a","b","country","c","indexOf","pattern","symbol","idx","formatted","onMouseMove","e","rect","openedMenu","getBoundingClientRect","clientX","clientY","diffX","right","left","diffY","bottom","top","closeBtnMenu","onClick","parentElement","menuOverlay","openedMenuOnClose","window","removeEventListener","removeByType","addEventListener","openBtnMenu","menuElement","onClose","pushItem","onPop","canAnimate","insertBefore","once","positionMenu","pageX","pageY","side","scrollWidth","menuWidth","scrollHeight","menuHeight","body","windowWidth","width","windowHeight","height","isMobile","verticalSide","sides","x","intermediateX","y","intermediateY","possibleSides","style","attachContextMenuListener","element","callback","listenerSetter","bind","removeManual","timeout","capture","onCancel","clearTimeout","touches","setTimeout","init","target","hasAttribute","preventDefault","originalEvent","clipboardData","getData","entities","parseEntities","filter","wrapRichText","noLinks","wrappingDraft","execCommand","checkAndSetRTL","input","char","HTMLInputElement","innerText","direction","InputState","container","maxLength","showLengthOn","Math","round","placeholder","plainText","processInput","label","labelText","firstElementChild","observer","MutationObserver","inputFake","onFakeInput","observe","characterData","childList","subtree","animate","wasInputFakeClientHeight","showScrollDebounced","border","setLabel","labelEl","showingLength","wasError","contains","inputLength","diff","isError","toggle","select","textContent","labelOptions","clientHeight","setValueSilently","event","Event","bubbles","cancelable","fireFakeInput","originalValue","silent","wrapDraftText","Error","Valid","setState","rippleClickId","ripple","onEnd","prepend","querySelector","r","handler","drawRipple","startTime","clickId","duration","getComputedStyle","getPropertyValue","elapsedTime","cb","mutate","delay","max","touchStartFired","requestAnimationFrame","clickX","clickY","sqrt","abs","isRippleUnneeded","includes","tagName","touchEnd","cancelBubble","stopPropagation","passive","dataset","convert","min","RLottiePlayer","el","worker","reqId","paused","speed","autoplay","group","frames","cachingDelta","skipRatio","_loop","_autoplay","skipDelta","pixelRatio","devicePixelRatio","needUpscale","noCache","Infinity","canvas","context","getContext","clamped","Uint8ClampedArray","imageData","ImageData","methodName","args","sendQuery","jsonString","setMainLoop","clearPendingRAF","rafId","renderFirstFrame","pause","curFrame","frameCount","requestFrame","stop","play","lottieLoader","onDestroy","frame","frameNo","data","putImageData","err","error","frInterval","delta","frThen","renderFrame2","renderFrame","fps","method","mainLoopForwards","mainLoopBackwards","currentMethod","frameListener","listenerResults","QueryableWorker","defaultListener","onError","onerror","onmessage","queryMethodListener","queryMethodArguments","call","message","postMessage","terminate","queryMethod","transfer","arg","ArrayBuffer","push","buffer","LottieLoader","isWebAssemblySupported","loadPromise","reject","workersLimit","players","workers","curWorkerNum","onPlayerLoaded","rlPlayer","debug","onLoad","warn","onFrame","onPlayerError","getAnimations","animation","checkAnimation","player","remain","object","toneIndex","replacements","COLORREPLACEMENTS","checkSmth","smth","ty","k","foundReplacement","p","applyTo","iterateIt","it","layer","layers","shapes","shape","params","url","loadLottieWorkers","fetch","res","arrayBuffer","gzipUncompress","loadAnimationWorker","assign","animationData","race","newAnimationData","JSON","parse","applyReplacements","stringify","parseInt","initPlayer","addAnimation","loadFromData","months","days","ONE_DAY","getWeekNumber","date","d","UTC","getFullYear","getMonth","getDate","dayNum","getUTCDay","setUTCDate","getUTCDate","yearStart","getUTCFullYear","ceil","getTime","formatDateAccordingToToday","timestamp","timeStr","getHours","getMinutes","getDay","formatDateAccordingToTodayNew","today","hour","minute","year","day","month","weekday","IntlDateElement","getFullDate","joiner","monthAsNumber","noSeconds","getSeconds","leadingZero","noTime","tsNow","seconds","floor","yearPattern","RegExp","monthYearOrDayPattern","yearOrDayAndMonthPattern","shortDate","longDate","numberOfDaysEachMonth","fillTipDates","query","dates","q","trim","toLowerCase","setFullYear","setHours","minDate","maxDate","title","dayOfWeek","setDate","formatWeekLong","getDayOfWeek","distance","setTime","matches","exec","g1","g2","createForDayMonth","createForMonthYear","selectedYear","currentYear","g3","validDateForMonth","formatterYearMax","k1","setMonth","formatterMonthYear","formatterDayMonth","pagesManager","pageId","pagesDiv","getElementById","scrollableDiv","selectTab","horizontalMenu","page","onShown","isAuthPage","display","pageEl","fastSmoothScroll","onFirstMount","onMount","installed","setPage","appNavigationController","navigations","manual","currentHash","location","hash","isPossibleSwipe","onHashChange","replaceState","pushState","item","pop","handleItem","onEscape","back","detach","onTouchEnd","onTouchMove","moved","history","scrollRestoration","good","index","ret","findItemByType","noHistory","origin","pathname","findAndSplice","single","isAnimating","heavyAnimationPromise","promisesInQueue","dispatchHeavyAnimationEvent","promise","finally","Boolean","perf","performance","getHeavyAnimationPromise","handleAnimationStart","handleAnimationEnd","animationIntersector","visible","byGroups","lockedGroups","onlyOnePlayableGroup","intersectionLockedGroups","videosLocked","IntersectionObserver","entries","idle","isIDLE","entry","isIntersecting","clearCache","on","doc","checkAnimations","found","HTMLVideoElement","src","load","unobserve","blurred","destroy","removeAnimation","animations","refreshGroup","FocusDirection","position","margin","maxDistance","forceDirection","forceDuration","axis","Static","scrollWithJs","elementRect","containerRect","offsetTop","scrollTop","Up","Down","rectStartKey","rectEndKey","sizeKey","scrollSizeKey","scrollPositionKey","elementPosition","elementSize","containerSize","scrollPosition","scrollSize","path","remainingPath","startAt","tick","currentPath","transition","nextRandomInt","maxValue","random","randomLong","m","default","requestedServerLanguage","getCacheLangPack","langPack","local","getLangPack","lang_code","numberThousandSplitter","parts","toString","join","formatBytes","bytes","decimals","dm","parseFloat","pow","toFixed","formatNumber","clamp","v","sequentialDom","raf","scheduled","kind","scheduleFlush","do","read","write","Countries","PhoneCodesMain","serverTimeManager","timestampNow","midnightNoOffset","midnightOffseted","midnightOffset","serverTimeOffset","timeParams","to","passwordManager","invokeApi","result","getState","currentHashPromise","newHashPromise","password","new_settings","hint","email","currentPassword","computeSRP","newAlgo","new_algo","salt1","Uint8Array","randomize","newPassword","hashes","new_password_hash","inputCheckPassword","saveApiUser","user","setUserAuth","code","LoginPage","imageDiv","titleLangKey","subtitle","subtitleLangKey","withInputWrapper","inputWrapper","slideNavigation","tabContent","prevTabContent","toRight","elements","reverse","transform","offsetWidth","slideTabs","TransitionSlider","content","transitionTime","onTransitionEnd","isHeavy","animationFunction","Transition","onTransitionEndCallbacks","animationDeferred","animationStarted","from","self","HTMLElement","prevId","_from","children","onTransitionEndCallback","PasswordInputField","passwordVisible","onVisibilityClick","toggleVisible","onVisibilityClickAdditional","autocomplete","stealthy","tabIndex","cloneNode","nextSibling","blobSupported","fileWriter","Blob","fileReader","FileReader","onload","readAsArrayBuffer","mimeType","saveFileCallback","blobParts","part","truncate","finalize","saveToStorage","blob","dbName","useStorage","test","openDatabase","STORAGES","openDbPromise","caches","open","entryName","timeoutOperation","cache","response","put","fileName","save","Response","match","rejected","fakeWriter","getFakeFileWriter","saveFile","enabled","storage","deleteAll","tabs","scrollableX","proxy","Proxy","apply","that","selectTarget","canChange","scrollIntoViewNew","rootScope","prev","useStripe","indicator","currentIndicator","shiftLeft","offsetLeft","scaleFactor","clientWidth","parent","findUpAsChild","tab","PasswordMonkey","passwordInputField","needFrame","loadAnimationFromURL","_animation","currentFrame","setSpeed","setDirection","waitForFirstFrame","instances","cancelAnimationByKey","instance","getAnimationInstance","isCancelled","deferred","animateSingle","createAnimationInstance","passwordInput","btnNext","btnNextI18n","IntlElement","getStateInterval","setInterval","_state","wrapEmojiText","onSubmit","update","preloader","check","clearInterval","mount","monkey","focus","module","exports","Worker"],"mappings":"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","file":"10.bc4f486ad464de65a8da.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 { i18n, LangPackKey } from \"../lib/langPack\";\nimport { ripple } from \"./ripple\";\n\nconst Button = (className: string, options: Partial<{\n noRipple: true, \n onlyMobile: true, \n icon: string, \n rippleSquare: true, \n text: LangPackKey, \n disabled: boolean,\n asDiv: boolean\n}> = {}) => {\n const button: HTMLButtonElement = document.createElement(options.asDiv ? 'div' : 'button') as any;\n button.className = className + (options.icon ? ' tgico-' + options.icon : '');\n\n if(!options.noRipple) {\n if(options.rippleSquare) {\n button.classList.add('rp-square');\n }\n\n ripple(button);\n }\n\n if(options.onlyMobile) {\n button.classList.add('only-handhelds');\n }\n\n if(options.disabled) {\n button.setAttribute('disabled', 'true');\n }\n\n if(options.text) {\n button.append(i18n(options.text));\n }\n\n return button;\n};\n\nexport default Button;\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 { Dialog } from './appMessagesManager';\nimport type { UserAuth } from '../mtproto/mtproto_config';\nimport type { User } from './appUsersManager';\nimport type { AuthState } from '../../types';\nimport type FiltersStorage from '../storages/filters';\nimport type DialogsStorage from '../storages/dialogs';\nimport EventListenerBase from '../../helpers/eventListenerBase';\nimport rootScope from '../rootScope';\nimport sessionStorage from '../sessionStorage';\nimport { logger } from '../logger';\nimport { copy, setDeepProperty, validateInitObject } from '../../helpers/object';\nimport App from '../../config/app';\nimport DEBUG, { MOUNT_CLASS_TO } from '../../config/debug';\nimport AppStorage from '../storage';\nimport { Chat } from '../../layer';\n\nconst REFRESH_EVERY = 24 * 60 * 60 * 1000; // 1 day\nconst STATE_VERSION = App.version;\n\nexport type Background = {\n type: 'color' | 'image' | 'default',\n blur: boolean,\n highlightningColor?: string,\n color?: string,\n slug?: string,\n};\n\nexport type Theme = {\n name: 'day' | 'night' | 'system',\n background: Background\n};\n\nexport type State = {\n allDialogsLoaded: DialogsStorage['allDialogsLoaded'],\n pinnedOrders: DialogsStorage['pinnedOrders'],\n contactsList: number[],\n updates: Partial<{\n seq: number,\n pts: number,\n date: number\n }>,\n filters: FiltersStorage['filters'],\n maxSeenMsgId: number,\n stateCreatedTime: number,\n recentEmoji: string[],\n topPeers: number[],\n recentSearch: number[],\n version: typeof STATE_VERSION,\n authState: AuthState,\n hiddenPinnedMessages: {[peerId: string]: number},\n settings: {\n messagesTextSize: number,\n sendShortcut: 'enter' | 'ctrlEnter',\n animationsEnabled: boolean,\n autoDownload: {\n contacts: boolean\n private: boolean\n groups: boolean\n channels: boolean\n },\n autoPlay: {\n gifs: boolean,\n videos: boolean\n },\n stickers: {\n suggest: boolean,\n loop: boolean\n },\n background?: Background, // ! DEPRECATED\n themes: Theme[],\n theme: Theme['name'],\n notifications: {\n sound: boolean\n },\n nightTheme?: boolean, // ! DEPRECATED\n },\n keepSigned: boolean\n};\n\nexport const STATE_INIT: State = {\n allDialogsLoaded: {},\n pinnedOrders: {},\n contactsList: [],\n updates: {},\n filters: {},\n maxSeenMsgId: 0,\n stateCreatedTime: Date.now(),\n recentEmoji: [],\n topPeers: [],\n recentSearch: [],\n version: STATE_VERSION,\n authState: {\n _: 'authStateSignQr'\n },\n hiddenPinnedMessages: {},\n settings: {\n messagesTextSize: 16,\n sendShortcut: 'enter',\n animationsEnabled: true,\n autoDownload: {\n contacts: true,\n private: true,\n groups: true,\n channels: true\n },\n autoPlay: {\n gifs: true,\n videos: true\n },\n stickers: {\n suggest: true,\n loop: true\n },\n themes: [{\n name: 'day',\n background: {\n type: 'image',\n blur: false,\n slug: 'ByxGo2lrMFAIAAAAmkJxZabh8eM', // * new blurred camomile,\n highlightningColor: 'hsla(85.5319, 36.9171%, 40.402%, 0.4)'\n }\n }, {\n name: 'night',\n background: {\n type: 'color',\n blur: false,\n color: '#0f0f0f',\n highlightningColor: 'hsla(0, 0%, 3.82353%, 0.4)'\n }\n }],\n theme: 'system',\n notifications: {\n sound: false\n }\n },\n keepSigned: true\n};\n\nconst ALL_KEYS = Object.keys(STATE_INIT) as any as Array<keyof State>;\n\nconst REFRESH_KEYS = ['dialogs', 'allDialogsLoaded', 'messages', 'contactsList', 'stateCreatedTime',\n 'updates', 'maxSeenMsgId', 'filters', 'topPeers', 'pinnedOrders'] as any as Array<keyof State>;\n\nexport class AppStateManager extends EventListenerBase<{\n save: (state: State) => Promise<void>,\n peerNeeded: (peerId: number) => void,\n peerUnneeded: (peerId: number) => void,\n}> {\n public static STATE_INIT = STATE_INIT;\n private loaded: Promise<State>;\n private log = logger('STATE'/* , LogLevels.error */);\n\n private state: State;\n\n private neededPeers: Map<number, Set<string>> = new Map();\n private singlePeerMap: Map<string, number> = new Map();\n\n public storages = {\n users: new AppStorage<Record<number, User>>({\n storeName: 'users'\n }),\n\n chats: new AppStorage<Record<number, Chat>>({\n storeName: 'chats'\n }),\n\n dialogs: new AppStorage<Record<number, Dialog>>({\n storeName: 'dialogs'\n })\n };\n\n public storagesResults: {[key in keyof AppStateManager['storages']]: any[]} = {} as any;\n\n constructor() {\n super();\n this.loadSavedState();\n }\n\n public loadSavedState(): Promise<State> {\n if(this.loaded) return this.loaded;\n console.time('load state');\n this.loaded = new Promise((resolve) => {\n const storagesKeys = Object.keys(this.storages) as Array<keyof AppStateManager['storages']>;\n const storagesPromises = storagesKeys.map(key => this.storages[key].getAll());\n\n const promises = ALL_KEYS\n .concat('user_auth' as any)\n .map(key => sessionStorage.get(key))\n .concat(storagesPromises);\n\n Promise.all(promises).then((arr) => {\n /* const self = this;\n const skipHandleKeys = new Set(['isProxy', 'filters', 'drafts']);\n const getHandler = (path?: string) => {\n return {\n get(target: any, key: any) {\n if(key === 'isProxy') {\n return true;\n }\n\n const prop = target[key];\n\n if(prop !== undefined && !skipHandleKeys.has(key) && !prop.isProxy && typeof(prop) === 'object') {\n target[key] = new Proxy(prop, getHandler(path || key));\n return target[key];\n }\n \n return prop;\n },\n set(target: any, key: any, value: any) {\n console.log('Setting', target, `.${key} to equal`, value, path);\n \n target[key] = value;\n\n // @ts-ignore\n self.pushToState(path || key, path ? self.state[path] : value, false);\n\n return true;\n }\n };\n }; */\n\n let state: State = this.state = {} as any;\n\n // ! then can't store false values\n for(let i = 0, length = ALL_KEYS.length; i < length; ++i) {\n const key = ALL_KEYS[i];\n const value = arr[i];\n if(value !== undefined) {\n // @ts-ignore\n state[key] = value;\n } else {\n this.pushToState(key, copy(STATE_INIT[key]));\n }\n }\n\n arr.splice(0, ALL_KEYS.length);\n\n // * Read auth\n const auth: UserAuth = arr.shift() as any;\n if(auth) {\n // ! Warning ! DON'T delete this\n state.authState = {_: 'authStateSignedIn'};\n rootScope.broadcast('user_auth', typeof(auth) !== 'number' ? (auth as any).id : auth); // * support old version\n }\n\n // * Read storages\n for(let i = 0, length = storagesKeys.length; i < length; ++i) {\n this.storagesResults[storagesKeys[i]] = arr[i];\n }\n\n arr.splice(0, storagesKeys.length);\n\n const time = Date.now();\n if((state.stateCreatedTime + REFRESH_EVERY) < time) {\n if(DEBUG) {\n this.log('will refresh state', state.stateCreatedTime, time);\n }\n \n REFRESH_KEYS.forEach(key => {\n this.pushToState(key, copy(STATE_INIT[key]));\n\n // @ts-ignore\n const s = this.storagesResults[key];\n if(s && s.length) {\n s.length = 0;\n }\n });\n }\n \n //state = this.state = new Proxy(state, getHandler());\n\n // * support old version\n if(!state.settings.hasOwnProperty('theme') && state.settings.hasOwnProperty('nightTheme')) {\n state.settings.theme = state.settings.nightTheme ? 'night' : 'day';\n this.pushToState('settings', state.settings);\n }\n\n // * support old version\n if(!state.settings.hasOwnProperty('themes') && state.settings.background) {\n state.settings.themes = copy(STATE_INIT.settings.themes);\n const theme = state.settings.themes.find(t => t.name === state.settings.theme);\n if(theme) {\n theme.background = state.settings.background;\n this.pushToState('settings', state.settings);\n }\n }\n\n validateInitObject(STATE_INIT, state, (missingKey) => {\n // @ts-ignore\n this.pushToState(missingKey, state[missingKey]);\n });\n\n if(state.version !== STATE_VERSION) {\n this.pushToState('version', STATE_VERSION);\n }\n\n // ! probably there is better place for it\n rootScope.settings = state.settings;\n\n if(DEBUG) {\n this.log('state res', state, copy(state));\n }\n \n //return resolve();\n\n console.timeEnd('load state');\n resolve(state);\n }).catch(resolve);\n });\n\n return this.loaded;\n }\n\n public getState() {\n return this.state === undefined ? this.loadSavedState() : Promise.resolve(this.state);\n }\n\n public setByKey(key: string, value: any) {\n setDeepProperty(this.state, key, value);\n rootScope.broadcast('settings_updated', {key, value});\n\n const first = key.split('.')[0];\n // @ts-ignore\n this.pushToState(first, this.state[first]);\n }\n\n public pushToState<T extends keyof State>(key: T, value: State[T], direct = true) {\n if(direct) {\n this.state[key] = value;\n }\n\n sessionStorage.set({\n [key]: value\n });\n }\n\n public requestPeer(peerId: number, type: string, limit?: number) {\n let set = this.neededPeers.get(peerId);\n if(set && set.has(type)) {\n return;\n }\n\n if(!set) {\n set = new Set();\n this.neededPeers.set(peerId, set);\n }\n\n set.add(type);\n this.dispatchEvent('peerNeeded', peerId);\n\n if(limit !== undefined) {\n this.keepPeerSingle(peerId, type);\n }\n }\n\n public isPeerNeeded(peerId: number) {\n return this.neededPeers.has(peerId);\n }\n\n public keepPeerSingle(peerId: number, type: string) {\n const existsPeerId = this.singlePeerMap.get(type);\n if(existsPeerId && existsPeerId !== peerId) {\n const set = this.neededPeers.get(existsPeerId);\n set.delete(type);\n\n if(!set.size) {\n this.neededPeers.delete(existsPeerId);\n this.dispatchEvent('peerUnneeded', existsPeerId);\n }\n }\n\n this.singlePeerMap.set(type, peerId);\n }\n\n /* public resetState() {\n for(let i in this.state) {\n // @ts-ignore\n this.state[i] = false;\n }\n sessionStorage.set(this.state).then(() => {\n location.reload();\n });\n } */\n}\n\n//console.trace('appStateManager include');\n\nconst appStateManager = new AppStateManager();\nMOUNT_CLASS_TO.appStateManager = appStateManager;\nexport default appStateManager;\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 { MOUNT_CLASS_TO } from \"../config/debug\";\nimport Countries, { Country, PhoneCodesMain } from \"../countries\";\nimport { cancelEvent, CLICK_EVENT_NAME } from \"../helpers/dom\";\nimport ListenerSetter from \"../helpers/listenerSetter\";\nimport mediaSizes from \"../helpers/mediaSizes\";\nimport { isTouchSupported } from \"../helpers/touchSupport\";\nimport { isApple, isMobileSafari, isSafari } from \"../helpers/userAgent\";\nimport appNavigationController from \"./appNavigationController\";\n\nexport function putPreloader(elem: Element, returnDiv = false): HTMLElement {\n const html = `\n <svg xmlns=\"http://www.w3.org/2000/svg\" class=\"preloader-circular\" viewBox=\"25 25 50 50\">\n <circle class=\"preloader-path\" cx=\"50\" cy=\"50\" r=\"20\" fill=\"none\" stroke-miterlimit=\"10\"/>\n </svg>`;\n\n if(returnDiv) {\n const div = document.createElement('div');\n div.classList.add('preloader');\n div.innerHTML = html;\n\n if(elem) {\n elem.appendChild(div);\n }\n\n return div;\n }\n \n elem.insertAdjacentHTML('beforeend', html);\n return elem.lastElementChild as HTMLElement;\n}\n\nMOUNT_CLASS_TO.putPreloader = putPreloader;\n\nexport function setButtonLoader(elem: HTMLButtonElement, icon = 'check') {\n elem.classList.remove('tgico-' + icon);\n elem.disabled = true;\n putPreloader(elem);\n\n return () => {\n elem.innerHTML = '';\n elem.classList.add('tgico-' + icon);\n elem.removeAttribute('disabled');\n };\n}\n\nlet sortedCountries: Country[];\nexport function formatPhoneNumber(str: string) {\n str = str.replace(/\\D/g, '');\n let phoneCode = str.slice(0, 6);\n \n ////console.log('str', str, phoneCode);\n if(!sortedCountries) {\n sortedCountries = Countries.slice().sort((a, b) => b.phoneCode.length - a.phoneCode.length);\n }\n \n let country = sortedCountries.find((c) => {\n return c.phoneCode.split(' and ').find((c) => phoneCode.indexOf(c.replace(/\\D/g, '')) === 0);\n });\n\n if(!country) return {formatted: str, country};\n\n country = PhoneCodesMain[country.phoneCode] || country;\n \n let pattern = country.pattern || country.phoneCode;\n pattern.split('').forEach((symbol, idx) => {\n if(symbol === ' ' && str[idx] !== ' ' && str.length > idx) {\n str = str.slice(0, idx) + ' ' + str.slice(idx);\n }\n });\n \n /* if(country.pattern) {\n str = str.slice(0, country.pattern.length);\n } */\n \n return {formatted: str, country};\n}\n\n/* export function parseMenuButtonsTo(to: {[name: string]: HTMLElement}, elements: HTMLCollection | NodeListOf<HTMLElement>) {\n Array.from(elements).forEach(el => {\n const match = el.className.match(/(?:^|\\s)menu-(.+?)(?:$|\\s)/);\n if(!match) return;\n to[match[1]] = el as HTMLElement;\n });\n} */\n\nlet onMouseMove = (e: MouseEvent) => {\n let rect = openedMenu.getBoundingClientRect();\n let {clientX, clientY} = e;\n \n let diffX = clientX >= rect.right ? clientX - rect.right : rect.left - clientX;\n let diffY = clientY >= rect.bottom ? clientY - rect.bottom : rect.top - clientY;\n \n if(diffX >= 100 || diffY >= 100) {\n closeBtnMenu();\n //openedMenu.parentElement.click();\n }\n //console.log('mousemove', diffX, diffY);\n};\n\nconst onClick = (e: MouseEvent | TouchEvent) => {\n //cancelEvent(e);\n closeBtnMenu();\n};\n\n// ! no need in this due to the same handler in appNavigationController\n/* const onKeyDown = (e: KeyboardEvent) => {\n if(e.key === 'Escape') {\n closeBtnMenu();\n cancelEvent(e);\n }\n}; */\n\nexport const closeBtnMenu = () => {\n if(openedMenu) {\n openedMenu.classList.remove('active');\n openedMenu.parentElement.classList.remove('menu-open');\n //openedMenu.previousElementSibling.remove(); // remove overlay\n if(menuOverlay) menuOverlay.remove();\n openedMenu = null;\n }\n \n if(openedMenuOnClose) {\n openedMenuOnClose();\n openedMenuOnClose = null;\n }\n\n if(!isTouchSupported) {\n window.removeEventListener('mousemove', onMouseMove);\n //window.removeEventListener('keydown', onKeyDown, {capture: true});\n window.removeEventListener('contextmenu', onClick);\n }\n\n document.removeEventListener(CLICK_EVENT_NAME, onClick);\n\n if(!isMobileSafari) {\n appNavigationController.removeByType('menu');\n }\n};\n\nwindow.addEventListener('resize', () => {\n if(openedMenu) {\n closeBtnMenu();\n }\n \n /* if(openedMenu && (openedMenu.style.top || openedMenu.style.left)) {\n const rect = openedMenu.getBoundingClientRect();\n const {innerWidth, innerHeight} = window;\n\n console.log(innerWidth, innerHeight, rect);\n } */\n});\n\nlet openedMenu: HTMLElement = null, openedMenuOnClose: () => void = null, menuOverlay: HTMLElement = null;\nexport function openBtnMenu(menuElement: HTMLElement, onClose?: () => void) {\n closeBtnMenu();\n\n if(!isMobileSafari) {\n appNavigationController.pushItem({\n type: 'menu',\n onPop: (canAnimate) => {\n closeBtnMenu();\n }\n });\n }\n \n openedMenu = menuElement;\n openedMenu.classList.add('active');\n openedMenu.parentElement.classList.add('menu-open');\n\n if(!menuOverlay) {\n menuOverlay = document.createElement('div');\n menuOverlay.classList.add('btn-menu-overlay');\n\n // ! because this event must be canceled, and can't cancel on menu click (below)\n menuOverlay.addEventListener(CLICK_EVENT_NAME, (e) => {\n cancelEvent(e);\n onClick(e);\n });\n }\n\n openedMenu.parentElement.insertBefore(menuOverlay, openedMenu);\n\n //document.body.classList.add('disable-hover');\n \n openedMenuOnClose = onClose;\n\n if(!isTouchSupported) {\n window.addEventListener('mousemove', onMouseMove);\n //window.addEventListener('keydown', onKeyDown, {capture: true});\n window.addEventListener('contextmenu', onClick, {once: true});\n }\n\n /* // ! because this event must be canceled, and can't cancel on menu click (below)\n overlay.addEventListener(CLICK_EVENT_NAME, (e) => {\n cancelEvent(e);\n onClick(e);\n }); */\n \n // ! safari iOS doesn't handle window click event on overlay, idk why\n document.addEventListener(CLICK_EVENT_NAME, onClick);\n}\n\nconst PADDING_TOP = 8;\nconst PADDING_LEFT = 8;\nexport function positionMenu({pageX, pageY}: MouseEvent | Touch, elem: HTMLElement, side?: 'left' | 'right' | 'center') {\n //let {clientX, clientY} = e;\n\n // * side mean the OPEN side\n\n let {scrollWidth: menuWidth, scrollHeight: menuHeight} = elem;\n //let {innerWidth: windowWidth, innerHeight: windowHeight} = window;\n const rect = document.body.getBoundingClientRect();\n const windowWidth = rect.width;\n const windowHeight = rect.height;\n\n side = mediaSizes.isMobile ? 'right' : 'left';\n let verticalSide: 'top' /* | 'bottom' */ | 'center' = 'top';\n\n const getSides = () => {\n return {\n x: {\n left: pageX,\n right: pageX - menuWidth\n },\n intermediateX: side === 'right' ? PADDING_LEFT : windowWidth - menuWidth - PADDING_LEFT,\n //intermediateX: clientX < windowWidth / 2 ? PADDING_LEFT : windowWidth - menuWidth - PADDING_LEFT,\n y: {\n top: pageY,\n bottom: pageY - menuHeight\n },\n //intermediateY: verticalSide === 'top' ? PADDING_TOP : windowHeight - menuHeight - PADDING_TOP,\n intermediateY: pageY < windowHeight / 2 ? PADDING_TOP : windowHeight - menuHeight - PADDING_TOP,\n };\n };\n\n const sides = getSides();\n\n const possibleSides = {\n x: {\n left: sides.x.left + menuWidth + PADDING_LEFT <= windowWidth,\n right: sides.x.right >= PADDING_LEFT\n },\n y: {\n top: sides.y.top + menuHeight + PADDING_TOP <= windowHeight,\n bottom: sides.y.bottom - PADDING_TOP >= PADDING_TOP\n }\n };\n\n /* if(side === undefined) {\n if((clientX + menuWidth + PADDING_LEFT) > windowWidth) {\n side = 'right';\n }\n } */\n\n {\n /* const x = sides.x;\n\n const s = Object.keys(x) as (keyof typeof possibleSides.x)[];\n if(side) {\n s.findAndSplice(s => s === side);\n s.unshift(side);\n }\n\n const possibleSide = s.find(s => possibleSides.x[s]); */\n let left: number;\n /* if(possibleSide) {\n left = x[possibleSide];\n side = possibleSide;\n } else {\n left = sides.intermediateX;\n side = undefined;\n } */\n left = possibleSides.x[side] ? sides.x[side] : (side = 'center', sides.intermediateX);\n \n elem.style.left = left + 'px';\n }\n\n /* if((clientY + menuHeight + PADDING_TOP) > windowHeight) {\n elem.style.top = clamp(clientY - menuHeight, PADDING_TOP, windowHeight - menuHeight - PADDING_TOP) + 'px';\n // elem.style.top = (innerHeight - scrollHeight - PADDING_TOP) + 'px';\n verticalSide = 'bottom';\n } else {\n elem.style.top = Math.max(PADDING_TOP, clientY) + 'px';\n verticalSide = 'top';\n } */\n\n {\n let top: number;\n\n top = possibleSides.y[verticalSide] ? sides.y[verticalSide] : (verticalSide = 'center', sides.intermediateY);\n \n elem.style.top = top + 'px';\n }\n \n elem.className = elem.className.replace(/(top|center|bottom)-(left|center|right)/g, '');\n elem.classList.add(\n //(verticalSide === 'center' ? verticalSide : (verticalSide === 'bottom' ? 'top' : 'bottom')) +\n (verticalSide === 'center' ? verticalSide : 'bottom') +\n '-' +\n (side === 'center' ? side : (side === 'left' ? 'right' : 'left')));\n}\n\nexport function attachContextMenuListener(element: HTMLElement, callback: (e: Touch | MouseEvent) => void, listenerSetter?: ListenerSetter) {\n const add = listenerSetter ? listenerSetter.add.bind(listenerSetter, element) : element.addEventListener.bind(element);\n const remove = listenerSetter ? listenerSetter.removeManual.bind(listenerSetter, element) : element.removeEventListener.bind(element);\n\n if(isApple && isTouchSupported) {\n let timeout: number;\n\n const options: any = /* null */{capture: true};\n\n const onCancel = () => {\n clearTimeout(timeout);\n remove('touchmove', onCancel, options);\n remove('touchend', onCancel, options);\n remove('touchcancel', onCancel, options);\n };\n\n add('touchstart', (e: TouchEvent) => {\n if(e.touches.length > 1) {\n onCancel();\n return;\n }\n \n add('touchmove', onCancel, options);\n add('touchend', onCancel, options);\n add('touchcancel', onCancel, options);\n\n timeout = window.setTimeout(() => {\n callback(e.touches[0]);\n onCancel();\n\n if(openedMenu) {\n element.addEventListener('touchend', cancelEvent, {once: true}); // * fix instant closing\n }\n }, .4e3);\n });\n\n /* if(!isSafari) {\n add('contextmenu', (e: any) => {\n cancelEvent(e);\n }, {passive: false, capture: true});\n } */\n } else {\n add('contextmenu', isTouchSupported ? (e: any) => {\n callback(e);\n\n if(openedMenu) {\n element.addEventListener('touchend', cancelEvent, {once: true}); // * fix instant closing\n }\n } : callback);\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 { getRichValue, isInputEmpty } from \"../helpers/dom\";\nimport { debounce } from \"../helpers/schedulers\";\nimport { checkRTL } from \"../helpers/string\";\nimport { i18n, LangPackKey, _i18n } from \"../lib/langPack\";\nimport RichTextProcessor from \"../lib/richtextprocessor\";\n\nlet init = () => {\n document.addEventListener('paste', (e) => {\n if(!(e.target as HTMLElement).hasAttribute('contenteditable') && !(e.target as HTMLElement).parentElement.hasAttribute('contenteditable')) {\n return;\n }\n //console.log('document paste');\n\n //console.log('messageInput paste');\n\n e.preventDefault();\n // @ts-ignore\n let text = (e.originalEvent || e).clipboardData.getData('text/plain');\n\n let entities = RichTextProcessor.parseEntities(text);\n //console.log('messageInput paste', text, entities);\n entities = entities.filter(e => e._ === 'messageEntityEmoji' || e._ === 'messageEntityLinebreak');\n //text = RichTextProcessor.wrapEmojiText(text);\n text = RichTextProcessor.wrapRichText(text, {entities, noLinks: true, wrappingDraft: true});\n\n // console.log('messageInput paste after', text);\n\n // @ts-ignore\n //let html = (e.originalEvent || e).clipboardData.getData('text/html');\n\n // @ts-ignore\n //console.log('paste text', text, );\n window.document.execCommand('insertHTML', false, text);\n });\n\n init = null;\n};\n\nconst checkAndSetRTL = (input: HTMLElement) => {\n //const isEmpty = isInputEmpty(input);\n //console.log('input', isEmpty);\n\n //const char = [...getRichValue(input)][0];\n const char = (input instanceof HTMLInputElement ? input.value : input.innerText)[0];\n let direction = 'ltr';\n if(char && checkRTL(char)) {\n direction = 'rtl';\n }\n\n //console.log('RTL', direction, char);\n\n input.style.direction = direction;\n};\n\nexport enum InputState {\n Neutral = 0,\n Valid = 1,\n Error = 2\n};\n\nexport type InputFieldOptions = {\n placeholder?: LangPackKey, \n label?: LangPackKey, \n labelOptions?: any[],\n labelText?: string,\n name?: string, \n maxLength?: number, \n showLengthOn?: number,\n plainText?: true,\n animate?: true\n};\n\nclass InputField {\n public container: HTMLElement;\n public input: HTMLElement;\n public inputFake: HTMLElement;\n public label: HTMLLabelElement;\n\n public originalValue: string;\n\n //public onLengthChange: (length: number, isOverflow: boolean) => void;\n protected wasInputFakeClientHeight: number;\n protected showScrollDebounced: () => void;\n\n constructor(public options: InputFieldOptions = {}) {\n this.container = document.createElement('div');\n this.container.classList.add('input-field');\n\n if(options.maxLength) {\n options.showLengthOn = Math.round(options.maxLength / 3);\n }\n\n const {placeholder, maxLength, showLengthOn, name, plainText} = options;\n\n let label = options.label || options.labelText;\n\n let input: HTMLElement;\n if(!plainText) {\n if(init) {\n init();\n }\n\n this.container.innerHTML = `\n <div contenteditable=\"true\" class=\"input-field-input\"></div>\n `;\n\n input = this.container.firstElementChild as HTMLElement;\n const observer = new MutationObserver(() => {\n checkAndSetRTL(input);\n\n if(processInput) {\n processInput();\n }\n });\n\n // * because if delete all characters there will br left\n input.addEventListener('input', () => {\n if(isInputEmpty(input)) {\n input.innerHTML = '';\n }\n\n if(this.inputFake) {\n this.inputFake.innerHTML = input.innerHTML;\n this.onFakeInput();\n }\n });\n \n // ! childList for paste first symbol\n observer.observe(input, {characterData: true, childList: true, subtree: true});\n\n if(options.animate) {\n input.classList.add('scrollable', 'scrollable-y');\n this.wasInputFakeClientHeight = 0;\n this.showScrollDebounced = debounce(() => this.input.classList.remove('no-scrollbar'), 150, false, true);\n this.inputFake = document.createElement('div');\n this.inputFake.setAttribute('contenteditable', 'true');\n this.inputFake.className = input.className + ' input-field-input-fake';\n }\n } else {\n this.container.innerHTML = `\n <input type=\"text\" ${name ? `name=\"${name}\"` : ''} autocomplete=\"off\" ${label ? 'required=\"\"' : ''} class=\"input-field-input\">\n `;\n\n input = this.container.firstElementChild as HTMLElement;\n input.addEventListener('input', () => checkAndSetRTL(input));\n }\n\n if(placeholder) {\n _i18n(input, placeholder, undefined, 'placeholder');\n\n if(this.inputFake) {\n _i18n(this.inputFake, placeholder, undefined, 'placeholder');\n }\n }\n\n if(label || placeholder) {\n const border = document.createElement('div');\n border.classList.add('input-field-border');\n this.container.append(border);\n }\n\n if(label) {\n this.label = document.createElement('label');\n this.setLabel();\n this.container.append(this.label);\n }\n\n let processInput: () => void;\n if(maxLength) {\n const labelEl = this.container.lastElementChild as HTMLLabelElement;\n let showingLength = false;\n\n processInput = () => {\n const wasError = input.classList.contains('error');\n // * https://stackoverflow.com/a/54369605 #2 to count emoji as 1 symbol\n const inputLength = plainText ? (input as HTMLInputElement).value.length : [...getRichValue(input)].length;\n const diff = maxLength - inputLength;\n const isError = diff < 0;\n input.classList.toggle('error', isError);\n\n //this.onLengthChange && this.onLengthChange(inputLength, isError);\n\n if(isError || diff <= showLengthOn) {\n this.setLabel();\n labelEl.append(` (${maxLength - inputLength})`);\n if(!showingLength) showingLength = true;\n } else if((wasError && !isError) || showingLength) {\n this.setLabel();\n showingLength = false;\n }\n };\n\n input.addEventListener('input', processInput);\n }\n\n this.input = input;\n }\n\n public select() {\n if((this.input as HTMLInputElement).value) { // * avoid selecting whole empty field on iOS devices\n (this.input as HTMLInputElement).select(); // * select text\n }\n }\n\n public setLabel() {\n this.label.textContent = '';\n if(this.options.labelText) {\n this.label.innerHTML = this.options.labelText;\n } else {\n this.label.append(i18n(this.options.label, this.options.labelOptions));\n }\n }\n\n public onFakeInput() {\n const {scrollHeight, clientHeight} = this.inputFake;\n if(this.wasInputFakeClientHeight && this.wasInputFakeClientHeight !== clientHeight) {\n this.input.classList.add('no-scrollbar'); // ! в сафари может вообще не появиться скролл после анимации, так как ему нужен полный reflow блока с overflow.\n this.showScrollDebounced();\n }\n\n this.wasInputFakeClientHeight = clientHeight;\n this.input.style.height = scrollHeight ? scrollHeight + 'px' : '';\n }\n\n get value() {\n return this.options.plainText ? (this.input as HTMLInputElement).value : getRichValue(this.input);\n //return getRichValue(this.input);\n }\n\n set value(value: string) {\n this.setValueSilently(value, false);\n\n const event = new Event('input', {bubbles: true, cancelable: true});\n this.input.dispatchEvent(event);\n }\n\n public setValueSilently(value: string, fireFakeInput = true) {\n if(this.options.plainText) {\n (this.input as HTMLInputElement).value = value;\n } else {\n this.input.innerHTML = value;\n \n if(this.inputFake) {\n this.inputFake.innerHTML = value;\n\n if(fireFakeInput) {\n this.onFakeInput();\n }\n }\n }\n }\n\n public isValid() {\n return !this.input.classList.contains('error') && this.value !== this.originalValue;\n }\n\n public setOriginalValue(value: InputField['originalValue'] = '', silent = false) {\n this.originalValue = value;\n\n if(!this.options.plainText) {\n value = RichTextProcessor.wrapDraftText(value);\n }\n\n if(silent) {\n this.setValueSilently(value, false); \n } else {\n this.value = value;\n }\n }\n\n public setState(state: InputState, label?: LangPackKey) {\n if(label) {\n this.label.textContent = '';\n this.label.append(i18n(label, this.options.labelOptions));\n }\n\n this.input.classList.toggle('error', !!(state & InputState.Error));\n this.input.classList.toggle('valid', !!(state & InputState.Valid));\n }\n\n public setError(label?: LangPackKey) {\n this.setState(InputState.Error, label);\n }\n}\n\nexport default InputField;\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 findUpClassName from \"../helpers/dom/findUpClassName\";\nimport sequentialDom from \"../helpers/sequentialDom\";\nimport {isTouchSupported} from \"../helpers/touchSupport\";\nimport rootScope from \"../lib/rootScope\";\n\nlet rippleClickId = 0;\nexport function ripple(elem: HTMLElement, callback: (id: number) => Promise<boolean | void> = () => Promise.resolve(), onEnd: (id: number) => void = null, prepend = false) {\n //return;\n if(elem.querySelector('.c-ripple')) return;\n elem.classList.add('rp');\n \n let r = document.createElement('div');\n r.classList.add('c-ripple');\n\n const isSquare = elem.classList.contains('rp-square');\n if(isSquare) {\n r.classList.add('is-square');\n }\n\n elem[prepend ? 'prepend' : 'append'](r);\n\n let handler: () => void;\n //let animationEndPromise: Promise<number>;\n const drawRipple = (clientX: number, clientY: number) => {\n const startTime = Date.now();\n const elem = document.createElement('div');\n\n const clickId = rippleClickId++;\n \n //console.log('ripple drawRipple');\n \n const duration = +window.getComputedStyle(r).getPropertyValue('--ripple-duration').replace('s', '') * 1000;\n //console.log('ripple duration', duration);\n\n handler = () => {\n //handler = () => animationEndPromise.then((duration) => {\n //console.log('ripple animation was:', duration);\n\n //const duration = isSquare || mediaSizes.isMobile ? 200 : 700;\n //return;\n let elapsedTime = Date.now() - startTime;\n const cb = () => {\n //console.log('ripple elapsedTime total pre-remove:', Date.now() - startTime);\n sequentialDom.mutate(() => {\n elem.remove();\n });\n \n if(onEnd) onEnd(clickId);\n };\n if(elapsedTime < duration) {\n let delay = Math.max(duration - elapsedTime, duration / 2);\n setTimeout(() => elem.classList.add('hiding'), Math.max(delay - duration / 2, 0));\n\n setTimeout(cb, delay);\n } else {\n elem.classList.add('hiding');\n setTimeout(cb, duration / 2);\n }\n\n if(!isTouchSupported) {\n window.removeEventListener('contextmenu', handler);\n }\n\n handler = null;\n touchStartFired = false;\n };\n //});\n\n callback && callback(clickId);\n\n /* callback().then((bad) => {\n if(bad) {\n span.remove();\n return;\n } */\n \n //console.log('ripple after promise', Date.now() - startTime);\n //console.log('ripple tooSlow:', tooSlow);\n /* if(tooSlow) {\n span.remove();\n return;\n } */\n\n window.requestAnimationFrame(() => {\n const rect = r.getBoundingClientRect();\n elem.classList.add('c-ripple__circle');\n\n const clickX = clientX - rect.left;\n const clickY = clientY - rect.top;\n\n const radius = Math.sqrt((Math.abs(clickY - rect.height / 2) + rect.height / 2) ** 2 + (Math.abs(clickX - rect.width / 2) + rect.width / 2) ** 2);\n const size = radius;\n\n // center of circle\n const x = clickX - size / 2;\n const y = clickY - size / 2;\n\n //console.log('ripple click', offsetFromCenter, size, clickX, clickY);\n\n elem.style.width = elem.style.height = size + 'px';\n elem.style.left = x + 'px';\n elem.style.top = y + 'px';\n\n // нижний код выполняется с задержкой\n /* animationEndPromise = new Promise((resolve) => {\n span.addEventListener('animationend', () => {\n // 713 -> 700\n resolve(((Date.now() - startTime) / 100 | 0) * 100);\n }, {once: true});\n }); */\n \n // нижний код не всегда включает анимацию ПРИ КЛИКЕ НА ТАЧПАД БЕЗ ТАПТИК ЭНЖИНА\n /* span.style.display = 'none';\n r.append(span);\n duration = +window.getComputedStyle(span).getPropertyValue('animation-duration').replace('s', '') * 1000;\n span.style.display = ''; */\n\n r.append(elem);\n\n //r.classList.add('active');\n //handler();\n });\n //});\n };\n\n const isRippleUnneeded = (e: Event) => e.target !== elem && (\n ['BUTTON', 'A'].includes((e.target as HTMLElement).tagName) \n || findUpClassName(e.target as HTMLElement, 'c-ripple') !== r\n );\n\n // TODO: rename this variable\n let touchStartFired = false;\n if(isTouchSupported) {\n let touchEnd = () => {\n handler && handler();\n };\n \n elem.addEventListener('touchstart', (e) => {\n if(!rootScope.settings.animationsEnabled) {\n return;\n }\n\n //console.log('ripple touchstart', e);\n if(e.touches.length > 1 || touchStartFired || isRippleUnneeded(e)) {\n return;\n }\n \n //console.log('touchstart', e);\n touchStartFired = true;\n \n let {clientX, clientY} = e.touches[0];\n drawRipple(clientX, clientY);\n elem.addEventListener('touchend', touchEnd, {once: true});\n \n window.addEventListener('touchmove', (e) => {\n e.cancelBubble = true;\n e.stopPropagation();\n touchEnd();\n elem.removeEventListener('touchend', touchEnd);\n }, {once: true});\n }, {passive: true});\n } else {\n elem.addEventListener('mousedown', (e) => {\n if(![0, 2].includes(e.button)) { // only left and right buttons\n return;\n }\n\n if(!rootScope.settings.animationsEnabled) {\n return;\n }\n //console.log('ripple mousedown', e, e.target, findUpClassName(e.target as HTMLElement, 'c-ripple') === r);\n\n if(elem.dataset.ripple === '0' || isRippleUnneeded(e)) {\n return;\n } else if(touchStartFired) {\n touchStartFired = false;\n return;\n }\n \n let {clientX, clientY} = e;\n drawRipple(clientX, clientY);\n window.addEventListener('mouseup', handler, {once: true, passive: true});\n window.addEventListener('contextmenu', handler, {once: true, passive: true});\n }, {passive: true});\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 RLottieWorker from 'worker-loader!./rlottie/rlottie.worker';\nimport animationIntersector from \"../components/animationIntersector\";\nimport { MOUNT_CLASS_TO } from '../config/debug';\nimport EventListenerBase from \"../helpers/eventListenerBase\";\nimport mediaSizes from \"../helpers/mediaSizes\";\nimport { clamp } from '../helpers/number';\nimport { pause } from '../helpers/schedulers';\nimport { isAndroid, isApple, isAppleMobile, isSafari } from \"../helpers/userAgent\";\nimport { logger, LogTypes } from \"./logger\";\nimport apiManager from \"./mtproto/mtprotoworker\";\n\nlet convert = (value: number) => {\n\treturn Math.round(Math.min(Math.max(value, 0), 1) * 255);\n};\n\ntype RLottiePlayerListeners = 'enterFrame' | 'ready' | 'firstFrame' | 'cached';\ntype RLottieOptions = {\n container: HTMLElement, \n autoplay?: boolean, \n animationData: string, \n loop?: boolean, \n width?: number,\n height?: number,\n group?: string,\n noCache?: true,\n needUpscale?: true,\n skipRatio?: number\n};\n\nexport class RLottiePlayer extends EventListenerBase<{\n enterFrame: (frameNo: number) => void,\n ready: () => void,\n firstFrame: () => void,\n cached: () => void\n}> {\n public static reqId = 0;\n\n public reqId = 0;\n public curFrame: number;\n public frameCount: number;\n public fps: number;\n public skipDelta: number;\n\n public worker: QueryableWorker;\n \n public width = 0;\n public height = 0;\n\n public el: HTMLElement;\n public canvas: HTMLCanvasElement;\n public context: CanvasRenderingContext2D;\n\n public paused = true;\n //public paused = false;\n public direction = 1;\n public speed = 1;\n public autoplay = true;\n public _autoplay: boolean; // ! will be used to store original value for settings.stickers.loop\n public loop = true;\n public _loop: boolean; // ! will be used to store original value for settings.stickers.loop\n public group = '';\n\n private frInterval: number;\n private frThen: number;\n private rafId: number;\n\n //private caching = false;\n //private removed = false;\n\n private frames: {[frameNo: string]: Uint8ClampedArray} = {};\n public imageData: ImageData;\n public clamped: Uint8ClampedArray;\n public cachingDelta = 0;\n\n //private playedTimes = 0;\n\n private currentMethod: RLottiePlayer['mainLoopForwards'] | RLottiePlayer['mainLoopBackwards'];\n private frameListener: () => void;\n\n constructor({el, worker, options}: {\n el: HTMLElement,\n worker: QueryableWorker,\n options: RLottieOptions\n }) {\n super(true);\n\n this.reqId = ++RLottiePlayer['reqId'];\n this.el = el;\n this.worker = worker;\n\n for(let i in options) {\n if(this.hasOwnProperty(i)) {\n // @ts-ignore\n this[i] = options[i];\n }\n }\n\n this._loop = this.loop;\n this._autoplay = this.autoplay;\n\n // * Skip ratio (30fps)\n let skipRatio: number;\n if(options.skipRatio !== undefined) skipRatio = options.skipRatio;\n else if((isAndroid || isAppleMobile || (isApple && !isSafari)) && this.width < 100 && this.height < 100) {\n skipRatio = 0.5;\n }\n\n this.skipDelta = skipRatio !== undefined ? 1 / skipRatio | 0 : 1;\n\n //options.needUpscale = true;\n\n // * Pixel ratio\n //const pixelRatio = window.devicePixelRatio;\n const pixelRatio = clamp(window.devicePixelRatio, 1, 2);\n if(pixelRatio > 1) {\n //this.cachingEnabled = true;//this.width < 100 && this.height < 100;\n if(options.needUpscale) {\n this.width = Math.round(this.width * pixelRatio);\n this.height = Math.round(this.height * pixelRatio);\n } else if(pixelRatio > 1) {\n if(this.width > 100 && this.height > 100) {\n if(isApple || !mediaSizes.isMobile) {\n /* this.width = Math.round(this.width * (pixelRatio - 1));\n this.height = Math.round(this.height * (pixelRatio - 1)); */\n this.width = Math.round(this.width * pixelRatio);\n this.height = Math.round(this.height * pixelRatio);\n } else if(pixelRatio > 2.5) {\n this.width = Math.round(this.width * (pixelRatio - 1.5));\n this.height = Math.round(this.height * (pixelRatio - 1.5));\n }\n } else {\n this.width = Math.round(this.width * Math.max(1.5, pixelRatio - 1.5));\n this.height = Math.round(this.height * Math.max(1.5, pixelRatio - 1.5));\n }\n }\n }\n\n //options.noCache = true;\n \n // * Cache frames params\n if(!options.noCache/* && false */) {\n // проверка на размер уже после скейлинга, сделано для попапа и сайдбара, где стикеры 80х80 и 68х68, туда нужно 75%\n if(isApple && this.width > 100 && this.height > 100) {\n this.cachingDelta = 2; //2 // 50%\n } else if(this.width < 100 && this.height < 100) {\n this.cachingDelta = Infinity; // 100%\n } else {\n this.cachingDelta = 4; // 75%\n }\n }\n \n // this.cachingDelta = Infinity;\n // if(isApple) {\n // this.cachingDelta = 0; //2 // 50%\n // }\n\n /* this.width *= 0.8;\n this.height *= 0.8; */\n \n //console.log(\"RLottiePlayer width:\", this.width, this.height, options);\n this.canvas = document.createElement('canvas');\n this.canvas.classList.add('rlottie');\n this.canvas.width = this.width;\n this.canvas.height = this.height;\n this.context = this.canvas.getContext('2d');\n\n this.clamped = new Uint8ClampedArray(this.width * this.height * 4);\n this.imageData = new ImageData(this.width, this.height);\n }\n\n public clearCache() {\n this.frames = {};\n }\n\n public sendQuery(methodName: string, ...args: any[]) {\n //console.trace('RLottie sendQuery:', methodName);\n this.worker.sendQuery(methodName, this.reqId, ...args);\n }\n\n public loadFromData(jsonString: string) {\n this.sendQuery('loadFromData', jsonString, this.width, this.height/* , this.canvas.transferControlToOffscreen() */);\n }\n\n public play() {\n if(!this.paused) return;\n\n //return;\n\n //console.log('RLOTTIE PLAY' + this.reqId);\n\n this.paused = false;\n this.setMainLoop();\n }\n\n public pause(clearPendingRAF = true) {\n if(this.paused) return;\n\n this.paused = true;\n if(clearPendingRAF) {\n clearTimeout(this.rafId);\n }\n //window.cancelAnimationFrame(this.rafId);\n }\n\n public stop(renderFirstFrame = true) {\n this.pause();\n\n this.curFrame = this.direction === 1 ? 0 : this.frameCount;\n if(renderFirstFrame) {\n this.requestFrame(this.curFrame);\n //this.sendQuery('renderFrame', this.curFrame);\n }\n }\n\n public restart() {\n this.stop(false);\n this.play();\n }\n\n public setSpeed(speed: number) {\n this.speed = speed;\n\n if(!this.paused) {\n this.setMainLoop();\n }\n }\n\n public setDirection(direction: number) {\n this.direction = direction;\n \n if(!this.paused) {\n this.setMainLoop();\n }\n }\n\n public remove() {\n //alert('remove');\n lottieLoader.onDestroy(this.reqId);\n this.pause();\n this.sendQuery('destroy');\n //this.removed = true;\n }\n\n public renderFrame2(frame: Uint8ClampedArray, frameNo: number) {\n /* this.setListenerResult('enterFrame', frameNo);\n return; */\n\n try {\n this.imageData.data.set(frame);\n \n //this.context.putImageData(new ImageData(frame, this.width, this.height), 0, 0);\n //let perf = performance.now();\n this.context.putImageData(this.imageData, 0, 0);\n //console.log('renderFrame2 perf:', performance.now() - perf);\n } catch(err) {\n console.error('RLottiePlayer renderFrame error:', err/* , frame */, this.width, this.height);\n this.autoplay = false;\n this.pause();\n return;\n }\n \n //console.log('set result enterFrame', frameNo);\n this.dispatchEvent('enterFrame', frameNo);\n }\n\n public renderFrame(frame: Uint8ClampedArray, frameNo: number) {\n //console.log('renderFrame', frameNo, this);\n if(this.cachingDelta && (frameNo % this.cachingDelta || !frameNo) && !this.frames[frameNo]) {\n this.frames[frameNo] = new Uint8ClampedArray(frame);//frame;\n }\n\n /* if(!this.listenerResults.hasOwnProperty('cached')) {\n this.setListenerResult('enterFrame', frameNo);\n if(frameNo === (this.frameCount - 1)) {\n this.setListenerResult('cached');\n }\n\n return;\n } */\n\n if(this.frInterval) {\n const now = Date.now(), delta = now - this.frThen;\n //console.log(`renderFrame delta${this.reqId}:`, this, delta, this.frInterval);\n\n if(delta < 0) {\n if(this.rafId) clearTimeout(this.rafId);\n return this.rafId = window.setTimeout(() => {\n this.renderFrame2(frame, frameNo);\n }, this.frInterval > -delta ? -delta % this.frInterval : this.frInterval);\n //await new Promise((resolve) => setTimeout(resolve, -delta % this.frInterval));\n }\n }\n\n this.renderFrame2(frame, frameNo);\n }\n\n public requestFrame(frameNo: number) {\n if(this.frames[frameNo]) {\n this.renderFrame(this.frames[frameNo], frameNo);\n } else if(isSafari) {\n this.sendQuery('renderFrame', frameNo);\n } else {\n if(!this.clamped.length) { // fix detached\n this.clamped = new Uint8ClampedArray(this.width * this.height * 4);\n }\n \n this.sendQuery('renderFrame', frameNo, this.clamped);\n }\n }\n\n private mainLoopForwards() {\n const frame = (this.curFrame + this.skipDelta) >= this.frameCount ? this.curFrame = 0 : this.curFrame += this.skipDelta;\n //console.log('mainLoopForwards', this.curFrame, this.skipDelta, frame);\n\n this.requestFrame(frame);\n if((frame + this.skipDelta) >= this.frameCount) {\n //this.playedTimes++;\n\n if(!this.loop) {\n this.pause(false);\n return false;\n }\n }\n\n return true;\n }\n \n private mainLoopBackwards() {\n const frame = (this.curFrame - this.skipDelta) < 0 ? this.curFrame = this.frameCount - 1 : this.curFrame -= this.skipDelta;\n //console.log('mainLoopBackwards', this.curFrame, this.skipDelta, frame);\n\n this.requestFrame(frame);\n if((frame - this.skipDelta) < 0) {\n //this.playedTimes++;\n\n if(!this.loop) {\n this.pause(false);\n return false;\n }\n }\n\n return true;\n }\n\n public setMainLoop() {\n //window.cancelAnimationFrame(this.rafId);\n clearTimeout(this.rafId);\n\n this.frInterval = 1000 / this.fps / this.speed * this.skipDelta;\n this.frThen = Date.now() - this.frInterval;\n\n //console.trace('setMainLoop', this.frInterval, this.direction, this, JSON.stringify(this.listenerResults), this.listenerResults);\n\n const method = (this.direction === 1 ? this.mainLoopForwards : this.mainLoopBackwards).bind(this);\n this.currentMethod = method;\n //this.frameListener && this.removeListener('enterFrame', this.frameListener);\n\n //setTimeout(() => {\n //this.addListener('enterFrame', this.frameListener);\n //}, 0);\n\n if(this.frameListener && this.listenerResults.hasOwnProperty('enterFrame')) {\n this.frameListener();\n }\n \n //this.mainLoop(method);\n //this.r(method);\n //method();\n }\n\n public async onLoad(frameCount: number, fps: number) {\n this.curFrame = this.direction === 1 ? 0 : frameCount - 1;\n this.frameCount = frameCount;\n this.fps = fps;\n\n // * Handle 30fps stickers if 30fps set\n if(this.fps < 60 && this.skipDelta !== 1) {\n const diff = 60 / fps;\n this.skipDelta = this.skipDelta / diff | 0;\n }\n\n this.frInterval = 1000 / this.fps / this.speed * this.skipDelta;\n this.frThen = Date.now() - this.frInterval;\n //this.sendQuery('renderFrame', 0);\n \n // Кешировать сразу не получится, рендер стикера (тайгер) занимает 519мс, \n // если рендерить 75% с получением каждого кадра из воркера, будет 475мс, т.е. при 100% было бы 593мс, потеря на передаче 84мс. \n\n /* console.time('cache' + this.reqId);\n for(let i = 0; i < frameCount; ++i) {\n //if(this.removed) return;\n \n if(i % 4) {\n await new Promise((resolve) => {\n delete this.listenerResults.enterFrame;\n this.addListener('enterFrame', resolve, true);\n this.requestFrame(i);\n }); \n }\n }\n \n console.timeEnd('cache' + this.reqId); */\n //console.log('cached');\n /* this.el.innerHTML = '';\n this.el.append(this.canvas);\n return; */\n\n this.requestFrame(0);\n this.dispatchEvent('ready');\n this.addEventListener('enterFrame', () => {\n this.dispatchEvent('firstFrame');\n\n this.el.appendChild(this.canvas);\n\n //console.log('enterFrame firstFrame');\n \n //let lastTime = this.frThen;\n this.frameListener = () => {\n if(this.paused) {\n return;\n }\n\n const time = Date.now();\n //console.log(`enterFrame handle${this.reqId}`, time, (time - lastTime), this.frInterval);\n /* if(Math.round(time - lastTime + this.frInterval * 0.25) < Math.round(this.frInterval)) {\n return;\n } */\n\n //lastTime = time;\n\n this.frThen = time + this.frInterval;\n const canContinue = this.currentMethod();\n if(!canContinue && !this.loop && this.autoplay) {\n this.autoplay = false;\n }\n };\n\n this.addEventListener('enterFrame', this.frameListener);\n }, true);\n }\n}\n\nclass QueryableWorker extends EventListenerBase<any> {\n constructor(private worker: Worker, private defaultListener: (data: any) => void = () => {}, onError?: (error: any) => void) {\n super();\n\n if(onError) {\n this.worker.onerror = onError;\n }\n\n this.worker.onmessage = (event) => {\n //return;\n //console.log('worker onmessage', event.data);\n if(event.data instanceof Object &&\n event.data.hasOwnProperty('queryMethodListener') &&\n event.data.hasOwnProperty('queryMethodArguments')) {\n /* if(event.data.queryMethodListener === 'frame') {\n return;\n } */\n\n this.dispatchEvent(event.data.queryMethodListener, ...event.data.queryMethodArguments);\n } else {\n this.defaultListener.call(this, event.data);\n }\n };\n }\n\n public postMessage(message: any) {\n this.worker.postMessage(message);\n }\n\n public terminate() {\n this.worker.terminate();\n }\n\n public sendQuery(queryMethod: string, ...args: any[]) {\n if(isSafari) {\n this.worker.postMessage({\n 'queryMethod': queryMethod,\n 'queryMethodArguments': args\n });\n } else {\n //const transfer: (ArrayBuffer | OffscreenCanvas)[] = [];\n const transfer: ArrayBuffer[] = [];\n args.forEach(arg => {\n if(arg instanceof ArrayBuffer) {\n transfer.push(arg);\n }\n \n if(arg.buffer && arg.buffer instanceof ArrayBuffer) {\n transfer.push(arg.buffer);\n }\n });\n \n //console.log('transfer', transfer);\n this.worker.postMessage({\n 'queryMethod': queryMethod,\n 'queryMethodArguments': args\n }, transfer as PostMessageOptions);\n }\n }\n}\n\ntype LottieShape = {\n c: {\n k: number[]\n },\n ty: 'st' | 'fl',\n it?: LottieShape[]\n};\nclass LottieLoader {\n public isWebAssemblySupported = typeof(WebAssembly) !== 'undefined';\n public loadPromise: Promise<void> = !this.isWebAssemblySupported ? Promise.reject() : undefined;\n public loaded = false;\n\n // https://github.com/telegramdesktop/tdesktop/blob/97d8ee75d51874fcb74a9bfadc79f835c82be54a/Telegram/SourceFiles/chat_helpers/stickers_emoji_pack.cpp#L46\n private static COLORREPLACEMENTS = [\n [\n [0xf77e41, 0xcb7b55],\n\t\t\t[0xffb139, 0xf6b689],\n\t\t\t[0xffd140, 0xffcda7],\n\t\t\t[0xffdf79, 0xffdfc5],\n ],\n\n [\n [0xf77e41, 0xa45a38],\n\t\t\t[0xffb139, 0xdf986b],\n\t\t\t[0xffd140, 0xedb183],\n\t\t\t[0xffdf79, 0xf4c3a0],\n ],\n\n [\n [0xf77e41, 0x703a17],\n\t\t\t[0xffb139, 0xab673d],\n\t\t\t[0xffd140, 0xc37f4e],\n\t\t\t[0xffdf79, 0xd89667],\n ],\n\n [\n [0xf77e41, 0x4a2409],\n\t\t\t[0xffb139, 0x7d3e0e],\n\t\t\t[0xffd140, 0x965529],\n\t\t\t[0xffdf79, 0xa96337],\n ],\n\n [\n\t\t\t[0xf77e41, 0x200f0a],\n\t\t\t[0xffb139, 0x412924],\n\t\t\t[0xffd140, 0x593d37],\n\t\t\t[0xffdf79, 0x63453f],\n ]\n ];\n\n private workersLimit = 4;\n private players: {[reqId: number]: RLottiePlayer} = {};\n\n private workers: QueryableWorker[] = [];\n private curWorkerNum = 0;\n\n private log = logger('LOTTIE', LogTypes.Error);\n\n public getAnimation(element: HTMLElement) {\n for(const i in this.players) {\n if(this.players[i].el === element) {\n return this.players[i];\n }\n }\n\n return null;\n }\n\n public setLoop(loop: boolean) {\n for(const i in this.players) {\n const player = this.players[i];\n player.loop = loop;\n player.autoplay = player._autoplay;\n }\n }\n\n public loadLottieWorkers() {\n if(this.loadPromise) {\n return this.loadPromise;\n }\n\n return this.loadPromise = new Promise((resolve, reject) => {\n let remain = this.workersLimit;\n for(let i = 0; i < this.workersLimit; ++i) {\n const worker = this.workers[i] = new QueryableWorker(new RLottieWorker());\n\n worker.addEventListener('ready', () => {\n this.log('worker #' + i + ' ready');\n\n worker.addEventListener('frame', this.onFrame);\n worker.addEventListener('loaded', this.onPlayerLoaded);\n worker.addEventListener('error', this.onPlayerError);\n\n --remain;\n if(!remain) {\n this.log('workers ready');\n resolve();\n this.loaded = true;\n }\n });\n }\n });\n }\n\n private applyReplacements(object: {\n layers: Array<{shapes: LottieShape[]}>\n }, toneIndex: number) {\n const replacements = LottieLoader.COLORREPLACEMENTS[Math.max(toneIndex - 1, 0)];\n\n const applyTo = (smth: LottieShape) => {\n const k = smth.c.k;\n const color = convert(k[2]) | (convert(k[1]) << 8) | (convert(k[0]) << 16);\n\n const foundReplacement = replacements.find(p => p[0] === color);\n if(foundReplacement) {\n k[0] = ((foundReplacement[1] >> 16) & 255) / 255;\n k[1] = ((foundReplacement[1] >> 8) & 255) / 255;\n k[2] = (foundReplacement[1] & 255) / 255;\n }\n\n //console.log('foundReplacement!', foundReplacement, color.toString(16), k);\n };\n\n const checkSmth = (smth: LottieShape) => {\n switch(smth.ty) {\n case 'st':\n case 'fl':\n applyTo(smth);\n break;\n }\n\n if(smth.hasOwnProperty('it')) {\n iterateIt(smth.it);\n }\n };\n\n const iterateIt = (it: LottieShape['it']) => {\n for(const smth of it) {\n checkSmth(smth);\n }\n };\n\n try {\n for(const layer of object.layers) {\n if(!layer.shapes) continue;\n \n for(const shape of layer.shapes) {\n if(!shape.it) {\n checkSmth(shape);\n continue;\n }\n\n iterateIt(shape.it);\n }\n }\n } catch(err) {\n this.log.warn('cant apply replacements', err, object, toneIndex);\n }\n }\n\n public loadAnimationFromURL(params: Omit<RLottieOptions, 'animationData'>, url: string): Promise<RLottiePlayer> {\n if(!this.isWebAssemblySupported) {\n return this.loadPromise as any;\n }\n \n if(!this.loaded) {\n this.loadLottieWorkers();\n }\n \n return fetch(url)\n .then(res => res.arrayBuffer())\n .then(data => apiManager.gzipUncompress<string>(data, true))\n /* .then(str => {\n return new Promise<string>((resolve) => setTimeout(() => resolve(str), 2e3));\n }) */\n .then(str => {\n return this.loadAnimationWorker(Object.assign(params, {animationData: str/* JSON.parse(str) */, needUpscale: true}));\n });\n }\n\n public waitForFirstFrame(player: RLottiePlayer): Promise<void> {\n return Promise.race([\n /* new Promise<void>((resolve) => {\n player.addEventListener('firstFrame', () => {\n setTimeout(() => resolve(), 1500);\n }, true);\n }) */\n new Promise<void>((resolve) => {\n player.addEventListener('firstFrame', resolve, true);\n }),\n pause(2500)\n ]);\n }\n\n public async loadAnimationWorker(params: RLottieOptions, group = '', toneIndex = -1): Promise<RLottiePlayer> {\n if(!this.isWebAssemblySupported) {\n return this.loadPromise as any;\n }\n //params.autoplay = true;\n\n if(toneIndex >= 1 && toneIndex <= 5) {\n /* params.animationData = copy(params.animationData);\n this.applyReplacements(params.animationData, toneIndex); */\n\n const newAnimationData = JSON.parse(params.animationData);\n this.applyReplacements(newAnimationData, toneIndex);\n params.animationData = JSON.stringify(newAnimationData);\n }\n\n if(!this.loaded) {\n await this.loadLottieWorkers();\n }\n\n if(!params.width || !params.height) {\n params.width = parseInt(params.container.style.width);\n params.height = parseInt(params.container.style.height);\n }\n\n if(!params.width || !params.height) {\n throw new Error('No size for sticker!');\n }\n\n params.group = group;\n\n const player = this.initPlayer(params.container, params);\n animationIntersector.addAnimation(player, group);\n\n return player;\n }\n\n private onPlayerLoaded = (reqId: number, frameCount: number, fps: number) => {\n const rlPlayer = this.players[reqId];\n if(!rlPlayer) {\n this.log.warn('onPlayerLoaded on destroyed player:', reqId, frameCount);\n return;\n }\n\n this.log.debug('onPlayerLoaded');\n rlPlayer.onLoad(frameCount, fps);\n //rlPlayer.addListener('firstFrame', () => {\n //animationIntersector.addAnimation(player, group);\n //}, true);\n };\n\n private onFrame = (reqId: number, frameNo: number, frame: Uint8ClampedArray) => {\n const rlPlayer = this.players[reqId];\n if(!rlPlayer) {\n this.log.warn('onFrame on destroyed player:', reqId, frameNo);\n return;\n }\n\n rlPlayer.clamped = frame;\n rlPlayer.renderFrame(frame, frameNo);\n };\n\n private onPlayerError = (reqId: number, error: Error) => {\n const rlPlayer = this.players[reqId];\n if(rlPlayer) {\n // ! will need refactoring later, this is not the best way to remove the animation\n const animations = animationIntersector.getAnimations(rlPlayer.el);\n animations.forEach(animation => {\n animationIntersector.checkAnimation(animation, true, true);\n });\n }\n };\n\n public onDestroy(reqId: number) {\n delete this.players[reqId];\n }\n\n public destroyWorkers() {\n this.workers.forEach((worker, idx) => {\n worker.terminate();\n this.log('worker #' + idx + ' terminated');\n });\n\n this.log('workers destroyed');\n this.workers.length = 0;\n }\n\n private initPlayer(el: HTMLElement, options: RLottieOptions) {\n const rlPlayer = new RLottiePlayer({\n el, \n worker: this.workers[this.curWorkerNum++],\n options\n });\n\n this.players[rlPlayer.reqId] = rlPlayer;\n if(this.curWorkerNum >= this.workers.length) {\n this.curWorkerNum = 0;\n }\n\n rlPlayer.loadFromData(options.animationData);\n\n return rlPlayer;\n }\n}\n\nconst lottieLoader = new LottieLoader();\nMOUNT_CLASS_TO.lottieLoader = lottieLoader;\nexport default lottieLoader;\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 { MOUNT_CLASS_TO } from \"../config/debug\";\nimport I18n from \"../lib/langPack\";\n\nexport const months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];\nexport const days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];\n\nexport const ONE_DAY = 86400;\n\n// https://stackoverflow.com/a/6117889\nexport const getWeekNumber = (date: Date) => {\n const d = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()));\n const dayNum = d.getUTCDay() || 7;\n d.setUTCDate(d.getUTCDate() + 4 - dayNum);\n const yearStart = new Date(Date.UTC(d.getUTCFullYear(), 0, 1));\n return Math.ceil((((d.getTime() - yearStart.getTime()) / ONE_DAY) + 1) / 7);\n};\n\nexport const formatDateAccordingToToday = (time: Date) => {\n const date = new Date();\n const now = date.getTime() / 1000 | 0;\n const timestamp = time.getTime() / 1000 | 0;\n\n let timeStr: string;\n if((now - timestamp) < ONE_DAY && date.getDate() === time.getDate()) { // if the same day\n timeStr = ('0' + time.getHours()).slice(-2) + ':' + ('0' + time.getMinutes()).slice(-2);\n } else if(date.getFullYear() !== time.getFullYear()) { // different year\n timeStr = time.getDate() + '.' + ('0' + (time.getMonth() + 1)).slice(-2) + '.' + ('' + time.getFullYear()).slice(-2);\n } else if((now - timestamp) < (ONE_DAY * 7) && getWeekNumber(date) === getWeekNumber(time)) { // current week\n timeStr = days[time.getDay()].slice(0, 3);\n } else { // same year\n timeStr = months[time.getMonth()].slice(0, 3) + ' ' + ('0' + time.getDate()).slice(-2);\n }\n\n return timeStr;\n};\n\nexport function formatDateAccordingToTodayNew(time: Date) {\n const today = new Date();\n const now = today.getTime() / 1000 | 0;\n const timestamp = time.getTime() / 1000 | 0;\n\n const options: Intl.DateTimeFormatOptions = {};\n if((now - timestamp) < ONE_DAY && today.getDate() === time.getDate()) { // if the same day\n options.hour = options.minute = '2-digit';\n } else if(today.getFullYear() !== time.getFullYear()) { // different year\n options.year = options.day = 'numeric';\n options.month = '2-digit';\n } else if((now - timestamp) < (ONE_DAY * 7) && getWeekNumber(today) === getWeekNumber(time)) { // current week\n options.weekday = 'short';\n } else { // same year\n options.month = 'short';\n options.day = 'numeric';\n }\n\n return new I18n.IntlDateElement({\n date: time,\n options\n }).element;\n}\n\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.formatDateAccordingToTodayNew = formatDateAccordingToTodayNew);\n\nexport const getFullDate = (date: Date, options: Partial<{\n noTime: true, \n noSeconds: true,\n monthAsNumber: true,\n leadingZero: true\n}> = {}) => {\n const joiner = options.monthAsNumber ? '.' : ' ';\n const time = ('0' + date.getHours()).slice(-2) + ':' + ('0' + date.getMinutes()).slice(-2) + (options.noSeconds ? '' : ':' + ('0' + date.getSeconds()).slice(-2));\n\n return (options.leadingZero ? ('0' + date.getDate()).slice(-2) : date.getDate()) + \n joiner + (options.monthAsNumber ? ('0' + (date.getMonth() + 1)).slice(-2) : months[date.getMonth()]) + \n joiner + date.getFullYear() + \n (options.noTime ? '' : ', ' + time);\n};\n\nexport function tsNow(seconds?: true) {\n const t = Date.now();\n return seconds ? Math.floor(t / 1000) : t;\n}\n\n// https://github.com/DrKLO/Telegram/blob/d52b2c921abd3c1e8d6368858313ad0cb0468c07/TMessagesProj/src/main/java/org/telegram/ui/Adapters/FiltersView.java\nconst minYear = 2013;\nconst yearPattern = new RegExp(\"20[0-9]{1,2}\");\nconst monthYearOrDayPattern = new RegExp(\"(\\\\w{3,}) ([0-9]{0,4})\", 'i');\nconst yearOrDayAndMonthPattern = new RegExp(\"([0-9]{0,4}) (\\\\w{2,})\", 'i');\nconst shortDate = new RegExp(\"^([0-9]{1,4})(\\\\.| |/|\\\\-)([0-9]{1,4})$\", 'i');\nconst longDate = new RegExp(\"^([0-9]{1,2})(\\\\.| |/|\\\\-)([0-9]{1,2})(\\\\.| |/|\\\\-)([0-9]{1,4})$\", 'i');\nconst numberOfDaysEachMonth = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\nexport type DateData = {\n title: string,\n minDate: number,\n maxDate: number,\n};\nexport function fillTipDates(query: string, dates: DateData[]) {\n const q = query.trim().toLowerCase();\n\n if(q.length < 3) {\n return;\n }\n\n if(\"today\".indexOf(q) === 0) {\n const date = new Date();\n const year = date.getFullYear();\n const month = date.getMonth();\n const day = date.getDate();\n date.setFullYear(year, month, day);\n date.setHours(0, 0, 0);\n\n const minDate = date.getTime();\n date.setFullYear(year, month, day + 1);\n date.setHours(0, 0, 0);\n\n const maxDate = date.getTime() - 1;\n dates.push({\n title: 'Today',\n minDate,\n maxDate\n });\n return;\n }\n\n if(\"yesterday\".indexOf(q) === 0) {\n const date = new Date();\n const year = date.getFullYear();\n const month = date.getMonth();\n const day = date.getDate();\n date.setFullYear(year, month, day);\n date.setHours(0, 0, 0);\n\n const minDate = date.getTime() - 86400000;\n date.setFullYear(year, month, day + 1);\n date.setHours(0, 0, 0);\n\n const maxDate = date.getTime() - 86400001;\n dates.push({\n title: 'Yesterday',\n minDate,\n maxDate\n });\n return;\n }\n\n const dayOfWeek = getDayOfWeek(q);\n if(dayOfWeek >= 0) {\n const date = new Date();\n const now = date.getTime();\n const currentDay = date.getDay();\n const distance = dayOfWeek - currentDay;\n date.setDate(date.getDate() + distance);\n if(date.getTime() > now) {\n date.setTime(date.getTime() - 604800000);\n }\n const year = date.getFullYear()\n const month = date.getMonth();\n const day = date.getDate();\n date.setFullYear(year, month, day);\n date.setHours(0, 0, 0);\n\n const minDate = date.getTime();\n date.setFullYear(year, month, day + 1);\n date.setHours(0, 0, 0);\n\n const maxDate = date.getTime() - 1;\n dates.push({\n title: formatWeekLong(minDate),\n minDate,\n maxDate\n });\n return;\n }\n\n let matches: any[];\n if((matches = shortDate.exec(q)) !== null) {\n const g1 = matches[1];\n const g2 = matches[3];\n const k = parseInt(g1);\n const k1 = parseInt(g2);\n if(k > 0 && k <= 31) {\n if(k1 >= minYear && k <= 12) {\n const selectedYear = k1;\n const month = k - 1;\n createForMonthYear(dates, month, selectedYear);\n return;\n } else if (k1 <= 12) {\n const day = k - 1;\n const month = k1 - 1;\n createForDayMonth(dates, day, month);\n }\n } else if (k >= minYear && k1 <= 12) {\n const selectedYear = k;\n const month = k1 - 1;\n createForMonthYear(dates, month, selectedYear);\n }\n\n return;\n }\n\n if((matches = longDate.exec(q)) !== null) {\n const g1 = matches[1];\n const g2 = matches[3];\n const g3 = matches[5];\n if(!matches[2] === matches[4]) {\n return;\n }\n\n const day = parseInt(g1);\n const month = parseInt(g2) - 1;\n let year = parseInt(g3);\n if(year >= 10 && year <= 99) {\n year += 2000;\n }\n\n const currentYear = new Date().getFullYear();\n if(validDateForMonth(day - 1, month) && year >= minYear && year <= currentYear) {\n const date = new Date();\n date.setFullYear(year, month, day);\n date.setHours(0, 0, 0);\n \n const minDate = date.getTime();\n date.setFullYear(year, month, day + 1);\n date.setHours(0, 0, 0);\n\n const maxDate = date.getTime() - 1;\n dates.push({\n title: formatterYearMax(minDate),\n minDate,\n maxDate\n });\n return;\n }\n\n return;\n }\n\n if((matches = yearPattern.exec(q)) !== null) {\n let selectedYear = +q;\n const currentYear = new Date().getFullYear();\n if(selectedYear < minYear) {\n selectedYear = minYear;\n for(let i = currentYear; i >= selectedYear; i--) {\n const date = new Date();\n date.setFullYear(i, 0, 1);\n date.setHours(0, 0, 0);\n\n const minDate = date.getTime();\n date.setFullYear(i + 1, 0, 1);\n date.setHours(0, 0, 0);\n\n const maxDate = date.getTime() - 1;\n dates.push({\n title: '' + i,\n minDate,\n maxDate\n });\n }\n } else if(selectedYear <= currentYear) {\n const date = new Date();\n date.setFullYear(selectedYear, 0, 1);\n date.setHours(0, 0, 0);\n\n const minDate = date.getTime();\n date.setFullYear(selectedYear + 1, 0, 1);\n date.setHours(0, 0, 0);\n\n const maxDate = date.getTime() - 1;\n dates.push({\n title: '' + selectedYear,\n minDate,\n maxDate\n });\n }\n\n return;\n }\n\n if((matches = monthYearOrDayPattern.exec(q)) !== null) {\n const g1 = matches[1];\n const g2 = matches[2];\n const month = getMonth(g1);\n if(month >= 0) {\n const k = +g2;\n if(k > 0 && k <= 31) {\n const day = k - 1;\n createForDayMonth(dates, day, month);\n return;\n } else if(k >= minYear) {\n const selectedYear = k;\n createForMonthYear(dates, month, selectedYear);\n return;\n }\n }\n }\n\n if((matches = yearOrDayAndMonthPattern.exec(q)) !== null) {\n const g1 = matches[1];\n const g2 = matches[2];\n const month = getMonth(g2);\n if(month >= 0) {\n const k = +g1;\n if(k > 0 && k <= 31) {\n const day = k - 1;\n createForDayMonth(dates, day, month);\n return;\n } else if (k >= minYear) {\n const selectedYear = k;\n createForMonthYear(dates, month, selectedYear);\n }\n }\n }\n}\n\nfunction createForMonthYear(dates: DateData[], month: number, selectedYear: number) {\n const currentYear = new Date().getFullYear();\n const today = Date.now();\n if(selectedYear >= minYear && selectedYear <= currentYear) {\n const date = new Date();\n date.setFullYear(selectedYear, month, 1);\n date.setHours(0, 0, 0);\n const minDate = date.getTime();\n if(minDate > today) {\n return;\n }\n date.setMonth(date.getMonth() + 1);\n const maxDate = date.getTime() - 1;\n\n dates.push({\n title: formatterMonthYear(minDate),\n minDate,\n maxDate\n });\n }\n}\n\nfunction createForDayMonth(dates: DateData[], day: number, month: number) {\n if(validDateForMonth(day, month)) {\n const currentYear = new Date().getFullYear();\n const today = Date.now();\n \n for(let i = currentYear; i >= minYear; i--) {\n if(month === 1 && day === 28 && !isLeapYear(i)) {\n continue;\n }\n\n const date = new Date();\n date.setFullYear(i, month, day + 1);\n date.setHours(0, 0, 0);\n \n const minDate = date.getTime();\n if(minDate > today) {\n continue;\n }\n\n date.setFullYear(i, month, day + 2);\n date.setHours(0, 0, 0);\n const maxDate = date.getTime() - 1;\n if(i === currentYear) {\n dates.push({\n title: formatterDayMonth(minDate),\n minDate,\n maxDate\n });\n } else {\n dates.push({\n title: formatterYearMax(minDate),\n minDate,\n maxDate\n });\n }\n }\n }\n}\n\nfunction formatterMonthYear(timestamp: number) {\n const date = new Date(timestamp);\n return months[date.getMonth()].slice(0, 3) + ' ' + date.getFullYear();\n}\n\nfunction formatterDayMonth(timestamp: number) {\n const date = new Date(timestamp);\n return months[date.getMonth()].slice(0, 3) + ' ' + date.getDate();\n}\n\nfunction formatterYearMax(timestamp: number) {\n const date = new Date(timestamp);\n return ('0' + date.getDate()).slice(-2) + '.' + ('0' + (date.getMonth() + 1)).slice(-2) + '.' + date.getFullYear();\n}\n\nfunction formatWeekLong(timestamp: number) {\n const date = new Date(timestamp);\n return days[date.getDay()];\n}\n\nfunction validDateForMonth(day: number, month: number) {\n if(month >= 0 && month < 12) {\n if(day >= 0 && day < numberOfDaysEachMonth[month]) {\n return true;\n }\n }\n return false;\n}\n\nfunction isLeapYear(year: number) {\n return ((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0);\n}\n\nfunction getMonth(q: string) {\n /* String[] months = new String[]{\n LocaleController.getString(\"January\", R.string.January).toLowerCase(),\n LocaleController.getString(\"February\", R.string.February).toLowerCase(),\n LocaleController.getString(\"March\", R.string.March).toLowerCase(),\n LocaleController.getString(\"April\", R.string.April).toLowerCase(),\n LocaleController.getString(\"May\", R.string.May).toLowerCase(),\n LocaleController.getString(\"June\", R.string.June).toLowerCase(),\n LocaleController.getString(\"July\", R.string.July).toLowerCase(),\n LocaleController.getString(\"August\", R.string.August).toLowerCase(),\n LocaleController.getString(\"September\", R.string.September).toLowerCase(),\n LocaleController.getString(\"October\", R.string.October).toLowerCase(),\n LocaleController.getString(\"November\", R.string.November).toLowerCase(),\n LocaleController.getString(\"December\", R.string.December).toLowerCase()\n }; */\n\n /* String[] monthsEng = new String[12];\n Calendar c = Calendar.getInstance();\n for (int i = 1; i <= 12; i++) {\n c.set(0, 0, 0, 0, 0, 0);\n c.set(Calendar.MONTH, i);\n monthsEng[i - 1] = c.getDisplayName(Calendar.MONTH, Calendar.LONG, Locale.ENGLISH).toLowerCase();\n } */\n\n q = q.toLowerCase();\n for(let i = 0; i < 12; i++) {\n const month = months[i].toLowerCase();\n if(month.indexOf(q) === 0) {\n return i;\n }\n }\n return -1;\n}\n\nfunction getDayOfWeek(q: string) {\n const c = new Date();\n if(q.length <= 3) {\n return -1;\n }\n \n for(let i = 0; i < 7; i++) {\n c.setDate(c.getDate() + 1);\n \n if(formatWeekLong(c.getTime()).toLowerCase().indexOf(q) === 0) {\n return c.getDay();\n }\n }\n return -1;\n}\n\nMOUNT_CLASS_TO.fillTipDates = fillTipDates;\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 Page from \"./page\";\nimport { whichChild } from \"../helpers/dom\";\nimport lottieLoader from \"../lib/lottieLoader\";\nimport { horizontalMenu } from \"../components/horizontalMenu\";\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\nimport fastSmoothScroll from \"../helpers/fastSmoothScroll\";\n\nclass PagesManager {\n private pageId = -1;\n private page: Page;\n\n private selectTab: ReturnType<typeof horizontalMenu>;\n public pagesDiv: HTMLDivElement;\n public scrollableDiv: HTMLElement;\n\n constructor() {\n this.pagesDiv = document.getElementById('auth-pages') as HTMLDivElement;\n this.scrollableDiv = this.pagesDiv.querySelector('.scrollable') as HTMLElement;\n this.selectTab = horizontalMenu(null, this.scrollableDiv.querySelector('.tabs-container') as HTMLDivElement, null, () => {\n if(this.page?.onShown) {\n this.page.onShown();\n }\n });\n }\n\n public setPage(page: Page) {\n if(page.isAuthPage) {\n this.pagesDiv.style.display = '';\n\n let id = whichChild(page.pageEl);\n if(this.pageId === id) return;\n\n this.selectTab(id);\n\n if(this.pageId !== -1 && id > 1) {\n lottieLoader.loadLottieWorkers();\n }\n\n\n\n this.pageId = id;\n\n if(this.scrollableDiv) {\n fastSmoothScroll(this.scrollableDiv, this.scrollableDiv.firstElementChild as HTMLElement, 'start');\n }\n } else {\n this.pagesDiv.style.display = 'none';\n page.pageEl.style.display = '';\n\n this.pageId = -1;\n }\n\n this.page = page;\n }\n}\n\nconst pagesManager = new PagesManager();\nMOUNT_CLASS_TO.pagesManager = pagesManager;\nexport default pagesManager;\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 pagesManager from \"./pagesManager\";\n\nexport default class Page {\n public pageEl: HTMLDivElement;\n private installed = false;\n\n constructor(className: string, public isAuthPage: boolean, private onFirstMount?: (...args: any[]) => Promise<any> | void, private onMount?: (...args: any[]) => void, public onShown?: () => void) {\n this.pageEl = document.body.querySelector('.' + className) as HTMLDivElement;\n }\n\n public async mount(...args: any[]) {\n //this.pageEl.style.display = '';\n\n if(this.onMount) {\n this.onMount(...args);\n }\n\n if(!this.installed) {\n if(this.onFirstMount) {\n try {\n const res = this.onFirstMount(...args);\n if(res instanceof Promise) {\n await res;\n }\n } catch(err) {\n console.error('PAGE MOUNT ERROR:', err);\n }\n }\n \n this.installed = true;\n }\n\n pagesManager.setPage(this);\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 { MOUNT_CLASS_TO } from \"../config/debug\";\nimport { isMobileSafari } from \"../helpers/userAgent\";\nimport { blurActiveElement, cancelEvent } from \"../helpers/dom\";\nimport { logger } from \"../lib/logger\";\nimport { doubleRaf } from \"../helpers/schedulers\";\n\nexport type NavigationItem = {\n type: 'left' | 'right' | 'im' | 'chat' | 'popup' | 'media' | 'menu' | 'esg' | 'multiselect' | 'input-helper' | 'markup' | 'global-search',\n onPop: (canAnimate: boolean) => boolean | void,\n onEscape?: () => boolean,\n noHistory?: boolean,\n};\n\nexport class AppNavigationController {\n private navigations: Array<NavigationItem> = [];\n private id = Date.now();\n private manual = false;\n private log = logger('NC');\n private debug = true;\n private currentHash = window.location.hash;\n public onHashChange: () => void;\n\n constructor() {\n let isPossibleSwipe = false;\n window.addEventListener('popstate', (e) => {\n this.debug && this.log('popstate', e, isPossibleSwipe);\n\n if(window.location.hash !== this.currentHash) {\n this.onHashChange && this.onHashChange();\n this.replaceState();\n return;\n }\n this.currentHash = window.location.hash;\n\n const id: number = e.state;\n if(id !== this.id/* && !this.navigations.length */) {\n this.pushState();\n return;\n }\n\n const item = this.navigations.pop();\n if(!item) {\n this.pushState();\n return;\n }\n\n this.manual = !isPossibleSwipe;\n this.handleItem(item);\n //this.pushState(); // * prevent adding forward arrow\n });\n\n window.addEventListener('keydown', (e) => {\n const item = this.navigations[this.navigations.length - 1];\n if(!item) return;\n if(e.key === 'Escape' && (item.onEscape ? item.onEscape() : true)) {\n cancelEvent(e);\n this.back();\n }\n }, {capture: true});\n\n if(isMobileSafari) {\n const options = {passive: true};\n window.addEventListener('touchstart', (e) => {\n if(e.touches.length > 1) return;\n this.debug && this.log('touchstart');\n\n const detach = () => {\n window.removeEventListener('touchend', onTouchEnd);\n window.removeEventListener('touchmove', onTouchMove);\n };\n\n let moved = false;\n const onTouchMove = (e: TouchEvent) => {\n this.debug && this.log('touchmove');\n if(e.touches.length > 1) {\n detach();\n return;\n }\n\n moved = true;\n };\n\n const onTouchEnd = (e: TouchEvent) => {\n this.debug && this.log('touchend');\n if(e.touches.length > 1 || !moved) {\n detach();\n return;\n }\n\n isPossibleSwipe = true;\n doubleRaf().then(() => {\n isPossibleSwipe = false;\n });\n\n detach();\n };\n\n window.addEventListener('touchend', onTouchEnd, options);\n window.addEventListener('touchmove', onTouchMove, options);\n }, options);\n }\n\n history.scrollRestoration = 'manual';\n\n this.pushState(); // * push init state\n }\n\n private handleItem(item: NavigationItem) {\n const good = item.onPop(!this.manual ? false : undefined);\n this.debug && this.log('popstate, navigation:', item, this.navigations);\n if(good === false) {\n this.pushItem(item);\n } else {\n blurActiveElement(); // no better place for it\n }\n\n this.manual = false;\n }\n\n public findItemByType(type: NavigationItem['type']) {\n for(let i = this.navigations.length - 1; i >= 0; --i) {\n const item = this.navigations[i];\n if(item.type === type) {\n return {item, index: i};\n }\n }\n }\n\n public back(type?: NavigationItem['type']) {\n if(type) {\n const ret = this.findItemByType(type);\n if(ret) {\n this.manual = true;\n // ! commented because 'popstate' event will be fired with delay\n //if(ret.index !== (this.navigations.length - 1)) {\n this.navigations.splice(ret.index, 1);\n this.handleItem(ret.item);\n return;\n //}\n }\n }\n\n history.back();\n }\n\n public pushItem(item: NavigationItem) {\n this.navigations.push(item);\n this.debug && this.log('pushstate', item, this.navigations);\n\n if(!item.noHistory) {\n this.pushState();\n }\n }\n\n private pushState() {\n this.manual = false;\n history.pushState(this.id, '');\n }\n\n public replaceState() {\n history.replaceState(this.id, '', location.origin + location.pathname);\n }\n\n public removeItem(item: NavigationItem) {\n this.navigations.findAndSplice(i => i === item);\n }\n\n public removeByType(type: NavigationItem['type'], single = false) {\n for(let i = this.navigations.length - 1; i >= 0; --i) {\n const item = this.navigations[i];\n if(item.type === type) {\n this.navigations.splice(i, 1);\n\n if(single) {\n break;\n }\n }\n }\n }\n}\n\nconst appNavigationController = new AppNavigationController();\nMOUNT_CLASS_TO.appNavigationController = appNavigationController;\nexport default appNavigationController;\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// * Jolly Cobra's useHeavyAnimationCheck.ts, patched\n\n//import { useEffect } from '../lib/teact/teact';\nimport { AnyToVoidFunction } from '../types';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport { CancellablePromise, deferredPromise } from '../helpers/cancellablePromise';\nimport { pause } from '../helpers/schedulers';\nimport rootScope from '../lib/rootScope';\nimport DEBUG from '../config/debug';\n\nconst ANIMATION_START_EVENT = 'event-heavy-animation-start';\nconst ANIMATION_END_EVENT = 'event-heavy-animation-end';\n\nlet isAnimating = false;\nlet heavyAnimationPromise: CancellablePromise<void> = Promise.resolve();\nlet promisesInQueue = 0;\n\nconst log = console.log.bind(console.log, '[HEAVY-ANIMATION]:');\n\nexport const dispatchHeavyAnimationEvent = (promise: Promise<any>, timeout?: number) => {\n if(!isAnimating) {\n heavyAnimationPromise = deferredPromise<void>();\n rootScope.broadcast(ANIMATION_START_EVENT);\n isAnimating = true;\n DEBUG && log('start');\n }\n \n ++promisesInQueue;\n DEBUG && log('attach promise, length:', promisesInQueue, timeout);\n\n const promises = [\n timeout !== undefined ? pause(timeout) : undefined,\n promise.finally(() => {})\n ].filter(Boolean);\n\n const perf = performance.now();\n Promise.race(promises).then(() => {\n --promisesInQueue;\n DEBUG && log('promise end, length:', promisesInQueue, performance.now() - perf);\n if(!promisesInQueue) {\n isAnimating = false;\n promisesInQueue = 0;\n rootScope.broadcast(ANIMATION_END_EVENT);\n heavyAnimationPromise.resolve();\n\n DEBUG && log('end');\n }\n });\n\n return heavyAnimationPromise;\n};\n\nexport const getHeavyAnimationPromise = () => heavyAnimationPromise;\n\nexport default (\n handleAnimationStart: AnyToVoidFunction,\n handleAnimationEnd: AnyToVoidFunction,\n listenerSetter?: ListenerSetter\n) => {\n //useEffect(() => {\n if(isAnimating) {\n handleAnimationStart();\n }\n\n const add = listenerSetter ? listenerSetter.add.bind(listenerSetter, rootScope) : rootScope.addEventListener.bind(rootScope);\n const remove = listenerSetter ? listenerSetter.removeManual.bind(listenerSetter, rootScope) : rootScope.removeEventListener.bind(rootScope);\n add(ANIMATION_START_EVENT, handleAnimationStart);\n add(ANIMATION_END_EVENT, handleAnimationEnd);\n\n return () => {\n remove(ANIMATION_END_EVENT, handleAnimationEnd);\n remove(ANIMATION_START_EVENT, handleAnimationStart);\n };\n //}, [handleAnimationEnd, handleAnimationStart]);\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 { isInDOM } from \"../helpers/dom\";\nimport { RLottiePlayer } from \"../lib/lottieLoader\";\nimport rootScope from \"../lib/rootScope\";\nimport { isSafari } from \"../helpers/userAgent\";\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\n\nexport interface AnimationItem {\n el: HTMLElement,\n group: string,\n animation: RLottiePlayer | HTMLVideoElement\n};\n\nexport class AnimationIntersector {\n public observer: IntersectionObserver;\n private visible: Set<AnimationItem> = new Set();\n\n private byGroups: {[group: string]: AnimationItem[]} = {};\n private lockedGroups: {[group: string]: true} = {};\n private onlyOnePlayableGroup: string = '';\n \n private intersectionLockedGroups: {[group: string]: true} = {};\n private videosLocked = false;\n\n constructor() {\n this.observer = new IntersectionObserver((entries) => {\n if(rootScope.idle.isIDLE) return;\n\n for(const entry of entries) {\n const target = entry.target;\n\n for(const group in this.byGroups) {\n if(this.intersectionLockedGroups[group]) {\n continue;\n }\n\n const player = this.byGroups[group].find(p => p.el === target);\n if(player) {\n if(entry.isIntersecting) {\n this.visible.add(player);\n this.checkAnimation(player, false);\n } else {\n this.visible.delete(player);\n this.checkAnimation(player, true);\n\n if(player.animation instanceof RLottiePlayer/* && player.animation.cachingDelta === 2 */) {\n //console.warn('will clear cache', player);\n player.animation.clearCache();\n }\n }\n\n break;\n }\n }\n }\n });\n\n rootScope.on('audio_play', ({doc}) => {\n if(doc.type === 'round') {\n this.videosLocked = true;\n this.checkAnimations();\n }\n });\n\n rootScope.on('audio_pause', () => {\n if(this.videosLocked) {\n this.videosLocked = false;\n this.checkAnimations();\n }\n });\n }\n\n public getAnimations(element: HTMLElement) {\n const found: AnimationItem[] = [];\n for(const group in this.byGroups) {\n for(const player of this.byGroups[group]) {\n if(player.el === element) {\n found.push(player);\n }\n }\n }\n\n return found;\n }\n\n public removeAnimation(player: AnimationItem) {\n //console.log('destroy animation');\n const {el, animation} = player;\n animation.remove();\n\n if(animation instanceof HTMLVideoElement && isSafari) {\n setTimeout(() => { // TODO: очистка по очереди, а не все вместе с этим таймаутом\n animation.src = '';\n animation.load();\n }, 1e3);\n }\n\n for(const group in this.byGroups) {\n this.byGroups[group].findAndSplice(p => p === player);\n }\n \n this.observer.unobserve(el);\n this.visible.delete(player);\n }\n\n public addAnimation(animation: RLottiePlayer | HTMLVideoElement, group = '') {\n const player = {\n el: animation instanceof RLottiePlayer ? animation.el : animation, \n animation: animation, \n group\n };\n\n if(animation instanceof RLottiePlayer) {\n if(!rootScope.settings.stickers.loop && animation.loop) {\n animation.loop = rootScope.settings.stickers.loop;\n }\n }\n\n (this.byGroups[group] ?? (this.byGroups[group] = [])).push(player);\n this.observer.observe(player.el);\n }\n\n public checkAnimations(blurred?: boolean, group?: string, destroy = false) {\n if(rootScope.idle.isIDLE) return;\n \n const groups = group /* && false */ ? [group] : Object.keys(this.byGroups);\n\n if(group && !this.byGroups[group]) {\n //console.warn('no animation group:', group);\n this.byGroups[group] = [];\n return;\n }\n\n for(const group of groups) {\n const animations = this.byGroups[group];\n\n animations.forEach(player => {\n this.checkAnimation(player, blurred, destroy);\n });\n }\n }\n\n public checkAnimation(player: AnimationItem, blurred = false, destroy = false) {\n const {el, animation, group} = player;\n //return;\n if((destroy || (!isInDOM(el) && !this.lockedGroups[group]))/* && false */) {\n this.removeAnimation(player);\n return;\n }\n\n if(blurred || (this.onlyOnePlayableGroup && this.onlyOnePlayableGroup !== group) || (animation instanceof HTMLVideoElement && this.videosLocked)) {\n if(!animation.paused) {\n //console.warn('pause animation:', animation);\n animation.pause();\n }\n } else if(animation.paused && \n this.visible.has(player) && \n animation.autoplay && \n (!this.onlyOnePlayableGroup || this.onlyOnePlayableGroup === group)\n ) {\n //console.warn('play animation:', animation);\n animation.play();\n }\n }\n\n public setOnlyOnePlayableGroup(group: string) {\n this.onlyOnePlayableGroup = group;\n }\n\n public lockGroup(group: string) {\n this.lockedGroups[group] = true;\n }\n\n public unlockGroup(group: string) {\n delete this.lockedGroups[group];\n this.checkAnimations(undefined, group);\n }\n\n public refreshGroup(group: string) {\n const animations = this.byGroups[group];\n if(animations && animations.length) {\n animations.forEach(animation => {\n this.observer.unobserve(animation.el);\n });\n\n window.requestAnimationFrame(() => {\n animations.forEach(animation => {\n this.observer.observe(animation.el);\n });\n });\n }\n }\n\n public lockIntersectionGroup(group: string) {\n this.intersectionLockedGroups[group] = true;\n }\n\n public unlockIntersectionGroup(group: string) {\n delete this.intersectionLockedGroups[group];\n this.refreshGroup(group);\n }\n}\n\nconst animationIntersector = new AnimationIntersector();\nif(MOUNT_CLASS_TO) {\n MOUNT_CLASS_TO.animationIntersector = animationIntersector;\n}\nexport default animationIntersector;","/*\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// * Jolly Cobra's fastSmoothScroll slightly patched\n\nimport { dispatchHeavyAnimationEvent } from '../hooks/useHeavyAnimationCheck';\nimport { fastRaf } from './schedulers';\nimport { animateSingle, cancelAnimationByKey } from './animation';\nimport rootScope from '../lib/rootScope';\nimport { isInDOM } from './dom';\n\nconst MAX_DISTANCE = 1500;\nconst MIN_JS_DURATION = 250;\nconst MAX_JS_DURATION = 600;\n\nexport enum FocusDirection {\n Up,\n Down,\n Static,\n};\n\nexport default function fastSmoothScroll(\n container: HTMLElement,\n element: HTMLElement,\n position: ScrollLogicalPosition,\n margin = 0,\n maxDistance = MAX_DISTANCE,\n forceDirection?: FocusDirection,\n forceDuration?: number,\n axis: 'x' | 'y' = 'y'\n) {\n //return;\n\n if(!rootScope.settings.animationsEnabled) {\n forceDirection = FocusDirection.Static;\n }\n\n if(forceDirection === FocusDirection.Static) {\n forceDuration = 0;\n return scrollWithJs(container, element, position, margin, forceDuration, axis);\n /* return Promise.resolve();\n\n element.scrollIntoView({ block: position });\n\n cancelAnimationByKey(container);\n return Promise.resolve(); */\n }\n\n if(axis === 'y' && element !== container && isInDOM(element) && container.getBoundingClientRect) {\n const elementRect = element.getBoundingClientRect();\n const containerRect = container.getBoundingClientRect();\n \n const offsetTop = elementRect.top - containerRect.top;\n if(forceDirection === undefined) {\n if(offsetTop < -maxDistance) {\n container.scrollTop += (offsetTop + maxDistance);\n } else if(offsetTop > maxDistance) {\n container.scrollTop += (offsetTop - maxDistance);\n }\n } else if(forceDirection === FocusDirection.Up) { // * not tested yet\n container.scrollTop = offsetTop + container.scrollTop + maxDistance;\n } else if(forceDirection === FocusDirection.Down) { // * not tested yet\n container.scrollTop = Math.max(0, offsetTop + container.scrollTop - maxDistance);\n }\n /* const { offsetTop } = element;\n\n if(forceDirection === undefined) {\n const offset = offsetTop - container.scrollTop;\n\n if(offset < -maxDistance) {\n container.scrollTop += (offset + maxDistance);\n } else if(offset > maxDistance) {\n container.scrollTop += (offset - maxDistance);\n }\n } else if(forceDirection === FocusDirection.Up) {\n container.scrollTop = offsetTop + maxDistance;\n } else if(forceDirection === FocusDirection.Down) {\n container.scrollTop = Math.max(0, offsetTop - maxDistance);\n } */\n }\n\n const promise = new Promise((resolve) => {\n fastRaf(() => {\n scrollWithJs(container, element, position, margin, forceDuration, axis)\n .then(resolve);\n });\n });\n\n return axis === 'y' ? dispatchHeavyAnimationEvent(promise) : promise;\n}\n\nfunction scrollWithJs(\n container: HTMLElement, element: HTMLElement, position: ScrollLogicalPosition, margin = 0, forceDuration?: number, axis: 'x' | 'y' = 'y'\n) {\n if(!isInDOM(element)) {\n cancelAnimationByKey(container);\n return Promise.resolve();\n }\n \n const rectStartKey = axis === 'y' ? 'top' : 'left';\n const rectEndKey = axis === 'y' ? 'bottom' : 'right';\n const sizeKey = axis === 'y' ? 'height' : 'width';\n const scrollSizeKey = axis === 'y' ? 'scrollHeight' : 'scrollWidth';\n const scrollPositionKey = axis === 'y' ? 'scrollTop' : 'scrollLeft';\n\n //const { offsetTop: elementTop, offsetHeight: elementHeight } = element;\n const elementRect = element.getBoundingClientRect();\n const containerRect = container.getBoundingClientRect ? container.getBoundingClientRect() : document.body.getBoundingClientRect();\n\n //const transformable = container.firstElementChild as HTMLElement;\n\n const elementPosition = elementRect[rectStartKey] - containerRect[rectStartKey];\n const elementSize = element[scrollSizeKey]; // margin is exclusive in DOMRect\n\n const containerSize = containerRect[sizeKey];\n\n const scrollPosition = container[scrollPositionKey];\n const scrollSize = container[scrollSizeKey];\n /* const elementPosition = element.offsetTop;\n const elementSize = element.offsetHeight;\n\n const scrollPosition = container[scrollPositionKey];\n const scrollSize = container[scrollSizeKey];\n const containerSize = container.offsetHeight; */\n\n let path!: number;\n\n switch(position) {\n case 'start':\n path = elementPosition - margin;\n break;\n case 'end':\n path = elementRect[rectEndKey] + (elementSize - elementRect[sizeKey]) - containerRect[rectEndKey];\n break;\n // 'nearest' is not supported yet\n case 'nearest':\n case 'center':\n path = elementSize < containerSize\n ? (elementPosition + elementSize / 2) - (containerSize / 2)\n : elementPosition - margin;\n break;\n }\n /* switch (position) {\n case 'start':\n path = (elementPosition - margin) - scrollPosition;\n break;\n case 'end':\n path = (elementPosition + elementSize + margin) - (scrollPosition + containerSize);\n break;\n // 'nearest' is not supported yet\n case 'nearest':\n case 'center':\n path = elementSize < containerSize\n ? (elementPosition + elementSize / 2) - (scrollPosition + containerSize / 2)\n : (elementPosition - margin) - scrollPosition;\n break;\n } */\n\n // console.log('scrollWithJs: will scroll path:', path, element);\n\n /* let existsTransform = 0;\n const currentTransform = transformable.style.transform;\n if(currentTransform) {\n existsTransform = parseInt(currentTransform.match(/\\((.+?), (.+?), .+\\)/)[2]);\n //path += existsTransform;\n } */\n\n if(path < 0) {\n const remainingPath = -scrollPosition;\n path = Math.max(path, remainingPath);\n } else if(path > 0) {\n const remainingPath = scrollSize - (scrollPosition + containerSize);\n path = Math.min(path, remainingPath);\n }\n\n const target = container[scrollPositionKey] + path;\n const duration = forceDuration ?? (\n MIN_JS_DURATION + (Math.abs(path) / MAX_DISTANCE) * (MAX_JS_DURATION - MIN_JS_DURATION)\n );\n const startAt = Date.now();\n\n /* transformable.classList.add('no-transition');\n\n const tickTransform = () => {\n const t = duration ? Math.min((Date.now() - startAt) / duration, 1) : 1;\n const currentPath = path * transition(t);\n\n transformable.style.transform = `translate3d(0, ${-currentPath}px, 0)`;\n container.dataset.translate = '' + -currentPath;\n\n const willContinue = t < 1;\n if(!willContinue) {\n fastRaf(() => {\n delete container.dataset.transform;\n container.dataset.transform = '';\n transformable.style.transform = '';\n void transformable.offsetLeft; // reflow\n transformable.classList.remove('no-transition');\n void transformable.offsetLeft; // reflow\n container[scrollPositionKey] = Math.round(target);\n });\n }\n\n return willContinue;\n };\n \n return animateSingle(tickTransform, container); */\n\n /* return new Promise((resolve) => {\n fastRaf(() => {\n transformable.style.transform = '';\n transformable.style.transition = '';\n\n setTimeout(resolve, duration);\n });\n });\n\n const transformableHeight = transformable.scrollHeight;\n //transformable.style.minHeight = `${transformableHeight}px`;\n */\n\n const tick = () => {\n const t = duration ? Math.min((Date.now() - startAt) / duration, 1) : 1;\n\n const currentPath = path * (1 - transition(t));\n container[scrollPositionKey] = Math.round(target - currentPath);\n \n return t < 1;\n };\n\n if(!duration || !path) {\n cancelAnimationByKey(container);\n tick();\n return Promise.resolve();\n }\n\n /* return new Promise((resolve) => {\n setTimeout(resolve, duration);\n }).then(() => {\n transformable.classList.add('no-transition');\n void transformable.offsetLeft; // reflow\n transformable.style.transform = '';\n transformable.style.transition = '';\n void transformable.offsetLeft; // reflow\n transformable.classList.remove('no-transition');\n void transformable.offsetLeft; // reflow\n fastRaf(() => {\n \n container[scrollPositionKey] = Math.round(target);\n //transformable.style.minHeight = ``;\n });\n \n }); */\n\n return animateSingle(tick, container);\n}\n\nfunction transition(t: number) {\n return 1 - ((1 - t) ** 3.5);\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 function nextRandomInt(maxValue: number) {\n return Math.floor(Math.random() * maxValue);\n}\n\nexport function randomLong() {\n return '' + nextRandomInt(0xFFFFFFFF) + nextRandomInt(0xFFFFFF);\n //return '' + parseInt(nextRandomInt(0xFFFFFFFF).toString(16) + nextRandomInt(0xFFFFFFFF).toString(16), 16);\n}\n","//import {stackBlurImage} from '../lib/StackBlur';\n//import appStateManager from \"../lib/appManagers/appStateManager\";\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 { blurActiveElement } from \"../helpers/dom\";\nimport appStateManager from \"../lib/appManagers/appStateManager\";\nimport I18n from \"../lib/langPack\";\nimport Page from \"./page\";\n\nlet onFirstMount = () => {\n //return;\n appStateManager.pushToState('authState', {_: 'authStateSignedIn'});\n // ! TOO SLOW\n /* appStateManager.saveState(); */\n\n import('../lib/rootScope').then(m => {\n m.default.broadcast('im_mount');\n });\n\n if(!I18n.requestedServerLanguage) {\n I18n.getCacheLangPack().then(langPack => {\n if(langPack.local) {\n I18n.getLangPack(langPack.lang_code);\n }\n });\n }\n\n blurActiveElement();\n return new Promise<void>((resolve) => {\n window.requestAnimationFrame(() => {\n const promise = import('../lib/appManagers/appDialogsManager');\n promise.finally(async() => {\n //alert('pageIm!');\n resolve();\n \n //AudioContext && global.navigator && global.navigator.mediaDevices && global.navigator.mediaDevices.getUserMedia && global.WebAssembly;\n \n /* // @ts-ignore\n var AudioContext = globalThis.AudioContext || globalThis.webkitAudioContext;\n alert('AudioContext:' + typeof(AudioContext));\n // @ts-ignore\n alert('global.navigator:' + typeof(navigator));\n alert('navigator.mediaDevices:' + typeof(navigator.mediaDevices));\n alert('navigator.mediaDevices.getUserMedia:' + typeof(navigator.mediaDevices?.getUserMedia));\n alert('global.WebAssembly:' + typeof(WebAssembly)); */\n \n //(Array.from(document.getElementsByClassName('rp')) as HTMLElement[]).forEach(el => ripple(el));\n });\n });\n });\n\n //let promise = /* Promise.resolve() */.then(() => {//import('../lib/services').then(services => {\n /* fetch('assets/img/camomile.jpg')\n .then(res => res.blob())\n .then(blob => {\n let img = new Image();\n let url = URL.createObjectURL(blob);\n img.src = url;\n img.onload = () => {\n let id = 'chat-background-canvas';\n var canvas = document.getElementById(id) as HTMLCanvasElement;\n //URL.revokeObjectURL(url);\n \n let elements = ['.chat-container'].map(selector => {\n return document.querySelector(selector) as HTMLDivElement;\n });\n \n stackBlurImage(img, id, 15, 0);\n \n canvas.toBlob(blob => {\n //let dataUrl = canvas.toDataURL('image/jpeg', 1);\n let dataUrl = URL.createObjectURL(blob);\n \n elements.forEach(el => {\n el.style.backgroundImage = 'url(' + dataUrl + ')';\n });\n }, 'image/jpeg', 1);\n };\n }); */\n //});\n};\n\nconst page = new Page('page-chats', false, onFirstMount);\nexport default page;\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 function numberThousandSplitter(x: number, joiner = ' ') {\n const parts = x.toString().split(\".\");\n parts[0] = parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, joiner);\n return parts.join(\".\");\n}\n\nexport function formatBytes(bytes: number, decimals = 2) {\n if(bytes === 0) return '0 Bytes';\n\n const k = 1024;\n const dm = decimals < 0 ? 0 : decimals;\n const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];\n\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n\n return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i];\n}\n\nexport function formatNumber(bytes: number, decimals = 2) {\n if(bytes === 0) return '0';\n\n const k = 1000;\n const dm = decimals < 0 ? 0 : decimals;\n const sizes = ['', 'K', 'M', 'B', 'T'];\n\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n\n return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + sizes[i];\n}\n\nexport function clamp(v: number, min: number, max: number): number {\n return v < min ? min : ((v > max) ? max : v);\n}\n\n","import { fastRaf } from \"./schedulers\";\nimport { CancellablePromise, deferredPromise } from \"./cancellablePromise\";\nimport { isInDOM } from \"./dom\";\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\n\nclass SequentialDom {\n private promises: Partial<{\n read: CancellablePromise<void>,\n write: CancellablePromise<void>\n }> = {};\n private raf = fastRaf.bind(null);\n private scheduled = false;\n\n private do(kind: keyof SequentialDom['promises'], callback?: VoidFunction) {\n let promise = this.promises[kind];\n if(!promise) {\n this.scheduleFlush();\n promise = this.promises[kind] = deferredPromise<void>();\n }\n\n if(callback !== undefined) {\n promise.then(() => callback());\n }\n \n return promise;\n }\n\n public measure(callback?: VoidFunction) {\n return this.do('read', callback);\n }\n\n public mutate(callback?: VoidFunction) {\n return this.do('write', callback);\n }\n\n /**\n * Will fire instantly if element is not connected\n * @param element \n * @param callback \n */\n public mutateElement(element: HTMLElement, callback?: VoidFunction) {\n const promise = isInDOM(element) ? this.mutate() : Promise.resolve();\n\n if(callback !== undefined) {\n promise.then(() => callback());\n }\n\n return promise;\n }\n\n private scheduleFlush() {\n if(!this.scheduled) {\n this.scheduled = true;\n\n this.raf(() => {\n this.promises.read && this.promises.read.resolve();\n this.promises.write && this.promises.write.resolve();\n\n this.scheduled = false;\n this.promises = {};\n });\n }\n }\n}\n\nconst sequentialDom = new SequentialDom();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.sequentialDom = sequentialDom);\nexport default sequentialDom;\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 { MOUNT_CLASS_TO } from \"./config/debug\";\n\nexport type Country = {\n phoneCode: string,\n code: string,\n name: string,\n pattern: string,\n emoji: string\n};\n\nconst Countries: Country[] = [{\"phoneCode\":\"7 840\",\"code\":\"AB\",\"name\":\"Abkhazia\",\"pattern\":\"\",\"emoji\":\"\"},{\"phoneCode\":\"93\",\"code\":\"AF\",\"name\":\"Afghanistan\",\"pattern\":\"93 XXX XXX XXX\",\"emoji\":\"🇦🇫\"},{\"phoneCode\":\"358 18\",\"code\":\"AX\",\"name\":\"Aland Islands\",\"pattern\":\"\",\"emoji\":\"🇦🇽\"},{\"phoneCode\":\"355\",\"code\":\"AL\",\"name\":\"Albania\",\"pattern\":\"355 XX XXX XXXX\",\"emoji\":\"🇦🇱\"},{\"phoneCode\":\"213\",\"code\":\"DZ\",\"name\":\"Algeria\",\"pattern\":\"213 XXX XX XX XX\",\"emoji\":\"🇩🇿\"},{\"phoneCode\":\"1 684\",\"code\":\"AS\",\"name\":\"American Samoa\",\"pattern\":\"1684 XXX XXXX\",\"emoji\":\"🇦🇸\"},{\"phoneCode\":\"376\",\"code\":\"AD\",\"name\":\"Andorra\",\"pattern\":\"376 XX XX XX\",\"emoji\":\"🇦🇩\"},{\"phoneCode\":\"244\",\"code\":\"AO\",\"name\":\"Angola\",\"pattern\":\"244 XXX XXX XXX\",\"emoji\":\"🇦🇴\"},{\"phoneCode\":\"1 264\",\"code\":\"AI\",\"name\":\"Anguilla\",\"pattern\":\"1264 XXX XXXX\",\"emoji\":\"🇦🇮\"},{\"phoneCode\":\"1 268\",\"code\":\"AG\",\"name\":\"Antigua & Barbuda\",\"pattern\":\"1268 XXX XXXX\",\"emoji\":\"🇦🇬\"},{\"phoneCode\":\"54\",\"code\":\"AR\",\"name\":\"Argentina\",\"pattern\":\"\",\"emoji\":\"🇦🇷\"},{\"phoneCode\":\"374\",\"code\":\"AM\",\"name\":\"Armenia\",\"pattern\":\"374 XX XXX XXX\",\"emoji\":\"🇦🇲\"},{\"phoneCode\":\"297\",\"code\":\"AW\",\"name\":\"Aruba\",\"pattern\":\"297 XXX XXXX\",\"emoji\":\"🇦🇼\"},{\"phoneCode\":\"247\",\"code\":\"SH\",\"name\":\"Ascension\",\"pattern\":\"290 XX XXX\",\"emoji\":\"🇸🇭\"},{\"phoneCode\":\"61\",\"code\":\"AU\",\"name\":\"Australia\",\"pattern\":\"61 XXX XXX XXX\",\"emoji\":\"🇦🇺\"},{\"phoneCode\":\"672\",\"code\":\"AU\",\"name\":\"Australian External Territories\",\"pattern\":\"61 XXX XXX XXX\",\"emoji\":\"🇦🇺\"},{\"phoneCode\":\"43\",\"code\":\"AT\",\"name\":\"Austria\",\"pattern\":\"\",\"emoji\":\"🇦🇹\"},{\"phoneCode\":\"994\",\"code\":\"AZ\",\"name\":\"Azerbaijan\",\"pattern\":\"994 XX XXX XX XX\",\"emoji\":\"🇦🇿\"},{\"phoneCode\":\"1 242\",\"code\":\"BS\",\"name\":\"Bahamas\",\"pattern\":\"1242 XXX XXXX\",\"emoji\":\"🇧🇸\"},{\"phoneCode\":\"973\",\"code\":\"BH\",\"name\":\"Bahrain\",\"pattern\":\"973 XXXX XXXX\",\"emoji\":\"🇧🇭\"},{\"phoneCode\":\"880\",\"code\":\"BD\",\"name\":\"Bangladesh\",\"pattern\":\"\",\"emoji\":\"🇧🇩\"},{\"phoneCode\":\"1 246\",\"code\":\"BB\",\"name\":\"Barbados\",\"pattern\":\"1246 XXX XXXX\",\"emoji\":\"🇧🇧\"},{\"phoneCode\":\"1 268\",\"code\":\"AG\",\"name\":\"Barbuda\",\"pattern\":\"1268 XXX XXXX\",\"emoji\":\"🇦🇬\"},{\"phoneCode\":\"375\",\"code\":\"BY\",\"name\":\"Belarus\",\"pattern\":\"375 XX XXX XXXX\",\"emoji\":\"🇧🇾\"},{\"phoneCode\":\"32\",\"code\":\"BE\",\"name\":\"Belgium\",\"pattern\":\"32 XXX XX XX XX\",\"emoji\":\"🇧🇪\"},{\"phoneCode\":\"501\",\"code\":\"BZ\",\"name\":\"Belize\",\"pattern\":\"\",\"emoji\":\"🇧🇿\"},{\"phoneCode\":\"229\",\"code\":\"BJ\",\"name\":\"Benin\",\"pattern\":\"229 XX XXX XXX\",\"emoji\":\"🇧🇯\"},{\"phoneCode\":\"1 441\",\"code\":\"BM\",\"name\":\"Bermuda\",\"pattern\":\"1441 XXX XXXX\",\"emoji\":\"🇧🇲\"},{\"phoneCode\":\"975\",\"code\":\"BT\",\"name\":\"Bhutan\",\"pattern\":\"\",\"emoji\":\"🇧🇹\"},{\"phoneCode\":\"591\",\"code\":\"BO\",\"name\":\"Bolivia\",\"pattern\":\"591 X XXX XXXX\",\"emoji\":\"🇧🇴\"},{\"phoneCode\":\"599 7\",\"code\":\"BQ\",\"name\":\"Caribbean Netherlands\",\"pattern\":\"\",\"emoji\":\"🇧🇶\"},{\"phoneCode\":\"387\",\"code\":\"BA\",\"name\":\"Bosnia & Herzegovina\",\"pattern\":\"\",\"emoji\":\"🇧🇦\"},{\"phoneCode\":\"267\",\"code\":\"BW\",\"name\":\"Botswana\",\"pattern\":\"267 XX XXX XXX\",\"emoji\":\"🇧🇼\"},{\"phoneCode\":\"55\",\"code\":\"BR\",\"name\":\"Brazil\",\"pattern\":\"55 XX XXXXX XXXX\",\"emoji\":\"🇧🇷\"},{\"phoneCode\":\"246\",\"code\":\"IO\",\"name\":\"British Indian Ocean Territory\",\"pattern\":\"246 XXX XXXX\",\"emoji\":\"🇮🇴\"},{\"phoneCode\":\"1 284\",\"code\":\"VG\",\"name\":\"British Virgin Islands\",\"pattern\":\"1284 XXX XXXX\",\"emoji\":\"🇻🇬\"},{\"phoneCode\":\"673\",\"code\":\"BN\",\"name\":\"Brunei\",\"pattern\":\"673 XXX XXXX\",\"emoji\":\"🇧🇳\"},{\"phoneCode\":\"359\",\"code\":\"BG\",\"name\":\"Bulgaria\",\"pattern\":\"\",\"emoji\":\"🇧🇬\"},{\"phoneCode\":\"226\",\"code\":\"BF\",\"name\":\"Burkina Faso\",\"pattern\":\"226 XX XX XX XX\",\"emoji\":\"🇧🇫\"},{\"phoneCode\":\"95\",\"code\":\"MM\",\"name\":\"Myanmar (Burma)\",\"pattern\":\"\",\"emoji\":\"🇲🇲\"},{\"phoneCode\":\"257\",\"code\":\"BI\",\"name\":\"Burundi\",\"pattern\":\"257 XX XX XXXX\",\"emoji\":\"🇧🇮\"},{\"phoneCode\":\"855\",\"code\":\"KH\",\"name\":\"Cambodia\",\"pattern\":\"\",\"emoji\":\"🇰🇭\"},{\"phoneCode\":\"237\",\"code\":\"CM\",\"name\":\"Cameroon\",\"pattern\":\"237 XXXX XXXX\",\"emoji\":\"🇨🇲\"},{\"phoneCode\":\"1\",\"code\":\"CA\",\"name\":\"Canada\",\"pattern\":\"1 XXX XXX XXXX\",\"emoji\":\"🇨🇦\"},{\"phoneCode\":\"238\",\"code\":\"CV\",\"name\":\"Cape Verde\",\"pattern\":\"238 XXX XXXX\",\"emoji\":\"🇨🇻\"},{\"phoneCode\":\"1 345\",\"code\":\"KY\",\"name\":\"Cayman Islands\",\"pattern\":\"1345 XXX XXXX\",\"emoji\":\"🇰🇾\"},{\"phoneCode\":\"236\",\"code\":\"CF\",\"name\":\"Central African Republic\",\"pattern\":\"236 XX XX XX XX\",\"emoji\":\"🇨🇫\"},{\"phoneCode\":\"235\",\"code\":\"TD\",\"name\":\"Chad\",\"pattern\":\"235 XX XX XX XX\",\"emoji\":\"🇹🇩\"},{\"phoneCode\":\"56\",\"code\":\"CL\",\"name\":\"Chile\",\"pattern\":\"56 X XXXX XXXX\",\"emoji\":\"🇨🇱\"},{\"phoneCode\":\"86\",\"code\":\"CN\",\"name\":\"China\",\"pattern\":\"86 XXX XXXX XXXX\",\"emoji\":\"🇨🇳\"},{\"phoneCode\":\"61\",\"code\":\"CX\",\"name\":\"Christmas Island\",\"pattern\":\"\",\"emoji\":\"🇨🇽\"},{\"phoneCode\":\"61\",\"code\":\"CC\",\"name\":\"Cocos (Keeling) Islands\",\"pattern\":\"\",\"emoji\":\"🇨🇨\"},{\"phoneCode\":\"57\",\"code\":\"CO\",\"name\":\"Colombia\",\"pattern\":\"57 XXX XXX XXXX\",\"emoji\":\"🇨🇴\"},{\"phoneCode\":\"269\",\"code\":\"KM\",\"name\":\"Comoros\",\"pattern\":\"269 XXX XXXX\",\"emoji\":\"🇰🇲\"},{\"phoneCode\":\"242\",\"code\":\"CG\",\"name\":\"Congo - Brazzaville\",\"pattern\":\"242 XX XXX XXXX\",\"emoji\":\"🇨🇬\"},{\"phoneCode\":\"243\",\"code\":\"CD\",\"name\":\"Congo - Kinshasa\",\"pattern\":\"243 XX XXX XXXX\",\"emoji\":\"🇨🇩\"},{\"phoneCode\":\"682\",\"code\":\"CK\",\"name\":\"Cook Islands\",\"pattern\":\"\",\"emoji\":\"🇨🇰\"},{\"phoneCode\":\"506\",\"code\":\"CR\",\"name\":\"Costa Rica\",\"pattern\":\"\",\"emoji\":\"🇨🇷\"},{\"phoneCode\":\"225\",\"code\":\"CI\",\"name\":\"Cote dIvoire\",\"pattern\":\"225 XX XXX XXX\",\"emoji\":\"🇨🇮\"},{\"phoneCode\":\"385\",\"code\":\"HR\",\"name\":\"Croatia\",\"pattern\":\"\",\"emoji\":\"🇭🇷\"},{\"phoneCode\":\"53\",\"code\":\"CU\",\"name\":\"Cuba\",\"pattern\":\"53 XXXX XXXX\",\"emoji\":\"🇨🇺\"},{\"phoneCode\":\"599 9\",\"code\":\"CW\",\"name\":\"Curacao\",\"pattern\":\"\",\"emoji\":\"🇨🇼\"},{\"phoneCode\":\"357\",\"code\":\"CY\",\"name\":\"Cyprus\",\"pattern\":\"357 XXXX XXXX\",\"emoji\":\"🇨🇾\"},{\"phoneCode\":\"420\",\"code\":\"CZ\",\"name\":\"Czech Republic\",\"pattern\":\"\",\"emoji\":\"🇨🇿\"},{\"phoneCode\":\"45\",\"code\":\"DK\",\"name\":\"Denmark\",\"pattern\":\"45 XXXX XXXX\",\"emoji\":\"🇩🇰\"},{\"phoneCode\":\"246\",\"code\":\"DG\",\"name\":\"Diego Garcia\",\"pattern\":\"\",\"emoji\":\"🇩🇬\"},{\"phoneCode\":\"253\",\"code\":\"DJ\",\"name\":\"Djibouti\",\"pattern\":\"253 XX XX XX XX\",\"emoji\":\"🇩🇯\"},{\"phoneCode\":\"1 767\",\"code\":\"DM\",\"name\":\"Dominica\",\"pattern\":\"1767 XXX XXXX\",\"emoji\":\"🇩🇲\"},{\"phoneCode\":\"1 809 and 1 829\",\"code\":\"DO\",\"name\":\"Dominican Republic\",\"pattern\":\"1 XXX XXX XXXX\",\"emoji\":\"🇩🇴\"},{\"phoneCode\":\"670\",\"code\":\"TL\",\"name\":\"Timor-Leste\",\"pattern\":\"\",\"emoji\":\"🇹🇱\"},{\"phoneCode\":\"593\",\"code\":\"EC\",\"name\":\"Ecuador\",\"pattern\":\"\",\"emoji\":\"🇪🇨\"},{\"phoneCode\":\"20\",\"code\":\"EG\",\"name\":\"Egypt\",\"pattern\":\"20 XX XXX XXXX\",\"emoji\":\"🇪🇬\"},{\"phoneCode\":\"503\",\"code\":\"SV\",\"name\":\"El Salvador\",\"pattern\":\"503 XXXX XXXX\",\"emoji\":\"🇸🇻\"},{\"phoneCode\":\"240\",\"code\":\"GQ\",\"name\":\"Equatorial Guinea\",\"pattern\":\"240 XXX XXX XXX\",\"emoji\":\"🇬🇶\"},{\"phoneCode\":\"291\",\"code\":\"ER\",\"name\":\"Eritrea\",\"pattern\":\"291 X XXX XXX\",\"emoji\":\"🇪🇷\"},{\"phoneCode\":\"372\",\"code\":\"EE\",\"name\":\"Estonia\",\"pattern\":\"\",\"emoji\":\"🇪🇪\"},{\"phoneCode\":\"251\",\"code\":\"ET\",\"name\":\"Ethiopia\",\"pattern\":\"251 XX XXX XXXX\",\"emoji\":\"🇪🇹\"},{\"phoneCode\":\"500\",\"code\":\"FK\",\"name\":\"Falkland Islands\",\"pattern\":\"\",\"emoji\":\"🇫🇰\"},{\"phoneCode\":\"298\",\"code\":\"FO\",\"name\":\"Faroe Islands\",\"pattern\":\"298 XXX XXX\",\"emoji\":\"🇫🇴\"},{\"phoneCode\":\"679\",\"code\":\"FJ\",\"name\":\"Fiji\",\"pattern\":\"\",\"emoji\":\"🇫🇯\"},{\"phoneCode\":\"358\",\"code\":\"FI\",\"name\":\"Finland\",\"pattern\":\"\",\"emoji\":\"🇫🇮\"},{\"phoneCode\":\"33\",\"code\":\"FR\",\"name\":\"France\",\"pattern\":\"33 X XX XX XX XX\",\"emoji\":\"🇫🇷\"},{\"phoneCode\":\"594\",\"code\":\"GF\",\"name\":\"French Guiana\",\"pattern\":\"\",\"emoji\":\"🇬🇫\"},{\"phoneCode\":\"689\",\"code\":\"PF\",\"name\":\"French Polynesia\",\"pattern\":\"\",\"emoji\":\"🇵🇫\"},{\"phoneCode\":\"241\",\"code\":\"GA\",\"name\":\"Gabon\",\"pattern\":\"241 X XX XX XX\",\"emoji\":\"🇬🇦\"},{\"phoneCode\":\"220\",\"code\":\"GM\",\"name\":\"Gambia\",\"pattern\":\"220 XXX XXXX\",\"emoji\":\"🇬🇲\"},{\"phoneCode\":\"995\",\"code\":\"GE\",\"name\":\"Georgia\",\"pattern\":\"\",\"emoji\":\"🇬🇪\"},{\"phoneCode\":\"49\",\"code\":\"DE\",\"name\":\"Germany\",\"pattern\":\"49 XXX XXXXXXXX\",\"emoji\":\"🇩🇪\"},{\"phoneCode\":\"233\",\"code\":\"GH\",\"name\":\"Ghana\",\"pattern\":\"\",\"emoji\":\"🇬🇭\"},{\"phoneCode\":\"350\",\"code\":\"GI\",\"name\":\"Gibraltar\",\"pattern\":\"350 XXXX XXXX\",\"emoji\":\"🇬🇮\"},{\"phoneCode\":\"30\",\"code\":\"GR\",\"name\":\"Greece\",\"pattern\":\"30 XX XXXX XXXX\",\"emoji\":\"🇬🇷\"},{\"phoneCode\":\"299\",\"code\":\"GL\",\"name\":\"Greenland\",\"pattern\":\"299 XXX XXX\",\"emoji\":\"🇬🇱\"},{\"phoneCode\":\"1 473\",\"code\":\"GD\",\"name\":\"Grenada\",\"pattern\":\"1473 XXX XXXX\",\"emoji\":\"🇬🇩\"},{\"phoneCode\":\"590\",\"code\":\"GP\",\"name\":\"Guadeloupe\",\"pattern\":\"\",\"emoji\":\"🇬🇵\"},{\"phoneCode\":\"1 671\",\"code\":\"GU\",\"name\":\"Guam\",\"pattern\":\"1671 XXX XXXX\",\"emoji\":\"🇬🇺\"},{\"phoneCode\":\"502\",\"code\":\"GT\",\"name\":\"Guatemala\",\"pattern\":\"502 X XXX XXXX\",\"emoji\":\"🇬🇹\"},{\"phoneCode\":\"44\",\"code\":\"GG\",\"name\":\"Guernsey\",\"pattern\":\"\",\"emoji\":\"🇬🇬\"},{\"phoneCode\":\"224\",\"code\":\"GN\",\"name\":\"Guinea\",\"pattern\":\"224 XXX XXX XXX\",\"emoji\":\"🇬🇳\"},{\"phoneCode\":\"245\",\"code\":\"GW\",\"name\":\"Guinea-Bissau\",\"pattern\":\"245 XXX XXXX\",\"emoji\":\"🇬🇼\"},{\"phoneCode\":\"592\",\"code\":\"GY\",\"name\":\"Guyana\",\"pattern\":\"\",\"emoji\":\"🇬🇾\"},{\"phoneCode\":\"509\",\"code\":\"HT\",\"name\":\"Haiti\",\"pattern\":\"\",\"emoji\":\"🇭🇹\"},{\"phoneCode\":\"504\",\"code\":\"HN\",\"name\":\"Honduras\",\"pattern\":\"504 XXXX XXXX\",\"emoji\":\"🇭🇳\"},{\"phoneCode\":\"852\",\"code\":\"HK\",\"name\":\"Hong Kong SAR China\",\"pattern\":\"\",\"emoji\":\"🇭🇰\"},{\"phoneCode\":\"36\",\"code\":\"HU\",\"name\":\"Hungary\",\"pattern\":\"36 XX XXX XXXX\",\"emoji\":\"🇭🇺\"},{\"phoneCode\":\"354\",\"code\":\"IS\",\"name\":\"Iceland\",\"pattern\":\"354 XXX XXXX\",\"emoji\":\"🇮🇸\"},{\"phoneCode\":\"91\",\"code\":\"IN\",\"name\":\"India\",\"pattern\":\"91 XXXXX XXXXX\",\"emoji\":\"🇮🇳\"},{\"phoneCode\":\"62\",\"code\":\"ID\",\"name\":\"Indonesia\",\"pattern\":\"\",\"emoji\":\"🇮🇩\"},{\"phoneCode\":\"98\",\"code\":\"IR\",\"name\":\"Iran\",\"pattern\":\"98 XXX XXX XXXX\",\"emoji\":\"🇮🇷\"},{\"phoneCode\":\"964\",\"code\":\"IQ\",\"name\":\"Iraq\",\"pattern\":\"964 XXX XXX XXXX\",\"emoji\":\"🇮🇶\"},{\"phoneCode\":\"353\",\"code\":\"IE\",\"name\":\"Ireland\",\"pattern\":\"353 XX XXX XXXX\",\"emoji\":\"🇮🇪\"},{\"phoneCode\":\"972\",\"code\":\"IL\",\"name\":\"Israel\",\"pattern\":\"972 XX XXX XXXX\",\"emoji\":\"🇮🇱\"},{\"phoneCode\":\"39\",\"code\":\"IT\",\"name\":\"Italy\",\"pattern\":\"39 XXX XXX XXXX\",\"emoji\":\"🇮🇹\"},{\"phoneCode\":\"1 876\",\"code\":\"JM\",\"name\":\"Jamaica\",\"pattern\":\"1876 XXX XXXX\",\"emoji\":\"🇯🇲\"},{\"phoneCode\":\"47 79\",\"code\":\"SJ\",\"name\":\"Svalbard & Jan Mayen\",\"pattern\":\"\",\"emoji\":\"🇸🇯\"},{\"phoneCode\":\"81\",\"code\":\"JP\",\"name\":\"Japan\",\"pattern\":\"81 XX XXXX XXXX\",\"emoji\":\"🇯🇵\"},{\"phoneCode\":\"44\",\"code\":\"JE\",\"name\":\"Jersey\",\"pattern\":\"\",\"emoji\":\"🇯🇪\"},{\"phoneCode\":\"962\",\"code\":\"JO\",\"name\":\"Jordan\",\"pattern\":\"962 X XXXX XXXX\",\"emoji\":\"🇯🇴\"},{\"phoneCode\":\"7 7\",\"code\":\"KZ\",\"name\":\"Kazakhstan\",\"pattern\":\"7 XXX XXX XX XX\",\"emoji\":\"🇰🇿\"},{\"phoneCode\":\"254\",\"code\":\"KE\",\"name\":\"Kenya\",\"pattern\":\"254 XXX XXX XXX\",\"emoji\":\"🇰🇪\"},{\"phoneCode\":\"686\",\"code\":\"KI\",\"name\":\"Kiribati\",\"pattern\":\"\",\"emoji\":\"🇰🇮\"},{\"phoneCode\":\"850\",\"code\":\"KP\",\"name\":\"North Korea\",\"pattern\":\"\",\"emoji\":\"🇰🇵\"},{\"phoneCode\":\"82\",\"code\":\"KR\",\"name\":\"South Korea\",\"pattern\":\"\",\"emoji\":\"🇰🇷\"},{\"phoneCode\":\"965\",\"code\":\"KW\",\"name\":\"Kuwait\",\"pattern\":\"965 XXXX XXXX\",\"emoji\":\"🇰🇼\"},{\"phoneCode\":\"996\",\"code\":\"KG\",\"name\":\"Kyrgyzstan\",\"pattern\":\"\",\"emoji\":\"🇰🇬\"},{\"phoneCode\":\"856\",\"code\":\"LA\",\"name\":\"Laos\",\"pattern\":\"\",\"emoji\":\"🇱🇦\"},{\"phoneCode\":\"371\",\"code\":\"LV\",\"name\":\"Latvia\",\"pattern\":\"371 XXX XXXXX\",\"emoji\":\"🇱🇻\"},{\"phoneCode\":\"961\",\"code\":\"LB\",\"name\":\"Lebanon\",\"pattern\":\"\",\"emoji\":\"🇱🇧\"},{\"phoneCode\":\"266\",\"code\":\"LS\",\"name\":\"Lesotho\",\"pattern\":\"266 XX XXX XXX\",\"emoji\":\"🇱🇸\"},{\"phoneCode\":\"231\",\"code\":\"LR\",\"name\":\"Liberia\",\"pattern\":\"\",\"emoji\":\"🇱🇷\"},{\"phoneCode\":\"218\",\"code\":\"LY\",\"name\":\"Libya\",\"pattern\":\"218 XX XXX XXXX\",\"emoji\":\"🇱🇾\"},{\"phoneCode\":\"423\",\"code\":\"LI\",\"name\":\"Liechtenstein\",\"pattern\":\"\",\"emoji\":\"🇱🇮\"},{\"phoneCode\":\"370\",\"code\":\"LT\",\"name\":\"Lithuania\",\"pattern\":\"370 XXX XXXXX\",\"emoji\":\"🇱🇹\"},{\"phoneCode\":\"352\",\"code\":\"LU\",\"name\":\"Luxembourg\",\"pattern\":\"\",\"emoji\":\"🇱🇺\"},{\"phoneCode\":\"853\",\"code\":\"MO\",\"name\":\"Macau SAR China\",\"pattern\":\"\",\"emoji\":\"🇲🇴\"},{\"phoneCode\":\"389\",\"code\":\"MK\",\"name\":\"Macedonia\",\"pattern\":\"\",\"emoji\":\"🇲🇰\"},{\"phoneCode\":\"261\",\"code\":\"MG\",\"name\":\"Madagascar\",\"pattern\":\"261 XX XX XXX XX\",\"emoji\":\"🇲🇬\"},{\"phoneCode\":\"265\",\"code\":\"MW\",\"name\":\"Malawi\",\"pattern\":\"\",\"emoji\":\"🇲🇼\"},{\"phoneCode\":\"60\",\"code\":\"MY\",\"name\":\"Malaysia\",\"pattern\":\"\",\"emoji\":\"🇲🇾\"},{\"phoneCode\":\"960\",\"code\":\"MV\",\"name\":\"Maldives\",\"pattern\":\"\",\"emoji\":\"🇲🇻\"},{\"phoneCode\":\"223\",\"code\":\"ML\",\"name\":\"Mali\",\"pattern\":\"223 XXXX XXXX\",\"emoji\":\"🇲🇱\"},{\"phoneCode\":\"356\",\"code\":\"MT\",\"name\":\"Malta\",\"pattern\":\"356 XX XX XX XX\",\"emoji\":\"🇲🇹\"},{\"phoneCode\":\"692\",\"code\":\"MH\",\"name\":\"Marshall Islands\",\"pattern\":\"\",\"emoji\":\"🇲🇭\"},{\"phoneCode\":\"596\",\"code\":\"MQ\",\"name\":\"Martinique\",\"pattern\":\"\",\"emoji\":\"🇲🇶\"},{\"phoneCode\":\"222\",\"code\":\"MR\",\"name\":\"Mauritania\",\"pattern\":\"222 XXXX XXXX\",\"emoji\":\"🇲🇷\"},{\"phoneCode\":\"230\",\"code\":\"MU\",\"name\":\"Mauritius\",\"pattern\":\"\",\"emoji\":\"🇲🇺\"},{\"phoneCode\":\"262\",\"code\":\"YT\",\"name\":\"Mayotte\",\"pattern\":\"\",\"emoji\":\"🇾🇹\"},{\"phoneCode\":\"52\",\"code\":\"MX\",\"name\":\"Mexico\",\"pattern\":\"\",\"emoji\":\"🇲🇽\"},{\"phoneCode\":\"691\",\"code\":\"FM\",\"name\":\"Micronesia\",\"pattern\":\"\",\"emoji\":\"🇫🇲\"},{\"phoneCode\":\"373\",\"code\":\"MD\",\"name\":\"Moldova\",\"pattern\":\"373 XX XXX XXX\",\"emoji\":\"🇲🇩\"},{\"phoneCode\":\"377\",\"code\":\"MC\",\"name\":\"Monaco\",\"pattern\":\"377 XXXX XXXX\",\"emoji\":\"🇲🇨\"},{\"phoneCode\":\"976\",\"code\":\"MN\",\"name\":\"Mongolia\",\"pattern\":\"\",\"emoji\":\"🇲🇳\"},{\"phoneCode\":\"382\",\"code\":\"ME\",\"name\":\"Montenegro\",\"pattern\":\"\",\"emoji\":\"🇲🇪\"},{\"phoneCode\":\"1 664\",\"code\":\"MS\",\"name\":\"Montserrat\",\"pattern\":\"1664 XXX XXXX\",\"emoji\":\"🇲🇸\"},{\"phoneCode\":\"212\",\"code\":\"MA\",\"name\":\"Morocco\",\"pattern\":\"212 XX XXX XXXX\",\"emoji\":\"🇲🇦\"},{\"phoneCode\":\"258\",\"code\":\"MZ\",\"name\":\"Mozambique\",\"pattern\":\"258 XX XXX XXXX\",\"emoji\":\"🇲🇿\"},{\"phoneCode\":\"264\",\"code\":\"NA\",\"name\":\"Namibia\",\"pattern\":\"264 XX XXX XXXX\",\"emoji\":\"🇳🇦\"},{\"phoneCode\":\"674\",\"code\":\"NR\",\"name\":\"Nauru\",\"pattern\":\"\",\"emoji\":\"🇳🇷\"},{\"phoneCode\":\"977\",\"code\":\"NP\",\"name\":\"Nepal\",\"pattern\":\"\",\"emoji\":\"🇳🇵\"},{\"phoneCode\":\"31\",\"code\":\"NL\",\"name\":\"Netherlands\",\"pattern\":\"31 X XX XX XX XX\",\"emoji\":\"🇳🇱\"},{\"phoneCode\":\"687\",\"code\":\"NC\",\"name\":\"New Caledonia\",\"pattern\":\"\",\"emoji\":\"🇳🇨\"},{\"phoneCode\":\"64\",\"code\":\"NZ\",\"name\":\"New Zealand\",\"pattern\":\"\",\"emoji\":\"🇳🇿\"},{\"phoneCode\":\"505\",\"code\":\"NI\",\"name\":\"Nicaragua\",\"pattern\":\"505 XXXX XXXX\",\"emoji\":\"🇳🇮\"},{\"phoneCode\":\"227\",\"code\":\"NE\",\"name\":\"Niger\",\"pattern\":\"227 XX XX XX XX\",\"emoji\":\"🇳🇪\"},{\"phoneCode\":\"234\",\"code\":\"NG\",\"name\":\"Nigeria\",\"pattern\":\"\",\"emoji\":\"🇳🇬\"},{\"phoneCode\":\"683\",\"code\":\"NU\",\"name\":\"Niue\",\"pattern\":\"\",\"emoji\":\"🇳🇺\"},{\"phoneCode\":\"672\",\"code\":\"NF\",\"name\":\"Norfolk Island\",\"pattern\":\"\",\"emoji\":\"🇳🇫\"},{\"phoneCode\":\"1 670\",\"code\":\"MP\",\"name\":\"Northern Mariana Islands\",\"pattern\":\"1670 XXX XXXX\",\"emoji\":\"🇲🇵\"},{\"phoneCode\":\"47\",\"code\":\"NO\",\"name\":\"Norway\",\"pattern\":\"47 XXXX XXXX\",\"emoji\":\"🇳🇴\"},{\"phoneCode\":\"968\",\"code\":\"OM\",\"name\":\"Oman\",\"pattern\":\"968 XXXX XXXX\",\"emoji\":\"🇴🇲\"},{\"phoneCode\":\"92\",\"code\":\"PK\",\"name\":\"Pakistan\",\"pattern\":\"92 XXX XXX XXXX\",\"emoji\":\"🇵🇰\"},{\"phoneCode\":\"680\",\"code\":\"PW\",\"name\":\"Palau\",\"pattern\":\"\",\"emoji\":\"🇵🇼\"},{\"phoneCode\":\"970\",\"code\":\"PS\",\"name\":\"Palestinian Territories\",\"pattern\":\"970 XXX XX XXXX\",\"emoji\":\"🇵🇸\"},{\"phoneCode\":\"507\",\"code\":\"PA\",\"name\":\"Panama\",\"pattern\":\"507 XXXX XXXX\",\"emoji\":\"🇵🇦\"},{\"phoneCode\":\"675\",\"code\":\"PG\",\"name\":\"Papua New Guinea\",\"pattern\":\"\",\"emoji\":\"🇵🇬\"},{\"phoneCode\":\"595\",\"code\":\"PY\",\"name\":\"Paraguay\",\"pattern\":\"595 XXX XXX XXX\",\"emoji\":\"🇵🇾\"},{\"phoneCode\":\"51\",\"code\":\"PE\",\"name\":\"Peru\",\"pattern\":\"51 XXX XXX XXX\",\"emoji\":\"🇵🇪\"},{\"phoneCode\":\"63\",\"code\":\"PH\",\"name\":\"Philippines\",\"pattern\":\"63 XXX XXX XXXX\",\"emoji\":\"🇵🇭\"},{\"phoneCode\":\"64\",\"code\":\"PN\",\"name\":\"Pitcairn Islands\",\"pattern\":\"\",\"emoji\":\"🇵🇳\"},{\"phoneCode\":\"48\",\"code\":\"PL\",\"name\":\"Poland\",\"pattern\":\"48 XXX XXX XXX\",\"emoji\":\"🇵🇱\"},{\"phoneCode\":\"351\",\"code\":\"PT\",\"name\":\"Portugal\",\"pattern\":\"351 X XXXX XXXX\",\"emoji\":\"🇵🇹\"},{\"phoneCode\":\"1 787 and 1 939\",\"code\":\"PR\",\"name\":\"Puerto Rico\",\"pattern\":\"1 XXX XXX XXXX\",\"emoji\":\"🇵🇷\"},{\"phoneCode\":\"974\",\"code\":\"QA\",\"name\":\"Qatar\",\"pattern\":\"\",\"emoji\":\"🇶🇦\"},{\"phoneCode\":\"262\",\"code\":\"RE\",\"name\":\"Reunion\",\"pattern\":\"262 XXX XXX XXX\",\"emoji\":\"🇷🇪\"},{\"phoneCode\":\"40\",\"code\":\"RO\",\"name\":\"Romania\",\"pattern\":\"40 XXX XXX XXX\",\"emoji\":\"🇷🇴\"},{\"phoneCode\":\"7\",\"code\":\"RU\",\"name\":\"Russia\",\"pattern\":\"7 XXX XXX XX XX\",\"emoji\":\"🇷🇺\"},{\"phoneCode\":\"250\",\"code\":\"RW\",\"name\":\"Rwanda\",\"pattern\":\"250 XXX XXX XXX\",\"emoji\":\"🇷🇼\"},{\"phoneCode\":\"590\",\"code\":\"BL\",\"name\":\"St. Barthelemy\",\"pattern\":\"\",\"emoji\":\"🇧🇱\"},{\"phoneCode\":\"290\",\"code\":\"SH\",\"name\":\"St. Helena\",\"pattern\":\"290 XX XXX\",\"emoji\":\"🇸🇭\"},{\"phoneCode\":\"1 869\",\"code\":\"KN\",\"name\":\"St. Kitts & Nevis\",\"pattern\":\"1869 XXX XXXX\",\"emoji\":\"🇰🇳\"},{\"phoneCode\":\"1 758\",\"code\":\"LC\",\"name\":\"St. Lucia\",\"pattern\":\"1758 XXX XXXX\",\"emoji\":\"🇱🇨\"},{\"phoneCode\":\"590\",\"code\":\"MF\",\"name\":\"St. Martin (France)\",\"pattern\":\"\",\"emoji\":\"🇲🇫\"},{\"phoneCode\":\"508\",\"code\":\"PM\",\"name\":\"St. Pierre and Miquelon\",\"pattern\":\"\",\"emoji\":\"🇵🇲\"},{\"phoneCode\":\"1 784\",\"code\":\"VC\",\"name\":\"St. Vincent and the Grenadines\",\"pattern\":\"1784 XXX XXXX\",\"emoji\":\"🇻🇨\"},{\"phoneCode\":\"685\",\"code\":\"WS\",\"name\":\"Samoa\",\"pattern\":\"\",\"emoji\":\"🇼🇸\"},{\"phoneCode\":\"378\",\"code\":\"SM\",\"name\":\"San Marino\",\"pattern\":\"378 XXX XXX XXXX\",\"emoji\":\"🇸🇲\"},{\"phoneCode\":\"239\",\"code\":\"ST\",\"name\":\"São Tome & Principe\",\"pattern\":\"239 XX XXXXX\",\"emoji\":\"🇸🇹\"},{\"phoneCode\":\"966\",\"code\":\"SA\",\"name\":\"Saudi Arabia\",\"pattern\":\"\",\"emoji\":\"🇸🇦\"},{\"phoneCode\":\"221\",\"code\":\"SN\",\"name\":\"Senegal\",\"pattern\":\"221 XX XXX XXXX\",\"emoji\":\"🇸🇳\"},{\"phoneCode\":\"381\",\"code\":\"RS\",\"name\":\"Serbia\",\"pattern\":\"381 XX XXX XXXX\",\"emoji\":\"🇷🇸\"},{\"phoneCode\":\"248\",\"code\":\"SC\",\"name\":\"Seychelles\",\"pattern\":\"248 X XX XX XX\",\"emoji\":\"🇸🇨\"},{\"phoneCode\":\"232\",\"code\":\"SL\",\"name\":\"Sierra Leone\",\"pattern\":\"232 XX XXX XXX\",\"emoji\":\"🇸🇱\"},{\"phoneCode\":\"65\",\"code\":\"SG\",\"name\":\"Singapore\",\"pattern\":\"65 XXXX XXXX\",\"emoji\":\"🇸🇬\"},{\"phoneCode\":\"599 3\",\"code\":\"BQ\",\"name\":\"Sint Eustatius\",\"pattern\":\"\",\"emoji\":\"🇧🇶\"},{\"phoneCode\":\"1 721\",\"code\":\"SX\",\"name\":\"Sint Maarten\",\"pattern\":\"1721 XXX XXXX\",\"emoji\":\"🇸🇽\"},{\"phoneCode\":\"421\",\"code\":\"SK\",\"name\":\"Slovakia\",\"pattern\":\"\",\"emoji\":\"🇸🇰\"},{\"phoneCode\":\"386\",\"code\":\"SI\",\"name\":\"Slovenia\",\"pattern\":\"\",\"emoji\":\"🇸🇮\"},{\"phoneCode\":\"677\",\"code\":\"SB\",\"name\":\"Solomon Islands\",\"pattern\":\"\",\"emoji\":\"🇸🇧\"},{\"phoneCode\":\"252\",\"code\":\"SO\",\"name\":\"Somalia\",\"pattern\":\"252 XX XXX XXX\",\"emoji\":\"🇸🇴\"},{\"phoneCode\":\"27\",\"code\":\"ZA\",\"name\":\"South Africa\",\"pattern\":\"27 XX XXX XXXX\",\"emoji\":\"🇿🇦\"},{\"phoneCode\":\"500\",\"code\":\"GS\",\"name\":\"South Georgia & South Sandwich Islands\",\"pattern\":\"\",\"emoji\":\"🇬🇸\"},{\"phoneCode\":\"995 34\",\"code\":\"\",\"name\":\"South Ossetia\",\"pattern\":\"\",\"emoji\":\"\"},{\"phoneCode\":\"211\",\"code\":\"SS\",\"name\":\"South Sudan\",\"pattern\":\"211 XX XXX XXXX\",\"emoji\":\"🇸🇸\"},{\"phoneCode\":\"34\",\"code\":\"ES\",\"name\":\"Spain\",\"pattern\":\"34 XXX XXX XXX\",\"emoji\":\"🇪🇸\"},{\"phoneCode\":\"94\",\"code\":\"LK\",\"name\":\"Sri Lanka\",\"pattern\":\"94 XX XXX XXXX\",\"emoji\":\"🇱🇰\"},{\"phoneCode\":\"249\",\"code\":\"SD\",\"name\":\"Sudan\",\"pattern\":\"249 XX XXX XXXX\",\"emoji\":\"🇸🇩\"},{\"phoneCode\":\"597\",\"code\":\"SR\",\"name\":\"Suriname\",\"pattern\":\"597 XXX XXXX\",\"emoji\":\"🇸🇷\"},{\"phoneCode\":\"47 79\",\"code\":\"SJ\",\"name\":\"Svalbard\",\"pattern\":\"\",\"emoji\":\"🇸🇯\"},{\"phoneCode\":\"268\",\"code\":\"SZ\",\"name\":\"Swaziland\",\"pattern\":\"268 XXXX XXXX\",\"emoji\":\"🇸🇿\"},{\"phoneCode\":\"46\",\"code\":\"SE\",\"name\":\"Sweden\",\"pattern\":\"46 XX XXX XXXX\",\"emoji\":\"🇸🇪\"},{\"phoneCode\":\"41\",\"code\":\"CH\",\"name\":\"Switzerland\",\"pattern\":\"41 XX XXX XXXX\",\"emoji\":\"🇨🇭\"},{\"phoneCode\":\"963\",\"code\":\"SY\",\"name\":\"Syria\",\"pattern\":\"\",\"emoji\":\"🇸🇾\"},{\"phoneCode\":\"886\",\"code\":\"TW\",\"name\":\"Taiwan\",\"pattern\":\"\",\"emoji\":\"🇹🇼\"},{\"phoneCode\":\"992\",\"code\":\"TJ\",\"name\":\"Tajikistan\",\"pattern\":\"\",\"emoji\":\"🇹🇯\"},{\"phoneCode\":\"255\",\"code\":\"TZ\",\"name\":\"Tanzania\",\"pattern\":\"255 XX XXX XXXX\",\"emoji\":\"🇹🇿\"},{\"phoneCode\":\"66\",\"code\":\"TH\",\"name\":\"Thailand\",\"pattern\":\"66 X XXXX XXXX\",\"emoji\":\"🇹🇭\"},{\"phoneCode\":\"228\",\"code\":\"TG\",\"name\":\"Togo\",\"pattern\":\"228 XX XXX XXX\",\"emoji\":\"🇹🇬\"},{\"phoneCode\":\"690\",\"code\":\"TK\",\"name\":\"Tokelau\",\"pattern\":\"\",\"emoji\":\"🇹🇰\"},{\"phoneCode\":\"676\",\"code\":\"TO\",\"name\":\"Tonga\",\"pattern\":\"\",\"emoji\":\"🇹🇴\"},{\"phoneCode\":\"1 868\",\"code\":\"TT\",\"name\":\"Trinidad & Tobago\",\"pattern\":\"1868 XXX XXXX\",\"emoji\":\"🇹🇹\"},{\"phoneCode\":\"216\",\"code\":\"TN\",\"name\":\"Tunisia\",\"pattern\":\"216 XX XXX XXX\",\"emoji\":\"🇹🇳\"},{\"phoneCode\":\"90\",\"code\":\"TR\",\"name\":\"Turkey\",\"pattern\":\"90 XXX XXX XXXX\",\"emoji\":\"🇹🇷\"},{\"phoneCode\":\"993\",\"code\":\"TM\",\"name\":\"Turkmenistan\",\"pattern\":\"993 XX XXXXXX\",\"emoji\":\"🇹🇲\"},{\"phoneCode\":\"1 649\",\"code\":\"TC\",\"name\":\"Turks & Caicos Islands\",\"pattern\":\"1649 XXX XXXX\",\"emoji\":\"🇹🇨\"},{\"phoneCode\":\"688\",\"code\":\"TV\",\"name\":\"Tuvalu\",\"pattern\":\"\",\"emoji\":\"🇹🇻\"},{\"phoneCode\":\"256\",\"code\":\"UG\",\"name\":\"Uganda\",\"pattern\":\"256 XX XXX XXXX\",\"emoji\":\"🇺🇬\"},{\"phoneCode\":\"380\",\"code\":\"UA\",\"name\":\"Ukraine\",\"pattern\":\"380 XX XXX XX XX\",\"emoji\":\"🇺🇦\"},{\"phoneCode\":\"971\",\"code\":\"AE\",\"name\":\"United Arab Emirates\",\"pattern\":\"971 XX XXX XXXX\",\"emoji\":\"🇦🇪\"},{\"phoneCode\":\"44\",\"code\":\"GB\",\"name\":\"United Kingdom\",\"pattern\":\"44 XXXX XXXXXX\",\"emoji\":\"🇬🇧\"},{\"phoneCode\":\"1\",\"code\":\"US\",\"name\":\"United States\",\"pattern\":\"1 XXX XXX XXXX\",\"emoji\":\"🇺🇸\"},{\"phoneCode\":\"598\",\"code\":\"UY\",\"name\":\"Uruguay\",\"pattern\":\"598 XXXX XXXX\",\"emoji\":\"🇺🇾\"},{\"phoneCode\":\"1 340\",\"code\":\"VI\",\"name\":\"U.S. Virgin Islands\",\"pattern\":\"1340 XXX XXXX\",\"emoji\":\"🇻🇮\"},{\"phoneCode\":\"998\",\"code\":\"UZ\",\"name\":\"Uzbekistan\",\"pattern\":\"998 XX XXXXXXX\",\"emoji\":\"🇺🇿\"},{\"phoneCode\":\"678\",\"code\":\"VU\",\"name\":\"Vanuatu\",\"pattern\":\"\",\"emoji\":\"🇻🇺\"},{\"phoneCode\":\"58\",\"code\":\"VE\",\"name\":\"Venezuela\",\"pattern\":\"58 XXX XXX XXXX\",\"emoji\":\"🇻🇪\"},{\"phoneCode\":\"39 06 698\",\"code\":\"VA\",\"name\":\"Vatican City\",\"pattern\":\"\",\"emoji\":\"🇻🇦\"},{\"phoneCode\":\"84\",\"code\":\"VN\",\"name\":\"Vietnam\",\"pattern\":\"\",\"emoji\":\"🇻🇳\"},{\"phoneCode\":\"681\",\"code\":\"WF\",\"name\":\"Wallis & Futuna\",\"pattern\":\"\",\"emoji\":\"🇼🇫\"},{\"phoneCode\":\"967\",\"code\":\"YE\",\"name\":\"Yemen\",\"pattern\":\"967 XXX XXX XXX\",\"emoji\":\"🇾🇪\"},{\"phoneCode\":\"260\",\"code\":\"ZM\",\"name\":\"Zambia\",\"pattern\":\"260 XX XXX XXXX\",\"emoji\":\"🇿🇲\"},{\"phoneCode\":\"255\",\"code\":\"\",\"name\":\"Zanzibar\",\"pattern\":\"\",\"emoji\":\"\"},{\"phoneCode\":\"263\",\"code\":\"ZW\",\"name\":\"Zimbabwe\",\"pattern\":\"263 XX XXX XXXX\",\"emoji\":\"🇿🇼\"}];\nconst PhoneCodesMain: {[phoneCode: string]: Country} = {\n '1': Countries.find(c => c.name === 'United States'),\n '44': Countries.find(c => c.name === 'United Kingdom'),\n '61': Countries.find(c => c.name === 'Australia'),\n '64': Countries.find(c => c.name === 'New Zealand'),\n '246': Countries.find(c => c.name === 'Diego Garcia'),\n '255': Countries.find(c => c.name === 'Tanzania'),\n '262': Countries.find(c => c.name === 'Reunion'),\n '500': Countries.find(c => c.name === 'Falkland Islands'),\n '590': Countries.find(c => c.name === 'Guadeloupe'),\n '672': Countries.find(c => c.name === 'Norfolk Island'),\n '1 268': Countries.find(c => c.name === 'Antigua & Barbuda'),\n};\n\n/* \nconst toInt = (str) => {\n return parseInt(str.replace(/ /g, ''));\n};\nvar arr = window.Countries.sort((a, b) => toInt(a.phoneCode) - toInt(b.phoneCode));\narr.forEach((el, idx) => {\n if(idx === (arr.length - 1)) {\n return;\n }\n\n if(toInt(arr[idx + 1].phoneCode) === toInt(el.phoneCode)) {\n console.log('duplicate', el, arr[idx + 1]);\n }\n});\n*/\n\nMOUNT_CLASS_TO.Countries = Countries;\n\nexport default Countries;\nexport {PhoneCodesMain};","/*\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 <igor.beatle@gmail.com>\n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport { MOUNT_CLASS_TO } from '../../config/debug';\nimport { tsNow } from '../../helpers/date';\nimport sessionStorage from '../sessionStorage';\n\nexport class ServerTimeManager {\n public timestampNow = tsNow(true);\n public midnightNoOffset = this.timestampNow - (this.timestampNow % 86400);\n public midnightOffseted = new Date();\n\n public midnightOffset = this.midnightNoOffset - (Math.floor(+this.midnightOffseted / 1000));\n\n public serverTimeOffset = 0; // in seconds\n public timeParams = {\n midnightOffset: this.midnightOffset,\n serverTimeOffset: this.serverTimeOffset\n };\n\n constructor() {\n this.midnightOffseted.setHours(0, 0, 0, 0);\n\n sessionStorage.get('server_time_offset').then((to) => {\n if(to) {\n this.serverTimeOffset = to;\n this.timeParams.serverTimeOffset = to;\n }\n });\n }\n}\n\nconst serverTimeManager = new ServerTimeManager();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.serverTimeManager = serverTimeManager);\nexport default serverTimeManager;\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 <igor.beatle@gmail.com>\n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport type { AccountPassword, AccountPasswordInputSettings, AccountUpdatePasswordSettings, InputCheckPasswordSRP, PasswordKdfAlgo } from '../../layer';\nimport type CryptoWorkerMethods from '../crypto/crypto_methods';\nimport { MOUNT_CLASS_TO } from '../../config/debug';\nimport appUsersManager from '../appManagers/appUsersManager';\nimport apiManager from './mtprotoworker';\n//import { computeCheck } from \"../crypto/srp\";\n\nexport class PasswordManager {\n public getState(): Promise<AccountPassword> {\n return apiManager.invokeApi('account.getPassword').then((result) => {\n return result;\n });\n }\n\n public updateSettings(settings: {\n hint?: string,\n email?: string,\n newPassword?: string,\n currentPassword?: string\n } = {}) {\n //state = Object.assign({}, state);\n //state.new_algo = Object.assign({}, state.new_algo);\n\n return this.getState().then(state => {\n let currentHashPromise: ReturnType<CryptoWorkerMethods['computeSRP']>;\n let newHashPromise: Promise<Uint8Array>;\n const params: AccountUpdatePasswordSettings = {\n password: null,\n new_settings: {\n _: 'account.passwordInputSettings',\n hint: settings.hint,\n email: settings.email\n }\n };\n \n if(settings.currentPassword) {\n currentHashPromise = apiManager.computeSRP(settings.currentPassword, state);\n } else {\n currentHashPromise = Promise.resolve({\n _: 'inputCheckPasswordEmpty'\n });\n }\n \n // * https://core.telegram.org/api/srp#setting-a-new-2fa-password, but still there is a mistake, TDesktop passes 'new_algo' everytime\n const newAlgo = state.new_algo as PasswordKdfAlgo.passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow;\n const salt1 = new Uint8Array(newAlgo.salt1.length + 32);\n salt1.randomize();\n salt1.set(newAlgo.salt1, 0);\n newAlgo.salt1 = salt1;\n \n if(settings.newPassword) {\n newHashPromise = apiManager.computeSRP(settings.newPassword, state, true) as any;\n } else {\n newHashPromise = Promise.resolve(new Uint8Array());\n }\n \n return Promise.all([currentHashPromise, newHashPromise]).then((hashes) => {\n params.password = hashes[0];\n params.new_settings.new_algo = newAlgo;\n params.new_settings.new_password_hash = hashes[1];\n \n return apiManager.invokeApi('account.updatePasswordSettings', params);\n });\n });\n }\n\n public check(password: string, state: AccountPassword, options: any = {}) {\n return apiManager.computeSRP(password, state).then((inputCheckPassword) => {\n //console.log('SRP', inputCheckPassword);\n return apiManager.invokeApi('auth.checkPassword', {\n password: inputCheckPassword\n }, options).then(auth => {\n if(auth._ === 'auth.authorization') {\n appUsersManager.saveApiUser(auth.user);\n apiManager.setUserAuth(auth.user.id);\n }\n\n return auth;\n });\n });\n }\n\n public confirmPasswordEmail(code: string) {\n return apiManager.invokeApi('account.confirmPasswordEmail', {code});\n }\n\n public resendPasswordEmail() {\n return apiManager.invokeApi('account.resendPasswordEmail');\n }\n\n public cancelPasswordEmail() {\n return apiManager.invokeApi('account.cancelPasswordEmail');\n }\n\n /* public requestRecovery(options: any = {}) {\n return apiManager.invokeApi('auth.requestPasswordRecovery', {}, options);\n }\n\n public recover(code: any, options: any = {}) {\n return apiManager.invokeApi('auth.recoverPassword', {\n code\n }, options);\n } */\n}\n\nconst passwordManager = new PasswordManager();\nMOUNT_CLASS_TO.passwordManager = passwordManager;\nexport default passwordManager;\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 { LangPackKey, i18n } from \"../lib/langPack\";\n\nexport default class LoginPage {\n public element: HTMLElement;\n public container: HTMLElement;\n public imageDiv: HTMLElement;\n public inputWrapper: HTMLElement;\n public title: HTMLElement;\n public subtitle: HTMLParagraphElement;\n\n constructor(options: {\n className: string,\n withInputWrapper?: boolean,\n titleLangKey?: LangPackKey,\n subtitleLangKey?: LangPackKey,\n }) {\n this.element = document.body.querySelector('.' + options.className) as HTMLDivElement;\n //this.element = document.createElement('div');\n //this.element.className = 'page-' + options.className;\n\n this.container = document.createElement('div');\n this.container.className = 'container center-align';\n\n this.imageDiv = document.createElement('div');\n this.imageDiv.className = 'auth-image';\n\n this.title = document.createElement('h4');\n if(options.titleLangKey) {\n this.title.append(i18n(options.titleLangKey));\n }\n\n this.subtitle = document.createElement('p');\n this.subtitle.className = 'subtitle';\n if(options.subtitleLangKey) {\n this.subtitle.append(i18n(options.subtitleLangKey));\n }\n \n this.container.append(this.imageDiv, this.title, this.subtitle);\n\n if(options.withInputWrapper) {\n this.inputWrapper = document.createElement('div');\n this.inputWrapper.className = 'input-wrapper';\n this.container.append(this.inputWrapper);\n }\n\n this.element.append(this.container);\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 { whichChild } from \"../helpers/dom\";\nimport rootScope from \"../lib/rootScope\";\nimport { CancellablePromise, deferredPromise } from \"../helpers/cancellablePromise\";\nimport { dispatchHeavyAnimationEvent } from \"../hooks/useHeavyAnimationCheck\";\n\nfunction slideNavigation(tabContent: HTMLElement, prevTabContent: HTMLElement, toRight: boolean) {\n const width = prevTabContent.getBoundingClientRect().width;\n const elements = [tabContent, prevTabContent];\n if(toRight) elements.reverse();\n elements[0].style.filter = `brightness(80%)`;\n elements[0].style.transform = `translate3d(${-width * .25}px, 0, 0)`;\n elements[1].style.transform = `translate3d(${width}px, 0, 0)`;\n \n tabContent.classList.add('active');\n void tabContent.offsetWidth; // reflow\n\n tabContent.style.transform = '';\n tabContent.style.filter = '';\n\n return () => {\n prevTabContent.style.transform = prevTabContent.style.filter = '';\n };\n}\n\nfunction slideTabs(tabContent: HTMLElement, prevTabContent: HTMLElement, toRight: boolean) {\n //window.requestAnimationFrame(() => {\n const width = prevTabContent.getBoundingClientRect().width;\n /* tabContent.style.setProperty('--width', width + 'px');\n prevTabContent.style.setProperty('--width', width + 'px');\n\n tabContent.classList.add('active'); */\n //void tabContent.offsetWidth; // reflow\n const elements = [tabContent, prevTabContent];\n if(toRight) elements.reverse();\n elements[0].style.transform = `translate3d(${-width}px, 0, 0)`;\n elements[1].style.transform = `translate3d(${width}px, 0, 0)`;\n \n tabContent.classList.add('active');\n void tabContent.offsetWidth; // reflow\n \n tabContent.style.transform = '';\n //});\n \n return () => {\n prevTabContent.style.transform = '';\n };\n}\n\nexport const TransitionSlider = (content: HTMLElement, type: 'tabs' | 'navigation' | 'zoom-fade' | 'slide-fade' | 'none'/* | 'counter' */, transitionTime: number, onTransitionEnd?: (id: number) => void, isHeavy = true) => {\n let animationFunction: TransitionFunction = null;\n\n switch(type) {\n case 'tabs':\n animationFunction = slideTabs;\n break;\n case 'navigation':\n animationFunction = slideNavigation;\n break;\n /* default:\n break; */\n }\n\n content.dataset.animation = type;\n \n return Transition(content, animationFunction, transitionTime, onTransitionEnd, isHeavy);\n};\n\ntype TransitionFunction = (tabContent: HTMLElement, prevTabContent: HTMLElement, toRight: boolean) => void | (() => void);\n\nconst Transition = (content: HTMLElement, animationFunction: TransitionFunction, transitionTime: number, onTransitionEnd?: (id: number) => void, isHeavy = true) => {\n const onTransitionEndCallbacks: Map<HTMLElement, Function> = new Map();\n let animationDeferred: CancellablePromise<void>;\n let animationStarted = 0;\n let from: HTMLElement = null;\n\n // TODO: check for transition type (transform, etc) using by animationFunction\n content.addEventListener(animationFunction ? 'transitionend' : 'animationend', (e) => {\n if((e.target as HTMLElement).parentElement !== content) {\n return;\n }\n \n //console.log('Transition: transitionend', /* content, */ e, selectTab.prevId, performance.now() - animationStarted);\n\n const callback = onTransitionEndCallbacks.get(e.target as HTMLElement);\n if(callback) callback();\n\n if(e.target !== from) {\n return;\n }\n\n if(!animationDeferred && isHeavy) return;\n\n if(animationDeferred) {\n animationDeferred.resolve();\n animationDeferred = undefined;\n }\n\n if(onTransitionEnd) {\n onTransitionEnd(selectTab.prevId());\n }\n\n content.classList.remove('animating', 'backwards', 'disable-hover');\n });\n\n function selectTab(id: number | HTMLElement, animate = true) {\n const self = selectTab;\n\n if(id instanceof HTMLElement) {\n id = whichChild(id);\n }\n \n const prevId = self.prevId();\n if(id === prevId) return false;\n\n //console.log('selectTab id:', id);\n\n const _from = from;\n const to = content.children[id] as HTMLElement;\n\n if(!rootScope.settings.animationsEnabled || prevId === -1) {\n animate = false;\n }\n\n if(!animate) {\n if(_from) _from.classList.remove('active', 'to', 'from'); \n if(to) {\n to.classList.remove('to', 'from');\n to.classList.add('active');\n }\n\n content.classList.remove('animating', 'backwards', 'disable-hover');\n\n from = to;\n\n if(onTransitionEnd) onTransitionEnd(id);\n return;\n }\n\n if(from) {\n from.classList.remove('to');\n from.classList.add('from');\n }\n\n content.classList.add('animating', 'disable-hover');\n const toRight = prevId < id;\n content.classList.toggle('backwards', !toRight);\n\n let onTransitionEndCallback: ReturnType<TransitionFunction>;\n if(!to) {\n //prevTabContent.classList.remove('active');\n } else {\n if(animationFunction) {\n onTransitionEndCallback = animationFunction(to, from, toRight);\n } else {\n to.classList.add('active');\n }\n\n to.classList.remove('from');\n to.classList.add('to');\n }\n \n if(to) {\n onTransitionEndCallbacks.set(to, () => {\n to.classList.remove('to');\n onTransitionEndCallbacks.delete(to);\n });\n }\n\n if(_from/* && false */) {\n const callback = () => {\n _from.classList.remove('active', 'from');\n\n if(onTransitionEndCallback) {\n onTransitionEndCallback();\n }\n\n onTransitionEndCallbacks.delete(_from);\n };\n\n if(to) {\n onTransitionEndCallbacks.set(_from, callback);\n } else {\n const timeout = window.setTimeout(callback, transitionTime);\n onTransitionEndCallbacks.set(_from, () => {\n clearTimeout(timeout);\n });\n }\n\n if(isHeavy) {\n if(!animationDeferred) {\n animationDeferred = deferredPromise<void>();\n animationStarted = performance.now();\n }\n \n dispatchHeavyAnimationEvent(animationDeferred, transitionTime * 2);\n }\n }\n \n from = to;\n }\n\n //selectTab.prevId = -1;\n selectTab.prevId = () => from ? whichChild(from) : -1;\n \n return selectTab;\n};\n\nexport default Transition;","/*\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 { cancelEvent } from \"../helpers/dom\";\nimport InputField, { InputFieldOptions } from \"./inputField\";\n\nexport default class PasswordInputField extends InputField {\n public passwordVisible = false;\n public toggleVisible: HTMLElement;\n public onVisibilityClickAdditional: () => void;\n\n constructor(options: InputFieldOptions = {}) {\n super({\n plainText: true,\n ...options\n });\n\n const input = this.input as HTMLInputElement;\n input.type = 'password';\n input.setAttribute('required', '');\n input.autocomplete = 'off';\n /* input.readOnly = true;\n\n input.addEventListener('focus', () => {\n input.removeAttribute('readonly');\n }, {once: true}); */\n\n // * https://stackoverflow.com/a/35949954/6758968\n const stealthy = document.createElement('input');\n stealthy.classList.add('stealthy');\n stealthy.tabIndex = -1;\n stealthy.type = 'password';\n input.parentElement.prepend(stealthy);\n input.parentElement.insertBefore(stealthy.cloneNode(), input.nextSibling);\n\n const toggleVisible = this.toggleVisible = document.createElement('span');\n toggleVisible.classList.add('toggle-visible', 'tgico');\n\n this.container.classList.add('input-field-password');\n this.container.append(toggleVisible);\n\n toggleVisible.addEventListener('click', this.onVisibilityClick);\n toggleVisible.addEventListener('touchend', this.onVisibilityClick);\n }\n\n public onVisibilityClick = (e: Event) => {\n cancelEvent(e);\n this.passwordVisible = !this.passwordVisible;\n\n this.toggleVisible.classList.toggle('eye-hidden', this.passwordVisible);\n (this.input as HTMLInputElement).type = this.passwordVisible ? 'text' : 'password';\n this.onVisibilityClickAdditional && this.onVisibilityClickAdditional();\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 <igor.beatle@gmail.com>\n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport { blobConstruct } from \"../helpers/blob\";\n\nexport class FileManager {\n public blobSupported = true;\n \n constructor() {\n try {\n blobConstruct([], '');\n } catch(e) {\n this.blobSupported = false;\n }\n }\n \n public isAvailable() {\n return this.blobSupported;\n }\n \n public write(fileWriter: ReturnType<FileManager['getFakeFileWriter']>, bytes: Uint8Array | Blob | string): Promise<void> {\n if(bytes instanceof Blob) { // is file bytes\n return new Promise((resolve, reject) => {\n let fileReader = new FileReader();\n fileReader.onload = function(event) {\n let arrayBuffer = event.target.result as ArrayBuffer;\n \n let arr = new Uint8Array(arrayBuffer);\n \n fileWriter.write(arr).then(resolve, reject);\n };\n \n fileReader.readAsArrayBuffer(bytes);\n });\n } else {\n return fileWriter.write(bytes);\n }\n }\n\n public getFakeFileWriter(mimeType: string, saveFileCallback?: (blob: Blob) => Promise<Blob>) {\n const blobParts: Array<Uint8Array | string> = [];\n const fakeFileWriter = {\n write: async(part: Uint8Array | string) => {\n if(!this.blobSupported) {\n throw false;\n }\n \n blobParts.push(part);\n },\n truncate: () => {\n blobParts.length = 0;\n },\n finalize: (saveToStorage = true) => {\n const blob = blobConstruct(blobParts, mimeType);\n\n if(saveToStorage && saveFileCallback) {\n saveFileCallback(blob);\n }\n \n return blob;\n }\n };\n \n return fakeFileWriter;\n }\n}\n\nexport default new FileManager();\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 Modes from '../config/modes';\nimport { blobConstruct } from '../helpers/blob';\nimport FileManager from './filemanager';\n//import { MOUNT_CLASS_TO } from './mtproto/mtproto_config';\n//import { logger } from './polyfill';\n\nexport default class CacheStorageController {\n private static STORAGES: CacheStorageController[] = [];\n //public dbName = 'cachedFiles';\n private openDbPromise: Promise<Cache>;\n\n private useStorage = true;\n\n //private log: ReturnType<typeof logger> = logger('CS');\n\n constructor(private dbName: string) {\n if(Modes.test) {\n this.dbName += '_test';\n }\n \n this.openDatabase();\n CacheStorageController.STORAGES.push(this);\n }\n\n private openDatabase(): Promise<Cache> {\n if(this.openDbPromise) {\n return this.openDbPromise;\n }\n\n return this.openDbPromise = caches.open(this.dbName);\n }\n\n public delete(entryName: string) {\n return this.timeoutOperation((cache) => {\n return cache.delete('/' + entryName);\n });\n }\n\n public deleteAll() {\n return caches.delete(this.dbName);\n }\n\n public save(entryName: string, response: Response) {\n if(!this.useStorage) return Promise.reject('STORAGE_OFFLINE');\n\n return this.timeoutOperation((cache) => {\n return cache.put('/' + entryName, response);\n });\n }\n\n public saveFile(fileName: string, blob: Blob | Uint8Array) {\n if(!this.useStorage) return Promise.reject('STORAGE_OFFLINE');\n\n //return Promise.resolve(blobConstruct([blob]));\n if(!(blob instanceof Blob)) {\n blob = blobConstruct(blob) as Blob;\n }\n\n return this.save(fileName, new Response(blob)).then(() => {\n return blob as Blob;\n });\n }\n\n /* public getBlobSize(blob: any) {\n return blob.size || blob.byteLength || blob.length;\n } */\n\n public getFile(fileName: string, method: 'blob' | 'json' | 'text' = 'blob'): Promise<any> {\n if(!this.useStorage) return Promise.reject('STORAGE_OFFLINE');\n\n /* if(method === 'blob') {\n return Promise.reject();\n } */\n\n // const str = `get fileName: ${fileName}`;\n // console.time(str);\n return this.timeoutOperation(async(cache) => {\n const response = await cache.match('/' + fileName);\n\n if(!response || !cache) {\n //console.warn('getFile:', response, fileName);\n throw 'NO_ENTRY_FOUND';\n }\n \n const promise = response[method]();\n // promise.then(() => {\n // console.timeEnd(str);\n // });\n return promise;\n });\n }\n\n private timeoutOperation<T>(callback: (cache: Cache) => Promise<T>) {\n return new Promise<T>(async(resolve, reject) => {\n let rejected = false;\n const timeout = setTimeout(() => {\n reject();\n //console.warn('CACHESTORAGE TIMEOUT');\n rejected = true;\n }, 15e3);\n\n try {\n const cache = await this.openDatabase();\n if(!cache) {\n throw 'no cache?';\n }\n\n const res = await callback(cache);\n\n if(rejected) return;\n resolve(res);\n } catch(err) {\n reject(err);\n }\n\n clearTimeout(timeout);\n });\n }\n\n public getFileWriter(fileName: string, mimeType: string) {\n const fakeWriter = FileManager.getFakeFileWriter(mimeType, (blob) => {\n return this.saveFile(fileName, blob);\n });\n\n return Promise.resolve(fakeWriter);\n }\n\n public static toggleStorage(enabled: boolean) {\n return Promise.all(this.STORAGES.map(storage => {\n storage.useStorage = enabled;\n \n if(!enabled) {\n return storage.deleteAll();\n }\n }));\n }\n}\n\n//const cacheStorage = new CacheStorageController(); \n//MOUNT_CLASS_TO.cacheStorage = cacheStorage;\n//export default cacheStorage;\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 { whichChild } from \"../helpers/dom\";\nimport { TransitionSlider } from \"./transition\";\nimport { ScrollableX } from \"./scrollable\";\nimport rootScope from \"../lib/rootScope\";\nimport { fastRaf } from \"../helpers/schedulers\";\nimport { FocusDirection } from \"../helpers/fastSmoothScroll\";\nimport findUpAsChild from \"../helpers/dom/findUpAsChild\";\n\nexport function horizontalMenu(tabs: HTMLElement, content: HTMLElement, onClick?: (id: number, tabContent: HTMLDivElement, animate: boolean) => void | boolean, onTransitionEnd?: () => void, transitionTime = 250, scrollableX?: ScrollableX) {\n const selectTab = TransitionSlider(content, tabs || content.dataset.animation === 'tabs' ? 'tabs' : 'navigation', transitionTime, onTransitionEnd);\n\n if(tabs) {\n const proxy = new Proxy(selectTab, {\n apply: (target, that, args) => {\n const id = +args[0];\n const animate = args[1] !== undefined ? args[1] : true;\n \n const el = (tabs.querySelector(`[data-tab=\"${id}\"]`) || tabs.children[id]) as HTMLElement;\n selectTarget(el, id, animate);\n }\n });\n\n const selectTarget = (target: HTMLElement, id: number, animate = true) => {\n const tabContent = content.children[id] as HTMLDivElement;\n\n if(onClick) {\n const canChange = onClick(id, tabContent, animate);\n if(canChange !== undefined && !canChange) {\n return;\n }\n }\n\n if(scrollableX) {\n scrollableX.scrollIntoViewNew(target.parentElement.children[id] as HTMLElement, 'center', undefined, undefined, animate ? undefined : FocusDirection.Static, transitionTime, 'x');\n }\n\n if(!rootScope.settings.animationsEnabled) {\n animate = false;\n }\n\n const prevId = selectTab.prevId();\n if(target.classList.contains('active') || id === prevId) {\n return false;\n }\n \n const prev = tabs.querySelector(tagName.toLowerCase() + '.active') as HTMLElement;\n\n fastRaf(() => {\n prev && prev.classList.remove('active');\n });\n \n // stripe from ZINCHUK\n if(useStripe && prevId !== -1 && animate) {\n fastRaf(() => {\n const indicator = target.querySelector('i')!;\n const currentIndicator = target.parentElement.children[prevId].querySelector('i')!;\n \n currentIndicator.classList.remove('animate');\n indicator.classList.remove('animate');\n \n // We move and resize our indicator so it repeats the position and size of the previous one.\n const shiftLeft = currentIndicator.parentElement.parentElement.offsetLeft - indicator.parentElement.parentElement.offsetLeft;\n const scaleFactor = currentIndicator.clientWidth / indicator.clientWidth;\n indicator.style.transform = `translate3d(${shiftLeft}px, 0, 0) scale3d(${scaleFactor}, 1, 1)`;\n \n //console.log(`translate3d(${shiftLeft}px, 0, 0) scale3d(${scaleFactor}, 1, 1)`);\n \n requestAnimationFrame(() => {\n // Now we remove the transform to let it animate to its own position and size.\n indicator.classList.add('animate');\n indicator.style.transform = 'none';\n });\n });\n }\n // stripe END\n\n fastRaf(() => {\n target.classList.add('active');\n });\n \n selectTab(id, animate);\n };\n\n const useStripe = !tabs.classList.contains('no-stripe');\n\n //const tagName = tabs.classList.contains('menu-horizontal-div') ? 'BUTTON' : 'LI';\n const tagName = tabs.firstElementChild.tagName;\n tabs.addEventListener('click', function(e) {\n let target = e.target as HTMLElement;\n \n target = findUpAsChild(target, tabs);\n \n //console.log('tabs click:', target);\n \n if(!target) return false;\n\n let id: number;\n if(target.dataset.tab) {\n id = +target.dataset.tab;\n if(id === -1) {\n return false;\n }\n } else {\n id = whichChild(target);\n }\n\n selectTarget(target, id);\n });\n\n return proxy;\n }\n \n return selectTab;\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 findUpAsChild(el: any, parent: any) {\n if(el.parentElement === parent) return el;\n \n while(el.parentElement) {\n el = el.parentElement;\n if(el.parentElement === parent) {\n return el;\n }\n }\n\n return null;\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 lottieLoader, { RLottiePlayer } from \"../../lib/lottieLoader\";\nimport PasswordInputField from \"../passwordInputField\";\n\nexport default class PasswordMonkey {\n public container: HTMLElement;\n public animation: RLottiePlayer;\n public needFrame = 0;\n protected loadPromise: Promise<void>;\n\n constructor(protected passwordInputField: PasswordInputField, protected size: number) {\n this.container = document.createElement('div');\n this.container.classList.add('media-sticker-wrapper');\n }\n\n public load() {\n if(this.loadPromise) return this.loadPromise;\n return this.loadPromise = lottieLoader.loadAnimationFromURL({\n container: this.container,\n loop: false,\n autoplay: false,\n width: this.size,\n height: this.size,\n noCache: true\n //}, 'assets/img/TwoFactorSetupMonkeyClose.tgs').then(_animation => {\n }, 'assets/img/TwoFactorSetupMonkeyPeek.tgs').then(_animation => {\n //return;\n this.animation = _animation;\n this.animation.addEventListener('enterFrame', currentFrame => {\n //console.log('enterFrame', currentFrame, this.needFrame);\n\n if((this.animation.direction === 1 && currentFrame >= this.needFrame) ||\n (this.animation.direction === -1 && currentFrame <= this.needFrame)) {\n this.animation.setSpeed(1);\n this.animation.pause();\n } \n });\n\n this.passwordInputField.onVisibilityClickAdditional = () => {\n if(this.passwordInputField.passwordVisible) {\n this.animation.setDirection(1);\n this.animation.curFrame = 0;\n this.needFrame = 16;\n this.animation.play();\n } else {\n this.animation.setDirection(-1);\n this.animation.curFrame = 16;\n this.needFrame = 0;\n this.animation.play();\n }\n };\n\n return lottieLoader.waitForFirstFrame(_animation);\n });\n }\n\n public remove() {\n if(this.animation) {\n this.animation.remove();\n }\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\n// * Jolly Cobra's animation.ts\n\nimport { fastRaf } from './schedulers';\nimport { CancellablePromise, deferredPromise } from './cancellablePromise';\n\ninterface AnimationInstance {\n isCancelled: boolean;\n deferred: CancellablePromise<void>\n}\n\ntype AnimationInstanceKey = any;\nconst instances: Map<AnimationInstanceKey, AnimationInstance> = new Map();\n\nexport function createAnimationInstance(key: AnimationInstanceKey) {\n cancelAnimationByKey(key);\n\n const instance: AnimationInstance = {\n isCancelled: false, \n deferred: deferredPromise<void>()\n };\n\n instances.set(key, instance);\n instance.deferred.then(() => {\n instances.delete(key);\n });\n\n return instance;\n}\n\nexport function getAnimationInstance(key: AnimationInstanceKey) {\n return instances.get(key);\n}\n\nexport function cancelAnimationByKey(key: AnimationInstanceKey) {\n const instance = getAnimationInstance(key);\n if(instance) {\n instance.isCancelled = true;\n instance.deferred.resolve();\n }\n}\n\nexport function animateSingle(tick: Function, key: AnimationInstanceKey, instance?: AnimationInstance) {\n if(!instance) {\n instance = createAnimationInstance(key);\n }\n\n fastRaf(() => {\n if(instance.isCancelled) {\n return;\n }\n \n if(tick()) {\n animateSingle(tick, key, instance);\n } else {\n instance.deferred.resolve();\n }\n });\n\n return instance.deferred;\n}\n\nexport function animate(tick: Function) {\n fastRaf(() => {\n if(tick()) {\n animate(tick);\n }\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 { putPreloader } from '../components/misc';\nimport mediaSizes from '../helpers/mediaSizes';\nimport { AccountPassword } from '../layer';\nimport appStateManager from '../lib/appManagers/appStateManager';\nimport passwordManager from '../lib/mtproto/passwordManager';\nimport Page from './page';\nimport pageIm from './pageIm';\nimport Button from '../components/button';\nimport PasswordInputField from '../components/passwordInputField';\nimport PasswordMonkey from '../components/monkeys/password';\nimport RichTextProcessor from '../lib/richtextprocessor';\nimport I18n from '../lib/langPack';\nimport LoginPage from './loginPage';\nimport { attachClickEvent, cancelEvent, htmlToSpan, replaceContent, toggleDisability } from '../helpers/dom';\n\nconst TEST = false;\nlet passwordInput: HTMLInputElement;\n\nlet onFirstMount = (): Promise<any> => {\n const page = new LoginPage({\n className: 'page-password',\n withInputWrapper: true,\n titleLangKey: 'Login.Password.Title',\n subtitleLangKey: 'Login.Password.Subtitle'\n });\n\n const btnNext = Button('btn-primary btn-color-primary');\n const btnNextI18n = new I18n.IntlElement({key: 'Login.Next'});\n\n btnNext.append(btnNextI18n.element);\n\n const passwordInputField = new PasswordInputField({\n label: 'LoginPassword',\n name: 'password'\n });\n\n passwordInput = passwordInputField.input as HTMLInputElement;\n\n page.inputWrapper.append(passwordInputField.container, btnNext);\n\n let getStateInterval: number;\n\n let getState = () => {\n // * just to check session relevance\n if(!getStateInterval) {\n getStateInterval = window.setInterval(getState, 10e3);\n }\n\n return !TEST && passwordManager.getState().then(_state => {\n state = _state;\n\n if(state.hint) {\n replaceContent(passwordInputField.label, htmlToSpan(RichTextProcessor.wrapEmojiText(state.hint)));\n } else {\n passwordInputField.setLabel();\n }\n });\n };\n\n let state: AccountPassword;\n \n const onSubmit = (e?: Event) => {\n if(e) {\n cancelEvent(e);\n }\n\n if(!passwordInput.value.length) {\n passwordInput.classList.add('error');\n return;\n }\n\n const toggle = toggleDisability([passwordInput, btnNext], true);\n let value = passwordInput.value;\n\n btnNextI18n.update({key: 'PleaseWait'});\n const preloader = putPreloader(btnNext);\n\n passwordManager.check(value, state).then((response) => {\n //console.log('passwordManager response:', response);\n \n switch(response._) {\n case 'auth.authorization':\n clearInterval(getStateInterval);\n pageIm.mount();\n if(monkey) monkey.remove();\n break;\n default:\n btnNext.removeAttribute('disabled');\n btnNextI18n.update({key: response._ as any});\n preloader.remove();\n break;\n }\n }).catch((err: any) => {\n toggle();\n passwordInputField.input.classList.add('error');\n \n switch(err.type) {\n default:\n //btnNext.innerText = err.type;\n btnNextI18n.update({key: 'PASSWORD_HASH_INVALID'});\n passwordInput.select();\n break;\n }\n\n preloader.remove();\n \n getState();\n });\n };\n \n attachClickEvent(btnNext, onSubmit);\n\n passwordInput.addEventListener('keypress', function(this, e) {\n this.classList.remove('error');\n btnNextI18n.update({key: 'Login.Next'});\n\n if(e.key === 'Enter') {\n return onSubmit();\n }\n });\n\n const size = mediaSizes.isMobile ? 100 : 166;\n const monkey = new PasswordMonkey(passwordInputField, size);\n page.imageDiv.append(monkey.container);\n return Promise.all([\n monkey.load(),\n getState()\n ]);\n};\n\nconst page = new Page('page-password', true, onFirstMount, null, () => {\n //if(!isAppleMobile) {\n passwordInput.focus();\n //}\n\n appStateManager.pushToState('authState', {_: 'authStatePassword'});\n});\n\nexport default page;\n","module.exports = function() {\n return new Worker(__webpack_public_path__ + \"61a189906246e6afbe78.worker.js\");\n};"],"sourceRoot":""}