home *** CD-ROM | disk | FTP | other *** search
/ Media Share 9 / MEDIASHARE_09.ISO / ra / ramaint.zip / RAMAINT.DOC < prev    next >
Text File  |  1994-02-05  |  22KB  |  517 lines

  1.  
  2.  
  3.  
  4.  
  5.                                  RAMAINT.EXE
  6.  
  7.                  Copyright 1994 by Pass - the - Buck SoftWare
  8.                             18101 E.  19th St.  N.
  9.                               Independence, Mo.
  10.                                     64058
  11.  
  12.                          (RA versions 1.1x and 2.0x)
  13.  
  14.          RAMAINT  is  designed to be used as an event task  scheduler  for
  15.     RemoteAccess  BBS  systems.   RAMAINT replaces endless calls to  batch
  16.     files  that  need  only  be run on a weekly or monthly  basis  with  a
  17.     schedule  of  events  to  be performed  ONLY  when  needed.    RAMAINT
  18.     optimizes events and keeps the system on-line more of the time.
  19.  
  20.          RAMAINT  allows the sysop the freedom to change bulletin files or
  21.     menu  screens  or welcome messages on a per call,  daily,   weekly  or
  22.     monthly  basis.    System maintenance items which were either done  by
  23.     hand  or  left  undone for lack of an automated approach  can  now  be
  24.     scheduled in advance and forgotten.
  25.  
  26.          Unlike menu driven maintenance utilities,  RAMAINT doesn't try to
  27.     do  everything in its own way.   It allows you the freedom to use your
  28.     favorite programs and utilities any way you see fit, anytime you wish.
  29.  
  30.          RAMAINT is FAST,  configurable and occupies less than 25K of disk
  31.     space.
  32.  
  33.  
  34.     OBLIGATORY SHAREWARE LICENSE AGREEMENT:
  35.  
  36.          What  can I say that hasn't been said before.   Well,  how about,
  37.     "You DON'T have to stop using this utility after 30 days!"
  38.  
  39.          Use it forever if you like it and find it useful.  If you want to
  40.     register it, just send $10 U.S.  and an S.A.S.E.  and you will receive
  41.     a registration code that will give you the "enhanced"  options.   When
  42.     registering  you must give me the name of your BBS and the SysOp  name
  43.     EXACTLY AS IT APPEARS IN RACONFIG(!).  Capitalization, punctuation and
  44.     spacing are important.
  45.  
  46.          Payment  may be made in the form of CASH,  CHECK or MONEY  ORDER.
  47.     Make  checks and M.O.'s payable to Dave Perry and send to the  address
  48.     shown at the top of this document.
  49.  
  50.          Normal  care has been taken in testing this software for bugs and
  51.     reliability.    It is guaranteed only to work on MY system.   Odds are
  52.     that it will work on yours, too, but I will not be responsible for ANY
  53.     damages resulting from the use or abuse of this software.  Use of this
  54.     software  constitutes  an  agreement  to these terms.    Use  of  this
  55.     software  in  any area where state or local law requires  warranty  or
  56.     proofs of suitability for purpose or any other restriction is strictly
  57.     PROHIBITED.
  58.  
  59.  
  60.  
  61.     RAMAINT CONFIG STRUCTURE:
  62.  
  63.          RAMAINT.CFG  is a normal ASCII text file containing both internal
  64.     and external commands.  ALL RAMAINT.CFG commands and information lines
  65.     may  appear  in  ANY order in the config file.  The  config  file  may
  66.     contain comments.
  67.  
  68.          While  the order is not important,  certain other parameters are.
  69.     The  following  are hard and fast rules which will avoid  problems  in
  70.     configuration:
  71.  
  72.          All  comments  MUST  have  a ';'  as the  first  non-white  space
  73.     character.
  74.  
  75.          All  comment lines must be stand alone.  You should NOT include a
  76.     comment on a command line.
  77.  
  78.          Spacing  is  NOT  important on a command  line.   Separators  may
  79.     include spaces or tabs to make the file easier to read or "prettier".
  80.  
  81.          All blank lines in the config file should have a ';' as the first
  82.     character  and  will be treated as comments.  (blank lines should  NOT
  83.     cause errors in the operation of the program but do waste time.)
  84.  
  85.          All  lines in the config file are executed in the ORDER they  are
  86.     listed  (with  the  exception  of the BOOT command)  as  long  as  the
  87.     operational parameters are met.
  88.  
  89.  
  90.          NOTE:   All  config  file lines are limited to 95  characters  in
  91.     length - MAXIMUM!
  92.  
  93.  
  94.     INTERNAL COMMANDS:
  95.  
  96.  
  97.     SERIAL xxxxxxxxxx
  98.  
  99.          If  included in the config file will open the registered features
  100.     for use by RAMAINT.EXE. This is the number supplied when money changes
  101.     hands.   While  it appears that most,  if not all,  of the  registered
  102.     features  can  be implemented by calling DOS and BATCH file  routines,
  103.     more  features  are on the way which would be much more  difficult  to
  104.     emulate.
  105.  
  106.  
  107.     LOG drive:\path\file.ext
  108.  
  109.          This  line  directs  RAMAINT  to place its activity  log  in  the
  110.     indicated  log file.  This can be the RA log if you prefer or you  can
  111.     use a stand alone RAMAINT.LOG.  The .log output of RAMAINT fits nicely
  112.     in  the RA log and gives a complete report of the maintenance run in a
  113.     "Maintenance log" block. If you do not include a log path RAMAINT will
  114.     create  a file called RAMAINT.TMP in the current directory which  will
  115.     remain  until  the next run of the program.  It will then be  replaced
  116.     with  a temporary log of its next run so you won't have another  space
  117.     consuming, seldom viewed log.
  118.  
  119.          Errors are always written to RAMAINT.ERR in the current directory
  120.     and  this file remains from run to run so that errors can be  reviewed
  121.     at any time.
  122.  
  123.          Different  .CFG files,  intended for different events,  may  have
  124.     different log files or none at all.  This allows you to use the RA log
  125.     for the daily maintenance event and a different log or none at all for
  126.     the other "between calls" events.
  127.  
  128.  
  129.     CLEANLOG drive:\path\file.ext
  130.  
  131.          This  line  may  be  used in place of the  above  to  keep  OTHER
  132.     utilities  that  run from the RAMAINT environment from writing to  the
  133.     named  log  file.    It  does this by simply renaming  the  log  file,
  134.     allowing  the utilities to write to the named file,  then deletes  the
  135.     named  file  and  replaces  it with the old log.   It  then  adds  the
  136.     contents of RAMAINT.TMP to the end of the file.
  137.  
  138.          If  you  use  a log-splitter to create daily logs  (such  as  the
  139.     LOGPACK.BAT included) you MUST RUN IT BEFORE CALLING RAMAINT!
  140.  
  141.  
  142.     ONCE
  143.  
  144.          If  this  appears in the config file,  the program will only  run
  145.     once per 24 hour day. If called accidentally or as part of a recurrent
  146.     batch file,  RAMAINT will NOT execute (see TEST exception) until after
  147.     midnight according to the system clock.
  148.  
  149.          If word ONCE does NOT appear in the config file, RAMAINT will run
  150.     each time it is called. Intended or not.
  151.  
  152.          RAMAINT can be used with multiple configuration files as you will
  153.     see,  but only ONE .cfg file may contain the ONCE command.   I suggest
  154.     that  the  ONCE command be reserved for the main daily  system  event.
  155.     Normally, this is the only one that you will want to run only one time
  156.     per day.
  157.  
  158.  
  159.  
  160.     IFEXIST drive:\path\file.ext
  161.  
  162.          The  IFEXIST keyword checks for the presence of the named file as
  163.     a  condition for execution along with the day/date specified.   If the
  164.     file  exists  in the location specified then all commands  within  the
  165.     block up to the ENDIF keyword will be executed.
  166.  
  167.          Within  the  block,  day/date specifiers are not  allowed.    The
  168.     day/date  specifier  for the IFEXIST statement is assumed to be  valid
  169.     for all statements within the block.
  170.  
  171.  
  172.     IFNOTEXIST drive:\path\file.ext
  173.  
  174.          The same as the IFEXIST keyword above except executes only if the
  175.     named file DOES NOT exist.
  176.  
  177.          NOTE: Wildcard file specifiers are NOT supported in either of the
  178.     IF block commands!
  179.  
  180.     ENDIF
  181.  
  182.          The  ENDIF  keyword ends the block of instructions  initiated  by
  183.     either  the  IFEXIST or IFNOTEXIST keywords.   All instruction  blocks
  184.     MUST be terminated by the use of the ENDIF keyword.
  185.  
  186.          IF  blocks  may  NOT be nested and each MUST have its  own  ENDIF
  187.     statement.    A  configuration file may contain as many IF  blocks  as
  188.     necessary.
  189.  
  190.  
  191.  
  192.     BOOT (Registered)
  193.  
  194.          If  this  appears  after any command parameter  anywhere  in  the
  195.     config  file,  the system will re-boot when RAMAINT is FINISHED.   All
  196.     commands  in the config file with matching day/date parameters will be
  197.     executed FIRST.
  198.  
  199.          The  BOOT command MUST be prefaced by a command parameter (day  -
  200.     date) and assumes that if there is a diskette in drive A:  it was left
  201.     there  accidentally and attempting a BOOT would cause a system  error.
  202.     BOOT  WILL NOT OPERATE WITH A DISK IN DRIVE A:  !!!   It will  instead
  203.     ignore  the  command and RAMAINT will exit with error level 5  causing
  204.     the  system to return to normal operation unbooted.   What you do with
  205.     the error level is up to you.  It's there for information only and has
  206.     no effect on the operation of the system.   You may, however, trap for
  207.     it  in the RA batch file that calls RAMAINT and do what you wish  with
  208.     the information.
  209.  
  210.  
  211.  
  212.     TOUCH Drive:\path\file.ext (Registered)
  213.  
  214.          TOUCH is an internal command that 'Touches'  a files Date /  Time
  215.     stamp  in  a disk directory.   TOUCH must be prefaced with a  day/date
  216.     specifier.   The filename MUST be complete,  including drive and path.
  217.     This  function  may  be used to reset bulletin  files  and  'ONCEONLY'
  218.     screens so that users see them once a day/week/month.   TOUCH sets the
  219.     file  date and time stamp of the indicated file to the current  system
  220.     clock values with the seconds rounded off to zero.
  221.  
  222.     NOTE: TOUCH does NOT support WildCard file specifications.
  223.  
  224.  
  225.     COMMAND PARAMETERS:
  226.  
  227.          Each  command intended for execution by RAMAINT must be  prefaced
  228.     by a day/date specifier.   This parameter tells RAMAINT whether or not
  229.     to process this command on this particular run.
  230.  
  231.  
  232.     XX (Day of the month)
  233.  
  234.          If  the  command line begins with the day of the month (01 -  31)
  235.     and  the  system  clock indicates that date then the command  will  be
  236.     processed.   The  day of the month MUST be entered as a 2 digit  value
  237.     with a leading zero (not a letter 'o') for values less than 10.
  238.  
  239.  
  240.     Sun (Day of the week)
  241.  
  242.          A  3 letter string indicating the day of the week will cause  the
  243.     command to be processed ONLY on that day. The day MUST be the standard
  244.     three letter day indicator,  (i.e.;  SUN MON TUE WED THU FRI SAT)  and
  245.     may be any combination of upper and lower case.
  246.  
  247.  
  248.     00 or Daily
  249.  
  250.          If  the command line begins with either of the above strings then
  251.     the  command  will  be  processed each time the  utility  runs.   This
  252.     parameter will match ANY day or date.
  253.  
  254.  
  255.  
  256.     TEST
  257.  
  258.          Since you may not wish to wait till system event time to see if a
  259.     particular  command  will run with RAMAINT,  the TEST  parameter  will
  260.     cause RAMAINT to run NOW with the command that follows. If it operates
  261.     in TEST mode you can rest easy that it will run in the event.
  262.  
  263.          You  may  only  run ONE test at a time.  The log  files  are  not
  264.     updated  for the TEST run and internal commands (registered  features)
  265.     may be run in TEST mode.
  266.  
  267.          TEST  allows you to check that sufficient space is available  for
  268.     proper  operation  and  that the command line parameters  are  exactly
  269.     correct  for  what  you intended to do.  When the  TEST  is  complete,
  270.     replace  the  TEST with the parameter that will run the function  when
  271.     you wish.
  272.  
  273.  
  274.  
  275.     COMMAND MODIFIERS:
  276.  
  277.     DOS
  278.  
  279.          All  calls to DOS functions MUST be prefaced with the DOS command
  280.     modifier.  This tells RAMAINT to present the line to DOS exactly as it
  281.     is written. This command may be used for such DOS commands as 'del' so
  282.     that  certain files may be deleted on certain days. (Like those seldom
  283.     viewed LOG files from all those OTHER RA utils!)
  284.  
  285.          Remember, DOS calls that require user input should NOT be used as
  286.     this will cause the system to stall waiting for keyboard entry.  It is
  287.     always  best  to run DOS calls in the TEST mode before  assuming  they
  288.     will operate as intended in the system event.
  289.  
  290.  
  291.     SYS
  292.  
  293.          Some executable programs (.COM & .EXE)  require a new instance of
  294.     DOS  to  operate  properly  because  of spawns  they  make  in  normal
  295.     operation.    These  programs  will error out when run  straight  from
  296.     RAMAINT.    For  these  programs,  which you will find with  the  TEST
  297.     option,  use the modifier SYS.   This will allow almost ANY program to
  298.     run  normally  from  the RAMAINT environment but will  NOT  return  an
  299.     errorlevel.
  300.  
  301.  
  302.     HOW IT WORKS:
  303.  
  304.          RAMAINT   has  no  restrictions  on  the  number  or  length   of
  305.     configuration  files.    If  called without a command  line  parameter
  306.     RAMAINT  looks  for  the file RAMAINT.CFG in the  directory  where  it
  307.     lives.    If  no command line parameters are offered  and  RAMAINT.CFG
  308.     cannot be located it will create a RAMAINT.ERR file and error out.
  309.  
  310.          To call RAMAINT using another configuration file simply place the
  311.     path and filename on the command line: RAMAINT C:\RA\LEVEL35.CFG
  312.  
  313.          RAMAINT  reads  the  entire configuration file once  looking  for
  314.     paths to log files,  setting flags for ONCE,  BOOT, IF blocks and TEST
  315.     calls.  RAMAINT then resets itself to the top of the file and reads in
  316.     the  first valid command.   This command is processed and the next one
  317.     is read.   Invalid commands (those not matching the day/date specifier
  318.     or TEST param) are ignored.
  319.  
  320.          When  RAMAINT  runs,   it  switches  drives  and  directories  as
  321.     necessary  to make the drive/directory of the called program the  home
  322.     drive/directory.    This allows programs having config and data  files
  323.     living  in  the same directory with them to operate as though you  had
  324.     explicitly changed drives and directories before running them.
  325.  
  326.          RAMAINT  ALWAYS returns to the drive and directory where it lives
  327.     before making the next call or exiting.
  328.  
  329.          When RAMAINT begins,  it clears the screen and identifies itself.
  330.     It does the same when the command has been processed and it is looking
  331.     for the next one.   When run in the TEST mode,  RAMAINT will NOT clear
  332.     the  screen when it exits.   This allows you to see the screen of  the
  333.     program  under  test.    If  the program has failed  you  can  usually
  334.     determine why by checking the information provided there.
  335.  
  336.          TEST  mode  will allow only one TEST per run.   If there is  more
  337.     than one TEST statement in the configuration file, only the first will
  338.     be processed.
  339.  
  340.          The  ONCE parameter is enforced by the file RAMAINT.DAT.   Should
  341.     it become necessary to run RAMAINT a second time (use care!)   you may
  342.     either  use  the ';'  character to comment out the ONCE param  in  the
  343.     configuration file or delete the RAMAINT.DAT file.
  344.  
  345.  
  346.     SETTING UP:
  347.  
  348.          I  have  included  all  the files from my  RA  system  (run  from
  349.     RUNFD.BAT  & EXEBBS.BAT)  as examples of how to implement RAMAINT.   I
  350.     have  also  included my "REAL"  configuration files and a  sample  log
  351.     which resulted from running these configs.
  352.  
  353.          When  setting up for the first time I suggest that you start with
  354.     a "clean" .cfg file (just the SERIAL, LOG & ONCE statements) and build
  355.     a config file by using the TEST parameter on a line by line basis.
  356.  
  357.          Once  the  target  program runs as expected,   replace  the  TEST
  358.     keyword  with  a day/date specifier and go on to the next line.   This
  359.     proceedure may sound time consuming and tedious but is actually pretty
  360.     easy and once you have done a few lines, it becomes downright simple.
  361.  
  362.          I  suggest  that you REM out the calls now being made in your  RA
  363.     batch  file one at a time and place the calls in the configuration one
  364.     at a time.  Be sure to add the call to RAMAINT in your .BAT file so it
  365.     will  be called in place of the programs you have replaced.   Once the
  366.     program  calls  have been proven to work properly in RAMAINT  you  can
  367.     delete the REM'd out statements in the RA.BAT.
  368.  
  369.          Some  of the .BAT files you are now using can be called  directly
  370.     from  RAMAINT  but some you may want to simplify by making  the  calls
  371.     directly  from RAMAINT and do away with the .BAT's entirely.   RAMAINT
  372.     runs  faster than .BAT files and also logs the errorlevel returned  by
  373.     .COM and .EXE files.
  374.  
  375.  
  376.  
  377.  
  378.  
  379.  
  380.  
  381.     SAMPLE RAMAINT.CFG:
  382.  
  383.     SERIAL 0000000000
  384.     ;
  385.     ;This is a comment line .... it may be ignored...
  386.     ;
  387.     ;This is the path/file for the log
  388.     ;LOG c:\ra\callers.log
  389.     ;
  390.     ;Use the following IN PLACE OF the above to prevent utilities
  391.     ;called by RAMAINT from writing to the log file. Only the report
  392.     ;generated by RAMAINT will be placed in the log.
  393.     ;If you use this option, split the log to ystdy.log and oldlog.log
  394.     ;in the batch file BEFORE calling RAMAINT... the named log does NOT
  395.     ;exist while RAMAINT is running!
  396.     CLEANLOG c:\ra\callers.log
  397.     ;
  398.     ;Tell RAMAINT to run only one time in a system clock day
  399.     ;in case it is called accidentally.
  400.     ONCE
  401.     ;
  402.     ;
  403.     ;Backup users files everyday.
  404.     ;The DOS keyword is necessary to run dos commands from RAMAINT
  405.     00 DOS copy c:\ra\msgbase\users.bbs d:\backup
  406.     00 DOS copy c:\ra\msgbase\usersidx.bbs d:\backup
  407.     00 DOS copy c:\ra\msgbase\usersxi.bbs d:\backup
  408.     ;
  409.     ;First day of the month - delete giant log to save disk-space
  410.     ;and timelog.bbs so time graph is current in RA
  411.     01 DOS del c:\ra\oldlog.log
  412.     01 DOS del c:\ra\timelog.bbs
  413.     ;
  414.     ;All spawned programs MUST include complete paths/filename and EXT!!
  415.     ;If it does not include an EXT it won't run!!
  416.     ;
  417.     ;Stuff we want to test to see if it works properly in the RAMAINT
  418.     ;environment.... TEST replaces the date/day specifier.
  419.     ;TEST c:\ra\test.bat /param1 /y /foobfile
  420.     ;
  421.     ;The TEST mode allows you to run RAMAINT without executing programs
  422.     ;other than the test program. This allows you to tweak command lines
  423.     ;to be sure it will function when it runs by itself in the middle of
  424.     ;the night. The ONCE param is ignored. You may TEST as much as you
  425.     ;wish. In test mode, log writes are NOT performed... keep it clean.
  426.     ;A log file called RAMAINT.TMP is generated as is RAMAINT.ERR in the
  427.     ;event of an error.
  428.     ;
  429.     ;We do the nodediff file on Sunday nite as it can come in Sat or Sun.
  430.     MON c:\ra\nodefix.bat
  431.     ;
  432.     ;Sunday we do game maintenance
  433.     SUN c:\ra\bandit\tbmaint.exe
  434.     SUN c:\ra\bj\bj.exe maint
  435.     SUN c:\ra\timebank\igame10.exe /P
  436.     ;
  437.     ;Stuff we have to do everyday - will be processed in the order
  438.     ;they are listed. You may use 00 as the date or keyword DAILY.
  439.     ;Either will execute everyday.
  440.     00 c:\ra\arrlbull.bat
  441.     ;
  442.     00 sys c:\ra\fmail\ftools.exe maint /d /n /p
  443.     ;Note the use of the SYS modifier in the call to FTOOLS.
  444.     ;Without it FTOOLS.EXE cannot locate its config file.
  445.     ;
  446.     00 c:\ra\rafile.exe import
  447.     00 c:\ra\rafile.exe update *.*
  448.     00 c:\ra\rafile.exe clean /km
  449.     00 c:\ra\rafile.exe sort
  450.     00 c:\ra\rafile.exe export
  451.     00 c:\ra\rafile.exe filelist c:\local\280-19.lst /S20 /Bc:\ra\file.hdr
  452.     00 c:\ra\rafile.exe filelist c:\local\280-19.new /S20 /D30
  453.     00 c:\dos\ARJ.EXE m -e -f c:\local\hs-files.arj c:\local\280-19.lst
  454.     00 c:\dos\ARJ.EXE m -e -f c:\local\hs-new.arj c:\local\280-19.new
  455.     00 c:\ra\rafile.exe hs-*.arj 90 touchmod
  456.     00 c:\ra\rauser.exe -d7 -m10 -v
  457.     00 c:\ra\rauser.exe -d120 -m25 -v
  458.     00 c:\ra\rauser.exe -s
  459.     00 c:\ra\rabday.exe
  460.     ;
  461.     ;Stuff we do if a file exists on the 15th of the month
  462.     ;15 ifexist c:\ra\test.bat
  463.     ;c:\ra\test.bat
  464.     ;endif
  465.     ;
  466.     ;Stuff we do if a file does NOT exist on the 12th of the month
  467.     ;12 ifnotexist c:\ra\test.bat
  468.     ;c:\ra\util\makebat.exe /test /loop
  469.     ;endif
  470.     ;Any number of program calls can go between the if and the endif
  471.     ;no date is used on the program calls between the if and the endif
  472.     ;WILDCARDS will NOT work in the if statements. See TOUCH.
  473.     ;
  474.     ;
  475.     ;Do the onceonly.A?? files to make it look like the sysop cares
  476.     ;enough to actually do something on this board.
  477.     SAT DOS copy c:\ra\txtfiles\lastday.* c:\ra\txtfiles\onceonly.*
  478.     ;NOTE : Dos can handle the wildcard correctly
  479.     ;Touch is an internal command and must have an explicit filename.
  480.     ;Sorry, but to make this thing small enough to let ANYTHING run
  481.     ;it was necessary to make some trade-offs.
  482.     SAT TOUCH c:\ra\txtfiles\onceonly.ans
  483.     SAT TOUCH c:\ra\txtfiles\onceonly.asc
  484.     SUN DOS copy c:\ra\txtfiles\newtourn.* c:\ra\txtfiles\onceonly.*
  485.     SUN TOUCH c:\ra\txtfiles\onceonly.ans
  486.     SUN TOUCH c:\ra\txtfiles\onceonly.asc
  487.     MON DOS copy c:\ra\txtfiles\oncetext.* c:\ra\txtfiles\onceonly.*
  488.     MON TOUCH c:\ra\txtfiles\onceonly.ans
  489.     MON TOUCH c:\ra\txtfiles\onceonly.asc
  490.     ;
  491.     ;Touch sets the specified file date and time to current system values.
  492.     ;
  493.     ;Boot the computer when all has been done. This keyword may appear
  494.     ;anywhere in the file and will operate only after all else is done.
  495.     ;If you screw up and leave a disk in drive A: that would cause the
  496.     ;boot to fail this operation will be ignored.
  497.     ;00 BOOT
  498.  
  499.          Please   address  any  comments,   questions,   suggestions   and
  500.     criticisms to the author via FIDONET direct NETMAIL.
  501.  
  502.          The latest version of RAMAINT.EXE may be freq'd from The HamShack
  503.     BBS,  Fidonet  1:280/19  or  The Sounding Board BBS, Fidonet  1:280/32
  504.     (MAGIC NAME:  RAMAINT)  or you  may  log  on  to  the  HamShack BBS at
  505.     (816) 796-6695 and download it from the opening screen.
  506.  
  507.     Dave Perry
  508.     The HamShack BBS
  509.     1:280/19
  510.     (816)796-6695
  511.  
  512.  
  513.     The author wishes to thank Brian Pirie for allowing the usage of his
  514.     REGISTRATION KEY SYSTEM FOR PROGRAMMERS - Version 2.20.
  515.     (C) Copyright 1992, Brian Pirie. All rights reserved.
  516.  
  517.