home *** CD-ROM | disk | FTP | other *** search
/ Chip 2001 May / W2KPRK.iso / ras.cab / listos.vbs < prev    next >
Text File  |  1999-11-04  |  23KB  |  658 lines

  1. '********************************************************************
  2. '*
  3. '* File:           ListOs.Vbs
  4. '* Created:        March 1999
  5. '* Version:        1.0
  6. '*
  7. '*  Main Function:  Lists properties of the operating system on a machine.
  8. '*
  9. '*  ListOs.vbs      [/S <server>] [/U <username>] [/W <password>] 
  10. '*                  [/O <outputfile>]
  11. '*
  12. '* Copyright (C) 1999 Microsoft Corporation
  13. '*
  14. '********************************************************************
  15.  
  16. OPTION EXPLICIT
  17.  
  18.     'Define constants
  19.     CONST CONST_ERROR                   = 0
  20.     CONST CONST_WSCRIPT                 = 1
  21.     CONST CONST_CSCRIPT                 = 2
  22.     CONST CONST_SHOW_USAGE              = 3
  23.     CONST CONST_PROCEED                 = 4
  24.  
  25.     'Declare variables
  26.     Dim intOpMode, i
  27.     Dim strServer, strUserName, strPassword, strOutputFile
  28.  
  29.     'Make sure the host is csript, if not then abort
  30.     VerifyHostIsCscript()
  31.  
  32.     'Parse the command line
  33.     intOpMode = intParseCmdLine(strServer     ,  _
  34.                                 strUserName   ,  _
  35.                                 strPassword   ,  _
  36.                                 strOutputFile    )
  37.  
  38.  
  39.     Select Case intOpMode
  40.  
  41.         Case CONST_SHOW_USAGE
  42.             Call ShowUsage()
  43.  
  44.         Case CONST_PROCEED                 
  45.             Call ListOs(strServer     , _
  46.                         strOutputFile , _
  47.                         strUserName   , _
  48.                         strPassword     )
  49.  
  50.         Case CONST_ERROR
  51.             'Do Nothing
  52.  
  53.         Case Else                    'Default -- should never happen
  54.             Call Wscript.Echo("Error occurred in passing parameters.")
  55.  
  56.     End Select
  57.  
  58. '********************************************************************
  59. '* End of Script
  60. '********************************************************************
  61.  
  62. '********************************************************************
  63. '*
  64. '* Sub ListOS()
  65. '*
  66. '* Purpose: Lists properties of the operating system on a machine.
  67. '*
  68. '* Input:   strServer           a machine name
  69. '*          strOutputFile       an output file name
  70. '*          strUserName         the current user's name
  71. '*          strPassword         the current user's password
  72. '*
  73. '* Output:  Results are either printed on screen or saved in strOutputFile.
  74. '*
  75. '********************************************************************
  76. Private Sub ListOS(strServer, strOutputFile, strUserName, strPassword)
  77.  
  78.  
  79.  
  80.     ON ERROR RESUME NEXT
  81.  
  82.     Dim objFileSystem, objOutputFile, objService, objOSSet, objOS
  83.     Dim strWBEMClass
  84.  
  85.     strWBEMClass = "Win32_OperatingSystem"
  86.  
  87.     'Open a text file for output if the file is requested
  88.     If Not IsEmpty(strOutputFile) Then
  89.         If (NOT blnOpenFile(strOutputFile, objOutputFile)) Then
  90.             Call Wscript.Echo ("Could not open an output file.")
  91.             Exit Sub
  92.         End If
  93.     End If
  94.  
  95.     'Establish a connection with the server.
  96.     If blnConnect("root\cimv2" , _
  97.                    strUserName , _
  98.                    strPassword , _
  99.                    strServer   , _
  100.                    objService  ) Then
  101.         Call Wscript.Echo("")
  102.         Call Wscript.Echo("Please check the server name, " _
  103.                         & "credentials and WBEM Core.")
  104.         Exit Sub
  105.     End If
  106.  
  107.     'Get the set
  108.     Set objOSSet = objService.InstancesOf(strWBEMClass)
  109.     If blnErrorOccurred("Could not obtain " & strWBEMClass & " instance.") Then
  110.         Exit Sub
  111.     End If
  112.  
  113.     If objOSSet.Count = 0 Then
  114.         Call WriteLine("No Operating System information is available.", _
  115.                         objOutputFile)    
  116.         Exit Sub
  117.     End If
  118.  
  119.     Call WriteLine("Operating System information for Machine " & _
  120.                     strServer, objOutputFile)
  121.     Call WriteLine("", objOutputFile)
  122.  
  123.     For Each objOS In objOSSet
  124.         Call WriteLine("Name            = " & objOS.Caption, objOutputFile)
  125.         Call WriteLine("Version         = " & objOS.Version , objOutputFile)
  126.         Call WriteLine("Computer Name   = " & objOS.CSName, objOutputFile)
  127.         Call WriteLine("Registered User = " & objOS.RegisteredUser, _
  128.                         objOutputFile)
  129.         Call WriteLine("Manufacturer    = " & objOS.Manufacturer, _
  130.                         objOutputFile)
  131.         Call WriteLine("Install Date    = " & _
  132.                         strFormatMOFTime(objOS.InstallDate)  , objOutputFile)
  133.         Call WriteLine("Last Bootup     = " & _
  134.                         strFormatMOFTime(objOS.LastBootUpTime) , objOutputFile)
  135.         Call WriteLine("", objOutputFile)
  136.     Next
  137.  
  138.     If IsObject(objOutputFile) Then
  139.         objOutputFile.Close
  140.         Call Wscript.Echo ("Results are saved in file " & strOutputFile & ".")
  141.     End If
  142. End Sub
  143.  
  144. '********************************************************************
  145. '*
  146. '* Function intParseCmdLine()
  147. '*
  148. '* Purpose: Parses the command line.
  149. '* Input:   
  150. '*
  151. '* Output:  strServer         a remote server ("" = local server")
  152. '*          strUserName       the current user's name
  153. '*          strPassword       the current user's password
  154. '*          strOutputFile     an output file name
  155. '*
  156. '********************************************************************
  157. Private Function intParseCmdLine( ByRef strServer,        _
  158.                                   ByRef strUserName,      _
  159.                                   ByRef strPassword,      _
  160.                                   ByRef strOutputFile     )
  161.  
  162.  
  163.     ON ERROR RESUME NEXT
  164.  
  165.     Dim strFlag
  166.     Dim intState, intArgIter
  167.     Dim objFileSystem
  168.  
  169.     If Wscript.Arguments.Count > 0 Then
  170.         strFlag = Wscript.arguments.Item(0)
  171.     End If
  172.  
  173.     If IsEmpty(strFlag) Then                'No arguments have been received
  174.         intParseCmdLine = CONST_PROCEED
  175.         Exit Function
  176.     End If
  177.  
  178.     'Check if the user is asking for help or is just confused
  179.     If (strFlag="help") OR (strFlag="/h") OR (strFlag="\h") OR (strFlag="-h") _
  180.         OR (strFlag = "\?") OR (strFlag = "/?") OR (strFlag = "?") _ 
  181.         OR (strFlag="h") Then
  182.         intParseCmdLine = CONST_SHOW_USAGE
  183.         Exit Function
  184.     End If
  185.  
  186.     'Retrieve the command line and set appropriate variables
  187.      intArgIter = 0
  188.     Do While intArgIter <= Wscript.arguments.Count - 1
  189.         Select Case Left(LCase(Wscript.arguments.Item(intArgIter)),2)
  190.   
  191.             Case "/s"
  192.                 If Not blnGetArg("Server", strServer, intArgIter) Then
  193.                     intParseCmdLine = CONST_ERROR
  194.                     Exit Function
  195.                 End If
  196.                 intArgIter = intArgIter + 1
  197.  
  198.             Case "/o"
  199.                 If Not blnGetArg("Output File", strOutputFile, intArgIter) Then
  200.                     intParseCmdLine = CONST_ERROR
  201.                     Exit Function
  202.                 End If
  203.                 intArgIter = intArgIter + 1
  204.  
  205.             Case "/u"
  206.                 If Not blnGetArg("User Name", strUserName, intArgIter) Then
  207.                     intParseCmdLine = CONST_ERROR
  208.                     Exit Function
  209.                 End If
  210.                 intArgIter = intArgIter + 1
  211.  
  212.             Case "/w"
  213.                 If Not blnGetArg("User Password", strPassword, intArgIter) Then
  214.                     intParseCmdLine = CONST_ERROR
  215.                     Exit Function
  216.                 End If
  217.                 intArgIter = intArgIter + 1
  218.  
  219.             Case Else 'We shouldn't get here
  220.                 Call Wscript.Echo("Invalid or misplaced parameter: " _
  221.                    & Wscript.arguments.Item(intArgIter) & vbCRLF _
  222.                    & "Please check the input and try again," & vbCRLF _
  223.                    & "or invoke with '/?' for help with the syntax.")
  224.                 Wscript.Quit
  225.  
  226.         End Select
  227.  
  228.     Loop '** intArgIter <= Wscript.arguments.Count - 1
  229.  
  230.     If IsEmpty(intParseCmdLine) Then _
  231.         intParseCmdLine = CONST_PROCEED
  232.  
  233. End Function
  234.  
  235. '********************************************************************
  236. '*
  237. '* Sub ShowUsage()
  238. '*
  239. '* Purpose: Shows the correct usage to the user.
  240. '*
  241. '* Input:   None
  242. '*
  243. '* Output:  Help messages are displayed on screen.
  244. '*
  245. '********************************************************************
  246. Private Sub ShowUsage()
  247.  
  248.     Wscript.Echo ""
  249.     Wscript.Echo "Lists properties of the operating system on a machine."
  250.     Wscript.Echo ""
  251.     Wscript.Echo "SYNTAX:"
  252.     Wscript.Echo "  ListOs.vbs [/S <server>] [/U <username>] [/W <password>]"
  253.     Wscript.Echo "             [/O <outputfile>]"
  254.     Wscript.Echo ""
  255.     Wscript.Echo "PARAMETER SPECIFIERS:"
  256.     Wscript.Echo "   server        A machine name."
  257.     Wscript.Echo "   username      The current user's name."
  258.     Wscript.Echo "   password      Password of the current user."
  259.     Wscript.Echo "   outputfile    The output file name."
  260.     Wscript.Echo ""
  261.     Wscript.Echo "EXAMPLE:"
  262.     Wscript.Echo "1. cscript ListOs.vbs"
  263.     Wscript.Echo "   List operating system information for the current machine."
  264.     Wscript.Echo "2. cscript ListOs.vbs /S MyMachine2"
  265.     Wscript.Echo "   List operating system information for the machine MyMachine2."
  266.  
  267. End Sub
  268.  
  269. '********************************************************************
  270. '* General Routines
  271. '********************************************************************
  272.  
  273. '********************************************************************
  274. '*
  275. '* Function strFormatMOFTime(strDate)
  276. '*
  277. '* Purpose: Formats the date in WBEM to a readable Date
  278. '*
  279. '* Input:   blnB    A WBEM Date
  280. '*
  281. '* Output:  a string 
  282. '*
  283. '********************************************************************
  284.  
  285. Private Function strFormatMOFTime(strDate)
  286.     Dim str
  287.     str = Mid(strDate,1,4) & "-" _
  288.            & Mid(strDate,5,2) & "-" _
  289.            & Mid(strDate,7,2) & ", " _
  290.            & Mid(strDate,9,2) & ":" _
  291.            & Mid(strDate,11,2) & ":" _
  292.            & Mid(strDate,13,2)
  293.     strFormatMOFTime = str
  294. End Function
  295.  
  296. '********************************************************************
  297. '*
  298. '* Function strPackString()
  299. '*
  300. '* Purpose: Attaches spaces to a string to increase the length to intWidth.
  301. '*
  302. '* Input:   strString   a string
  303. '*          intWidth    the intended length of the string
  304. '*          blnAfter    Should spaces be added after the string?
  305. '*          blnTruncate specifies whether to truncate the string or not if
  306. '*                      the string length is longer than intWidth
  307. '*
  308. '* Output:  strPackString is returned as the packed string.
  309. '*
  310. '********************************************************************
  311. Private Function strPackString( ByVal strString, _
  312.                                 ByVal intWidth,  _
  313.                                 ByVal blnAfter,  _
  314.                                 ByVal blnTruncate)
  315.  
  316.     ON ERROR RESUME NEXT
  317.  
  318.     intWidth      = CInt(intWidth)
  319.     blnAfter      = CBool(blnAfter)
  320.     blnTruncate   = CBool(blnTruncate)
  321.  
  322.     If Err.Number Then
  323.         Call Wscript.Echo ("Argument type is incorrect!")
  324.         Err.Clear
  325.         Wscript.Quit
  326.     End If
  327.  
  328.     If IsNull(strString) Then
  329.         strPackString = "null" & Space(intWidth-4)
  330.         Exit Function
  331.     End If
  332.  
  333.     strString = CStr(strString)
  334.     If Err.Number Then
  335.         Call Wscript.Echo ("Argument type is incorrect!")
  336.         Err.Clear
  337.         Wscript.Quit
  338.     End If
  339.  
  340.     If intWidth > Len(strString) Then
  341.         If blnAfter Then
  342.             strPackString = strString & Space(intWidth-Len(strString))
  343.         Else
  344.             strPackString = Space(intWidth-Len(strString)) & strString & " "
  345.         End If
  346.     Else
  347.         If blnTruncate Then
  348.             strPackString = Left(strString, intWidth-1) & " "
  349.         Else
  350.             strPackString = strString & " "
  351.         End If
  352.     End If
  353.  
  354. End Function
  355.  
  356. '********************************************************************
  357. '* 
  358. '*  Function blnGetArg()
  359. '*
  360. '*  Purpose: Helper to intParseCmdLine()
  361. '* 
  362. '*  Usage:
  363. '*
  364. '*     Case "/s" 
  365. '*       blnGetArg ("server name", strServer, intArgIter)
  366. '*
  367. '********************************************************************
  368. Private Function blnGetArg ( ByVal StrVarName,   _
  369.                              ByRef strVar,       _
  370.                              ByRef intArgIter) 
  371.  
  372.     blnGetArg = False 'failure, changed to True upon successful completion
  373.  
  374.     If Len(Wscript.Arguments(intArgIter)) > 2 then
  375.         If Mid(Wscript.Arguments(intArgIter),3,1) = ":" then
  376.             If Len(Wscript.Arguments(intArgIter)) > 3 then
  377.                 strVar = Right(Wscript.Arguments(intArgIter), _
  378.                          Len(Wscript.Arguments(intArgIter)) - 3)
  379.                 blnGetArg = True
  380.                 Exit Function
  381.             Else
  382.                 intArgIter = intArgIter + 1
  383.                 If intArgIter > (Wscript.Arguments.Count - 1) Then
  384.                     Call Wscript.Echo( "Invalid " & StrVarName & ".")
  385.                     Call Wscript.Echo( "Please check the input and try again.")
  386.                     Exit Function
  387.                 End If
  388.  
  389.                 strVar = Wscript.Arguments.Item(intArgIter)
  390.                 If Err.Number Then
  391.                     Call Wscript.Echo( "Invalid " & StrVarName & ".")
  392.                     Call Wscript.Echo( "Please check the input and try again.")
  393.                     Exit Function
  394.                 End If
  395.  
  396.                 If InStr(strVar, "/") Then
  397.                     Call Wscript.Echo( "Invalid " & StrVarName)
  398.                     Call Wscript.Echo( "Please check the input and try again.")
  399.                     Exit Function
  400.                 End If
  401.  
  402.                 blnGetArg = True 'success
  403.             End If
  404.         Else
  405.             strVar = Right(Wscript.Arguments(intArgIter), _
  406.                      Len(Wscript.Arguments(intArgIter)) - 2)
  407.             blnGetArg = True 'success
  408.             Exit Function
  409.         End If
  410.     Else
  411.         intArgIter = intArgIter + 1
  412.         If intArgIter > (Wscript.Arguments.Count - 1) Then
  413.             Call Wscript.Echo( "Invalid " & StrVarName & ".")
  414.             Call Wscript.Echo( "Please check the input and try again.")
  415.             Exit Function
  416.         End If
  417.  
  418.         strVar = Wscript.Arguments.Item(intArgIter)
  419.         If Err.Number Then
  420.             Call Wscript.Echo( "Invalid " & StrVarName & ".")
  421.             Call Wscript.Echo( "Please check the input and try again.")
  422.             Exit Function
  423.         End If
  424.  
  425.         If InStr(strVar, "/") Then
  426.             Call Wscript.Echo( "Invalid " & StrVarName)
  427.             Call Wscript.Echo( "Please check the input and try again.")
  428.             Exit Function
  429.         End If
  430.         blnGetArg = True 'success
  431.     End If
  432. End Function
  433.  
  434. '********************************************************************
  435. '*
  436. '* Function blnConnect()
  437. '*
  438. '* Purpose: Connects to machine strServer.
  439. '*
  440. '* Input:   strServer       a machine name
  441. '*          strNameSpace    a namespace
  442. '*          strUserName     name of the current user
  443. '*          strPassword     password of the current user
  444. '*
  445. '* Output:  objService is returned  as a service object.
  446. '*          strServer is set to local host if left unspecified
  447. '*
  448. '********************************************************************
  449. Private Function blnConnect(ByVal strNameSpace, _
  450.                             ByVal strUserName,  _
  451.                             ByVal strPassword,  _
  452.                             ByRef strServer,    _
  453.                             ByRef objService)
  454.  
  455.     ON ERROR RESUME NEXT
  456.  
  457.     Dim objLocator, objWshNet
  458.  
  459.     blnConnect = False     'There is no error.
  460.  
  461.     'Create Locator object to connect to remote CIM object manager
  462.     Set objLocator = CreateObject("WbemScripting.SWbemLocator")
  463.     If Err.Number then
  464.         Call Wscript.Echo( "Error 0x" & CStr(Hex(Err.Number)) & _
  465.                            " occurred in creating a locator object." )
  466.         If Err.Description <> "" Then
  467.             Call Wscript.Echo( "Error description: " & Err.Description & "." )
  468.         End If
  469.         Err.Clear
  470.         blnConnect = True     'An error occurred
  471.         Exit Function
  472.     End If
  473.  
  474.     'Connect to the namespace which is either local or remote
  475.     Set objService = objLocator.ConnectServer (strServer, strNameSpace, _
  476.        strUserName, strPassword)
  477.     ObjService.Security_.impersonationlevel = 3
  478.     If Err.Number then
  479.         Call Wscript.Echo( "Error 0x" & CStr(Hex(Err.Number)) & _
  480.                            " occurred in connecting to server " _
  481.            & strServer & ".")
  482.         If Err.Description <> "" Then
  483.             Call Wscript.Echo( "Error description: " & Err.Description & "." )
  484.         End If
  485.         Err.Clear
  486.         blnConnect = True     'An error occurred
  487.     End If
  488.  
  489.     'Get the current server's name if left unspecified
  490.     If IsEmpty(strServer) Then
  491.         Set objWshNet = CreateObject("Wscript.Network")
  492.     strServer     = objWshNet.ComputerName
  493.     End If
  494.  
  495. End Function
  496.  
  497. '********************************************************************
  498. '*
  499. '* Sub      VerifyHostIsCscript()
  500. '*
  501. '* Purpose: Determines which program is used to run this script.
  502. '*
  503. '* Input:   None
  504. '*
  505. '* Output:  If host is not cscript, then an error message is printed 
  506. '*          and the script is aborted.
  507. '*
  508. '********************************************************************
  509. Sub VerifyHostIsCscript()
  510.  
  511.     ON ERROR RESUME NEXT
  512.  
  513.     Dim strFullName, strCommand, i, j, intStatus
  514.  
  515.     strFullName = WScript.FullName
  516.  
  517.     If Err.Number then
  518.         Call Wscript.Echo( "Error 0x" & CStr(Hex(Err.Number)) & " occurred." )
  519.         If Err.Description <> "" Then
  520.             Call Wscript.Echo( "Error description: " & Err.Description & "." )
  521.         End If
  522.         intStatus =  CONST_ERROR
  523.     End If
  524.  
  525.     i = InStr(1, strFullName, ".exe", 1)
  526.     If i = 0 Then
  527.         intStatus =  CONST_ERROR
  528.     Else
  529.         j = InStrRev(strFullName, "\", i, 1)
  530.         If j = 0 Then
  531.             intStatus =  CONST_ERROR
  532.         Else
  533.             strCommand = Mid(strFullName, j+1, i-j-1)
  534.             Select Case LCase(strCommand)
  535.                 Case "cscript"
  536.                     intStatus = CONST_CSCRIPT
  537.                 Case "wscript"
  538.                     intStatus = CONST_WSCRIPT
  539.                 Case Else       'should never happen
  540.                     Call Wscript.Echo( "An unexpected program was used to " _
  541.                                        & "run this script." )
  542.                     Call Wscript.Echo( "Only CScript.Exe or WScript.Exe can " _
  543.                                        & "be used to run this script." )
  544.                     intStatus = CONST_ERROR
  545.                 End Select
  546.         End If
  547.     End If
  548.  
  549.     If intStatus <> CONST_CSCRIPT Then
  550.         Call WScript.Echo( "Please run this script using CScript." & vbCRLF & _
  551.              "This can be achieved by" & vbCRLF & _
  552.              "1. Using ""CScript ListOs.vbs arguments"" for Windows 95/98 or" _
  553.              & vbCRLF & "2. Changing the default Windows Scripting Host " _
  554.              & "setting to CScript" & vbCRLF & "    using ""CScript " _
  555.              & "//H:CScript //S"" and running the script using" & vbCRLF & _
  556.              "    ""ListOs.vbs arguments"" for Windows NT/2000." )
  557.         WScript.Quit
  558.     End If
  559.  
  560. End Sub
  561.  
  562. '********************************************************************
  563. '*
  564. '* Sub WriteLine()
  565. '* Purpose: Writes a text line either to a file or on screen.
  566. '* Input:   strMessage  the string to print
  567. '*          objFile     an output file object
  568. '* Output:  strMessage is either displayed on screen or written to a file.
  569. '*
  570. '********************************************************************
  571. Sub WriteLine(ByVal strMessage, ByVal objFile)
  572.  
  573.     On Error Resume Next
  574.     If IsObject(objFile) then        'objFile should be a file object
  575.         objFile.WriteLine strMessage
  576.     Else
  577.         Call Wscript.Echo( strMessage )
  578.     End If
  579.  
  580. End Sub
  581.  
  582. '********************************************************************
  583. '* 
  584. '* Function blnErrorOccurred()
  585. '*
  586. '* Purpose: Reports error with a string saying what the error occurred in.
  587. '*
  588. '* Input:   strIn        string saying what the error occurred in.
  589. '*
  590. '* Output:  displayed on screen 
  591. '* 
  592. '********************************************************************
  593. Private Function blnErrorOccurred (ByVal strIn)
  594.  
  595.     If Err.Number Then
  596.         Call Wscript.Echo( "Error 0x" & CStr(Hex(Err.Number)) & ": " & strIn)
  597.         If Err.Description <> "" Then
  598.             Call Wscript.Echo( "Error description: " & Err.Description)
  599.         End If
  600.         Err.Clear
  601.         blnErrorOccurred = True
  602.     Else
  603.         blnErrorOccurred = False
  604.     End If
  605.  
  606. End Function
  607.  
  608. '********************************************************************
  609. '* 
  610. '* Function blnOpenFile
  611. '*
  612. '* Purpose: Opens a file.
  613. '*
  614. '* Input:   strFileName        A string with the name of the file.
  615. '*
  616. '* Output:  Sets objOpenFile to a FileSystemObject and setis it to 
  617. '*            Nothing upon Failure.
  618. '* 
  619. '********************************************************************
  620. Private Function blnOpenFile(ByVal strFileName, ByRef objOpenFile)
  621.  
  622.     ON ERROR RESUME NEXT
  623.  
  624.     Dim objFileSystem
  625.  
  626.     Set objFileSystem = Nothing
  627.  
  628.     If IsEmpty(strFileName) OR strFileName = "" Then
  629.         blnOpenFile = False
  630.         Set objOpenFile = Nothing
  631.         Exit Function
  632.     End If
  633.  
  634.     'Create a file object
  635.     Set objFileSystem = CreateObject("Scripting.FileSystemObject")
  636.     If blnErrorOccurred("Could not create filesystem object.") Then
  637.         blnOpenFile = False
  638.         Set objOpenFile = Nothing
  639.         Exit Function
  640.     End If
  641.  
  642.     'Open the file for output
  643.     Set objOpenFile = objFileSystem.OpenTextFile(strFileName, 8, True)
  644.     If blnErrorOccurred("Could not open") Then
  645.         blnOpenFile = False
  646.         Set objOpenFile = Nothing
  647.         Exit Function
  648.     End If
  649.     blnOpenFile = True
  650.  
  651. End Function
  652.  
  653. '********************************************************************
  654. '*                                                                  *
  655. '*                           End of File                            *
  656. '*                                                                  *
  657. '********************************************************************
  658.