home *** CD-ROM | disk | FTP | other *** search
/ DOS/V Power Report 1997 July / VPR9707B.ISO / DRIVER / EPSON / PRO351 / OEMSETUP.INF < prev    next >
INI File  |  1997-03-09  |  20KB  |  577 lines

  1. ;-----------------------------------------------------------------------
  2. ; OPTION TYPE
  3. ; -----------
  4. ; This identifies the Option type we are dealing with.  The different
  5. ; possible types are:
  6. ;
  7. ; COMPUTER, VIDEO, MOUSE, KEYBOARD, LAYOUT, SCSI, PRINTER, ...
  8. ;-----------------------------------------------------------------------
  9.  
  10. [Identification]
  11.     OptionType = VIDEO
  12.  
  13. ;-----------------------------------------------------------------------
  14. ; LANGUAGES SUPPORTED
  15. ; -------------------
  16. ;
  17. ; The languages supported by the OEM INF, For every language supported
  18. ; we need to have a separate text section for every displayable text
  19. ; section.
  20. ;
  21. ;-----------------------------------------------------------------------
  22.  
  23. [LanguagesSupported]
  24.     ENG
  25.  
  26. ;-----------------------------------------------------------------------
  27. ; OPTION LIST
  28. ; -----------
  29. ; This section lists the OEM Option key names.  These keys are locale
  30. ; independent and used to represent the option in a locale independent
  31. ; manner.
  32. ;
  33. ;-----------------------------------------------------------------------
  34.  
  35. ;
  36. ; Option list order: Option = Miniport driver, BitsPerPel, XResolution, YResolution, VRefresh, Interlaced
  37. ;
  38. ; If you don't want to create a VRefresh or Interlaced value under the service
  39. ; parameters then use the value ""
  40. ;
  41.  
  42. [Options]
  43.     "ATI Graphics Accelerators"    = ati, 8,  640,  480   , "" , ""
  44.  
  45. ;
  46. ; This maps detected options into the options we support
  47. ;
  48. ; Format: DetectedOption = MappedOption
  49. ;
  50.  
  51. [MapOfOptions]
  52.     "VGA"                       = "VGA"
  53.     "COMPAQ AVGA"               = "VGA"
  54.     "COMPAQ AGB"                = "VGA"
  55.     "8514 MONITOR UNKNOWN"      = "VGA"
  56.     "8514 VGA MONITOR"          = "VGA"
  57.     "8514 8503 MONO"            = "VGA"
  58.     "8514 8514 GAD"             = "VGA"
  59.     "GENOA VGA"                 = "VGA"
  60.     "VIDEO7 VGA DRAM"           = "VIDEO7 VGA VRAM 640x480x4"
  61.     "VIDEO7 VGA VRAM"           = "VIDEO7 VGA VRAM 640x480x4"
  62.     "TRIDENT VGA"               = "VGA"
  63.     "TRIDENT VGA 9100"          = "VGA"
  64.     "PARADISE VGA"              = "VGA"
  65.     "PARADISE VGA PROM"         = "VGA"
  66.     "PARADISE VGA CHIP 1F"      = "VGA"
  67.     "ATI VGA"                   = "VGA"
  68.     "ATI VGA WONDER"            = "VGA"
  69.     "TSENGLAB VGA ET3000"       = "VGA"
  70.     "TSENGLAB VGA ET4000"       = "TSENGLAB VGA ET4000 640x480x4x60"
  71.     "CIRRUS VGA"                = "VGA"
  72.     "CIRRUS VGA 610-620 REVC"   = "VGA"
  73.     "XGA"                       = "XGA 640x480x8"
  74.     "DELL DGX"                  = "DELL DGX 640x480x8"
  75.     "S3 VGA"                    = "S3 VGA 640x480x8"
  76.     "PRODESIGNER II"            = "TSENGLAB VGA ET4000 640x480x4x60"
  77.  
  78.  
  79. ;
  80. ; Order of the information:
  81. ;
  82. ; Port driver = Type, Group, ErrorControl, Tag, InstalledDisplay, VgaCompatible( 0/1 ), EventMessageFile, TypesSupported
  83. ;
  84.  
  85. [MiniportDrivers]
  86.     ati   = !SERVICE_KERNEL_DRIVER, Video, !SERVICE_ERROR_NORMAL, 11,  {ati, 8514a}, 0, "%SystemRoot%\System32\IoLogMsg.dll;%SystemRoot%\System32\drivers\ati.sys" , 7, {ati.dll, ssdpms.scr, ssdpms.hlp}
  87.  
  88.  
  89. ;-----------------------------------------------------------------------
  90. ; OPTION TEXT SECTION
  91. ; -------------------
  92. ; These are text strings used to identify the option to the user.  There
  93. ; are separate sections for each language supported.  The format of the
  94. ; section name is "OptionsText" concatenated with the Language represented
  95. ; by the section.
  96. ;
  97. ;-----------------------------------------------------------------------
  98.  
  99. [OptionsTextENG]
  100.     "ATI Graphics Accelerators"   = "ATI Graphics Accelerators"
  101.  
  102. ;---------------------------------------------------------------------------
  103. ; 1. Identify
  104. ;
  105. ; DESCRIPTION:   To verify that this INF deals with the same type of options
  106. ;                as we are choosing currently.
  107. ;
  108. ; INPUT:         None
  109. ;
  110. ; OUTPUT:        $($R0): STATUS: STATUS_SUCCESSFUL
  111. ;                $($R1): Option Type (COMPUTER ...)
  112. ;                $($R2): Diskette description
  113. ;---------------------------------------------------------------------------
  114.  
  115. [Identify]
  116.     ;
  117.     ;
  118.     read-syms Identification
  119.  
  120.     set Status     = STATUS_SUCCESSFUL
  121.     set Identifier = $(OptionType)
  122.     set Media      = #("Source Media Descriptions", 1, 1)
  123.  
  124.     Return $(Status) $(Identifier) $(Media)
  125.  
  126.  
  127.  
  128. ;------------------------------------------------------------------------
  129. ; 2. ReturnOptions:
  130. ;
  131. ; DESCRIPTION:   To return the option list supported by this INF and the
  132. ;                localised text list representing the options.
  133. ;
  134. ;
  135. ; INPUT:         $($0):  Language used. ( ENG | FRN | ... )
  136. ;
  137. ; OUTPUT:        $($R0): STATUS: STATUS_SUCCESSFUL |
  138. ;                                STATUS_NOLANGUAGE
  139. ;                                STATUS_FAILED
  140. ;
  141. ;                $($R1): Option List
  142. ;                $($R2): Option Text List
  143. ;------------------------------------------------------------------------
  144.  
  145. [ReturnOptions]
  146.     ;
  147.     ;
  148.     set Status        = STATUS_FAILED
  149.     set OptionList     = {}
  150.     set OptionTextList = {}
  151.  
  152.     ;
  153.     ; Check if the language requested is supported
  154.     ;
  155.     set LanguageList = ^(LanguagesSupported, 1)
  156.     Ifcontains(i) $($0) in $(LanguageList)
  157.         goto returnoptions
  158.     else
  159.         set Status = STATUS_NOLANGUAGE
  160.         goto finish_ReturnOptions
  161.     endif
  162.  
  163.     ;
  164.     ; form a list of all the options and another of the text representing
  165.     ;
  166.  
  167. returnoptions = +
  168.     set OptionList     = ^(Options, 0)
  169.     set OptionTextList = ^(OptionsText$($0), 1)
  170.     set Status         = STATUS_SUCCESSFUL
  171.  
  172. finish_ReturnOptions = +
  173.     Return $(Status) $(OptionList) $(OptionTextList)
  174.  
  175.  
  176.  
  177. ;---------------------------------------------------------------------------
  178. ; MapToSupportedOption
  179. ;
  180. ; DESCRIPTION:   To map a hardware detected option to the NT Supported
  181. ;                option which represents it.
  182. ;
  183. ; INPUT:         $($0): Option
  184. ;
  185. ; OUTPUT:        $($R0): STATUS: STATUS_SUCCESSFUL
  186. ;                $($R1): Mapped Option
  187. ;
  188. ;---------------------------------------------------------------------------
  189.  
  190. [MapToSupportedOption]
  191.     ;
  192.     set Status = STATUS_FAILED
  193.     set MappedOption = $($0)
  194.  
  195.     ;
  196.     ; If the option is one we can support using one of our standard options
  197.     ; then map it to the standard option else map it to the default option
  198.     ; which is VGA.
  199.     ;
  200.  
  201.     set OptionList = ^(MapOfOptions, 0)
  202.     ifcontains $($0) in $(OptionList)
  203.         set MappedOption = #(MapOfOptions, $($0), 1)
  204.     else
  205.         set MappedOption = "VGA"
  206.     endif
  207.  
  208.     set Status = STATUS_SUCCESSFUL
  209.     Return $(Status) $(MappedOption)
  210.  
  211.  
  212.  
  213. [ServicesEntry]
  214.     CurrentEntry = "" ? $(!LIBHANDLE) GetDevicemapValue Video \Device\Video0
  215.  
  216.  
  217. ;
  218. ; InstallOption:
  219. ;
  220. ; FUNCTION:  To copy files representing Options
  221. ;            To configure the installed option
  222. ;            To update the registry for the installed option
  223. ;
  224. ; INPUT:     $($0):  Language to use
  225. ;            $($1):  OptionID to install
  226. ;            $($2):  SourceDirectory
  227. ;            $($3):  AddCopy  (YES | NO)
  228. ;            $($4):  DoCopy   (YES | NO)
  229. ;            $($5):  DoConfig (YES | NO)
  230. ;
  231. ; OUTPUT:    $($R0): STATUS: STATUS_SUCCESSFUL |
  232. ;                            STATUS_NOLANGUAGE |
  233. ;                            STATUS_USERCANCEL |
  234. ;                            STATUS_FAILED
  235. ;
  236.  
  237. [InstallOption]
  238.  
  239.     ;
  240.     ; Set default values for
  241.     ;
  242.     set Status       = STATUS_FAILED
  243.     set DrivesToFree = {}
  244.  
  245.     ;
  246.     ; extract parameters
  247.     ;
  248.     set Option   = $($1)
  249.     set SrcDir   = $($2)
  250.     set AddCopy  = $($3)
  251.     set DoCopy   = $($4)
  252.     set DoConfig = $($5)
  253.  
  254.     ;
  255.     ; Check if the language requested is supported
  256.     ;
  257.     set LanguageList = ^(LanguagesSupported, 1)
  258.     Ifcontains(i) $($0) in $(LanguageList)
  259.     else
  260.         set Status = STATUS_NOLANGUAGE
  261.         goto finish_InstallOption
  262.     endif
  263.     read-syms Strings$($0)
  264.  
  265.     ;
  266.     ; check to see if Option is supported.
  267.     ;
  268.  
  269.     set OptionList = ^(Options, 0)
  270.     ifcontains $(Option) in $(OptionList)
  271.     else
  272.         goto finish_InstallOption
  273.     endif
  274.     set OptionList = ""
  275.  
  276.     ;
  277.     ; Option has been defined already
  278.     ;
  279.     set MiniportDriver    = #(Options, $(Option), 1)
  280.     set BitsPerPel        = #(Options, $(Option), 2)
  281.     set XResolution       = #(Options, $(Option), 3)
  282.     set YResolution       = #(Options, $(Option), 4)
  283.     set VRefresh          = #(Options, $(Option), 5)
  284.     set Interlaced        = #(Options, $(Option), 6)
  285.  
  286.     set Type              = $(#(MiniportDrivers, $(MiniportDriver), 1))
  287.     set Group             =   #(MiniportDrivers, $(MiniportDriver), 2)
  288.     set ErrorControl      = $(#(MiniportDrivers, $(MiniportDriver), 3))
  289.     set Tag               =   #(MiniportDrivers, $(MiniportDriver), 4)
  290.     set InstalledDisplays =   #(MiniportDrivers, $(MiniportDriver), 5)
  291.     set VgaCompatible     =   #(MiniportDrivers, $(MiniportDriver), 6)
  292.     set EventMessageFile  =   #(MiniportDrivers, $(MiniportDriver), 7)
  293.     set TypesSupported    =   #(MiniportDrivers, $(MiniportDriver), 8)
  294.     set AuxFiles          =   #(MiniportDrivers, $(MiniportDriver), 9)
  295.  
  296.     read-syms ServicesEntry
  297.     detect    ServicesEntry
  298.  
  299. installtheoption = +
  300.  
  301.     ;
  302.     ; Code to add files to copy list
  303.     ;
  304.  
  305.     ifstr(i) $(AddCopy) == "YES"
  306.         set DoActualCopy = NO
  307.         set FileToCheck = #(Files-DisplayMiniportDrivers, $(MiniportDriver), 2)
  308.         LibraryProcedure STATUS,$(!LIBHANDLE),CheckFileExistance $(!STF_WINDOWSSYSPATH)"\drivers\"$(FileToCheck)
  309.         ifstr(i) $(STATUS) == NO
  310.             set DoActualCopy = YES
  311.             goto addfiles
  312.         endif
  313.         ForListDo $(AuxFiles)
  314.             set FileToCheck = #(Files-Auxillary, $($), 3)
  315.             LibraryProcedure STATUS,$(!LIBHANDLE),CheckFileExistance $(!STF_WINDOWSSYSPATH)"\"$(FileToCheck)
  316.             ifstr(i) $(STATUS) == NO
  317.                 set DoActualCopy = YES
  318.             endif
  319.         EndForListDo
  320.  
  321. addfiles = +
  322.         ifstr(i) $(DoActualCopy) == NO
  323.             shell "subroutn.inf" DriversExist $($0) $(String1)
  324.             ifint $($ShellCode) != $(!SHELL_CODE_OK)
  325.                 Debug-Output "VIDEO.INF: shelling DriversExist failed"
  326.                 goto finish_InstallOption
  327.             endif
  328.  
  329.             ifstr(i) $($R0) == STATUS_CURRENT
  330.             else-ifstr(i) $($R0) == STATUS_NEW
  331.                 set DoActualCopy = YES
  332.             else-ifstr(i) $($R0) == STATUS_USERCANCEL
  333.                 Debug-Output "VIDEO.INF: User cancelled video installation"
  334.                 goto finish_InstallOption
  335.             else
  336.                 Debug-Output "VIDEO.INF: Error reported in DriversExist routine in SUBROUTN.INF"
  337.                 goto finish_InstallOption
  338.             endif
  339.         endif
  340.  
  341.         ifstr(i) $(DoActualCopy) == YES
  342.  
  343.             shell "subroutn.inf" DoAskSourceEx $(SrcDir) $(String2)
  344.             ifint $($ShellCode) != $(!SHELL_CODE_OK)
  345.                 Debug-Output "VIDEO.INF: shelling DoAskSourceEx failed"
  346.                 goto finish_InstallOption
  347.             endif
  348.  
  349.             ifstr(i) $($R0) == STATUS_SUCCESSFUL
  350.                 set SrcDir = $($R1)
  351.                 ifstr(i) $($R2) != ""
  352.                     set DrivesToFree = >($(DrivesToFree), $($R2))
  353.                 endif
  354.             else
  355.                 Debug-Output "VIDEO.INF: User cancelled asking source."
  356.                 goto finish_InstallOption
  357.             endif
  358.  
  359.             install Install-AddCopyOption
  360.             ifstr(i) $(STF_INSTALL_OUTCOME) != "STF_SUCCESS"
  361.                 Debug-Output "VIDEO.INF: Adding video files to copy list failed"
  362.                 goto finish_InstallOption
  363.             endif
  364.         else
  365.             set DoCopy = NO
  366.         endif
  367.  
  368.     endif
  369.  
  370.     ifstr(i) $(DoCopy) == "YES"
  371.         read-syms ProgressCopy$($0)
  372.         install Install-DoCopyOption
  373.         ifstr(i) $(STF_INSTALL_OUTCOME) == "STF_FAILURE"
  374.             Debug-Output "Copying files failed"
  375.             goto finish_InstallOption
  376.         else-ifstr(i) $(STF_INSTALL_OUTCOME) == "STF_USERQUIT"
  377.             set Status = STATUS_USERCANCEL
  378.             goto finish_InstallOption
  379.         endif
  380.     endif
  381.  
  382.     ifstr(i) $(DoConfig) == "YES"
  383.  
  384.         ;
  385.         ; first run a privilege check on modifying the setup node
  386.         ;
  387.  
  388.         shell "registry.inf" CheckSetupModify
  389.         ifint $($ShellCode) != $(!SHELL_CODE_OK)
  390.             goto finish_InstallOption
  391.         endif
  392.  
  393.         ifstr(i) $($R0) != STATUS_SUCCESSFUL
  394.             goto finish_InstallOption
  395.         endif
  396.  
  397.         ;
  398.         ; first make a new video entry, the entry is created automatically
  399.         ; enabled
  400.         ;
  401.  
  402.         set ServiceNode   = $(MiniportDriver)
  403.         set ServiceBinary = %SystemRoot%\System32\drivers\#(Files-DisplayMiniportDrivers, $(MiniportDriver), 2)
  404.  
  405.         set ServicesValues   = { +
  406.                 {Type,           0, $(!REG_VT_DWORD),     $(Type)                  }, +
  407.                 {Start,          0, $(!REG_VT_DWORD),     $(!SERVICE_SYSTEM_START) }, +
  408.                 {Group,          0, $(!REG_VT_SZ),        $(Group)                 }, +
  409.                 {ErrorControl,   0, $(!REG_VT_DWORD),     $(ErrorControl)          }, +
  410.                 {Tag,            0, $(!REG_VT_DWORD),     $(Tag)                   }, +
  411.                 {BinaryPathName, 0, $(!REG_VT_EXPAND_SZ), $(ServiceBinary)         }  +
  412.                 }
  413.  
  414.         set ParametersValues = { +
  415.                 {InstalledDisplayDrivers,     0, $(!REG_VT_MULTI_SZ), $(InstalledDisplays) }, +
  416.                 {VgaCompatible,               0, $(!REG_VT_DWORD),    $(VgaCompatible)     }, +
  417.                 {DefaultSettings.BitsPerPel,  0, $(!REG_VT_DWORD),    $(BitsPerPel)        }, +
  418.                 {DefaultSettings.XResolution, 0, $(!REG_VT_DWORD),    $(XResolution)       }, +
  419.                 {DefaultSettings.YResolution, 0, $(!REG_VT_DWORD),    $(YResolution)       }  +
  420.                 }
  421.  
  422.         ifstr(i) $(VRefresh) != ""
  423.             set VRefreshValue = {DefaultSettings.VRefresh, 0, $(!REG_VT_DWORD), $(VRefresh)}
  424.             set ParametersValue = >($(ParametersValue), $(VRefreshValue))
  425.         endif
  426.  
  427.         ifstr(i) $(Interlaced) != ""
  428.             set InterlacedValue = {DefaultSettings.Interlaced, 0, $(!REG_VT_DWORD), $(Interlaced)}
  429.             set ParametersValue = >($(ParametersValue), $(InterlacedValue))
  430.         endif
  431.  
  432.         set DeviceValues     = {}
  433.         set EventLogValues   = { +
  434.                 {EventMessageFile, 0, $(!REG_VT_EXPAND_SZ), $(EventMessageFile) }, +
  435.                 {TypesSupported,   0, $(!REG_VT_DWORD),     $(TypesSupported)   }  +
  436.                 }
  437.  
  438.         shell "registry.inf"  MakeServicesEntry $(ServiceNode)      +
  439.                                                 $(ServicesValues)   +
  440.                                                 $(ParametersValues) +
  441.                                                 $(DeviceValues)     +
  442.                                                 $(EventLogValues)   +
  443.                                                 Device0
  444.  
  445.         ifint $($ShellCode) != $(!SHELL_CODE_OK)
  446.             Debug-Output "Couldn't execute MakeServicesEntry in registry.inf"
  447.             goto finish_InstallOption
  448.         endif
  449.  
  450.         ifstr(i) $($R0) != STATUS_SUCCESSFUL
  451.             Debug-Output "MakeServicesEntry failed for video"
  452.             goto finish_InstallOption
  453.         endif
  454.  
  455.         ;
  456.         ;
  457.         ; then disable the previous video entry
  458.         ;
  459.  
  460.         ifstr(i) $(CurrentEntry) != $(MiniportDriver)
  461.             ifstr(i) $(CurrentEntry) != VGA
  462.                 ifstr(i) $(CurrentEntry) != ""
  463.                     shell "registry.inf" ModifyServicesEntry $(CurrentEntry) $(!SERVICE_DISABLED)
  464.  
  465.                     ifint $($ShellCode) != $(!SHELL_CODE_OK)
  466.                         Debug-Output "Couldn't find DisableServicesEntry in registry.inf"
  467.                         goto errorconfig
  468.                     endif
  469.  
  470.                     ifstr(i) $($R0) != STATUS_SUCCESSFUL
  471.                         Debug-Output "DisableServices entry failed"
  472.                     endif
  473.                 endif
  474.             endif
  475.         endif
  476.  
  477.         goto configdone
  478.  
  479. errorconfig = +
  480.         ifstr(i) $(CurrentEntry) != $(MiniportDriver)
  481.             shell "registry.inf" ModifyServicesEntry $(MiniportDriver) $(!SERVICE_DISABLED)
  482.             ifstr(i) $(CurrentEntry) != ""
  483.                 shell "registry.inf" ModifyServicesEntry $(CurrentEntry) $(!SERVICE_SYSTEM_START)
  484.             endif
  485.         endif
  486.         goto finish_InstallOption
  487.  
  488. configdone = +
  489.  
  490.     endif
  491.  
  492.     set Status = STATUS_SUCCESSFUL
  493.  
  494. finish_InstallOption = +
  495.     ForListDo $(DrivesToFree)
  496.         LibraryProcedure STATUS,$(!LIBHANDLE), DeleteNetConnection $($) "TRUE"
  497.     EndForListDo
  498.  
  499.     Return $(Status)
  500.  
  501.  
  502. [Install-AddCopyOption]
  503.  
  504.     set STF_VITAL = ""
  505.     ;
  506.     ; Add the files to the copy list
  507.     ;
  508.     AddSectionKeyFileToCopyList   Files-DisplayMiniportDrivers   +
  509.                                   $(MiniportDriver)              +
  510.                                   $(SrcDir)                      +
  511.                                   $(!STF_WINDOWSSYSPATH)\drivers
  512.  
  513.     ForListDo $(AuxFiles)
  514.         AddSectionKeyFileToCopyList   Files-Auxillary            +
  515.                                       $($)                       +
  516.                                       $(SrcDir)                  +
  517.                                       $(!STF_WINDOWSSYSPATH)
  518.  
  519.     EndForListDo
  520.  
  521.     exit
  522.  
  523.  
  524. [Install-DoCopyOption]
  525.  
  526.     ;
  527.     ; Copy files in the copy list
  528.     ;
  529.     CopyFilesInCopyList
  530.     exit
  531.  
  532. ;**************************************************************************
  533. ; PROGRESS GUAGE VARIABLES
  534. ;**************************************************************************
  535.  
  536. [ProgressCopyENG]
  537.     ProCaption   = "Windows NT Setup"
  538.     ProCancel    = "Cancel"
  539.     ProCancelMsg = "Windows NT is not correcly installed.  Are you sure you want "+
  540.                    "to cancel copying files?"
  541.     ProCancelCap = "Setup Message"
  542.     ProText1     = "Copying:"
  543.     ProText2     = "To:"
  544.  
  545. [StringsENG]
  546.     String1 = "Display"
  547.     String2 = "Please enter the full path to the OEM Display "+
  548.               "driver files.  Then choose Continue."
  549.  
  550. ;-----------------------------------------------------------------------
  551. ; SOURCE MEDIA DESCRIPTIONS
  552. ; -------------------------
  553. ; The OEM should list all the diskette labels here.  The source media
  554. ; description is used during copy to prompt the user for a diskette
  555. ; if the source is diskettes.
  556. ;
  557. ; Use 1 = "Diskette 1 Label" , TAGFILE = disk1
  558. ;     2 = "Diskette 2 Label" , TAGFILE = disk2
  559. ;     ...
  560. ;-----------------------------------------------------------------------
  561.  
  562. ;--------------------------------------------------------------------
  563. ; THE SECTIONS BELOW SHOULD BE AUTOMATICALLY GENERATED BY THE EXCEL
  564. ; SPREAD SHEETS
  565. ;--------------------------------------------------------------------
  566.  
  567. [Source Media Descriptions]
  568.     1  = "ATI Installation DISK (VIDEO)"  , TAGFILE = ati_vid
  569.  
  570. [Files-Auxillary]
  571. ati.dll = 1,ati.dll , SIZE=999
  572. ssdpms.scr = 1,ssdpms.scr, SIZE=999
  573. ssdpms.hlp = 1,ssdpms.hlp, SIZE=999
  574.  
  575. [Files-DisplayMiniportDrivers]
  576. ati = 1,ati.sys , SIZE=999
  577.