Import java.lang. *; import java.util. *; import java.io. *; import java.net. *;
Public class sinodetect {
Static Final INT GB2312 = 0; Static Final Int GBK = 1; Static Final INT HZ = 2; Static Final INT BIG5 = 3; Static Final Int EUC_TW = 4; Static Final Int ISO_2022_CN = 5; Static Final Int UTF8 = 6; Static Final int uncode = 7; static final int ascii = 8; static final int = 9;
Static Final Int Total_Encodings = 10;
// frequency tables to hold the gb, big5, and euc-tw character // frequencies int GBFREQ [] []; int big5freq []; int big5freq [] []; int euc_twfreq [] []; // int UNICODEFREQ [94] [128];
Public static string [] nicename; public static string [] Codings;
Public sinodetect () {// Initialize the Frequency Table for GB, BIG5, EUC-TW GBFREQ = New Int Int [94] [94]; GBKFREQ = New Int [126] [191]; BIG5FREQ = New Int [94] [158 ]; EUC_TWFREQ = New INT [94] [94];
Codings = new string [Total_Encodings]; Codings [GB2312] = "GB2312"; Codings [GBK] = "GBK"; Codings [Hz] = "Hz"; Codings [BIG5] = "BIG5"; Codings [EUC_TW] = " CNS11643 "; CODINGS [ISO_2022_CN] =" ISO2022CN "; Codings [UTF8] =" UTF8 "; Codings [Unicode] =" Unicode "; Codings [ASCII] =" ASCII "; Codings [other] =" ";
Nicename = new string [Total_Encodings]; NICENAME [GB2312] = "GB2312"; Nicename [GBK] = "GBK"; NICENAME [Hz] = "Hz"; Nicename [Big5] = "BIG5"; NICENAME [EUC_TW] = " CNS 11643 "; NICENAME [ISO_2022_CN] =" ISO 2022-CN "; Nicename [UTF8] =" UTF-8 "; NICENAME [Unicode] =" unicode "; Nicename [ASCII] =" ASCII "; Nicename [other] = "Other"; initialize_frequencies ();
Public static void main (string argc []) {sinodetect sinodetector; int result = other;
Argc = new string [1]; // argc [0] = "c: //chinedata//codeconvert//voaunit.txt"; argc [0] = "Chinese"; sinodetector = new sinodetect (); if (argc) [0] .StartSwith ("http: //") == true) {try {result = sinodetector.detectencoding (new url (argc [0]));} catch (exception e) {system.err.println (" Bad URL " E.TOString ());}}}}} else {// Result = sinodetector.detectencoding (new file (argc [0])); result = sinodetector.DeteCtecoding (Argc [0] .getbytes ());} System.out.println (nicename [result]);
/ ** Function: detectEncoding Aruguments: URL Returns: One of the encodings from the Encoding enumeration (GB2312, HZ, BIG5, EUC_TW, ASCII, or OTHER) Description: This function looks at the URL contents and assigns it a probability score for each Encoding Type. The Encoding Type with The Highest Probability Is Returned. * /
Public int detected {byte [] RawText = new byte [10000]; int BytesRead = 0, byteoffset = 0; int guest = other; inputstream ChineseStream;
try {chinesestream = testurl.openStream (); while ((bytesread = chinesestream.read (rawtext, byteoffset, rawtext.length - byteoffset))> 0) {byteoffset = bytesread;}; chinesestream.close (); guess = detectEncoding RawText;
} Catch (Exception E) {System.err.Println ("Error Loading Or Url" E.TOSTRING ()); Guess = Other;
Return guess;
/ ** Function: detectEncoding Aruguments: File Returns: One of the encodings from the Encoding enumeration (GB2312, HZ, BIG5, EUC_TW, ASCII, or OTHER) Description: This function looks at the file and assigns it a probability score for each encoding TYPE. The Encoding Type with the highest probability is returned. * /
Public Int Detecoding (File Testfile) {FileInputStream ChineseFile; Byte [] RawText;
Rawtext = new byte [(int) Testfile.Length ()]; try {chinesefile = new fileinputstream (testfile); chinesefile.read (RawText);} catch (Exception E) {system.err.println ("Error:" e);
Return Detectencoding (RawText);
/ ** Function: detectEncoding Aruguments: byte array Returns: One of the encodings from the Encoding enumeration (GB2312, HZ, BIG5, EUC_TW, ASCII, or OTHER) Description: This function looks at the byte array and assigns it a probability score for Each Encoding Type. The Encoding Type with The Highest Probability Is Returned. * /
Public int detecoding (byte [] RawText) {int tent [] score; int index, maxscore = 0; int encoding_guess = other;
Score = new int [total_encodings];
// Assign Scores scores [GB2312] = gb2312_probability (rawtext); scores [GBK] = gbk_probability (rawtext); scores [HZ] = hz_probability (rawtext); scores [BIG5] = big5_probability (rawtext); scores [EUC_TW] = euc_tw_probability (rawtext); scores [ISO_2022_CN] = iso_2022_cn_probability (rawtext); scores [UTF8] = utf8_probability (rawtext); scores [UNICODE] = utf16_probability (rawtext); scores [ASCII] = ascii_probability (rawtext); scores [OTHER] = 0 ; // Tabulate Scores for (index
// Return other if nothing scored above 50 i (maxscore <= 50) {eNCoding_guess = other;}
Return encoding_guess;
/ * Function: GB2312_PROBABILITY ARGUMENT: POINTER TO BYTE ARRAY RETURns: Number from 0 to 100 representing probability text in Array USES GB-2312 Encoding * /
INT GB2312_PROBABILITY (Byte [] RawText) {INT I, RAWTEXTLEN = 0;
INT dbchars = 1, gbchars = 1; long gbfreq = 0, TotalFreq = 1; float rangeval = 0, freqval = 0; int Row, column;
// Stage 1: Check to See et ly character ranges
Rawtextlen = RawText.Length; for (i = 0; i
Return (Int);}
/ * Function: GB2312_PROBABILITY ARGUMENT: POINTER TO BYTE ARRAY RETURns: Number from 0 to 100 representing probability text in Array USES GB-2312 Encoding * /
INT GBK_PROBABILITY (Byte [] Rawtext) {INT I, RAWTEXTLEN = 0;
INT dbchars = 1, gbchars = 1; long gbfreq = 0, TotalFreq = 1; float rangeval = 0, freqval = 0; int Row, column;
// Stage 1: Check to see if character, = rawtext.length; for (i = 0; i
} Else IF ((byte) 0x81 <= RawText [i] && RawText [i] <= (byte) 0xfe &&/ Extended GB RANGE ((byte) 0x80 <= RawText [i 1] && RawText [i 1] <= (byte) 0xfe || (Byte) 0x40 <= RawText [i 1] && RawText [i 1] <= (byte) 0x7e)) {GBCHARS ; TotalFreq = 500; ROW = RawText [i] 256 - 0x81; if (0x40 <= Rawtext [i 1] && RawText [i 1] <= 0x7e) {colorn = RawText [i 1] - 0x40;} else {column = rawtext [ i 1] 256 - 0x80;} //system.out.println ("Extended Row " Row " Column " Column " RawText [i] " RawText [i]); if (GBKFREQ [ROW] [column]! = 0) {GBFREQ = GBKFREQ [ROW] [Column];}}} i ;}} Rangeval = 50 * ((float) gbchars / (float) dbchars; freqval = 50 * ((float) GBFREQ / (FLOAT) TOTALFREQ); // for Regular GB Files, this Would Give The Same, SO i Handicap It Slightly Return (Int) (→ → 淘淘 淘 淘 淘 淘 淘 淘 淘 淘 淘 淘 淘 店 0
/ * Function: hz_probability argument: byte array returns: Number from 0 to 100 representing probability text in array buy hz encoding * /
INT HZ_PROBABILITY (Byte [] RawText) {INT I, RAWTEXTLEN; int hzchars = 0, dbchars = 1; long hzfreq = 0, TotalFreq = 1; float rangeval = 0, freqval = 0; int hzstart = 0, hzend = 0; Int row, column;
RawtextLen = RawText.length;
For (i = 0; I IF (hzstart> 4) {rangeval = 50;} else if (hzstart> 1) {Rangeval = 41;} else if (hzstart> 0) {// only 39 in case the sequence happened to occur rangeval = 39; // In OtherWise Non-hz text} else {rangeval = 0;} freqval = 50 * ((float) hzfreq / (float) TotalFreq; RANGEVAL FREQVAL);} / ** function: BIG5_PROBABILITY ARGUMENT: BYTE ARRAY RETURns: Number from 0 to 100 representing probability text in array buy big5 encoding * / INT BIG5_PROBABILITY (Byte [] RawText) {int score = 0; INT I, RAWTEXTLEN = 0; int dbchars = 1, bfchars = 1; float rangeval = 0, freqval = 0; long bffreq = 0, TotalFreq = 1; int ROW Column; // Check to see et ly character ranges RawTextLen = RawText.Length; for (i = 0; i / * Function: EUC_TW_PROBABILITY ARGUMENT: BYTE ARRAY RETURNS: Number from 0 to 100 Representing Probability Text in Array Uses Euc-Tw (CNS 11643) ENCODING * / INT EUC_TW_PROBABILITY (Byte [] Rawtext) {INT I, RAWTEXTLEN = 0; int dbchars = 1, cnschars = 1; long cnsfreq = 0, TotalFreq = 1; float rangeval = 0, freqval = 0; int Row, column; // Check to see if character @ ion in access expequency of use RawtextLen = RawText.length; for (i = 0; i Rangeval = 50 * (Float) CNSChars / (FLOAT) DBCHARS; freqval = 50 * ((float) cnsfreq / (float) TotalFreq; Return (Int);} / * Function: iso_2022_cn_probability Argument: byte array Returns: number from 0 to 100 representing probability text in array uses ISO 2022-CN encoding WORKS FOR BASIC CASES, BUT STILL NEEDS MORE WORK * / INT ISO_2022_CN_PROBABILITY (Byte [] Rawtext) {INT I, RAWTEXTLEN = 0; int dbchars = 1, IsoChars = 1; Long isofreq = 0, TotalFreq = 1; float rangeval = 0, freqval = 0; int Row, column; // Check to see if character ingte inteptable ranges // and has excected frequency of us RawtextLen = RawText.Length; for (i = 0; i 92) {ISOFREQ = 150;} i ;} i ;}} if (RawText [i] == (byte) 0x1b && xt [i 1] == (Byte) 0x28 && rawtext [ i 2] == (byte) 0x42) {// ASCII: ESC (B i = 2;}}}}} ivageval = 50 * ((float) osochars / (float) dbchars; freqval = 50 * ((float) ISOFREQ / (FLOAT) TOTALFREQ); // System.out.Println ("IsoChars Dbchars Isofreq" IsoChars " Dbchars " " TotalFreq " RangeVal " freqval) ; Return (Int); // Return 0; / * Function: UTF8_PROBABILITY ARGUMENT: BYTE ARRAY RETURns: Number from 0 to 100 representing probability text in array users UTF-8 Encoding of unicode * / INT UTF8_PROBABILITY (byte [] RawText) {int score = 0; INT I, RAWTEXTLEN = 0; int goodbytes = 0, asCIBYTES = 0; // Maybe Also Use UTF8 BYTE ORDER MARK: EF BB BF // Check to see reason rantext1XTextlen = RawText.length; for (i = 0; i Score = (int) (100 * (Float) GoodBytes / (Float))))) // if not Above 98, Reduce to Zero to Prevent Coincidental Matches // Allows for Some (FEW) Bad factoryd sequences if (Score> 98) {Return Score;} else f (score> 95 && goodbook> 30) {Return Score Else {return 0;} } / * Function: utf16_probability Argument: byte array Returns: number from 0 to 100 representing probability text in array uses UTF-16 encoding of Unicode, guess based on BOM // NOT VERY GENERAL, NEEDS MUCH MORE WORK * / INT UTF16_PROBABILITY (Byte [] RawText) {// int score = 0; // INT I, RAWTEXTLEN = 0; // int goodbytes = 0, asCIBYTES = 0; IF ((Byte) 0xfe == Rawtext [0] && (Byte) 0xFF == Rawtext [1]) || // big-endian ((byte) 0xff == Rawtext [0] && (Byte) 0xfe == RawText [1])) {// little-endian return 100;} return 0; / * // check to see reason ranges rangextlen = RawText.Length; for (i = 0; i Score = (int) (100 * (Float) Goodbytes / (FLOAT) RAWTEXT.LENGTH); // An all ASCII File, But I'd Rather IT // Get Identified As ASCII. CAN Delete Following 3 Lines OtherWise IF (Goodbytes == ASCIBYTES) {score = 0;} // if Not Above 90, Reduce to Zero to Prevent Coincidental Matches IF (Score> 90) {Return Score;} else {return 0;} * / } / * Function: ascii_probability Argument: byte array Returns: number from 0 to 100 representing probability text in array uses all ASCII Description: Sees if array has any characters not in ASCII range, if so, score is reduced * / int ascii_probability (byte [ ] RawText) {int score = 70; INT I, RAWTEXTLEN RawtextLen = RawText.length; For (i = 0; i Return score; Void Initialize_frequencies () {INT I, J; For (i = 0; i <93; i ) {for (j = 0; j <93; j ) {GBFREQ [i] [j] = 0;}} For (i = 0; i <126; i ) {for (j = 0; j <191; j ) {GBKFREQ [i] [j] = 0;}} FOR (i = 0; i <93; i ) {for (j = 0; j <157; j ) {BIG5FREQ [i] [j] = 0;}} For (i = 0; i <93; i ) {for (j = 0; j <93; j ) {EUC_TWFREQ [i] [j] = 0;}} GBFREQ [20] [35] = 599; GBFREQ [49] [26] = 598; GBFREQ [41] [38] = 597; GBFREQ [17] [26] = 596; GBFREQ [32] [42] = 595; GBFREQ [39] [42] = 594; GBFREQ [45] [49] = 593; GBFREQ [51] [57] = 592; GBFREQ [50] [47] = 591; GBFREQ [42] [90] = 590; Gbfreq [52] [65] = 589; GBFREQ [53] [47] = 588; GBFREQ [19] [82] = 587; GBFREQ [31] [19] = 586; GBFREQ [40] [46] = 585; GBFREQ [24] [89] = 584; GBFREQ [23] [85] = 583; GBFREQ [20] [28] = 582; GBFREQ [42] [20] = 581; GBFREQ [34] [38] = 580; GBFREQ [45] [9] = 579; GBFREQ [54] [50] = 578; GBFREQ [25] [44] = 577; GBFREQ [35] [66] = 576; GBFREQ [20] [55] = 575; GBFREQ [18] [85] = 574; GBFREQ [20] [31] = 573; GBFREQ [49] [17] = 572; GBFREQ [41] [16] = 571; GBFREQ [35] [73] = 570; GBFREQ [20] [34] = 569; GBFREQ [29] [44] = 568; GBFREQ [35] [38] = 567; GBFREQ [49] [9] = 566; GBFREQ [46] [33] = 565; GBFREQ [49] [51] = 564; GBFREQ [40] [89] = 563; GBFREQ [26] [64] = 562; GBFREQ [54] [51] = 561; GBFREQ [54] [36] = 560; GBFREQ [39] [4] = 559; GBFREQ [53] [13] = 558; GBFREQ [24] [92] = 557; GBFREQ [27] [49] = 556; GBFREQ [48] [6] = 555; GBFREQ [21] [51] = 554; GBFREQ [30] [40] = 553; GBFREQ [42] [92] = 552; GBFREQ [31] [78] = 551; GBFREQ [25] [82] = 550; GBFREQ [47] [0] = 549; GBFREQ [34] [19] = 548; GBFREQ [47] [35] = 547; GBFREQ [21] [63] = 546; GBFREQ [43] [75] = 545; GBFREQ [21] [87] = 544; GBFREQ [35] [59] = 543; GBFREQ [25] [34] = 542; GBFREQ [21] [27] = 541; GBFREQ [39] [26] = 540; GBFREQ [34] [26] = 539; GBFREQ [39] [52] = 538; GBFREQ [50] [57] = 537; GBFREQ [37] [79] = 536; GBFREQ [26] [24] = 535; GBFREQ [22] [1] = 534; GBFREQ [18] [40] = 533; GBFREQ [41] [33] = 532; GBFREQ [53] [26] = 531; GBFREQ [54] [86] = 530; GBFREQ [20] [16] = 529; GBFREQ [46] [74] = 528; GBFREQ [30] [19] = 527; GBFREQ [45] [35] = 526; GBFREQ [45] [61] = 525; GBFREQ [30] [9] = 524; GBFREQ [41] [53] = 523; GBFREQ [41] [13] = 522; GBFREQ [50] [34] = 521; GBFREQ [53] [86] = 520; GBFREQ [47] [47] = 519; GBFREQ [22] [28] = 518; GBFREQ [50] [53] [517; GBFREQ [39] [70] = 516; GBFREQ [38] [15] = 515; GBFREQ [42] [88] = 514; GBFREQ [16] [29] = 513; GBFREQ [27] [90] = 512; GBFREQ [29] [12] = 511; GBFREQ [44] [22] = 510; GBFREQ [34] [69] = 509; GBFREQ [24] [10] = 508; GBFREQ [44] [11] = 507; GBFREQ [39] [92] = 506; GBFREQ [49] [48] = 505; GBFREQ [31] [46] = 504; GBFREQ [19] [50] = 503; GBFREQ [21] [14] = 502; GBFREQ [32] [28] = 501; GBFREQ [18] [3] = 500; GBFREQ [53] [9] = 499; GBFREQ [34] [80] = 498; GBFREQ [48] [88] = 497; GBFREQ [46] [53] = 496; GBFREQ [22] [53] = 495; GBFREQ [28] [10] = 494; GBFREQ [44] [65] = 493; GBFREQ [20] [10] = 492; GBFREQ [40] [76] = 491; GBFREQ [47] [8] = 490; GBFREQ [50] [74] = 489; GBFREQ [23] [62] = 488; GBFREQ [49] [65] = 487; GBFREQ [28] [87] = 486; GBFREQ [15] [48] = 485; GBFREQ [22] [7] = 484; GBFREQ [19] [42] = 483; GBFREQ [41] [20] = 482; GBFREQ [26] [55] = 481; GBFREQ [21] [93] = 480; GBFREQ [31] [76] = 479; GBFREQ [34] [31] = 478; GBFREQ [20] [66] = 477; GBFREQ [51] [33] = 476; GBFREQ [34] [86] = 475; GBFREQ [37] [67] = 474; GBFREQ [53] [53] = 473; GBFREQ [40] [88] = 472; GBFREQ [39] [10] = 471; GBFREQ [24] [3] = 470; GBFREQ [27] [25] = 469; GBFREQ [26] [15] = 468; GBFREQ [21] [88] = 467; GBFREQ [52] [62] = 466; GBFREQ [46] [81] = 465; GBFREQ [38] [72] = 464; GBFREQ [17] [30] = 463; GBFREQ [52] [92] = 462; GBFREQ [34] [90] = 461; GBFREQ [21] [7] = 460; GBFREQ [36] [13] = 459; GBFREQ [45] [41] = 458; GBFREQ [32] [5] = 457; GBFREQ [26] [89] = 456; GBFREQ [23] [87] = 455; GBFREQ [20] [39] = 454; GBFREQ [27] [23] = 453; GBFREQ [25] [59] = 452; GBFREQ [49] [20] = 451; GBFREQ [54] [77] = 450; GBFREQ [27] [67] = 449; GBFREQ [47] [33] = 448; GBFREQ [41] [17] = 447; GBFREQ [19] [81] = 446; GBFREQ [16] [66] = 445; GBFREQ [45] [26] = 444; GBFREQ [49] [81] = 443; GBFREQ [53] [55] = 442; GBFREQ [16] [26] = 441; GBFREQ [54] [62] = 440; GBFREQ [20] [70] = 439; GBFREQ [42] [35] = 438; GBFREQ [20] [57] = 437; GBFREQ [34] [36] = 436; GBFREQ [46] [63] = 435; GBFREQ [19] [45] = 434; GBFREQ [21] [10] = 433; GBFREQ [52] [93] = 432; GBFREQ [25] [2] = 431; GBFREQ [30] [57] = 430; GBFREQ [41] [24] = 429; GBFREQ [28] [43] = 428; GBFREQ [45] [86] = 427; GBFREQ [51] [56] = 426; GBFREQ [37] [28] = 425; GBFREQ [52] [69] = 424; GBFREQ [43] [92] = 423; GBFREQ [41] [31] = 422; GBFREQ [37] [87] = 421; GBFREQ [47] [36 ] = 420; GBFREQ [16] [16] = 419; GBFREQ [40] [56] = 418; GBFREQ [24] [55] = 417; GBFREQ [17] [1] = 416; GBFREQ [35] [57 ] = 415; GBFREQ [27] [50] = 414; GBFREQ [26] [14] = 413; GBFREQ [50] [40] = 412; GBFREQ [39] [19] = 411; GBFREQ [19] [89 ] = 410; GBFREQ [29] [91] = 409; GBFREQ [17] [89] = 408; GBFREQ [39] [74] = 407; GBFREQ [46] [39] = 406; GBFREQ [40] [28 ] = 405; GBFREQ [45] [68] = 404; GBFREQ [43] [10] = 403; GBFREQ [42] [13] = 402; GBFREQ [44] [81] = 401; GBFREQ [41] [47 ] = 400; GBFREQ [48] [58] = 399; GBFREQ [43] [68] = 398; GBFREQ [16] [79] = 397; GBFREQ [19] [5] = 396; GBFREQ [54] [59] = 395; GBFREQ [17] [36] = 394; GBFREQ [18] [0] = 393; GBFREQ [41] [5] = 392; GBFREQ [41] [72] = 391; GBFREQ [16] [39] = 390; GBFREQ [54] [0] = 389; GBFREQ [51] [16] = 388; GBFREQ [29] [36] = 387; GBFREQ [47] [5] = 386; GBFREQ [47] [51] = 385; GBFREQ [44] [7] = 384; GBFREQ [35] [30] = 383; GBFREQ [26] [9] = 382; GBFREQ [16] [7] = 381; GBFREQ [32] [1] = 380; GBFREQ [33] [76] = 379; GBFREQ [34] [91] = 378; GBFREQ [52] [36] = 377; GBFREQ [26] [77] = 376; GBFREQ [35] [48] = 375; GBFREQ [40] [80] = 374; GBFREQ [41] [92] = 373; GBFREQ [27] [93] = 372; GBFREQ [15] [17] = 371; GBFREQ [16] [76] = 370; GBFREQ [51] [12] = 369; GBFREQ [18] [20] = 368; GBFREQ [15] [54] = 367; GBFREQ [50] [5] = 366; GBFREQ [33] [22] = 365; GBFREQ [37] [57] = 364; GBFREQ [28] [47] = 363; GBFREQ [42] [31] = 362; GBFREQ [18] [2] = 361; GBFREQ [43] [64] = 360; GBFREQ [23] [47] = 359; GBFREQ [28] [79] = 358; GBFREQ [25] [45] = 357; GBFREQ [23] [91] = 356; GBFREQ [22] [19] = 355; GBFREQ [25] [46] = 354; GBFREQ [22] [36] = 353; GBFREQ [54] [85] = 352; g BFREQ [46] [20] = 351; GBFREQ [27] [37] = 350; GBFREQ [26] [81] = 349; GBFREQ [42] [29] = 348; GBFREQ [31] [90] = 347; GBFREQ [41] [59] = 346; GBFREQ [24] [65] = 345; GBFREQ [44] [84] = 344; GBFREQ [24] [90] = 343; GBFREQ [38] [54] = 342; GBFREQ [28] [70] = 341; GBFREQ [27] [15] = 340; GBFREQ [28] [80] = 339; GBFREQ [29] [8] = 338; GBFREQ [45] [80] = 337; GBFREQ [53] [37] = 336; GBFREQ [23] [86] = 334; GBFREQ [39] [45] = 333; GBFREQ [53] [32] = 332; GBFREQ [38] [68] = 331; GBFREQ [45] [78] = 330; GBFREQ [43] [7] = 329; GBFREQ [46] [82] = 328; GBFREQ [27] [38] = 327; GBFREQ [16] [62] = 326; GBFREQ [24] [17] = 325; GBFREQ [22]; GBFREQ [52] [28] = 323; GBFREQ [23] [40] = 322; GBFREQ [28] [50] = 321; GBFREQ [42] [91] = 320; GBFREQ [47] [76] = 319; GBFREQ [15] [42] = 318; GBFREQ [43] [55] = 317; GBFREQ [29] [84] = 316; GBFREQ [44] [90] = 315; GBFREQ [53] [16] = 314; GBFREQ [22] [93] = 313; GBFREQ [34] [10] = 312; GBFREQ [32] [53] = 311; GBFREQ [43] [65] = 310; GBFREQ [28] [7] = 309; GBFREQ [35] [46] = 308; GBFREQ [21] [39] = 307; GBFREQ [44] [18] = 306; GBFREQ [40] [10] = 305; GBFREQ [54] [53] = 304; GBFREQ [38] [74] = 303; GBFREQ [28] [26] = 302; GBFREQ [15] [13] = 301; GBFREQ [39] [34] = 300; GBFREQ [39] [46] = 299; GBFREQ [33] [58] = 297; GBFREQ [15] [56] = 296; GBFREQ [18] [51] = 295; GBFREQ [49] [68] = 294; GBFREQ [30] [37] = 293; GBFREQ [51] [84] = 292; GBFREQ [51] [9] = 291; GBFREQ [40] [70] = 290; GBFREQ [41] [84] = 289; GBFREQ [28] [64] = 288; GBFREQ [32] [88] = 287; GBFREQ [24] [5] = 286; GBFREQ [53] [23] = 285; GBFREQ [42] [27] = 284; GBFREQ [22] [38] = 283; GBFREQ [32] [86] = 282; GBFREQ [34] [30] = 281; GBFREQ [38] [63] = 280; GBFREQ [24] [59] = 279; GBFREQ [22] [81] = 278; GBFREQ [32] [11] = 277; GBFREQ [51] [21] = 276; GBFREQ [54] [41] = 275; GBFREQ [21] [50] = 274; GBFREQ [23] [89] = 273; GBFREQ [19] [87] = 272; GBFREQ [26] [7] = 271; GBFREQ [30] [75] = 270; GBFREQ [43] [84] = 269; GBFREQ [51] [25] = 268; GBFREQ [16] [67] = 267; GBFREQ [32] [9] = 266; GBFREQ [48] [51] = 265; GBFREQ [39] [7] = 264; GBFREQ [44] [88] = 263; GBFREQ [52] [24] = 262; GBFREQ [23] [34] =