PageSourceSearch

https://www.iresearch.cn/include/public/js/wxqrcode.js

js iresearch.cn collected 2026-10-02 03:34:49 UTC 39,803 bytes, 1,614 lines download raw bytes

vendor: 10,093 bytes, lines 1-427
1//---------------------------------------------------------------------
2//
3// QR Code Generator for JavaScript
4//
5// Copyright (c) 2009 Kazuhiko Arase
6//
7// URL: http://www.d-project.com/
8//
9// Licensed under the MIT license:
10//	http://www.opensource.org/licenses/mit-license.php
11//
12// The word 'QR Code' is registered trademark of
13// DENSO WAVE INCORPORATED
14//	http://www.denso-wave.com/qrcode/faqpatent-e.html
15//
16/**
17 * qrcode
18 * @param typeNumber 1 to 40
19 * @param errorCorrectLevel 'L','M','Q','H'
20 */
21var qrcode = function(typeNumber, errorCorrectLevel) {
22
23    var PAD0 = 0xEC;
24    var PAD1 = 0x11;
25
26    var _typeNumber = typeNumber;
27    var _errorCorrectLevel = QRErrorCorrectLevel[errorCorrectLevel];
28    var _modules = null;
29    var _moduleCount = 0;
30    var _dataCache = null;
31    var _dataList = new Array();
32
33    var _this = {};
34
35    var makeImpl = function(test, maskPattern) {
36
37	_moduleCount = _typeNumber * 4 + 17;
38	_modules = function(moduleCount) {
39	    var modules = new Array(moduleCount);
40	    for (var row = 0; row < moduleCount; row += 1) {
41		modules[row] = new Array(moduleCount);
42		for (var col = 0; col < moduleCount; col += 1) {
43		    modules[row][col] = null;
44		}
45	    }
46	    return modules;
47	}(_moduleCount);
48
49	setupPositionProbePattern(0, 0);
50	setupPositionProbePattern(_moduleCount - 7, 0);
51	setupPositionProbePattern(0, _moduleCount - 7);
52	setupPositionAdjustPattern();
53	setupTimingPattern();
54	setupTypeInfo(test, maskPattern);
55
56	if (_typeNumber >= 7) {
57	    setupTypeNumber(test);
58	}
59
60	if (_dataCache == null) {
61	    _dataCache = createData(_typeNumber, _errorCorrectLevel, _dataList);
62	}
63
64	mapData(_dataCache, maskPattern);
65    };
66
67    var setupPositionProbePattern = function(row, col) {
68
69	for (var r = -1; r <= 7; r += 1) {
70
71	    if (row + r <= -1 || _moduleCount <= row + r) continue;
72
73	    for (var c = -1; c <= 7; c += 1) {
74
75		if (col + c <= -1 || _moduleCount <= col + c) continue;
76
77		if ( (0 <= r && r <= 6 && (c == 0 || c == 6) )
78		     || (0 <= c && c <= 6 && (r == 0 || r == 6) )
79		     || (2 <= r && r <= 4 && 2 <= c && c <= 4) ) {
80		    _modules[row + r][col + c] = true;
81		} else {
82		    _modules[row + r][col + c] = false;
83		}
84	    }
85	}
86    };
87
88    var getBestMaskPattern = function() {
89
90	var minLostPoint = 0;
91	var pattern = 0;
92
93	for (var i = 0; i < 8; i += 1) {
94
95	    makeImpl(true, i);
96
97	    var lostPoint = QRUtil.getLostPoint(_this);
98
99	    if (i == 0 || minLostPoint > lostPoint) {
100		minLostPoint = lostPoint;
101		pattern = i;
102	    }
103	}
104
105	return pattern;
106    };
107
108    var setupTimingPattern = function() {
109
110	for (var r = 8; r < _moduleCount - 8; r += 1) {
111	    if (_modules[r][6] != null) {
112		continue;
113	    }
114	    _modules[r][6] = (r % 2 == 0);
115	}
116
117	for (var c = 8; c < _moduleCount - 8; c += 1) {
118	    if (_modules[6][c] != null) {
119		continue;
120	    }
121	    _modules[6][c] = (c % 2 == 0);
122	}
123    };
124
125    var setupPositionAdjustPattern = function() {
126
127	var pos = QRUtil.getPatternPosition(_typeNumber);
128
129	for (var i = 0; i < pos.length; i += 1) {
130
131	    for (var j = 0; j < pos.length; j += 1) {
132
133		var row = pos[i];
134		var col = pos[j];
135
136		if (_modules[row][col] != null) {
137		    continue;
138		}
139
140		for (var r = -2; r <= 2; r += 1) {
141
142		    for (var c = -2; c <= 2; c += 1) {
143
144			if (r == -2 || r == 2 || c == -2 || c == 2
145			    || (r == 0 && c == 0) ) {
146			    _modules[row + r][col + c] = true;
147			} else {
148			    _modules[row + r][col + c] = false;
149			}
150		    }
151		}
152	    }
153	}
154    };
155
156    var setupTypeNumber = function(test) {
157
158	var bits = QRUtil.getBCHTypeNumber(_typeNumber);
159
160	for (var i = 0; i < 18; i += 1) {
161	    var mod = (!test && ( (bits >> i) & 1) == 1);
162	    _modules[Math.floor(i / 3)][i % 3 + _moduleCount - 8 - 3] = mod;
163	}
164
165	for (var i = 0; i < 18; i += 1) {
166	    var mod = (!test && ( (bits >> i) & 1) == 1);
167	    _modules[i % 3 + _moduleCount - 8 - 3][Math.floor(i / 3)] = mod;
168	}
169    };
170
171    var setupTypeInfo = function(test, maskPattern) {
172
173	var data = (_errorCorrectLevel << 3) | maskPattern;
174	var bits = QRUtil.getBCHTypeInfo(data);
175
176	// vertical
177	for (var i = 0; i < 15; i += 1) {
178
179	    var mod = (!test && ( (bits >> i) & 1) == 1);
180
181	    if (i < 6) {
182		_modules[i][8] = mod;
183	    } else if (i < 8) {
184		_modules[i + 1][8] = mod;
185	    } else {
186		_modules[_moduleCount - 15 + i][8] = mod;
187	    }
188	}
189
190	// horizontal
191	for (var i = 0; i < 15; i += 1) {
192
193	    var mod = (!test && ( (bits >> i) & 1) == 1);
194
195	    if (i < 8) {
196		_modules[8][_moduleCount - i - 1] = mod;
197	    } else if (i < 9) {
198		_modules[8][15 - i - 1 + 1] = mod;
199	    } else {
200		_modules[8][15 - i - 1] = mod;
201	    }
202	}
203
204	// fixed module
205	_modules[_moduleCount - 8][8] = (!test);
206    };
207
208    var mapData = function(data, maskPattern) {
209
210	var inc = -1;
211	var row = _moduleCount - 1;
212	var bitIndex = 7;
213	var byteIndex = 0;
214	var maskFunc = QRUtil.getMaskFunction(maskPattern);
215
216	for (var col = _moduleCount - 1; col > 0; col -= 2) {
217
218	    if (col == 6) col -= 1;
219
220	    while (true) {
221
222		for (var c = 0; c < 2; c += 1) {
223
224		    if (_modules[row][col - c] == null) {
225
226			var dark = false;
227
228			if (byteIndex < data.length) {
229			    dark = ( ( (data[byteIndex] >>> bitIndex) & 1) == 1);
230			}
231
232			var mask = maskFunc(row, col - c);
233
234			if (mask) {
235			    dark = !dark;
236			}
237
238			_modules[row][col - c] = dark;
239			bitIndex -= 1;
240
241			if (bitIndex == -1) {
242			    byteIndex += 1;
243			    bitIndex = 7;
244			}
245		    }
246		}
247
248		row += inc;
249
250		if (row < 0 || _moduleCount <= row) {
251		    row -= inc;
252		    inc = -inc;
253		    break;
254		}
255	    }
256	}
257    };
258
259    var createBytes = function(buffer, rsBlocks) {
260
261	var offset = 0;
262
263	var maxDcCount = 0;
264	var maxEcCount = 0;
265
266	var dcdata = new Array(rsBlocks.length);
267	var ecdata = new Array(rsBlocks.length);
268
269	for (var r = 0; r < rsBlocks.length; r += 1) {
270
271	    var dcCount = rsBlocks[r].dataCount;
272	    var ecCount = rsBlocks[r].totalCount - dcCount;
273
274	    maxDcCount = Math.max(maxDcCount, dcCount);
275	    maxEcCount = Math.max(maxEcCount, ecCount);
276
277	    dcdata[r] = new Array(dcCount);
278
279	    for (var i = 0; i < dcdata[r].length; i += 1) {
280		dcdata[r][i] = 0xff & buffer.getBuffer()[i + offset];
281	    }
282	    offset += dcCount;
283
284	    var rsPoly = QRUtil.getErrorCorrectPolynomial(ecCount);
285	    var rawPoly = qrPolynomial(dcdata[r], rsPoly.getLength() - 1);
286
287	    var modPoly = rawPoly.mod(rsPoly);
288	    ecdata[r] = new Array(rsPoly.getLength() - 1);
289	    for (var i = 0; i < ecdata[r].length; i += 1) {
290		var modIndex = i + modPoly.getLength() - ecdata[r].length;
291		ecdata[r][i] = (modIndex >= 0)? modPoly.getAt(modIndex) : 0;
292	    }
293	}
294
295	var totalCodeCount = 0;
296	for (var i = 0; i < rsBlocks.length; i += 1) {
297	    totalCodeCount += rsBlocks[i].totalCount;
298	}
299
300	var data = new Array(totalCodeCount);
301	var index = 0;
302
303	for (var i = 0; i < maxDcCount; i += 1) {
304	    for (var r = 0; r < rsBlocks.length; r += 1) {
305		if (i < dcdata[r].length) {
306		    data[index] = dcdata[r][i];
307		    index += 1;
308		}
309	    }
310	}
311
312	for (var i = 0; i < maxEcCount; i += 1) {
313	    for (var r = 0; r < rsBlocks.length; r += 1) {
314		if (i < ecdata[r].length) {
315		    data[index] = ecdata[r][i];
316		    index += 1;
317		}
318	    }
319	}
320
321	return data;
322    };
323
324    var createData = function(typeNumber, errorCorrectLevel, dataList) {
325
326	var rsBlocks = QRRSBlock.getRSBlocks(typeNumber, errorCorrectLevel);
327
328	var buffer = qrBitBuffer();
329
330	for (var i = 0; i < dataList.length; i += 1) {
331	    var data = dataList[i];
332	    buffer.put(data.getMode(), 4);
333	    buffer.put(data.getLength(), QRUtil.getLengthInBits(data.getMode(), typeNumber) );
334	    data.write(buffer);
335	}
336
337	// calc num max data.
338	var totalDataCount = 0;
339	for (var i = 0; i < rsBlocks.length; i += 1) {
340	    totalDataCount += rsBlocks[i].dataCount;
341	}
342
343	if (buffer.getLengthInBits() > totalDataCount * 8) {
344	    throw new Error('code length overflow. ('
345			    + buffer.getLengthInBits()
346			    + '>'
347			    + totalDataCount * 8
348			    + ')');
349	}
350
351	// end code
352	if (buffer.getLengthInBits() + 4 <= totalDataCount * 8) {
353	    buffer.put(0, 4);
354	}
355
356	// padding
357	while (buffer.getLengthInBits() % 8 != 0) {
358	    buffer.putBit(false);
359	}
360
361	// padding
362	while (true) {
363
364	    if (buffer.getLengthInBits() >= totalDataCount * 8) {
365		break;
366	    }
367	    buffer.put(PAD0, 8);
368
369	    if (buffer.getLengthInBits() >= totalDataCount * 8) {
370		break;
371	    }
372	    buffer.put(PAD1, 8);
373	}
374
375	return createBytes(buffer, rsBlocks);
376    };
377
378    _this.addData = function(data) {
379	var newData = qr8BitByte(data);
380	_dataList.push(newData);
381	_dataCache = null;
382    };
383
384    _this.isDark = function(row, col) {
385	if (row < 0 || _moduleCount <= row || col < 0 || _moduleCount <= col) {
386	    throw new Error(row + ',' + col);
387	}
388	return _modules[row][col];
389    };
390
391    _this.getModuleCount = function() {
392	return _moduleCount;
393    };
394
395    _this.make = function() {
396	makeImpl(false, getBestMaskPattern() );
397    };
398
399    _this.createTableTag = function(cellSize, margin) {
400
401	cellSize = cellSize || 2;
402	margin = (typeof margin == 'undefined')? cellSize * 4 : margin;
403
404	var qrHtml = '';
405
406	qrHtml += '<table style="';
407	qrHtml += ' border-width: 0px; border-style: none;';
408	qrHtml += ' border-collapse: collapse;';
409	qrHtml += ' padding: 0px; margin: ' + margin + 'px;';
410	qrHtml += '">';
411	qrHtml += '<tbody>';
412
413	for (var r = 0; r < _this.getModuleCount(); r += 1) {
414
415	    qrHtml += '<tr>';
416
417	    for (var c = 0; c < _this.getModuleCount(); c += 1) {
418		qrHtml += '<td style="';
419		qrHtml += ' border-width: 0px; border-style: none;';
420		qrHtml += ' border-collapse: collapse;';
421		qrHtml += ' padding: 0px; margin: 0px;';
422		qrHtml += ' width: ' + cellSize + 'px;';
423		qrHtml += ' height: ' + cellSize + 'px;';
424		qrHtml += ' background-color: ';
425		qrHtml += _this.isDark(r, c)? '#000000' : '#ffffff';
426		qrHtml += ';';
427		qrHtml += '"/>
427';
428	    }
429
430	    qrHtml += '</tr>';
431	}
432
433	qrHtml += '</tbody>';
434	qrHtml += '</table>';
435
436	return qrHtml;
437    };
438
439    _this.createImgTag = function(cellSize, margin, size) {
440
441	cellSize = cellSize || 2;
442	margin = (typeof margin == 'undefined')? cellSize * 4 : margin;
443
444	var min = margin;
445	var max = _this.getModuleCount() * cellSize + margin;
446
447	return createImgTag(size, size, function(x, y) {
448	    if (min <= x && x < max && min <= y && y < max) {
449		var c = Math.floor( (x - min) / cellSize);
450		var r = Math.floor( (y - min) / cellSize);
451		return _this.isDark(r, c)? 0 : 1;
452	    } else {
453		return 1;
454	    }
455	} );
456    };
457
458    return _this;
459};
460
461//---------------------------------------------------------------------
462// qrcode.stringToBytes
463//---------------------------------------------------------------------
464
465qrcode.stringToBytes = function(s) {
466    var bytes = new Array();
467    for (var i = 0; i < s.length; i += 1) {
468	var c = s.charCodeAt(i);
469	bytes.push(c & 0xff);
470    }
471    return bytes;
472};
473
474//---------------------------------------------------------------------
475// qrcode.createStringToBytes
476//---------------------------------------------------------------------
477
478/**
479 * @param unicodeData base64 string of byte array.
480 * [16bit Unicode],[16bit Bytes], ...
481 * @param numChars
482 */
483qrcode.createStringToBytes = function(unicodeData, numChars) {
484
485    // create conversion map.
486
487    var unicodeMap = function() {
488
489	var bin = base64DecodeInputStream(unicodeData);
490	var read = function() {
491	    var b = bin.read();
492	    if (b == -1) throw new Error();
493	    return b;
494	};
495
496	var count = 0;
497	var unicodeMap = {};
498	while (true) {
499	    var b0 = bin.read();
500	    if (b0 == -1) break;
501	    var b1 = read();
502	    var b2 = read();
503	    var b3 = read();
504	    var k = String.fromCharCode( (b0 << 8) | b1);
505	    var v = (b2 << 8) | b3;
506	    unicodeMap[k] = v;
507	    count += 1;
508	}
509	if (count != numChars) {
510	    throw new Error(count + ' != ' + numChars);
511	}
512
513	return unicodeMap;
514    }();
515
516    var unknownChar = '?'.charCodeAt(0);
517
518    return function(s) {
519	var bytes = new Array();
520	for (var i = 0; i < s.length; i += 1) {
521	    var c = s.charCodeAt(i);
522	    if (c < 128) {
523		bytes.push(c);
524	    } else {
525		var b = unicodeMap[s.charAt(i)];
vendor: 13,933 bytes, lines 526-992
526		if (typeof b == 'number') {
527		    if ( (b & 0xff) == b) {
528			// 1byte
529			bytes.push(b);
530		    } else {
531			// 2bytes
532			bytes.push(b >>> 8);
533			bytes.push(b & 0xff);
534		    }
535		} else {
536		    bytes.push(unknownChar);
537		}
538	    }
539	}
540	return bytes;
541    };
542};
543
544//---------------------------------------------------------------------
545// QRMode
546//---------------------------------------------------------------------
547
548var QRMode = {
549    MODE_NUMBER :		1 << 0,
550    MODE_ALPHA_NUM : 	1 << 1,
551    MODE_8BIT_BYTE : 	1 << 2,
552    MODE_KANJI :		1 << 3
553};
554
555//---------------------------------------------------------------------
556// QRErrorCorrectLevel
557//---------------------------------------------------------------------
558
559var QRErrorCorrectLevel = {
560    L : 1,
561    M : 0,
562    Q : 3,
563    H : 2
564};
565
566//---------------------------------------------------------------------
567// QRMaskPattern
568//---------------------------------------------------------------------
569
570var QRMaskPattern = {
571    PATTERN000 : 0,
572    PATTERN001 : 1,
573    PATTERN010 : 2,
574    PATTERN011 : 3,
575    PATTERN100 : 4,
576    PATTERN101 : 5,
577    PATTERN110 : 6,
578    PATTERN111 : 7
579};
580
581//---------------------------------------------------------------------
582// QRUtil
583//---------------------------------------------------------------------
584
585var QRUtil = function() {
586
587    var PATTERN_POSITION_TABLE = [
588	[],
589	[6, 18],
590	[6, 22],
591	[6, 26],
592	[6, 30],
593	[6, 34],
594	[6, 22, 38],
595	[6, 24, 42],
596	[6, 26, 46],
597	[6, 28, 50],
598	[6, 30, 54],
599	[6, 32, 58],
600	[6, 34, 62],
601	[6, 26, 46, 66],
602	[6, 26, 48, 70],
603	[6, 26, 50, 74],
604	[6, 30, 54, 78],
605	[6, 30, 56, 82],
606	[6, 30, 58, 86],
607	[6, 34, 62, 90],
608	[6, 28, 50, 72, 94],
609	[6, 26, 50, 74, 98],
610	[6, 30, 54, 78, 102],
611	[6, 28, 54, 80, 106],
612	[6, 32, 58, 84, 110],
613	[6, 30, 58, 86, 114],
614	[6, 34, 62, 90, 118],
615	[6, 26, 50, 74, 98, 122],
616	[6, 30, 54, 78, 102, 126],
617	[6, 26, 52, 78, 104, 130],
618	[6, 30, 56, 82, 108, 134],
619	[6, 34, 60, 86, 112, 138],
620	[6, 30, 58, 86, 114, 142],
621	[6, 34, 62, 90, 118, 146],
622	[6, 30, 54, 78, 102, 126, 150],
623	[6, 24, 50, 76, 102, 128, 154],
624	[6, 28, 54, 80, 106, 132, 158],
625	[6, 32, 58, 84, 110, 136, 162],
626	[6, 26, 54, 82, 110, 138, 166],
627	[6, 30, 58, 86, 114, 142, 170]
628    ];
629    var G15 = (1 << 10) | (1 << 8) | (1 << 5) | (1 << 4) | (1 << 2) | (1 << 1) | (1 << 0);
630    var G18 = (1 << 12) | (1 << 11) | (1 << 10) | (1 << 9) | (1 << 8) | (1 << 5) | (1 << 2) | (1 << 0);
631    var G15_MASK = (1 << 14) | (1 << 12) | (1 << 10) | (1 << 4) | (1 << 1);
632
633    var _this = {};
634
635    var getBCHDigit = function(data) {
636	var digit = 0;
637	while (data != 0) {
638	    digit += 1;
639	    data >>>= 1;
640	}
641	return digit;
642    };
643
644    _this.getBCHTypeInfo = function(data) {
645	var d = data << 10;
646	while (getBCHDigit(d) - getBCHDigit(G15) >= 0) {
647	    d ^= (G15 << (getBCHDigit(d) - getBCHDigit(G15) ) );
648	}
649	return ( (data << 10) | d) ^ G15_MASK;
650    };
651
652    _this.getBCHTypeNumber = function(data) {
653	var d = data << 12;
654	while (getBCHDigit(d) - getBCHDigit(G18) >= 0) {
655	    d ^= (G18 << (getBCHDigit(d) - getBCHDigit(G18) ) );
656	}
657	return (data << 12) | d;
658    };
659
660    _this.getPatternPosition = function(typeNumber) {
661	return PATTERN_POSITION_TABLE[typeNumber - 1];
662    };
663
664    _this.getMaskFunction = function(maskPattern) {
665
666	switch (maskPattern) {
667
668	    case QRMaskPattern.PATTERN000 :
669		return function(i, j) { return (i + j) % 2 == 0; };
670	    case QRMaskPattern.PATTERN001 :
671		return function(i, j) { return i % 2 == 0; };
672	    case QRMaskPattern.PATTERN010 :
673		return function(i, j) { return j % 3 == 0; };
674	    case QRMaskPattern.PATTERN011 :
675		return function(i, j) { return (i + j) % 3 == 0; };
676	    case QRMaskPattern.PATTERN100 :
677		return function(i, j) { return (Math.floor(i / 2) + Math.floor(j / 3) ) % 2 == 0; };
678	    case QRMaskPattern.PATTERN101 :
679		return function(i, j) { return (i * j) % 2 + (i * j) % 3 == 0; };
680	    case QRMaskPattern.PATTERN110 :
681		return function(i, j) { return ( (i * j) % 2 + (i * j) % 3) % 2 == 0; };
682	    case QRMaskPattern.PATTERN111 :
683		return function(i, j) { return ( (i * j) % 3 + (i + j) % 2) % 2 == 0; };
684
685		default :
686		throw new Error('bad maskPattern:' + maskPattern);
687	}
688    };
689
690    _this.getErrorCorrectPolynomial = function(errorCorrectLength) {
691	var a = qrPolynomial([1], 0);
692	for (var i = 0; i < errorCorrectLength; i += 1) {
693	    a = a.multiply(qrPolynomial([1, QRMath.gexp(i)], 0) );
694	}
695	return a;
696    };
697
698    _this.getLengthInBits = function(mode, type) {
699
700	if (1 <= type && type < 10) {
701
702	    // 1 - 9
703
704	    switch(mode) {
705		case QRMode.MODE_NUMBER 	: return 10;
706		case QRMode.MODE_ALPHA_NUM 	: return 9;
707		case QRMode.MODE_8BIT_BYTE	: return 8;
708		case QRMode.MODE_KANJI		: return 8;
709		    default :
710		    throw new Error('mode:' + mode);
711	    }
712
713	} else if (type < 27) {
714
715	    // 10 - 26
716
717	    switch(mode) {
718		case QRMode.MODE_NUMBER 	: return 12;
719		case QRMode.MODE_ALPHA_NUM 	: return 11;
720		case QRMode.MODE_8BIT_BYTE	: return 16;
721		case QRMode.MODE_KANJI		: return 10;
722		    default :
723		    throw new Error('mode:' + mode);
724	    }
725
726	} else if (type < 41) {
727
728	    // 27 - 40
729
730	    switch(mode) {
731		case QRMode.MODE_NUMBER 	: return 14;
732		case QRMode.MODE_ALPHA_NUM	: return 13;
733		case QRMode.MODE_8BIT_BYTE	: return 16;
734		case QRMode.MODE_KANJI		: return 12;
735		    default :
736		    throw new Error('mode:' + mode);
737	    }
738
739	} else {
740	    throw new Error('type:' + type);
741	}
742    };
743
744    _this.getLostPoint = function(qrcode) {
745
746	var moduleCount = qrcode.getModuleCount();
747
748	var lostPoint = 0;
749
750	// LEVEL1
751
752	for (var row = 0; row < moduleCount; row += 1) {
753	    for (var col = 0; col < moduleCount; col += 1) {
754
755		var sameCount = 0;
756		var dark = qrcode.isDark(row, col);
757
758		for (var r = -1; r <= 1; r += 1) {
759
760		    if (row + r < 0 || moduleCount <= row + r) {
761			continue;
762		    }
763
764		    for (var c = -1; c <= 1; c += 1) {
765
766			if (col + c < 0 || moduleCount <= col + c) {
767			    continue;
768			}
769
770			if (r == 0 && c == 0) {
771			    continue;
772			}
773
774			if (dark == qrcode.isDark(row + r, col + c) ) {
775			    sameCount += 1;
776			}
777		    }
778		}
779
780		if (sameCount > 5) {
781		    lostPoint += (3 + sameCount - 5);
782		}
783	    }
784	};
785
786	// LEVEL2
787
788	for (var row = 0; row < moduleCount - 1; row += 1) {
789	    for (var col = 0; col < moduleCount - 1; col += 1) {
790		var count = 0;
791		if (qrcode.isDark(row, col) ) count += 1;
792		if (qrcode.isDark(row + 1, col) ) count += 1;
793		if (qrcode.isDark(row, col + 1) ) count += 1;
794		if (qrcode.isDark(row + 1, col + 1) ) count += 1;
795		if (count == 0 || count == 4) {
796		    lostPoint += 3;
797		}
798	    }
799	}
800
801	// LEVEL3
802
803	for (var row = 0; row < moduleCount; row += 1) {
804	    for (var col = 0; col < moduleCount - 6; col += 1) {
805		if (qrcode.isDark(row, col)
806		    && !qrcode.isDark(row, col + 1)
807		    &&  qrcode.isDark(row, col + 2)
808		    &&  qrcode.isDark(row, col + 3)
809		    &&  qrcode.isDark(row, col + 4)
810		    && !qrcode.isDark(row, col + 5)
811		    &&  qrcode.isDark(row, col + 6) ) {
812		    lostPoint += 40;
813		}
814	    }
815	}
816
817	for (var col = 0; col < moduleCount; col += 1) {
818	    for (var row = 0; row < moduleCount - 6; row += 1) {
819		if (qrcode.isDark(row, col)
820		    && !qrcode.isDark(row + 1, col)
821		    &&  qrcode.isDark(row + 2, col)
822		    &&  qrcode.isDark(row + 3, col)
823		    &&  qrcode.isDark(row + 4, col)
824		    && !qrcode.isDark(row + 5, col)
825		    &&  qrcode.isDark(row + 6, col) ) {
826		    lostPoint += 40;
827		}
828	    }
829	}
830
831	// LEVEL4
832
833	var darkCount = 0;
834
835	for (var col = 0; col < moduleCount; col += 1) {
836	    for (var row = 0; row < moduleCount; row += 1) {
837		if (qrcode.isDark(row, col) ) {
838		    darkCount += 1;
839		}
840	    }
841	}
842
843	var ratio = Math.abs(100 * darkCount / moduleCount / moduleCount - 50) / 5;
844	lostPoint += ratio * 10;
845
846	return lostPoint;
847    };
848
849    return _this;
850}();
851
852//---------------------------------------------------------------------
853// QRMath
854//---------------------------------------------------------------------
855
856var QRMath = function() {
857
858    var EXP_TABLE = new Array(256);
859    var LOG_TABLE = new Array(256);
860
861    // initialize tables
862    for (var i = 0; i < 8; i += 1) {
863	EXP_TABLE[i] = 1 << i;
864    }
865    for (var i = 8; i < 256; i += 1) {
866	EXP_TABLE[i] = EXP_TABLE[i - 4]
867	    ^ EXP_TABLE[i - 5]
868	    ^ EXP_TABLE[i - 6]
869	    ^ EXP_TABLE[i - 8];
870    }
871    for (var i = 0; i < 255; i += 1) {
872	LOG_TABLE[EXP_TABLE[i] ] = i;
873    }
874
875    var _this = {};
876
877    _this.glog = function(n) {
878
879	if (n < 1) {
880	    throw new Error('glog(' + n + ')');
881	}
882
883	return LOG_TABLE[n];
884    };
885
886    _this.gexp = function(n) {
887
888	while (n < 0) {
889	    n += 255;
890	}
891
892	while (n >= 256) {
893	    n -= 255;
894	}
895
896	return EXP_TABLE[n];
897    };
898
899    return _this;
900}();
901
902//---------------------------------------------------------------------
903// qrPolynomial
904//---------------------------------------------------------------------
905
906function qrPolynomial(num, shift) {
907
908    if (typeof num.length == 'undefined') {
909	throw new Error(num.length + '/' + shift);
910    }
911
912    var _num = function() {
913	var offset = 0;
914	while (offset < num.length && num[offset] == 0) {
915	    offset += 1;
916	}
917	var _num = new Array(num.length - offset + shift);
918	for (var i = 0; i < num.length - offset; i += 1) {
919	    _num[i] = num[i + offset];
920	}
921	return _num;
922    }();
923
924    var _this = {};
925
926    _this.getAt = function(index) {
927	return _num[index];
928    };
929
930    _this.getLength = function() {
931	return _num.length;
932    };
933
934    _this.multiply = function(e) {
935
936	var num = new Array(_this.getLength() + e.getLength() - 1);
937
938	for (var i = 0; i < _this.getLength(); i += 1) {
939	    for (var j = 0; j < e.getLength(); j += 1) {
940		num[i + j] ^= QRMath.gexp(QRMath.glog(_this.getAt(i) ) + QRMath.glog(e.getAt(j) ) );
941	    }
942	}
943
944	return qrPolynomial(num, 0);
945    };
946
947    _this.mod = function(e) {
948
949	if (_this.getLength() - e.getLength() < 0) {
950	    return _this;
951	}
952
953	var ratio = QRMath.glog(_this.getAt(0) ) - QRMath.glog(e.getAt(0) );
954
955	var num = new Array(_this.getLength() );
956	for (var i = 0; i < _this.getLength(); i += 1) {
957	    num[i] = _this.getAt(i);
958	}
959
960	for (var i = 0; i < e.getLength(); i += 1) {
961	    num[i] ^= QRMath.gexp(QRMath.glog(e.getAt(i) ) + ratio);
962	}
963
964	// recursive call
965	return qrPolynomial(num, 0).mod(e);
966    };
967
968    return _this;
969};
970
971//---------------------------------------------------------------------
972// QRRSBlock
973//---------------------------------------------------------------------
974
975var QRRSBlock = function() {
976
977
978    // [1: [L, M, Q, H], ..]
979    var RS_BLOCK_TABLE=[[1,26,19],[1,26,16],[1,26,13],[1,26,9],[1,44,34],[1,44,28],[1,44,22],[1,44,16],[1,70,55],[1,70,44],[2,35,17],[2,35,13],[1,100,80],[2,50,32],[2,50,24],[4,25,9],[1,134,108],[2,67,43],[2,33,15,2,34,16],[2,33,11,2,34,12],[2,86,68],[4,43,27],[4,43,19],[4,43,15],[2,98,78],[4,49,31],[2,32,14,4,33,15],[4,39,13,1,40,14],[2,121,97],[2,60,38,2,61,39],[4,40,18,2,41,19],[4,40,14,2,41,15],[2,146,116],[3,58,36,2,59,37],[4,36,16,4,37,17],[4,36,12,4,37,13],[2,86,68,2,87,69],[4,69,43,1,70,44],[6,43,19,2,44,20],[6,43,15,2,44,16],[4,101,81],[1,80,50,4,81,51],[4,50,22,4,51,23],[3,36,12,8,37,13],[2,116,92,2,117,93],[6,58,36,2,59,37],[4,46,20,6,47,21],[7,42,14,4,43,15],[4,133,107],[8,59,37,1,60,38],[8,44,20,4,45,21],[12,33,11,4,34,12],[3,145,115,1,146,116],[4,64,40,5,65,41],[11,36,16,5,37,17],[11,36,12,5,37,13],[5,109,87,1,110,88],[5,65,41,5,66,42],[5,54,24,7,55,25],[11,36,12],[5,122,98,1,123,99],[7,73,45,3,74,46],[15,43,19,2,44,20],[3,45,15,13,46,16],[1,135,107,5,136,108],[10,74,46,1,75,47],[1,50,22,15,51,23],[2,42,14,17,43,15],[5,150,120,1,151,121],[9,69,43,4,70,44],[17,50,22,1,51,23],[2,42,14,19,43,15],[3,141,113,4,142,114],[3,70,44,11,71,45],[17,47,21,4,48,22],[9,39,13,16,40,14],[3,135,107,5,136,108],[3,67,41,13,68,42],[15,54,24,5,55,25],[15,43,15,10,44,16],[4,144,116,4,145,117],[17,68,42],[17,50,22,6,51,23],[19,46,16,6,47,17],[2,139,111,7,140,112],[17,74,46],[7,54,24,16,55,25],[34,37,13],[4,151,121,5,152,122],[4,75,47,14,76,48],[11,54,24,14,55,25],[16,45,15,14,46,16],[6,147,117,4,148,118],[6,73,45,14,74,46],[11,54,24,16,55,25],[30,46,16,2,47,17],[8,132,106,4,133,107],[8,75,47,13,76,48],[7,54,24,22,55,25],[22,45,15,13,46,16],[10,142,114,2,143,115],[19,74,46,4,75,47],[28,50,22,6,51,23],[33,46,16,4,47,17],[8,152,122,4,153,123],[22,73,45,3,74,46],[8,53,23,26,54,24],[12,45,15,28,46,16],[3,147,117,10,148,118],[3,73,45,23,74,46],[4,54,24,31,55,25],[11,45,15,31,46,16],[7,146,116,7,147,117],[21,73,45,7,74,46],[1,53,23,37,54,24],[19,45,15,26,46,16],[5,145,115,10,146,116],[19,75,47,10,76,48],[15,54,24,25,55,25],[23,45,15,25,46,16],[13,145,115,3,146,116],[2,74,46,29,75,47],[42,54,24,1,55,25],[23,45,15,28,46,16],[17,145,115],[10,74,46,23,75,47],[10,54,24,35,55,25],[19,45,15,35,46,16],[17,145,115,1,146,116],[14,74,46,21,75,47],[29,54,24,19,55,25],[11,45,15,46,46,16],[13,145,115,6,146,116],[14,74,46,23,75,47],[44,54,24,7,55,25],[59,46,16,1,47,17],[12,151,121,7,152,122],[12,75,47,26,76,48],[39,54,24,14,55,25],[22,45,15,41,46,16],[6,151,121,14,152,122],[6,75,47,34,76,48],[46,54,24,10,55,25],[2,45,15,64,46,16],[17,152,122,4,153,123],[29,74,46,14,75,47],[49,54,24,10,55,25],[24,45,15,46,46,16],[4,152,122,18,153,123],[13,74,46,32,75,47],[48,54,24,14,55,25],[42,45,15,32,46,16],[20,147,117,4,148,118],[40,75,47,7,76,48],[43,54,24,22,55,25],[10,45,15,67,46,16],[19,148,118,6,149,119],[18,75,47,31,76,48],[34,54,24,34,55,25],[20,45,15,61,46,16]];
980
981    var qrRSBlock = function(totalCount, dataCount) {
982	var _this = {};
983	_this.totalCount = totalCount;
984	_this.dataCount = dataCount;
985	return _this;
986    };
987
988    var _this = {};
989
990    var getRsBlockTable = function(typeNumber, errorCorrectLevel) {
991
992	switch(errorCorrectLevel) {
993	    case QRErrorCorrectLevel.L :
994		return RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 0];
995	    case QRErrorCorrectLevel.M :
996		return RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 1];
997	    case QRErrorCorrectLevel.Q :
998		return RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 2];
999	    case QRErrorCorrectLevel.H :
1000		return RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 3];
1001		default :
1002		return undefined;
1003	}
1004    };
1005
1006    _this.getRSBlocks = function(typeNumber, errorCorrectLevel) {
1007
1008	var rsBlock = getRsBlockTable(typeNumber, errorCorrectLevel);
1009
1010	if (typeof rsBlock == 'undefined') {
1011	    throw new Error('bad rs block @ typeNumber:' + typeNumber +
1012			    '/errorCorrectLevel:' + errorCorrectLevel);
1013	}
1014
1015	var length = rsBlock.length / 3;
1016
1017	var list = new Array();
1018
1019	for (var i = 0; i < length; i += 1) {
1020
1021	    var count = rsBlock[i * 3 + 0];
1022	    var totalCount = rsBlock[i * 3 + 1];
1023	    var dataCount = rsBlock[i * 3 + 2];
1024
1025	    for (var j = 0; j < count; j += 1) {
1026		list.push(qrRSBlock(totalCount, dataCount) );
1027	    }
1028	}
1029
1030	return list;
1031    };
1032
1033    return _this;
1034}();
1035
1036//---------------------------------------------------------------------
1037// qrBitBuffer
1038//---------------------------------------------------------------------
1039
1040var qrBitBuffer = function() {
1041
1042    var _buffer = new Array();
1043    var _length = 0;
1044
1045    var _this = {};
1046
1047    _this.getBuffer = function() {
1048	return _buffer;
1049    };
1050
1051    _this.getAt = function(index) {
1052	var bufIndex = Math.floor(index / 8);
1053	return ( (_buffer[bufIndex] >>> (7 - index % 8) ) & 1) == 1;
1054    };
1055
1056    _this.put = function(num, length) {
1057	for (var i = 0; i < length; i += 1) {
1058	    _this.putBit( ( (num >>> (length - i - 1) ) & 1) == 1);
1059	}
1060    };
1061
1062    _this.getLengthInBits = function() {
1063	return _length;
1064    };
1065
1066    _this.putBit = function(bit) {
1067
1068	var bufIndex = Math.floor(_length / 8);
1069	if (_buffer.length <= bufIndex) {
1070	    _buffer.push(0);
1071	}
1072
1073	if (bit) {
1074	    _buffer[bufIndex] |= (0x80 >>> (_length % 8) );
1075	}
1076
1077	_length += 1;
1078    };
1079
1080    return _this;
1081};
1082
1083//---------------------------------------------------------------------
1084// qr8BitByte
1085//---------------------------------------------------------------------
1086
1087var qr8BitByte = function(data) {
1088
1089    var _mode = QRMode.MODE_8BIT_BYTE;
1090    var _data = data;
1091    var _parsedData = [];
1092
1093    var _this = {};
1094
1095
1096    // Added to support UTF-8 Characters
1097    for (var i = 0, l = _data.length; i < l; i++) {
1098	var byteArray = [];
1099	var code = _data.charCodeAt(i);
1100
1101	if (code > 0x10000) {
1102	    byteArray[0] = 0xF0 | ((code & 0x1C0000) >>> 18);
1103	    byteArray[1] = 0x80 | ((code & 0x3F000) >>> 12);
1104	    byteArray[2] = 0x80 | ((code & 0xFC0) >>> 6);
1105	    byteArray[3] = 0x80 | (code & 0x3F);
1106	} else if (code > 0x800) {
1107	    byteArray[0] = 0xE0 | ((code & 0xF000) >>> 12);
1108	    byteArray[1] = 0x80 | ((code & 0xFC0) >>> 6);
1109	    byteArray[2] = 0x80 | (code & 0x3F);
1110	} else if (code > 0x80) {
1111	    byteArray[0] = 0xC0 | ((code & 0x7C0) >>> 6);
1112	    byteArray[1] = 0x80 | (code & 0x3F);
1113	} else {
1114	    byteArray[0] = code;
1115	}
1116
1117        // Fix Unicode corruption bug
1118        _parsedData.push(byteArray);
1119    }
1120
1121    _parsedData = Array.prototype.concat.apply([], _parsedData);
1122
1123    if (_parsedData.length != _data.length) {
1124	_parsedData.unshift(191);
1125	_parsedData.unshift(187);
1126	_parsedData.unshift(239);
1127    }
1128
1129    var _bytes = _parsedData;
1130
1131    _this.getMode = function() {
1132	return _mode;
1133    };
1134
1135    _this.getLength = function(buffer) {
1136	return _bytes.length;
1137    };
1138
1139    _this.write = function(buffer) {
1140	for (var i = 0; i < _bytes.length; i += 1) {
1141	    buffer.put(_bytes[i], 8);
1142	}
1143    };
1144
1145    return _this;
1146};
1147
1148//=====================================================================
1149// GIF Support etc.
1150//
1151
1152//---------------------------------------------------------------------
1153// byteArrayOutputStream
1154//---------------------------------------------------------------------
1155
1156var byteArrayOutputStream = function() {
1157
1158    var _bytes = new Array();
1159
1160    var _this = {};
1161
1162    _this.writeByte = function(b) {
1163	_bytes.push(b & 0xff);
1164    };
1165
1166    _this.writeShort = function(i) {
1167	_this.writeByte(i);
1168	_this.writeByte(i >>> 8);
1169    };
1170
1171    _this.writeBytes = function(b, off, len) {
1172	off = off || 0;
1173	len = len || b.length;
1174	for (var i = 0; i < len; i += 1) {
1175	    _this.writeByte(b[i + off]);
1176	}
1177    };
1178
1179    _this.writeString = function(s) {
1180	for (var i = 0; i < s.length; i += 1) {
1181	    _this.writeByte(s.charCodeAt(i) );
1182	}
1183    };
1184
1185    _this.toByteArray = function() {
1186	return _bytes;
1187    };
1188
1189    _this.toString = function() {
1190	var s = '';
1191	s += '[';
1192	for (var i = 0; i < _bytes.length; i += 1) {
1193	    if (i > 0) {
1194		s += ',';
1195	    }
1196	    s += _bytes[i];
1197	}
1198	s += ']';
1199	return s;
1200    };
1201
1202    return _this;
1203};
vendor: 5,797 bytes, lines 1204-1481
1204
1205//---------------------------------------------------------------------
1206// base64EncodeOutputStream
1207//---------------------------------------------------------------------
1208
1209var base64EncodeOutputStream = function() {
1210
1211    var _buffer = 0;
1212    var _buflen = 0;
1213    var _length = 0;
1214    var _base64 = '';
1215
1216    var _this = {};
1217
1218    var writeEncoded = function(b) {
1219	_base64 += String.fromCharCode(encode(b & 0x3f) );
1220    };
1221
1222    var encode = function(n) {
1223	if (n < 0) {
1224	    // error.
1225	} else if (n < 26) {
1226	    return 0x41 + n;
1227	} else if (n < 52) {
1228	    return 0x61 + (n - 26);
1229	} else if (n < 62) {
1230	    return 0x30 + (n - 52);
1231	} else if (n == 62) {
1232	    return 0x2b;
1233	} else if (n == 63) {
1234	    return 0x2f;
1235	}
1236	throw new Error('n:' + n);
1237    };
1238
1239    _this.writeByte = function(n) {
1240
1241	_buffer = (_buffer << 8) | (n & 0xff);
1242	_buflen += 8;
1243	_length += 1;
1244
1245	while (_buflen >= 6) {
1246	    writeEncoded(_buffer >>> (_buflen - 6) );
1247	    _buflen -= 6;
1248	}
1249    };
1250
1251    _this.flush = function() {
1252
1253	if (_buflen > 0) {
1254	    writeEncoded(_buffer << (6 - _buflen) );
1255	    _buffer = 0;
1256	    _buflen = 0;
1257	}
1258
1259	if (_length % 3 != 0) {
1260	    // padding
1261	    var padlen = 3 - _length % 3;
1262	    for (var i = 0; i < padlen; i += 1) {
1263		_base64 += '=';
1264	    }
1265	}
1266    };
1267
1268    _this.toString = function() {
1269	return _base64;
1270    };
1271
1272    return _this;
1273};
1274
1275//---------------------------------------------------------------------
1276// base64DecodeInputStream
1277//---------------------------------------------------------------------
1278
1279var base64DecodeInputStream = function(str) {
1280
1281    var _str = str;
1282    var _pos = 0;
1283    var _buffer = 0;
1284    var _buflen = 0;
1285
1286    var _this = {};
1287
1288    _this.read = function() {
1289
1290	while (_buflen < 8) {
1291
1292	    if (_pos >= _str.length) {
1293		if (_buflen == 0) {
1294		    return -1;
1295		}
1296		throw new Error('unexpected end of file./' + _buflen);
1297	    }
1298
1299	    var c = _str.charAt(_pos);
1300	    _pos += 1;
1301
1302	    if (c == '=') {
1303		_buflen = 0;
1304		return -1;
1305	    } else if (c.match(/^\s$/) ) {
1306		// ignore if whitespace.
1307		continue;
1308	    }
1309
1310	    _buffer = (_buffer << 6) | decode(c.charCodeAt(0) );
1311	    _buflen += 6;
1312	}
1313
1314	var n = (_buffer >>> (_buflen - 8) ) & 0xff;
1315	_buflen -= 8;
1316	return n;
1317    };
1318
1319    var decode = function(c) {
1320	if (0x41 <= c && c <= 0x5a) {
1321	    return c - 0x41;
1322	} else if (0x61 <= c && c <= 0x7a) {
1323	    return c - 0x61 + 26;
1324	} else if (0x30 <= c && c <= 0x39) {
1325	    return c - 0x30 + 52;
1326	} else if (c == 0x2b) {
1327	    return 62;
1328	} else if (c == 0x2f) {
1329	    return 63;
1330	} else {
1331	    throw new Error('c:' + c);
1332	}
1333    };
1334
1335    return _this;
1336};
1337
1338//---------------------------------------------------------------------
1339// gifImage (B/W)
1340//---------------------------------------------------------------------
1341
1342var gifImage = function(width, height) {
1343
1344    var _width = width;
1345    var _height = height;
1346    var _data = new Array(width * height);
1347
1348    var _this = {};
1349
1350    _this.setPixel = function(x, y, pixel) {
1351	_data[y * _width + x] = pixel;
1352    };
1353
1354    _this.write = function(out) {
1355
1356	//---------------------------------
1357	// GIF Signature
1358
1359	out.writeString('GIF87a');
1360
1361	//---------------------------------
1362	// Screen Descriptor
1363
1364	out.writeShort(_width);
1365	out.writeShort(_height);
1366
1367	out.writeByte(0x80); // 2bit
1368	out.writeByte(0);
1369	out.writeByte(0);
1370
1371	//---------------------------------
1372	// Global Color Map
1373
1374	// black
1375	out.writeByte(0x00);
1376	out.writeByte(0x00);
1377	out.writeByte(0x00);
1378
1379	// white
1380	out.writeByte(0xff);
1381	out.writeByte(0xff);
1382	out.writeByte(0xff);
1383
1384	//---------------------------------
1385	// Image Descriptor
1386
1387	out.writeString(',');
1388	out.writeShort(0);
1389	out.writeShort(0);
1390	out.writeShort(_width);
1391	out.writeShort(_height);
1392	out.writeByte(0);
1393
1394	//---------------------------------
1395	// Local Color Map
1396
1397	//---------------------------------
1398	// Raster Data
1399
1400	var lzwMinCodeSize = 2;
1401	var raster = getLZWRaster(lzwMinCodeSize);
1402
1403	out.writeByte(lzwMinCodeSize);
1404
1405	var offset = 0;
1406
1407	while (raster.length - offset > 255) {
1408	    out.writeByte(255);
1409	    out.writeBytes(raster, offset, 255);
1410	    offset += 255;
1411	}
1412
1413	out.writeByte(raster.length - offset);
1414	out.writeBytes(raster, offset, raster.length - offset);
1415	out.writeByte(0x00);
1416
1417	//---------------------------------
1418	// GIF Terminator
1419	out.writeString(';');
1420    };
1421
1422    var bitOutputStream = function(out) {
1423
1424	var _out = out;
1425	var _bitLength = 0;
1426	var _bitBuffer = 0;
1427
1428	var _this = {};
1429
1430	_this.write = function(data, length) {
1431
1432	    if ( (data >>> length) != 0) {
1433		throw new Error('length over');
1434	    }
1435
1436	    while (_bitLength + length >= 8) {
1437		_out.writeByte(0xff & ( (data << _bitLength) | _bitBuffer) );
1438		length -= (8 - _bitLength);
1439		data >>>= (8 - _bitLength);
1440		_bitBuffer = 0;
1441		_bitLength = 0;
1442	    }
1443
1444	    _bitBuffer = (data << _bitLength) | _bitBuffer;
1445	    _bitLength = _bitLength + length;
1446	};
1447
1448	_this.flush = function() {
1449	    if (_bitLength > 0) {
1450		_out.writeByte(_bitBuffer);
1451	    }
1452	};
1453
1454	return _this;
1455    };
1456
1457    var getLZWRaster = function(lzwMinCodeSize) {
1458
1459	var clearCode = 1 << lzwMinCodeSize;
1460	var endCode = (1 << lzwMinCodeSize) + 1;
1461	var bitLength = lzwMinCodeSize + 1;
1462
1463	// Setup LZWTable
1464	var table = lzwTable();
1465
1466	for (var i = 0; i < clearCode; i += 1) {
1467	    table.add(String.fromCharCode(i) );
1468	}
1469	table.add(String.fromCharCode(clearCode) );
1470	table.add(String.fromCharCode(endCode) );
1471
1472	var byteOut = byteArrayOutputStream();
1473	var bitOut = bitOutputStream(byteOut);
1474
1475	// clear code
1476	bitOut.write(clearCode, bitLength);
1477
1478	var dataIndex = 0;
1479
1480	var s = String.fromCharCode(_data[dataIndex]);
1481	dataIndex += 1;
1482
1483	while (dataIndex < _data.length) {
1484
1485	    var c = String.fromCharCode(_data[dataIndex]);
1486	    dataIndex += 1;
1487
1488	    if (table.contains(s + c) ) {
1489
1490		s = s + c;
1491
1492	    } else {
1493
1494		bitOut.write(table.indexOf(s), bitLength);
1495
1496		if (table.size() < 0xfff) {
1497
1498		    if (table.size() == (1 << bitLength) ) {
1499			bitLength += 1;
1500		    }
1501
1502		    table.add(s + c);
1503		}
1504
1505		s = c;
1506	    }
1507	}
1508
1509	bitOut.write(table.indexOf(s), bitLength);
1510
1511	// end code
1512	bitOut.write(endCode, bitLength);
1513
1514	bitOut.flush();
1515
1516	return byteOut.toByteArray();
1517    };
1518
1519    var lzwTable = function() {
1520
1521	var _map = {};
1522	var _size = 0;
1523
1524	var _this = {};
1525
1526	_this.add = function(key) {
1527	    if (_this.contains(key) ) {
1528		throw new Error('dup key:' + key);
1529	    }
1530	    _map[key] = _size;
1531	    _size += 1;
1532	};
1533
1534	_this.size = function() {
1535	    return _size;
1536	};
1537
1538	_this.indexOf = function(key) {
1539	    return _map[key];
1540	};
1541
1542	_this.contains = function(key) {
1543	    return typeof _map[key] != 'undefined';
1544	};
1545
1546	return _this;
1547    };
1548
1549    return _this;
1550};
1551
1552var createImgTag = function(width, height, getPixel, alt) {
1553
1554    var gif = gifImage(width, height);
1555    for (var y = 0; y < height; y += 1) {
1556	for (var x = 0; x < width; x += 1) {
1557	    gif.setPixel(x, y, getPixel(x, y) );
1558	}
1559    }
1560
1561    var b = byteArrayOutputStream();
1562    gif.write(b);
1563
1564    var base64 = base64EncodeOutputStream();
1565    var bytes = b.toByteArray();
1566    for (var i = 0; i < bytes.length; i += 1) {
1567	base64.writeByte(bytes[i]);
1568    }
1569    base64.flush();
1570
1571    var img = '';
1572    img += 'data:image/gif;base64,';
1573    img += base64;
1574
1575    return img;
1576};
1577
1578//---------------------------------------------------------------------
1579// returns qrcode function.
1580
1581var createQrCodeImg = function(text, options) {
1582    options = options || {};
1583    var typeNumber = options.typeNumber || 4;
1584    var errorCorrectLevel = options.errorCorrectLevel || 'M';
1585    var size = options.size || 500;
1586
1587    var qr;
1588
1589    try {
1590        qr = qrcode(typeNumber, errorCorrectLevel || 'M');
1591        qr.addData(text);
1592        qr.make();
1593    } catch (e) {
1594        if(typeNumber >= 40) {
1595            throw new Error('Text too long to encode');
1596        } else {
1597            return createQrCodeImg(text, {
1598                size: size,
1599                errorCorrectLevel: errorCorrectLevel,
1600                typeNumber: typeNumber + 1
1601            });
1602        }
1603    }
1604
1605    // calc cellsize and margin
1606    var cellsize = parseInt(size / qr.getModuleCount());
1607    var margin = parseInt((size - qr.getModuleCount() * cellsize) / 2);
1608
1609    return qr.createImgTag(cellsize, margin, size);
1610};
1611var module = {};
1612module.exports = {
1613	createQrCodeImg : createQrCodeImg
1614};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.