nsprpub/lib/tests/base64t.c

Thu, 22 Jan 2015 13:21:57 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Thu, 22 Jan 2015 13:21:57 +0100
branch
TOR_BUG_9701
changeset 15
b8a032363ba2
permissions
-rw-r--r--

Incorporate requested changes from Mozilla in review:
https://bugzilla.mozilla.org/show_bug.cgi?id=1123480#c6

michael@0 1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
michael@0 2 /* This Source Code Form is subject to the terms of the Mozilla Public
michael@0 3 * License, v. 2.0. If a copy of the MPL was not distributed with this
michael@0 4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
michael@0 5
michael@0 6 #include "plbase64.h"
michael@0 7 #include "plstr.h"
michael@0 8 #include "nspr.h"
michael@0 9
michael@0 10 #include <stdio.h>
michael@0 11
michael@0 12 static unsigned char *base = (unsigned char *)"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
michael@0 13
michael@0 14 /* PL_Base64Encode, single characters */
michael@0 15 PRBool test_001(void)
michael@0 16 {
michael@0 17 PRUint32 a, b;
michael@0 18 unsigned char plain[ 4 ];
michael@0 19 unsigned char cypher[ 5 ];
michael@0 20 char result[ 8 ];
michael@0 21 char *rv;
michael@0 22
michael@0 23 printf("Test 001 (PL_Base64Encode, single characters) ..."); fflush(stdout);
michael@0 24
michael@0 25 plain[1] = plain[2] = plain[3] = (unsigned char)0;
michael@0 26 cypher[2] = cypher[3] = (unsigned char)'=';
michael@0 27 cypher[4] = (unsigned char)0;
michael@0 28
michael@0 29 for( a = 0; a < 64; a++ )
michael@0 30 {
michael@0 31 cypher[0] = base[a];
michael@0 32
michael@0 33 for( b = 0; b < 4; b++ )
michael@0 34 {
michael@0 35 plain[0] = (unsigned char)(a * 4 + b);
michael@0 36 cypher[1] = base[(b * 16)];
michael@0 37
michael@0 38 rv = PL_Base64Encode((char *)plain, 1, result);
michael@0 39 if( rv != result )
michael@0 40 {
michael@0 41 printf("FAIL\n\t(%d, %d): return value\n", a, b);
michael@0 42 return PR_FALSE;
michael@0 43 }
michael@0 44
michael@0 45 if( 0 != PL_strncmp((char *)cypher, result, 4) )
michael@0 46 {
michael@0 47 printf("FAIL\n\t(%d, %d): expected \"%s,\" got \"%.4s.\"\n",
michael@0 48 a, b, cypher, result);
michael@0 49 return PR_FALSE;
michael@0 50 }
michael@0 51 }
michael@0 52 }
michael@0 53
michael@0 54 printf("PASS\n");
michael@0 55 return PR_TRUE;
michael@0 56 }
michael@0 57
michael@0 58 /* PL_Base64Encode, double characters */
michael@0 59 PRBool test_002(void)
michael@0 60 {
michael@0 61 PRUint32 a, b, c, d;
michael@0 62 unsigned char plain[ 4 ];
michael@0 63 unsigned char cypher[ 5 ];
michael@0 64 char result[ 8 ];
michael@0 65 char *rv;
michael@0 66
michael@0 67 printf("Test 002 (PL_Base64Encode, double characters) ..."); fflush(stdout);
michael@0 68
michael@0 69 plain[2] = plain[3] = (unsigned char)0;
michael@0 70 cypher[3] = (unsigned char)'=';
michael@0 71 cypher[4] = (unsigned char)0;
michael@0 72
michael@0 73 for( a = 0; a < 64; a++ )
michael@0 74 {
michael@0 75 cypher[0] = base[a];
michael@0 76 for( b = 0; b < 4; b++ )
michael@0 77 {
michael@0 78 plain[0] = (a*4) + b;
michael@0 79 for( c = 0; c < 16; c++ )
michael@0 80 {
michael@0 81 cypher[1] = base[b*16 + c];
michael@0 82 for( d = 0; d < 16; d++ )
michael@0 83 {
michael@0 84 plain[1] = c*16 + d;
michael@0 85 cypher[2] = base[d*4];
michael@0 86
michael@0 87 rv = PL_Base64Encode((char *)plain, 2, result);
michael@0 88 if( rv != result )
michael@0 89 {
michael@0 90 printf("FAIL\n\t(%d, %d, %d, %d): return value\n", a, b, c, d);
michael@0 91 return PR_FALSE;
michael@0 92 }
michael@0 93
michael@0 94 if( 0 != PL_strncmp((char *)cypher, result, 4) )
michael@0 95 {
michael@0 96 printf("FAIL\n\t(%d, %d, %d, %d): expected \"%s,\" got \"%.4s.\"\n",
michael@0 97 a, b, c, d, cypher, result);
michael@0 98 return PR_FALSE;
michael@0 99 }
michael@0 100 }
michael@0 101 }
michael@0 102 }
michael@0 103 }
michael@0 104
michael@0 105 printf("PASS\n");
michael@0 106 return PR_TRUE;
michael@0 107 }
michael@0 108
michael@0 109 /* PL_Base64Encode, triple characters */
michael@0 110 PRBool test_003(void)
michael@0 111 {
michael@0 112 PRUint32 a, b, c, d, e, f;
michael@0 113 unsigned char plain[ 4 ];
michael@0 114 unsigned char cypher[ 5 ];
michael@0 115 char result[ 8 ];
michael@0 116 char *rv;
michael@0 117
michael@0 118 printf("Test 003 (PL_Base64Encode, triple characters) ..."); fflush(stdout);
michael@0 119
michael@0 120 cypher[4] = (unsigned char)0;
michael@0 121
michael@0 122 for( a = 0; a < 64; a++ )
michael@0 123 {
michael@0 124 cypher[0] = base[a];
michael@0 125 for( b = 0; b < 4; b++ )
michael@0 126 {
michael@0 127 plain[0] = (a*4) + b;
michael@0 128 for( c = 0; c < 16; c++ )
michael@0 129 {
michael@0 130 cypher[1] = base[b*16 + c];
michael@0 131 for( d = 0; d < 16; d++ )
michael@0 132 {
michael@0 133 plain[1] = c*16 + d;
michael@0 134 for( e = 0; e < 4; e++ )
michael@0 135 {
michael@0 136 cypher[2] = base[d*4 + e];
michael@0 137 for( f = 0; f < 64; f++ )
michael@0 138 {
michael@0 139 plain[2] = e * 64 + f;
michael@0 140 cypher[3] = base[f];
michael@0 141
michael@0 142 rv = PL_Base64Encode((char *)plain, 3, result);
michael@0 143 if( rv != result )
michael@0 144 {
michael@0 145 printf("FAIL\n\t(%d, %d, %d, %d, %d, %d): return value\n", a, b, c, d, e, f);
michael@0 146 return PR_FALSE;
michael@0 147 }
michael@0 148
michael@0 149 if( 0 != PL_strncmp((char *)cypher, result, 4) )
michael@0 150 {
michael@0 151 printf("FAIL\n\t(%d, %d, %d, %d, %d, %d): expected \"%s,\" got \"%.4s.\"\n",
michael@0 152 a, b, c, d, e, f, cypher, result);
michael@0 153 return PR_FALSE;
michael@0 154 }
michael@0 155 }
michael@0 156 }
michael@0 157 }
michael@0 158 }
michael@0 159 }
michael@0 160 }
michael@0 161
michael@0 162 printf("PASS\n");
michael@0 163 return PR_TRUE;
michael@0 164 }
michael@0 165
michael@0 166 static struct
michael@0 167 {
michael@0 168 const char *plaintext;
michael@0 169 const char *cyphertext;
michael@0 170 } array[] =
michael@0 171 {
michael@0 172 /* Cyphertexts generated with uuenview 0.5.13 */
michael@0 173 { " ", "IA==" },
michael@0 174 { ".", "Lg==" },
michael@0 175 { "/", "Lw==" },
michael@0 176 { "C", "Qw==" },
michael@0 177 { "H", "SA==" },
michael@0 178 { "S", "Uw==" },
michael@0 179 { "^", "Xg==" },
michael@0 180 { "a", "YQ==" },
michael@0 181 { "o", "bw==" },
michael@0 182 { "t", "dA==" },
michael@0 183
michael@0 184 { "AB", "QUI=" },
michael@0 185 { "AH", "QUg=" },
michael@0 186 { "AQ", "QVE=" },
michael@0 187 { "BD", "QkQ=" },
michael@0 188 { "CR", "Q1I=" },
michael@0 189 { "CS", "Q1M=" },
michael@0 190 { "DB", "REI=" },
michael@0 191 { "DC", "REM=" },
michael@0 192 { "EK", "RUs=" },
michael@0 193 { "ET", "RVQ=" },
michael@0 194 { "IM", "SU0=" },
michael@0 195 { "JR", "SlI=" },
michael@0 196 { "LO", "TE8=" },
michael@0 197 { "LW", "TFc=" },
michael@0 198 { "ML", "TUw=" },
michael@0 199 { "SB", "U0I=" },
michael@0 200 { "TO", "VE8=" },
michael@0 201 { "VS", "VlM=" },
michael@0 202 { "WP", "V1A=" },
michael@0 203 /* legitimate two-letter words */
michael@0 204 { "ad", "YWQ=" },
michael@0 205 { "ah", "YWg=" },
michael@0 206 { "am", "YW0=" },
michael@0 207 { "an", "YW4=" },
michael@0 208 { "as", "YXM=" },
michael@0 209 { "at", "YXQ=" },
michael@0 210 { "ax", "YXg=" },
michael@0 211 { "be", "YmU=" },
michael@0 212 { "by", "Ynk=" },
michael@0 213 { "do", "ZG8=" },
michael@0 214 { "go", "Z28=" },
michael@0 215 { "he", "aGU=" },
michael@0 216 { "hi", "aGk=" },
michael@0 217 { "if", "aWY=" },
michael@0 218 { "in", "aW4=" },
michael@0 219 { "is", "aXM=" },
michael@0 220 { "it", "aXQ=" },
michael@0 221 { "me", "bWU=" },
michael@0 222 { "my", "bXk=" },
michael@0 223 { "no", "bm8=" },
michael@0 224 { "of", "b2Y=" },
michael@0 225 { "on", "b24=" },
michael@0 226 { "or", "b3I=" },
michael@0 227 { "ox", "b3g=" },
michael@0 228 { "so", "c28=" },
michael@0 229 { "to", "dG8=" },
michael@0 230 { "up", "dXA=" },
michael@0 231 { "us", "dXM=" },
michael@0 232 { "we", "d2U=" },
michael@0 233 /* all three-letter entries in /usr/dict/words */
michael@0 234 { "1st", "MXN0" },
michael@0 235 { "2nd", "Mm5k" },
michael@0 236 { "3rd", "M3Jk" },
michael@0 237 { "4th", "NHRo" },
michael@0 238 { "5th", "NXRo" },
michael@0 239 { "6th", "NnRo" },
michael@0 240 { "7th", "N3Ro" },
michael@0 241 { "8th", "OHRo" },
michael@0 242 { "9th", "OXRo" },
michael@0 243 { "AAA", "QUFB" },
michael@0 244 { "AAU", "QUFV" },
michael@0 245 { "ABA", "QUJB" },
michael@0 246 { "abc", "YWJj" },
michael@0 247 { "Abe", "QWJl" },
michael@0 248 { "Abo", "QWJv" },
michael@0 249 { "ace", "YWNl" },
michael@0 250 { "ACM", "QUNN" },
michael@0 251 { "ACS", "QUNT" },
michael@0 252 { "act", "YWN0" },
michael@0 253 { "Ada", "QWRh" },
michael@0 254 { "add", "YWRk" },
michael@0 255 { "ado", "YWRv" },
michael@0 256 { "aft", "YWZ0" },
michael@0 257 { "age", "YWdl" },
michael@0 258 { "ago", "YWdv" },
michael@0 259 { "aid", "YWlk" },
michael@0 260 { "ail", "YWls" },
michael@0 261 { "aim", "YWlt" },
michael@0 262 { "air", "YWly" },
michael@0 263 { "ala", "YWxh" },
michael@0 264 { "alb", "YWxi" },
michael@0 265 { "ale", "YWxl" },
michael@0 266 { "Ali", "QWxp" },
michael@0 267 { "all", "YWxs" },
michael@0 268 { "alp", "YWxw" },
michael@0 269 { "A&M", "QSZN" },
michael@0 270 { "AMA", "QU1B" },
michael@0 271 { "ami", "YW1p" },
michael@0 272 { "amp", "YW1w" },
michael@0 273 { "Amy", "QW15" },
michael@0 274 { "amy", "YW15" },
michael@0 275 { "ana", "YW5h" },
michael@0 276 { "and", "YW5k" },
michael@0 277 { "ani", "YW5p" },
michael@0 278 { "Ann", "QW5u" },
michael@0 279 { "ant", "YW50" },
michael@0 280 { "any", "YW55" },
michael@0 281 { "A&P", "QSZQ" },
michael@0 282 { "ape", "YXBl" },
michael@0 283 { "Apr", "QXBy" },
michael@0 284 { "APS", "QVBT" },
michael@0 285 { "apt", "YXB0" },
michael@0 286 { "arc", "YXJj" },
michael@0 287 { "are", "YXJl" },
michael@0 288 { "ark", "YXJr" },
michael@0 289 { "arm", "YXJt" },
michael@0 290 { "art", "YXJ0" },
michael@0 291 { "a's", "YSdz" },
michael@0 292 { "ash", "YXNo" },
michael@0 293 { "ask", "YXNr" },
michael@0 294 { "ass", "YXNz" },
michael@0 295 { "ate", "YXRl" },
michael@0 296 { "Aug", "QXVn" },
michael@0 297 { "auk", "YXVr" },
michael@0 298 { "Ave", "QXZl" },
michael@0 299 { "awe", "YXdl" },
michael@0 300 { "awl", "YXds" },
michael@0 301 { "awn", "YXdu" },
michael@0 302 { "axe", "YXhl" },
michael@0 303 { "aye", "YXll" },
michael@0 304 { "bad", "YmFk" },
michael@0 305 { "bag", "YmFn" },
michael@0 306 { "bah", "YmFo" },
michael@0 307 { "bam", "YmFt" },
michael@0 308 { "ban", "YmFu" },
michael@0 309 { "bar", "YmFy" },
michael@0 310 { "bat", "YmF0" },
michael@0 311 { "bay", "YmF5" },
michael@0 312 { "bed", "YmVk" },
michael@0 313 { "bee", "YmVl" },
michael@0 314 { "beg", "YmVn" },
michael@0 315 { "bel", "YmVs" },
michael@0 316 { "Ben", "QmVu" },
michael@0 317 { "bet", "YmV0" },
michael@0 318 { "bey", "YmV5" },
michael@0 319 { "bib", "Ymli" },
michael@0 320 { "bid", "Ymlk" },
michael@0 321 { "big", "Ymln" },
michael@0 322 { "bin", "Ymlu" },
michael@0 323 { "bit", "Yml0" },
michael@0 324 { "biz", "Yml6" },
michael@0 325 { "BMW", "Qk1X" },
michael@0 326 { "boa", "Ym9h" },
michael@0 327 { "bob", "Ym9i" },
michael@0 328 { "bog", "Ym9n" },
michael@0 329 { "bon", "Ym9u" },
michael@0 330 { "boo", "Ym9v" },
michael@0 331 { "bop", "Ym9w" },
michael@0 332 { "bow", "Ym93" },
michael@0 333 { "box", "Ym94" },
michael@0 334 { "boy", "Ym95" },
michael@0 335 { "b's", "Yidz" },
michael@0 336 { "BTL", "QlRM" },
michael@0 337 { "BTU", "QlRV" },
michael@0 338 { "bub", "YnVi" },
michael@0 339 { "bud", "YnVk" },
michael@0 340 { "bug", "YnVn" },
michael@0 341 { "bum", "YnVt" },
michael@0 342 { "bun", "YnVu" },
michael@0 343 { "bus", "YnVz" },
michael@0 344 { "but", "YnV0" },
michael@0 345 { "buy", "YnV5" },
michael@0 346 { "bye", "Ynll" },
michael@0 347 { "cab", "Y2Fi" },
michael@0 348 { "Cal", "Q2Fs" },
michael@0 349 { "cam", "Y2Ft" },
michael@0 350 { "can", "Y2Fu" },
michael@0 351 { "cap", "Y2Fw" },
michael@0 352 { "car", "Y2Fy" },
michael@0 353 { "cat", "Y2F0" },
michael@0 354 { "caw", "Y2F3" },
michael@0 355 { "CBS", "Q0JT" },
michael@0 356 { "CDC", "Q0RD" },
michael@0 357 { "CEQ", "Q0VR" },
michael@0 358 { "chi", "Y2hp" },
michael@0 359 { "CIA", "Q0lB" },
michael@0 360 { "cit", "Y2l0" },
michael@0 361 { "cod", "Y29k" },
michael@0 362 { "cog", "Y29n" },
michael@0 363 { "col", "Y29s" },
michael@0 364 { "con", "Y29u" },
michael@0 365 { "coo", "Y29v" },
michael@0 366 { "cop", "Y29w" },
michael@0 367 { "cos", "Y29z" },
michael@0 368 { "cot", "Y290" },
michael@0 369 { "cow", "Y293" },
michael@0 370 { "cox", "Y294" },
michael@0 371 { "coy", "Y295" },
michael@0 372 { "CPA", "Q1BB" },
michael@0 373 { "cpu", "Y3B1" },
michael@0 374 { "CRT", "Q1JU" },
michael@0 375 { "cry", "Y3J5" },
michael@0 376 { "c's", "Yydz" },
michael@0 377 { "cub", "Y3Vi" },
michael@0 378 { "cud", "Y3Vk" },
michael@0 379 { "cue", "Y3Vl" },
michael@0 380 { "cup", "Y3Vw" },
michael@0 381 { "cur", "Y3Vy" },
michael@0 382 { "cut", "Y3V0" },
michael@0 383 { "dab", "ZGFi" },
michael@0 384 { "dad", "ZGFk" },
michael@0 385 { "dam", "ZGFt" },
michael@0 386 { "Dan", "RGFu" },
michael@0 387 { "Dar", "RGFy" },
michael@0 388 { "day", "ZGF5" },
michael@0 389 { "Dec", "RGVj" },
michael@0 390 { "Dee", "RGVl" },
michael@0 391 { "Del", "RGVs" },
michael@0 392 { "den", "ZGVu" },
michael@0 393 { "Des", "RGVz" },
michael@0 394 { "dew", "ZGV3" },
michael@0 395 { "dey", "ZGV5" },
michael@0 396 { "did", "ZGlk" },
michael@0 397 { "die", "ZGll" },
michael@0 398 { "dig", "ZGln" },
michael@0 399 { "dim", "ZGlt" },
michael@0 400 { "din", "ZGlu" },
michael@0 401 { "dip", "ZGlw" },
michael@0 402 { "Dis", "RGlz" },
michael@0 403 { "DNA", "RE5B" },
michael@0 404 { "DOD", "RE9E" },
michael@0 405 { "doe", "ZG9l" },
michael@0 406 { "dog", "ZG9n" },
michael@0 407 { "don", "ZG9u" },
michael@0 408 { "dot", "ZG90" },
michael@0 409 { "Dow", "RG93" },
michael@0 410 { "dry", "ZHJ5" },
michael@0 411 { "d's", "ZCdz" },
michael@0 412 { "dub", "ZHVi" },
michael@0 413 { "dud", "ZHVk" },
michael@0 414 { "due", "ZHVl" },
michael@0 415 { "dug", "ZHVn" },
michael@0 416 { "dun", "ZHVu" },
michael@0 417 { "dye", "ZHll" },
michael@0 418 { "ear", "ZWFy" },
michael@0 419 { "eat", "ZWF0" },
michael@0 420 { "ebb", "ZWJi" },
michael@0 421 { "EDT", "RURU" },
michael@0 422 { "eel", "ZWVs" },
michael@0 423 { "eft", "ZWZ0" },
michael@0 424 { "e.g", "ZS5n" },
michael@0 425 { "egg", "ZWdn" },
michael@0 426 { "ego", "ZWdv" },
michael@0 427 { "eke", "ZWtl" },
michael@0 428 { "Eli", "RWxp" },
michael@0 429 { "elk", "ZWxr" },
michael@0 430 { "ell", "ZWxs" },
michael@0 431 { "elm", "ZWxt" },
michael@0 432 { "Ely", "RWx5" },
michael@0 433 { "end", "ZW5k" },
michael@0 434 { "Eng", "RW5n" },
michael@0 435 { "EPA", "RVBB" },
michael@0 436 { "era", "ZXJh" },
michael@0 437 { "ere", "ZXJl" },
michael@0 438 { "erg", "ZXJn" },
michael@0 439 { "err", "ZXJy" },
michael@0 440 { "e's", "ZSdz" },
michael@0 441 { "EST", "RVNU" },
michael@0 442 { "eta", "ZXRh" },
michael@0 443 { "etc", "ZXRj" },
michael@0 444 { "Eva", "RXZh" },
michael@0 445 { "eve", "ZXZl" },
michael@0 446 { "ewe", "ZXdl" },
michael@0 447 { "eye", "ZXll" },
michael@0 448 { "FAA", "RkFB" },
michael@0 449 { "fad", "ZmFk" },
michael@0 450 { "fag", "ZmFn" },
michael@0 451 { "fan", "ZmFu" },
michael@0 452 { "far", "ZmFy" },
michael@0 453 { "fat", "ZmF0" },
michael@0 454 { "fay", "ZmF5" },
michael@0 455 { "FBI", "RkJJ" },
michael@0 456 { "FCC", "RkND" },
michael@0 457 { "FDA", "RkRB" },
michael@0 458 { "Feb", "RmVi" },
michael@0 459 { "fed", "ZmVk" },
michael@0 460 { "fee", "ZmVl" },
michael@0 461 { "few", "ZmV3" },
michael@0 462 { "fib", "Zmli" },
michael@0 463 { "fig", "Zmln" },
michael@0 464 { "fin", "Zmlu" },
michael@0 465 { "fir", "Zmly" },
michael@0 466 { "fit", "Zml0" },
michael@0 467 { "fix", "Zml4" },
michael@0 468 { "Flo", "Rmxv" },
michael@0 469 { "flu", "Zmx1" },
michael@0 470 { "fly", "Zmx5" },
michael@0 471 { "FMC", "Rk1D" },
michael@0 472 { "fob", "Zm9i" },
michael@0 473 { "foe", "Zm9l" },
michael@0 474 { "fog", "Zm9n" },
michael@0 475 { "fop", "Zm9w" },
michael@0 476 { "for", "Zm9y" },
michael@0 477 { "fox", "Zm94" },
michael@0 478 { "FPC", "RlBD" },
michael@0 479 { "fro", "ZnJv" },
michael@0 480 { "fry", "ZnJ5" },
michael@0 481 { "f's", "Zidz" },
michael@0 482 { "FTC", "RlRD" },
michael@0 483 { "fum", "ZnVt" },
michael@0 484 { "fun", "ZnVu" },
michael@0 485 { "fur", "ZnVy" },
michael@0 486 { "gab", "Z2Fi" },
michael@0 487 { "gad", "Z2Fk" },
michael@0 488 { "gag", "Z2Fn" },
michael@0 489 { "gal", "Z2Fs" },
michael@0 490 { "gam", "Z2Ft" },
michael@0 491 { "GAO", "R0FP" },
michael@0 492 { "gap", "Z2Fw" },
michael@0 493 { "gar", "Z2Fy" },
michael@0 494 { "gas", "Z2Fz" },
michael@0 495 { "gay", "Z2F5" },
michael@0 496 { "gee", "Z2Vl" },
michael@0 497 { "gel", "Z2Vs" },
michael@0 498 { "gem", "Z2Vt" },
michael@0 499 { "get", "Z2V0" },
michael@0 500 { "gig", "Z2ln" },
michael@0 501 { "Gil", "R2ls" },
michael@0 502 { "gin", "Z2lu" },
michael@0 503 { "GMT", "R01U" },
michael@0 504 { "GNP", "R05Q" },
michael@0 505 { "gnu", "Z251" },
michael@0 506 { "Goa", "R29h" },
michael@0 507 { "gob", "Z29i" },
michael@0 508 { "god", "Z29k" },
michael@0 509 { "gog", "Z29n" },
michael@0 510 { "GOP", "R09Q" },
michael@0 511 { "got", "Z290" },
michael@0 512 { "GPO", "R1BP" },
michael@0 513 { "g's", "Zydz" },
michael@0 514 { "GSA", "R1NB" },
michael@0 515 { "gum", "Z3Vt" },
michael@0 516 { "gun", "Z3Vu" },
michael@0 517 { "Gus", "R3Vz" },
michael@0 518 { "gut", "Z3V0" },
michael@0 519 { "guy", "Z3V5" },
michael@0 520 { "gym", "Z3lt" },
michael@0 521 { "gyp", "Z3lw" },
michael@0 522 { "had", "aGFk" },
michael@0 523 { "Hal", "SGFs" },
michael@0 524 { "ham", "aGFt" },
michael@0 525 { "Han", "SGFu" },
michael@0 526 { "hap", "aGFw" },
michael@0 527 { "hat", "aGF0" },
michael@0 528 { "haw", "aGF3" },
michael@0 529 { "hay", "aGF5" },
michael@0 530 { "hem", "aGVt" },
michael@0 531 { "hen", "aGVu" },
michael@0 532 { "her", "aGVy" },
michael@0 533 { "hew", "aGV3" },
michael@0 534 { "hex", "aGV4" },
michael@0 535 { "hey", "aGV5" },
michael@0 536 { "hid", "aGlk" },
michael@0 537 { "him", "aGlt" },
michael@0 538 { "hip", "aGlw" },
michael@0 539 { "his", "aGlz" },
michael@0 540 { "hit", "aGl0" },
michael@0 541 { "hob", "aG9i" },
michael@0 542 { "hoc", "aG9j" },
michael@0 543 { "hoe", "aG9l" },
michael@0 544 { "hog", "aG9n" },
michael@0 545 { "hoi", "aG9p" },
michael@0 546 { "Hom", "SG9t" },
michael@0 547 { "hop", "aG9w" },
michael@0 548 { "hot", "aG90" },
michael@0 549 { "how", "aG93" },
michael@0 550 { "hoy", "aG95" },
michael@0 551 { "h's", "aCdz" },
michael@0 552 { "hub", "aHVi" },
michael@0 553 { "hue", "aHVl" },
michael@0 554 { "hug", "aHVn" },
michael@0 555 { "huh", "aHVo" },
michael@0 556 { "hum", "aHVt" },
michael@0 557 { "Hun", "SHVu" },
michael@0 558 { "hut", "aHV0" },
michael@0 559 { "Ian", "SWFu" },
michael@0 560 { "IBM", "SUJN" },
michael@0 561 { "Ibn", "SWJu" },
michael@0 562 { "ICC", "SUND" },
michael@0 563 { "ice", "aWNl" },
michael@0 564 { "icy", "aWN5" },
michael@0 565 { "I'd", "SSdk" },
michael@0 566 { "Ida", "SWRh" },
michael@0 567 { "i.e", "aS5l" },
michael@0 568 { "iii", "aWlp" },
michael@0 569 { "Ike", "SWtl" },
michael@0 570 { "ill", "aWxs" },
michael@0 571 { "I'm", "SSdt" },
michael@0 572 { "imp", "aW1w" },
michael@0 573 { "Inc", "SW5j" },
michael@0 574 { "ink", "aW5r" },
michael@0 575 { "inn", "aW5u" },
michael@0 576 { "ion", "aW9u" },
michael@0 577 { "Ira", "SXJh" },
michael@0 578 { "ire", "aXJl" },
michael@0 579 { "irk", "aXJr" },
michael@0 580 { "IRS", "SVJT" },
michael@0 581 { "i's", "aSdz" },
michael@0 582 { "Ito", "SXRv" },
michael@0 583 { "ITT", "SVRU" },
michael@0 584 { "ivy", "aXZ5" },
michael@0 585 { "jab", "amFi" },
michael@0 586 { "jag", "amFn" },
michael@0 587 { "jam", "amFt" },
michael@0 588 { "Jan", "SmFu" },
michael@0 589 { "jar", "amFy" },
michael@0 590 { "jaw", "amF3" },
michael@0 591 { "jay", "amF5" },
michael@0 592 { "Jed", "SmVk" },
michael@0 593 { "jet", "amV0" },
michael@0 594 { "Jew", "SmV3" },
michael@0 595 { "jig", "amln" },
michael@0 596 { "Jim", "Smlt" },
michael@0 597 { "job", "am9i" },
michael@0 598 { "Joe", "Sm9l" },
michael@0 599 { "jog", "am9n" },
michael@0 600 { "Jon", "Sm9u" },
michael@0 601 { "jot", "am90" },
michael@0 602 { "joy", "am95" },
michael@0 603 { "j's", "aidz" },
michael@0 604 { "jug", "anVn" },
michael@0 605 { "jut", "anV0" },
michael@0 606 { "Kay", "S2F5" },
michael@0 607 { "keg", "a2Vn" },
michael@0 608 { "ken", "a2Vu" },
michael@0 609 { "key", "a2V5" },
michael@0 610 { "kid", "a2lk" },
michael@0 611 { "Kim", "S2lt" },
michael@0 612 { "kin", "a2lu" },
michael@0 613 { "kit", "a2l0" },
michael@0 614 { "k's", "aydz" },
michael@0 615 { "lab", "bGFi" },
michael@0 616 { "lac", "bGFj" },
michael@0 617 { "lad", "bGFk" },
michael@0 618 { "lag", "bGFn" },
michael@0 619 { "lam", "bGFt" },
michael@0 620 { "Lao", "TGFv" },
michael@0 621 { "lap", "bGFw" },
michael@0 622 { "law", "bGF3" },
michael@0 623 { "lax", "bGF4" },
michael@0 624 { "lay", "bGF5" },
michael@0 625 { "lea", "bGVh" },
michael@0 626 { "led", "bGVk" },
michael@0 627 { "lee", "bGVl" },
michael@0 628 { "leg", "bGVn" },
michael@0 629 { "Len", "TGVu" },
michael@0 630 { "Leo", "TGVv" },
michael@0 631 { "let", "bGV0" },
michael@0 632 { "Lev", "TGV2" },
michael@0 633 { "Lew", "TGV3" },
michael@0 634 { "lew", "bGV3" },
michael@0 635 { "lid", "bGlk" },
michael@0 636 { "lie", "bGll" },
michael@0 637 { "lim", "bGlt" },
michael@0 638 { "Lin", "TGlu" },
michael@0 639 { "lip", "bGlw" },
michael@0 640 { "lit", "bGl0" },
michael@0 641 { "Liz", "TGl6" },
michael@0 642 { "lob", "bG9i" },
michael@0 643 { "log", "bG9n" },
michael@0 644 { "lop", "bG9w" },
michael@0 645 { "Los", "TG9z" },
michael@0 646 { "lot", "bG90" },
michael@0 647 { "Lou", "TG91" },
michael@0 648 { "low", "bG93" },
michael@0 649 { "loy", "bG95" },
michael@0 650 { "l's", "bCdz" },
michael@0 651 { "LSI", "TFNJ" },
michael@0 652 { "Ltd", "THRk" },
michael@0 653 { "LTV", "TFRW" },
michael@0 654 { "lug", "bHVn" },
michael@0 655 { "lux", "bHV4" },
michael@0 656 { "lye", "bHll" },
michael@0 657 { "Mac", "TWFj" },
michael@0 658 { "mad", "bWFk" },
michael@0 659 { "Mae", "TWFl" },
michael@0 660 { "man", "bWFu" },
michael@0 661 { "Mao", "TWFv" },
michael@0 662 { "map", "bWFw" },
michael@0 663 { "mar", "bWFy" },
michael@0 664 { "mat", "bWF0" },
michael@0 665 { "maw", "bWF3" },
michael@0 666 { "Max", "TWF4" },
michael@0 667 { "max", "bWF4" },
michael@0 668 { "may", "bWF5" },
michael@0 669 { "MBA", "TUJB" },
michael@0 670 { "Meg", "TWVn" },
michael@0 671 { "Mel", "TWVs" },
michael@0 672 { "men", "bWVu" },
michael@0 673 { "met", "bWV0" },
michael@0 674 { "mew", "bWV3" },
michael@0 675 { "mid", "bWlk" },
michael@0 676 { "mig", "bWln" },
michael@0 677 { "min", "bWlu" },
michael@0 678 { "MIT", "TUlU" },
michael@0 679 { "mix", "bWl4" },
michael@0 680 { "mob", "bW9i" },
michael@0 681 { "Moe", "TW9l" },
michael@0 682 { "moo", "bW9v" },
michael@0 683 { "mop", "bW9w" },
michael@0 684 { "mot", "bW90" },
michael@0 685 { "mow", "bW93" },
michael@0 686 { "MPH", "TVBI" },
michael@0 687 { "Mrs", "TXJz" },
michael@0 688 { "m's", "bSdz" },
michael@0 689 { "mud", "bXVk" },
michael@0 690 { "mug", "bXVn" },
michael@0 691 { "mum", "bXVt" },
michael@0 692 { "nab", "bmFi" },
michael@0 693 { "nag", "bmFn" },
michael@0 694 { "Nan", "TmFu" },
michael@0 695 { "nap", "bmFw" },
michael@0 696 { "Nat", "TmF0" },
michael@0 697 { "nay", "bmF5" },
michael@0 698 { "NBC", "TkJD" },
michael@0 699 { "NBS", "TkJT" },
michael@0 700 { "NCO", "TkNP" },
michael@0 701 { "NCR", "TkNS" },
michael@0 702 { "Ned", "TmVk" },
michael@0 703 { "nee", "bmVl" },
michael@0 704 { "net", "bmV0" },
michael@0 705 { "new", "bmV3" },
michael@0 706 { "nib", "bmli" },
michael@0 707 { "NIH", "TklI" },
michael@0 708 { "nil", "bmls" },
michael@0 709 { "nip", "bmlw" },
michael@0 710 { "nit", "bml0" },
michael@0 711 { "NNE", "Tk5F" },
michael@0 712 { "NNW", "Tk5X" },
michael@0 713 { "nob", "bm9i" },
michael@0 714 { "nod", "bm9k" },
michael@0 715 { "non", "bm9u" },
michael@0 716 { "nor", "bm9y" },
michael@0 717 { "not", "bm90" },
michael@0 718 { "Nov", "Tm92" },
michael@0 719 { "now", "bm93" },
michael@0 720 { "NRC", "TlJD" },
michael@0 721 { "n's", "bidz" },
michael@0 722 { "NSF", "TlNG" },
michael@0 723 { "nun", "bnVu" },
michael@0 724 { "nut", "bnV0" },
michael@0 725 { "NYC", "TllD" },
michael@0 726 { "NYU", "TllV" },
michael@0 727 { "oaf", "b2Fm" },
michael@0 728 { "oak", "b2Fr" },
michael@0 729 { "oar", "b2Fy" },
michael@0 730 { "oat", "b2F0" },
michael@0 731 { "Oct", "T2N0" },
michael@0 732 { "odd", "b2Rk" },
michael@0 733 { "ode", "b2Rl" },
michael@0 734 { "off", "b2Zm" },
michael@0 735 { "oft", "b2Z0" },
michael@0 736 { "ohm", "b2ht" },
michael@0 737 { "oil", "b2ls" },
michael@0 738 { "old", "b2xk" },
michael@0 739 { "one", "b25l" },
michael@0 740 { "opt", "b3B0" },
michael@0 741 { "orb", "b3Ji" },
michael@0 742 { "ore", "b3Jl" },
michael@0 743 { "Orr", "T3Jy" },
michael@0 744 { "o's", "bydz" },
michael@0 745 { "Ott", "T3R0" },
michael@0 746 { "our", "b3Vy" },
michael@0 747 { "out", "b3V0" },
michael@0 748 { "ova", "b3Zh" },
michael@0 749 { "owe", "b3dl" },
michael@0 750 { "owl", "b3ds" },
michael@0 751 { "own", "b3du" },
michael@0 752 { "pad", "cGFk" },
michael@0 753 { "pal", "cGFs" },
michael@0 754 { "Pam", "UGFt" },
michael@0 755 { "pan", "cGFu" },
michael@0 756 { "pap", "cGFw" },
michael@0 757 { "par", "cGFy" },
michael@0 758 { "pat", "cGF0" },
michael@0 759 { "paw", "cGF3" },
michael@0 760 { "pax", "cGF4" },
michael@0 761 { "pay", "cGF5" },
michael@0 762 { "Paz", "UGF6" },
michael@0 763 { "PBS", "UEJT" },
michael@0 764 { "PDP", "UERQ" },
michael@0 765 { "pea", "cGVh" },
michael@0 766 { "pee", "cGVl" },
michael@0 767 { "peg", "cGVn" },
michael@0 768 { "pen", "cGVu" },
michael@0 769 { "pep", "cGVw" },
michael@0 770 { "per", "cGVy" },
michael@0 771 { "pet", "cGV0" },
michael@0 772 { "pew", "cGV3" },
michael@0 773 { "PhD", "UGhE" },
michael@0 774 { "phi", "cGhp" },
michael@0 775 { "pie", "cGll" },
michael@0 776 { "pig", "cGln" },
michael@0 777 { "pin", "cGlu" },
michael@0 778 { "pip", "cGlw" },
michael@0 779 { "pit", "cGl0" },
michael@0 780 { "ply", "cGx5" },
michael@0 781 { "pod", "cG9k" },
michael@0 782 { "Poe", "UG9l" },
michael@0 783 { "poi", "cG9p" },
michael@0 784 { "pol", "cG9s" },
michael@0 785 { "pop", "cG9w" },
michael@0 786 { "pot", "cG90" },
michael@0 787 { "pow", "cG93" },
michael@0 788 { "ppm", "cHBt" },
michael@0 789 { "pro", "cHJv" },
michael@0 790 { "pry", "cHJ5" },
michael@0 791 { "p's", "cCdz" },
michael@0 792 { "psi", "cHNp" },
michael@0 793 { "PTA", "UFRB" },
michael@0 794 { "pub", "cHVi" },
michael@0 795 { "PUC", "UFVD" },
michael@0 796 { "pug", "cHVn" },
michael@0 797 { "pun", "cHVu" },
michael@0 798 { "pup", "cHVw" },
michael@0 799 { "pus", "cHVz" },
michael@0 800 { "put", "cHV0" },
michael@0 801 { "PVC", "UFZD" },
michael@0 802 { "QED", "UUVE" },
michael@0 803 { "q's", "cSdz" },
michael@0 804 { "qua", "cXVh" },
michael@0 805 { "quo", "cXVv" },
michael@0 806 { "Rae", "UmFl" },
michael@0 807 { "rag", "cmFn" },
michael@0 808 { "raj", "cmFq" },
michael@0 809 { "ram", "cmFt" },
michael@0 810 { "ran", "cmFu" },
michael@0 811 { "rap", "cmFw" },
michael@0 812 { "rat", "cmF0" },
michael@0 813 { "raw", "cmF3" },
michael@0 814 { "ray", "cmF5" },
michael@0 815 { "RCA", "UkNB" },
michael@0 816 { "R&D", "UiZE" },
michael@0 817 { "reb", "cmVi" },
michael@0 818 { "red", "cmVk" },
michael@0 819 { "rep", "cmVw" },
michael@0 820 { "ret", "cmV0" },
michael@0 821 { "rev", "cmV2" },
michael@0 822 { "Rex", "UmV4" },
michael@0 823 { "rho", "cmhv" },
michael@0 824 { "rib", "cmli" },
michael@0 825 { "rid", "cmlk" },
michael@0 826 { "rig", "cmln" },
michael@0 827 { "rim", "cmlt" },
michael@0 828 { "Rio", "Umlv" },
michael@0 829 { "rip", "cmlw" },
michael@0 830 { "RNA", "Uk5B" },
michael@0 831 { "rob", "cm9i" },
michael@0 832 { "rod", "cm9k" },
michael@0 833 { "roe", "cm9l" },
michael@0 834 { "Ron", "Um9u" },
michael@0 835 { "rot", "cm90" },
michael@0 836 { "row", "cm93" },
michael@0 837 { "Roy", "Um95" },
michael@0 838 { "RPM", "UlBN" },
michael@0 839 { "r's", "cidz" },
michael@0 840 { "rub", "cnVi" },
michael@0 841 { "rue", "cnVl" },
michael@0 842 { "rug", "cnVn" },
michael@0 843 { "rum", "cnVt" },
michael@0 844 { "run", "cnVu" },
michael@0 845 { "rut", "cnV0" },
michael@0 846 { "rye", "cnll" },
michael@0 847 { "sac", "c2Fj" },
michael@0 848 { "sad", "c2Fk" },
michael@0 849 { "sag", "c2Fn" },
michael@0 850 { "Sal", "U2Fs" },
michael@0 851 { "Sam", "U2Ft" },
michael@0 852 { "San", "U2Fu" },
michael@0 853 { "Sao", "U2Fv" },
michael@0 854 { "sap", "c2Fw" },
michael@0 855 { "sat", "c2F0" },
michael@0 856 { "saw", "c2F3" },
michael@0 857 { "sax", "c2F4" },
michael@0 858 { "say", "c2F5" },
michael@0 859 { "Sci", "U2Np" },
michael@0 860 { "SCM", "U0NN" },
michael@0 861 { "sea", "c2Vh" },
michael@0 862 { "sec", "c2Vj" },
michael@0 863 { "see", "c2Vl" },
michael@0 864 { "sen", "c2Vu" },
michael@0 865 { "seq", "c2Vx" },
michael@0 866 { "set", "c2V0" },
michael@0 867 { "sew", "c2V3" },
michael@0 868 { "sex", "c2V4" },
michael@0 869 { "she", "c2hl" },
michael@0 870 { "Shu", "U2h1" },
michael@0 871 { "shy", "c2h5" },
michael@0 872 { "sib", "c2li" },
michael@0 873 { "sic", "c2lj" },
michael@0 874 { "sin", "c2lu" },
michael@0 875 { "sip", "c2lw" },
michael@0 876 { "sir", "c2ly" },
michael@0 877 { "sis", "c2lz" },
michael@0 878 { "sit", "c2l0" },
michael@0 879 { "six", "c2l4" },
michael@0 880 { "ski", "c2tp" },
michael@0 881 { "sky", "c2t5" },
michael@0 882 { "sly", "c2x5" },
michael@0 883 { "sob", "c29i" },
michael@0 884 { "Soc", "U29j" },
michael@0 885 { "sod", "c29k" },
michael@0 886 { "Sol", "U29s" },
michael@0 887 { "son", "c29u" },
michael@0 888 { "sop", "c29w" },
michael@0 889 { "sou", "c291" },
michael@0 890 { "sow", "c293" },
michael@0 891 { "soy", "c295" },
michael@0 892 { "spa", "c3Bh" },
michael@0 893 { "spy", "c3B5" },
michael@0 894 { "Sri", "U3Jp" },
michael@0 895 { "s's", "cydz" },
michael@0 896 { "SSE", "U1NF" },
michael@0 897 { "SST", "U1NU" },
michael@0 898 { "SSW", "U1NX" },
michael@0 899 { "Stu", "U3R1" },
michael@0 900 { "sub", "c3Vi" },
michael@0 901 { "sud", "c3Vk" },
michael@0 902 { "sue", "c3Vl" },
michael@0 903 { "sum", "c3Vt" },
michael@0 904 { "sun", "c3Vu" },
michael@0 905 { "sup", "c3Vw" },
michael@0 906 { "Sus", "U3Vz" },
michael@0 907 { "tab", "dGFi" },
michael@0 908 { "tad", "dGFk" },
michael@0 909 { "tag", "dGFn" },
michael@0 910 { "tam", "dGFt" },
michael@0 911 { "tan", "dGFu" },
michael@0 912 { "tao", "dGFv" },
michael@0 913 { "tap", "dGFw" },
michael@0 914 { "tar", "dGFy" },
michael@0 915 { "tat", "dGF0" },
michael@0 916 { "tau", "dGF1" },
michael@0 917 { "tax", "dGF4" },
michael@0 918 { "tea", "dGVh" },
michael@0 919 { "Ted", "VGVk" },
michael@0 920 { "ted", "dGVk" },
michael@0 921 { "tee", "dGVl" },
michael@0 922 { "Tel", "VGVs" },
michael@0 923 { "ten", "dGVu" },
michael@0 924 { "the", "dGhl" },
michael@0 925 { "thy", "dGh5" },
michael@0 926 { "tic", "dGlj" },
michael@0 927 { "tid", "dGlk" },
michael@0 928 { "tie", "dGll" },
michael@0 929 { "til", "dGls" },
michael@0 930 { "Tim", "VGlt" },
michael@0 931 { "tin", "dGlu" },
michael@0 932 { "tip", "dGlw" },
michael@0 933 { "tit", "dGl0" },
michael@0 934 { "TNT", "VE5U" },
michael@0 935 { "toe", "dG9l" },
michael@0 936 { "tog", "dG9n" },
michael@0 937 { "Tom", "VG9t" },
michael@0 938 { "ton", "dG9u" },
michael@0 939 { "too", "dG9v" },
michael@0 940 { "top", "dG9w" },
michael@0 941 { "tor", "dG9y" },
michael@0 942 { "tot", "dG90" },
michael@0 943 { "tow", "dG93" },
michael@0 944 { "toy", "dG95" },
michael@0 945 { "TRW", "VFJX" },
michael@0 946 { "try", "dHJ5" },
michael@0 947 { "t's", "dCdz" },
michael@0 948 { "TTL", "VFRM" },
michael@0 949 { "TTY", "VFRZ" },
michael@0 950 { "tub", "dHVi" },
michael@0 951 { "tug", "dHVn" },
michael@0 952 { "tum", "dHVt" },
michael@0 953 { "tun", "dHVu" },
michael@0 954 { "TVA", "VFZB" },
michael@0 955 { "TWA", "VFdB" },
michael@0 956 { "two", "dHdv" },
michael@0 957 { "TWX", "VFdY" },
michael@0 958 { "ugh", "dWdo" },
michael@0 959 { "UHF", "VUhG" },
michael@0 960 { "Uri", "VXJp" },
michael@0 961 { "urn", "dXJu" },
michael@0 962 { "U.S", "VS5T" },
michael@0 963 { "u's", "dSdz" },
michael@0 964 { "USA", "VVNB" },
michael@0 965 { "USC", "VVND" },
michael@0 966 { "use", "dXNl" },
michael@0 967 { "USN", "VVNO" },
michael@0 968 { "van", "dmFu" },
michael@0 969 { "vat", "dmF0" },
michael@0 970 { "vee", "dmVl" },
michael@0 971 { "vet", "dmV0" },
michael@0 972 { "vex", "dmV4" },
michael@0 973 { "VHF", "VkhG" },
michael@0 974 { "via", "dmlh" },
michael@0 975 { "vie", "dmll" },
michael@0 976 { "vii", "dmlp" },
michael@0 977 { "vis", "dmlz" },
michael@0 978 { "viz", "dml6" },
michael@0 979 { "von", "dm9u" },
michael@0 980 { "vow", "dm93" },
michael@0 981 { "v's", "didz" },
michael@0 982 { "WAC", "V0FD" },
michael@0 983 { "wad", "d2Fk" },
michael@0 984 { "wag", "d2Fn" },
michael@0 985 { "wah", "d2Fo" },
michael@0 986 { "wan", "d2Fu" },
michael@0 987 { "war", "d2Fy" },
michael@0 988 { "was", "d2Fz" },
michael@0 989 { "wax", "d2F4" },
michael@0 990 { "way", "d2F5" },
michael@0 991 { "web", "d2Vi" },
michael@0 992 { "wed", "d2Vk" },
michael@0 993 { "wee", "d2Vl" },
michael@0 994 { "Wei", "V2Vp" },
michael@0 995 { "wet", "d2V0" },
michael@0 996 { "who", "d2hv" },
michael@0 997 { "why", "d2h5" },
michael@0 998 { "wig", "d2ln" },
michael@0 999 { "win", "d2lu" },
michael@0 1000 { "wit", "d2l0" },
michael@0 1001 { "woe", "d29l" },
michael@0 1002 { "wok", "d29r" },
michael@0 1003 { "won", "d29u" },
michael@0 1004 { "woo", "d29v" },
michael@0 1005 { "wop", "d29w" },
michael@0 1006 { "wow", "d293" },
michael@0 1007 { "wry", "d3J5" },
michael@0 1008 { "w's", "dydz" },
michael@0 1009 { "x's", "eCdz" },
michael@0 1010 { "yah", "eWFo" },
michael@0 1011 { "yak", "eWFr" },
michael@0 1012 { "yam", "eWFt" },
michael@0 1013 { "yap", "eWFw" },
michael@0 1014 { "yaw", "eWF3" },
michael@0 1015 { "yea", "eWVh" },
michael@0 1016 { "yen", "eWVu" },
michael@0 1017 { "yet", "eWV0" },
michael@0 1018 { "yin", "eWlu" },
michael@0 1019 { "yip", "eWlw" },
michael@0 1020 { "yon", "eW9u" },
michael@0 1021 { "you", "eW91" },
michael@0 1022 { "yow", "eW93" },
michael@0 1023 { "y's", "eSdz" },
michael@0 1024 { "yuh", "eXVo" },
michael@0 1025 { "zag", "emFn" },
michael@0 1026 { "Zan", "WmFu" },
michael@0 1027 { "zap", "emFw" },
michael@0 1028 { "Zen", "WmVu" },
michael@0 1029 { "zig", "emln" },
michael@0 1030 { "zip", "emlw" },
michael@0 1031 { "Zoe", "Wm9l" },
michael@0 1032 { "zoo", "em9v" },
michael@0 1033 { "z's", "eidz" },
michael@0 1034 /* the false rumors file */
michael@0 1035 { "\"So when I die, the first thing I will see in heaven is a score list?\"",
michael@0 1036 "IlNvIHdoZW4gSSBkaWUsIHRoZSBmaXJzdCB0aGluZyBJIHdpbGwgc2VlIGluIGhlYXZlbiBpcyBhIHNjb3JlIGxpc3Q/Ig==" },
michael@0 1037 { "1st Law of Hacking: leaving is much more difficult than entering.",
michael@0 1038 "MXN0IExhdyBvZiBIYWNraW5nOiBsZWF2aW5nIGlzIG11Y2ggbW9yZSBkaWZmaWN1bHQgdGhhbiBlbnRlcmluZy4=" },
michael@0 1039 { "2nd Law of Hacking: first in, first out.",
michael@0 1040 "Mm5kIExhdyBvZiBIYWNraW5nOiBmaXJzdCBpbiwgZmlyc3Qgb3V0Lg==" },
michael@0 1041 { "3rd Law of Hacking: the last blow counts most.",
michael@0 1042 "M3JkIExhdyBvZiBIYWNraW5nOiB0aGUgbGFzdCBibG93IGNvdW50cyBtb3N0Lg==" },
michael@0 1043 { "4th Law of Hacking: you will find the exit at the entrance.",
michael@0 1044 "NHRoIExhdyBvZiBIYWNraW5nOiB5b3Ugd2lsbCBmaW5kIHRoZSBleGl0IGF0IHRoZSBlbnRyYW5jZS4=" },
michael@0 1045 { "A chameleon imitating a mail daemon often delivers scrolls of fire.",
michael@0 1046 "QSBjaGFtZWxlb24gaW1pdGF0aW5nIGEgbWFpbCBkYWVtb24gb2Z0ZW4gZGVsaXZlcnMgc2Nyb2xscyBvZiBmaXJlLg==" },
michael@0 1047 { "A cockatrice corpse is guaranteed to be untainted!",
michael@0 1048 "QSBjb2NrYXRyaWNlIGNvcnBzZSBpcyBndWFyYW50ZWVkIHRvIGJlIHVudGFpbnRlZCE=" },
michael@0 1049 { "A dead cockatrice is just a dead lizard.",
michael@0 1050 "QSBkZWFkIGNvY2thdHJpY2UgaXMganVzdCBhIGRlYWQgbGl6YXJkLg==" },
michael@0 1051 { "A dragon is just a snake that ate a scroll of fire.",
michael@0 1052 "QSBkcmFnb24gaXMganVzdCBhIHNuYWtlIHRoYXQgYXRlIGEgc2Nyb2xsIG9mIGZpcmUu" },
michael@0 1053 { "A fading corridor enlightens your insight.",
michael@0 1054 "QSBmYWRpbmcgY29ycmlkb3IgZW5saWdodGVucyB5b3VyIGluc2lnaHQu" },
michael@0 1055 { "A glowing potion is too hot to drink.",
michael@0 1056 "QSBnbG93aW5nIHBvdGlvbiBpcyB0b28gaG90IHRvIGRyaW5rLg==" },
michael@0 1057 { "A good amulet may protect you against guards.",
michael@0 1058 "QSBnb29kIGFtdWxldCBtYXkgcHJvdGVjdCB5b3UgYWdhaW5zdCBndWFyZHMu" },
michael@0 1059 { "A lizard corpse is a good thing to turn undead.",
michael@0 1060 "QSBsaXphcmQgY29ycHNlIGlzIGEgZ29vZCB0aGluZyB0byB0dXJuIHVuZGVhZC4=" },
michael@0 1061 { "A long worm can be defined recursively. So how should you attack it?",
michael@0 1062 "QSBsb25nIHdvcm0gY2FuIGJlIGRlZmluZWQgcmVjdXJzaXZlbHkuIFNvIGhvdyBzaG91bGQgeW91IGF0dGFjayBpdD8=" },
michael@0 1063 { "A monstrous mind is a toy forever.",
michael@0 1064 "QSBtb25zdHJvdXMgbWluZCBpcyBhIHRveSBmb3JldmVyLg==" },
michael@0 1065 { "A nymph will be very pleased if you call her by her real name: Lorelei.",
michael@0 1066 "QSBueW1waCB3aWxsIGJlIHZlcnkgcGxlYXNlZCBpZiB5b3UgY2FsbCBoZXIgYnkgaGVyIHJlYWwgbmFtZTogTG9yZWxlaS4=" },
michael@0 1067 { "A ring of dungeon master control is a great find.",
michael@0 1068 "QSByaW5nIG9mIGR1bmdlb24gbWFzdGVyIGNvbnRyb2wgaXMgYSBncmVhdCBmaW5kLg==" },
michael@0 1069 { "A ring of extra ring finger is useless if not enchanted.",
michael@0 1070 "QSByaW5nIG9mIGV4dHJhIHJpbmcgZmluZ2VyIGlzIHVzZWxlc3MgaWYgbm90IGVuY2hhbnRlZC4=" },
michael@0 1071 { "A rope may form a trail in a maze.",
michael@0 1072 "QSByb3BlIG1heSBmb3JtIGEgdHJhaWwgaW4gYSBtYXplLg==" },
michael@0 1073 { "A staff may recharge if you drop it for awhile.",
michael@0 1074 "QSBzdGFmZiBtYXkgcmVjaGFyZ2UgaWYgeW91IGRyb3AgaXQgZm9yIGF3aGlsZS4=" },
michael@0 1075 { "A visit to the Zoo is very educational; you meet interesting animals.",
michael@0 1076 "QSB2aXNpdCB0byB0aGUgWm9vIGlzIHZlcnkgZWR1Y2F0aW9uYWw7IHlvdSBtZWV0IGludGVyZXN0aW5nIGFuaW1hbHMu" },
michael@0 1077 { "A wand of deaf is a more dangerous weapon than a wand of sheep.",
michael@0 1078 "QSB3YW5kIG9mIGRlYWYgaXMgYSBtb3JlIGRhbmdlcm91cyB3ZWFwb24gdGhhbiBhIHdhbmQgb2Ygc2hlZXAu" },
michael@0 1079 { "A wand of vibration might bring the whole cave crashing about your ears.",
michael@0 1080 "QSB3YW5kIG9mIHZpYnJhdGlvbiBtaWdodCBicmluZyB0aGUgd2hvbGUgY2F2ZSBjcmFzaGluZyBhYm91dCB5b3VyIGVhcnMu" },
michael@0 1081 { "A winner never quits. A quitter never wins.",
michael@0 1082 "QSB3aW5uZXIgbmV2ZXIgcXVpdHMuIEEgcXVpdHRlciBuZXZlciB3aW5zLg==" },
michael@0 1083 { "A wish? Okay, make me a fortune cookie!",
michael@0 1084 "QSB3aXNoPyBPa2F5LCBtYWtlIG1lIGEgZm9ydHVuZSBjb29raWUh" },
michael@0 1085 { "Afraid of mimics? Try to wear a ring of true seeing.",
michael@0 1086 "QWZyYWlkIG9mIG1pbWljcz8gVHJ5IHRvIHdlYXIgYSByaW5nIG9mIHRydWUgc2VlaW5nLg==" },
michael@0 1087 { "All monsters are created evil, but some are more evil than others.",
michael@0 1088 "QWxsIG1vbnN0ZXJzIGFyZSBjcmVhdGVkIGV2aWwsIGJ1dCBzb21lIGFyZSBtb3JlIGV2aWwgdGhhbiBvdGhlcnMu" },
michael@0 1089 { "Always attack a floating eye from behind!",
michael@0 1090 "QWx3YXlzIGF0dGFjayBhIGZsb2F0aW5nIGV5ZSBmcm9tIGJlaGluZCE=" },
michael@0 1091 { "An elven cloak is always the height of fashion.",
michael@0 1092 "QW4gZWx2ZW4gY2xvYWsgaXMgYWx3YXlzIHRoZSBoZWlnaHQgb2YgZmFzaGlvbi4=" },
michael@0 1093 { "Any small object that is accidentally dropped will hide under a larger object.",
michael@0 1094 "QW55IHNtYWxsIG9iamVjdCB0aGF0IGlzIGFjY2lkZW50YWxseSBkcm9wcGVkIHdpbGwgaGlkZSB1bmRlciBhIGxhcmdlciBvYmplY3Qu" },
michael@0 1095 { "Balrogs do not appear above level 20.",
michael@0 1096 "QmFscm9ncyBkbyBub3QgYXBwZWFyIGFib3ZlIGxldmVsIDIwLg==" },
michael@0 1097 { "Banana peels work especially well against Keystone Kops.",
michael@0 1098 "QmFuYW5hIHBlZWxzIHdvcmsgZXNwZWNpYWxseSB3ZWxsIGFnYWluc3QgS2V5c3RvbmUgS29wcy4=" },
michael@0 1099 { "Be careful when eating bananas. Monsters might slip on the peels.",
michael@0 1100 "QmUgY2FyZWZ1bCB3aGVuIGVhdGluZyBiYW5hbmFzLiBNb25zdGVycyBtaWdodCBzbGlwIG9uIHRoZSBwZWVscy4=" },
michael@0 1101 { "Better leave the dungeon; otherwise you might get hurt badly.",
michael@0 1102 "QmV0dGVyIGxlYXZlIHRoZSBkdW5nZW9uOyBvdGhlcndpc2UgeW91IG1pZ2h0IGdldCBodXJ0IGJhZGx5Lg==" },
michael@0 1103 { "Beware of the potion of nitroglycerin -- it's not for the weak of heart.",
michael@0 1104 "QmV3YXJlIG9mIHRoZSBwb3Rpb24gb2Ygbml0cm9nbHljZXJpbiAtLSBpdCdzIG5vdCBmb3IgdGhlIHdlYWsgb2YgaGVhcnQu" },
michael@0 1105 { "Beware: there's always a chance that your wand explodes as you try to zap it!",
michael@0 1106 "QmV3YXJlOiB0aGVyZSdzIGFsd2F5cyBhIGNoYW5jZSB0aGF0IHlvdXIgd2FuZCBleHBsb2RlcyBhcyB5b3UgdHJ5IHRvIHphcCBpdCE=" },
michael@0 1107 { "Beyond the 23rd level lies a happy retirement in a room of your own.",
michael@0 1108 "QmV5b25kIHRoZSAyM3JkIGxldmVsIGxpZXMgYSBoYXBweSByZXRpcmVtZW50IGluIGEgcm9vbSBvZiB5b3VyIG93bi4=" },
michael@0 1109 { "Changing your suit without dropping your sword? You must be kidding!",
michael@0 1110 "Q2hhbmdpbmcgeW91ciBzdWl0IHdpdGhvdXQgZHJvcHBpbmcgeW91ciBzd29yZD8gWW91IG11c3QgYmUga2lkZGluZyE=" },
michael@0 1111 { "Cockatrices might turn themselves to stone faced with a mirror.",
michael@0 1112 "Q29ja2F0cmljZXMgbWlnaHQgdHVybiB0aGVtc2VsdmVzIHRvIHN0b25lIGZhY2VkIHdpdGggYSBtaXJyb3Iu" },
michael@0 1113 { "Consumption of home-made food is strictly forbidden in this dungeon.",
michael@0 1114 "Q29uc3VtcHRpb24gb2YgaG9tZS1tYWRlIGZvb2QgaXMgc3RyaWN0bHkgZm9yYmlkZGVuIGluIHRoaXMgZHVuZ2Vvbi4=" },
michael@0 1115 { "Dark room? Your chance to develop your photographs!",
michael@0 1116 "RGFyayByb29tPyBZb3VyIGNoYW5jZSB0byBkZXZlbG9wIHlvdXIgcGhvdG9ncmFwaHMh" },
michael@0 1117 { "Dark rooms are not *completely* dark: just wait and let your eyes adjust...",
michael@0 1118 "RGFyayByb29tcyBhcmUgbm90ICpjb21wbGV0ZWx5KiBkYXJrOiBqdXN0IHdhaXQgYW5kIGxldCB5b3VyIGV5ZXMgYWRqdXN0Li4u" },
michael@0 1119 { "David London sez, \"Hey guys, *WIELD* a lizard corpse against a cockatrice!\"",
michael@0 1120 "RGF2aWQgTG9uZG9uIHNleiwgIkhleSBndXlzLCAqV0lFTEQqIGEgbGl6YXJkIGNvcnBzZSBhZ2FpbnN0IGEgY29ja2F0cmljZSEi" },
michael@0 1121 { "Death is just life's way of telling you you've been fired.",
michael@0 1122 "RGVhdGggaXMganVzdCBsaWZlJ3Mgd2F5IG9mIHRlbGxpbmcgeW91IHlvdSd2ZSBiZWVuIGZpcmVkLg==" },
michael@0 1123 { "Demi-gods don't need any help from the gods.",
michael@0 1124 "RGVtaS1nb2RzIGRvbid0IG5lZWQgYW55IGhlbHAgZnJvbSB0aGUgZ29kcy4=" },
michael@0 1125 { "Demons *HATE* Priests and Priestesses.",
michael@0 1126 "RGVtb25zICpIQVRFKiBQcmllc3RzIGFuZCBQcmllc3Rlc3Nlcy4=" },
michael@0 1127 { "Didn't you forget to pay?",
michael@0 1128 "RGlkbid0IHlvdSBmb3JnZXQgdG8gcGF5Pw==" },
michael@0 1129 { "Didn't your mother tell you not to eat food off the floor?",
michael@0 1130 "RGlkbid0IHlvdXIgbW90aGVyIHRlbGwgeW91IG5vdCB0byBlYXQgZm9vZCBvZmYgdGhlIGZsb29yPw==" },
michael@0 1131 { "Direct a direct hit on your direct opponent, directing in the right direction.",
michael@0 1132 "RGlyZWN0IGEgZGlyZWN0IGhpdCBvbiB5b3VyIGRpcmVjdCBvcHBvbmVudCwgZGlyZWN0aW5nIGluIHRoZSByaWdodCBkaXJlY3Rpb24u" },
michael@0 1133 { "Do you want to make more money? Sure, we all do! Join the Fort Ludios guard!",
michael@0 1134 "RG8geW91IHdhbnQgdG8gbWFrZSBtb3JlIG1vbmV5PyBTdXJlLCB3ZSBhbGwgZG8hIEpvaW4gdGhlIEZvcnQgTHVkaW9zIGd1YXJkIQ==" },
michael@0 1135 { "Don't eat too much: you might start hiccoughing!",
michael@0 1136 "RG9uJ3QgZWF0IHRvbyBtdWNoOiB5b3UgbWlnaHQgc3RhcnQgaGljY291Z2hpbmch" },
michael@0 1137 { "Don't play hack at your work; your boss might hit you!",
michael@0 1138 "RG9uJ3QgcGxheSBoYWNrIGF0IHlvdXIgd29yazsgeW91ciBib3NzIG1pZ2h0IGhpdCB5b3Uh" },
michael@0 1139 { "Don't tell a soul you found a secret door, otherwise it isn't a secret anymore.",
michael@0 1140 "RG9uJ3QgdGVsbCBhIHNvdWwgeW91IGZvdW5kIGEgc2VjcmV0IGRvb3IsIG90aGVyd2lzZSBpdCBpc24ndCBhIHNlY3JldCBhbnltb3JlLg==" },
michael@0 1141 { "Drinking potions of booze may land you in jail if you are under 21.",
michael@0 1142 "RHJpbmtpbmcgcG90aW9ucyBvZiBib296ZSBtYXkgbGFuZCB5b3UgaW4gamFpbCBpZiB5b3UgYXJlIHVuZGVyIDIxLg==" },
michael@0 1143 { "Drop your vanity and get rid of your jewels! Pickpockets about!",
michael@0 1144 "RHJvcCB5b3VyIHZhbml0eSBhbmQgZ2V0IHJpZCBvZiB5b3VyIGpld2VscyEgUGlja3BvY2tldHMgYWJvdXQh" },
michael@0 1145 { "Eat 10 cloves of garlic and keep all humans at a two-square distance.",
michael@0 1146 "RWF0IDEwIGNsb3ZlcyBvZiBnYXJsaWMgYW5kIGtlZXAgYWxsIGh1bWFucyBhdCBhIHR3by1zcXVhcmUgZGlzdGFuY2Uu" },
michael@0 1147 { "Eels hide under mud. Use a unicorn to clear the water and make them visible.",
michael@0 1148 "RWVscyBoaWRlIHVuZGVyIG11ZC4gVXNlIGEgdW5pY29ybiB0byBjbGVhciB0aGUgd2F0ZXIgYW5kIG1ha2UgdGhlbSB2aXNpYmxlLg==" },
michael@0 1149 { "Engrave your wishes with a wand of wishing.",
michael@0 1150 "RW5ncmF2ZSB5b3VyIHdpc2hlcyB3aXRoIGEgd2FuZCBvZiB3aXNoaW5nLg==" },
michael@0 1151 { "Eventually you will come to admire the swift elegance of a retreating nymph.",
michael@0 1152 "RXZlbnR1YWxseSB5b3Ugd2lsbCBjb21lIHRvIGFkbWlyZSB0aGUgc3dpZnQgZWxlZ2FuY2Ugb2YgYSByZXRyZWF0aW5nIG55bXBoLg==" },
michael@0 1153 { "Ever heard hissing outside? I *knew* you hadn't!",
michael@0 1154 "RXZlciBoZWFyZCBoaXNzaW5nIG91dHNpZGU/IEkgKmtuZXcqIHlvdSBoYWRuJ3Qh" },
michael@0 1155 { "Ever lifted a dragon corpse?",
michael@0 1156 "RXZlciBsaWZ0ZWQgYSBkcmFnb24gY29ycHNlPw==" },
michael@0 1157 { "Ever seen a leocrotta dancing the tengu?",
michael@0 1158 "RXZlciBzZWVuIGEgbGVvY3JvdHRhIGRhbmNpbmcgdGhlIHRlbmd1Pw==" },
michael@0 1159 { "Ever seen your weapon glow plaid?",
michael@0 1160 "RXZlciBzZWVuIHlvdXIgd2VhcG9uIGdsb3cgcGxhaWQ/" },
michael@0 1161 { "Ever tamed a shopkeeper?",
michael@0 1162 "RXZlciB0YW1lZCBhIHNob3BrZWVwZXI/" },
michael@0 1163 { "Ever tried digging through a Vault Guard?",
michael@0 1164 "RXZlciB0cmllZCBkaWdnaW5nIHRocm91Z2ggYSBWYXVsdCBHdWFyZD8=" },
michael@0 1165 { "Ever tried enchanting a rope?",
michael@0 1166 "RXZlciB0cmllZCBlbmNoYW50aW5nIGEgcm9wZT8=" },
michael@0 1167 { "Floating eyes can't stand Hawaiian shirts.",
michael@0 1168 "RmxvYXRpbmcgZXllcyBjYW4ndCBzdGFuZCBIYXdhaWlhbiBzaGlydHMu" },
michael@0 1169 { "For any remedy there is a misery.",
michael@0 1170 "Rm9yIGFueSByZW1lZHkgdGhlcmUgaXMgYSBtaXNlcnku" },
michael@0 1171 { "Giant bats turn into giant vampires.",
michael@0 1172 "R2lhbnQgYmF0cyB0dXJuIGludG8gZ2lhbnQgdmFtcGlyZXMu" },
michael@0 1173 { "Good day for overcoming obstacles. Try a steeplechase.",
michael@0 1174 "R29vZCBkYXkgZm9yIG92ZXJjb21pbmcgb2JzdGFjbGVzLiBUcnkgYSBzdGVlcGxlY2hhc2Uu" },
michael@0 1175 { "Half Moon tonight. (At least it's better than no Moon at all.)",
michael@0 1176 "SGFsZiBNb29uIHRvbmlnaHQuIChBdCBsZWFzdCBpdCdzIGJldHRlciB0aGFuIG5vIE1vb24gYXQgYWxsLik=" },
michael@0 1177 { "Help! I'm being held prisoner in a fortune cookie factory!",
michael@0 1178 "SGVscCEgSSdtIGJlaW5nIGhlbGQgcHJpc29uZXIgaW4gYSBmb3J0dW5lIGNvb2tpZSBmYWN0b3J5IQ==" },
michael@0 1179 { "Housecats have nine lives, kittens only one.",
michael@0 1180 "SG91c2VjYXRzIGhhdmUgbmluZSBsaXZlcywga2l0dGVucyBvbmx5IG9uZS4=" },
michael@0 1181 { "How long can you tread water?",
michael@0 1182 "SG93IGxvbmcgY2FuIHlvdSB0cmVhZCB3YXRlcj8=" },
michael@0 1183 { "Hungry? There is an abundance of food on the next level.",
michael@0 1184 "SHVuZ3J5PyBUaGVyZSBpcyBhbiBhYnVuZGFuY2Ugb2YgZm9vZCBvbiB0aGUgbmV4dCBsZXZlbC4=" },
michael@0 1185 { "I guess you've never hit a mail daemon with the Amulet of Yendor...",
michael@0 1186 "SSBndWVzcyB5b3UndmUgbmV2ZXIgaGl0IGEgbWFpbCBkYWVtb24gd2l0aCB0aGUgQW11bGV0IG9mIFllbmRvci4uLg==" },
michael@0 1187 { "If you are the shopkeeper, you can take things for free.",
michael@0 1188 "SWYgeW91IGFyZSB0aGUgc2hvcGtlZXBlciwgeW91IGNhbiB0YWtlIHRoaW5ncyBmb3IgZnJlZS4=" },
michael@0 1189 { "If you can't learn to do it well, learn to enjoy doing it badly.",
michael@0 1190 "SWYgeW91IGNhbid0IGxlYXJuIHRvIGRvIGl0IHdlbGwsIGxlYXJuIHRvIGVuam95IGRvaW5nIGl0IGJhZGx5Lg==" },
michael@0 1191 { "If you thought the Wizard was bad, just wait till you meet the Warlord!",
michael@0 1192 "SWYgeW91IHRob3VnaHQgdGhlIFdpemFyZCB3YXMgYmFkLCBqdXN0IHdhaXQgdGlsbCB5b3UgbWVldCB0aGUgV2FybG9yZCE=" },
michael@0 1193 { "If you turn blind, don't expect your dog to be turned into a seeing-eye dog.",
michael@0 1194 "SWYgeW91IHR1cm4gYmxpbmQsIGRvbid0IGV4cGVjdCB5b3VyIGRvZyB0byBiZSB0dXJuZWQgaW50byBhIHNlZWluZy1leWUgZG9nLg==" },
michael@0 1195 { "If you want to feel great, you must eat something real big.",
michael@0 1196 "SWYgeW91IHdhbnQgdG8gZmVlbCBncmVhdCwgeW91IG11c3QgZWF0IHNvbWV0aGluZyByZWFsIGJpZy4=" },
michael@0 1197 { "If you want to float, you'd better eat a floating eye.",
michael@0 1198 "SWYgeW91IHdhbnQgdG8gZmxvYXQsIHlvdSdkIGJldHRlciBlYXQgYSBmbG9hdGluZyBleWUu" },
michael@0 1199 { "If your ghost kills a player, it increases your score.",
michael@0 1200 "SWYgeW91ciBnaG9zdCBraWxscyBhIHBsYXllciwgaXQgaW5jcmVhc2VzIHlvdXIgc2NvcmUu" },
michael@0 1201 { "Increase mindpower: Tame your own ghost!",
michael@0 1202 "SW5jcmVhc2UgbWluZHBvd2VyOiBUYW1lIHlvdXIgb3duIGdob3N0IQ==" },
michael@0 1203 { "It furthers one to see the great man.",
michael@0 1204 "SXQgZnVydGhlcnMgb25lIHRvIHNlZSB0aGUgZ3JlYXQgbWFuLg==" },
michael@0 1205 { "It's easy to overlook a monster in a wood.",
michael@0 1206 "SXQncyBlYXN5IHRvIG92ZXJsb29rIGEgbW9uc3RlciBpbiBhIHdvb2Qu" },
michael@0 1207 { "Just below any trapdoor there may be another one. Just keep falling!",
michael@0 1208 "SnVzdCBiZWxvdyBhbnkgdHJhcGRvb3IgdGhlcmUgbWF5IGJlIGFub3RoZXIgb25lLiBKdXN0IGtlZXAgZmFsbGluZyE=" },
michael@0 1209 { "Katanas are very sharp; watch you don't cut yourself.",
michael@0 1210 "S2F0YW5hcyBhcmUgdmVyeSBzaGFycDsgd2F0Y2ggeW91IGRvbid0IGN1dCB5b3Vyc2VsZi4=" },
michael@0 1211 { "Keep a clear mind: quaff clear potions.",
michael@0 1212 "S2VlcCBhIGNsZWFyIG1pbmQ6IHF1YWZmIGNsZWFyIHBvdGlvbnMu" },
michael@0 1213 { "Kicking the terminal doesn't hurt the monsters.",
michael@0 1214 "S2lja2luZyB0aGUgdGVybWluYWwgZG9lc24ndCBodXJ0IHRoZSBtb25zdGVycy4=" },
michael@0 1215 { "Killer bees keep appearing till you kill their queen.",
michael@0 1216 "S2lsbGVyIGJlZXMga2VlcCBhcHBlYXJpbmcgdGlsbCB5b3Uga2lsbCB0aGVpciBxdWVlbi4=" },
michael@0 1217 { "Killer bunnies can be tamed with carrots only.",
michael@0 1218 "S2lsbGVyIGJ1bm5pZXMgY2FuIGJlIHRhbWVkIHdpdGggY2Fycm90cyBvbmx5Lg==" },
michael@0 1219 { "Latest news? Put `rec.games.roguelike.nethack' in your .newsrc!",
michael@0 1220 "TGF0ZXN0IG5ld3M/IFB1dCBgcmVjLmdhbWVzLnJvZ3VlbGlrZS5uZXRoYWNrJyBpbiB5b3VyIC5uZXdzcmMh" },
michael@0 1221 { "Learn how to spell. Play NetHack!",
michael@0 1222 "TGVhcm4gaG93IHRvIHNwZWxsLiBQbGF5IE5ldEhhY2sh" },
michael@0 1223 { "Leprechauns hide their gold in a secret room.",
michael@0 1224 "TGVwcmVjaGF1bnMgaGlkZSB0aGVpciBnb2xkIGluIGEgc2VjcmV0IHJvb20u" },
michael@0 1225 { "Let your fingers do the walking on the yulkjhnb keys.",
michael@0 1226 "TGV0IHlvdXIgZmluZ2VycyBkbyB0aGUgd2Fsa2luZyBvbiB0aGUgeXVsa2pobmIga2V5cy4=" },
michael@0 1227 { "Let's face it: this time you're not going to win.",
michael@0 1228 "TGV0J3MgZmFjZSBpdDogdGhpcyB0aW1lIHlvdSdyZSBub3QgZ29pbmcgdG8gd2luLg==" },
michael@0 1229 { "Let's have a party, drink a lot of booze.",
michael@0 1230 "TGV0J3MgaGF2ZSBhIHBhcnR5LCBkcmluayBhIGxvdCBvZiBib296ZS4=" },
michael@0 1231 { "Liquor sellers do not drink; they hate to see you twice.",
michael@0 1232 "TGlxdW9yIHNlbGxlcnMgZG8gbm90IGRyaW5rOyB0aGV5IGhhdGUgdG8gc2VlIHlvdSB0d2ljZS4=" },
michael@0 1233 { "Lunar eclipse tonight. May as well quit now!",
michael@0 1234 "THVuYXIgZWNsaXBzZSB0b25pZ2h0LiBNYXkgYXMgd2VsbCBxdWl0IG5vdyE=" },
michael@0 1235 { "Meeting your own ghost decreases your luck considerably!",
michael@0 1236 "TWVldGluZyB5b3VyIG93biBnaG9zdCBkZWNyZWFzZXMgeW91ciBsdWNrIGNvbnNpZGVyYWJseSE=" },
michael@0 1237 { "Money to invest? Take it to the local branch of the Magic Memory Vault!",
michael@0 1238 "TW9uZXkgdG8gaW52ZXN0PyBUYWtlIGl0IHRvIHRoZSBsb2NhbCBicmFuY2ggb2YgdGhlIE1hZ2ljIE1lbW9yeSBWYXVsdCE=" },
michael@0 1239 { "Monsters come from nowhere to hit you everywhere.",
michael@0 1240 "TW9uc3RlcnMgY29tZSBmcm9tIG5vd2hlcmUgdG8gaGl0IHlvdSBldmVyeXdoZXJlLg==" },
michael@0 1241 { "Monsters sleep because you are boring, not because they ever get tired.",
michael@0 1242 "TW9uc3RlcnMgc2xlZXAgYmVjYXVzZSB5b3UgYXJlIGJvcmluZywgbm90IGJlY2F1c2UgdGhleSBldmVyIGdldCB0aXJlZC4=" },
michael@0 1243 { "Most monsters prefer minced meat. That's why they are hitting you!",
michael@0 1244 "TW9zdCBtb25zdGVycyBwcmVmZXIgbWluY2VkIG1lYXQuIFRoYXQncyB3aHkgdGhleSBhcmUgaGl0dGluZyB5b3Uh" },
michael@0 1245 { "Most of the bugs in NetHack are on the floor.",
michael@0 1246 "TW9zdCBvZiB0aGUgYnVncyBpbiBOZXRIYWNrIGFyZSBvbiB0aGUgZmxvb3Iu" },
michael@0 1247 { "Much ado Nothing Happens.",
michael@0 1248 "TXVjaCBhZG8gTm90aGluZyBIYXBwZW5zLg==" },
michael@0 1249 { "Multi-player NetHack is a myth.",
michael@0 1250 "TXVsdGktcGxheWVyIE5ldEhhY2sgaXMgYSBteXRoLg==" },
michael@0 1251 { "NetHack is addictive. Too late, you're already hooked.",
michael@0 1252 "TmV0SGFjayBpcyBhZGRpY3RpdmUuIFRvbyBsYXRlLCB5b3UncmUgYWxyZWFkeSBob29rZWQu" },
michael@0 1253 { "Never ask a shopkeeper for a price list.",
michael@0 1254 "TmV2ZXIgYXNrIGEgc2hvcGtlZXBlciBmb3IgYSBwcmljZSBsaXN0Lg==" },
michael@0 1255 { "Never burn a tree, unless you like getting whacked with a +5 shovel.",
michael@0 1256 "TmV2ZXIgYnVybiBhIHRyZWUsIHVubGVzcyB5b3UgbGlrZSBnZXR0aW5nIHdoYWNrZWQgd2l0aCBhICs1IHNob3ZlbC4=" },
michael@0 1257 { "Never eat with glowing hands!",
michael@0 1258 "TmV2ZXIgZWF0IHdpdGggZ2xvd2luZyBoYW5kcyE=" },
michael@0 1259 { "Never mind the monsters hitting you: they just replace the charwomen.",
michael@0 1260 "TmV2ZXIgbWluZCB0aGUgbW9uc3RlcnMgaGl0dGluZyB5b3U6IHRoZXkganVzdCByZXBsYWNlIHRoZSBjaGFyd29tZW4u" },
michael@0 1261 { "Never play leapfrog with a unicorn.",
michael@0 1262 "TmV2ZXIgcGxheSBsZWFwZnJvZyB3aXRoIGEgdW5pY29ybi4=" },
michael@0 1263 { "Never step on a cursed engraving.",
michael@0 1264 "TmV2ZXIgc3RlcCBvbiBhIGN1cnNlZCBlbmdyYXZpbmcu" },
michael@0 1265 { "Never swim with a camera: there's nothing to take pictures of.",
michael@0 1266 "TmV2ZXIgc3dpbSB3aXRoIGEgY2FtZXJhOiB0aGVyZSdzIG5vdGhpbmcgdG8gdGFrZSBwaWN0dXJlcyBvZi4=" },
michael@0 1267 { "Never teach your pet rust monster to fetch.",
michael@0 1268 "TmV2ZXIgdGVhY2ggeW91ciBwZXQgcnVzdCBtb25zdGVyIHRvIGZldGNoLg==" },
michael@0 1269 { "Never trust a random generator in magic fields.",
michael@0 1270 "TmV2ZXIgdHJ1c3QgYSByYW5kb20gZ2VuZXJhdG9yIGluIG1hZ2ljIGZpZWxkcy4=" },
michael@0 1271 { "Never use a wand of death.",
michael@0 1272 "TmV2ZXIgdXNlIGEgd2FuZCBvZiBkZWF0aC4=" },
michael@0 1273 { "No level contains two shops. The maze is no level. So...",
michael@0 1274 "Tm8gbGV2ZWwgY29udGFpbnMgdHdvIHNob3BzLiBUaGUgbWF6ZSBpcyBubyBsZXZlbC4gU28uLi4=" },
michael@0 1275 { "No part of this fortune may be reproduced, stored in a retrieval system, ...",
michael@0 1276 "Tm8gcGFydCBvZiB0aGlzIGZvcnR1bmUgbWF5IGJlIHJlcHJvZHVjZWQsIHN0b3JlZCBpbiBhIHJldHJpZXZhbCBzeXN0ZW0sIC4uLg==" },
michael@0 1277 { "Not all rumors are as misleading as this one.",
michael@0 1278 "Tm90IGFsbCBydW1vcnMgYXJlIGFzIG1pc2xlYWRpbmcgYXMgdGhpcyBvbmUu" },
michael@0 1279 { "Nymphs and nurses like beautiful rings.",
michael@0 1280 "TnltcGhzIGFuZCBudXJzZXMgbGlrZSBiZWF1dGlmdWwgcmluZ3Mu" },
michael@0 1281 { "Nymphs are blondes. Are you a gentleman?",
michael@0 1282 "TnltcGhzIGFyZSBibG9uZGVzLiBBcmUgeW91IGEgZ2VudGxlbWFuPw==" },
michael@0 1283 { "Offering a unicorn a worthless piece of glass might prove to be fatal!",
michael@0 1284 "T2ZmZXJpbmcgYSB1bmljb3JuIGEgd29ydGhsZXNzIHBpZWNlIG9mIGdsYXNzIG1pZ2h0IHByb3ZlIHRvIGJlIGZhdGFsIQ==" },
michael@0 1285 { "Old hackers never die: young ones do.",
michael@0 1286 "T2xkIGhhY2tlcnMgbmV2ZXIgZGllOiB5b3VuZyBvbmVzIGRvLg==" },
michael@0 1287 { "One has to leave shops before closing time.",
michael@0 1288 "T25lIGhhcyB0byBsZWF2ZSBzaG9wcyBiZWZvcmUgY2xvc2luZyB0aW1lLg==" },
michael@0 1289 { "One homunculus a day keeps the doctor away.",
michael@0 1290 "T25lIGhvbXVuY3VsdXMgYSBkYXkga2VlcHMgdGhlIGRvY3RvciBhd2F5Lg==" },
michael@0 1291 { "One level further down somebody is getting killed, right now.",
michael@0 1292 "T25lIGxldmVsIGZ1cnRoZXIgZG93biBzb21lYm9keSBpcyBnZXR0aW5nIGtpbGxlZCwgcmlnaHQgbm93Lg==" },
michael@0 1293 { "Only a wizard can use a magic whistle.",
michael@0 1294 "T25seSBhIHdpemFyZCBjYW4gdXNlIGEgbWFnaWMgd2hpc3RsZS4=" },
michael@0 1295 { "Only adventurers of evil alignment think of killing their dog.",
michael@0 1296 "T25seSBhZHZlbnR1cmVycyBvZiBldmlsIGFsaWdubWVudCB0aGluayBvZiBraWxsaW5nIHRoZWlyIGRvZy4=" },
michael@0 1297 { "Only chaotic evils kill sleeping monsters.",
michael@0 1298 "T25seSBjaGFvdGljIGV2aWxzIGtpbGwgc2xlZXBpbmcgbW9uc3RlcnMu" },
michael@0 1299 { "Only real trappers escape traps.",
michael@0 1300 "T25seSByZWFsIHRyYXBwZXJzIGVzY2FwZSB0cmFwcy4=" },
michael@0 1301 { "Only real wizards can write scrolls.",
michael@0 1302 "T25seSByZWFsIHdpemFyZHMgY2FuIHdyaXRlIHNjcm9sbHMu" },
michael@0 1303 { "Operation OVERKILL has started now.",
michael@0 1304 "T3BlcmF0aW9uIE9WRVJLSUxMIGhhcyBzdGFydGVkIG5vdy4=" },
michael@0 1305 { "PLEASE ignore previous rumor.",
michael@0 1306 "UExFQVNFIGlnbm9yZSBwcmV2aW91cyBydW1vci4=" },
michael@0 1307 { "Polymorph into an ettin; meet your opponents face to face to face.",
michael@0 1308 "UG9seW1vcnBoIGludG8gYW4gZXR0aW47IG1lZXQgeW91ciBvcHBvbmVudHMgZmFjZSB0byBmYWNlIHRvIGZhY2Uu" },
michael@0 1309 { "Praying will frighten demons.",
michael@0 1310 "UHJheWluZyB3aWxsIGZyaWdodGVuIGRlbW9ucy4=" },
michael@0 1311 { "Row (3x) that boat gently down the stream, Charon (4x), death is but a dream.",
michael@0 1312 "Um93ICgzeCkgdGhhdCBib2F0IGdlbnRseSBkb3duIHRoZSBzdHJlYW0sIENoYXJvbiAoNHgpLCBkZWF0aCBpcyBidXQgYSBkcmVhbS4=" },
michael@0 1313 { "Running is good for your legs.",
michael@0 1314 "UnVubmluZyBpcyBnb29kIGZvciB5b3VyIGxlZ3Mu" },
michael@0 1315 { "Screw up your courage! You've screwed up everything else.",
michael@0 1316 "U2NyZXcgdXAgeW91ciBjb3VyYWdlISBZb3UndmUgc2NyZXdlZCB1cCBldmVyeXRoaW5nIGVsc2Uu" },
michael@0 1317 { "Seepage? Leaky pipes? Rising damp? Summon the plumber!",
michael@0 1318 "U2VlcGFnZT8gTGVha3kgcGlwZXM/IFJpc2luZyBkYW1wPyBTdW1tb24gdGhlIHBsdW1iZXIh" },
michael@0 1319 { "Segmentation fault (core dumped).",
michael@0 1320 "U2VnbWVudGF0aW9uIGZhdWx0IChjb3JlIGR1bXBlZCku" },
michael@0 1321 { "Shopkeepers sometimes die from old age.",
michael@0 1322 "U2hvcGtlZXBlcnMgc29tZXRpbWVzIGRpZSBmcm9tIG9sZCBhZ2Uu" },
michael@0 1323 { "Some mazes (especially small ones) have no solutions, says man 6 maze.",
michael@0 1324 "U29tZSBtYXplcyAoZXNwZWNpYWxseSBzbWFsbCBvbmVzKSBoYXZlIG5vIHNvbHV0aW9ucywgc2F5cyBtYW4gNiBtYXplLg==" },
michael@0 1325 { "Some questions the Sphynx asks just *don't* have any answers.",
michael@0 1326 "U29tZSBxdWVzdGlvbnMgdGhlIFNwaHlueCBhc2tzIGp1c3QgKmRvbid0KiBoYXZlIGFueSBhbnN3ZXJzLg==" },
michael@0 1327 { "Sometimes \"mu\" is the answer.",
michael@0 1328 "U29tZXRpbWVzICJtdSIgaXMgdGhlIGFuc3dlci4=" },
michael@0 1329 { "Sorry, no fortune this time. Better luck next cookie!",
michael@0 1330 "U29ycnksIG5vIGZvcnR1bmUgdGhpcyB0aW1lLiBCZXR0ZXIgbHVjayBuZXh0IGNvb2tpZSE=" },
michael@0 1331 { "Spare your scrolls of make-edible until it's really necessary!",
michael@0 1332 "U3BhcmUgeW91ciBzY3JvbGxzIG9mIG1ha2UtZWRpYmxlIHVudGlsIGl0J3MgcmVhbGx5IG5lY2Vzc2FyeSE=" },
michael@0 1333 { "Suddenly, the dungeon will collapse...",
michael@0 1334 "U3VkZGVubHksIHRoZSBkdW5nZW9uIHdpbGwgY29sbGFwc2UuLi4=" },
michael@0 1335 { "Taming a mail daemon may cause a system security violation.",
michael@0 1336 "VGFtaW5nIGEgbWFpbCBkYWVtb24gbWF5IGNhdXNlIGEgc3lzdGVtIHNlY3VyaXR5IHZpb2xhdGlvbi4=" },
michael@0 1337 { "The crowd was so tough, the Stooges won't play the Dungeon anymore, nyuk nyuk.",
michael@0 1338 "VGhlIGNyb3dkIHdhcyBzbyB0b3VnaCwgdGhlIFN0b29nZXMgd29uJ3QgcGxheSB0aGUgRHVuZ2VvbiBhbnltb3JlLCBueXVrIG55dWsu" },
michael@0 1339 { "The leprechauns hide their treasure in a small hidden room.",
michael@0 1340 "VGhlIGxlcHJlY2hhdW5zIGhpZGUgdGhlaXIgdHJlYXN1cmUgaW4gYSBzbWFsbCBoaWRkZW4gcm9vbS4=" },
michael@0 1341 { "The longer the wand the better.",
michael@0 1342 "VGhlIGxvbmdlciB0aGUgd2FuZCB0aGUgYmV0dGVyLg==" },
michael@0 1343 { "The magic word is \"XYZZY\".",
michael@0 1344 "VGhlIG1hZ2ljIHdvcmQgaXMgIlhZWlpZIi4=" },
michael@0 1345 { "The meek shall inherit your bones files.",
michael@0 1346 "VGhlIG1lZWsgc2hhbGwgaW5oZXJpdCB5b3VyIGJvbmVzIGZpbGVzLg==" },
michael@0 1347 { "The mines are dark and deep, and I have levels to go before I sleep.",
michael@0 1348 "VGhlIG1pbmVzIGFyZSBkYXJrIGFuZCBkZWVwLCBhbmQgSSBoYXZlIGxldmVscyB0byBnbyBiZWZvcmUgSSBzbGVlcC4=" },
michael@0 1349 { "The use of dynamite is dangerous.",
michael@0 1350 "VGhlIHVzZSBvZiBkeW5hbWl0ZSBpcyBkYW5nZXJvdXMu" },
michael@0 1351 { "There are no worms in the UNIX version.",
michael@0 1352 "VGhlcmUgYXJlIG5vIHdvcm1zIGluIHRoZSBVTklYIHZlcnNpb24u" },
michael@0 1353 { "There is a trap on this level!",
michael@0 1354 "VGhlcmUgaXMgYSB0cmFwIG9uIHRoaXMgbGV2ZWwh" },
michael@0 1355 { "They say that Demogorgon, Asmodeus, Orcus, Yeenoghu & Juiblex is no law firm.",
michael@0 1356 "VGhleSBzYXkgdGhhdCBEZW1vZ29yZ29uLCBBc21vZGV1cywgT3JjdXMsIFllZW5vZ2h1ICYgSnVpYmxleCBpcyBubyBsYXcgZmlybS4=" },
michael@0 1357 { "They say that Geryon has an evil twin, beware!",
michael@0 1358 "VGhleSBzYXkgdGhhdCBHZXJ5b24gaGFzIGFuIGV2aWwgdHdpbiwgYmV3YXJlIQ==" },
michael@0 1359 { "They say that Medusa would make a terrible pet.",
michael@0 1360 "VGhleSBzYXkgdGhhdCBNZWR1c2Egd291bGQgbWFrZSBhIHRlcnJpYmxlIHBldC4=" },
michael@0 1361 { "They say that NetHack bugs are Seldon planned.",
michael@0 1362 "VGhleSBzYXkgdGhhdCBOZXRIYWNrIGJ1Z3MgYXJlIFNlbGRvbiBwbGFubmVkLg==" },
michael@0 1363 { "They say that NetHack comes in 256 flavors.",
michael@0 1364 "VGhleSBzYXkgdGhhdCBOZXRIYWNrIGNvbWVzIGluIDI1NiBmbGF2b3JzLg==" },
michael@0 1365 { "They say that NetHack is just a computer game.",
michael@0 1366 "VGhleSBzYXkgdGhhdCBOZXRIYWNrIGlzIGp1c3QgYSBjb21wdXRlciBnYW1lLg==" },
michael@0 1367 { "They say that NetHack is more than just a computer game.",
michael@0 1368 "VGhleSBzYXkgdGhhdCBOZXRIYWNrIGlzIG1vcmUgdGhhbiBqdXN0IGEgY29tcHV0ZXIgZ2FtZS4=" },
michael@0 1369 { "They say that NetHack is never what it used to be.",
michael@0 1370 "VGhleSBzYXkgdGhhdCBOZXRIYWNrIGlzIG5ldmVyIHdoYXQgaXQgdXNlZCB0byBiZS4=" },
michael@0 1371 { "They say that a baby dragon is too small to hurt or help you.",
michael@0 1372 "VGhleSBzYXkgdGhhdCBhIGJhYnkgZHJhZ29uIGlzIHRvbyBzbWFsbCB0byBodXJ0IG9yIGhlbHAgeW91Lg==" },
michael@0 1373 { "They say that a black pudding is simply a brown pudding gone bad.",
michael@0 1374 "VGhleSBzYXkgdGhhdCBhIGJsYWNrIHB1ZGRpbmcgaXMgc2ltcGx5IGEgYnJvd24gcHVkZGluZyBnb25lIGJhZC4=" },
michael@0 1375 { "They say that a black sheep has 3 bags full of wool.",
michael@0 1376 "VGhleSBzYXkgdGhhdCBhIGJsYWNrIHNoZWVwIGhhcyAzIGJhZ3MgZnVsbCBvZiB3b29sLg==" },
michael@0 1377 { "They say that a blank scroll is like a blank check.",
michael@0 1378 "VGhleSBzYXkgdGhhdCBhIGJsYW5rIHNjcm9sbCBpcyBsaWtlIGEgYmxhbmsgY2hlY2su" },
michael@0 1379 { "They say that a cat named Morris has nine lives.",
michael@0 1380 "VGhleSBzYXkgdGhhdCBhIGNhdCBuYW1lZCBNb3JyaXMgaGFzIG5pbmUgbGl2ZXMu" },
michael@0 1381 { "They say that a desperate shopper might pay any price in a shop.",
michael@0 1382 "VGhleSBzYXkgdGhhdCBhIGRlc3BlcmF0ZSBzaG9wcGVyIG1pZ2h0IHBheSBhbnkgcHJpY2UgaW4gYSBzaG9wLg==" },
michael@0 1383 { "They say that a diamond dog is everybody's best friend.",
michael@0 1384 "VGhleSBzYXkgdGhhdCBhIGRpYW1vbmQgZG9nIGlzIGV2ZXJ5Ym9keSdzIGJlc3QgZnJpZW5kLg==" },
michael@0 1385 { "They say that a dwarf lord can carry a pick-axe because his armor is light.",
michael@0 1386 "VGhleSBzYXkgdGhhdCBhIGR3YXJmIGxvcmQgY2FuIGNhcnJ5IGEgcGljay1heGUgYmVjYXVzZSBoaXMgYXJtb3IgaXMgbGlnaHQu" },
michael@0 1387 { "They say that a floating eye can defeat Medusa.",
michael@0 1388 "VGhleSBzYXkgdGhhdCBhIGZsb2F0aW5nIGV5ZSBjYW4gZGVmZWF0IE1lZHVzYS4=" },
michael@0 1389 { "They say that a fortune only has 1 line and you can't read between it.",
michael@0 1390 "VGhleSBzYXkgdGhhdCBhIGZvcnR1bmUgb25seSBoYXMgMSBsaW5lIGFuZCB5b3UgY2FuJ3QgcmVhZCBiZXR3ZWVuIGl0Lg==" },
michael@0 1391 { "They say that a fortune only has 1 line, but you can read between it.",
michael@0 1392 "VGhleSBzYXkgdGhhdCBhIGZvcnR1bmUgb25seSBoYXMgMSBsaW5lLCBidXQgeW91IGNhbiByZWFkIGJldHdlZW4gaXQu" },
michael@0 1393 { "They say that a fountain looks nothing like a regularly erupting geyser.",
michael@0 1394 "VGhleSBzYXkgdGhhdCBhIGZvdW50YWluIGxvb2tzIG5vdGhpbmcgbGlrZSBhIHJlZ3VsYXJseSBlcnVwdGluZyBnZXlzZXIu" },
michael@0 1395 { "They say that a gold doubloon is worth more than its weight in gold.",
michael@0 1396 "VGhleSBzYXkgdGhhdCBhIGdvbGQgZG91Ymxvb24gaXMgd29ydGggbW9yZSB0aGFuIGl0cyB3ZWlnaHQgaW4gZ29sZC4=" },
michael@0 1397 { "They say that a grid bug won't pay a shopkeeper for zapping you in a shop.",
michael@0 1398 "VGhleSBzYXkgdGhhdCBhIGdyaWQgYnVnIHdvbid0IHBheSBhIHNob3BrZWVwZXIgZm9yIHphcHBpbmcgeW91IGluIGEgc2hvcC4=" },
michael@0 1399 { "They say that a gypsy could tell your fortune for a price.",
michael@0 1400 "VGhleSBzYXkgdGhhdCBhIGd5cHN5IGNvdWxkIHRlbGwgeW91ciBmb3J0dW5lIGZvciBhIHByaWNlLg==" },
michael@0 1401 { "They say that a hacker named Alice once level teleported by using a mirror.",
michael@0 1402 "VGhleSBzYXkgdGhhdCBhIGhhY2tlciBuYW1lZCBBbGljZSBvbmNlIGxldmVsIHRlbGVwb3J0ZWQgYnkgdXNpbmcgYSBtaXJyb3Iu" },
michael@0 1403 { "They say that a hacker named David once slew a giant with a sling and a rock.",
michael@0 1404 "VGhleSBzYXkgdGhhdCBhIGhhY2tlciBuYW1lZCBEYXZpZCBvbmNlIHNsZXcgYSBnaWFudCB3aXRoIGEgc2xpbmcgYW5kIGEgcm9jay4=" },
michael@0 1405 { "They say that a hacker named Dorothy once rode a fog cloud to Oz.",
michael@0 1406 "VGhleSBzYXkgdGhhdCBhIGhhY2tlciBuYW1lZCBEb3JvdGh5IG9uY2Ugcm9kZSBhIGZvZyBjbG91ZCB0byBPei4=" },
michael@0 1407 { "They say that a hacker named Mary once lost a white sheep in the mazes.",
michael@0 1408 "VGhleSBzYXkgdGhhdCBhIGhhY2tlciBuYW1lZCBNYXJ5IG9uY2UgbG9zdCBhIHdoaXRlIHNoZWVwIGluIHRoZSBtYXplcy4=" },
michael@0 1409 { "They say that a helm of brilliance is not to be taken lightly.",
michael@0 1410 "VGhleSBzYXkgdGhhdCBhIGhlbG0gb2YgYnJpbGxpYW5jZSBpcyBub3QgdG8gYmUgdGFrZW4gbGlnaHRseS4=" },
michael@0 1411 { "They say that a hot dog and a hell hound are the same thing.",
michael@0 1412 "VGhleSBzYXkgdGhhdCBhIGhvdCBkb2cgYW5kIGEgaGVsbCBob3VuZCBhcmUgdGhlIHNhbWUgdGhpbmcu" },
michael@0 1413 { "They say that a lamp named Aladdin's Lamp contains a djinni with 3 wishes.",
michael@0 1414 "VGhleSBzYXkgdGhhdCBhIGxhbXAgbmFtZWQgQWxhZGRpbidzIExhbXAgY29udGFpbnMgYSBkamlubmkgd2l0aCAzIHdpc2hlcy4=" },
michael@0 1415 { "They say that a large dog named Lassie will lead you to the amulet.",
michael@0 1416 "VGhleSBzYXkgdGhhdCBhIGxhcmdlIGRvZyBuYW1lZCBMYXNzaWUgd2lsbCBsZWFkIHlvdSB0byB0aGUgYW11bGV0Lg==" },
michael@0 1417 { "They say that a long sword is not a light sword.",
michael@0 1418 "VGhleSBzYXkgdGhhdCBhIGxvbmcgc3dvcmQgaXMgbm90IGEgbGlnaHQgc3dvcmQu" },
michael@0 1419 { "They say that a manes won't mince words with you.",
michael@0 1420 "VGhleSBzYXkgdGhhdCBhIG1hbmVzIHdvbid0IG1pbmNlIHdvcmRzIHdpdGggeW91Lg==" },
michael@0 1421 { "They say that a mind is a terrible thing to waste.",
michael@0 1422 "VGhleSBzYXkgdGhhdCBhIG1pbmQgaXMgYSB0ZXJyaWJsZSB0aGluZyB0byB3YXN0ZS4=" },
michael@0 1423 { "They say that a plain nymph will only wear a wire ring in one ear.",
michael@0 1424 "VGhleSBzYXkgdGhhdCBhIHBsYWluIG55bXBoIHdpbGwgb25seSB3ZWFyIGEgd2lyZSByaW5nIGluIG9uZSBlYXIu" },
michael@0 1425 { "They say that a plumed hat could be a previously used crested helmet.",
michael@0 1426 "VGhleSBzYXkgdGhhdCBhIHBsdW1lZCBoYXQgY291bGQgYmUgYSBwcmV2aW91c2x5IHVzZWQgY3Jlc3RlZCBoZWxtZXQu" },
michael@0 1427 { "They say that a potion of oil is difficult to grasp.",
michael@0 1428 "VGhleSBzYXkgdGhhdCBhIHBvdGlvbiBvZiBvaWwgaXMgZGlmZmljdWx0IHRvIGdyYXNwLg==" },
michael@0 1429 { "They say that a potion of yogurt is a cancelled potion of sickness.",
michael@0 1430 "VGhleSBzYXkgdGhhdCBhIHBvdGlvbiBvZiB5b2d1cnQgaXMgYSBjYW5jZWxsZWQgcG90aW9uIG9mIHNpY2tuZXNzLg==" },
michael@0 1431 { "They say that a purple worm is not a baby purple dragon.",
michael@0 1432 "VGhleSBzYXkgdGhhdCBhIHB1cnBsZSB3b3JtIGlzIG5vdCBhIGJhYnkgcHVycGxlIGRyYWdvbi4=" },
michael@0 1433 { "They say that a quivering blob tastes different than a gelatinous cube.",
michael@0 1434 "VGhleSBzYXkgdGhhdCBhIHF1aXZlcmluZyBibG9iIHRhc3RlcyBkaWZmZXJlbnQgdGhhbiBhIGdlbGF0aW5vdXMgY3ViZS4=" },
michael@0 1435 { "They say that a runed broadsword named Stormbringer attracts vortices.",
michael@0 1436 "VGhleSBzYXkgdGhhdCBhIHJ1bmVkIGJyb2Fkc3dvcmQgbmFtZWQgU3Rvcm1icmluZ2VyIGF0dHJhY3RzIHZvcnRpY2VzLg==" },
michael@0 1437 { "They say that a scroll of summoning has other names.",
michael@0 1438 "VGhleSBzYXkgdGhhdCBhIHNjcm9sbCBvZiBzdW1tb25pbmcgaGFzIG90aGVyIG5hbWVzLg==" },
michael@0 1439 { "They say that a shaman can bestow blessings but usually doesn't.",
michael@0 1440 "VGhleSBzYXkgdGhhdCBhIHNoYW1hbiBjYW4gYmVzdG93IGJsZXNzaW5ncyBidXQgdXN1YWxseSBkb2Vzbid0Lg==" },
michael@0 1441 { "They say that a shaman will bless you for an eye of newt and wing of bat.",
michael@0 1442 "VGhleSBzYXkgdGhhdCBhIHNoYW1hbiB3aWxsIGJsZXNzIHlvdSBmb3IgYW4gZXllIG9mIG5ld3QgYW5kIHdpbmcgb2YgYmF0Lg==" },
michael@0 1443 { "They say that a shimmering gold shield is not a polished silver shield.",
michael@0 1444 "VGhleSBzYXkgdGhhdCBhIHNoaW1tZXJpbmcgZ29sZCBzaGllbGQgaXMgbm90IGEgcG9saXNoZWQgc2lsdmVyIHNoaWVsZC4=" },
michael@0 1445 { "They say that a spear will hit a neo-otyugh. (Do YOU know what that is?)",
michael@0 1446 "VGhleSBzYXkgdGhhdCBhIHNwZWFyIHdpbGwgaGl0IGEgbmVvLW90eXVnaC4gKERvIFlPVSBrbm93IHdoYXQgdGhhdCBpcz8p" },
michael@0 1447 { "They say that a spotted dragon is the ultimate shape changer.",
michael@0 1448 "VGhleSBzYXkgdGhhdCBhIHNwb3R0ZWQgZHJhZ29uIGlzIHRoZSB1bHRpbWF0ZSBzaGFwZSBjaGFuZ2VyLg==" },
michael@0 1449 { "They say that a stethoscope is no good if you can only hear your heartbeat.",
michael@0 1450 "VGhleSBzYXkgdGhhdCBhIHN0ZXRob3Njb3BlIGlzIG5vIGdvb2QgaWYgeW91IGNhbiBvbmx5IGhlYXIgeW91ciBoZWFydGJlYXQu" },
michael@0 1451 { "They say that a succubus named Suzy will sometimes warn you of danger.",
michael@0 1452 "VGhleSBzYXkgdGhhdCBhIHN1Y2N1YnVzIG5hbWVkIFN1enkgd2lsbCBzb21ldGltZXMgd2FybiB5b3Ugb2YgZGFuZ2VyLg==" },
michael@0 1453 { "They say that a wand of cancellation is not like a wand of polymorph.",
michael@0 1454 "VGhleSBzYXkgdGhhdCBhIHdhbmQgb2YgY2FuY2VsbGF0aW9uIGlzIG5vdCBsaWtlIGEgd2FuZCBvZiBwb2x5bW9ycGgu" },
michael@0 1455 { "They say that a wood golem named Pinocchio would be easy to control.",
michael@0 1456 "VGhleSBzYXkgdGhhdCBhIHdvb2QgZ29sZW0gbmFtZWQgUGlub2NjaGlvIHdvdWxkIGJlIGVhc3kgdG8gY29udHJvbC4=" },
michael@0 1457 { "They say that after killing a dragon it's time for a change of scenery.",
michael@0 1458 "VGhleSBzYXkgdGhhdCBhZnRlciBraWxsaW5nIGEgZHJhZ29uIGl0J3MgdGltZSBmb3IgYSBjaGFuZ2Ugb2Ygc2NlbmVyeS4=" },
michael@0 1459 { "They say that an amulet of strangulation is worse than ring around the collar.",
michael@0 1460 "VGhleSBzYXkgdGhhdCBhbiBhbXVsZXQgb2Ygc3RyYW5ndWxhdGlvbiBpcyB3b3JzZSB0aGFuIHJpbmcgYXJvdW5kIHRoZSBjb2xsYXIu" },
michael@0 1461 { "They say that an attic is the best place to hide your toys.",
michael@0 1462 "VGhleSBzYXkgdGhhdCBhbiBhdHRpYyBpcyB0aGUgYmVzdCBwbGFjZSB0byBoaWRlIHlvdXIgdG95cy4=" },
michael@0 1463 { "They say that an axe named Cleaver once belonged to a hacker named Beaver.",
michael@0 1464 "VGhleSBzYXkgdGhhdCBhbiBheGUgbmFtZWQgQ2xlYXZlciBvbmNlIGJlbG9uZ2VkIHRvIGEgaGFja2VyIG5hbWVkIEJlYXZlci4=" },
michael@0 1465 { "They say that an eye of newt and a wing of bat are double the trouble.",
michael@0 1466 "VGhleSBzYXkgdGhhdCBhbiBleWUgb2YgbmV3dCBhbmQgYSB3aW5nIG9mIGJhdCBhcmUgZG91YmxlIHRoZSB0cm91YmxlLg==" },
michael@0 1467 { "They say that an incubus named Izzy sometimes makes women feel sensitive.",
michael@0 1468 "VGhleSBzYXkgdGhhdCBhbiBpbmN1YnVzIG5hbWVkIEl6enkgc29tZXRpbWVzIG1ha2VzIHdvbWVuIGZlZWwgc2Vuc2l0aXZlLg==" },
michael@0 1469 { "They say that an opulent throne room is rarely a place to wish you'd be in.",
michael@0 1470 "VGhleSBzYXkgdGhhdCBhbiBvcHVsZW50IHRocm9uZSByb29tIGlzIHJhcmVseSBhIHBsYWNlIHRvIHdpc2ggeW91J2QgYmUgaW4u" },
michael@0 1471 { "They say that an unlucky hacker once had a nose bleed at an altar and died.",
michael@0 1472 "VGhleSBzYXkgdGhhdCBhbiB1bmx1Y2t5IGhhY2tlciBvbmNlIGhhZCBhIG5vc2UgYmxlZWQgYXQgYW4gYWx0YXIgYW5kIGRpZWQu" },
michael@0 1473 { "They say that and they say this but they never say never, never!",
michael@0 1474 "VGhleSBzYXkgdGhhdCBhbmQgdGhleSBzYXkgdGhpcyBidXQgdGhleSBuZXZlciBzYXkgbmV2ZXIsIG5ldmVyIQ==" },
michael@0 1475 { "They say that any quantum mechanic knows that speed kills.",
michael@0 1476 "VGhleSBzYXkgdGhhdCBhbnkgcXVhbnR1bSBtZWNoYW5pYyBrbm93cyB0aGF0IHNwZWVkIGtpbGxzLg==" },
michael@0 1477 { "They say that applying a unicorn horn means you've missed the point.",
michael@0 1478 "VGhleSBzYXkgdGhhdCBhcHBseWluZyBhIHVuaWNvcm4gaG9ybiBtZWFucyB5b3UndmUgbWlzc2VkIHRoZSBwb2ludC4=" },
michael@0 1479 { "They say that blue stones are radioactive, beware.",
michael@0 1480 "VGhleSBzYXkgdGhhdCBibHVlIHN0b25lcyBhcmUgcmFkaW9hY3RpdmUsIGJld2FyZS4=" },
michael@0 1481 { "They say that building a dungeon is a team effort.",
michael@0 1482 "VGhleSBzYXkgdGhhdCBidWlsZGluZyBhIGR1bmdlb24gaXMgYSB0ZWFtIGVmZm9ydC4=" },
michael@0 1483 { "They say that chaotic characters never get a kick out of altars.",
michael@0 1484 "VGhleSBzYXkgdGhhdCBjaGFvdGljIGNoYXJhY3RlcnMgbmV2ZXIgZ2V0IGEga2ljayBvdXQgb2YgYWx0YXJzLg==" },
michael@0 1485 { "They say that collapsing a dungeon often creates a panic.",
michael@0 1486 "VGhleSBzYXkgdGhhdCBjb2xsYXBzaW5nIGEgZHVuZ2VvbiBvZnRlbiBjcmVhdGVzIGEgcGFuaWMu" },
michael@0 1487 { "They say that counting your eggs before they hatch shows that you care.",
michael@0 1488 "VGhleSBzYXkgdGhhdCBjb3VudGluZyB5b3VyIGVnZ3MgYmVmb3JlIHRoZXkgaGF0Y2ggc2hvd3MgdGhhdCB5b3UgY2FyZS4=" },
michael@0 1489 { "They say that dipping a bag of tricks in a fountain won't make it an icebox.",
michael@0 1490 "VGhleSBzYXkgdGhhdCBkaXBwaW5nIGEgYmFnIG9mIHRyaWNrcyBpbiBhIGZvdW50YWluIHdvbid0IG1ha2UgaXQgYW4gaWNlYm94Lg==" },
michael@0 1491 { "They say that dipping an eel and brown mold in hot water makes bouillabaisse.",
michael@0 1492 "VGhleSBzYXkgdGhhdCBkaXBwaW5nIGFuIGVlbCBhbmQgYnJvd24gbW9sZCBpbiBob3Qgd2F0ZXIgbWFrZXMgYm91aWxsYWJhaXNzZS4=" },
michael@0 1493 { "They say that donating a doubloon is extremely pious charity.",
michael@0 1494 "VGhleSBzYXkgdGhhdCBkb25hdGluZyBhIGRvdWJsb29uIGlzIGV4dHJlbWVseSBwaW91cyBjaGFyaXR5Lg==" },
michael@0 1495 { "They say that eating royal jelly attracts grizzly owlbears.",
michael@0 1496 "VGhleSBzYXkgdGhhdCBlYXRpbmcgcm95YWwgamVsbHkgYXR0cmFjdHMgZ3JpenpseSBvd2xiZWFycy4=" },
michael@0 1497 { "They say that eggs, pancakes and juice are just a mundane breakfast.",
michael@0 1498 "VGhleSBzYXkgdGhhdCBlZ2dzLCBwYW5jYWtlcyBhbmQganVpY2UgYXJlIGp1c3QgYSBtdW5kYW5lIGJyZWFrZmFzdC4=" },
michael@0 1499 { "They say that everyone knows why Medusa stands alone in the dark.",
michael@0 1500 "VGhleSBzYXkgdGhhdCBldmVyeW9uZSBrbm93cyB3aHkgTWVkdXNhIHN0YW5kcyBhbG9uZSBpbiB0aGUgZGFyay4=" },
michael@0 1501 { "They say that everyone wanted rec.games.hack to undergo a name change.",
michael@0 1502 "VGhleSBzYXkgdGhhdCBldmVyeW9uZSB3YW50ZWQgcmVjLmdhbWVzLmhhY2sgdG8gdW5kZXJnbyBhIG5hbWUgY2hhbmdlLg==" },
michael@0 1503 { "They say that finding a winning strategy is a deliberate move on your part.",
michael@0 1504 "VGhleSBzYXkgdGhhdCBmaW5kaW5nIGEgd2lubmluZyBzdHJhdGVneSBpcyBhIGRlbGliZXJhdGUgbW92ZSBvbiB5b3VyIHBhcnQu" },
michael@0 1505 { "They say that finding worthless glass is worth something.",
michael@0 1506 "VGhleSBzYXkgdGhhdCBmaW5kaW5nIHdvcnRobGVzcyBnbGFzcyBpcyB3b3J0aCBzb21ldGhpbmcu" },
michael@0 1507 { "They say that fortune cookies are food for thought.",
michael@0 1508 "VGhleSBzYXkgdGhhdCBmb3J0dW5lIGNvb2tpZXMgYXJlIGZvb2QgZm9yIHRob3VnaHQu" },
michael@0 1509 { "They say that gold is only wasted on a pet dragon.",
michael@0 1510 "VGhleSBzYXkgdGhhdCBnb2xkIGlzIG9ubHkgd2FzdGVkIG9uIGEgcGV0IGRyYWdvbi4=" },
michael@0 1511 { "They say that good things come to those that wait.",
michael@0 1512 "VGhleSBzYXkgdGhhdCBnb29kIHRoaW5ncyBjb21lIHRvIHRob3NlIHRoYXQgd2FpdC4=" },
michael@0 1513 { "They say that greased objects will slip out of monsters' hands.",
michael@0 1514 "VGhleSBzYXkgdGhhdCBncmVhc2VkIG9iamVjdHMgd2lsbCBzbGlwIG91dCBvZiBtb25zdGVycycgaGFuZHMu" },
michael@0 1515 { "They say that if you can't spell then you'll wish you had a spell book.",
michael@0 1516 "VGhleSBzYXkgdGhhdCBpZiB5b3UgY2FuJ3Qgc3BlbGwgdGhlbiB5b3UnbGwgd2lzaCB5b3UgaGFkIGEgc3BlbGwgYm9vay4=" },
michael@0 1517 { "They say that if you live by the sword, you'll die by the sword.",
michael@0 1518 "VGhleSBzYXkgdGhhdCBpZiB5b3UgbGl2ZSBieSB0aGUgc3dvcmQsIHlvdSdsbCBkaWUgYnkgdGhlIHN3b3JkLg==" },
michael@0 1519 { "They say that if you play like a monster you'll have a better game.",
michael@0 1520 "VGhleSBzYXkgdGhhdCBpZiB5b3UgcGxheSBsaWtlIGEgbW9uc3RlciB5b3UnbGwgaGF2ZSBhIGJldHRlciBnYW1lLg==" },
michael@0 1521 { "They say that if you sleep with a demon you might awake with a headache.",
michael@0 1522 "VGhleSBzYXkgdGhhdCBpZiB5b3Ugc2xlZXAgd2l0aCBhIGRlbW9uIHlvdSBtaWdodCBhd2FrZSB3aXRoIGEgaGVhZGFjaGUu" },
michael@0 1523 { "They say that if you step on a crack you could break your mother's back.",
michael@0 1524 "VGhleSBzYXkgdGhhdCBpZiB5b3Ugc3RlcCBvbiBhIGNyYWNrIHlvdSBjb3VsZCBicmVhayB5b3VyIG1vdGhlcidzIGJhY2su" },
michael@0 1525 { "They say that if you're invisible you can still be heard!",
michael@0 1526 "VGhleSBzYXkgdGhhdCBpZiB5b3UncmUgaW52aXNpYmxlIHlvdSBjYW4gc3RpbGwgYmUgaGVhcmQh" },
michael@0 1527 { "They say that if you're lucky you can feel the runes on a scroll.",
michael@0 1528 "VGhleSBzYXkgdGhhdCBpZiB5b3UncmUgbHVja3kgeW91IGNhbiBmZWVsIHRoZSBydW5lcyBvbiBhIHNjcm9sbC4=" },
michael@0 1529 { "They say that in the big picture gold is only small change.",
michael@0 1530 "VGhleSBzYXkgdGhhdCBpbiB0aGUgYmlnIHBpY3R1cmUgZ29sZCBpcyBvbmx5IHNtYWxsIGNoYW5nZS4=" },
michael@0 1531 { "They say that in the dungeon it's not what you know that really matters.",
michael@0 1532 "VGhleSBzYXkgdGhhdCBpbiB0aGUgZHVuZ2VvbiBpdCdzIG5vdCB3aGF0IHlvdSBrbm93IHRoYXQgcmVhbGx5IG1hdHRlcnMu" },
michael@0 1533 { "They say that in the dungeon moon rocks are really dilithium crystals.",
michael@0 1534 "VGhleSBzYXkgdGhhdCBpbiB0aGUgZHVuZ2VvbiBtb29uIHJvY2tzIGFyZSByZWFsbHkgZGlsaXRoaXVtIGNyeXN0YWxzLg==" },
michael@0 1535 { "They say that in the dungeon the boorish customer is never right.",
michael@0 1536 "VGhleSBzYXkgdGhhdCBpbiB0aGUgZHVuZ2VvbiB0aGUgYm9vcmlzaCBjdXN0b21lciBpcyBuZXZlciByaWdodC4=" },
michael@0 1537 { "They say that in the dungeon you don't need a watch to tell time.",
michael@0 1538 "VGhleSBzYXkgdGhhdCBpbiB0aGUgZHVuZ2VvbiB5b3UgZG9uJ3QgbmVlZCBhIHdhdGNoIHRvIHRlbGwgdGltZS4=" },
michael@0 1539 { "They say that in the dungeon you need something old, new, burrowed and blue.",
michael@0 1540 "VGhleSBzYXkgdGhhdCBpbiB0aGUgZHVuZ2VvbiB5b3UgbmVlZCBzb21ldGhpbmcgb2xkLCBuZXcsIGJ1cnJvd2VkIGFuZCBibHVlLg==" },
michael@0 1541 { "They say that in the dungeon you should always count your blessings.",
michael@0 1542 "VGhleSBzYXkgdGhhdCBpbiB0aGUgZHVuZ2VvbiB5b3Ugc2hvdWxkIGFsd2F5cyBjb3VudCB5b3VyIGJsZXNzaW5ncy4=" },
michael@0 1543 { "They say that iron golem plate mail isn't worth wishing for.",
michael@0 1544 "VGhleSBzYXkgdGhhdCBpcm9uIGdvbGVtIHBsYXRlIG1haWwgaXNuJ3Qgd29ydGggd2lzaGluZyBmb3Iu" },
michael@0 1545 { "They say that it takes four quarterstaffs to make one staff.",
michael@0 1546 "VGhleSBzYXkgdGhhdCBpdCB0YWtlcyBmb3VyIHF1YXJ0ZXJzdGFmZnMgdG8gbWFrZSBvbmUgc3RhZmYu" },
michael@0 1547 { "They say that it's not over till the fat ladies sing.",
michael@0 1548 "VGhleSBzYXkgdGhhdCBpdCdzIG5vdCBvdmVyIHRpbGwgdGhlIGZhdCBsYWRpZXMgc2luZy4=" },
michael@0 1549 { "They say that it's not over till the fat lady shouts `Off with its head'.",
michael@0 1550 "VGhleSBzYXkgdGhhdCBpdCdzIG5vdCBvdmVyIHRpbGwgdGhlIGZhdCBsYWR5IHNob3V0cyBgT2ZmIHdpdGggaXRzIGhlYWQnLg==" },
michael@0 1551 { "They say that kicking a heavy statue is really a dumb move.",
michael@0 1552 "VGhleSBzYXkgdGhhdCBraWNraW5nIGEgaGVhdnkgc3RhdHVlIGlzIHJlYWxseSBhIGR1bWIgbW92ZS4=" },
michael@0 1553 { "They say that kicking a valuable gem doesn't seem to make sense.",
michael@0 1554 "VGhleSBzYXkgdGhhdCBraWNraW5nIGEgdmFsdWFibGUgZ2VtIGRvZXNuJ3Qgc2VlbSB0byBtYWtlIHNlbnNlLg==" },
michael@0 1555 { "They say that leprechauns know Latin and you should too.",
michael@0 1556 "VGhleSBzYXkgdGhhdCBsZXByZWNoYXVucyBrbm93IExhdGluIGFuZCB5b3Ugc2hvdWxkIHRvby4=" },
michael@0 1557 { "They say that minotaurs get lost outside of the mazes.",
michael@0 1558 "VGhleSBzYXkgdGhhdCBtaW5vdGF1cnMgZ2V0IGxvc3Qgb3V0c2lkZSBvZiB0aGUgbWF6ZXMu" },
michael@0 1559 { "They say that most trolls are born again.",
michael@0 1560 "VGhleSBzYXkgdGhhdCBtb3N0IHRyb2xscyBhcmUgYm9ybiBhZ2Fpbi4=" },
michael@0 1561 { "They say that naming your cat Garfield will make you more attractive.",
michael@0 1562 "VGhleSBzYXkgdGhhdCBuYW1pbmcgeW91ciBjYXQgR2FyZmllbGQgd2lsbCBtYWtlIHlvdSBtb3JlIGF0dHJhY3RpdmUu" },
michael@0 1563 { "They say that no one knows everything about everything in the dungeon.",
michael@0 1564 "VGhleSBzYXkgdGhhdCBubyBvbmUga25vd3MgZXZlcnl0aGluZyBhYm91dCBldmVyeXRoaW5nIGluIHRoZSBkdW5nZW9uLg==" },
michael@0 1565 { "They say that no one plays NetHack just for the fun of it.",
michael@0 1566 "VGhleSBzYXkgdGhhdCBubyBvbmUgcGxheXMgTmV0SGFjayBqdXN0IGZvciB0aGUgZnVuIG9mIGl0Lg==" },
michael@0 1567 { "They say that no one really subscribes to rec.games.roguelike.nethack.",
michael@0 1568 "VGhleSBzYXkgdGhhdCBubyBvbmUgcmVhbGx5IHN1YnNjcmliZXMgdG8gcmVjLmdhbWVzLnJvZ3VlbGlrZS5uZXRoYWNrLg==" },
michael@0 1569 { "They say that no one will admit to starting a rumor.",
michael@0 1570 "VGhleSBzYXkgdGhhdCBubyBvbmUgd2lsbCBhZG1pdCB0byBzdGFydGluZyBhIHJ1bW9yLg==" },
michael@0 1571 { "They say that nurses sometimes carry scalpels and never use them.",
michael@0 1572 "VGhleSBzYXkgdGhhdCBudXJzZXMgc29tZXRpbWVzIGNhcnJ5IHNjYWxwZWxzIGFuZCBuZXZlciB1c2UgdGhlbS4=" },
michael@0 1573 { "They say that once you've met one wizard you've met them all.",
michael@0 1574 "VGhleSBzYXkgdGhhdCBvbmNlIHlvdSd2ZSBtZXQgb25lIHdpemFyZCB5b3UndmUgbWV0IHRoZW0gYWxsLg==" },
michael@0 1575 { "They say that one troll is worth 10,000 newts.",
michael@0 1576 "VGhleSBzYXkgdGhhdCBvbmUgdHJvbGwgaXMgd29ydGggMTAsMDAwIG5ld3RzLg==" },
michael@0 1577 { "They say that only David can find the zoo!",
michael@0 1578 "VGhleSBzYXkgdGhhdCBvbmx5IERhdmlkIGNhbiBmaW5kIHRoZSB6b28h" },
michael@0 1579 { "They say that only angels play their harps for their pets.",
michael@0 1580 "VGhleSBzYXkgdGhhdCBvbmx5IGFuZ2VscyBwbGF5IHRoZWlyIGhhcnBzIGZvciB0aGVpciBwZXRzLg==" },
michael@0 1581 { "They say that only big spenders carry gold.",
michael@0 1582 "VGhleSBzYXkgdGhhdCBvbmx5IGJpZyBzcGVuZGVycyBjYXJyeSBnb2xkLg==" },
michael@0 1583 { "They say that orc shamans are healthy, wealthy and wise.",
michael@0 1584 "VGhleSBzYXkgdGhhdCBvcmMgc2hhbWFucyBhcmUgaGVhbHRoeSwgd2VhbHRoeSBhbmQgd2lzZS4=" },
michael@0 1585 { "They say that playing NetHack is like walking into a death trap.",
michael@0 1586 "VGhleSBzYXkgdGhhdCBwbGF5aW5nIE5ldEhhY2sgaXMgbGlrZSB3YWxraW5nIGludG8gYSBkZWF0aCB0cmFwLg==" },
michael@0 1587 { "They say that problem breathing is best treated by a proper diet.",
michael@0 1588 "VGhleSBzYXkgdGhhdCBwcm9ibGVtIGJyZWF0aGluZyBpcyBiZXN0IHRyZWF0ZWQgYnkgYSBwcm9wZXIgZGlldC4=" },
michael@0 1589 { "They say that quaffing many potions of levitation can give you a headache.",
michael@0 1590 "VGhleSBzYXkgdGhhdCBxdWFmZmluZyBtYW55IHBvdGlvbnMgb2YgbGV2aXRhdGlvbiBjYW4gZ2l2ZSB5b3UgYSBoZWFkYWNoZS4=" },
michael@0 1591 { "They say that queen bees get that way by eating royal jelly.",
michael@0 1592 "VGhleSBzYXkgdGhhdCBxdWVlbiBiZWVzIGdldCB0aGF0IHdheSBieSBlYXRpbmcgcm95YWwgamVsbHku" },
michael@0 1593 { "They say that reading a scare monster scroll is the same as saying Elbereth.",
michael@0 1594 "VGhleSBzYXkgdGhhdCByZWFkaW5nIGEgc2NhcmUgbW9uc3RlciBzY3JvbGwgaXMgdGhlIHNhbWUgYXMgc2F5aW5nIEVsYmVyZXRoLg==" },
michael@0 1595 { "They say that real hackers always are controlled.",
michael@0 1596 "VGhleSBzYXkgdGhhdCByZWFsIGhhY2tlcnMgYWx3YXlzIGFyZSBjb250cm9sbGVkLg==" },
michael@0 1597 { "They say that real hackers never sleep.",
michael@0 1598 "VGhleSBzYXkgdGhhdCByZWFsIGhhY2tlcnMgbmV2ZXIgc2xlZXAu" },
michael@0 1599 { "They say that shopkeepers are insured by Croesus himself!",
michael@0 1600 "VGhleSBzYXkgdGhhdCBzaG9wa2VlcGVycyBhcmUgaW5zdXJlZCBieSBDcm9lc3VzIGhpbXNlbGYh" },
michael@0 1601 { "They say that shopkeepers never carry more than 20 gold pieces, at night.",
michael@0 1602 "VGhleSBzYXkgdGhhdCBzaG9wa2VlcGVycyBuZXZlciBjYXJyeSBtb3JlIHRoYW4gMjAgZ29sZCBwaWVjZXMsIGF0IG5pZ2h0Lg==" },
michael@0 1603 { "They say that shopkeepers never sell blessed potions of invisibility.",
michael@0 1604 "VGhleSBzYXkgdGhhdCBzaG9wa2VlcGVycyBuZXZlciBzZWxsIGJsZXNzZWQgcG90aW9ucyBvZiBpbnZpc2liaWxpdHku" },
michael@0 1605 { "They say that soldiers wear kid gloves and silly helmets.",
michael@0 1606 "VGhleSBzYXkgdGhhdCBzb2xkaWVycyB3ZWFyIGtpZCBnbG92ZXMgYW5kIHNpbGx5IGhlbG1ldHMu" },
michael@0 1607 { "They say that some Kops are on the take.",
michael@0 1608 "VGhleSBzYXkgdGhhdCBzb21lIEtvcHMgYXJlIG9uIHRoZSB0YWtlLg==" },
michael@0 1609 { "They say that some guards' palms can be greased.",
michael@0 1610 "VGhleSBzYXkgdGhhdCBzb21lIGd1YXJkcycgcGFsbXMgY2FuIGJlIGdyZWFzZWQu" },
michael@0 1611 { "They say that some monsters may kiss your boots to stop your drum playing.",
michael@0 1612 "VGhleSBzYXkgdGhhdCBzb21lIG1vbnN0ZXJzIG1heSBraXNzIHlvdXIgYm9vdHMgdG8gc3RvcCB5b3VyIGRydW0gcGxheWluZy4=" },
michael@0 1613 { "They say that sometimes you can be the hit of the party when playing a horn.",
michael@0 1614 "VGhleSBzYXkgdGhhdCBzb21ldGltZXMgeW91IGNhbiBiZSB0aGUgaGl0IG9mIHRoZSBwYXJ0eSB3aGVuIHBsYXlpbmcgYSBob3JuLg==" },
michael@0 1615 { "They say that the NetHack gods generally welcome your sacrifices.",
michael@0 1616 "VGhleSBzYXkgdGhhdCB0aGUgTmV0SGFjayBnb2RzIGdlbmVyYWxseSB3ZWxjb21lIHlvdXIgc2FjcmlmaWNlcy4=" },
michael@0 1617 { "They say that the Three Rings are named Vilya, Nenya and Narya.",
michael@0 1618 "VGhleSBzYXkgdGhhdCB0aGUgVGhyZWUgUmluZ3MgYXJlIG5hbWVkIFZpbHlhLCBOZW55YSBhbmQgTmFyeWEu" },
michael@0 1619 { "They say that the Wizard of Yendor has a death wish.",
michael@0 1620 "VGhleSBzYXkgdGhhdCB0aGUgV2l6YXJkIG9mIFllbmRvciBoYXMgYSBkZWF0aCB3aXNoLg==" },
michael@0 1621 { "They say that the `hair of the dog' is sometimes an effective remedy.",
michael@0 1622 "VGhleSBzYXkgdGhhdCB0aGUgYGhhaXIgb2YgdGhlIGRvZycgaXMgc29tZXRpbWVzIGFuIGVmZmVjdGl2ZSByZW1lZHku" },
michael@0 1623 { "They say that the best time to save your game is now before its too late.",
michael@0 1624 "VGhleSBzYXkgdGhhdCB0aGUgYmVzdCB0aW1lIHRvIHNhdmUgeW91ciBnYW1lIGlzIG5vdyBiZWZvcmUgaXRzIHRvbyBsYXRlLg==" },
michael@0 1625 { "They say that the biggest obstacle in NetHack is your mind.",
michael@0 1626 "VGhleSBzYXkgdGhhdCB0aGUgYmlnZ2VzdCBvYnN0YWNsZSBpbiBOZXRIYWNrIGlzIHlvdXIgbWluZC4=" },
michael@0 1627 { "They say that the gods are angry when they hit you with objects.",
michael@0 1628 "VGhleSBzYXkgdGhhdCB0aGUgZ29kcyBhcmUgYW5ncnkgd2hlbiB0aGV5IGhpdCB5b3Ugd2l0aCBvYmplY3RzLg==" },
michael@0 1629 { "They say that the priesthood are specially favored by the gods.",
michael@0 1630 "VGhleSBzYXkgdGhhdCB0aGUgcHJpZXN0aG9vZCBhcmUgc3BlY2lhbGx5IGZhdm9yZWQgYnkgdGhlIGdvZHMu" },
michael@0 1631 { "They say that the way to make a unicorn happy is to give it what it wants.",
michael@0 1632 "VGhleSBzYXkgdGhhdCB0aGUgd2F5IHRvIG1ha2UgYSB1bmljb3JuIGhhcHB5IGlzIHRvIGdpdmUgaXQgd2hhdCBpdCB3YW50cy4=" },
michael@0 1633 { "They say that there are no black or white stones, only gray.",
michael@0 1634 "VGhleSBzYXkgdGhhdCB0aGVyZSBhcmUgbm8gYmxhY2sgb3Igd2hpdGUgc3RvbmVzLCBvbmx5IGdyYXku" },
michael@0 1635 { "They say that there are no skeletons hence there are no skeleton keys.",
michael@0 1636 "VGhleSBzYXkgdGhhdCB0aGVyZSBhcmUgbm8gc2tlbGV0b25zIGhlbmNlIHRoZXJlIGFyZSBubyBza2VsZXRvbiBrZXlzLg==" },
michael@0 1637 { "They say that there is a clever rogue in every hacker just dying to escape.",
michael@0 1638 "VGhleSBzYXkgdGhhdCB0aGVyZSBpcyBhIGNsZXZlciByb2d1ZSBpbiBldmVyeSBoYWNrZXIganVzdCBkeWluZyB0byBlc2NhcGUu" },
michael@0 1639 { "They say that there is no such thing as free advice.",
michael@0 1640 "VGhleSBzYXkgdGhhdCB0aGVyZSBpcyBubyBzdWNoIHRoaW5nIGFzIGZyZWUgYWR2aWNlLg==" },
michael@0 1641 { "They say that there is only one way to win at NetHack.",
michael@0 1642 "VGhleSBzYXkgdGhhdCB0aGVyZSBpcyBvbmx5IG9uZSB3YXkgdG8gd2luIGF0IE5ldEhhY2su" },
michael@0 1643 { "They say that there once was a fearsome chaotic samurai named Luk No.",
michael@0 1644 "VGhleSBzYXkgdGhhdCB0aGVyZSBvbmNlIHdhcyBhIGZlYXJzb21lIGNoYW90aWMgc2FtdXJhaSBuYW1lZCBMdWsgTm8u" },
michael@0 1645 { "They say that there was a time when cursed holy water wasn't water.",
michael@0 1646 "VGhleSBzYXkgdGhhdCB0aGVyZSB3YXMgYSB0aW1lIHdoZW4gY3Vyc2VkIGhvbHkgd2F0ZXIgd2Fzbid0IHdhdGVyLg==" },
michael@0 1647 { "They say that there's no point in crying over a gray ooze.",
michael@0 1648 "VGhleSBzYXkgdGhhdCB0aGVyZSdzIG5vIHBvaW50IGluIGNyeWluZyBvdmVyIGEgZ3JheSBvb3plLg==" },
michael@0 1649 { "They say that there's only hope left after you've opened Pandora's box.",
michael@0 1650 "VGhleSBzYXkgdGhhdCB0aGVyZSdzIG9ubHkgaG9wZSBsZWZ0IGFmdGVyIHlvdSd2ZSBvcGVuZWQgUGFuZG9yYSdzIGJveC4=" },
michael@0 1651 { "They say that trapdoors should always be marked `Caution: Trap Door'.",
michael@0 1652 "VGhleSBzYXkgdGhhdCB0cmFwZG9vcnMgc2hvdWxkIGFsd2F5cyBiZSBtYXJrZWQgYENhdXRpb246IFRyYXAgRG9vcicu" },
michael@0 1653 { "They say that using an amulet of change isn't a difficult operation.",
michael@0 1654 "VGhleSBzYXkgdGhhdCB1c2luZyBhbiBhbXVsZXQgb2YgY2hhbmdlIGlzbid0IGEgZGlmZmljdWx0IG9wZXJhdGlvbi4=" },
michael@0 1655 { "They say that water walking boots are better if you are fast like Hermes.",
michael@0 1656 "VGhleSBzYXkgdGhhdCB3YXRlciB3YWxraW5nIGJvb3RzIGFyZSBiZXR0ZXIgaWYgeW91IGFyZSBmYXN0IGxpa2UgSGVybWVzLg==" },
michael@0 1657 { "They say that when you wear a circular amulet you might resemble a troll.",
michael@0 1658 "VGhleSBzYXkgdGhhdCB3aGVuIHlvdSB3ZWFyIGEgY2lyY3VsYXIgYW11bGV0IHlvdSBtaWdodCByZXNlbWJsZSBhIHRyb2xsLg==" },
michael@0 1659 { "They say that when you're hungry you can get a pizza in 30 moves or it's free.",
michael@0 1660 "VGhleSBzYXkgdGhhdCB3aGVuIHlvdSdyZSBodW5ncnkgeW91IGNhbiBnZXQgYSBwaXp6YSBpbiAzMCBtb3ZlcyBvciBpdCdzIGZyZWUu" },
michael@0 1661 { "They say that when your god is angry you should try another one.",
michael@0 1662 "VGhleSBzYXkgdGhhdCB3aGVuIHlvdXIgZ29kIGlzIGFuZ3J5IHlvdSBzaG91bGQgdHJ5IGFub3RoZXIgb25lLg==" },
michael@0 1663 { "They say that wielding a unicorn horn takes strength.",
michael@0 1664 "VGhleSBzYXkgdGhhdCB3aWVsZGluZyBhIHVuaWNvcm4gaG9ybiB0YWtlcyBzdHJlbmd0aC4=" },
michael@0 1665 { "They say that with speed boots you never worry about hit and run accidents.",
michael@0 1666 "VGhleSBzYXkgdGhhdCB3aXRoIHNwZWVkIGJvb3RzIHlvdSBuZXZlciB3b3JyeSBhYm91dCBoaXQgYW5kIHJ1biBhY2NpZGVudHMu" },
michael@0 1667 { "They say that you can defeat a killer bee with a unicorn horn.",
michael@0 1668 "VGhleSBzYXkgdGhhdCB5b3UgY2FuIGRlZmVhdCBhIGtpbGxlciBiZWUgd2l0aCBhIHVuaWNvcm4gaG9ybi4=" },
michael@0 1669 { "They say that you can only cross the River Styx in Charon's boat.",
michael@0 1670 "VGhleSBzYXkgdGhhdCB5b3UgY2FuIG9ubHkgY3Jvc3MgdGhlIFJpdmVyIFN0eXggaW4gQ2hhcm9uJ3MgYm9hdC4=" },
michael@0 1671 { "They say that you can only kill a lich once and then you'd better be careful.",
michael@0 1672 "VGhleSBzYXkgdGhhdCB5b3UgY2FuIG9ubHkga2lsbCBhIGxpY2ggb25jZSBhbmQgdGhlbiB5b3UnZCBiZXR0ZXIgYmUgY2FyZWZ1bC4=" },
michael@0 1673 { "They say that you can only wish for things you've already had.",
michael@0 1674 "VGhleSBzYXkgdGhhdCB5b3UgY2FuIG9ubHkgd2lzaCBmb3IgdGhpbmdzIHlvdSd2ZSBhbHJlYWR5IGhhZC4=" },
michael@0 1675 { "They say that you can train a cat by talking gently to it.",
michael@0 1676 "VGhleSBzYXkgdGhhdCB5b3UgY2FuIHRyYWluIGEgY2F0IGJ5IHRhbGtpbmcgZ2VudGx5IHRvIGl0Lg==" },
michael@0 1677 { "They say that you can train a dog by talking firmly to it.",
michael@0 1678 "VGhleSBzYXkgdGhhdCB5b3UgY2FuIHRyYWluIGEgZG9nIGJ5IHRhbGtpbmcgZmlybWx5IHRvIGl0Lg==" },
michael@0 1679 { "They say that you can trust your gold with the king.",
michael@0 1680 "VGhleSBzYXkgdGhhdCB5b3UgY2FuIHRydXN0IHlvdXIgZ29sZCB3aXRoIHRoZSBraW5nLg==" },
michael@0 1681 { "They say that you can't wipe your greasy bare hands on a blank scroll.",
michael@0 1682 "VGhleSBzYXkgdGhhdCB5b3UgY2FuJ3Qgd2lwZSB5b3VyIGdyZWFzeSBiYXJlIGhhbmRzIG9uIGEgYmxhbmsgc2Nyb2xsLg==" },
michael@0 1683 { "They say that you cannot trust scrolls of rumor.",
michael@0 1684 "VGhleSBzYXkgdGhhdCB5b3UgY2Fubm90IHRydXN0IHNjcm9sbHMgb2YgcnVtb3Iu" },
michael@0 1685 { "They say that you could fall head over heels for an energy vortex.",
michael@0 1686 "VGhleSBzYXkgdGhhdCB5b3UgY291bGQgZmFsbCBoZWFkIG92ZXIgaGVlbHMgZm9yIGFuIGVuZXJneSB2b3J0ZXgu" },
michael@0 1687 { "They say that you need a key in order to open locked doors.",
michael@0 1688 "VGhleSBzYXkgdGhhdCB5b3UgbmVlZCBhIGtleSBpbiBvcmRlciB0byBvcGVuIGxvY2tlZCBkb29ycy4=" },
michael@0 1689 { "They say that you need a mirror to notice a mimic in an antique shop.",
michael@0 1690 "VGhleSBzYXkgdGhhdCB5b3UgbmVlZCBhIG1pcnJvciB0byBub3RpY2UgYSBtaW1pYyBpbiBhbiBhbnRpcXVlIHNob3Au" },
michael@0 1691 { "They say that you really can use a pick-axe unless you really can't.",
michael@0 1692 "VGhleSBzYXkgdGhhdCB5b3UgcmVhbGx5IGNhbiB1c2UgYSBwaWNrLWF4ZSB1bmxlc3MgeW91IHJlYWxseSBjYW4ndC4=" },
michael@0 1693 { "They say that you should always store your tools in the cellar.",
michael@0 1694 "VGhleSBzYXkgdGhhdCB5b3Ugc2hvdWxkIGFsd2F5cyBzdG9yZSB5b3VyIHRvb2xzIGluIHRoZSBjZWxsYXIu" },
michael@0 1695 { "They say that you should be careful while climbing the ladder to success.",
michael@0 1696 "VGhleSBzYXkgdGhhdCB5b3Ugc2hvdWxkIGJlIGNhcmVmdWwgd2hpbGUgY2xpbWJpbmcgdGhlIGxhZGRlciB0byBzdWNjZXNzLg==" },
michael@0 1697 { "They say that you should call your armor `rustproof'.",
michael@0 1698 "VGhleSBzYXkgdGhhdCB5b3Ugc2hvdWxkIGNhbGwgeW91ciBhcm1vciBgcnVzdHByb29mJy4=" },
michael@0 1699 { "They say that you should name your dog Spuds to have a cool pet.",
michael@0 1700 "VGhleSBzYXkgdGhhdCB5b3Ugc2hvdWxkIG5hbWUgeW91ciBkb2cgU3B1ZHMgdG8gaGF2ZSBhIGNvb2wgcGV0Lg==" },
michael@0 1701 { "They say that you should name your weapon after your first monster kill.",
michael@0 1702 "VGhleSBzYXkgdGhhdCB5b3Ugc2hvdWxkIG5hbWUgeW91ciB3ZWFwb24gYWZ0ZXIgeW91ciBmaXJzdCBtb25zdGVyIGtpbGwu" },
michael@0 1703 { "They say that you should never introduce a rope golem to a succubus.",
michael@0 1704 "VGhleSBzYXkgdGhhdCB5b3Ugc2hvdWxkIG5ldmVyIGludHJvZHVjZSBhIHJvcGUgZ29sZW0gdG8gYSBzdWNjdWJ1cy4=" },
michael@0 1705 { "They say that you should never sleep near invisible ring wraiths.",
michael@0 1706 "VGhleSBzYXkgdGhhdCB5b3Ugc2hvdWxkIG5ldmVyIHNsZWVwIG5lYXIgaW52aXNpYmxlIHJpbmcgd3JhaXRocy4=" },
michael@0 1707 { "They say that you should never try to leave the dungeon with a bag of gems.",
michael@0 1708 "VGhleSBzYXkgdGhhdCB5b3Ugc2hvdWxkIG5ldmVyIHRyeSB0byBsZWF2ZSB0aGUgZHVuZ2VvbiB3aXRoIGEgYmFnIG9mIGdlbXMu" },
michael@0 1709 { "They say that you should remove your armor before sitting on a throne.",
michael@0 1710 "VGhleSBzYXkgdGhhdCB5b3Ugc2hvdWxkIHJlbW92ZSB5b3VyIGFybW9yIGJlZm9yZSBzaXR0aW5nIG9uIGEgdGhyb25lLg==" },
michael@0 1711 { "This fortune cookie is copy protected.",
michael@0 1712 "VGhpcyBmb3J0dW5lIGNvb2tpZSBpcyBjb3B5IHByb3RlY3RlZC4=" },
michael@0 1713 { "This fortune cookie is the property of Fortune Cookies, Inc.",
michael@0 1714 "VGhpcyBmb3J0dW5lIGNvb2tpZSBpcyB0aGUgcHJvcGVydHkgb2YgRm9ydHVuZSBDb29raWVzLCBJbmMu" },
michael@0 1715 { "Tired? Try a scroll of charging on yourself.",
michael@0 1716 "VGlyZWQ/IFRyeSBhIHNjcm9sbCBvZiBjaGFyZ2luZyBvbiB5b3Vyc2VsZi4=" },
michael@0 1717 { "To achieve the next higher rating, you need 3 more points.",
michael@0 1718 "VG8gYWNoaWV2ZSB0aGUgbmV4dCBoaWdoZXIgcmF0aW5nLCB5b3UgbmVlZCAzIG1vcmUgcG9pbnRzLg==" },
michael@0 1719 { "To reach heaven, escape the dungeon while wearing a ring of levitation.",
michael@0 1720 "VG8gcmVhY2ggaGVhdmVuLCBlc2NhcGUgdGhlIGR1bmdlb24gd2hpbGUgd2VhcmluZyBhIHJpbmcgb2YgbGV2aXRhdGlvbi4=" },
michael@0 1721 { "Tourists wear shirts loud enough to wake the dead.",
michael@0 1722 "VG91cmlzdHMgd2VhciBzaGlydHMgbG91ZCBlbm91Z2ggdG8gd2FrZSB0aGUgZGVhZC4=" },
michael@0 1723 { "Try calling your katana Moulinette.",
michael@0 1724 "VHJ5IGNhbGxpbmcgeW91ciBrYXRhbmEgTW91bGluZXR0ZS4=" },
michael@0 1725 { "Ulch! That meat was painted!",
michael@0 1726 "VWxjaCEgVGhhdCBtZWF0IHdhcyBwYWludGVkIQ==" },
michael@0 1727 { "Unfortunately, this message was left intentionally blank.",
michael@0 1728 "VW5mb3J0dW5hdGVseSwgdGhpcyBtZXNzYWdlIHdhcyBsZWZ0IGludGVudGlvbmFsbHkgYmxhbmsu" },
michael@0 1729 { "Using a morning star in the evening has no effect.",
michael@0 1730 "VXNpbmcgYSBtb3JuaW5nIHN0YXIgaW4gdGhlIGV2ZW5pbmcgaGFzIG5vIGVmZmVjdC4=" },
michael@0 1731 { "Want a hint? Zap a wand of make invisible on your weapon!",
michael@0 1732 "V2FudCBhIGhpbnQ/IFphcCBhIHdhbmQgb2YgbWFrZSBpbnZpc2libGUgb24geW91ciB3ZWFwb24h" },
michael@0 1733 { "Want to ascend in a hurry? Apply at Gizmonic Institute.",
michael@0 1734 "V2FudCB0byBhc2NlbmQgaW4gYSBodXJyeT8gQXBwbHkgYXQgR2l6bW9uaWMgSW5zdGl0dXRlLg==" },
michael@0 1735 { "Wanted: shopkeepers. Send a scroll of mail to Mage of Yendor/Level 35/Dungeon.",
michael@0 1736 "V2FudGVkOiBzaG9wa2VlcGVycy4gU2VuZCBhIHNjcm9sbCBvZiBtYWlsIHRvIE1hZ2Ugb2YgWWVuZG9yL0xldmVsIDM1L0R1bmdlb24u" },
michael@0 1737 { "Warning: fortune reading can be hazardous to your health.",
michael@0 1738 "V2FybmluZzogZm9ydHVuZSByZWFkaW5nIGNhbiBiZSBoYXphcmRvdXMgdG8geW91ciBoZWFsdGgu" },
michael@0 1739 { "We have new ways of detecting treachery...",
michael@0 1740 "V2UgaGF2ZSBuZXcgd2F5cyBvZiBkZXRlY3RpbmcgdHJlYWNoZXJ5Li4u" },
michael@0 1741 { "Wet towels make great weapons!",
michael@0 1742 "V2V0IHRvd2VscyBtYWtlIGdyZWF0IHdlYXBvbnMh" },
michael@0 1743 { "What a pity, you cannot read it!",
michael@0 1744 "V2hhdCBhIHBpdHksIHlvdSBjYW5ub3QgcmVhZCBpdCE=" },
michael@0 1745 { "When a piercer drops in on you, you will be tempted to hit the ceiling!",
michael@0 1746 "V2hlbiBhIHBpZXJjZXIgZHJvcHMgaW4gb24geW91LCB5b3Ugd2lsbCBiZSB0ZW1wdGVkIHRvIGhpdCB0aGUgY2VpbGluZyE=" },
michael@0 1747 { "When in a maze follow the right wall and you will never get lost.",
michael@0 1748 "V2hlbiBpbiBhIG1hemUgZm9sbG93IHRoZSByaWdodCB3YWxsIGFuZCB5b3Ugd2lsbCBuZXZlciBnZXQgbG9zdC4=" },
michael@0 1749 { "When you have a key, you don't have to wait for the guard.",
michael@0 1750 "V2hlbiB5b3UgaGF2ZSBhIGtleSwgeW91IGRvbid0IGhhdmUgdG8gd2FpdCBmb3IgdGhlIGd1YXJkLg==" },
michael@0 1751 { "Why are you wasting time reading fortunes?",
michael@0 1752 "V2h5IGFyZSB5b3Ugd2FzdGluZyB0aW1lIHJlYWRpbmcgZm9ydHVuZXM/" },
michael@0 1753 { "Wish for a master key and open the Magic Memory Vault!",
michael@0 1754 "V2lzaCBmb3IgYSBtYXN0ZXIga2V5IGFuZCBvcGVuIHRoZSBNYWdpYyBNZW1vcnkgVmF1bHQh" },
michael@0 1755 { "Wizard expects every monster to do its duty.",
michael@0 1756 "V2l6YXJkIGV4cGVjdHMgZXZlcnkgbW9uc3RlciB0byBkbyBpdHMgZHV0eS4=" },
michael@0 1757 { "Wow! You could've had a potion of fruit juice!",
michael@0 1758 "V293ISBZb3UgY291bGQndmUgaGFkIGEgcG90aW9uIG9mIGZydWl0IGp1aWNlIQ==" },
michael@0 1759 { "Yet Another Silly Message (YASM).",
michael@0 1760 "WWV0IEFub3RoZXIgU2lsbHkgTWVzc2FnZSAoWUFTTSku" },
michael@0 1761 { "You are destined to be misled by a fortune.",
michael@0 1762 "WW91IGFyZSBkZXN0aW5lZCB0byBiZSBtaXNsZWQgYnkgYSBmb3J0dW5lLg==" },
michael@0 1763 { "You can get a genuine Amulet of Yendor by doing the following: --More--",
michael@0 1764 "WW91IGNhbiBnZXQgYSBnZW51aW5lIEFtdWxldCBvZiBZZW5kb3IgYnkgZG9pbmcgdGhlIGZvbGxvd2luZzogLS1Nb3JlLS0=" },
michael@0 1765 { "You can protect yourself from black dragons by doing the following: --More--",
michael@0 1766 "WW91IGNhbiBwcm90ZWN0IHlvdXJzZWxmIGZyb20gYmxhY2sgZHJhZ29ucyBieSBkb2luZyB0aGUgZm9sbG93aW5nOiAtLU1vcmUtLQ==" },
michael@0 1767 { "You can't get by the snake.",
michael@0 1768 "WW91IGNhbid0IGdldCBieSB0aGUgc25ha2Uu" },
michael@0 1769 { "You feel like someone is pulling your leg.",
michael@0 1770 "WW91IGZlZWwgbGlrZSBzb21lb25lIGlzIHB1bGxpbmcgeW91ciBsZWcu" },
michael@0 1771 { "You have to outwit the Sphynx or pay her.",
michael@0 1772 "WW91IGhhdmUgdG8gb3V0d2l0IHRoZSBTcGh5bnggb3IgcGF5IGhlci4=" },
michael@0 1773 { "You hear the fortune cookie's hissing!",
michael@0 1774 "WW91IGhlYXIgdGhlIGZvcnR1bmUgY29va2llJ3MgaGlzc2luZyE=" },
michael@0 1775 { "You may get rich selling letters, but beware of being blackmailed!",
michael@0 1776 "WW91IG1heSBnZXQgcmljaCBzZWxsaW5nIGxldHRlcnMsIGJ1dCBiZXdhcmUgb2YgYmVpbmcgYmxhY2ttYWlsZWQh" },
michael@0 1777 { "You offend Shai-Hulud by sheathing your crysknife without having drawn blood.",
michael@0 1778 "WW91IG9mZmVuZCBTaGFpLUh1bHVkIGJ5IHNoZWF0aGluZyB5b3VyIGNyeXNrbmlmZSB3aXRob3V0IGhhdmluZyBkcmF3biBibG9vZC4=" },
michael@0 1779 { "You swallowed the fortune!",
michael@0 1780 "WW91IHN3YWxsb3dlZCB0aGUgZm9ydHVuZSE=" },
michael@0 1781 { "You want to regain strength? Two levels ahead is a guesthouse!",
michael@0 1782 "WW91IHdhbnQgdG8gcmVnYWluIHN0cmVuZ3RoPyBUd28gbGV2ZWxzIGFoZWFkIGlzIGEgZ3Vlc3Rob3VzZSE=" },
michael@0 1783 { "You will encounter a tall, dark, and gruesome creature...",
michael@0 1784 "WW91IHdpbGwgZW5jb3VudGVyIGEgdGFsbCwgZGFyaywgYW5kIGdydWVzb21lIGNyZWF0dXJlLi4u" },
michael@0 1785
michael@0 1786 { "The End", "VGhlIEVuZA==" }
michael@0 1787 };
michael@0 1788
michael@0 1789 /* PL_Base64Encode, random strings */
michael@0 1790 PRBool test_004(void)
michael@0 1791 {
michael@0 1792 int i;
michael@0 1793 char result[ 4096 ];
michael@0 1794
michael@0 1795 printf("Test 004 (PL_Base64Encode, random strings) ..."); fflush(stdout);
michael@0 1796
michael@0 1797 for( i = 0; i < sizeof(array)/sizeof(array[0]); i++ )
michael@0 1798 {
michael@0 1799 PRUint32 plen = PL_strlen(array[i].plaintext);
michael@0 1800 PRUint32 clen = ((plen + 2)/3)*4;
michael@0 1801
michael@0 1802 char *rv = PL_Base64Encode(array[i].plaintext, plen, result);
michael@0 1803
michael@0 1804 if( rv != result )
michael@0 1805 {
michael@0 1806 printf("FAIL\n\t(%d): return value\n", i);
michael@0 1807 return PR_FALSE;
michael@0 1808 }
michael@0 1809
michael@0 1810 if( 0 != PL_strncmp(result, array[i].cyphertext, clen) )
michael@0 1811 {
michael@0 1812 printf("FAIL\n\t(%d, \"%s\"): expected \n\"%s,\" got \n\"%.*s.\"\n",
michael@0 1813 i, array[i].plaintext, array[i].cyphertext, clen, result);
michael@0 1814 return PR_FALSE;
michael@0 1815 }
michael@0 1816 }
michael@0 1817
michael@0 1818 printf("PASS\n");
michael@0 1819 return PR_TRUE;
michael@0 1820 }
michael@0 1821
michael@0 1822 /* PL_Base64Encode, single characters, malloc */
michael@0 1823 PRBool test_005(void)
michael@0 1824 {
michael@0 1825 PRUint32 a, b;
michael@0 1826 unsigned char plain[ 4 ];
michael@0 1827 unsigned char cypher[ 5 ];
michael@0 1828 char *rv;
michael@0 1829
michael@0 1830 printf("Test 005 (PL_Base64Encode, single characters, malloc) ..."); fflush(stdout);
michael@0 1831
michael@0 1832 plain[1] = plain[2] = plain[3] = (unsigned char)0;
michael@0 1833 cypher[2] = cypher[3] = (unsigned char)'=';
michael@0 1834 cypher[4] = (unsigned char)0;
michael@0 1835
michael@0 1836 for( a = 0; a < 64; a++ )
michael@0 1837 {
michael@0 1838 cypher[0] = base[a];
michael@0 1839
michael@0 1840 for( b = 0; b < 4; b++ )
michael@0 1841 {
michael@0 1842 plain[0] = (unsigned char)(a * 4 + b);
michael@0 1843 cypher[1] = base[(b * 16)];
michael@0 1844
michael@0 1845 rv = PL_Base64Encode((char *)plain, 1, (char *)0);
michael@0 1846 if( (char *)0 == rv )
michael@0 1847 {
michael@0 1848 printf("FAIL\n\t(%d, %d): no return value\n", a, b);
michael@0 1849 return PR_FALSE;
michael@0 1850 }
michael@0 1851
michael@0 1852 if( 0 != PL_strcmp((char *)cypher, rv) )
michael@0 1853 {
michael@0 1854 printf("FAIL\n\t(%d, %d): expected \"%s,\" got \"%s.\"\n",
michael@0 1855 a, b, cypher, rv);
michael@0 1856 PR_DELETE(rv);
michael@0 1857 return PR_FALSE;
michael@0 1858 }
michael@0 1859
michael@0 1860 PR_DELETE(rv);
michael@0 1861 }
michael@0 1862 }
michael@0 1863
michael@0 1864 printf("PASS\n");
michael@0 1865 return PR_TRUE;
michael@0 1866 }
michael@0 1867
michael@0 1868 /* PL_Base64Encode, double characters, malloc */
michael@0 1869 PRBool test_006(void)
michael@0 1870 {
michael@0 1871 PRUint32 a, b, c, d;
michael@0 1872 unsigned char plain[ 4 ];
michael@0 1873 unsigned char cypher[ 5 ];
michael@0 1874 char *rv;
michael@0 1875
michael@0 1876 printf("Test 006 (PL_Base64Encode, double characters, malloc) ..."); fflush(stdout);
michael@0 1877
michael@0 1878 plain[2] = plain[3] = (unsigned char)0;
michael@0 1879 cypher[3] = (unsigned char)'=';
michael@0 1880 cypher[4] = (unsigned char)0;
michael@0 1881
michael@0 1882 for( a = 0; a < 64; a++ )
michael@0 1883 {
michael@0 1884 cypher[0] = base[a];
michael@0 1885 for( b = 0; b < 4; b++ )
michael@0 1886 {
michael@0 1887 plain[0] = (a*4) + b;
michael@0 1888 for( c = 0; c < 16; c++ )
michael@0 1889 {
michael@0 1890 cypher[1] = base[b*16 + c];
michael@0 1891 for( d = 0; d < 16; d++ )
michael@0 1892 {
michael@0 1893 plain[1] = c*16 + d;
michael@0 1894 cypher[2] = base[d*4];
michael@0 1895
michael@0 1896 rv = PL_Base64Encode((char *)plain, 2, (char *)0);
michael@0 1897 if( (char *)0 == rv )
michael@0 1898 {
michael@0 1899 printf("FAIL\n\t(%d, %d, %d, %d): no return value\n", a, b, c, d);
michael@0 1900 return PR_FALSE;
michael@0 1901 }
michael@0 1902
michael@0 1903 if( 0 != PL_strcmp((char *)cypher, rv) )
michael@0 1904 {
michael@0 1905 printf("FAIL\n\t(%d, %d, %d, %d): expected \"%s,\" got \"%s.\"\n",
michael@0 1906 a, b, c, d, cypher, rv);
michael@0 1907 PR_DELETE(rv);
michael@0 1908 return PR_FALSE;
michael@0 1909 }
michael@0 1910
michael@0 1911 PR_DELETE(rv);
michael@0 1912 }
michael@0 1913 }
michael@0 1914 }
michael@0 1915 }
michael@0 1916
michael@0 1917 printf("PASS\n");
michael@0 1918 return PR_TRUE;
michael@0 1919 }
michael@0 1920
michael@0 1921 /* PL_Base64Encode, triple characters, malloc */
michael@0 1922 PRBool test_007(void)
michael@0 1923 {
michael@0 1924 PRUint32 a, b, c, d, e, f;
michael@0 1925 unsigned char plain[ 4 ];
michael@0 1926 unsigned char cypher[ 5 ];
michael@0 1927 char *rv;
michael@0 1928
michael@0 1929 printf("Test 007 (PL_Base64Encode, triple characters, malloc) ..."); fflush(stdout);
michael@0 1930
michael@0 1931 cypher[4] = (unsigned char)0;
michael@0 1932
michael@0 1933 for( a = 0; a < 64; a++ )
michael@0 1934 {
michael@0 1935 cypher[0] = base[a];
michael@0 1936 for( b = 0; b < 4; b++ )
michael@0 1937 {
michael@0 1938 plain[0] = (a*4) + b;
michael@0 1939 for( c = 0; c < 16; c++ )
michael@0 1940 {
michael@0 1941 cypher[1] = base[b*16 + c];
michael@0 1942 for( d = 0; d < 16; d++ )
michael@0 1943 {
michael@0 1944 plain[1] = c*16 + d;
michael@0 1945 for( e = 0; e < 4; e++ )
michael@0 1946 {
michael@0 1947 cypher[2] = base[d*4 + e];
michael@0 1948 for( f = 0; f < 64; f++ )
michael@0 1949 {
michael@0 1950 plain[2] = e * 64 + f;
michael@0 1951 cypher[3] = base[f];
michael@0 1952
michael@0 1953 rv = PL_Base64Encode((char *)plain, 3, (char *)0);
michael@0 1954 if( (char *)0 == rv )
michael@0 1955 {
michael@0 1956 printf("FAIL\n\t(%d, %d, %d, %d, %d, %d): no return value\n", a, b, c, d, e, f);
michael@0 1957 return PR_FALSE;
michael@0 1958 }
michael@0 1959
michael@0 1960 if( 0 != PL_strcmp((char *)cypher, rv) )
michael@0 1961 {
michael@0 1962 printf("FAIL\n\t(%d, %d, %d, %d, %d, %d): expected \"%s,\" got \"%.4s.\"\n",
michael@0 1963 a, b, c, d, e, f, cypher, rv);
michael@0 1964 PR_DELETE(rv);
michael@0 1965 return PR_FALSE;
michael@0 1966 }
michael@0 1967
michael@0 1968 PR_DELETE(rv);
michael@0 1969 }
michael@0 1970 }
michael@0 1971 }
michael@0 1972 }
michael@0 1973 }
michael@0 1974 }
michael@0 1975
michael@0 1976 printf("PASS\n");
michael@0 1977 return PR_TRUE;
michael@0 1978 }
michael@0 1979
michael@0 1980 /* PL_Base64Encode, random strings, malloc */
michael@0 1981 PRBool test_008(void)
michael@0 1982 {
michael@0 1983 int i;
michael@0 1984
michael@0 1985 printf("Test 008 (PL_Base64Encode, random strings, malloc) ..."); fflush(stdout);
michael@0 1986
michael@0 1987 for( i = 0; i < sizeof(array)/sizeof(array[0]); i++ )
michael@0 1988 {
michael@0 1989 PRUint32 plen = PL_strlen(array[i].plaintext);
michael@0 1990 PRUint32 clen = ((plen + 2)/3)*4;
michael@0 1991
michael@0 1992 char *rv = PL_Base64Encode(array[i].plaintext, plen, (char *)0);
michael@0 1993
michael@0 1994 if( (char *)0 == rv )
michael@0 1995 {
michael@0 1996 printf("FAIL\n\t(%d): no return value\n", i);
michael@0 1997 return PR_FALSE;
michael@0 1998 }
michael@0 1999
michael@0 2000 if( 0 != PL_strcmp(rv, array[i].cyphertext) )
michael@0 2001 {
michael@0 2002 printf("FAIL\n\t(%d, \"%s\"): expected \n\"%s,\" got \n\"%s.\"\n",
michael@0 2003 i, array[i].plaintext, array[i].cyphertext, rv);
michael@0 2004 return PR_FALSE;
michael@0 2005 }
michael@0 2006 }
michael@0 2007
michael@0 2008 printf("PASS\n");
michael@0 2009 return PR_TRUE;
michael@0 2010 }
michael@0 2011
michael@0 2012 /* PL_Base64Decode, single characters */
michael@0 2013 PRBool test_009(void)
michael@0 2014 {
michael@0 2015 PRUint32 a, b;
michael@0 2016 unsigned char plain[ 4 ];
michael@0 2017 unsigned char cypher[ 5 ];
michael@0 2018 char result[ 8 ];
michael@0 2019 char *rv;
michael@0 2020
michael@0 2021 printf("Test 009 (PL_Base64Decode, single characters, equals) ..."); fflush(stdout);
michael@0 2022
michael@0 2023 plain[1] = plain[2] = plain[3] = (unsigned char)0;
michael@0 2024 cypher[2] = cypher[3] = (unsigned char)'=';
michael@0 2025 cypher[4] = (unsigned char)0;
michael@0 2026
michael@0 2027 for( a = 0; a < 64; a++ )
michael@0 2028 {
michael@0 2029 cypher[0] = base[a];
michael@0 2030
michael@0 2031 for( b = 0; b < 4; b++ )
michael@0 2032 {
michael@0 2033 plain[0] = (unsigned char)(a * 4 + b);
michael@0 2034 cypher[1] = base[(b * 16)];
michael@0 2035
michael@0 2036 rv = PL_Base64Decode((char *)cypher, 4, result);
michael@0 2037 if( rv != result )
michael@0 2038 {
michael@0 2039 printf("FAIL\n\t(%d, %d): return value\n", a, b);
michael@0 2040 return PR_FALSE;
michael@0 2041 }
michael@0 2042
michael@0 2043 if( 0 != PL_strncmp((char *)plain, result, 1) )
michael@0 2044 {
michael@0 2045 printf("FAIL\n\t(%d, %d): expected \"%s,\" got \"%.1s.\"\n",
michael@0 2046 a, b, plain, result);
michael@0 2047 return PR_FALSE;
michael@0 2048 }
michael@0 2049 }
michael@0 2050 }
michael@0 2051
michael@0 2052 printf("PASS\n");
michael@0 2053 return PR_TRUE;
michael@0 2054 }
michael@0 2055
michael@0 2056 /* PL_Base64Decode, single characters */
michael@0 2057 PRBool test_010(void)
michael@0 2058 {
michael@0 2059 PRUint32 a, b;
michael@0 2060 unsigned char plain[ 4 ];
michael@0 2061 unsigned char cypher[ 5 ];
michael@0 2062 char result[ 8 ];
michael@0 2063 char *rv;
michael@0 2064
michael@0 2065 printf("Test 010 (PL_Base64Decode, single characters, no equals) ..."); fflush(stdout);
michael@0 2066
michael@0 2067 plain[1] = plain[2] = plain[3] = (unsigned char)0;
michael@0 2068 cypher[2] = cypher[3] = (unsigned char)0;
michael@0 2069 cypher[4] = (unsigned char)0;
michael@0 2070
michael@0 2071 for( a = 0; a < 64; a++ )
michael@0 2072 {
michael@0 2073 cypher[0] = base[a];
michael@0 2074
michael@0 2075 for( b = 0; b < 4; b++ )
michael@0 2076 {
michael@0 2077 plain[0] = (unsigned char)(a * 4 + b);
michael@0 2078 cypher[1] = base[(b * 16)];
michael@0 2079
michael@0 2080 rv = PL_Base64Decode((char *)cypher, 2, result);
michael@0 2081 if( rv != result )
michael@0 2082 {
michael@0 2083 printf("FAIL\n\t(%d, %d): return value\n", a, b);
michael@0 2084 return PR_FALSE;
michael@0 2085 }
michael@0 2086
michael@0 2087 if( 0 != PL_strncmp((char *)plain, result, 1) )
michael@0 2088 {
michael@0 2089 printf("FAIL\n\t(%d, %d): expected \"%s,\" got \"%.1s.\"\n",
michael@0 2090 a, b, plain, result);
michael@0 2091 return PR_FALSE;
michael@0 2092 }
michael@0 2093 }
michael@0 2094 }
michael@0 2095
michael@0 2096 printf("PASS\n");
michael@0 2097 return PR_TRUE;
michael@0 2098 }
michael@0 2099
michael@0 2100 /* PL_Base64Decode, double characters */
michael@0 2101 PRBool test_011(void)
michael@0 2102 {
michael@0 2103 PRUint32 a, b, c, d;
michael@0 2104 unsigned char plain[ 4 ];
michael@0 2105 unsigned char cypher[ 5 ];
michael@0 2106 char result[ 8 ];
michael@0 2107 char *rv;
michael@0 2108
michael@0 2109 printf("Test 011 (PL_Base64Decode, double characters, equals) ..."); fflush(stdout);
michael@0 2110
michael@0 2111 plain[2] = plain[3] = (unsigned char)0;
michael@0 2112 cypher[3] = (unsigned char)'=';
michael@0 2113 cypher[4] = (unsigned char)0;
michael@0 2114
michael@0 2115 for( a = 0; a < 64; a++ )
michael@0 2116 {
michael@0 2117 cypher[0] = base[a];
michael@0 2118 for( b = 0; b < 4; b++ )
michael@0 2119 {
michael@0 2120 plain[0] = (a*4) + b;
michael@0 2121 for( c = 0; c < 16; c++ )
michael@0 2122 {
michael@0 2123 cypher[1] = base[b*16 + c];
michael@0 2124 for( d = 0; d < 16; d++ )
michael@0 2125 {
michael@0 2126 plain[1] = c*16 + d;
michael@0 2127 cypher[2] = base[d*4];
michael@0 2128
michael@0 2129 rv = PL_Base64Decode((char *)cypher, 4, result);
michael@0 2130 if( rv != result )
michael@0 2131 {
michael@0 2132 printf("FAIL\n\t(%d, %d, %d, %d): return value\n", a, b, c, d);
michael@0 2133 return PR_FALSE;
michael@0 2134 }
michael@0 2135
michael@0 2136 if( 0 != PL_strncmp((char *)plain, result, 2) )
michael@0 2137 {
michael@0 2138 printf("FAIL\n\t(%d, %d, %d, %d): expected \"%s,\" got \"%.2s.\"\n",
michael@0 2139 a, b, c, d, plain, result);
michael@0 2140 return PR_FALSE;
michael@0 2141 }
michael@0 2142 }
michael@0 2143 }
michael@0 2144 }
michael@0 2145 }
michael@0 2146
michael@0 2147 printf("PASS\n");
michael@0 2148 return PR_TRUE;
michael@0 2149 }
michael@0 2150
michael@0 2151 /* PL_Base64Decode, double characters */
michael@0 2152 PRBool test_012(void)
michael@0 2153 {
michael@0 2154 PRUint32 a, b, c, d;
michael@0 2155 unsigned char plain[ 4 ];
michael@0 2156 unsigned char cypher[ 5 ];
michael@0 2157 char result[ 8 ];
michael@0 2158 char *rv;
michael@0 2159
michael@0 2160 printf("Test 012 (PL_Base64Decode, double characters, no equals) ..."); fflush(stdout);
michael@0 2161
michael@0 2162 plain[2] = plain[3] = (unsigned char)0;
michael@0 2163 cypher[3] = (unsigned char)0;
michael@0 2164 cypher[4] = (unsigned char)0;
michael@0 2165
michael@0 2166 for( a = 0; a < 64; a++ )
michael@0 2167 {
michael@0 2168 cypher[0] = base[a];
michael@0 2169 for( b = 0; b < 4; b++ )
michael@0 2170 {
michael@0 2171 plain[0] = (a*4) + b;
michael@0 2172 for( c = 0; c < 16; c++ )
michael@0 2173 {
michael@0 2174 cypher[1] = base[b*16 + c];
michael@0 2175 for( d = 0; d < 16; d++ )
michael@0 2176 {
michael@0 2177 plain[1] = c*16 + d;
michael@0 2178 cypher[2] = base[d*4];
michael@0 2179
michael@0 2180 rv = PL_Base64Decode((char *)cypher, 3, result);
michael@0 2181 if( rv != result )
michael@0 2182 {
michael@0 2183 printf("FAIL\n\t(%d, %d, %d, %d): return value\n", a, b, c, d);
michael@0 2184 return PR_FALSE;
michael@0 2185 }
michael@0 2186
michael@0 2187 if( 0 != PL_strncmp((char *)plain, result, 2) )
michael@0 2188 {
michael@0 2189 printf("FAIL\n\t(%d, %d, %d, %d): expected \"%s,\" got \"%.2s.\"\n",
michael@0 2190 a, b, c, d, cypher, result);
michael@0 2191 return PR_FALSE;
michael@0 2192 }
michael@0 2193 }
michael@0 2194 }
michael@0 2195 }
michael@0 2196 }
michael@0 2197
michael@0 2198 printf("PASS\n");
michael@0 2199 return PR_TRUE;
michael@0 2200 }
michael@0 2201
michael@0 2202 /* PL_Base64Decode, triple characters */
michael@0 2203 PRBool test_013(void)
michael@0 2204 {
michael@0 2205 PRUint32 a, b, c, d, e, f;
michael@0 2206 unsigned char plain[ 4 ];
michael@0 2207 unsigned char cypher[ 5 ];
michael@0 2208 char result[ 8 ];
michael@0 2209 char *rv;
michael@0 2210
michael@0 2211 printf("Test 013 (PL_Base64Decode, triple characters) ..."); fflush(stdout);
michael@0 2212
michael@0 2213 cypher[4] = (unsigned char)0;
michael@0 2214
michael@0 2215 for( a = 0; a < 64; a++ )
michael@0 2216 {
michael@0 2217 cypher[0] = base[a];
michael@0 2218 for( b = 0; b < 4; b++ )
michael@0 2219 {
michael@0 2220 plain[0] = (a*4) + b;
michael@0 2221 for( c = 0; c < 16; c++ )
michael@0 2222 {
michael@0 2223 cypher[1] = base[b*16 + c];
michael@0 2224 for( d = 0; d < 16; d++ )
michael@0 2225 {
michael@0 2226 plain[1] = c*16 + d;
michael@0 2227 for( e = 0; e < 4; e++ )
michael@0 2228 {
michael@0 2229 cypher[2] = base[d*4 + e];
michael@0 2230 for( f = 0; f < 64; f++ )
michael@0 2231 {
michael@0 2232 plain[2] = e * 64 + f;
michael@0 2233 cypher[3] = base[f];
michael@0 2234
michael@0 2235 rv = PL_Base64Decode((char *)cypher, 4, result);
michael@0 2236 if( rv != result )
michael@0 2237 {
michael@0 2238 printf("FAIL\n\t(%d, %d, %d, %d, %d, %d): return value\n", a, b, c, d, e, f);
michael@0 2239 return PR_FALSE;
michael@0 2240 }
michael@0 2241
michael@0 2242 if( 0 != PL_strncmp((char *)plain, result, 3) )
michael@0 2243 {
michael@0 2244 printf("FAIL\n\t(%d, %d, %d, %d, %d, %d): expected \"%s,\" got \"%.3s.\"\n",
michael@0 2245 a, b, c, d, e, f, plain, result);
michael@0 2246 return PR_FALSE;
michael@0 2247 }
michael@0 2248 }
michael@0 2249 }
michael@0 2250 }
michael@0 2251 }
michael@0 2252 }
michael@0 2253 }
michael@0 2254
michael@0 2255 printf("PASS\n");
michael@0 2256 return PR_TRUE;
michael@0 2257 }
michael@0 2258
michael@0 2259 /* PL_Base64Decode, random strings */
michael@0 2260 PRBool test_014(void)
michael@0 2261 {
michael@0 2262 int i;
michael@0 2263 char result[ 4096 ];
michael@0 2264
michael@0 2265 printf("Test 014 (PL_Base64Decode, random strings, equals) ..."); fflush(stdout);
michael@0 2266
michael@0 2267 for( i = 0; i < sizeof(array)/sizeof(array[0]); i++ )
michael@0 2268 {
michael@0 2269 PRUint32 clen = PL_strlen(array[i].cyphertext);
michael@0 2270 PRUint32 plen = (clen * 3) / 4;
michael@0 2271
michael@0 2272 char *rv = PL_Base64Decode(array[i].cyphertext, clen, result);
michael@0 2273
michael@0 2274 if( rv != result )
michael@0 2275 {
michael@0 2276 printf("FAIL\n\t(%d): return value\n", i);
michael@0 2277 return PR_FALSE;
michael@0 2278 }
michael@0 2279
michael@0 2280 if( 0 == (clen & 3) )
michael@0 2281 {
michael@0 2282 if( '=' == array[i].cyphertext[clen-1] )
michael@0 2283 {
michael@0 2284 if( '=' == array[i].cyphertext[clen-2] )
michael@0 2285 {
michael@0 2286 plen -= 2;
michael@0 2287 }
michael@0 2288 else
michael@0 2289 {
michael@0 2290 plen -= 1;
michael@0 2291 }
michael@0 2292 }
michael@0 2293 }
michael@0 2294
michael@0 2295 if( 0 != PL_strncmp(result, array[i].plaintext, plen) )
michael@0 2296 {
michael@0 2297 printf("FAIL\n\t(%d, \"%s\"): expected \n\"%s,\" got \n\"%.*s.\"\n",
michael@0 2298 i, array[i].cyphertext, array[i].plaintext, plen, result);
michael@0 2299 return PR_FALSE;
michael@0 2300 }
michael@0 2301 }
michael@0 2302
michael@0 2303 printf("PASS\n");
michael@0 2304 return PR_TRUE;
michael@0 2305 }
michael@0 2306
michael@0 2307 /* PL_Base64Decode, random strings */
michael@0 2308 PRBool test_015(void)
michael@0 2309 {
michael@0 2310 int i;
michael@0 2311 char buffer[ 4096 ];
michael@0 2312 char result[ 4096 ];
michael@0 2313 char *rv;
michael@0 2314
michael@0 2315 printf("Test 015 (PL_Base64Decode, random strings, no equals) ..."); fflush(stdout);
michael@0 2316
michael@0 2317 for( i = 0; i < sizeof(array)/sizeof(array[0]); i++ )
michael@0 2318 {
michael@0 2319 PRUint32 clen, plen;
michael@0 2320
michael@0 2321 PL_strcpy(buffer, array[i].cyphertext);
michael@0 2322 clen = PL_strlen(buffer);
michael@0 2323
michael@0 2324 if( 0 == (clen & 3) )
michael@0 2325 {
michael@0 2326 if( '=' == buffer[clen-1] )
michael@0 2327 {
michael@0 2328 if( '=' == buffer[clen-2] )
michael@0 2329 {
michael@0 2330 buffer[clen-2] = buffer[clen-1] = (char)0;
michael@0 2331 clen -= 2;
michael@0 2332 }
michael@0 2333 else
michael@0 2334 {
michael@0 2335 buffer[clen-1] = (char)0;
michael@0 2336 clen -= 1;
michael@0 2337 }
michael@0 2338 }
michael@0 2339 }
michael@0 2340
michael@0 2341 plen = (clen * 3) / 4;
michael@0 2342
michael@0 2343 rv = PL_Base64Decode(buffer, clen, result);
michael@0 2344
michael@0 2345 if( rv != result )
michael@0 2346 {
michael@0 2347 printf("FAIL\n\t(%d): return value\n", i);
michael@0 2348 return PR_FALSE;
michael@0 2349 }
michael@0 2350
michael@0 2351 if( 0 != PL_strncmp(result, array[i].plaintext, plen) )
michael@0 2352 {
michael@0 2353 printf("FAIL\n\t(%d, \"%s\"): expected \n\"%s,\" got \n\"%.*s.\"\n",
michael@0 2354 i, array[i].cyphertext, array[i].plaintext, plen, result);
michael@0 2355 return PR_FALSE;
michael@0 2356 }
michael@0 2357 }
michael@0 2358
michael@0 2359 printf("PASS\n");
michael@0 2360 return PR_TRUE;
michael@0 2361 }
michael@0 2362
michael@0 2363 /* PL_Base64Decode, single characters, malloc */
michael@0 2364 PRBool test_016(void)
michael@0 2365 {
michael@0 2366 PRUint32 a, b;
michael@0 2367 unsigned char plain[ 4 ];
michael@0 2368 unsigned char cypher[ 5 ];
michael@0 2369 char *rv;
michael@0 2370
michael@0 2371 printf("Test 016 (PL_Base64Decode, single characters, equals, malloc) ..."); fflush(stdout);
michael@0 2372
michael@0 2373 plain[1] = plain[2] = plain[3] = (unsigned char)0;
michael@0 2374 cypher[2] = cypher[3] = (unsigned char)'=';
michael@0 2375 cypher[4] = (unsigned char)0;
michael@0 2376
michael@0 2377 for( a = 0; a < 64; a++ )
michael@0 2378 {
michael@0 2379 cypher[0] = base[a];
michael@0 2380
michael@0 2381 for( b = 0; b < 4; b++ )
michael@0 2382 {
michael@0 2383 plain[0] = (unsigned char)(a * 4 + b);
michael@0 2384 cypher[1] = base[(b * 16)];
michael@0 2385
michael@0 2386 rv = PL_Base64Decode((char *)cypher, 4, (char *)0);
michael@0 2387 if( (char *)0 == rv )
michael@0 2388 {
michael@0 2389 printf("FAIL\n\t(%d, %d): no return value\n", a, b);
michael@0 2390 return PR_FALSE;
michael@0 2391 }
michael@0 2392
michael@0 2393 if( 0 != PL_strcmp((char *)plain, rv) )
michael@0 2394 {
michael@0 2395 printf("FAIL\n\t(%d, %d): expected \"%s,\" got \"%s.\"\n",
michael@0 2396 a, b, plain, rv);
michael@0 2397 PR_DELETE(rv);
michael@0 2398 return PR_FALSE;
michael@0 2399 }
michael@0 2400
michael@0 2401 PR_DELETE(rv);
michael@0 2402 }
michael@0 2403 }
michael@0 2404
michael@0 2405 printf("PASS\n");
michael@0 2406 return PR_TRUE;
michael@0 2407 }
michael@0 2408
michael@0 2409 /* PL_Base64Decode, single characters, malloc */
michael@0 2410 PRBool test_017(void)
michael@0 2411 {
michael@0 2412 PRUint32 a, b;
michael@0 2413 unsigned char plain[ 4 ];
michael@0 2414 unsigned char cypher[ 5 ];
michael@0 2415 char *rv;
michael@0 2416
michael@0 2417 printf("Test 017 (PL_Base64Decode, single characters, no equals, malloc) ..."); fflush(stdout);
michael@0 2418
michael@0 2419 plain[1] = plain[2] = plain[3] = (unsigned char)0;
michael@0 2420 cypher[2] = cypher[3] = (unsigned char)0;
michael@0 2421 cypher[4] = (unsigned char)0;
michael@0 2422
michael@0 2423 for( a = 0; a < 64; a++ )
michael@0 2424 {
michael@0 2425 cypher[0] = base[a];
michael@0 2426
michael@0 2427 for( b = 0; b < 4; b++ )
michael@0 2428 {
michael@0 2429 plain[0] = (unsigned char)(a * 4 + b);
michael@0 2430 cypher[1] = base[(b * 16)];
michael@0 2431
michael@0 2432 rv = PL_Base64Decode((char *)cypher, 2, (char *)0);
michael@0 2433 if( (char *)0 == rv )
michael@0 2434 {
michael@0 2435 printf("FAIL\n\t(%d, %d): no return value\n", a, b);
michael@0 2436 return PR_FALSE;
michael@0 2437 }
michael@0 2438
michael@0 2439 if( 0 != PL_strcmp((char *)plain, rv) )
michael@0 2440 {
michael@0 2441 printf("FAIL\n\t(%d, %d): expected \"%s,\" got \"%s.\"\n",
michael@0 2442 a, b, plain, rv);
michael@0 2443 PR_DELETE(rv);
michael@0 2444 return PR_FALSE;
michael@0 2445 }
michael@0 2446
michael@0 2447 PR_DELETE(rv);
michael@0 2448 }
michael@0 2449 }
michael@0 2450
michael@0 2451 printf("PASS\n");
michael@0 2452 return PR_TRUE;
michael@0 2453 }
michael@0 2454
michael@0 2455 /* PL_Base64Decode, double characters, malloc */
michael@0 2456 PRBool test_018(void)
michael@0 2457 {
michael@0 2458 PRUint32 a, b, c, d;
michael@0 2459 unsigned char plain[ 4 ];
michael@0 2460 unsigned char cypher[ 5 ];
michael@0 2461 char *rv;
michael@0 2462
michael@0 2463 printf("Test 018 (PL_Base64Decode, double characters, equals, malloc) ..."); fflush(stdout);
michael@0 2464
michael@0 2465 plain[2] = plain[3] = (unsigned char)0;
michael@0 2466 cypher[3] = (unsigned char)'=';
michael@0 2467 cypher[4] = (unsigned char)0;
michael@0 2468
michael@0 2469 for( a = 0; a < 64; a++ )
michael@0 2470 {
michael@0 2471 cypher[0] = base[a];
michael@0 2472 for( b = 0; b < 4; b++ )
michael@0 2473 {
michael@0 2474 plain[0] = (a*4) + b;
michael@0 2475 for( c = 0; c < 16; c++ )
michael@0 2476 {
michael@0 2477 cypher[1] = base[b*16 + c];
michael@0 2478 for( d = 0; d < 16; d++ )
michael@0 2479 {
michael@0 2480 plain[1] = c*16 + d;
michael@0 2481 cypher[2] = base[d*4];
michael@0 2482
michael@0 2483 rv = PL_Base64Decode((char *)cypher, 4, (char *)0);
michael@0 2484 if( (char *)0 == rv )
michael@0 2485 {
michael@0 2486 printf("FAIL\n\t(%d, %d, %d, %d): no return value\n", a, b, c, d);
michael@0 2487 return PR_FALSE;
michael@0 2488 }
michael@0 2489
michael@0 2490 if( 0 != PL_strcmp((char *)plain, rv) )
michael@0 2491 {
michael@0 2492 printf("FAIL\n\t(%d, %d, %d, %d): expected \"%s,\" got \"%s.\"\n",
michael@0 2493 a, b, c, d, plain, rv);
michael@0 2494 PR_DELETE(rv);
michael@0 2495 return PR_FALSE;
michael@0 2496 }
michael@0 2497
michael@0 2498 PR_DELETE(rv);
michael@0 2499 }
michael@0 2500 }
michael@0 2501 }
michael@0 2502 }
michael@0 2503
michael@0 2504 printf("PASS\n");
michael@0 2505 return PR_TRUE;
michael@0 2506 }
michael@0 2507
michael@0 2508 /* PL_Base64Decode, double characters, malloc */
michael@0 2509 PRBool test_019(void)
michael@0 2510 {
michael@0 2511 PRUint32 a, b, c, d;
michael@0 2512 unsigned char plain[ 4 ];
michael@0 2513 unsigned char cypher[ 5 ];
michael@0 2514 char *rv;
michael@0 2515
michael@0 2516 printf("Test 019 (PL_Base64Decode, double characters, no equals, malloc) ..."); fflush(stdout);
michael@0 2517
michael@0 2518 plain[2] = plain[3] = (unsigned char)0;
michael@0 2519 cypher[3] = (unsigned char)0;
michael@0 2520 cypher[4] = (unsigned char)0;
michael@0 2521
michael@0 2522 for( a = 0; a < 64; a++ )
michael@0 2523 {
michael@0 2524 cypher[0] = base[a];
michael@0 2525 for( b = 0; b < 4; b++ )
michael@0 2526 {
michael@0 2527 plain[0] = (a*4) + b;
michael@0 2528 for( c = 0; c < 16; c++ )
michael@0 2529 {
michael@0 2530 cypher[1] = base[b*16 + c];
michael@0 2531 for( d = 0; d < 16; d++ )
michael@0 2532 {
michael@0 2533 plain[1] = c*16 + d;
michael@0 2534 cypher[2] = base[d*4];
michael@0 2535
michael@0 2536 rv = PL_Base64Decode((char *)cypher, 3, (char *)0);
michael@0 2537 if( (char *)0 == rv )
michael@0 2538 {
michael@0 2539 printf("FAIL\n\t(%d, %d, %d, %d): no return value\n", a, b, c, d);
michael@0 2540 return PR_FALSE;
michael@0 2541 }
michael@0 2542
michael@0 2543 if( 0 != PL_strcmp((char *)plain, rv) )
michael@0 2544 {
michael@0 2545 printf("FAIL\n\t(%d, %d, %d, %d): expected \"%s,\" got \"%s.\"\n",
michael@0 2546 a, b, c, d, cypher, rv);
michael@0 2547 PR_DELETE(rv);
michael@0 2548 return PR_FALSE;
michael@0 2549 }
michael@0 2550
michael@0 2551 PR_DELETE(rv);
michael@0 2552 }
michael@0 2553 }
michael@0 2554 }
michael@0 2555 }
michael@0 2556
michael@0 2557 printf("PASS\n");
michael@0 2558 return PR_TRUE;
michael@0 2559 }
michael@0 2560
michael@0 2561 /* PL_Base64Decode, triple characters, malloc */
michael@0 2562 PRBool test_020(void)
michael@0 2563 {
michael@0 2564 PRUint32 a, b, c, d, e, f;
michael@0 2565 unsigned char plain[ 4 ];
michael@0 2566 unsigned char cypher[ 5 ];
michael@0 2567 char *rv;
michael@0 2568
michael@0 2569 printf("Test 020 (PL_Base64Decode, triple characters, malloc) ..."); fflush(stdout);
michael@0 2570
michael@0 2571 cypher[4] = (unsigned char)0;
michael@0 2572 plain[3] = (unsigned char)0;
michael@0 2573
michael@0 2574 for( a = 0; a < 64; a++ )
michael@0 2575 {
michael@0 2576 cypher[0] = base[a];
michael@0 2577 for( b = 0; b < 4; b++ )
michael@0 2578 {
michael@0 2579 plain[0] = (a*4) + b;
michael@0 2580 for( c = 0; c < 16; c++ )
michael@0 2581 {
michael@0 2582 cypher[1] = base[b*16 + c];
michael@0 2583 for( d = 0; d < 16; d++ )
michael@0 2584 {
michael@0 2585 plain[1] = c*16 + d;
michael@0 2586 for( e = 0; e < 4; e++ )
michael@0 2587 {
michael@0 2588 cypher[2] = base[d*4 + e];
michael@0 2589 for( f = 0; f < 64; f++ )
michael@0 2590 {
michael@0 2591 plain[2] = e * 64 + f;
michael@0 2592 cypher[3] = base[f];
michael@0 2593
michael@0 2594 rv = PL_Base64Decode((char *)cypher, 4, (char *)0);
michael@0 2595 if( (char *)0 == rv )
michael@0 2596 {
michael@0 2597 printf("FAIL\n\t(%d, %d, %d, %d, %d, %d): no return value\n", a, b, c, d, e, f);
michael@0 2598 return PR_FALSE;
michael@0 2599 }
michael@0 2600
michael@0 2601 if( 0 != PL_strcmp((char *)plain, rv) )
michael@0 2602 {
michael@0 2603 printf("FAIL\n\t(%d, %d, %d, %d, %d, %d): expected \"%s,\" got \"%.3s.\"\n",
michael@0 2604 a, b, c, d, e, f, plain, rv);
michael@0 2605 PR_DELETE(rv);
michael@0 2606 return PR_FALSE;
michael@0 2607 }
michael@0 2608
michael@0 2609 PR_DELETE(rv);
michael@0 2610 }
michael@0 2611 }
michael@0 2612 }
michael@0 2613 }
michael@0 2614 }
michael@0 2615 }
michael@0 2616
michael@0 2617 printf("PASS\n");
michael@0 2618 return PR_TRUE;
michael@0 2619 }
michael@0 2620
michael@0 2621 /* PL_Base64Decode, random strings, malloc */
michael@0 2622 PRBool test_021(void)
michael@0 2623 {
michael@0 2624 int i;
michael@0 2625
michael@0 2626 printf("Test 021 (PL_Base64Decode, random strings, equals, malloc) ..."); fflush(stdout);
michael@0 2627
michael@0 2628 for( i = 0; i < sizeof(array)/sizeof(array[0]); i++ )
michael@0 2629 {
michael@0 2630 PRUint32 clen = PL_strlen(array[i].cyphertext);
michael@0 2631
michael@0 2632 char *rv = PL_Base64Decode(array[i].cyphertext, clen, (char *)0);
michael@0 2633
michael@0 2634 if( (char *)0 == rv )
michael@0 2635 {
michael@0 2636 printf("FAIL\n\t(%d): no return value\n", i);
michael@0 2637 return PR_FALSE;
michael@0 2638 }
michael@0 2639
michael@0 2640 if( 0 != PL_strcmp(rv, array[i].plaintext) )
michael@0 2641 {
michael@0 2642 printf("FAIL\n\t(%d, \"%s\"): expected \n\"%s,\" got \n\"%s.\"\n",
michael@0 2643 i, array[i].cyphertext, array[i].plaintext, rv);
michael@0 2644 PR_DELETE(rv);
michael@0 2645 return PR_FALSE;
michael@0 2646 }
michael@0 2647
michael@0 2648 PR_DELETE(rv);
michael@0 2649 }
michael@0 2650
michael@0 2651 printf("PASS\n");
michael@0 2652 return PR_TRUE;
michael@0 2653 }
michael@0 2654
michael@0 2655 /* PL_Base64Encode, random strings, malloc */
michael@0 2656 PRBool test_022(void)
michael@0 2657 {
michael@0 2658 int i;
michael@0 2659 char buffer[ 4096 ];
michael@0 2660 char *rv;
michael@0 2661
michael@0 2662 printf("Test 022 (PL_Base64Decode, random strings, no equals, malloc) ..."); fflush(stdout);
michael@0 2663
michael@0 2664 for( i = 0; i < sizeof(array)/sizeof(array[0]); i++ )
michael@0 2665 {
michael@0 2666 PRUint32 clen;
michael@0 2667
michael@0 2668 PL_strcpy(buffer, array[i].cyphertext);
michael@0 2669 clen = PL_strlen(buffer);
michael@0 2670
michael@0 2671 if( 0 == (clen & 3) )
michael@0 2672 {
michael@0 2673 if( '=' == buffer[clen-1] )
michael@0 2674 {
michael@0 2675 if( '=' == buffer[clen-2] )
michael@0 2676 {
michael@0 2677 buffer[clen-2] = buffer[clen-1] = (char)0;
michael@0 2678 clen -= 2;
michael@0 2679 }
michael@0 2680 else
michael@0 2681 {
michael@0 2682 buffer[clen-1] = (char)0;
michael@0 2683 clen -= 1;
michael@0 2684 }
michael@0 2685 }
michael@0 2686 }
michael@0 2687
michael@0 2688 rv = PL_Base64Decode(buffer, clen, (char *)0);
michael@0 2689
michael@0 2690 if( (char *)0 == rv )
michael@0 2691 {
michael@0 2692 printf("FAIL\n\t(%d): no return value\n", i);
michael@0 2693 return PR_FALSE;
michael@0 2694 }
michael@0 2695
michael@0 2696 if( 0 != PL_strcmp(rv, array[i].plaintext) )
michael@0 2697 {
michael@0 2698 printf("FAIL\n\t(%d, \"%s\"): expected \n\"%s,\" got \n\"%s.\"\n",
michael@0 2699 i, array[i].cyphertext, array[i].plaintext, rv);
michael@0 2700 return PR_FALSE;
michael@0 2701 }
michael@0 2702 }
michael@0 2703
michael@0 2704 printf("PASS\n");
michael@0 2705 return PR_TRUE;
michael@0 2706 }
michael@0 2707
michael@0 2708 /* PL_Base64Encode, random strings */
michael@0 2709 PRBool test_023(void)
michael@0 2710 {
michael@0 2711 int i;
michael@0 2712 char result[ 4096 ];
michael@0 2713
michael@0 2714 printf("Test 023 (PL_Base64Encode, random strings, strlen) ..."); fflush(stdout);
michael@0 2715
michael@0 2716 for( i = 0; i < sizeof(array)/sizeof(array[0]); i++ )
michael@0 2717 {
michael@0 2718 PRUint32 plen = PL_strlen(array[i].plaintext);
michael@0 2719 PRUint32 clen = ((plen + 2)/3)*4;
michael@0 2720
michael@0 2721 char *rv = PL_Base64Encode(array[i].plaintext, 0, result);
michael@0 2722
michael@0 2723 if( rv != result )
michael@0 2724 {
michael@0 2725 printf("FAIL\n\t(%d): return value\n", i);
michael@0 2726 return PR_FALSE;
michael@0 2727 }
michael@0 2728
michael@0 2729 if( 0 != PL_strncmp(result, array[i].cyphertext, clen) )
michael@0 2730 {
michael@0 2731 printf("FAIL\n\t(%d, \"%s\"): expected \n\"%s,\" got \n\"%.*s.\"\n",
michael@0 2732 i, array[i].plaintext, array[i].cyphertext, clen, result);
michael@0 2733 return PR_FALSE;
michael@0 2734 }
michael@0 2735 }
michael@0 2736
michael@0 2737 printf("PASS\n");
michael@0 2738 return PR_TRUE;
michael@0 2739 }
michael@0 2740
michael@0 2741 /* PL_Base64Encode, random strings, malloc */
michael@0 2742 PRBool test_024(void)
michael@0 2743 {
michael@0 2744 int i;
michael@0 2745
michael@0 2746 printf("Test 024 (PL_Base64Encode, random strings, malloc, strlen) ..."); fflush(stdout);
michael@0 2747
michael@0 2748 for( i = 0; i < sizeof(array)/sizeof(array[0]); i++ )
michael@0 2749 {
michael@0 2750 PRUint32 plen = PL_strlen(array[i].plaintext);
michael@0 2751 PRUint32 clen = ((plen + 2)/3)*4;
michael@0 2752
michael@0 2753 char *rv = PL_Base64Encode(array[i].plaintext, 0, (char *)0);
michael@0 2754
michael@0 2755 if( (char *)0 == rv )
michael@0 2756 {
michael@0 2757 printf("FAIL\n\t(%d): no return value\n", i);
michael@0 2758 return PR_FALSE;
michael@0 2759 }
michael@0 2760
michael@0 2761 if( 0 != PL_strcmp(rv, array[i].cyphertext) )
michael@0 2762 {
michael@0 2763 printf("FAIL\n\t(%d, \"%s\"): expected \n\"%s,\" got \n\"%s.\"\n",
michael@0 2764 i, array[i].plaintext, array[i].cyphertext, rv);
michael@0 2765 return PR_FALSE;
michael@0 2766 }
michael@0 2767 }
michael@0 2768
michael@0 2769 printf("PASS\n");
michael@0 2770 return PR_TRUE;
michael@0 2771 }
michael@0 2772
michael@0 2773 /* PL_Base64Decode, random strings */
michael@0 2774 PRBool test_025(void)
michael@0 2775 {
michael@0 2776 int i;
michael@0 2777 char result[ 4096 ];
michael@0 2778
michael@0 2779 printf("Test 025 (PL_Base64Decode, random strings, equals, strlen) ..."); fflush(stdout);
michael@0 2780
michael@0 2781 for( i = 0; i < sizeof(array)/sizeof(array[0]); i++ )
michael@0 2782 {
michael@0 2783 PRUint32 clen = PL_strlen(array[i].cyphertext);
michael@0 2784 PRUint32 plen = (clen * 3) / 4;
michael@0 2785
michael@0 2786 char *rv = PL_Base64Decode(array[i].cyphertext, 0, result);
michael@0 2787
michael@0 2788 if( rv != result )
michael@0 2789 {
michael@0 2790 printf("FAIL\n\t(%d): return value\n", i);
michael@0 2791 return PR_FALSE;
michael@0 2792 }
michael@0 2793
michael@0 2794 if( 0 == (clen & 3) )
michael@0 2795 {
michael@0 2796 if( '=' == array[i].cyphertext[clen-1] )
michael@0 2797 {
michael@0 2798 if( '=' == array[i].cyphertext[clen-2] )
michael@0 2799 {
michael@0 2800 plen -= 2;
michael@0 2801 }
michael@0 2802 else
michael@0 2803 {
michael@0 2804 plen -= 1;
michael@0 2805 }
michael@0 2806 }
michael@0 2807 }
michael@0 2808
michael@0 2809 if( 0 != PL_strncmp(result, array[i].plaintext, plen) )
michael@0 2810 {
michael@0 2811 printf("FAIL\n\t(%d, \"%s\"): expected \n\"%s,\" got \n\"%.*s.\"\n",
michael@0 2812 i, array[i].cyphertext, array[i].plaintext, plen, result);
michael@0 2813 return PR_FALSE;
michael@0 2814 }
michael@0 2815 }
michael@0 2816
michael@0 2817 printf("PASS\n");
michael@0 2818 return PR_TRUE;
michael@0 2819 }
michael@0 2820
michael@0 2821 /* PL_Base64Decode, random strings */
michael@0 2822 PRBool test_026(void)
michael@0 2823 {
michael@0 2824 int i;
michael@0 2825 char buffer[ 4096 ];
michael@0 2826 char result[ 4096 ];
michael@0 2827 char *rv;
michael@0 2828
michael@0 2829 printf("Test 026 (PL_Base64Decode, random strings, no equals, strlen) ..."); fflush(stdout);
michael@0 2830
michael@0 2831 for( i = 0; i < sizeof(array)/sizeof(array[0]); i++ )
michael@0 2832 {
michael@0 2833 PRUint32 clen, plen;
michael@0 2834
michael@0 2835 PL_strcpy(buffer, array[i].cyphertext);
michael@0 2836 clen = PL_strlen(buffer);
michael@0 2837
michael@0 2838 if( 0 == (clen & 3) )
michael@0 2839 {
michael@0 2840 if( '=' == buffer[clen-1] )
michael@0 2841 {
michael@0 2842 if( '=' == buffer[clen-2] )
michael@0 2843 {
michael@0 2844 buffer[clen-2] = buffer[clen-1] = (char)0;
michael@0 2845 clen -= 2;
michael@0 2846 }
michael@0 2847 else
michael@0 2848 {
michael@0 2849 buffer[clen-1] = (char)0;
michael@0 2850 clen -= 1;
michael@0 2851 }
michael@0 2852 }
michael@0 2853 }
michael@0 2854
michael@0 2855 plen = (clen * 3) / 4;
michael@0 2856
michael@0 2857 rv = PL_Base64Decode(buffer, 0, result);
michael@0 2858
michael@0 2859 if( rv != result )
michael@0 2860 {
michael@0 2861 printf("FAIL\n\t(%d): return value\n", i);
michael@0 2862 return PR_FALSE;
michael@0 2863 }
michael@0 2864
michael@0 2865 if( 0 != PL_strncmp(result, array[i].plaintext, plen) )
michael@0 2866 {
michael@0 2867 printf("FAIL\n\t(%d, \"%s\"): expected \n\"%s,\" got \n\"%.*s.\"\n",
michael@0 2868 i, array[i].cyphertext, array[i].plaintext, plen, result);
michael@0 2869 return PR_FALSE;
michael@0 2870 }
michael@0 2871 }
michael@0 2872
michael@0 2873 printf("PASS\n");
michael@0 2874 return PR_TRUE;
michael@0 2875 }
michael@0 2876
michael@0 2877 /* PL_Base64Decode, random strings, malloc */
michael@0 2878 PRBool test_027(void)
michael@0 2879 {
michael@0 2880 int i;
michael@0 2881
michael@0 2882 printf("Test 027 (PL_Base64Decode, random strings, equals, malloc, strlen) ..."); fflush(stdout);
michael@0 2883
michael@0 2884 for( i = 0; i < sizeof(array)/sizeof(array[0]); i++ )
michael@0 2885 {
michael@0 2886 PRUint32 clen = PL_strlen(array[i].cyphertext);
michael@0 2887
michael@0 2888 char *rv = PL_Base64Decode(array[i].cyphertext, 0, (char *)0);
michael@0 2889
michael@0 2890 if( (char *)0 == rv )
michael@0 2891 {
michael@0 2892 printf("FAIL\n\t(%d): no return value\n", i);
michael@0 2893 return PR_FALSE;
michael@0 2894 }
michael@0 2895
michael@0 2896 if( 0 != PL_strcmp(rv, array[i].plaintext) )
michael@0 2897 {
michael@0 2898 printf("FAIL\n\t(%d, \"%s\"): expected \n\"%s,\" got \n\"%s.\"\n",
michael@0 2899 i, array[i].cyphertext, array[i].plaintext, rv);
michael@0 2900 PR_DELETE(rv);
michael@0 2901 return PR_FALSE;
michael@0 2902 }
michael@0 2903
michael@0 2904 PR_DELETE(rv);
michael@0 2905 }
michael@0 2906
michael@0 2907 printf("PASS\n");
michael@0 2908 return PR_TRUE;
michael@0 2909 }
michael@0 2910
michael@0 2911 /* PL_Base64Encode, random strings, malloc */
michael@0 2912 PRBool test_028(void)
michael@0 2913 {
michael@0 2914 int i;
michael@0 2915 char buffer[ 4096 ];
michael@0 2916 char *rv;
michael@0 2917
michael@0 2918 printf("Test 028 (PL_Base64Decode, random strings, no equals, malloc, strlen) ..."); fflush(stdout);
michael@0 2919
michael@0 2920 for( i = 0; i < sizeof(array)/sizeof(array[0]); i++ )
michael@0 2921 {
michael@0 2922 PRUint32 clen;
michael@0 2923
michael@0 2924 PL_strcpy(buffer, array[i].cyphertext);
michael@0 2925 clen = PL_strlen(buffer);
michael@0 2926
michael@0 2927 if( 0 == (clen & 3) )
michael@0 2928 {
michael@0 2929 if( '=' == buffer[clen-1] )
michael@0 2930 {
michael@0 2931 if( '=' == buffer[clen-2] )
michael@0 2932 {
michael@0 2933 buffer[clen-2] = buffer[clen-1] = (char)0;
michael@0 2934 clen -= 2;
michael@0 2935 }
michael@0 2936 else
michael@0 2937 {
michael@0 2938 buffer[clen-1] = (char)0;
michael@0 2939 clen -= 1;
michael@0 2940 }
michael@0 2941 }
michael@0 2942 }
michael@0 2943
michael@0 2944 rv = PL_Base64Decode(buffer, 0, (char *)0);
michael@0 2945
michael@0 2946 if( (char *)0 == rv )
michael@0 2947 {
michael@0 2948 printf("FAIL\n\t(%d): no return value\n", i);
michael@0 2949 return PR_FALSE;
michael@0 2950 }
michael@0 2951
michael@0 2952 if( 0 != PL_strcmp(rv, array[i].plaintext) )
michael@0 2953 {
michael@0 2954 printf("FAIL\n\t(%d, \"%s\"): expected \n\"%s,\" got \n\"%s.\"\n",
michael@0 2955 i, array[i].cyphertext, array[i].plaintext, rv);
michael@0 2956 return PR_FALSE;
michael@0 2957 }
michael@0 2958 }
michael@0 2959
michael@0 2960 printf("PASS\n");
michael@0 2961 return PR_TRUE;
michael@0 2962 }
michael@0 2963
michael@0 2964 int
michael@0 2965 main
michael@0 2966 (
michael@0 2967 int argc,
michael@0 2968 char *argv[]
michael@0 2969 )
michael@0 2970 {
michael@0 2971 printf("Testing the Portable Library base64 functions:\n");
michael@0 2972 printf("(warning: the \"triple characters\" tests are slow)\n");
michael@0 2973
michael@0 2974 if( 1
michael@0 2975 && test_001()
michael@0 2976 && test_002()
michael@0 2977 && test_003()
michael@0 2978 && test_004()
michael@0 2979 && test_005()
michael@0 2980 && test_006()
michael@0 2981 && test_007()
michael@0 2982 && test_008()
michael@0 2983 && test_009()
michael@0 2984 && test_010()
michael@0 2985 && test_011()
michael@0 2986 && test_012()
michael@0 2987 && test_013()
michael@0 2988 && test_014()
michael@0 2989 && test_015()
michael@0 2990 && test_016()
michael@0 2991 && test_017()
michael@0 2992 && test_018()
michael@0 2993 && test_019()
michael@0 2994 && test_020()
michael@0 2995 && test_021()
michael@0 2996 && test_022()
michael@0 2997 && test_023()
michael@0 2998 && test_024()
michael@0 2999 && test_025()
michael@0 3000 && test_026()
michael@0 3001 && test_027()
michael@0 3002 && test_028()
michael@0 3003 )
michael@0 3004 {
michael@0 3005 printf("Suite passed.\n");
michael@0 3006 return 0;
michael@0 3007 }
michael@0 3008 else
michael@0 3009 {
michael@0 3010 printf("Suite failed.\n");
michael@0 3011 return 1;
michael@0 3012 }
michael@0 3013
michael@0 3014 /*NOTREACHED*/
michael@0 3015 }

mercurial