{"version":3,"mappings":"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","names":["MAIN_DOMAINS","threads","App","blurActiveElement","cancelEvent","event","IS_TOUCH_SUPPORTED","ctx","USER_AGENT","IS_APPLE","IS_ANDROID","IS_CHROMIUM","CHROMIUM_VERSION","IS_APPLE_MOBILE","IS_SAFARI","IS_FIREFOX","IS_MOBILE_SAFARI","IS_MOBILE","findUpClassName","el","className","fastRafCallbacks","fastRaf","callback","currentCallbacks","cb","rafPromise","fastRafPromise","resolve","doubleRaf","fixSafariStickyInput","input","IS_STICKY_INPUT_BUGGED","key","startY","o","onTouchMove","e","touch","scrollable","y","scrolled","scrollTop","scrollHeight","clientHeight","nextScrollTop","lastFocusOutTimeStamp","IS_EMOJI_SUPPORTED","pause","ms","makeWorkerURL","url","value","setWorkerProxy","workerHandler","target","args","w","toggleAttributePolyfill","name","force","NULL_PEER_ID","THUMB_TYPE_FULL","MESSAGE_ID_OFFSET","T_ME_PREFIXES","FOLDER_ID_ALL","FOLDER_ID_ARCHIVE","REAL_FOLDERS","EventListenerBase","reuseResults","options","listenerObject","_a","obj","i","l","listener","result","error","err","collectResults","arr","listeners","Modes","IS_BETA","DEBUG","MOUNT_CLASS_TO","tabId","indexOfAndSplice","array","item","idx","IS_SERVICE_WORKER","IS_WEB_WORKER","IS_WORKER","getWindowClients","postMessage","notifyServiceWorker","all","notifyWorker","noop","CACHED_ERRORS","makeError","type","_logTimer","dT","LogTypes","LOG_LEVELS","IS_WEBKIT","STYLES_SUPPORTED","LOGGER_STYLES","methods","logger","prefix","ignoreDebugReset","style","originalPrefix","originalStyle","log","method","logType","newPrefix","level","acc","v","prefixCache","_type","prefix2","USE_LOCKS","SuperMessagePort","logSuffix","task","source","taskId","deferred","payload","previousResolve","ret","reject","pingResolve","newEvent","id","innerTask","resultTaskPayload","resultTask","ackTask","isPromise","cached","port","promise","lock","port2","portTasks","tasks","batchTask","ports","transfer","withAck","_void","interval","MTProtoMessagePort","RootScope","isNew","isPremium","status","settings","rootScope","deferredHelper","deferredPromise","_resolve","_reject","throttle","fn","shouldRunFirst","isPending","clear","_args","safeAssign","object","fromObject","_IDB","db","createNew","createIndexes","os","store","indexNames","indexName","index","createObjectStore","request","finished","calledNew","transaction","instance","preserve","storage","IDB","IDBStorage","storeName","entryName","isArray","objectStore","promises","mode","perf","onError","timeout","onComplete","results","requests","r","waitForTransactionComplete","callbackResult","length","left","onRequestFinished","THROTTLE_TIME","_AppStorage","set","keys","values","useCache","p","onlyLocal","canUseStorage","saveLocal","enabled","clearWrite","names","AppStorage","DATABASE_STATE","StateStorage","stateStorage","deepEqual","x","ignoreKeys","ok","tx","capitalizeFirstLetter","string","SKIP_PROTOCOLS","matchUrlProtocol","text","protocol","originalString","ALPHA_CHARS_REG_EXP","ALPHA_NUMERIC_REG_EXP","DOMAIN_ADD_CHARS","URL_ALPHANUMERIC_REG_EXP_PART","URL_PROTOCOL_REG_EXP_PART","URL_REG_EXP","USERNAME_REG_EXP","TIMESTAMP_REG_EXP","BOT_COMMAND_REG_EXP","FULL_REG_EXP","emojiRegExp","EMAIL_REG_EXP","SITE_HASHTAGS","MARKDOWN_ENTITIES","PASS_CONFLICTING_ENTITIES","PASS_SINGLE_CONFLICTING_ENTITIES","PHONE_NUMBER_REG_EXP","wrapUrl","unsafe","out","tgMeMatch","tgMatch","onclick","u","fullPath","path","setInnerHTML","elem","html","setDirection","setBlankToAnchor","anchor","equalFn","a","b","$PROXY","$TRACK","signalOptions","runEffects","runQueue","STALE","PENDING","UNOWNED","Owner","Transition","ExternalSourceConfig","Listener","Updates","Effects","ExecCount","createRoot","detachedOwner","owner","unowned","current","root","updateFn","untrack","cleanNode","runUpdates","createSignal","setter","writeSignal","readSignal","createRenderEffect","c","createComputation","updateComputation","batch","getListener","updates","lookUpstream","sSlot","node","isComp","TransitionRunning","markDownstream","time","runComputation","nextValue","handleError","init","pure","state","runTop","ancestors","wait","res","completeUpdates","queue","ignore","obs","n","s","castError","I18n","pluralRules","cacheLangPackPromise","setRTL","rtl","setLangCode","langCode","getCacheLangPack","langPack","applyLangPack","loadLocalLangPack","updateAmPm","dateTimeFormat","getDateTimeFormat","date","amText","pmText","setTimeFormat","format","haveToUpdate","cachedDateTimeFormats","element","IntlDateElement","defaultCode","__vitePreload","lang","langSign","countries","strings","formatLocalStrings","saveLangPack","loadLangPack","web","managers","getStrings","pushTo","getLangPack","langPack1","langPack2","localLangPack1","localLangPack2","_","_Intl","currentLangCode","country","langPackKey","pushNextArgument","indexHolder","arg","superFormatter","indexes","str","regExp","lastIndex","match","p1","p2","p3","p4","offset","wrappedUrl","formatted","plain","IntlElementBase","IntlElement","json","hours","i18n","i18n_","_i18n","property","I18n$1","isAnyChat","peerId","isUser","isChat","newMethod","originMethod","bufferConcats","tmp","lastLength","onFinally","reason","WebpWorkerController","data","fileName","bytes","convertPromise","webpWorkerController","LocalStorage","lastError","stringified","_LocalStorageController","LocalStorageController","sessionStorage","isSwipingBackSafari","AppNavigationController","hash","wasIndex","good","items","single","appNavigationController","AppRuntimeManager","appRuntimeManager","copy","clonedObj","prop","IS_SHARED_WORKER_SUPPORTED","FOCUS_EVENT_NAME","IdleController","idle","idleController","CHECK_INSTANCE_INTERVAL","DEACTIVATE_TIMEOUT","MULTIPLE_TABS_THRESHOLD","IS_MULTIPLE_TABS_SUPPORTED","SingleInstance","newInstance","curInstance","build","apiManagerProxy","singleInstance","clearMessageId","messageId","toServer","getServerMessageId","PING_PUSH_INTERVAL","WebPushApiManager","reg","subscription","ACTIONS_LANG_MAP","action","successful","newSettings","subscriptionObj","mid","webPushApiManager","loadScript","script","tsNow","seconds","TelegramMeWebManager","canRedirect","curValue","ts","telegramMeWebManager","IS_WEBRTC_SUPPORTED","IS_CALL_SUPPORTED","CAN_USE_TRANSFERABLES","CAN_USE_TRANSFERABLES$1","IS_CANVAS_FILTER_SUPPORTED","IS_GEOLOCATION_SUPPORTED","IS_GROUP_CALL_SUPPORTED","IS_WEBP_SUPPORTED","IMAGE_MIME_TYPES_SUPPORTED","possible","mime","img","supported","IMAGE_MIME_TYPES_SUPPORTED_PROMISE","mimeTypes","video","IS_WEBM_SUPPORTED","IS_MOV_SUPPORTED","IS_H265_SUPPORTED","VIDEO_MIME_TYPES_SUPPORTED","MEDIA_MIME_TYPES_SUPPORTED","IS_PARALLAX_SUPPORTED","IS_SCREEN_SHARING_SUPPORTED","IS_VIBRATE_SUPPORTED","audio","IS_OPUS_SUPPORTED","IS_APPLE_MX","extension","renderer","IS_APPLE_MX$1","IS_LIVE_STREAM_SUPPORTED","ENVIRONMENT","IS_VIDEO_SUPPORTED","userAgent","getTimeFormat","offsetWidth","arrays","nextRandomUint","bits","randomLong","STATE_VERSION","BUILD","DEFAULT_THEME","makeDefaultAppTheme","baseTheme","highlightingColor","STATE_INIT","compareVersion","v1","v2","s1","s2","isObject","validateInitObject","initObject","currentObject","onReplace","previousKey","ignorePaths","_path","recordPromise","description","recordPromiseBound","REFRESH_EVERY","ALL_KEYS","REFRESH_KEYS","loadStateInner","totalPerf","pushedKeys","pushToState","replaceState","_state","auth","stateId","sessionBuild","authKeyFingerprint","baseDcAuthKey","shiftedWebKAuth","resetStorages","resetState","preserveKeys","_authKeyFingerprint","autoDownloadSettings","oldTypes","mediaType","peerTypeSettings","peerType","missingKey","newVersion","oldVersion","migrated","oldThemes","oldTheme","oldBackground","newTheme","t","getColorFromHex","hex","colors","wallPaper","wallPaperSettings","changed","theme","loadState","OpusDecodeController","typedArray","keepAlive","kill","pages","withWaveform","dataBlob","opusDecodeController","CryptoMessagePort","sendPortIndex","cryptoMessagePort","toArray","blobSafeMimeType","mimeType","blobConstruct","blobParts","safeMimeType","MemoryWriter","size","saveFileCallback","part","endOffset","newBytes","saveToStorage","blob","parts","_CacheStorageController","dbName","cache","response","rejected","fileSize","CacheStorageController","toggleStorages","ServiceMessagePort","DEEP_PATH_JOINER","joinDeepPath","splitDeepPath","setDeepProperty","deleteIfUndefined","splitted","lastObject","lastKey","FILENAME_JOINER","getFileNameByLocation","location","ext","geoPoint","isWebFileLocation","getThumbKey","media","generateEmptyThumb","getStickerThumbKey","docId","toneIndex","callbackify","smth","isLegacyMessageId","$RAW","$NODE","$HAS","$SELF","wrap$1","proxyTraps$1","desc","isWrappable","proto","unwrap","unwrapped","getNodes","symbol","nodes","getNode","proxyDescriptor$1","trackSelf","ownKeys","receiver","tracked","setProperty","deleting","prev","len","mergeStoreNode","updateArray","next","updatePath","traversed","partType","from","to","by","createStore","unwrappedStore","wrappedStore","setStore","$ROOT","applyState","parent","merge","previous","j","start","end","newEnd","newIndicesNext","keyVal","temp","newIndices","targetKeys","previousKeys","reconcile","appState","_setAppState","setAppStateSilent","getObjectKeysAndSort","sort","ids","setState","reconcilePeer","peer","reconcilePeers","peers","ApiManagerProxy","mirror","message","groupedId","_mid","previousMessage","map","storageTask","language","toClear","cacheName","iframe","onFinish","onLoad","serviceWorker","ServiceWorkerURL","registration","FIX_KEY","swfix","controller","worker","get","pathnameSplitted","pre","originals","originalUrl","createWorker","constructor","attachWorkerToPort","firstWorker","messagePort","stateResult","thumbSize","reaction","availableReactions","availableReaction","minMid","mids","userId","chatId","saved","photo","overwrite","appConfig","isPremiumPurchaseBlocked","apiManagerProxy$1","DEBUG_MANAGER_REQUESTS","createProxy","ack","createProxyProxy","proxied","getProxiedManagers","clamp","min","max","rgbToHsv","g","h","hsvToRgb","f","k","rgbaToHsla","d","hslaToRgba","hue2rgb","q","hslaStringToRgba","hsla","alpha","val","hexaToRgba","hexa","hexToRgb","rgbaToHexa","rgba","hslaStringToHexa","hslaStringToHex","mixColors","color1","color2","weight","computePerceivedBrightness","color","getAverageColor","getAccentColor","baseHsv","baseColor","elementColor","hsvTemp3","hsvTemp4","dist","changeColorAccent","accentHsv","isDarkTheme","colorHsv","newColor","origBrightness","newBrightness","fallbackAmount","changeBrightness","amount","getHexColorFromTelegramColor","getRgbColorFromTelegramColor","calcImageInBox","imageW","imageH","boxW","boxH","noZoom","makeMediaSize","boxedImageW","boxedImageH","MediaSize","width","height","boxSize","fitted","MOBILE_SIZE","MEDIUM_SIZE","LARGE_SIZE","CUSTOM_EMOJI_SIZE","ESG_CUSTOM_EMOJI_SIZE","EMOJI_STATUS_SIZE","MediaSizes","innerWidth","activeScreen","wasScreen","mediaSizes","CustomProperties","night","customProperties","createUnifiedSignal","getter","WindowSize","windowSize","LiteMode","liteMode","appColorMap","colorMap","ThemeController","coordinates","themeColorElem","darkModeMediaQuery","checkDarkMode","highlightingRgba","silent","isNight","wasApplied","reverse","transition","endRadius","appliedColors","_options","lightenAlpha","darkenAlpha","mixColor","saveToCache","appColor","rgb","lightenedRgb","darkenedHsla","properties","currentTheme","themes","themeSettings","newAppTheme","baseColors","hsvTemp1","hsvTemp2","newAccentRgb","newAccentHex","applyAppColor","finalize","messageLightenAlpha","baseMessageColor","baseMessageOutBackgroundColor","myMessagesAccent","nextColor","accentColor2","newMessageOutBackgroundColor","messageOutBackgroundColorHsl","themePropertiesMap","themeParams","themeController","OverlayCounter","overlayCounter","parseUriParamsLine","line","params","IS_INSTALL_PROMPT_SUPPORTED","cacheInstallPrompt","deferredPrompt","months","days","monthsLocalized","daysLocalized","ONE_DAY","getWeekDays","getMonths","fillLocalizedDates","getWeekNumber","dayNum","yearStart","formatDateAccordingToTodayNew","today","now","timestamp","minYear","yearPattern","anyLetterRegExp","monthPattern","monthYearOrDayPattern","yearOrDayAndMonthPattern","shortDate","longDate","numberOfDaysEachMonth","fillTipDates","query","dates","haystack","year","month","day","minDate","maxDate","dayOfWeek","getDayOfWeek","currentDay","distance","formatWeekLong","matches","g1","g2","k1","selectedYear","createForMonthYear","createForDayMonth","g3","currentYear","validDateForMonth","formatterYearMax","getMonth","formatterMonthYear","isLeapYear","formatterDayMonth","USE_NATIVE_SCROLL","IS_OVERLAY_SCROLL_SUPPORTED","USE_CUSTOM_SCROLL","We","Ue","oe","Oe","F","O","Ge","R","G","J","V","Fe","Ye","ce","E","D","S","pe","he","ue","et","tt","st","nt","rt","it","M","le","de","_e","at","fe","ct","A","Q","ht","me","Ee","K","dt","ne","Se","_t","ft","gt","Pe","X","xe","wt","Ce","bt","Te","Re","Ae","mt","Ie","yt","qe","vt","initDataRaw","initData","retrieveLaunchParams","manifest","setViewportVH","lastVH","setVH","vh","preparePrint","chat","chatClone","bubbles","bubblesInner","printable","removePrint","toggleResizeMode","wasTabId","langPromise","fadeInWhenFontsReady","hideLoading","loadingScreen","authState","urlSearchParams","placeholder","webPushApiManager$1","meModule","pushModule","pagePromise","approvalScreen","bluecheckScreen"],"ignoreList":[23,131],"sources":["../src/config/app.ts","../src/helpers/dom/blurActiveElement.ts","../src/helpers/dom/cancelEvent.ts","../src/environment/touchSupport.ts","../src/environment/ctx.ts","../src/environment/userAgent.ts","../src/helpers/dom/findUpClassName.ts","../src/helpers/schedulers.ts","../src/helpers/dom/fixSafariStickyInput.ts","../src/helpers/dom/fixSafariStickyInputFocusing.ts","../src/environment/emojiSupport.ts","../src/helpers/schedulers/pause.ts","../src/helpers/setWorkerProxy.ts","../src/helpers/dom/toggleAttributePolyfill.ts","../src/lib/mtproto/mtproto_config.ts","../src/helpers/eventListenerBase.ts","../src/config/modes.ts","../src/config/debug.ts","../src/config/tabId.ts","../src/helpers/array/indexOfAndSplice.ts","../src/helpers/context.ts","../src/helpers/makeError.ts","../src/helpers/dT.ts","../src/lib/logger.ts","../src/lib/mtproto/superMessagePort.ts","../src/lib/mtproto/mtprotoMessagePort.ts","../src/lib/rootScope.ts","../src/helpers/noop.ts","../src/helpers/cancellablePromise.ts","../src/helpers/schedulers/throttle.ts","../src/helpers/object/safeAssign.ts","../src/lib/files/idb.ts","../src/lib/storage.ts","../src/config/databases/state.ts","../src/lib/stateStorage.ts","../src/helpers/object/deepEqual.ts","../src/helpers/string/capitalizeFirstLetter.ts","../src/lib/richTextProcessor/matchUrlProtocol.ts","../src/vendor/emoji/regex.ts","../src/lib/richTextProcessor/index.ts","../src/lib/richTextProcessor/wrapUrl.ts","../src/helpers/dom/setInnerHTML.ts","../src/lib/richTextProcessor/setBlankToAnchor.ts","../src/vendor/solid/dist/solid.js","../src/lib/langPack.ts","../src/lib/appManagers/utils/peers/isAnyChat.ts","../src/lib/appManagers/utils/peers/isUser.ts","../src/helpers/peerIdPolyfill.ts","../src/helpers/bytes/bufferConcats.ts","../src/lib/polyfill.ts","../src/lib/webp/webpWorkerController.ts","../src/lib/localStorage.ts","../src/lib/sessionStorage.ts","../src/helpers/dom/isSwipingBackSafari.ts","../src/components/appNavigationController.ts","../src/lib/appManagers/appRuntimeManager.ts","../src/helpers/object/copy.ts","../src/environment/sharedWorkerSupport.ts","../src/helpers/idleController.ts","../src/lib/mtproto/singleInstance.ts","../src/lib/appManagers/utils/messageId/clearMessageId.ts","../src/lib/appManagers/utils/messageId/getServerMessageId.ts","../src/lib/mtproto/webPushApiManager.ts","../src/helpers/dom/loadScript.ts","../src/helpers/tsNow.ts","../src/lib/mtproto/telegramMeWebManager.ts","../src/environment/webrtcSupport.ts","../src/environment/callSupport.ts","../src/environment/canUseTransferables.ts","../src/environment/canvasFilterSupport.ts","../src/environment/geolocationSupport.ts","../src/environment/groupCallSupport.ts","../src/environment/webpSupport.ts","../src/environment/imageMimeTypesSupport.ts","../src/environment/videoSupport.ts","../src/environment/videoMimeTypesSupport.ts","../src/environment/mediaMimeTypesSupport.ts","../src/environment/parallaxSupport.ts","../src/environment/screenSharingSupport.ts","../src/environment/vibrateSupport.ts","../src/environment/opusSupport.ts","../src/environment/appleMx.ts","../src/environment/liveStreamSupport.ts","../src/environment/index.ts","../src/helpers/getTimeFormat.ts","../src/helpers/random.ts","../src/config/state.ts","../src/helpers/compareVersion.ts","../src/helpers/object/isObject.ts","../src/helpers/object/validateInitObject.ts","../src/helpers/recordPromise.ts","../src/lib/appManagers/utils/state/loadState.ts","../src/lib/opusDecodeController.ts","../src/lib/crypto/cryptoMessagePort.ts","../src/helpers/array/toArray.ts","../src/helpers/blob/blobSafeMimeType.ts","../src/helpers/blob/blobConstruct.ts","../src/lib/files/memoryWriter.ts","../src/lib/files/cacheStorage.ts","../src/helpers/toggleStorages.ts","../src/lib/serviceWorker/serviceMessagePort.ts","../src/helpers/object/setDeepProperty.ts","../src/helpers/fileName.ts","../src/lib/appManagers/utils/webFiles/isWebFileLocation.ts","../src/lib/storages/utils/thumbs/getThumbKey.ts","../src/lib/storages/utils/thumbs/generateEmptyThumb.ts","../src/lib/storages/utils/thumbs/getStickerThumbKey.ts","../src/helpers/callbackify.ts","../src/lib/appManagers/utils/messageId/isLegacyMessageId.ts","../src/vendor/solid/store/dist/store.js","../src/stores/appState.ts","../src/helpers/object/getObjectKeysAndSort.ts","../src/stores/peers.ts","../src/lib/mtproto/mtprotoworker.ts","../src/lib/appManagers/getProxiedManagers.ts","../src/helpers/number/clamp.ts","../src/helpers/color.ts","../src/helpers/calcImageInBox.ts","../src/helpers/mediaSize.ts","../src/helpers/mediaSizes.ts","../src/helpers/dom/customProperties.ts","../src/helpers/solid/createUnifiedSignal.ts","../src/helpers/windowSize.ts","../src/helpers/liteMode.ts","../src/helpers/themeController.ts","../src/helpers/overlayCounter.ts","../src/helpers/string/parseUriParams.ts","../src/environment/installPrompt.ts","../src/helpers/dom/installPrompt.ts","../src/helpers/date.ts","../src/environment/overlayScrollSupport.ts","../node_modules/.pnpm/@telegram-apps+sdk@1.1.3/node_modules/@telegram-apps/sdk/dist/index.js","../src/index.ts"],"sourcesContent":["/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport type {TrueDcId} from '../types';\n\nexport const MAIN_DOMAINS = ['web.telegram.org', 'webk.telegram.org'];\nexport const DEFAULT_BACKGROUND_SLUG = 'pattern';\n\nconst threads = Math.min(4, navigator.hardwareConcurrency ?? 4);\n\nconst App = {\n id: +import.meta.env.VITE_API_ID,\n hash: import.meta.env.VITE_API_HASH,\n version: import.meta.env.VITE_VERSION,\n versionFull: import.meta.env.VITE_VERSION_FULL,\n build: +import.meta.env.VITE_BUILD,\n langPackVersion: '5.9.4',\n langPack: 'webk',\n langPackCode: 'en',\n domains: MAIN_DOMAINS,\n baseDcId: 2 as TrueDcId,\n isMainDomain: MAIN_DOMAINS.includes(location.hostname),\n suffix: 'K',\n threads,\n cryptoWorkers: threads\n};\n\nif(App.isMainDomain) { // use Webogram credentials then\n App.id = 2496;\n App.hash = '8da85b0d5bfe62527e5b244c209159c3';\n}\n\nexport default App;\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 blurActiveElement() {\n if((document.activeElement as HTMLInputElement)?.blur) {\n (document.activeElement as HTMLInputElement).blur();\n return true;\n }\n\n return false;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nexport default function cancelEvent(event?: Event) {\n event ||= window.event;\n if(event) {\n // 'input' event will have cancelable=false, but we still need to preventDefault\n // if(!event.cancelable) {\n // return false;\n // }\n\n // @ts-ignore\n event = event.originalEvent || event;\n\n try {\n if(event.stopPropagation) event.stopPropagation();\n if(event.preventDefault) event.preventDefault();\n event.returnValue = false;\n event.cancelBubble = true;\n } catch(err) {}\n }\n\n return false;\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// @ts-ignore\nconst IS_TOUCH_SUPPORTED = ('ontouchstart' in window) || (window.DocumentTouch && document instanceof DocumentTouch)/* || true */;\nexport default IS_TOUCH_SUPPORTED;\n","const ctx = typeof(window) !== 'undefined' ? window : self;\n\nexport default ctx;\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 ctx from './ctx';\n\nexport const USER_AGENT = navigator ? navigator.userAgent : null;\nexport const IS_APPLE = navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i) !== -1;\nexport const IS_ANDROID = navigator.userAgent.toLowerCase().indexOf('android') !== -1;\nexport const IS_CHROMIUM = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor);\nexport const CHROMIUM_VERSION = (() => {\n try {\n return +navigator.userAgent.match(/Chrom(?:e|ium)\\/(.+?)(?:\\s|\\.)/)[1];\n } catch(err) {\n }\n})();\n\n// https://stackoverflow.com/a/58065241\nexport const IS_APPLE_MOBILE = (/iPad|iPhone|iPod/.test(navigator.platform) ||\n (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)) &&\n !(ctx as any).MSStream;\n\nexport const IS_SAFARI = !!('safari' in ctx) || !!(USER_AGENT && (/\\b(iPad|iPhone|iPod)\\b/.test(USER_AGENT) || (!!USER_AGENT.match('Safari') && !USER_AGENT.match('Chrome'))))/* || true */;\nexport const IS_FIREFOX = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\n\nexport const IS_MOBILE_SAFARI = IS_SAFARI && IS_APPLE_MOBILE;\n\nexport const IS_MOBILE = (navigator.maxTouchPoints === undefined || navigator.maxTouchPoints > 0) && navigator.userAgent.search(/iOS|iPhone OS|Android|BlackBerry|BB10|Series ?[64]0|J2ME|MIDP|opera mini|opera mobi|mobi.+Gecko|Windows Phone/i) != -1;\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// export function findUpClassName(el: any, className: string): T;\nexport default function findUpClassName(el: EventTarget | {closest: (selector: string) => any}, className: string): HTMLElement {\n return (el as any).closest('.' + className);\n /* if(el.classList.contains(className)) return el; // 03.02.2020\n\n while(el.parentElement) {\n el = el.parentElement;\n if(el.classList.contains(className))\n return el;\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\n// * Jolly Cobra's schedulers\nimport {NoneToVoidFunction} from '../types';\n\n/*\nexport function throttleWithTickEnd(fn: F) {\n return throttleWith(onTickEnd, fn);\n}\n\nexport function throttleWithNow(fn: F) {\n return throttleWith(runNow, fn);\n}\n\nexport function onTickEnd(cb: NoneToVoidFunction) {\n Promise.resolve().then(cb);\n}\n\nfunction runNow(fn: NoneToVoidFunction) {\n fn();\n} */\n\nlet fastRafCallbacks: NoneToVoidFunction[] | undefined;\nexport function fastRaf(callback: NoneToVoidFunction) {\n if(!fastRafCallbacks) {\n fastRafCallbacks = [callback];\n\n requestAnimationFrame(() => {\n const currentCallbacks = fastRafCallbacks!;\n fastRafCallbacks = undefined;\n currentCallbacks.forEach((cb) => cb());\n });\n } else {\n fastRafCallbacks.push(callback);\n }\n}\n\nlet fastRafConventionalCallbacks: NoneToVoidFunction[] | undefined, processing = false;\nexport function fastRafConventional(callback: NoneToVoidFunction) {\n if(!fastRafConventionalCallbacks) {\n fastRafConventionalCallbacks = [callback];\n\n requestAnimationFrame(() => {\n processing = true;\n for(let i = 0; i < fastRafConventionalCallbacks.length; ++i) {\n fastRafConventionalCallbacks[i]();\n }\n\n fastRafConventionalCallbacks = undefined;\n processing = false;\n });\n } else if(processing) {\n callback();\n } else {\n fastRafConventionalCallbacks.push(callback);\n }\n}\n\nlet rafPromise: Promise;\nexport function fastRafPromise() {\n if(rafPromise) return rafPromise;\n\n rafPromise = new Promise((resolve) => fastRaf(() => resolve()));\n rafPromise.then(() => {\n rafPromise = undefined;\n });\n\n return rafPromise;\n}\n\nexport function doubleRaf() {\n return new Promise((resolve) => {\n fastRaf(() => {\n fastRaf(resolve);\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 {doubleRaf} from '../schedulers';\n\nexport default function fixSafariStickyInput(input: HTMLElement) {\n input.style.transform = 'translateY(-99999px)';\n /* input.style.position = 'fixed';\n input.style.top = '-99999px';\n input.style.left = '0'; */\n input.focus();\n\n // setTimeout(() => {\n doubleRaf().then(() => {\n // fastSmoothScroll(findUpClassName(input, 'scrollable-y') || window as any, document.activeElement as HTMLElement, 'start', 4, undefined, FocusDirection.Static);\n /* input.style.position = '';\n input.style.top = ''; */\n input.style.transform = '';\n // fastSmoothScroll(findUpClassName(input, 'scrollable-y') || window as any, document.activeElement as HTMLElement, 'start', 4, undefined, FocusDirection.Static);\n\n /* setTimeout(() => {\n fastSmoothScroll(findUpClassName(input, 'scrollable-y') || window as any, document.activeElement as HTMLElement, 'start', 4);\n }, 50); */\n });\n // }, 0);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\nimport {IS_MOBILE, IS_SAFARI} from '../../environment/userAgent';\nimport findUpClassName from './findUpClassName';\nimport fixSafariStickyInput from './fixSafariStickyInput';\n\nexport const IS_STICKY_INPUT_BUGGED = IS_SAFARI && IS_MOBILE && IS_TOUCH_SUPPORTED && false;\n\nif(IS_STICKY_INPUT_BUGGED) {\n const key: 'clientY' | 'pageY' = 'clientY';\n let startY = 0;\n const o = {capture: true, passive: false};\n const onTouchMove = (e: TouchEvent) => {\n const touch = e.touches[0];\n\n // console.log('touchmove y', touch[key], startY);\n\n const scrollable = findUpClassName(touch.target, 'scrollable-y');\n if(scrollable) {\n const y = touch[key];\n const scrolled = startY - y;\n\n /* if(y < startY) {\n startY = y;\n } */\n\n const scrollTop = scrollable.scrollTop;\n const scrollHeight = scrollable.scrollHeight;\n const clientHeight = scrollable.clientHeight;\n const nextScrollTop = scrollTop ? Math.round(scrollTop + scrollable.clientHeight + scrolled) : scrollTop + scrolled;\n // const needCancel = scrollHeight !== clientHeight ? (scrollTop && diff <= 1) || (scrollTop - diff) < 0 : true;\n const needCancel = scrollHeight === clientHeight || nextScrollTop >= scrollHeight || nextScrollTop <= 0;\n if(needCancel) {\n e.preventDefault();\n }\n\n // console.log('touchmove with scrollable', scrollTop, startY, scrolled, nextScrollTop, needCancel, e.cancelable);\n } else {\n e.preventDefault();\n\n // console.log('touchmove no scrollable', e, touch);\n }\n\n // if(e.target === document.documentElement || e.target === document.body) e.preventDefault();\n };\n\n // let el = document.createElement('div');\n // document.body.prepend(el);\n // let a = 0;\n\n // let hasFocus = false;\n let lastFocusOutTimeStamp = 0;\n document.addEventListener('focusin', (e) => {\n if(!(e.target as HTMLElement).classList.contains('is-sticky-input-bugged') || (e.timeStamp - lastFocusOutTimeStamp) < 50/* && document.activeElement === input */) {\n return;\n }\n\n // console.log('focusin', e, e.timeStamp);\n\n // hasFocus = true;\n // document.body.classList.add('is-keyboard-opened');\n\n // el.innerText = 'focusin ' + ++a;\n\n /* a < 2 && */fixSafariStickyInput(e.target as HTMLElement);\n\n document.addEventListener('touchmove', onTouchMove, o);\n document.addEventListener('touchstart', (e) => {\n if(e.touches.length > 1) return;\n const touchStart = e.touches[0];\n\n startY = touchStart[key];\n });\n }, {passive: true});\n\n document.addEventListener('focusout', (e) => {\n // console.log('focusout', e, e.timeStamp);\n document.removeEventListener('touchmove', onTouchMove, o);\n\n lastFocusOutTimeStamp = e.timeStamp;\n\n // el.innerText = 'focusout ' + ++a;\n\n // if(hasFocus) {\n // hasFocus = false;\n // document.body.classList.remove('is-keyboard-opened');\n // }\n }, {passive: true});\n\n document.addEventListener('visibilitychange', () => {\n // console.log('window visibilitychange');\n if(document.activeElement &&\n document.activeElement.classList.contains('is-sticky-input-bugged') &&\n (document.activeElement as HTMLElement).blur) {\n fixSafariStickyInput(document.activeElement as HTMLElement);\n }\n\n /* blurActiveElement();\n window.scrollTo(0, 0);\n setVH(); */\n }, {passive: true});\n}\n\nexport default function fixSafariStickyInputFocusing(input: HTMLElement) {\n if(!IS_STICKY_INPUT_BUGGED) return;\n input.classList.add('is-sticky-input-bugged');\n}\n","const IS_EMOJI_SUPPORTED = navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i) !== -1/* && false *//* || true */;\n\nexport default IS_EMOJI_SUPPORTED;\n","export default function pause(ms: number) {\n return new Promise((resolve) => {\n setTimeout(resolve, ms);\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\nexport function makeWorkerURL(url: string | URL) {\n if(!(url instanceof URL)) {\n url = new URL(url + '', location.href);\n }\n\n if(location.search && url.protocol !== 'blob:') {\n const params = new URLSearchParams(location.search);\n params.forEach((value, key) => {\n (url as URL).searchParams.set(key, value);\n });\n }\n\n // exclude useless params\n (url as URL).searchParams.delete('swfix');\n\n return url;\n}\n\nexport default function setWorkerProxy() {\n // * hook worker constructor to set search parameters (test, debug, etc)\n const workerHandler = {\n construct(target: any, args: any) {\n args[0] = makeWorkerURL(args[0]);\n return new target(...args);\n }\n };\n\n [\n Worker,\n typeof(SharedWorker) !== 'undefined' && SharedWorker\n ].filter(Boolean).forEach((w) => {\n window[w.name as any] = new Proxy(w, workerHandler);\n });\n}\n\nsetWorkerProxy();\n","export default function toggleAttributePolyfill() {\n if(!Element.prototype.toggleAttribute) {\n Element.prototype.toggleAttribute = function(name, force) {\n if(force !== void 0) force = !!force;\n\n if(this.hasAttribute(name)) {\n if(force) return true;\n\n this.removeAttribute(name);\n return false;\n }\n if(force === false) return false;\n\n this.setAttribute(name, '');\n return true;\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 type {MyDialogFilter} from '../storages/filters';\n\n/**\n * Legacy Webogram's format, don't change dcID to camelCase. date is timestamp\n */\nexport type UserAuth = {dcID: number | string, date: number, id: PeerId};\nexport type REAL_FOLDER_ID = 0 | 1;\n\nexport const NULL_PEER_ID: PeerId = 0;\nexport const REPLIES_PEER_ID: PeerId = 1271266957;\nexport const REPLIES_HIDDEN_CHANNEL_ID: ChatId = 777;\nexport const HIDDEN_PEER_ID: PeerId = 2666000;\nexport const SERVICE_PEER_ID: PeerId = 777000;\nexport const MUTE_UNTIL = 0x7FFFFFFF;\nexport const BOT_START_PARAM = '';\nexport const MAX_FILE_SAVE_SIZE = 20 * 1024 * 1024;\nexport const THUMB_TYPE_FULL = '';\nexport const TOPIC_COLORS = [0x6FB9F0, 0xFFD67E, 0xCB86DB, 0x8EEE98, 0xFF93B2, 0xFB6F5F];\nexport const ATTACH_MENU_BOT_ICON_NAME = 'default_static';\nexport const MESSAGE_ID_OFFSET = 0x100000000;\nexport const GENERAL_TOPIC_ID = MESSAGE_ID_OFFSET + 1;\nexport const CAN_HIDE_TOPIC = false;\nexport const T_ME_PREFIXES = new Set(['web', 'k', 'z', 'a']);\nexport const SEND_WHEN_ONLINE_TIMESTAMP = 0x7FFFFFFE;\nexport const SERVER_IMAGE_MIME_TYPES = new Set(['image/jpeg', 'image/png', 'image/bmp', 'image/gif']);\nexport const STARS_CURRENCY = 'XTR';\n\nexport const FOLDER_ID_ALL: REAL_FOLDER_ID = 0;\nexport const FOLDER_ID_ARCHIVE: REAL_FOLDER_ID = 1;\nexport const REAL_FOLDERS: Set = new Set([FOLDER_ID_ALL, FOLDER_ID_ARCHIVE]);\nexport const START_LOCAL_ID = Math.max(...Array.from(REAL_FOLDERS)) + 1 as MyDialogFilter['localId'];\n\nexport const TEST_NO_STORIES = false;\nexport const TEST_NO_SAVED = false;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// import { MOUNT_CLASS_TO } from \"../config/debug\";\nimport type {ArgumentTypes, SuperReturnType} from '../types';\n\n// class EventSystem {\n// wm: WeakMap>> = new WeakMap();\n\n// add(target: any, event: any, listener: any) {\n// let listeners = this.wm.get(target);\n// if (listeners === undefined) {\n// listeners = {};\n// }\n// let listenersForEvent = listeners[event];\n// if (listenersForEvent === undefined) {\n// listenersForEvent = new Set();\n// }\n// listenersForEvent.add(listener);\n// listeners[event] = listenersForEvent;\n// //target.addEventListener(event, listener);\n// this.wm.set(target, listeners);\n// };\n\n// remove(target: any, event: any, listener: any) {\n// let listeners = this.wm.get(target);\n// if (!listeners) return;\n// let listenersForEvent = listeners[event];\n// if (!listenersForEvent) return;\n// listenersForEvent.delete(listener);\n// };\n\n// /* fire(target, event) {\n// let listeners = this.wm.get(target);\n// if (!listeners) return;\n// let listenersForEvent = listeners[event];\n// if (!listenersForEvent) return;\n// for (let handler of handlers) {\n// setTimeout(handler, 0, event, target); // we use a setTimeout here because we want event triggering to be asynchronous.\n// }\n// }; */\n// }\n\n// console.log = () => {};\n\n// const e = new EventSystem();\n// MOUNT_CLASS_TO.e = e;\n\nexport type EventListenerListeners = Record;\n// export type EventListenerListeners = Record any>;\n// export type EventListenerListeners = {[name in string]: Function};\n\n/**\n * Better not to remove listeners during setting\n * Should add listener callback only once\n */\n\ntype ListenerObject = {callback: T, options: boolean | AddEventListenerOptions};\n\n// type EventLitenerCallback = (data: T) =>\n// export default class EventListenerBase {\nexport default class EventListenerBase {\n protected listeners: Partial<{\n [k in keyof Listeners]: Set>\n }>;\n protected listenerResults: Partial<{\n [k in keyof Listeners]: ArgumentTypes\n }>;\n\n private reuseResults: boolean;\n\n constructor(reuseResults?: boolean) {\n this._constructor(reuseResults);\n }\n\n public _constructor(reuseResults?: boolean): any {\n this.reuseResults = reuseResults;\n this.listeners = {};\n this.listenerResults = {};\n }\n\n public addEventListener(name: T, callback: Listeners[T], options?: boolean | AddEventListenerOptions) {\n const listenerObject: ListenerObject = {callback, options};\n (this.listeners[name] ??= new Set()).add(listenerObject); // ! add before because if you don't, you won't be able to delete it from callback\n\n if(this.listenerResults.hasOwnProperty(name)) {\n callback(...this.listenerResults[name]);\n\n if((options as AddEventListenerOptions)?.once) {\n this.listeners[name].delete(listenerObject);\n return;\n }\n }\n\n // e.add(this, name, {callback, once});\n }\n\n public addMultipleEventsListeners(obj: {\n [name in keyof Listeners]?: Listeners[name]\n }) {\n for(const i in obj) {\n this.addEventListener(i, obj[i]);\n }\n }\n\n public removeEventListener(\n name: T,\n callback: Listeners[T],\n options?: boolean | AddEventListenerOptions\n ) {\n if(this.listeners[name]) {\n for(const l of this.listeners[name]) {\n if(l.callback === callback) {\n this.listeners[name].delete(l);\n break;\n }\n }\n }\n // e.remove(this, name, callback);\n }\n\n protected invokeListenerCallback>(\n name: T,\n listener: L,\n ...args: ArgumentTypes\n ) {\n let result: any, error: any;\n try {\n result = listener.callback(...args);\n } catch(err) {\n error = err;\n // console.error('listener callback error', err);\n }\n\n if((listener.options as AddEventListenerOptions)?.once) {\n this.removeEventListener(name, listener.callback);\n }\n\n if(error) {\n throw error;\n }\n\n return result;\n }\n\n private _dispatchEvent(\n name: T,\n collectResults: boolean,\n ...args: ArgumentTypes\n ) {\n if(this.reuseResults) {\n this.listenerResults[name] = args;\n }\n\n const arr: Array> = collectResults && [];\n\n const listeners = this.listeners[name];\n if(listeners) {\n for(const listener of listeners) {\n const result = this.invokeListenerCallback(name, listener, ...args);\n if(arr) {\n arr.push(result);\n }\n }\n }\n\n return arr;\n }\n\n public dispatchResultableEvent(name: T, ...args: ArgumentTypes) {\n return this._dispatchEvent(name, true, ...args);\n }\n\n // * must be protected, but who cares\n public dispatchEvent(\n name: T,\n ...args: ArgumentTypes\n ) {\n // @ts-ignore\n this._dispatchEvent(name, false, ...args);\n }\n\n public cleanup() {\n this.listeners = {};\n this.listenerResults = {};\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport type {TransportType} from '../lib/mtproto/dcConfigurator';\n\nconst Modes = {\n test: location.search.indexOf('test=1') > 0/* || true */,\n debug: location.search.indexOf('debug=1') > 0,\n http: false,\n ssl: true, // location.search.indexOf('ssl=1') > 0 || location.protocol === 'https:' && location.search.indexOf('ssl=0') === -1,\n asServiceWorker: !!import.meta.env.VITE_MTPROTO_SW,\n transport: 'websocket' as TransportType,\n noSharedWorker: location.search.indexOf('noSharedWorker=1') > 0,\n multipleTransports: !!(import.meta.env.VITE_MTPROTO_AUTO && import.meta.env.VITE_MTPROTO_HAS_HTTP && import.meta.env.VITE_MTPROTO_HAS_WS)\n};\n\nif(import.meta.env.VITE_MTPROTO_HAS_HTTP) {\n const httpOnly = Modes.http = location.search.indexOf('http=1') > 0;\n if(httpOnly) {\n Modes.multipleTransports = false;\n }\n}\n\n// * start with HTTP first\nif(Modes.multipleTransports) {\n Modes.http = true;\n}\n\nif(Modes.http) {\n Modes.transport = 'https';\n}\n\nexport default Modes;\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 './modes';\n\nexport const IS_BETA = import.meta.env.DEV;\nexport const DEBUG = (IS_BETA || Modes.debug)/* && false */;\nconst ctx: any = typeof(window) !== 'undefined' ? window : self;\nexport const MOUNT_CLASS_TO: any = DEBUG || true/* && false */ ? ctx : {};\nexport default DEBUG;\n\n// let m = DEBUG;\n/* if(!DEBUG) {\n ctx.sandpitTurtle = () => {\n //if(!m) {\n for(let i in MOUNT_CLASS_TO) {\n ctx[i] = MOUNT_CLASS_TO[i];\n }\n //m = true;\n //}\n\n //DEBUG = !DEBUG;\n };\n} */\n\n/* export const superDebug = (object: any, key: string) => {\n var d = object[key];\n var beforeStr = '', afterStr = '';\n for(var r of d) {\n beforeStr += r.before.hex + '\\n';\n afterStr += r.after.hex + '\\n';\n }\n\n beforeStr = beforeStr.trim();\n afterStr = afterStr.trim();\n //var beforeStr = d.map((r) => r.before.hex).join('\\n');\n //var afterStr = d.map((r) => r.after.hex).join('\\n');\n\n var dada = (name: string, str: string) => {\n var a = document.createElement('a');\n a.target = '_blank';\n a.download = name + '.txt';\n a.href = URL.createObjectURL(new Blob([str], {\n type: 'text/plain'\n }));\n document.body.append(a);\n a.click();\n };\n\n dada(key + '_' + 'before', beforeStr);\n dada(key + '_' + 'after', afterStr);\n}\n\nMOUNT_CLASS_TO.superDebug = superDebug; */\n","const tabId = Date.now() % Math.random() * 100000000 | 0;\nexport default tabId;\n","export default function indexOfAndSplice(array: Array, item: T) {\n const idx = array.indexOf(item);\n const spliced = idx === -1 ? undefined : array.splice(idx, 1);\n return spliced?.[0];\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// в SW может быть сразу две переменных TRUE\nexport const IS_SERVICE_WORKER = typeof ServiceWorkerGlobalScope !== 'undefined' && self instanceof ServiceWorkerGlobalScope;\nexport const IS_WEB_WORKER = typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope && !IS_SERVICE_WORKER;\nexport const IS_WORKER = IS_WEB_WORKER || IS_SERVICE_WORKER;\n\nexport const getWindowClients = () => {\n return (self as any as ServiceWorkerGlobalScope)\n .clients\n .matchAll({includeUncontrolled: false, type: 'window'});\n};\n\nexport const getLastWindowClient = () => getWindowClients().then((windowClients) => windowClients.slice(-1)[0]);\n\nconst postMessage = (listener: WindowClient | DedicatedWorkerGlobalScope, ...args: any[]) => {\n try {\n // @ts-ignore\n listener.postMessage(...args);\n } catch(err) {\n console.error('[worker] postMessage error:', err, args);\n }\n};\n\nconst notifyServiceWorker = (all: boolean, ...args: any[]) => {\n getWindowClients().then((listeners) => {\n if(!listeners.length) {\n // console.trace('no listeners?', self, listeners);\n return;\n }\n\n listeners.slice(all ? 0 : -1).forEach((listener) => {\n postMessage(listener, ...args);\n });\n });\n};\n\nconst notifyWorker = (...args: any[]) => {\n postMessage(self as any as DedicatedWorkerGlobalScope, ...args);\n};\n\nconst noop = () => {};\n\nexport const notifySomeone = IS_SERVICE_WORKER ? notifyServiceWorker.bind(null, false) : (IS_WEB_WORKER ? notifyWorker : noop);\nexport const notifyAll = IS_SERVICE_WORKER ? notifyServiceWorker.bind(null, true) : (IS_WEB_WORKER ? notifyWorker : noop);\n","const CACHED_ERRORS: {[key in Error['type']]?: ApiError} = {};\nexport default function makeError(type: Error['type']) {\n return CACHED_ERRORS[type] ??= {\n type\n };\n}\n","const _logTimer = Date.now();\nexport default function dT() {\n return '[' + ((Date.now() - _logTimer) / 1000).toFixed(3) + ']';\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 DEBUG from '../config/debug';\nimport {IS_FIREFOX, IS_SAFARI} from '../environment/userAgent';\nimport {IS_SERVICE_WORKER, IS_WEB_WORKER} from '../helpers/context';\nimport dT from '../helpers/dT';\n\nexport enum LogTypes {\n None = 0,\n Error = 1,\n Warn = 2,\n Log = 4,\n Debug = 8\n};\n\nexport const LOG_LEVELS = [LogTypes.None, LogTypes.Error, LogTypes.Warn, LogTypes.Log, LogTypes.Debug];\n\nconst IS_WEBKIT = IS_SAFARI || IS_FIREFOX;\n\n// let getCallerFunctionNameFromLine: (line: string) => string;\n// if(IS_WEBKIT) {\n// getCallerFunctionNameFromLine = (line) => {\n// const splitted = line.split('@');\n// return splitted[0];\n// };\n// } else {\n// getCallerFunctionNameFromLine = (line: string) => {\n// const splitted = line.trim().split(' ');\n// if(splitted.length === 3) {\n// return splitted[1].slice(splitted[1].lastIndexOf('.') + 1);\n// }\n// };\n// }\n\nconst STYLES_SUPPORTED = !IS_WEBKIT;\n// const LINE_INDEX = IS_WEBKIT ? 2 : 3;\n\n// function getCallerFunctionName() {\n// const stack = new Error().stack;\n// const lines = stack.split('\\n');\n// const line = lines[LINE_INDEX] || lines[lines.length - 1];\n// // const match = line.match(/\\.([^\\.]+?)\\s/);\n// // line = match ? match[1] : line.trim();\n// const caller = getCallerFunctionNameFromLine(line) || '';\n// return '[' + caller + ']';\n// }\n\nexport const LOGGER_STYLES = {\n reset: '\\x1b[0m',\n bright: '\\x1b[1m',\n dim: '\\x1b[2m',\n underscore: '\\x1b[4m',\n blink: '\\x1b[5m',\n reverse: '\\x1b[7m',\n hidden: '\\x1b[8m',\n // Foreground (text) colors\n fg: {\n black: '\\x1b[30m',\n red: '\\x1b[31m',\n green: '\\x1b[32m',\n yellow: '\\x1b[33m',\n blue: '\\x1b[34m',\n magenta: '\\x1b[35m',\n cyan: '\\x1b[36m',\n white: '\\x1b[37m'\n },\n // Background colors\n bg: {\n black: '\\x1b[40m',\n red: '\\x1b[41m',\n green: '\\x1b[42m',\n yellow: '\\x1b[43m',\n blue: '\\x1b[44m',\n magenta: '\\x1b[45m',\n cyan: '\\x1b[46m',\n white: '\\x1b[47m'\n }\n};\n\nexport type Logger = {\n (...args: any[]): void;\n warn(...args: any[]): void;\n info(...args: any[]): void;\n error(...args: any[]): void;\n trace(...args: any[]): void;\n debug(...args: any[]): void;\n assert(...args: any[]): void;\n // log(...args: any[]): void;\n group(...args: any[]): void;\n groupCollapsed(...args: any[]): void;\n groupEnd(...args: any[]): void;\n setPrefix(newPrefix: string): void;\n setLevel(level: 0 | 1 | 2 | 3 | 4): void;\n bindPrefix(prefix: string, type?: LogTypes): Logger;\n};\n\nconst methods: ['debug' | 'info' | 'warn' | 'error' | 'assert' | 'trace'/* | 'log' */ | 'group' | 'groupCollapsed' | 'groupEnd', LogTypes][] = [\n ['debug', LogTypes.Debug],\n ['info', LogTypes.Log],\n ['warn', LogTypes.Warn],\n ['error', LogTypes.Error],\n ['assert', LogTypes.Error],\n ['trace', LogTypes.Log],\n ['group', LogTypes.Log],\n ['groupCollapsed', LogTypes.Log],\n ['groupEnd', LogTypes.Log]\n // [\"log\", LogTypes.Log]\n];\n\nexport function logger(prefix: string, type: LogTypes = LogTypes.Log | LogTypes.Warn | LogTypes.Error, ignoreDebugReset = false, style = ''): Logger {\n let originalPrefix: string;\n if(!DEBUG && !ignoreDebugReset/* || true */) {\n type = LogTypes.Error;\n }\n\n if(!STYLES_SUPPORTED) {\n style = '';\n } else if(!style) {\n if(IS_SERVICE_WORKER) style = LOGGER_STYLES.fg.yellow;\n else if(IS_WEB_WORKER) style = LOGGER_STYLES.fg.cyan;\n }\n\n const originalStyle = style;\n if(style) style = `%s ${style}%s`;\n else style = '%s';\n\n // level = LogLevels.log | LogLevels.warn | LogLevels.error | LogLevels.debug\n\n const log: Logger = function(...args: any[]) {\n return type & LogTypes.Log && console.log(style, dT(), prefix, /* getCallerFunctionName(), */ ...args);\n } as any;\n\n methods.forEach(([method, logType]) => {\n log[method] = function(...args: any[]) {\n return type & logType && console[method](style, dT(), prefix, /* getCallerFunctionName(), */ ...args);\n };\n });\n\n log.setPrefix = function(newPrefix: string) {\n originalPrefix = newPrefix;\n prefix = '[' + newPrefix + ']';\n };\n\n log.setPrefix(prefix);\n\n log.setLevel = function(level: 0 | 1 | 2 | 3 | 4) {\n type = LOG_LEVELS.slice(0, level + 1).reduce((acc, v) => acc | v, 0) as any;\n };\n\n const prefixCache: {[prefix: string]: Logger} = {};\n log.bindPrefix = function(prefix: string, _type = type) {\n return prefixCache[prefix] ??= logger(\n // `${originalPrefix}] ${LOGGER_STYLES.fg.magenta}[${prefix}`,\n `${originalPrefix}] ${STYLES_SUPPORTED && originalStyle ? LOGGER_STYLES.reset : ''}[${prefix}`,\n // `${originalPrefix}] [${prefix}`,\n _type,\n ignoreDebugReset,\n // originalStyle || LOGGER_STYLES.reset\n originalStyle\n // LOGGER_STYLES.reset\n );\n };\n\n return log;\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 DEBUG from '../../config/debug';\nimport tabId from '../../config/tabId';\nimport ctx from '../../environment/ctx';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport {IS_WORKER} from '../../helpers/context';\nimport EventListenerBase from '../../helpers/eventListenerBase';\nimport makeError from '../../helpers/makeError';\nimport {Awaited, WorkerTaskTemplate, WorkerTaskVoidTemplate} from '../../types';\nimport {logger} from '../logger';\n\ntype SuperMessagePortTask = WorkerTaskTemplate & {\n transfer?: Transferable[]\n};\n\ninterface InvokeTask extends SuperMessagePortTask {\n type: 'invoke',\n payload: WorkerTaskVoidTemplate & {withAck?: boolean, void?: boolean}\n}\n\ninterface ResultTask extends SuperMessagePortTask {\n type: 'result',\n payload: {\n taskId: number,\n result?: any,\n error?: any\n }\n}\n\ninterface AckTask extends SuperMessagePortTask {\n type: 'ack',\n payload: {\n cached: boolean,\n taskId: number\n result?: any,\n error?: any,\n }\n}\n\ninterface PingTask extends SuperMessagePortTask {\n type: 'ping'\n}\n\ninterface PongTask extends SuperMessagePortTask {\n type: 'pong'\n}\n\ninterface BatchTask extends SuperMessagePortTask {\n type: 'batch',\n payload: Task[]\n}\n\ninterface CloseTask extends SuperMessagePortTask {\n type: 'close'\n}\n\n// interface OpenTask extends SuperMessagePortTask {\n// type: 'open'\n// }\n\ninterface LockTask extends SuperMessagePortTask {\n type: 'lock',\n payload: string\n}\n\ntype Task = InvokeTask | ResultTask | AckTask | PingTask | PongTask | BatchTask | CloseTask/* | OpenTask */ | LockTask;\ntype TaskMap = {\n [type in Task as type['type']]?: (task: Extract, source: MessageEventSource, event: MessageEvent) => void | Promise\n};\n\nexport type AckedResult = {\n cached: boolean,\n result: Promise\n};\n// export type AckedResult = {\n// cached: true,\n// result: T\n// } | {\n// cached: false,\n// result: Promise\n// };\n\ntype ListenPort = WindowProxy | MessagePort | ServiceWorker | Worker | ServiceWorkerContainer;\ntype SendPort = Pick/* WindowProxy | MessagePort | ServiceWorker | Worker */;\n\nexport type MessageListenPort = ListenPort;\nexport type MessageSendPort = SendPort;\n\ntype ListenerCallback = (payload: any, source: MessageEventSource, event: MessageEvent) => any;\ntype Listeners = Record;\n\nconst USE_LOCKS = true;\nconst USE_BATCHING = true;\n\n// const PING_INTERVAL = DEBUG && false ? 0x7FFFFFFF : 5000;\n// const PING_TIMEOUT = DEBUG && false ? 0x7FFFFFFF : 10000;\n\nexport default class SuperMessagePort<\n Workers extends Listeners,\n Masters extends Listeners,\n IsMaster extends boolean,\n Receive extends Listeners = IsMaster extends true ? Masters : Workers,\n Send extends Listeners = IsMaster extends true ? Workers : Masters\n> extends EventListenerBase {\n protected listenPorts: Array;\n protected sendPorts: Array;\n protected pingResolves: Map void>;\n\n protected taskId: number;\n protected awaiting: {\n [id: number]: {\n resolve: any,\n reject: any,\n taskType: string,\n port?: SendPort\n }\n };\n protected pending: Map;\n\n protected log: ReturnType;\n protected debug: boolean;\n protected releasingPending: boolean;\n\n protected processTaskMap: TaskMap;\n\n protected onPortDisconnect: (source: MessageEventSource) => void;\n // protected onPortConnect: (source: MessageEventSource) => void;\n\n protected heldLocks: Map void, id: string}>;\n protected requestedLocks: Map;\n\n constructor(protected logSuffix?: string) {\n super(false);\n\n this.listenPorts = [];\n this.sendPorts = [];\n this.pingResolves = new Map();\n this.taskId = 0;\n this.awaiting = {};\n this.pending = new Map();\n this.log = logger('MP' + (logSuffix ? '-' + logSuffix : ''));\n this.debug = DEBUG;\n this.heldLocks = new Map();\n this.requestedLocks = new Map();\n\n this.processTaskMap = {\n result: this.processResultTask,\n ack: this.processAckTask,\n invoke: this.processInvokeTask,\n ping: this.processPingTask,\n pong: this.processPongTask,\n close: this.processCloseTask,\n // open: this.processOpenTask,\n lock: this.processLockTask,\n batch: this.processBatchTask\n };\n }\n\n public setOnPortDisconnect(callback: (source: MessageEventSource) => void) {\n this.onPortDisconnect = callback;\n }\n\n // public setOnPortConnect(callback: (source: MessageEventSource) => void) {\n // this.onPortConnect = callback;\n // }\n\n public attachPort(port: MessageEventSource) {\n this.attachListenPort(port);\n this.attachSendPort(port);\n }\n\n public attachListenPort(port: ListenPort) {\n this.listenPorts.push(port);\n port.addEventListener('message', this.onMessage as any);\n }\n\n public attachSendPort(port: SendPort) {\n this.log.warn('attaching send port');\n\n (port as MessagePort).start?.();\n\n this.sendPorts.push(port);\n // this.sendPing(port);\n\n // const task = this.createTask('open', undefined);\n // this.postMessage(port, task);\n\n if(typeof(window) !== 'undefined' && USE_LOCKS) {\n if('locks' in navigator) {\n const id = ['lock', tabId, this.logSuffix || '', Math.random() * 0x7FFFFFFF | 0].join('-');\n this.log.warn('created lock', id);\n const promise = new Promise((resolve) => this.heldLocks.set(port, {resolve, id}))\n .then(() => this.heldLocks.delete(port));\n navigator.locks.request(id, () => {\n this.resendLockTask(port);\n return promise;\n });\n } else {\n window.addEventListener('beforeunload', () => {\n const task = this.createTask('close', undefined);\n this.postMessage(undefined, task);\n });\n }\n }\n\n this.releasePending();\n }\n\n public resendLockTask(port: SendPort) {\n const lock = this.heldLocks.get(port);\n if(!lock) {\n return;\n }\n\n this.pushTask(this.createTask('lock', lock.id), port);\n }\n\n // ! Can't rely on ping because timers can be suspended\n // protected sendPing(port: SendPort, loop = IS_WORKER) {\n // let timeout: number;\n // const promise = new Promise((resolve, reject) => {\n // this.pingResolves.set(port, resolve);\n // this.pushTask(this.createTask('ping', undefined), port);\n\n // timeout = ctx.setTimeout(() => {\n // reject();\n // }, PING_TIMEOUT);\n // });\n\n // promise.then(() => {\n // // this.log('got pong');\n\n // clearTimeout(timeout);\n // this.pingResolves.delete(port);\n\n // if(loop) {\n // this.sendPingWithTimeout(port);\n // }\n // }, () => {\n // this.pingResolves.delete(port);\n // this.detachPort(port);\n // });\n // }\n\n // protected sendPingWithTimeout(port: SendPort, timeout = PING_INTERVAL) {\n // ctx.setTimeout(() => {\n // if(!this.sendPorts.includes(port)) {\n // return;\n // }\n\n // this.sendPing(port);\n // }, timeout);\n // }\n\n public detachPort(port: ListenPort) {\n this.log.warn('disconnecting port');\n\n indexOfAndSplice(this.listenPorts, port);\n indexOfAndSplice(this.sendPorts, port as any);\n\n port.removeEventListener?.('message', this.onMessage as any);\n (port as MessagePort).close?.();\n\n this.onPortDisconnect?.(port as any);\n\n const heldLock = this.heldLocks.get(port as SendPort);\n heldLock?.resolve();\n\n const error = makeError('PORT_DISCONNECTED');\n for(const id in this.awaiting) {\n const task = this.awaiting[id];\n if(task.port === port) {\n task.reject(error);\n delete this.awaiting[id];\n }\n }\n }\n\n protected postMessage(port: SendPort | SendPort[], task: Task) {\n const ports = Array.isArray(port) ? port : (port ? [port] : this.sendPorts);\n ports.forEach((port) => {\n if(import.meta.env.MODE === 'test') {\n return;\n }\n\n port.postMessage(task, task.transfer as any);\n });\n }\n\n protected onMessage = (event: MessageEvent) => {\n const task: Task = event.data;\n // this.log('got message', task);\n\n const source: MessageEventSource = event.source || event.currentTarget as any; // can have no source\n\n // @ts-ignore\n this.processTaskMap[task.type](task, source, event);\n };\n\n protected async releasePending() {\n // return;\n\n if(/* !this.listenPorts.length || !this.sendPorts.length || */this.releasingPending) {\n return;\n }\n\n this.releasingPending = true;\n // const perf = performance.now();\n\n if(USE_BATCHING) {\n await Promise.resolve();\n }\n // await pause(0);\n\n this.debug && this.log.debug('releasing tasks, length:', this.pending.size/* , performance.now() - perf */);\n\n this.pending.forEach((portTasks, port) => {\n let tasks: Task[] = portTasks;\n if(USE_BATCHING) {\n let batchTask: BatchTask;\n tasks = [];\n portTasks.forEach((task) => {\n if(task.transfer) {\n batchTask = undefined;\n tasks.push(task);\n } else {\n if(!batchTask) {\n batchTask = this.createTask('batch', []);\n tasks.push(batchTask);\n }\n\n batchTask.payload.push(task);\n }\n });\n }\n\n const ports = port ? [port] : this.sendPorts;\n if(!ports.length) {\n return;\n }\n\n tasks.forEach((task) => {\n // if(USE_BATCHING && task.type === 'batch') {\n // this.log(`batching ${task.payload.length} tasks`);\n // }\n\n try {\n // if(IS_SERVICE_WORKER && !port) {\n // notifyAll(task);\n // } else {\n this.postMessage(ports, task);\n // }\n } catch(err) {\n this.log.error('postMessage error:', err, task, ports);\n }\n });\n\n this.pending.delete(port);\n });\n\n this.debug && this.log.debug('released tasks');\n\n this.releasingPending = false;\n }\n\n protected processResultTask = (task: ResultTask) => {\n const {taskId, result, error} = task.payload;\n const deferred = this.awaiting[taskId];\n if(!deferred) {\n return;\n }\n\n this.debug && this.log.debug('done', deferred.taskType, result, error);\n 'error' in task.payload ? deferred.reject(error) : deferred.resolve(result);\n delete this.awaiting[taskId];\n };\n\n protected processAckTask = (task: AckTask) => {\n const payload = task.payload;\n const deferred = this.awaiting[payload.taskId];\n if(!deferred) {\n return;\n }\n\n // * will finish the init promise with incoming result\n const previousResolve: (acked: AckedResult) => void = deferred.resolve;\n // const previousReject = deferred.reject;\n\n // if(payload.cached) {\n // if('result' in payload) {\n // previousResolve({\n // cached: true,\n // result: payload.result\n // });\n // } else {\n // previousReject(payload.error);\n // }\n // } else {\n // const ret: AckedResult = {\n // cached: false,\n // result: new Promise((resolve, reject) => {\n // deferred.resolve = resolve;\n // deferred.reject = reject;\n // })\n // };\n\n // previousResolve(ret);\n // }\n\n const ret: AckedResult = {\n cached: payload.cached,\n result: payload.cached ? ('result' in payload ? Promise.resolve(payload.result) : Promise.reject(payload.error)) : new Promise((resolve, reject) => {\n deferred.resolve = resolve;\n deferred.reject = reject;\n })\n };\n\n previousResolve(ret);\n\n if(payload.cached) {\n delete this.awaiting[payload.taskId];\n }\n };\n\n protected processPingTask = (task: PingTask, source: MessageEventSource, event: MessageEvent) => {\n this.pushTask(this.createTask('pong', undefined), event.source);\n };\n\n protected processPongTask = (task: PongTask, source: MessageEventSource, event: MessageEvent) => {\n const pingResolve = this.pingResolves.get(source);\n if(pingResolve) {\n this.pingResolves.delete(source);\n pingResolve();\n }\n };\n\n protected processCloseTask = (task: CloseTask, source: MessageEventSource, event: MessageEvent) => {\n this.detachPort(source);\n };\n\n protected processBatchTask = (task: BatchTask, source: MessageEventSource, event: MessageEvent) => {\n if(!USE_BATCHING) {\n return;\n }\n\n const newEvent: MessageEvent = {data: event.data, source: event.source, currentTarget: event.currentTarget} as any;\n task.payload.forEach((task) => {\n // @ts-ignore\n newEvent.data = task;\n this.onMessage(newEvent);\n });\n };\n\n // * it's just an 'open' callback, DO NOT attach port from here\n // protected processOpenTask = (task: OpenTask, source: MessageEventSource, event: MessageEvent) => {\n // this.onPortConnect?.(source);\n // };\n\n protected processLockTask = (task: LockTask, source: MessageEventSource, event: MessageEvent) => {\n const id = task.payload;\n if(this.requestedLocks.has(id)) {\n return;\n }\n\n this.requestedLocks.set(id, source);\n navigator.locks.request(id, () => {\n this.processCloseTask(undefined, source, undefined);\n this.requestedLocks.delete(id);\n });\n };\n\n protected processInvokeTask = async(task: InvokeTask, source: MessageEventSource, event: MessageEvent) => {\n const id = task.id;\n const innerTask = task.payload;\n\n let resultTaskPayload: ResultTask['payload'];\n let resultTask: ResultTask, ackTask: AckTask;\n if(!innerTask.void) {\n resultTaskPayload = {taskId: id};\n resultTask = this.createTask('result', resultTaskPayload);\n }\n\n if(innerTask.withAck) {\n ackTask = this.createTask('ack', {\n taskId: id,\n cached: true\n });\n }\n\n let isPromise: boolean;\n try {\n const listeners = this.listeners[innerTask.type];\n if(!listeners?.size) {\n throw new Error('no listener');\n }\n\n const listener = listeners.values().next().value;\n\n // @ts-ignore\n let result = this.invokeListenerCallback(innerTask.type, listener, innerTask.payload, source, event);\n if(innerTask.void) {\n return;\n }\n\n isPromise = result instanceof Promise;\n\n if(ackTask) {\n const cached = !isPromise;\n ackTask.payload.cached = cached;\n if(cached) ackTask.payload.result = result;\n this.pushTask(ackTask, source);\n\n if(cached) {\n return;\n }\n }\n\n if(isPromise) {\n result = await result;\n }\n\n resultTaskPayload.result = result;\n } catch(error) {\n this.log.error('worker task error:', error, task);\n if(innerTask.void) {\n return;\n }\n\n if(ackTask && ackTask.payload.cached) {\n ackTask.payload.error = error;\n this.pushTask(ackTask, source);\n return;\n }\n\n resultTaskPayload.error = error;\n }\n\n this.pushTask(resultTask, source);\n };\n\n protected createTask[0]>(type: T, payload: K['payload'], transfer?: Transferable[]): K {\n return {\n type,\n payload,\n id: this.taskId++,\n transfer\n } as K;\n }\n\n protected createInvokeTask(type: string, payload: any, withAck?: boolean, _void?: boolean, transfer?: Transferable[]): InvokeTask {\n return this.createTask('invoke', {\n type,\n payload,\n withAck,\n void: _void\n }, transfer);\n }\n\n protected pushTask(task: Task, port?: SendPort) {\n let tasks = this.pending.get(port);\n if(!tasks) {\n this.pending.set(port, tasks = []);\n }\n\n tasks.push(task);\n this.releasePending();\n }\n\n public invokeVoid(type: T, payload: Parameters[0], port?: SendPort, transfer?: Transferable[]) {\n const task = this.createInvokeTask(type as string, payload, undefined, true, transfer);\n this.pushTask(task, port);\n }\n\n public invoke(type: T, payload: Parameters[0], withAck?: false, port?: SendPort, transfer?: Transferable[]): Promise>>;\n public invoke(type: T, payload: Parameters[0], withAck?: true, port?: SendPort, transfer?: Transferable[]): Promise>>>;\n public invoke(type: T, payload: Parameters[0], withAck?: boolean, port?: SendPort, transfer?: Transferable[]) {\n this.debug && this.log.debug('start', type, payload);\n\n let task: InvokeTask;\n const promise = new Promise>>((resolve, reject) => {\n task = this.createInvokeTask(type as string, payload, withAck, undefined, transfer);\n this.awaiting[task.id] = {resolve, reject, taskType: type as string, port};\n this.pushTask(task, port);\n });\n\n if(IS_WORKER) {\n promise.finally(() => {\n clearInterval(interval);\n });\n\n const interval = ctx.setInterval(() => {\n this.log.error('task still has no result', task, port);\n }, 60e3);\n } else if(false) {\n // let timedOut = false;\n const startTime = Date.now();\n promise.finally(() => {\n const elapsedTime = Date.now() - startTime;\n if(elapsedTime >= TIMEOUT) {\n this.log.error(`task was processing ${Date.now() - startTime}ms`, task.payload.payload, port);\n }/* else {\n clearTimeout(timeout);\n } */\n });\n\n const TIMEOUT = 10;\n // const timeout = ctx.setTimeout(() => {\n // timedOut = true;\n // // this.log.error(`task is processing more than ${TIMEOUT} milliseconds`, task, port);\n // }, TIMEOUT);\n }\n\n return promise;\n }\n\n public invokeExceptSource(type: T, payload: Parameters[0], source?: SendPort) {\n const ports = this.sendPorts.slice();\n indexOfAndSplice(ports, source);\n\n ports.forEach((target) => {\n this.invokeVoid(type, payload, target);\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 {MOUNT_CLASS_TO} from '../../config/debug';\nimport type {getEnvironment} from '../../environment/utils';\nimport type loadState from '../appManagers/utils/state/loadState';\nimport type {StoragesResults} from '../appManagers/utils/storages/loadStorages';\nimport type {LocalStorageProxyTask} from '../localStorage';\nimport type {Awaited} from '../../types';\nimport type {Mirrors, MirrorTaskPayload, NotificationBuildTaskPayload, TabState} from './mtprotoworker';\nimport type toggleStorages from '../../helpers/toggleStorages';\nimport SuperMessagePort from './superMessagePort';\n\nexport type MTProtoManagerTaskPayload = {name: string, method: string, args: any[]};\n\ntype MTProtoBroadcastEvent = {\n event: (payload: {name: string, args: any[]}, source: MessageEventSource) => void\n};\n\nexport default class MTProtoMessagePort extends SuperMessagePort<{\n environment: (environment: ReturnType) => void,\n crypto: (payload: {method: string, args: any[]}) => Promise,\n state: (payload: {userId: UserId} & Awaited> & {storagesResults?: StoragesResults}) => void,\n manager: (payload: MTProtoManagerTaskPayload) => any,\n toggleStorages: (payload: {enabled: boolean, clearWrite: boolean}) => ReturnType,\n serviceWorkerOnline: (online: boolean) => void,\n serviceWorkerPort: (payload: void, source: MessageEventSource, event: MessageEvent) => void,\n cryptoPort: (payload: void, source: MessageEventSource, event: MessageEvent) => void,\n createObjectURL: (blob: Blob) => string,\n tabState: (payload: TabState, source: MessageEventSource) => void,\n createProxyWorkerURLs: (payload: {originalUrl: string, blob: Blob}) => string[],\n} & MTProtoBroadcastEvent, {\n convertWebp: (payload: {fileName: string, bytes: Uint8Array}) => Promise,\n convertOpus: (payload: {fileName: string, bytes: Uint8Array}) => Promise,\n localStorageProxy: (payload: LocalStorageProxyTask['payload']) => Promise,\n mirror: (payload: MirrorTaskPayload) => void,\n notificationBuild: (payload: NotificationBuildTaskPayload) => void,\n receivedServiceMessagePort: (payload: void) => void,\n // hello: () => void\n} & MTProtoBroadcastEvent, Master> {\n private static INSTANCE: MTProtoMessagePort;\n\n constructor() {\n super('MTPROTO');\n\n MTProtoMessagePort.INSTANCE = this;\n\n MOUNT_CLASS_TO && (MOUNT_CLASS_TO.mtprotoMessagePort = this);\n }\n\n public static getInstance() {\n return this.INSTANCE as MTProtoMessagePort;\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 type {Message, StickerSet, Update, NotifyPeer, PeerNotifySettings, PollResults, Poll, WebPage, GroupCall, GroupCallParticipant, ReactionCount, MessagePeerReaction, PhoneCall, Config, Reaction, AttachMenuBot, PeerSettings, StoryItem, PeerStories, SavedDialog, SavedReactionTag} from '../layer';\nimport type {Dialog, ForumTopic, MessagesStorageKey, MyMessage} from './appManagers/appMessagesManager';\nimport type {MyDialogFilter} from './storages/filters';\nimport type {AnyDialog, Folder} from './storages/dialogs';\nimport type {UserTyping} from './appManagers/appProfileManager';\nimport type {MyDraftMessage} from './appManagers/appDraftsManager';\nimport type {ConnectionStatusChange} from './mtproto/connectionStatus';\nimport type {GroupCallId} from './appManagers/appGroupCallsManager';\nimport type {AppManagers} from './appManagers/managers';\nimport type {State} from '../config/state';\nimport type {Progress} from './appManagers/appDownloadManager';\nimport type {CallId} from './appManagers/appCallsManager';\nimport type {MyDocument} from './appManagers/appDocsManager';\nimport type {MTAppConfig} from './mtproto/appConfig';\nimport type StoriesCacheType from './appManagers/utils/stories/cacheType';\nimport type {StoriesListPosition} from './appManagers/appStoriesManager';\nimport type {ArgumentTypes} from '../types';\nimport {NULL_PEER_ID, UserAuth} from './mtproto/mtproto_config';\nimport EventListenerBase, {EventListenerListeners} from '../helpers/eventListenerBase';\nimport {MOUNT_CLASS_TO} from '../config/debug';\nimport MTProtoMessagePort from './mtproto/mtprotoMessagePort';\nimport {IS_WORKER} from '../helpers/context';\nimport {RtmpCallInstance} from './calls/rtmpCallsController';\n\nexport type BroadcastEvents = {\n 'chat_full_update': ChatId,\n 'chat_update': ChatId,\n 'chat_toggle_forum': {chatId: ChatId, enabled: boolean},\n 'chat_participant': Update.updateChannelParticipant,\n 'chat_participation': {chatId: ChatId, left: boolean},\n 'chat_requests': {requestsPending: number, recentRequesters: UserId[], chatId: ChatId}\n\n 'channel_update': ChatId,\n\n 'user_update': UserId,\n 'user_auth': UserAuth,\n 'user_full_update': UserId,\n\n 'attach_menu_bot': AttachMenuBot,\n\n 'emoji_status_change': void,\n\n 'peer_pinned_messages': {peerId: PeerId, mids?: number[], pinned?: boolean, unpinAll?: true},\n 'peer_pinned_hidden': {peerId: PeerId, maxId: number},\n 'peer_typings': {peerId: PeerId, threadId?: number, typings: UserTyping[]},\n 'peer_block': {peerId: PeerId, blocked?: boolean, blockedMyStoriesFrom?: boolean},\n 'peer_title_edit': {peerId: PeerId, threadId?: number},\n 'peer_bio_edit': PeerId,\n 'peer_deleted': PeerId, // left chat, deleted user dialog, left channel\n 'peer_full_update': PeerId,\n 'peer_settings': {peerId: PeerId, settings: PeerSettings},\n 'peer_stories': {peerId: PeerId, available: boolean},\n 'peer_stories_hidden': {peerId: PeerId, hidden: boolean},\n\n 'filter_delete': MyDialogFilter,\n 'filter_update': MyDialogFilter,\n 'filter_new': MyDialogFilter,\n 'filter_order': number[],\n 'filter_joined': MyDialogFilter,\n\n 'folder_unread': Omit,\n\n 'dialog_draft': {peerId: PeerId, dialog: Dialog | ForumTopic, drop: boolean, draft: MyDraftMessage | undefined},\n 'dialog_unread': {peerId: PeerId, dialog: Dialog | ForumTopic},\n 'dialog_flush': {peerId: PeerId, dialog: Dialog},\n 'dialog_drop': AnyDialog,\n 'dialog_migrate': {migrateFrom: PeerId, migrateTo: PeerId},\n // 'dialog_top': Dialog,\n 'dialog_notify_settings': Dialog | ForumTopic,\n // 'dialog_order': {dialog: Dialog, pos: number},\n 'dialogs_multiupdate': Map, saved?: Map}>,\n\n 'history_append': {storageKey: MessagesStorageKey, message: Message.message},\n 'history_update': {storageKey: MessagesStorageKey, message: MyMessage, sequential?: boolean},\n 'history_reply_markup': {peerId: PeerId},\n 'history_multiappend': MyMessage,\n // 'history_delete': {peerId: PeerId, msgs: Map},\n 'history_delete': {peerId: PeerId, msgs: Set},\n 'history_forbidden': PeerId,\n 'history_reload': PeerId,\n 'history_count': {historyKey: string, count: number},\n 'history_delete_key': {historyKey: string, mid: number},\n // 'history_request': void,\n\n 'message_edit': {storageKey: MessagesStorageKey, peerId: PeerId, mid: number, message: MyMessage},\n 'message_sent': {storageKey: MessagesStorageKey, tempId: number, tempMessage: any, mid: number, message: MyMessage},\n 'message_error': {storageKey: MessagesStorageKey, peerId: PeerId, tempId: number, error: ApiError},\n 'message_transcribed': {peerId: PeerId, mid: number, text: string, pending?: boolean},\n 'messages_views': {peerId: PeerId, mid: number, views: number}[],\n 'messages_reactions': {message: Message.message, changedResults: ReactionCount[], removedResults: ReactionCount[]}[],\n 'messages_pending': void,\n 'messages_read': void,\n 'messages_downloaded': {peerId: PeerId, mids: number[]},\n 'messages_media_read': {peerId: PeerId, mids: number[]},\n\n 'story_update': {peerId: PeerId, story: StoryItem, modifiedPinned?: boolean, modifiedArchive?: boolean, modifiedPinnedToTop?: boolean},\n 'story_deleted': {peerId: PeerId, id: number},\n 'story_expired': {peerId: PeerId, id: number},\n 'story_new': {peerId: PeerId, story: StoryItem, cacheType: StoriesCacheType, maxReadId: number},\n 'stories_stories': PeerStories,\n 'stories_read': {peerId: PeerId, maxReadId: number},\n 'stories_downloaded': {peerId: PeerId, ids: number[]},\n 'stories_position': {peerId: PeerId, position: StoriesListPosition},\n\n 'replies_updated': Message.message,\n 'replies_short_update': Message.message,\n\n 'scheduled_new': Message.message,\n 'scheduled_delete': {peerId: PeerId, mids: number[]},\n\n 'grouped_edit': {peerId: PeerId, groupedId: string, deletedMids: number[], messages: Message.message[]},\n\n 'stickers_installed': StickerSet.stickerSet,\n 'stickers_deleted': StickerSet.stickerSet,\n 'stickers_updated': {type: 'recent' | 'faved', stickers: MyDocument[]},\n 'stickers_top': Long,\n 'stickers_order': {type: 'masks' | 'emojis' | 'stickers', order: Long[]},\n 'sticker_updated': {type: 'recent' | 'faved', document: MyDocument, faved: boolean},\n\n 'gifs_updated': MyDocument[],\n 'gif_updated': {document: MyDocument, saved: boolean},\n\n 'state_cleared': void,\n 'state_synchronized': void,\n 'state_synchronizing': void,\n\n 'contacts_update': UserId,\n 'avatar_update': {peerId: PeerId, threadId?: number},\n 'poll_update': {poll: Poll, results: PollResults},\n 'invalidate_participants': ChatId,\n // 'channel_settings': {channelId: number},\n 'webpage_updated': {id: WebPage.webPage['id'], msgs: {peerId: PeerId, mid: number, isScheduled: boolean}[]},\n\n 'connection_status_change': ConnectionStatusChange,\n 'settings_updated': {key: string, value: any, settings: State['settings']},\n 'draft_updated': {peerId: PeerId, threadId: number, draft: MyDraftMessage | undefined, force?: boolean},\n\n 'background_change': void,\n\n 'privacy_update': Update.updatePrivacy,\n\n 'notify_settings': Update.updateNotifySettings,\n 'notify_peer_type_settings': {key: Exclude, settings: PeerNotifySettings},\n\n 'notification_reset': string,\n 'notification_cancel': string,\n\n 'language_change': string,\n\n 'theme_change': {x: number, y: number} | void,\n 'theme_changed': void,\n\n 'media_play': void,\n\n 'emoji_recent': {emoji: AppEmoji, deleted?: boolean},\n\n 'download_progress': Progress,\n 'document_downloading': DocId,\n 'document_downloaded': DocId,\n\n 'choosing_sticker': boolean\n\n 'group_call_update': GroupCall,\n 'group_call_participant': {groupCallId: GroupCallId, participant: GroupCallParticipant},\n // 'group_call_video_track_added': {instance: GroupCallInstance}\n\n 'call_update': PhoneCall,\n 'call_signaling': {callId: CallId, data: Uint8Array},\n\n 'rtmp_call_update': RtmpCallInstance,\n\n 'quick_reaction': Reaction,\n\n 'service_notification': Update.updateServiceNotification,\n\n 'logging_out': void,\n\n 'payment_sent': {peerId: PeerId, mid: number, receiptMessage: Message.messageService},\n\n 'web_view_result_sent': Long,\n\n 'premium_toggle': boolean,\n 'premium_toggle_private': {isNew: boolean, isPremium: boolean},\n\n 'saved_tags': {savedPeerId: PeerId, tags: SavedReactionTag[]},\n 'saved_tags_clear': void,\n\n 'stars_balance': Long,\n\n 'file_speed_limited': {increaseTimes: number, isUpload: boolean},\n\n 'config': Config,\n 'app_config': MTAppConfig,\n 'managers_ready': void // ! inner\n};\n\nexport type BroadcastEventsListeners = {\n [name in keyof BroadcastEvents]: (e: BroadcastEvents[name]) => void\n};\n\nexport class RootScope extends EventListenerBase {\n public myId: PeerId;\n private connectionStatus: {[name: string]: ConnectionStatusChange};\n public settings: State['settings'];\n public managers: AppManagers;\n public premium: boolean;\n\n constructor() {\n super();\n\n this.myId = NULL_PEER_ID;\n this.connectionStatus = {};\n this.premium = false;\n\n this.addEventListener('user_auth', ({id}) => {\n this.myId = id.toPeerId();\n });\n\n this.addEventListener('premium_toggle_private', ({isNew, isPremium}) => {\n this.premium = isPremium;\n if(!isNew) { // * only on change\n this.dispatchEventSingle('premium_toggle', isPremium);\n }\n });\n\n this.addEventListener('connection_status_change', (status) => {\n this.connectionStatus[status.name] = status;\n });\n\n this.dispatchEvent = (e, ...args) => {\n super.dispatchEvent(e, ...args);\n MTProtoMessagePort.getInstance().invokeVoid('event', {name: e as string, args});\n };\n\n if(!IS_WORKER) {\n this.addEventListener('settings_updated', ({settings}) => {\n this.settings = settings;\n });\n }\n }\n\n public getConnectionStatus() {\n return this.connectionStatus;\n }\n\n public getPremium() {\n return this.premium;\n }\n\n public dispatchEventSingle(\n name: T,\n ...args: ArgumentTypes\n ) {\n super.dispatchEvent(name, ...args);\n }\n}\n\nconst rootScope = new RootScope();\nMOUNT_CLASS_TO.rootScope = rootScope;\nexport default rootScope;\n","export default function noop() {}\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 noop from './noop';\n\nexport interface CancellablePromise extends Promise {\n resolve?: (value: T) => void,\n reject?: (...args: any[]) => void,\n cancel?: (reason?: any) => void,\n\n notify?: (...args: any[]) => void,\n notifyAll?: (...args: any[]) => void,\n lastNotify?: any,\n listeners?: Array<(...args: any[]) => void>,\n addNotifyListener?: (callback: (...args: any[]) => void) => void,\n\n isFulfilled?: boolean,\n isRejected?: boolean,\n\n onFinish?: () => void,\n _resolve?: (value: T) => void,\n _reject?: (...args: any[]) => void\n}\n\nconst deferredHelper = {\n isFulfilled: false,\n isRejected: false,\n\n notify: () => {},\n notifyAll: function(...args: any[]) {\n this.lastNotify = args;\n this.listeners?.forEach((callback: any) => callback(...args));\n },\n\n addNotifyListener: function(callback: (...args: any[]) => void) {\n if(this.lastNotify) {\n callback(...this.lastNotify);\n }\n\n (this.listeners ??= []).push(callback);\n },\n\n resolve: function(value) {\n if(this.isFulfilled || this.isRejected) return;\n\n this.isFulfilled = true;\n this._resolve(value);\n this.onFinish();\n },\n\n reject: function(...args) {\n if(this.isRejected || this.isFulfilled) return;\n\n this.isRejected = true;\n this._reject(...args);\n this.onFinish();\n },\n\n onFinish: function() {\n this.notify = this.notifyAll = this.lastNotify = null;\n if(this.listeners) this.listeners.length = 0;\n\n if(this.cancel) {\n this.cancel = noop;\n }\n }\n} as CancellablePromise;\n\nexport default function deferredPromise() {\n let resolve: (value: T) => void, reject: (...args: any[]) => void;\n const deferred: CancellablePromise = new Promise((_resolve, _reject) => {\n resolve = _resolve, reject = _reject;\n });\n\n Object.assign(deferred, deferredHelper);\n deferred._resolve = resolve;\n deferred._reject = reject;\n\n return deferred;\n}\n\nexport function bindPromiseToDeferred(promise: Promise, deferred: CancellablePromise) {\n promise.then(deferred.resolve.bind(deferred), deferred.reject.bind(deferred));\n}\n\n(self as any).deferredPromise = deferredPromise;\n","// * Jolly Cobra's schedulers\n\nimport {AnyToVoidFunction} from '../../types';\n\nexport default function throttle(\n fn: F,\n ms: number,\n shouldRunFirst = true\n) {\n let interval: number | null = null;\n let isPending: boolean;\n let args: Parameters;\n\n const clear = () => {\n clearInterval(interval!);\n interval = null;\n };\n\n const ret = (..._args: Parameters) => {\n isPending = true;\n args = _args;\n\n if(!interval) {\n if(shouldRunFirst) {\n isPending = false;\n // @ts-ignore\n fn(...args);\n }\n\n interval = setInterval(() => {\n if(!isPending) {\n clear();\n return;\n }\n\n isPending = false;\n // @ts-ignore\n fn(...args);\n }, ms) as any;\n }\n };\n\n ret.clear = clear;\n\n return ret;\n}\n","export default function safeAssign(object: T, fromObject: any) {\n if(fromObject) {\n for(const i in fromObject) {\n if(fromObject[i] !== undefined) {\n // @ts-ignore\n object[i] = fromObject[i];\n }\n }\n }\n\n return object;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport {Database} from '../../config/databases';\nimport Modes from '../../config/modes';\nimport makeError from '../../helpers/makeError';\nimport safeAssign from '../../helpers/object/safeAssign';\nimport {logger} from '../logger';\n\n/**\n * https://developer.mozilla.org/en-US/docs/Web/API/IDBObjectStore/createIndex\n */\nexport type IDBIndex = {\n indexName: string,\n keyPath: string,\n objectParameters: IDBIndexParameters\n};\n\nexport type IDBStore = {\n name: string,\n indexes?: IDBIndex[]\n};\n\nexport type IDBOptions = {\n name?: string,\n storeName: string,\n stores?: IDBStore[],\n version?: number\n};\n\nconst DEBUG = false;\n\nexport class IDB {\n private static INSTANCES: IDB[] = [];\n private openDbPromise: Promise;\n private db: IDBDatabase;\n private storageIsAvailable: boolean;\n private log: ReturnType;\n private name: string;\n private version: number;\n private stores: IDBStore[];\n\n constructor(db: Database) {\n safeAssign(this, db);\n\n if(Modes.test) {\n this.name += '_test';\n }\n\n this.storageIsAvailable = true;\n this.log = logger(['IDB', db.name].join('-'));\n this.log('constructor');\n\n this.openDatabase(true);\n\n IDB.INSTANCES.push(this);\n }\n\n public isAvailable() {\n return this.storageIsAvailable;\n }\n\n public openDatabase(createNew = false): Promise {\n if(this.openDbPromise && !createNew) {\n return this.openDbPromise;\n }\n\n const createIndexes = (os: IDBObjectStore, store: IDBStore) => {\n const indexNames = Array.from(os.indexNames);\n for(const indexName of indexNames) {\n os.deleteIndex(indexName);\n }\n\n if(!store.indexes?.length) {\n return;\n }\n\n for(const index of store.indexes) {\n if(os.indexNames.contains(index.indexName)) {\n continue;\n }\n\n os.createIndex(index.indexName, index.keyPath, index.objectParameters);\n }\n };\n\n const createObjectStore = (db: IDBDatabase, store: IDBStore) => {\n const os = db.createObjectStore(store.name);\n createIndexes(os, store);\n };\n\n try {\n var request = indexedDB.open(this.name, this.version);\n\n if(!request) {\n return Promise.reject();\n }\n } catch(error) {\n this.log.error('error opening db', (error as Error).message);\n this.storageIsAvailable = false;\n return Promise.reject(error);\n }\n\n let finished = false;\n setTimeout(() => {\n if(!finished) {\n request.onerror(makeError('IDB_CREATE_TIMEOUT') as Event);\n }\n }, 3000);\n\n return this.openDbPromise = new Promise((resolve, reject) => {\n request.onsuccess = (event) => {\n finished = true;\n const db = request.result;\n let calledNew = false;\n\n this.log('Opened');\n\n db.onerror = (error) => {\n this.storageIsAvailable = false;\n this.log.error('Error creating/accessing IndexedDB database', error);\n reject(error);\n };\n\n db.onclose = (e) => {\n this.log.error('closed:', e);\n !calledNew && this.openDatabase();\n };\n\n db.onabort = (e) => {\n this.log.error('abort:', e);\n const transaction = e.target as IDBTransaction;\n\n this.openDatabase(calledNew = true);\n\n if(transaction.onerror) {\n transaction.onerror(e);\n }\n\n db.close();\n };\n\n db.onversionchange = (e) => {\n this.log.error('onversionchange, lol?');\n };\n\n resolve(this.db = db);\n };\n\n request.onerror = (event) => {\n finished = true;\n this.storageIsAvailable = false;\n this.log.error('Error creating/accessing IndexedDB database', event);\n reject(event);\n };\n\n request.onupgradeneeded = (event) => {\n finished = true;\n this.log.warn('performing idb upgrade from', event.oldVersion, 'to', event.newVersion);\n\n const target = event.target as IDBOpenDBRequest;\n const db = target.result;\n this.stores.forEach((store) => {\n /* if(db.objectStoreNames.contains(store.name)) {\n //if(event.oldVersion === 1) {\n db.deleteObjectStore(store.name);\n //}\n } */\n\n if(!db.objectStoreNames.contains(store.name)) {\n createObjectStore(db, store);\n } else {\n const txn = target.transaction;\n const os = txn.objectStore(store.name);\n createIndexes(os, store);\n }\n });\n };\n });\n }\n\n public static create>(db: T) {\n return this.INSTANCES.find((instance) => instance.name === db.name) ?? new IDB(db);\n }\n\n public static closeDatabases(preserve?: IDB) {\n this.INSTANCES.forEach((storage) => {\n if(preserve && preserve === storage) {\n return;\n }\n\n const db = storage.db;\n if(db) {\n db.onclose = () => {};\n db.close();\n }\n });\n }\n}\n\nexport default class IDBStorage, StoreName extends string = T['stores'][0]['name']> {\n private log: ReturnType;\n private storeName: T['stores'][0]['name'];\n private idb: IDB;\n\n constructor(db: T, storeName: typeof db['stores'][0]['name']) {\n this.storeName = storeName;\n this.log = logger(['IDB', db.name, storeName].join('-'));\n this.idb = IDB.create(db);\n }\n\n /**\n * ! WARNING ! function requires at least one opened connection\n */\n /* public static clearObjectStores() {\n const storage = this.STORAGES[0];\n this.closeDatabases(storage);\n\n const names = Array.from(storage.db.objectStoreNames);\n const promises = names.map((name) => storage.clear(name));\n return Promise.all(promises);\n } */\n\n /* public static deleteDatabase() {\n this.closeDatabases();\n\n const storages = this.STORAGES;\n const dbNames = Array.from(new Set(storages.map((storage) => storage.name)));\n const promises = dbNames.map((dbName) => {\n return new Promise((resolve, reject) => {\n const deleteRequest = indexedDB.deleteDatabase(dbName);\n\n deleteRequest.onerror = () => {\n reject();\n };\n\n deleteRequest.onsuccess = () => {\n resolve();\n };\n });\n });\n\n return Promise.all(promises);\n } */\n\n public delete(entryName: string | string[], storeName?: StoreName): Promise {\n // return Promise.resolve();\n const isArray = Array.isArray(entryName);\n if(!isArray) {\n entryName = [].concat(entryName);\n }\n\n return this.getObjectStore('readwrite', (objectStore) => {\n const promises = (entryName as string[]).map((entryName) => objectStore.delete(entryName));\n return isArray ? promises : promises[0];\n }, DEBUG ? 'delete: ' + (entryName as string[]).join(', ') : '', storeName);\n }\n\n public clear(storeName?: StoreName): Promise {\n return this.getObjectStore('readwrite', (objectStore) => objectStore.clear(), DEBUG ? 'clear' : '', storeName);\n }\n\n public save(entryName: string | string[], value: any | any[], storeName?: StoreName) {\n // const handleError = (error: Error) => {\n // this.log.error('save: transaction error:', entryName, value, db, error, error && error.name);\n // if((!error || error.name === 'InvalidStateError')/* && false */) {\n // setTimeout(() => {\n // this.save(entryName, value);\n // }, 2e3);\n // } else {\n // //console.error('IndexedDB saveFile transaction error:', error, error && error.name);\n // }\n // };\n\n const isArray = Array.isArray(entryName);\n if(!isArray) {\n entryName = [].concat(entryName);\n value = [].concat(value);\n }\n\n return this.getObjectStore('readwrite', (objectStore) => {\n const promises = (entryName as string[]).map((entryName, idx) => objectStore.put(value[idx], entryName));\n return isArray ? promises : promises[0];\n }, DEBUG ? 'save: ' + (entryName as string[]).join(', ') : '', storeName);\n }\n\n // public saveFile(fileName: string, blob: Blob | Uint8Array) {\n // //return Promise.resolve(blobConstruct([blob]));\n // if(!(blob instanceof Blob)) {\n // blob = blobConstruct(blob);\n // }\n\n // return this.save(fileName, blob);\n // }\n\n /* public saveFileBase64(db: IDBDatabase, fileName: string, blob: Blob | any): Promise {\n if(this.getBlobSize(blob) > 10 * 1024 * 1024) {\n return Promise.reject();\n }\n\n if(!(blob instanceof Blob)) {\n var safeMimeType = blobSafeMimeType(blob.type || 'image/jpeg');\n var address = 'data:' + safeMimeType + ';base64,' + bytesToBase64(blob);\n return this.storagePutB64String(db, fileName, address).then(() => {\n return blob;\n });\n }\n\n try {\n var reader = new FileReader();\n } catch (e) {\n this.storageIsAvailable = false;\n return Promise.reject();\n }\n\n let promise = new Promise((resolve, reject) => {\n reader.onloadend = () => {\n this.storagePutB64String(db, fileName, reader.result as string).then(() => {\n resolve(blob);\n }, reject);\n }\n\n reader.onerror = reject;\n });\n\n\n try {\n reader.readAsDataURL(blob);\n } catch (e) {\n this.storageIsAvailable = false;\n return Promise.reject();\n }\n\n return promise;\n }\n\n public storagePutB64String(db: IDBDatabase, fileName: string, b64string: string) {\n try {\n var objectStore = db.transaction([this.storeName], 'readwrite')\n .objectStore(this.storeName);\n var request = objectStore.put(b64string, fileName);\n } catch(error) {\n this.storageIsAvailable = false;\n return Promise.reject(error);\n }\n\n return new Promise((resolve, reject) => {\n request.onsuccess = function(event) {\n resolve();\n };\n\n request.onerror = reject;\n });\n }\n\n public getBlobSize(blob: any) {\n return blob.size || blob.byteLength || blob.length;\n } */\n\n public get(entryName: string[], storeName?: StoreName): Promise;\n public get(entryName: string, storeName?: StoreName): Promise;\n public get(entryName: string | string[], storeName?: StoreName): Promise | Promise {\n // return Promise.reject();\n\n const isArray = Array.isArray(entryName);\n if(!isArray) {\n if(!entryName) {\n return undefined;\n }\n\n entryName = [].concat(entryName);\n } else if(!entryName.length) {\n return Promise.resolve([]) as any;\n }\n\n return this.getObjectStore('readonly', (objectStore) => {\n const promises = (entryName as string[]).map((entryName) => objectStore.get(entryName));\n return isArray ? promises : promises[0];\n }, DEBUG ? 'get: ' + (entryName as string[]).join(', ') : '', storeName);\n }\n\n private getObjectStore(\n mode: IDBTransactionMode,\n callback: (objectStore: IDBObjectStore) => IDBRequest | IDBRequest[],\n log?: string,\n storeName = this.storeName\n ) {\n let perf: number;\n\n if(log) {\n perf = performance.now();\n this.log(log + ': start');\n }\n\n return this.idb.openDatabase().then((db) => {\n return new Promise((resolve, reject) => {\n /* if(mode === 'readwrite') {\n return;\n } */\n\n // * https://developer.chrome.com/blog/indexeddb-durability-mode-now-defaults-to-relaxed\n const transaction = db.transaction([storeName], mode, {durability: 'relaxed'});\n\n const onError = () => {\n clearTimeout(timeout);\n reject(transaction.error);\n };\n\n // let resolved = false;\n const onComplete = (/* what: string */) => {\n clearTimeout(timeout);\n\n if(log) {\n this.log(log + ': end', performance.now() - perf/* , what */);\n }\n\n // if(resolved) {\n // return;\n // }\n\n // resolved = true;\n const results = requests.map((r) => r.result);\n resolve(isArray ? results : results[0]);\n };\n\n transaction.onerror = onError;\n\n // * have to wait while clearing or setting something\n const waitForTransactionComplete = mode === 'readwrite';\n if(waitForTransactionComplete) {\n transaction.oncomplete = () => onComplete(/* 'transaction' */);\n }\n\n const timeout = setTimeout(() => {\n this.log.error('transaction not finished', transaction, log);\n }, 10000);\n\n /* transaction.addEventListener('abort', (e) => {\n //handleError();\n this.log.error('IndexedDB: transaction abort!', transaction.error);\n }); */\n\n const callbackResult = callback(transaction.objectStore(storeName));\n\n const isArray = Array.isArray(callbackResult);\n const requests: IDBRequest[] = isArray ? callbackResult : [].concat(callbackResult) as any;\n\n if(waitForTransactionComplete) {\n return;\n }\n\n const length = requests.length;\n let left = length;\n\n const onRequestFinished = () => {\n if(transaction.error) {\n return;\n }\n\n if(!--left) {\n onComplete(/* 'requests' */);\n }\n };\n\n for(let i = 0; i < length; ++i) {\n const request = requests[i];\n request.onerror = onError;\n request.onsuccess = onRequestFinished;\n }\n });\n });\n }\n\n public getAll(storeName?: StoreName): Promise {\n return this.getObjectStore('readonly', (objectStore) => objectStore.getAll(), DEBUG ? 'getAll' : '', storeName);\n }\n\n /* public getAllKeys(): Promise> {\n console.time('getAllEntries');\n return this.openDatabase().then((db) => {\n var objectStore = db.transaction([this.storeName], 'readonly')\n .objectStore(this.storeName);\n var request = objectStore.getAllKeys();\n\n return new Promise((resolve, reject) => {\n request.onsuccess = function(event) {\n // @ts-ignore\n var result = event.target.result;\n resolve(result);\n console.timeEnd('getAllEntries');\n }\n\n request.onerror = reject;\n });\n });\n } */\n\n /* public isFileExists(fileName: string): Promise {\n console.time('isFileExists');\n return this.openDatabase().then((db) => {\n var objectStore = db.transaction([this.storeName], 'readonly')\n .objectStore(this.storeName);\n var request = objectStore.openCursor(fileName);\n\n return new Promise((resolve, reject) => {\n request.onsuccess = function(event) {\n // @ts-ignore\n var cursor = event.target.result;\n resolve(!!cursor);\n console.timeEnd('isFileExists');\n }\n\n request.onerror = reject;\n });\n });\n } */\n\n /* public getFileWriter(fileName: string, mimeType: string) {\n var fakeWriter = FileManager.getFakeFileWriter(mimeType, (blob) => {\n return this.saveFile(fileName, blob);\n });\n\n return Promise.resolve(fakeWriter);\n } */\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport {Database} from '../config/databases';\nimport {MOUNT_CLASS_TO} from '../config/debug';\n// import DATABASE_SESSION from \"../config/databases/session\";\nimport deferredPromise, {CancellablePromise} from '../helpers/cancellablePromise';\nimport {IS_WORKER} from '../helpers/context';\nimport throttle from '../helpers/schedulers/throttle';\n// import { WorkerTaskTemplate } from \"../types\";\nimport IDBStorage from './files/idb';\n\nfunction noop() {}\n\n/* export interface LocalStorageProxySetTask extends WorkerTaskTemplate {\n type: 'localStorageProxy',\n payload: {\n type: 'set',\n keys: string[],\n values: any[]\n }\n};\n\nexport interface LocalStorageProxyDeleteTask extends WorkerTaskTemplate {\n type: 'localStorageProxy',\n payload: {\n type: 'delete',\n keys: string[]\n }\n}; */\n\nconst THROTTLE_TIME = 16;\n\n/* Storage extends {[name: string]: any} *//* Storage extends Record */\nexport default class AppStorage<\n Storage extends Record,\n T extends Database\n> {\n private static STORAGES: AppStorage>[] = [];\n private storage: IDBStorage;// new CacheStorageController('session');\n\n // private cache: Partial<{[key: string]: Storage[typeof key]}> = {};\n private cache: Partial = {};\n private useStorage: boolean;\n private savingFreezed: boolean;\n\n private getPromises: Map> = new Map();\n private getThrottled: () => void;\n\n private keysToSet: Set = new Set();\n private saveThrottled: () => void;\n private saveDeferred = deferredPromise();\n\n private keysToDelete: Set = new Set();\n private deleteThrottled: () => void;\n private deleteDeferred = deferredPromise();\n\n constructor(private db: T, private storeName: typeof db['stores'][number]['name']) {\n this.storage = new IDBStorage(db, storeName);\n\n if(AppStorage.STORAGES.length) {\n this.useStorage = AppStorage.STORAGES[0].useStorage;\n } else {\n this.useStorage = true;\n }\n\n this.savingFreezed = false;\n\n AppStorage.STORAGES.push(this);\n\n this.saveThrottled = throttle(async() => {\n const deferred = this.saveDeferred;\n this.saveDeferred = deferredPromise();\n\n const set = this.keysToSet;\n if(set.size) {\n const keys = Array.from(set.values()) as string[];\n set.clear();\n\n const values = keys.map((key) => this.cache[key]);\n try {\n // console.log('setItem: will set', key/* , value */);\n // await this.cacheStorage.delete(key); // * try to prevent memory leak in Chrome leading to 'Unexpected internal error.'\n // await this.storage.save(key, new Response(value, {headers: {'Content-Type': 'application/json'}}));\n\n /* if(db === DATABASE_SESSION && !('localStorage' in self)) { // * support legacy Webogram's localStorage\n self.postMessage({\n type: 'localStorageProxy',\n payload: {\n type: 'set',\n keys,\n values\n }\n } as LocalStorageProxySetTask);\n } */\n\n await this.storage.save(keys, values);\n // console.log('setItem: have set', key/* , value */);\n } catch(e) {\n // this.useCS = false;\n console.error('[AS]: set error:', e, keys, values);\n }\n }\n\n deferred.resolve();\n\n if(set.size) {\n this.saveThrottled();\n }\n }, THROTTLE_TIME, false);\n\n this.deleteThrottled = throttle(async() => {\n const deferred = this.deleteDeferred;\n this.deleteDeferred = deferredPromise();\n\n const set = this.keysToDelete;\n if(set.size) {\n const keys = Array.from(set.values()) as string[];\n set.clear();\n\n try {\n /* if(db === DATABASE_SESSION && !('localStorage' in self)) { // * support legacy Webogram's localStorage\n self.postMessage({\n type: 'localStorageProxy',\n payload: {\n type: 'delete',\n keys\n }\n } as LocalStorageProxyDeleteTask);\n } */\n\n await this.storage.delete(keys);\n } catch(e) {\n console.error('[AS]: delete error:', e, keys);\n }\n }\n\n deferred.resolve();\n\n if(set.size) {\n this.deleteThrottled();\n }\n }, THROTTLE_TIME, false);\n\n this.getThrottled = throttle(async() => {\n const keys = Array.from(this.getPromises.keys());\n\n // const perf = performance.now();\n this.storage.get(keys as string[]).then((values) => {\n for(let i = 0, length = keys.length; i < length; ++i) {\n const key = keys[i];\n const deferred = this.getPromises.get(key);\n if(deferred) {\n // @ts-ignore\n deferred.resolve(this.cache[key] = values[i]);\n this.getPromises.delete(key);\n }\n }\n\n // console.log('[AS]: get time', keys, performance.now() - perf);\n }, (error: ApiError) => {\n const ignoreErrors: Set = new Set(['NO_ENTRY_FOUND', 'STORAGE_OFFLINE']);\n if(!ignoreErrors.has(error.type)) {\n this.useStorage = false;\n console.error('[AS]: get error:', error, keys, storeName);\n }\n\n for(let i = 0, length = keys.length; i < length; ++i) {\n const key = keys[i];\n const deferred = this.getPromises.get(key);\n if(deferred) {\n // deferred.reject(error);\n deferred.resolve(undefined);\n this.getPromises.delete(key);\n }\n }\n }).finally(() => {\n if(this.getPromises.size) {\n this.getThrottled();\n }\n });\n }, THROTTLE_TIME, false);\n }\n\n public isAvailable() {\n return this.useStorage;\n }\n\n public getCache() {\n return this.cache;\n }\n\n public getFromCache(key: T) {\n return this.cache[key];\n }\n\n public setToCache(key: keyof Storage, value: Storage[typeof key]) {\n return this.cache[key] = value;\n }\n\n public async get(key: T, useCache = true): Promise {\n if(this.cache.hasOwnProperty(key) && useCache) {\n return this.getFromCache(key);\n } else if(this.useStorage) {\n const r = this.getPromises.get(key);\n if(r) return r as any;\n\n const p = deferredPromise();\n this.getPromises.set(key, p as any);\n\n this.getThrottled();\n\n return p;\n }/* else {\n throw 'something went wrong';\n } */\n }\n\n public getAll() {\n return this.storage.getAll().catch(() => []);\n }\n\n public set(obj: Partial, onlyLocal = false) {\n // console.log('storageSetValue', obj, callback, arguments);\n\n const canUseStorage = this.useStorage && !onlyLocal && !this.savingFreezed;\n for(const key in obj) {\n if(obj.hasOwnProperty(key)) {\n const value = obj[key];\n this.setToCache(key, value);\n\n // let perf = /* DEBUG */false ? performance.now() : 0;\n // value = JSON.stringify(value);\n\n // if(perf) {\n // let elapsedTime = performance.now() - perf;\n // if(elapsedTime > 10) {\n // console.warn('LocalStorage set: stringify time by JSON.stringify:', elapsedTime, key);\n // }\n // }\n\n /* perf = performance.now();\n value = stringify(value);\n console.log('LocalStorage set: stringify time by own stringify:', performance.now() - perf); */\n\n if(canUseStorage) {\n this.keysToSet.add(key);\n this.keysToDelete.delete(key);\n this.saveThrottled();\n }\n }\n }\n\n return canUseStorage ? this.saveDeferred : Promise.resolve();\n }\n\n public delete(key: keyof Storage, saveLocal = false) {\n /* if(!this.cache.hasOwnProperty(key)) {\n return;\n } */\n\n // ! it is needed here\n key = '' + (key as string);\n\n if(!saveLocal) {\n delete this.cache[key];\n }\n\n if(this.useStorage) {\n this.keysToSet.delete(key);\n this.keysToDelete.add(key);\n this.deleteThrottled();\n }\n\n return this.useStorage ? this.deleteDeferred : Promise.resolve();\n }\n\n public clear(saveLocal = false) {\n if(!saveLocal) {\n for(const i in this.cache) {\n delete this.cache[i];\n }\n }\n\n return this.storage.clear().catch(noop);\n }\n\n public static toggleStorage(enabled: boolean, clearWrite: boolean) {\n return Promise.all(this.STORAGES.map((storage) => {\n storage.useStorage = enabled;\n\n if(!IS_WORKER || !clearWrite) {\n return;\n }\n\n if(!enabled) {\n storage.keysToSet.clear();\n storage.keysToDelete.clear();\n storage.getPromises.forEach((deferred) => deferred.resolve(undefined));\n storage.getPromises.clear();\n return storage.clear(true);\n } else {\n return storage.set(storage.cache);\n }\n })).catch(noop);\n }\n\n public static freezeSaving>(callback: () => any, names: T['stores'][number]['name'][]) {\n this.STORAGES.forEach((storage) => storage.savingFreezed = true);\n try {\n callback();\n } catch(err) {\n console.error('freezeSaving callback error:', err);\n }\n this.STORAGES.forEach((storage) => storage.savingFreezed = false);\n }\n\n /* public deleteDatabase() {\n return IDBStorage.deleteDatabase().catch(noop);\n } */\n}\n\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.AppStorage = AppStorage);\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 {Database} from '.';\nimport type {IDBIndex} from '../../lib/files/idb';\n\nconst DATABASE_STATE: Database<'session' | 'stickerSets' | 'users' | 'chats' | 'messages' | 'dialogs'> = {\n name: 'tweb',\n version: 7,\n stores: [{\n name: 'session'\n }, {\n name: 'stickerSets'\n }, {\n name: 'users'\n }, {\n name: 'chats'\n }, {\n name: 'dialogs'\n // indexes: [\n // ...(new Array(20 + 2).fill(0)).map((_, idx) => {\n // const name = `index_${idx}`;\n // const index: IDBIndex = {\n // indexName: name,\n // keyPath: name,\n // objectParameters: {}\n // };\n\n // return index\n // })\n // ]\n }, {\n name: 'messages'\n }]\n};\n\nexport default DATABASE_STATE;\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 {ChatSavedPosition} from './appManagers/appImManager';\nimport type {AppDraftsManager} from './appManagers/appDraftsManager';\nimport type {State} from '../config/state';\nimport {MOUNT_CLASS_TO} from '../config/debug';\nimport {LangPackDifference} from '../layer';\nimport AppStorage from './storage';\nimport DATABASE_STATE from '../config/databases/state';\n\nclass StateStorage extends AppStorage<{\n chatPositions: {\n [peerId_threadId: string]: ChatSavedPosition\n },\n langPack: LangPackDifference,\n drafts: AppDraftsManager['drafts'],\n user_auth: any, // support old webk format\n} & State, typeof DATABASE_STATE> {\n constructor() {\n super(DATABASE_STATE, 'session');\n }\n}\n\nconst stateStorage = new StateStorage();\nMOUNT_CLASS_TO.stateStorage = stateStorage;\nexport default stateStorage;\n","/**\n * ignores `undefined` properties\n */\nexport default function deepEqual(x: T, y: T, ignoreKeys?: (keyof T)[]): boolean {\n const ignoreSet = ignoreKeys && new Set(ignoreKeys);\n const okok = (obj: any) => Object.keys(obj).filter((key) => obj[key] !== undefined);\n const ok = ignoreKeys ? (obj: any) => okok(obj).filter((key) => !ignoreSet.has(key as any)) : okok,\n tx = typeof x,\n ty = typeof y;\n return x && y && tx === 'object' && tx === ty ? (\n ok(x).length === ok(y).length &&\n ok(x).every((key) => deepEqual((x as any)[key], (y as any)[key], ignoreKeys))\n ) : (x === y);\n}\n","export default function capitalizeFirstLetter(string: string) {\n return string.charAt(0).toUpperCase() + string.slice(1);\n}\n","const SKIP_PROTOCOLS: Set = new Set([\n 'javascript:'\n]);\nexport default function matchUrlProtocol(text: string) {\n if(!text) {\n return null;\n }\n\n try {\n const protocol = new URL(text).protocol;\n if(SKIP_PROTOCOLS.has(protocol)) {\n return null;\n }\n\n return protocol;\n } catch(err) {\n return null;\n }\n}\n","// Copyright Twitter Inc. Licensed under MIT\n// https://github.com/twitter/twemoji-parser/blob/master/LICENSE.md\n\nconst originalString = '((?:\\ud83d\\udc68\\ud83c\\udffb\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffc\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffd\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffe\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udfff\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffb\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffc-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffc\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffd\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83e\\uddd1\\ud83c\\udffe\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83e\\uddd1\\ud83c\\udfff\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udffe]|\\ud83d\\udc68\\ud83c\\udffb\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffb\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffc-\\udfff]|\\ud83d\\udc68\\ud83c\\udffc\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83d\\udc68\\ud83c\\udffd\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83d\\udc68\\ud83c\\udffe\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83d\\udc68\\ud83c\\udfff\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffe]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffc-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffc-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffe]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udffe]|\\ud83e\\uddd1\\ud83c\\udffb\\u200d\\u2764\\ufe0f?\\u200d\\ud83e\\uddd1\\ud83c[\\udffc-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffb\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffc\\u200d\\u2764\\ufe0f?\\u200d\\ud83e\\uddd1\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffd\\u200d\\u2764\\ufe0f?\\u200d\\ud83e\\uddd1\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83e\\uddd1\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffe\\u200d\\u2764\\ufe0f?\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83e\\uddd1\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udfff\\u200d\\u2764\\ufe0f?\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udffe]|\\ud83e\\uddd1\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68|\\ud83d\\udc69\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d[\\udc68\\udc69]|\\ud83e\\udef1\\ud83c\\udffb\\u200d\\ud83e\\udef2\\ud83c[\\udffc-\\udfff]|\\ud83e\\udef1\\ud83c\\udffc\\u200d\\ud83e\\udef2\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83e\\udef1\\ud83c\\udffd\\u200d\\ud83e\\udef2\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83e\\udef1\\ud83c\\udffe\\u200d\\ud83e\\udef2\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83e\\udef1\\ud83c\\udfff\\u200d\\ud83e\\udef2\\ud83c[\\udffb-\\udffe]|\\ud83d\\udc68\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68|\\ud83d\\udc69\\u200d\\u2764\\ufe0f?\\u200d\\ud83d[\\udc68\\udc69]|\\ud83e\\uddd1\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1|\\ud83d\\udc6b\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc6c\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc6d\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc8f\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc91\\ud83c[\\udffb-\\udfff]|\\ud83e\\udd1d\\ud83c[\\udffb-\\udfff]|\\ud83d[\\udc6b-\\udc6d\\udc8f\\udc91]|\\ud83e\\udd1d)|(?:\\ud83d[\\udc68\\udc69]|\\ud83e\\uddd1)(?:\\ud83c[\\udffb-\\udfff])?\\u200d(?:\\u2695\\ufe0f?|\\u2696\\ufe0f?|\\u2708\\ufe0f?|\\ud83c[\\udf3e\\udf73\\udf7c\\udf84\\udf93\\udfa4\\udfa8\\udfeb\\udfed]|\\ud83d[\\udcbb\\udcbc\\udd27\\udd2c\\ude80\\ude92]|\\ud83e[\\uddaf-\\uddb3\\uddbc\\uddbd])|(?:\\ud83c[\\udfcb\\udfcc]|\\ud83d[\\udd74\\udd75]|\\u26f9)(?:(?:\\ud83c[\\udffb-\\udfff]|\\ufe0f?)\\u200d[\\u2640\\u2642]\\ufe0f?)|(?:\\ud83c[\\udfc3\\udfc4\\udfca]|\\ud83d[\\udc6e\\udc70\\udc71\\udc73\\udc77\\udc81\\udc82\\udc86\\udc87\\ude45-\\ude47\\ude4b\\ude4d\\ude4e\\udea3\\udeb4-\\udeb6]|\\ud83e[\\udd26\\udd35\\udd37-\\udd39\\udd3d\\udd3e\\uddb8\\uddb9\\uddcd-\\uddcf\\uddd4\\uddd6-\\udddd])(?:\\ud83c[\\udffb-\\udfff])?\\u200d[\\u2640\\u2642]\\ufe0f?|(?:\\ud83d\\udc68\\u200d\\ud83d\\udc68\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc68\\u200d\\ud83d\\udc68\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc68\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc68\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc69\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc69\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc68\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc68\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc68\\u200d\\ud83d\\udc68\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc68\\u200d\\ud83d\\udc69\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc69\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc69\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc69\\u200d\\ud83d\\udc69\\u200d\\ud83d[\\udc66\\udc67]|\\ud83c\\udff3\\ufe0f?\\u200d\\u26a7\\ufe0f?|\\ud83c\\udff3\\ufe0f?\\u200d\\ud83c\\udf08|\\ud83d\\ude36\\u200d\\ud83c\\udf2b\\ufe0f?|\\u2764\\ufe0f?\\u200d\\ud83d\\udd25|\\u2764\\ufe0f?\\u200d\\ud83e\\ude79|\\ud83c\\udff4\\u200d\\u2620\\ufe0f?|\\ud83d\\udc15\\u200d\\ud83e\\uddba|\\ud83d\\udc3b\\u200d\\u2744\\ufe0f?|\\ud83d\\udc41\\u200d\\ud83d\\udde8|\\ud83d\\udc68\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc69\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc6f\\u200d\\u2640\\ufe0f?|\\ud83d\\udc6f\\u200d\\u2642\\ufe0f?|\\ud83d\\ude2e\\u200d\\ud83d\\udca8|\\ud83d\\ude35\\u200d\\ud83d\\udcab|\\ud83e\\udd3c\\u200d\\u2640\\ufe0f?|\\ud83e\\udd3c\\u200d\\u2642\\ufe0f?|\\ud83e\\uddde\\u200d\\u2640\\ufe0f?|\\ud83e\\uddde\\u200d\\u2642\\ufe0f?|\\ud83e\\udddf\\u200d\\u2640\\ufe0f?|\\ud83e\\udddf\\u200d\\u2642\\ufe0f?|\\ud83d\\udc08\\u200d\\u2b1b)|[#*0-9]\\ufe0f??\\u20e3|(?:[©®\\u2122\\u265f]\\ufe0f?)|(?:\\ud83c[\\udc04\\udd70\\udd71\\udd7e\\udd7f\\ude02\\ude1a\\ude2f\\ude37\\udf21\\udf24-\\udf2c\\udf36\\udf7d\\udf96\\udf97\\udf99-\\udf9b\\udf9e\\udf9f\\udfcd\\udfce\\udfd4-\\udfdf\\udff3\\udff5\\udff7]|\\ud83d[\\udc3f\\udc41\\udcfd\\udd49\\udd4a\\udd6f\\udd70\\udd73\\udd76-\\udd79\\udd87\\udd8a-\\udd8d\\udda5\\udda8\\uddb1\\uddb2\\uddbc\\uddc2-\\uddc4\\uddd1-\\uddd3\\udddc-\\uddde\\udde1\\udde3\\udde8\\uddef\\uddf3\\uddfa\\udecb\\udecd-\\udecf\\udee0-\\udee5\\udee9\\udef0\\udef3]|[\\u203c\\u2049\\u2139\\u2194-\\u2199\\u21a9\\u21aa\\u231a\\u231b\\u2328\\u23cf\\u23ed-\\u23ef\\u23f1\\u23f2\\u23f8-\\u23fa\\u24c2\\u25aa\\u25ab\\u25b6\\u25c0\\u25fb-\\u25fe\\u2600-\\u2604\\u260e\\u2611\\u2614\\u2615\\u2618\\u2620\\u2622\\u2623\\u2626\\u262a\\u262e\\u262f\\u2638-\\u263a\\u2640\\u2642\\u2648-\\u2653\\u2660\\u2663\\u2665\\u2666\\u2668\\u267b\\u267f\\u2692-\\u2697\\u2699\\u269b\\u269c\\u26a0\\u26a1\\u26a7\\u26aa\\u26ab\\u26b0\\u26b1\\u26bd\\u26be\\u26c4\\u26c5\\u26c8\\u26cf\\u26d1\\u26d3\\u26d4\\u26e9\\u26ea\\u26f0-\\u26f5\\u26f8\\u26fa\\u26fd\\u2702\\u2708\\u2709\\u270f\\u2712\\u2714\\u2716\\u271d\\u2721\\u2733\\u2734\\u2744\\u2747\\u2757\\u2763\\u2764\\u27a1\\u2934\\u2935\\u2b05-\\u2b07\\u2b1b\\u2b1c\\u2b50\\u2b55\\u3030\\u303d\\u3297\\u3299])(?:\\ufe0f?|(?!\\ufe0e))|(?:(?:\\ud83c[\\udfcb\\udfcc]|\\ud83d[\\udd74\\udd75\\udd90]|[\\u261d\\u26f7\\u26f9\\u270c\\u270d])(?:\\ufe0f?|(?!\\ufe0e))|(?:\\ud83c[\\udf85\\udfc2-\\udfc4\\udfc7\\udfca]|\\ud83d[\\udc42\\udc43\\udc46-\\udc50\\udc66-\\udc69\\udc6e\\udc70-\\udc78\\udc7c\\udc81-\\udc83\\udc85-\\udc87\\udcaa\\udd7a\\udd95\\udd96\\ude45-\\ude47\\ude4b-\\ude4f\\udea3\\udeb4-\\udeb6\\udec0\\udecc]|\\ud83e[\\udd0c\\udd0f\\udd18-\\udd1c\\udd1e\\udd1f\\udd26\\udd30-\\udd39\\udd3d\\udd3e\\udd77\\uddb5\\uddb6\\uddb8\\uddb9\\uddbb\\uddcd-\\uddcf\\uddd1-\\udddd\\udec3-\\udec5\\udef0-\\udef6]|[\\u270a\\u270b]))(?:\\ud83c[\\udffb-\\udfff])?|(?:\\ud83c\\udff4\\udb40\\udc67\\udb40\\udc62\\udb40\\udc65\\udb40\\udc6e\\udb40\\udc67\\udb40\\udc7f|\\ud83c\\udff4\\udb40\\udc67\\udb40\\udc62\\udb40\\udc73\\udb40\\udc63\\udb40\\udc74\\udb40\\udc7f|\\ud83c\\udff4\\udb40\\udc67\\udb40\\udc62\\udb40\\udc77\\udb40\\udc6c\\udb40\\udc73\\udb40\\udc7f|\\ud83c\\udde6\\ud83c[\\udde8-\\uddec\\uddee\\uddf1\\uddf2\\uddf4\\uddf6-\\uddfa\\uddfc\\uddfd\\uddff]|\\ud83c\\udde7\\ud83c[\\udde6\\udde7\\udde9-\\uddef\\uddf1-\\uddf4\\uddf6-\\uddf9\\uddfb\\uddfc\\uddfe\\uddff]|\\ud83c\\udde8\\ud83c[\\udde6\\udde8\\udde9\\uddeb-\\uddee\\uddf0-\\uddf5\\uddf7\\uddfa-\\uddff]|\\ud83c\\udde9\\ud83c[\\uddea\\uddec\\uddef\\uddf0\\uddf2\\uddf4\\uddff]|\\ud83c\\uddea\\ud83c[\\udde6\\udde8\\uddea\\uddec\\udded\\uddf7-\\uddfa]|\\ud83c\\uddeb\\ud83c[\\uddee-\\uddf0\\uddf2\\uddf4\\uddf7]|\\ud83c\\uddec\\ud83c[\\udde6\\udde7\\udde9-\\uddee\\uddf1-\\uddf3\\uddf5-\\uddfa\\uddfc\\uddfe]|\\ud83c\\udded\\ud83c[\\uddf0\\uddf2\\uddf3\\uddf7\\uddf9\\uddfa]|\\ud83c\\uddee\\ud83c[\\udde8-\\uddea\\uddf1-\\uddf4\\uddf6-\\uddf9]|\\ud83c\\uddef\\ud83c[\\uddea\\uddf2\\uddf4\\uddf5]|\\ud83c\\uddf0\\ud83c[\\uddea\\uddec-\\uddee\\uddf2\\uddf3\\uddf5\\uddf7\\uddfc\\uddfe\\uddff]|\\ud83c\\uddf1\\ud83c[\\udde6-\\udde8\\uddee\\uddf0\\uddf7-\\uddfb\\uddfe]|\\ud83c\\uddf2\\ud83c[\\udde6\\udde8-\\udded\\uddf0-\\uddff]|\\ud83c\\uddf3\\ud83c[\\udde6\\udde8\\uddea-\\uddec\\uddee\\uddf1\\uddf4\\uddf5\\uddf7\\uddfa\\uddff]|\\ud83c\\uddf4\\ud83c\\uddf2|\\ud83c\\uddf5\\ud83c[\\udde6\\uddea-\\udded\\uddf0-\\uddf3\\uddf7-\\uddf9\\uddfc\\uddfe]|\\ud83c\\uddf6\\ud83c\\udde6|\\ud83c\\uddf7\\ud83c[\\uddea\\uddf4\\uddf8\\uddfa\\uddfc]|\\ud83c\\uddf8\\ud83c[\\udde6-\\uddea\\uddec-\\uddf4\\uddf7-\\uddf9\\uddfb\\uddfd-\\uddff]|\\ud83c\\uddf9\\ud83c[\\udde6\\udde8\\udde9\\uddeb-\\udded\\uddef-\\uddf4\\uddf7\\uddf9\\uddfb\\uddfc\\uddff]|\\ud83c\\uddfa\\ud83c[\\udde6\\uddec\\uddf2\\uddf3\\uddf8\\uddfe\\uddff]|\\ud83c\\uddfb\\ud83c[\\udde6\\udde8\\uddea\\uddec\\uddee\\uddf3\\uddfa]|\\ud83c\\uddfc\\ud83c[\\uddeb\\uddf8]|\\ud83c\\uddfd\\ud83c\\uddf0|\\ud83c\\uddfe\\ud83c[\\uddea\\uddf9]|\\ud83c\\uddff\\ud83c[\\udde6\\uddf2\\uddfc]|\\ud83c[\\udccf\\udd8e\\udd91-\\udd9a\\udde6-\\uddff\\ude01\\ude32-\\ude36\\ude38-\\ude3a\\ude50\\ude51\\udf00-\\udf20\\udf2d-\\udf35\\udf37-\\udf7c\\udf7e-\\udf84\\udf86-\\udf93\\udfa0-\\udfc1\\udfc5\\udfc6\\udfc8\\udfc9\\udfcf-\\udfd3\\udfe0-\\udff0\\udff4\\udff8-\\udfff]|\\ud83d[\\udc00-\\udc3e\\udc40\\udc44\\udc45\\udc51-\\udc65\\udc6a\\udc6f\\udc79-\\udc7b\\udc7d-\\udc80\\udc84\\udc88-\\udc8e\\udc90\\udc92-\\udca9\\udcab-\\udcfc\\udcff-\\udd3d\\udd4b-\\udd4e\\udd50-\\udd67\\udda4\\uddfb-\\ude44\\ude48-\\ude4a\\ude80-\\udea2\\udea4-\\udeb3\\udeb7-\\udebf\\udec1-\\udec5\\uded0-\\uded2\\uded5-\\uded7\\udedd-\\udedf\\udeeb\\udeec\\udef4-\\udefc\\udfe0-\\udfeb\\udff0]|\\ud83e[\\udd0d\\udd0e\\udd10-\\udd17\\udd20-\\udd25\\udd27-\\udd2f\\udd3a\\udd3c\\udd3f-\\udd45\\udd47-\\udd76\\udd78-\\uddb4\\uddb7\\uddba\\uddbc-\\uddcc\\uddd0\\uddde-\\uddff\\ude70-\\ude74\\ude78-\\ude7c\\ude80-\\ude86\\ude90-\\udeac\\udeb0-\\udeba\\udec0-\\udec2\\uded0-\\uded9\\udee0-\\udee7]|[\\u23e9-\\u23ec\\u23f0\\u23f3\\u267e\\u26ce\\u2705\\u2728\\u274c\\u274e\\u2753-\\u2755\\u2795-\\u2797\\u27b0\\u27bf\\ue50a])|\\ufe0f)';\nexport default originalString;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport emojiRegExp from '../../vendor/emoji/regex';\nimport {MessageEntity} from '../../layer';\n\nconst EmojiHelper = {\n emojiMap: (code: string) => { return code; },\n shortcuts: [] as any,\n emojis: [] as any\n};\n\nexport const ALPHA_CHARS_REG_EXP = 'a-z' +\n '\\\\u00c0-\\\\u00d6\\\\u00d8-\\\\u00f6\\\\u00f8-\\\\u00ff' + // Latin-1\n '\\\\u0100-\\\\u024f' + // Latin Extended A and B\n '\\\\u0253\\\\u0254\\\\u0256\\\\u0257\\\\u0259\\\\u025b\\\\u0263\\\\u0268\\\\u026f\\\\u0272\\\\u0289\\\\u028b' + // IPA Extensions\n '\\\\u02bb' + // Hawaiian\n '\\\\u0300-\\\\u036f' + // Combining diacritics\n '\\\\u1e00-\\\\u1eff' + // Latin Extended Additional (mostly for Vietnamese)\n '\\\\u0400-\\\\u04ff\\\\u0500-\\\\u0527' + // Cyrillic\n '\\\\u2de0-\\\\u2dff\\\\ua640-\\\\ua69f' + // Cyrillic Extended A/B\n '\\\\u0591-\\\\u05bf\\\\u05c1-\\\\u05c2\\\\u05c4-\\\\u05c5\\\\u05c7' +\n '\\\\u05d0-\\\\u05ea\\\\u05f0-\\\\u05f4' + // Hebrew\n '\\\\ufb1d-\\\\ufb28\\\\ufb2a-\\\\ufb36\\\\ufb38-\\\\ufb3c\\\\ufb3e\\\\ufb40-\\\\ufb41' +\n '\\\\ufb43-\\\\ufb44\\\\ufb46-\\\\ufb4f' + // Hebrew Pres. Forms\n '\\\\u0610-\\\\u061a\\\\u0620-\\\\u065f\\\\u066e-\\\\u06d3\\\\u06d5-\\\\u06dc' +\n '\\\\u06de-\\\\u06e8\\\\u06ea-\\\\u06ef\\\\u06fa-\\\\u06fc\\\\u06ff' + // Arabic\n '\\\\u0750-\\\\u077f\\\\u08a0\\\\u08a2-\\\\u08ac\\\\u08e4-\\\\u08fe' + // Arabic Supplement and Extended A\n '\\\\ufb50-\\\\ufbb1\\\\ufbd3-\\\\ufd3d\\\\ufd50-\\\\ufd8f\\\\ufd92-\\\\ufdc7\\\\ufdf0-\\\\ufdfb' + // Pres. Forms A\n '\\\\ufe70-\\\\ufe74\\\\ufe76-\\\\ufefc' + // Pres. Forms B\n '\\\\u200c' + // Zero-Width Non-Joiner\n '\\\\u0e01-\\\\u0e3a\\\\u0e40-\\\\u0e4e' + // Thai\n '\\\\u1100-\\\\u11ff\\\\u3130-\\\\u3185\\\\uA960-\\\\uA97F\\\\uAC00-\\\\uD7AF\\\\uD7B0-\\\\uD7FF' + // Hangul (Korean)\n '\\\\u3003\\\\u3005\\\\u303b' + // Kanji/Han iteration marks\n '\\\\uff21-\\\\uff3a\\\\uff41-\\\\uff5a' + // full width Alphabet\n '\\\\uff66-\\\\uff9f' + // half width Katakana\n '\\\\uffa1-\\\\uffdc'; // half width Hangul (Korean)\nexport const ALPHA_NUMERIC_REG_EXP = '0-9\\_' + ALPHA_CHARS_REG_EXP;\nexport const DOMAIN_ADD_CHARS = '\\u00b7';\n// Based on Regular Expression for URL validation by Diego Perini\nexport const URL_ALPHANUMERIC_REG_EXP_PART = '[' + ALPHA_CHARS_REG_EXP + '0-9]';\nexport const URL_PROTOCOL_REG_EXP_PART = '((?:https?|ftp)://|mailto:)?';\nexport const URL_REG_EXP = URL_PROTOCOL_REG_EXP_PART +\n // user:pass authentication\n '(?:' + URL_ALPHANUMERIC_REG_EXP_PART + '{1,64}(?::' + URL_ALPHANUMERIC_REG_EXP_PART + '{0,64})?@)?' +\n '(?:' +\n // sindresorhus/ip-regexp\n '(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])(?:\\\\.(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])){3}' +\n '|' +\n // host name\n URL_ALPHANUMERIC_REG_EXP_PART + '[' + ALPHA_CHARS_REG_EXP + DOMAIN_ADD_CHARS + '0-9\\-]{0,64}' +\n // domain name\n '(?:\\\\.' + URL_ALPHANUMERIC_REG_EXP_PART + '[' + ALPHA_CHARS_REG_EXP + DOMAIN_ADD_CHARS + '0-9\\-]{0,64}){0,10}' +\n // TLD identifier\n '(?:\\\\.(xn--[0-9a-z]{2,16}|[' + ALPHA_CHARS_REG_EXP + ']{2,24}))' +\n ')' +\n // port number\n '(?::\\\\d{2,5})?' +\n // resource path\n '(?:/(?:\\\\S{0,255}[^\\\\s.;,(\\\\[\\\\]{}<>\"\\'])?)?';\nexport const URL_PROTOCOL_REG_EXP = new RegExp('^' + URL_PROTOCOL_REG_EXP_PART.slice(0, -1), 'i');\nexport const USERNAME_REG_EXP = '[a-zA-Z\\\\d_]{5,32}';\n// export const TIMESTAMP_REG_EXP = '(?:\\\\s|^)((?:\\\\d{1,2}:)?(?:[0-5]?[0-9]):(?:[0-5][0-9]))(?:\\\\s|$)';\nexport const TIMESTAMP_REG_EXP = '(?:\\\\s|^)((?:(\\\\d{1,2}):(?:[0-5]?[0-9])|(?:\\\\d{1,2}|\\\\d{3,})):(?:[0-5][0-9]))(?:\\\\s|$)';\nexport const BOT_COMMAND_REG_EXP = '\\\\/([a-zA-Z\\\\d_]{1,32})(?:@(' + USERNAME_REG_EXP + '))?(\\\\b|$)';\nexport const FULL_REG_EXP = new RegExp('(^| )(@)(' + USERNAME_REG_EXP + ')|(' + URL_REG_EXP + ')|(\\\\n)|(' + emojiRegExp + ')|(^|[\\\\s\\\\(\\\\]])(#[' + ALPHA_NUMERIC_REG_EXP + ']{2,64})|(^|\\\\s)' + BOT_COMMAND_REG_EXP + '|' + TIMESTAMP_REG_EXP + '', 'i');\nexport const EMAIL_REG_EXP = /^(([^<>()[\\]\\\\.,;:\\s@\\\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\\\"]+)*)|(\\\".+\\\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/;\n// const markdownTestRegExp = /[`_*@~]/;\nexport const MARKDOWN_REG_EXP = /(^|\\s|\\n)(````?)([\\s\\S]+?)(````?)([\\s\\n\\.,:?!;]|$)|(^|\\s|\\x01)(`|~~|\\*\\*|__|_-_|\\|\\|)([^\\n]+?)\\7([\\x01\\s\\.,:?!;]|$)|@(\\d+)\\s*\\((.+?)\\)|(\\[(.+?)\\]\\((.+?)\\))/m;\nexport const SITE_HASHTAGS: {[siteName: string]: string} = {\n 'Telegram': 'tg://search_hashtag?hashtag={1}',\n 'Twitter': 'https://twitter.com/hashtag/{1}',\n 'Instagram': 'https://instagram.com/explore/tags/{1}/',\n 'Google Plus': 'https://plus.google.com/explore/{1}'\n};\n\n// export const SITE_MENTIONS: {[siteName in 'Telegram' | 'Twitter' | 'Instagram' | 'GitHub']: string} = {\n// Telegram: '#{1}',\n// Twitter: 'https://twitter.com/{1}',\n// Instagram: 'https://instagram.com/{1}/',\n// GitHub: 'https://github.com/{1}'\n// };\n\nexport const MARKDOWN_ENTITIES: {[markdown: string]: MessageEntity['_']} = {\n '`': 'messageEntityCode',\n '``': 'messageEntityPre',\n '**': 'messageEntityBold',\n '__': 'messageEntityItalic',\n '~~': 'messageEntityStrike',\n '_-_': 'messageEntityUnderline',\n '||': 'messageEntitySpoiler'\n};\n\nexport const MARKDOWN_ENTITIES_TYPES = new Set(Object.values(MARKDOWN_ENTITIES));\n\nexport const PASS_CONFLICTING_ENTITIES: Set = new Set([\n 'messageEntityEmoji',\n 'messageEntityLinebreak',\n 'messageEntityCaret'\n]);\nexport const PASS_SINGLE_CONFLICTING_ENTITIES = new Set(PASS_CONFLICTING_ENTITIES);\nfor(const i in MARKDOWN_ENTITIES) {\n PASS_CONFLICTING_ENTITIES.add(MARKDOWN_ENTITIES[i]);\n}\n\nexport const PHONE_NUMBER_REG_EXP = /^\\+\\d+$/;\n\nexport const LOCAL_ENTITIES = new Set([\n 'messageEntityLinebreak',\n 'messageEntityCaret',\n 'messageEntityHighlight',\n 'messageEntityBotCommand',\n 'messageEntityTimestamp'\n]);\n\n/* export function parseEmojis(text: string) {\n return text.replace(/:([a-z0-9\\-\\+\\*_]+?):/gi, function (all, shortcut) {\n var emojiCode = EmojiHelper.shortcuts[shortcut]\n if (emojiCode !== undefined) {\n return EmojiHelper.emojis[emojiCode][0]\n }\n return all\n })\n} */\n\n\n/* export function replaceUrlEncodings(urlWithEncoded: string) {\n return urlWithEncoded.replace(/(%[A-Z\\d]{2})+/g, (str) => {\n try {\n return decodeURIComponent(str);\n } catch (e) {\n return str;\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 type addAnchorListener from '../../helpers/addAnchorListener';\nimport {PHONE_NUMBER_REG_EXP} from '.';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport matchUrlProtocol from './matchUrlProtocol';\nimport {T_ME_PREFIXES} from '../mtproto/mtproto_config';\n\nexport default function wrapUrl(url: string, unsafe?: number | boolean) {\n if(!matchUrlProtocol(url)) {\n url = 'https://' + url;\n }\n\n const out: {url: string, onclick?: Parameters[0]['name']} = {url};\n let tgMeMatch, telescoPeMatch, tgMatch;\n let onclick: typeof out['onclick'];\n /* if(unsafe === 2) {\n url = 'tg://unsafe_url?url=' + encodeURIComponent(url);\n } else */if((tgMeMatch = url.match(/^(?:https?:\\/\\/)?(?:(.+?)\\.)?(?:(?:web|k|z|a)\\.)?t(?:elegram)?\\.me(?:\\/(.+))?/))) {\n const u = new URL(url);\n let prefix = tgMeMatch[1];\n if(prefix && T_ME_PREFIXES.has(tgMeMatch[1])) {\n prefix = undefined;\n }\n\n if(prefix) {\n u.pathname = prefix + (u.pathname === '/' ? '' : u.pathname);\n }\n\n const fullPath = u.pathname.slice(1);\n const path = fullPath.split('/');\n\n if(path[0] && path[0][0] === '$' && path[0].length > 1) {\n onclick = 'invoice';\n } else if(/^\\+/.test(fullPath) && !PHONE_NUMBER_REG_EXP.test(fullPath)) { // second regexp is for phone numbers (t.me/+38050...)\n onclick = 'joinchat';\n } else if(path[0]) switch(path[0]) {\n case 'm':\n case 'addlist':\n case 'joinchat':\n case 'addstickers':\n case 'addemoji':\n case 'voicechat':\n case 'invoice':\n case 'boost':\n case 'giftcode':\n if(path.length !== 1 && !prefix) {\n onclick = path[0];\n break;\n }\n\n default:\n if(path.length <= 2 || path[1]?.match(/^\\d+(?:\\?(?:comment|thread)=\\d+)?$/) || path[1] === 's') {\n onclick = 'im';\n break;\n }\n\n break;\n }\n } else if((telescoPeMatch = url.match(/^(?:https?:\\/\\/)?telesco\\.pe\\/([^/?]+)\\/(\\d+)/))) {\n onclick = 'im';\n } else if((tgMatch = url.match(/tg:(?:\\/\\/)?(.+?)(?:\\?|$)/))) {\n onclick = 'tg_' + tgMatch[1] as any;\n }/* else if(unsafe) {\n url = 'tg://unsafe_url?url=' + encodeURIComponent(url);\n } */\n\n if(!(window as any)[onclick]) {\n onclick = undefined;\n }\n\n out.onclick = onclick;\n return out;\n}\n\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.wrapUrl = wrapUrl);\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// import I18n from '../../lib/langPack';\n\nexport default function setInnerHTML(elem: Element, html: string | DocumentFragment | Element) {\n setDirection(elem);\n if(html === undefined) {\n elem.replaceChildren();\n } else if(typeof(html) === 'string') {\n if(!html) elem.replaceChildren();\n else elem.textContent = html;\n } else {\n elem.replaceChildren(html);\n }\n}\n\nexport function setDirection(elem: Element) {\n // if(!I18n.isRTL) {\n elem.setAttribute('dir', 'auto');\n // }\n}\n\nexport function getDirection(): 'auto' {\n return 'auto';\n}\n","export default function setBlankToAnchor(anchor: HTMLAnchorElement) {\n anchor.target = '_blank';\n anchor.rel = 'noopener noreferrer';\n return anchor;\n}\n","let taskIdCounter = 1,\n isCallbackScheduled = false,\n isPerformingWork = false,\n taskQueue = [],\n currentTask = null,\n shouldYieldToHost = null,\n yieldInterval = 5,\n deadline = 0,\n maxYieldInterval = 300,\n scheduleCallback = null,\n scheduledCallback = null;\nconst maxSigned31BitInt = 1073741823;\nfunction setupScheduler() {\n const channel = new MessageChannel(),\n port = channel.port2;\n scheduleCallback = () => port.postMessage(null);\n channel.port1.onmessage = () => {\n if (scheduledCallback !== null) {\n const currentTime = performance.now();\n deadline = currentTime + yieldInterval;\n const hasTimeRemaining = true;\n try {\n const hasMoreWork = scheduledCallback(hasTimeRemaining, currentTime);\n if (!hasMoreWork) {\n scheduledCallback = null;\n } else port.postMessage(null);\n } catch (error) {\n port.postMessage(null);\n throw error;\n }\n }\n };\n if (navigator && navigator.scheduling && navigator.scheduling.isInputPending) {\n const scheduling = navigator.scheduling;\n shouldYieldToHost = () => {\n const currentTime = performance.now();\n if (currentTime >= deadline) {\n if (scheduling.isInputPending()) {\n return true;\n }\n return currentTime >= maxYieldInterval;\n } else {\n return false;\n }\n };\n } else {\n shouldYieldToHost = () => performance.now() >= deadline;\n }\n}\nfunction enqueue(taskQueue, task) {\n function findIndex() {\n let m = 0;\n let n = taskQueue.length - 1;\n while (m <= n) {\n const k = n + m >> 1;\n const cmp = task.expirationTime - taskQueue[k].expirationTime;\n if (cmp > 0) m = k + 1;else if (cmp < 0) n = k - 1;else return k;\n }\n return m;\n }\n taskQueue.splice(findIndex(), 0, task);\n}\nfunction requestCallback(fn, options) {\n if (!scheduleCallback) setupScheduler();\n let startTime = performance.now(),\n timeout = maxSigned31BitInt;\n if (options && options.timeout) timeout = options.timeout;\n const newTask = {\n id: taskIdCounter++,\n fn,\n startTime,\n expirationTime: startTime + timeout\n };\n enqueue(taskQueue, newTask);\n if (!isCallbackScheduled && !isPerformingWork) {\n isCallbackScheduled = true;\n scheduledCallback = flushWork;\n scheduleCallback();\n }\n return newTask;\n}\nfunction cancelCallback(task) {\n task.fn = null;\n}\nfunction flushWork(hasTimeRemaining, initialTime) {\n isCallbackScheduled = false;\n isPerformingWork = true;\n try {\n return workLoop(hasTimeRemaining, initialTime);\n } finally {\n currentTask = null;\n isPerformingWork = false;\n }\n}\nfunction workLoop(hasTimeRemaining, initialTime) {\n let currentTime = initialTime;\n currentTask = taskQueue[0] || null;\n while (currentTask !== null) {\n if (currentTask.expirationTime > currentTime && (!hasTimeRemaining || shouldYieldToHost())) {\n break;\n }\n const callback = currentTask.fn;\n if (callback !== null) {\n currentTask.fn = null;\n const didUserCallbackTimeout = currentTask.expirationTime <= currentTime;\n callback(didUserCallbackTimeout);\n currentTime = performance.now();\n if (currentTask === taskQueue[0]) {\n taskQueue.shift();\n }\n } else taskQueue.shift();\n currentTask = taskQueue[0] || null;\n }\n return currentTask !== null;\n}\n\nconst sharedConfig = {\n context: undefined,\n registry: undefined\n};\nfunction setHydrateContext(context) {\n sharedConfig.context = context;\n}\nfunction nextHydrateContext() {\n return {\n ...sharedConfig.context,\n id: `${sharedConfig.context.id}${sharedConfig.context.count++}-`,\n count: 0\n };\n}\n\nconst equalFn = (a, b) => a === b;\nconst $PROXY = Symbol(\"solid-proxy\");\nconst $TRACK = Symbol(\"solid-track\");\nconst $DEVCOMP = Symbol(\"solid-dev-component\");\nconst signalOptions = {\n equals: equalFn\n};\nlet ERROR = null;\nlet runEffects = runQueue;\nconst STALE = 1;\nconst PENDING = 2;\nconst UNOWNED = {\n owned: null,\n cleanups: null,\n context: null,\n owner: null\n};\nconst NO_INIT = {};\nvar Owner = null;\nlet Transition = null;\nlet Scheduler = null;\nlet ExternalSourceConfig = null;\nlet Listener = null;\nlet Updates = null;\nlet Effects = null;\nlet ExecCount = 0;\nfunction createRoot(fn, detachedOwner) {\n const listener = Listener,\n owner = Owner,\n unowned = fn.length === 0,\n current = detachedOwner === undefined ? owner : detachedOwner,\n root = unowned ? UNOWNED : {\n owned: null,\n cleanups: null,\n context: current ? current.context : null,\n owner: current\n },\n updateFn = unowned ? fn : () => fn(() => untrack(() => cleanNode(root)));\n Owner = root;\n Listener = null;\n try {\n return runUpdates(updateFn, true);\n } finally {\n Listener = listener;\n Owner = owner;\n }\n}\nfunction createSignal(value, options) {\n options = options ? Object.assign({}, signalOptions, options) : signalOptions;\n const s = {\n value,\n observers: null,\n observerSlots: null,\n comparator: options.equals || undefined\n };\n const setter = value => {\n if (typeof value === \"function\") {\n if (Transition && Transition.running && Transition.sources.has(s)) value = value(s.tValue);else value = value(s.value);\n }\n return writeSignal(s, value);\n };\n return [readSignal.bind(s), setter];\n}\nfunction createComputed(fn, value, options) {\n const c = createComputation(fn, value, true, STALE);\n if (Scheduler && Transition && Transition.running) Updates.push(c);else updateComputation(c);\n}\nfunction createRenderEffect(fn, value, options) {\n const c = createComputation(fn, value, false, STALE);\n if (Scheduler && Transition && Transition.running) Updates.push(c);else updateComputation(c);\n}\nfunction createEffect(fn, value, options) {\n runEffects = runUserEffects;\n const c = createComputation(fn, value, false, STALE),\n s = SuspenseContext && useContext(SuspenseContext);\n if (s) c.suspense = s;\n if (!options || !options.render) c.user = true;\n Effects ? Effects.push(c) : updateComputation(c);\n}\nfunction createReaction(onInvalidate, options) {\n let fn;\n const c = createComputation(() => {\n fn ? fn() : untrack(onInvalidate);\n fn = undefined;\n }, undefined, false, 0),\n s = SuspenseContext && useContext(SuspenseContext);\n if (s) c.suspense = s;\n c.user = true;\n return tracking => {\n fn = tracking;\n updateComputation(c);\n };\n}\nfunction createMemo(fn, value, options) {\n options = options ? Object.assign({}, signalOptions, options) : signalOptions;\n const c = createComputation(fn, value, true, 0);\n c.observers = null;\n c.observerSlots = null;\n c.comparator = options.equals || undefined;\n if (Scheduler && Transition && Transition.running) {\n c.tState = STALE;\n Updates.push(c);\n } else updateComputation(c);\n return readSignal.bind(c);\n}\nfunction isPromise(v) {\n return v && typeof v === \"object\" && \"then\" in v;\n}\nfunction createResource(pSource, pFetcher, pOptions) {\n let source;\n let fetcher;\n let options;\n if (arguments.length === 2 && typeof pFetcher === \"object\" || arguments.length === 1) {\n source = true;\n fetcher = pSource;\n options = pFetcher || {};\n } else {\n source = pSource;\n fetcher = pFetcher;\n options = pOptions || {};\n }\n let pr = null,\n initP = NO_INIT,\n id = null,\n loadedUnderTransition = false,\n scheduled = false,\n resolved = (\"initialValue\" in options),\n dynamic = typeof source === \"function\" && createMemo(source);\n const contexts = new Set(),\n [value, setValue] = (options.storage || createSignal)(options.initialValue),\n [error, setError] = createSignal(undefined),\n [track, trigger] = createSignal(undefined, {\n equals: false\n }),\n [state, setState] = createSignal(resolved ? \"ready\" : \"unresolved\");\n if (sharedConfig.context) {\n id = `${sharedConfig.context.id}${sharedConfig.context.count++}`;\n let v;\n if (options.ssrLoadFrom === \"initial\") initP = options.initialValue;else if (sharedConfig.load && (v = sharedConfig.load(id))) initP = v;\n }\n function loadEnd(p, v, error, key) {\n if (pr === p) {\n pr = null;\n key !== undefined && (resolved = true);\n if ((p === initP || v === initP) && options.onHydrated) queueMicrotask(() => options.onHydrated(key, {\n value: v\n }));\n initP = NO_INIT;\n if (Transition && p && loadedUnderTransition) {\n Transition.promises.delete(p);\n loadedUnderTransition = false;\n runUpdates(() => {\n Transition.running = true;\n completeLoad(v, error);\n }, false);\n } else completeLoad(v, error);\n }\n return v;\n }\n function completeLoad(v, err) {\n runUpdates(() => {\n if (err === undefined) setValue(() => v);\n setState(err !== undefined ? \"errored\" : resolved ? \"ready\" : \"unresolved\");\n setError(err);\n for (const c of contexts.keys()) c.decrement();\n contexts.clear();\n }, false);\n }\n function read() {\n const c = SuspenseContext && useContext(SuspenseContext),\n v = value(),\n err = error();\n if (err !== undefined && !pr) throw err;\n if (Listener && !Listener.user && c) {\n createComputed(() => {\n track();\n if (pr) {\n if (c.resolved && Transition && loadedUnderTransition) Transition.promises.add(pr);else if (!contexts.has(c)) {\n c.increment();\n contexts.add(c);\n }\n }\n });\n }\n return v;\n }\n function load(refetching = true) {\n if (refetching !== false && scheduled) return;\n scheduled = false;\n const lookup = dynamic ? dynamic() : source;\n loadedUnderTransition = Transition && Transition.running;\n if (lookup == null || lookup === false) {\n loadEnd(pr, untrack(value));\n return;\n }\n if (Transition && pr) Transition.promises.delete(pr);\n const p = initP !== NO_INIT ? initP : untrack(() => fetcher(lookup, {\n value: value(),\n refetching\n }));\n if (!isPromise(p)) {\n loadEnd(pr, p, undefined, lookup);\n return p;\n }\n pr = p;\n if (\"value\" in p) {\n if (p.status === \"success\") loadEnd(pr, p.value, undefined, lookup);else loadEnd(pr, undefined, undefined, lookup);\n return p;\n }\n scheduled = true;\n queueMicrotask(() => scheduled = false);\n runUpdates(() => {\n setState(resolved ? \"refreshing\" : \"pending\");\n trigger();\n }, false);\n return p.then(v => loadEnd(p, v, undefined, lookup), e => loadEnd(p, undefined, castError(e), lookup));\n }\n Object.defineProperties(read, {\n state: {\n get: () => state()\n },\n error: {\n get: () => error()\n },\n loading: {\n get() {\n const s = state();\n return s === \"pending\" || s === \"refreshing\";\n }\n },\n latest: {\n get() {\n if (!resolved) return read();\n const err = error();\n if (err && !pr) throw err;\n return value();\n }\n }\n });\n if (dynamic) createComputed(() => load(false));else load(false);\n return [read, {\n refetch: load,\n mutate: setValue\n }];\n}\nfunction createDeferred(source, options) {\n let t,\n timeout = options ? options.timeoutMs : undefined;\n const node = createComputation(() => {\n if (!t || !t.fn) t = requestCallback(() => setDeferred(() => node.value), timeout !== undefined ? {\n timeout\n } : undefined);\n return source();\n }, undefined, true);\n const [deferred, setDeferred] = createSignal(Transition && Transition.running && Transition.sources.has(node) ? node.tValue : node.value, options);\n updateComputation(node);\n setDeferred(() => Transition && Transition.running && Transition.sources.has(node) ? node.tValue : node.value);\n return deferred;\n}\nfunction createSelector(source, fn = equalFn, options) {\n const subs = new Map();\n const node = createComputation(p => {\n const v = source();\n for (const [key, val] of subs.entries()) if (fn(key, v) !== fn(key, p)) {\n for (const c of val.values()) {\n c.state = STALE;\n if (c.pure) Updates.push(c);else Effects.push(c);\n }\n }\n return v;\n }, undefined, true, STALE);\n updateComputation(node);\n return key => {\n const listener = Listener;\n if (listener) {\n let l;\n if (l = subs.get(key)) l.add(listener);else subs.set(key, l = new Set([listener]));\n onCleanup(() => {\n l.delete(listener);\n !l.size && subs.delete(key);\n });\n }\n return fn(key, Transition && Transition.running && Transition.sources.has(node) ? node.tValue : node.value);\n };\n}\nfunction batch(fn) {\n return runUpdates(fn, false);\n}\nfunction untrack(fn) {\n if (!ExternalSourceConfig && Listener === null) return fn();\n const listener = Listener;\n Listener = null;\n try {\n if (ExternalSourceConfig) return ExternalSourceConfig.untrack(fn);\n return fn();\n } finally {\n Listener = listener;\n }\n}\nfunction on(deps, fn, options) {\n const isArray = Array.isArray(deps);\n let prevInput;\n let defer = options && options.defer;\n return prevValue => {\n let input;\n if (isArray) {\n input = Array(deps.length);\n for (let i = 0; i < deps.length; i++) input[i] = deps[i]();\n } else input = deps();\n if (defer) {\n defer = false;\n return prevValue;\n }\n const result = untrack(() => fn(input, prevInput, prevValue));\n prevInput = input;\n return result;\n };\n}\nfunction onMount(fn) {\n createEffect(() => untrack(fn));\n}\nfunction onCleanup(fn) {\n if (Owner === null) ;else if (Owner.cleanups === null) Owner.cleanups = [fn];else Owner.cleanups.push(fn);\n return fn;\n}\nfunction catchError(fn, handler) {\n ERROR || (ERROR = Symbol(\"error\"));\n Owner = createComputation(undefined, undefined, true);\n Owner.context = {\n ...Owner.context,\n [ERROR]: [handler]\n };\n if (Transition && Transition.running) Transition.sources.add(Owner);\n try {\n return fn();\n } catch (err) {\n handleError(err);\n } finally {\n Owner = Owner.owner;\n }\n}\nfunction getListener() {\n return Listener;\n}\nfunction getOwner() {\n return Owner;\n}\nfunction runWithOwner(o, fn) {\n const prev = Owner;\n const prevListener = Listener;\n Owner = o;\n Listener = null;\n try {\n return runUpdates(fn, true);\n } catch (err) {\n handleError(err);\n } finally {\n Owner = prev;\n Listener = prevListener;\n }\n}\nfunction enableScheduling(scheduler = requestCallback) {\n Scheduler = scheduler;\n}\nfunction startTransition(fn) {\n if (Transition && Transition.running) {\n fn();\n return Transition.done;\n }\n const l = Listener;\n const o = Owner;\n return Promise.resolve().then(() => {\n Listener = l;\n Owner = o;\n let t;\n if (Scheduler || SuspenseContext) {\n t = Transition || (Transition = {\n sources: new Set(),\n effects: [],\n promises: new Set(),\n disposed: new Set(),\n queue: new Set(),\n running: true\n });\n t.done || (t.done = new Promise(res => t.resolve = res));\n t.running = true;\n }\n runUpdates(fn, false);\n Listener = Owner = null;\n return t ? t.done : undefined;\n });\n}\nconst [transPending, setTransPending] = /*@__PURE__*/createSignal(false);\nfunction useTransition() {\n return [transPending, startTransition];\n}\nfunction resumeEffects(e) {\n Effects.push.apply(Effects, e);\n e.length = 0;\n}\nfunction createContext(defaultValue, options) {\n const id = Symbol(\"context\");\n return {\n id,\n Provider: createProvider(id),\n defaultValue\n };\n}\nfunction useContext(context) {\n return Owner && Owner.context && Owner.context[context.id] !== undefined ? Owner.context[context.id] : context.defaultValue;\n}\nfunction children(fn) {\n const children = createMemo(fn);\n const memo = createMemo(() => resolveChildren(children()));\n memo.toArray = () => {\n const c = memo();\n return Array.isArray(c) ? c : c != null ? [c] : [];\n };\n return memo;\n}\nlet SuspenseContext;\nfunction getSuspenseContext() {\n return SuspenseContext || (SuspenseContext = createContext());\n}\nfunction enableExternalSource(factory, untrack = fn => fn()) {\n if (ExternalSourceConfig) {\n const {\n factory: oldFactory,\n untrack: oldUntrack\n } = ExternalSourceConfig;\n ExternalSourceConfig = {\n factory: (fn, trigger) => {\n const oldSource = oldFactory(fn, trigger);\n const source = factory(x => oldSource.track(x), trigger);\n return {\n track: x => source.track(x),\n dispose() {\n source.dispose();\n oldSource.dispose();\n }\n };\n },\n untrack: fn => oldUntrack(() => untrack(fn))\n };\n } else {\n ExternalSourceConfig = {\n factory,\n untrack\n };\n }\n}\nfunction readSignal() {\n const runningTransition = Transition && Transition.running;\n if (this.sources && (runningTransition ? this.tState : this.state)) {\n if ((runningTransition ? this.tState : this.state) === STALE) updateComputation(this);else {\n const updates = Updates;\n Updates = null;\n runUpdates(() => lookUpstream(this), false);\n Updates = updates;\n }\n }\n if (Listener) {\n const sSlot = this.observers ? this.observers.length : 0;\n if (!Listener.sources) {\n Listener.sources = [this];\n Listener.sourceSlots = [sSlot];\n } else {\n Listener.sources.push(this);\n Listener.sourceSlots.push(sSlot);\n }\n if (!this.observers) {\n this.observers = [Listener];\n this.observerSlots = [Listener.sources.length - 1];\n } else {\n this.observers.push(Listener);\n this.observerSlots.push(Listener.sources.length - 1);\n }\n }\n if (runningTransition && Transition.sources.has(this)) return this.tValue;\n return this.value;\n}\nfunction writeSignal(node, value, isComp) {\n let current = Transition && Transition.running && Transition.sources.has(node) ? node.tValue : node.value;\n if (!node.comparator || !node.comparator(current, value)) {\n if (Transition) {\n const TransitionRunning = Transition.running;\n if (TransitionRunning || !isComp && Transition.sources.has(node)) {\n Transition.sources.add(node);\n node.tValue = value;\n }\n if (!TransitionRunning) node.value = value;\n } else node.value = value;\n if (node.observers && node.observers.length) {\n runUpdates(() => {\n for (let i = 0; i < node.observers.length; i += 1) {\n const o = node.observers[i];\n const TransitionRunning = Transition && Transition.running;\n if (TransitionRunning && Transition.disposed.has(o)) continue;\n if (TransitionRunning ? !o.tState : !o.state) {\n if (o.pure) Updates.push(o);else Effects.push(o);\n if (o.observers) markDownstream(o);\n }\n if (!TransitionRunning) o.state = STALE;else o.tState = STALE;\n }\n if (Updates.length > 10e5) {\n Updates = [];\n if (false) ;\n throw new Error();\n }\n }, false);\n }\n }\n return value;\n}\nfunction updateComputation(node) {\n if (!node.fn) return;\n cleanNode(node);\n const time = ExecCount;\n runComputation(node, Transition && Transition.running && Transition.sources.has(node) ? node.tValue : node.value, time);\n if (Transition && !Transition.running && Transition.sources.has(node)) {\n queueMicrotask(() => {\n runUpdates(() => {\n Transition && (Transition.running = true);\n Listener = Owner = node;\n runComputation(node, node.tValue, time);\n Listener = Owner = null;\n }, false);\n });\n }\n}\nfunction runComputation(node, value, time) {\n let nextValue;\n const owner = Owner,\n listener = Listener;\n Listener = Owner = node;\n try {\n nextValue = node.fn(value);\n } catch (err) {\n if (node.pure) {\n if (Transition && Transition.running) {\n node.tState = STALE;\n node.tOwned && node.tOwned.forEach(cleanNode);\n node.tOwned = undefined;\n } else {\n node.state = STALE;\n node.owned && node.owned.forEach(cleanNode);\n node.owned = null;\n }\n }\n node.updatedAt = time + 1;\n return handleError(err);\n } finally {\n Listener = listener;\n Owner = owner;\n }\n if (!node.updatedAt || node.updatedAt <= time) {\n if (node.updatedAt != null && \"observers\" in node) {\n writeSignal(node, nextValue, true);\n } else if (Transition && Transition.running && node.pure) {\n Transition.sources.add(node);\n node.tValue = nextValue;\n } else node.value = nextValue;\n node.updatedAt = time;\n }\n}\nfunction createComputation(fn, init, pure, state = STALE, options) {\n const c = {\n fn,\n state: state,\n updatedAt: null,\n owned: null,\n sources: null,\n sourceSlots: null,\n cleanups: null,\n value: init,\n owner: Owner,\n context: Owner ? Owner.context : null,\n pure\n };\n if (Transition && Transition.running) {\n c.state = 0;\n c.tState = state;\n }\n if (Owner === null) ;else if (Owner !== UNOWNED) {\n if (Transition && Transition.running && Owner.pure) {\n if (!Owner.tOwned) Owner.tOwned = [c];else Owner.tOwned.push(c);\n } else {\n if (!Owner.owned) Owner.owned = [c];else Owner.owned.push(c);\n }\n }\n if (ExternalSourceConfig && c.fn) {\n const [track, trigger] = createSignal(undefined, {\n equals: false\n });\n const ordinary = ExternalSourceConfig.factory(c.fn, trigger);\n onCleanup(() => ordinary.dispose());\n const triggerInTransition = () => startTransition(trigger).then(() => inTransition.dispose());\n const inTransition = ExternalSourceConfig.factory(c.fn, triggerInTransition);\n c.fn = x => {\n track();\n return Transition && Transition.running ? inTransition.track(x) : ordinary.track(x);\n };\n }\n return c;\n}\nfunction runTop(node) {\n const runningTransition = Transition && Transition.running;\n if ((runningTransition ? node.tState : node.state) === 0) return;\n if ((runningTransition ? node.tState : node.state) === PENDING) return lookUpstream(node);\n if (node.suspense && untrack(node.suspense.inFallback)) return node.suspense.effects.push(node);\n const ancestors = [node];\n while ((node = node.owner) && (!node.updatedAt || node.updatedAt < ExecCount)) {\n if (runningTransition && Transition.disposed.has(node)) return;\n if (runningTransition ? node.tState : node.state) ancestors.push(node);\n }\n for (let i = ancestors.length - 1; i >= 0; i--) {\n node = ancestors[i];\n if (runningTransition) {\n let top = node,\n prev = ancestors[i + 1];\n while ((top = top.owner) && top !== prev) {\n if (Transition.disposed.has(top)) return;\n }\n }\n if ((runningTransition ? node.tState : node.state) === STALE) {\n updateComputation(node);\n } else if ((runningTransition ? node.tState : node.state) === PENDING) {\n const updates = Updates;\n Updates = null;\n runUpdates(() => lookUpstream(node, ancestors[0]), false);\n Updates = updates;\n }\n }\n}\nfunction runUpdates(fn, init) {\n if (Updates) return fn();\n let wait = false;\n if (!init) Updates = [];\n if (Effects) wait = true;else Effects = [];\n ExecCount++;\n try {\n const res = fn();\n completeUpdates(wait);\n return res;\n } catch (err) {\n if (!wait) Effects = null;\n Updates = null;\n handleError(err);\n }\n}\nfunction completeUpdates(wait) {\n if (Updates) {\n if (Scheduler && Transition && Transition.running) scheduleQueue(Updates);else runQueue(Updates);\n Updates = null;\n }\n if (wait) return;\n let res;\n if (Transition) {\n if (!Transition.promises.size && !Transition.queue.size) {\n const sources = Transition.sources;\n const disposed = Transition.disposed;\n Effects.push.apply(Effects, Transition.effects);\n res = Transition.resolve;\n for (const e of Effects) {\n \"tState\" in e && (e.state = e.tState);\n delete e.tState;\n }\n Transition = null;\n runUpdates(() => {\n for (const d of disposed) cleanNode(d);\n for (const v of sources) {\n v.value = v.tValue;\n if (v.owned) {\n for (let i = 0, len = v.owned.length; i < len; i++) cleanNode(v.owned[i]);\n }\n if (v.tOwned) v.owned = v.tOwned;\n delete v.tValue;\n delete v.tOwned;\n v.tState = 0;\n }\n setTransPending(false);\n }, false);\n } else if (Transition.running) {\n Transition.running = false;\n Transition.effects.push.apply(Transition.effects, Effects);\n Effects = null;\n setTransPending(true);\n return;\n }\n }\n const e = Effects;\n Effects = null;\n if (e.length) runUpdates(() => runEffects(e), false);\n if (res) res();\n}\nfunction runQueue(queue) {\n for (let i = 0; i < queue.length; i++) runTop(queue[i]);\n}\nfunction scheduleQueue(queue) {\n for (let i = 0; i < queue.length; i++) {\n const item = queue[i];\n const tasks = Transition.queue;\n if (!tasks.has(item)) {\n tasks.add(item);\n Scheduler(() => {\n tasks.delete(item);\n runUpdates(() => {\n Transition.running = true;\n runTop(item);\n }, false);\n Transition && (Transition.running = false);\n });\n }\n }\n}\nfunction runUserEffects(queue) {\n let i,\n userLength = 0;\n for (i = 0; i < queue.length; i++) {\n const e = queue[i];\n if (!e.user) runTop(e);else queue[userLength++] = e;\n }\n if (sharedConfig.context) {\n if (sharedConfig.count) {\n sharedConfig.effects || (sharedConfig.effects = []);\n sharedConfig.effects.push(...queue.slice(0, userLength));\n return;\n } else if (sharedConfig.effects) {\n queue = [...sharedConfig.effects, ...queue];\n userLength += sharedConfig.effects.length;\n delete sharedConfig.effects;\n }\n setHydrateContext();\n }\n for (i = 0; i < userLength; i++) runTop(queue[i]);\n}\nfunction lookUpstream(node, ignore) {\n const runningTransition = Transition && Transition.running;\n if (runningTransition) node.tState = 0;else node.state = 0;\n for (let i = 0; i < node.sources.length; i += 1) {\n const source = node.sources[i];\n if (source.sources) {\n const state = runningTransition ? source.tState : source.state;\n if (state === STALE) {\n if (source !== ignore && (!source.updatedAt || source.updatedAt < ExecCount)) runTop(source);\n } else if (state === PENDING) lookUpstream(source, ignore);\n }\n }\n}\nfunction markDownstream(node) {\n const runningTransition = Transition && Transition.running;\n for (let i = 0; i < node.observers.length; i += 1) {\n const o = node.observers[i];\n if (runningTransition ? !o.tState : !o.state) {\n if (runningTransition) o.tState = PENDING;else o.state = PENDING;\n if (o.pure) Updates.push(o);else Effects.push(o);\n o.observers && markDownstream(o);\n }\n }\n}\nfunction cleanNode(node) {\n let i;\n if (node.sources) {\n while (node.sources.length) {\n const source = node.sources.pop(),\n index = node.sourceSlots.pop(),\n obs = source.observers;\n if (obs && obs.length) {\n const n = obs.pop(),\n s = source.observerSlots.pop();\n if (index < obs.length) {\n n.sourceSlots[s] = index;\n obs[index] = n;\n source.observerSlots[index] = s;\n }\n }\n }\n }\n if (Transition && Transition.running && node.pure) {\n if (node.tOwned) {\n for (i = node.tOwned.length - 1; i >= 0; i--) cleanNode(node.tOwned[i]);\n delete node.tOwned;\n }\n reset(node, true);\n } else if (node.owned) {\n for (i = node.owned.length - 1; i >= 0; i--) cleanNode(node.owned[i]);\n node.owned = null;\n }\n if (node.cleanups) {\n for (i = node.cleanups.length - 1; i >= 0; i--) node.cleanups[i]();\n node.cleanups = null;\n }\n if (Transition && Transition.running) node.tState = 0;else node.state = 0;\n}\nfunction reset(node, top) {\n if (!top) {\n node.tState = 0;\n Transition.disposed.add(node);\n }\n if (node.owned) {\n for (let i = 0; i < node.owned.length; i++) reset(node.owned[i]);\n }\n}\nfunction castError(err) {\n if (err instanceof Error) return err;\n return new Error(typeof err === \"string\" ? err : \"Unknown error\", {\n cause: err\n });\n}\nfunction runErrors(err, fns, owner) {\n try {\n for (const f of fns) f(err);\n } catch (e) {\n handleError(e, owner && owner.owner || null);\n }\n}\nfunction handleError(err, owner = Owner) {\n const fns = ERROR && owner && owner.context && owner.context[ERROR];\n const error = castError(err);\n if (!fns) {\n console.error(\"solid error\", error);\n return;\n }\n if (Effects) Effects.push({\n fn() {\n runErrors(error, fns, owner);\n },\n state: STALE\n });else runErrors(error, fns, owner);\n}\nfunction resolveChildren(children) {\n if (typeof children === \"function\" && !children.length) return resolveChildren(children());\n if (Array.isArray(children)) {\n const results = [];\n for (let i = 0; i < children.length; i++) {\n const result = resolveChildren(children[i]);\n Array.isArray(result) ? results.push.apply(results, result) : results.push(result);\n }\n return results;\n }\n return children;\n}\nfunction createProvider(id, options) {\n return function provider(props) {\n let res;\n createRenderEffect(() => res = untrack(() => {\n Owner.context = {\n ...Owner.context,\n [id]: props.value\n };\n return children(() => props.children);\n }), undefined);\n return res;\n };\n}\nfunction onError(fn) {\n ERROR || (ERROR = Symbol(\"error\"));\n if (Owner === null) ;else if (Owner.context === null || !Owner.context[ERROR]) {\n Owner.context = {\n ...Owner.context,\n [ERROR]: [fn]\n };\n mutateContext(Owner, ERROR, [fn]);\n } else Owner.context[ERROR].push(fn);\n}\nfunction mutateContext(o, key, value) {\n if (o.owned) {\n for (let i = 0; i < o.owned.length; i++) {\n if (o.owned[i].context === o.context) mutateContext(o.owned[i], key, value);\n if (!o.owned[i].context) {\n o.owned[i].context = o.context;\n mutateContext(o.owned[i], key, value);\n } else if (!o.owned[i].context[key]) {\n o.owned[i].context[key] = value;\n mutateContext(o.owned[i], key, value);\n }\n }\n }\n}\n\nfunction observable(input) {\n return {\n subscribe(observer) {\n if (!(observer instanceof Object) || observer == null) {\n throw new TypeError(\"Expected the observer to be an object.\");\n }\n const handler = typeof observer === \"function\" ? observer : observer.next && observer.next.bind(observer);\n if (!handler) {\n return {\n unsubscribe() {}\n };\n }\n const dispose = createRoot(disposer => {\n createEffect(() => {\n const v = input();\n untrack(() => handler(v));\n });\n return disposer;\n });\n if (getOwner()) onCleanup(dispose);\n return {\n unsubscribe() {\n dispose();\n }\n };\n },\n [Symbol.observable || \"@@observable\"]() {\n return this;\n }\n };\n}\nfunction from(producer) {\n const [s, set] = createSignal(undefined, {\n equals: false\n });\n if (\"subscribe\" in producer) {\n const unsub = producer.subscribe(v => set(() => v));\n onCleanup(() => \"unsubscribe\" in unsub ? unsub.unsubscribe() : unsub());\n } else {\n const clean = producer(set);\n onCleanup(clean);\n }\n return s;\n}\n\nconst FALLBACK = Symbol(\"fallback\");\nfunction dispose(d) {\n for (let i = 0; i < d.length; i++) d[i]();\n}\nfunction mapArray(list, mapFn, options = {}) {\n let items = [],\n mapped = [],\n disposers = [],\n len = 0,\n indexes = mapFn.length > 1 ? [] : null;\n onCleanup(() => dispose(disposers));\n return () => {\n let newItems = list() || [],\n i,\n j;\n newItems[$TRACK];\n return untrack(() => {\n let newLen = newItems.length,\n newIndices,\n newIndicesNext,\n temp,\n tempdisposers,\n tempIndexes,\n start,\n end,\n newEnd,\n item;\n if (newLen === 0) {\n if (len !== 0) {\n dispose(disposers);\n disposers = [];\n items = [];\n mapped = [];\n len = 0;\n indexes && (indexes = []);\n }\n if (options.fallback) {\n items = [FALLBACK];\n mapped[0] = createRoot(disposer => {\n disposers[0] = disposer;\n return options.fallback();\n });\n len = 1;\n }\n }\n else if (len === 0) {\n mapped = new Array(newLen);\n for (j = 0; j < newLen; j++) {\n items[j] = newItems[j];\n mapped[j] = createRoot(mapper);\n }\n len = newLen;\n } else {\n temp = new Array(newLen);\n tempdisposers = new Array(newLen);\n indexes && (tempIndexes = new Array(newLen));\n for (start = 0, end = Math.min(len, newLen); start < end && items[start] === newItems[start]; start++);\n for (end = len - 1, newEnd = newLen - 1; end >= start && newEnd >= start && items[end] === newItems[newEnd]; end--, newEnd--) {\n temp[newEnd] = mapped[end];\n tempdisposers[newEnd] = disposers[end];\n indexes && (tempIndexes[newEnd] = indexes[end]);\n }\n newIndices = new Map();\n newIndicesNext = new Array(newEnd + 1);\n for (j = newEnd; j >= start; j--) {\n item = newItems[j];\n i = newIndices.get(item);\n newIndicesNext[j] = i === undefined ? -1 : i;\n newIndices.set(item, j);\n }\n for (i = start; i <= end; i++) {\n item = items[i];\n j = newIndices.get(item);\n if (j !== undefined && j !== -1) {\n temp[j] = mapped[i];\n tempdisposers[j] = disposers[i];\n indexes && (tempIndexes[j] = indexes[i]);\n j = newIndicesNext[j];\n newIndices.set(item, j);\n } else disposers[i]();\n }\n for (j = start; j < newLen; j++) {\n if (j in temp) {\n mapped[j] = temp[j];\n disposers[j] = tempdisposers[j];\n if (indexes) {\n indexes[j] = tempIndexes[j];\n indexes[j](j);\n }\n } else mapped[j] = createRoot(mapper);\n }\n mapped = mapped.slice(0, len = newLen);\n items = newItems.slice(0);\n }\n return mapped;\n });\n function mapper(disposer) {\n disposers[j] = disposer;\n if (indexes) {\n const [s, set] = createSignal(j);\n indexes[j] = set;\n return mapFn(newItems[j], s);\n }\n return mapFn(newItems[j]);\n }\n };\n}\nfunction indexArray(list, mapFn, options = {}) {\n let items = [],\n mapped = [],\n disposers = [],\n signals = [],\n len = 0,\n i;\n onCleanup(() => dispose(disposers));\n return () => {\n const newItems = list() || [];\n newItems[$TRACK];\n return untrack(() => {\n if (newItems.length === 0) {\n if (len !== 0) {\n dispose(disposers);\n disposers = [];\n items = [];\n mapped = [];\n len = 0;\n signals = [];\n }\n if (options.fallback) {\n items = [FALLBACK];\n mapped[0] = createRoot(disposer => {\n disposers[0] = disposer;\n return options.fallback();\n });\n len = 1;\n }\n return mapped;\n }\n if (items[0] === FALLBACK) {\n disposers[0]();\n disposers = [];\n items = [];\n mapped = [];\n len = 0;\n }\n for (i = 0; i < newItems.length; i++) {\n if (i < items.length && items[i] !== newItems[i]) {\n signals[i](() => newItems[i]);\n } else if (i >= items.length) {\n mapped[i] = createRoot(mapper);\n }\n }\n for (; i < items.length; i++) {\n disposers[i]();\n }\n len = signals.length = disposers.length = newItems.length;\n items = newItems.slice(0);\n return mapped = mapped.slice(0, len);\n });\n function mapper(disposer) {\n disposers[i] = disposer;\n const [s, set] = createSignal(newItems[i]);\n signals[i] = set;\n return mapFn(s, i);\n }\n };\n}\n\nlet hydrationEnabled = false;\nfunction enableHydration() {\n hydrationEnabled = true;\n}\nfunction createComponent(Comp, props) {\n if (hydrationEnabled) {\n if (sharedConfig.context) {\n const c = sharedConfig.context;\n setHydrateContext(nextHydrateContext());\n const r = untrack(() => Comp(props || {}));\n setHydrateContext(c);\n return r;\n }\n }\n return untrack(() => Comp(props || {}));\n}\nfunction trueFn() {\n return true;\n}\nconst propTraps = {\n get(_, property, receiver) {\n if (property === $PROXY) return receiver;\n return _.get(property);\n },\n has(_, property) {\n if (property === $PROXY) return true;\n return _.has(property);\n },\n set: trueFn,\n deleteProperty: trueFn,\n getOwnPropertyDescriptor(_, property) {\n return {\n configurable: true,\n enumerable: true,\n get() {\n return _.get(property);\n },\n set: trueFn,\n deleteProperty: trueFn\n };\n },\n ownKeys(_) {\n return _.keys();\n }\n};\nfunction resolveSource(s) {\n return !(s = typeof s === \"function\" ? s() : s) ? {} : s;\n}\nfunction resolveSources() {\n for (let i = 0, length = this.length; i < length; ++i) {\n const v = this[i]();\n if (v !== undefined) return v;\n }\n}\nfunction mergeProps(...sources) {\n let proxy = false;\n for (let i = 0; i < sources.length; i++) {\n const s = sources[i];\n proxy = proxy || !!s && $PROXY in s;\n sources[i] = typeof s === \"function\" ? (proxy = true, createMemo(s)) : s;\n }\n if (proxy) {\n return new Proxy({\n get(property) {\n for (let i = sources.length - 1; i >= 0; i--) {\n const v = resolveSource(sources[i])[property];\n if (v !== undefined) return v;\n }\n },\n has(property) {\n for (let i = sources.length - 1; i >= 0; i--) {\n if (property in resolveSource(sources[i])) return true;\n }\n return false;\n },\n keys() {\n const keys = [];\n for (let i = 0; i < sources.length; i++) keys.push(...Object.keys(resolveSource(sources[i])));\n return [...new Set(keys)];\n }\n }, propTraps);\n }\n const sourcesMap = {};\n const defined = Object.create(null);\n for (let i = sources.length - 1; i >= 0; i--) {\n const source = sources[i];\n if (!source) continue;\n const sourceKeys = Object.getOwnPropertyNames(source);\n for (let i = sourceKeys.length - 1; i >= 0; i--) {\n const key = sourceKeys[i];\n if (key === \"__proto__\" || key === \"constructor\") continue;\n const desc = Object.getOwnPropertyDescriptor(source, key);\n if (!defined[key]) {\n defined[key] = desc.get ? {\n enumerable: true,\n configurable: true,\n get: resolveSources.bind(sourcesMap[key] = [desc.get.bind(source)])\n } : desc.value !== undefined ? desc : undefined;\n } else {\n const sources = sourcesMap[key];\n if (sources) {\n if (desc.get) sources.push(desc.get.bind(source));else if (desc.value !== undefined) sources.push(() => desc.value);\n }\n }\n }\n }\n const target = {};\n const definedKeys = Object.keys(defined);\n for (let i = definedKeys.length - 1; i >= 0; i--) {\n const key = definedKeys[i],\n desc = defined[key];\n if (desc && desc.get) Object.defineProperty(target, key, desc);else target[key] = desc ? desc.value : undefined;\n }\n return target;\n}\nfunction splitProps(props, ...keys) {\n if ($PROXY in props) {\n const blocked = new Set(keys.length > 1 ? keys.flat() : keys[0]);\n const res = keys.map(k => {\n return new Proxy({\n get(property) {\n return k.includes(property) ? props[property] : undefined;\n },\n has(property) {\n return k.includes(property) && property in props;\n },\n keys() {\n return k.filter(property => property in props);\n }\n }, propTraps);\n });\n res.push(new Proxy({\n get(property) {\n return blocked.has(property) ? undefined : props[property];\n },\n has(property) {\n return blocked.has(property) ? false : property in props;\n },\n keys() {\n return Object.keys(props).filter(k => !blocked.has(k));\n }\n }, propTraps));\n return res;\n }\n const otherObject = {};\n const objects = keys.map(() => ({}));\n for (const propName of Object.getOwnPropertyNames(props)) {\n const desc = Object.getOwnPropertyDescriptor(props, propName);\n const isDefaultDesc = !desc.get && !desc.set && desc.enumerable && desc.writable && desc.configurable;\n let blocked = false;\n let objectIndex = 0;\n for (const k of keys) {\n if (k.includes(propName)) {\n blocked = true;\n isDefaultDesc ? objects[objectIndex][propName] = desc.value : Object.defineProperty(objects[objectIndex], propName, desc);\n }\n ++objectIndex;\n }\n if (!blocked) {\n isDefaultDesc ? otherObject[propName] = desc.value : Object.defineProperty(otherObject, propName, desc);\n }\n }\n return [...objects, otherObject];\n}\nfunction lazy(fn) {\n let comp;\n let p;\n const wrap = props => {\n const ctx = sharedConfig.context;\n if (ctx) {\n const [s, set] = createSignal();\n sharedConfig.count || (sharedConfig.count = 0);\n sharedConfig.count++;\n (p || (p = fn())).then(mod => {\n setHydrateContext(ctx);\n sharedConfig.count--;\n set(() => mod.default);\n setHydrateContext();\n });\n comp = s;\n } else if (!comp) {\n const [s] = createResource(() => (p || (p = fn())).then(mod => mod.default));\n comp = s;\n }\n let Comp;\n return createMemo(() => (Comp = comp()) && untrack(() => {\n if (false) ;\n if (!ctx) return Comp(props);\n const c = sharedConfig.context;\n setHydrateContext(ctx);\n const r = Comp(props);\n setHydrateContext(c);\n return r;\n }));\n };\n wrap.preload = () => p || ((p = fn()).then(mod => comp = () => mod.default), p);\n return wrap;\n}\nlet counter = 0;\nfunction createUniqueId() {\n const ctx = sharedConfig.context;\n return ctx ? `${ctx.id}${ctx.count++}` : `cl-${counter++}`;\n}\n\nconst narrowedError = name => `Stale read from <${name}>.`;\nfunction For(props) {\n const fallback = \"fallback\" in props && {\n fallback: () => props.fallback\n };\n return createMemo(mapArray(() => props.each, props.children, fallback || undefined));\n}\nfunction Index(props) {\n const fallback = \"fallback\" in props && {\n fallback: () => props.fallback\n };\n return createMemo(indexArray(() => props.each, props.children, fallback || undefined));\n}\nfunction Show(props) {\n const keyed = props.keyed;\n const condition = createMemo(() => props.when, undefined, {\n equals: (a, b) => keyed ? a === b : !a === !b\n });\n return createMemo(() => {\n const c = condition();\n if (c) {\n const child = props.children;\n const fn = typeof child === \"function\" && child.length > 0;\n return fn ? untrack(() => child(keyed ? c : () => {\n if (!untrack(condition)) throw narrowedError(\"Show\");\n return props.when;\n })) : child;\n }\n return props.fallback;\n }, undefined, undefined);\n}\nfunction Switch(props) {\n let keyed = false;\n const equals = (a, b) => (keyed ? a[1] === b[1] : !a[1] === !b[1]) && a[2] === b[2];\n const conditions = children(() => props.children),\n evalConditions = createMemo(() => {\n let conds = conditions();\n if (!Array.isArray(conds)) conds = [conds];\n for (let i = 0; i < conds.length; i++) {\n const c = conds[i].when;\n if (c) {\n keyed = !!conds[i].keyed;\n return [i, c, conds[i]];\n }\n }\n return [-1];\n }, undefined, {\n equals\n });\n return createMemo(() => {\n const [index, when, cond] = evalConditions();\n if (index < 0) return props.fallback;\n const c = cond.children;\n const fn = typeof c === \"function\" && c.length > 0;\n return fn ? untrack(() => c(keyed ? when : () => {\n if (untrack(evalConditions)[0] !== index) throw narrowedError(\"Match\");\n return cond.when;\n })) : c;\n }, undefined, undefined);\n}\nfunction Match(props) {\n return props;\n}\nlet Errors;\nfunction resetErrorBoundaries() {\n Errors && [...Errors].forEach(fn => fn());\n}\nfunction ErrorBoundary(props) {\n let err;\n if (sharedConfig.context && sharedConfig.load) err = sharedConfig.load(sharedConfig.context.id + sharedConfig.context.count);\n const [errored, setErrored] = createSignal(err, undefined);\n Errors || (Errors = new Set());\n Errors.add(setErrored);\n onCleanup(() => Errors.delete(setErrored));\n return createMemo(() => {\n let e;\n if (e = errored()) {\n const f = props.fallback;\n return typeof f === \"function\" && f.length ? untrack(() => f(e, () => setErrored())) : f;\n }\n return catchError(() => props.children, setErrored);\n }, undefined, undefined);\n}\n\nconst suspenseListEquals = (a, b) => a.showContent === b.showContent && a.showFallback === b.showFallback;\nconst SuspenseListContext = createContext();\nfunction SuspenseList(props) {\n let [wrapper, setWrapper] = createSignal(() => ({\n inFallback: false\n })),\n show;\n const listContext = useContext(SuspenseListContext);\n const [registry, setRegistry] = createSignal([]);\n if (listContext) {\n show = listContext.register(createMemo(() => wrapper()().inFallback));\n }\n const resolved = createMemo(prev => {\n const reveal = props.revealOrder,\n tail = props.tail,\n {\n showContent = true,\n showFallback = true\n } = show ? show() : {},\n reg = registry(),\n reverse = reveal === \"backwards\";\n if (reveal === \"together\") {\n const all = reg.every(inFallback => !inFallback());\n const res = reg.map(() => ({\n showContent: all && showContent,\n showFallback\n }));\n res.inFallback = !all;\n return res;\n }\n let stop = false;\n let inFallback = prev.inFallback;\n const res = [];\n for (let i = 0, len = reg.length; i < len; i++) {\n const n = reverse ? len - i - 1 : i,\n s = reg[n]();\n if (!stop && !s) {\n res[n] = {\n showContent,\n showFallback\n };\n } else {\n const next = !stop;\n if (next) inFallback = true;\n res[n] = {\n showContent: next,\n showFallback: !tail || next && tail === \"collapsed\" ? showFallback : false\n };\n stop = true;\n }\n }\n if (!stop) inFallback = false;\n res.inFallback = inFallback;\n return res;\n }, {\n inFallback: false\n });\n setWrapper(() => resolved);\n return createComponent(SuspenseListContext.Provider, {\n value: {\n register: inFallback => {\n let index;\n setRegistry(registry => {\n index = registry.length;\n return [...registry, inFallback];\n });\n return createMemo(() => resolved()[index], undefined, {\n equals: suspenseListEquals\n });\n }\n },\n get children() {\n return props.children;\n }\n });\n}\nfunction Suspense(props) {\n let counter = 0,\n show,\n ctx,\n p,\n flicker,\n error;\n const [inFallback, setFallback] = createSignal(false),\n SuspenseContext = getSuspenseContext(),\n store = {\n increment: () => {\n if (++counter === 1) setFallback(true);\n },\n decrement: () => {\n if (--counter === 0) setFallback(false);\n },\n inFallback,\n effects: [],\n resolved: false\n },\n owner = getOwner();\n if (sharedConfig.context && sharedConfig.load) {\n const key = sharedConfig.context.id + sharedConfig.context.count;\n let ref = sharedConfig.load(key);\n if (ref) {\n if (typeof ref !== \"object\" || ref.status !== \"success\") p = ref;else sharedConfig.gather(key);\n }\n if (p && p !== \"$$f\") {\n const [s, set] = createSignal(undefined, {\n equals: false\n });\n flicker = s;\n p.then(() => {\n if (sharedConfig.done) return set();\n sharedConfig.gather(key);\n setHydrateContext(ctx);\n set();\n setHydrateContext();\n }, err => {\n error = err;\n set();\n });\n }\n }\n const listContext = useContext(SuspenseListContext);\n if (listContext) show = listContext.register(store.inFallback);\n let dispose;\n onCleanup(() => dispose && dispose());\n return createComponent(SuspenseContext.Provider, {\n value: store,\n get children() {\n return createMemo(() => {\n if (error) throw error;\n ctx = sharedConfig.context;\n if (flicker) {\n flicker();\n return flicker = undefined;\n }\n if (ctx && p === \"$$f\") setHydrateContext();\n const rendered = createMemo(() => props.children);\n return createMemo(prev => {\n const inFallback = store.inFallback(),\n {\n showContent = true,\n showFallback = true\n } = show ? show() : {};\n if ((!inFallback || p && p !== \"$$f\") && showContent) {\n store.resolved = true;\n dispose && dispose();\n dispose = ctx = p = undefined;\n resumeEffects(store.effects);\n return rendered();\n }\n if (!showFallback) return;\n if (dispose) return prev;\n return createRoot(disposer => {\n dispose = disposer;\n if (ctx) {\n setHydrateContext({\n id: ctx.id + \"f\",\n count: 0\n });\n ctx = undefined;\n }\n return props.fallback;\n }, owner);\n });\n });\n }\n });\n}\n\nconst DEV = undefined;\n\nexport { $DEVCOMP, $PROXY, $TRACK, DEV, ErrorBoundary, For, Index, Match, Show, Suspense, SuspenseList, Switch, batch, cancelCallback, catchError, children, createComponent, createComputed, createContext, createDeferred, createEffect, createMemo, createReaction, createRenderEffect, createResource, createRoot, createSelector, createSignal, createUniqueId, enableExternalSource, enableHydration, enableScheduling, equalFn, from, getListener, getOwner, indexArray, lazy, mapArray, mergeProps, observable, on, onCleanup, onError, onMount, requestCallback, resetErrorBoundaries, runWithOwner, sharedConfig, splitProps, startTransition, untrack, useContext, useTransition };\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 lang from '../lang';\nimport type langSign from '../langSign';\nimport type {State} from '../config/state';\nimport DEBUG, {MOUNT_CLASS_TO} from '../config/debug';\nimport {HelpCountriesList, HelpCountry, LangPackDifference, LangPackString} from '../layer';\nimport stateStorage from './stateStorage';\nimport App from '../config/app';\nimport rootScope from './rootScope';\nimport {IS_MOBILE} from '../environment/userAgent';\nimport deepEqual from '../helpers/object/deepEqual';\nimport safeAssign from '../helpers/object/safeAssign';\nimport capitalizeFirstLetter from '../helpers/string/capitalizeFirstLetter';\nimport matchUrlProtocol from './richTextProcessor/matchUrlProtocol';\nimport wrapUrl from './richTextProcessor/wrapUrl';\nimport {setDirection} from '../helpers/dom/setInnerHTML';\nimport setBlankToAnchor from './richTextProcessor/setBlankToAnchor';\nimport {createSignal} from 'solid-js';\n\nexport const langPack: {[actionType: string]: LangPackKey} = {\n 'messageActionChatCreate': 'ActionCreateGroup',\n 'messageActionChatCreateYou': 'ActionYouCreateGroup',\n 'messageActionChatEditTitle': 'ActionChangedTitle',\n 'messageActionChatEditPhoto': 'ActionChangedPhoto',\n 'messageActionChatEditVideo': 'ActionChangedVideo',\n 'messageActionChatDeletePhoto': 'ActionRemovedPhoto',\n 'messageActionChatReturn': 'ActionAddUserSelf',\n 'messageActionChatReturnYou': 'ActionAddUserSelfYou',\n 'messageActionChatJoined': 'ActionAddUserSelfMega',\n 'messageActionChatJoinedYou': 'ChannelMegaJoined',\n 'messageActionChatAddUser': 'ActionAddUser',\n 'messageActionChatAddUsers': 'ActionAddUser',\n 'messageActionChatLeave': 'ActionLeftUser',\n 'messageActionChatLeaveYou': 'YouLeft',\n 'messageActionChatDeleteUser': 'ActionKickUser',\n 'messageActionChatJoinedByLink': 'ActionInviteUser',\n 'messageActionPinMessage': 'Chat.Service.Group.UpdatedPinnedMessage',\n 'messageActionContactSignUp': 'Chat.Service.PeerJoinedTelegram',\n 'messageActionChannelCreate': 'ActionCreateChannel',\n 'messageActionChannelEditTitle': 'Chat.Service.Channel.UpdatedTitle',\n 'messageActionChannelEditPhoto': 'Chat.Service.Channel.UpdatedPhoto',\n 'messageActionChannelEditVideo': 'Chat.Service.Channel.UpdatedVideo',\n 'messageActionChannelDeletePhoto': 'Chat.Service.Channel.RemovedPhoto',\n 'messageActionHistoryClear': 'HistoryCleared',\n 'messageActionDiscussionStarted': 'DiscussionStarted',\n 'messageActionGiveawayLaunch': 'BoostingGiveawayJustStarted',\n 'messageActionChannelJoined': 'ChannelJoined',\n\n 'messageActionChannelMigrateFrom': 'ActionMigrateFromGroup',\n\n 'messageActionPhoneCall.video_in_ok': 'ChatList.Service.VideoCall.incoming',\n 'messageActionPhoneCall.video_out_ok': 'ChatList.Service.VideoCall.outgoing',\n 'messageActionPhoneCall.video_missed': 'ChatList.Service.VideoCall.Missed',\n 'messageActionPhoneCall.video_cancelled': 'ChatList.Service.VideoCall.Cancelled',\n 'messageActionPhoneCall.in_ok': 'ChatList.Service.Call.incoming',\n 'messageActionPhoneCall.out_ok': 'ChatList.Service.Call.outgoing',\n 'messageActionPhoneCall.missed': 'ChatList.Service.Call.Missed',\n 'messageActionPhoneCall.cancelled': 'ChatList.Service.Call.Cancelled',\n\n 'messageActionGroupCall.started': 'Chat.Service.VoiceChatStarted.Channel',\n 'messageActionGroupCall.started_by': 'Chat.Service.VoiceChatStarted',\n 'messageActionGroupCall.started_byYou': 'Chat.Service.VoiceChatStartedYou',\n 'messageActionGroupCall.ended': 'Chat.Service.VoiceChatFinished.Channel',\n 'messageActionGroupCall.ended_by': 'Chat.Service.VoiceChatFinished',\n 'messageActionGroupCall.ended_byYou': 'Chat.Service.VoiceChatFinishedYou',\n\n 'messageActionBotAllowed': 'Chat.Service.BotPermissionAllowed'\n};\n\nexport type LangPackKey = /* string | */keyof typeof lang | keyof typeof langSign;\n\nexport type FormatterArgument = string | number | Node | FormatterArgument[];\nexport type FormatterArguments = FormatterArgument[];\n\nexport const UNSUPPORTED_LANG_PACK_KEY: LangPackKey = IS_MOBILE ? 'Message.Unsupported.Mobile' : 'Message.Unsupported.Desktop';\n\nnamespace I18n {\n export const strings: Map = new Map();\n export const countriesList: HelpCountry[] = [];\n let pluralRules: Intl.PluralRules;\n\n let cacheLangPackPromise: Promise;\n export let lastRequestedLangCode: string;\n export let lastRequestedNormalizedLangCode: string;\n export let lastAppliedLangCode: string;\n export let requestedServerLanguage = false;\n export let timeFormat: State['settings']['timeFormat'];\n export let isRTL = false;\n\n export const [langCodeNormalized, setLangCodeNormalized] = createSignal();\n\n export function setRTL(rtl: boolean) {\n isRTL = rtl;\n }\n\n function setLangCode(langCode: string) {\n lastRequestedLangCode = langCode;\n lastRequestedNormalizedLangCode = langCode.split('-')[0];\n setLangCodeNormalized(lastRequestedNormalizedLangCode.split('-')[0] as any);\n }\n\n export function getCacheLangPack(): Promise {\n if(cacheLangPackPromise) return cacheLangPackPromise;\n return cacheLangPackPromise = Promise.all([\n stateStorage.get('langPack') as Promise,\n polyfillPromise\n ]).then(([langPack]) => {\n if(!langPack/* || true */) {\n return loadLocalLangPack();\n } else if(DEBUG && false) {\n return getLangPack(langPack.lang_code);\n }/* else if(langPack.appVersion !== App.langPackVersion) {\n return getLangPack(langPack.lang_code);\n } */\n\n if(!lastRequestedLangCode) {\n setLangCode(langPack.lang_code);\n }\n\n applyLangPack(langPack);\n return langPack;\n }).finally(() => {\n cacheLangPackPromise = undefined;\n });\n }\n\n function updateAmPm() {\n if(timeFormat === 'h12') {\n try {\n const dateTimeFormat = getDateTimeFormat({hour: 'numeric', minute: 'numeric', hour12: true});\n const date = new Date();\n date.setHours(0);\n const amText = dateTimeFormat.format(date);\n amPmCache.am = amText.split(/\\s/)[1];\n date.setHours(12);\n const pmText = dateTimeFormat.format(date);\n amPmCache.pm = pmText.split(/\\s/)[1];\n } catch(err) {\n console.error('cannot get am/pm', err);\n amPmCache = {am: 'AM', pm: 'PM'};\n }\n }\n }\n\n export function setTimeFormat(\n format: State['settings']['timeFormat'],\n haveToUpdate = !!timeFormat && timeFormat !== format\n ) {\n timeFormat = format;\n\n updateAmPm();\n\n if(haveToUpdate) {\n cachedDateTimeFormats.clear();\n const elements = Array.from(document.querySelectorAll(`.i18n`)) as HTMLElement[];\n elements.forEach((element) => {\n const instance = weakMap.get(element);\n\n if(instance instanceof IntlDateElement) {\n instance.update();\n }\n });\n }\n }\n\n export function loadLocalLangPack() {\n const defaultCode = App.langPackCode;\n setLangCode(defaultCode);\n return Promise.all([\n import('../lang'),\n import('../langSign'),\n import('../countries')\n ]).then(([lang, langSign, countries]) => {\n const strings: LangPackString[] = [];\n formatLocalStrings(lang.default, strings);\n formatLocalStrings(langSign.default, strings);\n\n const langPack: LangPackDifference = {\n _: 'langPackDifference',\n from_version: 0,\n lang_code: defaultCode,\n strings,\n version: 0,\n local: true,\n countries: countries.default\n };\n return saveLangPack(langPack);\n });\n }\n\n export function loadLangPack(langCode: string, web?: boolean) {\n web = true;\n requestedServerLanguage = true;\n const managers = rootScope.managers;\n return Promise.all([\n managers.apiManager.invokeApiCacheable('langpack.getLangPack', {\n lang_code: langCode,\n lang_pack: web ? 'web' : App.langPack\n }),\n !web && managers.apiManager.invokeApiCacheable('langpack.getLangPack', {\n lang_code: langCode,\n lang_pack: 'android'\n }),\n import('../lang'),\n import('../langSign'),\n managers.apiManager.invokeApiCacheable('help.getCountriesList', {\n lang_code: langCode,\n hash: 0\n }) as Promise,\n polyfillPromise\n ]);\n }\n\n export function getStrings(langCode: string, strings: string[]) {\n return rootScope.managers.apiManager.invokeApi('langpack.getStrings', {\n lang_pack: App.langPack,\n lang_code: langCode,\n keys: strings\n });\n }\n\n export function formatLocalStrings(strings: any, pushTo: LangPackString[] = []) {\n for(const i in strings) {\n // @ts-ignore\n const v = strings[i];\n if(typeof(v) === 'string') {\n pushTo.push({\n _: 'langPackString',\n key: i,\n value: v\n });\n } else {\n pushTo.push({\n _: 'langPackStringPluralized',\n key: i,\n ...v\n });\n }\n }\n\n return pushTo;\n }\n\n export function getLangPack(langCode: string, web?: boolean) {\n setLangCode(langCode);\n return loadLangPack(langCode, web).then(([langPack1, langPack2, localLangPack1, localLangPack2, countries, _]) => {\n let strings: LangPackString[] = [];\n\n [localLangPack1, localLangPack2].forEach((l) => {\n formatLocalStrings(l.default as any, strings);\n });\n\n strings = strings.concat(...[langPack1.strings, langPack2.strings].filter(Boolean));\n\n langPack1.strings = strings;\n langPack1.countries = countries;\n return saveLangPack(langPack1);\n });\n }\n\n export function saveLangPack(langPack: LangPackDifference) {\n langPack.appVersion = App.langPackVersion;\n\n return stateStorage.set({langPack}).then(() => {\n applyLangPack(langPack);\n return langPack;\n });\n }\n\n export const polyfillPromise = (function checkIfPolyfillNeeded() {\n if(typeof(Intl) !== 'undefined' && typeof(Intl.PluralRules) !== 'undefined'/* && false */) {\n return Promise.resolve();\n } else {\n return import('./pluralPolyfill').then((_Intl) => {\n (window as any).Intl = Object.assign(typeof(Intl) !== 'undefined' ? Intl : {}, _Intl.default);\n });\n }\n })();\n\n export function applyLangPack(langPack: LangPackDifference) {\n const currentLangCode = lastRequestedLangCode;\n if(langPack.lang_code !== currentLangCode) {\n return;\n }\n\n try {\n pluralRules = new Intl.PluralRules(lastRequestedNormalizedLangCode);\n } catch(err) {\n console.error('pluralRules error', err);\n pluralRules = new Intl.PluralRules(lastRequestedNormalizedLangCode.split('-', 1)[0]);\n }\n\n try {\n pluralRules = new Intl.PluralRules(langPack.lang_code);\n } catch(err) {\n console.error('pluralRules error', err);\n pluralRules = new Intl.PluralRules(langPack.lang_code.split('-', 1)[0]);\n }\n\n strings.clear();\n\n for(const string of langPack.strings) {\n strings.set(string.key as LangPackKey, string);\n }\n\n if(langPack.countries) {\n countriesList.length = 0;\n countriesList.push(...langPack.countries.countries);\n\n langPack.countries.countries.forEach((country) => {\n if(country.name) {\n const langPackKey: any = country.default_name;\n strings.set(langPackKey, {\n _: 'langPackString',\n key: langPackKey,\n value: country.name\n });\n }\n });\n }\n\n if(lastAppliedLangCode !== currentLangCode) {\n if(lastAppliedLangCode && rootScope.myId) {\n rootScope.managers.appReactionsManager.resetAvailableReactions();\n rootScope.managers.appUsersManager.indexMyself();\n rootScope.managers.dialogsStorage.indexMyDialog();\n }\n\n lastAppliedLangCode = currentLangCode;\n cachedDateTimeFormats.clear();\n updateAmPm();\n rootScope.dispatchEvent('language_change', currentLangCode);\n }\n\n const elements = Array.from(document.querySelectorAll(`.i18n`)) as HTMLElement[];\n elements.forEach((element) => {\n const instance = weakMap.get(element);\n\n if(instance) {\n instance.update();\n }\n });\n }\n\n function pushNextArgument(out: ReturnType, args: FormatterArguments, indexHolder: {i: number}, i?: number) {\n const arg = args[i === undefined ? indexHolder.i++ : i];\n if(Array.isArray(arg)) {\n out.push(...arg as any);\n } else {\n out.push(arg);\n }\n }\n\n export function superFormatter(input: string, args?: FormatterArguments, indexHolder?: {i: number}): Exclude[] {\n if(!indexHolder) { // set starting index for arguments without order\n indexHolder = {i: 0};\n const indexes = input.match(/(%|un)\\d+/g);\n if(indexes?.length) {\n indexHolder.i = Math.max(...indexes.map((str) => +str.replace(/\\D/g, '')));\n }\n }\n\n const out: ReturnType = [];\n const regExp = /(\\*\\*|__)(.+?)\\1|(\\n)|(\\[.+?\\]\\(.*?\\))|un\\d|%\\d\\$.|%\\S/g;\n\n let lastIndex = 0;\n input.replace(regExp, (match, p1: any, p2: any, p3: any, p4: string, offset: number, string: string) => {\n // console.table({match, p1, p2, offset, string});\n\n if(offset > lastIndex) {\n out.push(string.slice(lastIndex, offset));\n }\n\n if(p1) {\n // offset += p1.length;\n let element: HTMLElement;\n switch(p1) {\n case '**': {\n element = document.createElement('b');\n break;\n }\n\n case '__': {\n element = document.createElement('i');\n break;\n }\n }\n\n element.append(...superFormatter(p2, args, indexHolder) as any);\n out.push(element);\n } else if(p3) {\n out.push(document.createElement('br'));\n } else if(p4) {\n const idx = p4.lastIndexOf(']');\n const text = p4.slice(1, idx);\n\n const url = p4.slice(idx + 2, p4.length - 1);\n let a: HTMLAnchorElement;\n if(url && matchUrlProtocol(url)) {\n a = document.createElement('a');\n const wrappedUrl = wrapUrl(url);\n a.href = wrappedUrl.url;\n if(wrappedUrl.onclick) a.setAttribute('onclick', wrappedUrl.onclick + '(this)');\n setBlankToAnchor(a);\n } else {\n a = args[indexHolder.i++] as HTMLAnchorElement;\n\n if(a instanceof DocumentFragment) { // right after wrapRichText\n a = a.firstChild as any;\n }\n\n if(typeof(a) !== 'string') {\n a.textContent = ''; // reset content\n }\n }\n\n const formatted = superFormatter(text, args, indexHolder) as any;\n if(typeof(a) === 'string') {\n out.push(...formatted);\n } else {\n a.append(...formatted);\n out.push(a);\n }\n } else if(args) {\n const index = match.replace(/\\D/g, '');\n pushNextArgument(\n out,\n args,\n indexHolder,\n !index || Number.isNaN(+index) ? undefined : Math.min(args.length - 1, +index - 1)\n );\n }\n\n lastIndex = offset + match.length;\n return '';\n });\n\n if(lastIndex !== input.length) {\n out.push(input.slice(lastIndex));\n }\n\n return out;\n }\n\n export function format(key: LangPackKey, plain: true, args?: FormatterArguments): string;\n export function format(key: LangPackKey, plain?: false, args?: FormatterArguments): ReturnType;\n export function format(key: LangPackKey, plain = false, args?: FormatterArguments): ReturnType | string {\n const str = strings.get(key);\n let input: string;\n if(str) {\n if(str._ === 'langPackStringPluralized' && args?.length) {\n let v = args[0] as number | string;\n if(typeof(v) === 'string') v = +v.replace(/\\D/g, '');\n const s = pluralRules.select(v);\n // @ts-ignore\n input = str[s + '_value'] || str['other_value'];\n } else if(str._ === 'langPackString') {\n input = str.value;\n } else {\n // input = '[' + key + ']';\n input = key;\n }\n } else {\n // input = '[' + key + ']';\n input = key;\n }\n\n const result = superFormatter(input, args);\n if(plain) { // * let's try a hack now... (don't want to replace []() entity)\n return result.map((item) => item instanceof Node ? item.textContent : item).join('');\n } else {\n return result;\n }\n\n /* if(plain) {\n if(args?.length) {\n const regExp = /un\\d|%\\d\\$.|%./g;\n let i = 0;\n input = input.replace(regExp, (match, offset, string) => {\n return '' + args[i++];\n });\n }\n\n return input;\n } else {\n return superFormatter(input, args);\n } */\n }\n\n export const weakMap: WeakMap> = new WeakMap();\n\n export type IntlElementBaseOptions = {\n element?: HTMLElement,\n property?: 'innerText' | 'innerHTML' | 'placeholder' | 'textContent',\n };\n\n abstract class IntlElementBase {\n public element: IntlElementBaseOptions['element'];\n public property: IntlElementBaseOptions['property'];\n\n constructor(options?: Options) {\n this.element = options?.element || document.createElement('span');\n this.element.classList.add('i18n');\n\n this.property = options?.property;\n\n weakMap.set(this.element, this);\n }\n\n abstract update(options?: Options): void;\n }\n\n export type IntlElementOptions = IntlElementBaseOptions & {\n key?: LangPackKey,\n args?: FormatterArguments\n };\n export class IntlElement extends IntlElementBase {\n public key: IntlElementOptions['key'];\n public args: IntlElementOptions['args'];\n\n constructor(options: IntlElementOptions = {}) {\n super({...options, property: options.property ?? 'innerHTML'});\n\n if(options?.key) {\n this.update(options);\n }\n }\n\n public update(options?: IntlElementOptions) {\n safeAssign(this, options);\n\n if(this.property === 'innerHTML') {\n this.element.replaceChildren(...format(this.key, false, this.args) as any);\n if(this.args?.length) {\n this.element.normalize();\n }\n } else {\n // @ts-ignore\n const v = this.element[this.property];\n const formatted = format(this.key, true, this.args);\n\n // * hasOwnProperty won't work here\n if(v === undefined) this.element.dataset[this.property] = formatted;\n else (this.element as HTMLInputElement)[this.property] = formatted;\n }\n }\n\n public compareAndUpdate(options?: IntlElementOptions) {\n if(this.key === options.key && deepEqual(this.args, options.args)) {\n return;\n }\n\n return this.update(options);\n }\n }\n\n const cachedDateTimeFormats: Map = new Map();\n export function getDateTimeFormat(options: Intl.DateTimeFormatOptions = {}) {\n const json = JSON.stringify(options);\n let dateTimeFormat = cachedDateTimeFormats.get(json);\n if(!dateTimeFormat) {\n dateTimeFormat = new Intl.DateTimeFormat(lastRequestedNormalizedLangCode + '-u-hc-' + timeFormat, options);\n cachedDateTimeFormats.set(json, dateTimeFormat);\n }\n\n return dateTimeFormat;\n }\n\n export let amPmCache = {am: 'AM', pm: 'PM'};\n export type IntlDateElementOptions = IntlElementBaseOptions & {\n date?: Date,\n options: Intl.DateTimeFormatOptions\n };\n export class IntlDateElement extends IntlElementBase {\n public date: IntlDateElementOptions['date'];\n public options: IntlDateElementOptions['options'];\n\n constructor(options: IntlDateElementOptions) {\n super({...options, property: options.property ?? 'textContent'});\n setDirection(this.element);\n\n if(options?.date) {\n this.update(options);\n }\n }\n\n public update(options?: IntlDateElementOptions) {\n safeAssign(this, options);\n\n let text: string;\n if(this.options.hour && this.options.minute && Object.keys(this.options).length === 2/* && false */) {\n const hours = this.date.getHours();\n text = ('0' + (timeFormat === 'h12' ? (hours % 12) || 12 : hours)).slice(-2) + ':' + ('0' + this.date.getMinutes()).slice(-2);\n // if(this.options.second) {\n // text += ':' + ('0' + this.date.getSeconds()).slice(-2);\n // }\n\n if(timeFormat === 'h12') {\n text += ' ' + (hours < 12 ? amPmCache.am : amPmCache.pm);\n }\n } else {\n // * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Locale/hourCycle#adding_an_hour_cycle_via_the_locale_string\n const dateTimeFormat = getDateTimeFormat(this.options);\n text = capitalizeFirstLetter(dateTimeFormat.format(this.date));\n }\n\n (this.element as any)[this.property] = text;\n }\n }\n\n export function i18n(key: LangPackKey, args?: FormatterArguments) {\n return new IntlElement({key, args}).element;\n }\n\n export function i18n_(options: IntlElementOptions) {\n return new IntlElement(options).element;\n }\n\n export function _i18n(element: HTMLElement, key: LangPackKey, args?: FormatterArguments, property?: IntlElementOptions['property']) {\n return new IntlElement({element, key, args, property}).element;\n }\n}\n\nexport {I18n};\nexport default I18n;\n\nconst i18n = I18n.i18n;\nexport {i18n};\n\nconst i18n_ = I18n.i18n_;\nexport {i18n_};\n\nconst _i18n = I18n._i18n;\nexport {_i18n};\n\nexport function joinElementsWith>(\n elements: T[],\n joiner: T | string | ((isLast: boolean) => T)\n): T[] {\n const arr = elements.slice(0, 1) as T[];\n for(let i = 1; i < elements.length; ++i) {\n const isLast = (elements.length - 1) === i;\n arr.push(typeof(joiner) === 'function' ? (joiner as any)(isLast) : joiner);\n arr.push(elements[i]);\n }\n\n return arr;\n}\n\n\nexport function join(elements: (Node | string)[], useLast: boolean, plain: true): string;\nexport function join(elements: (Node | string)[], useLast?: boolean, plain?: false): (string | Node)[];\nexport function join(elements: (Node | string)[], useLast: boolean, plain: boolean): string | (string | Node)[];\nexport function join(elements: (Node | string)[], useLast = true, plain?: boolean): string | (string | Node)[] {\n const joined = joinElementsWith(elements, (isLast) => {\n const langPackKey: LangPackKey = isLast && useLast ? 'AutoDownloadSettings.LastDelimeter' : 'AutoDownloadSettings.Delimeter';\n return plain ? I18n.format(langPackKey, true) : i18n(langPackKey);\n });\n\n return plain ? joined.join('') : joined;\n}\n\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.I18n = I18n);\n","export default function isAnyChat(peerId: PeerId) {\n return +peerId < 0;\n}\n","export default function isUser(peerId: PeerId) {\n return +peerId >= 0;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport isAnyChat from '../lib/appManagers/utils/peers/isAnyChat';\nimport isUser from '../lib/appManagers/utils/peers/isUser';\n\nString.prototype.toUserId = function() {\n return (+this).toUserId();\n};\n\nString.prototype.toChatId = function() {\n return (+this).toChatId();\n};\n\nString.prototype.toPeerId = function(isChat?: boolean) {\n return (+this).toPeerId(isChat);\n};\n\nString.prototype.isPeerId = function() {\n return /^[\\d-]/.test(this.toString());\n};\n\n// * don't return just 'this', because Firefox returns empty `Number` class\nNumber.prototype.toUserId = function() {\n return +this;\n};\n\nNumber.prototype.toChatId = function() {\n return Math.abs(this as any);\n};\n\n// * don't return just 'this', because Firefox returns empty `Number` class\nNumber.prototype.toPeerId = function(isChat?: boolean) {\n return isChat === undefined ? +this : (isChat ? -Math.abs(this as number) : +this);\n};\n\nNumber.prototype.isPeerId = function() {\n return true;\n};\n\n[\n ['isUser' as const, isUser],\n ['isAnyChat' as const, isAnyChat]\n].forEach((value) => {\n const newMethod = Array.isArray(value) ? value[0] : value;\n const originMethod = Array.isArray(value) ? value[1] : value;\n // @ts-ignore\n String.prototype[newMethod] = function() {\n // @ts-ignore\n // eslint-disable-next-line no-useless-call\n return originMethod.call(null, this.toString());\n };\n\n // @ts-ignore\n Number.prototype[newMethod] = function() {\n // * don't use just 'this', because Firefox returns empty `Number` class\n // @ts-ignore\n // eslint-disable-next-line no-useless-call\n return originMethod.call(null, +this);\n };\n});\n\ndeclare global {\n interface String {\n toUserId(): UserId;\n toChatId(): ChatId;\n toPeerId(isChat?: boolean): PeerId;\n isPeerId(): this is string;\n\n isUser(): boolean;\n isAnyChat(): boolean;\n }\n\n interface Number {\n toUserId(): UserId;\n toChatId(): ChatId;\n toPeerId(isChat?: boolean): PeerId;\n isPeerId(): this is PeerId;\n\n isUser(): boolean;\n isAnyChat(): boolean;\n }\n}\n\nexport {};\n","export default function bufferConcats(...args: (ArrayBuffer | Uint8Array | number[])[]) {\n const length = args.reduce((acc, v) => acc + ((v as ArrayBuffer).byteLength || (v as Uint8Array).length), 0);\n\n const tmp = new Uint8Array(length);\n\n let lastLength = 0;\n args.forEach((b) => {\n tmp.set(b instanceof ArrayBuffer ? new Uint8Array(b) : b, lastLength);\n lastLength += (b as ArrayBuffer).byteLength || (b as Uint8Array).length;\n });\n\n return tmp/* .buffer */;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport bufferConcats from '../helpers/bytes/bufferConcats';\n\nUint8Array.prototype.concat = function(...args: Array) {\n return bufferConcats(this, ...args);\n};\n\n/* Uint8Array.prototype.toString = function() {\n return String.fromCharCode.apply(null, [...this]);\n}; */\n\nUint8Array.prototype.toJSON = function() {\n return [...this];\n // return {type: 'bytes', value: [...this]};\n};\n\nPromise.prototype.finally = Promise.prototype.finally || function(this: Promise, fn: () => any) {\n const onFinally = (callback: typeof fn) => Promise.resolve(fn()).then(callback);\n return this.then(\n result => onFinally(() => result),\n reason => onFinally(() => Promise.reject(reason))\n );\n};\n\ndeclare global {\n interface Uint8Array {\n concat: (...args: Array) => Uint8Array,\n // toString: () => string,\n toJSON: () => number[],\n // toJSON: () => {type: 'bytes', value: number[]},\n }\n\n interface Promise {\n finally: (onfinally?: () => void) => Promise;\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 deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport {WorkerTaskVoidTemplate} from '../../types';\n\nexport interface ConvertWebPTask extends WorkerTaskVoidTemplate {\n type: 'convertWebp',\n payload: {\n fileName: string,\n bytes: Uint8Array\n }\n};\n\nexport class WebpWorkerController {\n private worker: Worker;\n private convertPromises: {[fileName: string]: CancellablePromise} = {};\n\n private init() {\n this.worker = new Worker(new URL('./webp.worker.ts', import.meta.url), {type: 'module'});\n this.worker.addEventListener('message', (e) => {\n const task = e.data as ConvertWebPTask;\n const payload = task.payload;\n\n const promise = this.convertPromises[payload.fileName];\n if(promise) {\n payload.bytes ? promise.resolve(payload.bytes) : promise.reject();\n delete this.convertPromises[payload.fileName];\n }\n });\n }\n\n private postMessage(data: ConvertWebPTask) {\n if(this.init) {\n this.init();\n this.init = null;\n }\n\n this.worker.postMessage(data);\n }\n\n public convert(fileName: string, bytes: Uint8Array) {\n if(this.convertPromises.hasOwnProperty(fileName)) {\n return this.convertPromises[fileName];\n }\n\n const convertPromise = deferredPromise();\n\n this.postMessage({type: 'convertWebp', payload: {fileName, bytes}});\n\n return this.convertPromises[fileName] = convertPromise;\n }\n}\n\nconst webpWorkerController = new WebpWorkerController();\nMOUNT_CLASS_TO.webpWorkerController = webpWorkerController;\nexport default webpWorkerController;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport Modes from '../config/modes';\nimport {IS_WORKER} from '../helpers/context';\nimport makeError from '../helpers/makeError';\nimport {WorkerTaskTemplate} from '../types';\nimport MTProtoMessagePort from './mtproto/mtprotoMessagePort';\n// import { stringify } from '../helpers/json';\n\nclass LocalStorage> {\n private prefix = '';\n private cache: Partial = {};\n private useStorage = true;\n\n constructor(/* private preserveKeys: (keyof Storage)[] */) {\n if(Modes.test) {\n this.prefix = 't_';\n }\n }\n\n public get(key: T, useCache = true): Storage[T] {\n if(this.cache.hasOwnProperty(key) && useCache) {\n return this.cache[key];\n } else if(this.useStorage) {\n let value: Storage[T];\n try {\n value = localStorage.getItem(this.prefix + (key as string)) as any;\n } catch(err) {\n this.useStorage = false;\n throw makeError('STORAGE_OFFLINE');\n }\n\n if(value !== null) {\n try {\n value = JSON.parse(value);\n } catch(err) {\n // console.error(err);\n }\n } else {\n value = undefined;\n }\n\n return value;\n } else {\n throw makeError('STORAGE_OFFLINE');\n }\n }\n\n public set(obj: Partial, onlyLocal = false) {\n let lastError: any;\n for(const key in obj) {\n if(obj.hasOwnProperty(key)) {\n const value = obj[key];\n this.cache[key] = value;\n\n if(!onlyLocal) {\n try {\n if(!this.useStorage) {\n throw makeError('STORAGE_OFFLINE');\n }\n\n const stringified = JSON.stringify(value);\n localStorage.setItem(this.prefix + key, stringified);\n } catch(err) {\n this.useStorage = false;\n lastError = err;\n }\n }\n }\n }\n\n if(lastError) {\n throw lastError;\n }\n }\n\n public delete(key: keyof Storage, saveLocal = false) {\n // ! it is needed here\n key = '' + (key as string);\n\n if(!saveLocal) {\n delete this.cache[key];\n }\n\n // if(this.useStorage) {\n try {\n localStorage.removeItem(this.prefix + (key as string));\n } catch(err) {\n\n }\n // }\n }\n\n /* public clear(preserveKeys: (keyof Storage)[] = this.preserveKeys) {\n // if(this.useStorage) {\n try {\n let obj: Partial = {};\n if(preserveKeys) {\n preserveKeys.forEach((key) => {\n const value = this.get(key);\n if(value !== undefined) {\n obj[key] = value;\n }\n });\n }\n\n localStorage.clear();\n\n if(preserveKeys) {\n this.set(obj);\n }\n } catch(err) {\n\n }\n // }\n } */\n\n public clear() {\n const keys: string[] = ['dc', 'server_time_offset', 'xt_instance', 'user_auth', 'state_id', 'k_build'];\n for(let i = 1; i <= 5; ++i) {\n keys.push(`dc${i}_server_salt`);\n keys.push(`dc${i}_auth_key`);\n keys.push(`dc${i}_hash`); // only for WebA\n }\n\n for(const key of keys) {\n this.delete(key, true);\n }\n }\n\n public toggleStorage(enabled: boolean, clearWrite: boolean) {\n this.useStorage = enabled;\n\n if(!clearWrite) {\n return;\n }\n\n if(!enabled) {\n this.clear();\n } else {\n return this.set(this.cache);\n }\n }\n}\n\nexport interface LocalStorageProxyTask extends WorkerTaskTemplate {\n type: 'localStorageProxy',\n payload: {\n type: 'set' | 'get' | 'delete' | 'clear' | 'toggleStorage',\n args: any[]\n }\n};\n\nexport interface LocalStorageProxyTaskResponse extends WorkerTaskTemplate {\n type: 'localStorageProxy',\n payload: any\n};\n\nexport default class LocalStorageController> {\n private static STORAGES: LocalStorageController[] = [];\n // private log = (...args: any[]) => console.log('[SW LS]', ...args);\n // private log = (...args: any[]) => {};\n\n private storage: LocalStorage;\n\n constructor(/* private preserveKeys: (keyof Storage)[] = [] */) {\n LocalStorageController.STORAGES.push(this);\n\n if(!IS_WORKER) {\n this.storage = new LocalStorage(/* preserveKeys */);\n }\n }\n\n private async proxy(type: LocalStorageProxyTask['payload']['type'], ...args: LocalStorageProxyTask['payload']['args']): Promise {\n if(IS_WORKER) {\n const port = MTProtoMessagePort.getInstance();\n return port.invoke('localStorageProxy', {type, args});\n }\n\n args = Array.prototype.slice.call(args);\n\n // @ts-ignore\n return this.storage[type].apply(this.storage, args as any);\n }\n\n public get(key: T, useCache?: boolean) {\n return this.proxy('get', key, useCache);\n }\n\n public set(obj: Partial, onlyLocal?: boolean) {\n return this.proxy('set', obj, onlyLocal);\n }\n\n public delete(key: keyof Storage, saveLocal?: boolean) {\n return this.proxy('delete', key, saveLocal);\n }\n\n public clear(/* preserveKeys?: (keyof Storage)[] */) {\n return this.proxy('clear'/* , preserveKeys */);\n }\n\n public toggleStorage(enabled: boolean, clearWrite: boolean) {\n return this.proxy('toggleStorage', enabled, clearWrite);\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 type {AppInstance} from './mtproto/singleInstance';\nimport type {UserAuth} from './mtproto/mtproto_config';\nimport type {DcId} from '../types';\nimport {MOUNT_CLASS_TO} from '../config/debug';\nimport LocalStorageController from './localStorage';\n\nconst sessionStorage = new LocalStorageController<{\n dc: DcId,\n user_auth: UserAuth,\n state_id: number,\n dc1_auth_key: string,\n dc2_auth_key: string,\n dc3_auth_key: string,\n dc4_auth_key: string,\n dc5_auth_key: string,\n dc1_server_salt: string,\n dc2_server_salt: string,\n dc3_server_salt: string,\n dc4_server_salt: string,\n dc5_server_salt: string,\n auth_key_fingerprint: string, // = dc${App.baseDcId}_auth_key.slice(0, 8)\n server_time_offset: number,\n xt_instance: AppInstance,\n kz_version: 'K' | 'Z',\n tgme_sync: {\n canRedirect: boolean,\n ts: number\n },\n k_build: number\n}>(/* ['kz_version'] */);\nMOUNT_CLASS_TO.appStorage = sessionStorage;\nexport default sessionStorage;\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 {IS_MOBILE_SAFARI} from '../../environment/userAgent';\n\nexport default function isSwipingBackSafari(e: TouchEvent | MouseEvent) {\n return IS_MOBILE_SAFARI && e instanceof TouchEvent && e.touches[0].clientX < 30;\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 {IS_MOBILE_SAFARI} from '../environment/userAgent';\nimport {logger} from '../lib/logger';\nimport blurActiveElement from '../helpers/dom/blurActiveElement';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport isSwipingBackSafari from '../helpers/dom/isSwipingBackSafari';\nimport indexOfAndSplice from '../helpers/array/indexOfAndSplice';\n\nexport type NavigationItem = {\n type: 'left' | 'right' | 'im' | 'chat' | 'popup' | 'media' | 'menu' |\n 'esg' | 'multiselect' | 'input-helper' | 'autocomplete-helper' | 'markup' |\n 'global-search' | 'voice' | 'mobile-search' | 'filters' | 'global-search-focus' |\n 'toast' | 'dropdown' | 'forum' | 'stories' | 'stories-focus' | 'topbar-search',\n onPop: (canAnimate: boolean) => boolean | void,\n onEscape?: () => boolean,\n noHistory?: boolean,\n noBlurOnPop?: boolean,\n};\n\nexport class AppNavigationController {\n private navigations: Array;\n private id: number;\n private manual: boolean;\n private log: ReturnType;\n private debug: boolean;\n private currentHash: string; // have to start with # if not empty\n private overriddenHash: string; // have to start with # if not empty\n private isPossibleSwipe: boolean;\n public onHashChange: () => void;\n\n constructor() {\n this.navigations = [];\n this.id = Date.now();\n this.manual = false;\n this.log = logger('NC');\n this.debug = true;\n this.currentHash = window.location.hash;\n this.overriddenHash = '';\n this.isPossibleSwipe = false;\n\n window.addEventListener('popstate', this.onPopState);\n window.addEventListener('keydown', this.onKeyDown, {capture: true, passive: false});\n\n if(IS_MOBILE_SAFARI) {\n const options = {passive: true};\n window.addEventListener('touchstart', this.onTouchStart, options);\n }\n\n history.scrollRestoration = 'manual';\n\n this.pushState(); // * push init state\n }\n\n private onPopState = (e: PopStateEvent) => {\n const hash = window.location.hash;\n const id: number = e.state;\n this.debug && this.log('popstate', e, this.isPossibleSwipe, hash);\n if(hash !== this.currentHash) {\n this.debug && this.log.warn(`hash changed, new=${hash}, current=${this.currentHash}, overridden=${this.overriddenHash}`);\n // fix for returning to wrong hash (e.g. chat -> archive -> chat -> 3x back)\n if(id === this.id && this.overriddenHash && this.overriddenHash !== hash) {\n this.overrideHash(this.overriddenHash);\n } else if(id/* === this.id */ && !this.overriddenHash && hash) {\n this.overrideHash();\n } else {\n this.currentHash = hash;\n this.onHashChange && this.onHashChange();\n // this.replaceState();\n return;\n }\n }\n\n if(id !== this.id/* && !this.navigations.length */) {\n this.pushState();\n\n if(!this.navigations.length) {\n return;\n }\n }\n\n const item = this.navigations.pop();\n if(!item) {\n this.pushState();\n return;\n }\n\n this.manual = !this.isPossibleSwipe;\n this.handleItem(item, this.navigations.length);\n // this.pushState(); // * prevent adding forward arrow\n };\n\n private onKeyDown = (e: KeyboardEvent) => {\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(item.type);\n }\n };\n\n private onTouchStart = (e: TouchEvent) => {\n if(e.touches.length > 1) return;\n this.debug && this.log('touchstart');\n\n if(isSwipingBackSafari(e)) {\n this.isPossibleSwipe = true;\n\n window.addEventListener('touchend', () => {\n setTimeout(() => {\n this.isPossibleSwipe = false;\n }, 100);\n }, {passive: true, once: true});\n }\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 };\n\n public overrideHash(hash: string = '') {\n if(hash && hash[0] !== '#') hash = '#' + hash;\n else if(hash === '#') hash = '';\n\n if(this.currentHash === hash) {\n return;\n }\n\n this.overriddenHash = this.currentHash = hash;\n this.replaceState();\n this.pushState();\n }\n\n private handleItem(item: NavigationItem, wasIndex = this.navigations.indexOf(item)) {\n const good = item.onPop(!this.manual ? false : undefined);\n this.debug && this.log('popstate, navigation:', item, this.navigations);\n if(good === false) { // insert item on the same place, because .push can have different index if new item has appeared\n this.spliceItems(Math.min(this.navigations.length, wasIndex), 0, item);\n } else if(!item.noBlurOnPop) {\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.backByItem(ret.item, ret.index);\n return;\n }\n }\n\n history.back();\n }\n\n public backByItem(item: NavigationItem, index = this.navigations.indexOf(item)) {\n if(index === -1) {\n return;\n }\n\n this.manual = true;\n // ! commented because 'popstate' event will be fired with delay\n // if(index !== (this.navigations.length - 1)) {\n this.navigations.splice(index, 1);\n this.handleItem(item, index);\n // }\n }\n\n private onItemAdded(item: NavigationItem) {\n this.debug && this.log('onItemAdded', item, this.navigations);\n\n if(!item.noHistory) {\n this.pushState();\n }\n }\n\n public pushItem(item: NavigationItem) {\n this.navigations.push(item);\n this.onItemAdded(item);\n }\n\n public unshiftItem(item: NavigationItem) {\n this.navigations.unshift(item);\n this.onItemAdded(item);\n }\n\n public spliceItems(index: number, length: number, ...items: NavigationItem[]) {\n this.navigations.splice(index, length, ...items);\n items.forEach((item) => {\n this.onItemAdded(item);\n });\n }\n\n public pushState() {\n this.debug && this.log('push');\n this.manual = false;\n history.pushState(this.id, '');\n }\n\n public replaceState() {\n this.debug && this.log.warn('replace');\n\n const url = location.origin + location.pathname + location.search + this.overriddenHash;\n history.replaceState(this.id, '', url);\n }\n\n public removeItem(item: NavigationItem) {\n if(!item) {\n return;\n }\n\n indexOfAndSplice(this.navigations, 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 * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport appNavigationController from '../../components/appNavigationController';\n\nexport class AppRuntimeManager {\n public reload() {\n try {\n appNavigationController.spliceItems(0, Infinity);\n appNavigationController.overrideHash();\n location.reload();\n } catch(e) {};\n\n // if(window.chrome && chrome.runtime && chrome.runtime.reload) {\n // chrome.runtime.reload();\n // }\n }\n\n public close() {\n try {\n window.close();\n } catch(e) {}\n }\n\n /**\n * Better to call from event\n */\n public focus() {\n // // @ts-ignore\n // if(window.navigator.mozApps && document.hidden) {\n // // Get app instance and launch it to bring app to foreground\n // // @ts-ignore\n // window.navigator.mozApps.getSelf().onsuccess = function() {\n // this.result.launch();\n // };\n // } else {\n // // @ts-ignore\n // if(window.chrome && chrome.app && chrome.app.window) {\n // // @ts-ignore\n // chrome.app.window.current().focus();\n // }\n\n window.focus();\n // }\n }\n}\n\nconst appRuntimeManager = new AppRuntimeManager();\nexport default appRuntimeManager;\n","export default function copy(obj: T): T {\n // in case of premitives\n if(obj === null || typeof(obj) !== 'object') {\n return obj;\n }\n\n // date objects should be\n if(obj instanceof Date) {\n return new Date(obj.getTime()) as any;\n }\n\n // handle Array\n if(Array.isArray(obj)) {\n // @ts-ignore\n const clonedArr: T = obj.map((el) => copy(el)) as any as T;\n return clonedArr;\n }\n\n if(ArrayBuffer.isView(obj)) {\n // @ts-ignore\n return obj.slice();\n }\n\n // lastly, handle objects\n // @ts-ignore\n const clonedObj = new obj.constructor();\n for(var prop in obj) {\n if(obj.hasOwnProperty(prop)) {\n clonedObj[prop] = copy(obj[prop]);\n }\n }\n return clonedObj;\n}\n","import Modes from '../config/modes';\n\nconst IS_SHARED_WORKER_SUPPORTED = typeof(SharedWorker) !== 'undefined' && !Modes.noSharedWorker/* && false */;\n\nexport default IS_SHARED_WORKER_SUPPORTED;\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 IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport EventListenerBase from './eventListenerBase';\n\nconst FOCUS_EVENT_NAME = IS_TOUCH_SUPPORTED ? 'touchstart' : 'mousemove';\nconst DO_NOT_IDLE = false;\n\nexport class IdleController extends EventListenerBase<{\n change: (idle: boolean) => void\n}> {\n private _isIdle: boolean;\n\n private focusPromise: Promise;\n private focusResolve: () => void;\n\n constructor() {\n super();\n\n this._isIdle = true;\n this.focusPromise = Promise.resolve();\n this.focusResolve = () => {};\n\n window.addEventListener('blur', () => {\n this.isIdle = true;\n\n window.addEventListener('focus', () => {\n this.isIdle = false;\n }, {once: true});\n });\n\n // * Prevent setting online after reloading page\n window.addEventListener(FOCUS_EVENT_NAME, () => {\n this.isIdle = false;\n }, {once: true, passive: true});\n\n this.addEventListener('change', (idle) => {\n if(idle) {\n this.focusPromise = new Promise((resolve) => {\n this.focusResolve = resolve;\n });\n } else {\n this.focusResolve();\n }\n });\n }\n\n public getFocusPromise() {\n return this.focusPromise;\n }\n\n public get isIdle() {\n return this._isIdle;\n }\n\n public set isIdle(value: boolean) {\n if(this._isIdle === value) {\n return;\n }\n\n if(DO_NOT_IDLE && value) {\n return;\n }\n\n this._isIdle = value;\n this.dispatchEvent('change', value);\n }\n}\n\nconst idleController = new IdleController();\nexport default idleController;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport App from '../../config/app';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport tabId from '../../config/tabId';\nimport IS_SHARED_WORKER_SUPPORTED from '../../environment/sharedWorkerSupport';\nimport EventListenerBase from '../../helpers/eventListenerBase';\nimport idleController from '../../helpers/idleController';\nimport {logger} from '../logger';\nimport rootScope from '../rootScope';\nimport sessionStorage from '../sessionStorage';\nimport apiManagerProxy from './mtprotoworker';\n\nexport type AppInstance = {\n id: number,\n idle: boolean,\n time: number\n};\n\nexport type InstanceDeactivateReason = 'version' | 'tabs';\n\nconst CHECK_INSTANCE_INTERVAL = 5000;\nconst DEACTIVATE_TIMEOUT = 30000;\nconst MULTIPLE_TABS_THRESHOLD = 20000;\nconst IS_MULTIPLE_TABS_SUPPORTED = IS_SHARED_WORKER_SUPPORTED;\n\nexport class SingleInstance extends EventListenerBase<{\n activated: () => void,\n deactivated: (reason: InstanceDeactivateReason) => void\n}> {\n private instanceId: number;\n private started: boolean;\n private masterInstance: boolean;\n private deactivateTimeout: number;\n private deactivated: InstanceDeactivateReason;\n private log = logger('INSTANCE');\n\n constructor() {\n super(false);\n\n this.log = logger('INSTANCE');\n this.instanceId = tabId;\n }\n\n public get deactivatedReason() {\n return this.deactivated;\n }\n\n public start() {\n this.reset();\n\n if(!this.started/* && !Config.Navigator.mobile && !Config.Modes.packed */) {\n this.started = true;\n\n idleController.addEventListener('change', this.checkInstance);\n setInterval(this.checkInstance, CHECK_INSTANCE_INTERVAL);\n this.checkInstance();\n\n try {\n document.documentElement.addEventListener('beforeunload', this.clearInstance);\n } catch(e) {}\n }\n }\n\n private reset() {\n this.masterInstance = false;\n this.clearDeactivateTimeout();\n this.deactivated = undefined;\n }\n\n private clearInstance = () => {\n if(this.masterInstance && !this.deactivated) {\n this.log.warn('clear master instance');\n sessionStorage.delete('xt_instance');\n }\n };\n\n public activateInstance() {\n if(this.deactivated) {\n this.reset();\n this.checkInstance(false);\n this.dispatchEvent('activated');\n }\n }\n\n private deactivateInstance(reason: InstanceDeactivateReason) {\n if(this.masterInstance || this.deactivated) {\n return;\n }\n\n this.log.warn('deactivate', reason);\n this.clearDeactivateTimeout();\n this.deactivated = reason;\n\n this.dispatchEvent('deactivated', reason);\n }\n\n private clearDeactivateTimeout() {\n if(this.deactivateTimeout) {\n clearTimeout(this.deactivateTimeout);\n this.deactivateTimeout = 0;\n }\n }\n\n private checkInstance = async(idle = idleController.isIdle) => {\n if(this.deactivated) {\n return;\n }\n\n const time = Date.now();\n const newInstance: AppInstance = {\n id: this.instanceId,\n idle,\n time\n };\n\n const [curInstance, build = App.build] = await Promise.all([\n sessionStorage.get('xt_instance', false),\n sessionStorage.get('k_build', false)\n ]);\n\n if(build > App.build) {\n this.masterInstance = false;\n rootScope.managers.networkerFactory.stopAll();\n this.deactivateInstance('version');\n apiManagerProxy.toggleStorages(false, false);\n return;\n } else if(IS_MULTIPLE_TABS_SUPPORTED) {\n sessionStorage.set({xt_instance: newInstance});\n return;\n }\n\n // this.log('check instance', newInstance, curInstance)\n if(!idle ||\n !curInstance ||\n curInstance.id === this.instanceId ||\n curInstance.time < (time - MULTIPLE_TABS_THRESHOLD)) {\n sessionStorage.set({xt_instance: newInstance});\n\n if(!this.masterInstance) {\n this.masterInstance = true;\n rootScope.managers.networkerFactory.startAll();\n this.log.warn('now master instance', newInstance);\n }\n\n this.clearDeactivateTimeout();\n } else if(this.masterInstance) {\n this.masterInstance = false;\n rootScope.managers.networkerFactory.stopAll();\n this.log.warn('now idle instance', newInstance);\n this.deactivateTimeout ||= window.setTimeout(() => this.deactivateInstance('tabs'), DEACTIVATE_TIMEOUT);\n }\n };\n}\n\nconst singleInstance = new SingleInstance();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.singleInstance = singleInstance);\nexport default singleInstance;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {MESSAGE_ID_OFFSET} from '../../../mtproto/mtproto_config';\n\nexport default function clearMessageId(messageId: number, toServer?: boolean) {\n if(messageId === undefined) {\n return;\n }\n\n messageId = +messageId.toFixed(0);\n if(!toServer) {\n return messageId;\n }\n\n return messageId < MESSAGE_ID_OFFSET ? messageId : messageId % MESSAGE_ID_OFFSET;\n // const q = MESSAGE_ID_OFFSET;\n // if(messageId < q) { // id 0 -> mid 0xFFFFFFFF, so 0xFFFFFFFF must convert to 0\n // return messageId;\n // }\n\n // const l = MESSAGE_ID_INCREMENT - 1;\n // const used = messageId & l;\n // if(used !== l) {\n // messageId -= used + 1;\n // }\n\n // return toServer ? (messageId - q) / MESSAGE_ID_INCREMENT : messageId;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport clearMessageId from './clearMessageId';\n\n/**\n * * will ignore outgoing offset\n */\nexport default function getServerMessageId(messageId: number) {\n return clearMessageId(messageId, true);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport type {PushNotificationObject} from '../serviceWorker/push';\nimport type {ServicePushPingTaskPayload} from '../serviceWorker/serviceMessagePort';\nimport type {NotificationSettings} from '../appManagers/uiNotificationsManager';\nimport type ServiceMessagePort from '../serviceWorker/serviceMessagePort';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport {logger} from '../logger';\nimport I18n, {LangPackKey} from '../langPack';\nimport {IS_MOBILE} from '../../environment/userAgent';\nimport appRuntimeManager from '../appManagers/appRuntimeManager';\nimport copy from '../../helpers/object/copy';\nimport singleInstance from './singleInstance';\nimport EventListenerBase from '../../helpers/eventListenerBase';\nimport getServerMessageId from '../appManagers/utils/messageId/getServerMessageId';\n\nexport type PushSubscriptionNotifyType = 'init' | 'subscribe' | 'unsubscribe';\nexport type PushSubscriptionNotifyEvent = `push_${PushSubscriptionNotifyType}`;\n\nexport type PushSubscriptionNotify = {\n tokenType: number,\n tokenValue: string\n};\n\nconst PING_PUSH_INTERVAL = 10000;\n\nexport class WebPushApiManager extends EventListenerBase<{\n push_notification_click: (n: PushNotificationObject) => void,\n push_init: (n: PushSubscriptionNotify) => void,\n push_subscribe: (n: PushSubscriptionNotify) => void,\n push_unsubscribe: (n: PushSubscriptionNotify) => void\n}> {\n public isAvailable = true;\n private isPushEnabled = false;\n private localNotificationsAvailable = true;\n private started = false;\n private settings: NotificationSettings & {baseUrl?: string} = {} as any;\n private isAliveTO: any;\n private isFirefox = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\n private userVisibleOnly = this.isFirefox ? false : true;\n private log = logger('PUSH-API');\n\n public serviceMessagePort: ServiceMessagePort;\n\n constructor() {\n super(false);\n\n if(!('PushManager' in window) ||\n !('Notification' in window) ||\n !('serviceWorker' in navigator)) {\n this.log.warn('Push messaging is not supported.');\n this.isAvailable = false;\n this.localNotificationsAvailable = false;\n }\n\n if(this.isAvailable && Notification.permission === 'denied') {\n this.log.warn('The user has blocked notifications.');\n }\n }\n\n public start() {\n if(!this.started) {\n this.started = true;\n this.getSubscription();\n this.setUpServiceWorkerChannel();\n }\n }\n\n public setLocalNotificationsDisabled() {\n this.localNotificationsAvailable = false;\n }\n\n public getSubscription() {\n if(!this.isAvailable) {\n return;\n }\n\n navigator.serviceWorker.ready.then((reg) => {\n reg.pushManager.getSubscription().then((subscription) => {\n this.isPushEnabled = !!subscription;\n this.pushSubscriptionNotify('init', subscription);\n }).catch((err) => {\n this.log.error('Error during getSubscription()', err);\n });\n });\n }\n\n public subscribe = () => {\n if(!this.isAvailable) {\n return;\n }\n\n navigator.serviceWorker.ready.then((reg) => {\n reg.pushManager.subscribe({userVisibleOnly: this.userVisibleOnly}).then((subscription) => {\n // The subscription was successful\n this.isPushEnabled = true;\n this.pushSubscriptionNotify('subscribe', subscription);\n }).catch((e) => {\n if(Notification.permission === 'denied') {\n this.log('Permission for Notifications was denied');\n } else {\n this.log('Unable to subscribe to push.', e);\n if(!this.userVisibleOnly) {\n this.userVisibleOnly = true;\n setTimeout(this.subscribe, 0);\n }\n }\n });\n });\n }\n\n public unsubscribe() {\n if(!this.isAvailable) {\n return;\n }\n\n navigator.serviceWorker.ready.then((reg) => {\n reg.pushManager.getSubscription().then((subscription) => {\n this.isPushEnabled = false;\n\n if(subscription) {\n this.pushSubscriptionNotify('unsubscribe', subscription);\n\n setTimeout(() => {\n subscription.unsubscribe().then((successful) => {\n this.isPushEnabled = false;\n }).catch((e) => {\n this.log.error('Unsubscription error: ', e);\n });\n }, 3000);\n }\n }).catch((e) => {\n this.log.error('Error thrown while unsubscribing from ' +\n 'push messaging.', e);\n });\n });\n }\n\n public forceUnsubscribe() {\n if(!this.isAvailable) {\n return;\n }\n\n navigator.serviceWorker.ready.then((reg) => {\n reg.pushManager.getSubscription().then((subscription) => {\n this.log.warn('force unsubscribe', subscription);\n if(!subscription) {\n return;\n }\n\n subscription.unsubscribe().then((successful) => {\n this.log.warn('force unsubscribe successful', successful);\n this.isPushEnabled = false;\n }).catch((e) => {\n this.log.error('Unsubscription error: ', e);\n });\n }).catch((e) => {\n this.log.error('Error thrown while unsubscribing from ' +\n 'push messaging.', e);\n });\n });\n }\n\n public isAliveNotify = () => {\n if(!this.isAvailable || singleInstance.deactivatedReason) {\n return;\n }\n\n this.settings.baseUrl = (location.href || '').replace(/#.*$/, '');\n\n const lang: ServicePushPingTaskPayload['lang'] = {} as any;\n const ACTIONS_LANG_MAP: Record = {\n push_action_mute1d: IS_MOBILE ? 'PushNotification.Action.Mute1d.Mobile' : 'PushNotification.Action.Mute1d',\n push_action_settings: IS_MOBILE ? 'PushNotification.Action.Settings.Mobile' : 'PushNotification.Action.Settings',\n push_message_nopreview: 'PushNotification.Message.NoPreview'\n };\n\n for(const action in ACTIONS_LANG_MAP) {\n lang[action as keyof typeof ACTIONS_LANG_MAP] = I18n.format(ACTIONS_LANG_MAP[action as keyof typeof ACTIONS_LANG_MAP], true);\n }\n\n this.serviceMessagePort.invokeVoid('pushPing', {\n localNotifications: this.localNotificationsAvailable,\n lang: lang,\n settings: this.settings\n });\n\n this.isAliveTO = setTimeout(this.isAliveNotify, PING_PUSH_INTERVAL);\n }\n\n public setSettings(newSettings: WebPushApiManager['settings']) {\n this.settings = copy(newSettings);\n clearTimeout(this.isAliveTO);\n this.isAliveNotify();\n }\n\n public hidePushNotifications() {\n if(!this.isAvailable) {\n return;\n }\n\n this.serviceMessagePort.invokeVoid('notificationsClear', undefined);\n }\n\n public setUpServiceWorkerChannel() {\n if(!this.isAvailable) {\n return;\n }\n\n this.serviceMessagePort.addEventListener('pushClick', (payload) => {\n if(singleInstance.deactivatedReason) {\n appRuntimeManager.reload();\n return;\n }\n\n this.dispatchEvent('push_notification_click', payload);\n });\n\n navigator.serviceWorker.ready.then(this.isAliveNotify);\n }\n\n public pushSubscriptionNotify(event: PushSubscriptionNotifyType, subscription?: PushSubscription) {\n if(subscription) {\n const subscriptionObj: PushSubscriptionJSON = subscription.toJSON();\n if(!subscriptionObj ||\n !subscriptionObj.endpoint ||\n !subscriptionObj.keys ||\n !subscriptionObj.keys.p256dh ||\n !subscriptionObj.keys.auth) {\n this.log.warn('Invalid push subscription', subscriptionObj);\n this.unsubscribe();\n this.isAvailable = false;\n this.pushSubscriptionNotify(event);\n return;\n }\n\n this.log.warn('Push', event, subscriptionObj);\n this.dispatchEvent(('push_' + event) as PushSubscriptionNotifyEvent, {\n tokenType: 10,\n tokenValue: JSON.stringify(subscriptionObj)\n });\n } else {\n this.log.warn('Push', event, false);\n this.dispatchEvent(('push_' + event) as PushSubscriptionNotifyEvent, false as any);\n }\n }\n\n public ignorePushByMid(peerId: PeerId, mid: number) {\n if(!this.isAvailable) {\n return;\n }\n\n this.serviceMessagePort.invokeVoid('shownNotification', peerId + '_' + getServerMessageId(mid));\n }\n}\n\nconst webPushApiManager = new WebPushApiManager();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.webPushApiManager = webPushApiManager);\nexport default webPushApiManager;\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 loadScript(url: string) {\n const script = document.createElement('script');\n const promise = new Promise((resolve) => {\n script.onload = script.onerror = () => {\n resolve(script);\n };\n });\n script.src = url;\n document.body.appendChild(script);\n return promise;\n}\n","export default function tsNow(seconds?: true) {\n const t = Date.now();\n return seconds ? t / 1000 | 0 : t;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport App from '../../config/app';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport Modes from '../../config/modes';\nimport loadScript from '../../helpers/dom/loadScript';\nimport tsNow from '../../helpers/tsNow';\nimport sessionStorage from '../sessionStorage';\n\nexport class TelegramMeWebManager {\n private disabled = /* false && */(Modes.test || !App.domains.includes(location.hostname));\n\n public setAuthorized(canRedirect: boolean) {\n if(this.disabled) {\n return;\n }\n\n return sessionStorage.get('tgme_sync').then((curValue) => {\n const ts = tsNow(true);\n if(\n canRedirect &&\n curValue?.canRedirect === canRedirect &&\n (curValue.ts + 86400) > ts\n ) {\n return;\n }\n\n sessionStorage.set({\n tgme_sync: {\n canRedirect,\n ts\n }\n });\n\n const path = `_websync_?authed=${canRedirect ? '1' : '0'}&version=${encodeURIComponent(App.version + ' ' + App.suffix)}`;\n const urls = [\n '//telegram.me/' + path,\n '//t.me/' + path\n ];\n\n const promises = urls.map((url) => {\n return loadScript(url).then((script) => {\n script.remove();\n });\n });\n\n return Promise.all(promises);\n });\n }\n}\n\nconst telegramMeWebManager = new TelegramMeWebManager();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.telegramMeWebManager = telegramMeWebManager);\nexport default telegramMeWebManager;\n","import {IS_FIREFOX} from './userAgent';\n\nconst IS_WEBRTC_SUPPORTED = !!(typeof(RTCPeerConnection) !== 'undefined' && !IS_FIREFOX);\n\nexport default IS_WEBRTC_SUPPORTED;\n","import IS_WEBRTC_SUPPORTED from './webrtcSupport';\n\nconst IS_CALL_SUPPORTED = IS_WEBRTC_SUPPORTED;\n\nexport default IS_CALL_SUPPORTED;\n","import {IS_SAFARI} from './userAgent';\n\n/*\n * This is used as a workaround for a memory leak in Safari caused by using Transferable objects to\n * transfer data between WebWorkers and the main thread.\n * https://github.com/mapbox/mapbox-gl-js/issues/8771\n *\n * This should be removed once the underlying Safari issue is fixed.\n */\n\nlet CAN_USE_TRANSFERABLES: boolean;\nif(!IS_SAFARI) CAN_USE_TRANSFERABLES = true;\nelse {\n try {\n const match = navigator.userAgent.match(/Version\\/(.+?) /);\n CAN_USE_TRANSFERABLES = +match[1] >= 14;\n } catch(err) {\n CAN_USE_TRANSFERABLES = false;\n }\n}\n\nexport default CAN_USE_TRANSFERABLES;\n","const IS_CANVAS_FILTER_SUPPORTED = 'filter' in (document.createElement('canvas').getContext('2d') || {});\n\nexport default IS_CANVAS_FILTER_SUPPORTED;\n","const IS_GEOLOCATION_SUPPORTED = !!navigator?.geolocation?.getCurrentPosition && false;\n\nexport default IS_GEOLOCATION_SUPPORTED;\n","import IS_WEBRTC_SUPPORTED from './webrtcSupport';\n\nconst IS_GROUP_CALL_SUPPORTED = IS_WEBRTC_SUPPORTED;\n\nexport default IS_GROUP_CALL_SUPPORTED;\n","const IS_WEBP_SUPPORTED = document.createElement('canvas').toDataURL('image/webp').startsWith('data:image/webp');\n\nexport default IS_WEBP_SUPPORTED;\n","import IS_WEBP_SUPPORTED from './webpSupport';\n\nconst IMAGE_MIME_TYPES_SUPPORTED = new Set([\n 'image/jpeg',\n 'image/png',\n 'image/bmp'\n]);\n\nif(IS_WEBP_SUPPORTED) {\n IMAGE_MIME_TYPES_SUPPORTED.add('image/webp');\n}\n\nconst possible: [string, string][] = [\n ['image/jxl', 'data:image/jxl;base64,/woIAAAMABKIAgC4AF3lEgAAFSqjjBu8nOv58kOHxbSN6wxttW1hSaLIODZJJ3BIEkkaoCUzGM6qJAE='],\n ['image/avif', 'data:image/avif;base64,AAAAIGZ0eXBhdmlmAAAAAGF2aWZtaWYxbWlhZk1BMUIAAADybWV0YQAAAAAAAAAoaGRscgAAAAAAAAAAcGljdAAAAAAAAAAAAAAAAGxpYmF2aWYAAAAADnBpdG0AAAAAAAEAAAAeaWxvYwAAAABEAAABAAEAAAABAAABGgAAAB0AAAAoaWluZgAAAAAAAQAAABppbmZlAgAAAAABAABhdjAxQ29sb3IAAAAAamlwcnAAAABLaXBjbwAAABRpc3BlAAAAAAAAAAIAAAACAAAAEHBpeGkAAAAAAwgICAAAAAxhdjFDgQ0MAAAAABNjb2xybmNseAACAAIAAYAAAAAXaXBtYQAAAAAAAAABAAEEAQKDBAAAACVtZGF0EgAKCBgANogQEAwgMg8f8D///8WfhwB8+ErK42A=']\n];\n\nconst promises = possible.map(([mime, data]) => {\n const img = new Image();\n const promise = new Promise((resolve) => {\n img.onload = img.onerror = () => {\n const supported = img.height === 2;\n resolve(supported ? mime : undefined);\n };\n });\n img.src = data;\n return promise;\n});\n\nexport const IMAGE_MIME_TYPES_SUPPORTED_PROMISE = Promise.all(promises).then((mimeTypes) => mimeTypes.filter(Boolean));\n\nexport default IMAGE_MIME_TYPES_SUPPORTED;\n","import {IS_SAFARI, IS_APPLE_MOBILE} from './userAgent';\n\nconst video = document.createElement('video');\nconst IS_WEBM_SUPPORTED = !!video.canPlayType('video/webm') && !IS_SAFARI && !IS_APPLE_MOBILE;\n// mov is not supported in Chrome on macOS\nconst IS_MOV_SUPPORTED = !!video.canPlayType('video/quicktime') || IS_SAFARI || IS_APPLE_MOBILE;\nconst IS_H265_SUPPORTED = !!video.canPlayType('video/mp4; codecs=\"hev1\"');\n\nexport {\n IS_WEBM_SUPPORTED,\n IS_MOV_SUPPORTED,\n IS_H265_SUPPORTED\n};\n","import {IS_MOV_SUPPORTED} from './videoSupport';\n\nexport type VIDEO_MIME_TYPE = 'image/gif' | 'video/mp4' | 'video/webm' | 'video/quicktime';\nconst VIDEO_MIME_TYPES_SUPPORTED: Set = new Set([\n 'image/gif', // have to display it as video\n 'video/mp4',\n 'video/webm'\n]);\n\nif(IS_MOV_SUPPORTED) {\n VIDEO_MIME_TYPES_SUPPORTED.add('video/quicktime');\n}\n\nexport default VIDEO_MIME_TYPES_SUPPORTED;\n","import IMAGE_MIME_TYPES_SUPPORTED from './imageMimeTypesSupport';\nimport VIDEO_MIME_TYPES_SUPPORTED from './videoMimeTypesSupport';\n\nconst arr = [...IMAGE_MIME_TYPES_SUPPORTED].concat([...VIDEO_MIME_TYPES_SUPPORTED]);\n\nconst MEDIA_MIME_TYPES_SUPPORTED = new Set(arr);\n\nexport default MEDIA_MIME_TYPES_SUPPORTED;\n","import {IS_FIREFOX} from './userAgent';\n\nconst IS_PARALLAX_SUPPORTED = !IS_FIREFOX && false;\n\nexport default IS_PARALLAX_SUPPORTED;\n","const IS_SCREEN_SHARING_SUPPORTED = !!('getDisplayMedia' in (navigator?.mediaDevices || {}));\n\nexport default IS_SCREEN_SHARING_SUPPORTED;\n","const IS_VIBRATE_SUPPORTED = !!navigator?.vibrate;\n\nexport default IS_VIBRATE_SUPPORTED;\n","const audio = document.createElement('audio');\nconst IS_OPUS_SUPPORTED = !!(audio.canPlayType && audio.canPlayType('audio/ogg;').replace(/no/, ''))/* && false */;\n\nexport default IS_OPUS_SUPPORTED;\n","let IS_APPLE_MX = false;\n\ntry {\n // Awesome detect from https://stackoverflow.com/a/65412357\n const ctx = document.createElement('canvas').getContext('webgl');\n const extension = ctx.getExtension('WEBGL_debug_renderer_info');\n const renderer: string = extension && ctx.getParameter(extension.UNMASKED_RENDERER_WEBGL) || '';\n if((renderer.match(/Apple/) && !renderer.match(/Apple GPU/)) ||\n ctx.getSupportedExtensions().indexOf('WEBGL_compressed_texture_s3tc_srgb') === -1) {\n IS_APPLE_MX = true;\n }\n} catch(err) {\n\n}\n\nexport default IS_APPLE_MX;\n","const IS_LIVE_STREAM_SUPPORTED = 'serviceWorker' in navigator;\n\nexport default IS_LIVE_STREAM_SUPPORTED;\n","import IS_CALL_SUPPORTED from './callSupport';\nimport CAN_USE_TRANSFERABLES from './canUseTransferables';\nimport IS_CANVAS_FILTER_SUPPORTED from './canvasFilterSupport';\nimport IS_EMOJI_SUPPORTED from './emojiSupport';\nimport IS_GEOLOCATION_SUPPORTED from './geolocationSupport';\nimport IS_GROUP_CALL_SUPPORTED from './groupCallSupport';\nimport IMAGE_MIME_TYPES_SUPPORTED from './imageMimeTypesSupport';\nimport MEDIA_MIME_TYPES_SUPPORTED from './mediaMimeTypesSupport';\nimport IS_PARALLAX_SUPPORTED from './parallaxSupport';\nimport IS_SCREEN_SHARING_SUPPORTED from './screenSharingSupport';\nimport IS_TOUCH_SUPPORTED from './touchSupport';\nimport IS_VIBRATE_SUPPORTED from './vibrateSupport';\nimport VIDEO_MIME_TYPES_SUPPORTED from './videoMimeTypesSupport';\nimport IS_WEBP_SUPPORTED from './webpSupport';\nimport IS_WEBRTC_SUPPORTED from './webrtcSupport';\nimport * as userAgent from './userAgent';\nimport IS_OPUS_SUPPORTED from './opusSupport';\nimport IS_SHARED_WORKER_SUPPORTED from './sharedWorkerSupport';\nimport IS_APPLE_MX from './appleMx';\nimport IS_LIVE_STREAM_SUPPORTED from './liveStreamSupport';\nimport * as IS_VIDEO_SUPPORTED from './videoSupport';\n\nconst ENVIRONMENT = {\n CAN_USE_TRANSFERABLES,\n IS_APPLE_MX,\n IS_CALL_SUPPORTED,\n IS_CANVAS_FILTER_SUPPORTED,\n IS_EMOJI_SUPPORTED,\n IS_GEOLOCATION_SUPPORTED,\n IS_GROUP_CALL_SUPPORTED,\n IS_PARALLAX_SUPPORTED,\n IS_SCREEN_SHARING_SUPPORTED,\n IS_TOUCH_SUPPORTED,\n ...IS_VIDEO_SUPPORTED,\n IS_VIBRATE_SUPPORTED,\n IS_OPUS_SUPPORTED,\n IS_SHARED_WORKER_SUPPORTED,\n IS_WEBP_SUPPORTED,\n IS_WEBRTC_SUPPORTED,\n IS_LIVE_STREAM_SUPPORTED,\n IMAGE_MIME_TYPES_SUPPORTED,\n MEDIA_MIME_TYPES_SUPPORTED,\n VIDEO_MIME_TYPES_SUPPORTED,\n ...userAgent\n};\n\nexport default ENVIRONMENT;\n","// https://stackoverflow.com/a/61676104\nexport default function getTimeFormat(): 'h12' | 'h23' {\n const t = document.createElement('input');\n t.type = 'time';\n t.value = '15:00';\n t.style.visibility = 'hidden';\n document.body.append(t);\n const offsetWidth = t.offsetWidth;\n t.remove();\n const timeFormat = offsetWidth > 110 ? 'h12' : 'h23';\n // console.log('timeFormat', timeFormat, offsetWidth);\n return timeFormat;\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\nconst arrays = {\n 8: new Uint8Array(1),\n 16: new Uint16Array(1),\n 32: new Uint32Array(1)\n};\nexport function nextRandomUint(bits: 8 | 16 | 32) {\n const array = arrays[bits];\n crypto.getRandomValues(array);\n return array[0];\n}\n\nexport function randomLong() {\n return '' + nextRandomUint(32) + nextRandomUint(32) % 0xFFFFFF;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {LiteModeKey} from '../helpers/liteMode';\nimport type {AppMediaPlaybackController} from '../components/appMediaPlaybackController';\nimport type {TopPeerType, MyTopPeer} from '../lib/appManagers/appUsersManager';\nimport type {AccountThemes, AutoDownloadSettings, BaseTheme, NotifyPeer, PeerNotifySettings, Theme, ThemeSettings, WallPaper} from '../layer';\nimport type DialogsStorage from '../lib/storages/dialogs';\nimport type FiltersStorage from '../lib/storages/filters';\nimport type {AuthState, Modify} from '../types';\nimport {IS_MOBILE} from '../environment/userAgent';\nimport getTimeFormat from '../helpers/getTimeFormat';\nimport {nextRandomUint} from '../helpers/random';\nimport App from './app';\nimport {MTAppConfig} from '../lib/mtproto/appConfig';\n\nconst STATE_VERSION = App.version;\nconst BUILD = App.build;\n\n// ! DEPRECATED\nexport type Background = {\n type?: 'color' | 'image' | 'default', // ! DEPRECATED\n blur: boolean,\n highlightingColor?: string,\n color?: string,\n slug?: string, // image slug\n intensity?: number, // pattern intensity\n id: string | number, // wallpaper id\n};\n\nexport type AppTheme = Modify\n}>;\n\nexport type AutoDownloadPeerTypeSettings = {\n contacts: boolean,\n private: boolean,\n groups: boolean,\n channels: boolean\n};\n\nexport type State = {\n allDialogsLoaded: DialogsStorage['allDialogsLoaded'],\n pinnedOrders: DialogsStorage['pinnedOrders'],\n // contactsList: UserId[],\n contactsListCachedTime: number,\n updates: Partial<{\n seq: number,\n pts: number,\n date: number\n }>,\n // filters?: FiltersStorage['filters'], // ! DEPRECATED\n filtersArr?: FiltersStorage['filtersArr'],\n maxSeenMsgId: number,\n stateCreatedTime: number,\n recentEmoji: string[],\n recentCustomEmoji: DocId[],\n topPeersCache: {\n [type in TopPeerType]?: {\n peers: MyTopPeer[],\n cachedTime: number\n }\n },\n recentSearch: PeerId[],\n version: typeof STATE_VERSION,\n build: typeof BUILD,\n authState: AuthState,\n hiddenPinnedMessages: {[peerId: PeerId]: number},\n settings: {\n messagesTextSize: number,\n distanceUnit: 'kilometers' | 'miles',\n sendShortcut: 'enter' | 'ctrlEnter',\n animationsEnabled?: boolean, // ! DEPRECATED\n autoDownload: {\n contacts?: boolean, // ! DEPRECATED\n private?: boolean, // ! DEPRECATED\n groups?: boolean, // ! DEPRECATED\n channels?: boolean, // ! DEPRECATED\n photo: AutoDownloadPeerTypeSettings,\n video: AutoDownloadPeerTypeSettings,\n file: AutoDownloadPeerTypeSettings\n },\n autoDownloadNew: AutoDownloadSettings,\n autoPlay?: { // ! DEPRECATED\n gifs: boolean,\n videos: boolean\n },\n stickers: {\n suggest: 'all' | 'installed' | 'none',\n dynamicPackOrder: boolean,\n loop: boolean\n },\n emoji: {\n suggest: boolean,\n big: boolean\n },\n background?: Background, // ! DEPRECATED\n themes: AppTheme[],\n theme: AppTheme['name'],\n notifications: {\n sound: boolean\n },\n nightTheme?: boolean, // ! DEPRECATED\n timeFormat: 'h12' | 'h23',\n liteMode: {[key in LiteModeKey]: boolean},\n savedAsForum: boolean\n },\n playbackParams: ReturnType,\n keepSigned: boolean,\n chatContextMenuHintWasShown: boolean,\n hideChatJoinRequests: {[peerId: PeerId]: number},\n stateId: number,\n notifySettings: {[k in Exclude]?: PeerNotifySettings.peerNotifySettings},\n confirmedWebViews: BotId[],\n seenTooltips: {\n storySound: boolean\n },\n hiddenSimilarChannels: number[],\n appConfig: MTAppConfig,\n accountThemes: AccountThemes.accountThemes,\n translations: {\n peers: {[peerId: PeerId]: string},\n enabledPeers: {[peerId: PeerId]: boolean},\n enabled: boolean,\n showInMenu: boolean,\n doNotTranslate: TranslatableLanguageISO[]\n },\n shownUploadSpeedTimestamp?: number\n};\n\n// const BACKGROUND_DAY_MOBILE: Background = {\n// blur: false,\n// slug: '',\n// color: '#dbddbb,#6ba587,#d5d88d,#88b884',\n// highlightingColor: 'hsla(86.4, 43.846153%, 45.117647%, .4)',\n// intensity: 0,\n// id: '1'\n// };\n\n// const BACKGROUND_NIGHT_MOBILE: Background = {\n// blur: false,\n// slug: '',\n// color: '#0f0f0f',\n// highlightingColor: 'hsla(0, 0%, 3.82353%, 0.4)',\n// intensity: 0,\n// id: '-1'\n// };\n\nexport const DEFAULT_THEME: Theme = {\n _: 'theme',\n access_hash: '',\n id: '',\n settings: [{\n _: 'themeSettings',\n pFlags: {},\n base_theme: {_: 'baseThemeClassic'},\n accent_color: 0x3390ec,\n message_colors: [0x5CA853],\n wallpaper: {\n _: 'wallPaper',\n pFlags: {\n default: true,\n pattern: true\n },\n access_hash: '',\n document: undefined,\n id: '',\n slug: 'pattern',\n settings: {\n _: 'wallPaperSettings',\n pFlags: {},\n intensity: 50,\n background_color: 0xdbddbb,\n second_background_color: 0x6ba587,\n third_background_color: 0xd5d88d,\n fourth_background_color: 0x88b884\n }\n }\n }, {\n _: 'themeSettings',\n pFlags: {},\n base_theme: {_: 'baseThemeNight'},\n accent_color: 0x8774E1,\n message_colors: [0x8774E1],\n wallpaper: {\n _: 'wallPaper',\n pFlags: {\n default: true,\n pattern: true,\n dark: true\n },\n access_hash: '',\n document: undefined,\n id: '',\n slug: 'pattern',\n settings: {\n _: 'wallPaperSettings',\n pFlags: {},\n intensity: -50,\n background_color: 0xfec496,\n second_background_color: 0xdd6cb9,\n third_background_color: 0x962fbf,\n fourth_background_color: 0x4f5bd5\n }\n }\n }],\n slug: '',\n title: '',\n emoticon: '🏠',\n pFlags: {default: true}\n};\n\nconst makeDefaultAppTheme = (\n name: AppTheme['name'],\n baseTheme: BaseTheme['_'],\n highlightingColor: string\n): AppTheme => {\n return {\n ...DEFAULT_THEME,\n name,\n settings: {\n ...DEFAULT_THEME.settings.find((s) => s.base_theme._ === baseTheme),\n highlightingColor\n }\n };\n};\n\nexport const STATE_INIT: State = {\n allDialogsLoaded: {},\n pinnedOrders: {},\n // contactsList: [],\n contactsListCachedTime: 0,\n updates: {},\n filtersArr: [],\n maxSeenMsgId: 0,\n stateCreatedTime: Date.now(),\n recentEmoji: [],\n recentCustomEmoji: [],\n topPeersCache: {},\n recentSearch: [],\n version: STATE_VERSION,\n build: BUILD,\n authState: {\n _: IS_MOBILE ? 'authStateSignIn' : 'authStateSignQr'\n },\n hiddenPinnedMessages: {},\n settings: {\n messagesTextSize: 16,\n distanceUnit: 'kilometers',\n sendShortcut: 'enter',\n autoDownload: {\n photo: {\n contacts: true,\n private: true,\n groups: true,\n channels: true\n },\n video: {\n contacts: true,\n private: true,\n groups: true,\n channels: true\n },\n file: {\n contacts: true,\n private: true,\n groups: true,\n channels: true\n }\n },\n autoDownloadNew: {\n _: 'autoDownloadSettings',\n file_size_max: 3145728,\n pFlags: {\n video_preload_large: true,\n audio_preload_next: true\n },\n photo_size_max: 1048576,\n video_size_max: 15728640,\n video_upload_maxbitrate: 100,\n small_queue_active_operations_max: 0,\n large_queue_active_operations_max: 0\n },\n stickers: {\n suggest: 'all',\n dynamicPackOrder: true,\n loop: true\n },\n emoji: {\n suggest: true,\n big: true\n },\n themes: [\n makeDefaultAppTheme('day', 'baseThemeClassic', 'hsla(86.4, 43.846153%, 45.117647%, .4)'),\n makeDefaultAppTheme('night', 'baseThemeNight', 'hsla(299.142857, 44.166666%, 37.470588%, .4)')\n ],\n theme: 'system',\n notifications: {\n sound: false\n },\n timeFormat: getTimeFormat(),\n liteMode: {\n all: false,\n animations: false,\n chat: false,\n chat_background: false,\n chat_spoilers: false,\n effects: false,\n effects_premiumstickers: false,\n effects_reactions: false,\n effects_emoji: false,\n emoji: false,\n emoji_messages: false,\n emoji_panel: false,\n gif: false,\n stickers: false,\n stickers_chat: false,\n stickers_panel: false,\n video: false\n },\n savedAsForum: false\n },\n playbackParams: {\n volume: 1,\n muted: false,\n playbackRate: 1,\n playbackRates: {\n voice: 1,\n video: 1,\n audio: 1\n },\n loop: false,\n round: false\n },\n keepSigned: true,\n chatContextMenuHintWasShown: false,\n hideChatJoinRequests: {},\n stateId: nextRandomUint(32),\n notifySettings: {},\n confirmedWebViews: [],\n seenTooltips: {\n storySound: false\n },\n hiddenSimilarChannels: [],\n appConfig: {} as any,\n accountThemes: {} as any,\n translations: {\n peers: {},\n enabledPeers: {},\n enabled: true,\n showInMenu: true,\n doNotTranslate: []\n }\n};\n","export default function compareVersion(v1: string, v2: string): number {\n v1 = v1.split(' ', 1)[0];\n v2 = v2.split(' ', 1)[0];\n const s1 = v1.split('.');\n const s2 = v2.split('.');\n\n for(let i = 0; i < s1.length; ++i) {\n const v1 = +s1[i];\n const v2 = +s2[i];\n if(v1 > v2) return 1;\n else if(v1 < v2) return -1;\n }\n\n return 0;\n}\n","export default function isObject>(object: any): object is T {\n return typeof(object) === 'object' && object !== null;\n}\n","import copy from './copy';\nimport isObject from './isObject';\n\nexport default function validateInitObject(\n initObject: any,\n currentObject: any,\n onReplace?: (key: string) => void,\n previousKey?: string,\n ignorePaths?: Set,\n path?: string\n) {\n for(const key in initObject) {\n const _path = path ? `${path}.${key}` : key;\n if(ignorePaths?.has(_path)) {\n continue;\n }\n\n if(typeof(currentObject[key]) !== typeof(initObject[key])) {\n currentObject[key] = copy(initObject[key]);\n onReplace?.(previousKey || key);\n } else if(isObject(initObject[key])) {\n validateInitObject(initObject[key], currentObject[key], onReplace, previousKey || key, ignorePaths, _path);\n }\n }\n}\n","import {logger} from '../lib/logger';\nimport dT from './dT';\n\nexport function recordPromise>(promise: T, description: string, log?: ReturnType | Console) {\n const perf = performance.now();\n (log || console).warn(dT(), 'start', description);\n promise.then(() => {\n (log || console).warn(dT(), 'end', description, performance.now() - perf);\n });\n return promise;\n}\n\nexport function recordPromiseBound(log: ReturnType | Console) {\n return (...args: [Parameters[0], Parameters[1]]) => {\n return recordPromise(...args, log);\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 App from '../../../../config/app';\nimport DEBUG from '../../../../config/debug';\nimport {AutoDownloadPeerTypeSettings, State, STATE_INIT, Background, AppTheme} from '../../../../config/state';\nimport compareVersion from '../../../../helpers/compareVersion';\nimport copy from '../../../../helpers/object/copy';\nimport validateInitObject from '../../../../helpers/object/validateInitObject';\nimport {UserAuth} from '../../../mtproto/mtproto_config';\nimport rootScope from '../../../rootScope';\nimport stateStorage from '../../../stateStorage';\nimport sessionStorage from '../../../sessionStorage';\nimport {recordPromiseBound} from '../../../../helpers/recordPromise';\n// import RESET_STORAGES_PROMISE from \"../storages/resetStoragesPromise\";\nimport {StoragesResults} from '../storages/loadStorages';\nimport {LogTypes, logger} from '../../../logger';\nimport {WallPaper} from '../../../../layer';\n\nconst REFRESH_EVERY = 24 * 60 * 60 * 1000; // 1 day\n// const REFRESH_EVERY = 1e3;\n// const REFRESH_EVERY_WEEK = 24 * 60 * 60 * 1000 * 7; // 7 days\n\nconst STATE_VERSION = STATE_INIT.version;\nconst BUILD = STATE_INIT.build;\n\nconst ALL_KEYS = Object.keys(STATE_INIT) as any as Array;\n\nconst REFRESH_KEYS: Array = [\n 'contactsListCachedTime',\n 'stateCreatedTime',\n 'maxSeenMsgId',\n 'filtersArr'\n];\n\n// const REFRESH_KEYS_WEEK = ['dialogs', 'allDialogsLoaded', 'updates', 'pinnedOrders'] as any as Array;\n\nasync function loadStateInner() {\n const log = logger('STATE-LOADER', LogTypes.Error);\n\n const totalPerf = performance.now();\n const recordPromise = recordPromiseBound(log);\n\n const promises = ALL_KEYS.map((key) => recordPromise(stateStorage.get(key), 'state ' + key))\n .concat(\n recordPromise(sessionStorage.get('user_auth'), 'auth'),\n recordPromise(sessionStorage.get('state_id'), 'auth'),\n recordPromise(sessionStorage.get('k_build'), 'auth'),\n recordPromise(sessionStorage.get('auth_key_fingerprint'), 'auth'),\n recordPromise(sessionStorage.get(`dc${App.baseDcId}_auth_key`), 'auth')\n )\n .concat( // support old webk format\n recordPromise(stateStorage.get('user_auth'), 'old auth')\n );\n\n const arr = await Promise.all(promises);\n log.warn('promises', performance.now() - totalPerf);\n // await new Promise((resolve) => setTimeout(resolve, 3e3));\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 // const pushed: {key: keyof State, value: State[keyof State]}[] = [];\n const pushedKeys: (keyof State)[] = [];\n const pushToState = (key: T, value: State[T]) => {\n // appStateManager.pushToState(key, value);\n state[key] = value;\n // pushed.push({key, value});\n pushedKeys.push(key);\n };\n\n const replaceState = (_state: State) => {\n // pushed.length = 0;\n pushedKeys.length = 0;\n state = _state;\n pushedKeys.push(...Object.keys(state) as any as typeof pushedKeys);\n // state = appStateManager.setState(_state);\n // appStateManager.storage.set(state);\n };\n\n // let state: State = appStateManager.setState({} as any);\n let state: 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 pushToState(key, copy(STATE_INIT[key]));\n }\n }\n\n arr.splice(0, ALL_KEYS.length);\n\n // * Read auth\n let auth = arr.shift() as UserAuth | number;\n const stateId = arr.shift() as number;\n const sessionBuild = arr.shift() as number;\n const authKeyFingerprint = arr.shift() as string;\n const baseDcAuthKey = arr.shift() as string;\n const shiftedWebKAuth = arr.shift() as UserAuth | number;\n if(!auth && shiftedWebKAuth) { // support old webk auth\n auth = shiftedWebKAuth;\n const keys: string[] = ['dc', 'server_time_offset', 'xt_instance'];\n for(let i = 1; i <= 5; ++i) {\n keys.push(`dc${i}_server_salt`);\n keys.push(`dc${i}_auth_key`);\n }\n\n const values = await Promise.all(keys.map((key) => stateStorage.get(key as any)));\n keys.push('user_auth');\n values.push(typeof(auth) === 'number' || typeof(auth) === 'string' ? {dcID: values[0] || App.baseDcId, date: Date.now() / 1000 | 0, id: auth.toPeerId(false)} as UserAuth : auth);\n\n const obj: any = {};\n keys.forEach((key, idx) => {\n obj[key] = values[idx];\n });\n\n await sessionStorage.set(obj);\n }\n\n /* if(!auth) { // try to read Webogram's session from localStorage\n try {\n const keys = Object.keys(localStorage);\n for(let i = 0; i < keys.length; ++i) {\n const key = keys[i];\n let value: any;\n try {\n value = localStorage.getItem(key);\n value = JSON.parse(value);\n } catch(err) {\n //console.error(err);\n }\n\n sessionStorage.set({\n [key as any]: value\n });\n }\n\n auth = sessionStorage.getFromCache('user_auth');\n } catch(err) {\n this.log.error('localStorage import error', err);\n }\n } */\n\n if(auth) {\n // ! Warning ! DON'T delete this\n state.authState = {_: 'authStateSignedIn'};\n rootScope.dispatchEvent('user_auth', typeof(auth) === 'number' || typeof(auth) === 'string' ?\n {dcID: 0, date: Date.now() / 1000 | 0, id: auth.toPeerId(false)} :\n auth); // * support old version\n }\n\n const resetStorages: Set = new Set();\n const resetState = (preserveKeys: (keyof State)[]) => {\n preserveKeys.push('authState', 'stateId');\n const preserve: Map = new Map(\n preserveKeys.map((key) => [key, state[key]])\n );\n\n state = copy(STATE_INIT);\n\n preserve.forEach((value, key) => {\n // @ts-ignore\n state[key] = value;\n });\n\n const r: (keyof StoragesResults)[] = ['chats', 'dialogs', 'users'];\n for(const key of r) {\n resetStorages.add(key);\n // this.storagesResults[key as keyof AppStateManager['storagesResults']].length = 0;\n }\n\n replaceState(state);\n };\n\n if(state.stateId !== stateId) {\n if(stateId !== undefined) {\n resetState([]);\n }\n\n await sessionStorage.set({\n state_id: state.stateId\n });\n }\n\n if(baseDcAuthKey) {\n const _authKeyFingerprint = baseDcAuthKey.slice(0, 8);\n if(!authKeyFingerprint) { // * migration, preserve settings\n resetState(['settings']);\n } else if(authKeyFingerprint !== _authKeyFingerprint) {\n resetState([]);\n }\n\n if(authKeyFingerprint !== _authKeyFingerprint) {\n await sessionStorage.set({\n auth_key_fingerprint: _authKeyFingerprint\n });\n }\n }\n\n const time = Date.now();\n if((state.stateCreatedTime + REFRESH_EVERY) < time) {\n if(DEBUG) {\n log('will refresh state', state.stateCreatedTime, time);\n }\n\n const r = (keys: typeof REFRESH_KEYS) => {\n keys.forEach((key) => {\n pushToState(key, copy(STATE_INIT[key]));\n\n // const s = appStateManager.storagesResults[key as keyof AppStateManager['storagesResults']];\n // if(s?.length) {\n // appStateManager.resetStorages.add(key as keyof AppStateManager['storagesResults']);\n // s.length = 0;\n // }\n });\n };\n\n r(REFRESH_KEYS);\n\n /* if((state.stateCreatedTime + REFRESH_EVERY_WEEK) < time) {\n if(DEBUG) {\n this.log('will refresh updates');\n }\n\n r(REFRESH_KEYS_WEEK);\n } */\n }\n\n // state = this.state = new Proxy(state, getHandler());\n\n // * migrate auto download settings\n const autoDownloadSettings = state.settings.autoDownload;\n if(autoDownloadSettings?.private !== undefined) {\n const oldTypes = [\n 'contacts' as const,\n 'private' as const,\n 'groups' as const,\n 'channels' as const\n ];\n\n const mediaTypes = [\n 'photo' as const,\n 'video' as const,\n 'file' as const\n ];\n\n mediaTypes.forEach((mediaType) => {\n const peerTypeSettings: AutoDownloadPeerTypeSettings = autoDownloadSettings[mediaType] = {} as any;\n oldTypes.forEach((peerType) => {\n peerTypeSettings[peerType] = autoDownloadSettings[peerType];\n });\n });\n\n oldTypes.forEach((peerType) => {\n delete autoDownloadSettings[peerType];\n });\n\n pushToState('settings', state.settings);\n }\n\n const SKIP_VALIDATING_PATHS: Set = new Set([\n 'settings.themes'\n ]);\n validateInitObject(STATE_INIT, state, (missingKey) => {\n pushToState(missingKey as keyof State, state[missingKey as keyof State]);\n }, undefined, SKIP_VALIDATING_PATHS);\n\n let newVersion: string, oldVersion: string;\n if(state.version !== STATE_VERSION || state.build !== BUILD/* || true */) {\n // reset filters and dialogs if version is older\n if(state.build < 322) {\n pushToState('allDialogsLoaded', copy(STATE_INIT.allDialogsLoaded));\n pushToState('pinnedOrders', copy(STATE_INIT.pinnedOrders));\n pushToState('filtersArr', copy(STATE_INIT.filtersArr));\n\n resetStorages.add('dialogs');\n }\n\n if(compareVersion(state.version, '1.7.1') === -1) {\n let migrated = false;\n // * migrate backgrounds (March 13, 2022; to version 1.3.0)\n if(compareVersion(state.version, '1.3.0') === -1) {\n migrated = true;\n state.settings.theme = copy(STATE_INIT.settings.theme);\n state.settings.themes = copy(STATE_INIT.settings.themes);\n } else if(compareVersion(state.version, '1.7.1') === -1) { // * migrate backgrounds (January 25th, 2023; to version 1.7.1)\n migrated = true;\n const oldThemes = state.settings.themes as any as Array<{\n name: AppTheme['name'],\n background: Background\n }>;\n\n state.settings.themes = copy(STATE_INIT.settings.themes);\n\n try {\n oldThemes.forEach((oldTheme) => {\n const oldBackground = oldTheme.background;\n if(!oldBackground) {\n return;\n }\n\n const newTheme = state.settings.themes.find((t) => t.name === oldTheme.name);\n newTheme.settings.highlightingColor = oldBackground.highlightingColor;\n\n const getColorFromHex = (hex: string) => hex && parseInt(hex.slice(1), 16);\n\n const colors = (oldBackground.color || '').split(',').map(getColorFromHex);\n\n if(oldBackground.color && !oldBackground.slug) {\n newTheme.settings.wallpaper = {\n _: 'wallPaperNoFile',\n id: 0,\n pFlags: {},\n settings: {\n _: 'wallPaperSettings',\n pFlags: {}\n }\n };\n } else {\n const wallPaper: WallPaper.wallPaper = {\n _: 'wallPaper',\n id: 0,\n access_hash: 0,\n slug: oldBackground.slug,\n document: {} as any,\n pFlags: {},\n settings: {\n _: 'wallPaperSettings',\n pFlags: {}\n }\n };\n\n const wallPaperSettings = wallPaper.settings;\n newTheme.settings.wallpaper = wallPaper;\n if(oldBackground.slug && !oldBackground.color) {\n wallPaperSettings.pFlags.blur = oldBackground.blur || undefined;\n } else if(oldBackground.intensity) {\n wallPaperSettings.intensity = oldBackground.intensity;\n wallPaper.pFlags.pattern = true;\n wallPaper.pFlags.dark = oldBackground.intensity < 0 || undefined;\n }\n }\n\n if(colors.length) {\n const wallPaperSettings = newTheme.settings.wallpaper.settings;\n wallPaperSettings.background_color = colors[0];\n wallPaperSettings.second_background_color = colors[1];\n wallPaperSettings.third_background_color = colors[2];\n wallPaperSettings.fourth_background_color = colors[3];\n }\n });\n } catch(err) {\n console.error('migrating themes error', err);\n }\n }\n\n if(migrated) {\n pushToState('settings', state.settings);\n }\n }\n\n if(state.build < 309) {\n state.settings.liteMode.animations = !state.settings.animationsEnabled;\n state.settings.liteMode.video = !state.settings.autoPlay.videos;\n state.settings.liteMode.gif = !state.settings.autoPlay.gifs;\n }\n\n if(state.build < 312 && typeof(state.settings.stickers.suggest) === 'boolean') {\n state.settings.stickers.suggest = state.settings.stickers.suggest ? 'all' : 'none';\n }\n\n // fix typo\n if(state.build <= 432) {\n let changed = false;\n try {\n for(const theme of state.settings.themes) {\n if(!theme.settings.highlightingColor) {\n theme.settings.highlightingColor = (theme.settings as any).highlightningColor;\n delete (theme.settings as any).highlightningColor;\n changed = true;\n }\n }\n } catch(err) {}\n\n if(changed) {\n pushToState('settings', state.settings);\n }\n }\n\n state.appConfig = copy(STATE_INIT.appConfig);\n\n if(compareVersion(state.version, STATE_VERSION) !== 0) {\n newVersion = STATE_VERSION;\n oldVersion = state.version;\n }\n\n pushToState('version', STATE_VERSION);\n pushToState('build', BUILD);\n }\n\n if(sessionBuild !== BUILD && (!sessionBuild || sessionBuild < BUILD)) {\n sessionStorage.set({k_build: BUILD});\n }\n\n // ! probably there is better place for it\n rootScope.settings = state.settings;\n\n if(DEBUG) {\n log('state res', state, copy(state));\n }\n\n // return resolve();\n\n log.warn('total', performance.now() - totalPerf);\n\n // RESET_STORAGES_PROMISE.resolve(appStateManager.resetStorages);\n\n return {state, resetStorages, newVersion, oldVersion, pushedKeys};\n}\n\nlet promise: ReturnType;\nexport default function loadState() {\n return promise ??= loadStateInner();\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 IS_OPUS_SUPPORTED from '../environment/opusSupport';\nimport {IS_SAFARI} from '../environment/userAgent';\nimport {Modify} from '../types';\nimport {logger, LogTypes} from './logger';\nimport apiManagerProxy from './mtproto/mtprotoworker';\nimport type {ConvertWebPTask} from './webp/webpWorkerController';\n\ntype Result = {\n bytes: Uint8Array,\n waveform?: Uint8Array\n};\n\ntype Task = {\n pages: Uint8Array,\n withWaveform: boolean,\n waveform?: Uint8Array,\n callback: {resolve: (result: Result) => void, reject: (err: any) => void},\n timeout: number\n};\n\nexport interface ConvertOpusTask extends Modify {\n type: 'convertOpus'\n}\n\nexport class OpusDecodeController {\n private worker: Worker;\n private wavWorker: Worker;\n private sampleRate = 48000;\n private tasks: Array = [];\n private keepAlive = false;\n private log = logger('OPUS', LogTypes.Error);\n\n public isPlaySupported() {\n return IS_OPUS_SUPPORTED;\n }\n\n public loadWavWorker() {\n if(this.wavWorker) return;\n\n this.wavWorker = new Worker('waveWorker.min.js');\n this.wavWorker.addEventListener('message', (e) => {\n const data = e.data;\n\n this.log('[WAV] got message:', data);\n if(data && data.page) {\n const bytes = data.page;\n this.onTaskEnd(this.tasks.shift(), bytes);\n }\n });\n }\n\n public loadWorker() {\n if(this.worker) return;\n\n this.worker = new Worker('decoderWorker.min.js');\n this.worker.addEventListener('message', (e) => {\n const data = e.data;\n\n this.log('[DECODER] got message', data);\n if(data.type === 'done') {\n // this.log('[DECODER] send done to wav');\n this.wavWorker.postMessage({command: 'done'});\n\n if(data.waveform) {\n this.tasks[0].waveform = data.waveform;\n }\n } else { // e.data contains decoded buffers as float32 values\n // this.log('[DECODER] send encode to wav');\n this.wavWorker.postMessage({\n command: 'encode',\n buffers: e.data\n }, IS_SAFARI ? undefined : data.map((typedArray: Uint8Array) => typedArray.buffer));\n }\n });\n }\n\n public setKeepAlive(keepAlive: boolean) {\n this.keepAlive = keepAlive;\n if(this.keepAlive) {\n this.loadWorker();\n this.loadWavWorker();\n } else if(!this.tasks.length) {\n this.terminateWorkers();\n }\n }\n\n public onTaskEnd(task: Task, result?: Uint8Array) {\n if(!result) {\n task.callback.reject('timeout');\n } else {\n clearTimeout(task.timeout);\n task.callback.resolve({bytes: result, waveform: task.waveform});\n }\n\n if(this.tasks.length) {\n this.executeNewTask(this.tasks[0]);\n }\n\n this.terminateWorkers();\n }\n\n public terminateWorkers(kill = false) {\n if((this.keepAlive || this.tasks.length) && !kill) return;\n\n if(this.worker) {\n this.worker.terminate();\n this.worker = null;\n }\n\n if(this.wavWorker) {\n this.wavWorker.terminate();\n this.wavWorker = null;\n }\n }\n\n public executeNewTask(task: Task) {\n this.worker.postMessage({\n command: 'init',\n decoderSampleRate: this.sampleRate,\n outputBufferSampleRate: this.sampleRate\n });\n\n this.wavWorker.postMessage({\n command: 'init',\n wavBitDepth: 16,\n wavSampleRate: this.sampleRate\n });\n\n // console.log('sending command to worker:', task);\n // setTimeout(() => {\n this.log('[DECODER] send decode');\n this.worker.postMessage({\n command: 'decode',\n pages: task.pages,\n waveform: task.withWaveform\n }, IS_SAFARI ? undefined : [task.pages.buffer]);\n // }, 1e3);\n\n task.timeout = window.setTimeout(() => {\n this.log.error('decode timeout'/* , task */);\n\n this.terminateWorkers(true);\n if(this.tasks.length) {\n this.loadWorker();\n this.loadWavWorker();\n }\n\n this.onTaskEnd(this.tasks.shift());\n }, 10e3);\n }\n\n public pushDecodeTask(pages: Uint8Array, withWaveform: boolean) {\n return new Promise((resolve, reject) => {\n const task = {\n pages,\n withWaveform,\n callback: {resolve, reject},\n timeout: 0\n };\n\n this.loadWorker();\n this.loadWavWorker();\n\n if(this.tasks.push(task) === 1) {\n this.executeNewTask(task);\n }\n });\n }\n\n public async decode(typedArray: Uint8Array, withWaveform = false) {\n return this.pushDecodeTask(typedArray, withWaveform).then(async(result) => {\n const dataBlob = new Blob([result.bytes], {type: 'audio/wav'});\n return {url: await apiManagerProxy.invoke('createObjectURL', dataBlob), waveform: result.waveform};\n });\n }\n}\n\nconst opusDecodeController = new OpusDecodeController();\nMOUNT_CLASS_TO.opusDecodeController = opusDecodeController;\nexport default opusDecodeController;\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 {CryptoMethods} from './crypto_methods';\nimport SuperMessagePort from '../mtproto/superMessagePort';\nimport {Awaited} from '../../types';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport {IS_WORKER} from '../../helpers/context';\n\ntype CryptoEvent = {\n invoke: (payload: {method: T, args: Parameters}) => ReturnType,\n port: (payload: void, source: MessageEventSource, event: MessageEvent) => void,\n terminate: () => void\n};\n\nexport class CryptoMessagePort extends SuperMessagePort {\n private lastIndex: number;\n\n constructor() {\n super('CRYPTO');\n this.lastIndex = -1;\n }\n\n public invokeCryptoNew({method, args, transfer}: {\n method: T,\n args: Parameters,\n transfer?: Transferable[]\n }): Promise>> {\n const payload = {method, args};\n const listeners = this.listeners['invoke'];\n if(listeners?.size) { // already in worker\n // try {\n let result: any = listeners.values().next().value.callback(payload);\n if(!IS_WORKER && !(result instanceof Promise)) {\n result = Promise.resolve(result);\n }\n\n return result;\n // } catch(err) {\n // return Promise.reject(err);\n // }\n }\n\n const sendPortIndex = method === 'aes-encrypt' || method === 'aes-decrypt' ?\n this.lastIndex = (this.lastIndex + 1) % this.sendPorts.length :\n 0;\n // @ts-ignore\n return this.invoke('invoke', payload, undefined, this.sendPorts[sendPortIndex], transfer);\n }\n\n public invokeCrypto(method: T, ...args: Parameters): Promise>> {\n return this.invokeCryptoNew({method, args});\n }\n}\n\nconst cryptoMessagePort = new CryptoMessagePort();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.cryptoMessagePort = cryptoMessagePort);\nexport default cryptoMessagePort;\n","export default function toArray(value: T | T[]): T[] {\n return Array.isArray(value) ? value : [value];\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\n// https://www.iana.org/assignments/media-types/media-types.xhtml\nexport default function blobSafeMimeType(mimeType: string) {\n if([\n 'image/jpeg',\n 'image/png',\n 'image/gif',\n 'image/svg+xml',\n 'image/webp',\n 'image/bmp',\n 'image/avif',\n 'image/jxl',\n 'video/mp4',\n 'video/webm',\n 'video/quicktime',\n 'audio/ogg',\n 'audio/mpeg',\n 'audio/mp4',\n 'audio/wav', // though it is not in list\n 'application/json',\n 'application/pdf'\n ].indexOf(mimeType) === -1) {\n return 'application/octet-stream';\n }\n\n return mimeType;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport toArray from '../array/toArray';\nimport blobSafeMimeType from './blobSafeMimeType';\n\nexport default function blobConstruct(blobParts: Array | T, mimeType: string = ''): Blob {\n blobParts = toArray(blobParts);\n const safeMimeType = blobSafeMimeType(mimeType);\n const blob = new Blob(blobParts, {type: safeMimeType});\n return blob;\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 blobConstruct from '../../helpers/blob/blobConstruct';\nimport StreamWriter from './streamWriter';\n\nexport default class MemoryWriter implements StreamWriter {\n private bytes: Uint8Array;\n\n constructor(\n private mimeType: string,\n private size: number,\n private saveFileCallback?: (blob: Blob) => Promise\n ) {\n this.bytes = new Uint8Array(size);\n }\n\n public async write(part: Uint8Array, offset: number) {\n // sometimes file size can be bigger than the prov\n const endOffset = offset + part.byteLength;\n if(endOffset > this.bytes.byteLength) {\n const newBytes = new Uint8Array(endOffset);\n newBytes.set(this.bytes, 0);\n this.bytes = newBytes;\n }\n\n this.bytes.set(part, offset);\n };\n\n public truncate() {\n this.bytes = new Uint8Array();\n }\n\n public trim(size: number) {\n this.bytes = this.bytes.slice(0, size);\n }\n\n public finalize(saveToStorage = true) {\n const blob = blobConstruct(this.bytes, this.mimeType);\n\n if(saveToStorage && this.saveFileCallback) {\n this.saveFileCallback(blob);\n }\n\n return blob;\n }\n\n public getParts() {\n return this.bytes;\n }\n\n public replaceParts(parts: Uint8Array) {\n this.bytes = parts;\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 Modes from '../../config/modes';\nimport blobConstruct from '../../helpers/blob/blobConstruct';\nimport MemoryWriter from './memoryWriter';\nimport FileManager from './memoryWriter';\nimport FileStorage from './fileStorage';\nimport makeError from '../../helpers/makeError';\nimport deferredPromise from '../../helpers/cancellablePromise';\n\nexport type CacheStorageDbName = 'cachedFiles' | 'cachedStreamChunks' | 'cachedAssets';\n\nexport default class CacheStorageController implements FileStorage {\n private static STORAGES: CacheStorageController[] = [];\n private openDbPromise: Promise;\n\n private useStorage = true;\n\n // private log: ReturnType = logger('CS');\n\n constructor(private dbName: CacheStorageDbName) {\n if(Modes.test) {\n this.dbName += '_test';\n }\n\n if(CacheStorageController.STORAGES.length) {\n this.useStorage = CacheStorageController.STORAGES[0].useStorage;\n }\n\n this.openDatabase();\n CacheStorageController.STORAGES.push(this);\n }\n\n private openDatabase(): Promise {\n return this.openDbPromise ?? (this.openDbPromise = caches.open(this.dbName));\n }\n\n public delete(entryName: string) {\n return this.timeoutOperation((cache) => cache.delete('/' + entryName));\n }\n\n public deleteAll() {\n return caches.delete(this.dbName);\n }\n\n public get(entryName: string) {\n return this.timeoutOperation((cache) => cache.match('/' + entryName));\n }\n\n public save(entryName: string, response: Response) {\n // return new Promise((resolve) => {}); // DEBUG\n return this.timeoutOperation((cache) => cache.put('/' + entryName, response));\n }\n\n public getFile(fileName: string, method: 'blob' | 'json' | 'text' = 'blob'): Promise {\n // if(method === 'blob') {\n // return Promise.reject(makeError('NO_ENTRY_FOUND'));\n // }\n\n // const str = `get fileName: ${fileName}`;\n // console.time(str);\n return this.get(fileName).then((response) => {\n if(!response) {\n // console.warn('getFile:', response, fileName);\n throw makeError('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 public saveFile(fileName: string, blob: Blob | Uint8Array) {\n // return Promise.resolve(blobConstruct([blob]));\n if(!(blob instanceof Blob)) {\n blob = blobConstruct(blob);\n }\n\n const response = new Response(blob, {\n headers: {\n 'Content-Length': '' + blob.size\n }\n });\n\n return this.save(fileName, response).then(() => blob as Blob);\n }\n\n public timeoutOperation(callback: (cache: Cache) => Promise) {\n if(!this.useStorage) {\n return Promise.reject(makeError('STORAGE_OFFLINE'));\n }\n\n return new Promise(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 this.useStorage = false;\n this.openDbPromise = undefined;\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 prepareWriting(fileName: string, fileSize: number, mimeType: string) {\n return {\n deferred: deferredPromise(),\n getWriter: () => {\n const writer = new MemoryWriter(mimeType, fileSize, (blob) => {\n return this.saveFile(fileName, blob).catch(() => blob);\n });\n\n return writer;\n }\n };\n }\n\n public static toggleStorage(enabled: boolean, clearWrite: boolean) {\n return Promise.all(this.STORAGES.map((storage) => {\n storage.useStorage = enabled;\n\n if(!clearWrite) {\n return;\n }\n\n if(!enabled) {\n return storage.deleteAll();\n }\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 CacheStorageController from '../lib/files/cacheStorage';\nimport AppStorage from '../lib/storage';\nimport sessionStorage from '../lib/sessionStorage';\nimport noop from './noop';\n\nexport default function toggleStorages(enabled: boolean, clearWrite: boolean) {\n return Promise.all([\n AppStorage.toggleStorage(enabled, clearWrite),\n CacheStorageController.toggleStorage(enabled, clearWrite),\n sessionStorage.toggleStorage(enabled, clearWrite)\n ]).then(noop, noop);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {WebPushApiManager} from '../mtproto/webPushApiManager';\nimport type {PushNotificationObject} from './push';\nimport type {MyUploadFile} from '../mtproto/apiFileManager';\nimport SuperMessagePort from '../mtproto/superMessagePort';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport {InputFileLocation, InputGroupCall} from '../../layer';\nimport {GroupCallRtmpState} from '../appManagers/appGroupCallsManager';\n\nexport type ServicePushPingTaskPayload = {\n localNotifications: boolean,\n lang: {\n push_action_mute1d: string\n push_action_settings: string\n push_message_nopreview: string\n },\n settings: WebPushApiManager['settings']\n};\n\nexport type ServiceRequestFilePartTaskPayload = {\n docId: DocId,\n dcId: number,\n offset: number,\n limit: number\n};\n\nexport type ServiceRequestRtmpPartTaskPayload = {\n request: InputFileLocation.inputGroupCallStream,\n dcId: number,\n};\n\nexport type ServiceDownloadTaskPayload = {\n headers: any,\n id: string\n};\n\nexport type ServiceEvent = {\n port: (payload: void, source: MessageEventSource, event: MessageEvent) => void\n};\n\nexport default class ServiceMessagePort extends SuperMessagePort<{\n // from main thread to service worker\n notificationsClear: () => void,\n toggleStorages: (payload: {enabled: boolean, clearWrite: boolean}) => void,\n pushPing: (payload: ServicePushPingTaskPayload, source: MessageEventSource, event: MessageEvent) => void,\n hello: (payload: void, source: MessageEventSource, event: MessageEvent) => void,\n shownNotification: (payload: string) => void,\n leaveRtmpCall: (payload: [Long, boolean]) => void,\n toggleStreamInUse: (payload: {url: string, inUse: boolean}) => void,\n\n // from mtproto worker\n download: (payload: ServiceDownloadTaskPayload) => void,\n downloadChunk: (payload: {id: ServiceDownloadTaskPayload['id'], chunk: Uint8Array}) => void\n downloadFinalize: (payload: ServiceDownloadTaskPayload['id']) => void,\n downloadCancel: (payload: ServiceDownloadTaskPayload['id']) => void\n}, {\n // to main thread\n pushClick: (payload: PushNotificationObject) => void,\n hello: (payload: void, source: MessageEventSource) => void,\n share: (payload: ShareData) => void,\n rtmpStreamTime: (payload: {callId: Long, time: string}) => void,\n rtmpStreamDestroyed: (payload: Long) => void,\n downloadRequestReceived: (payload: string) => void,\n\n // to mtproto worker\n requestFilePart: (payload: ServiceRequestFilePartTaskPayload) => MaybePromise,\n cancelFilePartRequests: (payload: DocId) => void,\n requestRtmpState: (payload: InputGroupCall) => MaybePromise,\n requestRtmpPart: (payload: ServiceRequestRtmpPartTaskPayload) => MaybePromise,\n} & ServiceEvent, Master> {\n constructor() {\n super('SERVICE');\n\n MOUNT_CLASS_TO && (MOUNT_CLASS_TO.serviceMessagePort = this);\n }\n}\n","export const DEEP_PATH_JOINER = '\\x01';\n\nexport function joinDeepPath(...args: any[]) {\n return args.join(DEEP_PATH_JOINER);\n}\n\nexport function splitDeepPath(path: string) {\n return path.split(DEEP_PATH_JOINER);\n}\n\nexport default function setDeepProperty(\n object: any,\n key: string,\n value?: any,\n deleteIfUndefined?: boolean\n) {\n const splitted = key.split(DEEP_PATH_JOINER);\n const length = splitted.length;\n let lastObject = object/* , fractalPart: string */; // fix fractal number key\n for(let i = 0; i < length - 1; ++i) {\n const part = splitted[i];\n // if(fractalPart) {\n // part = fractalPart + '.' + part;\n // fractalPart = undefined;\n // } else if(!Number.isNaN(+part)) {\n // fractalPart = part;\n // continue;\n // }\n lastObject = lastObject[part] ??= {};\n }\n\n const lastKey = /* (fractalPart ? fractalPart + '.' : '') + */splitted[length - 1];\n if(value === undefined && deleteIfUndefined/* && arguments.length === 2 */) {\n delete lastObject[lastKey];\n } else {\n lastObject[lastKey] = value;\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 type {InputFileLocation, InputGeoPoint, InputStickerSet, InputWebFileLocation} from '../layer';\nimport type {DownloadOptions} from '../lib/mtproto/apiFileManager';\n\nconst FILENAME_JOINER = '_';\n\nexport function getFileNameByLocation(location: InputFileLocation | InputWebFileLocation, options?: Partial<{\n fileName: string,\n downloadId: string\n}>) {\n const fileName = '';// (options?.fileName || '').split('.');\n const ext = fileName[fileName.length - 1] || '';\n\n let str: string;\n switch(location._) {\n case 'inputPhotoFileLocation': {\n str = ['photo', fileName[0], location.id, location.thumb_size].filter(Boolean).join(FILENAME_JOINER);\n break;\n }\n\n case 'inputDocumentFileLocation': {\n str = ['document', fileName[0], location.id, location.thumb_size].filter(Boolean).join(FILENAME_JOINER);\n break;\n }\n\n case 'inputPeerPhotoFileLocation':\n str = ['peerPhoto', location.photo_id, location.pFlags.big ? 'big' : 'small'].join(FILENAME_JOINER);\n break;\n\n case 'inputStickerSetThumb': {\n const id = (location.stickerset as InputStickerSet.inputStickerSetID).id ||\n (location.stickerset as InputStickerSet.inputStickerSetShortName).short_name ||\n (location.stickerset as InputStickerSet.inputStickerSetDice).emoticon ||\n location.stickerset._;\n str = ['stickerSetThumb', id, location.thumb_version].join(FILENAME_JOINER);\n break;\n }\n\n case 'inputFileLocation': {\n str = [location.volume_id, location.local_id].join(FILENAME_JOINER);\n break;\n }\n\n case 'inputWebFileLocation': {\n str = ['webFile', location.url].join(FILENAME_JOINER);\n break;\n }\n\n case 'inputWebFileGeoPointLocation': {\n const geoPoint = location.geo_point as InputGeoPoint.inputGeoPoint;\n str = ['geoPoint', geoPoint.lat, geoPoint.long, location.w, location.h, location.zoom, location.scale].join(FILENAME_JOINER);\n break;\n }\n\n default: {\n console.error('Unrecognized location:', location);\n str = '';\n break;\n }\n }\n\n return str + (options?.downloadId ? '_download' : '') + (ext ? '.' + ext : ext);\n}\n\nexport type FileURLType = 'photo' | 'thumb' | 'document' | 'stream' | 'download';\nexport function getFileURL(type: FileURLType, options: DownloadOptions) {\n // console.log('getFileURL', location);\n // const perf = performance.now();\n const encoded = encodeURIComponent(JSON.stringify(options));\n // console.log('getFileURL encode:', performance.now() - perf, encoded);\n\n return /* '/' + */type + '/' + encoded;\n}\n","import {InputWebFileLocation} from '../../../../layer';\n\nexport default function isWebFileLocation(location: any): location is InputWebFileLocation {\n return location?._.includes('inputWebFile');\n}\n","import type {MyPhoto} from '../../../appManagers/appPhotosManager';\nimport type {ThumbStorageMedia} from '../../thumbs';\nimport type {WebDocument} from '../../../../layer';\nimport {getFileNameByLocation} from '../../../../helpers/fileName';\nimport isWebFileLocation from '../../../appManagers/utils/webFiles/isWebFileLocation';\n\nexport default function getThumbKey(media: ThumbStorageMedia) {\n if(isWebFileLocation(media)) {\n return getFileNameByLocation(media);\n }\n\n return media._ + ((media as MyPhoto).id ?? (media as WebDocument).url);\n}\n","import type {ThumbCache} from '../../thumbs';\n\nexport default function generateEmptyThumb(type: string): ThumbCache {\n return {downloaded: 0, url: '', type};\n}\n","export default function getStickerThumbKey(docId: DocId, toneIndex?: number | string) {\n return docId + (toneIndex !== undefined ? '-' + toneIndex : '');\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {Awaited} from '../types';\n\nexport default function callbackify, R>(\n smth: T,\n callback: (result: Awaited) => R\n): T extends Promise ? Promise> : R {\n if(smth instanceof Promise) {\n // @ts-ignore\n return smth.then(callback);\n } else {\n return callback(smth as any) as any;\n }\n}\n","import {MESSAGE_ID_OFFSET} from '../../../mtproto/mtproto_config';\n\nexport default function isLegacyMessageId(messageId: number) {\n return typeof(messageId) === 'number' && messageId < MESSAGE_ID_OFFSET;\n}\n","import { $PROXY, $TRACK, getListener, batch, createSignal } from 'solid-js';\n\nconst $RAW = Symbol(\"store-raw\"),\n $NODE = Symbol(\"store-node\"),\n $HAS = Symbol(\"store-has\"),\n $SELF = Symbol(\"store-self\");\nfunction wrap$1(value) {\n let p = value[$PROXY];\n if (!p) {\n Object.defineProperty(value, $PROXY, {\n value: p = new Proxy(value, proxyTraps$1)\n });\n if (!Array.isArray(value)) {\n const keys = Object.keys(value),\n desc = Object.getOwnPropertyDescriptors(value);\n for (let i = 0, l = keys.length; i < l; i++) {\n const prop = keys[i];\n if (desc[prop].get) {\n Object.defineProperty(value, prop, {\n enumerable: desc[prop].enumerable,\n get: desc[prop].get.bind(p)\n });\n }\n }\n }\n }\n return p;\n}\nfunction isWrappable(obj) {\n let proto;\n return obj != null && typeof obj === \"object\" && (obj[$PROXY] || !(proto = Object.getPrototypeOf(obj)) || proto === Object.prototype || Array.isArray(obj));\n}\nfunction unwrap(item, set = new Set()) {\n let result, unwrapped, v, prop;\n if (result = item != null && item[$RAW]) return result;\n if (!isWrappable(item) || set.has(item)) return item;\n if (Array.isArray(item)) {\n if (Object.isFrozen(item)) item = item.slice(0);else set.add(item);\n for (let i = 0, l = item.length; i < l; i++) {\n v = item[i];\n if ((unwrapped = unwrap(v, set)) !== v) item[i] = unwrapped;\n }\n } else {\n if (Object.isFrozen(item)) item = Object.assign({}, item);else set.add(item);\n const keys = Object.keys(item),\n desc = Object.getOwnPropertyDescriptors(item);\n for (let i = 0, l = keys.length; i < l; i++) {\n prop = keys[i];\n if (desc[prop].get) continue;\n v = item[prop];\n if ((unwrapped = unwrap(v, set)) !== v) item[prop] = unwrapped;\n }\n }\n return item;\n}\nfunction getNodes(target, symbol) {\n let nodes = target[symbol];\n if (!nodes) Object.defineProperty(target, symbol, {\n value: nodes = Object.create(null)\n });\n return nodes;\n}\nfunction getNode(nodes, property, value) {\n if (nodes[property]) return nodes[property];\n const [s, set] = createSignal(value, {\n equals: false,\n internal: true\n });\n s.$ = set;\n return nodes[property] = s;\n}\nfunction proxyDescriptor$1(target, property) {\n const desc = Reflect.getOwnPropertyDescriptor(target, property);\n if (!desc || desc.get || !desc.configurable || property === $PROXY || property === $NODE) return desc;\n delete desc.value;\n delete desc.writable;\n desc.get = () => target[$PROXY][property];\n return desc;\n}\nfunction trackSelf(target) {\n getListener() && getNode(getNodes(target, $NODE), $SELF)();\n}\nfunction ownKeys(target) {\n trackSelf(target);\n return Reflect.ownKeys(target);\n}\nconst proxyTraps$1 = {\n get(target, property, receiver) {\n if (property === $RAW) return target;\n if (property === $PROXY) return receiver;\n if (property === $TRACK) {\n trackSelf(target);\n return receiver;\n }\n const nodes = getNodes(target, $NODE);\n const tracked = nodes[property];\n let value = tracked ? tracked() : target[property];\n if (property === $NODE || property === $HAS || property === \"__proto__\") return value;\n if (!tracked) {\n const desc = Object.getOwnPropertyDescriptor(target, property);\n if (getListener() && (typeof value !== \"function\" || target.hasOwnProperty(property)) && !(desc && desc.get)) value = getNode(nodes, property, value)();\n }\n return isWrappable(value) ? wrap$1(value) : value;\n },\n has(target, property) {\n if (property === $RAW || property === $PROXY || property === $TRACK || property === $NODE || property === $HAS || property === \"__proto__\") return true;\n getListener() && getNode(getNodes(target, $HAS), property)();\n return property in target;\n },\n set() {\n return true;\n },\n deleteProperty() {\n return true;\n },\n ownKeys: ownKeys,\n getOwnPropertyDescriptor: proxyDescriptor$1\n};\nfunction setProperty(state, property, value, deleting = false) {\n if (!deleting && state[property] === value) return;\n const prev = state[property],\n len = state.length;\n if (value === undefined) {\n delete state[property];\n if (state[$HAS] && state[$HAS][property] && prev !== undefined) state[$HAS][property].$();\n } else {\n state[property] = value;\n if (state[$HAS] && state[$HAS][property] && prev === undefined) state[$HAS][property].$();\n }\n let nodes = getNodes(state, $NODE),\n node;\n if (node = getNode(nodes, property, prev)) node.$(() => value);\n if (Array.isArray(state) && state.length !== len) {\n for (let i = state.length; i < len; i++) (node = nodes[i]) && node.$();\n (node = getNode(nodes, \"length\", len)) && node.$(state.length);\n }\n (node = nodes[$SELF]) && node.$();\n}\nfunction mergeStoreNode(state, value) {\n const keys = Object.keys(value);\n for (let i = 0; i < keys.length; i += 1) {\n const key = keys[i];\n setProperty(state, key, value[key]);\n }\n}\nfunction updateArray(current, next) {\n if (typeof next === \"function\") next = next(current);\n next = unwrap(next);\n if (Array.isArray(next)) {\n if (current === next) return;\n let i = 0,\n len = next.length;\n for (; i < len; i++) {\n const value = next[i];\n if (current[i] !== value) setProperty(current, i, value);\n }\n setProperty(current, \"length\", len);\n } else mergeStoreNode(current, next);\n}\nfunction updatePath(current, path, traversed = []) {\n let part,\n prev = current;\n if (path.length > 1) {\n part = path.shift();\n const partType = typeof part,\n isArray = Array.isArray(current);\n if (Array.isArray(part)) {\n for (let i = 0; i < part.length; i++) {\n updatePath(current, [part[i]].concat(path), traversed);\n }\n return;\n } else if (isArray && partType === \"function\") {\n for (let i = 0; i < current.length; i++) {\n if (part(current[i], i)) updatePath(current, [i].concat(path), traversed);\n }\n return;\n } else if (isArray && partType === \"object\") {\n const {\n from = 0,\n to = current.length - 1,\n by = 1\n } = part;\n for (let i = from; i <= to; i += by) {\n updatePath(current, [i].concat(path), traversed);\n }\n return;\n } else if (path.length > 1) {\n updatePath(current[part], path, [part].concat(traversed));\n return;\n }\n prev = current[part];\n traversed = [part].concat(traversed);\n }\n let value = path[0];\n if (typeof value === \"function\") {\n value = value(prev, traversed);\n if (value === prev) return;\n }\n if (part === undefined && value == undefined) return;\n value = unwrap(value);\n if (part === undefined || isWrappable(prev) && isWrappable(value) && !Array.isArray(value)) {\n mergeStoreNode(prev, value);\n } else setProperty(current, part, value);\n}\nfunction createStore(...[store, options]) {\n const unwrappedStore = unwrap(store || {});\n const isArray = Array.isArray(unwrappedStore);\n const wrappedStore = wrap$1(unwrappedStore);\n function setStore(...args) {\n batch(() => {\n isArray && args.length === 1 ? updateArray(unwrappedStore, args[0]) : updatePath(unwrappedStore, args);\n });\n }\n return [wrappedStore, setStore];\n}\n\nfunction proxyDescriptor(target, property) {\n const desc = Reflect.getOwnPropertyDescriptor(target, property);\n if (!desc || desc.get || desc.set || !desc.configurable || property === $PROXY || property === $NODE) return desc;\n delete desc.value;\n delete desc.writable;\n desc.get = () => target[$PROXY][property];\n desc.set = v => target[$PROXY][property] = v;\n return desc;\n}\nconst proxyTraps = {\n get(target, property, receiver) {\n if (property === $RAW) return target;\n if (property === $PROXY) return receiver;\n if (property === $TRACK) {\n trackSelf(target);\n return receiver;\n }\n const nodes = getNodes(target, $NODE);\n const tracked = nodes[property];\n let value = tracked ? tracked() : target[property];\n if (property === $NODE || property === $HAS || property === \"__proto__\") return value;\n if (!tracked) {\n const desc = Object.getOwnPropertyDescriptor(target, property);\n const isFunction = typeof value === \"function\";\n if (getListener() && (!isFunction || target.hasOwnProperty(property)) && !(desc && desc.get)) value = getNode(nodes, property, value)();else if (value != null && isFunction && value === Array.prototype[property]) {\n return (...args) => batch(() => Array.prototype[property].apply(receiver, args));\n }\n }\n return isWrappable(value) ? wrap(value) : value;\n },\n has(target, property) {\n if (property === $RAW || property === $PROXY || property === $TRACK || property === $NODE || property === $HAS || property === \"__proto__\") return true;\n getListener() && getNode(getNodes(target, $HAS), property)();\n return property in target;\n },\n set(target, property, value) {\n batch(() => setProperty(target, property, unwrap(value)));\n return true;\n },\n deleteProperty(target, property) {\n batch(() => setProperty(target, property, undefined, true));\n return true;\n },\n ownKeys: ownKeys,\n getOwnPropertyDescriptor: proxyDescriptor\n};\nfunction wrap(value) {\n let p = value[$PROXY];\n if (!p) {\n Object.defineProperty(value, $PROXY, {\n value: p = new Proxy(value, proxyTraps)\n });\n const keys = Object.keys(value),\n desc = Object.getOwnPropertyDescriptors(value);\n const proto = Object.getPrototypeOf(value);\n const isClass = value !== null && typeof value === \"object\" && !Array.isArray(value) && proto !== Object.prototype;\n if (isClass) {\n const descriptors = Object.getOwnPropertyDescriptors(proto);\n keys.push(...Object.keys(descriptors));\n Object.assign(desc, descriptors);\n }\n for (let i = 0, l = keys.length; i < l; i++) {\n const prop = keys[i];\n if (isClass && prop === \"constructor\") continue;\n if (desc[prop].get) {\n const get = desc[prop].get.bind(p);\n Object.defineProperty(value, prop, {\n get,\n configurable: true\n });\n }\n if (desc[prop].set) {\n const og = desc[prop].set,\n set = v => batch(() => og.call(p, v));\n Object.defineProperty(value, prop, {\n set,\n configurable: true\n });\n }\n }\n }\n return p;\n}\nfunction createMutable(state, options) {\n const unwrappedStore = unwrap(state || {});\n const wrappedStore = wrap(unwrappedStore);\n return wrappedStore;\n}\nfunction modifyMutable(state, modifier) {\n batch(() => modifier(unwrap(state)));\n}\n\nconst $ROOT = Symbol(\"store-root\");\nfunction applyState(target, parent, property, merge, key) {\n const previous = parent[property];\n if (target === previous) return;\n const isArray = Array.isArray(target);\n if (property !== $ROOT && (!isWrappable(target) || !isWrappable(previous) || isArray !== Array.isArray(previous) || key && target[key] !== previous[key])) {\n setProperty(parent, property, target);\n return;\n }\n if (isArray) {\n if (target.length && previous.length && (!merge || key && target[0] && target[0][key] != null)) {\n let i, j, start, end, newEnd, item, newIndicesNext, keyVal;\n for (start = 0, end = Math.min(previous.length, target.length); start < end && (previous[start] === target[start] || key && previous[start] && target[start] && previous[start][key] === target[start][key]); start++) {\n applyState(target[start], previous, start, merge, key);\n }\n const temp = new Array(target.length),\n newIndices = new Map();\n for (end = previous.length - 1, newEnd = target.length - 1; end >= start && newEnd >= start && (previous[end] === target[newEnd] || key && previous[start] && target[start] && previous[end][key] === target[newEnd][key]); end--, newEnd--) {\n temp[newEnd] = previous[end];\n }\n if (start > newEnd || start > end) {\n for (j = start; j <= newEnd; j++) setProperty(previous, j, target[j]);\n for (; j < target.length; j++) {\n setProperty(previous, j, temp[j]);\n applyState(target[j], previous, j, merge, key);\n }\n if (previous.length > target.length) setProperty(previous, \"length\", target.length);\n return;\n }\n newIndicesNext = new Array(newEnd + 1);\n for (j = newEnd; j >= start; j--) {\n item = target[j];\n keyVal = key && item ? item[key] : item;\n i = newIndices.get(keyVal);\n newIndicesNext[j] = i === undefined ? -1 : i;\n newIndices.set(keyVal, j);\n }\n for (i = start; i <= end; i++) {\n item = previous[i];\n keyVal = key && item ? item[key] : item;\n j = newIndices.get(keyVal);\n if (j !== undefined && j !== -1) {\n temp[j] = previous[i];\n j = newIndicesNext[j];\n newIndices.set(keyVal, j);\n }\n }\n for (j = start; j < target.length; j++) {\n if (j in temp) {\n setProperty(previous, j, temp[j]);\n applyState(target[j], previous, j, merge, key);\n } else setProperty(previous, j, target[j]);\n }\n } else {\n for (let i = 0, len = target.length; i < len; i++) {\n applyState(target[i], previous, i, merge, key);\n }\n }\n if (previous.length > target.length) setProperty(previous, \"length\", target.length);\n return;\n }\n const targetKeys = Object.keys(target);\n for (let i = 0, len = targetKeys.length; i < len; i++) {\n applyState(target[targetKeys[i]], previous, targetKeys[i], merge, key);\n }\n const previousKeys = Object.keys(previous);\n for (let i = 0, len = previousKeys.length; i < len; i++) {\n if (target[previousKeys[i]] === undefined) setProperty(previous, previousKeys[i], undefined);\n }\n}\nfunction reconcile(value, options = {}) {\n const {\n merge,\n key = \"id\"\n } = options,\n v = unwrap(value);\n return state => {\n if (!isWrappable(state) || !isWrappable(v)) return v;\n const res = applyState(v, {\n [$ROOT]: state\n }, $ROOT, merge, key);\n return res === undefined ? state : res;\n };\n}\nconst producers = new WeakMap();\nconst setterTraps = {\n get(target, property) {\n if (property === $RAW) return target;\n const value = target[property];\n let proxy;\n return isWrappable(value) ? producers.get(value) || (producers.set(value, proxy = new Proxy(value, setterTraps)), proxy) : value;\n },\n set(target, property, value) {\n setProperty(target, property, unwrap(value));\n return true;\n },\n deleteProperty(target, property) {\n setProperty(target, property, undefined, true);\n return true;\n }\n};\nfunction produce(fn) {\n return state => {\n if (isWrappable(state)) {\n let proxy;\n if (!(proxy = producers.get(state))) {\n producers.set(state, proxy = new Proxy(state, setterTraps));\n }\n fn(proxy);\n }\n return state;\n };\n}\n\nconst DEV = undefined;\n\nexport { $RAW, DEV, createMutable, createStore, modifyMutable, produce, reconcile, unwrap };\n","import {createRoot} from 'solid-js';\nimport {createStore, reconcile, unwrap} from 'solid-js/store';\nimport {State} from '../config/state';\nimport rootScope from '../lib/rootScope';\n\nconst [appState, _setAppState] = createRoot(() => createStore({} as any));\n\nconst setAppState: typeof _setAppState = (...args: any[]) => {\n const key = args[0];\n // @ts-ignore\n _setAppState(...args);\n // @ts-ignore\n rootScope.managers.appStateManager.setByKey(key, unwrap(appState[key]));\n};\n\nconst setAppStateSilent = (key: any, value?: any) => {\n if(typeof(key) === 'object') {\n _setAppState(key);\n return;\n }\n\n _setAppState(key, reconcile(value));\n};\n\nconst useAppState = () => [appState, setAppState] as const;\n\nexport {\n appState,\n useAppState,\n setAppState,\n setAppStateSilent\n};\n","export default function getObjectKeysAndSort(object: {[key: string]: any} | Map, sort: 'asc' | 'desc' = 'asc') {\n if(!object) return [];\n const ids = object instanceof Map ? [...object.keys()] : Object.keys(object).map((i) => +i);\n if(sort === 'asc') return ids.sort((a, b) => a - b);\n else return ids.sort((a, b) => b - a);\n}\n","// import {Accessor, createMemo} from 'solid-js';\nimport {Accessor, createMemo} from 'solid-js';\nimport {createStore, reconcile} from 'solid-js/store';\nimport {Chat, User} from '../layer';\n\ntype Peer = Chat | User;\n\nconst [state, setState] = createStore<{[peerId: PeerId]: Peer}>({});\n\ntype ValueOrGetter = T | Accessor;\n\nfunction createMemoOrReturn, R, V = T extends Accessor ? V : T>(valueOrGetter: T, callback: (value: V) => R): T extends Accessor ? Accessor : R {\n // @ts-ignore\n return typeof(valueOrGetter) === 'function' ? createMemo(() => callback((valueOrGetter as Accessor)())) : callback(valueOrGetter);\n}\n\nexport function usePeer>(peerId: T) {\n return createMemoOrReturn(peerId, (peerId) => state[peerId]);\n}\n\nexport function useChat>(chatId: T) {\n return createMemoOrReturn(chatId, (chatId) => state[chatId?.toPeerId(true)] as Chat);\n}\n\nexport function useUser>(userId: T) {\n return createMemoOrReturn(userId, (userId) => state[userId?.toPeerId(false)] as User);\n}\n\nexport function reconcilePeer(peerId: PeerId, peer: Peer) {\n setState(peerId, reconcile(peer));\n}\n\nexport function reconcilePeers(peers: {[peerId: PeerId]: Peer}) {\n setState(/* reconcile */(peers));\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {Awaited} from '../../types';\nimport type {CacheStorageDbName} from '../files/cacheStorage';\nimport type {State} from '../../config/state';\nimport type {Chat, ChatPhoto, Message, MessagePeerReaction, PeerNotifySettings, User, UserProfilePhoto} from '../../layer';\nimport type {CryptoMethods} from '../crypto/crypto_methods';\nimport type {ThumbStorageMedia} from '../storages/thumbs';\nimport type ThumbsStorage from '../storages/thumbs';\nimport type {AppReactionsManager} from '../appManagers/appReactionsManager';\nimport type {MessagesStorageKey} from '../appManagers/appMessagesManager';\nimport type {AppAvatarsManager, PeerPhotoSize} from '../appManagers/appAvatarsManager';\nimport rootScope from '../rootScope';\nimport webpWorkerController from '../webp/webpWorkerController';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport sessionStorage from '../sessionStorage';\nimport webPushApiManager from './webPushApiManager';\nimport appRuntimeManager from '../appManagers/appRuntimeManager';\nimport telegramMeWebManager from './telegramMeWebManager';\nimport pause from '../../helpers/schedulers/pause';\nimport ENVIRONMENT from '../../environment';\nimport loadState from '../appManagers/utils/state/loadState';\nimport opusDecodeController from '../opusDecodeController';\nimport MTProtoMessagePort from './mtprotoMessagePort';\nimport cryptoMessagePort from '../crypto/cryptoMessagePort';\nimport SuperMessagePort from './superMessagePort';\nimport IS_SHARED_WORKER_SUPPORTED from '../../environment/sharedWorkerSupport';\nimport toggleStorages from '../../helpers/toggleStorages';\nimport idleController from '../../helpers/idleController';\nimport ServiceMessagePort from '../serviceWorker/serviceMessagePort';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport {makeWorkerURL} from '../../helpers/setWorkerProxy';\nimport ServiceWorkerURL from '../../../sw?worker&url';\nimport setDeepProperty, {splitDeepPath} from '../../helpers/object/setDeepProperty';\nimport getThumbKey from '../storages/utils/thumbs/getThumbKey';\nimport {NULL_PEER_ID, THUMB_TYPE_FULL} from './mtproto_config';\nimport generateEmptyThumb from '../storages/utils/thumbs/generateEmptyThumb';\nimport getStickerThumbKey from '../storages/utils/thumbs/getStickerThumbKey';\nimport callbackify from '../../helpers/callbackify';\nimport isLegacyMessageId from '../appManagers/utils/messageId/isLegacyMessageId';\nimport {MTAppConfig} from './appConfig';\nimport {setAppStateSilent} from '../../stores/appState';\nimport getObjectKeysAndSort from '../../helpers/object/getObjectKeysAndSort';\nimport {reconcilePeer, reconcilePeers} from '../../stores/peers';\n\nconst TEST_NO_STREAMING = false;\n\nexport type Mirrors = {\n state: State,\n thumbs: ThumbsStorage['thumbsCache'],\n stickerThumbs: ThumbsStorage['stickerCachedThumbs'],\n availableReactions: AppReactionsManager['availableReactions'] | Promise,\n messages: {\n [type in string]: {\n [mid in number]: Message.message | Message.messageService\n }\n },\n groupedMessages: {\n [groupedId in string]: Map\n },\n peers: {\n [peerId in PeerId]: Exclude | User.user\n },\n avatars: AppAvatarsManager['savedAvatarURLs']\n};\n\nexport type MirrorTaskPayload<\n T extends keyof Mirrors = keyof Mirrors\n // K extends keyof Mirrors[T] = keyof Mirrors[T],\n // J extends Mirrors[T][K] = Mirrors[T][K]\n> = {\n name: T,\n // key?: K,\n key?: string,\n value?: any\n};\n\nexport type NotificationBuildTaskPayload = {\n message: Message.message | Message.messageService,\n fwdCount?: number,\n peerReaction?: MessagePeerReaction,\n peerTypeNotifySettings?: PeerNotifySettings\n};\n\nexport type TabState = {\n chatPeerIds: PeerId[],\n idleStartTime: number,\n};\n\nclass ApiManagerProxy extends MTProtoMessagePort {\n // private worker: /* Window */Worker;\n // private sockets: Map = new Map();\n private mirrors: Mirrors;\n\n public newVersion: string;\n public oldVersion: string;\n\n private tabState: TabState;\n\n public share: ShareData;\n\n public serviceMessagePort: ServiceMessagePort;\n private lastServiceWorker: ServiceWorker;\n\n private pingServiceWorkerPromise: CancellablePromise;\n\n private processMirrorTaskMap: {\n [type in keyof Mirrors]?: (payload: MirrorTaskPayload) => void\n };\n\n private appConfig: MaybePromise;\n\n constructor() {\n super();\n\n this.mirrors = {\n state: undefined,\n thumbs: {},\n stickerThumbs: {},\n availableReactions: undefined,\n messages: {},\n groupedMessages: {},\n peers: {},\n avatars: {}\n };\n\n this.processMirrorTaskMap = {\n messages: (payload) => {\n const message = payload.value as Message.message | Message.messageService;\n let mid: number, groupedId: string;\n if(message) {\n mid = message.mid;\n groupedId = (message as Message.message).grouped_id;\n } else {\n const [key, _mid] = splitDeepPath(payload.key);\n mid = +_mid;\n const previousMessage = this.mirrors.messages[key]?.[mid];\n if(!previousMessage) {\n return;\n }\n\n groupedId = (previousMessage as Message.message).grouped_id;\n }\n\n if(!groupedId) {\n return;\n }\n\n const map = this.mirrors.groupedMessages[groupedId] ??= new Map();\n if(!message) {\n map.delete(mid);\n\n if(!map.size) {\n delete this.mirrors.groupedMessages[groupedId];\n }\n } else {\n map.set(mid, message);\n }\n },\n\n state: (payload) => {\n if(payload.key) {\n setAppStateSilent(payload.key, payload.value);\n } else {\n console.error(payload);\n }\n },\n\n peers: (payload) => {\n if(payload.key) {\n reconcilePeer(payload.key.toPeerId(), payload.value as any);\n } else {\n reconcilePeers(payload.value);\n }\n }\n };\n\n this.tabState = {\n chatPeerIds: [],\n idleStartTime: 0\n };\n\n this.log('constructor');\n\n if(!import.meta.env.VITE_MTPROTO_SW) {\n this.registerWorker();\n }\n\n this.registerServiceWorker();\n this.registerCryptoWorker();\n\n // const perf = performance.now();\n this.addMultipleEventsListeners({\n convertWebp: ({fileName, bytes}) => {\n return webpWorkerController.convert(fileName, bytes);\n },\n\n convertOpus: ({fileName, bytes}) => {\n return opusDecodeController.pushDecodeTask(bytes, false).then((result) => result.bytes);\n },\n\n event: ({name, args}) => {\n // @ts-ignore\n rootScope.dispatchEventSingle(name, ...args);\n },\n\n localStorageProxy: (payload) => {\n const storageTask = payload;\n return (sessionStorage[storageTask.type] as any)(...storageTask.args);\n },\n\n mirror: this.onMirrorTask,\n\n receivedServiceMessagePort: () => {\n this.log.warn('mtproto worker received service message port');\n }\n\n // hello: () => {\n // this.log.error('time hello', performance.now() - perf);\n // }\n });\n\n // this.addTaskListener('socketProxy', (task) => {\n // const socketTask = task.payload;\n // const id = socketTask.id;\n // //console.log('socketProxy', socketTask, id);\n\n // if(socketTask.type === 'send') {\n // const socket = this.sockets.get(id);\n // socket.send(socketTask.payload);\n // } else if(socketTask.type === 'close') { // will remove from map in onClose\n // const socket = this.sockets.get(id);\n // socket.close();\n // } else if(socketTask.type === 'setup') {\n // const socket = new Socket(socketTask.payload.dcId, socketTask.payload.url, socketTask.payload.logSuffix);\n\n // const onOpen = () => {\n // //console.log('socketProxy onOpen');\n // this.postMessage({\n // type: 'socketProxy',\n // payload: {\n // type: 'open',\n // id\n // }\n // });\n // };\n // const onClose = () => {\n // this.postMessage({\n // type: 'socketProxy',\n // payload: {\n // type: 'close',\n // id\n // }\n // });\n\n // socket.removeEventListener('open', onOpen);\n // socket.removeEventListener('close', onClose);\n // socket.removeEventListener('message', onMessage);\n // this.sockets.delete(id);\n // };\n // const onMessage = (buffer: ArrayBuffer) => {\n // this.postMessage({\n // type: 'socketProxy',\n // payload: {\n // type: 'message',\n // id,\n // payload: buffer\n // }\n // });\n // };\n\n // socket.addEventListener('open', onOpen);\n // socket.addEventListener('close', onClose);\n // socket.addEventListener('message', onMessage);\n // this.sockets.set(id, socket);\n // }\n // });\n\n rootScope.addEventListener('language_change', (language) => {\n rootScope.managers.networkerFactory.setLanguage(language);\n rootScope.managers.appAttachMenuBotsManager.onLanguageChange();\n });\n\n window.addEventListener('online', () => {\n rootScope.managers.networkerFactory.forceReconnectTimeout();\n });\n\n rootScope.addEventListener('logging_out', () => {\n const toClear: CacheStorageDbName[] = ['cachedFiles', 'cachedStreamChunks'];\n Promise.all([\n toggleStorages(false, true),\n sessionStorage.clear(),\n Promise.race([\n telegramMeWebManager.setAuthorized(false),\n pause(3000)\n ]),\n webPushApiManager.forceUnsubscribe(),\n Promise.all(toClear.map((cacheName) => caches.delete(cacheName)))\n ]).finally(() => {\n appRuntimeManager.reload();\n });\n });\n\n idleController.addEventListener('change', (idle) => {\n this.updateTabStateIdle(idle);\n });\n this.updateTabStateIdle(idleController.isIdle);\n\n // this.sendState();\n }\n\n public sendEnvironment() {\n this.log('Passing environment:', ENVIRONMENT);\n this.invoke('environment', ENVIRONMENT);\n }\n\n public pingServiceWorkerWithIframe() {\n if(this.pingServiceWorkerPromise) {\n return this.pingServiceWorkerPromise;\n }\n\n const promise = this.pingServiceWorkerPromise = deferredPromise();\n const iframe = document.createElement('iframe');\n iframe.hidden = true;\n const onFinish = () => {\n clearTimeout(timeout);\n setTimeout(() => { // ping once in 10 seconds\n this.pingServiceWorkerPromise = undefined;\n }, 10e3);\n\n iframe.removeEventListener('load', onLoad);\n iframe.removeEventListener('error', onError);\n iframe.remove();\n };\n const onLoad = () => {\n onFinish();\n promise.resolve();\n };\n const onError = () => {\n onFinish();\n promise.reject();\n };\n iframe.addEventListener('load', onLoad);\n iframe.addEventListener('error', onError);\n iframe.src = 'ping/' + (Math.random() * 0xFFFFFFFF | 0) + '.nocache';\n document.body.append(iframe);\n\n const timeout = window.setTimeout(onError, 1500);\n return promise;\n }\n\n private attachServiceWorker(serviceWorker: ServiceWorker) {\n if(this.lastServiceWorker === serviceWorker) {\n this.log.warn('trying to attach same service worker');\n return;\n }\n\n this.lastServiceWorker && this.serviceMessagePort.detachPort(this.lastServiceWorker);\n this.serviceMessagePort.attachSendPort(this.lastServiceWorker = serviceWorker);\n this.serviceMessagePort.invokeVoid('hello', undefined);\n }\n\n private _registerServiceWorker() {\n // if(import.meta.env.DEV && IS_SAFARI) {\n // return;\n // }\n\n navigator.serviceWorker.register(\n // * doesn't work\n // new URL('../../../sw.ts', import.meta.url),\n // '../../../sw',\n ServiceWorkerURL,\n {type: 'module', scope: './'}\n ).then((registration) => {\n if(TEST_NO_STREAMING) {\n throw 1;\n }\n\n this.log('SW registered', registration);\n\n const url = new URL(window.location.href);\n const FIX_KEY = 'swfix';\n const swfix = +url.searchParams.get(FIX_KEY) || 0;\n if(registration.active && !navigator.serviceWorker.controller) {\n if(swfix >= 3) {\n throw new Error('no controller');\n }\n\n // ! doubtful fix for hard refresh\n return registration.unregister().then(() => {\n url.searchParams.set(FIX_KEY, '' + (swfix + 1));\n window.location.href = url.toString();\n });\n }\n\n if(swfix) {\n url.searchParams.delete(FIX_KEY);\n history.pushState(undefined, '', url);\n }\n\n const sw = registration.installing || registration.waiting || registration.active;\n sw.addEventListener('statechange', (e) => {\n this.log('SW statechange', e);\n });\n\n const controller = navigator.serviceWorker.controller || registration.installing || registration.waiting || registration.active;\n this.attachServiceWorker(controller);\n\n if(import.meta.env.VITE_MTPROTO_SW) {\n this.onWorkerFirstMessage(controller);\n }\n }).catch((err) => {\n this.log.error('SW registration failed!', err);\n\n this.invokeVoid('serviceWorkerOnline', false);\n });\n }\n\n private registerServiceWorker() {\n if(!('serviceWorker' in navigator)) return;\n\n this.serviceMessagePort = webPushApiManager.serviceMessagePort = new ServiceMessagePort();\n\n // this.addMultipleEventsListeners({\n // hello: () => {\n // // this.serviceMessagePort.invokeVoid('port', undefined);\n // }\n // });\n\n // ! I hate webpack - it won't load it by using worker.register, only navigator.serviceWorker will do it.\n const worker = navigator.serviceWorker;\n this._registerServiceWorker();\n\n // worker.startMessages();\n\n worker.addEventListener('controllerchange', () => {\n this.log.warn('controllerchange');\n\n const controller = worker.controller;\n this.attachServiceWorker(controller);\n\n controller.addEventListener('error', (e) => {\n this.log.error('controller error:', e);\n });\n });\n\n if(import.meta.env.VITE_MTPROTO_SW) {\n this.attachListenPort(worker);\n } else {\n this.serviceMessagePort.attachListenPort(worker);\n this.serviceMessagePort.addMultipleEventsListeners({\n port: (payload, source, event) => {\n this.log.warn('got service worker port');\n this.invokeVoid('serviceWorkerPort', undefined, undefined, [event.ports[0]]);\n },\n\n hello: (payload, source) => {\n this.serviceMessagePort.resendLockTask(source);\n },\n\n share: (payload) => {\n this.log('will try to share something');\n this.share = payload;\n }\n });\n }\n\n worker.addEventListener('messageerror', (e) => {\n this.log.error('SW messageerror:', e);\n });\n }\n\n private async registerCryptoWorker() {\n const get = (url: string) => {\n return fetch(url).then((response) => response.text()).then((text) => {\n const pathnameSplitted = location.pathname.split('/');\n pathnameSplitted[pathnameSplitted.length - 1] = '';\n const pre = location.origin + pathnameSplitted.join('/');\n text = text.replace(/(import (?:.+? from )?['\"])\\//g, '$1' + pre);\n const blob = new Blob([text], {type: 'application/javascript'});\n return blob;\n });\n };\n\n const workerHandler = {\n construct(target: any, args: any): any {\n return {\n url: makeWorkerURL(args[0]).toString()\n };\n }\n };\n\n const originals = [\n Worker,\n typeof(SharedWorker) !== 'undefined' && SharedWorker\n ].filter(Boolean);\n originals.forEach((w) => window[w.name as any] = new Proxy(w, workerHandler));\n\n const worker: SharedWorker | Worker = new Worker(\n new URL('../crypto/crypto.worker.ts', import.meta.url),\n {type: 'module'}\n );\n\n originals.forEach((w) => window[w.name as any] = w as any);\n\n const originalUrl = (worker as any).url;\n\n const createWorker = (url: string) => new constructor(url, {type: 'module'});\n const attachWorkerToPort = (worker: SharedWorker | Worker) => this.attachWorkerToPort(worker, cryptoMessagePort, 'crypto');\n const constructor = IS_SHARED_WORKER_SUPPORTED ? SharedWorker : Worker;\n\n // let cryptoWorkers = workers.length;\n cryptoMessagePort.addEventListener('port', (payload, source, event) => {\n this.invokeVoid('cryptoPort', undefined, undefined, [event.ports[0]]);\n // .then((attached) => {\n // if(!attached && cryptoWorkers-- > 1) {\n // this.log.error('terminating unneeded crypto worker');\n\n // cryptoMessagePort.invokeVoid('terminate', undefined, source);\n // const worker = workers.find((worker) => (worker as SharedWorker).port === source || (worker as any) === source);\n // if((worker as SharedWorker).port) (worker as SharedWorker).port.close();\n // else (worker as Worker).terminate();\n // cryptoMessagePort.detachPort(source);\n // }\n // });\n });\n\n const firstWorker = createWorker(originalUrl);\n attachWorkerToPort(firstWorker);\n\n const blob = await get(originalUrl);\n const urlsPromise = await this.invoke('createProxyWorkerURLs', {originalUrl, blob});\n const workers = urlsPromise.slice(1).map(createWorker);\n workers.forEach(attachWorkerToPort);\n }\n\n private registerWorker() {\n if(import.meta.env.VITE_MTPROTO_SW) {\n return;\n }\n\n let worker: SharedWorker | Worker;\n if(IS_SHARED_WORKER_SUPPORTED) {\n worker = new SharedWorker(\n new URL('./mtproto.worker.ts', import.meta.url),\n {type: 'module'}\n );\n } else {\n worker = new Worker(\n new URL('./mtproto.worker.ts', import.meta.url),\n {type: 'module'}\n );\n }\n\n this.onWorkerFirstMessage(worker);\n }\n\n private attachWorkerToPort(worker: SharedWorker | Worker, messagePort: SuperMessagePort, type: string) {\n const port: MessagePort = (worker as SharedWorker).port || worker as any;\n messagePort.attachPort(port);\n\n worker.addEventListener('error', (err) => {\n this.log.error(type, 'worker error', err);\n });\n }\n\n private onWorkerFirstMessage(worker: any) {\n this.log('set webWorker');\n\n // this.worker = worker;\n if(import.meta.env.VITE_MTPROTO_SW) {\n this.attachSendPort(worker);\n } else {\n this.attachWorkerToPort(worker, this, 'mtproto');\n }\n }\n\n private loadState() {\n return Promise.all([\n loadState().then((stateResult) => {\n this.newVersion = stateResult.newVersion;\n this.oldVersion = stateResult.oldVersion;\n this.mirrors['state'] = stateResult.state;\n setAppStateSilent(stateResult.state);\n return stateResult;\n })\n // loadStorages(createStorages()),\n ]);\n }\n\n public sendState() {\n return this.loadState().then((result) => {\n const [stateResult] = result;\n this.invoke('state', {...stateResult, userId: rootScope.myId.toUserId()});\n return result;\n });\n }\n\n public invokeCrypto(method: Method, ...args: Parameters): Promise>> {\n if(!import.meta.env.VITE_MTPROTO_WORKER) {\n return;\n }\n\n return cryptoMessagePort.invokeCrypto(method, ...args);\n }\n\n public async toggleStorages(enabled: boolean, clearWrite: boolean) {\n await toggleStorages(enabled, clearWrite);\n this.invoke('toggleStorages', {enabled, clearWrite});\n this.serviceMessagePort?.invokeVoid('toggleStorages', {enabled, clearWrite});\n }\n\n public async getMirror(name: T) {\n const mirror = this.mirrors[name];\n return mirror;\n }\n\n public getState() {\n return this.getMirror('state');\n }\n\n public getCacheContext(\n media: ThumbStorageMedia,\n thumbSize: string = THUMB_TYPE_FULL,\n key = getThumbKey(media)\n ) {\n const cache = this.mirrors.thumbs[key];\n return cache?.[thumbSize] || generateEmptyThumb(thumbSize);\n }\n\n public getStickerCachedThumb(docId: DocId, toneIndex: string | number) {\n const key = getStickerThumbKey(docId, toneIndex);\n return this.mirrors.stickerThumbs[key];\n }\n\n public getAvailableReactions() {\n return this.mirrors.availableReactions ||= rootScope.managers.appReactionsManager.getAvailableReactions();\n }\n\n public getReaction(reaction: string) {\n return callbackify(this.getAvailableReactions(), (availableReactions) => {\n return availableReactions.find((availableReaction) => availableReaction.reaction === reaction);\n });\n }\n\n public getMessageFromStorage(key: MessagesStorageKey, mid: number) {\n // * use global storage instead\n if(key.endsWith('history') && isLegacyMessageId(mid)) {\n key = this.getGlobalHistoryMessagesStorage();\n }\n\n const cache = this.mirrors.messages[key];\n return cache?.[mid];\n }\n\n public getGroupsFirstMessage(message: Message.message) {\n if(!message?.grouped_id) return message;\n\n const storage = this.mirrors.groupedMessages[message.grouped_id];\n let minMid = Number.MAX_SAFE_INTEGER;\n for(const [mid, message] of storage) {\n if(message.mid < minMid) {\n minMid = message.mid;\n }\n }\n\n return storage.get(minMid);\n }\n\n public getMidsByGroupedId(groupedId: string, sort: 'asc' | 'desc' = 'asc') {\n return getObjectKeysAndSort(this.mirrors.groupedMessages[groupedId], sort);\n }\n\n public getMessagesByGroupedId(groupedId: string) {\n const mids = this.getMidsByGroupedId(groupedId, 'asc');\n const storage = this.mirrors.groupedMessages[groupedId];\n // return mids.map((mid) => this.getMessageFromStorage(storage, mid) as Message.message);\n return mids.map((mid) => storage.get(mid) as Message.message);\n }\n\n public getHistoryMessagesStorage(peerId: PeerId): MessagesStorageKey {\n return `${peerId}_history`;\n }\n\n public getGlobalHistoryMessagesStorage(): MessagesStorageKey {\n return this.getHistoryMessagesStorage(NULL_PEER_ID);\n }\n\n public getMessageById(messageId: number) {\n if(isLegacyMessageId(messageId)) {\n return this.getMessageFromStorage(this.getGlobalHistoryMessagesStorage(), messageId);\n }\n }\n\n public getMessageByPeer(peerId: PeerId, messageId: number) {\n if(!peerId) {\n return this.getMessageById(messageId);\n }\n\n return this.getMessageFromStorage(this.getHistoryMessagesStorage(peerId), messageId);\n }\n\n public getPeer(peerId: PeerId) {\n return this.mirrors.peers[peerId];\n }\n\n public getUser(userId: UserId) {\n return this.mirrors.peers[userId.toPeerId(false)] as User.user;\n }\n\n public getChat(chatId: ChatId) {\n return this.mirrors.peers[chatId.toPeerId(true)] as Exclude;\n }\n\n public isForum(peerId: PeerId) {\n const peer = this.getPeer(peerId);\n return !!(peer as Chat.channel)?.pFlags?.forum;\n }\n\n public isAvatarCached(peerId: PeerId, size?: PeerPhotoSize) {\n const saved = this.mirrors.avatars[peerId];\n if(size === undefined) {\n return !!saved;\n }\n\n return !!(saved && saved[size] && !(saved[size] instanceof Promise));\n }\n\n public loadAvatar(peerId: PeerId, photo: UserProfilePhoto.userProfilePhoto | ChatPhoto.chatPhoto, size: PeerPhotoSize) {\n const saved = this.mirrors.avatars[peerId] ??= {};\n return saved[size] ??= rootScope.managers.appAvatarsManager.loadAvatar(peerId, photo, size);\n }\n\n public getAppConfig(overwrite?: boolean) {\n if(overwrite) {\n this.appConfig = undefined;\n }\n\n if(!this.appConfig) {\n const promise = rootScope.managers.apiManager.getAppConfig().then((appConfig) => {\n if(this.appConfig === promise) {\n this.appConfig = appConfig;\n }\n\n return appConfig;\n });\n\n return this.appConfig = promise;\n }\n\n return this.appConfig;\n }\n\n public isPremiumFeaturesHidden(): MaybePromise {\n return callbackify(this.isPremiumPurchaseBlocked(), (isPremiumPurchaseBlocked) => {\n return isPremiumPurchaseBlocked && !rootScope.premium;\n });\n }\n\n public isPremiumPurchaseBlocked(): MaybePromise {\n return callbackify(this.getAppConfig(), (appConfig) => {\n return !!appConfig.premium_purchase_blocked;\n });\n }\n\n public updateTabState(key: T, value: TabState[T]) {\n this.tabState[key] = value;\n this.invokeVoid('tabState', this.tabState);\n }\n\n public updateTabStateIdle(idle: boolean) {\n this.updateTabState('idleStartTime', idle ? Date.now() : 0);\n }\n\n private onMirrorTask = (payload: MirrorTaskPayload) => {\n const {name, key, value} = payload;\n this.processMirrorTaskMap[name]?.(payload);\n if(!payload.hasOwnProperty('key')) {\n this.mirrors[name] = value;\n return;\n }\n\n const mirror = this.mirrors[name] ??= {} as any;\n setDeepProperty(mirror, key, value, true);\n };\n}\n\ninterface ApiManagerProxy extends MTProtoMessagePort {}\n\nconst apiManagerProxy = new ApiManagerProxy();\nMOUNT_CLASS_TO.apiManagerProxy = apiManagerProxy;\nexport default apiManagerProxy;\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 createManagers from './createManagers';\nimport type {AckedResult} from '../mtproto/superMessagePort';\nimport {ModifyFunctionsToAsync} from '../../types';\nimport apiManagerProxy from '../mtproto/mtprotoworker';\nimport DEBUG from '../../config/debug';\nimport dT from '../../helpers/dT';\nimport noop from '../../helpers/noop';\nimport copy from '../../helpers/object/copy';\n\n// let stats: {\n// [manager: string]: {\n// [method: string]: {\n// times: number[],\n// byArgs: {\n// [args: string]: number[]\n// }\n// }\n// }\n// } = {};\n\n// let sentCount = 0;\n// let sentMethods: {[key: string]: number} = {};\n// let sentMethods2: {[key: string]: number} = {};\n// function collectStats(manager: string, method: string, args: any[], promise: Promise) {\n// ++sentCount;\n\n// const key = [manager, method].join('-');\n// if(!sentMethods[key]) sentMethods[key] = 0;\n// ++sentMethods[key];\n\n// const key2 = [('00000' + sentCount).slice(-5), key].join('-');\n\n// const byManager = stats[manager] ??= {};\n// const byMethod = byManager[method] ??= {times: [], byArgs: {}};\n\n// const perf = performance.now();\n// promise.catch(noop).finally(() => {\n// const time = performance.now() - perf;\n// byMethod.times.push(time);\n\n// sentMethods2[key2] = time;\n\n// try {\n// const argsString = JSON.stringify(args);\n// byMethod.byArgs[argsString].push(time);\n// } catch(err) {}\n// });\n// }\n\n// setInterval(() => {\n// console.log(\n// dT(),\n// '[PROXY] stats',\n// ...[\n// stats,\n// sentCount,\n// sentMethods,\n// sentMethods2\n// ].map(copy),\n// Object.entries(sentMethods).sort((a, b) => b[1] - a[1])\n// );\n// sentCount = 0;\n// stats = {};\n// sentMethods = {};\n// sentMethods2 = {};\n// }, 2000);\n\nconst DEBUG_MANAGER_REQUESTS: {[managerName: string]: Set} = {\n // appProfileManager: new Set(['getProfile', 'getProfileByPeerId'])\n // appPeersManager: new Set(['getPeer'])\n // appChatsManager: new Set(['getChat'])\n // appMessagesManager: new Set(['getMessageByPeer', 'getGroupsFirstMessage'])\n};\n\nfunction createProxy(/* source: T, */name: string, ack?: boolean) {\n const proxy = new Proxy({}, {\n get: (target, p, receiver) => {\n // console.log('get', target, p, receiver);\n // @ts-ignore\n // const value = source[p];\n // if(typeof(value) !== 'function') {\n // return value;\n // }\n\n return (...args: any[]) => {\n const promise = apiManagerProxy.invoke('manager', {\n name,\n method: p as string,\n args\n }, ack as any);\n\n if(DEBUG) {\n if(DEBUG_MANAGER_REQUESTS[name]?.has(p as any)) {\n console.warn('manager request', name, p, args, ack);\n }\n }\n\n // collectStats(name, p as string, args, promise);\n\n return promise;\n\n // @ts-ignore\n // return Promise.resolve(value.call(source, ...args));\n };\n }\n });\n\n return proxy;\n}\n\ntype AA = {\n [key in keyof T]: T[key] extends (...args: infer A) => infer R ? (...args: A) => Promise>> : never\n};\n\ntype T = Awaited>;\ntype ProxiedManagers = {\n [name in keyof T]?: ModifyFunctionsToAsync;\n} & {\n acknowledged?: {\n [name in keyof T]?: AA;\n }\n};\n\nfunction createProxyProxy(proxied: any, ack?: boolean) {\n return new Proxy(proxied, {\n get: (target, p, receiver) => {\n // @ts-ignore\n return target[p] ??= createProxy(p as string, ack);\n }\n });\n}\n\nlet proxied: ProxiedManagers;\nexport default function getProxiedManagers() {\n if(proxied) {\n return proxied;\n }\n\n proxied = createProxyProxy({}, false);\n proxied.acknowledged = createProxyProxy({}, true);\n return proxied;\n}\n","export default function clamp(v: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, v));\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {WallPaper} from '../layer';\nimport clamp from './number/clamp';\n\nexport type ColorHsla = {\n h: number,\n s: number,\n l: number,\n a: number\n};\n\nexport type ColorRgba = [number, number, number, number];\nexport type ColorRgb = [number, number, number];\n\n/**\n * https://stackoverflow.com/a/54070620/6758968\n * r, g, b in [0, 255]\n * @returns h in [0,360) and s, v in [0,1]\n */\nexport function rgbToHsv(r: number, g: number, b: number): [number, number, number] {\n r /= 255, g /= 255, b /= 255;\n const v = Math.max(r, g, b),\n c = v - Math.min(r, g, b);\n const h = c && ((v === r) ? (g - b ) / c : ((v == g) ? 2 + (b - r) / c : 4 + (r - g) / c));\n return [60 * (h < 0 ? h + 6 : h), v && c / v, v];\n}\n\n/**\n * https://stackoverflow.com/a/54024653/6758968\n * @param h [0, 360]\n * @param s [0, 1]\n * @param v [0, 1]\n * @returns r, g, b in [0, 255]\n */\nexport function hsvToRgb(h: number, s: number, v: number): ColorRgb {\n const f = (n: number, k: number = (n + h / 60) % 6) => Math.round((v - v * s * Math.max(Math.min(k, 4 - k, 1), 0)) * 255);\n return [f(5), f(3), f(1)];\n}\n\n/**\n * @returns h [0, 360], s [0, 100], l [0, 100], a [0, 1]\n */\nexport function rgbaToHsla(r: number, g: number, b: number, a: number = 1): ColorHsla {\n r /= 255, g /= 255, b /= 255;\n const max = Math.max(r, g, b),\n min = Math.min(r, g, b);\n let h: number, s: number;\n const l = (max + min) / 2;\n\n if(max === min) {\n h = s = 0; // achromatic\n } else {\n const d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n switch(max) {\n case r:\n h = (g - b) / d + (g < b ? 6 : 0);\n break;\n case g:\n h = (b - r) / d + 2;\n break;\n case b:\n h = (r - g) / d + 4;\n break;\n }\n h /= 6;\n }\n\n return {\n h: h * 360,\n s: s * 100,\n l: l * 100,\n a\n };\n}\n\nexport function hslaToString(hsla: ColorHsla) {\n return `hsla(${hsla.h}, ${hsla.s}%, ${hsla.l}%, ${hsla.a})`;\n}\n\n// * https://stackoverflow.com/a/9493060/6758968\n/**\n * Converts an HSL color value to RGB. Conversion formula\n * adapted from http://en.wikipedia.org/wiki/HSL_color_space.\n *\n * @param {number} h The hue [0, 360]\n * @param {number} s The saturation [0, 1]\n * @param {number} l The lightness [0, 1]\n * @return {Array} The RGB representation [0, 255]\n */\nexport function hslaToRgba(h: number, s: number, l: number, a: number): ColorRgba {\n h /= 360, s /= 100, l /= 100;\n let r: number, g: number, b: number;\n\n if(s === 0) {\n r = g = b = l; // achromatic\n } else {\n const hue2rgb = function hue2rgb(p: number, q: number, t: number) {\n if(t < 0) t += 1;\n if(t > 1) t -= 1;\n if(t < 1/6) return p + (q - p) * 6 * t;\n if(t < 1/2) return q;\n if(t < 2/3) return p + (q - p) * (2/3 - t) * 6;\n return p;\n }\n\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n const p = 2 * l - q;\n r = hue2rgb(p, q, h + 1/3);\n g = hue2rgb(p, q, h);\n b = hue2rgb(p, q, h - 1/3);\n }\n\n return [r, g, b, a].map((v) => Math.round(v * 255)) as ColorRgba;\n}\n\nexport function hslaStringToRgba(hsla: string) {\n const splitted = hsla.slice(5, -1).split(', ');\n const alpha = +splitted.pop();\n const arr = splitted.map((val) => {\n if(val.endsWith('%')) {\n return +val.slice(0, -1);\n }\n\n return +val;\n });\n\n return hslaToRgba(arr[0], arr[1], arr[2], alpha);\n}\n\nexport function hexaToRgba(hexa: string) {\n const arr: ColorRgba = [] as any;\n const offset = hexa[0] === '#' ? 1 : 0;\n if(hexa.length === (5 + offset)) {\n hexa = (offset ? '#' : '') + '0' + hexa.slice(offset);\n }\n\n if(hexa.length === (3 + offset)) {\n for(let i = offset; i < hexa.length; ++i) {\n arr.push(parseInt(hexa[i] + hexa[i], 16));\n }\n } else if(hexa.length === (4 + offset)) {\n for(let i = offset; i < (hexa.length - 1); ++i) {\n arr.push(parseInt(hexa[i] + hexa[i], 16));\n }\n\n arr.push(parseInt(hexa[hexa.length - 1], 16));\n } else {\n for(let i = offset; i < hexa.length; i += 2) {\n arr.push(parseInt(hexa.slice(i, i + 2), 16));\n }\n }\n\n return arr;\n}\n\nexport function hexToRgb(hex: string) {\n return hexaToRgba(hex.slice(0, 7)) as any as ColorRgb;\n}\n\nexport function hexaToHsla(hexa: string) {\n const rgba = hexaToRgba(hexa);\n return rgbaToHsla(rgba[0], rgba[1], rgba[2], rgba[3]);\n}\n\nexport function rgbaToHexa(rgba: ColorRgba | ColorRgb) {\n return '#' + rgba.map((v) => ('0' + v.toString(16)).slice(-2)).join('');\n}\n\nexport function hslaStringToHexa(hsla: string) {\n return rgbaToHexa(hslaStringToRgba(hsla));\n}\n\nexport function hslaStringToHex(hsla: string) {\n return hslaStringToHexa(hsla).slice(0, -2);\n}\n\n/**\n * @param weight [0, 1]\n */\nexport function mixColors(color1: ColorRgb, color2: ColorRgb, weight: number) {\n const out = new Array(3) as ColorRgb;\n for(let i = 0; i < 3; ++i) {\n const v1 = color1[i], v2 = color2[i];\n out[i] = Math.floor(v2 + (v1 - v2) * weight);\n }\n\n return out;\n}\n\nexport function computePerceivedBrightness(color: ColorRgb) {\n return (color[0] * 0.2126 + color[1] * 0.7152 + color[2] * 0.0722) / 255;\n}\n\nexport function getAverageColor(color1: ColorRgb, color2: ColorRgb): ColorRgb {\n return color1.map((v, i) => Math.round((v + color2[i]) / 2)) as ColorRgb;\n}\n\nexport function getAccentColor(baseHsv: number[], baseColor: ColorRgb, elementColor: ColorRgb): ColorRgb {\n const hsvTemp3 = rgbToHsv(...baseColor);\n const hsvTemp4 = rgbToHsv(...elementColor);\n\n const dist = Math.min(1.5 * hsvTemp3[1] / baseHsv[1], 1);\n\n hsvTemp3[0] = Math.min(360, hsvTemp4[0] - hsvTemp3[0] + baseHsv[0]);\n hsvTemp3[1] = Math.min(1, hsvTemp4[1] * baseHsv[1] / hsvTemp3[1]);\n hsvTemp3[2] = Math.min(1, (hsvTemp4[2] / hsvTemp3[2] + dist - 1) * baseHsv[2] / dist);\n if(hsvTemp3[2] < 0.3) {\n return elementColor;\n }\n return hsvToRgb(...hsvTemp3);\n}\n\nexport function changeColorAccent(baseHsv: number[], accentHsv: number[], color: ColorRgb, isDarkTheme: boolean) {\n const colorHsv = rgbToHsv(...color);\n\n const diffH = Math.min(Math.abs(colorHsv[0] - baseHsv[0]), Math.abs(colorHsv[0] - baseHsv[0] - 360));\n if(diffH > 30) {\n return color;\n }\n\n const dist = baseHsv[1] ? Math.min(1.5 * colorHsv[1] / baseHsv[1], 1) : 0;\n\n colorHsv[0] = Math.min(360, colorHsv[0] + accentHsv[0] - baseHsv[0]);\n colorHsv[1] = baseHsv[1] ? Math.min(1, colorHsv[1] * accentHsv[1] / baseHsv[1]) : 0;\n colorHsv[2] = baseHsv[2] ? Math.min(1, colorHsv[2] * (1 - dist + dist * accentHsv[2] / baseHsv[2])) : 0;\n\n let newColor = hsvToRgb(...colorHsv);\n\n const origBrightness = computePerceivedBrightness(color);\n const newBrightness = computePerceivedBrightness(newColor);\n\n // We need to keep colors lighter in dark themes and darker in light themes\n const needRevertBrightness = isDarkTheme ? origBrightness > newBrightness : origBrightness < newBrightness;\n\n if(needRevertBrightness) {\n const amountOfNew = 0.6;\n const fallbackAmount = (1 - amountOfNew) * origBrightness / newBrightness + amountOfNew;\n newColor = changeBrightness(newColor, fallbackAmount);\n }\n\n return newColor;\n}\n\nexport function changeBrightness(color: ColorRgb, amount: number) {\n return color.map((v) => clamp(Math.round(v * amount), 0, 255)) as ColorRgb;\n}\n\nexport function getHexColorFromTelegramColor(color: number) {\n const hex = (color < 0 ? 0xFFFFFF + color : color).toString(16);\n return '#' + (hex.length >= 6 ? hex : '0'.repeat(6 - hex.length) + hex);\n}\n\nexport function getRgbColorFromTelegramColor(color: number) {\n return hexToRgb(getHexColorFromTelegramColor(color));\n}\n\nexport function getColorsFromWallPaper(wallPaper: WallPaper) {\n return wallPaper.settings ? [\n wallPaper.settings.background_color,\n wallPaper.settings.second_background_color,\n wallPaper.settings.third_background_color,\n wallPaper.settings.fourth_background_color\n ].filter(Boolean).map(getHexColorFromTelegramColor).join(',') : '';\n}\n\nexport function rgbaToRgb(rgba: ColorRgba, bg: ColorRgb): ColorRgb {\n const a = rgba[3];\n return rgba.slice(0, 3).map((color, idx) => {\n return clamp(Math.round((a * (color / 255) + (a * (bg[idx] / 255))) * 255), 0, 255);\n }) as ColorRgb;\n}\n\nexport function calculateLuminance(rgb: ColorRgb) {\n const [r, g, b] = rgb;\n const luminance = (0.2126 * r / 255 + 0.7152 * g / 255 + 0.0722 * b / 255);\n return luminance;\n}\n\nexport function getTextColor(luminance: number): ColorRgb {\n return luminance > 0.5 ? [0, 0, 0] : [255, 255, 255];\n}\n\nexport function calculateOpacity(luminance: number, targetContrast: number) {\n const targetTextLuminance = luminance > 0.5 ? 0 : 1;\n const adaptiveOpacity = (luminance - targetTextLuminance + targetContrast) / targetContrast;\n const opacity = +Math.max(0.5, Math.min(0.64, adaptiveOpacity)).toFixed(2);\n\n return opacity;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport {MOUNT_CLASS_TO} from '../config/debug';\nimport {makeMediaSize} from './mediaSize';\n\nexport default function calcImageInBox(imageW: number, imageH: number, boxW: number, boxH: number, noZoom = true) {\n if(imageW < boxW && imageH < boxH && noZoom) {\n return makeMediaSize(imageW, imageH);\n }\n\n let boxedImageW = boxW;\n let boxedImageH = boxH;\n\n if((imageW / imageH) > (boxW / boxH)) {\n boxedImageH = (imageH * boxW / imageW) | 0;\n } else {\n boxedImageW = (imageW * boxH / imageH) | 0;\n if(boxedImageW > boxW) {\n boxedImageH = (boxedImageH * boxW / boxedImageW) | 0;\n boxedImageW = boxW;\n }\n }\n\n if(noZoom && boxedImageW >= imageW && boxedImageH >= imageH) {\n boxedImageW = imageW;\n boxedImageH = imageH;\n }\n\n return makeMediaSize(boxedImageW, boxedImageH);\n}\n\nMOUNT_CLASS_TO.calcImageInBox = calcImageInBox;\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 calcImageInBox from './calcImageInBox';\n\nexport class MediaSize {\n constructor(public width = 0, public height = width) {\n\n }\n\n public aspect(boxSize: MediaSize, fitted: boolean) {\n return calcImageInBox(this.width, this.height, boxSize.width, boxSize.height, fitted);\n }\n\n public aspectFitted(boxSize: MediaSize) {\n return this.aspect(boxSize, true);\n }\n\n public aspectCovered(boxSize: MediaSize) {\n return this.aspect(boxSize, false);\n }\n}\n\nexport function makeMediaSize(width?: number, height?: number): MediaSize {\n return new MediaSize(width, height);\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 EventListenerBase from './eventListenerBase';\nimport {makeMediaSize, MediaSize} from './mediaSize';\n\ntype MediaTypeSizes = {\n regular: MediaSize,\n webpage: MediaSize,\n album: MediaSize,\n esgSticker: MediaSize,\n animatedSticker: MediaSize,\n staticSticker: MediaSize,\n emojiSticker: MediaSize,\n poll: MediaSize,\n round: MediaSize,\n documentName: MediaSize,\n invoice: MediaSize,\n extendedInvoice: MediaSize,\n customEmoji: MediaSize,\n esgCustomEmoji: MediaSize,\n emojiStatus: MediaSize,\n popupSticker: MediaSize\n};\n\nexport type MediaSizeType = keyof MediaTypeSizes;\n\nexport enum ScreenSize {\n mobile,\n medium,\n large\n}\n\nconst MOBILE_SIZE = 600;\nconst MEDIUM_SIZE = 1275;\nconst LARGE_SIZE = 1680;\n\nconst CUSTOM_EMOJI_SIZE = makeMediaSize(20, 20);\nconst ESG_CUSTOM_EMOJI_SIZE = makeMediaSize(36, 36);\nconst EMOJI_STATUS_SIZE = makeMediaSize(18, 18);\n\nclass MediaSizes extends EventListenerBase<{\n changeScreen: (from: ScreenSize, to: ScreenSize) => void,\n resize: () => void\n}> {\n private screenSizes: {key: ScreenSize, value: number}[] = [\n {key: ScreenSize.mobile, value: MOBILE_SIZE},\n {key: ScreenSize.medium, value: MEDIUM_SIZE},\n {key: ScreenSize.large, value: LARGE_SIZE}\n ];\n\n private sizes: {[k in 'desktop' | 'handhelds']: MediaTypeSizes} = {\n handhelds: {\n regular: makeMediaSize(340, 340),\n webpage: makeMediaSize(340, 200),\n album: makeMediaSize(340, 0),\n esgSticker: makeMediaSize(68, 68),\n animatedSticker: makeMediaSize(180, 180),\n staticSticker: makeMediaSize(180, 180),\n emojiSticker: makeMediaSize(112, 112),\n poll: makeMediaSize(240, 0),\n round: makeMediaSize(240, 240),\n documentName: makeMediaSize(200, 0),\n invoice: makeMediaSize(340, 340),\n extendedInvoice: makeMediaSize(340, 340),\n customEmoji: CUSTOM_EMOJI_SIZE,\n esgCustomEmoji: ESG_CUSTOM_EMOJI_SIZE,\n emojiStatus: EMOJI_STATUS_SIZE,\n popupSticker: makeMediaSize(68, 68)\n },\n desktop: {\n regular: makeMediaSize(420, 400),\n webpage: makeMediaSize(420, 380),\n album: makeMediaSize(420, 0),\n esgSticker: makeMediaSize(72, 72),\n animatedSticker: makeMediaSize(200, 200),\n staticSticker: makeMediaSize(200, 200),\n emojiSticker: makeMediaSize(112, 112),\n poll: makeMediaSize(330, 0),\n round: makeMediaSize(280, 280),\n documentName: makeMediaSize(240, 0),\n invoice: makeMediaSize(320, 320),\n extendedInvoice: makeMediaSize(420, 400),\n customEmoji: CUSTOM_EMOJI_SIZE,\n esgCustomEmoji: ESG_CUSTOM_EMOJI_SIZE,\n emojiStatus: EMOJI_STATUS_SIZE,\n popupSticker: makeMediaSize(80, 80)\n }\n };\n\n public isMobile = false;\n public active: MediaTypeSizes;\n public activeScreen: ScreenSize;\n private rAF: number;\n\n constructor() {\n super();\n\n window.addEventListener('resize', () => {\n if(this.rAF) window.cancelAnimationFrame(this.rAF);\n this.rAF = window.requestAnimationFrame(() => {\n this.handleResize();\n this.rAF = 0;\n });\n });\n this.handleResize();\n }\n\n private handleResize = () => {\n const innerWidth = window.innerWidth;\n // this.isMobile = innerWidth <= 720;\n\n let activeScreen = this.screenSizes[0].key;\n for(let i = this.screenSizes.length - 1; i >= 0; --i) {\n if(this.screenSizes[i].value < innerWidth) {\n activeScreen = (this.screenSizes[i + 1] || this.screenSizes[i]).key;\n break;\n }\n }\n\n const wasScreen = this.activeScreen;\n this.activeScreen = activeScreen;\n this.isMobile = this.activeScreen === ScreenSize.mobile;\n this.active = this.isMobile ? this.sizes.handhelds : this.sizes.desktop;\n\n // console.time('esg');\n // const computedStyle = window.getComputedStyle(document.documentElement);\n // this.active.esgSticker.width = parseFloat(computedStyle.getPropertyValue('--esg-sticker-size'));\n // console.timeEnd('esg');\n\n if(wasScreen !== activeScreen) {\n // console.log('changeScreen', this.activeScreen, activeScreen);\n\n if(wasScreen !== undefined) {\n this.dispatchEvent('changeScreen', wasScreen, activeScreen);\n }\n }\n\n if(wasScreen !== undefined) {\n this.dispatchEvent('resize');\n }\n\n /* if(this.isMobile) {\n for(let i in this.active) {\n // @ts-ignore\n let size = this.active[i];\n size.width = innerWidth\n }\n } */\n };\n}\n\nconst mediaSizes = new MediaSizes();\nMOUNT_CLASS_TO.mediaSizes = mediaSizes;\nexport default mediaSizes;\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 rootScope from '../../lib/rootScope';\nimport mediaSizes from '../mediaSizes';\n\nexport type CustomProperty = string;\n\nexport class CustomProperties {\n private cache: {[k in CustomProperty]?: [string, string]};\n private computedStyle: CSSStyleDeclaration;\n private nightComputedStyle: CSSStyleDeclaration;\n private nightElement: HTMLElement;\n\n constructor() {\n this.cache = {};\n\n this.nightElement = document.createElement('div');\n this.nightElement.className = 'night';\n this.nightElement.style.display = 'none';\n document.body.append(this.nightElement);\n\n rootScope.addEventListener('theme_changed', this.resetCache);\n mediaSizes.addEventListener('resize', this.resetCache);\n }\n\n protected resetCache = () => {\n this.computedStyle = undefined;\n const cache = this.cache;\n this.cache = {};\n\n for(const i in cache) {\n this.getProperty(i as CustomProperty);\n }\n };\n\n public getProperty(name: CustomProperty, night?: boolean) {\n const values = this.cache[name];\n const index = night ? 1 : 0;\n if(values?.[index]) {\n return values[index];\n }\n\n this.computedStyle ??= window.getComputedStyle(document.documentElement);\n this.nightComputedStyle ??= window.getComputedStyle(this.nightElement)\n\n const value = (night ? this.nightComputedStyle : this.computedStyle).getPropertyValue('--' + name).trim();\n return this.setPropertyCache(name, value, night);\n }\n\n public getPropertyAsColor(name: CustomProperty) {\n const value = this.getProperty(name);\n if(value[0] === '#') {\n return value;\n }\n\n return `rgb(${value})`;\n }\n\n public getPropertyAsSize(name: CustomProperty) {\n const value = this.getProperty(name);\n let size: number;\n\n if(value[value.length - 1] === '%') {\n\n } else if(value.indexOf('rem')) {\n size = +value.replace('rem', '') * 16;\n } else {\n size = +value.replace('px', '');\n }\n\n return size;\n }\n\n public setPropertyCache(name: CustomProperty, value: string, night?: boolean) {\n return (this.cache[name] ??= [] as any)[night ? 1 : 0] = value;\n }\n}\n\nconst customProperties = new CustomProperties();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.customProperties = customProperties);\nexport default customProperties;\n","import {createSignal, Setter} from 'solid-js';\n\n/**\n * do not use getter in JSX\n */\nexport default function createUnifiedSignal(...args: Partial>>) {\n const [getter, setter] = createSignal(...args);\n return >>(...args: Partial) => {\n // @ts-ignore\n if(args.length === 0) {\n return getter();\n }\n\n // @ts-ignore\n return setter(...args);\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 {IS_WORKER} from './context';\nimport createUnifiedSignal from './solid/createUnifiedSignal';\n\nexport class WindowSize {\n private _width: ReturnType>;\n private _height: ReturnType>;\n // private rAF: number;\n private viewport: VisualViewport | Window;\n\n constructor() {\n if(IS_WORKER) {\n return;\n }\n\n this._width = createUnifiedSignal();\n this._height = createUnifiedSignal();\n\n this.viewport = /* 'visualViewport' in window ? window.visualViewport : */window;\n const set = () => {\n this.setDimensions();\n\n // if(this.width === undefined) {\n // this.setDimensions();\n // return;\n // }\n\n // if(this.rAF) window.cancelAnimationFrame(this.rAF);\n // this.rAF = window.requestAnimationFrame(() => {\n // this.rAF = 0;\n\n // batch(() => {\n // this.setDimensions();\n // });\n // });\n };\n this.viewport.addEventListener('resize', set);\n set();\n }\n\n private setDimensions() {\n const w = this.viewport;\n this._width((w as VisualViewport).width || (w as Window).innerWidth);\n this._height((w as VisualViewport).height || (w as Window).innerHeight);\n }\n\n public get width() {\n return this._width();\n }\n\n public get height() {\n return this._height();\n }\n}\n\nconst windowSize = new WindowSize();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.windowSize = windowSize);\nexport default windowSize;\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 rootScope from '../lib/rootScope';\n\nexport type LiteModeKey = 'all' | 'gif' | 'video' |\n 'emoji' | 'emoji_panel' | 'emoji_messages' |\n 'effects' | 'effects_reactions' | 'effects_premiumstickers' | 'effects_emoji' |\n 'stickers' | 'stickers_panel' | 'stickers_chat' |\n 'chat' | 'chat_background' | 'chat_spoilers' | 'animations';\n\nexport class LiteMode {\n public isEnabled() {\n return !!(rootScope.settings && rootScope.settings.liteMode.all);\n }\n\n public isAvailable(key: LiteModeKey) {\n return !!(rootScope.settings && !rootScope.settings.liteMode.all && !rootScope.settings.liteMode[key]);\n }\n}\n\nconst liteMode = new LiteMode();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.liteMode = liteMode);\nexport default liteMode;\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 {AppTheme} from '../config/state';\nimport type {Theme} from '../layer';\nimport type AppBackgroundTab from '../components/sidebarLeft/tabs/background';\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport rootScope from '../lib/rootScope';\nimport {changeColorAccent, ColorRgb, getAccentColor, getAverageColor, getHexColorFromTelegramColor, getRgbColorFromTelegramColor, hexToRgb, hslaStringToHex, hslaStringToRgba, hslaToRgba, hsvToRgb, mixColors, rgbaToHexa, rgbaToHsla, rgbToHsv} from './color';\nimport {MOUNT_CLASS_TO} from '../config/debug';\nimport customProperties from './dom/customProperties';\nimport {TelegramWebViewTheme} from '../types';\nimport {joinDeepPath} from './object/setDeepProperty';\nimport windowSize from './windowSize';\nimport liteMode from './liteMode';\n\nexport type AppColorName = 'primary-color' | 'message-out-primary-color' |\n 'surface-color' | 'danger-color' | 'primary-text-color' |\n 'secondary-text-color' | 'message-out-background-color' |\n 'saved-color' | 'message-background-color' | 'green-color';\ntype AppColor = {\n rgb?: boolean,\n light?: boolean,\n lightFilled?: boolean,\n dark?: boolean,\n darkRgb?: boolean,\n darkFilled?: boolean\n};\n\nconst appColorMap: {[name in AppColorName]: AppColor} = {\n // 'background-color': {},\n 'primary-color': {\n rgb: true,\n light: true,\n lightFilled: true,\n dark: true,\n darkRgb: true\n },\n 'message-out-primary-color': {\n lightFilled: true,\n rgb: true\n },\n 'surface-color': {\n rgb: true\n },\n 'danger-color': {\n rgb: true,\n light: true,\n dark: true\n },\n 'primary-text-color': {\n rgb: true\n },\n 'secondary-text-color': {\n light: true,\n lightFilled: true,\n rgb: true\n },\n 'message-background-color': {\n light: true,\n lightFilled: true,\n dark: true,\n darkFilled: true\n },\n 'message-out-background-color': {\n light: true,\n lightFilled: true,\n dark: true,\n darkFilled: true,\n rgb: true\n },\n 'saved-color': {\n lightFilled: true\n },\n 'green-color': {}\n};\n\nconst colorMap: {\n [name in AppTheme['name']]?: {\n [name in AppColorName]?: string\n }\n} = {\n day: {\n // 'background-color': '#f4f4f5',\n 'primary-color': '#3390ec',\n 'message-out-primary-color': '#5CA853',\n 'message-background-color': '#ffffff',\n 'surface-color': '#ffffff',\n 'danger-color': '#df3f40',\n 'primary-text-color': '#000000',\n 'secondary-text-color': '#707579',\n 'saved-color': '#359AD4',\n 'green-color': '#70b768'\n },\n night: {\n // 'background-color': '#181818',\n 'primary-color': '#8774E1',\n 'message-out-primary-color': '#8774E1',\n 'message-background-color': '#212121',\n 'surface-color': '#212121',\n 'danger-color': '#ff595a',\n 'primary-text-color': '#ffffff',\n 'secondary-text-color': '#aaaaaa',\n 'saved-color': '#8774E1',\n 'green-color': '#5CC85E'\n }\n};\n\nexport class ThemeController {\n private themeColor: string;\n private _themeColorElem: Element;\n private systemTheme: AppTheme['name'];\n private styleElement: HTMLStyleElement;\n public AppBackgroundTab: typeof AppBackgroundTab;\n private applied: boolean;\n\n constructor() {\n rootScope.addEventListener('theme_change', (coordinates) => {\n this.setTheme(typeof(coordinates) === 'object' ? coordinates : undefined);\n });\n\n rootScope.addEventListener('theme_changed', () => {\n this.setWorkerThemeParams();\n });\n\n // rootScope.addEventListener('settings_updated', ())\n }\n\n private setWorkerThemeParams() {\n rootScope.managers.apiManager.setThemeParams({\n _: 'dataJSON',\n data: JSON.stringify(this.getThemeParamsForWebView())\n });\n }\n\n private get themeColorElem() {\n if(this._themeColorElem !== undefined) {\n return this._themeColorElem;\n }\n\n return this._themeColorElem = document.head.querySelector('[name=\"theme-color\"]') as Element || null;\n }\n\n public setThemeColor(color = this.themeColor) {\n if(!color) {\n color = this.isNight() ? '#212121' : '#ffffff';\n }\n\n const themeColorElem = this.themeColorElem;\n if(themeColorElem) {\n themeColorElem.setAttribute('content', color);\n }\n }\n\n public setThemeListener() {\n try {\n const darkModeMediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n const checkDarkMode = () => {\n // const theme = this.getTheme();\n this.systemTheme = darkModeMediaQuery.matches ? 'night' : 'day';\n // const newTheme = this.getTheme();\n\n if(rootScope.myId) {\n rootScope.dispatchEvent('theme_change');\n } else {\n this.setTheme();\n }\n };\n\n if('addEventListener' in darkModeMediaQuery) {\n darkModeMediaQuery.addEventListener('change', checkDarkMode);\n } else if('addListener' in darkModeMediaQuery) {\n (darkModeMediaQuery as any).addListener(checkDarkMode);\n }\n\n checkDarkMode();\n } catch(err) {\n\n }\n }\n\n public applyHighlightingColor({\n hsla,\n element = document.documentElement\n }: {\n hsla?: string,\n element?: HTMLElement\n } = {}) {\n if(!hsla) {\n hsla = 'hsla(85.5319, 36.9171%, 40.402%, .4)';\n const theme = this.getTheme();\n if(theme.settings?.highlightingColor) {\n hsla = theme.settings.highlightingColor;\n }\n }\n\n const highlightingRgba = hslaStringToRgba(hsla);\n element.style.setProperty('--message-highlighting-color', hsla);\n element.style.setProperty('--message-highlighting-color-rgb', highlightingRgba.slice(0, 3).join(','));\n element.style.setProperty('--message-highlighting-alpha', '' + highlightingRgba[3] / 255);\n\n if(!IS_TOUCH_SUPPORTED && hsla) {\n this.themeColor = hslaStringToHex(hsla);\n }\n }\n\n public _setTheme(silent?: boolean) {\n const isNight = this.isNight();\n const colorScheme = document.head.querySelector('[name=\"color-scheme\"]');\n colorScheme?.setAttribute('content', isNight ? 'dark' : 'light');\n\n document.documentElement.classList.toggle('night', isNight);\n this.setThemeColor();\n const theme = this.getTheme();\n this.applyTheme(theme);\n\n let style = this.styleElement;\n if(!style) {\n style = this.styleElement = document.createElement('style');\n document.head.append(style);\n }\n\n const e = document.createElement('div');\n this.applyTheme(rootScope.settings.themes.find((theme) => theme.name === 'night'), e, true);\n style.textContent = `.night {${e.style.cssText}}`;\n\n this.applyHighlightingColor();\n !silent && rootScope.dispatchEventSingle('theme_changed');\n }\n\n public setTheme(coordinates?: {x: number, y: number}) {\n if(!('startViewTransition' in document) || !this.applied) {\n const silent = !this.applied;\n const wasApplied = this.applied;\n this.applied = true;\n\n this._setTheme(silent);\n if(!wasApplied) {\n this.setWorkerThemeParams();\n }\n\n return;\n }\n\n if(!liteMode.isAvailable('animations')) {\n coordinates = undefined;\n }\n\n const reverse = !this.isNight();\n if(coordinates) {\n document.documentElement.classList.add('no-view-transition');\n document.documentElement.classList.toggle('reverse', reverse);\n void document.documentElement.offsetLeft; // reflow\n }\n\n const transition = (document as any).startViewTransition(() => {\n this._setTheme();\n });\n\n if(!coordinates) {\n return;\n }\n\n const {x, y} = coordinates;\n // Get the distance to the furthest corner\n const endRadius = Math.hypot(\n Math.max(x, windowSize.width - x),\n Math.max(y, windowSize.height - y)\n );\n\n transition.ready.then(() => {\n document.documentElement.animate({\n clipPath: [\n `circle(0 at ${x}px ${y}px)`,\n `circle(${endRadius}px at ${x}px ${y}px)`\n ]\n }, {\n duration: 500,\n easing: 'ease-in-out',\n pseudoElement: `::view-transition-${reverse ? 'old' : 'new'}(root)`,\n direction: reverse ? 'reverse' : 'normal'\n });\n });\n\n transition.finished.finally(() => {\n document.documentElement.classList.remove('no-view-transition', 'reverse');\n });\n }\n\n public async switchTheme(name: AppTheme['name'], coordinates?: {x: number, y: number}) {\n await rootScope.managers.appStateManager.setByKey(joinDeepPath('settings', 'theme'), name);\n rootScope.dispatchEvent('theme_change', coordinates);\n }\n\n public isNight() {\n return this.getTheme().name === 'night';\n }\n\n public getTheme(name: AppTheme['name'] = rootScope.settings.theme === 'system' ? this.systemTheme : rootScope.settings.theme) {\n return rootScope.settings.themes.find((t) => t.name === name);\n }\n\n // theme applier\n private bindColorApplier(options: Pick[0], 'element' | 'isNight' | 'saveToCache'>) {\n const appliedColors: Set = new Set();\n return {\n applyAppColor: (_options: Omit[0], keyof typeof options>) => {\n appliedColors.add(_options.name);\n return this.applyAppColor({..._options, ...options});\n },\n finalize: () => {\n const isNight = options.isNight;\n for(const name in appColorMap) {\n if(!appliedColors.has(name as AppColorName)) {\n this.applyAppColor({\n name: name as AppColorName,\n hex: colorMap[isNight ? 'night' : 'day'][name as AppColorName],\n ...options\n });\n }\n }\n }\n };\n };\n\n public applyAppColor({\n name,\n hex,\n element,\n lightenAlpha = 0.08,\n darkenAlpha = lightenAlpha,\n mixColor,\n isNight = this.isNight(),\n saveToCache\n }: {\n name: AppColorName,\n hex: string,\n element: HTMLElement,\n lightenAlpha?: number\n darkenAlpha?: number,\n mixColor?: ColorRgb,\n isNight?: boolean,\n saveToCache?: boolean\n }) {\n const appColor = appColorMap[name];\n const rgb = hexToRgb(hex);\n const hsla = rgbaToHsla(...rgb);\n\n mixColor ??= hexToRgb(colorMap[isNight ? 'night' : 'day']['surface-color']);\n const lightenedRgb = mixColors(rgb, mixColor, lightenAlpha);\n\n const darkenedHsla: typeof hsla = {\n ...hsla,\n l: hsla.l - darkenAlpha * 100\n };\n\n const properties: [string, string][] = [\n [name, hex],\n appColor.rgb && [name + '-rgb', rgb.join(',')],\n appColor.light && ['light-' + name, `rgba(${rgb[0]}, ${rgb[1]}, ${rgb[2]}, ${lightenAlpha})`],\n appColor.lightFilled && ['light-filled-' + name, rgbaToHexa(lightenedRgb)],\n appColor.dark && ['dark-' + name, `hsl(${darkenedHsla.h}, ${darkenedHsla.s}%, ${darkenedHsla.l}%)`]\n // appColor.darkFilled && ['dark-' + name, `hsl(${darkenedHsla.h}, ${darkenedHsla.s}%, ${darkenedHsla.l}%)`]\n ];\n\n saveToCache ??= element === document.documentElement;\n properties.filter(Boolean).forEach(([name, value]) => {\n element.style.setProperty('--' + name, value);\n\n if(saveToCache) {\n customProperties.setPropertyCache(name as AppColorName, value, isNight);\n }\n });\n }\n\n public async applyNewTheme(theme: Theme) {\n const isNight = this.isNightTheme(theme);\n const currentTheme = this.getTheme();\n const themes = rootScope.settings.themes;\n const themeSettings = theme.settings.find((themeSettings) => themeSettings.base_theme._ === (isNight ? 'baseThemeNight' : 'baseThemeClassic'));\n const newAppTheme: AppTheme = {\n ...theme,\n name: currentTheme.name,\n settings: {\n ...themeSettings,\n highlightingColor: ''\n }\n };\n\n await this.AppBackgroundTab.setBackgroundDocument(themeSettings.wallpaper, newAppTheme.settings);\n themes[themes.indexOf(currentTheme)] = newAppTheme;\n await rootScope.managers.appStateManager.setByKey(joinDeepPath('settings', 'themes'), rootScope.settings.themes);\n rootScope.dispatchEvent('theme_change');\n }\n\n private isNightTheme(theme: Theme | AppTheme) {\n return (theme as AppTheme).name === 'night' || this.isNight();\n }\n\n public getThemeSettings(theme: Theme | AppTheme, isNight?: boolean) {\n isNight ??= this.isNightTheme(theme);\n const themeSettings = Array.isArray(theme.settings) ?\n theme.settings.find((settings) => settings.base_theme._ === (isNight ? 'baseThemeNight' : 'baseThemeClassic')) :\n theme.settings;\n return themeSettings;\n }\n\n public applyTheme(theme: Theme | AppTheme, element = document.documentElement, saveToCache?: boolean) {\n const isNight = this.isNightTheme(theme);\n const themeSettings = this.getThemeSettings(theme, isNight);\n const baseColors = colorMap[isNight ? 'night' : 'day'];\n\n let hsvTemp1 = rgbToHsv(...hexToRgb(baseColors['primary-color'])); // primary base\n let hsvTemp2 = rgbToHsv(...getRgbColorFromTelegramColor(themeSettings.accent_color)); // new primary\n\n const newAccentRgb = changeColorAccent(\n hsvTemp1,\n hsvTemp2,\n hexToRgb(baseColors['primary-color']),\n !isNight\n );\n const newAccentHex = rgbaToHexa(newAccentRgb);\n\n const {applyAppColor, finalize} = this.bindColorApplier({element, isNight, saveToCache});\n\n applyAppColor({\n name: 'primary-color',\n hex: newAccentHex,\n darkenAlpha: 0.04\n });\n\n applyAppColor({\n name: 'saved-color',\n hex: newAccentHex,\n lightenAlpha: 0.64,\n mixColor: [255, 255, 255]\n });\n\n if(!themeSettings.message_colors?.length) {\n return;\n }\n\n const messageLightenAlpha = isNight ? 1 : 0.12;\n const baseMessageColor = hexToRgb(baseColors['message-out-primary-color']);\n hsvTemp1 = rgbToHsv(...baseMessageColor);\n const baseMessageOutBackgroundColor = mixColors(baseMessageColor, hexToRgb(baseColors['surface-color']), messageLightenAlpha);\n\n const firstColor = getRgbColorFromTelegramColor(themeSettings.message_colors[0]);\n\n let myMessagesAccent = firstColor;\n if(themeSettings.message_colors.length > 1) {\n // const w = getAccentColor(hsvTemp1, baseMessageOutBackgroundColor, myMessagesAccent);\n\n themeSettings.message_colors.slice(1).forEach((nextColor) => {\n myMessagesAccent = getAverageColor(myMessagesAccent, getRgbColorFromTelegramColor(nextColor));\n });\n\n myMessagesAccent = getAccentColor(hsvTemp1, baseMessageOutBackgroundColor, myMessagesAccent);\n\n // console.log('www', rgbaToHexa(w), rgbaToHexa(myMessagesAccent));\n }\n\n const o = myMessagesAccent;\n hsvTemp2 = rgbToHsv(...o);\n\n // const c = changeColorAccent(\n // hsvTemp1,\n // hsvTemp2,\n // baseMessageOutBackgroundColor\n // );\n\n // console.log(o, c, rgbaToHexa(o), rgbaToHexa(c));\n\n const accentColor2 = themeSettings.outbox_accent_color !== undefined && rgbToHsv(...getRgbColorFromTelegramColor(themeSettings.outbox_accent_color));\n\n let newMessageOutBackgroundColor = mixColors(myMessagesAccent, hexToRgb(baseColors['surface-color']), messageLightenAlpha);\n\n if(!isNight/* || true */) {\n const messageOutBackgroundColorHsl = rgbaToHsla(...newMessageOutBackgroundColor);\n messageOutBackgroundColorHsl.s = Math.min(messageOutBackgroundColorHsl.s + (isNight ? 8 : 63), 100);\n newMessageOutBackgroundColor = hslaToRgba(messageOutBackgroundColorHsl.h, messageOutBackgroundColorHsl.s, messageOutBackgroundColorHsl.l, messageOutBackgroundColorHsl.a).slice(0, 3) as ColorRgb;\n }\n\n applyAppColor({\n name: 'message-out-background-color',\n hex: rgbaToHexa(newMessageOutBackgroundColor),\n lightenAlpha: messageLightenAlpha\n });\n\n applyAppColor({\n name: 'message-out-primary-color',\n hex: isNight ? '#ffffff' : rgbaToHexa(accentColor2 ? hsvToRgb(...accentColor2) : myMessagesAccent),\n mixColor: newMessageOutBackgroundColor\n });\n\n // if(accentColor2) {\n // console.log(rgbaToHexa(myMessagesAccent), rgbaToHexa(hsvToRgb(...accentColor2)));\n // }\n\n finalize();\n }\n\n public getThemeParamsForWebView() {\n const themePropertiesMap: {[key in keyof TelegramWebViewTheme]: string} = {\n bg_color: 'surface-color',\n button_color: 'primary-color',\n button_text_color: '#ffffff',\n hint_color: 'secondary-text-color',\n link_color: 'link-color',\n secondary_bg_color: 'background-color-true',\n text_color: 'primary-text-color',\n header_bg_color: 'surface-color',\n accent_text_color: 'primary-color',\n section_bg_color: 'surface-color',\n section_header_text_color: 'primary-color',\n subtitle_text_color: 'secondary-text-color',\n destructive_text_color: 'danger-color'\n };\n\n const themeParams: TelegramWebViewTheme = {} as any;\n for(const key in themePropertiesMap) {\n const value = themePropertiesMap[key as keyof TelegramWebViewTheme];\n themeParams[key as keyof TelegramWebViewTheme] = value[0] === '#' ? value : customProperties.getProperty(value as AppColorName);\n }\n\n return themeParams;\n }\n}\n\nconst themeController = new ThemeController();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.themeController = themeController);\nexport default themeController;\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 EventListenerBase from './eventListenerBase';\n\nexport class OverlayCounter extends EventListenerBase<{\n change: (isActive: boolean) => void\n}> {\n public overlaysActive = 0;\n public hasDarkOverlays = 0;\n\n get isOverlayActive() {\n return this.overlaysActive > 0;\n }\n\n set isOverlayActive(value: boolean) {\n this.overlaysActive += value ? 1 : -1;\n this.dispatchEvent('change', this.isOverlayActive);\n }\n\n get isDarkOverlayActive() {\n return this.hasDarkOverlays > 0;\n }\n\n set isDarkOverlayActive(value: boolean) {\n this.hasDarkOverlays += value ? 1 : -1;\n this.isOverlayActive = value;\n }\n}\n\nconst overlayCounter = new OverlayCounter();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.overlayCounter = overlayCounter);\nexport default overlayCounter;\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 parseUriParams(uri: string, splitted = uri.split('?')) {\n return parseUriParamsLine(splitted?.[1]);\n}\n\nexport function parseUriParamsLine(line: string) {\n const params: any = {};\n if(!line) {\n return params;\n }\n\n line.split('&').forEach((item) => {\n const [key, value = ''] = item.split('=');\n params[key] = decodeURIComponent(value);\n });\n\n return params;\n}\n","const IS_INSTALL_PROMPT_SUPPORTED = 'onbeforeinstallprompt' in window;\nexport default IS_INSTALL_PROMPT_SUPPORTED;\n","let callback: () => Promise;\nexport default function cacheInstallPrompt() {\n window.addEventListener('beforeinstallprompt', (deferredPrompt: any) => {\n callback = async() => {\n deferredPrompt.prompt();\n const {outcome} = await deferredPrompt.userChoice;\n const installed = outcome === 'accepted';\n if(installed) {\n callback = undefined;\n }\n };\n });\n}\n\nexport function getInstallPrompt() {\n return callback;\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 I18n, {i18n} from '../lib/langPack';\nimport capitalizeFirstLetter from './string/capitalizeFirstLetter';\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'];\nexport const monthsLocalized = months.slice();\nexport const daysLocalized = days.slice();\n\nexport const ONE_DAY = 86400;\nexport const ONE_DAY_MINUTES = 1440;\nexport const ONE_WEEK = 604800;\nexport const ONE_WEEK_MINUTES = 10080;\n\nexport function getWeekDays() {\n const dateTimeFormat = I18n.getDateTimeFormat({weekday: 'long'});\n const date = new Date(Date.UTC(2017, 0, 2));\n const out: string[] = [];\n for(let i = 0; i < 7; ++i) {\n out.push(capitalizeFirstLetter(dateTimeFormat.format(date)));\n date.setDate(date.getDate() + 1);\n }\n return out;\n}\n\nexport function getMonths() {\n const dateTimeFormat = I18n.getDateTimeFormat({month: 'long'});\n const date = new Date(Date.UTC(2017, 0, 1));\n const out: string[] = [];\n for(let i = 0; i < 12; ++i) {\n out.push(capitalizeFirstLetter(dateTimeFormat.format(date)));\n date.setMonth(date.getMonth() + 1);\n }\n return out;\n}\n\nexport function fillLocalizedDates() {\n monthsLocalized.splice(0, monthsLocalized.length, ...getMonths());\n daysLocalized.splice(0, daysLocalized.length, ...getWeekDays());\n}\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 function formatDate(date: Date, today?: Date) {\n if(!today) {\n today = new Date();\n today.setHours(0, 0, 0, 0);\n }\n\n const options: Intl.DateTimeFormatOptions = {\n day: 'numeric',\n month: 'long'\n };\n\n if(date.getFullYear() !== today.getFullYear()) {\n options.year = 'numeric';\n }\n\n return new I18n.IntlDateElement({\n date,\n options\n }).element;\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\nconst formatTimeOptions: Intl.DateTimeFormatOptions = {\n hour: '2-digit',\n minute: '2-digit'\n};\n\nexport function formatFullSentTimeRaw(timestamp: number, options: {\n capitalize?: boolean\n noToday?: boolean,\n combined?: boolean\n} = {}) {\n if(options.combined) {\n options.noToday = true;\n }\n\n const date = new Date();\n const time = new Date(timestamp * 1000);\n const now = date.getTime() / 1000 | 0;\n const diff = now - timestamp;\n\n const timeEl = options.combined ? undefined : formatTime(time);\n\n let dateEl: HTMLElement;\n if(!options.noToday && diff < ONE_DAY && date.getDate() === time.getDate()) { // if the same day\n dateEl = i18n(options.capitalize ? 'Date.Today' : 'Peer.Status.Today');\n } else if(!options.noToday && diff > 0 && diff < (ONE_DAY * 2) && new Date(date.getTime() - ONE_DAY * 1000).getDate() === time.getDate()) { // yesterday\n dateEl = i18n(options.capitalize ? 'Yesterday' : 'Peer.Status.Yesterday');\n\n if(options.capitalize) {\n dateEl.style.textTransform = 'capitalize';\n }\n } else if(date.getFullYear() !== time.getFullYear()) { // different year\n dateEl = new I18n.IntlDateElement({\n date: time,\n options: {\n month: 'short',\n day: 'numeric',\n year: 'numeric',\n ...(options.combined ? formatTimeOptions: {})\n }\n }).element;\n // dateStr = months[time.getMonth()].slice(0, 3) + ' ' + time.getDate() + ', ' + time.getFullYear();\n } else {\n dateEl = new I18n.IntlDateElement({\n date: time,\n options: {\n month: 'short',\n day: 'numeric',\n ...(options.combined ? formatTimeOptions: {})\n }\n }).element;\n // dateStr = months[time.getMonth()].slice(0, 3) + ' ' + time.getDate();\n }\n\n return {dateEl, timeEl};\n}\n\nexport function formatFullSentTime(timestamp: number, capitalize = true, noToday = false) {\n const {dateEl, timeEl} = formatFullSentTimeRaw(timestamp, {\n capitalize,\n noToday\n });\n\n const fragment = document.createDocumentFragment();\n fragment.append(dateEl, ' ', i18n('ScheduleController.at'), ' ', timeEl);\n return fragment;\n}\n\nexport function formatTime(date: Date) {\n return new I18n.IntlDateElement({\n date,\n options: formatTimeOptions\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 shortYear: boolean\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 const fullYear = date.getFullYear();\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 + (('' + fullYear).slice(options.shortYear ? 2 : 0)) +\n (options.noTime ? '' : ', ' + time);\n};\n\nexport function formatMonthsDuration(months: number, bold?: boolean) {\n const isYears = months >= 12 && !(months % 12);\n return i18n(\n bold ? (isYears ? 'BoldYears' : 'BoldMonths') : (isYears ? 'Years' : 'Months'),\n [isYears ? months / 12 : months]\n );\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 anyLetterRegExp = `\\\\p{L}`;\nconst monthPattern = new RegExp(`(${anyLetterRegExp}{3,})`, 'iu');\nconst monthYearOrDayPattern = new RegExp(`(${anyLetterRegExp}{3,}) ([0-9]{0,4})`, 'iu');\nconst yearOrDayAndMonthPattern = new RegExp(`([0-9]{0,4}) (${anyLetterRegExp}{2,})`, 'iu');\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', I18n.format('Peer.Status.Today', true)].some((haystack) => haystack.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: I18n.format('Date.Today', true),\n minDate,\n maxDate\n });\n return;\n }\n\n if(['yesterday', I18n.format('Peer.Status.Yesterday', true)].some((haystack) => haystack.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: capitalizeFirstLetter(I18n.format('Yesterday', true)),\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 = 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 || new Date().getUTCFullYear();\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 if((matches = monthPattern.exec(q)) !== null) {\n const g1 = matches[1];\n const month = getMonth(g1);\n if(month >= 0) {\n const currentYear = new Date().getFullYear();\n for(let i = currentYear; i >= minYear; --i) {\n createForMonthYear(dates, month, i);\n }\n }\n }\n\n if((matches = yearPattern.exec(q)) !== null) {\n let selectedYear = +matches[0];\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\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 monthsLocalized[date.getMonth()]/* .slice(0, 3) */ + ' ' + date.getFullYear();\n}\n\nfunction formatterDayMonth(timestamp: number) {\n const date = new Date(timestamp);\n return monthsLocalized[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 daysLocalized[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 q = q.toLowerCase();\n for(let i = 0; i < 12; i++) {\n if([months[i], monthsLocalized[i]].some((month) => month.toLowerCase().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","import {CHROMIUM_VERSION, IS_CHROMIUM, IS_FIREFOX, IS_MOBILE, IS_MOBILE_SAFARI, IS_SAFARI} from './userAgent';\n\nexport const USE_NATIVE_SCROLL = /* IS_APPLE || */IS_MOBILE/* || true */;\nexport const IS_OVERLAY_SCROLL_SUPPORTED = IS_MOBILE || (!IS_CHROMIUM && (!IS_SAFARI || IS_MOBILE_SAFARI)/* && !IS_FIREFOX */) || CHROMIUM_VERSION < 113;\nexport const USE_CUSTOM_SCROLL = !USE_NATIVE_SCROLL && !IS_OVERLAY_SCROLL_SUPPORTED;\n","var We = Object.defineProperty;\nvar Ue = (s, e, t) => e in s ? We(s, e, { enumerable: !0, configurable: !0, writable: !0, value: t }) : s[e] = t;\nvar c = (s, e, t) => (Ue(s, typeof e != \"symbol\" ? e + \"\" : e, t), t);\nfunction oe(s, e) {\n let t;\n const n = () => {\n t !== void 0 && e && e(t), t = void 0;\n };\n return [() => t === void 0 ? t = s(n) : t, n];\n}\nfunction ae(s) {\n const e = M(), { count: t } = e;\n e.unsubscribe(s), t && !e.count && it();\n}\nfunction He(s) {\n return M().subscribe(s), () => ae(s);\n}\nclass Oe {\n constructor(e, t = {}) {\n this.scope = e, this.options = t;\n }\n /**\n * Prints message into a console in case, logger is currently enabled.\n * @param level - log level.\n * @param args - arguments.\n */\n print(e, ...t) {\n const n = /* @__PURE__ */ new Date(), r = Intl.DateTimeFormat(\"en-GB\", {\n hour: \"2-digit\",\n minute: \"2-digit\",\n second: \"2-digit\",\n fractionalSecondDigits: 3,\n timeZone: \"UTC\"\n }).format(n), { textColor: i, bgColor: o } = this.options, a = \"font-weight: bold;padding: 0 5px;border-radius:5px\";\n console[e](\n `%c${r}%c / %c${this.scope}`,\n `${a};background-color: lightblue;color:black`,\n \"\",\n `${a};${i ? `color:${i};` : \"\"}${o ? `background-color:${o}` : \"\"}`,\n ...t\n );\n }\n /**\n * Prints error message into a console.\n * @param args\n */\n error(...e) {\n this.print(\"error\", ...e);\n }\n /**\n * Prints log message into a console.\n * @param args\n */\n log(...e) {\n this.print(\"log\", ...e);\n }\n}\nconst F = new Oe(\"SDK\", {\n bgColor: \"forestgreen\",\n textColor: \"white\"\n});\nlet O = !1;\nconst se = ({ name: s, payload: e }) => {\n F.log(\"Event received:\", e ? { name: s, payload: e } : { name: s });\n};\nfunction Kt(s) {\n O !== s && (O = s, s ? He(se) : ae(se));\n}\nfunction Ge(...s) {\n O && F.log(...s);\n}\nclass R {\n constructor() {\n c(this, \"listeners\", /* @__PURE__ */ new Map());\n c(this, \"listenersCount\", 0);\n c(this, \"subscribeListeners\", []);\n }\n /**\n * Removes all event listeners.\n */\n clear() {\n this.listeners.clear(), this.subscribeListeners = [];\n }\n /**\n * Returns count of bound listeners.\n */\n get count() {\n return this.listenersCount + this.subscribeListeners.length;\n }\n emit(e, ...t) {\n this.subscribeListeners.forEach((r) => r({\n event: e,\n args: t\n })), (this.listeners.get(e) || []).forEach(([r, i]) => {\n r(...t), i && this.off(e, r);\n });\n }\n /**\n * Adds new event listener.\n * @param event - event name.\n * @param listener - event listener.\n * @param once - should listener be called only once.\n * @returns Function to remove bound event listener.\n */\n on(e, t, n) {\n let r = this.listeners.get(e);\n return r || this.listeners.set(e, r = []), r.push([t, n]), this.listenersCount += 1, () => this.off(e, t);\n }\n /**\n * Removes event listener. In case, specified listener was bound several times, it removes\n * only a single one.\n * @param event - event name.\n * @param listener - event listener.\n */\n off(e, t) {\n const n = this.listeners.get(e) || [];\n for (let r = 0; r < n.length; r += 1)\n if (t === n[r][0]) {\n n.splice(r, 1), this.listenersCount -= 1;\n return;\n }\n }\n /**\n * Adds a new event listener for all events.\n * @param listener - event listener.\n * @returns Function to remove event listener.\n */\n subscribe(e) {\n return this.subscribeListeners.push(e), () => this.unsubscribe(e);\n }\n /**\n * Removes global event listener. In case, specified listener was bound several times, it removes\n * only a single one.\n * @param listener - event listener.\n */\n unsubscribe(e) {\n for (let t = 0; t < this.subscribeListeners.length; t += 1)\n if (this.subscribeListeners[t] === e) {\n this.subscribeListeners.splice(t, 1);\n return;\n }\n }\n}\nfunction G(s, e, t) {\n return window.addEventListener(s, e, t), () => window.removeEventListener(s, e, t);\n}\nfunction J(...s) {\n let e = !1;\n const t = s.flat(1);\n return [\n (n) => !e && t.push(n),\n () => {\n e || (e = !0, t.forEach((n) => n()));\n },\n e\n ];\n}\nclass V extends Error {\n constructor(e, t, n) {\n super(t, { cause: n }), this.type = e, Object.setPrototypeOf(this, V.prototype);\n }\n}\nfunction f(s, e, t) {\n return new V(s, e, t);\n}\nconst je = \"ERR_METHOD_UNSUPPORTED\", ze = \"ERR_METHOD_PARAMETER_UNSUPPORTED\", Fe = \"ERR_UNKNOWN_ENV\", Je = \"ERR_INVOKE_CUSTOM_METHOD_RESPONSE\", Qe = \"ERR_TIMED_OUT\", Ye = \"ERR_UNEXPECTED_TYPE\", ce = \"ERR_PARSE\", Ze = \"ERR_NAVIGATION_LIST_EMPTY\", Ke = \"ERR_NAVIGATION_CURSOR_INVALID\", Xt = \"ERR_NAVIGATION_ITEM_INVALID\", es = \"ERR_SSR_INIT\", Xe = \"ERR_INVALID_PATH_BASE\";\nfunction E() {\n return f(Ye, \"Value has unexpected type\");\n}\nclass D {\n constructor(e, t, n) {\n this.parser = e, this.isOptional = t, this.type = n;\n }\n /**\n * Attempts to parse passed value\n * @param value - value to parse.\n * @throws {SDKError} ERR_PARSE\n * @see ERR_PARSE\n */\n parse(e) {\n if (!(this.isOptional && e === void 0))\n try {\n return this.parser(e);\n } catch (t) {\n throw f(\n ce,\n `Unable to parse value${this.type ? ` as ${this.type}` : \"\"}`,\n t\n );\n }\n }\n optional() {\n return this.isOptional = !0, this;\n }\n}\nfunction S(s, e) {\n return () => new D(s, !1, e);\n}\nconst b = S((s) => {\n if (typeof s == \"boolean\")\n return s;\n const e = String(s);\n if (e === \"1\" || e === \"true\")\n return !0;\n if (e === \"0\" || e === \"false\")\n return !1;\n throw E();\n}, \"boolean\");\nfunction pe(s, e) {\n const t = {};\n for (const n in s) {\n const r = s[n];\n if (!r)\n continue;\n let i, o;\n if (typeof r == \"function\" || \"parse\" in r)\n i = n, o = typeof r == \"function\" ? r : r.parse.bind(r);\n else {\n const { type: a } = r;\n i = r.from || n, o = typeof a == \"function\" ? a : a.parse.bind(a);\n }\n try {\n const a = o(e(i));\n a !== void 0 && (t[n] = a);\n } catch (a) {\n throw f(ce, `Unable to parse field \"${n}\"`, a);\n }\n }\n return t;\n}\nfunction he(s) {\n let e = s;\n if (typeof e == \"string\" && (e = JSON.parse(e)), typeof e != \"object\" || e === null || Array.isArray(e))\n throw E();\n return e;\n}\nfunction g(s, e) {\n return new D((t) => {\n const n = he(t);\n return pe(s, (r) => n[r]);\n }, !1, e);\n}\nconst y = S((s) => {\n if (typeof s == \"number\")\n return s;\n if (typeof s == \"string\") {\n const e = Number(s);\n if (!Number.isNaN(e))\n return e;\n }\n throw E();\n}, \"number\"), h = S((s) => {\n if (typeof s == \"string\" || typeof s == \"number\")\n return s.toString();\n throw E();\n}, \"string\");\nfunction ue(s) {\n return g({\n eventType: h(),\n eventData: (e) => e\n }).parse(s);\n}\nfunction et() {\n [\"TelegramGameProxy_receiveEvent\", \"TelegramGameProxy\", \"Telegram\"].forEach((s) => {\n delete window[s];\n });\n}\nfunction j(s, e) {\n window.dispatchEvent(new MessageEvent(\"message\", {\n data: JSON.stringify({ eventType: s, eventData: e }),\n // We specify window.parent to imitate the case, the parent iframe sent us this event.\n source: window.parent\n }));\n}\nfunction tt() {\n [\n [\"TelegramGameProxy_receiveEvent\"],\n // Windows Phone.\n [\"TelegramGameProxy\", \"receiveEvent\"],\n // Desktop.\n [\"Telegram\", \"WebView\", \"receiveEvent\"]\n // Android and iOS.\n ].forEach((s) => {\n let e = window;\n s.forEach((t, n, r) => {\n if (n === r.length - 1) {\n e[t] = j;\n return;\n }\n t in e || (e[t] = {}), e = e[t];\n });\n });\n}\nconst st = {\n clipboard_text_received: g({\n req_id: h(),\n data: (s) => s === null ? s : h().optional().parse(s)\n }),\n custom_method_invoked: g({\n req_id: h(),\n result: (s) => s,\n error: h().optional()\n }),\n popup_closed: {\n parse(s) {\n return g({\n button_id: (e) => e == null ? void 0 : h().parse(e)\n }).parse(s ?? {});\n }\n },\n viewport_changed: g({\n height: y(),\n width: (s) => s == null ? window.innerWidth : y().parse(s),\n is_state_stable: b(),\n is_expanded: b()\n })\n};\nfunction nt() {\n const s = new R(), e = new R();\n e.subscribe((n) => {\n s.emit(\"event\", { name: n.event, payload: n.args[0] });\n }), tt();\n const [, t] = J(\n // Don't forget to remove created handlers.\n et,\n // Add \"resize\" event listener to make sure, we always have fresh viewport information.\n // Desktop version of Telegram is sometimes not sending the viewport_changed\n // event. For example, when the MainButton is shown. That's why we should\n // add our own listener to make sure, viewport information is always fresh.\n // Issue: https://github.com/Telegram-Mini-Apps/telegram-apps/issues/10\n G(\"resize\", () => {\n e.emit(\"viewport_changed\", {\n width: window.innerWidth,\n height: window.innerHeight,\n is_state_stable: !0,\n is_expanded: !0\n });\n }),\n // Add listener, which handles events sent from the Telegram web application and also events\n // generated by the local emitEvent function.\n G(\"message\", (n) => {\n if (n.source !== window.parent)\n return;\n let r;\n try {\n r = ue(n.data);\n } catch {\n return;\n }\n const { eventType: i, eventData: o } = r, a = st[i];\n try {\n const p = a ? a.parse(o) : o;\n e.emit(...p ? [i, p] : [i]);\n } catch (p) {\n F.error(\n `An error occurred processing the \"${i}\" event from the Telegram application.\nPlease, file an issue here:\nhttps://github.com/Telegram-Mini-Apps/telegram-apps/issues/new/choose`,\n r,\n p\n );\n }\n }),\n // Clear emitters.\n () => s.clear(),\n () => e.clear()\n );\n return [{\n on: e.on.bind(e),\n off: e.off.bind(e),\n subscribe(n) {\n return s.on(\"event\", n);\n },\n unsubscribe(n) {\n s.off(\"event\", n);\n },\n get count() {\n return e.count + s.count;\n }\n }, t];\n}\nconst [rt, it] = oe(\n (s) => {\n const [e, t] = nt(), n = e.off.bind(e);\n return e.off = (r, i) => {\n const { count: o } = e;\n n(r, i), o && !e.count && s();\n }, [e, t];\n },\n ([, s]) => s()\n);\nfunction M() {\n return rt()[0];\n}\nfunction B(s, e) {\n M().off(s, e);\n}\nfunction w(s, e, t) {\n return M().on(s, e, t);\n}\nfunction k(s) {\n return typeof s == \"object\" && s !== null && !Array.isArray(s);\n}\nfunction ot(s, e) {\n const t = s.split(\".\"), n = e.split(\".\"), r = Math.max(t.length, n.length);\n for (let i = 0; i < r; i += 1) {\n const o = parseInt(t[i] || \"0\", 10), a = parseInt(n[i] || \"0\", 10);\n if (o !== a)\n return o > a ? 1 : -1;\n }\n return 0;\n}\nfunction _(s, e) {\n return ot(s, e) <= 0;\n}\nfunction v(s, e, t) {\n if (typeof t == \"string\") {\n if (s === \"web_app_open_link\") {\n if (e === \"try_instant_view\")\n return _(\"6.4\", t);\n if (e === \"try_browser\")\n return _(\"7.6\", t);\n }\n if (s === \"web_app_set_header_color\" && e === \"color\")\n return _(\"6.9\", t);\n if (s === \"web_app_close\" && e === \"return_back\")\n return _(\"7.6\", t);\n }\n switch (s) {\n case \"web_app_open_tg_link\":\n case \"web_app_open_invoice\":\n case \"web_app_setup_back_button\":\n case \"web_app_set_background_color\":\n case \"web_app_set_header_color\":\n case \"web_app_trigger_haptic_feedback\":\n return _(\"6.1\", e);\n case \"web_app_open_popup\":\n return _(\"6.2\", e);\n case \"web_app_close_scan_qr_popup\":\n case \"web_app_open_scan_qr_popup\":\n case \"web_app_read_text_from_clipboard\":\n return _(\"6.4\", e);\n case \"web_app_switch_inline_query\":\n return _(\"6.7\", e);\n case \"web_app_invoke_custom_method\":\n case \"web_app_request_write_access\":\n case \"web_app_request_phone\":\n return _(\"6.9\", e);\n case \"web_app_setup_settings_button\":\n return _(\"6.10\", e);\n case \"web_app_biometry_get_info\":\n case \"web_app_biometry_open_settings\":\n case \"web_app_biometry_request_access\":\n case \"web_app_biometry_request_auth\":\n case \"web_app_biometry_update_token\":\n return _(\"7.2\", e);\n case \"web_app_setup_swipe_behavior\":\n return _(\"7.7\", e);\n default:\n return [\n \"iframe_ready\",\n \"iframe_will_reload\",\n \"web_app_close\",\n \"web_app_data_send\",\n \"web_app_expand\",\n \"web_app_open_link\",\n \"web_app_ready\",\n \"web_app_request_theme\",\n \"web_app_request_viewport\",\n \"web_app_setup_main_button\",\n \"web_app_setup_closing_behavior\"\n ].includes(s);\n }\n}\nfunction le(s) {\n return \"external\" in s && k(s.external) && \"notify\" in s.external && typeof s.external.notify == \"function\";\n}\nfunction de(s) {\n return \"TelegramWebviewProxy\" in s && k(s.TelegramWebviewProxy) && \"postEvent\" in s.TelegramWebviewProxy && typeof s.TelegramWebviewProxy.postEvent == \"function\";\n}\nfunction _e() {\n try {\n return window.self !== window.top;\n } catch {\n return !0;\n }\n}\nconst at = \"https://web.telegram.org\";\nlet fe = at;\nfunction ts(s) {\n fe = s;\n}\nfunction ct() {\n return fe;\n}\nfunction A(s, e, t) {\n let n = {}, r;\n if (!e && !t ? n = {} : e && t ? (n = t, r = e) : e && (\"targetOrigin\" in e ? n = e : r = e), Ge(\"Posting event:\", r ? { event: s, data: r } : { event: s }), _e())\n return window.parent.postMessage(\n JSON.stringify({ eventType: s, eventData: r }),\n n.targetOrigin || ct()\n );\n if (le(window)) {\n window.external.notify(JSON.stringify({ eventType: s, eventData: r }));\n return;\n }\n if (de(window)) {\n window.TelegramWebviewProxy.postEvent(s, JSON.stringify(r));\n return;\n }\n throw f(\n Fe,\n \"Unable to determine current environment and possible way to send event. You are probably trying to use Mini Apps method outside the Telegram application environment.\"\n );\n}\nfunction pt(s) {\n return (e, t) => {\n if (!v(e, s))\n throw f(je, `Method \"${e}\" is unsupported in Mini Apps version ${s}`);\n if (k(t) && e === \"web_app_set_header_color\" && \"color\" in t && !v(e, \"color\", s))\n throw f(\n ze,\n `Parameter \"color\" of \"${e}\" method is unsupported in Mini Apps version ${s}`\n );\n return A(e, t);\n };\n}\nfunction ge(s) {\n return ({ req_id: e }) => e === s;\n}\nfunction we(s) {\n return f(Qe, `Timeout reached: ${s}ms`);\n}\nfunction be(s, e) {\n return Promise.race([\n typeof s == \"function\" ? s() : s,\n new Promise((t, n) => {\n setTimeout(() => {\n n(we(e));\n }, e);\n })\n ]);\n}\nasync function d(s) {\n let e;\n const t = new Promise((a) => e = a), { event: n, capture: r, timeout: i } = s, [, o] = J(\n // We need to iterate over all tracked events, and create their event listeners.\n (Array.isArray(n) ? n : [n]).map((a) => w(a, (p) => {\n (!r || (Array.isArray(n) ? r({\n event: a,\n payload: p\n }) : r(p))) && e(p);\n }))\n );\n try {\n return (s.postEvent || A)(s.method, s.params), await (i ? be(t, i) : t);\n } finally {\n o();\n }\n}\nasync function C(s, e, t, n = {}) {\n const {\n result: r,\n error: i\n } = await d({\n ...n,\n method: \"web_app_invoke_custom_method\",\n event: \"custom_method_invoked\",\n params: {\n method: s,\n params: e,\n req_id: t\n },\n capture: ge(t)\n });\n if (i)\n throw f(Je, i);\n return r;\n}\nfunction z(...s) {\n return s.map((e) => {\n if (typeof e == \"string\")\n return e;\n if (k(e))\n return z(Object.entries(e).map((t) => t[1] && t[0]));\n if (Array.isArray(e))\n return z(...e);\n }).filter(Boolean).join(\" \");\n}\nfunction ss(...s) {\n return s.reduce((e, t) => (k(t) && Object.entries(t).forEach(([n, r]) => {\n const i = z(e[n], r);\n i.length && (e[n] = i);\n }), e), {});\n}\nfunction Q(s) {\n return /^#[\\da-f]{6}$/i.test(s);\n}\nfunction ht(s) {\n return /^#[\\da-f]{3}$/i.test(s);\n}\nfunction me(s) {\n const e = s.replace(/\\s/g, \"\").toLowerCase();\n if (Q(e))\n return e;\n if (ht(e)) {\n let n = \"#\";\n for (let r = 0; r < 3; r += 1)\n n += e[1 + r].repeat(2);\n return n;\n }\n const t = e.match(/^rgb\\((\\d{1,3}),(\\d{1,3}),(\\d{1,3})\\)$/) || e.match(/^rgba\\((\\d{1,3}),(\\d{1,3}),(\\d{1,3}),\\d{1,3}\\)$/);\n if (!t)\n throw new Error(`Value \"${s}\" does not satisfy any of known RGB formats.`);\n return t.slice(1).reduce((n, r) => {\n const i = parseInt(r, 10).toString(16);\n return n + (i.length === 1 ? \"0\" : \"\") + i;\n }, \"#\");\n}\nfunction ye(s) {\n const e = me(s);\n return Math.sqrt(\n [0.299, 0.587, 0.114].reduce((t, n, r) => {\n const i = parseInt(e.slice(1 + r * 2, 1 + (r + 1) * 2), 16);\n return t + i * i * n;\n }, 0)\n ) < 120;\n}\nclass ut {\n constructor(e) {\n c(this, \"ee\", new R());\n /**\n * Adds new event listener.\n */\n c(this, \"on\", this.ee.on.bind(this.ee));\n /**\n * Removes event listener.\n */\n c(this, \"off\", this.ee.off.bind(this.ee));\n this.state = e;\n }\n /**\n * Clones current state and returns its copy.\n */\n clone() {\n return { ...this.state };\n }\n set(e, t) {\n Object.entries(typeof e == \"string\" ? { [e]: t } : e).reduce((r, [i, o]) => this.state[i] === o || o === void 0 ? r : (this.state[i] = o, this.ee.emit(`change:${i}`, o), !0), !1) && this.ee.emit(\"change\", this.state);\n }\n /**\n * Returns value by specified key.\n * @param key - state key.\n */\n get(e) {\n return this.state[e];\n }\n}\nclass Y {\n constructor(e) {\n c(this, \"state\");\n /**\n * Gets the state value.\n */\n c(this, \"get\");\n /**\n * Sets the state value.\n */\n c(this, \"set\");\n /**\n * Clones the current state.\n */\n c(this, \"clone\");\n this.state = new ut(e), this.set = this.state.set.bind(this.state), this.get = this.state.get.bind(this.state), this.clone = this.state.clone.bind(this.state);\n }\n}\nfunction ve(s, e) {\n return (t) => v(e[t], s);\n}\nclass Z extends Y {\n constructor(t, n, r) {\n super(t);\n /**\n * @returns True, if specified method is supported by the current component.\n */\n c(this, \"supports\");\n this.supports = ve(n, r);\n }\n}\nclass lt extends Z {\n constructor(t, n, r) {\n super({ isVisible: t }, n, {\n show: \"web_app_setup_back_button\",\n hide: \"web_app_setup_back_button\"\n });\n /**\n * Adds a new event listener.\n * @param event - event to listen.\n * @param listener - listener to add.\n */\n c(this, \"on\", (t, n) => t === \"click\" ? w(\"back_button_pressed\", n) : this.state.on(t, n));\n /**\n * Removes the event listener.\n * @param event - event to listen.\n * @param listener - listener to remove.\n */\n c(this, \"off\", (t, n) => t === \"click\" ? B(\"back_button_pressed\", n) : this.state.off(t, n));\n this.postEvent = r;\n }\n set isVisible(t) {\n this.set(\"isVisible\", t), this.postEvent(\"web_app_setup_back_button\", { is_visible: t });\n }\n /**\n * True if BackButton is currently visible.\n */\n get isVisible() {\n return this.get(\"isVisible\");\n }\n /**\n * Hides the BackButton.\n */\n hide() {\n this.isVisible = !1;\n }\n /**\n * Shows the BackButton.\n */\n show() {\n this.isVisible = !0;\n }\n}\nconst Ee = S((s) => s instanceof Date ? s : new Date(y().parse(s) * 1e3), \"Date\");\nfunction K(s, e) {\n return new D((t) => {\n if (typeof t != \"string\" && !(t instanceof URLSearchParams))\n throw E();\n const n = typeof t == \"string\" ? new URLSearchParams(t) : t;\n return pe(s, (r) => {\n const i = n.get(r);\n return i === null ? void 0 : i;\n });\n }, !1, e);\n}\nconst dt = g({\n id: y(),\n type: h(),\n title: h(),\n photoUrl: {\n type: h().optional(),\n from: \"photo_url\"\n },\n username: h().optional()\n}, \"Chat\").optional(), ne = g({\n addedToAttachmentMenu: {\n type: b().optional(),\n from: \"added_to_attachment_menu\"\n },\n allowsWriteToPm: {\n type: b().optional(),\n from: \"allows_write_to_pm\"\n },\n firstName: {\n type: h(),\n from: \"first_name\"\n },\n id: y(),\n isBot: {\n type: b().optional(),\n from: \"is_bot\"\n },\n isPremium: {\n type: b().optional(),\n from: \"is_premium\"\n },\n languageCode: {\n type: h().optional(),\n from: \"language_code\"\n },\n lastName: {\n type: h().optional(),\n from: \"last_name\"\n },\n photoUrl: {\n type: h().optional(),\n from: \"photo_url\"\n },\n username: h().optional()\n}, \"User\").optional();\nfunction Se() {\n return K({\n authDate: {\n type: Ee(),\n from: \"auth_date\"\n },\n canSendAfter: {\n type: y().optional(),\n from: \"can_send_after\"\n },\n chat: dt,\n chatInstance: {\n type: h().optional(),\n from: \"chat_instance\"\n },\n chatType: {\n type: h().optional(),\n from: \"chat_type\"\n },\n hash: h(),\n queryId: {\n type: h().optional(),\n from: \"query_id\"\n },\n receiver: ne,\n startParam: {\n type: h().optional(),\n from: \"start_param\"\n },\n user: ne\n }, \"InitData\");\n}\nconst _t = S((s) => me(h().parse(s)), \"rgb\");\nfunction ft(s) {\n return s.replace(/_[a-z]/g, (e) => e[1].toUpperCase());\n}\nfunction gt(s) {\n return s.replace(/[A-Z]/g, (e) => `_${e.toLowerCase()}`);\n}\nconst Pe = S(\n (s) => {\n const e = _t().optional();\n return Object.entries(he(s)).reduce((t, [n, r]) => (t[ft(n)] = e.parse(r), t), {});\n },\n \"ThemeParams\"\n);\nfunction X(s) {\n return K({\n botInline: {\n type: b().optional(),\n from: \"tgWebAppBotInline\"\n },\n initData: {\n type: Se().optional(),\n from: \"tgWebAppData\"\n },\n initDataRaw: {\n type: h().optional(),\n from: \"tgWebAppData\"\n },\n platform: {\n type: h(),\n from: \"tgWebAppPlatform\"\n },\n showSettings: {\n type: b().optional(),\n from: \"tgWebAppShowSettings\"\n },\n startParam: {\n type: h().optional(),\n from: \"tgWebAppStartParam\"\n },\n themeParams: {\n type: Pe(),\n from: \"tgWebAppThemeParams\"\n },\n version: {\n type: h(),\n from: \"tgWebAppVersion\"\n }\n }).parse(s);\n}\nfunction xe(s) {\n return X(\n s.replace(/^[^?#]*[?#]/, \"\").replace(/[?#]/g, \"&\")\n );\n}\nfunction wt() {\n return xe(window.location.href);\n}\nfunction Ce() {\n return performance.getEntriesByType(\"navigation\")[0];\n}\nfunction bt() {\n const s = Ce();\n if (!s)\n throw new Error(\"Unable to get first navigation entry.\");\n return xe(s.name);\n}\nfunction Te(s) {\n return `telegram-apps/${s.replace(/[A-Z]/g, (e) => `-${e.toLowerCase()}`)}`;\n}\nfunction Re(s, e) {\n sessionStorage.setItem(Te(s), JSON.stringify(e));\n}\nfunction Ae(s) {\n const e = sessionStorage.getItem(Te(s));\n try {\n return e ? JSON.parse(e) : void 0;\n } catch {\n }\n}\nfunction mt() {\n return X(Ae(\"launchParams\") || \"\");\n}\nfunction Ie(s) {\n return JSON.stringify(\n Object.fromEntries(\n Object.entries(s).map(([e, t]) => [gt(e), t])\n )\n );\n}\nfunction yt(s) {\n const {\n initDataRaw: e,\n themeParams: t,\n platform: n,\n version: r,\n showSettings: i,\n startParam: o,\n botInline: a\n } = s, p = new URLSearchParams();\n return p.set(\"tgWebAppPlatform\", n), p.set(\"tgWebAppThemeParams\", Ie(t)), p.set(\"tgWebAppVersion\", r), e && p.set(\"tgWebAppData\", e), o && p.set(\"tgWebAppStartParam\", o), typeof i == \"boolean\" && p.set(\"tgWebAppShowSettings\", i ? \"1\" : \"0\"), typeof a == \"boolean\" && p.set(\"tgWebAppBotInline\", a ? \"1\" : \"0\"), p.toString();\n}\nfunction qe(s) {\n Re(\"launchParams\", yt(s));\n}\nfunction vt() {\n const s = [];\n for (const e of [\n // Try to retrieve launch parameters from the current location. This method can return\n // nothing in case, location was changed, and then the page was reloaded.\n wt,\n // Then, try using the lower level API - window.performance.\n bt,\n // Finally, try to extract launch parameters from the session storage.\n mt\n ])\n try {\n const t = e();\n return qe(t), t;\n } catch (t) {\n s.push(t instanceof Error ? t.message : JSON.stringify(t));\n }\n throw new Error([\n `Unable to retrieve launch parameters from any known source. Perhaps, you have opened your app outside Telegram?\n`,\n \"📖 Refer to docs for more information:\",\n `https://docs.telegram-mini-apps.com/packages/telegram-apps-sdk/environment\n`,\n \"Collected errors:\",\n s.map((e) => `— ${e}`)\n ].join(`\n`));\n}\nfunction ke() {\n const s = Ce();\n return !!(s && s.type === \"reload\");\n}\nfunction Et() {\n let s = 0;\n return () => (s += 1).toString();\n}\nconst [St] = oe(Et);\nfunction l(s, e) {\n return () => {\n const t = vt(), n = {\n ...t,\n postEvent: pt(t.version),\n createRequestId: St()\n };\n if (typeof s == \"function\")\n return s(n);\n const [r, i, o] = J(), a = e({\n ...n,\n // State should only be passed only in case, current page was reloaded. If we don't add\n // this check, state restoration will work improperly in the web version of Telegram,\n // when we are always working in the same \"session\" (tab).\n state: ke() ? Ae(s) : void 0,\n addCleanup: r\n }), p = (u) => (o || r(\n u.on(\"change\", ($e) => {\n Re(s, $e);\n })\n ), u);\n return [\n a instanceof Promise ? a.then(p) : p(a),\n i\n ];\n };\n}\nconst ns = l(\"backButton\", ({\n postEvent: s,\n version: e,\n state: t = { isVisible: !1 }\n}) => new lt(t.isVisible, e, s));\nclass P extends Z {\n constructor() {\n super(...arguments);\n /**\n * Adds a new event listener.\n */\n c(this, \"on\", this.state.on.bind(this.state));\n /**\n * Removes the event listener.\n */\n c(this, \"off\", this.state.off.bind(this.state));\n }\n}\nfunction Ne(s) {\n const e = s.available ? s : {\n available: !1,\n device_id: \"\",\n token_saved: !1,\n access_requested: !1,\n access_granted: !1,\n type: \"\"\n };\n return {\n available: !0,\n type: e.type,\n deviceId: e.device_id,\n tokenSaved: e.token_saved,\n accessRequested: e.access_requested,\n accessGranted: e.access_granted\n };\n}\nclass Pt extends P {\n constructor({ postEvent: t, version: n, ...r }) {\n super(r, n, {\n auth: \"web_app_biometry_request_auth\",\n openSettings: \"web_app_biometry_open_settings\",\n requestAccess: \"web_app_biometry_request_access\",\n updateToken: \"web_app_biometry_update_token\"\n });\n c(this, \"postEvent\");\n c(this, \"authPromise\");\n c(this, \"accessPromise\");\n this.postEvent = t;\n }\n /**\n * Shows whether biometry is available.\n */\n get available() {\n return this.get(\"available\");\n }\n /**\n * Shows whether permission to use biometrics has been granted.\n */\n get accessGranted() {\n return this.get(\"accessGranted\");\n }\n /**\n * Shows whether if permission to use biometrics has been requested.\n */\n get accessRequested() {\n return this.get(\"accessRequested\");\n }\n /**\n * Authenticates the user using biometrics.\n * @param options - method options.\n * @since 7.2\n * @returns Token from the local secure storage, if authentication was successful.\n */\n async authenticate({\n reason: t,\n ...n\n }) {\n return this.authPromise || (this.authPromise = d({\n ...n,\n method: \"web_app_biometry_request_auth\",\n event: \"biometry_auth_requested\",\n postEvent: this.postEvent,\n params: {\n // TODO: Check if reason is empty works fine.\n reason: (t || \"\").trim()\n }\n }).then(({ token: r }) => r).finally(() => this.authPromise = void 0)), this.authPromise;\n }\n /**\n * A unique device identifier that can be used to match the token to the device.\n */\n get deviceId() {\n return this.get(\"deviceId\");\n }\n /**\n * Opens the biometric access settings for bots. Useful when you need to request biometrics\n * access to users who haven't granted it yet.\n *\n * _Note that this method can be called only in response to user interaction with the Mini App\n * interface (e.g. a click inside the Mini App or on the main button)_.\n * @since 7.2\n */\n openSettings() {\n this.postEvent(\"web_app_biometry_open_settings\");\n }\n /**\n * Requests permission to use biometrics.\n * @since 7.2\n * @returns Promise with true, if access was granted.\n */\n requestAccess({ reason: t, ...n } = {}) {\n return this.accessPromise || (this.accessPromise = d({\n ...n,\n postEvent: this.postEvent,\n method: \"web_app_biometry_request_access\",\n event: \"biometry_info_received\",\n params: { reason: t || \"\" }\n }).then((r) => {\n const i = Ne(r);\n return this.set(i), i.accessGranted;\n }).finally(() => this.accessPromise = void 0)), this.accessPromise;\n }\n /**\n * The type of biometrics currently available on the device.\n */\n get biometryType() {\n return this.get(\"biometryType\");\n }\n /**\n * Shows whether token was saved previously in the local secure storage.\n */\n get tokenSaved() {\n return this.get(\"tokenSaved\");\n }\n /**\n * Updates the biometric token in a secure storage on the device.\n * @returns Promise with `true`, if token was updated.\n */\n async updateToken({ token: t, ...n } = {}) {\n return [\"removed\", \"updated\"].includes(\n (await d({\n ...n,\n postEvent: this.postEvent,\n method: \"web_app_biometry_update_token\",\n event: \"biometry_token_updated\",\n params: { token: t || \"\" }\n })).status\n );\n }\n}\nasync function xt(s) {\n return Ne(\n await d({\n ...s || {},\n method: \"web_app_biometry_get_info\",\n event: \"biometry_info_received\"\n })\n );\n}\nconst rs = l(\n \"biometryManager\",\n async ({ postEvent: s, version: e, state: t }) => new Pt({\n ...t || v(\"web_app_biometry_get_info\", e) ? t || await xt({ timeout: 1e3 }) : {\n available: !1,\n accessGranted: !1,\n accessRequested: !1,\n tokenSaved: !1,\n deviceId: \"\"\n },\n version: e,\n postEvent: s\n })\n);\nclass ee extends Y {\n constructor() {\n super(...arguments);\n /**\n * Adds a new event listener.\n */\n c(this, \"on\", this.state.on.bind(this.state));\n /**\n * Removes the event listener.\n */\n c(this, \"off\", this.state.off.bind(this.state));\n }\n}\nclass Ct extends ee {\n constructor(e, t) {\n super({ isConfirmationNeeded: e }), this.postEvent = t;\n }\n set isConfirmationNeeded(e) {\n this.set(\"isConfirmationNeeded\", e), this.postEvent(\"web_app_setup_closing_behavior\", { need_confirmation: e });\n }\n /**\n * True, if the confirmation dialog should be shown while the user is trying to close\n * the Mini App.\n */\n get isConfirmationNeeded() {\n return this.get(\"isConfirmationNeeded\");\n }\n /**\n * Disables the confirmation dialog when closing the Mini App.\n */\n disableConfirmation() {\n this.isConfirmationNeeded = !1;\n }\n /**\n * Enables the confirmation dialog when closing the Mini App.\n */\n enableConfirmation() {\n this.isConfirmationNeeded = !0;\n }\n}\nconst is = l(\n \"closingBehavior\",\n ({\n postEvent: s,\n state: e = { isConfirmationNeeded: !1 }\n }) => new Ct(e.isConfirmationNeeded, s)\n);\nclass te {\n constructor(e, t) {\n /**\n * @returns True, if specified method is supported by the current component.\n */\n c(this, \"supports\");\n this.supports = ve(e, t);\n }\n}\nfunction Tt(s) {\n if (Array.isArray(s))\n return s;\n if (typeof s == \"string\")\n try {\n const e = JSON.parse(s);\n if (Array.isArray(e))\n return e;\n } catch {\n }\n throw E();\n}\nclass Rt extends D {\n constructor(t, n, r) {\n super(Tt, n, r);\n c(this, \"itemParser\");\n this.itemParser = typeof t == \"function\" ? t : t.parse.bind(t);\n }\n /**\n * Attempts to parse passed value\n * @param value - value to parse.\n * @throws {SDKError} ERR_PARSE\n * @see ERR_PARSE\n */\n parse(t) {\n const n = super.parse(t);\n return n === void 0 ? n : n.map(this.itemParser);\n }\n of(t) {\n return this.itemParser = typeof t == \"function\" ? t : t.parse.bind(t), this;\n }\n}\nfunction At(s) {\n return new Rt((e) => e, !1, s);\n}\nfunction re(s, e) {\n return Object.fromEntries(s.map((t) => [t, e]));\n}\nclass It extends te {\n constructor(e, t, n) {\n super(e, {\n delete: \"web_app_invoke_custom_method\",\n get: \"web_app_invoke_custom_method\",\n getKeys: \"web_app_invoke_custom_method\",\n set: \"web_app_invoke_custom_method\"\n }), this.createRequestId = t, this.postEvent = n;\n }\n /**\n * Deletes specified key or keys from the cloud storage.\n * @param keyOrKeys - key or keys to delete.\n * @param options - request execution options.\n */\n async delete(e, t = {}) {\n const n = Array.isArray(e) ? e : [e];\n n.length && await C(\n \"deleteStorageValues\",\n { keys: n },\n this.createRequestId(),\n { ...t, postEvent: this.postEvent }\n );\n }\n /**\n * Returns list of all keys presented in the cloud storage.\n * @param options - request execution options.\n */\n async getKeys(e = {}) {\n return At().of(h()).parse(\n await C(\n \"getStorageKeys\",\n {},\n this.createRequestId(),\n { ...e, postEvent: this.postEvent }\n )\n );\n }\n async get(e, t = {}) {\n const n = Array.isArray(e) ? e : [e];\n if (!n.length)\n return re(n, \"\");\n const r = await C(\n \"getStorageValues\",\n { keys: n },\n this.createRequestId(),\n { ...t, postEvent: this.postEvent }\n ), i = g(re(n, h()), \"CloudStorageData\").parse(r);\n return Array.isArray(e) ? i : i[e];\n }\n /**\n * Saves specified value by key.\n * @param key - storage key.\n * @param value - storage value.\n * @param options - request execution options.\n */\n async set(e, t, n = {}) {\n await C(\n \"saveStorageValue\",\n { key: e, value: t },\n this.createRequestId(),\n { ...n, postEvent: this.postEvent }\n );\n }\n}\nconst os = l(\n ({ createRequestId: s, postEvent: e, version: t }) => new It(t, s, e)\n);\nclass qt extends te {\n constructor(e, t) {\n super(e, {\n impactOccurred: \"web_app_trigger_haptic_feedback\",\n notificationOccurred: \"web_app_trigger_haptic_feedback\",\n selectionChanged: \"web_app_trigger_haptic_feedback\"\n }), this.postEvent = t;\n }\n /**\n * A method tells that an impact occurred. The Telegram app may play the\n * appropriate haptics based on style value passed.\n * @param style - impact style.\n */\n impactOccurred(e) {\n this.postEvent(\"web_app_trigger_haptic_feedback\", {\n type: \"impact\",\n impact_style: e\n });\n }\n /**\n * A method tells that a task or action has succeeded, failed, or produced\n * a warning. The Telegram app may play the appropriate haptics based on\n * type value passed.\n * @param type - notification type.\n */\n notificationOccurred(e) {\n this.postEvent(\"web_app_trigger_haptic_feedback\", {\n type: \"notification\",\n notification_type: e\n });\n }\n /**\n * A method tells that the user has changed a selection. The Telegram app\n * may play the appropriate haptics.\n *\n * Do not use this feedback when the user makes or confirms a selection;\n * use it only when the selection changes.\n */\n selectionChanged() {\n this.postEvent(\"web_app_trigger_haptic_feedback\", { type: \"selection_change\" });\n }\n}\nconst as = l(\n ({ version: s, postEvent: e }) => new qt(s, e)\n);\nclass kt {\n constructor(e) {\n this.initData = e;\n }\n /**\n * @see InitDataParsed.authDate\n */\n get authDate() {\n return this.initData.authDate;\n }\n /**\n * @see InitDataParsed.canSendAfter\n */\n get canSendAfter() {\n return this.initData.canSendAfter;\n }\n /**\n * Date after which it is allowed to call\n * the [answerWebAppQuery](https://core.telegram.org/bots/api#answerwebappquery) method.\n */\n get canSendAfterDate() {\n const { canSendAfter: e } = this;\n return e ? new Date(this.authDate.getTime() + e * 1e3) : void 0;\n }\n /**\n * @see InitDataParsed.chat\n */\n get chat() {\n return this.initData.chat;\n }\n /**\n * @see InitDataParsed.chatType\n */\n get chatType() {\n return this.initData.chatType;\n }\n /**\n * @see InitDataParsed.chatInstance\n */\n get chatInstance() {\n return this.initData.chatInstance;\n }\n /**\n * @see InitDataParsed.hash\n */\n get hash() {\n return this.initData.hash;\n }\n /**\n * @see InitDataParsed.queryId\n */\n get queryId() {\n return this.initData.queryId;\n }\n /**\n * @see InitDataParsed.receiver\n */\n get receiver() {\n return this.initData.receiver;\n }\n /**\n * @see InitDataParsed.startParam\n */\n get startParam() {\n return this.initData.startParam;\n }\n /**\n * @see InitDataParsed.user\n */\n get user() {\n return this.initData.user;\n }\n}\nconst cs = l(\n ({ initData: s }) => s ? new kt(s) : void 0\n);\nfunction ps(s) {\n return Se().parse(s);\n}\nclass Nt extends P {\n constructor(e, t, n) {\n super({ isOpened: e }, t, { open: \"web_app_open_invoice\" }), this.postEvent = n;\n }\n set isOpened(e) {\n this.set(\"isOpened\", e);\n }\n /**\n * True if invoice is currently opened.\n */\n get isOpened() {\n return this.get(\"isOpened\");\n }\n async open(e, t) {\n if (this.isOpened)\n throw new Error(\"Invoice is already opened\");\n let n;\n if (!t)\n n = e;\n else {\n const { hostname: r, pathname: i } = new URL(e, window.location.href);\n if (r !== \"t.me\")\n throw new Error(`Incorrect hostname: ${r}`);\n const o = i.match(/^\\/(\\$|invoice\\/)([A-Za-z0-9\\-_=]+)$/);\n if (!o)\n throw new Error('Link pathname has incorrect format. Expected to receive \"/invoice/{slug}\" or \"/${slug}\"');\n [, , n] = o;\n }\n this.isOpened = !0;\n try {\n return (await d({\n method: \"web_app_open_invoice\",\n event: \"invoice_closed\",\n params: { slug: n },\n postEvent: this.postEvent,\n capture(i) {\n return n === i.slug;\n }\n })).status;\n } finally {\n this.isOpened = !1;\n }\n }\n}\nconst hs = l(\n ({ version: s, postEvent: e }) => new Nt(!1, s, e)\n);\nclass Vt extends Y {\n constructor({ postEvent: t, ...n }) {\n super(n);\n c(this, \"postEvent\");\n /**\n * Adds a new event listener.\n * @param event - event to listen.\n * @param listener - listener to add.\n */\n c(this, \"on\", (t, n) => t === \"click\" ? w(\"main_button_pressed\", n) : this.state.on(t, n));\n /**\n * Removes the event listener.\n * @param event - event to listen.\n * @param listener - listener to remove.\n */\n c(this, \"off\", (t, n) => t === \"click\" ? B(\"main_button_pressed\", n) : this.state.off(t, n));\n this.postEvent = t;\n }\n /**\n * The MainButton background color.\n */\n get bgColor() {\n return this.get(\"bgColor\");\n }\n /**\n * Sends current local state to the Telegram application.\n */\n commit() {\n this.text !== \"\" && this.postEvent(\"web_app_setup_main_button\", {\n is_visible: this.isVisible,\n is_active: this.isEnabled,\n is_progress_visible: this.isLoaderVisible,\n text: this.text,\n color: this.bgColor,\n text_color: this.textColor\n });\n }\n /**\n * Disables the MainButton.\n * @see Does not work on Android: https://github.com/Telegram-Mini-Apps/issues/issues/1\n */\n disable() {\n return this.isEnabled = !1, this;\n }\n /**\n * Enables the MainButton.\n */\n enable() {\n return this.isEnabled = !0, this;\n }\n /**\n * Hides the MainButton.\n */\n hide() {\n return this.isVisible = !1, this;\n }\n /**\n * Hides the MainButton loading indicator.\n */\n hideLoader() {\n return this.isLoaderVisible = !1, this;\n }\n set isEnabled(t) {\n this.setParams({ isEnabled: t });\n }\n /**\n * True if the MainButton is enabled.\n */\n get isEnabled() {\n return this.get(\"isEnabled\");\n }\n set isLoaderVisible(t) {\n this.setParams({ isLoaderVisible: t });\n }\n /**\n * True if the MainButton loader is visible.\n */\n get isLoaderVisible() {\n return this.get(\"isLoaderVisible\");\n }\n set isVisible(t) {\n this.setParams({ isVisible: t });\n }\n /**\n * True if the MainButton is visible.\n */\n get isVisible() {\n return this.get(\"isVisible\");\n }\n /**\n * Shows the MainButton.\n *\n * Note that opening the Mini App from the attachment menu hides the main button until the\n * user interacts with the Mini App interface.\n */\n show() {\n return this.isVisible = !0, this;\n }\n /**\n * Shows a loading indicator on the Main Button.\n */\n showLoader() {\n return this.isLoaderVisible = !0, this;\n }\n /**\n * Sets a new MainButton text. Minimal length for the text is 1 symbol, and maximum is 64 symbols.\n * @param text - a new text.\n */\n setText(t) {\n return this.setParams({ text: t });\n }\n /**\n * Sets a new Main Button text color.\n * @param textColor - new text color.\n */\n setTextColor(t) {\n return this.setParams({ textColor: t });\n }\n /**\n * Updates current Main Button color.\n * @param bgColor - color to set.\n */\n setBgColor(t) {\n return this.setParams({ bgColor: t });\n }\n /**\n * Allows setting multiple Main Button parameters.\n * @param params - Main Button parameters.\n */\n setParams(t) {\n return this.set(t), this.commit(), this;\n }\n /**\n * The MainButton text.\n */\n get text() {\n return this.get(\"text\");\n }\n /**\n * The MainButton text color.\n */\n get textColor() {\n return this.get(\"textColor\");\n }\n}\nconst us = l(\n \"mainButton\",\n ({\n postEvent: s,\n themeParams: e,\n state: t = {\n isVisible: !1,\n isEnabled: !1,\n text: \"\",\n isLoaderVisible: !1,\n textColor: e.buttonTextColor || \"#ffffff\",\n bgColor: e.buttonColor || \"#000000\"\n }\n }) => new Vt({ ...t, postEvent: s })\n);\nfunction Dt() {\n return K({\n contact: g({\n userId: {\n type: y(),\n from: \"user_id\"\n },\n phoneNumber: {\n type: h(),\n from: \"phone_number\"\n },\n firstName: {\n type: h(),\n from: \"first_name\"\n },\n lastName: {\n type: h().optional(),\n from: \"last_name\"\n }\n }),\n authDate: {\n type: Ee(),\n from: \"auth_date\"\n },\n hash: h()\n }, \"RequestedContact\");\n}\nfunction Ve(s, e) {\n return (t) => {\n const [n, r] = e[t];\n return v(n, r, s);\n };\n}\nfunction Mt(s) {\n return new Promise((e) => {\n setTimeout(e, s);\n });\n}\nclass Bt extends P {\n constructor({ postEvent: t, createRequestId: n, version: r, botInline: i, ...o }) {\n super(o, r, {\n requestPhoneAccess: \"web_app_request_phone\",\n requestWriteAccess: \"web_app_request_write_access\",\n switchInlineQuery: \"web_app_switch_inline_query\",\n setHeaderColor: \"web_app_set_header_color\",\n setBackgroundColor: \"web_app_set_background_color\"\n });\n c(this, \"botInline\");\n c(this, \"postEvent\");\n c(this, \"createRequestId\");\n c(this, \"requestPhoneAccessPromise\");\n c(this, \"requestWriteAccessPromise\");\n /**\n * Checks if specified method parameter is supported by current component.\n */\n c(this, \"supportsParam\");\n this.createRequestId = n, this.postEvent = t, this.botInline = i;\n const a = this.supports.bind(this);\n this.supports = (p) => a(p) ? p !== \"switchInlineQuery\" || i : !1, this.supportsParam = Ve(r, {\n \"setHeaderColor.color\": [\"web_app_set_header_color\", \"color\"],\n \"close.returnBack\": [\"web_app_close\", \"return_back\"]\n });\n }\n /**\n * Attempts to get requested contact.\n * @param timeout - request timeout.\n */\n async getRequestedContact({\n timeout: t = 1e4\n } = {}) {\n return Dt().parse(\n await C(\n \"getRequestedContact\",\n {},\n this.createRequestId(),\n { postEvent: this.postEvent, timeout: t }\n )\n );\n }\n /**\n * The Mini App background color.\n * @example \"#ffaabb\"\n */\n get bgColor() {\n return this.get(\"bgColor\");\n }\n /**\n * Closes the Mini App.\n * @param returnBack - should the application be wrapped into the bottom bar.\n */\n close(t) {\n this.postEvent(\"web_app_close\", this.supportsParam(\"close.returnBack\") ? { return_back: t } : {});\n }\n /**\n * The Mini App header color.\n * @example \"#ffaabb\"\n * @example \"bg_color\"\n */\n get headerColor() {\n return this.get(\"headerColor\");\n }\n /**\n * True if the Mini App is currently launched in bot inline mode.\n */\n get isBotInline() {\n return this.botInline;\n }\n /**\n * True if the current Mini App background color is recognized as dark.\n */\n get isDark() {\n return ye(this.bgColor);\n }\n /**\n * Informs the Telegram app that the Mini App is ready to be displayed.\n *\n * It is recommended to call this method as early as possible, as soon as all essential\n * interface elements loaded. Once this method called, the loading placeholder is hidden\n * and the Mini App shown.\n *\n * If the method not called, the placeholder will be hidden only when the page fully loaded.\n */\n ready() {\n this.postEvent(\"web_app_ready\");\n }\n /**\n * Requests current user contact information. In contrary to requestPhoneAccess, this method\n * returns promise with contact information that rejects in case, user denied access, or request\n * failed.\n * @param options - additional options.\n */\n async requestContact({ timeout: t = 5e3 } = {}) {\n try {\n return await this.getRequestedContact();\n } catch {\n }\n if (await this.requestPhoneAccess() !== \"sent\")\n throw new Error(\"Access denied.\");\n const r = Date.now() + t;\n let i = 50;\n return be(async () => {\n for (; Date.now() < r; ) {\n try {\n return await this.getRequestedContact();\n } catch {\n }\n await Mt(i), i += 50;\n }\n throw we(t);\n }, t);\n }\n /**\n * Requests current user phone access. Method returns promise, which resolves\n * status of the request. In case, user accepted the request, Mini App bot will receive\n * the according notification.\n *\n * To obtain the retrieved information instead, utilize the `requestContact` method.\n * @param options - additional options.\n * @see requestContact\n */\n async requestPhoneAccess(t = {}) {\n return this.requestPhoneAccessPromise || (this.requestPhoneAccessPromise = d({\n ...t,\n method: \"web_app_request_phone\",\n event: \"phone_requested\",\n postEvent: this.postEvent\n }).then(({ status: n }) => n).finally(() => this.requestPhoneAccessPromise = void 0)), this.requestPhoneAccessPromise;\n }\n /**\n * Requests write message access to current user.\n * @param options - additional options.\n */\n async requestWriteAccess(t = {}) {\n return this.requestWriteAccessPromise || (this.requestWriteAccessPromise = d({\n ...t,\n method: \"web_app_request_write_access\",\n event: \"write_access_requested\",\n postEvent: this.postEvent\n }).then(({ status: n }) => n).finally(() => this.requestWriteAccessPromise = void 0)), this.requestWriteAccessPromise;\n }\n /**\n * A method used to send data to the bot. When this method called, a service message sent to\n * the bot containing the data of the length up to 4096 bytes, and the Mini App closed. See the\n * field `web_app_data` in the class [Message](https://core.telegram.org/bots/api#message).\n *\n * This method is only available for Mini Apps launched via a Keyboard button.\n * @param data - data to send to bot.\n * @throws {Error} data has incorrect size.\n */\n sendData(t) {\n const { size: n } = new Blob([t]);\n if (!n || n > 4096)\n throw new Error(`Passed data has incorrect size: ${n}`);\n this.postEvent(\"web_app_data_send\", { data: t });\n }\n /**\n * Updates current Mini App header color.\n *\n * @see No effect on desktop: https://github.com/Telegram-Mini-Apps/telegram-apps/issues/9\n * @see Works incorrectly in Android: https://github.com/Telegram-Mini-Apps/telegram-apps/issues/8\n * @param color - color key or RGB color.\n */\n setHeaderColor(t) {\n this.postEvent(\"web_app_set_header_color\", Q(t) ? { color: t } : { color_key: t }), this.set(\"headerColor\", t);\n }\n /**\n * Updates current Mini App background color.\n *\n * @see No effect on desktop: https://github.com/Telegram-Mini-Apps/telegram-apps/issues/9\n * @see Works incorrectly in Android: https://github.com/Telegram-Mini-Apps/telegram-apps/issues/8\n * @param color - RGB color.\n */\n setBgColor(t) {\n this.postEvent(\"web_app_set_background_color\", { color: t }), this.set(\"bgColor\", t);\n }\n /**\n * Inserts the bot's username and the specified inline query in the current chat's input field.\n * Query may be empty, in which case only the bot's username will be inserted. The client prompts\n * the user to choose a specific chat, then opens that chat and inserts the bot's username and\n * the specified inline query in the input field.\n * @param text - text which should be inserted in the input after the current bot name. Max\n * length is 256 symbols.\n * @param chatTypes - List of chat types which could be chosen to send the message. Could be\n * empty list.\n */\n switchInlineQuery(t, n = []) {\n if (!this.supports(\"switchInlineQuery\") && !this.isBotInline)\n throw new Error(\"Method is unsupported because Mini App should be launched in inline mode.\");\n this.postEvent(\"web_app_switch_inline_query\", { query: t, chat_types: n });\n }\n}\nconst ls = l(\n \"miniApp\",\n ({\n themeParams: s,\n botInline: e = !1,\n state: t = {\n bgColor: s.bgColor || \"#ffffff\",\n headerColor: s.headerBgColor || \"#000000\"\n },\n ...n\n }) => new Bt({ ...n, ...t, botInline: e })\n);\nfunction Lt(s) {\n const e = s.message.trim(), t = (s.title || \"\").trim(), n = s.buttons || [];\n let r;\n if (t.length > 64)\n throw new Error(`Title has incorrect size: ${t.length}`);\n if (!e.length || e.length > 256)\n throw new Error(`Message has incorrect size: ${e.length}`);\n if (n.length > 3)\n throw new Error(`Buttons have incorrect size: ${n.length}`);\n return n.length ? r = n.map((i) => {\n const { id: o = \"\" } = i;\n if (o.length > 64)\n throw new Error(`Button ID has incorrect size: ${o}`);\n if (!i.type || i.type === \"default\" || i.type === \"destructive\") {\n const a = i.text.trim();\n if (!a.length || a.length > 64) {\n const p = i.type || \"default\";\n throw new Error(`Button text with type \"${p}\" has incorrect size: ${i.text.length}`);\n }\n return { ...i, text: a, id: o };\n }\n return { ...i, id: o };\n }) : r = [{ type: \"close\", id: \"\" }], { title: t, message: e, buttons: r };\n}\nclass $t extends P {\n constructor(e, t, n) {\n super({ isOpened: e }, t, { open: \"web_app_open_popup\" }), this.postEvent = n;\n }\n set isOpened(e) {\n this.set(\"isOpened\", e);\n }\n /**\n * True if the Popup is opened.\n */\n get isOpened() {\n return this.get(\"isOpened\");\n }\n /**\n * A method that shows a native popup described by the `params` argument.\n * Promise will be resolved when popup is closed. Resolved value will have\n * an identifier of pressed button.\n *\n * In case, user clicked outside the popup or clicked top right popup close\n * button, null will be returned.\n *\n * @param options - popup parameters.\n * @throws {Error} Popup is already opened.\n */\n async open(e) {\n if (this.isOpened)\n throw new Error(\"Popup is already opened.\");\n this.isOpened = !0;\n try {\n const { button_id: t = null } = await d({\n event: \"popup_closed\",\n method: \"web_app_open_popup\",\n postEvent: this.postEvent,\n params: Lt(e)\n });\n return t;\n } finally {\n this.isOpened = !1;\n }\n }\n}\nconst ds = l(\n ({ postEvent: s, version: e }) => new $t(!1, e, s)\n);\nclass Wt extends P {\n constructor(e, t, n) {\n super({ isOpened: e }, t, {\n close: \"web_app_close_scan_qr_popup\",\n open: \"web_app_open_scan_qr_popup\"\n }), this.postEvent = n;\n }\n /**\n * Closes the scanner.\n */\n close() {\n this.postEvent(\"web_app_close_scan_qr_popup\"), this.isOpened = !1;\n }\n set isOpened(e) {\n this.set(\"isOpened\", e);\n }\n /**\n * Returns true if the scanner is currently opened.\n */\n get isOpened() {\n return this.get(\"isOpened\");\n }\n async open(e) {\n if (this.isOpened)\n throw new Error(\"The scanner is already opened\");\n const { text: t, capture: n } = (typeof e == \"string\" ? { text: e } : e) || {};\n this.isOpened = !0;\n try {\n const i = (await d({\n method: \"web_app_open_scan_qr_popup\",\n event: [\"qr_text_received\", \"scan_qr_popup_closed\"],\n postEvent: this.postEvent,\n params: { text: t },\n capture(o) {\n return o.event === \"scan_qr_popup_closed\" || !n || n(o.payload);\n }\n }) || {}).data || null;\n return i && this.close(), i;\n } finally {\n this.isOpened = !1;\n }\n }\n // TODO: Streaming mode, allowing to scan several QRs until closed.\n}\nconst _s = l(\n ({ version: s, postEvent: e }) => new Wt(!1, s, e)\n);\nclass Ut extends Z {\n constructor(t, n, r) {\n super({ isVisible: t }, n, {\n show: \"web_app_setup_settings_button\",\n hide: \"web_app_setup_settings_button\"\n });\n /**\n * Adds a new event listener.\n * @param event - event to listen.\n * @param listener - listener to add.\n */\n c(this, \"on\", (t, n) => t === \"click\" ? w(\"settings_button_pressed\", n) : this.state.on(t, n));\n /**\n * Removes the event listener.\n * @param event - event to listen.\n * @param listener - listener to remove.\n */\n c(this, \"off\", (t, n) => t === \"click\" ? B(\"settings_button_pressed\", n) : this.state.off(t, n));\n this.postEvent = r;\n }\n set isVisible(t) {\n this.set(\"isVisible\", t), this.postEvent(\"web_app_setup_settings_button\", { is_visible: t });\n }\n /**\n * True if the SettingsButton is visible.\n */\n get isVisible() {\n return this.get(\"isVisible\");\n }\n /**\n * Hides the SettingsButton.\n */\n hide() {\n this.isVisible = !1;\n }\n /**\n * Shows the SettingsButton.\n */\n show() {\n this.isVisible = !0;\n }\n}\nconst fs = l(\n \"settingsButton\",\n ({\n version: s,\n postEvent: e,\n state: t = { isVisible: !1 }\n }) => new Ut(t.isVisible, s, e)\n);\nclass Ht extends P {\n constructor(e, t, n) {\n super({ isVerticalSwipeEnabled: e }, t, {\n disableVerticalSwipe: \"web_app_setup_swipe_behavior\",\n enableVerticalSwipe: \"web_app_setup_swipe_behavior\"\n }), this.postEvent = n;\n }\n set isVerticalSwipeEnabled(e) {\n this.set(\"isVerticalSwipeEnabled\", e), this.postEvent(\"web_app_setup_swipe_behavior\", { allow_vertical_swipe: e });\n }\n /**\n * True, if the vertical swipe enabled.\n */\n get isVerticalSwipeEnabled() {\n return this.get(\"isVerticalSwipeEnabled\");\n }\n /**\n * Disables the vertical swipe.\n */\n disableVerticalSwipe() {\n this.isVerticalSwipeEnabled = !1;\n }\n /**\n * Enables the vertical swipe.\n */\n enableVerticalSwipe() {\n this.isVerticalSwipeEnabled = !0;\n }\n}\nconst gs = l(\n \"swipeBehavior\",\n ({\n postEvent: s,\n state: e = { isVerticalSwipeEnabled: !0 },\n version: t\n }) => new Ht(e.isVerticalSwipeEnabled, t, s)\n);\nfunction De(s) {\n return Pe().parse(s);\n}\nclass Ot extends ee {\n /**\n * @since v6.10\n */\n get accentTextColor() {\n return this.get(\"accentTextColor\");\n }\n get bgColor() {\n return this.get(\"bgColor\");\n }\n get buttonColor() {\n return this.get(\"buttonColor\");\n }\n get buttonTextColor() {\n return this.get(\"buttonTextColor\");\n }\n get destructiveTextColor() {\n return this.get(\"destructiveTextColor\");\n }\n /**\n * Returns the copy of the internal state of the current component instance.\n */\n getState() {\n return this.clone();\n }\n /**\n * @since v6.10\n */\n get headerBgColor() {\n return this.get(\"headerBgColor\");\n }\n get hintColor() {\n return this.get(\"hintColor\");\n }\n /**\n * @returns True in case, current color scheme is recognized as dark. This\n * value is calculated according to theme bg color.\n */\n get isDark() {\n return !this.bgColor || ye(this.bgColor);\n }\n get linkColor() {\n return this.get(\"linkColor\");\n }\n get secondaryBgColor() {\n return this.get(\"secondaryBgColor\");\n }\n /**\n * @since v6.10\n */\n get sectionBgColor() {\n return this.get(\"sectionBgColor\");\n }\n /**\n * @since v6.10\n */\n get sectionHeaderTextColor() {\n return this.get(\"sectionHeaderTextColor\");\n }\n /**\n * @since v7.6\n */\n get sectionSeparatorColor() {\n return this.get(\"sectionHeaderTextColor\");\n }\n /**\n * Starts listening to the external theme changes and applies them.\n * @returns Function to stop listening.\n */\n listen() {\n return w(\"theme_changed\", (e) => {\n this.set(De(e.theme_params));\n });\n }\n /**\n * @since v6.10\n */\n get subtitleTextColor() {\n return this.get(\"subtitleTextColor\");\n }\n get textColor() {\n return this.get(\"textColor\");\n }\n}\nconst ws = l(\n \"themeParams\",\n ({ themeParams: s, state: e = s, addCleanup: t }) => {\n const n = new Ot(e);\n return t(n.listen()), n;\n }\n);\nfunction bs(s = {}) {\n return d({\n ...s,\n method: \"web_app_request_theme\",\n event: \"theme_changed\"\n }).then(De);\n}\nfunction I(s, e) {\n return s.startsWith(e) ? s : `${e}${s}`;\n}\nfunction q(s) {\n return new URL(\n typeof s == \"string\" ? s : `${s.pathname || \"\"}${I(s.search || \"\", \"?\")}${I(s.hash || \"\", \"#\")}`,\n \"http://a\"\n );\n}\nclass Gt extends te {\n constructor(t, n, r) {\n super(t, { readTextFromClipboard: \"web_app_read_text_from_clipboard\" });\n /**\n * Checks if specified method parameter is supported by current component.\n */\n c(this, \"supportsParam\");\n this.version = t, this.createRequestId = n, this.postEvent = r, this.supportsParam = Ve(t, {\n \"openLink.tryInstantView\": [\"web_app_open_link\", \"try_instant_view\"]\n });\n }\n openLink(t, n) {\n const r = q(t).toString();\n if (!v(\"web_app_open_link\", this.version)) {\n window.open(r, \"_blank\");\n return;\n }\n const i = typeof n == \"boolean\" ? { tryInstantView: n } : n || {};\n this.postEvent(\"web_app_open_link\", {\n url: r,\n try_browser: i.tryBrowser,\n try_instant_view: i.tryInstantView\n });\n }\n /**\n * Opens a Telegram link inside Telegram app. The Mini App will be closed. It expects passing\n * link in full format, with hostname \"t.me\".\n * @param url - URL to be opened.\n * @throws {Error} URL has not allowed hostname.\n */\n openTelegramLink(t) {\n const { hostname: n, pathname: r, search: i } = new URL(t, \"https://t.me\");\n if (n !== \"t.me\")\n throw new Error(`URL has not allowed hostname: ${n}. Only \"t.me\" is allowed`);\n if (!v(\"web_app_open_tg_link\", this.version)) {\n window.location.href = t;\n return;\n }\n this.postEvent(\"web_app_open_tg_link\", { path_full: r + i });\n }\n /**\n * Reads text from clipboard and returns string or null. null is returned\n * in cases:\n * - Value in clipboard is not text\n * - Access to clipboard is not allowed\n */\n async readTextFromClipboard() {\n const t = this.createRequestId(), {\n data: n = null\n } = await d({\n method: \"web_app_read_text_from_clipboard\",\n event: \"clipboard_text_received\",\n postEvent: this.postEvent,\n params: { req_id: t },\n capture: ge(t)\n });\n return n;\n }\n /**\n * Shares specified URL with the passed to the chats, selected by user. After being called,\n * it closes the mini application.\n *\n * This method uses Telegram's Share Links.\n * @param url - URL to share.\n * @param text - text to append after the URL.\n * @see https://core.telegram.org/api/links#share-links\n * @see https://core.telegram.org/widgets/share#custom-buttons\n */\n shareURL(t, n) {\n this.openTelegramLink(\n \"https://t.me/share/url?\" + new URLSearchParams({ url: t, text: n || \"\" }).toString().replace(/\\+/g, \"%20\")\n );\n }\n}\nconst ms = l(\n ({ version: s, postEvent: e, createRequestId: t }) => new Gt(s, t, e)\n);\nasync function Me(s = {}) {\n const {\n is_expanded: e,\n is_state_stable: t,\n ...n\n } = await d({\n ...s,\n method: \"web_app_request_viewport\",\n event: \"viewport_changed\"\n });\n return { ...n, isExpanded: e, isStateStable: t };\n}\nfunction x(s) {\n return s < 0 ? 0 : s;\n}\nclass jt extends ee {\n constructor({ postEvent: t, stableHeight: n, height: r, width: i, isExpanded: o }) {\n super({\n height: x(r),\n isExpanded: o,\n stableHeight: x(n),\n width: x(i)\n });\n c(this, \"postEvent\");\n this.postEvent = t;\n }\n /**\n * Requests viewport information from the Telegram application and updates current Viewport\n * instance.\n * @param options - options to request fresh data.\n */\n async sync(t) {\n const { isStateStable: n, ...r } = await Me(t);\n this.set({\n ...r,\n stableHeight: n ? r.height : this.get(\"stableHeight\")\n });\n }\n /**\n * The current height of the **visible area** of the Mini App.\n *\n * The application can display just the top part of the Mini App, with its lower part remaining\n * outside the screen area. From this position, the user can \"pull\" the Mini App to its\n * maximum height, while the bot can do the same by calling `expand` method. As the position of\n * the Mini App changes, the current height value of the visible area will be updated in real\n * time.\n *\n * Please note that the refresh rate of this value is not sufficient to smoothly follow the\n * lower border of the window. It should not be used to pin interface elements to the bottom\n * of the visible area. It's more appropriate to use the value of the `stableHeight`\n * field for this purpose.\n *\n * @see stableHeight\n */\n get height() {\n return this.get(\"height\");\n }\n /**\n * The height of the visible area of the Mini App in its last stable state.\n *\n * The application can display just the top part of the Mini App, with its lower part remaining\n * outside the screen area. From this position, the user can \"pull\" the Mini App to its\n * maximum height, while the application can do the same by calling `expand` method.\n *\n * Unlike the value of `height`, the value of `stableHeight` does not change as the position\n * of the Mini App changes with user gestures or during animations. The value of `stableHeight`\n * will be updated after all gestures and animations are completed and\n * the Mini App reaches its final size.\n *\n * @see height\n */\n get stableHeight() {\n return this.get(\"stableHeight\");\n }\n /**\n * Starts listening to viewport changes and applies them.\n * @returns Function to stop listening.\n */\n listen() {\n return w(\"viewport_changed\", (t) => {\n const {\n height: n,\n width: r,\n is_expanded: i,\n is_state_stable: o\n } = t, a = x(n);\n this.set({\n height: a,\n isExpanded: i,\n width: x(r),\n ...o ? { stableHeight: a } : {}\n });\n });\n }\n /**\n * True if the Mini App is expanded to the maximum available height. Otherwise, if\n * the Mini App occupies part of the screen and can be expanded to the full height using\n * `expand` method.\n * @see expand\n */\n get isExpanded() {\n return this.get(\"isExpanded\");\n }\n /**\n * Current visible area width.\n */\n get width() {\n return this.get(\"width\");\n }\n /**\n * A method that expands the Mini App to the maximum available height. To find out if the Mini\n * App is expanded to the maximum height, refer to the value of the `isExpanded`.\n * @see isExpanded\n */\n expand() {\n this.postEvent(\"web_app_expand\"), this.set(\"isExpanded\", !0);\n }\n /**\n * True if the current viewport height is stable and is not going to change in the next moment.\n */\n get isStable() {\n return this.stableHeight === this.height;\n }\n}\nconst ys = l(\n \"viewport\",\n async ({ state: s, platform: e, postEvent: t, addCleanup: n }) => {\n let r = !1, i = 0, o = 0, a = 0;\n if (s)\n r = s.isExpanded, i = s.height, o = s.width, a = s.stableHeight;\n else if ([\"macos\", \"tdesktop\", \"unigram\", \"webk\", \"weba\", \"web\"].includes(e))\n r = !0, i = window.innerHeight, o = window.innerWidth, a = window.innerHeight;\n else {\n const u = await Me({ timeout: 1e3, postEvent: t });\n r = u.isExpanded, i = u.height, o = u.width, a = u.isStateStable ? i : 0;\n }\n const p = new jt({\n postEvent: t,\n height: i,\n width: o,\n stableHeight: a,\n isExpanded: r\n });\n return n(p.listen()), p;\n }\n);\nfunction m(s, e) {\n document.documentElement.style.setProperty(s, e);\n}\nfunction vs(s, e, t) {\n t || (t = (a) => `--tg-${a}-color`);\n const n = t(\"header\"), r = t(\"bg\"), i = () => {\n const { headerColor: a } = s;\n if (Q(a))\n m(n, a);\n else {\n const { bgColor: p, secondaryBgColor: u } = e;\n a === \"bg_color\" && p ? m(n, p) : a === \"secondary_bg_color\" && u && m(n, u);\n }\n m(r, s.bgColor);\n }, o = [\n e.on(\"change\", i),\n s.on(\"change\", i)\n ];\n return i(), () => o.forEach((a) => a());\n}\nfunction Es(s, e) {\n e || (e = (n) => `--tg-theme-${n.replace(/[A-Z]/g, (r) => `-${r.toLowerCase()}`)}`);\n const t = () => {\n Object.entries(s.getState()).forEach(([n, r]) => {\n r && m(e(n), r);\n });\n };\n return t(), s.on(\"change\", t);\n}\nfunction Ss(s, e) {\n e || (e = (u) => `--tg-viewport-${u}`);\n const [\n t,\n n,\n r\n ] = [\"height\", \"width\", \"stable-height\"].map((u) => e(u)), i = () => m(t, `${s.height}px`), o = () => m(n, `${s.width}px`), a = () => m(r, `${s.stableHeight}px`), p = [\n s.on(\"change:height\", i),\n s.on(\"change:width\", o),\n s.on(\"change:stableHeight\", a)\n ];\n return i(), o(), a(), () => p.forEach((u) => u());\n}\nfunction Ps(s = !0) {\n const e = [\n w(\"reload_iframe\", () => {\n A(\"iframe_will_reload\"), window.location.reload();\n })\n ], t = () => e.forEach((n) => n());\n if (s) {\n const n = document.createElement(\"style\");\n n.id = \"telegram-custom-styles\", document.head.appendChild(n), e.push(\n w(\"set_custom_style\", (r) => {\n n.innerHTML = r;\n }),\n () => document.head.removeChild(n)\n );\n }\n return A(\"iframe_ready\", { reload_supported: !0 }), t;\n}\nfunction xs() {\n return typeof window > \"u\";\n}\nasync function Cs() {\n if (de(window))\n return !0;\n try {\n return await d({ method: \"web_app_request_theme\", event: \"theme_changed\", timeout: 100 }), !0;\n } catch {\n return !1;\n }\n}\nfunction Ts(s) {\n const e = typeof s == \"string\" ? X(s) : s;\n qe(e);\n function t(r) {\n if (typeof r == \"string\")\n try {\n const { eventType: i } = ue(r);\n i === \"web_app_request_theme\" && j(\"theme_changed\", {\n theme_params: JSON.parse(Ie(e.themeParams))\n }), i === \"web_app_request_viewport\" && j(\"viewport_changed\", {\n width: window.innerWidth,\n height: window.innerHeight,\n is_state_stable: !0,\n is_expanded: !0\n });\n } catch {\n }\n }\n if (_e()) {\n const r = window.parent.postMessage.bind(window.parent);\n window.parent.postMessage = (i) => {\n t(i), r(i);\n };\n return;\n }\n if (le(window)) {\n const r = window.external.notify.bind(window.external);\n window.external.notify = (i) => {\n t(i), r(i);\n };\n return;\n }\n const n = window.TelegramWebviewProxy;\n window.TelegramWebviewProxy = {\n ...n || {},\n postEvent(...r) {\n t(JSON.stringify({ eventType: r[0], eventData: r[1] })), n && n.postEvent(...r);\n }\n };\n}\nfunction zt(s) {\n return s instanceof V;\n}\nfunction Rs(s, e) {\n return zt(s) && s.type === e;\n}\nfunction L(s, e) {\n let t, n, r;\n return typeof s == \"string\" ? t = s : (t = s.pathname === void 0 ? e : s.pathname, n = s.params, r = s.id), Object.freeze({\n id: r || (Math.random() * 2 ** 14 | 0).toString(16),\n pathname: t,\n params: n\n });\n}\nclass Ft {\n constructor(e, t, n = A) {\n /**\n * Navigation history.\n */\n c(this, \"history\");\n c(this, \"ee\", new R());\n /**\n * True, if current navigator is currently attached.\n */\n c(this, \"attached\", !1);\n /**\n * Goes to the previous history item.\n */\n c(this, \"back\", () => this.go(-1));\n /**\n * Adds new event listener.\n */\n c(this, \"on\", this.ee.on.bind(this.ee));\n /**\n * Removes event listener.\n */\n c(this, \"off\", this.ee.off.bind(this.ee));\n if (this._index = t, this.postEvent = n, e.length === 0)\n throw f(Ze, \"History should not be empty.\");\n if (t < 0 || t >= e.length)\n throw f(\n Ke,\n \"Index should not be zero and higher or equal than history size.\"\n );\n this.history = e.map((r) => L(r, \"\"));\n }\n /**\n * Allows this navigator to control the `BackButton` visibility state. It also tracks the\n * `BackButton` clicks and calls the `back` method.\n */\n attach() {\n this.attached || (this.attached = !0, this.sync(), w(\"back_button_pressed\", this.back));\n }\n /**\n * Currently active history item.\n */\n get current() {\n return this.history[this.index];\n }\n /**\n * Prevents current navigator from controlling the BackButton visibility state.\n */\n detach() {\n this.attached = !1, B(\"back_button_pressed\", this.back);\n }\n /**\n * Goes to the next history item.\n */\n forward() {\n this.go(1);\n }\n /**\n * Changes currently active history item index by the specified delta. This method doesn't\n * change index in case, the updated index points to the non-existing history item. This behavior\n * is preserved until the `fit` argument is specified.\n * @param delta - index delta.\n * @param fit - cuts the delta argument to fit the bounds `[0, history.length - 1]`.\n */\n go(e, t) {\n const n = this.index + e, r = Math.min(\n Math.max(0, n),\n this.history.length - 1\n );\n (n === r || t) && this.replaceAndMove(r, this.history[r]);\n }\n /**\n * Goes to the specified index. Method does nothing in case, passed index is out of bounds.\n *\n * If \"fit\" option was specified and index is out of bounds, it will be cut to the nearest\n * bound.\n * @param index - target index.\n * @param fit - cuts the index argument to fit the bounds `[0, history.length - 1]`.\n */\n goTo(e, t) {\n this.go(e - this.index, t);\n }\n /**\n * True if navigator has items before the current item.\n */\n get hasPrev() {\n return this.index > 0;\n }\n /**\n * True if navigator has items after the current item.\n */\n get hasNext() {\n return this.index !== this.history.length - 1;\n }\n /**\n * Currently active history item index.\n */\n get index() {\n return this._index;\n }\n /**\n * Adds a new history item removing all after the current one.\n * @param item - item to add.\n */\n push(e) {\n this.hasNext && this.history.splice(this.index + 1), this.replaceAndMove(this.index + 1, L(e, this.current.pathname));\n }\n /**\n * Replaces the current history item.\n * @param item - item to replace the current item with.\n */\n replace(e) {\n this.replaceAndMove(this.index, L(e, this.current.pathname));\n }\n /**\n * Sets history item by the specified index.\n * @param index - history item index to replace.\n * @param historyItem - history item to set.\n */\n replaceAndMove(e, t) {\n const n = e - this.index;\n if (!n && this.current === t)\n return;\n const r = this.current;\n if (this.index !== e) {\n const i = this._index;\n this._index = e, this.attached && i > 0 != e > 0 && this.sync();\n }\n this.history[e] = t, this.ee.emit(\"change\", {\n navigator: this,\n from: r,\n to: this.current,\n delta: n\n });\n }\n /**\n * Actualizes the `BackButton` visibility state.\n */\n sync() {\n this.postEvent(\"web_app_setup_back_button\", { is_visible: !!this.index });\n }\n}\nfunction $({\n params: s,\n ...e\n}) {\n return { ...s || { hash: \"\", search: \"\" }, ...e };\n}\nfunction N(s) {\n const e = typeof s == \"string\" ? s.startsWith(\"/\") : !!(s.pathname && s.pathname.startsWith(\"/\")), t = q(s);\n return `${e ? t.pathname : t.pathname.slice(1)}${t.search}${t.hash}`;\n}\nfunction W(s, e, t) {\n let n, r;\n typeof s == \"string\" ? n = s : (n = N(s), t = s.state, r = s.id);\n const { pathname: i, search: o, hash: a } = new URL(n, `http://a${I(e, \"/\")}`);\n return { id: r, pathname: i, params: { hash: a, search: o, state: t } };\n}\nasync function T(s) {\n return s === 0 ? !0 : Promise.race([\n new Promise((e) => {\n const t = G(\"popstate\", () => {\n t(), e(!0);\n });\n window.history.go(s);\n }),\n // Usually, it takes about 1ms to emit this event, but we use some buffer.\n new Promise((e) => {\n setTimeout(e, 50, !1);\n })\n ]);\n}\nasync function Jt() {\n if (window.history.length <= 1 || (window.history.pushState(null, \"\"), await T(1 - window.history.length)))\n return;\n let e = await T(-1);\n for (; e; )\n e = await T(-1);\n}\nfunction Be(s) {\n return q(s).pathname;\n}\nconst ie = 0, U = 1, H = 2;\nclass Le {\n constructor(e, t, { postEvent: n, hashMode: r = \"classic\", base: i } = {}) {\n c(this, \"navigator\");\n c(this, \"ee\", new R());\n c(this, \"hashMode\");\n c(this, \"base\");\n /**\n * Shows whether the navigator is currently attached to the browser history.\n */\n c(this, \"attached\", !1);\n /**\n * Handles the window \"popstate\" event.\n * @param state - event state.\n */\n c(this, \"onPopState\", ({ state: e }) => {\n if (e === null)\n return this.push(this.parsePath(window.location.href));\n e === ie ? window.history.forward() : e === U && this.back(), e === H && this.forward();\n });\n /**\n * Underlying navigator change event listener.\n */\n c(this, \"onNavigatorChange\", async ({\n to: e,\n from: t,\n delta: n\n }) => {\n this.attached && await this.syncHistory(), this.ee.emit(\"change\", {\n delta: n,\n from: $(t),\n to: $(e),\n navigator: this\n });\n });\n /**\n * Adds new event listener.\n */\n c(this, \"on\", this.ee.on.bind(this.ee));\n /**\n * Removes event listener.\n */\n c(this, \"off\", this.ee.off.bind(this.ee));\n this.navigator = new Ft(\n e.map((o) => W(o, \"/\")),\n t,\n n\n ), this.navigator.on(\"change\", (o) => {\n this.onNavigatorChange(o);\n }), this.hashMode = r, this.base = Be(i || \"\");\n }\n /**\n * Attaches current navigator to the browser history allowing navigator to manipulate it.\n */\n async attach() {\n this.attached || (this.attached = !0, this.navigator.attach(), window.addEventListener(\"popstate\", this.onPopState), await this.syncHistory());\n }\n /**\n * Goes back in history by 1.\n */\n back() {\n this.navigator.back();\n }\n /**\n * Detaches current navigator from the browser history.\n */\n detach() {\n this.attached = !1, this.navigator.detach(), window.removeEventListener(\"popstate\", this.onPopState);\n }\n /**\n * Goes forward in history.\n */\n forward() {\n return this.navigator.forward();\n }\n /**\n * Current history cursor.\n */\n get index() {\n return this.navigator.index;\n }\n /**\n * Current history item identifier.\n */\n get id() {\n return this.navigator.current.id;\n }\n /**\n * Changes currently active history item index by the specified delta. This method doesn't\n * change index in case, the updated index points to the non-existing history item. This behavior\n * is preserved until the `fit` argument is specified.\n * @param delta - index delta.\n * @param fit - cuts the delta argument to fit the bounds `[0, history.length - 1]`.\n */\n go(e, t) {\n return this.navigator.go(e, t);\n }\n /**\n * Goes to the specified index. Method does nothing in case, passed index is out of bounds.\n *\n * If \"fit\" option was specified and index is out of bounds, it will be cut to the nearest\n * bound.\n * @param index - target index.\n * @param fit - cuts the index argument to fit the bounds `[0, history.length - 1]`.\n */\n goTo(e, t) {\n this.navigator.goTo(e, t);\n }\n /**\n * Current history item hash.\n * @see URL.hash\n * @example\n * \"\", \"#my-hash\"\n */\n get hash() {\n return (this.navigator.current.params || {}).hash || \"\";\n }\n /**\n * True if navigator has items before the current item.\n */\n get hasPrev() {\n return this.navigator.hasPrev;\n }\n /**\n * True if navigator has items after the current item.\n */\n get hasNext() {\n return this.navigator.hasNext;\n }\n /**\n * Navigation history.\n */\n get history() {\n return this.navigator.history.map($);\n }\n /**\n * Path, including pathname, search and hash.\n * @example Pathname only.\n * \"/pathname\"\n * @example Pathname + search.\n * \"/pathname?search\"\n * @example Pathname + hash.\n * \"/pathname#hash\"\n * @example Pathname + search + hash.\n * \"/pathname?search#hash\"\n */\n get path() {\n return N(this);\n }\n /**\n * Current pathname. Always starts with the slash.\n * @see URL.pathname\n * @example\n * \"/\", \"/abc\"\n */\n get pathname() {\n return this.navigator.current.pathname;\n }\n /**\n * Depending on the current navigation type, parses incoming path and returns it presented as\n * an object. In other words, this method parses the passed path and returns object, describing\n * how the navigator \"sees\" it.\n *\n * @example Hash mode is omitted.\n * parsePath('/abc?a=1#hash');\n * // { pathname: '/abc', search: '?a=1', hash: '#hash' }\n * parsePath('http://example.com/abc?a=1#hash');\n * // { pathname: '/abc', search: '?a=1', hash: '#hash' }\n *\n * @example Hash mode is enabled.\n * parsePath('/abc?a=1#tma?is=cool#yeah');\n * // { pathname: '/tma', search: '?is=cool', hash: '#yeah' }\n * parsePath('http://example.com/abc?a=1#tma?is=cool#yeah');\n * // { pathname: '/tma', search: '?is=cool', hash: '#yeah' }\n */\n parsePath(e) {\n let t = q(e);\n return this.hashMode && (t = q(t.hash.slice(1))), {\n pathname: t.pathname,\n search: t.search,\n hash: t.hash\n };\n }\n push(e, t) {\n const n = W(e, this.path), { state: r = t } = n.params;\n this.navigator.push({ ...n, params: { ...n.params, state: r } });\n }\n replace(e, t) {\n const n = W(e, this.path), { state: r = t } = n.params;\n this.navigator.replace({ ...n, params: { ...n.params, state: r } });\n }\n /**\n * Combines the navigator `base` property with the passed path data applying the navigator\n * navigation mode.\n * @param value - path presented as string or URLLike.\n */\n renderPath(e) {\n const t = (this.base.length === 1 ? \"\" : this.base) + I(N(e), \"/\");\n return this.hashMode ? I(t.slice(1), this.hashMode === \"classic\" ? \"#\" : \"#/\") : t;\n }\n /**\n * Synchronizes current navigator state with browser history.\n */\n async syncHistory() {\n window.removeEventListener(\"popstate\", this.onPopState);\n const { state: e } = this, t = this.renderPath(this);\n await Jt(), this.hasPrev && this.hasNext ? (window.history.replaceState(U, \"\"), window.history.pushState(e, \"\", t), window.history.pushState(H, \"\"), await T(-1)) : this.hasPrev ? (window.history.replaceState(U, \"\"), window.history.pushState(e, \"\", t)) : this.hasNext ? (window.history.replaceState(e, t), window.history.pushState(H, \"\"), await T(-1)) : (window.history.replaceState(ie, \"\"), window.history.pushState(e, \"\", t)), window.addEventListener(\"popstate\", this.onPopState);\n }\n /**\n * Current query parameters.\n * @see URL.search\n * @example\n * \"\", \"?\", \"?a=1\"\n */\n get search() {\n return (this.navigator.current.params || {}).search || \"\";\n }\n /**\n * Current history item state.\n */\n get state() {\n return (this.navigator.current.params || {}).state;\n }\n}\nfunction Qt(s) {\n s || (s = {});\n const { href: e, hash: t } = window.location;\n let n = N(\n s.hashMode === null ? e : t.includes(\"?\") ? t.slice(1) : `?${t.slice(1)}`\n );\n const r = s.base ? Be(s.base) : void 0;\n if (r) {\n if (!n.startsWith(r))\n throw f(\n Xe,\n `Path \"${n}\" expected to be starting with \"${r}\"`\n );\n n = n.slice(r.length);\n }\n return new Le([n], 0, s);\n}\nfunction As(s) {\n const e = s.match(/#(.+)/);\n return e ? e[1] : null;\n}\nfunction Yt(s, e) {\n if (ke()) {\n const t = sessionStorage.getItem(s);\n if (t)\n try {\n const { index: n, history: r } = JSON.parse(t);\n return new Le(\n r,\n n,\n e\n );\n } catch (n) {\n console.error(\"Unable to restore hash navigator state.\", n);\n }\n }\n return Qt(e);\n}\nfunction Is(s, e) {\n const t = Yt(s, e), n = () => sessionStorage.setItem(s, JSON.stringify({\n index: t.index,\n history: t.history\n }));\n return t.on(\"change\", n), n(), t;\n}\nexport {\n lt as BackButton,\n Ft as BasicNavigator,\n Pt as BiometryManager,\n Le as BrowserNavigator,\n Ct as ClosingBehavior,\n It as CloudStorage,\n Xe as ERR_INVALID_PATH_BASE,\n Je as ERR_INVOKE_CUSTOM_METHOD_RESPONSE,\n ze as ERR_METHOD_PARAMETER_UNSUPPORTED,\n je as ERR_METHOD_UNSUPPORTED,\n Ze as ERR_NAVIGATION_HISTORY_EMPTY,\n Ke as ERR_NAVIGATION_INDEX_INVALID,\n Xt as ERR_NAVIGATION_ITEM_INVALID,\n ce as ERR_PARSE,\n es as ERR_SSR_INIT,\n Qe as ERR_TIMED_OUT,\n Ye as ERR_UNEXPECTED_TYPE,\n Fe as ERR_UNKNOWN_ENV,\n R as EventEmitter,\n qt as HapticFeedback,\n kt as InitData,\n Nt as Invoice,\n Vt as MainButton,\n Bt as MiniApp,\n $t as Popup,\n Wt as QRScanner,\n V as SDKError,\n Ut as SettingsButton,\n Ht as SwipeBehavior,\n Ot as ThemeParams,\n Gt as Utils,\n jt as Viewport,\n At as array,\n vs as bindMiniAppCSSVars,\n Es as bindThemeParamsCSSVars,\n Ss as bindViewportCSSVars,\n b as boolean,\n ge as captureSameReq,\n z as classNames,\n ot as compareVersions,\n Qt as createBrowserNavigatorFromLocation,\n pt as createPostEvent,\n q as createSafeURL,\n Ee as date,\n As as getHash,\n Be as getPathname,\n ns as initBackButton,\n rs as initBiometryManager,\n is as initClosingBehavior,\n os as initCloudStorage,\n as as initHapticFeedback,\n cs as initInitData,\n hs as initInvoice,\n us as initMainButton,\n ls as initMiniApp,\n Is as initNavigator,\n ds as initPopup,\n _s as initQRScanner,\n fs as initSettingsButton,\n gs as initSwipeBehavior,\n ws as initThemeParams,\n ms as initUtils,\n ys as initViewport,\n Ps as initWeb,\n C as invokeCustomMethod,\n ye as isColorDark,\n _e as isIframe,\n ke as isPageReload,\n Q as isRGB,\n ht as isRGBShort,\n zt as isSDKError,\n Rs as isSDKErrorOfType,\n xs as isSSR,\n Cs as isTMA,\n g as json,\n ss as mergeClassNames,\n Ts as mockTelegramEnv,\n y as number,\n B as off,\n w as on,\n ps as parseInitData,\n X as parseLaunchParams,\n De as parseThemeParams,\n A as postEvent,\n d as request,\n xt as requestBiometryInfo,\n bs as requestThemeParams,\n Me as requestViewport,\n vt as retrieveLaunchParams,\n _t as rgb,\n K as searchParams,\n yt as serializeLaunchParams,\n Ie as serializeThemeParams,\n m as setCSSVar,\n Kt as setDebug,\n ts as setTargetOrigin,\n h as string,\n He as subscribe,\n v as supports,\n ct as targetOrigin,\n me as toRGB,\n ae as unsubscribe,\n N as urlToPath,\n be as withTimeout\n};\n//# sourceMappingURL=index.js.map\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/* @refresh reload */\n\nimport App from './config/app';\nimport blurActiveElement from './helpers/dom/blurActiveElement';\nimport cancelEvent from './helpers/dom/cancelEvent';\nimport {IS_STICKY_INPUT_BUGGED} from './helpers/dom/fixSafariStickyInputFocusing';\nimport loadFonts from './helpers/dom/loadFonts';\nimport IS_EMOJI_SUPPORTED from './environment/emojiSupport';\nimport {IS_ANDROID, IS_APPLE, IS_APPLE_MOBILE, IS_FIREFOX, IS_MOBILE, IS_MOBILE_SAFARI, IS_SAFARI} from './environment/userAgent';\nimport './materialize.scss';\nimport './scss/style.scss';\nimport pause from './helpers/schedulers/pause';\nimport setWorkerProxy from './helpers/setWorkerProxy';\nimport toggleAttributePolyfill from './helpers/dom/toggleAttributePolyfill';\nimport rootScope from './lib/rootScope';\nimport IS_TOUCH_SUPPORTED from './environment/touchSupport';\nimport I18n from './lib/langPack';\nimport './helpers/peerIdPolyfill';\nimport './lib/polyfill';\nimport apiManagerProxy from './lib/mtproto/mtprotoworker';\nimport getProxiedManagers from './lib/appManagers/getProxiedManagers';\nimport themeController from './helpers/themeController';\nimport overlayCounter from './helpers/overlayCounter';\nimport singleInstance from './lib/mtproto/singleInstance';\nimport {parseUriParamsLine} from './helpers/string/parseUriParams';\nimport Modes from './config/modes';\nimport {AuthState} from './types';\nimport {IS_BETA} from './config/debug';\nimport IS_INSTALL_PROMPT_SUPPORTED from './environment/installPrompt';\nimport cacheInstallPrompt from './helpers/dom/installPrompt';\nimport {fillLocalizedDates} from './helpers/date';\nimport {nextRandomUint} from './helpers/random';\nimport {IS_OVERLAY_SCROLL_SUPPORTED, USE_CUSTOM_SCROLL, USE_NATIVE_SCROLL} from './environment/overlayScrollSupport';\nimport IMAGE_MIME_TYPES_SUPPORTED, {IMAGE_MIME_TYPES_SUPPORTED_PROMISE} from './environment/imageMimeTypesSupport';\nimport MEDIA_MIME_TYPES_SUPPORTED from './environment/mediaMimeTypesSupport';\nimport { retrieveLaunchParams } from '@telegram-apps/sdk';\nconst { initDataRaw, initData } = retrieveLaunchParams(); // tg miniapp\n\nIMAGE_MIME_TYPES_SUPPORTED_PROMISE.then((mimeTypes) => {\n mimeTypes.forEach((mimeType) => {\n IMAGE_MIME_TYPES_SUPPORTED.add(mimeType);\n MEDIA_MIME_TYPES_SUPPORTED.add(mimeType);\n });\n\n console.log('Supported image mime types', IMAGE_MIME_TYPES_SUPPORTED);\n apiManagerProxy.sendEnvironment();\n});\n\n/* false && */document.addEventListener('DOMContentLoaded', async() => {\n // * Randomly choose a version if user came from google\n try {\n if(\n App.isMainDomain &&\n document.referrer &&\n /(^|\\.)(google|bing|duckduckgo|ya|yandex)\\./i.test(new URL(document.referrer).host)\n ) {\n const version = localStorage.getItem('kz_version');\n if(version === 'Z' || nextRandomUint(8) > 127) {\n localStorage.setItem('kz_version', 'Z');\n location.href = 'https://web.telegram.org/a/';\n } else {\n localStorage.setItem('kz_version', 'K');\n }\n }\n } catch(err) {}\n\n toggleAttributePolyfill();\n\n // polyfill for replaceChildren\n if((Node as any).prototype.replaceChildren === undefined) {\n (Node as any).prototype.replaceChildren = function(...nodes: any[]) {\n this.textContent = '';\n // while(this.lastChild) {\n // this.removeChild(this.lastChild);\n // }\n if(nodes) {\n this.append(...nodes);\n }\n }\n }\n\n rootScope.managers = getProxiedManagers();\n\n const manifest = document.getElementById('manifest') as HTMLLinkElement;\n if(manifest) manifest.href = `site${IS_APPLE && !IS_APPLE_MOBILE ? '_apple' : ''}.webmanifest?v=jw3mK7G9Aq`;\n\n singleInstance.start();\n\n // We listen to the resize event (https://css-tricks.com/the-trick-to-viewport-units-on-mobile/)\n const w = window.visualViewport || window; // * handle iOS keyboard\n let setViewportVH = false/* , hasFocus = false */;\n let lastVH: number;\n const setVH = () => {\n let vh = (setViewportVH && !overlayCounter.isOverlayActive ? (w as VisualViewport).height || (w as Window).innerHeight : window.innerHeight) * 0.01;\n vh = +vh.toFixed(2);\n if(lastVH === vh) {\n return;\n } else if(IS_TOUCH_SUPPORTED && lastVH < vh && (vh - lastVH) > 1) {\n blurActiveElement(); // (Android) fix blurring inputs when keyboard is being closed (e.g. closing keyboard by back arrow and touching a bubble)\n }\n\n lastVH = vh;\n\n // const vh = document.documentElement.scrollHeight * 0.01;\n document.documentElement.style.setProperty('--vh', `${vh}px`);\n\n // console.log('setVH', vh, setViewportVH ? w : window);\n\n /* if(setViewportVH && userAgent.isSafari && touchSupport.isTouchSupported && document.activeElement && (document.activeElement as HTMLElement).blur) {\n const rect = document.activeElement.getBoundingClientRect();\n if(rect.top < 0 || rect.bottom >= (w as any).height) {\n fastSmoothScroll(findUpClassName(document.activeElement, 'scrollable-y') || window as any, document.activeElement as HTMLElement, 'center', 4, undefined, FocusDirection.Static);\n }\n } */\n };\n\n setWorkerProxy;\n\n // const [_, touchSupport, userAgent, _rootScope, _appStateManager, _I18n, __/* , ___ */] = await Promise.all([\n // import('./lib/polyfill'),\n // import('./environment/touchSupport'),\n // import('./environment/userAgent'),\n // import('./lib/rootScope'),\n // import('./lib/appManagers/appStateManager'),\n // import('./lib/langPack'),\n // import('./helpers/peerIdPolyfill'),\n // // import('./helpers/cacheFunctionPolyfill')\n // ]);\n\n /* const {IS_TOUCH_SUPPORTED} = touchSupport;\n const {IS_FIREFOX, IS_MOBILE, IS_APPLE, IS_SAFARI, IS_APPLE_MOBILE, IS_ANDROID} = userAgent;\n const rootScope = _rootScope.default;\n const appStateManager = _appStateManager.default;\n const I18n = _I18n.default; */\n\n window.addEventListener('resize', setVH);\n setVH();\n\n const preparePrint = () => {\n const chat = document.querySelector('.chat.active');\n if(!chat) {\n return;\n }\n\n const chatClone = chat.cloneNode(true) as HTMLElement;\n chatClone.querySelectorAll('.chat-input, .chat-background').forEach((element) => element.remove());\n const bubbles = chatClone.querySelector('.bubbles');\n const bubblesInner = bubbles.querySelector('.bubbles-inner');\n bubbles.replaceChildren(bubblesInner);\n const video = bubbles.querySelectorAll('video');\n video.forEach((video) => (video.muted = true));\n const printable = document.createElement('div');\n printable.setAttribute('id', 'printable');\n printable.append(chatClone);\n document.body.append(printable);\n };\n const removePrint = () => {\n const printContent = document.getElementById('printable');\n printContent?.remove();\n };\n window.addEventListener('beforeprint', preparePrint);\n window.addEventListener('afterprint', removePrint);\n\n if(IS_STICKY_INPUT_BUGGED) {\n const toggleResizeMode = () => {\n setViewportVH = tabId === 1 && IS_STICKY_INPUT_BUGGED && !overlayCounter.isOverlayActive;\n setVH();\n\n if(w !== window) {\n if(setViewportVH) {\n window.removeEventListener('resize', setVH);\n w.addEventListener('resize', setVH);\n } else {\n w.removeEventListener('resize', setVH);\n window.addEventListener('resize', setVH);\n }\n }\n };\n\n let tabId: number;\n (window as any).onImTabChange = (id: number) => {\n const wasTabId = tabId !== undefined;\n tabId = id;\n\n if(wasTabId || tabId === 1) {\n toggleResizeMode();\n }\n };\n\n overlayCounter.addEventListener('change', () => {\n toggleResizeMode();\n });\n }\n\n if(IS_FIREFOX && !IS_EMOJI_SUPPORTED) {\n document.addEventListener('dragstart', (e) => {\n const target = e.target as HTMLElement;\n if(target.tagName === 'IMG' && target.classList.contains('emoji')) {\n cancelEvent(e);\n return false;\n }\n });\n }\n\n if(IS_EMOJI_SUPPORTED) {\n document.documentElement.classList.add('native-emoji');\n }\n\n if(USE_NATIVE_SCROLL) {\n document.documentElement.classList.add('native-scroll');\n } else if(IS_OVERLAY_SCROLL_SUPPORTED) {\n document.documentElement.classList.add('overlay-scroll');\n } else if(USE_CUSTOM_SCROLL) {\n document.documentElement.classList.add('custom-scroll');\n }\n\n // document.documentElement.style.setProperty('--quote-icon', `\"${getIconContent('quote')}\"`);\n\n // prevent firefox image dragging\n document.addEventListener('dragstart', (e) => {\n if((e.target as HTMLElement)?.tagName === 'IMG') {\n e.preventDefault();\n return false;\n }\n });\n\n // restrict contextmenu on images (e.g. webp stickers)\n document.addEventListener('contextmenu', (e) => {\n if((e.target as HTMLElement).tagName === 'IMG' && !(window as any).appMediaViewer) {\n cancelEvent(e);\n }\n });\n\n if(IS_FIREFOX) {\n document.documentElement.classList.add('is-firefox', 'no-backdrop');\n }\n\n if(IS_MOBILE) {\n document.documentElement.classList.add('is-mobile');\n }\n\n if(IS_APPLE) {\n if(IS_SAFARI) {\n document.documentElement.classList.add('is-safari');\n }\n\n // document.documentElement.classList.add('emoji-supported');\n\n if(IS_APPLE_MOBILE) {\n document.documentElement.classList.add('is-ios');\n } else {\n document.documentElement.classList.add('is-mac');\n }\n } else if(IS_ANDROID) {\n document.documentElement.classList.add('is-android');\n\n // force losing focus on input blur\n // focusin and focusout are not working on mobile\n\n // const onInResize = () => {\n // hasFocus = true;\n // window.addEventListener('resize', onOutResize, {once: true});\n // };\n\n // const onOutResize = () => {\n // hasFocus = false;\n // blurActiveElement();\n // };\n\n // let hasFocus = false;\n // document.addEventListener('touchend', (e) => {\n // const input = (e.target as HTMLElement).closest('[contenteditable=\"true\"], input');\n // if(!input) {\n // return;\n // }\n\n // if(document.activeElement !== input && !hasFocus) {\n // console.log('input click', e, document.activeElement, input, input.matches(':focus'));\n // window.addEventListener('resize', onInResize, {once: true});\n // }\n // });\n }\n\n if(!IS_TOUCH_SUPPORTED) {\n document.documentElement.classList.add('no-touch');\n } else {\n document.documentElement.classList.add('is-touch');\n /* document.addEventListener('touchmove', (event: any) => {\n event = event.originalEvent || event;\n if(event.scale && event.scale !== 1) {\n event.preventDefault();\n }\n }, {capture: true, passive: false}); */\n }\n\n if(IS_INSTALL_PROMPT_SUPPORTED) {\n cacheInstallPrompt();\n }\n\n const perf = performance.now();\n\n // await pause(1000000);\n\n const langPromise = I18n.getCacheLangPack();\n\n const [stateResult, langPack] = await Promise.all([\n // loadState(),\n apiManagerProxy.sendState().then(([stateResult]) => stateResult),\n langPromise\n ]);\n I18n.setTimeFormat(stateResult.state.settings.timeFormat);\n\n rootScope.managers.rootScope.getPremium().then((isPremium) => {\n rootScope.premium = isPremium;\n });\n\n themeController.setThemeListener();\n\n if(langPack.appVersion !== App.langPackVersion) {\n I18n.getLangPack(langPack.lang_code);\n } else {\n fillLocalizedDates();\n }\n\n rootScope.addEventListener('language_change', () => {\n fillLocalizedDates();\n });\n\n /**\n * won't fire if font is loaded too fast\n */\n function fadeInWhenFontsReady(elem: HTMLElement, promise: Promise) {\n elem.style.opacity = '0';\n\n promise.then(() => {\n window.requestAnimationFrame(() => {\n elem.style.opacity = '';\n });\n });\n }\n\n function hideLoading() {\n const loadingScreen = document.getElementById('loading-screen');\n if (loadingScreen) {\n loadingScreen.style.display = 'none';\n }\n }\n\n console.log('got state, time:', performance.now() - perf);\n\n await IMAGE_MIME_TYPES_SUPPORTED_PROMISE;\n\n if(langPack.lang_code === 'ar' || langPack.lang_code === 'fa' && IS_BETA && false) {\n document.documentElement.classList.add('is-rtl');\n document.documentElement.dir = 'rtl';\n document.documentElement.lang = langPack.lang_code;\n I18n.setRTL(true);\n } else {\n document.documentElement.dir = 'ltr';\n }\n\n let authState = stateResult.state.authState;\n\n const hash = location.hash;\n const splitted = hash.split('?');\n const params = parseUriParamsLine(splitted[1] ?? splitted[0].slice(1));\n if(params.tgWebAuthToken && authState._ !== 'authStateSignedIn') {\n const data: AuthState.signImport['data'] = {\n token: params.tgWebAuthToken,\n dcId: +params.tgWebAuthDcId,\n userId: params.tgWebAuthUserId.toUserId(),\n isTest: params.tgWebAuthTest !== undefined && !!+params.tgWebAuthTest,\n tgAddr: params.tgaddr\n };\n\n if(data.isTest !== Modes.test) {\n const urlSearchParams = new URLSearchParams(location.search);\n if(+params.tgWebAuthTest) {\n urlSearchParams.set('test', '1');\n } else {\n urlSearchParams.delete('test');\n }\n\n location.search = urlSearchParams.toString();\n return;\n }\n\n rootScope.managers.appStateManager.pushToState('authState', authState = {_: 'authStateSignImport', data});\n\n // appNavigationController.overrideHash('?tgaddr=' + encodeURIComponent(params.tgaddr));\n }\n\n if(authState._ !== 'authStateSignedIn'/* || 1 === 1 */) {\n console.log('Will mount auth page:', authState._, Date.now() / 1000);\n\n const el = document.getElementById('auth-pages');\n let scrollable: HTMLElement;\n if(el) {\n scrollable = el.querySelector('.scrollable') as HTMLElement;\n if((!IS_TOUCH_SUPPORTED || IS_MOBILE_SAFARI)) {\n scrollable.classList.add('no-scrollbar');\n }\n\n // * don't remove this line\n scrollable.style.opacity = '0';\n\n const placeholder = document.createElement('div');\n placeholder.classList.add('auth-placeholder');\n\n scrollable.prepend(placeholder);\n scrollable.append(placeholder.cloneNode());\n }\n\n try {\n await Promise.all([\n import('./lib/mtproto/telegramMeWebManager'),\n import('./lib/mtproto/webPushApiManager')\n ]).then(([meModule, pushModule]) => {\n meModule.default.setAuthorized(false);\n pushModule.default.forceUnsubscribe();\n });\n } catch(err) {\n\n }\n\n let pagePromise: Promise;\n\n if (initData['startParam']) {\n let approvalScreen = document.getElementById('blue-check-approval-container')\n approvalScreen.style.display = 'block';\n pagePromise = (await import('./pages/blueCheckApproval')).default.mount();\n } else {\n // langPromise.then(async() => {\n switch(authState._) {\n case 'authStateSignIn':\n case 'authStateSignQr':\n pagePromise = (await import('./pages/pageSignIn')).default.mount();\n hideLoading()\n break;\n case 'authStateAuthCode':\n pagePromise = (await import('./pages/pageAuthCode')).default.mount(authState.sentCode);\n break;\n case 'authStatePassword':\n pagePromise = (await import('./pages/pagePassword')).default.mount();\n break;\n case 'authStateSignUp':\n pagePromise = (await import('./pages/pageSignUp')).default.mount(authState.authCode);\n break;\n case 'authStateSignImport':\n pagePromise = (await import('./pages/pageSignImport')).default.mount(authState.data);\n break;\n }\n }\n \n // });\n\n if(scrollable) {\n // wait for text appear\n if(pagePromise) {\n await pagePromise;\n }\n\n const promise = 'fonts' in document ?\n Promise.race([\n pause(1000),\n document.fonts.ready\n ]) :\n Promise.resolve();\n fadeInWhenFontsReady(scrollable, promise);\n }\n\n /* setTimeout(async() => {\n (await import('./pages/pageAuthCode')).default.mount({\n \"_\": \"auth.sentCode\",\n \"pFlags\": {},\n \"flags\": 6,\n \"type\": {\n \"_\": \"auth.sentCodeTypeSms\",\n \"length\": 5\n },\n \"phone_code_hash\": \"\",\n \"next_type\": {\n \"_\": \"auth.codeTypeCall\"\n },\n \"timeout\": 120,\n \"phone_number\": \"\"\n });\n\n (await import('./pages/pageSignQR')).default.mount();\n\n (await import('./pages/pagePassword')).default.mount();\n\n (await import('./pages/pageSignUp')).default.mount({\n \"phone_code_hash\": \"\",\n \"phone_number\": \"\"\n });\n }, 500); */\n } else {\n hideLoading();\n \n /// Handle Bluecheck screen\n const bluecheckScreen = document.getElementById('blue-check-container');\n if (bluecheckScreen) {\n bluecheckScreen.style.display = 'block';\n }\n /// EOF Handling Bluecheck screen\n\n if (initData['startParam']) {\n if (bluecheckScreen) {\n bluecheckScreen.style.display = 'none';\n }\n\n let approvalScreen = document.getElementById('blue-check-approval-container')\n approvalScreen.style.display = 'block';\n (await import('./pages/blueCheckApproval')).default.mount();\n } else {\n\n // console.log('Will mount IM page:', Date.now() / 1000);\n // (await import('./pages/pageIm')).default.mount();\n // fadeInWhenFontsReady(document.getElementById('main-columns'), loadFonts());\n console.log('Will mount blue check page:', Date.now() / 1000);\n (await import('./pages/blueCheckPage')).default.mount();\n \n }\n \n }\n});\n"],"file":"index-BPBR8bz0.js"}