diff --git a/index/passCar.js b/index/passCar.js index a390935..f677041 100644 --- a/index/passCar.js +++ b/index/passCar.js @@ -136,7 +136,7 @@ Page({ } // that.data.ticketList = that.data.ticketList.concat(res.data.list); - this.hideLoading(); + wx.hideLoading(); }) .catch(err => { setTimeout(function () { diff --git a/utils/barcode.js b/utils/barcode.js index 0838c8e..0a94287 100644 --- a/utils/barcode.js +++ b/utils/barcode.js @@ -11,392 +11,382 @@ var SET_STOP = 106; var REPLACE_CODES = { - CHAR_TILDE: CODE_FNC1 //~ corresponds to FNC1 in GS1-128 standard + CHAR_TILDE: CODE_FNC1 //~ corresponds to FNC1 in GS1-128 standard } var CODESET = { - ANY: 1, - AB: 2, - A: 3, - B: 4, - C: 5 + ANY: 1, + AB: 2, + A: 3, + B: 4, + C: 5 }; function getBytes(str) { - var bytes = []; - for (var i = 0; i < str.length; i++) { - bytes.push(str.charCodeAt(i)); - } - return bytes; + var bytes = []; + for (var i = 0; i < str.length; i++) { + bytes.push(str.charCodeAt(i)); + } + return bytes; } -exports.code128 = function (ctx, text, width, height) { +exports.code128 = function(ctx, text, width, height) { - width = parseInt(width); + width = parseInt(width); - height = parseInt(height); + height = parseInt(height); - var codes = stringToCode128(text); + var codes = stringToCode128(text); - var g = new Graphics(ctx, width, height); + var g = new Graphics(ctx, width, height); - var barWeight = g.area.width / ((codes.length - 3) * 11 + 35); + var barWeight = g.area.width / ((codes.length - 3) * 11 + 35); - var x = g.area.left; - var y = g.area.top; - for (var i = 0; i < codes.length; i++) { - var c = codes[i]; - //two bars at a time: 1 black and 1 white - for (var bar = 0; bar < 8; bar += 2) { - var barW = PATTERNS[c][bar] * barWeight; - // var barH = height - y - this.border; - var barH = height - y; - var spcW = PATTERNS[c][bar + 1] * barWeight; + var x = g.area.left; + var y = g.area.top; + for (var i = 0; i < codes.length; i++) { + var c = codes[i]; + //two bars at a time: 1 black and 1 white + for (var bar = 0; bar < 8; bar += 2) { + var barW = PATTERNS[c][bar] * barWeight; + // var barH = height - y - this.border; + var barH = height - y; + var spcW = PATTERNS[c][bar + 1] * barWeight; - //no need to draw if 0 width - if (barW > 0) { - g.fillFgRect(x, y, barW, barH); - } + //no need to draw if 0 width + if (barW > 0) { + g.fillFgRect(x, y, barW, barH); + } - x += barW + spcW; - } + x += barW + spcW; } + } - ctx.draw(); + ctx.draw(); } function stringToCode128(text) { - var barc = { - currcs: CODESET.C - }; - - var bytes = getBytes(text); - //decide starting codeset - var index = bytes[0] == CHAR_TILDE ? 1 : 0; - - var csa1 = bytes.length > 0 ? codeSetAllowedFor(bytes[index++]) : CODESET.AB; - var csa2 = bytes.length > 0 ? codeSetAllowedFor(bytes[index++]) : CODESET.AB; - barc.currcs = getBestStartSet(csa1, csa2); - barc.currcs = perhapsCodeC(bytes, barc.currcs); - - //if no codeset changes this will end up with bytes.length+3 - //start, checksum and stop - var codes = new Array(); - - switch (barc.currcs) { - case CODESET.A: - codes.push(SET_STARTA); - break; - case CODESET.B: - codes.push(SET_STARTB); - break; - default: - codes.push(SET_STARTC); - break; + var barc = { + currcs: CODESET.C + }; + + var bytes = getBytes(text); + //decide starting codeset + var index = bytes[0] == CHAR_TILDE ? 1 : 0; + + var csa1 = bytes.length > 0 ? codeSetAllowedFor(bytes[index++]) : CODESET.AB; + var csa2 = bytes.length > 0 ? codeSetAllowedFor(bytes[index++]) : CODESET.AB; + barc.currcs = getBestStartSet(csa1, csa2); + barc.currcs = perhapsCodeC(bytes, barc.currcs); + + //if no codeset changes this will end up with bytes.length+3 + //start, checksum and stop + var codes = new Array(); + + switch (barc.currcs) { + case CODESET.A: + codes.push(SET_STARTA); + break; + case CODESET.B: + codes.push(SET_STARTB); + break; + default: + codes.push(SET_STARTC); + break; + } + + + for (var i = 0; i < bytes.length; i++) { + var b1 = bytes[i]; //get the first of a pair + //should we translate/replace + if (b1 in REPLACE_CODES) { + codes.push(REPLACE_CODES[b1]); + i++ //jump to next + b1 = bytes[i]; } - + //get the next in the pair if possible + var b2 = bytes.length > (i + 1) ? bytes[i + 1] : -1; + + codes = codes.concat(codesForChar(b1, b2, barc.currcs)); + //code C takes 2 chars each time + if (barc.currcs == CODESET.C) i++; + } + + //calculate checksum according to Code 128 standards + var checksum = codes[0]; + for (var weight = 1; weight < codes.length; weight++) { + checksum += (weight * codes[weight]); + } + codes.push(checksum % 103); + + codes.push(SET_STOP); + + //encoding should now be complete + return codes; + + function getBestStartSet(csa1, csa2) { + //tries to figure out the best codeset + //to start with to get the most compact code + var vote = 0; + vote += csa1 == CODESET.A ? 1 : 0; + vote += csa1 == CODESET.B ? -1 : 0; + vote += csa2 == CODESET.A ? 1 : 0; + vote += csa2 == CODESET.B ? -1 : 0; + //tie goes to B due to my own predudices + return vote > 0 ? CODESET.A : CODESET.B; + } + + function perhapsCodeC(bytes, codeset) { for (var i = 0; i < bytes.length; i++) { - var b1 = bytes[i]; //get the first of a pair - //should we translate/replace - if (b1 in REPLACE_CODES) { - codes.push(REPLACE_CODES[b1]); - i++ //jump to next - b1 = bytes[i]; - } - - //get the next in the pair if possible - var b2 = bytes.length > (i + 1) ? bytes[i + 1] : -1; - - codes = codes.concat(codesForChar(b1, b2, barc.currcs)); - //code C takes 2 chars each time - if (barc.currcs == CODESET.C) i++; - } - - //calculate checksum according to Code 128 standards - var checksum = codes[0]; - for (var weight = 1; weight < codes.length; weight++) { - checksum += (weight * codes[weight]); - } - codes.push(checksum % 103); - - codes.push(SET_STOP); - - //encoding should now be complete - return codes; - - function getBestStartSet(csa1, csa2) { - //tries to figure out the best codeset - //to start with to get the most compact code - var vote = 0; - vote += csa1 == CODESET.A ? 1 : 0; - vote += csa1 == CODESET.B ? -1 : 0; - vote += csa2 == CODESET.A ? 1 : 0; - vote += csa2 == CODESET.B ? -1 : 0; - //tie goes to B due to my own predudices - return vote > 0 ? CODESET.A : CODESET.B; - } - - function perhapsCodeC(bytes, codeset) { - for (var i = 0; i < bytes.length; i++) { - var b = bytes[i] - if ((b < 48 || b > 57) && b != CHAR_TILDE) - return codeset; - } - return CODESET.C; + var b = bytes[i] + if ((b < 48 || b > 57) && b != CHAR_TILDE) + return codeset; } - - //chr1 is current byte - //chr2 is the next byte to process. looks ahead. - function codesForChar(chr1, chr2, currcs) { - var result = []; - var shifter = -1; - - if (charCompatible(chr1, currcs)) { - if (currcs == CODESET.C) { - if (chr2 == -1) { - shifter = SET_CODEB; - currcs = CODESET.B; - } - else if ((chr2 != -1) && !charCompatible(chr2, currcs)) { - //need to check ahead as well - if (charCompatible(chr2, CODESET.A)) { - shifter = SET_CODEA; - currcs = CODESET.A; - } - else { - shifter = SET_CODEB; - currcs = CODESET.B; - } - } - } - } - else { - //if there is a next char AND that next char is also not compatible - if ((chr2 != -1) && !charCompatible(chr2, currcs)) { - //need to switch code sets - switch (currcs) { - case CODESET.A: - shifter = SET_CODEB; - currcs = CODESET.B; - break; - case CODESET.B: - shifter = SET_CODEA; - currcs = CODESET.A; - break; - } - } - else { - //no need to shift code sets, a temporary SHIFT will suffice - shifter = SET_SHIFT; - } + return CODESET.C; + } + + //chr1 is current byte + //chr2 is the next byte to process. looks ahead. + function codesForChar(chr1, chr2, currcs) { + var result = []; + var shifter = -1; + + if (charCompatible(chr1, currcs)) { + if (currcs == CODESET.C) { + if (chr2 == -1) { + shifter = SET_CODEB; + currcs = CODESET.B; + } else if ((chr2 != -1) && !charCompatible(chr2, currcs)) { + //need to check ahead as well + if (charCompatible(chr2, CODESET.A)) { + shifter = SET_CODEA; + currcs = CODESET.A; + } else { + shifter = SET_CODEB; + currcs = CODESET.B; + } } - - //ok some type of shift is nessecary - if (shifter != -1) { - result.push(shifter); - result.push(codeValue(chr2)); - } - else { - if (currcs == CODESET.C) { - //include next as well - result.push(codeValue(chr1, chr2)); - } - else { - result.push(codeValue(chr1)); - } + } + } else { + //if there is a next char AND that next char is also not compatible + if ((chr2 != -1) && !charCompatible(chr2, currcs)) { + //need to switch code sets + switch (currcs) { + case CODESET.A: + shifter = SET_CODEB; + currcs = CODESET.B; + break; + case CODESET.B: + shifter = SET_CODEA; + currcs = CODESET.A; + break; } - barc.currcs = currcs; + } else { + //no need to shift code sets, a temporary SHIFT will suffice + shifter = SET_SHIFT; + } + } - return result; + //ok some type of shift is nessecary + if (shifter != -1) { + result.push(shifter); + result.push(codeValue(chr2)); + } else { + if (currcs == CODESET.C) { + //include next as well + result.push(codeValue(chr1, chr2)); + } else { + result.push(codeValue(chr1)); + } } + barc.currcs = currcs; + + return result; + } } //reduce the ascii code to fit into the Code128 char table function codeValue(chr1, chr2) { - if (typeof chr2 == "undefined") { - return chr1 >= 32 ? chr1 - 32 : chr1 + 64; - } - else { - return parseInt(String.fromCharCode(chr1) + String.fromCharCode(chr2)); - } + if (typeof chr2 == "undefined") { + return chr1 >= 32 ? chr1 - 32 : chr1 + 64; + } else { + return parseInt(String.fromCharCode(chr1) + String.fromCharCode(chr2)); + } } function charCompatible(chr, codeset) { - var csa = codeSetAllowedFor(chr); - if (csa == CODESET.ANY) return true; - //if we need to change from current - if (csa == CODESET.AB) return true; - if (csa == CODESET.A && codeset == CODESET.A) return true; - if (csa == CODESET.B && codeset == CODESET.B) return true; - return false; + var csa = codeSetAllowedFor(chr); + if (csa == CODESET.ANY) return true; + //if we need to change from current + if (csa == CODESET.AB) return true; + if (csa == CODESET.A && codeset == CODESET.A) return true; + if (csa == CODESET.B && codeset == CODESET.B) return true; + return false; } function codeSetAllowedFor(chr) { - if (chr >= 48 && chr <= 57) { - //0-9 - return CODESET.ANY; - } - else if (chr >= 32 && chr <= 95) { - //0-9 A-Z - return CODESET.AB; - } - else { - //if non printable - return chr < 32 ? CODESET.A : CODESET.B; - } + if (chr >= 48 && chr <= 57) { + //0-9 + return CODESET.ANY; + } else if (chr >= 32 && chr <= 95) { + //0-9 A-Z + return CODESET.AB; + } else { + //if non printable + return chr < 32 ? CODESET.A : CODESET.B; + } } var Graphics = function(ctx, width, height) { - this.width = width; - this.height = height; - this.quiet = Math.round(this.width / 40); - - this.border_size = 0; - this.padding_width = 0; - - this.area = { - width : width - this.padding_width * 2 - this.quiet * 2, - height: height - this.border_size * 2, - top : this.border_size - 4, - left : this.padding_width + this.quiet - }; - - this.ctx = ctx; - this.fg = "#000000"; - this.bg = "#ffffff"; - - // fill background - this.fillBgRect(0,0, width, height); - - // fill center to create border - this.fillBgRect(0, this.border_size, width, height - this.border_size * 2); + this.width = width; + this.height = height; + this.quiet = Math.round(this.width / 40); + + this.border_size = 0; + this.padding_width = 0; + + this.area = { + width: width - this.padding_width * 2 - this.quiet * 2, + height: height - this.border_size * 2, + top: this.border_size - 4, + left: this.padding_width + this.quiet + }; + + this.ctx = ctx; + this.fg = "#000000"; + this.bg = "#ffffff"; + + // fill background + this.fillBgRect(0, 0, width, height); + + // fill center to create border + this.fillBgRect(0, this.border_size, width, height - this.border_size * 2); } //use native color Graphics.prototype._fillRect = function(x, y, width, height, color) { - this.ctx.setFillStyle(color) - this.ctx.fillRect(x, y, width, height) + this.ctx.setFillStyle(color) + this.ctx.fillRect(x, y, width, height) } -Graphics.prototype.fillFgRect = function(x,y, width, height) { - this._fillRect(x, y, width, height, this.fg); +Graphics.prototype.fillFgRect = function(x, y, width, height) { + this._fillRect(x, y, width, height, this.fg); } -Graphics.prototype.fillBgRect = function(x,y, width, height) { - this._fillRect(x, y, width, height, this.bg); +Graphics.prototype.fillBgRect = function(x, y, width, height) { + this._fillRect(x, y, width, height, this.bg); } var PATTERNS = [ - [2, 1, 2, 2, 2, 2, 0, 0], // 0 - [2, 2, 2, 1, 2, 2, 0, 0], // 1 - [2, 2, 2, 2, 2, 1, 0, 0], // 2 - [1, 2, 1, 2, 2, 3, 0, 0], // 3 - [1, 2, 1, 3, 2, 2, 0, 0], // 4 - [1, 3, 1, 2, 2, 2, 0, 0], // 5 - [1, 2, 2, 2, 1, 3, 0, 0], // 6 - [1, 2, 2, 3, 1, 2, 0, 0], // 7 - [1, 3, 2, 2, 1, 2, 0, 0], // 8 - [2, 2, 1, 2, 1, 3, 0, 0], // 9 - [2, 2, 1, 3, 1, 2, 0, 0], // 10 - [2, 3, 1, 2, 1, 2, 0, 0], // 11 - [1, 1, 2, 2, 3, 2, 0, 0], // 12 - [1, 2, 2, 1, 3, 2, 0, 0], // 13 - [1, 2, 2, 2, 3, 1, 0, 0], // 14 - [1, 1, 3, 2, 2, 2, 0, 0], // 15 - [1, 2, 3, 1, 2, 2, 0, 0], // 16 - [1, 2, 3, 2, 2, 1, 0, 0], // 17 - [2, 2, 3, 2, 1, 1, 0, 0], // 18 - [2, 2, 1, 1, 3, 2, 0, 0], // 19 - [2, 2, 1, 2, 3, 1, 0, 0], // 20 - [2, 1, 3, 2, 1, 2, 0, 0], // 21 - [2, 2, 3, 1, 1, 2, 0, 0], // 22 - [3, 1, 2, 1, 3, 1, 0, 0], // 23 - [3, 1, 1, 2, 2, 2, 0, 0], // 24 - [3, 2, 1, 1, 2, 2, 0, 0], // 25 - [3, 2, 1, 2, 2, 1, 0, 0], // 26 - [3, 1, 2, 2, 1, 2, 0, 0], // 27 - [3, 2, 2, 1, 1, 2, 0, 0], // 28 - [3, 2, 2, 2, 1, 1, 0, 0], // 29 - [2, 1, 2, 1, 2, 3, 0, 0], // 30 - [2, 1, 2, 3, 2, 1, 0, 0], // 31 - [2, 3, 2, 1, 2, 1, 0, 0], // 32 - [1, 1, 1, 3, 2, 3, 0, 0], // 33 - [1, 3, 1, 1, 2, 3, 0, 0], // 34 - [1, 3, 1, 3, 2, 1, 0, 0], // 35 - [1, 1, 2, 3, 1, 3, 0, 0], // 36 - [1, 3, 2, 1, 1, 3, 0, 0], // 37 - [1, 3, 2, 3, 1, 1, 0, 0], // 38 - [2, 1, 1, 3, 1, 3, 0, 0], // 39 - [2, 3, 1, 1, 1, 3, 0, 0], // 40 - [2, 3, 1, 3, 1, 1, 0, 0], // 41 - [1, 1, 2, 1, 3, 3, 0, 0], // 42 - [1, 1, 2, 3, 3, 1, 0, 0], // 43 - [1, 3, 2, 1, 3, 1, 0, 0], // 44 - [1, 1, 3, 1, 2, 3, 0, 0], // 45 - [1, 1, 3, 3, 2, 1, 0, 0], // 46 - [1, 3, 3, 1, 2, 1, 0, 0], // 47 - [3, 1, 3, 1, 2, 1, 0, 0], // 48 - [2, 1, 1, 3, 3, 1, 0, 0], // 49 - [2, 3, 1, 1, 3, 1, 0, 0], // 50 - [2, 1, 3, 1, 1, 3, 0, 0], // 51 - [2, 1, 3, 3, 1, 1, 0, 0], // 52 - [2, 1, 3, 1, 3, 1, 0, 0], // 53 - [3, 1, 1, 1, 2, 3, 0, 0], // 54 - [3, 1, 1, 3, 2, 1, 0, 0], // 55 - [3, 3, 1, 1, 2, 1, 0, 0], // 56 - [3, 1, 2, 1, 1, 3, 0, 0], // 57 - [3, 1, 2, 3, 1, 1, 0, 0], // 58 - [3, 3, 2, 1, 1, 1, 0, 0], // 59 - [3, 1, 4, 1, 1, 1, 0, 0], // 60 - [2, 2, 1, 4, 1, 1, 0, 0], // 61 - [4, 3, 1, 1, 1, 1, 0, 0], // 62 - [1, 1, 1, 2, 2, 4, 0, 0], // 63 - [1, 1, 1, 4, 2, 2, 0, 0], // 64 - [1, 2, 1, 1, 2, 4, 0, 0], // 65 - [1, 2, 1, 4, 2, 1, 0, 0], // 66 - [1, 4, 1, 1, 2, 2, 0, 0], // 67 - [1, 4, 1, 2, 2, 1, 0, 0], // 68 - [1, 1, 2, 2, 1, 4, 0, 0], // 69 - [1, 1, 2, 4, 1, 2, 0, 0], // 70 - [1, 2, 2, 1, 1, 4, 0, 0], // 71 - [1, 2, 2, 4, 1, 1, 0, 0], // 72 - [1, 4, 2, 1, 1, 2, 0, 0], // 73 - [1, 4, 2, 2, 1, 1, 0, 0], // 74 - [2, 4, 1, 2, 1, 1, 0, 0], // 75 - [2, 2, 1, 1, 1, 4, 0, 0], // 76 - [4, 1, 3, 1, 1, 1, 0, 0], // 77 - [2, 4, 1, 1, 1, 2, 0, 0], // 78 - [1, 3, 4, 1, 1, 1, 0, 0], // 79 - [1, 1, 1, 2, 4, 2, 0, 0], // 80 - [1, 2, 1, 1, 4, 2, 0, 0], // 81 - [1, 2, 1, 2, 4, 1, 0, 0], // 82 - [1, 1, 4, 2, 1, 2, 0, 0], // 83 - [1, 2, 4, 1, 1, 2, 0, 0], // 84 - [1, 2, 4, 2, 1, 1, 0, 0], // 85 - [4, 1, 1, 2, 1, 2, 0, 0], // 86 - [4, 2, 1, 1, 1, 2, 0, 0], // 87 - [4, 2, 1, 2, 1, 1, 0, 0], // 88 - [2, 1, 2, 1, 4, 1, 0, 0], // 89 - [2, 1, 4, 1, 2, 1, 0, 0], // 90 - [4, 1, 2, 1, 2, 1, 0, 0], // 91 - [1, 1, 1, 1, 4, 3, 0, 0], // 92 - [1, 1, 1, 3, 4, 1, 0, 0], // 93 - [1, 3, 1, 1, 4, 1, 0, 0], // 94 - [1, 1, 4, 1, 1, 3, 0, 0], // 95 - [1, 1, 4, 3, 1, 1, 0, 0], // 96 - [4, 1, 1, 1, 1, 3, 0, 0], // 97 - [4, 1, 1, 3, 1, 1, 0, 0], // 98 - [1, 1, 3, 1, 4, 1, 0, 0], // 99 - [1, 1, 4, 1, 3, 1, 0, 0], // 100 - [3, 1, 1, 1, 4, 1, 0, 0], // 101 - [4, 1, 1, 1, 3, 1, 0, 0], // 102 - [2, 1, 1, 4, 1, 2, 0, 0], // 103 - [2, 1, 1, 2, 1, 4, 0, 0], // 104 - [2, 1, 1, 2, 3, 2, 0, 0], // 105 - [2, 3, 3, 1, 1, 1, 2, 0] // 106 -] - + [2, 1, 2, 2, 2, 2, 0, 0], // 0 + [2, 2, 2, 1, 2, 2, 0, 0], // 1 + [2, 2, 2, 2, 2, 1, 0, 0], // 2 + [1, 2, 1, 2, 2, 3, 0, 0], // 3 + [1, 2, 1, 3, 2, 2, 0, 0], // 4 + [1, 3, 1, 2, 2, 2, 0, 0], // 5 + [1, 2, 2, 2, 1, 3, 0, 0], // 6 + [1, 2, 2, 3, 1, 2, 0, 0], // 7 + [1, 3, 2, 2, 1, 2, 0, 0], // 8 + [2, 2, 1, 2, 1, 3, 0, 0], // 9 + [2, 2, 1, 3, 1, 2, 0, 0], // 10 + [2, 3, 1, 2, 1, 2, 0, 0], // 11 + [1, 1, 2, 2, 3, 2, 0, 0], // 12 + [1, 2, 2, 1, 3, 2, 0, 0], // 13 + [1, 2, 2, 2, 3, 1, 0, 0], // 14 + [1, 1, 3, 2, 2, 2, 0, 0], // 15 + [1, 2, 3, 1, 2, 2, 0, 0], // 16 + [1, 2, 3, 2, 2, 1, 0, 0], // 17 + [2, 2, 3, 2, 1, 1, 0, 0], // 18 + [2, 2, 1, 1, 3, 2, 0, 0], // 19 + [2, 2, 1, 2, 3, 1, 0, 0], // 20 + [2, 1, 3, 2, 1, 2, 0, 0], // 21 + [2, 2, 3, 1, 1, 2, 0, 0], // 22 + [3, 1, 2, 1, 3, 1, 0, 0], // 23 + [3, 1, 1, 2, 2, 2, 0, 0], // 24 + [3, 2, 1, 1, 2, 2, 0, 0], // 25 + [3, 2, 1, 2, 2, 1, 0, 0], // 26 + [3, 1, 2, 2, 1, 2, 0, 0], // 27 + [3, 2, 2, 1, 1, 2, 0, 0], // 28 + [3, 2, 2, 2, 1, 1, 0, 0], // 29 + [2, 1, 2, 1, 2, 3, 0, 0], // 30 + [2, 1, 2, 3, 2, 1, 0, 0], // 31 + [2, 3, 2, 1, 2, 1, 0, 0], // 32 + [1, 1, 1, 3, 2, 3, 0, 0], // 33 + [1, 3, 1, 1, 2, 3, 0, 0], // 34 + [1, 3, 1, 3, 2, 1, 0, 0], // 35 + [1, 1, 2, 3, 1, 3, 0, 0], // 36 + [1, 3, 2, 1, 1, 3, 0, 0], // 37 + [1, 3, 2, 3, 1, 1, 0, 0], // 38 + [2, 1, 1, 3, 1, 3, 0, 0], // 39 + [2, 3, 1, 1, 1, 3, 0, 0], // 40 + [2, 3, 1, 3, 1, 1, 0, 0], // 41 + [1, 1, 2, 1, 3, 3, 0, 0], // 42 + [1, 1, 2, 3, 3, 1, 0, 0], // 43 + [1, 3, 2, 1, 3, 1, 0, 0], // 44 + [1, 1, 3, 1, 2, 3, 0, 0], // 45 + [1, 1, 3, 3, 2, 1, 0, 0], // 46 + [1, 3, 3, 1, 2, 1, 0, 0], // 47 + [3, 1, 3, 1, 2, 1, 0, 0], // 48 + [2, 1, 1, 3, 3, 1, 0, 0], // 49 + [2, 3, 1, 1, 3, 1, 0, 0], // 50 + [2, 1, 3, 1, 1, 3, 0, 0], // 51 + [2, 1, 3, 3, 1, 1, 0, 0], // 52 + [2, 1, 3, 1, 3, 1, 0, 0], // 53 + [3, 1, 1, 1, 2, 3, 0, 0], // 54 + [3, 1, 1, 3, 2, 1, 0, 0], // 55 + [3, 3, 1, 1, 2, 1, 0, 0], // 56 + [3, 1, 2, 1, 1, 3, 0, 0], // 57 + [3, 1, 2, 3, 1, 1, 0, 0], // 58 + [3, 3, 2, 1, 1, 1, 0, 0], // 59 + [3, 1, 4, 1, 1, 1, 0, 0], // 60 + [2, 2, 1, 4, 1, 1, 0, 0], // 61 + [4, 3, 1, 1, 1, 1, 0, 0], // 62 + [1, 1, 1, 2, 2, 4, 0, 0], // 63 + [1, 1, 1, 4, 2, 2, 0, 0], // 64 + [1, 2, 1, 1, 2, 4, 0, 0], // 65 + [1, 2, 1, 4, 2, 1, 0, 0], // 66 + [1, 4, 1, 1, 2, 2, 0, 0], // 67 + [1, 4, 1, 2, 2, 1, 0, 0], // 68 + [1, 1, 2, 2, 1, 4, 0, 0], // 69 + [1, 1, 2, 4, 1, 2, 0, 0], // 70 + [1, 2, 2, 1, 1, 4, 0, 0], // 71 + [1, 2, 2, 4, 1, 1, 0, 0], // 72 + [1, 4, 2, 1, 1, 2, 0, 0], // 73 + [1, 4, 2, 2, 1, 1, 0, 0], // 74 + [2, 4, 1, 2, 1, 1, 0, 0], // 75 + [2, 2, 1, 1, 1, 4, 0, 0], // 76 + [4, 1, 3, 1, 1, 1, 0, 0], // 77 + [2, 4, 1, 1, 1, 2, 0, 0], // 78 + [1, 3, 4, 1, 1, 1, 0, 0], // 79 + [1, 1, 1, 2, 4, 2, 0, 0], // 80 + [1, 2, 1, 1, 4, 2, 0, 0], // 81 + [1, 2, 1, 2, 4, 1, 0, 0], // 82 + [1, 1, 4, 2, 1, 2, 0, 0], // 83 + [1, 2, 4, 1, 1, 2, 0, 0], // 84 + [1, 2, 4, 2, 1, 1, 0, 0], // 85 + [4, 1, 1, 2, 1, 2, 0, 0], // 86 + [4, 2, 1, 1, 1, 2, 0, 0], // 87 + [4, 2, 1, 2, 1, 1, 0, 0], // 88 + [2, 1, 2, 1, 4, 1, 0, 0], // 89 + [2, 1, 4, 1, 2, 1, 0, 0], // 90 + [4, 1, 2, 1, 2, 1, 0, 0], // 91 + [1, 1, 1, 1, 4, 3, 0, 0], // 92 + [1, 1, 1, 3, 4, 1, 0, 0], // 93 + [1, 3, 1, 1, 4, 1, 0, 0], // 94 + [1, 1, 4, 1, 1, 3, 0, 0], // 95 + [1, 1, 4, 3, 1, 1, 0, 0], // 96 + [4, 1, 1, 1, 1, 3, 0, 0], // 97 + [4, 1, 1, 3, 1, 1, 0, 0], // 98 + [1, 1, 3, 1, 4, 1, 0, 0], // 99 + [1, 1, 4, 1, 3, 1, 0, 0], // 100 + [3, 1, 1, 1, 4, 1, 0, 0], // 101 + [4, 1, 1, 1, 3, 1, 0, 0], // 102 + [2, 1, 1, 4, 1, 2, 0, 0], // 103 + [2, 1, 1, 2, 1, 4, 0, 0], // 104 + [2, 1, 1, 2, 3, 2, 0, 0], // 105 + [2, 3, 3, 1, 1, 1, 2, 0] // 106 +] \ No newline at end of file