From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mga14.intel.com (mga14.intel.com [192.55.52.115]) by mx.groups.io with SMTP id smtpd.web10.34497.1670287884294317604 for ; Mon, 05 Dec 2022 16:51:24 -0800 Authentication-Results: mx.groups.io; dkim=fail reason="unable to parse pub key" header.i=@intel.com header.s=intel header.b=cLTrFIK6; spf=pass (domain: intel.com, ip: 192.55.52.115, mailfrom: bob.c.feng@intel.com) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1670287884; x=1701823884; h=from:to:cc:subject:date:message-id:references: in-reply-to:content-transfer-encoding:mime-version; bh=BZ+WAb/KTKDlOGgvv2rTap3iMBVPWoDGe6zKYpw0xTI=; b=cLTrFIK6+QmJFUNuZ59EdyeB5dukjVKTvo7U8DxAXvmfrP+9NesdgARf qIVmQGiixY9kWCimj3X+rAni4vZAVRoVfrUs080zfXYNfALKyHuDJW7Ak ujxGhdr4/OKTE/5T2rq5HE35aGL3y/nYyzLPhY8lAZDWytR6ZxttDIeax 2aLm770NgpMgd7pRZ6LJiqFXcxzcEq7/DLuCsPM+GEuhSHbw9U+Q7dyBT Cgdbl7ZFRt2pV5ZY6ViRJN3uJo9ONMtus9H2Y9ASjA/O9m2zcD/8yG5rN dKqOhJNgodH9GNlJpbxWzPtI6FOoWUiS8HAJDJNWp1L6U4xqC1JzzoFzC A==; X-IronPort-AV: E=McAfee;i="6500,9779,10552"; a="316526649" X-IronPort-AV: E=Sophos;i="5.96,220,1665471600"; d="scan'208";a="316526649" Received: from orsmga005.jf.intel.com ([10.7.209.41]) by fmsmga103.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 05 Dec 2022 16:51:23 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6500,9779,10552"; a="820395422" X-IronPort-AV: E=Sophos;i="5.96,220,1665471600"; d="scan'208";a="820395422" Received: from fmsmsx603.amr.corp.intel.com ([10.18.126.83]) by orsmga005.jf.intel.com with ESMTP; 05 Dec 2022 16:51:23 -0800 Received: from fmsmsx611.amr.corp.intel.com (10.18.126.91) by fmsmsx603.amr.corp.intel.com (10.18.126.83) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.16; Mon, 5 Dec 2022 16:51:23 -0800 Received: from FMSEDG603.ED.cps.intel.com (10.1.192.133) by fmsmsx611.amr.corp.intel.com (10.18.126.91) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.16 via Frontend Transport; Mon, 5 Dec 2022 16:51:23 -0800 Received: from NAM04-DM6-obe.outbound.protection.outlook.com (104.47.73.42) by edgegateway.intel.com (192.55.55.68) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.1.2507.16; Mon, 5 Dec 2022 16:51:22 -0800 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=UiYlNiFbJUDX/x7WUj4XF7g4NA7H3o2V85SFR1uctEEGtpM1ISc+dHgw4A040dR0b/Gdp0bNJIngU/l4iMg57cpd7rDw4UIACOZ8uwqqAGFzqPgsTL9XKHO4188tCI/RphNjiojMniuJmy+vXwDmUGbCq1vErczh2BfXohFI8PbY/6Sr0f60ARjUDIvL+YahZfhINoyRHyJrAT5LcdX5EhjnFR0dvTzpFWwENfA+7LArU0yje8pwjm7mtSFLk7W/wu/fV+6ctT3G746jSu3GAZ4IodPoykGOafaPXA5Xelh4XiI02fj76NwC0R2z5S1y8PbJV7PgDFgSHOMRnxYOCw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=OF11NUB8V9zL1pd1UR9bSD2nc1JcGcC/19aNg6oAxzs=; b=gGbaO128b+6Pm9vEkbKmxQhcWhneHE+2Goe1cI9sDDEkiNyfOxBMhUkL3uAfW0ufTgP2eatkW4ZbOBHh3WQmJaPvNTVaWoQUgt9a+o0OYbzioFm8BZBBs7+fQCoikpJ1ffXRNuKnunOOKBCfG69n8EpZzV56DMIc/DQ/JBmr3k1ICHOMsiEQ6H6qWEheMBbM8t2fXeG1g1KbykxJic6CNgU5wR/PHshBisi8m6s24kZ4wQjCHG4GQ0XIL6pLDDdq84jsmZ3r4cVx3EWGU3RDmV3ohELK1Fau49lqJAUmuZMDtz0/3PNB9lPEBKphzTZFOIxoIOacwcF8/3VTjKukAg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=intel.com; dmarc=pass action=none header.from=intel.com; dkim=pass header.d=intel.com; arc=none Received: from PH7PR11MB5863.namprd11.prod.outlook.com (2603:10b6:510:135::11) by CO1PR11MB5057.namprd11.prod.outlook.com (2603:10b6:303:6c::15) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5880.14; Tue, 6 Dec 2022 00:51:21 +0000 Received: from PH7PR11MB5863.namprd11.prod.outlook.com ([fe80::5d54:9569:9daf:e8a9]) by PH7PR11MB5863.namprd11.prod.outlook.com ([fe80::5d54:9569:9daf:e8a9%7]) with mapi id 15.20.5880.013; Tue, 6 Dec 2022 00:51:20 +0000 From: "Bob Feng" To: "Chen, Christine" , "devel@edk2.groups.io" CC: "Gao, Liming" Subject: Re: [Patch V2 2/3] [edk2-staging]BaseTools: Add new build option for PyVfrCompiler yaml generation Thread-Topic: [Patch V2 2/3] [edk2-staging]BaseTools: Add new build option for PyVfrCompiler yaml generation Thread-Index: AQHY+M7PB6Ass0SxC0OoAzMPhNMDk65gKAiQ Date: Tue, 6 Dec 2022 00:51:20 +0000 Message-ID: References: <20221115084613.2036-1-yuwei.chen@intel.com> In-Reply-To: <20221115084613.2036-1-yuwei.chen@intel.com> Accept-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: authentication-results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=intel.com; x-ms-publictraffictype: Email x-ms-traffictypediagnostic: PH7PR11MB5863:EE_|CO1PR11MB5057:EE_ x-ms-office365-filtering-correlation-id: eb0ff18a-2b36-4139-9f0a-08dad723fde0 x-ld-processed: 46c98d88-e344-4ed4-8496-4ed7712e255d,ExtAddr x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: 2k/zVTfhDXYFeBBf3xsmHkTWGbqI9WSg5pv30sSjdZMwyOV7+iw6LNQyNQHuugz2Sp21nLW/cRqpgRS2gDVKAZgx/zrrO/6X3adiUztazxH7dHht8TOCxMeEuxmuzSOdtBM9vI6UIon7QB053M6TckE6okeb8pwxPx43AwZFYRtt+Jg69eTvIqsI4U87Fth/e8VKVJUcJOfMfZmFxd7/R7yLqwVkYaYzw6kuGytLUihi8iY5BL9730IMCQke/QpVFeq/IBiYVfFlO+BeIr4XYoomJgsr+dNMsvNm4uE74JPlmlGrclx1k/Hjn1d3A9cpL05PPglTxOTa8SsBXBuXr343uD7hCN2ooE6Ukdzwm/QM3JQ4F57ptKywSW9jRildJBuH1O1lREEDzh2SlZcSjft+X4HHIyAT9t4ulNGHoHbasHb0tD4NL7Ad253+7P34J96OkuekEId1gdfNTmj4UAFmvLbl4ntvwrQgz4hlqIZCQZuzqjDeeMU9robMC6rumABW3zoJNgi2GGhmPMRjo5CZPJfDIIPic3xugMOiS1+54T3h1XKqT5i0lN0ltZB+OBQpGLiN4VUwCoMql8PvROVa6WA6AuHtJli+JhRlTjGfOoUcxSlhagkIPBsC2AJBq/iBKU2a9IbYNwb0e+TKOaiS1ntOnspbwBQrbeLfc2Lvl7rcrLQT8PHezecrrAgxeIWyKsf5F4CdQRnrR/jDaw== x-forefront-antispam-report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:PH7PR11MB5863.namprd11.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230022)(6029001)(39860400002)(366004)(396003)(376002)(346002)(136003)(451199015)(82960400001)(38100700002)(86362001)(8936002)(41300700001)(2906002)(4326008)(5660300002)(38070700005)(83380400001)(122000001)(33656002)(66446008)(478600001)(66946007)(66476007)(66556008)(316002)(110136005)(71200400001)(76116006)(55016003)(52536014)(8676002)(64756008)(53546011)(186003)(7696005)(9686003)(6506007)(26005);DIR:OUT;SFP:1102; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?us-ascii?Q?tuKWKUAg/Fz2OJwQYdCIGXqRh4yDxsvViULehVTtp+a84jE6qGL//bPcYGMB?= =?us-ascii?Q?vc66PW57ln+BycH/Aeyw9SPazCfpccBvMxestjy3VduU0km6O4qRfA5uIIRc?= =?us-ascii?Q?vxq0qIz4kNDPWme0/2V3eRdAWkkLvHR1YkR9etB13i1er/1C7EiQpBcuUA1t?= =?us-ascii?Q?GVRQjAePg1ZZiydTjqTsZi8NY1LH0C/ETMD1XN6fowI/uYdlnq/v03dpOqy3?= =?us-ascii?Q?oj6zzROEQrrqmjQgaLj/F3MbiSRqIowzZbYny6lSReDqXfFt6ajbE8+1UrTv?= =?us-ascii?Q?7W/wPsIFZtE8xbKjAzcyu6sz5OYn8CgMQS0tQbT8PgjkQMnZ8nCLV3L2B02c?= =?us-ascii?Q?1vuApujbbsRarMa5e2EA1Vyyv/qhwyAcCFBvtn8TpXterT+B6/NYAKUKTlEp?= =?us-ascii?Q?opnapc6U30ec4zlCuZMSC2qN0vPyZE8rQTv/IOXoi4z1o4BSv0d4okkpjECr?= =?us-ascii?Q?oW84kX1a/Xk5Mqh4eNBSAHrhgDiZx7fbGJ5Ci9Y/4urR13Tr8e9LBAIWDsfb?= =?us-ascii?Q?pK8cWgkq1RnUAtZ35N+zeGkgwGN96PXO2ZJRhdQ/iqRHcO7ECWqd0DpLd232?= =?us-ascii?Q?JSkl7z1aFQsxlWpuV50BDjjV5LnchpCYiQIKys3KBmwsNfyYUhFDb7X1+Ngd?= =?us-ascii?Q?nNy5897l6wwrPMv0BwPBhZm8ZhObyHVEdMvnYJICwQwOO0XYLaT9lHLTQfvR?= =?us-ascii?Q?VHI8Quggku8bI+xLJklZgsg3pTjPq6y0KowqqUrhGwUpCPgmGMXRY1zm6ENF?= =?us-ascii?Q?ISd5w63+C0R8anPucAAeDUCFPB8xCO2eAwuMJDLnDsi+hTgXx2iDa1YVoBs8?= =?us-ascii?Q?yppw9rTLhDfdnHvAOdxX9fZfEYKR88MrtYKVEnx/fkpgxwIHbh31kU4JKAiv?= =?us-ascii?Q?VGgyNxUpd9zavJ7o0nXfQu/yaFn12G+SK6KOw/vtc5v67pMIj3Xs1rzcAjx0?= =?us-ascii?Q?KWsSl4RPF42fWUyAF2ciBXNhwa2yqgaVgrN/vnYU0KqBT6tVegH7qhs4edgj?= =?us-ascii?Q?lankW33iyolGnAnsOJetJmfvcDt8Z0jsiIJkiXzUs8S8PAx8WohdZ9mdZT2U?= =?us-ascii?Q?a9dk40Fm+xl2Gzu81u6B0ssRS+4zOZyBATKOwxdHLy3D09JuPQNNSz5KNKTq?= =?us-ascii?Q?DU+SRYWybI138TcTo9zoHotP1Th3YPYVODuW9lfUXBzT9Vncmq7G6IdyP6iQ?= =?us-ascii?Q?uLf7kxuCgAPPiufCBv/fgeoLxRtXDAuPhmOgk/Tk2uxeoSrcW6D1Wm2t31X8?= =?us-ascii?Q?QRUsMOmwoUsgOFY92ZQfGk4nbi+CsD2ms5hi5uOc649iS5jA1ceRrmnYQMwF?= =?us-ascii?Q?I5FlfaFse317AApdS4CeB7a1PXiWvBDKzQmZiD67d9q4AH/wv5n4X7dABghj?= =?us-ascii?Q?IiW3UYiQv91QnZkki0GFNFMvKl0qflvdQxV4kB9AoSddCkPZMPmuzT3BG2UW?= =?us-ascii?Q?o8y/niciYO3x7AaNY7oJsOcjyTq3VF91ZlCn4eDd/vilpBLdAdpu9pnLbYQ1?= =?us-ascii?Q?ESgmLxi1xz3pAnHpjDAfE/5pFf3skaCbCmgD2+B3OSbFSKiEDjp5YQ5GSePj?= =?us-ascii?Q?f0yH6SImHVvmUYHKJ/YmYMMPS/mS2LBKZcqWJAEr?= MIME-Version: 1.0 X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: PH7PR11MB5863.namprd11.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: eb0ff18a-2b36-4139-9f0a-08dad723fde0 X-MS-Exchange-CrossTenant-originalarrivaltime: 06 Dec 2022 00:51:20.9061 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 46c98d88-e344-4ed4-8496-4ed7712e255d X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: rVdlYCZ0EhU+LPUbS0zGA3+Ky+HEMB1IdzBCJWJNOO1JrjbvmL8yEK2zSCTHIpf5lY+oIn2ETErDqrCc1xM4jA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: CO1PR11MB5057 Return-Path: bob.c.feng@intel.com X-OriginatorOrg: intel.com Content-Language: en-US Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Reviewed-by: Bob Feng -----Original Message----- From: Chen, Christine =20 Sent: Tuesday, November 15, 2022 4:46 PM To: devel@edk2.groups.io Cc: Feng, Bob C ; Gao, Liming Subject: [Patch V2 2/3] [edk2-staging]BaseTools: Add new build option for P= yVfrCompiler yaml generation Add new build option "--vfr-yaml-enable" for Python VfrCompiler extended ou= tput yaml file generation. Cc: Bob Feng Cc: Liming Gao Signed-off-by: Yuwei Chen --- BaseTools/Source/Python/AutoGen/DataPipe.py | 2 ++ BaseTools/Source/Python/AutoGen/ModuleAutoGen.py | 8 ++++++++ BaseTools/Source/Python/Common/GlobalData.py | 4 ++++ BaseTools/Source/Python/build/build.py | 33 ++++++++++++++++++++= +++++++++++++ BaseTools/Source/Python/build/buildoptions.py | 1 + 5 files changed, 48 insertions(+) diff --git a/BaseTools/Source/Python/AutoGen/DataPipe.py b/BaseTools/Source= /Python/AutoGen/DataPipe.py index 848c7a8296..c700baf7b7 100755 --- a/BaseTools/Source/Python/AutoGen/DataPipe.py +++ b/BaseTools/Source/Python/AutoGen/DataPipe.py @@ -171,3 +171,5 @@ class MemoryDataPipe(DataPipe): self.DataContainer =3D {"EnableGenfdsMultiThread":GlobalData.gEnab= leGenfdsMultiThread} self.DataContainer =3D {"gPlatformFinalPcds":= GlobalData.gPlatformFinalPcds}++ self.DataContainer =3D {"VfrYamlEna= ble": GlobalData.gVfrYamlEnable}diff --git a/BaseTools/Source/Python/AutoGe= n/ModuleAutoGen.py b/BaseTools/Source/Python/AutoGen/ModuleAutoGen.py index d05410b329..eb81c3f3af 100755 --- a/BaseTools/Source/Python/AutoGen/ModuleAutoGen.py +++ b/BaseTools/Source/Python/AutoGen/ModuleAutoGen.py @@ -434,6 +434,14 @@ class ModuleAutoGen(AutoGen): def DebugDir(self): return _MakeDir((self.BuildDir, "DEBUG")) = + @cached_property+ def VarIFiles(self):+ rt =3D []+ fo= r SrcFile in self.SourceFileList:+ if SrcFile.Ext.lower() =3D=3D= '.vfr':+ rt.append(os.path.join(self.OutputDir, "{}.i".form= at(SrcFile.BaseName)))+ return rt+ ## Return the path of custom = file @cached_property def CustomMakefile(self):diff --git a/BaseToo= ls/Source/Python/Common/GlobalData.py b/BaseTools/Source/Python/Common/Glob= alData.py index 197bd83666..039a9648aa 100755 --- a/BaseTools/Source/Python/Common/GlobalData.py +++ b/BaseTools/Source/Python/Common/GlobalData.py @@ -123,3 +123,7 @@ gSikpAutoGenCache =3D set() # Common lock for the file= access in multiple process AutoGens file_lock =3D None +#+# Build flag for= generate Yaml file from Vfr file+#+gVfrYamlEnable =3D Falsediff --git a/Ba= seTools/Source/Python/build/build.py b/BaseTools/Source/Python/build/build.= py index 51fb1f433e..7e2f25686d 100755 --- a/BaseTools/Source/Python/build/build.py +++ b/BaseTools/Source/Python/build/build.py @@ -748,6 +748,7 @@ class Build(): GlobalData.gBinCacheSource =3D BuildOptions.BinCacheSource = GlobalData.gEnableGenfdsMultiThread =3D not BuildOptions.NoGenfdsMultiThre= ad GlobalData.gDisableIncludePathCheck =3D BuildOptions.DisableIncl= udePathCheck+ GlobalData.gVfrYamlEnable =3D BuildOptions.VfrYamlEnab= le if GlobalData.gBinCacheDest and not GlobalData.gUseHashCache: = EdkLogger.error("build", OPTION_NOT_SUPPORTED, ExtraData=3D"--bi= nary-destination must be used together with --hash.")@@ -1460,6 +1461,17 @@= class Build(): # genfds if Target =3D=3D 'fds':+ if GlobalDat= a.gVfrYamlEnable:+ from VfrCompiler.main import VfrParse+ = variable_i_filelist =3D os.path.join(AutoGenObject.BuildDir,"v= ariable_i_filelist.txt")+ if os.path.exists(variable_i_filel= ist):+ with open(variable_i_filelist) as file:+ = i_filelist =3D file.readlines()+ for = i_file in i_filelist:+ inputfile =3D i_file.repl= ace("\n", "")+ yamloutputfile =3D inputfile.spli= t(".")[0] + '.yaml'+ jsonoutputfile =3D inputfil= e.split(".")[0] + '.json'+ VfrParse(inputfile, y= amloutputfile, jsonoutputfile) if GenFdsApi(AutoGenObject.GenFd= sCommandDict, self.Db): EdkLogger.error("build", COMMAND_FA= ILURE) Threshold =3D self.GetFreeSizeThreshold()@@ -2246,6 +225= 8,15 @@ class Build(): fw.write("Arch=3D%s\n" % "|".join((Wa.ArchList))) = fw.write("BuildDir=3D%s\n" % Wa.BuildDir) fw.write("PlatformGui= d=3D%s\n" % str(Wa.AutoGenObjectList[0].Guid))+ variable_i_filelist = =3D os.path.join(Wa.BuildDir,"variable_i_filelist.txt")+ vfr_var_i = =3D []+ if GlobalData.gVfrYamlEnable:+ for ma in self.All= Modules:+ vfr_var_i.extend(ma.VarIFiles)+ SaveFil= eOnChange(variable_i_filelist, "\n".join(vfr_var_i), False)+ else:+ = if os.path.exists(variable_i_filelist):+ os.remov= e(variable_i_filelist) if GlobalData.gBinCacheSource: = BuildModules.extend(self.MakeCacheMiss)@@ -2358,6 +2379,18 @@ class Build()= : # # Generate FD image if t= here's a FDF file found #+ i= f GlobalData.gVfrYamlEnable:+ from VfrCompiler.m= ain import VfrParse+ variable_i_filelist =3D os.= path.join(Wa.BuildDir,"variable_i_filelist.txt")+ = if os.path.exists(variable_i_filelist):+ w= ith open(variable_i_filelist) as file:+ = i_filelist =3D file.readlines()+ for i_f= ile in i_filelist:+ inputfile =3D i_= file.replace("\n", "")+ yamloutputfi= le =3D inputfile.split(".")[0] + '.yaml'+ = jsonoutputfile =3D inputfile.split(".")[0] + '.json'+ = print('inputfile ', inputfile)+ = VfrParse(inputfile, yamloutputfile, jsonoutputfile) = GenFdsStart =3D time.time() if= GenFdsApi(Wa.GenFdsCommandDict, self.Db): EdkL= ogger.error("build", COMMAND_FAILURE)diff --git a/BaseTools/Source/Python/b= uild/buildoptions.py b/BaseTools/Source/Python/build/buildoptions.py index 8334604b46..c0304c2f98 100644 --- a/BaseTools/Source/Python/build/buildoptions.py +++ b/BaseTools/Source/Python/build/buildoptions.py @@ -103,4 +103,5 @@ class MyOptionParser(): Parser.add_option("--genfds-multi-thread", action=3D"store_true", = dest=3D"GenfdsMultiThread", default=3DTrue, help=3D"Enable GenFds multi thr= ead to generate ffs file.") Parser.add_option("--no-genfds-multi-th= read", action=3D"store_true", dest=3D"NoGenfdsMultiThread", default=3DFalse= , help=3D"Disable GenFds multi thread to generate ffs file.") Parse= r.add_option("--disable-include-path-check", action=3D"store_true", dest=3D= "DisableIncludePathCheck", default=3DFalse, help=3D"Disable the include pat= h check for outside of package.")+ Parser.add_option("--vfr-yaml-ena= ble", action=3D"store_true", dest=3D"VfrYamlEnable", default=3DFalse, help= =3D"Enable the Vfr to yaml function.") self.BuildOption, self.Build= Target =3D Parser.parse_args()--=20 2.27.0.windows.1