(function(){var eventHandlers={};var locationHash='';try{locationHash=location.hash.toString();}catch(e){} var initParams=urlParseHashParams(locationHash);var storedParams=sessionStorageGet('initParams');if(storedParams){for(var key in storedParams){if(typeof initParams[key]==='undefined'){initParams[key]=storedParams[key];}}} sessionStorageSet('initParams',initParams);var isIframe=false,iFrameStyle;try{isIframe=window.parent!=null&&window!=window.parent;if(isIframe){window.addEventListener('message',function(event){if(event.source!==window.parent)return;try{var dataParsed=JSON.parse(event.data);}catch(e){return;} if(!dataParsed||!dataParsed.eventType){return;} if(dataParsed.eventType=='set_custom_style'){if(event.origin==='https://web.telegram.org'){iFrameStyle.innerHTML=dataParsed.eventData;}}else if(dataParsed.eventType=='reload_iframe'){try{window.parent.postMessage(JSON.stringify({eventType:'iframe_will_reload'}),'*',);}catch(e){} location.reload();}else{receiveEvent(dataParsed.eventType,dataParsed.eventData);}});iFrameStyle=document.createElement('style');document.head.appendChild(iFrameStyle);try{window.parent.postMessage(JSON.stringify({eventType:'iframe_ready',eventData:{reload_supported:true},}),'*',);}catch(e){}}}catch(e){} function urlSafeDecode(urlencoded){try{urlencoded=urlencoded.replace(/\+/g,'%20');return decodeURIComponent(urlencoded);}catch(e){return urlencoded;}} function urlParseHashParams(locationHash){locationHash=locationHash.replace(/^#/,'');var params={};if(!locationHash.length){return params;} if(locationHash.indexOf('=')<0&&locationHash.indexOf('?')<0){params._path=urlSafeDecode(locationHash);return params;} var qIndex=locationHash.indexOf('?');if(qIndex>=0){var pathParam=locationHash.substr(0,qIndex);params._path=urlSafeDecode(pathParam);locationHash=locationHash.substr(qIndex+1);} var query_params=urlParseQueryString(locationHash);for(var k in query_params){params[k]=query_params[k];} return params;} function urlParseQueryString(queryString){var params={};if(!queryString.length){return params;} var queryStringParams=queryString.split('&');var i,param,paramName,paramValue;for(i=0;i=0||curHash.indexOf('?')>=0){return url+'&'+addHash;} if(curHash.length>0){return url+'?'+addHash;} return url+addHash;} function postEvent(eventType,callback,eventData){if(!callback){callback=function(){};} if(eventData===undefined){eventData='';} console.log('[Telegram.WebView] > postEvent',eventType,eventData);if(window.TelegramWebviewProxy!==undefined){TelegramWebviewProxy.postEvent(eventType,JSON.stringify(eventData));callback();}else if(window.external&&'notify'in window.external){window.external.notify(JSON.stringify({eventType:eventType,eventData:eventData}),);callback();}else if(isIframe){try{var trustedTarget='https://web.telegram.org';trustedTarget='*';window.parent.postMessage(JSON.stringify({eventType:eventType,eventData:eventData}),trustedTarget,);callback();}catch(e){callback(e);}}else{callback({notAvailable:true});}} function receiveEvent(eventType,eventData){console.log('[Telegram.WebView] < receiveEvent',eventType,eventData);callEventCallbacks(eventType,function(callback){callback(eventType,eventData);});} function callEventCallbacks(eventType,func){var curEventHandlers=eventHandlers[eventType];if(curEventHandlers===undefined||!curEventHandlers.length){return;} for(var i=0;ip2)return 1;return-1;} return 0;} function versionAtLeast(ver){return versionCompare(webAppVersion,ver)>=0;} function byteLength(str){if(window.Blob){try{return new Blob([str]).size;}catch(e){}} var s=str.length;for(var i=str.length-1;i>=0;i--){var code=str.charCodeAt(i);if(code>0x7f&&code<=0x7ff)s++;else if(code>0x7ff&&code<=0xffff)s+=2;if(code>=0xdc00&&code<=0xdfff)i--;} return s;} var BackButton=(function(){var isVisible=false;var backButton={};Object.defineProperty(backButton,'isVisible',{set:function(val){setParams({is_visible:val});},get:function(){return isVisible;},enumerable:true,});var curButtonState=null;WebView.onEvent('back_button_pressed',onBackButtonPressed);function onBackButtonPressed(){receiveWebViewEvent('backButtonClicked');} function buttonParams(){return{is_visible:isVisible};} function buttonState(btn_params){if(typeof btn_params==='undefined'){btn_params=buttonParams();} return JSON.stringify(btn_params);} function buttonCheckVersion(){if(!versionAtLeast('6.1')){console.warn('[Telegram.WebApp] BackButton is not supported in version '+ webAppVersion,);return false;} return true;} function updateButton(){var btn_params=buttonParams();var btn_state=buttonState(btn_params);if(curButtonState===btn_state){return;} curButtonState=btn_state;WebView.postEvent('web_app_setup_back_button',false,btn_params);} function setParams(params){if(!buttonCheckVersion()){return backButton;} if(typeof params.is_visible!=='undefined'){isVisible=!!params.is_visible;} updateButton();return backButton;} backButton.onClick=function(callback){if(buttonCheckVersion()){onWebViewEvent('backButtonClicked',callback);} return backButton;};backButton.offClick=function(callback){if(buttonCheckVersion()){offWebViewEvent('backButtonClicked',callback);} return backButton;};backButton.show=function(){return setParams({is_visible:true});};backButton.hide=function(){return setParams({is_visible:false});};return backButton;})();var mainButtonHeight=0;var MainButton=(function(){var isVisible=false;var isActive=true;var isProgressVisible=false;var buttonText='CONTINUE';var buttonColor=false;var buttonTextColor=false;var mainButton={};Object.defineProperty(mainButton,'text',{set:function(val){mainButton.setParams({text:val});},get:function(){return buttonText;},enumerable:true,});Object.defineProperty(mainButton,'color',{set:function(val){mainButton.setParams({color:val});},get:function(){return buttonColor||themeParams.button_color||'#2481cc';},enumerable:true,});Object.defineProperty(mainButton,'textColor',{set:function(val){mainButton.setParams({text_color:val});},get:function(){return buttonTextColor||themeParams.button_text_color||'#ffffff';},enumerable:true,});Object.defineProperty(mainButton,'isVisible',{set:function(val){mainButton.setParams({is_visible:val});},get:function(){return isVisible;},enumerable:true,});Object.defineProperty(mainButton,'isProgressVisible',{get:function(){return isProgressVisible;},enumerable:true,});Object.defineProperty(mainButton,'isActive',{set:function(val){mainButton.setParams({is_active:val});},get:function(){return isActive;},enumerable:true,});var curButtonState=null;WebView.onEvent('main_button_pressed',onMainButtonPressed);var debugBtn=null,debugBtnStyle={};if(initParams.tgWebAppDebug){debugBtn=document.createElement('tg-main-button');debugBtnStyle={font:'600 14px/18px sans-serif',display:'none',width:'100%',height:'48px',borderRadius:'0',background:'no-repeat right center',position:'fixed',left:'0',right:'0',bottom:'0',margin:'0',padding:'15px 20px',textAlign:'center',boxSizing:'border-box',zIndex:'10000',};for(var k in debugBtnStyle){debugBtn.style[k]=debugBtnStyle[k];} document.addEventListener('DOMContentLoaded',function onDomLoaded(event){document.removeEventListener('DOMContentLoaded',onDomLoaded);document.body.appendChild(debugBtn);debugBtn.addEventListener('click',onMainButtonPressed,false);},);} function onMainButtonPressed(){if(isActive){receiveWebViewEvent('mainButtonClicked');}} function buttonParams(){var color=mainButton.color;var text_color=mainButton.textColor;return isVisible?{is_visible:true,is_active:isActive,is_progress_visible:isProgressVisible,text:buttonText,color:color,text_color:text_color,}:{is_visible:false};} function buttonState(btn_params){if(typeof btn_params==='undefined'){btn_params=buttonParams();} return JSON.stringify(btn_params);} function updateButton(){var btn_params=buttonParams();var btn_state=buttonState(btn_params);if(curButtonState===btn_state){return;} curButtonState=btn_state;WebView.postEvent('web_app_setup_main_button',false,btn_params);if(initParams.tgWebAppDebug){updateDebugButton(btn_params);}} function updateDebugButton(btn_params){if(btn_params.is_visible){debugBtn.style.display='block';mainButtonHeight=48;debugBtn.style.opacity=btn_params.is_active?'1':'0.8';debugBtn.style.cursor=btn_params.is_active?'pointer':'auto';debugBtn.disabled=!btn_params.is_active;debugBtn.innerText=btn_params.text;debugBtn.style.backgroundImage=btn_params.is_progress_visible?"url('data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20viewport%3D%220%200%2048%2048%22%20width%3D%2248px%22%20height%3D%2248px%22%3E%3Ccircle%20cx%3D%2250%25%22%20cy%3D%2250%25%22%20stroke%3D%22%23fff%22%20stroke-width%3D%222.25%22%20stroke-linecap%3D%22round%22%20fill%3D%22none%22%20stroke-dashoffset%3D%22106%22%20r%3D%229%22%20stroke-dasharray%3D%2256.52%22%20rotate%3D%22-90%22%3E%3Canimate%20attributeName%3D%22stroke-dashoffset%22%20attributeType%3D%22XML%22%20dur%3D%22360s%22%20from%3D%220%22%20to%3D%2212500%22%20repeatCount%3D%22indefinite%22%3E%3C%2Fanimate%3E%3CanimateTransform%20attributeName%3D%22transform%22%20attributeType%3D%22XML%22%20type%3D%22rotate%22%20dur%3D%221s%22%20from%3D%22-90%2024%2024%22%20to%3D%22630%2024%2024%22%20repeatCount%3D%22indefinite%22%3E%3C%2FanimateTransform%3E%3C%2Fcircle%3E%3C%2Fsvg%3E')":'none';debugBtn.style.backgroundColor=btn_params.color;debugBtn.style.color=btn_params.text_color;}else{debugBtn.style.display='none';mainButtonHeight=0;} if(document.documentElement){document.documentElement.style.boxSizing='border-box';document.documentElement.style.paddingBottom=mainButtonHeight+'px';} setViewportHeight();} function setParams(params){if(typeof params.text!=='undefined'){var text=strTrim(params.text);if(!text.length){console.error('[Telegram.WebApp] Main button text is required',params.text,);throw Error('WebAppMainButtonParamInvalid');} if(text.length>64){console.error('[Telegram.WebApp] Main button text is too long',text);throw Error('WebAppMainButtonParamInvalid');} buttonText=text;} if(typeof params.color!=='undefined'){if(params.color===false||params.color===null){buttonColor=false;}else{var color=parseColorToHex(params.color);if(!color){console.error('[Telegram.WebApp] Main button color format is invalid',params.color,);throw Error('WebAppMainButtonParamInvalid');} buttonColor=color;}} if(typeof params.text_color!=='undefined'){if(params.text_color===false||params.text_color===null){buttonTextColor=false;}else{var text_color=parseColorToHex(params.text_color);if(!text_color){console.error('[Telegram.WebApp] Main button text color format is invalid',params.text_color,);throw Error('WebAppMainButtonParamInvalid');} buttonTextColor=text_color;}} if(typeof params.is_visible!=='undefined'){if(params.is_visible&&!mainButton.text.length){console.error('[Telegram.WebApp] Main button text is required');throw Error('WebAppMainButtonParamInvalid');} isVisible=!!params.is_visible;} if(typeof params.is_active!=='undefined'){isActive=!!params.is_active;} updateButton();return mainButton;} mainButton.setText=function(text){return mainButton.setParams({text:text});};mainButton.onClick=function(callback){onWebViewEvent('mainButtonClicked',callback);return mainButton;};mainButton.offClick=function(callback){offWebViewEvent('mainButtonClicked',callback);return mainButton;};mainButton.show=function(){return mainButton.setParams({is_visible:true});};mainButton.hide=function(){return mainButton.setParams({is_visible:false});};mainButton.enable=function(){return mainButton.setParams({is_active:true});};mainButton.disable=function(){return mainButton.setParams({is_active:false});};mainButton.showProgress=function(leaveActive){isActive=!!leaveActive;isProgressVisible=true;updateButton();return mainButton;};mainButton.hideProgress=function(){if(!mainButton.isActive){isActive=true;} isProgressVisible=false;updateButton();return mainButton;};mainButton.setParams=setParams;return mainButton;})();var SettingsButton=(function(){var isVisible=false;var settingsButton={};Object.defineProperty(settingsButton,'isVisible',{set:function(val){setParams({is_visible:val});},get:function(){return isVisible;},enumerable:true,});var curButtonState=null;WebView.onEvent('settings_button_pressed',onSettingsButtonPressed);function onSettingsButtonPressed(){receiveWebViewEvent('settingsButtonClicked');} function buttonParams(){return{is_visible:isVisible};} function buttonState(btn_params){if(typeof btn_params==='undefined'){btn_params=buttonParams();} return JSON.stringify(btn_params);} function buttonCheckVersion(){if(!versionAtLeast('6.10')){console.warn('[Telegram.WebApp] SettingsButton is not supported in version '+ webAppVersion,);return false;} return true;} function updateButton(){var btn_params=buttonParams();var btn_state=buttonState(btn_params);if(curButtonState===btn_state){return;} curButtonState=btn_state;WebView.postEvent('web_app_setup_settings_button',false,btn_params);} function setParams(params){if(!buttonCheckVersion()){return settingsButton;} if(typeof params.is_visible!=='undefined'){isVisible=!!params.is_visible;} updateButton();return settingsButton;} settingsButton.onClick=function(callback){if(buttonCheckVersion()){onWebViewEvent('settingsButtonClicked',callback);} return settingsButton;};settingsButton.offClick=function(callback){if(buttonCheckVersion()){offWebViewEvent('settingsButtonClicked',callback);} return settingsButton;};settingsButton.show=function(){return setParams({is_visible:true});};settingsButton.hide=function(){return setParams({is_visible:false});};return settingsButton;})();var HapticFeedback=(function(){var hapticFeedback={};function triggerFeedback(params){if(!versionAtLeast('6.1')){console.warn('[Telegram.WebApp] HapticFeedback is not supported in version '+ webAppVersion,);return hapticFeedback;} if(params.type=='impact'){if(params.impact_style!='light'&¶ms.impact_style!='medium'&¶ms.impact_style!='heavy'&¶ms.impact_style!='rigid'&¶ms.impact_style!='soft'){console.error('[Telegram.WebApp] Haptic impact style is invalid',params.impact_style,);throw Error('WebAppHapticImpactStyleInvalid');}}else if(params.type=='notification'){if(params.notification_type!='error'&¶ms.notification_type!='success'&¶ms.notification_type!='warning'){console.error('[Telegram.WebApp] Haptic notification type is invalid',params.notification_type,);throw Error('WebAppHapticNotificationTypeInvalid');}}else if(params.type=='selection_change'){}else{console.error('[Telegram.WebApp] Haptic feedback type is invalid',params.type,);throw Error('WebAppHapticFeedbackTypeInvalid');} WebView.postEvent('web_app_trigger_haptic_feedback',false,params);return hapticFeedback;} hapticFeedback.impactOccurred=function(style){return triggerFeedback({type:'impact',impact_style:style});};hapticFeedback.notificationOccurred=function(type){return triggerFeedback({type:'notification',notification_type:type});};hapticFeedback.selectionChanged=function(){return triggerFeedback({type:'selection_change'});};return hapticFeedback;})();var CloudStorage=(function(){var cloudStorage={};function invokeStorageMethod(method,params,callback){if(!versionAtLeast('6.9')){console.error('[Telegram.WebApp] CloudStorage is not supported in version '+ webAppVersion,);throw Error('WebAppMethodUnsupported');} invokeCustomMethod(method,params,callback);return cloudStorage;} cloudStorage.setItem=function(key,value,callback){return invokeStorageMethod('saveStorageValue',{key:key,value:value},callback,);};cloudStorage.getItem=function(key,callback){return cloudStorage.getItems([key],callback?function(err,res){if(err)callback(err);else callback(null,res[key]);}:null,);};cloudStorage.getItems=function(keys,callback){return invokeStorageMethod('getStorageValues',{keys:keys},callback);};cloudStorage.removeItem=function(key,callback){return cloudStorage.removeItems([key],callback);};cloudStorage.removeItems=function(keys,callback){return invokeStorageMethod('deleteStorageValues',{keys:keys},callback,);};cloudStorage.getKeys=function(callback){return invokeStorageMethod('getStorageKeys',{},callback);};return cloudStorage;})();var BiometricManager=(function(){var isInited=false;var isBiometricAvailable=false;var biometricType='unknown';var isAccessRequested=false;var isAccessGranted=false;var isBiometricTokenSaved=false;var deviceId='';var biometricManager={};Object.defineProperty(biometricManager,'isInited',{get:function(){return isInited;},enumerable:true,});Object.defineProperty(biometricManager,'isBiometricAvailable',{get:function(){return isInited&&isBiometricAvailable;},enumerable:true,});Object.defineProperty(biometricManager,'biometricType',{get:function(){return biometricType||'unknown';},enumerable:true,});Object.defineProperty(biometricManager,'isAccessRequested',{get:function(){return isAccessRequested;},enumerable:true,});Object.defineProperty(biometricManager,'isAccessGranted',{get:function(){return isAccessRequested&&isAccessGranted;},enumerable:true,});Object.defineProperty(biometricManager,'isBiometricTokenSaved',{get:function(){return isBiometricTokenSaved;},enumerable:true,});Object.defineProperty(biometricManager,'deviceId',{get:function(){return deviceId||'';},enumerable:true,});var initRequestState={callbacks:[]};var accessRequestState=false;var authRequestState=false;var tokenRequestState=false;WebView.onEvent('biometry_info_received',onBiometryInfoReceived);WebView.onEvent('biometry_auth_requested',onBiometryAuthRequested);WebView.onEvent('biometry_token_updated',onBiometryTokenUpdated);function onBiometryInfoReceived(eventType,eventData){isInited=true;if(eventData.available){isBiometricAvailable=true;biometricType=eventData.type||'unknown';if(eventData.access_requested){isAccessRequested=true;isAccessGranted=!!eventData.access_granted;isBiometricTokenSaved=!!eventData.token_saved;}else{isAccessRequested=false;isAccessGranted=false;isBiometricTokenSaved=false;}}else{isBiometricAvailable=false;biometricType='unknown';isAccessRequested=false;isAccessGranted=false;isBiometricTokenSaved=false;} deviceId=eventData.device_id||'';if(initRequestState.callbacks.length>0){for(var i=0;i128){console.error('[Telegram.WebApp] Biometric reason is too long',reason,);throw Error('WebAppBiometricRequestAccessParamInvalid');} if(reason.length>0){popup_params.reason=reason;}} accessRequestState={callback:callback,};WebView.postEvent('web_app_biometry_request_access',false,popup_params);return biometricManager;};biometricManager.authenticate=function(params,callback){if(!checkVersion()){return biometricManager;} checkInit();if(!isBiometricAvailable){console.error('[Telegram.WebApp] Biometrics is not available on this device.',);throw Error('WebAppBiometricManagerBiometricsNotAvailable');} if(!isAccessGranted){console.error('[Telegram.WebApp] Biometric access was not granted by the user.',);throw Error('WebAppBiometricManagerBiometricAccessNotGranted');} if(authRequestState){console.error('[Telegram.WebApp] Authentication request is already in progress.',);throw Error('WebAppBiometricManagerAuthenticationRequested');} var popup_params={};if(typeof params.reason!=='undefined'){var reason=strTrim(params.reason);if(reason.length>128){console.error('[Telegram.WebApp] Biometric reason is too long',reason,);throw Error('WebAppBiometricRequestAccessParamInvalid');} if(reason.length>0){popup_params.reason=reason;}} authRequestState={callback:callback,};WebView.postEvent('web_app_biometry_request_auth',false,popup_params);return biometricManager;};biometricManager.updateBiometricToken=function(token,callback){if(!checkVersion()){return biometricManager;} token=token||'';if(token.length>1024){console.error('[Telegram.WebApp] Token is too long',token);throw Error('WebAppBiometricManagerTokenInvalid');} checkInit();if(!isBiometricAvailable){console.error('[Telegram.WebApp] Biometrics is not available on this device.',);throw Error('WebAppBiometricManagerBiometricsNotAvailable');} if(!isAccessGranted){console.error('[Telegram.WebApp] Biometric access was not granted by the user.',);throw Error('WebAppBiometricManagerBiometricAccessNotGranted');} if(tokenRequestState){console.error('[Telegram.WebApp] Token request is already in progress.',);throw Error('WebAppBiometricManagerTokenUpdateRequested');} tokenRequestState={callback:callback,};WebView.postEvent('web_app_biometry_update_token',false,{token:token,});return biometricManager;};biometricManager.openSettings=function(){if(!checkVersion()){return biometricManager;} checkInit();if(!isBiometricAvailable){console.error('[Telegram.WebApp] Biometrics is not available on this device.',);throw Error('WebAppBiometricManagerBiometricsNotAvailable');} if(!isAccessRequested){console.error('[Telegram.WebApp] Biometric access was not requested yet.',);throw Error('WebAppBiometricManagerBiometricsAccessNotRequested');} if(isAccessGranted){console.warn('[Telegram.WebApp] Biometric access was granted by the user, no need to go to settings.',);return biometricManager;} WebView.postEvent('web_app_biometry_open_settings',false);return biometricManager;};return biometricManager;})();var webAppInvoices={};function onInvoiceClosed(eventType,eventData){if(eventData.slug&&webAppInvoices[eventData.slug]){var invoiceData=webAppInvoices[eventData.slug];delete webAppInvoices[eventData.slug];if(invoiceData.callback){invoiceData.callback(eventData.status);} receiveWebViewEvent('invoiceClosed',{url:invoiceData.url,status:eventData.status,});}} var webAppPopupOpened=false;function onPopupClosed(eventType,eventData){if(webAppPopupOpened){var popupData=webAppPopupOpened;webAppPopupOpened=false;var button_id=null;if(typeof eventData.button_id!=='undefined'){button_id=eventData.button_id;} if(popupData.callback){popupData.callback(button_id);} receiveWebViewEvent('popupClosed',{button_id:button_id,});}} var webAppScanQrPopupOpened=false;function onQrTextReceived(eventType,eventData){if(webAppScanQrPopupOpened){var popupData=webAppScanQrPopupOpened;var data=null;if(typeof eventData.data!=='undefined'){data=eventData.data;} if(popupData.callback){if(popupData.callback(data)){webAppScanQrPopupOpened=false;WebView.postEvent('web_app_close_scan_qr_popup',false);}} receiveWebViewEvent('qrTextReceived',{data:data,});}} function onScanQrPopupClosed(eventType,eventData){webAppScanQrPopupOpened=false;} function onClipboardTextReceived(eventType,eventData){if(eventData.req_id&&webAppCallbacks[eventData.req_id]){var requestData=webAppCallbacks[eventData.req_id];delete webAppCallbacks[eventData.req_id];var data=null;if(typeof eventData.data!=='undefined'){data=eventData.data;} if(requestData.callback){requestData.callback(data);} receiveWebViewEvent('clipboardTextReceived',{data:data,});}} var WebAppWriteAccessRequested=false;function onWriteAccessRequested(eventType,eventData){if(WebAppWriteAccessRequested){var requestData=WebAppWriteAccessRequested;WebAppWriteAccessRequested=false;if(requestData.callback){requestData.callback(eventData.status=='allowed');} receiveWebViewEvent('writeAccessRequested',{status:eventData.status,});}} function getRequestedContact(callback,timeout){var reqTo,fallbackTo,reqDelay=0;var reqInvoke=function(){invokeCustomMethod('getRequestedContact',{},function(err,res){if(res&&res.length){clearTimeout(fallbackTo);callback(res);}else{reqDelay+=50;reqTo=setTimeout(reqInvoke,reqDelay);}});};var fallbackInvoke=function(){clearTimeout(reqTo);callback('');};fallbackTo=setTimeout(fallbackInvoke,timeout);reqInvoke();} var WebAppContactRequested=false;function onPhoneRequested(eventType,eventData){if(WebAppContactRequested){var requestData=WebAppContactRequested;WebAppContactRequested=false;var requestSent=eventData.status=='sent';var webViewEvent={status:eventData.status,};if(requestSent){getRequestedContact(function(res){if(res&&res.length){webViewEvent.response=res;webViewEvent.responseUnsafe=Utils.urlParseQueryString(res);for(var key in webViewEvent.responseUnsafe){var val=webViewEvent.responseUnsafe[key];try{if((val.substr(0,1)=='{'&&val.substr(-1)=='}')||(val.substr(0,1)=='['&&val.substr(-1)==']')){webViewEvent.responseUnsafe[key]=JSON.parse(val);}}catch(e){}}} if(requestData.callback){requestData.callback(requestSent,webViewEvent);} receiveWebViewEvent('contactRequested',webViewEvent);},3000);}else{if(requestData.callback){requestData.callback(requestSent,webViewEvent);} receiveWebViewEvent('contactRequested',webViewEvent);}}} function onCustomMethodInvoked(eventType,eventData){if(eventData.req_id&&webAppCallbacks[eventData.req_id]){var requestData=webAppCallbacks[eventData.req_id];delete webAppCallbacks[eventData.req_id];var res=null,err=null;if(typeof eventData.result!=='undefined'){res=eventData.result;} if(typeof eventData.error!=='undefined'){err=eventData.error;} if(requestData.callback){requestData.callback(err,res);}}} function invokeCustomMethod(method,params,callback){if(!versionAtLeast('6.9')){console.error('[Telegram.WebApp] Method invokeCustomMethod is not supported in version '+ webAppVersion,);throw Error('WebAppMethodUnsupported');} var req_id=generateCallbackId(16);var req_params={req_id:req_id,method:method,params:params||{}};webAppCallbacks[req_id]={callback:callback,};WebView.postEvent('web_app_invoke_custom_method',false,req_params);} if(!window.Telegram){window.Telegram={};} Object.defineProperty(WebApp,'initData',{get:function(){return webAppInitData;},enumerable:true,});Object.defineProperty(WebApp,'initDataUnsafe',{get:function(){return webAppInitDataUnsafe;},enumerable:true,});Object.defineProperty(WebApp,'version',{get:function(){return webAppVersion;},enumerable:true,});Object.defineProperty(WebApp,'platform',{get:function(){return 'ios';},enumerable:true,});Object.defineProperty(WebApp,'colorScheme',{get:function(){return colorScheme;},enumerable:true,});Object.defineProperty(WebApp,'themeParams',{get:function(){return themeParams;},enumerable:true,});Object.defineProperty(WebApp,'isExpanded',{get:function(){return isExpanded;},enumerable:true,});Object.defineProperty(WebApp,'viewportHeight',{get:function(){return((viewportHeight===false?window.innerHeight:viewportHeight)- mainButtonHeight);},enumerable:true,});Object.defineProperty(WebApp,'viewportStableHeight',{get:function(){return((viewportStableHeight===false?window.innerHeight:viewportStableHeight)-mainButtonHeight);},enumerable:true,});Object.defineProperty(WebApp,'isClosingConfirmationEnabled',{set:function(val){setClosingConfirmation(val);},get:function(){return isClosingConfirmationEnabled;},enumerable:true,});Object.defineProperty(WebApp,'headerColor',{set:function(val){setHeaderColor(val);},get:function(){return getHeaderColor();},enumerable:true,});Object.defineProperty(WebApp,'backgroundColor',{set:function(val){setBackgroundColor(val);},get:function(){return getBackgroundColor();},enumerable:true,});Object.defineProperty(WebApp,'BackButton',{value:BackButton,enumerable:true,});Object.defineProperty(WebApp,'MainButton',{value:MainButton,enumerable:true,});Object.defineProperty(WebApp,'SettingsButton',{value:SettingsButton,enumerable:true,});Object.defineProperty(WebApp,'HapticFeedback',{value:HapticFeedback,enumerable:true,});Object.defineProperty(WebApp,'CloudStorage',{value:CloudStorage,enumerable:true,});Object.defineProperty(WebApp,'BiometricManager',{value:BiometricManager,enumerable:true,});WebApp.setHeaderColor=function(color_key){WebApp.headerColor=color_key;};WebApp.setBackgroundColor=function(color){WebApp.backgroundColor=color;};WebApp.enableClosingConfirmation=function(){WebApp.isClosingConfirmationEnabled=true;};WebApp.disableClosingConfirmation=function(){WebApp.isClosingConfirmationEnabled=false;};WebApp.isVersionAtLeast=function(ver){return versionAtLeast(ver);};WebApp.onEvent=function(eventType,callback){onWebViewEvent(eventType,callback);};WebApp.offEvent=function(eventType,callback){offWebViewEvent(eventType,callback);};WebApp.sendData=function(data){if(!data||!data.length){console.error('[Telegram.WebApp] Data is required',data);throw Error('WebAppDataInvalid');} if(byteLength(data)>4096){console.error('[Telegram.WebApp] Data is too long',data);throw Error('WebAppDataInvalid');} WebView.postEvent('web_app_data_send',false,{data:data});};WebApp.switchInlineQuery=function(query,choose_chat_types){if(!versionAtLeast('6.6')){console.error('[Telegram.WebApp] Method switchInlineQuery is not supported in version '+ webAppVersion,);throw Error('WebAppMethodUnsupported');} if(!initParams.tgWebAppBotInline){console.error('[Telegram.WebApp] Inline mode is disabled for this bot. Read more about inline mode: https://core.telegram.org/bots/inline',);throw Error('WebAppInlineModeDisabled');} query=query||'';if(query.length>256){console.error('[Telegram.WebApp] Inline query is too long',query);throw Error('WebAppInlineQueryInvalid');} var chat_types=[];if(choose_chat_types){if(!Array.isArray(choose_chat_types)){console.error('[Telegram.WebApp] Choose chat types should be an array',choose_chat_types,);throw Error('WebAppInlineChooseChatTypesInvalid');} var good_types={users:1,bots:1,groups:1,channels:1};for(var i=0;i64){console.error('[Telegram.WebApp] Popup title is too long',title);throw Error('WebAppPopupParamInvalid');} if(title.length>0){popup_params.title=title;}} if(typeof params.message!=='undefined'){message=strTrim(params.message);} if(!message.length){console.error('[Telegram.WebApp] Popup message is required',params.message,);throw Error('WebAppPopupParamInvalid');} if(message.length>256){console.error('[Telegram.WebApp] Popup message is too long',message);throw Error('WebAppPopupParamInvalid');} popup_params.message=message;if(typeof params.buttons!=='undefined'){if(!Array.isArray(params.buttons)){console.error('[Telegram.WebApp] Popup buttons should be an array',params.buttons,);throw Error('WebAppPopupParamInvalid');} for(var i=0;i64){console.error('[Telegram.WebApp] Popup button id is too long',id);throw Error('WebAppPopupParamInvalid');}} btn.id=id;var button_type=button.type;if(typeof button_type==='undefined'){button_type='default';} btn.type=button_type;if(button_type=='ok'||button_type=='close'||button_type=='cancel'){}else if(button_type=='default'||button_type=='destructive'){var text='';if(typeof button.text!=='undefined'){text=strTrim(button.text);} if(!text.length){console.error('[Telegram.WebApp] Popup button text is required for type '+ button_type,button.text,);throw Error('WebAppPopupParamInvalid');} if(text.length>64){console.error('[Telegram.WebApp] Popup button text is too long',text,);throw Error('WebAppPopupParamInvalid');} btn.text=text;}else{console.error('[Telegram.WebApp] Popup button type is invalid',button_type,);throw Error('WebAppPopupParamInvalid');} buttons.push(btn);}}else{buttons.push({id:'',type:'close'});} if(buttons.length<1){console.error('[Telegram.WebApp] Popup should have at least one button');throw Error('WebAppPopupParamInvalid');} if(buttons.length>3){console.error('[Telegram.WebApp] Popup should not have more than 3 buttons',);throw Error('WebAppPopupParamInvalid');} popup_params.buttons=buttons;webAppPopupOpened={callback:callback,};WebView.postEvent('web_app_open_popup',false,popup_params);};WebApp.showAlert=function(message,callback){WebApp.showPopup({message:message,},callback?function(){callback();}:null,);};WebApp.showConfirm=function(message,callback){WebApp.showPopup({message:message,buttons:[{type:'ok',id:'ok'},{type:'cancel'}],},callback?function(button_id){callback(button_id=='ok');}:null,);};WebApp.showScanQrPopup=function(params,callback){if(!versionAtLeast('6.4')){console.error('[Telegram.WebApp] Method showScanQrPopup is not supported in version '+ webAppVersion,);throw Error('WebAppMethodUnsupported');} if(webAppScanQrPopupOpened){console.error('[Telegram.WebApp] Popup is already opened');throw Error('WebAppScanQrPopupOpened');} var text='';var popup_params={};if(typeof params.text!=='undefined'){text=strTrim(params.text);if(text.length>64){console.error('[Telegram.WebApp] Scan QR popup text is too long',text);throw Error('WebAppScanQrPopupParamInvalid');} if(text.length>0){popup_params.text=text;}} webAppScanQrPopupOpened={callback:callback,};WebView.postEvent('web_app_open_scan_qr_popup',false,popup_params);};WebApp.closeScanQrPopup=function(){if(!versionAtLeast('6.4')){console.error('[Telegram.WebApp] Method closeScanQrPopup is not supported in version '+ webAppVersion,);throw Error('WebAppMethodUnsupported');} webAppScanQrPopupOpened=false;WebView.postEvent('web_app_close_scan_qr_popup',false);};WebApp.readTextFromClipboard=function(callback){if(!versionAtLeast('6.4')){console.error('[Telegram.WebApp] Method readTextFromClipboard is not supported in version '+ webAppVersion,);throw Error('WebAppMethodUnsupported');} var req_id=generateCallbackId(16);var req_params={req_id:req_id};webAppCallbacks[req_id]={callback:callback,};WebView.postEvent('web_app_read_text_from_clipboard',false,req_params);};WebApp.requestWriteAccess=function(callback){if(!versionAtLeast('6.9')){console.error('[Telegram.WebApp] Method requestWriteAccess is not supported in version '+ webAppVersion,);throw Error('WebAppMethodUnsupported');} if(WebAppWriteAccessRequested){console.error('[Telegram.WebApp] Write access is already requested');throw Error('WebAppWriteAccessRequested');} WebAppWriteAccessRequested={callback:callback,};WebView.postEvent('web_app_request_write_access');};WebApp.requestContact=function(callback){if(!versionAtLeast('6.9')){console.error('[Telegram.WebApp] Method requestContact is not supported in version '+ webAppVersion,);throw Error('WebAppMethodUnsupported');} if(WebAppContactRequested){console.error('[Telegram.WebApp] Contact is already requested');throw Error('WebAppContactRequested');} WebAppContactRequested={callback:callback,};WebView.postEvent('web_app_request_phone');};WebApp.invokeCustomMethod=function(method,params,callback){invokeCustomMethod(method,params,callback);};WebApp.ready=function(){WebView.postEvent('web_app_ready');};WebApp.expand=function(){WebView.postEvent('web_app_expand');};WebApp.close=function(){WebView.postEvent('web_app_close');};window.Telegram.WebApp=WebApp;updateHeaderColor();updateBackgroundColor();setViewportHeight();if(initParams.tgWebAppShowSettings){SettingsButton.show();} window.addEventListener('resize',onWindowResize);if(isIframe){document.addEventListener('click',linkHandler);} WebView.onEvent('theme_changed',onThemeChanged);WebView.onEvent('viewport_changed',onViewportChanged);WebView.onEvent('invoice_closed',onInvoiceClosed);WebView.onEvent('popup_closed',onPopupClosed);WebView.onEvent('qr_text_received',onQrTextReceived);WebView.onEvent('scan_qr_popup_closed',onScanQrPopupClosed);WebView.onEvent('clipboard_text_received',onClipboardTextReceived);WebView.onEvent('write_access_requested',onWriteAccessRequested);WebView.onEvent('phone_requested',onPhoneRequested);WebView.onEvent('custom_method_invoked',onCustomMethodInvoked);WebView.postEvent('web_app_request_theme');WebView.postEvent('web_app_request_viewport');})();