<% '============================================================================== ' USPS Intelligent Mail Barcode (IMB) Encoder/Decoder Class ' Based on USPS-B-3200 Specification '============================================================================== Class IMBCodec ' Lookup tables Private Table5of13(1286) Private Table2of13(77) Private BarCharMap(64, 3) Private CharToCodeword Private IsInitialized '============================================================================ ' Constructor '============================================================================ Private Sub Class_Initialize() Set CharToCodeword = CreateObject("Scripting.Dictionary") IsInitialized = False End Sub Private Sub Class_Terminate() Set CharToCodeword = Nothing End Sub '============================================================================ ' Public Methods '============================================================================ ' Encode tracking and routing codes to IMB barcode string Public Function Encode(ByVal trackingCode, ByVal routingCode) If Not IsInitialized Then Call InitializeTables() Dim binaryData, crc, codewords(9), characters(9), i ' Step 1: Convert to binary binaryData = ConvertToBinary(trackingCode, routingCode) ' Step 2: Generate CRC crc = GenerateCRC(binaryData) ' Step 3: Convert binary to codewords Call BinaryToCodewords(binaryData, codewords) ' Step 4: Insert additional information Call InsertAdditionalInfo(codewords, crc) ' Step 5: Convert codewords to characters Call CodewordsToCharacters(codewords, characters, crc) ' Step 6: Convert characters to barcode Encode = CharactersToBarcode(characters) End Function ' Encode combined IMB digits (20-digit tracking + 0/5/9/11-digit routing) to barcode string Public Function EncodeDigits(ByVal imbDigits) Dim tracking, routing imbDigits = Trim(imbDigits) tracking = Left(imbDigits, 20) routing = Mid(imbDigits, 21) EncodeDigits = Encode(tracking, routing) End Function ' Decode IMB barcode string to tracking and routing codes Public Function Decode(ByVal barcode, ByRef trackingCode, ByRef routingCode, ByRef errMsg) If Not IsInitialized Then Call InitializeTables() Decode = False trackingCode = "" routingCode = "" errMsg = "" ' Validate barcode If Len(barcode) <> 65 Then errMsg = "Invalid length (expected 65, got " & Len(barcode) & ")" Exit Function End If Dim i, ch For i = 1 To 65 ch = Mid(barcode, i, 1) If ch <> "A" And ch <> "D" And ch <> "T" And ch <> "F" Then errMsg = "Invalid character at pos " & i & ": " & ch Exit Function End If Next On Error Resume Next Call DecodeInternal(barcode, trackingCode, routingCode, errMsg) If Err.Number <> 0 Then errMsg = "Decode error (" & Err.Number & "): " & Err.Description Err.Clear On Error GoTo 0 Exit Function End If On Error GoTo 0 If Len(trackingCode) = 0 And Len(routingCode) = 0 Then If Len(errMsg) = 0 Then errMsg = "Decode failed" Exit Function End If Decode = True End Function '============================================================================ ' Private Encoding Methods '============================================================================ Private Function ConvertToBinary(tracking, routing) Dim routingArr, i, digit Dim binaryData(12) For i = 0 To 12 binaryData(i) = 0 Next routingArr = ConvertRoutingCode(routing) For i = 0 To 12 binaryData(i) = routingArr(i) Next For i = 0 To Len(tracking) - 1 digit = CLng(Mid(tracking, i + 1, 1)) If i = 0 Then Call MultiplyAndAdd(binaryData, 10, digit) ElseIf i = 1 Then Call MultiplyAndAdd(binaryData, 5, digit) Else Call MultiplyAndAdd(binaryData, 10, digit) End If Next ConvertToBinary = binaryData End Function Private Function ConvertRoutingCode(routing) Dim result(12), i For i = 0 To 12 result(i) = 0 Next Select Case Len(routing) Case 0 ' result already 0 Case 5 Call AddStringToArray(result, routing) Call AddValueToArray(result, 1) Case 9 Call AddStringToArray(result, routing) Call AddValueToArray(result, 100001) Case 11 Call AddStringToArray(result, routing) Call AddValueToArray(result, 1) Call AddValueToArray(result, 1000000000) Call AddValueToArray(result, 100000) End Select ConvertRoutingCode = result End Function Private Sub AddStringToArray(ByRef arr, numStr) Dim i, digit For i = 1 To Len(numStr) digit = CLng(Mid(numStr, i, 1)) Call MultiplyAndAdd(arr, 10, digit) Next End Sub Private Sub AddValueToArray(ByRef arr, value) Dim i, carry, temp carry = value For i = 12 To 0 Step -1 If carry = 0 Then Exit For temp = arr(i) + (carry Mod 256) arr(i) = temp Mod 256 carry = Int(carry / 256) + Int(temp / 256) Next End Sub Private Sub MultiplyAndAdd(ByRef arr, mult, add) Dim i, carry, temp carry = add For i = 12 To 0 Step -1 temp = CLng(arr(i)) * mult + carry arr(i) = temp And &HFF carry = Int(temp / 256) Next End Sub Private Function GenerateCRC(binaryData) Dim fcs, data, bit, i, byteIdx, genPoly genPoly = &HF35 fcs = &H7FF data = (binaryData(0) And &H3F) * 32 For bit = 2 To 7 If ((fcs Xor data) And &H400) <> 0 Then fcs = ((fcs * 2) Xor genPoly) And &H7FF Else fcs = (fcs * 2) And &H7FF End If data = (data * 2) And &H7FF Next For byteIdx = 1 To 12 data = binaryData(byteIdx) * 8 For bit = 0 To 7 If ((fcs Xor data) And &H400) <> 0 Then fcs = ((fcs * 2) Xor genPoly) And &H7FF Else fcs = (fcs * 2) And &H7FF End If data = (data * 2) And &H7FF Next Next GenerateCRC = fcs End Function Private Sub BinaryToCodewords(binaryData, ByRef codewords) Dim quotient(12), i For i = 0 To 12 quotient(i) = binaryData(i) Next codewords(9) = DivideArray(quotient, 636) codewords(8) = DivideArray(quotient, 1365) codewords(7) = DivideArray(quotient, 1365) codewords(6) = DivideArray(quotient, 1365) codewords(5) = DivideArray(quotient, 1365) codewords(4) = DivideArray(quotient, 1365) codewords(3) = DivideArray(quotient, 1365) codewords(2) = DivideArray(quotient, 1365) codewords(1) = DivideArray(quotient, 1365) codewords(0) = ArrayToInt(quotient) End Sub Private Function DivideArray(ByRef arr, divisor) Dim i, temp, remainder remainder = 0 For i = 0 To 12 temp = CLng(remainder) * 256 + CLng(arr(i)) arr(i) = Int(temp / divisor) remainder = temp Mod divisor Next DivideArray = remainder End Function Private Function ArrayToInt(arr) Dim val, i val = 0 For i = 0 To 12 If arr(i) <> 0 OR val <> 0 Then val = val * 256 + arr(i) End If Next ArrayToInt = val End Function Private Sub InsertAdditionalInfo(ByRef codewords, crc) codewords(9) = codewords(9) * 2 If (crc And &H400) <> 0 Then codewords(0) = codewords(0) + 659 End If End Sub Private Sub CodewordsToCharacters(codewords, ByRef characters, crc) Dim i, cw, ch For i = 0 To 9 cw = codewords(i) If cw <= 1286 Then ch = Table5of13(cw) Else ch = Table2of13(cw - 1287) End If If (crc And (2 ^ i)) <> 0 Then ch = ch Xor &H1FFF End If characters(i) = ch Next End Sub Private Function CharactersToBarcode(characters) Dim bars(64), i, ascCharIdx, ascBitIdx, descCharIdx, descBitIdx Dim ascVal, descVal, barcode For i = 0 To 64 ascCharIdx = BarCharMap(i, 2) ascBitIdx = BarCharMap(i, 3) ascVal = (characters(ascCharIdx) And (2 ^ ascBitIdx)) <> 0 descCharIdx = BarCharMap(i, 0) descBitIdx = BarCharMap(i, 1) descVal = (characters(descCharIdx) And (2 ^ descBitIdx)) <> 0 If ascVal And descVal Then bars(i) = "F" ElseIf ascVal And Not descVal Then bars(i) = "A" ElseIf descVal And Not ascVal Then bars(i) = "D" Else bars(i) = "T" End If Next barcode = "" For i = 0 To 64 barcode = barcode & bars(i) Next CharactersToBarcode = barcode End Function '============================================================================ ' Private Decoding Methods '============================================================================ Private Sub DecodeInternal(barcode, ByRef trackingCode, ByRef routingCode, ByRef errMsg) Dim characters(9), codewords(9), binaryData, fcs errMsg = "" trackingCode = "" routingCode = "" Call BarcodeToCharacters(barcode, characters) fcs = CharactersToCodewords(characters, codewords, errMsg) If fcs = -1 Then Exit Sub Call ExtractAdditionalInfo(codewords, fcs) binaryData = CodewordsToBinary(codewords) Call BinaryToFields(binaryData, trackingCode, routingCode) End Sub Private Sub BarcodeToCharacters(barcode, ByRef characters) Dim i, charIdx, bitIdx, bar For i = 0 To 9 characters(i) = 0 Next For i = 0 To 64 bar = Mid(barcode, i + 1, 1) charIdx = BarCharMap(i, 2) bitIdx = BarCharMap(i, 3) If bar = "A" Or bar = "F" Then characters(charIdx) = characters(charIdx) Or (2 ^ bitIdx) End If charIdx = BarCharMap(i, 0) bitIdx = BarCharMap(i, 1) If bar = "D" Or bar = "F" Then characters(charIdx) = characters(charIdx) Or (2 ^ bitIdx) End If Next End Sub Private Function CharactersToCodewords(ByRef characters, ByRef codewords, ByRef errMsg) Dim fcs, i, ch, cw, comp fcs = 0 errMsg = "" For i = 0 To 9 ch = characters(i) And &H1FFF cw = FindCodeword(ch) If cw <> -1 Then codewords(i) = cw Else comp = ch Xor &H1FFF cw = FindCodeword(comp) If cw = -1 Then errMsg = "Invalid IMB character idx=" & i & " value=0x" & Hex(ch) CharactersToCodewords = -1 Exit Function End If fcs = fcs Or CLng(2 ^ i) codewords(i) = cw End If Next CharactersToCodewords = fcs End Function Private Function FindCodeword(character) Dim key key = CStr(character And &H1FFF) If CharToCodeword.Exists(key) Then FindCodeword = CLng(CharToCodeword(key)) Else FindCodeword = -1 End If End Function Private Sub ExtractAdditionalInfo(ByRef codewords, ByRef fcs) If codewords(0) >= 659 Then codewords(0) = codewords(0) - 659 fcs = fcs Or &H400 End If codewords(9) = codewords(9) \ 2 End Sub Private Function CodewordsToBinary(ByRef codewords) Dim binaryData(12), i For i = 0 To 12 binaryData(i) = 0 Next Call IntToArray(binaryData, codewords(0)) Call MultiplyArrayByValue(binaryData, 1365) : Call AddValueToArray(binaryData, codewords(1)) Call MultiplyArrayByValue(binaryData, 1365) : Call AddValueToArray(binaryData, codewords(2)) Call MultiplyArrayByValue(binaryData, 1365) : Call AddValueToArray(binaryData, codewords(3)) Call MultiplyArrayByValue(binaryData, 1365) : Call AddValueToArray(binaryData, codewords(4)) Call MultiplyArrayByValue(binaryData, 1365) : Call AddValueToArray(binaryData, codewords(5)) Call MultiplyArrayByValue(binaryData, 1365) : Call AddValueToArray(binaryData, codewords(6)) Call MultiplyArrayByValue(binaryData, 1365) : Call AddValueToArray(binaryData, codewords(7)) Call MultiplyArrayByValue(binaryData, 1365) : Call AddValueToArray(binaryData, codewords(8)) Call MultiplyArrayByValue(binaryData, 636) : Call AddValueToArray(binaryData, codewords(9)) CodewordsToBinary = binaryData End Function Private Sub MultiplyArrayByValue(ByRef arr, mult) Dim i, carry, temp carry = 0 For i = 12 To 0 Step -1 temp = CLng(arr(i)) * mult + carry arr(i) = temp And &HFF carry = Int(temp / 256) Next End Sub Private Sub IntToArray(ByRef arr, value) Dim i For i = 12 To 0 Step -1 arr(i) = value And &HFF value = Int(value / 256) Next End Sub Private Sub BinaryToFields(binaryData, ByRef trackingCode, ByRef routingCode) Dim workData(12), i, trackDigits(19), routingValue For i = 0 To 12 workData(i) = binaryData(i) Next For i = 19 To 2 Step -1 trackDigits(i) = DivideArray(workData, 10) Next trackDigits(1) = DivideArray(workData, 5) trackDigits(0) = DivideArray(workData, 10) routingValue = ArrayToDouble(workData) trackingCode = "" For i = 0 To 19 trackingCode = trackingCode & trackDigits(i) Next If routingValue = 0 Then routingCode = "" ElseIf routingValue <= 100000 Then routingValue = routingValue - 1 routingCode = Right("00000" & CLng(routingValue), 5) ElseIf routingValue <= 1000100000 Then routingValue = routingValue - 100001 routingCode = Right("000000000" & CStr(CLng(routingValue)), 9) Else routingCode = BuildRoutingString(workData) End If End Sub Private Function BuildRoutingString(arr) Dim tempArr(12), i, digits(10), j, result For i = 0 To 12 tempArr(i) = arr(i) Next Call SubtractValue(tempArr, 1000100001) For j = 10 To 0 Step -1 digits(j) = DivideArray(tempArr, 10) Next result = "" For j = 0 To 10 result = result & digits(j) Next BuildRoutingString = result End Function Private Sub SubtractValue(ByRef arr, value) Dim i, borrow, temp borrow = value For i = 12 To 0 Step -1 If borrow = 0 Then Exit Sub temp = CLng(arr(i)) - (borrow And &HFF) If temp < 0 Then arr(i) = temp + 256 borrow = Int(borrow / 256) + 1 Else arr(i) = temp borrow = Int(borrow / 256) End If Next End Sub Private Function ArrayToDouble(arr) Dim result, i result = CDbl(0) For i = 0 To 12 If arr(i) <> 0 Or result <> 0 Then result = result * 256 + CDbl(arr(i)) End If Next ArrayToDouble = result End Function '============================================================================ ' Initialize Lookup Tables '============================================================================ Private Sub InitializeTables() Dim i ' Table 19: 5 of 13 Characters (1287 entries) - abbreviated for space Table5of13(0)=31:Table5of13(1)=7936:Table5of13(2)=47:Table5of13(3)=7808:Table5of13(4)=55 Table5of13(5)=7552:Table5of13(6)=59:Table5of13(7)=7040:Table5of13(8)=61:Table5of13(9)=6016 Table5of13(10)=62:Table5of13(11)=3968:Table5of13(12)=79:Table5of13(13)=7744:Table5of13(14)=87 Table5of13(15)=7488:Table5of13(16)=91:Table5of13(17)=6976:Table5of13(18)=93:Table5of13(19)=5952 Table5of13(20)=94:Table5of13(21)=3904:Table5of13(22)=103:Table5of13(23)=7360:Table5of13(24)=107 Table5of13(25)=6848:Table5of13(26)=109:Table5of13(27)=5824:Table5of13(28)=110:Table5of13(29)=3776 Table5of13(30)=115:Table5of13(31)=6592:Table5of13(32)=117:Table5of13(33)=5568:Table5of13(34)=118 Table5of13(35)=3520:Table5of13(36)=121:Table5of13(37)=5056:Table5of13(38)=122:Table5of13(39)=3008 Table5of13(40)=124:Table5of13(41)=1984:Table5of13(42)=143:Table5of13(43)=7712:Table5of13(44)=151 Table5of13(45)=7456:Table5of13(46)=155:Table5of13(47)=6944:Table5of13(48)=157:Table5of13(49)=5920 Table5of13(50)=158:Table5of13(51)=3872:Table5of13(52)=167:Table5of13(53)=7328:Table5of13(54)=171 Table5of13(55)=6816:Table5of13(56)=173:Table5of13(57)=5792:Table5of13(58)=174:Table5of13(59)=3744 Table5of13(60)=179:Table5of13(61)=6560:Table5of13(62)=181:Table5of13(63)=5536:Table5of13(64)=182 Table5of13(65)=3488:Table5of13(66)=185:Table5of13(67)=5024:Table5of13(68)=186:Table5of13(69)=2976 Table5of13(70)=188:Table5of13(71)=1952:Table5of13(72)=199:Table5of13(73)=7264:Table5of13(74)=203 Table5of13(75)=6752:Table5of13(76)=205:Table5of13(77)=5728:Table5of13(78)=206:Table5of13(79)=3680 Table5of13(80)=211:Table5of13(81)=6496:Table5of13(82)=213:Table5of13(83)=5472:Table5of13(84)=214 Table5of13(85)=3424:Table5of13(86)=217:Table5of13(87)=4960:Table5of13(88)=218:Table5of13(89)=2912 Table5of13(90)=220:Table5of13(91)=1888:Table5of13(92)=227:Table5of13(93)=6368:Table5of13(94)=229 Table5of13(95)=5344:Table5of13(96)=230:Table5of13(97)=3296:Table5of13(98)=233:Table5of13(99)=4832 Table5of13(100)=234:Table5of13(101)=2784:Table5of13(102)=236:Table5of13(103)=1760:Table5of13(104)=241 Table5of13(105)=4576:Table5of13(106)=242:Table5of13(107)=2528:Table5of13(108)=244:Table5of13(109)=1504 Table5of13(110)=248:Table5of13(111)=992:Table5of13(112)=271:Table5of13(113)=7696:Table5of13(114)=279 Table5of13(115)=7440:Table5of13(116)=283:Table5of13(117)=6928:Table5of13(118)=285:Table5of13(119)=5904 Table5of13(120)=286:Table5of13(121)=3856:Table5of13(122)=295:Table5of13(123)=7312:Table5of13(124)=299 Table5of13(125)=6800:Table5of13(126)=301:Table5of13(127)=5776:Table5of13(128)=302:Table5of13(129)=3728 Table5of13(130)=307:Table5of13(131)=6544:Table5of13(132)=309:Table5of13(133)=5520:Table5of13(134)=310 Table5of13(135)=3472:Table5of13(136)=313:Table5of13(137)=5008:Table5of13(138)=314:Table5of13(139)=2960 Table5of13(140)=316:Table5of13(141)=1936:Table5of13(142)=327:Table5of13(143)=7248:Table5of13(144)=331 Table5of13(145)=6736:Table5of13(146)=333:Table5of13(147)=5712:Table5of13(148)=334:Table5of13(149)=3664 Table5of13(150)=339:Table5of13(151)=6480:Table5of13(152)=341:Table5of13(153)=5456:Table5of13(154)=342 Table5of13(155)=3408:Table5of13(156)=345:Table5of13(157)=4944:Table5of13(158)=346:Table5of13(159)=2896 Table5of13(160)=348:Table5of13(161)=1872:Table5of13(162)=355:Table5of13(163)=6352:Table5of13(164)=357 Table5of13(165)=5328:Table5of13(166)=358:Table5of13(167)=3280:Table5of13(168)=361:Table5of13(169)=4816 Table5of13(170)=362:Table5of13(171)=2768:Table5of13(172)=364:Table5of13(173)=1744:Table5of13(174)=369 Table5of13(175)=4560:Table5of13(176)=370:Table5of13(177)=2512:Table5of13(178)=372:Table5of13(179)=1488 Table5of13(180)=376:Table5of13(181)=976:Table5of13(182)=391:Table5of13(183)=7216:Table5of13(184)=395 Table5of13(185)=6704:Table5of13(186)=397:Table5of13(187)=5680:Table5of13(188)=398:Table5of13(189)=3632 Table5of13(190)=403:Table5of13(191)=6448:Table5of13(192)=405:Table5of13(193)=5424:Table5of13(194)=406 Table5of13(195)=3376:Table5of13(196)=409:Table5of13(197)=4912:Table5of13(198)=410:Table5of13(199)=2864 Table5of13(200)=412:Table5of13(201)=1840:Table5of13(202)=419:Table5of13(203)=6320:Table5of13(204)=421 Table5of13(205)=5296:Table5of13(206)=422:Table5of13(207)=3248:Table5of13(208)=425:Table5of13(209)=4784 Table5of13(210)=426:Table5of13(211)=2736:Table5of13(212)=428:Table5of13(213)=1712:Table5of13(214)=433 Table5of13(215)=4528:Table5of13(216)=434:Table5of13(217)=2480:Table5of13(218)=436:Table5of13(219)=1456 Table5of13(220)=440:Table5of13(221)=944:Table5of13(222)=451:Table5of13(223)=6256:Table5of13(224)=453 Table5of13(225)=5232:Table5of13(226)=454:Table5of13(227)=3184:Table5of13(228)=457:Table5of13(229)=4720 Table5of13(230)=458:Table5of13(231)=2672:Table5of13(232)=460:Table5of13(233)=1648:Table5of13(234)=465 Table5of13(235)=4464:Table5of13(236)=466:Table5of13(237)=2416:Table5of13(238)=468:Table5of13(239)=1392 Table5of13(240)=472:Table5of13(241)=880:Table5of13(242)=481:Table5of13(243)=4336:Table5of13(244)=482 Table5of13(245)=2288:Table5of13(246)=484:Table5of13(247)=1264:Table5of13(248)=488:Table5of13(249)=752 Table5of13(250)=527:Table5of13(251)=7688:Table5of13(252)=535:Table5of13(253)=7432:Table5of13(254)=539 Table5of13(255)=6920:Table5of13(256)=541:Table5of13(257)=5896:Table5of13(258)=542:Table5of13(259)=3848 Table5of13(260)=551:Table5of13(261)=7304:Table5of13(262)=555:Table5of13(263)=6792:Table5of13(264)=557 Table5of13(265)=5768:Table5of13(266)=558:Table5of13(267)=3720:Table5of13(268)=563:Table5of13(269)=6536 Table5of13(270)=565:Table5of13(271)=5512:Table5of13(272)=566:Table5of13(273)=3464:Table5of13(274)=569 Table5of13(275)=5000:Table5of13(276)=570:Table5of13(277)=2952:Table5of13(278)=572:Table5of13(279)=1928 Table5of13(280)=583:Table5of13(281)=7240:Table5of13(282)=587:Table5of13(283)=6728:Table5of13(284)=589 Table5of13(285)=5704:Table5of13(286)=590:Table5of13(287)=3656:Table5of13(288)=595:Table5of13(289)=6472 Table5of13(290)=597:Table5of13(291)=5448:Table5of13(292)=598:Table5of13(293)=3400:Table5of13(294)=601 Table5of13(295)=4936:Table5of13(296)=602:Table5of13(297)=2888:Table5of13(298)=604:Table5of13(299)=1864 Table5of13(300)=611:Table5of13(301)=6344:Table5of13(302)=613:Table5of13(303)=5320:Table5of13(304)=614 Table5of13(305)=3272:Table5of13(306)=617:Table5of13(307)=4808:Table5of13(308)=618:Table5of13(309)=2760 Table5of13(310)=620:Table5of13(311)=1736:Table5of13(312)=625:Table5of13(313)=4552:Table5of13(314)=626 Table5of13(315)=2504:Table5of13(316)=628:Table5of13(317)=1480:Table5of13(318)=632:Table5of13(319)=968 Table5of13(320)=647:Table5of13(321)=7208:Table5of13(322)=651:Table5of13(323)=6696:Table5of13(324)=653 Table5of13(325)=5672:Table5of13(326)=654:Table5of13(327)=3624:Table5of13(328)=659:Table5of13(329)=6440 Table5of13(330)=661:Table5of13(331)=5416:Table5of13(332)=662:Table5of13(333)=3368:Table5of13(334)=665 Table5of13(335)=4904:Table5of13(336)=666:Table5of13(337)=2856:Table5of13(338)=668:Table5of13(339)=1832 Table5of13(340)=675:Table5of13(341)=6312:Table5of13(342)=677:Table5of13(343)=5288:Table5of13(344)=678 Table5of13(345)=3240:Table5of13(346)=681:Table5of13(347)=4776:Table5of13(348)=682:Table5of13(349)=2728 Table5of13(350)=684:Table5of13(351)=1704:Table5of13(352)=689:Table5of13(353)=4520:Table5of13(354)=690 Table5of13(355)=2472:Table5of13(356)=692:Table5of13(357)=1448:Table5of13(358)=696:Table5of13(359)=936 Table5of13(360)=707:Table5of13(361)=6248:Table5of13(362)=709:Table5of13(363)=5224:Table5of13(364)=710 Table5of13(365)=3176:Table5of13(366)=713:Table5of13(367)=4712:Table5of13(368)=714:Table5of13(369)=2664 Table5of13(370)=716:Table5of13(371)=1640:Table5of13(372)=721:Table5of13(373)=4456:Table5of13(374)=722 Table5of13(375)=2408:Table5of13(376)=724:Table5of13(377)=1384:Table5of13(378)=728:Table5of13(379)=872 Table5of13(380)=737:Table5of13(381)=4328:Table5of13(382)=738:Table5of13(383)=2280:Table5of13(384)=740 Table5of13(385)=1256:Table5of13(386)=775:Table5of13(387)=7192:Table5of13(388)=779:Table5of13(389)=6680 Table5of13(390)=781:Table5of13(391)=5656:Table5of13(392)=782:Table5of13(393)=3608:Table5of13(394)=787 Table5of13(395)=6424:Table5of13(396)=789:Table5of13(397)=5400:Table5of13(398)=790:Table5of13(399)=3352 Table5of13(400)=793:Table5of13(401)=4888:Table5of13(402)=794:Table5of13(403)=2840:Table5of13(404)=796 Table5of13(405)=1816:Table5of13(406)=803:Table5of13(407)=6296:Table5of13(408)=805:Table5of13(409)=5272 Table5of13(410)=806:Table5of13(411)=3224:Table5of13(412)=809:Table5of13(413)=4760:Table5of13(414)=810 Table5of13(415)=2712:Table5of13(416)=812:Table5of13(417)=1688:Table5of13(418)=817:Table5of13(419)=4504 Table5of13(420)=818:Table5of13(421)=2456:Table5of13(422)=820:Table5of13(423)=1432:Table5of13(424)=824 Table5of13(425)=920:Table5of13(426)=835:Table5of13(427)=6232:Table5of13(428)=837:Table5of13(429)=5208 Table5of13(430)=838:Table5of13(431)=3160:Table5of13(432)=841:Table5of13(433)=4696:Table5of13(434)=842 Table5of13(435)=2648:Table5of13(436)=844:Table5of13(437)=1624:Table5of13(438)=849:Table5of13(439)=4440 Table5of13(440)=850:Table5of13(441)=2392:Table5of13(442)=852:Table5of13(443)=1368:Table5of13(444)=865 Table5of13(445)=4312:Table5of13(446)=866:Table5of13(447)=2264:Table5of13(448)=868:Table5of13(449)=1240 Table5of13(450)=899:Table5of13(451)=6200:Table5of13(452)=901:Table5of13(453)=5176:Table5of13(454)=902 Table5of13(455)=3128:Table5of13(456)=905:Table5of13(457)=4664:Table5of13(458)=906:Table5of13(459)=2616 Table5of13(460)=908:Table5of13(461)=1592:Table5of13(462)=913:Table5of13(463)=4408:Table5of13(464)=914 Table5of13(465)=2360:Table5of13(466)=916:Table5of13(467)=1336:Table5of13(468)=929:Table5of13(469)=4280 Table5of13(470)=930:Table5of13(471)=2232:Table5of13(472)=932:Table5of13(473)=1208:Table5of13(474)=961 Table5of13(475)=4216:Table5of13(476)=962:Table5of13(477)=2168:Table5of13(478)=964:Table5of13(479)=1144 Table5of13(480)=1039:Table5of13(481)=7684:Table5of13(482)=1047:Table5of13(483)=7428:Table5of13(484)=1051 Table5of13(485)=6916:Table5of13(486)=1053:Table5of13(487)=5892:Table5of13(488)=1054:Table5of13(489)=3844 Table5of13(490)=1063:Table5of13(491)=7300:Table5of13(492)=1067:Table5of13(493)=6788:Table5of13(494)=1069 Table5of13(495)=5764:Table5of13(496)=1070:Table5of13(497)=3716:Table5of13(498)=1075:Table5of13(499)=6532 Table5of13(500)=1077:Table5of13(501)=5508:Table5of13(502)=1078:Table5of13(503)=3460:Table5of13(504)=1081 Table5of13(505)=4996:Table5of13(506)=1082:Table5of13(507)=2948:Table5of13(508)=1084:Table5of13(509)=1924 Table5of13(510)=1095:Table5of13(511)=7236:Table5of13(512)=1099:Table5of13(513)=6724:Table5of13(514)=1101 Table5of13(515)=5700:Table5of13(516)=1102:Table5of13(517)=3652:Table5of13(518)=1107:Table5of13(519)=6468 Table5of13(520)=1109:Table5of13(521)=5444:Table5of13(522)=1110:Table5of13(523)=3396:Table5of13(524)=1113 Table5of13(525)=4932:Table5of13(526)=1114:Table5of13(527)=2884:Table5of13(528)=1116:Table5of13(529)=1860 Table5of13(530)=1123:Table5of13(531)=6340:Table5of13(532)=1125:Table5of13(533)=5316:Table5of13(534)=1126 Table5of13(535)=3268:Table5of13(536)=1129:Table5of13(537)=4804:Table5of13(538)=1130:Table5of13(539)=2756 Table5of13(540)=1132:Table5of13(541)=1732:Table5of13(542)=1137:Table5of13(543)=4548:Table5of13(544)=1138 Table5of13(545)=2500:Table5of13(546)=1140:Table5of13(547)=1476:Table5of13(548)=1159:Table5of13(549)=7204 Table5of13(550)=1163:Table5of13(551)=6692:Table5of13(552)=1165:Table5of13(553)=5668:Table5of13(554)=1166 Table5of13(555)=3620:Table5of13(556)=1171:Table5of13(557)=6436:Table5of13(558)=1173:Table5of13(559)=5412 Table5of13(560)=1174:Table5of13(561)=3364:Table5of13(562)=1177:Table5of13(563)=4900:Table5of13(564)=1178 Table5of13(565)=2852:Table5of13(566)=1180:Table5of13(567)=1828:Table5of13(568)=1187:Table5of13(569)=6308 Table5of13(570)=1189:Table5of13(571)=5284:Table5of13(572)=1190:Table5of13(573)=3236:Table5of13(574)=1193 Table5of13(575)=4772:Table5of13(576)=1194:Table5of13(577)=2724:Table5of13(578)=1196:Table5of13(579)=1700 Table5of13(580)=1201:Table5of13(581)=4516:Table5of13(582)=1202:Table5of13(583)=2468:Table5of13(584)=1204 Table5of13(585)=1444:Table5of13(586)=1219:Table5of13(587)=6244:Table5of13(588)=1221:Table5of13(589)=5220 Table5of13(590)=1222:Table5of13(591)=3172:Table5of13(592)=1225:Table5of13(593)=4708:Table5of13(594)=1226 Table5of13(595)=2660:Table5of13(596)=1228:Table5of13(597)=1636:Table5of13(598)=1233:Table5of13(599)=4452 Table5of13(600)=1234:Table5of13(601)=2404:Table5of13(602)=1236:Table5of13(603)=1380:Table5of13(604)=1249 Table5of13(605)=4324:Table5of13(606)=1250:Table5of13(607)=2276:Table5of13(608)=1287:Table5of13(609)=7188 Table5of13(610)=1291:Table5of13(611)=6676:Table5of13(612)=1293:Table5of13(613)=5652:Table5of13(614)=1294 Table5of13(615)=3604:Table5of13(616)=1299:Table5of13(617)=6420:Table5of13(618)=1301:Table5of13(619)=5396 Table5of13(620)=1302:Table5of13(621)=3348:Table5of13(622)=1305:Table5of13(623)=4884:Table5of13(624)=1306 Table5of13(625)=2836:Table5of13(626)=1308:Table5of13(627)=1812:Table5of13(628)=1315:Table5of13(629)=6292 Table5of13(630)=1317:Table5of13(631)=5268:Table5of13(632)=1318:Table5of13(633)=3220:Table5of13(634)=1321 Table5of13(635)=4756:Table5of13(636)=1322:Table5of13(637)=2708:Table5of13(638)=1324:Table5of13(639)=1684 Table5of13(640)=1329:Table5of13(641)=4500:Table5of13(642)=1330:Table5of13(643)=2452:Table5of13(644)=1332 Table5of13(645)=1428:Table5of13(646)=1347:Table5of13(647)=6228:Table5of13(648)=1349:Table5of13(649)=5204 Table5of13(650)=1350:Table5of13(651)=3156:Table5of13(652)=1353:Table5of13(653)=4692:Table5of13(654)=1354 Table5of13(655)=2644:Table5of13(656)=1356:Table5of13(657)=1620:Table5of13(658)=1361:Table5of13(659)=4436 Table5of13(660)=1362:Table5of13(661)=2388:Table5of13(662)=1377:Table5of13(663)=4308:Table5of13(664)=1378 Table5of13(665)=2260:Table5of13(666)=1411:Table5of13(667)=6196:Table5of13(668)=1413:Table5of13(669)=5172 Table5of13(670)=1414:Table5of13(671)=3124:Table5of13(672)=1417:Table5of13(673)=4660:Table5of13(674)=1418 Table5of13(675)=2612:Table5of13(676)=1420:Table5of13(677)=1588:Table5of13(678)=1425:Table5of13(679)=4404 Table5of13(680)=1426:Table5of13(681)=2356:Table5of13(682)=1441:Table5of13(683)=4276:Table5of13(684)=1442 Table5of13(685)=2228:Table5of13(686)=1473:Table5of13(687)=4212:Table5of13(688)=1474:Table5of13(689)=2164 Table5of13(690)=1543:Table5of13(691)=7180:Table5of13(692)=1547:Table5of13(693)=6668:Table5of13(694)=1549 Table5of13(695)=5644:Table5of13(696)=1550:Table5of13(697)=3596:Table5of13(698)=1555:Table5of13(699)=6412 Table5of13(700)=1557:Table5of13(701)=5388:Table5of13(702)=1558:Table5of13(703)=3340:Table5of13(704)=1561 Table5of13(705)=4876:Table5of13(706)=1562:Table5of13(707)=2828:Table5of13(708)=1564:Table5of13(709)=1804 Table5of13(710)=1571:Table5of13(711)=6284:Table5of13(712)=1573:Table5of13(713)=5260:Table5of13(714)=1574 Table5of13(715)=3212:Table5of13(716)=1577:Table5of13(717)=4748:Table5of13(718)=1578:Table5of13(719)=2700 Table5of13(720)=1580:Table5of13(721)=1676:Table5of13(722)=1585:Table5of13(723)=4492:Table5of13(724)=1586 Table5of13(725)=2444:Table5of13(726)=1603:Table5of13(727)=6220:Table5of13(728)=1605:Table5of13(729)=5196 Table5of13(730)=1606:Table5of13(731)=3148:Table5of13(732)=1609:Table5of13(733)=4684:Table5of13(734)=1610 Table5of13(735)=2636:Table5of13(736)=1617:Table5of13(737)=4428:Table5of13(738)=1618:Table5of13(739)=2380 Table5of13(740)=1633:Table5of13(741)=4300:Table5of13(742)=1634:Table5of13(743)=2252:Table5of13(744)=1667 Table5of13(745)=6188:Table5of13(746)=1669:Table5of13(747)=5164:Table5of13(748)=1670:Table5of13(749)=3116 Table5of13(750)=1673:Table5of13(751)=4652:Table5of13(752)=1674:Table5of13(753)=2604:Table5of13(754)=1681 Table5of13(755)=4396:Table5of13(756)=1682:Table5of13(757)=2348:Table5of13(758)=1697:Table5of13(759)=4268 Table5of13(760)=1698:Table5of13(761)=2220:Table5of13(762)=1729:Table5of13(763)=4204:Table5of13(764)=1730 Table5of13(765)=2156:Table5of13(766)=1795:Table5of13(767)=6172:Table5of13(768)=1797:Table5of13(769)=5148 Table5of13(770)=1798:Table5of13(771)=3100:Table5of13(772)=1801:Table5of13(773)=4636:Table5of13(774)=1802 Table5of13(775)=2588:Table5of13(776)=1809:Table5of13(777)=4380:Table5of13(778)=1810:Table5of13(779)=2332 Table5of13(780)=1825:Table5of13(781)=4252:Table5of13(782)=1826:Table5of13(783)=2204:Table5of13(784)=1857 Table5of13(785)=4188:Table5of13(786)=1858:Table5of13(787)=2140:Table5of13(788)=1921:Table5of13(789)=4156 Table5of13(790)=1922:Table5of13(791)=2108:Table5of13(792)=2063:Table5of13(793)=7682:Table5of13(794)=2071 Table5of13(795)=7426:Table5of13(796)=2075:Table5of13(797)=6914:Table5of13(798)=2077:Table5of13(799)=5890 Table5of13(800)=2078:Table5of13(801)=3842:Table5of13(802)=2087:Table5of13(803)=7298:Table5of13(804)=2091 Table5of13(805)=6786:Table5of13(806)=2093:Table5of13(807)=5762:Table5of13(808)=2094:Table5of13(809)=3714 Table5of13(810)=2099:Table5of13(811)=6530:Table5of13(812)=2101:Table5of13(813)=5506:Table5of13(814)=2102 Table5of13(815)=3458:Table5of13(816)=2105:Table5of13(817)=4994:Table5of13(818)=2106:Table5of13(819)=2946 Table5of13(820)=2119:Table5of13(821)=7234:Table5of13(822)=2123:Table5of13(823)=6722:Table5of13(824)=2125 Table5of13(825)=5698:Table5of13(826)=2126:Table5of13(827)=3650:Table5of13(828)=2131:Table5of13(829)=6466 Table5of13(830)=2133:Table5of13(831)=5442:Table5of13(832)=2134:Table5of13(833)=3394:Table5of13(834)=2137 Table5of13(835)=4930:Table5of13(836)=2138:Table5of13(837)=2882:Table5of13(838)=2147:Table5of13(839)=6338 Table5of13(840)=2149:Table5of13(841)=5314:Table5of13(842)=2150:Table5of13(843)=3266:Table5of13(844)=2153 Table5of13(845)=4802:Table5of13(846)=2154:Table5of13(847)=2754:Table5of13(848)=2161:Table5of13(849)=4546 Table5of13(850)=2162:Table5of13(851)=2498:Table5of13(852)=2183:Table5of13(853)=7202:Table5of13(854)=2187 Table5of13(855)=6690:Table5of13(856)=2189:Table5of13(857)=5666:Table5of13(858)=2190:Table5of13(859)=3618 Table5of13(860)=2195:Table5of13(861)=6434:Table5of13(862)=2197:Table5of13(863)=5410:Table5of13(864)=2198 Table5of13(865)=3362:Table5of13(866)=2201:Table5of13(867)=4898:Table5of13(868)=2202:Table5of13(869)=2850 Table5of13(870)=2211:Table5of13(871)=6306:Table5of13(872)=2213:Table5of13(873)=5282:Table5of13(874)=2214 Table5of13(875)=3234:Table5of13(876)=2217:Table5of13(877)=4770:Table5of13(878)=2218:Table5of13(879)=2722 Table5of13(880)=2225:Table5of13(881)=4514:Table5of13(882)=2226:Table5of13(883)=2466:Table5of13(884)=2243 Table5of13(885)=6242:Table5of13(886)=2245:Table5of13(887)=5218:Table5of13(888)=2246:Table5of13(889)=3170 Table5of13(890)=2249:Table5of13(891)=4706:Table5of13(892)=2250:Table5of13(893)=2658:Table5of13(894)=2257 Table5of13(895)=4450:Table5of13(896)=2258:Table5of13(897)=2402:Table5of13(898)=2273:Table5of13(899)=4322 Table5of13(900)=2311:Table5of13(901)=7186:Table5of13(902)=2315:Table5of13(903)=6674:Table5of13(904)=2317 Table5of13(905)=5650:Table5of13(906)=2318:Table5of13(907)=3602:Table5of13(908)=2323:Table5of13(909)=6418 Table5of13(910)=2325:Table5of13(911)=5394:Table5of13(912)=2326:Table5of13(913)=3346:Table5of13(914)=2329 Table5of13(915)=4882:Table5of13(916)=2330:Table5of13(917)=2834:Table5of13(918)=2339:Table5of13(919)=6290 Table5of13(920)=2341:Table5of13(921)=5266:Table5of13(922)=2342:Table5of13(923)=3218:Table5of13(924)=2345 Table5of13(925)=4754:Table5of13(926)=2346:Table5of13(927)=2706:Table5of13(928)=2353:Table5of13(929)=4498 Table5of13(930)=2354:Table5of13(931)=2450:Table5of13(932)=2371:Table5of13(933)=6226:Table5of13(934)=2373 Table5of13(935)=5202:Table5of13(936)=2374:Table5of13(937)=3154:Table5of13(938)=2377:Table5of13(939)=4690 Table5of13(940)=2378:Table5of13(941)=2642:Table5of13(942)=2385:Table5of13(943)=4434:Table5of13(944)=2401 Table5of13(945)=4306:Table5of13(946)=2435:Table5of13(947)=6194:Table5of13(948)=2437:Table5of13(949)=5170 Table5of13(950)=2438:Table5of13(951)=3122:Table5of13(952)=2441:Table5of13(953)=4658:Table5of13(954)=2442 Table5of13(955)=2610:Table5of13(956)=2449:Table5of13(957)=4402:Table5of13(958)=2465:Table5of13(959)=4274 Table5of13(960)=2497:Table5of13(961)=4210:Table5of13(962)=2567:Table5of13(963)=7178:Table5of13(964)=2571 Table5of13(965)=6666:Table5of13(966)=2573:Table5of13(967)=5642:Table5of13(968)=2574:Table5of13(969)=3594 Table5of13(970)=2579:Table5of13(971)=6410:Table5of13(972)=2581:Table5of13(973)=5386:Table5of13(974)=2582 Table5of13(975)=3338:Table5of13(976)=2585:Table5of13(977)=4874:Table5of13(978)=2586:Table5of13(979)=2826 Table5of13(980)=2595:Table5of13(981)=6282:Table5of13(982)=2597:Table5of13(983)=5258:Table5of13(984)=2598 Table5of13(985)=3210:Table5of13(986)=2601:Table5of13(987)=4746:Table5of13(988)=2602:Table5of13(989)=2698 Table5of13(990)=2609:Table5of13(991)=4490:Table5of13(992)=2627:Table5of13(993)=6218:Table5of13(994)=2629 Table5of13(995)=5194:Table5of13(996)=2630:Table5of13(997)=3146:Table5of13(998)=2633:Table5of13(999)=4682 Table5of13(1000)=2641:Table5of13(1001)=4426:Table5of13(1002)=2657:Table5of13(1003)=4298:Table5of13(1004)=2691 Table5of13(1005)=6186:Table5of13(1006)=2693:Table5of13(1007)=5162:Table5of13(1008)=2694:Table5of13(1009)=3114 Table5of13(1010)=2697:Table5of13(1011)=4650:Table5of13(1012)=2705:Table5of13(1013)=4394:Table5of13(1014)=2721 Table5of13(1015)=4266:Table5of13(1016)=2753:Table5of13(1017)=4202:Table5of13(1018)=2819:Table5of13(1019)=6170 Table5of13(1020)=2821:Table5of13(1021)=5146:Table5of13(1022)=2822:Table5of13(1023)=3098:Table5of13(1024)=2825 Table5of13(1025)=4634:Table5of13(1026)=2833:Table5of13(1027)=4378:Table5of13(1028)=2849:Table5of13(1029)=4250 Table5of13(1030)=2881:Table5of13(1031)=4186:Table5of13(1032)=2945:Table5of13(1033)=4154:Table5of13(1034)=3079 Table5of13(1035)=7174:Table5of13(1036)=3083:Table5of13(1037)=6662:Table5of13(1038)=3085:Table5of13(1039)=5638 Table5of13(1040)=3086:Table5of13(1041)=3590:Table5of13(1042)=3091:Table5of13(1043)=6406:Table5of13(1044)=3093 Table5of13(1045)=5382:Table5of13(1046)=3094:Table5of13(1047)=3334:Table5of13(1048)=3097:Table5of13(1049)=4870 Table5of13(1050)=3107:Table5of13(1051)=6278:Table5of13(1052)=3109:Table5of13(1053)=5254:Table5of13(1054)=3110 Table5of13(1055)=3206:Table5of13(1056)=3113:Table5of13(1057)=4742:Table5of13(1058)=3121:Table5of13(1059)=4486 Table5of13(1060)=3139:Table5of13(1061)=6214:Table5of13(1062)=3141:Table5of13(1063)=5190:Table5of13(1064)=3145 Table5of13(1065)=4678:Table5of13(1066)=3153:Table5of13(1067)=4422:Table5of13(1068)=3169:Table5of13(1069)=4294 Table5of13(1070)=3203:Table5of13(1071)=6182:Table5of13(1072)=3205:Table5of13(1073)=5158:Table5of13(1074)=3209 Table5of13(1075)=4646:Table5of13(1076)=3217:Table5of13(1077)=4390:Table5of13(1078)=3233:Table5of13(1079)=4262 Table5of13(1080)=3265:Table5of13(1081)=4198:Table5of13(1082)=3331:Table5of13(1083)=6166:Table5of13(1084)=3333 Table5of13(1085)=5142:Table5of13(1086)=3337:Table5of13(1087)=4630:Table5of13(1088)=3345:Table5of13(1089)=4374 Table5of13(1090)=3361:Table5of13(1091)=4246:Table5of13(1092)=3393:Table5of13(1093)=4182:Table5of13(1094)=3457 Table5of13(1095)=4150:Table5of13(1096)=3587:Table5of13(1097)=6158:Table5of13(1098)=3589:Table5of13(1099)=5134 Table5of13(1100)=3593:Table5of13(1101)=4622:Table5of13(1102)=3601:Table5of13(1103)=4366:Table5of13(1104)=3617 Table5of13(1105)=4238:Table5of13(1106)=3649:Table5of13(1107)=4174:Table5of13(1108)=3713:Table5of13(1109)=4142 Table5of13(1110)=3841:Table5of13(1111)=4126:Table5of13(1112)=4111:Table5of13(1113)=7681:Table5of13(1114)=4119 Table5of13(1115)=7425:Table5of13(1116)=4123:Table5of13(1117)=6913:Table5of13(1118)=4125:Table5of13(1119)=5889 Table5of13(1120)=4135:Table5of13(1121)=7297:Table5of13(1122)=4139:Table5of13(1123)=6785:Table5of13(1124)=4141 Table5of13(1125)=5761:Table5of13(1126)=4147:Table5of13(1127)=6529:Table5of13(1128)=4149:Table5of13(1129)=5505 Table5of13(1130)=4153:Table5of13(1131)=4993:Table5of13(1132)=4167:Table5of13(1133)=7233:Table5of13(1134)=4171 Table5of13(1135)=6721:Table5of13(1136)=4173:Table5of13(1137)=5697:Table5of13(1138)=4179:Table5of13(1139)=6465 Table5of13(1140)=4181:Table5of13(1141)=5441:Table5of13(1142)=4185:Table5of13(1143)=4929:Table5of13(1144)=4195 Table5of13(1145)=6337:Table5of13(1146)=4197:Table5of13(1147)=5313:Table5of13(1148)=4201:Table5of13(1149)=4801 Table5of13(1150)=4209:Table5of13(1151)=4545:Table5of13(1152)=4231:Table5of13(1153)=7201:Table5of13(1154)=4235 Table5of13(1155)=6689:Table5of13(1156)=4237:Table5of13(1157)=5665:Table5of13(1158)=4243:Table5of13(1159)=6433 Table5of13(1160)=4245:Table5of13(1161)=5409:Table5of13(1162)=4249:Table5of13(1163)=4897:Table5of13(1164)=4259 Table5of13(1165)=6305:Table5of13(1166)=4261:Table5of13(1167)=5281:Table5of13(1168)=4265:Table5of13(1169)=4769 Table5of13(1170)=4273:Table5of13(1171)=4513:Table5of13(1172)=4291:Table5of13(1173)=6241:Table5of13(1174)=4293 Table5of13(1175)=5217:Table5of13(1176)=4297:Table5of13(1177)=4705:Table5of13(1178)=4305:Table5of13(1179)=4449 Table5of13(1180)=4359:Table5of13(1181)=7185:Table5of13(1182)=4363:Table5of13(1183)=6673:Table5of13(1184)=4365 Table5of13(1185)=5649:Table5of13(1186)=4371:Table5of13(1187)=6417:Table5of13(1188)=4373:Table5of13(1189)=5393 Table5of13(1190)=4377:Table5of13(1191)=4881:Table5of13(1192)=4387:Table5of13(1193)=6289:Table5of13(1194)=4389 Table5of13(1195)=5265:Table5of13(1196)=4393:Table5of13(1197)=4753:Table5of13(1198)=4401:Table5of13(1199)=4497 Table5of13(1200)=4419:Table5of13(1201)=6225:Table5of13(1202)=4421:Table5of13(1203)=5201:Table5of13(1204)=4425 Table5of13(1205)=4689:Table5of13(1206)=4483:Table5of13(1207)=6193:Table5of13(1208)=4485:Table5of13(1209)=5169 Table5of13(1210)=4489:Table5of13(1211)=4657:Table5of13(1212)=4615:Table5of13(1213)=7177:Table5of13(1214)=4619 Table5of13(1215)=6665:Table5of13(1216)=4621:Table5of13(1217)=5641:Table5of13(1218)=4627:Table5of13(1219)=6409 Table5of13(1220)=4629:Table5of13(1221)=5385:Table5of13(1222)=4633:Table5of13(1223)=4873:Table5of13(1224)=4643 Table5of13(1225)=6281:Table5of13(1226)=4645:Table5of13(1227)=5257:Table5of13(1228)=4649:Table5of13(1229)=4745 Table5of13(1230)=4675:Table5of13(1231)=6217:Table5of13(1232)=4677:Table5of13(1233)=5193:Table5of13(1234)=4739 Table5of13(1235)=6185:Table5of13(1236)=4741:Table5of13(1237)=5161:Table5of13(1238)=4867:Table5of13(1239)=6169 Table5of13(1240)=4869:Table5of13(1241)=5145:Table5of13(1242)=5127:Table5of13(1243)=7173:Table5of13(1244)=5131 Table5of13(1245)=6661:Table5of13(1246)=5133:Table5of13(1247)=5637:Table5of13(1248)=5139:Table5of13(1249)=6405 Table5of13(1250)=5141:Table5of13(1251)=5381:Table5of13(1252)=5155:Table5of13(1253)=6277:Table5of13(1254)=5157 Table5of13(1255)=5253:Table5of13(1256)=5187:Table5of13(1257)=6213:Table5of13(1258)=5251:Table5of13(1259)=6181 Table5of13(1260)=5379:Table5of13(1261)=6165:Table5of13(1262)=5635:Table5of13(1263)=6157:Table5of13(1264)=6151 Table5of13(1265)=7171:Table5of13(1266)=6155:Table5of13(1267)=6659:Table5of13(1268)=6163:Table5of13(1269)=6403 Table5of13(1270)=6179:Table5of13(1271)=6275:Table5of13(1272)=6211:Table5of13(1273)=5189:Table5of13(1274)=4681 Table5of13(1275)=4433:Table5of13(1276)=4321:Table5of13(1277)=3142:Table5of13(1278)=2634:Table5of13(1279)=2386 Table5of13(1280)=2274:Table5of13(1281)=1612:Table5of13(1282)=1364:Table5of13(1283)=1252:Table5of13(1284)=856 Table5of13(1285)=744:Table5of13(1286)=496 ' Table 20: 2 of 13 Characters (78 entries) Table2of13(0)=3:Table2of13(1)=6144:Table2of13(2)=5:Table2of13(3)=5120:Table2of13(4)=6 Table2of13(5)=3072:Table2of13(6)=9:Table2of13(7)=4608:Table2of13(8)=10:Table2of13(9)=2560 Table2of13(10)=12:Table2of13(11)=1536:Table2of13(12)=17:Table2of13(13)=4352:Table2of13(14)=18 Table2of13(15)=2304:Table2of13(16)=20:Table2of13(17)=1280:Table2of13(18)=24:Table2of13(19)=768 Table2of13(20)=33:Table2of13(21)=4224:Table2of13(22)=34:Table2of13(23)=2176:Table2of13(24)=36 Table2of13(25)=1152:Table2of13(26)=40:Table2of13(27)=640:Table2of13(28)=48:Table2of13(29)=384 Table2of13(30)=65:Table2of13(31)=4160:Table2of13(32)=66:Table2of13(33)=2112:Table2of13(34)=68 Table2of13(35)=1088:Table2of13(36)=72:Table2of13(37)=576:Table2of13(38)=80:Table2of13(39)=320 Table2of13(40)=96:Table2of13(41)=192:Table2of13(42)=129:Table2of13(43)=4128:Table2of13(44)=130 Table2of13(45)=2080:Table2of13(46)=132:Table2of13(47)=1056:Table2of13(48)=136:Table2of13(49)=544 Table2of13(50)=144:Table2of13(51)=288:Table2of13(52)=257:Table2of13(53)=4112:Table2of13(54)=258 Table2of13(55)=2064:Table2of13(56)=260:Table2of13(57)=1040:Table2of13(58)=264:Table2of13(59)=528 Table2of13(60)=513:Table2of13(61)=4104:Table2of13(62)=514:Table2of13(63)=2056:Table2of13(64)=516 Table2of13(65)=1032:Table2of13(66)=1025:Table2of13(67)=4100:Table2of13(68)=1026:Table2of13(69)=2052 Table2of13(70)=2049:Table2of13(71)=4098:Table2of13(72)=4097:Table2of13(73)=2050:Table2of13(74)=1028 Table2of13(75)=520:Table2of13(76)=272:Table2of13(77)=160 ' Table 22: Bar to Character Mapping BarCharMap(0,0)=7:BarCharMap(0,1)=2:BarCharMap(0,2)=4:BarCharMap(0,3)=3 BarCharMap(1,0)=1:BarCharMap(1,1)=10:BarCharMap(1,2)=0:BarCharMap(1,3)=0 BarCharMap(2,0)=9:BarCharMap(2,1)=12:BarCharMap(2,2)=2:BarCharMap(2,3)=8 BarCharMap(3,0)=5:BarCharMap(3,1)=5:BarCharMap(3,2)=6:BarCharMap(3,3)=11 BarCharMap(4,0)=8:BarCharMap(4,1)=9:BarCharMap(4,2)=3:BarCharMap(4,3)=1 BarCharMap(5,0)=0:BarCharMap(5,1)=1:BarCharMap(5,2)=5:BarCharMap(5,3)=12 BarCharMap(6,0)=2:BarCharMap(6,1)=5:BarCharMap(6,2)=1:BarCharMap(6,3)=8 BarCharMap(7,0)=4:BarCharMap(7,1)=4:BarCharMap(7,2)=9:BarCharMap(7,3)=11 BarCharMap(8,0)=6:BarCharMap(8,1)=3:BarCharMap(8,2)=8:BarCharMap(8,3)=10 BarCharMap(9,0)=3:BarCharMap(9,1)=9:BarCharMap(9,2)=7:BarCharMap(9,3)=6 BarCharMap(10,0)=5:BarCharMap(10,1)=11:BarCharMap(10,2)=1:BarCharMap(10,3)=4 BarCharMap(11,0)=8:BarCharMap(11,1)=5:BarCharMap(11,2)=2:BarCharMap(11,3)=12 BarCharMap(12,0)=9:BarCharMap(12,1)=10:BarCharMap(12,2)=0:BarCharMap(12,3)=2 BarCharMap(13,0)=7:BarCharMap(13,1)=1:BarCharMap(13,2)=6:BarCharMap(13,3)=7 BarCharMap(14,0)=3:BarCharMap(14,1)=6:BarCharMap(14,2)=4:BarCharMap(14,3)=9 BarCharMap(15,0)=0:BarCharMap(15,1)=3:BarCharMap(15,2)=8:BarCharMap(15,3)=6 BarCharMap(16,0)=6:BarCharMap(16,1)=4:BarCharMap(16,2)=2:BarCharMap(16,3)=7 BarCharMap(17,0)=1:BarCharMap(17,1)=1:BarCharMap(17,2)=9:BarCharMap(17,3)=9 BarCharMap(18,0)=7:BarCharMap(18,1)=10:BarCharMap(18,2)=5:BarCharMap(18,3)=2 BarCharMap(19,0)=4:BarCharMap(19,1)=0:BarCharMap(19,2)=3:BarCharMap(19,3)=8 BarCharMap(20,0)=6:BarCharMap(20,1)=2:BarCharMap(20,2)=0:BarCharMap(20,3)=4 BarCharMap(21,0)=8:BarCharMap(21,1)=11:BarCharMap(21,2)=1:BarCharMap(21,3)=0 BarCharMap(22,0)=9:BarCharMap(22,1)=8:BarCharMap(22,2)=3:BarCharMap(22,3)=12 BarCharMap(23,0)=2:BarCharMap(23,1)=6:BarCharMap(23,2)=7:BarCharMap(23,3)=7 BarCharMap(24,0)=5:BarCharMap(24,1)=1:BarCharMap(24,2)=4:BarCharMap(24,3)=10 BarCharMap(25,0)=1:BarCharMap(25,1)=12:BarCharMap(25,2)=6:BarCharMap(25,3)=9 BarCharMap(26,0)=7:BarCharMap(26,1)=3:BarCharMap(26,2)=8:BarCharMap(26,3)=0 BarCharMap(27,0)=5:BarCharMap(27,1)=8:BarCharMap(27,2)=9:BarCharMap(27,3)=7 BarCharMap(28,0)=4:BarCharMap(28,1)=6:BarCharMap(28,2)=2:BarCharMap(28,3)=10 BarCharMap(29,0)=3:BarCharMap(29,1)=4:BarCharMap(29,2)=0:BarCharMap(29,3)=5 BarCharMap(30,0)=8:BarCharMap(30,1)=4:BarCharMap(30,2)=5:BarCharMap(30,3)=7 BarCharMap(31,0)=7:BarCharMap(31,1)=11:BarCharMap(31,2)=1:BarCharMap(31,3)=9 BarCharMap(32,0)=6:BarCharMap(32,1)=0:BarCharMap(32,2)=9:BarCharMap(32,3)=6 BarCharMap(33,0)=0:BarCharMap(33,1)=6:BarCharMap(33,2)=4:BarCharMap(33,3)=8 BarCharMap(34,0)=2:BarCharMap(34,1)=1:BarCharMap(34,2)=3:BarCharMap(34,3)=2 BarCharMap(35,0)=5:BarCharMap(35,1)=9:BarCharMap(35,2)=8:BarCharMap(35,3)=12 BarCharMap(36,0)=4:BarCharMap(36,1)=11:BarCharMap(36,2)=6:BarCharMap(36,3)=1 BarCharMap(37,0)=9:BarCharMap(37,1)=5:BarCharMap(37,2)=7:BarCharMap(37,3)=4 BarCharMap(38,0)=3:BarCharMap(38,1)=3:BarCharMap(38,2)=1:BarCharMap(38,3)=2 BarCharMap(39,0)=0:BarCharMap(39,1)=7:BarCharMap(39,2)=2:BarCharMap(39,3)=0 BarCharMap(40,0)=1:BarCharMap(40,1)=3:BarCharMap(40,2)=4:BarCharMap(40,3)=1 BarCharMap(41,0)=6:BarCharMap(41,1)=10:BarCharMap(41,2)=3:BarCharMap(41,3)=5 BarCharMap(42,0)=8:BarCharMap(42,1)=7:BarCharMap(42,2)=9:BarCharMap(42,3)=4 BarCharMap(43,0)=2:BarCharMap(43,1)=11:BarCharMap(43,2)=5:BarCharMap(43,3)=6 BarCharMap(44,0)=0:BarCharMap(44,1)=8:BarCharMap(44,2)=7:BarCharMap(44,3)=12 BarCharMap(45,0)=4:BarCharMap(45,1)=2:BarCharMap(45,2)=8:BarCharMap(45,3)=1 BarCharMap(46,0)=5:BarCharMap(46,1)=10:BarCharMap(46,2)=3:BarCharMap(46,3)=0 BarCharMap(47,0)=9:BarCharMap(47,1)=3:BarCharMap(47,2)=0:BarCharMap(47,3)=9 BarCharMap(48,0)=6:BarCharMap(48,1)=5:BarCharMap(48,2)=2:BarCharMap(48,3)=4 BarCharMap(49,0)=7:BarCharMap(49,1)=8:BarCharMap(49,2)=1:BarCharMap(49,3)=7 BarCharMap(50,0)=5:BarCharMap(50,1)=0:BarCharMap(50,2)=4:BarCharMap(50,3)=5 BarCharMap(51,0)=2:BarCharMap(51,1)=3:BarCharMap(51,2)=0:BarCharMap(51,3)=10 BarCharMap(52,0)=6:BarCharMap(52,1)=12:BarCharMap(52,2)=9:BarCharMap(52,3)=2 BarCharMap(53,0)=3:BarCharMap(53,1)=11:BarCharMap(53,2)=1:BarCharMap(53,3)=6 BarCharMap(54,0)=8:BarCharMap(54,1)=8:BarCharMap(54,2)=7:BarCharMap(54,3)=9 BarCharMap(55,0)=5:BarCharMap(55,1)=4:BarCharMap(55,2)=0:BarCharMap(55,3)=11 BarCharMap(56,0)=1:BarCharMap(56,1)=5:BarCharMap(56,2)=2:BarCharMap(56,3)=2 BarCharMap(57,0)=9:BarCharMap(57,1)=1:BarCharMap(57,2)=4:BarCharMap(57,3)=12 BarCharMap(58,0)=8:BarCharMap(58,1)=3:BarCharMap(58,2)=6:BarCharMap(58,3)=6 BarCharMap(59,0)=7:BarCharMap(59,1)=0:BarCharMap(59,2)=3:BarCharMap(59,3)=7 BarCharMap(60,0)=4:BarCharMap(60,1)=7:BarCharMap(60,2)=7:BarCharMap(60,3)=5 BarCharMap(61,0)=0:BarCharMap(61,1)=12:BarCharMap(61,2)=1:BarCharMap(61,3)=11 BarCharMap(62,0)=2:BarCharMap(62,1)=9:BarCharMap(62,2)=9:BarCharMap(62,3)=0 BarCharMap(63,0)=6:BarCharMap(63,1)=8:BarCharMap(63,2)=5:BarCharMap(63,3)=3 BarCharMap(64,0)=3:BarCharMap(64,1)=10:BarCharMap(64,2)=8:BarCharMap(64,3)=2 ' Build reverse lookup CharToCodeword.RemoveAll For i = 0 To 1286 CharToCodeword(CStr(Table5of13(i) And &H1FFF)) = CLng(i) Next For i = 0 To 77 CharToCodeword(CStr(Table2of13(i) And &H1FFF)) = CLng(1287 + i) Next IsInitialized = True End Sub End Class '============================================================================== ' Singleton Instance Function '============================================================================== Dim g_IMBCodecInstance Function GetIMBCodec() If IsEmpty(g_IMBCodecInstance) Or IsNull(g_IMBCodecInstance) Then Set g_IMBCodecInstance = New IMBCodec End If Set GetIMBCodec = g_IMBCodecInstance End Function %>