-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathkurotr-js.min.js
413 lines (412 loc) · 70.3 KB
/
kurotr-js.min.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
/*
CryptoJS v3.0.2
code.google.com/p/crypto-js
(c) 2009-2012 by Jeff Mott. All rights reserved.
code.google.com/p/crypto-js/wiki/License
*/
var CryptoJS=CryptoJS||function(h,o){var f={},j=f.lib={},k=j.Base=function(){function a(){}return{extend:function(b){a.prototype=this;var c=new a;b&&c.mixIn(b);c.$super=this;return c},create:function(){var a=this.extend();a.init.apply(a,arguments);return a},init:function(){},mixIn:function(a){for(var c in a)a.hasOwnProperty(c)&&(this[c]=a[c]);a.hasOwnProperty("toString")&&(this.toString=a.toString)},clone:function(){return this.$super.extend(this)}}}(),i=j.WordArray=k.extend({init:function(a,b){a=
this.words=a||[];this.sigBytes=b!=o?b:4*a.length},toString:function(a){return(a||p).stringify(this)},concat:function(a){var b=this.words,c=a.words,d=this.sigBytes,a=a.sigBytes;this.clamp();if(d%4)for(var e=0;e<a;e++)b[d+e>>>2]|=(c[e>>>2]>>>24-8*(e%4)&255)<<24-8*((d+e)%4);else if(65535<c.length)for(e=0;e<a;e+=4)b[d+e>>>2]=c[e>>>2];else b.push.apply(b,c);this.sigBytes+=a;return this},clamp:function(){var a=this.words,b=this.sigBytes;a[b>>>2]&=4294967295<<32-8*(b%4);a.length=h.ceil(b/4)},clone:function(){var a=
k.clone.call(this);a.words=this.words.slice(0);return a},random:function(a){for(var b=[],c=0;c<a;c+=4)b.push(4294967296*h.random()|0);return i.create(b,a)}}),l=f.enc={},p=l.Hex={stringify:function(a){for(var b=a.words,a=a.sigBytes,c=[],d=0;d<a;d++){var e=b[d>>>2]>>>24-8*(d%4)&255;c.push((e>>>4).toString(16));c.push((e&15).toString(16))}return c.join("")},parse:function(a){for(var b=a.length,c=[],d=0;d<b;d+=2)c[d>>>3]|=parseInt(a.substr(d,2),16)<<24-4*(d%8);return i.create(c,b/2)}},n=l.Latin1={stringify:function(a){for(var b=
a.words,a=a.sigBytes,c=[],d=0;d<a;d++)c.push(String.fromCharCode(b[d>>>2]>>>24-8*(d%4)&255));return c.join("")},parse:function(a){for(var b=a.length,c=[],d=0;d<b;d++)c[d>>>2]|=(a.charCodeAt(d)&255)<<24-8*(d%4);return i.create(c,b)}},q=l.Utf8={stringify:function(a){try{return decodeURIComponent(escape(n.stringify(a)))}catch(b){throw Error("Malformed UTF-8 data");}},parse:function(a){return n.parse(unescape(encodeURIComponent(a)))}},m=j.BufferedBlockAlgorithm=k.extend({reset:function(){this._data=i.create();
this._nDataBytes=0},_append:function(a){"string"==typeof a&&(a=q.parse(a));this._data.concat(a);this._nDataBytes+=a.sigBytes},_process:function(a){var b=this._data,c=b.words,d=b.sigBytes,e=this.blockSize,f=d/(4*e),f=a?h.ceil(f):h.max((f|0)-this._minBufferSize,0),a=f*e,d=h.min(4*a,d);if(a){for(var g=0;g<a;g+=e)this._doProcessBlock(c,g);g=c.splice(0,a);b.sigBytes-=d}return i.create(g,d)},clone:function(){var a=k.clone.call(this);a._data=this._data.clone();return a},_minBufferSize:0});j.Hasher=m.extend({init:function(){this.reset()},
reset:function(){m.reset.call(this);this._doReset()},update:function(a){this._append(a);this._process();return this},finalize:function(a){a&&this._append(a);this._doFinalize();return this._hash},clone:function(){var a=m.clone.call(this);a._hash=this._hash.clone();return a},blockSize:16,_createHelper:function(a){return function(b,c){return a.create(c).finalize(b)}},_createHmacHelper:function(a){return function(b,c){return r.HMAC.create(a,c).finalize(b)}}});var r=f.algo={};return f}(Math);
/*
CryptoJS v3.0.2
code.google.com/p/crypto-js
(c) 2009-2012 by Jeff Mott. All rights reserved.
code.google.com/p/crypto-js/wiki/License
*/
CryptoJS.lib.Cipher||function(r){var f=CryptoJS,e=f.lib,i=e.Base,j=e.WordArray,o=e.BufferedBlockAlgorithm,p=f.enc.Base64,s=f.algo.EvpKDF,l=e.Cipher=o.extend({cfg:i.extend(),createEncryptor:function(a,b){return this.create(this._ENC_XFORM_MODE,a,b)},createDecryptor:function(a,b){return this.create(this._DEC_XFORM_MODE,a,b)},init:function(a,b,c){this.cfg=this.cfg.extend(c);this._xformMode=a;this._key=b;this.reset()},reset:function(){o.reset.call(this);this._doReset()},process:function(a){this._append(a);
return this._process()},finalize:function(a){a&&this._append(a);return this._doFinalize()},keySize:4,ivSize:4,_ENC_XFORM_MODE:1,_DEC_XFORM_MODE:2,_createHelper:function(){return function(a){return{encrypt:function(b,c,d){return("string"==typeof c?q:g).encrypt(a,b,c,d)},decrypt:function(b,c,d){return("string"==typeof c?q:g).decrypt(a,b,c,d)}}}}()});e.StreamCipher=l.extend({_doFinalize:function(){return this._process(!0)},blockSize:1});var k=f.mode={},t=e.BlockCipherMode=i.extend({createEncryptor:function(a,
b){return this.Encryptor.create(a,b)},createDecryptor:function(a,b){return this.Decryptor.create(a,b)},init:function(a,b){this._cipher=a;this._iv=b}}),k=k.CBC=function(){function a(a,b,m){var h=this._iv;h?this._iv=r:h=this._prevBlock;for(var e=0;e<m;e++)a[b+e]^=h[e]}var b=t.extend();b.Encryptor=b.extend({processBlock:function(b,d){var m=this._cipher,e=m.blockSize;a.call(this,b,d,e);m.encryptBlock(b,d);this._prevBlock=b.slice(d,d+e)}});b.Decryptor=b.extend({processBlock:function(b,d){var e=this._cipher,
h=e.blockSize,f=b.slice(d,d+h);e.decryptBlock(b,d);a.call(this,b,d,h);this._prevBlock=f}});return b}(),u=(f.pad={}).Pkcs7={pad:function(a,b){for(var c=4*b,c=c-a.sigBytes%c,d=c<<24|c<<16|c<<8|c,e=[],f=0;f<c;f+=4)e.push(d);c=j.create(e,c);a.concat(c)},unpad:function(a){a.sigBytes-=a.words[a.sigBytes-1>>>2]&255}};e.BlockCipher=l.extend({cfg:l.cfg.extend({mode:k,padding:u}),reset:function(){l.reset.call(this);var a=this.cfg,b=a.iv,a=a.mode;if(this._xformMode==this._ENC_XFORM_MODE)var c=a.createEncryptor;
else c=a.createDecryptor,this._minBufferSize=1;this._mode=c.call(a,this,b&&b.words)},_doProcessBlock:function(a,b){this._mode.processBlock(a,b)},_doFinalize:function(){var a=this.cfg.padding;if(this._xformMode==this._ENC_XFORM_MODE){a.pad(this._data,this.blockSize);var b=this._process(!0)}else b=this._process(!0),a.unpad(b);return b},blockSize:4});var n=e.CipherParams=i.extend({init:function(a){this.mixIn(a)},toString:function(a){return(a||this.formatter).stringify(this)}}),k=(f.format={}).OpenSSL=
{stringify:function(a){var b=a.ciphertext,a=a.salt,b=(a?j.create([1398893684,1701076831]).concat(a).concat(b):b).toString(p);return b=b.replace(/(.{64})/g,"$1\n")},parse:function(a){var a=p.parse(a),b=a.words;if(1398893684==b[0]&&1701076831==b[1]){var c=j.create(b.slice(2,4));b.splice(0,4);a.sigBytes-=16}return n.create({ciphertext:a,salt:c})}},g=e.SerializableCipher=i.extend({cfg:i.extend({format:k}),encrypt:function(a,b,c,d){var d=this.cfg.extend(d),e=a.createEncryptor(c,d),b=e.finalize(b),e=e.cfg;
return n.create({ciphertext:b,key:c,iv:e.iv,algorithm:a,mode:e.mode,padding:e.padding,blockSize:a.blockSize,formatter:d.format})},decrypt:function(a,b,c,d){d=this.cfg.extend(d);b=this._parse(b,d.format);return a.createDecryptor(c,d).finalize(b.ciphertext)},_parse:function(a,b){return"string"==typeof a?b.parse(a):a}}),f=(f.kdf={}).OpenSSL={compute:function(a,b,c,d){d||(d=j.random(8));a=s.create({keySize:b+c}).compute(a,d);c=j.create(a.words.slice(b),4*c);a.sigBytes=4*b;return n.create({key:a,iv:c,
salt:d})}},q=e.PasswordBasedCipher=g.extend({cfg:g.cfg.extend({kdf:f}),encrypt:function(a,b,c,d){d=this.cfg.extend(d);c=d.kdf.compute(c,a.keySize,a.ivSize);d.iv=c.iv;a=g.encrypt.call(this,a,b,c.key,d);a.mixIn(c);return a},decrypt:function(a,b,c,d){d=this.cfg.extend(d);b=this._parse(b,d.format);c=d.kdf.compute(c,a.keySize,a.ivSize,b.salt);d.iv=c.iv;return g.decrypt.call(this,a,b,c.key,d)}})}();
/*
CryptoJS v3.0.2
code.google.com/p/crypto-js
(c) 2009-2012 by Jeff Mott. All rights reserved.
code.google.com/p/crypto-js/wiki/License
*/
(function(){var h=CryptoJS,i=h.lib.WordArray;h.enc.Base64={stringify:function(b){var e=b.words,f=b.sigBytes,c=this._map;b.clamp();for(var b=[],a=0;a<f;a+=3)for(var d=(e[a>>>2]>>>24-8*(a%4)&255)<<16|(e[a+1>>>2]>>>24-8*((a+1)%4)&255)<<8|e[a+2>>>2]>>>24-8*((a+2)%4)&255,g=0;4>g&&a+0.75*g<f;g++)b.push(c.charAt(d>>>6*(3-g)&63));if(e=c.charAt(64))for(;b.length%4;)b.push(e);return b.join("")},parse:function(b){var b=b.replace(/\s/g,""),e=b.length,f=this._map,c=f.charAt(64);c&&(c=b.indexOf(c),-1!=c&&(e=c));
for(var c=[],a=0,d=0;d<e;d++)if(d%4){var g=f.indexOf(b.charAt(d-1))<<2*(d%4),h=f.indexOf(b.charAt(d))>>>6-2*(d%4);c[a>>>2]|=(g|h)<<24-8*(a%4);a++}return i.create(c,a)},_map:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="}})();
/*
CryptoJS v3.0.2
code.google.com/p/crypto-js
(c) 2009-2012 by Jeff Mott. All rights reserved.
code.google.com/p/crypto-js/wiki/License
*/
(function(){var r=CryptoJS,u=r.lib.BlockCipher,o=r.algo,g=[],v=[],w=[],x=[],y=[],z=[],p=[],q=[],s=[],t=[];(function(){for(var b=[],c=0;256>c;c++)b[c]=128>c?c<<1:c<<1^283;for(var a=0,f=0,c=0;256>c;c++){var d=f^f<<1^f<<2^f<<3^f<<4,d=d>>>8^d&255^99;g[a]=d;v[d]=a;var e=b[a],A=b[e],h=b[A],i=257*b[d]^16843008*d;w[a]=i<<24|i>>>8;x[a]=i<<16|i>>>16;y[a]=i<<8|i>>>24;z[a]=i;i=16843009*h^65537*A^257*e^16843008*a;p[d]=i<<24|i>>>8;q[d]=i<<16|i>>>16;s[d]=i<<8|i>>>24;t[d]=i;a?(a=e^b[b[b[h^e]]],f^=b[b[f]]):a=f=1}})();
var B=[0,1,2,4,8,16,32,64,128,27,54],o=o.AES=u.extend({_doReset:function(){for(var b=this._key,c=b.words,a=b.sigBytes/4,b=4*((this._nRounds=a+6)+1),f=this._keySchedule=[],d=0;d<b;d++)if(d<a)f[d]=c[d];else{var e=f[d-1];d%a?6<a&&4==d%a&&(e=g[e>>>24]<<24|g[e>>>16&255]<<16|g[e>>>8&255]<<8|g[e&255]):(e=e<<8|e>>>24,e=g[e>>>24]<<24|g[e>>>16&255]<<16|g[e>>>8&255]<<8|g[e&255],e^=B[d/a|0]<<24);f[d]=f[d-a]^e}c=this._invKeySchedule=[];for(a=0;a<b;a++)d=b-a,e=a%4?f[d]:f[d-4],c[a]=4>a||4>=d?e:p[g[e>>>24]]^q[g[e>>>
16&255]]^s[g[e>>>8&255]]^t[g[e&255]]},encryptBlock:function(b,c){this._doCryptBlock(b,c,this._keySchedule,w,x,y,z,g)},decryptBlock:function(b,c){var a=b[c+1];b[c+1]=b[c+3];b[c+3]=a;this._doCryptBlock(b,c,this._invKeySchedule,p,q,s,t,v);a=b[c+1];b[c+1]=b[c+3];b[c+3]=a},_doCryptBlock:function(b,c,a,f,d,e,g,h){for(var i=this._nRounds,k=b[c]^a[0],l=b[c+1]^a[1],m=b[c+2]^a[2],j=b[c+3]^a[3],n=4,r=1;r<i;r++)var o=f[k>>>24]^d[l>>>16&255]^e[m>>>8&255]^g[j&255]^a[n++],p=f[l>>>24]^d[m>>>16&255]^e[j>>>8&255]^
g[k&255]^a[n++],q=f[m>>>24]^d[j>>>16&255]^e[k>>>8&255]^g[l&255]^a[n++],j=f[j>>>24]^d[k>>>16&255]^e[l>>>8&255]^g[m&255]^a[n++],k=o,l=p,m=q;o=(h[k>>>24]<<24|h[l>>>16&255]<<16|h[m>>>8&255]<<8|h[j&255])^a[n++];p=(h[l>>>24]<<24|h[m>>>16&255]<<16|h[j>>>8&255]<<8|h[k&255])^a[n++];q=(h[m>>>24]<<24|h[j>>>16&255]<<16|h[k>>>8&255]<<8|h[l&255])^a[n++];j=(h[j>>>24]<<24|h[k>>>16&255]<<16|h[l>>>8&255]<<8|h[m&255])^a[n++];b[c]=o;b[c+1]=p;b[c+2]=q;b[c+3]=j},keySize:8});r.AES=u._createHelper(o)})();
/*
CryptoJS v3.0.2
code.google.com/p/crypto-js
(c) 2009-2012 by Jeff Mott. All rights reserved.
code.google.com/p/crypto-js/wiki/License
*/
CryptoJS.mode.CTR=function(){var b=CryptoJS.lib.BlockCipherMode.extend(),g=b.Encryptor=b.extend({processBlock:function(b,f){var a=this._cipher,e=a.blockSize,c=this._iv,d=this._counter;c&&(d=this._counter=c.slice(0),this._iv=void 0);c=d.slice(0);a.encryptBlock(c,0);d[e-1]=d[e-1]+1|0;for(a=0;a<e;a++)b[f+a]^=c[a]}});b.Decryptor=g;return b}();
/*
CryptoJS v3.0.2
code.google.com/p/crypto-js
(c) 2009-2012 by Jeff Mott. All rights reserved.
code.google.com/p/crypto-js/wiki/License
*/
CryptoJS.pad.NoPadding={pad:function(){},unpad:function(){}};
/*
CryptoJS v3.0.2
code.google.com/p/crypto-js
(c) 2009-2012 by Jeff Mott. All rights reserved.
code.google.com/p/crypto-js/wiki/License
*/
(function(k){var h=CryptoJS,i=h.lib,r=i.WordArray,i=i.Hasher,c=h.algo,p=[],q=[];(function(){function g(a){for(var b=k.sqrt(a),d=2;d<=b;d++)if(!(a%d))return!1;return!0}function d(a){return 4294967296*(a-(a|0))|0}for(var a=2,b=0;64>b;)g(a)&&(8>b&&(p[b]=d(k.pow(a,0.5))),q[b]=d(k.pow(a,1/3)),b++),a++})();var g=[],c=c.SHA256=i.extend({_doReset:function(){this._hash=r.create(p.slice(0))},_doProcessBlock:function(i,d){for(var a=this._hash.words,b=a[0],m=a[1],n=a[2],h=a[3],f=a[4],c=a[5],o=a[6],k=a[7],e=0;64>
e;e++){if(16>e)g[e]=i[d+e]|0;else{var j=g[e-15],l=g[e-2];g[e]=((j<<25|j>>>7)^(j<<14|j>>>18)^j>>>3)+g[e-7]+((l<<15|l>>>17)^(l<<13|l>>>19)^l>>>10)+g[e-16]}j=k+((f<<26|f>>>6)^(f<<21|f>>>11)^(f<<7|f>>>25))+(f&c^~f&o)+q[e]+g[e];l=((b<<30|b>>>2)^(b<<19|b>>>13)^(b<<10|b>>>22))+(b&m^b&n^m&n);k=o;o=c;c=f;f=h+j|0;h=n;n=m;m=b;b=j+l|0}a[0]=a[0]+b|0;a[1]=a[1]+m|0;a[2]=a[2]+n|0;a[3]=a[3]+h|0;a[4]=a[4]+f|0;a[5]=a[5]+c|0;a[6]=a[6]+o|0;a[7]=a[7]+k|0},_doFinalize:function(){var c=this._data,d=c.words,a=8*this._nDataBytes,
b=8*c.sigBytes;d[b>>>5]|=128<<24-b%32;d[(b+64>>>9<<4)+15]=a;c.sigBytes=4*d.length;this._process()}});h.SHA256=i._createHelper(c);h.HmacSHA256=i._createHmacHelper(c)})(Math);
/*
CryptoJS v3.0.2
code.google.com/p/crypto-js
(c) 2009-2012 by Jeff Mott. All rights reserved.
code.google.com/p/crypto-js/wiki/License
*/
(function(){var d=CryptoJS,c=d.lib,l=c.WordArray,c=c.Hasher,j=[],k=d.algo.SHA1=c.extend({_doReset:function(){this._hash=l.create([1732584193,4023233417,2562383102,271733878,3285377520])},_doProcessBlock:function(c,m){for(var a=this._hash.words,e=a[0],f=a[1],h=a[2],i=a[3],d=a[4],b=0;80>b;b++){if(16>b)j[b]=c[m+b]|0;else{var g=j[b-3]^j[b-8]^j[b-14]^j[b-16];j[b]=g<<1|g>>>31}g=(e<<5|e>>>27)+d+j[b];g=20>b?g+((f&h|~f&i)+1518500249):40>b?g+((f^h^i)+1859775393):60>b?g+((f&h|f&i|h&i)-1894007588):g+((f^h^i)-
899497514);d=i;i=h;h=f<<30|f>>>2;f=e;e=g}a[0]=a[0]+e|0;a[1]=a[1]+f|0;a[2]=a[2]+h|0;a[3]=a[3]+i|0;a[4]=a[4]+d|0},_doFinalize:function(){var d=this._data,c=d.words,a=8*this._nDataBytes,e=8*d.sigBytes;c[e>>>5]|=128<<24-e%32;c[(e+64>>>9<<4)+15]=a;d.sigBytes=4*c.length;this._process()}});d.SHA1=c._createHelper(k);d.HmacSHA1=c._createHmacHelper(k)})();
/*
CryptoJS v3.0.2
code.google.com/p/crypto-js
(c) 2009-2012 by Jeff Mott. All rights reserved.
code.google.com/p/crypto-js/wiki/License
*/
(function(){var c=CryptoJS,j=c.enc.Utf8;c.algo.HMAC=c.lib.Base.extend({init:function(a,b){a=this._hasher=a.create();"string"==typeof b&&(b=j.parse(b));var c=a.blockSize,e=4*c;b.sigBytes>e&&(b=a.finalize(b));for(var f=this._oKey=b.clone(),g=this._iKey=b.clone(),h=f.words,i=g.words,d=0;d<c;d++)h[d]^=1549556828,i[d]^=909522486;f.sigBytes=g.sigBytes=e;this.reset()},reset:function(){var a=this._hasher;a.reset();a.update(this._iKey)},update:function(a){this._hasher.update(a);return this},finalize:function(a){var b=
this._hasher,a=b.finalize(a);b.reset();return b.finalize(this._oKey.clone().concat(a))}})})();
var Otr=Otr||(function(){"use strict";var _={MSGSTATE_PLAINTEXT:0,MSGSTATE_ENCRYPTED:1,MSGSTATE_FINISHED:2,AUTHSTATE_NONE:0,AUTHSTATE_AWAITING_DHKEY:1,AUTHSTATE_AWAITING_REVEALSIG:2,AUTHSTATE_AWAITING_SIG:3,AUTHSTATE_V1_SETUP:4,ALLOW_V1:0x01,ALLOW_V2:0x02,REQUIRE_ENCRYPTION:0x04,SEND_WHITESPACE_TAG:0x08,WHITESPACE_START_AKE:0x10,ERROR_START_AKE:0x20};_.NEVER=0x00;_.MANUAL=(_.ALLOW_V1|_.ALLOW_V2);_.OPPORTUNISTIC=(_.ALLOW_V1|_.ALLOW_V2|_.SEND_WHITESPACE_TAG|_.WHITESPACE_START_AKE|_.ERROR_START_AKE);_.ALWAYS=(_.ALLOW_V1|_.ALLOW_V2|_.REQUIRE_ENCRYPTION|_.WHITESPACE_START_AKE|_.ERROR_START_AKE);return _;}());
Otr.Util=(function(){var Util={byteArrayToWordArray:function(ba){var offset=0,sigBytes=ba.length,words=[];while(offset<sigBytes){words.push((ba[offset++]&0xFF)<<24|(ba[offset++]&0xFF)<<16|(ba[offset++]&0xFF)<<8|(ba[offset++]&0xFF));}
return CryptoJS.lib.WordArray.create(words,sigBytes);},wordArrayToByteArray:function(wa){var ba=[],i,l,word,remains=wa.sigBytes;for(i=0,l=wa.words.length;i<l;++i){word=wa.words[i];if(remains>=4){ba.push((word>>24)&0xFF);ba.push((word>>16)&0xFF);ba.push((word>>8)&0xFF);ba.push((word)&0xFF);}else if(remains===3){ba.push((word>>24)&0xFF);ba.push((word>>16)&0xFF);ba.push((word>>8)&0xFF);}else if(remains===2){ba.push((word>>24)&0xFF);ba.push((word>>16)&0xFF);}else if(remains===1){ba.push((word>>24)&0xFF);}else{break;}
remains-=4;}
return ba;},stringToByteArray:function(str){var i,l,ba=[];for(i=0,l=str.length;i<l;++i){ba[i]=str.charCodeAt(i)&0xFF;}
return ba;},createIV:function(bit,tophalf){var nbyte=Math.floor(bit/8),nword=Math.floor(bit/32),i,l,words=[];if(tophalf){for(i=0,l=tophalf.length;i<l;i+=4){words.push((tophalf[i]&0xFF)<<24|(tophalf[i+1]&0xFF)<<16|(tophalf[i+2]&0xFF)<<8|(tophalf[i+3]&0xFF));}
nword-=Math.ceil(tophalf.length/4);}
for(i=0;i<nword;++i){words.push(0);}
return CryptoJS.lib.WordArray.create(words,nbyte);},bytesEqual:function(bytes1,bytes2){var len=bytes1.length;if(bytes1.length!==bytes2.length)return false;while(len--){if((bytes1[len]&0xFF)!==(bytes2[len]&0xFF))return false;}
return true;},correctWordsLength:function(wa){wa.words.length=Math.floor((wa.sigBytes-1)/4)+1;},nextBytes:function(ba){for(var i=0;i<ba.length;++i)ba[i]=Math.floor(Math.random()*256);}};return Util;}());
Otr.BigInteger=(function(){function BigInteger(param1,param2){if(Object.prototype.toString.call(param1)==="[object Array]"&&typeof param2==='undefined'){this._=param1;}else if(typeof param1==='number'&&typeof param2==='number'){this._=randProbPrime(param1);}else if(typeof param1==='number'&&typeof param2==='undefined'){this._=randBigInt(param1);}else if(typeof param1==='string'&&typeof param2==='undefined'){this._=str2bigInt(param1,10);}else if(typeof param1==='string'&&typeof param2==='number'){this._=str2bigInt(param1,param2);}else{throw new Error('Invalid parameter');}}
BigInteger.prototype={_:null,add:function(val){return new BigInteger(add(this._,val._));},divide:function(val){var q=str2bigInt('0',10,bitSize(this._)),r=str2bigInt('0',10,bitSize(val._));divide_(this._,val._,q,r);return new BigInteger(q);},mod:function(m){return new BigInteger(mod(this._,m._));},modInverse:function(m){return new BigInteger(inverseMod(this._,m._));},modPow:function(exponent,m){return new BigInteger(powMod(this._,exponent._,m._));},multiply:function(val){return new BigInteger(mult(this._,val._));},remainder:function(val){var q=str2bigInt('0',10,bitSize(this._)),r=str2bigInt('0',10,bitSize(val._));divide_(this._,val._,q,r);return new BigInteger(r);},shiftLeft:function(n){var ans=expand(this._,this._.length+1);leftShift_(ans,n);return new BigInteger(ans);},shiftRight:function(n){var ans=dup(this._);rightShift_(ans,n);return new BigInteger(ans);},subtract:function(val){return new BigInteger(sub(this._,val._));},bitCount:function(){return bitSize(this._);},bitLength:function(){return bitSize(this._);},clone:function(){return new BigInteger(dup(this._));},compareTo:function(val){if(greater(this._,val._))return 1;if(equals(this._,val._))return 0;return-1;},equals:function(val){return equals(this._,val._);},isProbablePrime:function(certainty){return isProbablePrime(this._,certainty);},toByteArray:function(){var hex=this.toString(16),ans=new Array(Math.ceil(hex.length/2)),vls={'0':0,'1':1,'2':2,'3':3,'4':4,'5':5,'6':6,'7':7,'8':8,'9':9,'A':10,'B':11,'C':12,'D':13,'E':14,'F':15};if(hex.length%2===1){hex='0'+hex;}
for(var i=0,j=0,n=hex.length;j<n;++i,j+=2){ans[i]=(vls[hex[j]]<<4)+vls[hex[j+1]];}
return ans;},toString:function(radix){if(typeof radix==='undefined')radix=10;return bigInt2str(this._,radix);}};BigInteger.fromMagnitude=function(sign,bytes){if(sign===0){return new BigInteger('0');}else{var hex='',b,ans;for(var i=0,n=bytes.length;i<n;++i){b=bytes[i]&0xFF;hex+=digitsStr[b>>4]+digitsStr[b&15];}
ans=str2bigInt(hex,16);if(sign===-1)multInt_(ans,-1);return new BigInteger(ans);}};BigInteger.generate=function(x){return new BigInteger(randBigInt(x,1));};var lowprimes=[2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,199,211,223,227,229,233,239,241,251,257,263,269,271,277,281,283,293,307,311,313,317,331,337,347,349,353,359,367,373,379,383,389,397,401,409,419,421,431,433,439,443,449,457,461,463,467,479,487,491,499,503,509,521,523,541,547,557,563,569,571,577,587,593,599,601,607,613,617,619,631,641,643,647,653,659,661,673,677,683,691,701,709,719,727,733,739,743,751,757,761,769,773,787,797,809,811,821,823,827,829,839,853,857,859,863,877,881,883,887,907,911,919,929,937,941,947,953,967,971,977,983,991,997];var lplim=(1<<26)/lowprimes[lowprimes.length-1];function isProbablePrime(x,repeat){var t=x.length-1;for(;t>=0&&x[t]===0;t--);var i;if(t==1&&x[0]<=lowprimes[lowprimes.length-1]){for(i=0;i<lowprimes.length;++i)
if(x[0]==lowprimes[i])return true;return false;}
if((x[0]%2)===0)return false;i=1;var m,j;while(i<lowprimes.length){m=lowprimes[i];j=i+1;while(j<lowprimes.length&&m<lplim)m*=lowprimes[j++];m=modInt(x,m);while(i<j)if(m%lowprimes[i++]===0)return false;}
return arlolMillerRabin(x,repeat);}
function lbit(x){if(x===0)return-1;var k=0;while((x&1)===0)x>>=1,k++;return k;}
function lowestSetBit(x){var t=x.length-1;for(;t>=0&&x[t]===0;t--);var i=0;for(;i<t;i++)
if(x[i]!==0)return(i*bpe)+lbit(x[i]);return-1;}
function arlolMillerRabin(x,repeat){var n1=sub(x,ONE);var k=lowestSetBit(n1);if(k<=0)return false;var r=dup(n1);rightShift_(r,k);repeat=(repeat+1)>>1;if(repeat>lowprimes.length)repeat=lowprimes.length;var a,i,y,j;for(i=0;i<repeat;i++){a=lowprimes[Math.floor(Math.random()*lowprimes.length)];a=int2bigInt(a,0);y=powMod(a,r,x);if(!equals(y,ONE)&&!equals(y,n1)){j=1;while(j++<k&&!equals(y,n1)){y=powMod(y,TWO,x);if(equals(y,ONE))return false;}
if(!equals(y,n1))return false;}}
return true;}
var bpe,mask,radix,digitsStr,one,ONE,TWO,t,ss,s0,s1,s2,s3,s4,s5,s6,s7,T,sa,mr_x1,mr_r,mr_a,eg_v,eg_u,eg_A,eg_B,eg_C,eg_D,md_q1,md_q2,md_q3,md_r,md_r1,md_r2,md_tt,primes,pows,s_i,s_i2,s_R,s_rm,s_q,s_n1,s_a,s_r2,s_n,s_b,s_d,s_x1,s_x2,s_aa,rpprb;bpe=0;mask=0;radix=mask+1;digitsStr='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_=!@#$%^&*()[]{}|;:,.<>/?`~ \\\'\"+-';for(bpe=0;(1<<(bpe+1))>(1<<bpe);bpe++);bpe>>=1;mask=(1<<bpe)-1;radix=mask+1;one=ONE=int2bigInt(1,1,1);TWO=int2bigInt(2,2,1);t=new Array(0);ss=t;s0=t;s1=t;s2=t;s3=t;s4=t;s5=t;s6=t;s7=t;T=t;sa=t;mr_x1=t;mr_r=t;mr_a=t;eg_v=t;eg_u=t;eg_A=t;eg_B=t;eg_C=t;eg_D=t;md_q1=t;md_q2=t;md_q3=t;md_r=t;md_r1=t;md_r2=t;md_tt=t;primes=t;pows=t;s_i=t;s_i2=t;s_R=t;s_rm=t;s_q=t;s_n1=t;s_a=t;s_r2=t;s_n=t;s_b=t;s_d=t;s_x1=t;s_x2=t,s_aa=t;rpprb=t;function findPrimes(n){var i,s,p,ans;s=new Array(n);for(i=0;i<n;i++)
s[i]=0;s[0]=2;p=0;for(;s[p]<n;){for(i=s[p]*s[p];i<n;i+=s[p])
s[i]=1;p++;s[p]=s[p-1]+1;for(;s[p]<n&&s[s[p]];s[p]++);}
ans=new Array(p);for(i=0;i<p;i++)
ans[i]=s[i];return ans;}
function millerRabinInt(x,b){if(mr_x1.length!=x.length){mr_x1=dup(x);mr_r=dup(x);mr_a=dup(x);}
copyInt_(mr_a,b);return millerRabin(x,mr_a);}
function millerRabin(x,b){var i,j,k,s;if(mr_x1.length!=x.length){mr_x1=dup(x);mr_r=dup(x);mr_a=dup(x);}
copy_(mr_a,b);copy_(mr_r,x);copy_(mr_x1,x);addInt_(mr_r,-1);addInt_(mr_x1,-1);k=0;for(i=0;i<mr_r.length;i++)
for(j=1;j<mask;j<<=1)
if(x[i]&j){s=(k<mr_r.length+bpe?k:0);i=mr_r.length;j=mask;}else
k++;if(s)
rightShift_(mr_r,s);powMod_(mr_a,mr_r,x);if(!equalsInt(mr_a,1)&&!equals(mr_a,mr_x1)){j=1;while(j<=s-1&&!equals(mr_a,mr_x1)){squareMod_(mr_a,x);if(equalsInt(mr_a,1)){return 0;}
j++;}
if(!equals(mr_a,mr_x1)){return 0;}}
return 1;}
function bitSize(x){var j,z,w;for(j=x.length-1;(x[j]==0)&&(j>0);j--);for(z=0,w=x[j];w;(w>>=1),z++);z+=bpe*j;return z;}
function expand(x,n){var ans=int2bigInt(0,(x.length>n?x.length:n)*bpe,0);copy_(ans,x);return ans;}
function randTruePrime(k){var ans=int2bigInt(0,k,0);randTruePrime_(ans,k);return trim(ans,1);}
function randProbPrime(k){if(k>=600)return randProbPrimeRounds(k,2);if(k>=550)return randProbPrimeRounds(k,4);if(k>=500)return randProbPrimeRounds(k,5);if(k>=400)return randProbPrimeRounds(k,6);if(k>=350)return randProbPrimeRounds(k,7);if(k>=300)return randProbPrimeRounds(k,9);if(k>=250)return randProbPrimeRounds(k,12);if(k>=200)return randProbPrimeRounds(k,15);if(k>=150)return randProbPrimeRounds(k,18);if(k>=100)return randProbPrimeRounds(k,27);return randProbPrimeRounds(k,40);}
function randProbPrimeRounds(k,n){var ans,i,divisible,B;B=30000;ans=int2bigInt(0,k,0);if(primes.length==0)
primes=findPrimes(30000);if(rpprb.length!=ans.length)
rpprb=dup(ans);for(;;){randBigInt_(ans,k,0);ans[0]|=1;divisible=0;for(i=0;(i<primes.length)&&(primes[i]<=B);i++)
if(modInt(ans,primes[i])==0&&!equalsInt(ans,primes[i])){divisible=1;break;}
for(i=0;i<n&&!divisible;i++){randBigInt_(rpprb,k,0);while(!greater(ans,rpprb))
randBigInt_(rpprb,k,0);if(!millerRabin(ans,rpprb))
divisible=1;}
if(!divisible)
return ans;}}
function mod(x,n){var ans=dup(x);mod_(ans,n);return trim(ans,1);}
function addInt(x,n){var ans=expand(x,x.length+1);addInt_(ans,n);return trim(ans,1);}
function mult(x,y){var ans=expand(x,x.length+y.length);mult_(ans,y);return trim(ans,1);}
function powMod(x,y,n){var ans=expand(x,n.length);powMod_(ans,trim(y,2),trim(n,2),0);return trim(ans,1);}
function sub(x,y){var ans=expand(x,(x.length>y.length?x.length+1:y.length+1));sub_(ans,y);return trim(ans,1);}
function add(x,y){var ans=expand(x,(x.length>y.length?x.length+1:y.length+1));add_(ans,y);return trim(ans,1);}
function inverseMod(x,n){var ans=expand(x,n.length);var s;s=inverseMod_(ans,n);return s?trim(ans,1):null;}
function multMod(x,y,n){var ans=expand(x,n.length);multMod_(ans,y,n);return trim(ans,1);}
function randTruePrime_(ans,k){var c,m,pm,dd,j,r,B,divisible,z,zz,recSize;if(primes.length==0)
primes=findPrimes(30000);if(pows.length==0){pows=new Array(512);for(j=0;j<512;j++){pows[j]=Math.pow(2,j/511.-1.);}}
c=0.1;m=20;recLimit=20;if(s_i2.length!=ans.length){s_i2=dup(ans);s_R=dup(ans);s_n1=dup(ans);s_r2=dup(ans);s_d=dup(ans);s_x1=dup(ans);s_x2=dup(ans);s_b=dup(ans);s_n=dup(ans);s_i=dup(ans);s_rm=dup(ans);s_q=dup(ans);s_a=dup(ans);s_aa=dup(ans);}
if(k<=recLimit){pm=(1<<((k+2)>>1))-1;copyInt_(ans,0);for(dd=1;dd;){dd=0;ans[0]=1|(1<<(k-1))|Math.floor(Math.random()*(1<<k));for(j=1;(j<primes.length)&&((primes[j]&pm)==primes[j]);j++){if(0==(ans[0]%primes[j])){dd=1;break;}}}
carry_(ans);return;}
B=c*k*k;if(k>2*m)
for(r=1;k-k*r<=m;)
r=pows[Math.floor(Math.random()*512)];else
r=.5;recSize=Math.floor(r*k)+1;randTruePrime_(s_q,recSize);copyInt_(s_i2,0);s_i2[Math.floor((k-2)/bpe)]|=(1<<((k-2)%bpe));divide_(s_i2,s_q,s_i,s_rm);z=bitSize(s_i);for(;;){for(;;){randBigInt_(s_R,z,0);if(greater(s_i,s_R))
break;}
addInt_(s_R,1);add_(s_R,s_i);copy_(s_n,s_q);mult_(s_n,s_R);multInt_(s_n,2);addInt_(s_n,1);copy_(s_r2,s_R);multInt_(s_r2,2);for(divisible=0,j=0;(j<primes.length)&&(primes[j]<B);j++)
if(modInt(s_n,primes[j])==0&&!equalsInt(s_n,primes[j])){divisible=1;break;}
if(!divisible)
if(!millerRabinInt(s_n,2))
divisible=1;if(!divisible){addInt_(s_n,-3);for(j=s_n.length-1;(s_n[j]==0)&&(j>0);j--);for(zz=0,w=s_n[j];w;(w>>=1),zz++);zz+=bpe*j;for(;;){randBigInt_(s_a,zz,0);if(greater(s_n,s_a))
break;}
addInt_(s_n,3);addInt_(s_a,2);copy_(s_b,s_a);copy_(s_n1,s_n);addInt_(s_n1,-1);powMod_(s_b,s_n1,s_n);addInt_(s_b,-1);if(isZero(s_b)){copy_(s_b,s_a);powMod_(s_b,s_r2,s_n);addInt_(s_b,-1);copy_(s_aa,s_n);copy_(s_d,s_b);GCD_(s_d,s_n);if(equalsInt(s_d,1)){copy_(ans,s_aa);return;}}}}}
function randBigInt(n,s){var a,b;a=Math.floor((n-1)/bpe)+2;b=int2bigInt(0,0,a);randBigInt_(b,n,s);return b;}
function randBigInt_(b,n,s){var i,a;for(i=0;i<b.length;i++)
b[i]=0;a=Math.floor((n-1)/bpe)+1;for(i=0;i<a;i++){b[i]=Math.floor(Math.random()*(1<<(bpe-1)));}
b[a-1]&=(2<<((n-1)%bpe))-1;if(s==1)
b[a-1]|=(1<<((n-1)%bpe));}
function GCD(x,y){var xc,yc;xc=dup(x);yc=dup(y);GCD_(xc,yc);return xc;}
function GCD_(x,y){var i,xp,yp,A,B,C,D,q,sing;if(T.length!=x.length)
T=dup(x);sing=1;while(sing){sing=0;for(i=1;i<y.length;i++)
if(y[i]){sing=1;break;}
if(!sing)break;for(i=x.length;!x[i]&&i>=0;i--);xp=x[i];yp=y[i];A=1;B=0;C=0;D=1;while((yp+C)&&(yp+D)){q=Math.floor((xp+A)/(yp+C));qp=Math.floor((xp+B)/(yp+D));if(q!=qp)
break;t=A-q*C;A=C;C=t;t=B-q*D;B=D;D=t;t=xp-q*yp;xp=yp;yp=t;}
if(B){copy_(T,x);linComb_(x,y,A,B);linComb_(y,T,D,C);}else{mod_(x,y);copy_(T,x);copy_(x,y);copy_(y,T);}}
if(y[0]==0)
return;t=modInt(x,y[0]);copyInt_(x,y[0]);y[0]=t;while(y[0]){x[0]%=y[0];t=x[0];x[0]=y[0];y[0]=t;}}
function inverseMod_(x,n){var k=1+2*Math.max(x.length,n.length);if(!(x[0]&1)&&!(n[0]&1)){copyInt_(x,0);return 0;}
if(eg_u.length!=k){eg_u=new Array(k);eg_v=new Array(k);eg_A=new Array(k);eg_B=new Array(k);eg_C=new Array(k);eg_D=new Array(k);}
copy_(eg_u,x);copy_(eg_v,n);copyInt_(eg_A,1);copyInt_(eg_B,0);copyInt_(eg_C,0);copyInt_(eg_D,1);for(;;){while(!(eg_u[0]&1)){halve_(eg_u);if(!(eg_A[0]&1)&&!(eg_B[0]&1)){halve_(eg_A);halve_(eg_B);}else{add_(eg_A,n);halve_(eg_A);sub_(eg_B,x);halve_(eg_B);}}
while(!(eg_v[0]&1)){halve_(eg_v);if(!(eg_C[0]&1)&&!(eg_D[0]&1)){halve_(eg_C);halve_(eg_D);}else{add_(eg_C,n);halve_(eg_C);sub_(eg_D,x);halve_(eg_D);}}
if(!greater(eg_v,eg_u)){sub_(eg_u,eg_v);sub_(eg_A,eg_C);sub_(eg_B,eg_D);}else{sub_(eg_v,eg_u);sub_(eg_C,eg_A);sub_(eg_D,eg_B);}
if(equalsInt(eg_u,0)){if(negative(eg_C))
add_(eg_C,n);copy_(x,eg_C);if(!equalsInt(eg_v,1)){copyInt_(x,0);return 0;}
return 1;}}}
function inverseModInt(x,n){var a=1,b=0,t;for(;;){if(x==1)return a;if(x==0)return 0;b-=a*Math.floor(n/x);n%=x;if(n==1)return b;if(n==0)return 0;a-=b*Math.floor(x/n);x%=n;}}
function inverseModInt_(x,n){return inverseModInt(x,n);}
function eGCD_(x,y,v,a,b){var g=0;var k=Math.max(x.length,y.length);if(eg_u.length!=k){eg_u=new Array(k);eg_A=new Array(k);eg_B=new Array(k);eg_C=new Array(k);eg_D=new Array(k);}
while(!(x[0]&1)&&!(y[0]&1)){halve_(x);halve_(y);g++;}
copy_(eg_u,x);copy_(v,y);copyInt_(eg_A,1);copyInt_(eg_B,0);copyInt_(eg_C,0);copyInt_(eg_D,1);for(;;){while(!(eg_u[0]&1)){halve_(eg_u);if(!(eg_A[0]&1)&&!(eg_B[0]&1)){halve_(eg_A);halve_(eg_B);}else{add_(eg_A,y);halve_(eg_A);sub_(eg_B,x);halve_(eg_B);}}
while(!(v[0]&1)){halve_(v);if(!(eg_C[0]&1)&&!(eg_D[0]&1)){halve_(eg_C);halve_(eg_D);}else{add_(eg_C,y);halve_(eg_C);sub_(eg_D,x);halve_(eg_D);}}
if(!greater(v,eg_u)){sub_(eg_u,v);sub_(eg_A,eg_C);sub_(eg_B,eg_D);}else{sub_(v,eg_u);sub_(eg_C,eg_A);sub_(eg_D,eg_B);}
if(equalsInt(eg_u,0)){if(negative(eg_C)){add_(eg_C,y);sub_(eg_D,x);}
multInt_(eg_D,-1);copy_(a,eg_C);copy_(b,eg_D);leftShift_(v,g);return;}}}
function negative(x){return((x[x.length-1]>>(bpe-1))&1);}
function greaterShift(x,y,shift){var i,kx=x.length,ky=y.length;k=((kx+shift)<ky)?(kx+shift):ky;for(i=ky-1-shift;i<kx&&i>=0;i++)
if(x[i]>0)
return 1;for(i=kx-1+shift;i<ky;i++)
if(y[i]>0)
return 0;for(i=k-1;i>=shift;i--)
if(x[i-shift]>y[i])return 1;else if(x[i-shift]<y[i])return 0;return 0;}
function greater(x,y){var i;var k=(x.length<y.length)?x.length:y.length;for(i=x.length;i<y.length;i++)
if(y[i])
return 0;for(i=y.length;i<x.length;i++)
if(x[i])
return 1;for(i=k-1;i>=0;i--)
if(x[i]>y[i])
return 1;else if(x[i]<y[i])
return 0;return 0;}
function divide_(x,y,q,r){var kx,ky;var i,j,y1,y2,c,a,b;copy_(r,x);for(ky=y.length;y[ky-1]==0;ky--);b=y[ky-1];for(a=0;b;a++)
b>>=1;a=bpe-a;leftShift_(y,a);leftShift_(r,a);for(kx=r.length;r[kx-1]==0&&kx>ky;kx--);copyInt_(q,0);while(!greaterShift(y,r,kx-ky)){subShift_(r,y,kx-ky);q[kx-ky]++;}
for(i=kx-1;i>=ky;i--){if(r[i]==y[ky-1])
q[i-ky]=mask;else
q[i-ky]=Math.floor((r[i]*radix+r[i-1])/y[ky-1]);for(;;){y2=(ky>1?y[ky-2]:0)*q[i-ky];c=y2>>bpe;y2=y2&mask;y1=c+q[i-ky]*y[ky-1];c=y1>>bpe;y1=y1&mask;if(c==r[i]?y1==r[i-1]?y2>(i>1?r[i-2]:0):y1>r[i-1]:c>r[i])
q[i-ky]--;else
break;}
linCombShift_(r,y,-q[i-ky],i-ky);if(negative(r)){addShift_(r,y,i-ky);q[i-ky]--;}}
rightShift_(y,a);rightShift_(r,a);}
function carry_(x){var i,k,c,b;k=x.length;c=0;for(i=0;i<k;i++){c+=x[i];b=0;if(c<0){b=-(c>>bpe);c+=b*radix;}
x[i]=c&mask;c=(c>>bpe)-b;}}
function modInt(x,n){var i,c=0;for(i=x.length-1;i>=0;i--)
c=(c*radix+x[i])%n;return c;}
function int2bigInt(t,bits,minSize){var i,k,buff;k=Math.ceil(bits/bpe)+1;k=minSize>k?minSize:k;buff=new Array(k);copyInt_(buff,t);return buff;}
function str2bigInt(s,base,minSize){var d,i,j,x,y,kk;var k=s.length;if(base==-1){x=new Array(0);for(;;){y=new Array(x.length+1);for(i=0;i<x.length;i++)
y[i+1]=x[i];y[0]=parseInt(s,10);x=y;d=s.indexOf(',',0);if(d<1)
break;s=s.substring(d+1);if(s.length==0)
break;}
if(x.length<minSize){y=new Array(minSize);copy_(y,x);return y;}
return x;}
x=int2bigInt(0,base*k,0);for(i=0;i<k;i++){d=digitsStr.indexOf(s.substring(i,i+1),0);if(base<=36&&d>=36)
d-=26;if(d>=base||d<0){break;}
multInt_(x,base);addInt_(x,d);}
for(k=x.length;k>0&&!x[k-1];k--);k=minSize>k+1?minSize:k+1;y=new Array(k);kk=k<x.length?k:x.length;for(i=0;i<kk;i++)
y[i]=x[i];for(;i<k;i++)
y[i]=0;return y;}
function equalsInt(x,y){var i;if(x[0]!=y)
return 0;for(i=1;i<x.length;i++)
if(x[i])
return 0;return 1;}
function equals(x,y){var i;var k=x.length<y.length?x.length:y.length;for(i=0;i<k;i++)
if(x[i]!=y[i])
return 0;if(x.length>y.length){for(;i<x.length;i++)
if(x[i])
return 0;}else{for(;i<y.length;i++)
if(y[i])
return 0;}
return 1;}
function isZero(x){var i;for(i=0;i<x.length;i++)
if(x[i])
return 0;return 1;}
function bigInt2str(x,base){var i,t,s="";if(s6.length!=x.length)
s6=dup(x);else
copy_(s6,x);if(base==-1){for(i=x.length-1;i>0;i--)
s+=x[i]+',';s+=x[0];}
else{while(!isZero(s6)){t=divInt_(s6,base);s=digitsStr.substring(t,t+1)+s;}}
if(s.length==0)
s="0";return s;}
function dup(x){var i,buff;buff=new Array(x.length);copy_(buff,x);return buff;}
function copy_(x,y){var i;var k=x.length<y.length?x.length:y.length;for(i=0;i<k;i++)
x[i]=y[i];for(i=k;i<x.length;i++)
x[i]=0;}
function copyInt_(x,n){var i,c;for(c=n,i=0;i<x.length;i++){x[i]=c&mask;c>>=bpe;}}
function addInt_(x,n){var i,k,c,b;x[0]+=n;k=x.length;c=0;for(i=0;i<k;i++){c+=x[i];b=0;if(c<0){b=-(c>>bpe);c+=b*radix;}
x[i]=c&mask;c=(c>>bpe)-b;if(!c)return;}}
function rightShift_(x,n){var i;var k=Math.floor(n/bpe);if(k){for(i=0;i<x.length-k;i++)
x[i]=x[i+k];for(;i<x.length;i++)
x[i]=0;n%=bpe;}
for(i=0;i<x.length-1;i++){x[i]=mask&((x[i+1]<<(bpe-n))|(x[i]>>n));}
x[i]>>=n;}
function halve_(x){var i;for(i=0;i<x.length-1;i++){x[i]=mask&((x[i+1]<<(bpe-1))|(x[i]>>1));}
x[i]=(x[i]>>1)|(x[i]&(radix>>1));}
function leftShift_(x,n){var i;var k=Math.floor(n/bpe);if(k){for(i=x.length;i>=k;i--)
x[i]=x[i-k];for(;i>=0;i--)
x[i]=0;n%=bpe;}
if(!n)
return;for(i=x.length-1;i>0;i--){x[i]=mask&((x[i]<<n)|(x[i-1]>>(bpe-n)));}
x[i]=mask&(x[i]<<n);}
function multInt_(x,n){var i,k,c,b;if(!n)
return;k=x.length;c=0;for(i=0;i<k;i++){c+=x[i]*n;b=0;if(c<0){b=-(c>>bpe);c+=b*radix;}
x[i]=c&mask;c=(c>>bpe)-b;}}
function divInt_(x,n){var i,r=0,s;for(i=x.length-1;i>=0;i--){s=r*radix+x[i];x[i]=Math.floor(s/n);r=s%n;}
return r;}
function linComb_(x,y,a,b){var i,c,k,kk;k=x.length<y.length?x.length:y.length;kk=x.length;for(c=0,i=0;i<k;i++){c+=a*x[i]+b*y[i];x[i]=c&mask;c>>=bpe;}
for(i=k;i<kk;i++){c+=a*x[i];x[i]=c&mask;c>>=bpe;}}
function linCombShift_(x,y,b,ys){var i,c,k,kk;k=x.length<ys+y.length?x.length:ys+y.length;kk=x.length;for(c=0,i=ys;i<k;i++){c+=x[i]+b*y[i-ys];x[i]=c&mask;c>>=bpe;}
for(i=k;c&&i<kk;i++){c+=x[i];x[i]=c&mask;c>>=bpe;}}
function addShift_(x,y,ys){var i,c,k,kk;k=x.length<ys+y.length?x.length:ys+y.length;kk=x.length;for(c=0,i=ys;i<k;i++){c+=x[i]+y[i-ys];x[i]=c&mask;c>>=bpe;}
for(i=k;c&&i<kk;i++){c+=x[i];x[i]=c&mask;c>>=bpe;}}
function subShift_(x,y,ys){var i,c,k,kk;k=x.length<ys+y.length?x.length:ys+y.length;kk=x.length;for(c=0,i=ys;i<k;i++){c+=x[i]-y[i-ys];x[i]=c&mask;c>>=bpe;}
for(i=k;c&&i<kk;i++){c+=x[i];x[i]=c&mask;c>>=bpe;}}
function sub_(x,y){var i,c,k,kk;k=x.length<y.length?x.length:y.length;for(c=0,i=0;i<k;i++){c+=x[i]-y[i];x[i]=c&mask;c>>=bpe;}
for(i=k;c&&i<x.length;i++){c+=x[i];x[i]=c&mask;c>>=bpe;}}
function add_(x,y){var i,c,k,kk;k=x.length<y.length?x.length:y.length;for(c=0,i=0;i<k;i++){c+=x[i]+y[i];x[i]=c&mask;c>>=bpe;}
for(i=k;c&&i<x.length;i++){c+=x[i];x[i]=c&mask;c>>=bpe;}}
function mult_(x,y){var i;if(ss.length!=2*x.length)
ss=new Array(2*x.length);copyInt_(ss,0);for(i=0;i<y.length;i++)
if(y[i])
linCombShift_(ss,x,y[i],i);copy_(x,ss);}
function mod_(x,n){if(s4.length!=x.length)
s4=dup(x);else
copy_(s4,x);if(s5.length!=x.length)
s5=dup(x);divide_(s4,n,s5,x);}
function multMod_(x,y,n){var i;if(s0.length!=2*x.length)
s0=new Array(2*x.length);copyInt_(s0,0);for(i=0;i<y.length;i++)
if(y[i])
linCombShift_(s0,x,y[i],i);mod_(s0,n);copy_(x,s0);}
function squareMod_(x,n){var i,j,d,c,kx,kn,k;for(kx=x.length;kx>0&&!x[kx-1];kx--);k=kx>n.length?2*kx:2*n.length;if(s0.length!=k)
s0=new Array(k);copyInt_(s0,0);for(i=0;i<kx;i++){c=s0[2*i]+x[i]*x[i];s0[2*i]=c&mask;c>>=bpe;for(j=i+1;j<kx;j++){c=s0[i+j]+2*x[i]*x[j]+c;s0[i+j]=(c&mask);c>>=bpe;}
s0[i+kx]=c;}
mod_(s0,n);copy_(x,s0);}
function trim(x,k){var i,y;for(i=x.length;i>0&&!x[i-1];i--);y=new Array(i+k);copy_(y,x);return y;}
function powMod_(x,y,n){var k1,k2,kn,np;if(s7.length!=n.length)
s7=dup(n);if((n[0]&1)==0){copy_(s7,x);copyInt_(x,1);while(!equalsInt(y,0)){if(y[0]&1)
multMod_(x,s7,n);divInt_(y,2);squareMod_(s7,n);}
return;}
copyInt_(s7,0);for(kn=n.length;kn>0&&!n[kn-1];kn--);np=radix-inverseModInt(modInt(n,radix),radix);s7[kn]=1;multMod_(x,s7,n);if(s3.length!=x.length)
s3=dup(x);else
copy_(s3,x);for(k1=y.length-1;k1>0&!y[k1];k1--);if(y[k1]==0){copyInt_(x,1);return;}
for(k2=1<<(bpe-1);k2&&!(y[k1]&k2);k2>>=1);for(;;){if(!(k2>>=1)){k1--;if(k1<0){mont_(x,one,n,np);return;}
k2=1<<(bpe-1);}
mont_(x,x,n,np);if(k2&y[k1])
mont_(x,s3,n,np);}}
function mont_(x,y,n,np){var i,j,c,ui,t,ks;var kn=n.length;var ky=y.length;if(sa.length!=kn)
sa=new Array(kn);copyInt_(sa,0);for(;kn>0&&n[kn-1]==0;kn--);for(;ky>0&&y[ky-1]==0;ky--);ks=sa.length-1;for(i=0;i<kn;i++){t=sa[0]+x[i]*y[0];ui=((t&mask)*np)&mask;c=(t+ui*n[0])>>bpe;t=x[i];j=1;for(;j<ky-4;){c+=sa[j]+ui*n[j]+t*y[j];sa[j-1]=c&mask;c>>=bpe;j++;c+=sa[j]+ui*n[j]+t*y[j];sa[j-1]=c&mask;c>>=bpe;j++;c+=sa[j]+ui*n[j]+t*y[j];sa[j-1]=c&mask;c>>=bpe;j++;c+=sa[j]+ui*n[j]+t*y[j];sa[j-1]=c&mask;c>>=bpe;j++;c+=sa[j]+ui*n[j]+t*y[j];sa[j-1]=c&mask;c>>=bpe;j++;}
for(;j<ky;){c+=sa[j]+ui*n[j]+t*y[j];sa[j-1]=c&mask;c>>=bpe;j++;}
for(;j<kn-4;){c+=sa[j]+ui*n[j];sa[j-1]=c&mask;c>>=bpe;j++;c+=sa[j]+ui*n[j];sa[j-1]=c&mask;c>>=bpe;j++;c+=sa[j]+ui*n[j];sa[j-1]=c&mask;c>>=bpe;j++;c+=sa[j]+ui*n[j];sa[j-1]=c&mask;c>>=bpe;j++;c+=sa[j]+ui*n[j];sa[j-1]=c&mask;c>>=bpe;j++;}
for(;j<kn;){c+=sa[j]+ui*n[j];sa[j-1]=c&mask;c>>=bpe;j++;}
for(;j<ks;){c+=sa[j];sa[j-1]=c&mask;c>>=bpe;j++;}
sa[j-1]=c&mask;}
if(!greater(n,sa))
sub_(sa,n);copy_(x,sa);}
BigInteger.ZERO=new BigInteger('0');BigInteger.ONE=new BigInteger('1');return BigInteger;}());(function(pool,math,width,chunks,significance,overflow,startdenom){math['seedrandom']=function seedrandom(seed,use_entropy){var key=[];var arc4;seed=mixkey(flatten(use_entropy?[seed,pool]:arguments.length?seed:[new Date().getTime(),pool,window],3),key);arc4=new ARC4(key);mixkey(arc4.S,pool);math['random']=function random(){var n=arc4.g(chunks);var d=startdenom;var x=0;while(n<significance){n=(n+x)*width;d*=width;x=arc4.g(1);}
while(n>=overflow){n/=2;d/=2;x>>>=1;}
return(n+x)/d;};return seed;};function ARC4(key){var t,u,me=this,keylen=key.length;var i=0,j=me.i=me.j=me.m=0;me.S=[];me.c=[];if(!keylen){key=[keylen++];}
while(i<width){me.S[i]=i++;}
for(i=0;i<width;i++){t=me.S[i];j=lowbits(j+t+key[i%keylen]);u=me.S[j];me.S[i]=u;me.S[j]=t;}
me.g=function getnext(count){var s=me.S;var i=lowbits(me.i+1);var t=s[i];var j=lowbits(me.j+t);var u=s[j];s[i]=u;s[j]=t;var r=s[lowbits(t+u)];while(--count){i=lowbits(i+1);t=s[i];j=lowbits(j+t);u=s[j];s[i]=u;s[j]=t;r=r*width+s[lowbits(t+u)];}
me.i=i;me.j=j;return r;};me.g(width);}
function flatten(obj,depth,result,prop,typ){result=[];typ=typeof(obj);if(depth&&typ=='object'){for(prop in obj){if(prop.indexOf('S')<5){try{result.push(flatten(obj[prop],depth-1));}catch(e){}}}}
return(result.length?result:obj+(typ!='string'?'\0':''));}
function mixkey(seed,key,smear,j){seed+='';smear=0;for(j=0;j<seed.length;j++){key[lowbits(j)]=lowbits((smear^=key[lowbits(j)]*19)+seed.charCodeAt(j));}
seed='';for(j in key){seed+=String.fromCharCode(key[j]);}
return seed;}
function lowbits(n){return n&(width-1);}
startdenom=math.pow(width,chunks);significance=math.pow(2,significance);overflow=significance*2;mixkey(math.random(),pool);})([],Math,256,6,52);Math.seedrandom();
Otr.Type=(function(){"use strict";function Data(x){this.value=x;}
Data.prototype={value:[],getLength:function(){return this.value.length;},getValue:function(){return this.value;},equals:function(d){var i,len=this.getLength();if(this.getLength()!==d.getLength())return false;for(i=0;i<len;++i){if(this.value[i]!==d.value[i])return false;}
return true;},toBytes:function(){var bytes=this.value.slice(0),len=this.getLength();bytes.unshift((len>>24)&0xFF,(len>>16)&0xFF,(len>>8)&0xFF,(len)&0xFF);return bytes;}};function MPI(x){if(x instanceof Otr.BigInteger){this.value=x.toByteArray();}else{this.value=x;}
while(this.value[0]===0){this.value.shift();}}
MPI.prototype={value:[],getLength:function(){return this.value.length;},getValue:function(){return this.value;},equals:function(m){var i,len=this.getLength();if(this.getLength()!==m.getLength())return false;for(i=0;i<len;++i){if(this.value[i]!==m.value[i])return false;}
return true;},compareTo:function(mpi){return this.toBigInteger().compareTo(mpi.toBigInteger());},toBytes:function(){var bytes=this.value.slice(0),len=this.getLength();bytes.unshift((len>>24)&0xFF,(len>>16)&0xFF,(len>>8)&0xFF,(len)&0xFF);return bytes;},toBigInteger:function(){return Otr.BigInteger.fromMagnitude(1,this.value);}};function Pubkey(p,q,g,y){this.p=p;this.q=q;this.g=g;this.y=y;}
Pubkey.prototype={type:0x0000,toBytes:function(){var bytes=[];bytes.push((this.type>>8)&0xFF);bytes.push(this.type&0xFF);bytes=bytes.concat(this.p.toBytes(),this.q.toBytes(),this.g.toBytes(),this.y.toBytes());return bytes;}};Pubkey.readPubkey=function(buf){var type=buf.readShort(),p=buf.readMPI(),q=buf.readMPI(),g=buf.readMPI(),y=buf.readMPI();return new Pubkey(p,q,g,y);};function Sig(r,s){this.r=r;this.s=s;}
Sig.prototype={toBytes:function(){var bar=this.r.toByteArray(),bas=this.s.toByteArray();while(bar[0]===0)bar.shift();while(bar.length<20)bar.unshift(0x00);while(bas[0]===0)bas.shift();while(bas.length<20)bas.unshift(0x00);return bar.concat(bas);}};Sig.readSig=function(buf){var r=buf.readBytes(20),s=buf.readBytes(20);return new Sig(Otr.BigInteger.fromMagnitude(1,r),Otr.BigInteger.fromMagnitude(1,s));};function TLV(type,len,val){this.type=type;this.len=len;this.val=val;}
TLV.prototype={};TLV.PADDING=0;TLV.DISCONNECTED=1;TLV.readTLV=function(buf){var type=buf.readShort(),len=buf.readShort(),val=buf.readBytes(len);return new TLV(type,len,val);};var Type={Data:Data,MPI:MPI,Pubkey:Pubkey,Sig:Sig,TLV:TLV};return Type;}());
Otr.ByteBuffer=(function(){"use strict";var b64array="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";function ByteBuffer(data){this.data=(typeof data!=="undefined")?data:'';}
ByteBuffer.prototype={data:'',pos:0,readByte:function(){return(this.data.charCodeAt(this.pos++)&0xFF);},writeByte:function(b){this.data+=String.fromCharCode(b&0xFF);this.pos++;},readShort:function(){var data=this.data,pos=(this.pos+=2)-2;return((data.charCodeAt(pos)&0xFF)<<8)|(data.charCodeAt(++pos)&0xFF);},writeShort:function(x){this.data+=String.fromCharCode((x>>8)&0xFF,(x)&0xFF);this.pos+=2;},readUInt:function(){var data=this.data,pos=(this.pos+=4)-4;var x=((data.charCodeAt(pos)&0xFF)<<24)|((data.charCodeAt(++pos)&0xFF)<<16)|((data.charCodeAt(++pos)&0xFF)<<8)|(data.charCodeAt(++pos)&0xFF);return(x<0)?x+4294967296:x;},writeUInt:function(x){this.data+=String.fromCharCode((x>>24)&0xFF,(x>>16)&0xFF,(x>>8)&0xFF,(x)&0xFF);this.pos+=4;},readBytes:function(length){var x=[];while(length--){x.push(this.readByte());}
return x;},writeBytes:function(bytes,length){var i;length=length||bytes.length;for(i=0;i<length;++i){this.writeByte(bytes[i]);}},readData:function(){var len=this.readUInt(),bytes=this.readBytes(len);return new Otr.Type.Data(bytes);},writeData:function(data){var len=data.getLength();this.writeUInt(len);this.writeBytes(data.getValue(),len);},readMPI:function(){var len=this.readUInt(),bytes=this.readBytes(len);return new Otr.Type.MPI(bytes);},writeMPI:function(mpi){var len=mpi.getLength();this.writeUInt(len);this.writeBytes(mpi.getValue(),len);},reset:function(){this.pos=0;},getLength:function(){return this.data.length;},byteAt:function(i){return this.data.charCodeAt(i)&0xFF;},equals:function(b){if(this.getLength()!==b.getLength())return false;var thisprev=this.pos,bprev=b.pos,len=this.getLength();this.reset();b.reset();while(len--){if(this.readByte()!==b.readByte()){this.pos=thisprev;b.pos=bprev;return false;}}
this.pos=thisprev;b.pos=bprev;return true;},toByteArray:function(){var arr=[],len=this.getLength(),prevpos=this.pos;this.reset();while(len--){arr.push(this.readByte());}
this.pos=prevpos;return arr;},toWordArray:function(){var arr=[],len=this.getLength(),prevpos=this.pos;this.reset();while(len>0){arr.push(this.readUInt());len-=4;}
this.pos=prevpos;return CryptoJS.lib.WordArray.create(arr,this.getLength());},toBase64:function(){var input=this.data,base64="",chr1,chr2,chr3,enc1,enc2,enc3,enc4,i=0;do{chr1=input.charCodeAt(i++);if(!isNaN(chr1))chr1&=0xFF;chr2=input.charCodeAt(i++);if(!isNaN(chr2))chr2&=0xFF;chr3=input.charCodeAt(i++);if(!isNaN(chr3))chr3&=0xFF;enc1=chr1>>2;enc2=((chr1&3)<<4)|(chr2>>4);enc3=((chr2&15)<<2)|(chr3>>6);enc4=chr3&63;if(isNaN(chr2)){enc3=enc4=64;}else if(isNaN(chr3)){enc4=64;}
base64=base64+
b64array.charAt(enc1)+
b64array.charAt(enc2)+
b64array.charAt(enc3)+
b64array.charAt(enc4);chr1=chr2=chr3="";enc1=enc2=enc3=enc4="";}while(i<input.length);return base64;},toString:function(){return this.data;}};ByteBuffer.fromByteArray=function(arr){var ba=new ByteBuffer(),i,l;for(i=0,l=arr.length;i<l;i++){ba.writeByte(arr[i]);}
ba.reset();return ba;};ByteBuffer.fromBase64=function(input){var output="",chr1,chr2,chr3,enc1,enc2,enc3,enc4,i=0;do{enc1=b64array.indexOf(input.charAt(i++));enc2=b64array.indexOf(input.charAt(i++));enc3=b64array.indexOf(input.charAt(i++));enc4=b64array.indexOf(input.charAt(i++));chr1=(enc1<<2)|(enc2>>4);chr2=((enc2&15)<<4)|(enc3>>2);chr3=((enc3&3)<<6)|enc4;output=output+String.fromCharCode(chr1);if(enc3!=64){output=output+String.fromCharCode(chr2);}
if(enc4!=64){output=output+String.fromCharCode(chr3);}
chr1=chr2=chr3="";enc1=enc2=enc3=enc4="";}while(i<input.length);return new ByteBuffer(output);};return ByteBuffer;}());
Otr.Message=(function(){"use strict";function Message(msg){var matches,bytebuff;if(!msg.match(/^\?OTR/)){this.type=Message.MSG_PLAIN;this.message=msg;}else if(msg==='?OTRv2?'){this.type=Message.MSG_QUERY;this.message=msg;}else if(matches=msg.match(/^\?OTR Error:(.*)$/)){this.type=Message.MSG_ERROR;this.message=matches[1];}else if(matches=msg.match(/^\?OTR,(\d+),(\d+),(.+)\.?,$/)){this.type=Message.MSG_FRAGMENT;this.message=msg;}else if(matches=msg.match(/^\?OTR:([a-zA-Z0-9+\/]+={0,2})\.$/)){bytebuff=Otr.ByteBuffer.fromBase64(matches[1]);this.version=bytebuff.readShort();this.type=bytebuff.readByte();switch(this.type){case Message.MSG_DH_COMMIT:this.dataEncryptedGx=bytebuff.readData();this.dataHashedGx=bytebuff.readData();break;case Message.MSG_DH_KEY:this.mpiGy=bytebuff.readMPI();break;case Message.MSG_REVEAL_SIGNATURE:this.dataRevealedKey=bytebuff.readData();this.dataEncryptedSignature=bytebuff.readData();this.macSignature=bytebuff.readBytes(20);break;case Message.MSG_SIGNATURE:this.dataEncryptedSignature=bytebuff.readData();this.macSignature=bytebuff.readBytes(20);break;case Message.MSG_DATA:this.byteFlags=bytebuff.readByte();this.intSenderKeyid=bytebuff.readUInt();this.intRecipientKeyid=bytebuff.readUInt();this.mpiDHy=bytebuff.readMPI();this.ctr=bytebuff.readBytes(8);this.dataEncryptedMessage=bytebuff.readData();this.macAuthenticator=bytebuff.readBytes(20);this.dataOldMacKeys=bytebuff.readData();break;default:this.type=Message.MSG_UNKNOWN;this.message=msg;}}else{this.type=Message.MSG_UNKNOWN;this.message=msg;}}
Message.MSG_UNKNOWN=-99;Message.MSG_QUERY=-1;Message.MSG_ERROR=-2;Message.MSG_PLAIN=-3;Message.MSG_FRAGMENT=-4;Message.MSG_DH_COMMIT=0x02;Message.MSG_DH_KEY=0x0a;Message.MSG_REVEAL_SIGNATURE=0x11;Message.MSG_SIGNATURE=0x12;Message.MSG_DATA=0x03;Message.prototype={type:0,version:2,message:'',toString:function(){var bytebuff=new Otr.ByteBuffer();bytebuff.writeShort(this.version);bytebuff.writeByte(this.type);switch(this.type){case Message.MSG_ERROR:return'?OTR Error:'+this.message;case Message.MSG_DH_COMMIT:bytebuff.writeData(this.dataEncryptedGx);bytebuff.writeData(this.dataHashedGx);break;case Message.MSG_DH_KEY:bytebuff.writeMPI(this.mpiGy);break;case Message.MSG_REVEAL_SIGNATURE:bytebuff.writeData(this.dataRevealedKey);bytebuff.writeData(this.dataEncryptedSignature);bytebuff.writeBytes(this.macSignature,20);break;case Message.MSG_SIGNATURE:bytebuff.writeData(this.dataEncryptedSignature);bytebuff.writeBytes(this.macSignature,20);break;case Message.MSG_DATA:bytebuff.writeByte(this.byteFlags);bytebuff.writeUInt(this.intSenderKeyid);bytebuff.writeUInt(this.intRecipientKeyid);bytebuff.writeMPI(this.mpiDHy);bytebuff.writeBytes(this.ctr,8);bytebuff.writeData(this.dataEncryptedMessage);bytebuff.writeBytes(this.macAuthenticator,20);bytebuff.writeData(this.dataOldMacKeys);break;default:return this.message;}
return'?OTR:'+(bytebuff.toBase64())+'.';}};return Message;}());
Otr.DSA=(function(){"use strict";var BigInteger=Otr.BigInteger,Util=Otr.Util,log=false;function arraycopy(fromar,fromi,toar,toi,howmany){for(var i=fromi,j=toi,k=0;k<howmany;++i,++j,++k){toar[j]=fromar[i];}}
function DSA(){}
DSA.prototype={certainty:20,L:1024,N:160,H:function(bytes){var words=CryptoJS.SHA1(Otr.Util.byteArrayToWordArray(bytes));return Otr.Util.wordArrayToByteArray(words);},q:null,p:null,g:null,y:null,x:null,k:null,generateParameters:function(){var start,end;start=new Date().getTime();try{this._generatePQ();}catch(e){if(log)end=new Date().getTime();if(log)console.log('generate params: '+(end-start)+'ms');throw e;}
if(log)console.log('q: '+this.q.toString(16));if(log)console.log('p: '+this.p.toString(16));this.g=this._generateG(this.p,this.q);if(log)console.log('g: '+this.g.toString(16));if(log)end=new Date().getTime();if(log)console.log('generate params: '+(end-start)+'ms');},generateKey:function(){do{this.x=new BigInteger(this.q.bitCount());}while((this.x.compareTo(BigInteger.ZERO)<=0)||(this.x.compareTo(this.q)>=0));this.y=this.g.modPow(this.x,this.p);},_generatePQ:function(){function inc(buf){var i,b;for(i=buf.length-1;i>=0;--i){b=((buf[i]+1)&0xff);buf[i]=b;if(b!=0){break;}}}
function logit(msg,start){var end=new Date().getTime();console.log(msg+': '+(end-start)+'ms');return(end-start);}
var seed=new Array(20),part1,part2,offset,u=new Array(20),i,counter,k,q,p,n=6,w=new Array(128),x,c;var bigloop=0;for(;;){if(log)console.log('bigloop:'+(++bigloop));Util.nextBytes(seed);part1=this.H(seed);part2=seed.slice(0);inc(part2);part2=this.H(part2);for(i=0;i!=u.length;i++){u[i]=part1[i]^part2[i];}
u[0]|=0x80;u[19]|=0x01;q=BigInteger.fromMagnitude(1,u);if(!q.isProbablePrime(this.certainty)){continue;}
offset=seed.slice(0);inc(offset);for(counter=0;counter<4096;++counter){for(k=0;k<n;k++){inc(offset);part1=this.H(offset);arraycopy(part1,0,w,w.length-(k+1)*part1.length,part1.length);}
inc(offset);part1=this.H(offset);arraycopy(part1,part1.length-((w.length-(n)*part1.length)),w,0,w.length-n*part1.length);w[0]|=0x80;x=BigInteger.fromMagnitude(1,w);c=x.mod(q.shiftLeft(1));p=x.subtract(c.subtract(BigInteger.ONE));if(p.bitLength()!=this.L){continue;}
if(p.isProbablePrime(this.certainty)){if(log)console.log('found at counter:'+counter);this.p=p;this.q=q;return;}}
if(log)console.log('counter over 4096');}},_generateG:function(p,q){var aux=p.subtract(BigInteger.ONE),pow=aux.divide(q),gTemp;do{gTemp=new BigInteger(aux.bitLength());}while(gTemp.compareTo(aux)>=0||gTemp.compareTo(BigInteger.ONE)<=0);return gTemp.modPow(pow,p);},generateSignature:function(message){var k,r,s,h;do{k=new BigInteger(this.q.bitLength());}while(k.compareTo(this.q)>=0&&k.compareTo(BigInteger.ZERO)<=0);r=this.g.modPow(k,this.p).mod(this.q);h=BigInteger.fromMagnitude(1,message);s=(k.modInverse(this.q).multiply(h.add(this.x.multiply(r)))).mod(this.q);return{r:r,s:s};},verifySignature:function(message,r,s){var v,hash,w,u1,u2;if(r.compareTo(BigInteger.ZERO)<=0||r.compareTo(this.q)>=0){return false;}
if(s.compareTo(BigInteger.ZERO)<=0||s.compareTo(this.q)>=0){return false;}
hash=BigInteger.fromMagnitude(1,message);w=s.modInverse(this.q);u1=hash.multiply(w).mod(this.q);u2=r.multiply(w).mod(this.q);v=((this.g.modPow(u1,this.p).multiply(this.y.modPow(u2,this.p))).mod(this.p)).mod(this.q);return v.compareTo(r)==0;},clone:function(){var k,d=new DSA();for(k in d){if(this[k]instanceof BigInteger){d[k]=this[k].clone();}}
return d;},generateParametersWithTimeout:function(progress,finish){function inc(buf){var i,b;for(i=buf.length-1;i>=0;--i){b=((buf[i]+1)&0xff);buf[i]=b;if(b!=0){break;}}}
var seed=new Array(20),part1,part2,offset,u=new Array(20),i,counter,k,q,p,n=6,w=new Array(128),x,c,self=this,loop,loop2;loop=function(){Util.nextBytes(seed);part1=self.H(seed);part2=seed.slice(0);inc(part2);part2=self.H(part2);for(i=0;i!=u.length;i++){u[i]=part1[i]^part2[i];}
u[0]|=0x80;u[19]|=0x01;q=BigInteger.fromMagnitude(1,u);if(!q.isProbablePrime(self.certainty)){if(progress)progress();return setTimeout(loop,10);}
offset=seed.slice(0);inc(offset);counter=0;loop2=function(){for(k=0;k<n;k++){inc(offset);part1=self.H(offset);arraycopy(part1,0,w,w.length-(k+1)*part1.length,part1.length);}
inc(offset);part1=self.H(offset);arraycopy(part1,part1.length-((w.length-(n)*part1.length)),w,0,w.length-n*part1.length);w[0]|=0x80;x=BigInteger.fromMagnitude(1,w);c=x.mod(q.shiftLeft(1));p=x.subtract(c.subtract(BigInteger.ONE));if(p.bitLength()!=self.L){if(progress)progress();setTimeout(loop2,20);}
if(p.isProbablePrime(self.certainty)){self.p=p;self.q=q;self.g=self._generateG(p,q);if(finish)finish();return;}
if(progress)progress();counter++;if(counter<4000){setTimeout(loop2,20);}else{setTimeout(loop,10);}};loop2();};loop();}};return DSA;}());
Otr.Auth=(function(){"use strict";var Message=Otr.Message,BigInteger=Otr.BigInteger,Util=Otr.Util,Type=Otr.Type,ByteBuffer=Otr.ByteBuffer,DH_G=new BigInteger('2'),DH_MOD=new BigInteger("FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74020BBEA63B139B22514A08798E3404DD"+"EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED"+"EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3DC2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F"+"83655D23DCA3AD961C62F356208552BB9ED529077096966D670C354E4ABC9804F1746C08CA237327FFFFFFFFFFFFFFFF",16),DH_MOD_MIN_2=new BigInteger("FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74020BBEA63B139B22514A08798E3404DD"+"EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED"+"EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3DC2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F"+"83655D23DCA3AD961C62F356208552BB9ED529077096966D670C354E4ABC9804F1746C08CA237327FFFFFFFFFFFFFFFD",16),TWO=new BigInteger('2'),CTR_ZERO=Util.createIV(128),AUTHSTATE_NONE=0,AUTHSTATE_AWAITING_DHKEY=1,AUTHSTATE_AWAITING_REVEALSIG=2,AUTHSTATE_AWAITING_SIG=3,AUTHSTATE_V1_SETUP=4;function generateDHKey(){var biX=BigInteger.generate(320),biGx=DH_G.modPow(biX,DH_MOD),mpiGx=new Type.MPI(biGx);return{biPrivate:biX,mpiPublic:mpiGx};}
var stime={};function log_start(text){stime[text]=new Date().getTime();}
function log_end(text){var ms=new Date().getTime()-stime[text];if(console)console.log(text+': '+ms+'ms');}
function Auth(dsa){this.dsa=dsa.clone();this.dsa.generateKey();this.pubkey=new Type.Pubkey(new Type.MPI(this.dsa.p),new Type.MPI(this.dsa.q),new Type.MPI(this.dsa.g),new Type.MPI(this.dsa.y));}
Auth.prototype={state:AUTHSTATE_NONE,encrypted:false,reply:false,secret:{},theirPubkey:null,keyManager:null,finished:false,produceQueryMessage:function(){var msg=new Message('?OTRv2?');return msg;},consumeQueryMessage:function(msg){this.reply=this.produceDHCommitMessage();this.state=AUTHSTATE_AWAITING_DHKEY;},produceDHCommitMessage:function(){var msg=new Message(''),biR=BigInteger.generate(128),dhkey=generateDHKey(),biX=dhkey.biPrivate,mpiGx=dhkey.mpiPublic,waGxmpi,waR,encGx,waHashgx;waGxmpi=Util.byteArrayToWordArray(mpiGx.toBytes());waR=CryptoJS.enc.Hex.parse(biR.toString(16));encGx=CryptoJS.AES.encrypt(waGxmpi,waR,{mode:CryptoJS.mode.CTR,iv:CTR_ZERO,padding:CryptoJS.pad.NoPadding});waHashgx=CryptoJS.SHA256(waGxmpi);msg.type=Message.MSG_DH_COMMIT;msg.dataEncryptedGx=new Type.Data(Util.wordArrayToByteArray(encGx.ciphertext));msg.dataHashedGx=new Type.Data(Util.wordArrayToByteArray(waHashgx));this.secret.biX=biX;this.secret.mpiR=new Type.MPI(biR);this.secret.mpiGx=mpiGx;this.secret.lastDHCommitMessage=msg;return msg;},consumeDHCommitMessage:function(msg){switch(this.state){case AUTHSTATE_NONE:case AUTHSTATE_AWAITING_SIG:this.secret.dataEncryptedGx=msg.dataEncryptedGx;this.secret.dataHashedGx=msg.dataHashedGx;this.reply=this.produceDHKeyMessage();this.state=AUTHSTATE_AWAITING_REVEALSIG;break;case AUTHSTATE_AWAITING_DHKEY:var biMyHash=BigInteger.fromMagnitude(1,this.secret.lastDHCommitMessage.dataHashedGx.getValue()),biTheirHash=BigInteger.fromMagnitude(1,msg.dataHashedGx.getValue());if(biMyHash.compareTo(biTheirHash)>0){this.reply=this.secret.lastDHCommitMessage;}else{this.secret.dataEncryptedGx=msg.dataEncryptedGx;this.secret.dataHashedGx=msg.dataHashedGx;this.reply=this.produceDHKeyMessage();this.state=AUTHSTATE_AWAITING_REVEALSIG;}
break;case AUTHSTATE_AWAITING_REVEALSIG:this.reply=this.secret.lastDHKeyMessage;this.secret.dataEncryptedGx=msg.dataEncryptedGx;this.secret.dataHashedGx=msg.dataHashedGx;break;}},produceDHKeyMessage:function(){var msg=new Message(''),dhkey=generateDHKey(),biY=dhkey.biPrivate;msg.type=Message.MSG_DH_KEY;msg.mpiGy=dhkey.mpiPublic;this.secret.biY=biY;this.secret.mpiGy=msg.mpiGy;this.secret.lastDHKeyMessage=msg;return msg;},consumeDHKeyMessage:function(msg){switch(this.state){case AUTHSTATE_AWAITING_DHKEY:this.secret.mpiGy=msg.mpiGy;this.reply=this.produceRevealSignatureMessage();this.state=AUTHSTATE_AWAITING_SIG;break;case AUTHSTATE_AWAITING_SIG:if(this.secret.mpiGy.equals(msg.mpiGy)){this.reply=this.lastRevealSignatureMessage;}else{}
break;default:}},_generateAuthKeys:function(biS){var seed=new Type.MPI(biS).toBytes(),waTemp,waSsid,waC,waCp,waM1,waM1p,waM2,waM2p;seed.unshift(0x00);function h2(b){seed[0]=b;return CryptoJS.SHA256(Util.byteArrayToWordArray(seed));}
waSsid=h2(0x00);waSsid.sigBytes=8;waTemp=h2(0x01);waC=CryptoJS.lib.WordArray.create(waTemp.words.slice(0,4),16);waCp=CryptoJS.lib.WordArray.create(waTemp.words.slice(4,8),16);waM1=h2(0x02);waM2=h2(0x03);waM1p=h2(0x04);waM2p=h2(0x05);return{ssid:waSsid,c:waC,cp:waCp,m1:waM1,m1p:waM1p,m2:waM2,m2p:waM2p};},_computeM:function(mpiG1,mpiG2,pubkey,keyid,waKey){var buf=new ByteBuffer(),waHmac;buf.writeMPI(mpiG1);buf.writeMPI(mpiG2);buf.writeBytes(pubkey.toBytes());buf.writeUInt(keyid);waHmac=CryptoJS.HmacSHA256(buf.toWordArray(),waKey);return waHmac;},_computeX:function(pubkey,keyid,dsa,waM){var buf=new ByteBuffer(),sign,sigX;buf.writeBytes(pubkey.toBytes());buf.writeUInt(keyid);sign=dsa.generateSignature(Util.wordArrayToByteArray(waM));sigX=new Type.Sig(sign.r,sign.s);buf.writeBytes(sigX.toBytes());return buf.toWordArray();},produceRevealSignatureMessage:function(){var biTemp,biS,waKeys,keyidB,waMB,waXB,encSign,dataEncSign,waHmac,msg=new Message('');biTemp=this.secret.mpiGy.toBigInteger();if(biTemp.compareTo(TWO)<0||biTemp.compareTo(DH_MOD_MIN_2)>0)throw new Error('Invalid Gy received');biS=this.secret.mpiGy.toBigInteger().modPow(this.secret.biX,DH_MOD);waKeys=this._generateAuthKeys(biS);keyidB=1;waMB=this._computeM(this.secret.mpiGx,this.secret.mpiGy,this.pubkey,keyidB,waKeys.m1);waXB=this._computeX(this.pubkey,keyidB,this.dsa,waMB);encSign=CryptoJS.AES.encrypt(waXB,waKeys.c,{mode:CryptoJS.mode.CTR,iv:CTR_ZERO,padding:CryptoJS.pad.NoPadding});dataEncSign=new Type.Data(Util.wordArrayToByteArray(encSign.ciphertext));waHmac=CryptoJS.HmacSHA256(Util.byteArrayToWordArray(dataEncSign.toBytes()),waKeys.m2);waHmac.sigBytes=20;this.secret.waKeys=waKeys;this.secret.biS=biS;this.secret.keyidB=keyidB;msg.type=Message.MSG_REVEAL_SIGNATURE;msg.dataRevealedKey=new Type.Data(this.secret.mpiR.getValue());msg.dataEncryptedSignature=dataEncSign;msg.macSignature=Util.wordArrayToByteArray(waHmac);this.secret.lastRevealSignatureMessage=msg;return msg;},consumeRevealSignatureMessage:function(msg){switch(this.state){case AUTHSTATE_AWAITING_REVEALSIG:this.secret.dataRevealedKey=msg.dataRevealedKey;this.secret.dataEncryptedSignature=msg.dataEncryptedSignature;this.secret.macSignature=msg.macSignature;this.reply=this.produceSignatureMessage();this.state=AUTHSTATE_NONE;this.encrypted=true;break;default:}},produceSignatureMessage:function(){var waR,encGx,waGxmpi,waHashgx,biGx,biS,waKeys,waHmac,encSign,waXB,pubB,keyidB,sigB,mpiGx,waMB,dsaVerify,keyidA,waMA,waXA,encSign,dataEncSign,waHmac,buf,msg=new Message('');waR=Util.byteArrayToWordArray(this.secret.dataRevealedKey.getValue());encGx=CryptoJS.lib.CipherParams.create({ciphertext:Util.byteArrayToWordArray(this.secret.dataEncryptedGx.getValue())});waGxmpi=CryptoJS.AES.decrypt(encGx,waR,{mode:CryptoJS.mode.CTR,iv:CTR_ZERO,padding:CryptoJS.pad.NoPadding});Util.correctWordsLength(waGxmpi);waHashgx=CryptoJS.SHA256(waGxmpi);if(!Util.bytesEqual(this.secret.dataHashedGx.getValue(),Util.wordArrayToByteArray(waHashgx)))throw new Error('HASH(gx) not match');biGx=new Type.MPI(Util.wordArrayToByteArray(waGxmpi).slice(4)).toBigInteger();if(biGx.compareTo(TWO)<0||biGx.compareTo(DH_MOD_MIN_2)>0)throw new Error('Invalid Gx received');biS=biGx.modPow(this.secret.biY,DH_MOD);waKeys=this._generateAuthKeys(biS);waHmac=CryptoJS.HmacSHA256(Util.byteArrayToWordArray(this.secret.dataEncryptedSignature.toBytes()),waKeys.m2);waHmac.sigBytes=20;if(!Util.bytesEqual(this.secret.macSignature,Util.wordArrayToByteArray(waHmac)))throw new Error('Invalid MAC-ed signature');encSign=CryptoJS.lib.CipherParams.create({ciphertext:Util.byteArrayToWordArray(this.secret.dataEncryptedSignature.getValue())});waXB=CryptoJS.AES.decrypt(encSign,waKeys.c,{mode:CryptoJS.mode.CTR,iv:CTR_ZERO,padding:CryptoJS.pad.NoPadding});buf=ByteBuffer.fromByteArray(Util.wordArrayToByteArray(waXB));pubB=Type.Pubkey.readPubkey(buf);keyidB=buf.readUInt();sigB=Type.Sig.readSig(buf);mpiGx=new Type.MPI(biGx);waMB=this._computeM(mpiGx,this.secret.mpiGy,pubB,keyidB,waKeys.m1);dsaVerify=new Otr.DSA();dsaVerify.p=pubB.p.toBigInteger();dsaVerify.q=pubB.q.toBigInteger();dsaVerify.g=pubB.g.toBigInteger();dsaVerify.y=pubB.y.toBigInteger();if(!dsaVerify.verifySignature(Util.wordArrayToByteArray(waMB),sigB.r,sigB.s))throw new Error('pubB verify signature failed');keyidA=1;waMA=this._computeM(this.secret.mpiGy,mpiGx,this.pubkey,keyidA,waKeys.m1p);waXA=this._computeX(this.pubkey,keyidA,this.dsa,waMA);encSign=CryptoJS.AES.encrypt(waXA,waKeys.cp,{mode:CryptoJS.mode.CTR,iv:CTR_ZERO,padding:CryptoJS.pad.NoPadding});dataEncSign=new Type.Data(Util.wordArrayToByteArray(encSign.ciphertext));waHmac=CryptoJS.HmacSHA256(Util.byteArrayToWordArray(dataEncSign.toBytes()),waKeys.m2p);waHmac.sigBytes=20;this.theirPubkey=pubB;this.keyManager=new KeyManager(this.secret.biY,this.secret.mpiGy,mpiGx);this.secret={};msg.type=Message.MSG_SIGNATURE;msg.dataEncryptedSignature=dataEncSign;msg.macSignature=Util.wordArrayToByteArray(waHmac);return msg;},consumeSignatureMessage:function(msg){switch(this.state){case AUTHSTATE_AWAITING_SIG:this.secret.dataEncryptedSignature=msg.dataEncryptedSignature;this.secret.macSignature=msg.macSignature;this.verifySignatureMessage(msg);this.state=AUTHSTATE_NONE;this.encrypted=true;break;default:}},verifySignatureMessage:function(){var waHmac,encSign,buf,waXA,pubA,keyidA,sigA,waMA,dsaVerify;waHmac=CryptoJS.HmacSHA256(Util.byteArrayToWordArray(this.secret.dataEncryptedSignature.toBytes()),this.secret.waKeys.m2p);waHmac.sigBytes=20;if(!Util.bytesEqual(this.secret.macSignature,Util.wordArrayToByteArray(waHmac)))throw new Error('Invalid MAC-ed signature');encSign=CryptoJS.lib.CipherParams.create({ciphertext:Util.byteArrayToWordArray(this.secret.dataEncryptedSignature.getValue())});waXA=CryptoJS.AES.decrypt(encSign,this.secret.waKeys.cp,{mode:CryptoJS.mode.CTR,iv:CTR_ZERO,padding:CryptoJS.pad.NoPadding});buf=ByteBuffer.fromByteArray(Util.wordArrayToByteArray(waXA));pubA=Type.Pubkey.readPubkey(buf);keyidA=buf.readUInt();sigA=Type.Sig.readSig(buf);waMA=this._computeM(this.secret.mpiGy,this.secret.mpiGx,pubA,keyidA,this.secret.waKeys.m1p);dsaVerify=new Otr.DSA();dsaVerify.p=pubA.p.toBigInteger();dsaVerify.q=pubA.q.toBigInteger();dsaVerify.g=pubA.g.toBigInteger();dsaVerify.y=pubA.y.toBigInteger();if(!dsaVerify.verifySignature(Util.wordArrayToByteArray(waMA),sigA.r,sigA.s))throw new Error('pubA verify signature failed');this.theirPubkey=pubA;this.keyManager=new KeyManager(this.secret.biX,this.secret.mpiGx,this.secret.mpiGy);this.secret={};},_computeT:function(ourkeyid,theirkeyid,nextdh,ctr,encaes){var buf=new ByteBuffer();buf.writeShort(0x02);buf.writeByte(Message.MSG_DATA);buf.writeByte(0x00);buf.writeUInt(ourkeyid);buf.writeUInt(theirkeyid);buf.writeMPI(nextdh);buf.writeBytes(ctr);buf.writeData(encaes);return buf.toWordArray();},produceDataMessage:function(plaintext){if(!this.encrypted)throw new Error("It's not encrypted");var sess,oldmackeys,waT,baMsg,encMsg,dataEncMsg,waHmac,msg=new Message('');sess=this.keyManager.sessKeys[1][0];oldmackeys=new Type.Data(this.keyManager.oldMacKeys());sess.incCtrSend();baMsg=Util.stringToByteArray(plaintext);encMsg=CryptoJS.AES.encrypt(Util.byteArrayToWordArray(baMsg),sess.waSendAesKey,{mode:CryptoJS.mode.CTR,iv:Util.createIV(128,sess.ctrSend),padding:CryptoJS.pad.NoPadding});dataEncMsg=new Type.Data(Util.wordArrayToByteArray(encMsg.ciphertext));waT=this._computeT(this.keyManager.ourKeyid-1,this.keyManager.theirKeyid,this.keyManager.mpiOurY,sess.ctrSend,dataEncMsg);waHmac=CryptoJS.HmacSHA1(waT,sess.waSendMacKey);msg.type=Message.MSG_DATA;msg.byteFlags=0x00;msg.intSenderKeyid=this.keyManager.ourKeyid-1;msg.intRecipientKeyid=this.keyManager.theirKeyid;msg.mpiDHy=this.keyManager.mpiOurY;msg.ctr=sess.ctrSend;msg.dataEncryptedMessage=dataEncMsg;msg.macAuthenticator=Util.wordArrayToByteArray(waHmac);msg.dataOldMacKeys=oldmackeys;return msg;},consumeDataMessage:function(msg){if(!this.encrypted)return this.reply=new Message('?OTR Error:an unreadable encrypted message was received');var difOur,difTheir,sess,waT,waHmac,encMsg,waMsg,baMsg,str,i,buf,tlv;difOur=this.keyManager.ourKeyid-msg.intRecipientKeyid;difTheir=this.keyManager.theirKeyid-msg.intSenderKeyid;sess=this.keyManager.getSessKeys(difOur,difTheir);if(!sess)throw new Error('Keyid is not recognized\nOur keyid:'+this.keyManager.ourKeyid+'; Recipient keyid:'+msg.intRecipientKeyid+'\nTheir keyid:'+this.keyManager.theirKeyid+'; Sender keyid:'+msg.intSenderKeyid);waT=this._computeT(msg.intSenderKeyid,msg.intRecipientKeyid,msg.mpiDHy,msg.ctr,msg.dataEncryptedMessage);waHmac=CryptoJS.HmacSHA1(waT,sess.waRecvMacKey);if(!Util.bytesEqual(Util.wordArrayToByteArray(waHmac),msg.macAuthenticator))throw new Error('MAC verification failed');encMsg=CryptoJS.lib.CipherParams.create({ciphertext:Util.byteArrayToWordArray(msg.dataEncryptedMessage.getValue())});waMsg=CryptoJS.AES.decrypt(encMsg,sess.waRecvAesKey,{mode:CryptoJS.mode.CTR,iv:Util.createIV(128,msg.ctr),padding:CryptoJS.pad.NoPadding});baMsg=Util.wordArrayToByteArray(waMsg);str='';i=0;while(i<baMsg.length&&(baMsg[i]!==0)){str+=String.fromCharCode(baMsg[i++]);}
buf=new ByteBuffer();buf.writeBytes(baMsg.slice(i+1));buf.reset();tlv=Type.TLV.readTLV(buf);if(tlv.type===Type.TLV.DISCONNECTED){this.finished=true;}
this.keyManager.processReceivedKey(msg.intRecipientKeyid,msg.intSenderKeyid,msg.mpiDHy);return str;},consumeMessage:function(msg){this.reply=false;switch(msg.type){case Message.MSG_QUERY:this.consumeQueryMessage(msg);break;case Message.MSG_DH_COMMIT:this.consumeDHCommitMessage(msg);break;case Message.MSG_DH_KEY:this.consumeDHKeyMessage(msg);break;case Message.MSG_REVEAL_SIGNATURE:this.consumeRevealSignatureMessage(msg);break;case Message.MSG_SIGNATURE:this.consumeSignatureMessage(msg);break;case Message.MSG_DATA:this.consumeDataMessage(msg);break;default:}},produceDisconnectMessage:function(){return this.produceDataMessage(String.fromCharCode(0,0,1,0,0));},reset:function(){this.state=AUTHSTATE_NONE;this.encrypted=false;this.reply=false;this.secret={};this.finished=false;}};function SessionKeys(biOurDh,mpiOurY,mpiTheirY){var biS=mpiTheirY.toBigInteger().modPow(biOurDh,DH_MOD),secbytes=new Type.MPI(biS).toBytes(),sendbyte,recvbyte;secbytes.unshift(0x00);function h1(b){secbytes[0]=b;return CryptoJS.SHA1(Util.byteArrayToWordArray(secbytes));}
if(mpiOurY.compareTo(mpiTheirY)>0){sendbyte=0x01;recvbyte=0x02;}else{sendbyte=0x02;recvbyte=0x01;}
this.waSendAesKey=h1(sendbyte);this.waSendAesKey.sigBytes=16;Util.correctWordsLength(this.waSendAesKey);this.waSendMacKey=CryptoJS.SHA1(this.waSendAesKey);this.waRecvAesKey=h1(recvbyte);this.waRecvAesKey.sigBytes=16;Util.correctWordsLength(this.waRecvAesKey);this.waRecvMacKey=CryptoJS.SHA1(this.waRecvAesKey);this.ctrSend=[0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00];}
SessionKeys.prototype={incCtrSend:function(){for(var i=7;i>=0;i--){this.ctrSend[i]++;if(this.ctrSend[i]!=0)
break;}}};function KeyManager(biOurDh,mpiOurY,mpiTheirY){var dhkey;this.sessKeys=new Array(2);this.sessKeys[0]=new Array(2);this.sessKeys[1]=new Array(2);this.sessKeys[1][0]=new SessionKeys(biOurDh,mpiOurY,mpiTheirY);dhkey=generateDHKey();this.sessKeys[0][0]=new SessionKeys(dhkey.biPrivate,dhkey.mpiPublic,mpiTheirY);this.sessKeys[0][1]=null;this.sessKeys[1][1]=null;this.ourKeyid=2;this.theirKeyid=1;this.biOurDhKey=dhkey.biPrivate;this.biOurOldDhKey=biOurDh;this.mpiOurY=dhkey.mpiPublic;this.mpiOurOldY=mpiOurY;this.mpiTheirY=mpiTheirY;this.mpiTheirOldY=null;}
KeyManager.prototype={sessHistory:[],toReveal:[],getSessKeys:function(i,j){this.sessHistory.push(this.sessKeys[i][j]);return this.sessKeys[i][j];},processReceivedKey:function(intRecipKeyid,intSenderKeyid,mpiSenderNewY){var dhkey;if(intRecipKeyid==this.ourKeyid){this.sessKeys[1][0]=this.sessKeys[0][0];this.sessKeys[1][1]=this.sessKeys[0][1];this.ourKeyid++;this.biOurOldDhKey=this.biOurDhKey;this.mpiOurOldY=this.mpiOurY;dhkey=generateDHKey();this.biOurDhKey=dhkey.biPrivate;this.mpiOurY=dhkey.mpiPublic;if(this.mpiTheirY){this.sessKeys[0][0]=new SessionKeys(dhkey.biPrivate,dhkey.mpiPublic,this.mpiTheirY);}
if(this.mpiTheirOldY){this.sessKeys[0][1]=new SessionKeys(dhkey.biPrivate,dhkey.mpiPublic,this.mpiTheirOldY);}}
if(intSenderKeyid==this.theirKeyid){this.sessKeys[0][1]=this.sessKeys[0][0];this.sessKeys[1][1]=this.sessKeys[1][0];this.theirKeyid++;this.mpiTheirOldY=this.mpiTheirY;this.mpiTheirY=mpiSenderNewY;this.sessKeys[0][0]=new SessionKeys(this.biOurDhKey,this.mpiOurY,mpiSenderNewY);this.sessKeys[1][0]=new SessionKeys(this.biOurOldDhKey,this.mpiOurOldY,mpiSenderNewY);}
this.saveOldMacKeys();},saveOldMacKeys:function(){if(!this.sessHistory.length)return;var check=this.sessHistory[0];if(this.sessKeys[0][0]!==check&&this.sessKeys[0][1]!==check&&this.sessKeys[1][0]!==check&&this.sessKeys[1][1]!==check){this.sessHistory.shift();this.toReveal=this.toReveal.concat(Util.wordArrayToByteArray(check.waRecvMacKey));}},oldMacKeys:function(){var ret=this.toReveal;this.toReveal=[];return ret;}};return Auth;}());
Otr.Communication=(function(){"use strict";var Message=Otr.Message;function Communication(dsa,display,send){if(dsa instanceof Otr.Auth){this.auth=dsa;}else{this.auth=new Otr.Auth(dsa);}
this.display=display;this.send=send;}
Communication.prototype={whenSecured:null,fragments:[],receiveMessage:function(text,other){var msg=new Message(text),auth=this.auth,plaintext;if(msg.type===Message.MSG_PLAIN){this.display(text,other);}else if(msg.type===Message.MSG_FRAGMENT){var matches=msg.message.match(/^\?OTR,(\d+),(\d+),(.+)\.?,$/),fragI=matches[1],fragN=matches[2],fragContent=matches[3];this.fragments[parseInt(fragI)-1]=fragContent;if(fragI==fragN){this.receiveMessage(this.fragments.join(''),other);this.fragments=[];}}else{if(auth.encrypted&&msg.type===Message.MSG_DATA){plaintext=auth.consumeDataMessage(msg);this.display(plaintext,other);if(auth.finished){auth.reset();}}else{try{auth.consumeMessage(msg);}catch(e){auth.reset();}
if(auth.reply){this.send(auth.reply.toString());}
if(auth.encrypted){if(this.whenSecured)this.whenSecured();this.whenSecured=null;}}}},sendMessage:function(text,other){var auth=this.auth;if(auth.encrypted){this.send(auth.produceDataMessage(text).toString(),other);}else{this.send(text,other);}},startAKE:function(whenSecured){this.whenSecured=whenSecured;this.send(this.auth.produceQueryMessage().toString());}};return Communication;}());