/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

#include <winuser.h>
#include <winver.h>
#include "version.h"

/////////////////////////////////////////////////////////////////////////////
//
// Version
//

VS_VERSION_INFO VERSIONINFO
 FILEVERSION    FVER
 PRODUCTVERSION FVER
 FILEFLAGSMASK 0x3fL
#ifdef _DEBUG
 FILEFLAGS 0x1L
#else
 FILEFLAGS 0x0L
#endif
 // FILEOS 0x4 is Win32, 0x40004 is Win32 NT only
 FILEOS 0x4L
 // FILETYPE should be 0x1 for .exe and 0x2 for .dll
 FILETYPE FILETYPE_ID
 FILESUBTYPE 0x0L
BEGIN
    BLOCK "StringFileInfo"
    BEGIN
        BLOCK "000004b0"
        BEGIN
            VALUE "CompanyName",      COMPANY       "\0"
            VALUE "FileDescription",  COMPONENT     "\0"
            VALUE "FileVersion",      VER           "\0"
            VALUE "Full Version",     BUILD_ID      "\0"
            VALUE "InternalName",     INTERNAL_NAME "\0"
            VALUE "LegalCopyright",   COPYRIGHT     "\0"
            VALUE "OriginalFilename", FNAME         "\0"
            VALUE "ProductName",      NAME          "\0"
            VALUE "ProductVersion",   VER           "\0"
        END
    END
    BLOCK "VarFileInfo"
    BEGIN
        VALUE "Translation", 0x0, 1200
    END
END
