home *** CD-ROM | disk | FTP | other *** search
/ NetNews Usenet Archive 1993 #1 / NN_1993_1.iso / spool / comp / os / msdos / programm / 12006 < prev    next >
Encoding:
Text File  |  1993-01-12  |  25.5 KB  |  640 lines

  1. Path: sparky!uunet!usc!cs.utexas.edu!uwm.edu!ogicse!news.u.washington.edu!serval!wsuaix.csc.wsu.edu!rnelson
  2. From: rnelson@wsuaix.csc.wsu.edu (roger nelson;S23487)
  3. Newsgroups: comp.os.msdos.programmer
  4. Subject: C version of foreign language translation unit
  5. Message-ID: <1993Jan12.035943.25423@serval.net.wsu.edu>
  6. Date: 12 Jan 93 03:59:43 GMT
  7. Article-I.D.: serval.1993Jan12.035943.25423
  8. Sender: news@serval.net.wsu.edu (USENET News System)
  9. Organization: Washington State University
  10. Lines: 628
  11.  
  12. Several people have requested the C version of my foreign language
  13. translation unit,  so here it is:
  14.  
  15. ---Cut Here---------8<--------8<----Cut Here---------8<--------8<
  16.  
  17. /* language.h Version 1.0  by Roger Nelson*/
  18.  
  19. /*
  20.    Phrases are stored in the phrases file: PHRASES.LNG
  21.    which must be placed in in the same directory as the application
  22.    program executables.
  23.    (The phrases.lng file must also be available to the compiler.)
  24.  
  25.    The phrases file has the following format which allows for the compiler
  26.    to double check the existance of a phrase so you can't inadvertantly
  27.    leave out a phrase from your translations!!!!
  28.  
  29.  
  30.     phraseID,
  31.     / * programlist
  32.     ENGLISH English phrase
  33.     SPANISH Spanish phrase
  34.     ITALIAN Italian phrase
  35.     FRENCH French phrase
  36.        :
  37.        :
  38.     * /
  39.     NextphrasesID,
  40.        :
  41.        :
  42.  
  43.  
  44.    Note / * and * / are actually the C comment characters!
  45.  
  46.    The phraseID must be a unique valid Identifier and must be
  47.    followed by a comma. The phraseID and comma must be on their own line.
  48.  
  49.    After the first comment (on the same line) is a list of all programs in
  50.    which the phrase is used, only those phrases used by the program will
  51.    be loaded. This is useful if your application consists of several programs,
  52.    but where not all phrases are used in all the programs.
  53.  
  54.    Each translation must be on its own line, the name of the language
  55.    must be uppercase with consistent spelling and one word.
  56.  
  57.    There must be only one space or one tab character seperating the
  58.    language from the phrase.
  59.  
  60.    There must not be any blank lines between the } and the next phrase ID.
  61.  
  62.    The very first phrases in PHRASES.LNG must be the translation for the
  63.    name of the language:
  64.  
  65.    L_LANGUAGE,
  66.    / * PROGRAM1 PROGRAM2
  67.    ENGLISH English phrase
  68.    FRENCH Francais phrase
  69.    SPANISH Espanol phrase
  70.    ITALIAN Italiano phrase
  71.    * /
  72.  
  73.    If the phrase is to be a null string or a single space, then use
  74.    an underscore character _,  Ie:  ENGLISH _
  75.  
  76.  
  77.  
  78. Tips for restarting a TurboVision application with a new application.
  79.  
  80.   You may want to allow the user to change the language within the
  81.   application.
  82.  
  83.   The easiest thing to do is shutdown and restart TurboVision.
  84.  
  85.   1. Create a boolean variable that will be used to test for the actual exit
  86.      of the application.
  87.  
  88.   2. Put a while loop using this variable as the test around the application
  89.      init, run and done procedures.
  90.  
  91.   3. Call the language_init function near the beginning of the program.
  92.      Call the language_end function near the end of the program.
  93.  
  94.   4. Usually object registration for TurboVision is done in the
  95.      application.init procedure.
  96.      Move these registrations to a point before the exit_application loop
  97.      otherwise TurboVision will complain about stream registration when
  98.      init gets call more than once.
  99.  
  100.   5. Provide menu options for changing the language.
  101.      This may be a user preferences dialog box or submenus etc...
  102.  
  103.   6. Provide an application event handler point for each language:
  104.  
  105.     I.e.
  106.  
  107.     case cmLanguageDefault :
  108.          language_load(getenv("LANGUAGE"),argv_0);
  109.          message(@self,evCommand,cmQUIT,NIL);
  110.       break;
  111.     case cmLanguageEnglish :
  112.          language_load("ENGLISH",argv_0);
  113.          message(@self,evCommand,cmQUIT,NIL);
  114.       break;
  115.     case cmLanguageFrench  :
  116.          language_load("FRENCH",argv_0);
  117.          message(@self,evCommand,cmQUIT,NIL);
  118.       break;
  119.     case cmLanguageSpanish :
  120.          language_load("SPANISH",argv_0);
  121.          message(@self,evCommand,cmQUIT,NIL);
  122.       break;
  123.     case cmLanguageItalian :
  124.          language_load("ITALIAN",argv_0);
  125.          message(@self,evCommand,cmQUIT,NIL);
  126.       break;
  127.  
  128.       Where argv_0 is a char * set to argv_0 at the beginning of main.
  129.  
  130.   7. When you actually want to exit the program with cmQUIT, set
  131.      exit_application to TRUE:
  132.  
  133.       case cmExit_MyApp :
  134.           exit_application = 1;
  135.           message(@self,evCommand,cmQUIT,0);
  136.        break;
  137.  
  138.   8. To use a phrase translation simply call tranlate() with the phrase_Id
  139.      Ie.
  140.      printf("%s (%s)",translate(L_mouse),translate(L_Not_available));
  141.  
  142. I.e. The main module of the program MYAPP would look something like this:
  143.  
  144. main(int argc; char *argv[0]);
  145. {
  146.   argv_0 = argv[0];
  147.  
  148.  
  149.   // Get the default language from the DOS environment variable LANGUAGE,
  150.   // set before running the program. If the environment variable doesn't
  151.   // exist, then language_init will use ENGLISH.
  152.  
  153.  
  154.   if (!language_init(getenv("LANGUAGE"),argv[0]))
  155.   { printf("Unable to open language translation file: PHRASES.LNG\n"
  156.              "This file should be placed in the same directory as %s\n",argv[0]);
  157.     exit(1);
  158.   };
  159.  
  160.   RegisterObjects;
  161.   RegisterViews;
  162.   RegisterMenus;
  163.   RegisterDialogs;
  164.   RegisterApp;
  165.   RegisterHelpFile;
  166.  
  167.   exit_application = 0;                //  <- global variable
  168.   while (!exit_application)
  169.   {
  170.      theapplication.Init;
  171.      theapplication.Run;
  172.      theapplication.Done;
  173.   };
  174.  
  175.   language_end();
  176. };
  177.  
  178. */
  179.  
  180. enum phrases {
  181. #include "phrases.lng"
  182. END_PHRASES };
  183.  
  184. /* program_name is a fully qualified filename: i.e.  C:\APPDIR\MYAPP.EXE
  185.    Usually just use argv[0].
  186. */
  187.  
  188. int language_init(char *language_name, char *program_name);
  189. int language_load(char *language_name, char *program_name);
  190. void language_end();
  191. char *translate(long phrase_ID);
  192.  
  193. ---Cut Here---------8<--------8<----Cut Here---------8<--------8<
  194.  
  195. /* language.cpp  Version 1.0*/
  196.  
  197. /*
  198.    This Borland C/C++ module will help provide translation of text strings
  199.    to different human languages.
  200.  
  201.    Written by Roger Nelson  Jan. 1993
  202.    Comments, suggestions, questions and bug reports can be sent to:
  203.  
  204.        Roger Nelson
  205.        Biological Systems Engr. Dept.
  206.        Washington State University
  207.        Pullman, WA 99164-6120
  208.  
  209.        rnelson@wsuaix.csc.wsu.edu
  210.  
  211.        Phone: (509)335-1578
  212.        FAX  : (509)335-2722
  213.  
  214.  
  215.    An equivelent module can also be provided for the programming languages:
  216.    Pascal and scheme by request.
  217.    ________________________________________________________________________
  218. */
  219. #include <language.h>
  220. #include <malloc.h>
  221. #include <string.h>
  222. #include <dir.h>           /* <- MS-DOS */
  223. #include <stdio.h>
  224.  
  225.  
  226. struct language_node
  227. {
  228.   long phrase_ID;
  229.   char *phrase;
  230.   struct language_node *right;
  231. };
  232.  
  233. struct language_node *language_list = 0;
  234.  
  235. void language_path_program(char *path_program,char *path,char *program)
  236. {
  237.    char drive[MAXDRIVE];
  238.    char dir[MAXDIR];
  239.    char ext[MAXEXT];
  240.  
  241.    fnsplit(path_program,drive,dir,program,ext);
  242.    strcpy(path,drive);
  243.    strcat(path,dir);
  244. };
  245.  
  246. void clear_language_list(struct language_node *node)
  247. {
  248.    if (node)
  249.    {
  250.      clear_language_list(node->right);
  251.      free(node->phrase);
  252.      free(node);
  253.    };
  254. };
  255.  
  256. int language_read_phrase
  257.  (FILE *phrase_file,
  258.   char *phrase,         /* Where to put the read phrase. */
  259.   char *language_name,  /* The language to read. */
  260.   char *used_by         /* This list of programs using this phrase */
  261.  )
  262.   /* Returns true is the next phrase was read successfully. */
  263. {
  264.    char phrase_ID_str[255];
  265.    char language_name_in[255];
  266.    int read_complete;
  267.    char phrase_in[255];
  268.  
  269.    if (feof(phrase_file))  /* If at eof then phrase not read */
  270.       return(0);
  271.  
  272.    fscanf(phrase_file,"%s,\n",phrase_ID_str);  /* get the phrase ID (not used) */
  273.  
  274.    if ((phrase_ID_str[0] == 0) || (feof(phrase_file)))
  275.       return(0);
  276.  
  277.    fscanf(phrase_file,"\n%[^\n]",used_by);
  278.  
  279.    read_complete = 0;
  280.    phrase[0] = 0;      /* Clear the phrase */
  281.    do
  282.    {
  283.      fscanf(phrase_file,"%s%*c%[^\n]",language_name_in,phrase_in);
  284.      if (language_name_in[0] == '*')
  285.         read_complete = 1;
  286.      else
  287.      {  strupr(language_name_in);
  288.         if (strcmp(language_name_in,language_name) == 0)
  289.            strcpy(phrase,phrase_in);
  290.         else
  291.            /* Use english if translation not provided */
  292.            if ((strcmp(language_name_in,"ENGLISH") == 0) &&
  293.                (phrase[0] == 0))
  294.               strcpy(phrase,phrase_in);
  295.      };
  296.    } while (!read_complete);
  297.    return(1);
  298. };
  299.  
  300.  
  301. /* load_language returns 1 if the translations loaded successfully
  302.    0 if the file is not found or corrupt.
  303. */
  304. int language_load(char *language_name, char *program_name)
  305. {
  306.    FILE *phrase_file;
  307.    char phrase_filename[MAXPATH];
  308.    char phrase_directory[MAXPATH];
  309.    char program_filename[MAXFILE];
  310.    struct language_node *node = 0;
  311.    long phrase_ID;   /* long may be int depending on implementation of enum */
  312.    struct language_node *last_node = 0;
  313.    char phrase[255];
  314.    char used_by[255];
  315.  
  316.    if (language_list)
  317.       clear_language_list(language_list);
  318.  
  319.    language_list = 0;
  320.  
  321.  
  322.    if (strcmp(language_name,"") == 0)
  323.      strcpy(language_name,"ENGLISH");
  324.  
  325.    phrase_ID = L_LANGUAGE;
  326.  
  327.    language_path_program(program_name,phrase_directory,program_filename);
  328.  
  329.    sprintf(phrase_filename,"%sPHRASES.LNG",phrase_directory);
  330.  
  331.    if ((phrase_file = fopen(phrase_filename,"rt")) == NULL)
  332.       return(0);  /* Unable to open phrases file. */
  333.  
  334.    for (phrase_ID = L_LANGUAGE ; phrase_ID < END_PHRASES; phrase_ID++)
  335.    {
  336.      if (!language_read_phrase(phrase_file,phrase,language_name,used_by))
  337.      {  fclose(phrase_file);
  338.         return(0);   /* language read failed. */
  339.      };
  340.      if (strstr(strupr(used_by),strupr(program_filename)))
  341.      {
  342.         node = (struct language_node *)malloc(sizeof(struct language_node));
  343.         language_list = language_list ? language_list : node;
  344.         node->phrase_ID = phrase_ID;
  345.         node->phrase = (char *)malloc(strlen(phrase)+1);
  346.         strcpy(node->phrase,phrase);
  347.         node->right = 0;
  348.         if (last_node) last_node->right = node;
  349.         last_node = node;
  350.      }
  351.    };
  352.    fclose(phrase_file);
  353.    return(1);
  354. };
  355.  
  356. static char L_unable_to_translate_str[] = "???";
  357. static char L_blank_str[] = " ";
  358.  
  359. char *translate(long phrase_ID)
  360. {
  361.    struct language_node *curr;
  362.    static char *translation;
  363.  
  364.    for (curr = language_list;
  365.         curr && (curr->phrase_ID != phrase_ID);
  366.         curr = curr->right);  /*  <- Yes semicolon here! */
  367.  
  368.    if (curr)
  369.       translation = curr->phrase;
  370.    else
  371.       translation = L_unable_to_translate_str;
  372.    if (translation[0] == '_')
  373.       translation = L_blank_str;
  374.    return(translation);
  375. };
  376.  
  377. int language_init(char *language_name, char *program_name)
  378. {
  379.    language_list = 0;
  380.  
  381.    return(language_load
  382.           ((strcmp(language_name,"") == 0) ? "ENGLISH" : language_name,
  383.            program_name));
  384. };
  385.  
  386. void language_end()
  387. {
  388.    clear_language_list(language_list);
  389. };
  390.  
  391. ---Cut Here---------8<--------8<----Cut Here---------8<--------8<
  392.  
  393. begin 644 phrases.lng
  394. M3%],04Y'54%'12P-"B\J(%!!4DU34$%7#0I%3D=,25-(($5N9VQI<V@-"D92
  395. M14Y#2"!&<F%N8V%I<PT*251!3$E!3B!)=&%L:6%N;PT*4U!!3DE32"!%<W!A
  396. M;F]L#0HJ+PT*3%]!8F]U="P-"B\J(%!!4DU34$%7#0I%3D=,25-(($%B;W5T
  397. M#0I&4D5.0T@@075T;W5R#0I)5$%,24%.(%)I9W5A<F1O#0I34$%.25-(($%C
  398. M97)C82!D90T**B\-"DQ?07!R+`T*+RH@4$%235-005<-"D5.1TQ)4T@@07!R
  399. M#0I&4D5.0T@@079R#0I)5$%,24%.($%P<@T*4U!!3DE32"!!8G(-"BHO#0I,
  400. M7T%P<FEL+`T*+RH@4$%235-005<-"D5.1TQ)4T@@07!R:6P-"D9214Y#2"!!
  401. M=G)I;`T*251!3$E!3B!!<')I;&4-"E-004Y)4T@@06)R:6P-"BHO#0I,7T%U
  402. M9RP-"B\J(%!!4DU34$%7#0I%3D=,25-(($%U9PT*1E)%3D-(($%O=`T*251!
  403. M3$E!3B!!9W0-"E-004Y)4T@@06=O#0HJ+PT*3%]!=6=U<W0L#0HO*B!005)-
  404. M4U!!5PT*14Y'3$E32"!!=6=U<W0-"D9214Y#2"!!;Q9T#0I)5$%,24%.($%G
  405. M;W-T;PT*4U!!3DE32"!!9V]S=&\-"BHO#0I,7T-H86YG95]$:7)E8W1O<GDL
  406. M#0HO*B!005)-4U!!5PT*14Y'3$E32"!#:&%N9V4@1&ER96-T;W)Y#0I&4D5.
  407. M0T@@0VAA;F=E<B!R`G!E<G1O:7)E#0I)5$%,24%.($-A;6)I;R!D:2!D:7)E
  408. M8W1O<GD-"E-004Y)4T@@0V%M8FEA<B!D:7)E8W1O<FEO#0HJ+PT*3%]#:&5C
  409. M:U]P871H7V]R7W-P96QL:6YG+`T*+RH@4$%235-005<-"D5.1TQ)4T@@0VAE
  410. M8VL@=&AE('!A=&@@;W(@<W!E;&QI;F<N#0I&4D5.0T@@4&5U="T(=')E(&5R
  411. M<F5U<B!S96YT:65R(&]U(`)P96QL871I;VXN#0I)5$%,24%.(%9E<FEF:6-A
  412. M<F4@:6P@<&5R8V%R<V\@;R!I;"!N;VUE+@T*4U!!3DE32"!697)I9FEQ=64@
  413. M;&$@<G5T82!O(&QA(&]R=&]G<F%F(6$N#0HJ+PT*3%]#;&]S92P-"B\J(%!!
  414. M4DU34$%7#0I%3D=,25-(($-L;W-E#0I&4D5.0T@@1F5R;65R#0I)5$%,24%.
  415. M($-H:75D:0T*4U!!3DE32"!#97)R87(-"BHO#0I,7T-U<G)E;G1?9&ER96-T
  416. M;W)Y+`T*+RH@4$%235-005<-"D5.1TQ)4T@@0W5R<F5N="!$:7)E8W1O<GD-
  417. M"D9214Y#2"!2`G!E<G1O:7)E($-O=7)A;G0-"DE404Q)04X@1&ER96-T;W)Y
  418. M($-O<G)E;G1E#0I34$%.25-(($1I<F5C=&]R:6\@8V]R<FEE;G1E#0HJ+PT*
  419. M3%]#7V%?<V-A9&4L#0HO*B!005)-4U!!5PT*14Y'3$E32"!#?F%^<V-A9&4-
  420. M"D9214Y#2"!#?F%^<V-A9&4-"DE404Q)04X@1FEN97-T<F4@:6X@?E-^;W9R
  421. M87!P;W-I>FEO;F4-"E-004Y)4T@@0WYA?G-C861A#0HJ+PT*3%]$871E+`T*
  422. M+RH@4$%235-005<-"D5.1TQ)4T@@1&%T90T*1E)%3D-(($1A=&4-"DE404Q)
  423. M04X@1&%T80T*4U!!3DE32"!&96-H80T**B\-"DQ?1&%T97-?9F]R7W!R;V9I
  424. M;&5?;W5T<'5T+`T*+RH@4$%235-005<-"D5.1TQ)4T@@1&%T97,@9F]R(')E
  425. M<&]R=&EN9R!S;VEL('!R;V9I;&4@=F%R:6%B;&5S#0I&4D5.0T@@1&%T97,@
  426. M<&]U<B!L)V]U='!U="!D97,@:&]R:7IO;G,-"DE404Q)04X@1&%T92!P97(@
  427. M;"=O=71P=70@9&5L;&$@=&%V;VQA(&1E;"!S=6]L;PT*4U!!3DE32"!&96-H
  428. M87,@<&%R82!R97!O<G1A<B!V87)I86)L97,@9&5L('!E<F9I;"!D92!S=65L
  429. M;PT**B\-"DQ?1&%Y+`T*+RH@4$%235-005<-"D5.1TQ)4T@@1&%Y#0I&4D5.
  430. M0T@@2F]U<@T*251!3$E!3B!':6]R;F\-"E-004Y)4T@@1"%A#0HJ+PT*3%]$
  431. M87ES+`T*+RH@4$%235-005<-"D5.1TQ)4T@@1&%Y<PT*1E)%3D-(($IO=7)S
  432. M#0I)5$%,24%.($=I;W)N:0T*4U!!3DE32"!$(6%S#0HJ+PT*3%]$87E?;V9?
  433. M;6]N=&@L#0HO*B!005)-4U!!5PT*14Y'3$E32"!$87D@;V8@=&AE(&UO;G1H
  434. M#0I&4D5.0T@@2F]U<B!D=2!M;VES#0I)5$%,24%.($EL(&=I;W)N;R!D96P@
  435. M;65S90T*4U!!3DE32"!$(6$@9&5L(&UE<PT**B\-"DQ?1&5C+`T*+RH@4$%2
  436. M35-005<-"D5.1TQ)4T@@1&5C#0I&4D5.0T@@1&5C#0I)5$%,24%.($1I8PT*
  437. M4U!!3DE32"!$96,-"BHO#0I,7T1E8V5M8F5R+`T*+RH@4$%235-005<-"D5.
  438. M1TQ)4T@@1&5C96UB97(-"D9214Y#2"!$96-E;6)R90T*251!3$E!3B!$:6-E
  439. M;6)R90T*4U!!3DE32"!$:6-I96UB<F4-"BHO#0I,7V1E9F%U;'0L#0HO*B!0
  440. M05)-4U!!5PT*14Y'3$E32"!D969A=6QT#0I&4D5.0T@@4&%R(&0"9F%U=`T*
  441. M251!3$E!3B!P<F5D969I;FET;PT*4U!!3DE32"!S=&%N9&%R9`T**B\-"DQ?
  442. M1&5L971E+`T*+RH@4$%235-005<-"D5.1TQ)4T@@1&5L971E#0I&4D5.0T@@
  443. M4W5P<')I;65R#0I)5$%,24%.($-A;F-E;&QA#0I34$%.25-((%-U<')I;6ER
  444. M#0HJ+PT*3%]%;G1E<BP-"B\J(%!!4DU34$%7#0I%3D=,25-(($5N=&5R#0I&
  445. M4D5.0T@@16YT<F4-"DE404Q)04X@26YT<F]D=7)R90T*4U!!3DE32"!%;G1R
  446. M90T**B\-"DQ?17AI="P-"B\J(%!!4DU34$%7#0I%3D=,25-(($5X:70-"D92
  447. M14Y#2"!1=6ET=&5R#0I)5$%,24%.($5S8VD-"E-004Y)4T@@4V%L:7(-"BHO
  448. M#0I,7T5X=&5N<VEO;E]M=7-T7VYO=%]S<&5C:69I960L#0HO*B!005)-4U!!
  449. M5PT*14Y'3$E32"!4:&4@97AT96YS:6]N(&UU<W0@;F]T(&)E('-P96-I9FEE
  450. M9"X-"D9214Y#2"!%>'1E;G-I;VX@;B=E<W0@<&%S(&YE8V5S<V%I<F4N#0I)
  451. M5$%,24%.($PG97-T96YS:6]N92!N;VX@9&5V92!E<W-E<F4@<W!E8VEF:6-A
  452. M=&$N#0I34$%.25-(($QA(&5X=&5N<VEO;B!N;R!D96)E(&5S<&5C:69I8V%R
  453. M<V4N#0HJ+PT*3%]%7WA?:70L#0HO*B!005)-4U!!5PT*14Y'3$E32"!%?GA^
  454. M:70-"D9214Y#2"!^47YU:71T97(-"DE404Q)04X@17YS?F-I#0I34$%.25-(
  455. M('Y3?F%L:7(-"BHO#0I,7T9E8BP-"B\J(%!!4DU34$%7#0I%3D=,25-(($9E
  456. M8@T*1E)%3D-(($9E=@T*251!3$E!3B!&96(-"E-004Y)4T@@1F5B#0HJ+PT*
  457. M3%]&96)R=6%R>2P-"B\J(%!!4DU34$%7#0I%3D=,25-(($9E8G)U87)Y#0I&
  458. M4D5.0T@@1F5V<FEE<@T*251!3$E!3B!&96)B<F%I;PT*4U!!3DE32"!&96)R
  459. M97)O#0HJ+PT*3%](96QP+`T*+RH@4$%235-005<-"D5.1TQ)4T@@2&5L<`T*
  460. M1E)%3D-(($%I9&4-"DE404Q)04X@06EU=&\-"E-004Y)4T@@07EU9&$-"BHO
  461. M#0I,7TAO=7)S+`T*+RH@4$%235-005<-"D5.1TQ)4T@@2&]U<G,-"D9214Y#
  462. M2"!H975R97,-"DE404Q)04X@3W)E#0I34$%.25-((&AO<F%S#0HJ+PT*3%])
  463. M;G-E<G0L#0HO*B!005)-4U!!5PT*14Y'3$E32"!);G-E<G0-"D9214Y#2"!)
  464. M;G-E<F5R#0I)5$%,24%.($EN<V5R:7-C:0T*4U!!3DE32"!);G-E<G1A<@T*
  465. M*B\-"DQ?2F%N+`T*+RH@4$%235-005<-"D5.1TQ)4T@@2F%N#0I&4D5.0T@@
  466. M2F%N#0I)5$%,24%.($=E;@T*4U!!3DE32"!%;G(-"BHO#0I,7TIA;G5A<GDL
  467. M#0HO*B!005)-4U!!5PT*14Y'3$E32"!*86YU87)Y#0I&4D5.0T@@2F%N=FEE
  468. M<@T*251!3$E!3B!'96YN86EO#0I34$%.25-(($5N97)O#0HJ+PT*3%]*=6PL
  469. M#0HO*B!005)-4U!!5PT*14Y'3$E32"!*=6P-"D9214Y#2"!*=6P-"DE404Q)
  470. M04X@3'5G#0I34$%.25-(($IU;`T**B\-"DQ?2G5L>2P-"B\J(%!!4DU34$%7
  471. M#0I%3D=,25-(($IU;'D-"D9214Y#2"!*=6EL;&5T#0I)5$%,24%.($QU9VQI
  472. M;PT*4U!!3DE32"!*=6QI;PT**B\-"DQ?2G5N+`T*+RH@4$%235-005<-"D5.
  473. M1TQ)4T@@2G5N#0I&4D5.0T@@2G5N#0I)5$%,24%.($=I=0T*4U!!3DE32"!*
  474. M=6X-"BHO#0I,7TIU;F4L#0HO*B!005)-4U!!5PT*14Y'3$E32"!*=6YE#0I&
  475. M4D5.0T@@2G5I;@T*251!3$E!3B!':75G;F\-"E-004Y)4T@@2G5N:6\-"BHO
  476. M#0I,7TQI;F5S7W!E<E]P86=E+`T*+RH@4$%235-005<-"D5.1TQ)4T@@3&EN
  477. M97,@<&5R('!A9V4-"D9214Y#2"!,:6=N97,@<&%R('!A9V4-"DE404Q)04X@
  478. M4FEG:&4@<&5R('!A9VEN80T*4U!!3DE32"!,(6YE87,@<&]R('`@9VEN80T*
  479. M*B\-"DQ?3&EN95]W:61T:"P-"B\J(%!!4DU34$%7#0I%3D=,25-(($QI;F4@
  480. M=VED=&@-"D9214Y#2"!,;VYG=65U<B!D92!L:6YG97,-"DE404Q)04X@3&%R
  481. M9VAE>GIA(')I9V$-"E-004Y)4T@@06YC:&\@9&4@;&$@;"%N96$-"BHO#0I,
  482. M7TQO860L#0HO*B!005)-4U!!5PT*14Y'3$E32"!,;V%D#0I&4D5.0T@@3&5C
  483. M='5R90T*251!3$E!3B!#87)I8V$-"E-004Y)4T@@06)R:7(-"BHO#0I,7TQO
  484. M861?0W)E871E+`T*+RH@4$%235-005<-"D5.1TQ)4T@@3&]A9"]#<F5A=&4-
  485. M"D9214Y#2"!#:&%R9V5R+T-R`F5R#0I)5$%,24%.($-A<FEC82]#<F5A#0I3
  486. M4$%.25-(($%B<FER+V-R96%R#0HJ+PT*3%]-87(L#0HO*B!005)-4U!!5PT*
  487. M14Y'3$E32"!-87(-"D9214Y#2"!-87(-"DE404Q)04X@36%R#0I34$%.25-(
  488. M($UA<@T**B\-"DQ?36%R8V@L#0HO*B!005)-4U!!5PT*14Y'3$E32"!-87)C
  489. M:`T*1E)%3D-(($UA<G,-"DE404Q)04X@36%R>F\-"E-004Y)4T@@36%R>F\-
  490. M"BHO#0I,7TUA>2P-"B\J(%!!4DU34$%7#0I%3D=,25-(($UA>0T*1E)%3D-(
  491. M($UA:0T*251!3$E!3B!-86=G:6\-"E-004Y)4T@@36%Y;PT**B\-"DQ?36]U
  492. M<V4L#0HO*B!005)-4U!!5PT*14Y'3$E32"!-;W5S90T*1E)%3D-((%-O=7)I
  493. M<PT*251!3$E!3B!-;W5S90T*4U!!3DE32"!2870B;@T**B\-"DQ?3F5X=%]W
  494. M:6YD;W<L#0HO*B!005)-4U!!5PT*14Y'3$E32"!.97AT('=I;F1O=PT*1E)%
  495. M3D-(($9E;@AT<F4@<W5I=F%N=`T*251!3$E!3B!0<F]S<VEM82!F:6YE<W1R
  496. M80T*4U!!3DE32"!696YT86YA(%-I9W5I96YT90T**B\-"DQ?3F]T7T%V86EL
  497. M86)L92P-"B\J(%!!4DU34$%7#0I%3D=,25-(($YO="!!=F%I;&%B;&4-"D92
  498. M14Y#2"!.;VX@1&ES<&]N:6)L90T*251!3$E!3B!.;VX@1&ES<&]N:6)I;&4-
  499. M"E-004Y)4T@@3F\@9&ES<&]N:6)L90T**B\-"DQ?3F]T7V5N;W5G:%]M96UO
  500. M<GE?=&]?8V]M<&QE=&5?;W!E<F%T:6]N+`T*+RH@4$%235-005<-"D5.1TQ)
  501. M4T@@3F]T(&5N;W5G:"!M96UO<GD@879A:6QA8FQE('1O(&-O;7!L971E(&]P
  502. M97)A=&EO;BX-"D9214Y#2"!-`FUO<FEE(&YO;B!D:7-P;VYI8FQE+B!/<`)R
  503. M871I;VX@;F]N(&-O;7!L970N#0I)5$%,24%.($UE;6]R:6$@9&ES<&]N:6)I
  504. M;&4@:6YS=69F:6-I96YT92!P97(@8V]M<&QE=&%R92!L)V]P97)A>FEO;F4N
  505. M#0I34$%.25-(($YO(&AA>2!S=69I8VEE;G1E(&UE;6]R:6$@<&%R82!C;VUP
  506. M;&5T87(@;&$@;W!E<F%C:2)N+@T**B\-"DQ?3F]T7W5S960L#0HO*B!005)-
  507. M4U!!5PT*14Y'3$E32"!.;W0@57-E9`T*1E)%3D-(($EN=71I;&ES`@T*251!
  508. M3$E!3B!.;VX@571I;&EZ>F%T;PT*4U!!3DE32"!.;R!S92!U<V$-"BHO#0I,
  509. M7TYO=BP-"B\J(%!!4DU34$%7#0I%3D=,25-(($YO=@T*1E)%3D-(($YO=@T*
  510. M251!3$E!3B!.;W8-"E-004Y)4T@@3F]V#0HJ+PT*3%].;W9E;6)E<BP-"B\J
  511. M(%!!4DU34$%7#0I%3D=,25-(($YO=F5M8F5R#0I&4D5.0T@@3F]V96UB<F4-
  512. M"DE404Q)04X@3F]V96UB<F4-"E-004Y)4T@@3F]V:65M8G)E#0HJ+PT*3%]/
  513. M8W0L#0HO*B!005)-4U!!5PT*14Y'3$E32"!/8W0-"D9214Y#2"!/8W0-"DE4
  514. M04Q)04X@3W1T#0I34$%.25-(($]C=`T**B\-"DQ?3V-T;V)E<BP-"B\J(%!!
  515. M4DU34$%7#0I%3D=,25-(($]C=&]B97(-"D9214Y#2"!/8W1O8G)E#0I)5$%,
  516. M24%.($]T=&]B<F4-"E-004Y)4T@@3V-T=6)R90T**B\-"DQ?3W!E;BP-"B\J
  517. M(%!!4DU34$%7#0I%3D=,25-(($]P96X-"D9214Y#2"!/=79R:7(-"DE404Q)
  518. M04X@07!R:0T*4U!!3DE32"!!8G)I<@T**B\-"DQ?3W!E;E]A7T9I;&4L#0HO
  519. M*B!005)-4U!!5PT*14Y'3$E32"!/<&5N(&$@1FEL90T*1E)%3D-(($]U=G)I
  520. M<B!U;F4@9FEC:&EE<@T*251!3$E!3B!!<')I('5N($9I;&4-"E-004Y)4T@@
  521. M06)R:7(@=6X@87)C:&EV;PT**B\-"DQ?3U]+7RP-"B\J(%!!4DU34$%7#0I%
  522. M3D=,25-(($]^2WX-"D9214Y#2"!/?DM^#0I)5$%,24%.('Y%?G-E9W5I#0I3
  523. M4$%.25-(('Y'?G5A<F1A<@T**B\-"DQ?4&%G:6YA=&EO;BP-"B\J(%!!4DU3
  524. M4$%7#0I%3D=,25-((%!A9VEN871I;VX-"D9214Y#2"!086=I;F%T:6]N#0I)
  525. M5$%,24%.($EM<&%G:6YA>FEO;F4-"E-004Y)4T@@4&%G:6YA8VDB;@T**B\-
  526. M"DQ?4&QE87-E7W=A:70L#0HO*B!005)-4U!!5PT*14Y'3$E32"!0;&5A<V4@
  527. M5V%I="XN+@T*1E)%3D-(($%T=&5N9&5Z+BXN#0I)5$%,24%.(%!R96=O(&%T
  528. M=&5N9&5R92XN+@T*4U!!3DE32"!%<W!E<F4L('!O<B!F879O<BXN+@T**B\-
  529. M"DQ?4')E<W-?4D5455).7W1O7V-O;G1I;G5E+`T*+RH@4$%235-005<-"D5.
  530. M1TQ)4T@@4')E<W,@6U)E='5R;ET@=&\@8V]N=&EN=64N#0I&4D5.0T@@5&%P
  531. M97(@6R`\1$19(%T@<&]U<B!C;VYT:6YU97(N#0I)5$%,24%.(%!R96UE<F4@
  532. M6TEN=FEO72!P97(@8V]N=&EN=6%R92X-"E-004Y)4T@@4')E<VEO;F4@6T5N
  533. M=')A<ET@<&%R82!C;VYT:6YU87(N#0HJ+PT*3%]0<F5V7W=I;F1O=RP-"B\J
  534. M(%!!4DU34$%7#0I%3D=,25-((%!R978@=VEN9&]W#0I&4D5.0T@@1F5N`G1R
  535. M92!P<@)C960"#0I)5$%,24%.($9I;F5S=')A('!R96,N#0I34$%.25-((%9E
  536. M;G1A;F$@86YT97)I;W(-"BHO#0I,7U-A=F4L#0HO*B!005)-4U!!5PT*14Y'
  537. M3$E32"!3879E#0I&4D5.0T@@4V%U=F5R#0I)5$%,24%.(%-A;'8-"E-004Y)
  538. M4T@@1W5A<F1A<@T**B\-"DQ?4V5L96-T7V%?1FEL92P-"B\J(%!!4DU34$%7
  539. M#0I%3D=,25-((%-E;&5C="!A($9I;&4-"D9214Y#2"!#:&]I<VER('5N(&9I
  540. M8VAI97(-"DE404Q)04X@4V5L97II;VYA('5N('-I;&4-"E-004Y)4T@@4V5L
  541. M96-C:6]N92!U;B!A<F-H:79O#0HJ+PT*3%]397!T96UB97(L#0HO*B!005)-
  542. M4U!!5PT*14Y'3$E32"!397!T96UB97(-"D9214Y#2"!397!T96UB<F4-"DE4
  543. M04Q)04X@4V5T=&5M8G)E#0I34$%.25-((%-E<'1I96UB<F4-"BHO#0I,7U-P
  544. M="P-"B\J(%!!4DU34$%7#0I%3D=,25-((%-P=`T*1E)%3D-((%-P=`T*251!
  545. M3$E!3B!3970-"E-004Y)4T@@4W!T#0HJ+PT*3%]4>7!E7T58251?=&]?<F5T
  546. M=7)N+`T*+RH@4$%235-005<-"D5.1TQ)4T@@5'EP92!%6$E4('1O(')E='5R
  547. M;BXN+@T*1E)%3D-((%1A<&5Z($58250@!2!R971O=7)N97(N+BX-"DE404Q)
  548. M04X@26YV:6$@:6P@8V]M86YD;R!%6$E4('!E<B!R:71O<FYA<F4N+BX-"E-0
  549. M04Y)4T@@17-C<FEB82!%6$E4('!A<F$@<F5T;W)N87(N+BX-"BHO#0I,7UEE
  550. M87(L#0HO*B!005)-4U!!5PT*14Y'3$E32"!996%R#0I)5$%,24%.($%N;F\-
  551. M"E-004Y)4T@@021O#0I&4D5.0T@@06YN90(-"BHO#0I,7UIO;VTL#0HO*B!0
  552. M05)-4U!!5PT*14Y'3$E32"!:;V]M#0I&4D5.0T@@6F]O;0T*251!3$E!3B!:
  553. M;V]M#0I34$%.25-((%IO;VT-"BHO#0I,7U]!7W!P96YD+`T*+RH@4$%235-0
  554. M05<-"D5.1TQ)4T@@?D%^<'!E;F0-"D9214Y#2"!^07YJ;W5T97(-"DE404Q)
  555. M04X@?D%^9V=I=6YG:0T*4U!!3DE32"!^07YG<F5G87(-"BHO#0I,7U]#7V%N
  556. M8V5L+`T*+RH@4$%235-005<-"D5.1TQ)4T@@?D-^86YC96P-"D9214Y#2"!^
  557. M07YN;G5L97(-"DE404Q)04X@07YN?FYU;&QA#0I34$%.25-(('Y#?F%N8V5L
  558. M87(-"BHO#0I,7U]#7VAD:7(L#0HO*B!005)-4U!!5PT*14Y'3$E32"!^0WYH
  559. M1&ER#0I&4D5.0T@@?D-^:&%N9V5R#0I)5$%,24%.('Y#?F%M8FEA#0I34$%.
  560. M25-(('Y#?F%M8FEA<@T**B\-"DQ?7T-?;&]S92P-"B\J(%!!4DU34$%7#0I%
  561. M3D=,25-(('Y#?FQO<V4-"D9214Y#2"!^1GYE<FUE<@T*251!3$E!3B!^0WYH
  562. M:75D:0T*4U!!3DE32"!^0WYE<G)A<@T**B\-"DQ?7T1?96QE=&4L#0HO*B!0
  563. M05)-4U!!5PT*14Y'3$E32"!^1'YE;&5T90T*1E)%3D-(('Y3?G5P<')I;65R
  564. M#0I)5$%,24%.('Y#?F%N8V5L;&$-"E-004Y)4T@@?E-^=7!R:6UI<@T**B\-
  565. M"DQ?7T1?:7)E8W1O<GDL#0HO*B!005)-4U!!5PT*14Y'3$E32"!^1'YI<F5C
  566. M=&]R>0T*1E)%3D-(('Y2?@)P97)T;VER90T*251!3$E!3B!^1'YI<F5C=&]R
  567. M>0T*4U!!3DE32"!^1'YI<F5C=&]R:6\-"BHO#0I,7U]$7T]37W-H96QL+`T*
  568. M+RH@4$%235-005<-"D5.1TQ)4T@@?D1^3U,@<VAE;&P-"D9214Y#2"!^1'Y/
  569. M4R!S:&5L;`T*251!3$E!3B!^1'Y/4R!S:&5L;`T*4U!!3DE32"!^1'Y/4R!S
  570. M:&5L;`T**B\-"DQ?7T5?>&ET+`T*+RH@4$%235-005<-"D5.1TQ)4T@@?D5^
  571. M>&ET#0I&4D5.0T@@?E%^=6ET=&5R#0I)5$%,24%.('Y%?G-C:0T*4U!!3DE3
  572. M2"!^4WYA;&ER#0HJ+PT*3%]?1E]I;&4L#0HO*B!005)-4U!!5PT*14Y'3$E3
  573. M2"!^1GYI;&4-"D9214Y#2"!^1GYI8VAI97(-"DE404Q)04X@?D9^:6QE#0I3
  574. M4$%.25-(('Y&?FEC:&5R;PT**B\-"DQ?7TE?;G-E<G0L#0HO*B!005)-4U!!
  575. M5PT*14Y'3$E32"!^27YN<V5R=`T*1E)%3D-(('Y)?FYS97)E<@T*251!3$E!
  576. M3B!^27YN<V5R:7-C:0T*4U!!3DE32"!^27YN<V5R=&%R#0HJ+PT*3%]?3%]O
  577. M860L#0HO*B!005)-4U!!5PT*14Y'3$E32"!^3'YO860-"D9214Y#2"!^3'YE
  578. M8W1U<F4-"DE404Q)04X@?D-^87)I8V$-"E-004Y)4T@@?D%^8G)I<@T**B\-
  579. M"DQ?7TY?86UE+`T*+RH@4$%235-005<-"D5.1TQ)4T@@?DY^86UE#0I&4D5.
  580. M0T@@?DY^;VT-"DE404Q)04X@?DY^;VUE#0I34$%.25-(('Y.?F]M8G)E#0HJ
  581. M+PT*3%]?3E]E>'1?=VEN9&]W+`T*+RH@4$%235-005<-"D9214Y#2"!^1GYE
  582. M;@AT<F4@<W5I=F%N=`T*14Y'3$E32"!^3GYE>'0@=VEN9&]W#0I)5$%,24%.
  583. M('Y0?G)O<W-I;6$@9FEN97-T<F$-"E-004Y)4T@@5F5N=&%N82!^4WYI9W5I
  584. M96YT90T**B\-"DQ?7T]?<&5N+`T*+RH@4$%235-005<-"D5.1TQ)4T@@?D]^
  585. M<&5N#0I&4D5.0T@@?D]^<&5N#0I)5$%,24%.('Y!?G!R:0T*4U!!3DE32"!^
  586. M07YB<FER#0HJ+PT*3%]?3U]R:6=I;BP-"B\J(%!!4DU34$%7#0I%3D=,25-(
  587. M('Y/?G)I9VEN#0I&4D5.0T@@3W)I9VEN90T*251!3$E!3B!^3WYR:6=I;F4-
  588. M"E-004Y)4T@@?D]^<FEG:6YA;`T**B\-"DQ?7T]?=F5R=W)I=&4L#0HO*B!0
  589. M05)-4U!!5PT*14Y'3$E32"!^3WYV97)W<FET90T*1E)%3D-(('Y2?F5M<&QA
  590. M8V5R#0I)5$%,24%.('Y2?FES8W)I=FD-"E-004Y)4T@@?D-^86UB:6%R#0HJ
  591. M+PT*3%]?4%]R:6YT+`T*+RH@4$%235-005<-"D5.1TQ)4T@@?E!^<FEN=`T*
  592. M1E)%3D-(('Y)?FUP<FEM97)I90T*251!3$E!3B!^4WYT86UP80T*4U!!3DE3
  593. M2"!^27YM<')I;6ER#0HJ+PT*3%]?4E]E<VEZ95]M;W9E+`T*+RH@4$%235-0
  594. M05<-"D5.1TQ)4T@@?E)^97-I>F4O;6]V90T*1E)%3D-(('Y#?F%L:6)R86=E
  595. M#0I)5$%,24%.('Y2?FED:6UE;G-I;VYA+VUU;W9I#0I34$%.25-(($-A;6)I
  596. M87(@?E1^86UA)&\O;6]V97(-"BHO#0I,7U]27W5N=&EM95]G<F%P:"P-"B\J
  597. M(%!!4DU34$%7#0I%3D=,25-(('Y2?G5N=&EM92!'<F%P:`T*1E)%3D-(('Y'
  598. M?G)A<&AI<75E#0I)5$%,24%.('Y'?G)A9FEC:2!V<R!T96UP;PT*4U!!3DE3
  599. M2"!^1WYR(&9I8V]S#0HJ+PT*3%]?4U]A=F4L#0HO*B!005)-4U!!5PT*14Y'
  600. M3$E32"!^4WYA=F4-"D9214Y#2"!^4WYA=79E<@T*251!3$E!3B!^4WYA;'9A
  601. M#0I34$%.25-(('Y'?G5A<F1A<@T**B\-"DQ?7U1?:6QE+`T*+RH@4$%235-0
  602. M05<-"D5.1TQ)4T@@?E1^:6QE#0I&4D5.0T@@?D-^$W1E(`4@8Q-T90T*251!
  603. M3$E!3B!^07YF9FEA;F-A;65N=&\@9&5L;&4@9FEN97-T<F4-"E-004Y)4T@@
  604. M?E9^96YT86YA<R!C;W-T861O(&$@8V]S=&%D;PT**B\-"DQ?7U9?:61E;U]M
  605. M;V1E7S(U7S4P+`T*+RH@4$%235-005<-"D5.1TQ)4T@@?E9^:61E;R!M;V1E
  606. M(#(U+S4P#0I&4D5.0T@@?E9^:61E;R!M;V1E(#(U+S4P#0I)5$%,24%.('Y3
  607. M?F-H97)M;R!I;B!-;V1A;&ET!2`R-2\U,`T*4U!!3DE32"!M;V1A(&1E;"!^
  608. M5GYI9&5O(#(U+S4P#0HJ+PT*3%]?5U]I;F1O=RP-"B\J(%!!4DU34$%7#0I%
  609. M3D=,25-(('Y7?FEN9&]W#0I&4D5.0T@@?D9^96X(=')E#0I)5$%,24%.('Y&
  610. M?FEN97-T<F$-"E-004Y)4T@@?E9^96YT86YA#0HJ+PT*3%]?6E]O;VTL#0HO
  611. M*B!005)-4U!!5PT*1E)%3D-(('Y:?F]O;0T*14Y'3$E32"!^6GYO;VT-"DE4
  612. M04Q)04X@?EI^;V]M#0I34$%.25-(('Y:?F]O;0T**B\-"DQ?1&%Y7V]F7WEE
  613. M87(L#0HO*B!005)-4U!!5PT*14Y'3$E32"!$87D@;V8@=&AE('EE87([#0I&
  614. M4D5.0T@@2F]U<B!D92!L)V%N;@)E.PT*251!3$E!3B!':6]R;F\@9&5L;"=A
  615. M;FYO#0I34$%.25-(($0A82!D96P@821O.PT**B\-"DQ?9&ES86)L960L#0HO
  616. M*B!005)-4U!!5PT*14Y'3$E32"!D:7-A8FQE9`T*1E)%3D-((&YO;B!H86)I
  617. M;&ET`@T*251!3$E!3B!D:7-A8FEL:71A=&D-"E-004Y)4T@@9&5S:&%B:6QI
  618. M=&%D;PT**B\-"DQ?96YA8FQE9"P-"B\J(%!!4DU34$%7#0I%3D=,25-((&5N
  619. M86)L960-"D9214Y#2"!H86)I;&ET`@T*251!3$E!3B!A8FEL:71A=&D-"E-0
  620. M04Y)4T@@:&%B:6QI=&%D;PT**B\-"DQ?1D%)3$5$+`T*+RH@4$%235-005<-
  621. M"D5.1TQ)4T@@1D%)3$5$#0I&4D5.0T@@$$-(14,-"DE404Q)04X@1D%,3$E4
  622. M3PT*4U!!3DE32"!&4D%#05-!#0HJ+PT*3%]N;W1?=F%L:60L#0HO*B!005)-
  623. M4U!!5PT*14Y'3$E32"!N;W0@=F%L:60-"D9214Y#2"!N;VX@=F%L86)L92X-
  624. M"DE404Q)04X@;F]N('9A;&ED;PT*4U!!3DE32"!N;R!E<R!V(&QI9&\-"BHO
  625. M#0I,7U!!4U-%1"P-"B\J(%!!4DU34$%7#0I%3D=,25-((%!!4U-%1`T*1E)%
  626. M3D-((%!!4U,0#0I)5$%,24%.(%!!4U-!5$\-"E-004Y)4T@@15A)5$]33PT*
  627. M*B\-"DQ?5F%L:61A=&EN9RP-"B\J(%!!4DU34$%7#0I%3D=,25-((%9A;&ED
  628. M871I;F<-"D9214Y#2"!686QI9&%T:6]N(&5N(&-O=7)S#0I)5$%,24%.(%9A
  629. M;&ED87II;VYE(&EN(&%T=&\-"E-004Y)4T@@5F%L:61A;F1O#0HJ+PT*3%]6
  630. M86QI9&%T:6]N+`T*+RH@4$%235-005<-"D5.1TQ)4T@@5F%L:61A=&EO;@T*
  631. M1E)%3D-((%9A;&ED871I;VX-"DE404Q)04X@5F%L:61A>FEO;F4-"E-004Y)
  632. M4T@@5F%L:61A8VDB;@T**B\-"DQ?5F5R:69Y:6YG7V5X:7-T86YC95]O9E]F
  633. M:6QE+`T*+RH@4$%235-005<-"D5.1TQ)4T@@5F5R:69Y:6YG(&5X:7-T96YC
  634. M92!O9B!F:6QE#0I&4D5.0T@@5@)R:69I8V%T:6]N(&1E(&PG`GAI<W1E;F-E
  635. M(&1U(&9I8VAI97(-"DE404Q)04X@5F5R:69I8V$@9&5L;"=E<VES=&5N>F$@
  636. M9&5L(&9I;&4@:6X@871T;PT*4U!!3DE32"!697)I9FEC86YD;R!E>&ES=&5N
  637. 38VEA(&1E;"!A<F-H:79O#0HJ+U!!
  638. `
  639. end
  640.