From 66ac7824ba78ca6ae624e7142974e1a1bc485d80 Mon Sep 17 00:00:00 2001 From: Igor Zhukov Date: Fri, 10 Jul 2015 21:05:53 +0300 Subject: [PATCH] merged with master --- app.manifest | 2 +- css/app.css | 3 ++- js/app.js | 12 ++++++------ js/locales/de-de.json | 11 ++++++++++- js/locales/en-us.json | 1 + js/locales/es-es.json | 11 ++++++++++- js/locales/it-it.json | 11 ++++++++++- js/locales/nl-nl.json | 11 ++++++++++- js/locales/pt-br.json | 11 ++++++++++- js/locales/ru-ru.json | 15 ++++++++++++--- webogram.appcache | 2 +- 11 files changed, 73 insertions(+), 17 deletions(-) diff --git a/app.manifest b/app.manifest index 72266ba5..6a9d61be 100644 --- a/app.manifest +++ b/app.manifest @@ -1,5 +1,5 @@ CACHE MANIFEST -# Time: Fri Jul 10 2015 19:42:39 GMT+0300 (MSK) +# Time: Fri Jul 10 2015 21:03:45 GMT+0300 (MSK) CACHE: diff --git a/css/app.css b/css/app.css index 5906a3f9..03fa0edd 100644 --- a/css/app.css +++ b/css/app.css @@ -1541,7 +1541,7 @@ img.img_fullsize{margin:0 auto} .composer_emoji_tooltip_tab_grid.active{background-position:-9px -222px} .composer_emoji_tooltip_tab_stickers{background-position:-9px -361px} .composer_emoji_tooltip_tab_stickers.active{background-position:-9px -333px} -.composer_emoji_tooltip_scrollable_container{height:174px;position:relative} +.composer_emoji_tooltip .scroller_scrollable_container{height:174px;position:relative} .composer_emoji_tooltip_content{padding-right:8px;outline:0!important} a.composer_emoji_btn{margin:0 1px 0 0;padding:6px;display:block;float:left;border-radius:2px} a.composer_emoji_btn:hover{background-color:#edf2f5} @@ -1810,6 +1810,7 @@ a.md_modal_list_peer_name{color:inherit} .md_modal_list_peer_description{margin-top:4px;color:#999} .md_modal_list_peer_description .status_online,.md_modal_list_peer_description.status_online{color:#3a6d99} .md_modal_footer{padding:15px 27px} +.md_modal_footer_empty{padding:15px 27px 0} .md_photo_loading{display:block;width:72px;height:72px;border-radius:36px;overflow:hidden;background:#48769b;text-align:center;line-height:72px;padding:0} .md_photo_loading i{display:inline-block;background:#fff;width:8px;height:8px;border-radius:4px;vertical-align:middle;border:0;margin-left:6px} .md_photo_loading i:first-child{margin-left:0} \ No newline at end of file diff --git a/js/app.js b/js/app.js index e87b02e0..5802c32f 100644 --- a/js/app.js +++ b/js/app.js @@ -16,9 +16,9 @@ this.WebPGetDecoderVersion=this.Ld=function(){return 512};var $o=[0,1,2,3,6,4,5, }]).factory("MtpTimeManager",["Storage",function(e){function t(){var e=tsNow(),t=Math.floor(e/1e3)+a,n=e%1e3,o=nextRandomInt(65535),s=[t,n<<21|o<<3|4];return(i[0]>s[0]||i[0]==s[0]&&i[1]>=s[1])&&(s=[i[0],i[1]+4]),i=s,longFromInts(s[0],s[1])}function n(t,n){var o=t-Math.floor((n||tsNow())/1e3),s=Math.abs(a-o)>10;return e.set({server_time_offset:o}),i=[0,0],a=o,console.log(dT(),"Apply server time",t,n,o,s),s}var i=[0,0],a=0;return e.get("server_time_offset").then(function(e){e&&(a=e)}),{generateID:t,applyServerTime:n}}]).factory("MtpAuthorizer",["MtpDcConfigurator","MtpRsaKeysManager","MtpSecureRandom","MtpTimeManager","CryptoWorker","$http","$q","$timeout",function(e,t,n,i,a,o,s,r){function l(t,n){var a=n.byteLength,r=new Int32Array(n),l=new TLSerialization;l.storeLongP(0,0,"auth_key_id"),l.storeLong(i.generateID(),"msg_id"),l.storeInt(a,"request_length");var c=l.getBuffer(),d=new Int32Array(c),u=c.byteLength,p=new ArrayBuffer(u+a),m=new Int32Array(p);m.set(d),m.set(r,d.length);var h,g=f?p:m;try{h=o.post(e.chooseServer(t),g,{responseType:"arraybuffer",transformRequest:null})}catch(_){h=s.reject({code:406,type:"NETWORK_BAD_RESPONSE",originalError:_})}return h.then(function(e){if(!e.data||!e.data.byteLength)return s.reject({code:406,type:"NETWORK_BAD_RESPONSE"});try{{var t=new TLDeserialization(e.data,{mtproto:!0});t.fetchLong("auth_key_id"),t.fetchLong("msg_id"),t.fetchInt("msg_len")}}catch(n){return s.reject({code:406,type:"NETWORK_BAD_RESPONSE",originalError:n})}return t},function(e){return e.message||e.type||(e={code:406,type:"NETWORK_BAD_REQUEST",originalError:e}),s.reject(e)})}function c(e){var n=e.deferred,i=new TLSerialization({mtproto:!0});i.storeMethod("req_pq",{nonce:e.nonce}),console.log(dT(),"Send req_pq",bytesToHex(e.nonce)),l(e.dcID,i.getBuffer()).then(function(i){var o=i.fetchObject("ResPQ");if("resPQ"!=o._)throw new Error("resPQ response invalid: "+o._);if(!bytesCmp(e.nonce,o.nonce))throw new Error("resPQ nonce mismatch");if(e.serverNonce=o.server_nonce,e.pq=o.pq,e.fingerprints=o.server_public_key_fingerprints,console.log(dT(),"Got ResPQ",bytesToHex(e.serverNonce),bytesToHex(e.pq),e.fingerprints),e.publicKey=t.select(e.fingerprints),!e.publicKey)throw new Error("No public key found");console.log(dT(),"PQ factorization start",e.pq),a.factorize(e.pq).then(function(t){e.p=t[0],e.q=t[1],console.log(dT(),"PQ factorization done",t[2]),d(e)},function(e){console.log("Worker error",e,e.stack),n.reject(e)})},function(e){console.log(dT(),"req_pq error",e.message),n.reject(e)}),r(function(){t.prepare()})}function d(e){var t=e.deferred;e.newNonce=new Array(32),n.nextBytes(e.newNonce);var i=new TLSerialization({mtproto:!0});i.storeObject({_:"p_q_inner_data",pq:e.pq,p:e.p,q:e.q,nonce:e.nonce,server_nonce:e.serverNonce,new_nonce:e.newNonce},"P_Q_inner_data","DECRYPTED_DATA");var a=sha1BytesSync(i.getBuffer()).concat(i.getBytes()),o=new TLSerialization({mtproto:!0});o.storeMethod("req_DH_params",{nonce:e.nonce,server_nonce:e.serverNonce,p:e.p,q:e.q,public_key_fingerprint:e.publicKey.fingerprint,encrypted_data:rsaEncrypt(e.publicKey,a)}),console.log(dT(),"Send req_DH_params"),l(e.dcID,o.getBuffer()).then(function(n){var i=n.fetchObject("Server_DH_Params","RESPONSE");if("server_DH_params_fail"!=i._&&"server_DH_params_ok"!=i._)return t.reject(new Error("Server_DH_Params response invalid: "+i._)),!1;if(!bytesCmp(e.nonce,i.nonce))return t.reject(new Error("Server_DH_Params nonce mismatch")),!1;if(!bytesCmp(e.serverNonce,i.server_nonce))return t.reject(new Error("Server_DH_Params server_nonce mismatch")),!1;if("server_DH_params_fail"==i._){var a=sha1BytesSync(e.newNonce).slice(-16);return bytesCmp(a,i.new_nonce_hash)?(t.reject(new Error("server_DH_params_fail")),!1):(t.reject(new Error("server_DH_params_fail new_nonce_hash mismatch")),!1)}try{u(e,i.encrypted_answer)}catch(o){return t.reject(o),!1}p(e)},function(e){t.reject(e)})}function u(e,t){e.localTime=tsNow(),e.tmpAesKey=sha1BytesSync(e.newNonce.concat(e.serverNonce)).concat(sha1BytesSync(e.serverNonce.concat(e.newNonce)).slice(0,12)),e.tmpAesIv=sha1BytesSync(e.serverNonce.concat(e.newNonce)).slice(12).concat(sha1BytesSync([].concat(e.newNonce,e.newNonce)),e.newNonce.slice(0,4));var n=aesDecryptSync(t,e.tmpAesKey,e.tmpAesIv),a=n.slice(0,20),o=n.slice(20),s=bytesToArrayBuffer(o),r=new TLDeserialization(s,{mtproto:!0}),l=r.fetchObject("Server_DH_inner_data");if("server_DH_inner_data"!=l._)throw new Error("server_DH_inner_data response invalid: "+constructor);if(!bytesCmp(e.nonce,l.nonce))throw new Error("server_DH_inner_data nonce mismatch");if(!bytesCmp(e.serverNonce,l.server_nonce))throw new Error("server_DH_inner_data serverNonce mismatch");console.log(dT(),"Done decrypting answer"),e.g=l.g,e.dhPrime=l.dh_prime,e.gA=l.g_a,e.serverTime=l.server_time,e.retry=0;var c=r.getOffset();if(!bytesCmp(a,sha1BytesSync(o.slice(0,c))))throw new Error("server_DH_inner_data SHA1-hash mismatch");i.applyServerTime(e.serverTime,e.localTime)}function p(e){var t=e.deferred,i=bytesFromHex(e.g.toString(16));e.b=new Array(256),n.nextBytes(e.b),a.modPow(i,e.b,e.dhPrime).then(function(n){var i=new TLSerialization({mtproto:!0});i.storeObject({_:"client_DH_inner_data",nonce:e.nonce,server_nonce:e.serverNonce,retry_id:[0,e.retry++],g_b:n},"Client_DH_Inner_Data");var o=sha1BytesSync(i.getBuffer()).concat(i.getBytes()),s=aesEncryptSync(o,e.tmpAesKey,e.tmpAesIv),r=new TLSerialization({mtproto:!0});r.storeMethod("set_client_DH_params",{nonce:e.nonce,server_nonce:e.serverNonce,encrypted_data:s}),console.log(dT(),"Send set_client_DH_params"),l(e.dcID,r.getBuffer()).then(function(n){var i=n.fetchObject("Set_client_DH_params_answer");return"dh_gen_ok"!=i._&&"dh_gen_retry"!=i._&&"dh_gen_fail"!=i._?(t.reject(new Error("Set_client_DH_params_answer response invalid: "+i._)),!1):bytesCmp(e.nonce,i.nonce)?bytesCmp(e.serverNonce,i.server_nonce)?void a.modPow(e.gA,e.b,e.dhPrime).then(function(n){var a=sha1BytesSync(n),o=a.slice(0,8),s=a.slice(-8);switch(console.log(dT(),"Got Set_client_DH_params_answer",i._),i._){case"dh_gen_ok":var r=sha1BytesSync(e.newNonce.concat([1],o)).slice(-16);if(!bytesCmp(r,i.new_nonce_hash1))return t.reject(new Error("Set_client_DH_params_answer new_nonce_hash1 mismatch")),!1;var l=bytesXor(e.newNonce.slice(0,8),e.serverNonce.slice(0,8));e.authKeyID=s,e.authKey=n,e.serverSalt=l,t.resolve(e);break;case"dh_gen_retry":var c=sha1BytesSync(e.newNonce.concat([2],o)).slice(-16);return bytesCmp(c,i.new_nonce_hash2)?p(e):(t.reject(new Error("Set_client_DH_params_answer new_nonce_hash2 mismatch")),!1);case"dh_gen_fail":var d=sha1BytesSync(e.newNonce.concat([3],o)).slice(-16);return bytesCmp(d,i.new_nonce_hash3)?(t.reject(new Error("Set_client_DH_params_answer fail")),!1):(t.reject(new Error("Set_client_DH_params_answer new_nonce_hash3 mismatch")),!1)}},function(e){t.reject(e)}):(t.reject(new Error("Set_client_DH_params_answer server_nonce mismatch")),!1):(t.reject(new Error("Set_client_DH_params_answer nonce mismatch")),!1)},function(e){t.reject(e)})},function(e){t.reject(e)})}function m(t){if(void 0!==_[t])return _[t];for(var n=[],i=0;16>i;i++)n.push(nextRandomInt(255));if(!e.chooseServer(t))return s.reject(new Error("No server found for dc "+t));var a={dcID:t,nonce:n,deferred:s.defer()};return r(function(){c(a)}),_[t]=a.deferred.promise,_[t]["catch"](function(){delete _[t]}),_[t]}var h=navigator.userAgent.match(/Chrome\/(\d+(\.\d+)?)/),g=h&&parseFloat(h[1])||!1,f=!("ArrayBufferView"in window)&&(!g||30>g);delete o.defaults.headers.post["Content-Type"],delete o.defaults.headers.common.Accept;var _={};return{auth:m}}]).factory("MtpNetworkerFactory",["MtpDcConfigurator","MtpTimeManager","MtpSecureRandom","Storage","CryptoWorker","AppRuntimeManager","$http","$q","$timeout","$interval","$rootScope",function(e,t,n,i,a,o,s,r,l,c,d){function u(e,t,n,i){i=i||{},this.dcID=e,this.iii=g++,this.authKey=t,this.authKeyUint8=convertToUint8Array(t),this.authKeyBuffer=convertToArrayBuffer(t),this.authKeyID=sha1BytesSync(t).slice(-8),this.serverSalt=n,this.upload=i.fileUpload||i.fileDownload||!1,this.updateSession(),this.currentRequests=0,this.checkConnectionPeriod=0,this.sentMessages={},this.serverMessages=[],this.clientMessages=[],this.pendingMessages={},this.pendingAcks=[],this.pendingResends=[],this.connectionInited=!1,this.pendingTimeouts=[],this.longPollInt=c(this.checkLongPoll.bind(this),1e4),this.checkLongPoll(),f||(f=!0,d.offline=!0,d.offlineConnecting=!0),Config.Navigator.mobile&&this.setupMobileSleep()}function p(){_&&(_=!1,h({_:"new_session_created"}))}function m(){_=!0}var h,g=0,f=!1,_=!1,v=navigator.userAgent.match(/Chrome\/(\d+(\.\d+)?)/),y=v&&parseFloat(v[1])||!1,b=!("ArrayBufferView"in window)&&(!y||30>y);return delete s.defaults.headers.post["Content-Type"],delete s.defaults.headers.common.Accept,d.retryOnline=function(){$(document.body).trigger("online")},u.prototype.updateSession=function(){this.seqNo=0,this.sessionID=new Array(8),n.nextBytes(this.sessionID)},u.prototype.setupMobileSleep=function(){var e=this;d.$watch("idle.isIDLE",function(t){t?e.sleepAfter=tsNow()+3e4:(delete e.sleepAfter,e.checkLongPoll())}),d.$on("push_received",function(){e.sleepAfter&&(e.sleepAfter=tsNow()+3e4,e.checkLongPoll())})},u.prototype.updateSentMessage=function(e){var n=this.sentMessages[e];if(!n)return!1;var i=this;if(n.container){var a=[];angular.forEach(n.inner,function(e){var t=i.updateSentMessage(e);t&&a.push(t.msg_id)}),n.inner=a}return n.msg_id=t.generateID(),n.seq_no=this.generateSeqNo(n.notContentRelated||n.container),this.sentMessages[n.msg_id]=n,delete i.sentMessages[e],n},u.prototype.generateSeqNo=function(e){var t=2*this.seqNo;return e||(t++,this.seqNo++),t},u.prototype.wrapMtpCall=function(e,n,i){var a=new TLSerialization({mtproto:!0});a.storeMethod(e,n);var o=t.generateID(),s=this.generateSeqNo(),r={msg_id:o,seq_no:s,body:a.getBytes()};return Config.Modes.debug&&console.log(dT(),"MT call",e,n,o,s),this.pushMessage(r,i)},u.prototype.wrapMtpMessage=function(e,n){n=n||{};var i=new TLSerialization({mtproto:!0});i.storeObject(e,"Object");var a=t.generateID(),o=this.generateSeqNo(n.notContentRelated),s={msg_id:a,seq_no:o,body:i.getBytes()};return Config.Modes.debug&&console.log(dT(),"MT message",e,a,o),this.pushMessage(s,n)},u.prototype.wrapApiCall=function(e,n,i){var a=new TLSerialization(i);this.connectionInited||(a.storeInt(3667594509,"invokeWithLayer"),a.storeInt(Config.Schema.API.layer,"layer"),a.storeInt(1769565673,"initConnection"),a.storeInt(Config.App.id,"api_id"),a.storeString(navigator.userAgent||"Unknown UserAgent","device_model"),a.storeString(navigator.platform||"Unknown Platform","system_version"),a.storeString(Config.App.version,"app_version"),a.storeString(navigator.language||"en","lang_code")),i.afterMessageID&&(a.storeInt(3416209197,"invokeAfterMsg"),a.storeLong(i.afterMessageID,"msg_id")),i.resultType=a.storeMethod(e,n);var o=t.generateID(),s=this.generateSeqNo(),r={msg_id:o,seq_no:s,body:a.getBytes(!0),isAPI:!0};return Config.Modes.debug?console.log(dT(),"Api call",e,n,o,s,i):console.log(dT(),"Api call",e),this.pushMessage(r,i)},u.prototype.checkLongPoll=function(){var e=this.cleanupSent();if(this.longPollPending&&tsNow()t.sleepAfter)||t.sendLongPoll()})},u.prototype.sendLongPoll=function(){var e=25e3,t=this;this.longPollPending=tsNow()+e,this.wrapMtpCall("http_wait",{max_delay:0,wait_after:0,max_wait:e},{noResponse:!0,longPoll:!0}).then(function(){delete t.longPollPending,setZeroTimeout(t.checkLongPoll.bind(t))},function(){console.log("Long-poll failed")})},u.prototype.pushMessage=function(e,t){var n=r.defer();return this.sentMessages[e.msg_id]=angular.extend(e,t||{},{deferred:n}),this.pendingMessages[e.msg_id]=0,t&&t.noShedule||this.sheduleRequest(),angular.isObject(t)&&(t.messageID=e.msg_id),n.promise},u.prototype.pushResend=function(e,t){var n=t?tsNow()+t:0,i=this.sentMessages[e];if(i.container)for(var a=0;a=l){if(o=m.sentMessages[t]){var n=(o.body.byteLength||o.body.length)+32;if(!o.notContentRelated&&u)return;if(!o.notContentRelated&&r&&r+n>655360)return void(u=!0);if(o.singleInRequest&&(p++,p>1))return;s.push(o),r+=n,o.isAPI?c=!0:o.longPoll&&(d=!0)}delete m.pendingMessages[t]}}),c&&!d){var h=new TLSerialization({mtproto:!0});h.storeMethod("http_wait",{max_delay:0,wait_after:0,max_wait:1e3}),s.push({msg_id:t.generateID(),seq_no:this.generateSeqNo(),body:h.getBytes()})}if(s.length){var g=[];if(s.length>1){var f=new TLSerialization({mtproto:!0,startMaxLength:r+64});f.storeInt(1945237724,"CONTAINER[id]"),f.storeInt(s.length,"CONTAINER[count]");for(var v=[],n=0;n1)&&this.sheduleRequest()}},u.prototype.getEncryptedMessage=function(e){var t=this;return a.sha1Hash(e).then(function(n){var i=new Uint8Array(n).subarray(4,20);return t.getMsgKeyIv(i,!0).then(function(t){return a.aesEncrypt(e,t[0],t[1]).then(function(e){return{bytes:e,msgKey:i}})})})},u.prototype.getDecryptedMessage=function(e,t){return this.getMsgKeyIv(e,!1).then(function(e){return a.aesDecrypt(t,e[0],e[1])})},u.prototype.sendEncryptedRequest=function(t,n){var a=this;n=n||{};var l=new TLSerialization({startMaxLength:t.body.length+64});return l.storeIntBytes(this.serverSalt,64,"salt"),l.storeIntBytes(this.sessionID,64,"session_id"),l.storeLong(t.msg_id,"message_id"),l.storeInt(t.seq_no,"seq_no"),l.storeInt(t.body.length,"message_data_length"),l.storeRawBytes(t.body,"message_data"),this.getEncryptedMessage(l.getBuffer()).then(function(t){var l=new TLSerialization({startMaxLength:t.bytes.byteLength+256});l.storeIntBytes(a.authKeyID,64,"auth_key_id"),l.storeIntBytes(t.msgKey,128,"msg_key"),l.storeRawBytes(t.bytes,"encrypted_data");var c,d=b?l.getBuffer():l.getArray();try{n=angular.extend(n||{},{responseType:"arraybuffer",transformRequest:null}),c=s.post(e.chooseServer(a.dcID,a.upload),d,n)}catch(u){c=r.reject(u)}return c.then(function(e){return e.data&&e.data.byteLength?e:r.reject({code:406,type:"NETWORK_BAD_RESPONSE"})},function(e){return 404==e.status&&-1!=(e.data||"").indexOf("nginx/0.3.33")&&i.remove("dc"+a.dcID+"_server_salt","dc"+a.dcID+"_auth_key").then(function(){o.reload()}),e.message||e.type||(e={code:406,type:"NETWORK_BAD_REQUEST"}),r.reject(e)})})},u.prototype.parseResponse=function(e){var t=this,n=new TLDeserialization(e),i=n.fetchIntBytes(64,!1,"auth_key_id");if(!bytesCmp(i,this.authKeyID))throw new Error("Invalid server auth_key_id: "+bytesToHex(i));var o=n.fetchIntBytes(128,!0,"msg_key"),s=n.fetchRawBytes(e.byteLength-n.getOffset(),!0,"encrypted_data");return this.getDecryptedMessage(o,s).then(function(e){var n=new TLDeserialization(e,{mtproto:!0}),i=(n.fetchIntBytes(64,!1,"salt"),n.fetchIntBytes(64,!1,"session_id")),s=n.fetchLong("message_id"),r=n.fetchInt("seq_no"),l=n.fetchRawBytes(!1,!0,"message_data"),c=convertToUint8Array(e).subarray(0,n.getOffset());return a.sha1Hash(c).then(function(e){if(!bytesCmp(o,bytesFromArrayBuffer(e).slice(-16)))throw console.warn(o,bytesFromArrayBuffer(e)),new Error("server msgKey mismatch");var n=bytesToArrayBuffer(l),a={mtproto:!0,override:{mt_message:function(e,t){e.msg_id=this.fetchLong(t+"[msg_id]"),e.seqno=this.fetchInt(t+"[seqno]"),e.bytes=this.fetchInt(t+"[bytes]");var n=this.getOffset();try{e.body=this.fetchObject("Object",t+"[body]")}catch(i){console.error(dT(),"parse error",i.message,i.stack),e.body={_:"parse_error",error:i}}this.offset!=n+e.bytes&&(console.warn(dT(),"set offset",this.offset,n,e.bytes),this.offset=n+e.bytes)},mt_rpc_result:function(e,n){e.req_msg_id=this.fetchLong(n+"[req_msg_id]");var i=t.sentMessages[e.req_msg_id],a=i&&i.resultType||"Object";e.result=this.fetchObject(a,n+"[result]")}}},c=new TLDeserialization(n,a),d=c.fetchObject("","INPUT");return{response:d,messageID:s,sessionID:i,seqNo:r}})})},u.prototype.applyServerSalt=function(e){var t=longToBytes(e),n={};return n["dc"+this.dcID+"_server_salt"]=bytesToHex(t),i.set(n),this.serverSalt=t,!0},u.prototype.sheduleRequest=function(e){this.offline&&this.checkConnection("forced shedule");var t=tsNow()+e;return e&&this.nextReq&&this.nextReq<=t?!1:(l.cancel(this.nextReqPromise),e>0?this.nextReqPromise=l(this.performSheduledRequest.bind(this),e||0):setZeroTimeout(this.performSheduledRequest.bind(this)),void(this.nextReq=t))},u.prototype.ackMessage=function(e){this.pendingAcks.push(e),this.sheduleRequest(3e4)},u.prototype.reqResendMessage=function(e){console.log(dT(),"Req resend",e),this.pendingResends.push(e),this.sheduleRequest(100)},u.prototype.cleanupSent=function(){var e=this,t=!1;return angular.forEach(this.sentMessages,function(n,i){if(n.notContentRelated&&void 0===e.pendingMessages[i])delete e.sentMessages[i];else if(n.container){for(var a=0;as;s++)this.processMessage(e.messages[s],n,a);break;case"bad_server_salt":console.log(dT(),"Bad server salt",e);var r=this.sentMessages[e.bad_msg_id];if(!r||r.seq_no!=e.bad_msg_seqno)throw console.log(e.bad_msg_id,e.bad_msg_seqno),new Error("Bad server salt for invalid message");this.applyServerSalt(e.new_server_salt),this.pushResend(e.bad_msg_id),this.ackMessage(n);break;case"bad_msg_notification":console.log(dT(),"Bad msg notification",e);var r=this.sentMessages[e.bad_msg_id];if(!r||r.seq_no!=e.bad_msg_seqno)throw console.log(e.bad_msg_id,e.bad_msg_seqno),new Error("Bad msg notification for invalid message");if(16==e.error_code||17==e.error_code){t.applyServerTime(bigStringInt(n).shiftRight(32).toString(10))&&(console.log(dT(),"Update session"),this.updateSession());var l=this.updateSentMessage(e.bad_msg_id);this.pushResend(l.msg_id),this.ackMessage(n)}break;case"message":this.serverMessages.push(e.msg_id),this.processMessage(e.body,e.msg_id,a);break;case"new_session_created":this.ackMessage(n),this.processMessageAck(e.first_msg_id),this.applyServerSalt(e.server_salt);var c=this;i.get("dc").then(function(t){t==c.dcID&&!c.upload&&h&&h(e)});break;case"msgs_ack":for(var s=0;s5?"[.."+e.result.length+"..]":e.result),console.log(dT(),"Rpc response",f)}r.deferred.resolve(e.result)}r.isAPI&&(this.connectionInited=!0)}delete this.sentMessages[p]}break;default:this.ackMessage(n),h&&h(e)}},{getNetworker:function(e,t,n,i){return new u(e,t,n,i)},setUpdatesProcessor:function(e){h=e},stopAll:m,startAll:p}}]),angular.module("izhukov.mtproto.wrapper",["izhukov.utils","izhukov.mtproto"]).factory("MtpApiManager",["Storage","MtpAuthorizer","MtpNetworkerFactory","MtpSingleInstanceService","AppRuntimeManager","ErrorService","qSync","$q","TelegramMeWebService",function(e,t,n,i,a,o,s,r,l){function c(e){f!==e&&(f=e,l.setAuthorized(f))}function d(t,n){e.set({dc:t,user_auth:angular.extend({dcID:t},n)}),c(!0),b=t}function u(){for(var t=[],n=1;5>=n;n++)t.push("dc"+n+"_auth_key");return e.get.apply(e,t).then(function(n){for(var i=[],a=0;a0||!1),e.id||0})}function g(){return b||!1}var f,_={},v={},y={},b=!1;return i.start(),e.get("dc").then(function(e){e&&(b=e)}),{getBaseDcID:g,getUserID:h,invokeApi:m,getNetworker:p,setUserAuth:d,logOut:u}}]).factory("MtpApiFileManager",["MtpApiManager","$q","qSync","FileManager","IdbFileStorage","TmpfsFileStorage","MemoryFileStorage","WebpManager",function(e,t,n,i,a,o,s,r){function l(e,n,i){void 0===w[e]&&(w[e]=[],k[e]=0);var a=w[e],o=t.defer();return a.push({cb:n,deferred:o,activeDelta:i}),setZeroTimeout(function(){c(e)}),o.promise}function c(e){var t=w[e],n="upload"==e?11:5;if(k[e]>=n||!t||!t.length)return!1;var i=t.shift(),a=i.activeDelta||1;k[e]+=a;$++;i.cb().then(function(t){k[e]-=a,c(e),i.deferred.resolve(t)},function(t){k[e]-=a,c(e),i.deferred.reject(t)})}function d(e){switch(e._){case"inputVideoFileLocation":return"video"+e.id+".mp4";case"inputDocumentFileLocation":var t=(e.file_name||"").split(".",2),n=t[1]||"";return e.sticker&&!r.isWebpSupported()&&(n+=".png"),t.length?t[0]+"_"+e.id+"."+n:"doc"+e.id;case"inputAudioFileLocation":return"audio"+e.id;default:e.volume_id||console.trace("Empty location",e);var n="jpg";return e.sticker&&(n=r.isWebpSupported()?"webp":"png"),e.volume_id+"_"+e.local_id+"_"+e.secret+"."+n}}function u(e){if(!e)return!1;var t=d(e);return b[t]||!1}function p(){return o.isAvailable()?o:a.isAvailable()?a:s}function m(e,t){var n=d(e);return v[n]||(v[n]=p().saveFile(n,t).then(function(e){return b[n]=e})),v[n]}function h(a){if(!i.isAvailable())return t.reject({type:"BROWSER_BLOB_NOT_SUPPORTED"});var o=d(a),s=a.sticker?"image/webp":"image/jpeg",c=v[o]||y[o];if(c)return c;var u=p();return y[o]=u.getFile(o).then(function(e){return b[o]=e},function(){var t=l(a.dc_id,function(){var t=a;return t._&&"fileLocation"!=t._||(t=angular.extend({},a,{_:"inputFileLocation"})),e.invokeApi("upload.getFile",{location:t,offset:0,limit:1048576},{dcID:a.dc_id,fileDownload:!0,createNetworker:!0})}),c=function(e){return!a.sticker||r.isWebpSupported()?n.when(e):r.getPngBlobFromWebp(e)};return u.getFileWriter(o,s).then(function(e){return t.then(function(t){return c(t.bytes).then(function(t){return i.write(e,t).then(function(){return b[o]=e.finalize()})})})})})}function g(e,t){var n=p(),i=d(e);return n.getFile(i,t)}function f(a,o,s,c){if(!i.isAvailable())return t.reject({type:"BROWSER_BLOB_NOT_SUPPORTED"});c=c||{};var u=!1;o.sticker&&!r.isWebpSupported()&&(c.toFileEntry||s>524288?delete o.sticker:(u=!0,c.mime="image/png"));var m=d(o),h=c.toFileEntry||null,g=v[m]||y[m],f=p();if(g)return h?g.then(function(e){return i.copy(e,h)}):g;var _,w=t.defer(),k=!1,$=!1,S=c.mime||"image/jpeg",C=function(e){w.reject(e),C=angular.noop,!_||e&&"DOWNLOAD_CANCELED"==e.type||_.truncate(0)};return f.getFile(m,s).then(function(e){h?i.copy(e,h).then(function(){w.resolve()},C):w.resolve(b[m]=e)},function(){var c=h?i.getFileWriter(h):f.getFileWriter(m,S),d=function(e){return u?r.getPngBlobFromWebp(e):n.when(e)};c.then(function(n){_=n;var r,c,u=524288,p=0,g=t.when();if(n.length){if(p=n.length,p>=s)return void(h?w.resolve():w.resolve(b[m]=n.finalize()));n.seek(p),w.notify({done:p,total:s})}for(r=p;s>r;r+=u)c=t.defer(),function(r,c,p,g){return l(a,function(){return k?t.when():e.invokeApi("upload.getFile",{location:o,offset:c,limit:u},{dcID:a,fileDownload:!0,singleInRequest:void 0!==window.safari,createNetworker:!0})},2).then(function(e){g.then(function(){return k?t.when():d(e.bytes).then(function(e){return i.write(n,e).then(function(){p.resolve()},C).then(function(){r?($=!0,h?w.resolve():w.resolve(b[m]=n.finalize())):w.notify({done:c+u,total:s})})})})})}(r+u>=s,r,c,g),g=c.promise})}),w.promise.cancel=function(){k||$||(k=!0,delete y[m],C({type:"DOWNLOAD_CANCELED"}))},h||(y[m]=w.promise),w.promise}function _(n){var i=n.size,a=i>=10485760,o=!1,s=!1,r=0,c=262144,d=2;i>67108864?(c=524288,d=4):102400>i&&(c=32768,d=1);var u=Math.ceil(i/c);if(u>3e3)return t.reject({type:"FILE_TOO_BIG"});var p,m=[nextRandomInt(4294967295),nextRandomInt(4294967295)],h=t.defer(),g=function(e){h.reject(e),o=!0,g=angular.noop},f=0,_={_:a?"inputFileBig":"inputFile",id:m,parts:u,name:n.name,md5_checksum:""};for(p=0;i>p;p+=c)!function(p,f){l("upload",function(){var l=t.defer(),d=new FileReader,v=n.slice(p,p+c);return d.onloadend=function(t){return o?void l.reject():void(t.target.readyState==FileReader.DONE&&e.invokeApi(a?"upload.saveBigFilePart":"upload.saveFilePart",{file_id:m,file_part:f,file_total_parts:u,bytes:t.target.result},{startMaxLength:c+256,fileUpload:!0,singleInRequest:!0}).then(function(){r++,l.resolve(),r>=u?(h.resolve(_),s=!0):(console.log(dT(),"Progress",r*c/i),h.notify({done:r*c,total:i})) },g))},d.readAsArrayBuffer(v),l.promise},d)}(p,f++);return h.promise.cancel=function(){console.log("cancel upload",o,s),o||s||(o=!0,g({type:"UPLOAD_CANCELED"}))},h.promise}var v={},y={},b={},w={},k={},$=0;return{getCachedFile:u,getDownloadedFile:g,downloadFile:f,downloadSmallFile:h,saveSmallFile:m,uploadFile:_}}]).service("MtpSingleInstanceService",["_","$rootScope","$interval","Storage","AppRuntimeManager","IdleManager","ErrorService","MtpNetworkerFactory",function(e,t,n,i,a,o,s,r){function l(){if(!p&&!Config.Navigator.mobile&&!Config.Modes.packed){p=!0,o.start(),h=tsNow(),t.$watch("idle.isIDLE",d),n(d,5e3),d();try{$($window).on("beforeunload",c)}catch(e){}}}function c(){i.remove(m?"xt_instance":"xt_idle_instance")}function d(){var n=tsNow(),a=t.idle&&t.idle.isIDLE,o={id:u,idle:a,time:n};i.get("xt_instance","xt_idle_instance").then(function(t){var l=t[0],c=t[1];!l||l.timen-1e4&&n>g&&(s.alert(e("error_modal_warning_title_raw"),e("error_modal_multiple_open_tabs_raw")),g+=tsNow()+6e4)),i.set({xt_instance:o}),m||r.startAll(),m=!0):(i.set({xt_idle_instance:o}),m&&r.stopAll(),m=!1)})}var u=nextRandomInt(4294967295),p=!1,m=!1,h=tsNow(),g=0;return{start:l}}]),angular.module("myApp",["ngRoute","ngSanitize","ngTouch","ui.bootstrap","mediaPlayer","izhukov.utils","izhukov.mtproto","izhukov.mtproto.wrapper","myApp.filters","myApp.services","myApp.templates","myApp.directives","myApp.controllers"]).config(["$locationProvider","$routeProvider","$compileProvider","StorageProvider",function(e,t,n,i){n.imgSrcSanitizationWhitelist(/^\s*(https?|ftp|file|blob|filesystem|chrome-extension|app):|data:image\//),n.aHrefSanitizationWhitelist(/^\s*(https?|ftp|file|tg|mailto|blob|filesystem|chrome-extension|app):|data:/),Config.Modes.test&&i.setPrefix("t_"),t.when("/",{templateUrl:templateUrl("welcome"),controller:"AppWelcomeController"}),t.when("/login",{templateUrl:templateUrl("login"),controller:"AppLoginController"}),t.when("/im",{templateUrl:templateUrl("im"),controller:"AppIMController",reloadOnSearch:!1}),t.otherwise({redirectTo:"/"})}]),angular.module("myApp.services",["myApp.i18n","izhukov.utils"]).service("AppUsersManager",["$rootScope","$modal","$modalStack","$filter","$q","qSync","MtpApiFileManager","MtpApiManager","RichTextProcessor","ErrorService","Storage","_",function(e,t,n,i,a,o,s,r,l,c,d,u){function p(){return R?R:R=r.invokeApi("contacts.getContacts",{hash:""}).then(function(e){var t,n;L=[],_(e.users);for(var n=0;n0,contact:(2048&t.flags)>0,mutual:(4096&t.flags)>0,deleted:(8192&t.flags)>0,bot:(16384&t.flags)>0,botNoPrivacy:(32768&t.flags)>0,botNoGroups:(65536&t.flags)>0};var o=t.sortName.split(" "),s=o.shift(),r=o.pop();t.initials=s.charAt(0)+(r?r.charAt(0):s.charAt(1)),t.sortStatus=t.pFlags.bot?-1:y(t.status);var c=F[a];void 0===c?c=F[a]=t:safeReplaceObject(c,t),e.$broadcast("user_update",a),void 0!==j[a]&&safeReplaceObject(j[a],t&&t.photo&&t.photo.photo_small||{empty:!0})}}function y(e){if(e){var t=e.expires||e.was_online;if(t)return t;{tsNow(!0)+z}switch(e._){case"userStatusRecently":return tsNow(!0)+z-259200;case"userStatusLastWeek":return tsNow(!0)+z-604800;case"userStatusLastMonth":return tsNow(!0)+z-2592e3}}return 0}function b(e){return angular.isObject(e)?e:F[e]||{id:e,deleted:!0,num:1}}function w(){return b(B)}function k(e){return F[e]&&F[e].pFlags.bot}function $(e){return angular.isObject(F[e])}function S(e,t){var n=b(e);return 333e3==e?{placeholder:"img/placeholders/DialogListAvatarSystem@2x.png"}:(void 0===j[e]&&(j[e]=n&&n.photo&&n.photo.photo_small||{empty:!0}),{num:n.num,placeholder:"img/placeholders/"+t+"Avatar"+n.num+"@2x.png",location:j[e]})}function C(e){var t=b(e);return"u"+e+(t.access_hash?"_"+t.access_hash:"")}function M(e){var t=b(e);return t.pFlags.self?{_:"inputUserSelf"}:{_:"inputUser",user_id:e,access_hash:t.access_hash||0}}function x(){var t=tsNow(!0)+z;angular.forEach(F,function(n){n.status&&"userStatusOnline"==n.status._&&n.status.expires=1e3?void o.resolve(s):void this["continue"]()},t.onerror=function(e){console.log("phonebook error",e,e.type,e.message),o.reject(e)},o.promise}return{isAvailable:a,openPhonebookImport:o,getPhonebookContacts:s}}]).service("AppChatsManager",["$q","$rootScope","$modal","_","MtpApiFileManager","MtpApiManager","AppUsersManager","AppPhotosManager","RichTextProcessor",function(e,t,n,i,a,o,s,r,l){function c(e){angular.forEach(e,d)}function d(e){if(angular.isObject(e)){e.rTitle=l.wrapRichText(e.title,{noLinks:!0,noLinebreaks:!0})||i("chat_title_deleted");var n=SearchIndexManager.cleanSearchText(e.title||"").split(" "),a=n.shift(),o=n.pop();e.initials=a.charAt(0)+(o?o.charAt(0):a.charAt(1)),e.num=Math.abs(e.id>>1)%(Config.Mobile?4:8)+1,void 0===y[e.id]?y[e.id]=e:(safeReplaceObject(y[e.id],e),t.$broadcast("chat_update",e.id)),void 0!==k[e.id]&&safeReplaceObject(k[e.id],e&&e.photo&&e.photo.photo_small||{empty:!0})}}function u(e){return y[e]||{id:e,deleted:!0}}function p(n){return void 0===b[n]||y[n].version!=b[n].participants.version&&!y[n].left?void 0!==w[n]?w[n]:w[n]=o.invokeApi("messages.getFullChat",{chat_id:n}).then(function(e){return c(e.chats),s.saveApiUsers(e.users),e.full_chat&&e.full_chat.chat_photo.id&&r.savePhoto(e.full_chat.chat_photo),delete w[n],t.$broadcast("chat_full_update",n),b[n]=e.full_chat}):e.when(b[n])}function m(e,t){return p(e).then(function(n){return!t&&n.exported_invite&&"chatInviteExported"==n.exported_invite._?n.exported_invite.link:o.invokeApi("messages.exportChatInvite",{chat_id:e}).then(function(t){return void 0!==b[e]&&(b[e].exported_invite=t),t.link})})}function h(e){return angular.isObject(y[e])}function g(e,t){var n=u(e);return void 0===k[e]&&(k[e]=n&&n.photo&&n.photo.photo_small||{empty:!0}),{placeholder:"img/placeholders/"+t+"Avatar"+(Config.Mobile?n.num:Math.ceil(n.num/2))+"@2x.png",location:k[e]}}function f(e){u(e);return"g"+e}function _(e,t){var n=angular.copy(t),i=u(e);return n.participants&&"chatParticipants"==n.participants._&&o.getUserID().then(function(e){n.isAdmin=e==n.participants.admin_id,angular.forEach(n.participants.participants,function(t){t.user=s.getUser(t.user_id),t.canLeave=e==t.user_id,t.canKick=!t.canLeave&&(n.isAdmin||e==t.inviter_id)})}),n.thumb={placeholder:"img/placeholders/GroupAvatar"+(Config.Mobile?i.num:Math.ceil(i.num/2))+"@2x.png",location:i&&i.photo&&i.photo.photo_small,width:72,height:72,size:0},n.peerString=f(e),n.chat=i,n}function v(e){var i=t.$new();i.chatID=e;n.open({templateUrl:templateUrl("chat_modal"),controller:"ChatModalController",scope:i,windowClass:"chat_modal_window mobile_modal"})}var y={},b={},w={},k={};return t.$on("apiUpdate",function(e,n){switch(n._){case"updateChatParticipants":var i=n.participants,a=b[i.id];void 0!==a&&(a.participants=n.participants,t.$broadcast("chat_full_update",chatID));break;case"updateChatParticipantAdd":var a=b[n.chat_id];if(void 0!==a){for(var i=a.participants.participants||[],o=0,s=i.length;s>o;o++)if(i[o].user_id==n.user_id)return;i.push({_:"chatParticipant",user_id:n.user_id,inviter_id:n.inviter_id,date:tsNow(!0)}),a.participants.version=n.version,t.$broadcast("chat_full_update",n.chat_id)}break;case"updateChatParticipantDelete":var a=b[n.chat_id];if(void 0!==a)for(var i=a.participants.participants||[],o=0,s=i.length;s>o;o++)if(i[o].user_id==n.user_id)return i.splice(o,1),a.participants.version=n.version,void t.$broadcast("chat_full_update",n.chat_id)}}),{saveApiChats:c,saveApiChat:d,getChat:u,getChatFull:p,getChatPhoto:g,getChatString:f,getChatInviteLink:m,hasChat:h,wrapForFull:_,openChat:v}}]).service("AppPeersManager",["AppUsersManager","AppChatsManager","MtpApiManager",function(e,t){return{getInputPeer:function(e){var t="u"==e.charAt(0),n=e.substr(1).split("_");return t?{_:"inputPeerUser",user_id:n[0],access_hash:n[1]}:{_:"inputPeerChat",chat_id:n[0]}},getInputPeerByID:function(t){return t>0?{_:"inputPeerUser",user_id:t,access_hash:e.getUser(t).access_hash||0}:0>t?{_:"inputPeerChat",chat_id:-t}:void 0},getPeerSearchText:function(n){var i;if(n>0)i="%pu "+e.getUserSearchText(n);else if(0>n){var a=t.getChat(-n);i="%pg "+(a.title||"")}return i},getPeerString:function(n){return n>0?e.getUserString(n):t.getChatString(-n)},getOutputPeer:function(e){return e>0?{_:"peerUser",user_id:e}:{_:"peerChat",chat_id:-e}},getPeerID:function(e){if(angular.isObject(e))return e.user_id?e.user_id:-e.chat_id;var t="u"==e.charAt(0),n=e.substr(1).split("_");return t?n[0]:-n[0]||0},getPeer:function(n){return n>0?e.getUser(n):t.getChat(-n)},getPeerPhoto:function(n,i,a){return n>0?e.getUserPhoto(n,i):t.getChatPhoto(-n,a)}}}]).service("AppProfileManager",["$q","AppUsersManager","AppChatsManager","AppPhotosManager","NotificationsManager","MtpApiManager","RichTextProcessor",function(e,t,n,i,a,o,s){function r(e){var t=e&&e.user_id;if(!t)return!1;var n={};return angular.forEach(e.commands,function(e){n[e.command]=e.description}),d[t]={id:t,version:e.version,shareText:e.share_text,description:e.description,rAbout:s.wrapRichText(e.share_text,{noLinebreaks:!0}),commands:n}}function l(e,n){return o.invokeApi("users.getFullUser",{id:t.getUserInput(e)}).then(function(o){return n&&n.phone_number?(o.user.phone=n.phone_number,(n.first_name||n.last_name)&&(o.user.first_name=n.first_name,o.user.last_name=n.last_name),t.saveApiUser(o.user)):t.saveApiUser(o.user,!0),i.savePhoto(o.profile_photo,{user_id:e}),a.savePeerSettings(e,o.notify_settings),o.bot_info=r(o.bot_info),o})}function c(i){var a=[];return i>=0?t.isBot(i)?l(i).then(function(e){var t=e.bot_info;return t&&"botInfoEmpty"!=t._&&a.push(t),a}):e.when(a):n.getChatFull(-i).then(function(e){return angular.forEach(e.bot_info,function(e){a.push(r(e))}),a})}var d={};return{getProfile:l,getPeerBots:c}}]).service("AppMessagesManager",["$q","$rootScope","$location","$filter","$timeout","$sce","ApiUpdatesManager","AppUsersManager","AppChatsManager","AppPeersManager","AppPhotosManager","AppVideoManager","AppDocsManager","AppAudioManager","AppWebPagesManager","MtpApiManager","MtpApiFileManager","RichTextProcessor","NotificationsManager","PeersSelectService","Storage","AppProfileManager","FileManager","TelegramMeWebService","ErrorService","StatusManager","_",function(e,t,n,i,a,o,s,r,l,c,d,u,p,m,h,g,f,_,v,y,b,w,k,$,S,C,M){function x(n,i,a){var o=mt;if(angular.isString(n)&&n.length){if(!a||bt.query!==n){bt.query=n;var s=SearchIndexManager.search(n,yt);bt.dialogs=[],angular.forEach(mt.dialogs,function(e){s[e.peerID]&&bt.dialogs.push(e)}),bt.count=bt.dialogs.length}o=bt}else bt.query=!1;var d=0;if(i>0)for(d=0;do.dialogs[d].top_message);d++);return null!==o.count&&o.dialogs.length==o.count||o.dialogs.length>=d+(a||1)?e.when({count:o.count,dialogs:o.dialogs.slice(d,d+(a||20))}):(a=a||20,g.invokeApi("messages.getDialogs",{offset:d,limit:a,max_id:i||0}).then(function(e){if($.setAuthorized(!0),r.saveApiUsers(e.users),l.saveApiChats(e.chats),q(e.messages),i>0)for(d=0;do.dialogs[d].top_message);d++);return o.count=e.count||e.dialogs.length,!i&&o.dialogs.length&&it(o.dialogs[0].top_message),o.dialogs.splice(d,o.dialogs.length-d),angular.forEach(e.dialogs,function(e){var n=c.getPeerID(e.peer),i=c.getPeerSearchText(n);if(SearchIndexManager.indexObject(n,i,yt),o.dialogs.push({peerID:n,top_message:e.top_message,unread_count:e.unread_count}),void 0===pt[n]){var a={count:null,history:[e.top_message],pending:[]};pt[n]=a;var s=U(e.top_message);P(a,s)&&t.$broadcast("history_reply_markup",{peerID:n})}if(v.savePeerSettings(n,e.notify_settings),e.unread_count>0&&Et&&e.top_message>Et){var s=U(e.top_message),r=16&s.flags?s.from_id:n;s.unread&&!s.out&&v.getPeerMuted(r).then(function(e){e||at(s)})}}),{count:o.count,dialogs:o.dialogs.slice(d,d+a)}}))}function A(e,t,n,i){return g.invokeApi("messages.getHistory",{peer:e,offset:i||0,limit:n||0,max_id:t||0},{noErrorBox:!0}).then(function(t){r.saveApiUsers(t.users),l.saveApiChats(t.chats),q(t.messages);var i=c.getPeerID(e);return 0>i||!r.isBot(i)||t.messages.length==n&&n0)for(s=0;sa.history[s]);s++);return a.history.splice(s,a.history.length-s),angular.forEach(o.messages,function(n){P(a,n)&&t.$broadcast("history_reply_markup",{peerID:c.getPeerID(e)}),a.history.push(n.id)}),i-=o.messages.length,i>0&&a.history.length0)for(l=!0,r=0;rs.history[r]){l=!1;break}}else{var p=nt(o);if(p&&p[0]&&p[0].unread_count>1){var m=p[0].unread_count;(u=m>50)?(n=20,d=16,r=m-d):(n=Math.max(10,a,m+2),d=m)}else Config.Mobile&&(n=20)}if(!l&&(null!==s.count&&s.history.length==s.count||s.history.length>=r+(n||1))){i?(i=Math.min(r,i),r=Math.max(0,r-i),n+=i):n=n||(r?20:a||5);var h=s.history.slice(r,r+n);return!t&&s.pending.length&&(h=s.pending.slice().concat(h)),T(o,{count:s.count,history:h,unreadOffset:d,unreadSkip:u})}return i||n||(n=a||20),l&&(r=0),i||u||t&&-1==s.history.indexOf(t)?(i&&(r=-i,n+=i),A(e,t,n,r).then(function(e){s.count=e.count||e.messages.length;var n=[];return angular.forEach(e.messages,function(e){n.push(e.id)}),!t&&s.pending.length&&(n=s.pending.slice().concat(n)),T(o,{count:s.count,history:n,unreadOffset:d,unreadSkip:u})})):E(e,t,n,s).then(function(){if(r=0,t>0)for(r=0;rs.history[r]);r++);var e=s.history.slice(r,r+n);return!t&&s.pending.length&&(e=s.pending.slice().concat(e)),T(o,{count:s.count,history:e,unreadOffset:d,unreadSkip:u})})}function D(e){return(pt[e]||{}).reply_markup||!1}function P(e,t){if(!t.reply_markup&&!t.out&&!t.action)return!1;var n=t.reply_markup,i=e.reply_markup;if(n)return i&&i.id>=t.id?!1:!n.pFlags.selective||16&t.flags?(e.maxOutID&&t.idi.id||t.id<0)&&t.message)return i.pFlags.hidden=!0,!0}else(!e.maxOutID||t.id>e.maxOutID)&&(e.maxOutID=t.id);return t.action&&"messageActionChatDeleteUser"==t.action._&&(i?t.action.user_id==i.fromID:r.isBot(t.action.user_id))?(e.reply_markup={_:"replyKeyboardHide",id:t.id,flags:0,pFlags:{}},!0):!1}function N(t,n,i,a,o){var s=[],d=!n,u=c.getPeerID(t),p={peer:u,filter:i},m=d&&angular.equals(wt,p);if(d&&!m&&(wt=p,kt=[]),!a&&!n){var h=pt[u];if(void 0!==h&&h.history.length){var f,_,v={},y=o||20;switch(i._){case"inputMessagesFilterPhotos":v.messageMediaPhoto=!0;break;case"inputMessagesFilterVideo":v.messageMediaVideo=!0;break;case"inputMessagesFilterPhotoVideo":v.messageMediaPhoto=!0,v.messageMediaVideo=!0;break;case"inputMessagesFilterDocument":v.messageMediaDocument=!0;break;case"inputMessagesFilterAudio":v.messageMediaAudio=!0}for(f=0;f=y)));f++);}if(s.length=y));f++);}return s.length||1e3==o?(d&&(kt=listMergeSorted(kt,s)),e.when({count:null,history:s})):g.invokeApi("messages.search",{peer:t,q:n||"",filter:i||{_:"inputMessagesFilterEmpty"},min_date:0,max_date:0,limit:o||20,max_id:a||0}).then(function(e){r.saveApiUsers(e.users),l.saveApiChats(e.chats),q(e.messages);var t=e.count||e.messages.length;return s=[],angular.forEach(e.messages,function(e){s.push(e.id)}),d&&(kt=listMergeSorted(kt,s)),{count:t,history:s}},function(t){return 400==t.code&&(t.handled=!0),e.reject(t)})}function U(e){return ct[e]||{deleted:!0}}function O(e){return g.invokeApi("messages.deleteMessages",{id:e}).then(function(t){return s.processUpdateMessage({_:"updateShort",update:{_:"updateDeleteMessages",messages:e,pts:t.pts,pts_count:t.pts_count}}),e})}function R(t,n,i){return s.processUpdateMessage({_:"updateShort",update:{_:"updatePts",pts:n.pts,pts_count:n.pts_count}}),n.offset?g.invokeApi(i,{peer:t,offset:n.offset,max_id:0}).then(function(e){return R(t,e,i)}):e.when()}function L(e){var n=c.getPeerID(e),i=pt[n],a=nt(n);if(!a[0]||!a[0].unread_count){if(!i||!i.history.length)return!1;var o,s,r=!1;for(l=i.history.length;l>=0;l--)if(o=i.history[l],s=ct[o],s&&!s.out&&s.unread){r=!0;break}if(!r)return!1}if(i.readPromise)return i.readPromise;if(i.readPromise=g.invokeApi("messages.readHistory",{peer:e,offset:0,max_id:0}).then(function(t){return R(e,t,"messages.readHistory")}).then(function(){a[0]&&(a[0].unread_count=0,t.$broadcast("dialog_unread",{peerID:n,count:0}),t.$broadcast("messages_read"))})["finally"](function(){delete i.readPromise}),i&&i.history.length){var o,s,l,n,a;for(l=0;l0,one_time:(2&e.reply_markup.flags)>0,selective:(4&e.reply_markup.flags)>0})})}function j(e,n,i){if(angular.isString(n)&&n.length){i=i||{};var a,o=vt--,l=[nextRandomInt(4294967295),nextRandomInt(4294967295)],d=bigint(l[0]).shiftLeft(32).add(bigint(l[1])).toString(),u=pt[e],p=c.getInputPeerByID(e),m=0,h=i.replyToMsgID;void 0===u&&(u=pt[e]={count:null,history:[],pending:[]}),g.getUserID().then(function(i){e!=i&&(m|=2,r.isBot(e)||(m|=1)),h&&(m|=8),a={_:"message",id:o,from_id:i,to_id:c.getOutputPeer(e),flags:m,date:tsNow(!0)+Ct,message:n,random_id:d,reply_to_msg_id:h,pending:!0};var f=function(e){var n=dt[o];e?(a.error=!0,n&&(n.error=!0)):(delete a.error,n&&delete n.error),t.$broadcast("messages_pending")};a.send=function(){f(!1);var t={};ft[e]&&(t.afterMessageID=ft[e].messageID);var i=0;h&&(i|=1),g.invokeApi("messages.sendMessage",{flags:i,peer:p,message:n,random_id:l,reply_to_msg_id:h},t).then(function(e){a.date=e.date,a.id=e.id,a.media=e.media,s.processUpdateMessage({_:"updates",users:[],chats:[],seq:0,updates:[{_:"updateMessageID",random_id:d,id:e.id},{_:"updateNewMessage",message:a,pts:e.pts,pts_count:e.pts_count}]})},function(){f(!0)})["finally"](function(){ft[e]===t&&delete ft[e]}),ft[e]=t},q([a]),u.pending.unshift(o),t.$broadcast("history_append",{peerID:e,messageID:o,my:!0}),a.send()}),ht[d]=[e,o]}}function H(n,i,a){a=a||{};var o,l,d=vt--,u=[nextRandomInt(4294967295),nextRandomInt(4294967295)],p=bigint(u[0]).shiftLeft(32).add(bigint(u[1])).toString(),m=pt[n],h=c.getInputPeerByID(n),_=0,v=a.replyToMsgID;a.isMedia?["image/jpeg","image/png","image/bmp"].indexOf(i.type)>=0?(o="photo",l="photo."+i.type.split("/")[1]):"audio/"==i.type.substr(0,6)||["video/ogg"].indexOf(i.type)>=0?(o="audio",l="audio."+("ogg"==i.type.split("/")[1]?"ogg":"mp3")):"video/"==i.type.substr(0,6)?(o="video",l="video.mp4"):(o="document",l="document."+i.type.split("/")[1]):(o="document",l="document."+i.type.split("/")[1]),void 0===m&&(m=pt[n]={count:null,history:[],pending:[]}),g.getUserID().then(function(a){n!=a&&(_|=2,r.isBot(n)||(_|=1)),v&&(_|=8);var y,b={_:"messageMediaPending",type:o,file_name:i.name||l,size:i.size,progress:{percent:1,total:i.size}},w={_:"message",id:d,from_id:a,to_id:c.getOutputPeer(n),flags:_,date:tsNow(!0)+Ct,message:"",media:b,random_id:p,reply_to_msg_id:v,pending:!0},k=function(e){var n=dt[d];e?(w.error=!0,n&&(n.error=!0)):(delete w.error,n&&delete n.error),t.$broadcast("messages_pending")},$=!1;w.send=function(){var a=e.defer();_t.then(function(){(!$||w.error)&&($=!1,y=f.uploadFile(i)),y.then(function(e){e.name=l,$=!0;var t;switch(o){case"photo":t={_:"inputMediaUploadedPhoto",file:e};break;case"video":t={_:"inputMediaUploadedVideo",file:e,duration:0,w:0,h:0,mime_type:i.type};break;case"audio":t={_:"inputMediaUploadedAudio",file:e,duration:0,mime_type:i.type};break;case"document":default:t={_:"inputMediaUploadedDocument",file:e,mime_type:i.type,attributes:[{_:"documentAttributeFilename",file_name:i.name}]}}var n=0;v&&(n|=1),g.invokeApi("messages.sendMedia",{flags:n,peer:h,media:t,random_id:u,reply_to_msg_id:v}).then(function(e){s.processUpdateMessage(e)},function(e){return"photo"==o&&400==e.code&&"PHOTO_INVALID_DIMENSIONS"==e.type?(e.handled=!0,o="document",void w.send()):void k(!0)})},function(){k(!0)},function(e){b.progress.done=e.done,b.progress.percent=Math.max(1,Math.floor(100*e.done/e.total)),t.$broadcast("history_update",{peerID:n})}),b.progress.cancel=function(){$||(a.resolve(),y.cancel(),G(p))},y["finally"](function(){a.resolve()})}),_t=a.promise},q([w]),m.pending.unshift(d),t.$broadcast("history_append",{peerID:n,messageID:d,my:!0}),w.send()}),ht[p]=[n,d]}function z(e,n,i){i=i||{};var a=vt--,o=[nextRandomInt(4294967295),nextRandomInt(4294967295)],l=bigint(o[0]).shiftLeft(32).add(bigint(o[1])).toString(),u=pt[e],m=c.getInputPeerByID(e),h=i.replyToMsgID;void 0===u&&(u=pt[e]={count:null,history:[],pending:[]}),g.getUserID().then(function(i){var f;switch(n._){case"inputMediaContact":f=angular.extend({},n,{_:"messageMediaContact"});break;case"inputMediaPhoto":f={_:"messageMediaPhoto",photo:d.getPhoto(n.id.id)};break;case"inputMediaDocument":f={_:"messageMediaDocument",document:p.getDoc(n.id.id)}}var _=0;e!=i&&(_|=2,r.isBot(e)||(_|=1));var v={_:"message",id:a,from_id:i,to_id:c.getOutputPeer(e),flags:_,date:tsNow(!0)+Ct,message:"",media:f,random_id:l,pending:!0},y=function(e){var n=dt[a];e?(v.error=!0,n&&(n.error=!0)):(delete v.error,n&&delete n.error),t.$broadcast("messages_pending")};v.send=function(){var e=0;h&&(e|=1),g.invokeApi("messages.sendMedia",{flags:e,peer:m,media:n,random_id:o,reply_to_msg_id:h}).then(function(e){s.processUpdateMessage(e)},function(){y(!0)})},q([v]),u.pending.unshift(a),t.$broadcast("history_append",{peerID:e,messageID:a,my:!0}),v.send()}),ht[l]=[e,a]}function V(e,t){t=t.sort();for(var n,i=[],n=(t.length,0);ni;i++)if(n=e.updates[i],"updateNewMessage"==n._){t.$broadcast("history_focus",{peerString:l.getChatString(n.message.to_id.chat_id)});break}})})})}function Z(e){var t=e.to_id&&c.getPeerID(e.to_id)||0;return 0>t?t:e.out||2&e.flags?t:e.from_id}function X(e,t){var n=-1!=t;if(n&&void 0!==ut[e])return ut[e];var i=angular.copy(ct[e]);return i&&i.to_id?((i.chatID=i.to_id.chat_id)?(i.peerID=-i.chatID,i.peerData=l.getChat(i.chatID)):(i.peerID=i.out?i.to_id.user_id:i.from_id,i.peerData=r.getUser(i.peerID)),i.peerString=c.getPeerString(i.peerID),i.peerPhoto=c.getPeerPhoto(i.peerID,"User","Group"),i.unreadCount=t,"messageService"==i._&&i.action.user_id&&(i.action.user=r.getUser(i.action.user_id)),i.message&&i.message.length&&(i.richMessage=_.wrapRichText(i.message.substr(0,64),{noLinks:!0,noLinebreaks:!0})),i.dateText=Tt(i.date),n&&(ut[e]=i),i):i}function J(e){if(void 0!==dt[e])return dt[e];var t=angular.copy(ct[e])||{id:e};t.media&&void 0!==t.media.progress&&(t.media.progress=ct[e].media.progress);var n=r.getUser(t.from_id),i=n.pFlags.bot&&n.username||!1,a=i||t.to_id&&(t.to_id.chat_id||t.to_id.user_id&&r.isBot(t.to_id.user_id)); if(t.media)switch(t.media.caption&&t.media.caption.length&&(t.media.rCaption=_.wrapRichText(t.media.caption,{noCommands:!a,fromBot:i})),t.media._){case"messageMediaPhoto":t.media.photo=d.wrapForHistory(t.media.photo.id);break;case"messageMediaVideo":t.media.video=u.wrapForHistory(t.media.video.id);break;case"messageMediaDocument":t.media.document=p.wrapForHistory(t.media.document.id);break;case"messageMediaAudio":t.media.audio=m.wrapForHistory(t.media.audio.id);break;case"messageMediaGeo":var s="https://maps.google.com/?q="+t.media.geo.lat+","+t.media.geo["long"];t.media.mapUrl=o.trustAsResourceUrl(s);break;case"messageMediaVenue":var s;s="foursquare"==t.media.provider&&t.media.venue_id?"https://foursquare.com/v/"+encodeURIComponent(t.media.venue_id):"https://maps.google.com/?q="+t.media.geo.lat+","+t.media.geo["long"],t.media.mapUrl=o.trustAsResourceUrl(s);break;case"messageMediaContact":t.media.rFullName=_.wrapRichText(t.media.first_name+" "+(t.media.last_name||""),{noLinks:!0,noLinebreaks:!0});break;case"messageMediaWebPage":if(!t.media.webpage||"webPageEmpty"==t.media.webpage._||Config.Mobile){delete t.media;break}t.media.webpage=h.wrapForHistory(t.media.webpage.id)}else if(t.action)switch(t.action._){case"messageActionChatEditPhoto":t.action.photo=d.wrapForHistory(t.action.photo.id);break;case"messageActionChatCreate":case"messageActionChatEditTitle":t.action.rTitle=_.wrapRichText(t.action.title,{noLinks:!0,noLinebreaks:!0})||M("chat_title_deleted");break;case"messageActionBotIntro":t.action.rDescription=_.wrapRichText(t.action.description,{noCommands:!a,fromBot:i})}var l=t.reply_to_msg_id;if(l&&(ct[l]?t.reply_to_msg=X(l):(t.reply_to_msg={id:l,loading:!0},-1==$t.indexOf(l)&&($t.push(l),St===!1&&(St=setTimeout(et,100))))),t.message&&t.message.length){var c={noCommands:!a,fromBot:i};if(Config.Navigator.mobile||(c.extractUrlEmbed=!0),16&t.flags){var g=r.getSelf();g&&(c.highlightUsername=g.username)}t.richMessage=_.wrapRichText(t.message,c),c.extractedUrlEmbed&&(t.richUrlEmbed=c.extractedUrlEmbed)}return dt[e]=t}function Q(e){if(!e||"replyKeyboardHide"==e._)return!1;if(e.wrapped)return e;var t=e.rows&&e.rows.length||0;return t>0&&4>=t&&!e.pFlags.resize&&(e.splitCount=t),e.wrapped=!0,angular.forEach(e.rows,function(e){angular.forEach(e.buttons,function(e){e.rText=_.wrapRichText(e.text,{noLinks:!0,noLinebreaks:!0})})}),nextRandomInt(1)&&(e.rows=e.rows.slice(0,2)),e}function et(){if(St!==!1&&(clearTimeout(St),St=!1),$t.length){var e=$t.slice();$t=[],g.invokeApi("messages.getMessages",{id:e}).then(function(n){r.saveApiUsers(n.users),l.saveApiChats(n.chats),q(n.messages),t.$broadcast("messages_downloaded",e)})}}function tt(e,t){if(!e||!e.length)return!1;var n,i,a,o,s,r,l,c=0,d=e.length,u=d,p=!1,m=!Config.Mobile;for(t>0?u=Math.min(t,d):0>t&&(c=Math.max(0,u+t)),n=c;u>n;n++){if(o=e[n],i=Math.floor((o.date+lt)/86400),l=s&&s.grouped,r=o.grouped,i===a?o.needDate&&(delete o.needDate,p=!0):(!n||s)&&(o.needDate||(o.needDate=!0,p=!0)),o.fwd_from_id&&o.media&&o.media.document&&o.media.document.sticker&&(o.from_id!=(s||{}).from_id||!(s||{}).fwd_from_id)&&(delete o.fwd_from_id,o._="message"),s&&o.from_id==s.from_id&&!s.fwd_from_id==!o.fwd_from_id&&!s.action&&!o.action&&o.dateEt&&b.set({max_seen_msg:e})}function at(e,n){n=n||{};var i,a,o=Z(e),s=r.getUser(e.from_id),c=r.getUserPhoto(e.from_id,"User"),d={},u=!1,p=v.getNotifySettings();if(e.fwd_from_id&&n.fwd_count)u=It(n.fwd_count);else if(e.message)u=p.nopreview?M("conversation_message_sent"):_.wrapPlainText(e.message);else if(e.media)switch(e.media._){case"messageMediaPhoto":u=M("conversation_media_photo_raw");break;case"messageMediaVideo":u=M("conversation_media_video_raw");break;case"messageMediaDocument":if(e.media.document.sticker){u=M("conversation_media_sticker");var m=e.media.document.stickerEmojiRaw;void 0!==m&&(u=_.wrapPlainText(m)+" ("+u+")")}else u=e.media.document.file_name||M("conversation_media_document_raw");break;case"messageMediaAudio":u=M("conversation_media_audio_raw");break;case"messageMediaGeo":case"messageMediaVenue":u=M("conversation_media_location_raw");break;case"messageMediaContact":u=M("conversation_media_contact_raw");break;default:u=M("conversation_media_attachment_raw")}else if("messageService"==e._)switch(e.action._){case"messageActionChatCreate":u=M("conversation_group_created_raw");break;case"messageActionChatEditTitle":u=M("conversation_group_renamed_raw");break;case"messageActionChatEditPhoto":u=M("conversation_group_photo_updated_raw");break;case"messageActionChatDeletePhoto":u=M("conversation_group_photo_removed_raw");break;case"messageActionChatAddUser":u=M(e.action.user_id==e.from_id?"conversation_returned_to_group":"conversation_invited_user_message_raw");break;case"messageActionChatDeleteUser":u=M(e.action.user_id==e.from_id?"conversation_left_group":"conversation_kicked_user_message_raw");break;case"messageActionChatJoinedByLink":u=M("conversation_joined_by_link")}o>0?(d.title=(s.first_name||"")+(s.first_name&&s.last_name?" ":"")+(s.last_name||""),d.title||(d.title=s.phone||M("conversation_unknown_user_raw")),a=c,i=r.getUserString(o)):(d.title=(s.first_name||s.last_name||M("conversation_unknown_user_raw"))+" @ "+(l.getChat(-o).title||M("conversation_unknown_chat_raw")),a=l.getChatPhoto(-o,"Group"),i=l.getChatString(-o)),d.title=_.wrapPlainText(d.title),d.onclick=function(){t.$broadcast("history_focus",{peerString:i,messageID:16&e.flags?e.id:0})},d.message=u,d.image=a.placeholder,d.key="msg"+e.id,d.tag=i,a.location&&!a.location.empty?f.downloadSmallFile(a.location,a.size).then(function(t){d.image=k.getUrl(t,"image/jpeg"),e.unread&&v.notify(d)}):v.notify(d)}function ot(){a.cancel(Dt),Dt=!1,t.$broadcast("history_multiappend",Pt),Pt={}}function st(){a.cancel(Nt),Nt=!1,t.$broadcast("dialogs_multiupdate",Ut),Ut={}}function rt(){a.cancel(Ot),Ot=!1;var e=t.idle.isIDLE&&C.isOtherDeviceActive()?3e4:1e3;angular.forEach(Rt,function(t){t.isMutedPromise.then(function(n){var i=t.top_message;!n&&i.unread&&setTimeout(function(){i.unread&&at(i,{fwd_count:t.fwd_count})},e)})}),Rt={}}var lt,ct={},dt={},ut={},pt={},mt={count:null,dialogs:[]},ht={},gt={},ft={},_t=e.when(),vt=-1,yt=SearchIndexManager.createIndex(),bt={query:!1},wt={},kt=[],$t=[],St=!1,Ct=0,Mt=tsNow(!0),xt=Mt-Mt%86400,At=new Date;b.get("server_time_offset").then(function(e){e&&(Ct=e)});var Et=!1;Config.Modes.packed&&b.get("max_seen_msg").then(function(e){Et=e||0});var Tt=i("dateOrTime"),It=M.pluralize("conversation_forwarded_X_messages");At.setHours(0),At.setMinutes(0),At.setSeconds(0),lt=xt-Math.floor(+At/1e3),v.start(),window.navigator.mozSetMessageHandler&&window.navigator.mozSetMessageHandler("activity",function(e){var n=e.source;console.log(dT(),"Received activity",n.name,n.data),"share"===n.name&&n.data.blobs.length>0&&y.selectPeers({confirm_type:"EXT_SHARE_PEER"}).then(function(e){angular.forEach(e,function(e){var t=c.getPeerID(e);angular.forEach(n.data.blobs,function(e){H(t,e,{isMedia:!0})})}),1==e.length&&t.$broadcast("history_focus",{peerString:e[0]})})});var Dt=!1,Pt={},Nt=!1,Ut={},Ot=!1,Rt={};return t.$on("apiUpdate",function(e,n){switch(n._){case"updateMessageID":gt[n.id]=n.random_id;break;case"updateNewMessage":var i=n.message,o=Z(i),s=pt[o];if(void 0!==s){var l=s.history;if(-1!=l.indexOf(i.id))return!1;var d=l[0];l.unshift(i.id),i.id>0&&i.id0&&(mt.dialogs.splice(h[1],1),mt.dialogs.unshift(m)),m.top_message=i.id,g&&m.unread_count++):(SearchIndexManager.indexObject(o,c.getPeerSearchText(o),yt),m={peerID:o,unread_count:g?1:0,top_message:i.id},mt.dialogs.unshift(m)),Ut[o]=m,Nt||(Nt=a(st,0)),g&&(t.selectedPeerID!=o||t.idle.isIDLE)){var f=16&i.flags?i.from_id:o,_=Rt[f];void 0===_&&(_=Rt[f]={isMutedPromise:v.getPeerMuted(f),fwd_count:0,from_id:0}),_.from_id!=i.from_id&&(_.from_id=i.from_id,_.fwd_count=0),i.fwd_from_id&&_.fwd_count++,_.top_message=i,Ot||(Ot=a(rt,1e3))}it(i.id);break;case"updateReadHistoryInbox":case"updateReadHistoryOutbox":var y,i,b,w=n.max_id,k="updateReadHistoryOutbox"==n._,o=c.getPeerID(n.peer),h=nt(o),l=(pt[o]||{}).history||[],$=!1,S=l.length,C=!1;for(o>0&&k&&r.forceUserOnline(o),b=0;S>b;b++)if(y=l[b],!(y>w)&&(i=ct[y],i.out==k)){if(!i.unread)break;i&&i.unread&&(i.unread=!1,dt[y]&&(dt[y].unread=!1,C||(C=!0)),ut[y]&&(ut[y].unread=!1),i.out||(h&&($=--h[0].unread_count),v.cancel("msg"+y)))}$!==!1&&t.$broadcast("dialog_unread",{peerID:o,count:$}),C&&t.$broadcast("messages_read");break;case"updateReadMessagesContents":var b,y,i,M,x=n.messages,A=x.length;for(b=0;A>b;b++)y=x[b],(i=ct[y])&&delete i.media_unread,(M=dt[y])&&delete M.media_unread;break;case"updateDeleteMessages":var y,i,b,o,h,l,E={};for(b=0;b0&&(a.count-=e.count,a.count<0&&(a.count=0));for(var r=0;ro&&(i=e,a=o)}),i}function c(e,t,n){var a=o.getUserInput(e);return i.invokeApi("photos.getUserPhotos",{user_id:a,offset:0,limit:n||20,max_id:t||0}).then(function(t){o.saveApiUsers(t.users);for(var n=[],i={user_id:e},a=0;a800&&(i-=208);var s=l(n,i,o);s&&!s.preloaded&&(s.preloaded=!0,s.size?a.downloadFile(s.location.dc_id,{_:"inputFileLocation",volume_id:s.location.volume_id,local_id:s.location.local_id,secret:s.location.secret},s.size):a.downloadSmallFile(s.location))}}function u(e){return f[e]||{_:"photoEmpty"}}function p(e,t){t=t||{};var n=angular.copy(f[e])||{_:"photoEmpty"},i=t.website?100:Math.min(_-80,Config.Mobile?210:260),a=t.website?100:Math.min(v-100,Config.Mobile?210:260),o=l(n,i,a),s={placeholder:"img/placeholders/PhotoThumbConversation.gif",width:i,height:a};if(o&&"photoSizeEmpty"!=o._){var r=calcImageInBox(o.w,o.h,i,a);s.width=r.w,s.height=r.h,s.location=o.location,s.size=o.size}else s.width=100,s.height=100;return n.thumb=s,n}function m(e){var n=p(e),i=$(window).width()-(Config.Mobile?0:32),a=$(t).height()-(Config.Mobile?0:116);!Config.Mobile&&i>800&&(i-=208);var o=l(n,i,a),s={placeholder:"img/placeholders/PhotoThumbModal.gif"};if(s.width=i,s.height=a,o&&"photoSizeEmpty"!=o._){var r=calcImageInBox(o.w,o.h,i,a,!0);s.width=r.w,s.height=r.h,s.modalWidth=Math.max(s.width,Math.min(400,i)),s.location=o.location,s.size=o.size}return n.full=s,n}function h(t,i){if(!t||"0"===t)return!1;var a=n.$new(!0);a.photoID=t;var o="PhotoModalController";i&&i.p>0?(o="UserpicModalController",a.userID=i.p):i&&i.p<0?(o="ChatpicModalController",a.chatID=-i.p):i&&i.m>0&&(a.messageID=i.m,i.w&&(a.webpageID=i.w));e.open({templateUrl:templateUrl("photo_modal"),windowTemplateUrl:templateUrl("media_modal_layout"),controller:o,scope:a,windowClass:"photo_modal_window"})}function g(e){var n=f[e],i="jpg",o="image/jpeg",r="photo"+e+"."+i,c=Math.max(screen.width||0,$(window).width()-36,800),d=Math.max(screen.height||0,$(t).height()-150,800),u=l(n,c,d),p={_:"inputFileLocation",volume_id:u.location.volume_id,local_id:u.location.local_id,secret:u.location.secret};s.chooseSave(r,i,o).then(function(e){e&&a.downloadFile(u.location.dc_id,p,u.size,{mime:o,toFileEntry:e}).then(function(){},function(e){console.log("photo download failed",e)})},function(){var e=a.getCachedFile(p);return e?s.download(e,o,r):void a.downloadFile(u.location.dc_id,p,u.size,{mime:o}).then(function(e){s.download(e,o,r)},function(e){console.log("photo download failed",e)})})}var f={},_=$(window).width(),v=$(window).height();return n.preloadPhoto=d,n.openPhoto=h,{savePhoto:r,preloadPhoto:d,getUserPhotos:c,getPhoto:u,choosePhotoSize:l,wrapForHistory:p,wrapForFull:m,openPhoto:h,downloadPhoto:g}}]).service("AppWebPagesManager",["$modal","$sce","$window","$rootScope","MtpApiManager","AppPhotosManager","RichTextProcessor",function(e,t,n,i,a,o,s){function r(e,t,n){e.photo&&"photo"===e.photo._?o.savePhoto(e.photo,n):delete e.photo,e.rTitle=s.wrapRichText(e.title||e.author,{noLinks:!0,noLinebreaks:!0});var a="";if("GitHub"==e.site_name){var r=e.url.match(/(https?:\/\/github\.com\/[^\/]+\/[^\/]+)/);r&&(a=r[0]+"/issues/{1}")}if(e.rDescription=s.wrapRichText(e.description,{contextSite:e.site_name||"external",contextHashtag:a}),t&&(void 0===p[e.id]&&(p[e.id]={}),p[e.id][t]=!0,u[e.id]=e),void 0===u[e.id]?u[e.id]=e:safeReplaceObject(u[e.id],e),!t&&void 0!==p[e.id]){var l=[];angular.forEach(p[e.id],function(e,t){l.push(t)}),i.$broadcast("webpage_updated",{id:e.id,msgs:l})}}function l(t,n){var a=i.$new(!0);a.webpageID=t,a.messageID=n,e.open({templateUrl:templateUrl("embed_modal"),windowTemplateUrl:templateUrl("media_modal_layout"),controller:"EmbedModalController",scope:a,windowClass:"photo_modal_window"})}function c(e){var t=angular.copy(u[e])||{_:"webPageEmpty"};return t.photo&&t.photo.id&&(t.photo=o.wrapForHistory(t.photo.id,{website:"photo"!=t.type&&"video"!=t.type})),t}function d(e){var i=c(e);if(!i.embed_url)return i;var a=$(window).width()-(Config.Mobile?0:10),o=$(n).height()-(Config.Mobile?92:150);!Config.Mobile&&a>800&&(a-=208);var s={width:a,height:o};if(i.embed_width&&i.embed_height){var r=calcImageInBox(i.embed_width,i.embed_height,a,o);s.width=r.w,s.height=r.h}else s.height=s.width=Math.min(a,o);var l=Config.Modes.chrome_packed?"webview":"iframe",d="iframe"!=i.embed_type?i.embed_type||"text/html":"text/html",u="<"+l+' src="'+encodeEntities(i.embed_url)+'" type="'+encodeEntities(d)+'" frameborder="0" border="0" webkitallowfullscreen mozallowfullscreen allowfullscreen width="'+s.width+'" height="'+s.height+'" style="width: '+s.width+"px; height: "+s.height+'px;">";return s.html=t.trustAs("html",u),i.full=s,i}var u={},p={};return i.$on("apiUpdate",function(e,t){switch(t._){case"updateWebPage":r(t.webpage)}}),{saveWebPage:r,openEmbed:l,wrapForFull:d,wrapForHistory:c}}]).service("AppVideoManager",["$sce","$rootScope","$modal","$window","MtpApiFileManager","AppUsersManager","FileManager","qSync",function(e,t,n,i,a,o,s,r){function l(e,t){t&&angular.extend(e,t),g[e.id]=e,e.thumb&&"photoCachedSize"==e.thumb._&&(a.saveSmallFile(e.thumb.location,e.thumb.bytes),e.thumb.size=e.thumb.bytes.length,delete e.thumb.bytes,e.thumb._="photoSize")}function c(e){if(void 0!==f[e])return f[e];var t=angular.copy(g[e]),n=Math.min(_-80,Config.Mobile?210:150),i=Math.min(v-100,Config.Mobile?210:150),a=t.thumb,o={placeholder:"img/placeholders/VideoThumbConversation.gif",width:n,height:i};return a&&"photoSizeEmpty"!=a._&&(a.w/a.h>n/i?o.height=parseInt(a.h*n/a.w):(o.width=parseInt(a.w*i/a.h),o.width>n&&(o.height=parseInt(o.height*n/o.width),o.width=n)),o.location=a.location,o.size=a.size),t.thumb=o,f[e]=t}function d(e){var t=c(e),n=Math.min($(window).width()-(Config.Mobile?0:60),542),a=$(i).height()-(Config.Mobile?92:150),o={placeholder:"img/placeholders/VideoThumbModal.gif",width:n,height:a};if(t.w&&t.h){var s=calcImageInBox(t.w,t.h,n,a);o.width=s.w,o.height=s.h}else o.height=o.width=Math.min(n,a);return t.full=o,t.fullThumb=angular.copy(t.thumb),t.fullThumb.width=o.width,t.fullThumb.height=o.height,t}function u(e,i){var a=t.$new(!0);return a.videoID=e,a.messageID=i,n.open({templateUrl:templateUrl("video_modal"),windowTemplateUrl:templateUrl("media_modal_layout"),controller:"VideoModalController",scope:a,windowClass:"video_modal_window"})}function p(e){var t=g[e],n=f[e]||t||{},i={_:"inputVideoFileLocation",id:e,access_hash:t.access_hash};void 0===n.downloaded&&a.getDownloadedFile(i,t.size).then(function(){n.downloaded=!0},function(){n.downloaded=!1})}function m(n,i){var o=g[n],l=f[n]||o||{},c=o.mime_type||"video/ogg",d={_:"inputVideoFileLocation",id:n,access_hash:o.access_hash};if(l.downloaded&&!i){var u=a.getCachedFile(d);if(u)return r.when(u)}l.progress={enabled:!l.downloaded,percent:1,total:o.size};var p=a.downloadFile(o.dc_id,d,o.size,{mime:c,toFileEntry:i});return p.then(function(t){s.getFileCorrectUrl(t,c).then(function(t){l.url=e.trustAsResourceUrl(t)}),delete l.progress,l.downloaded=!0,console.log("video save done")},function(e){console.log("video download failed",e),l.progress.enabled=!1},function(e){console.log("dl progress",e),l.progress.enabled=!0,l.progress.done=e.done,l.progress.percent=Math.max(1,Math.floor(100*e.done/e.total)),t.$broadcast("history_update")}),l.progress.cancel=p.cancel,p}function h(e){{var t=g[e],n=t.mime_type||"video/mp4",i=n.split(".")[1]||"mp4",a="t_video"+e+"."+i;f[e]||t||{}}s.chooseSave(a,i,n).then(function(t){t&&m(e,t)},function(){m(e).then(function(e){s.download(e,n,a)})})}var g={},f={},_=$(window).width(),v=$(window).height();return{saveVideo:l,wrapForHistory:c,wrapForFull:d,openVideo:u,updateVideoDownloaded:p,downloadVideo:m,saveVideoFile:h}}]).service("AppDocsManager",["$sce","$rootScope","$modal","$window","$q","RichTextProcessor","MtpApiFileManager","FileManager","qSync",function(e,t,n,i,a,o,s,r,l){function c(e,t){f[e.id]=e,t&&angular.extend(e,t),e.thumb&&"photoCachedSize"==e.thumb._&&(s.saveSmallFile(e.thumb.location,e.thumb.bytes),e.thumb.size=e.thumb.bytes.length,delete e.thumb.bytes,e.thumb._="photoSize"),angular.forEach(e.attributes,function(t){switch(t._){case"documentAttributeFilename":e.file_name=t.file_name;break;case"documentAttributeAudio":e.duration=t.duration,e.audioTitle=t.title,e.audioPerformer=t.performer;break;case"documentAttributeVideo":e.duration=t.duration;break;case"documentAttributeSticker":e.sticker=1,void 0!==t.alt&&(e.sticker=2,e.stickerEmojiRaw=t.alt,e.stickerEmoji=o.wrapRichText(e.stickerEmojiRaw,{noLinks:!0,noLinebreaks:!0})),t.stickerset&&("inputStickerSetEmpty"==t.stickerset._?delete t.stickerset:"inputStickerSetID"==t.stickerset._&&(e.stickerSetInput=t.stickerset));break;case"documentAttributeImageSize":e.w=t.w,e.h=t.h}}),e.file_name=e.file_name||""}function d(e){return f[e]||{_:"documentEmpty"}}function u(e){if(void 0!==_[e])return _[e];var t,n,i=angular.copy(f[e]),a="image/gif"==i.mime_type,o="image/"==i.mime_type.substr(0,6)&&i.sticker,s=i.thumb;a?(t=Math.min(v-80,260),n=Math.min(y-100,260)):o?(t=Math.min(v-80,Config.Mobile?128:192),n=Math.min(y-100,Config.Mobile?128:192)):t=n=100;var r={width:t,height:n};if(s&&"photoSizeEmpty"!=s._){var l=calcImageInBox(s.w,s.h,t,n);r.width=l.w,r.height=l.h,r.location=s.location,r.size=s.size}else if(o){var l=calcImageInBox(i.w,i.h,t,n);r.width=l.w,r.height=l.h}else r=!1;return i.thumb=r,i.withPreview=!Config.Mobile&&i.mime_type.match(/^(image\/)/)?1:0,a&&i.thumb?i.isSpecial="gif":o?i.isSpecial="sticker":"audio/"==i.mime_type.substr(0,6)&&(i.isSpecial="audio"),_[e]=i}function p(e){var t=f[e],n=_[e]||t||{},i={_:"inputDocumentFileLocation",id:e,access_hash:t.access_hash,file_name:t.file_name};void 0===n.downloaded&&s.getDownloadedFile(i,t.size).then(function(){n.downloaded=!0},function(){n.downloaded=!1})}function m(n,i){var a=f[n],o=_[n]||a||{},c={_:"inputDocumentFileLocation",id:n,access_hash:a.access_hash,file_name:a.file_name};if(o.downloaded&&!i){var d=s.getCachedFile(c);if(d)return l.when(d)}o.progress={enabled:!o.downloaded,percent:1,total:a.size};var u=s.downloadFile(a.dc_id,c,a.size,{mime:a.mime_type||"application/octet-stream",toFileEntry:i});return u.then(function(t){delete o.progress,t&&(r.getFileCorrectUrl(t,a.mime_type).then(function(t){o.url=e.trustAsResourceUrl(t)}),o.downloaded=!0),console.log("file save done")},function(e){console.log("document download failed",e),o.progress.enabled=!1},function(e){console.log("dl progress",e),o.progress.enabled=!0,o.progress.done=e.done,o.progress.percent=Math.max(1,Math.floor(100*e.done/e.total)),t.$broadcast("history_update")}),o.progress.cancel=u.cancel,u}function h(e,i){var a=t.$new(!0);a.docID=e,a.messageID=i;n.open({templateUrl:templateUrl("document_modal"),windowTemplateUrl:templateUrl("media_modal_layout"),controller:"DocumentModalController",scope:a,windowClass:"document_modal_window"})}function g(e){var t=f[e],n=(_[e]||t||{},(t.file_name.split(".",2)||[])[1]||"");r.chooseSave(t.file_name,n,t.mime_type).then(function(t){t&&m(e,t)},function(){m(e).then(function(e){r.download(e,t.mime_type,t.file_name)})})}var f={},_={},v=$(window).width(),y=$(window).height();return{saveDoc:c,getDoc:d,wrapForHistory:u,updateDocDownloaded:p,downloadDoc:m,openDoc:h,saveDocFile:g}}]).service("AppAudioManager",["$sce","$rootScope","$modal","$window","MtpApiFileManager","FileManager","qSync",function(e,t,n,i,a,o,s){function r(e){p[e.id]=e}function l(e){if(void 0!==m[e])return m[e];var t=angular.copy(p[e]);return m[e]=t}function c(e){var t=p[e],n=m[e]||t||{},i={_:"inputAudioFileLocation",id:e,access_hash:t.access_hash};void 0===n.downloaded&&a.getDownloadedFile(i,t.size).then(function(){n.downloaded=!0},function(){n.downloaded=!1})}function d(n,i){var r=p[n],l=m[n]||r||{},c=r.mime_type||"audio/ogg",d={_:"inputAudioFileLocation",id:n,access_hash:r.access_hash};if(l.downloaded&&!i){var u=a.getCachedFile(d);if(u)return s.when(u)}l.progress={enabled:!l.downloaded,percent:1,total:r.size};var h=a.downloadFile(r.dc_id,d,r.size,{mime:c,toFileEntry:i});return h.then(function(t){o.getFileCorrectUrl(t,c).then(function(t){l.url=e.trustAsResourceUrl(t)}),delete l.progress,l.downloaded=!0,console.log("audio save done")},function(e){console.log("audio download failed",e),l.progress.enabled=!1},function(e){console.log("dl progress",e),l.progress.enabled=!0,l.progress.done=e.done,l.progress.percent=Math.max(1,Math.floor(100*e.done/e.total)),t.$broadcast("history_update")}),l.progress.cancel=h.cancel,h}function u(e){{var t=p[e],n=t.mime_type||"audio/ogg",i=n.split(".")[1]||"ogg",a="t_audio"+e+"."+i;m[e]||t||{}}o.chooseSave(a,i,n).then(function(t){t&&d(e,t)},function(){d(e).then(function(e){o.download(e,n,a)})})}var p={},m={};return{saveAudio:r,wrapForHistory:l,updateAudioDownloaded:c,downloadAudio:d,saveAudioFile:u}}]).service("AppStickersManager",["$q","$rootScope","$modal","_","FileManager","MtpApiManager","MtpApiFileManager","AppDocsManager","Storage",function(e,t,n,i,a,o,s,r,l){function c(){$||($=!0,setTimeout(u,1e3))}function d(e){if(k!==e.hash){k=e.hash;var t,n,i,a,o,s,l,c;for(b=[],y=[],i=e.sets.length,t=0;i>t;t++){for(s=e.sets[t],c=e.fullSets[s.id],a=c.documents.length,l=[],n=0;a>n;n++)o=c.documents[n],r.saveDoc(o),y.push(o.id),l.push(o.id);b.push({id:s.id,title:s.title,short_name:s.short_name,installed:(1&s.flags)>0,disabled:(2&s.flags)>0,official:(4&s.flags)>0,docIDs:l}),w[s.id]=!0}}return b}function u(e){return l.get("all_stickers").then(function(t){var n=Config.Schema.API.layer;return t.layer!=n&&(t=!1),t&&t.date>tsNow(!0)&&!e?d(t):o.invokeApi("messages.getAllStickers",{hash:t&&t.hash||""}).then(function(e){var i="messages.allStickersNotModified"==e._;return i&&(e=t),e.date=tsNow(!0)+3600,e.layer=n,delete e._,i?(l.set({all_stickers:e}),d(e)):p(e).then(function(){return l.set({all_stickers:e}),d(e)})})})}function p(t){var n=[],i=t.fullSets||{};return t.fullSets={},angular.forEach(t.sets,function(e){var a=i[e.id];if(a&&a.set.hash==e.hash)t.fullSets[e.id]=a;else{var s=o.invokeApi("messages.getStickerSet",{stickerset:{_:"inputStickerSetID",id:e.id,access_hash:e.access_hash}}).then(function(n){t.fullSets[e.id]=n});n.push(s)}}),e.all(n)}function m(e){var t=r.getDoc(e),n=angular.copy(t.thumb.location);return n.sticker=!0,s.downloadSmallFile(n).then(function(e){return{id:t.id,src:a.getUrl(e,"image/webp")}})}function h(){var t=[];return angular.forEach(y,function(e){t.push(m(e))}),e.all(t)}function g(e){return o.invokeApi("messages.getStickerSet",{stickerset:e}).then(function(e){for(var t=0;tn;n++)p(a[n]);return h.seq=t.seq,t.date&&h.date=f.seqAwaiting&&(f.ptsAwaiting?delete f.seqAwaiting:(clearTimeout(f.timeout),f=!1)),!0}function r(){if(!y.length)return!1;y.sort(function(e,t){return e.pts-t.pts});for(var e,t=h.pts,n=!1,i=!1,a=0,o=y.length;o>a;a++)e=y[a],t+=e.pts_count,t>=e.pts&&(n=e.pts,i=a);if(!n)return!1;for(h.pts=n,a=0;i>=a;a++)e=y[a],p(e);return y.splice(i,o-i),!y.length&&f&&(f.seqAwaiting?delete f.ptsAwaiting:(clearTimeout(f.timeout),f=!1)),!0}function l(){_||d()}function c(e){var t={date:e.date,seq:e.seq,seqStart:e.seq_start};switch(e._){case"updatesTooLong":case"new_session_created":l();break;case"updateShort":u(e.update,t);break;case"updateShortMessage":case"updateShortChatMessage":var o=2&e.flags,s=e.from_id||(o?g:e.user_id),r=e.chat_id?-e.chat_id:o?e.user_id:g;u({_:"updateNewMessage",message:{_:"message",flags:e.flags,id:e.id,from_id:s,to_id:a.getOutputPeer(r),date:e.date,message:e.message,fwd_from_id:e.fwd_from_id,fwd_date:e.fwd_date,reply_to_msg_id:e.reply_to_msg_id},pts:e.pts,pts_count:e.pts_count},t);break;case"updatesCombined":case"updates":n.saveApiUsers(e.users),i.saveApiChats(e.chats),angular.forEach(e.updates,function(e){u(e,t)});break;default:console.warn(dT(),"Unknown update message",e)}}function d(){_||(_=!0,v={},y=[]),f&&(clearTimeout(f.timeout),f=!1),o.invokeApi("updates.getDifference",{pts:h.pts,date:h.date,qts:-1}).then(function(t){if("updates.differenceEmpty"==t._)return console.log(dT(),"apply empty diff",t.seq),h.date=t.date,h.seq=t.seq,_=!1,e.$broadcast("stateSynchronized"),!1;n.saveApiUsers(t.users),i.saveApiChats(t.chats),angular.forEach(t.other_updates,function(e){p(e)}),angular.forEach(t.new_messages,function(e){p({_:"updateNewMessage",message:e,pts:h.pts,pts_count:0})});var a=t.intermediate_state||t.state;h.seq=a.seq,h.pts=a.pts,h.date=a.date,console.log(dT(),"apply diff",h.seq,h.pts),"updates.differenceSlice"==t._?d():(e.$broadcast("stateSynchronized"),_=!1)})}function u(e,t){if(_)return!1;if("updateNewMessage"==e._){var a=e.message;if(a.from_id&&!n.hasUser(a.from_id)||a.fwd_from_id&&!n.hasUser(a.fwd_from_id)||a.to_id.user_id&&!n.hasUser(a.to_id.user_id)||a.to_id.chat_id&&!i.hasChat(a.to_id.chat_id))return console.warn(dT(),"Short update not enough data",a),l(),!1}var o,c;if(e.pts){var u=h.pts+(e.pts_count||0);if(uh.pts&&(h.pts=e.pts,o=!0)}else if(t.seq>0){var m=t.seq,g=t.seqStart||m;if(g!=h.seq+1&&g>h.seq)return console.warn(dT(),"Seq hole",h,f&&f.seqAwaiting),void 0===v[g]&&(v[g]={seq:m,date:t.date,updates:[]}),v[g].updates.push(e),f||(f={timeout:setTimeout(function(){d()},5e3)}),(!f.seqAwaiting||f.seqAwaiting-1)return n=Math.floor(t/a),i=t%a,{category:o,row:n,column:i};return console.error("emoji not found in spritesheet",e),null}function i(i,s){if(!i||!i.length)return"";s=s||{};for(var u,p,m,h,g=i,f=[],_=s.contextSite||"Telegram",b="Telegram"!=_,w=!1;u=g.match(v);){if(f.push(encodeEntities(g.substr(0,u.index))),u[3]){var k=!s.noLinks&&E[_];if(k){var $="";s.highlightUsername&&s.highlightUsername.toLowerCase()==u[3].toLowerCase()&&($='class="im_message_mymention"'),f.push(u[1],"',encodeEntities(u[2]+u[3]),"")}else f.push(u[1],encodeEntities(u[2]+u[3]))}else if(u[4])if(s.noLinks)f.push(encodeEntities(u[0]));else if(y.test(u[4]))f.push('',encodeEntities(u[4]),"");else{var p=!1,S=u[5],C=u[6],M="";if(C){if(S||"xn--"!==C.substr(0,4)&&-1===Config.TLD.indexOf(C.toLowerCase())||(S="http://"),S){var x=a(u[4]);x.length!==u[4].length&&(M=u[4].substring(x.length),u[4]=x),p=(u[5]?"":S)+u[4]}var T;if("me"==C&&(T=p.match(/^https?:\/\/telegram\.me\/(.+)/))){var I=T[1].split("/");switch(I[0]){case"joinchat":p="tg://join?invite="+I[1];break;case"addstickers":p="tg://addstickers?set="+I[1];break;default:var D=I[0].split("?"); -p="tg://resolve?domain="+D[0]+(D[1]?"&"+D[1]:"")}}}else p=(u[5]?"":"http://")+u[4];p?(f.push('',encodeEntities(u[4]),"",M),s.extractUrlEmbed&&!s.extractedUrlEmbed&&(s.extractedUrlEmbed=o(p))):f.push(encodeEntities(u[0]))}else if(u[7])f.push(s.noLinebreaks?" ":"
");else if(u[8])(r=l[u[8]])&&(h=n(r))?(m=encodeEntities(c[r][1][0]),w=!0,f.push('',":",m,":")):f.push(encodeEntities(u[8]));else if(u[10]){var k=!s.noLinks&&A[_]||s.contextHashtag;k?f.push(encodeEntities(u[9]),"',encodeEntities(u[10]),""):f.push(encodeEntities(u[9]),encodeEntities(u[10]))}else if(u[12])if(s.noLinks||s.noCommands||b)f.push(encodeEntities(u[0]));else{var P=u[13]||s.fromBot;f.push(encodeEntities(u[11]),'',encodeEntities("/"+u[12]+(u[13]?"@"+u[13]:"")),"",encodeEntities(u[14]))}g=g.substr(u.index+u[0].length)}return f.push(encodeEntities(g)),i=t(f.join("")),w&&(i=i.replace(/\ufe0f|️|�|‍/g,"",i),i=i.replace(//g,'')),e.trustAs("html",i)}function a(e){for(var t=e.length,n=e.split("(").length-1,i=e.split(")").length-1;i>n&&")"===e.charAt(t-1);)e=e.substr(0,t-1),i--,t--;return n>i&&(e=e.replace(/\)+$/,"")),e}function o(e){var t;if(t=e.match(b))return["youtube",t[1]];if(t=e.match(w))return["vimeo",t[1]];if(t=e.match(k))return["instagram",t[1]];if(t=e.match($))return["vine",t[1]];if(t=e.match(M)){var n="explore,upload,pages,terms-of-use,mobile,jobs,imprint".split(","),i="sets".split(",");if(-1==n.indexOf(t[1])&&-1==i.indexOf(t[2]))return["soundcloud",t[0]]}else if(t=e.match(x))return["spotify",t[3].replace("/",":")];if(!Config.Modes.chrome_packed){if(t=e.match(S))return["twitter",t[0]];if(t=e.match(C))return void 0!=t[2]?["facebook","https://www.facebook.com/"+t[2]+"/posts/"+t[1]]:["facebook",t[0]]}return!1}function s(e,t){if(u)return e;if(!e||!e.length)return"";t=t||{},e=e.replace(/\ufe0f/g,"",e);for(var n,i,a=e,e=[];n=a.match(v);)e.push(a.substr(0,n.index)),e.push(n[8]?(r=l[n[8]])&&(i=c[r][1][0])?":"+i+":":n[0]:n[0]),a=a.substr(n.index+n[0].length);return e.push(a),e.join("")}var r,l={},c=Config.Emoji,d=18,u=-1!=navigator.userAgent.search(/OS X|iPhone|iPad|iOS|Android/i),p="\\u0023\\u20E3|\\u00a9|\\u00ae|\\u203c|\\u2049|\\u2139|[\\u2194-\\u2199]|\\u21a9|\\u21aa|\\u231a|\\u231b|\\u23e9|[\\u23ea-\\u23ec]|\\u23f0|\\u24c2|\\u25aa|\\u25ab|\\u25b6|\\u2611|\\u2614|\\u26fd|\\u2705|\\u2709|[\\u2795-\\u2797]|\\u27a1|\\u27b0|\\u27bf|\\u2934|\\u2935|[\\u2b05-\\u2b07]|\\u2b1b|\\u2b1c|\\u2b50|\\u2b55|\\u3030|\\u303d|\\u3297|\\u3299|[\\uE000-\\uF8FF\\u270A-\\u2764\\u2122\\u25C0\\u25FB-\\u25FE\\u2615\\u263a\\u2648-\\u2653\\u2660-\\u2668\\u267B\\u267F\\u2693\\u261d\\u26A0-\\u26FA\\u2708\\u2702\\u2601\\u260E]|[\\u2600\\u26C4\\u26BE\\u23F3\\u2764]|\\uD83D[\\uDC00-\\uDFFF]|\\uD83C[\\uDDE8-\\uDDFA�]\\uD83C[\\uDDEA-\\uDDFA�]|[0-9]\\u20e3|\\uD83C[\\uDC00-\\uDFFF]";for(r in c)l[c[r][0]]=r;var m="a-z\\u00c0-\\u00d6\\u00d8-\\u00f6\\u00f8-\\u00ff\\u0100-\\u024f\\u0253\\u0254\\u0256\\u0257\\u0259\\u025b\\u0263\\u0268\\u026f\\u0272\\u0289\\u028b\\u02bb\\u0300-\\u036f\\u1e00-\\u1eff\\u0400-\\u04ff\\u0500-\\u0527\\u2de0-\\u2dff\\ua640-\\ua69f\\u0591-\\u05bf\\u05c1-\\u05c2\\u05c4-\\u05c5\\u05c7\\u05d0-\\u05ea\\u05f0-\\u05f4\\ufb1d-\\ufb28\\ufb2a-\\ufb36\\ufb38-\\ufb3c\\ufb3e\\ufb40-\\ufb41\\ufb43-\\ufb44\\ufb46-\\ufb4f\\u0610-\\u061a\\u0620-\\u065f\\u066e-\\u06d3\\u06d5-\\u06dc\\u06de-\\u06e8\\u06ea-\\u06ef\\u06fa-\\u06fc\\u06ff\\u0750-\\u077f\\u08a0\\u08a2-\\u08ac\\u08e4-\\u08fe\\ufb50-\\ufbb1\\ufbd3-\\ufd3d\\ufd50-\\ufd8f\\ufd92-\\ufdc7\\ufdf0-\\ufdfb\\ufe70-\\ufe74\\ufe76-\\ufefc\\u200c\\u0e01-\\u0e3a\\u0e40-\\u0e4e\\u1100-\\u11ff\\u3130-\\u3185\\uA960-\\uA97F\\uAC00-\\uD7AF\\uD7B0-\\uD7FF\\u3003\\u3005\\u303b\\uff21-\\uff3a\\uff41-\\uff5a\\uff66-\\uff9f\\uffa1-\\uffdc",h="0-9_"+m,g="((?:https?|ftp)://|mailto:)?(?:\\S{1,64}(?::\\S{0,64})?@)?(?:(?: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}|["+m+"0-9]["+m+"0-9-]{0,64}(?:\\.["+m+"0-9]["+m+"0-9-]{0,64}){0,10}(?:\\.(xn--[0-9a-z]{2,16}|["+m+"]{2,24})))(?::\\d{2,5})?(?:/(?:\\S{0,255}[^\\s.;,(\\[\\]{}<>\"'])?)?",f="[a-zA-Z\\d_]{5,32}",_="\\/([a-zA-Z\\d_]{1,32})(?:@("+f+"))?(\\s|$)",v=new RegExp("(^|\\s)(@)("+f+")|("+g+")|(\\n)|("+p+")|(^|\\s)(#["+h+"]{2,64})|(^|\\s)"+_,"i"),y=/^(([^<>()[\]\\.,;:\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,}))$/,b=/^(?:https?:\/\/)?(?:www\.)?youtu(?:|\.be|be\.com|\.b)(?:\/v\/|\/watch\\?v=|e\/|(?:\/\??#)?\/watch(?:.+)v=)(.{11})(?:\&[^\s]*)?/,w=/^(?:https?:\/\/)?(?:www\.)?vimeo\.com\/(\d+)/,k=/^https?:\/\/(?:instagr\.am\/p\/|instagram\.com\/p\/)([a-zA-Z0-9\-\_]+)/i,$=/^https?:\/\/vine\.co\/v\/([a-zA-Z0-9\-\_]+)/i,S=/^https?:\/\/twitter\.com\/.+?\/status\/\d+/i,C=/^https?:\/\/(?:www\.|m\.)?facebook\.com\/(?:.+?\/posts\/\d+|(?:story\.php|permalink\.php)\?story_fbid=(\d+)(?:&substory_index=\d+)?&id=(\d+))/i,M=/^https?:\/\/(?:soundcloud\.com|snd\.sc)\/([a-zA-Z0-9%\-\_]+)\/([a-zA-Z0-9%\-\_]+)/i,x=/(https?:\/\/(open\.spotify\.com|play\.spotify\.com|spoti\.fi)\/(.+)|spotify:(.+))/i,A={Telegram:"#/im?q=%23{1}",Twitter:"https://twitter.com/hashtag/{1}",Instagram:"https://instagram.com/explore/tags/{1}/","Google Plus":"https://plus.google.com/explore/{1}"},E={Telegram:"#/im?p=%40{1}",Twitter:"https://twitter.com/{1}",Instagram:"https://instagram.com/{1}/",GitHub:"https://github.com/{1}"};return{wrapRichText:i,wrapPlainText:s}}]).service("StatusManager",["$timeout","$rootScope","MtpApiManager","AppUsersManager","IdleManager",function(e,t,n,i){function a(){d||(d=!0,t.$watch("idle.isIDLE",s),t.$watch("offline",s))}function o(e){var a=tsNow();if(!(e&&!c||!e&&5e4>a-c||t.offline))return c=e?0:a,i.setUserStatus(u,e),n.invokeApi("account.updateStatus",{offline:e},{noErrorBox:!0})}function s(){l&&e.cancel(l),t.idle.isIDLE?l=e(function(){o(!0)},5e3):(o(!1),l=e(s,6e4))}function r(){return p?tsNow()>p?(p=!1,!1):!0:!1}var l,c=0,d=!1,u=0,p=!1;return n.getUserID().then(function(e){u=e}),t.$on("apiUpdate",function(e,t){"updateUserStatus"==t._&&t.user_id==u&&(p=tsNow()+("userStatusOnline"==t.status._?3e5:0))}),{start:a,isOtherDeviceActive:r}}]).service("NotificationsManager",["$rootScope","$window","$interval","$q","_","MtpApiManager","AppPeersManager","IdleManager","Storage","AppRuntimeManager",function(e,t,n,i,a,o,s,r,l,c){function d(){l.get("notify_nodesktop","notify_volume","notify_novibrate","notify_nopreview").then(function(e){z.nodesktop=e[0],z.volume=e[1]===!1?.5:e[1],z.novibrate=e[2],z.nopreview=e[3]})}function u(){return z}function p(e){return void 0!==B[e]?B[e]:B[e]=o.invokeApi("account.getNotifySettings",{peer:{_:"inputNotifyPeer",peer:s.getInputPeerByID(e)}})}function m(e){if(e=e||"favicon.ico",T!==e){var t=document.createElement("link");t.rel="shortcut icon",t.type="image/x-icon",t.href=e,F.parentNode.replaceChild(t,F),F=t,T=e}}function h(e,t){B[e]=i.when(t)}function g(e,t){h(e,t);var n=angular.copy(t);return n._="inputPeerNotifySettings",o.invokeApi("account.updateNotifySettings",{peer:{_:"inputNotifyPeer",peer:s.getInputPeerByID(e)},settings:n})}function f(e){return p(e).then(function(e){return"peerNotifySettings"==e._&&1e3*e.mute_until>tsNow()})}function _(){if(d(),e.$on("settings_changed",d),C(),!I)return!1;"Notification"in window&&"granted"!==Notification.permission&&"denied"!==Notification.permission&&$(t).on("click",v);try{"onbeforeunload"in window&&$(t).on("beforeunload",S)}catch(n){}}function v(){Notification.requestPermission(),$(t).off("click",v)}function y(e){Config.Navigator.ffos?e.image="https://raw.githubusercontent.com/zhukov/webogram/master/app/img/icons/icon60.png":e.image||(e.image="img/icons/icon60.png"),N++;var t=tsNow();if(z.volume>0&&(!e.tag||!U[e.tag]||t>U[e.tag]+6e4)&&(b(z.volume),U[e.tag]=t),!I||"Notification"in window&&"granted"!==Notification.permission)return!1;if(z.nodesktop){if(O&&!z.novibrate)return void navigator.vibrate([200,100,200])}else{var n,i=++P,a=e.key||"k"+i;if("Notification"in window)n=new Notification(e.title,{icon:e.image||"",body:e.message||"",tag:e.tag||""});else if("mozNotification"in navigator)n=navigator.mozNotification.createNotification(e.title,e.message||"",e.image||"");else{if(!x)return;window.external.msSiteModeClearIconOverlay(),window.external.msSiteModeSetIconOverlay("img/icons/icon16.png",e.title),window.external.msSiteModeActivate(),n={index:i}}n.onclick=function(){n.close(),c.focus(),S(),e.onclick&&e.onclick()},n.onclose=function(){delete D[a],S()},n.show&&n.show(),D[a]=n}}function b(e){var t=tsNow();if(!(R&&R>t&&L==e)){R=t+1e3,L=e;var n="img/sound_a.mp3",i=$("#notify_sound").html('');i.find("audio")[0].volume=e}}function w(e){var t=D[e];if(t){N>0&&N--;try{t.close?t.close():x&&t.index==P&&window.external.msSiteModeClearIconOverlay()}catch(n){}delete N[e]}}function k(e){delete U[e]}function S(){x?window.external.msSiteModeClearIconOverlay():angular.forEach(D,function(e){try{e.close&&e.close()}catch(t){}}),D={},N=0}function C(){if(V)return!1;if(navigator.push&&Config.Navigator.ffos&&Config.Modes.packed){var e=navigator.push.register();e.onsuccess=function(){clearTimeout(G),console.log(dT(),"Push registered",e.result),V=e.result,o.invokeApi("account.registerDevice",{token_type:4,token:V,device_model:navigator.userAgent||"Unknown UserAgent",system_version:navigator.platform||"Unknown Platform",app_version:Config.App.version,app_sandbox:!1,lang_code:navigator.language||"en"})},e.onerror=function(e){console.error("Push register error",e,e.toString()),G=setTimeout(C,W),W=Math.min(3e4,1.5*W)}}}function M(){return O}navigator.vibrate=navigator.vibrate||navigator.mozVibrate||navigator.webkitVibrate;var x=!1;try{window.external&&window.external.msIsSiteMode()&&(x=!0)}catch(A){}var E,T,I=x||"Notification"in window||"mozNotification"in navigator,D={},P=0,N=0,U={},O=!!navigator.vibrate,R=!1,L=!1,B={},F=$('link[rel="icon"]:first')[0],q=a.pluralize("page_title_pluralize_notifications"),j=document.title,H=!1,z={};e.$watch("idle.isIDLE",function(e){e||S(),Config.Navigator.mobile||(n.cancel(E),e?(j=document.title,E=n(function(){var e=tsNow();!N||e%2e3>1e3?H&&(H=!1,document.title=j,m()):(H=!0,document.title=q(N),m("favicon_unread.ico"))},1e3)):(H=!1,document.title=j,m()))}),e.$on("apiUpdate",function(e,t){switch(t._){case"updateNotifySettings":if("notifyPeer"==t.peer._){var n=s.getPeerID(t.peer.peer);h(n,t.notify_settings)}}});var V=!1;return window.navigator.mozSetMessageHandler&&(window.navigator.mozSetMessageHandler("push",function(t){console.log(dT(),"received push",t),e.$broadcast("push_received")}),window.navigator.mozSetMessageHandler("push-register",function(e){console.log(dT(),"received push",e),V=!1,C()})),{start:_,notify:y,cancel:w,clear:S,soundReset:k,getPeerSettings:p,getPeerMuted:f,savePeerSettings:h,updatePeerSettings:g,updateNotifySettings:d,getNotifySettings:u,getVibrateSupport:M,testSound:b};var W,G}]).service("PasswordManager",["$timeout","$q","$rootScope","MtpApiManager","CryptoWorker","MtpSecureRandom",function(e,t,n,i,a,o){function s(e){return i.invokeApi("account.getPassword",{},e).then(function(e){return e})}function r(e,n){var a,s,r={new_settings:{_:"account.passwordInputSettings",flags:0,hint:n.hint||""}};if(a="string"==typeof n.cur_password&&n.cur_password.length>0?u(e.current_salt,n.cur_password):t.when([]),"string"==typeof n.new_password&&n.new_password.length>0){var l=new Array(8),c=bufferConcat(e.new_salt,l);o.nextBytes(l),s=u(c,n.new_password),r.new_settings.new_salt=c,r.new_settings.flags|=1}else"string"==typeof n.new_password&&(r.new_settings.flags|=1,r.new_settings.new_salt=[]),s=t.when([]);return"string"==typeof n.email&&(r.new_settings.flags|=2,r.new_settings.email=n.email||""),t.all([a,s]).then(function(e){return r.current_password_hash=e[0],r.new_settings.new_password_hash=e[1],i.invokeApi("account.updatePasswordSettings",r)})}function l(e,t,n){return u(e.current_salt,t).then(function(e){return i.invokeApi("auth.checkPassword",{password_hash:e},n)})}function c(e,t){return i.invokeApi("auth.requestPasswordRecovery",{},t)}function d(e,t){return i.invokeApi("auth.recoverPassword",{code:e},t)}function u(e,t){for(var n=unescape(encodeURIComponent(t)),i=new ArrayBuffer(n.length),o=new Uint8Array(i),s=0,r=n.length;r>s;s++)o[s]=n.charCodeAt(s);return i=bufferConcat(bufferConcat(e,o),e),a.sha256Hash(i)}return{check:l,getState:s,requestRecovery:c,recover:d,updateSettings:r}}]).service("ErrorService",["$rootScope","$modal","$window",function(e,t,n){function i(n,i){if(s>=1)return console.log("Skip error box, too many open",s,n,i),!1;i=i||{};var a=e.$new();angular.extend(a,n),s++;var o=t.open({templateUrl:templateUrl("error_modal"),scope:a,windowClass:i.windowClass||"error_modal_window"});return o.result["finally"](function(){s--}),o}function a(e,t){return i({title:e,description:t})}function o(n,i){i=i||{};var a=e.$new();angular.extend(a,n);var o=t.open({templateUrl:templateUrl("confirm_modal"),scope:a,windowClass:i.windowClass||"confirm_modal_window"});return o.result}var s=0;return n.safeConfirm=function(e,t){"string"==typeof e&&(e={message:e}),o(e).then(function(e){t(e||!0)},function(){t(!1)})},{show:i,alert:a,confirm:o}}]).service("PeersSelectService",["$rootScope","$modal",function(e,t){function n(n){var i=e.$new();return i.multiSelect=!1,i.noMessages=!0,n&&angular.extend(i,n),t.open({templateUrl:templateUrl("peer_select"),controller:"PeerSelectController",scope:i,windowClass:"peer_select_window mobile_modal"}).result}function i(i){if(Config.Mobile)return n(i).then(function(e){return[e]});var a=e.$new();return a.multiSelect=!0,a.noMessages=!0,i&&angular.extend(a,i),t.open({templateUrl:templateUrl("peer_select"),controller:"PeerSelectController",scope:a,windowClass:"peer_select_window mobile_modal"}).result}return{selectPeer:n,selectPeers:i}}]).service("ContactsSelectService",["$rootScope","$modal",function(e,t){function n(n,i){i=i||{};var a=e.$new();return a.multiSelect=n,angular.extend(a,i),!a.action&&n&&(a.action="select"),t.open({templateUrl:templateUrl("contacts_modal"),controller:"ContactsModalController",scope:a,windowClass:"contacts_modal_window mobile_modal"}).result}return{selectContacts:function(e){return n(!0,e)},selectContact:function(e){return n(!1,e)}}}]).service("ChangelogNotifyService",["Storage","$rootScope","$modal",function(e,t,n){function i(){e.get("last_version").then(function(t){t!=Config.App.version&&(t&&a(t),e.set({last_version:Config.App.version}))})}function a(e){var i=t.$new();i.lastVersion=e,n.open({controller:"ChangelogModalController",templateUrl:templateUrl("changelog_modal"),scope:i,windowClass:"changelog_modal_window mobile_modal"})}return{checkUpdate:i,showChangelog:a}}]).service("HttpsMigrateService",["ErrorService","Storage",function(e,t){function n(){t.get("https_dismiss").then(function(n){(!n||tsNow()>n+432e5)&&e.confirm({type:"MIGRATE_TO_HTTPS"}).then(function(){var e;try{e=window.open("https://web.telegram.org","_blank")}catch(t){}e||(location="https://web.telegram.org")},function(){t.set({https_dismiss:tsNow()})})})}function i(){a||"http:"!=location.protocol||Config.Modes.http||-1==Config.App.domains.indexOf(location.hostname)||(a=!0,setTimeout(n,12e4))}var a=!1;return{start:i,check:n}}]).service("LayoutSwitchService",["ErrorService","Storage","AppRuntimeManager","$window",function(e,t,n,i){function a(e){ConfigStorage.noPrefix(),t.set({layout_selected:e?"mobile":"desktop",layout_width:$(window).width()}).then(function(){n.reload()})}function o(n){if(!l){var i=$(window).width(),o=600>i;!i||!n&&(Config.Navigator.mobile?800>=i:o)||o!=Config.Mobile&&(ConfigStorage.noPrefix(),t.get("layout_width").then(function(n){return i==n?!1:(l=!0,void e.confirm({type:o?"SWITCH_MOBILE_VERSION":"SWITCH_DESKTOP_VERSION"}).then(function(){a(o)},function(){ConfigStorage.noPrefix(),t.set({layout_width:i}),l=!1}))}))}}function s(){r||Config.Navigator.mobile||(r=!0,o(),$(i).on("resize",o))}var r=!1,l=!1;return{start:s,switchLayout:a}}]).service("TelegramMeWebService",["Storage",function(e){function t(t){return n?!1:void e.get("tgme_sync").then(function(n){var i=tsNow(!0);if(t&&n&&n.canRedirect==t&&n.ts+86400>i)return!1;e.set({tgme_sync:{canRedirect:t,ts:i}});var a=$("