From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mga17.intel.com (mga17.intel.com [192.55.52.151]) by mx.groups.io with SMTP id smtpd.web12.330.1573694866307644040 for ; Wed, 13 Nov 2019 17:27:46 -0800 Authentication-Results: mx.groups.io; dkim=missing; spf=pass (domain: intel.com, ip: 192.55.52.151, mailfrom: zhijux.fan@intel.com) X-Amp-Result: UNKNOWN X-Amp-Original-Verdict: FILE UNKNOWN X-Amp-File-Uploaded: False Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by fmsmga107.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 13 Nov 2019 17:27:45 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.68,302,1569308400"; d="dat'59?scan'59,208,59";a="235490166" Received: from fmsmsx103.amr.corp.intel.com ([10.18.124.201]) by fmsmga002.fm.intel.com with ESMTP; 13 Nov 2019 17:27:45 -0800 Received: from fmsmsx154.amr.corp.intel.com (10.18.116.70) by FMSMSX103.amr.corp.intel.com (10.18.124.201) with Microsoft SMTP Server (TLS) id 14.3.439.0; Wed, 13 Nov 2019 17:27:45 -0800 Received: from shsmsx103.ccr.corp.intel.com (10.239.4.69) by FMSMSX154.amr.corp.intel.com (10.18.116.70) with Microsoft SMTP Server (TLS) id 14.3.439.0; Wed, 13 Nov 2019 17:27:44 -0800 Received: from shsmsx101.ccr.corp.intel.com ([169.254.1.213]) by SHSMSX103.ccr.corp.intel.com ([169.254.4.60]) with mapi id 14.03.0439.000; Thu, 14 Nov 2019 09:27:43 +0800 From: "Fan, ZhijuX" To: "devel@edk2.groups.io" CC: "Gao, Liming" , "Feng, Bob C" Subject: [PATCH V2] BaseTools:Add [packages] section in dsc file Thread-Topic: [PATCH V2] BaseTools:Add [packages] section in dsc file Thread-Index: AdWairM9JYS36Rs6QsuXhur7pWjW8Q== Date: Thu, 14 Nov 2019 01:27:42 +0000 Message-ID: Accept-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-ctpclassification: CTP_NT x-titus-metadata-40: eyJDYXRlZ29yeUxhYmVscyI6IiIsIk1ldGFkYXRhIjp7Im5zIjoiaHR0cDpcL1wvd3d3LnRpdHVzLmNvbVwvbnNcL0ludGVsMyIsImlkIjoiNWRhMzIyZjItY2Q0Yi00MDRjLTk5MWYtOGMyMWJiMjQxODYyIiwicHJvcHMiOlt7Im4iOiJDVFBDbGFzc2lmaWNhdGlvbiIsInZhbHMiOlt7InZhbHVlIjoiQ1RQX05UIn1dfV19LCJTdWJqZWN0TGFiZWxzIjpbXSwiVE1DVmVyc2lvbiI6IjE3LjEwLjE4MDQuNDkiLCJUcnVzdGVkTGFiZWxIYXNoIjoiYkVOMVJFSXc3SUxGWGdrWXN0QWwwNFZyYzZSd3htT3psNGRSc0xvdUg0aldvV1RLaytXb0xqNjlFeExFZDZ6UyJ9 dlp-product: dlpe-windows dlp-version: 11.2.0.6 dlp-reaction: no-action x-originating-ip: [10.239.127.40] MIME-Version: 1.0 Return-Path: zhijux.fan@intel.com X-Groupsio-MsgNum: 50602 Content-Type: multipart/mixed; boundary="_000_FAD0D7E0AE0FA54D987F6E72435CAFD50AFE03F5SHSMSX101ccrcor_" Content-Language: en-US --_000_FAD0D7E0AE0FA54D987F6E72435CAFD50AFE03F5SHSMSX101ccrcor_ Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable BZ:https://bugzilla.tianocore.org/show_bug.cgi?id=3D2270 Currently a PCD (e.g. FeaturePCD) cannot be used in a conditional statement in a DSC/FDF file without a module in the build referencing the PCD package DEC file. An example implementation that to support this is to allow a [Packages] section in the DSC file to list additional package dependencies for PCD references in the package DSC/FDF files. this patch is going to add the ability to have the [packages] section defined in the DSC file Cc: Liming Gao Cc: Bob Feng Signed-off-by: Zhiju.Fan --- BaseTools/Source/Python/AutoGen/ModuleAutoGen.py | 29 +++++++++++++++++-= ---- BaseTools/Source/Python/AutoGen/PlatformAutoGen.py | 1 + .../Source/Python/AutoGen/WorkspaceAutoGen.py | 1 + BaseTools/Source/Python/Common/DataType.py | 1 + BaseTools/Source/Python/Workspace/DscBuildData.py | 23 ++++++++++++++++- .../Source/Python/Workspace/MetaFileParser.py | 14 +++++++++++ .../Source/Python/Workspace/WorkspaceCommon.py | 2 ++ .../Source/Python/Workspace/WorkspaceDatabase.py | 4 +++ 8 files changed, 68 insertions(+), 7 deletions(-) diff --git a/BaseTools/Source/Python/AutoGen/ModuleAutoGen.py b/BaseTools/S= ource/Python/AutoGen/ModuleAutoGen.py index f0812b6887..e6d6c43810 100755 --- a/BaseTools/Source/Python/AutoGen/ModuleAutoGen.py +++ b/BaseTools/Source/Python/AutoGen/ModuleAutoGen.py @@ -462,14 +462,31 @@ class ModuleAutoGen(AutoGen): def BuildCommand(self): return self.PlatformInfo.BuildCommand =20 - ## Get object list of all packages the module and its dependent librar= ies belong to + ## Get Module package and Platform package + # + # @retval list The list of package object + # + @cached_property + def PackageList(self): + PkagList =3D [] + if self.Module.Packages: + PkagList.extend(self.Module.Packages) + Platform =3D self.BuildDatabase[self.PlatformInfo.MetaFile, self.A= rch, self.BuildTarget, self.ToolChain] + for Package in Platform.Packages: + if Package in PkagList: + continue + PkagList.append(Package) + return PkagList + + ## Get object list of all packages the module and its dependent librar= ies belong to and the Platform depends on # # @retval list The list of package object # @cached_property def DerivedPackageList(self): PackageList =3D [] - for M in [self.Module] + self.DependentLibraryList: + PackageList.extend(self.PackageList) + for M in self.DependentLibraryList: for Package in M.Packages: if Package in PackageList: continue @@ -938,13 +955,13 @@ class ModuleAutoGen(AutoGen): self.Targets return self._FileTypes =20 - ## Get the list of package object the module depends on + ## Get the list of package object the module depends on and the Platfo= rm depends on # # @retval list The package object list # @cached_property def DependentPackageList(self): - return self.Module.Packages + return self.PackageList =20 ## Return the list of auto-generated code file # @@ -1101,7 +1118,7 @@ class ModuleAutoGen(AutoGen): RetVal.append(self.MetaFile.Dir) RetVal.append(self.DebugDir) =20 - for Package in self.Module.Packages: + for Package in self.PackageList: PackageDir =3D mws.join(self.WorkspaceDir, Package.MetaFile.Di= r) if PackageDir not in RetVal: RetVal.append(PackageDir) @@ -1125,7 +1142,7 @@ class ModuleAutoGen(AutoGen): @cached_property def PackageIncludePathList(self): IncludesList =3D [] - for Package in self.Module.Packages: + for Package in self.PackageList: PackageDir =3D mws.join(self.WorkspaceDir, Package.MetaFile.Di= r) IncludesList =3D Package.Includes if Package._PrivateIncludes: diff --git a/BaseTools/Source/Python/AutoGen/PlatformAutoGen.py b/BaseTools= /Source/Python/AutoGen/PlatformAutoGen.py index debeb46f58..4c3cdf82d5 100644 --- a/BaseTools/Source/Python/AutoGen/PlatformAutoGen.py +++ b/BaseTools/Source/Python/AutoGen/PlatformAutoGen.py @@ -975,6 +975,7 @@ class PlatformAutoGen(AutoGen): continue ModuleData =3D self.BuildDatabase[ModuleFile, self.Arch, self.= BuildTarget, self.ToolChain] RetVal.update(ModuleData.Packages) + RetVal.update(self.Platform.Packages) return list(RetVal) =20 @cached_property diff --git a/BaseTools/Source/Python/AutoGen/WorkspaceAutoGen.py b/BaseTool= s/Source/Python/AutoGen/WorkspaceAutoGen.py index 9d8040905e..fde48b4b27 100644 --- a/BaseTools/Source/Python/AutoGen/WorkspaceAutoGen.py +++ b/BaseTools/Source/Python/AutoGen/WorkspaceAutoGen.py @@ -420,6 +420,7 @@ class WorkspaceAutoGen(AutoGen): continue ModuleData =3D self.BuildDatabase[ModuleFile, Arch, self.B= uildTarget, self.ToolChain] PkgSet.update(ModuleData.Packages) + PkgSet.update(Platform.Packages) Pkgs[Arch] =3D list(PkgSet) return Pkgs =20 diff --git a/BaseTools/Source/Python/Common/DataType.py b/BaseTools/Source/= Python/Common/DataType.py index 5d49afb0a9..8d80b41089 100644 --- a/BaseTools/Source/Python/Common/DataType.py +++ b/BaseTools/Source/Python/Common/DataType.py @@ -519,6 +519,7 @@ SECTIONS_HAVE_ITEM_AFTER_ARCH_SET =3D {TAB_LIBRARY_CLAS= SES.upper(), TAB_DEPEX.uppe PCDS_DYNAMICEX_VPD.upper(), PCDS_DYNAMICEX_HII.upper(), TAB_BUILD_OPTIONS.upper(), + TAB_PACKAGES.upper(), TAB_INCLUDES.upper()} =20 # diff --git a/BaseTools/Source/Python/Workspace/DscBuildData.py b/BaseTools/= Source/Python/Workspace/DscBuildData.py index 9192077f90..03a15bbf3e 100644 --- a/BaseTools/Source/Python/Workspace/DscBuildData.py +++ b/BaseTools/Source/Python/Workspace/DscBuildData.py @@ -719,6 +719,24 @@ class DscBuildData(PlatformBuildClassObject): self._RawData.DisableOverrideComponent(Components[(file_gu= id_str,str(ModuleFile))]) Components[(file_guid_str,str(ModuleFile))] =3D ModuleId self._RawData._PostProcessed =3D False + + ## Retrieve packages this Platform depends on + @cached_property + def Packages(self): + RetVal =3D set() + RecordList =3D self._RawData[MODEL_META_DATA_PACKAGE, self._Arch] + Macros =3D self._Macros + for Record in RecordList: + File =3D PathClass(NormPath(Record[0], Macros), GlobalData.gWo= rkspace, Arch=3Dself._Arch) + # check the file validation + ErrorCode, ErrorInfo =3D File.Validate('.dec') + if ErrorCode !=3D 0: + LineNo =3D Record[-1] + EdkLogger.error('build', ErrorCode, ExtraData=3DErrorInfo,= File=3Dself.MetaFile, Line=3DLineNo) + # parse this package now. we need it to get protocol/ppi/guid = value + RetVal.add(self._Bdb[File, self._Arch, self._Target, self._Too= lchain]) + return RetVal + ## Retrieve [Components] section information @property def Modules(self): @@ -896,7 +914,8 @@ class DscBuildData(PlatformBuildClassObject): continue ModuleData =3D self._Bdb[ModuleFile, self._Arch, self._Tar= get, self._Toolchain] PkgSet.update(ModuleData.Packages) - + if self.Packages: + PkgSet.update(self.Packages) self._DecPcds, self._GuidDict =3D GetDeclaredPcd(self, self._B= db, self._Arch, self._Target, self._Toolchain, PkgSet) self._GuidDict.update(GlobalData.gPlatformPcds) =20 @@ -3320,6 +3339,8 @@ class DscBuildData(PlatformBuildClassObject): continue ModuleData =3D self._Bdb[ModuleFile, self._Arch, self._Tar= get, self._Toolchain] PkgSet.update(ModuleData.Packages) + if self.Packages: + PkgSet.update(self.Packages) self._DecPcds, self._GuidDict =3D GetDeclaredPcd(self, self._B= db, self._Arch, self._Target, self._Toolchain, PkgSet) self._GuidDict.update(GlobalData.gPlatformPcds) return self._DecPcds diff --git a/BaseTools/Source/Python/Workspace/MetaFileParser.py b/BaseTool= s/Source/Python/Workspace/MetaFileParser.py index 806fc322c5..3f96ce0564 100644 --- a/BaseTools/Source/Python/Workspace/MetaFileParser.py +++ b/BaseTools/Source/Python/Workspace/MetaFileParser.py @@ -160,6 +160,7 @@ class MetaFileParser(object): self.MetaFile =3D FilePath self._FileDir =3D self.MetaFile.Dir self._Defines =3D {} + self._Packages =3D [] self._FileLocalMacros =3D {} self._SectionsMacroDict =3D defaultdict(dict) =20 @@ -351,6 +352,13 @@ class MetaFileParser(object): # If the section information is needed later, it should be stored = in database self._ValueList[0] =3D self._SectionName =20 + ## [packages] section parser + @ParseMacro + def _PackageParser(self): + self._CurrentLine =3D CleanString(self._CurrentLine) + self._Packages.append(self._CurrentLine) + self._ValueList[0] =3D self._CurrentLine + ## [defines] section parser @ParseMacro def _DefineParser(self): @@ -848,6 +856,7 @@ class DscParser(MetaFileParser): TAB_LIBRARIES.upper() : MODEL_EFI_LIBRARY_= INSTANCE, TAB_LIBRARY_CLASSES.upper() : MODEL_EFI_LIBRARY_= CLASS, TAB_BUILD_OPTIONS.upper() : MODEL_META_DATA_BU= ILD_OPTION, + TAB_PACKAGES.upper() : MODEL_META_DATA_PA= CKAGE, TAB_PCDS_FIXED_AT_BUILD_NULL.upper() : MODEL_PCD_FIXED_AT= _BUILD, TAB_PCDS_PATCHABLE_IN_MODULE_NULL.upper() : MODEL_PCD_PATCHABL= E_IN_MODULE, TAB_PCDS_FEATURE_FLAG_NULL.upper() : MODEL_PCD_FEATURE_= FLAG, @@ -1339,6 +1348,7 @@ class DscParser(MetaFileParser): MODEL_META_DATA_DEFINE : self.__Pro= cessDefine, MODEL_META_DATA_GLOBAL_DEFINE : self.__Pro= cessDefine, MODEL_META_DATA_INCLUDE : self.__Pro= cessDirective, + MODEL_META_DATA_PACKAGE : self.__Pro= cessPackages, MODEL_META_DATA_CONDITIONAL_STATEMENT_IF : self.__Pro= cessDirective, MODEL_META_DATA_CONDITIONAL_STATEMENT_ELSE : self.__Pro= cessDirective, MODEL_META_DATA_CONDITIONAL_STATEMENT_IFDEF : self.__Pro= cessDirective, @@ -1642,6 +1652,9 @@ class DscParser(MetaFileParser): self._ValueList =3D None self._ContentIndex -=3D 1 =20 + def __ProcessPackages(self): + self._ValueList[0] =3D ReplaceMacro(self._ValueList[0], self._Macr= os) + def __ProcessSkuId(self): self._ValueList =3D [ReplaceMacro(Value, self._Macros, RaiseError= =3DTrue) for Value in self._ValueList] @@ -1720,6 +1733,7 @@ class DscParser(MetaFileParser): MODEL_META_DATA_COMPONENT : _ComponentPars= er, MODEL_META_DATA_BUILD_OPTION : _BuildOptionPa= rser, MODEL_UNKNOWN : MetaFileParser= ._Skip, + MODEL_META_DATA_PACKAGE : MetaFileParser= ._PackageParser, MODEL_META_DATA_USER_EXTENSION : MetaFileParser= ._SkipUserExtension, MODEL_META_DATA_SECTION_HEADER : MetaFileParser= ._SectionHeaderParser, MODEL_META_DATA_SUBSECTION_HEADER : _SubsectionHea= derParser, diff --git a/BaseTools/Source/Python/Workspace/WorkspaceCommon.py b/BaseToo= ls/Source/Python/Workspace/WorkspaceCommon.py index 0b11ec2d59..913e710fd9 100644 --- a/BaseTools/Source/Python/Workspace/WorkspaceCommon.py +++ b/BaseTools/Source/Python/Workspace/WorkspaceCommon.py @@ -37,6 +37,8 @@ class OrderedListDict(OrderedDict): # def GetPackageList(Platform, BuildDatabase, Arch, Target, Toolchain): PkgSet =3D set() + if Platform.Packages: + PkgSet.update(Platform.Packages) for ModuleFile in Platform.Modules: Data =3D BuildDatabase[ModuleFile, Arch, Target, Toolchain] PkgSet.update(Data.Packages) diff --git a/BaseTools/Source/Python/Workspace/WorkspaceDatabase.py b/BaseT= ools/Source/Python/Workspace/WorkspaceDatabase.py index ab7b4506c1..9420eaa608 100644 --- a/BaseTools/Source/Python/Workspace/WorkspaceDatabase.py +++ b/BaseTools/Source/Python/Workspace/WorkspaceDatabase.py @@ -186,6 +186,10 @@ class WorkspaceDatabase(object): for Package in LibObj.Packages: if Package not in PackageList: PackageList.append(Package) + for Package in Pa.Packages: + if Package in PackageList: + continue + PackageList.append(Package) =20 return PackageList =20 --=20 2.14.1.windows.1 --_000_FAD0D7E0AE0FA54D987F6E72435CAFD50AFE03F5SHSMSX101ccrcor_ Content-Disposition: attachment; filename="winmail.dat" Content-Transfer-Encoding: base64 Content-Type: application/ms-tnef; name="winmail.dat" eJ8+IgdOAQaQCAAEAAAAAAABAAEAAQeQBgAIAAAA5AQAAAAAAADoAAEJgAEAIQAAAEFCNUQ0Njc1 NzlGNEU0NDk4MjgzREQ0MzJGRjI4RTBEAEcHAQ2ABAACAAAAAgACAAEFgAMADgAAAOMHCwAOAAEA GwAqAAQATQEBIIADAA4AAADjBwsADgABABsAKgAEAE0BAQiABwAYAAAASVBNLk1pY3Jvc29mdCBN YWlsLk5vdGUAMQgBBIABADgAAABbUEFUQ0ggVjJdIEJhc2VUb29sczpBZGQgW3BhY2thZ2VzXSBz ZWN0aW9uIGluIGRzYyBmaWxlAPwSAQuAAQAhAAAAQUI1RDQ2NzU3OUY0RTQ0OTgyODNERDQzMkZG MjhFMEQARwcBA5AGAOAiAAA5AAAAAgF/AAEAAABIAAAAPEZBRDBEN0UwQUUwRkE1NEQ5ODdGNkU3 MjQzNUNBRkQ1MEFGRTAzRjVAU0hTTVNYMTAxLmNjci5jb3JwLmludGVsLmNvbT4ACwAfDgEAAAAC AQkQAQAAAMsSAADHEgAATzsAAExaRnVus/XIYQAKZmJpZAQAAGNjwHBnMTI1MgD+A0PwdGV4dAH3 AqQD4wIABGNoCsBzZXQwIO8HbQKDAFARTTIKgAa0AoCWfQqACMg7CWIxOQ7AvwnDFnIKMhZxAoAV YioJsHMJ8ASQYXQFsg5QA2Bzom8BgCBFeBHBbhgwXQZSdgSQF7YCEHIAwHR9CFBuGjEQIAXABaAb ZGSaIANSIBAiF7JcdgiQ5HdrC4BkNR1TBPAHQA0XcDAKcRfyYmttawZzAZAAICBCTV9C4EVHSU59 CvwB8QvxER+wWjpoAkBwczrALy9idWd6AxALYCQudAcwbm8FoWUuAQWwZy9zaG93X0EiUS5jZ2k/ DdA9qDIyNwFAbAuAZQqBHSUUQwhwCXACMGx5IIBhIFBDRCAoI2CxJDAgRmUYgAhwZSahXikb0ABw IxAFQGIZ4HX/EgAcYAuAJnEb4Q3gIuACIH8HQCUFH2EQIAeAAjAo5ETAU0MvRkRGHHADEOsZ4APw dCPQdQVAJoAEYf51K/Eo8SxAGeAiUAMQHGCtCXBmBJAJ8GMLgGclBUctYiaiCrBja2EZ0UTURUMr wy4lDEEDoBAw/GFtC1AtETHyKrIYgCmhBy1RGIAcwG8gc3Vw/nAJES1RBAAo4AQgM4EHQCcJAAfg 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 eAAuAGYAYQBuAEAAaQBuAHQAZQBsAC4AYwBvAG0AAAAAAB8A5V8BAAAAMgAAAHMAaQBwADoAegBo AGkAagB1AHgALgBmAGEAbgBAAGkAbgB0AGUAbAAuAGMAbwBtAAAAAAAfABoMAQAAABgAAABGAGEA bgAsACAAWgBoAGkAagB1AFgAAAAfAB8MAQAAACoAAAB6AGgAaQBqAHUAeAAuAGYAYQBuAEAAaQBu AHQAZQBsAC4AYwBvAG0AAAAAAB8AHgwBAAAACgAAAFMATQBUAFAAAAAAAAIBGQwBAAAAZAAAAAAA AACBKx+kvqMQGZ1uAN0BD1QCAAAAgEYAYQBuACwAIABaAGgAaQBqAHUAWAAAAFMATQBUAFAAAAB6 AGgAaQBqAHUAeAAuAGYAYQBuAEAAaQBuAHQAZQBsAC4AYwBvAG0AAAAfAAFdAQAAACoAAAB6AGgA aQBqAHUAeAAuAGYAYQBuAEAAaQBuAHQAZQBsAC4AYwBvAG0AAAAAAB8A+D8BAAAAGAAAAEYAYQBu ACwAIABaAGgAaQBqAHUAWAAAAB8AI0ABAAAAKgAAAHoAaABpAGoAdQB4AC4AZgBhAG4AQABpAG4A dABlAGwALgBjAG8AbQAAAAAAHwAiQAEAAAAKAAAAUwBNAFQAUAAAAAAAAgH5PwEAAABkAAAAAAAA AIErH6S+oxAZnW4A3QEPVAIAAACARgBhAG4ALAAgAFoAaABpAGoAdQBYAAAAUwBNAFQAUAAAAHoA aABpAGoAdQB4AC4AZgBhAG4AQABpAG4AdABlAGwALgBjAG8AbQAAAB8ACV0BAAAAKgAAAHoAaABp AGoAdQB4AC4AZgBhAG4AQABpAG4AdABlAGwALgBjAG8AbQAAAAAACwBAOgEAAAAfABoAAQAAABIA AABJAFAATQAuAE4AbwB0AGUAAAAAAAMA8T8JBAAACwBAOgEAAAADAP0/5AQAAAIBCzABAAAAEAAA AKtdRnV59ORJgoPdQy/yjg0DABcAAQAAAEAAOQAAe5a1iprVAUAACDCVHvS1iprVAR8AAICGAwIA AAAAAMAAAAAAAABGAQAAAB4AAABhAGMAYwBlAHAAdABsAGEAbgBnAHUAYQBnAGUAAAAAAAEAAAAM AAAAZQBuAC0AVQBTAAAAHwA3AAEAAABwAAAAWwBQAEEAVABDAEgAIABWADIAXQAgAEIAYQBzAGUA VABvAG8AbABzADoAQQBkAGQAIABbAHAAYQBjAGsAYQBnAGUAcwBdACAAcwBlAGMAdABpAG8AbgAg AGkAbgAgAGQAcwBjACAAZgBpAGwAZQAAAB8APQABAAAAAgAAAAAAAAADADYAAAAAAAIBcQABAAAA FgAAAAHVmoqzPSWEt+kbOkLLl4bq+6Vo1vEAAB8AcAABAAAAcAAAAFsAUABBAFQAQwBIACAAVgAy AF0AIABCAGEAcwBlAFQAbwBvAGwAcwA6AEEAZABkACAAWwBwAGEAYwBrAGEAZwBlAHMAXQAgAHMA ZQBjAHQAaQBvAG4AIABpAG4AIABkAHMAYwAgAGYAaQBsAGUAAAAfADUQAQAAAJAAAAA8AEYAQQBE ADAARAA3AEUAMABBAEUAMABGAEEANQA0AEQAOQA4ADcARgA2AEUANwAyADQAMwA1AEMAQQBGAEQA NQAwAEEARgBFADAAMwBGADUAQABTAEgAUwBNAFMAWAAxADAAMQAuAGMAYwByAC4AYwBvAHIAcAAu AGkAbgB0AGUAbAAuAGMAbwBtAD4AAAADAN4/n04AAEAABzDRW++1iprVAQIBCwABAAAAEAAAAKtd RnV59ORJgoPdQy/yjg0DACYAAAAAAAIBRwABAAAAMwAAAGM9VVM7YT1NQ0k7cD1JbnRlbDtsPVNI U01TWDEwMS0xOTExMTQwMTI3NDJaLTE0MzI0AAACARAwAQAAAEYAAAAAAAAAJne9OTvsOEmkphU9 y6V7QgcA+tDX4K4PpU2Yf25yQ1yv1QAAAEQRXgAAppNoNoh2bEunStPrR5pMZAAACVTALgAAAAAf APo/AQAAABgAAABGAGEAbgAsACAAWgBoAGkAagB1AFgAAAADAAlZAQAAAEAAAIAIIAYAAAAAAMAA AAAAAABGAAAAAL+FAACQzbS0iprVAQsAAIAIIAYAAAAAAMAAAAAAAABGAAAAAIKFAAAAAAAAAgEA gAggBgAAAAAAwAAAAAAAAEYAAAAAQIUAAAEAAACCAQAAAwEBAAAAQQAAAAgAAAAAABEAQwBUAFAA QwBsAGEAcwBzAGkAZgBpAGMAYQB0AGkAbwBuABFDVFBDbGFzc2lmaWNhdGlvbgAAAAAAAAAAIwAA ABFDAFQAUABDAGwAYQBzAHMAaQBmAGkAYwBhAHQAaQBvAG4AAAAAAEEAAAAIAAAAAAAWAFQAaQB0 AHUAcwBDAFQAUABDAGwAYQBzAHMAaQBmAGkAYwBhAHQAaQBvAG4AFlRpdHVzQ1RQQ2xhc3NpZmlj YXRpb24AAAAAAAAAAC0AAAAWVABpAHQAdQBzAEMAVABQAEMAbABhAHMAcwBpAGYAaQBjAGEAdABp AG8AbgAAAAAAQQAAAAgAAAAAABMAWAAtAFQASQBUAFUAUwAtAE0AZQB0AGEAZABhAHQAYQAtADQA MAATWC1USVRVUy1NZXRhZGF0YS00MAAAAAAAAAAAJwAAABNYAC0AVABJAFQAVQBTAC0ATQBlAHQA YQBkAGEAdABhAC0ANAAwAAAAAAAAAAMAAIAIIAYAAAAAAMAAAAAAAABGAAAAAOuFAAAJBAAAHwAA gCkDAgAAAAAAwAAAAAAAAEYBAAAAJAAAAEMAVABQAEMAbABhAHMAcwBpAGYAaQBjAGEAdABpAG8A bgAAAAEAAAAOAAAAQwBUAFAAXwBOAFQAAAAAAB8AAICGAwIAAAAAAMAAAAAAAABGAQAAACgAAAB4 AC0AYwB0AHAAYwBsAGEAcwBzAGkAZgBpAGMAYQB0AGkAbwBuAAAAAQAAAA4AAABDAFQAUABfAE4A VAAAAAAAHwAAgIYDAgAAAAAAwAAAAAAAAEYBAAAAKAAAAHgALQB0AGkAdAB1AHMALQBtAGUAdABh AGQAYQB0AGEALQA0ADAAAAABAAAAUgMAAGUAeQBKAEQAWQBYAFIAbABaADIAOQB5AGUAVQB4AGgA WQBtAFYAcwBjAHkASQA2AEkAaQBJAHMASQBrADEAbABkAEcARgBrAFkAWABSAGgASQBqAHAANwBJ AG0ANQB6AEkAagBvAGkAYQBIAFIAMABjAEQAcABjAEwAMQB3AHYAZAAzAGQAMwBMAG4AUgBwAGQA SABWAHoATABtAE4AdgBiAFYAdwB2AGIAbgBOAGMATAAwAGwAdQBkAEcAVgBzAE0AeQBJAHMASQBt AGwAawBJAGoAbwBpAE4AVwBSAGgATQB6AEkAeQBaAGoASQB0AFkAMgBRADAAWQBpADAAMABNAEQA UgBqAEwAVABrADUATQBXAFkAdABPAEcATQB5AE0AVwBKAGkATQBqAFEAeABPAEQAWQB5AEkAaQB3 AGkAYwBIAEoAdgBjAEgATQBpAE8AbAB0ADcASQBtADQAaQBPAGkASgBEAFYARgBCAEQAYgBHAEYA egBjADIAbABtAGEAVwBOAGgAZABHAGwAdgBiAGkASQBzAEkAbgBaAGgAYgBIAE0AaQBPAGwAdAA3 AEkAbgBaAGgAYgBIAFYAbABJAGoAbwBpAFEAMQBSAFEAWAAwADUAVQBJAG4AMQBkAGYAVgAxADkA TABDAEoAVABkAFcASgBxAFoAVwBOADAAVABHAEYAaQBaAFcAeAB6AEkAagBwAGIAWABTAHcAaQBW AEUAMQBEAFYAbQBWAHkAYwAyAGwAdgBiAGkASQA2AEkAagBFADMATABqAEUAdwBMAGoARQA0AE0A RABRAHUATgBEAGsAaQBMAEMASgBVAGMAbgBWAHoAZABHAFYAawBUAEcARgBpAFoAVwB4AEkAWQBY AE4AbwBJAGoAbwBpAFkAawBWAE8ATQBWAEoARgBTAFgAYwAzAFMAVQB4AEcAVwBHAGQAcgBXAFgA TgAwAFEAVwB3AHcATgBGAFoAeQBZAHoAWgBTAGQAMwBoAHQAVAAzAHAAcwBOAEcAUgBTAGMAMAB4 AHYAZABVAGcAMABhAGwAZAB2AFYAMQBSAEwAYQB5AHQAWABiADAAeABxAE4AagBsAEYAZQBFAHgA RgBaAEQAWgA2AFUAeQBKADkAAAAAAB8AAICGAwIAAAAAAMAAAAAAAABGAQAAABgAAABkAGwAcAAt AHAAcgBvAGQAdQBjAHQAAAABAAAAGgAAAGQAbABwAGUALQB3AGkAbgBkAG8AdwBzAAAAAAAfAACA hgMCAAAAAADAAAAAAAAARgEAAAAYAAAAZABsAHAALQB2AGUAcgBzAGkAbwBuAAAAAQAAABIAAAAx ADEALgAyAC4AMAAuADYAAAAAAB8AAICGAwIAAAAAAMAAAAAAAABGAQAAABoAAABkAGwAcAAtAHIA ZQBhAGMAdABpAG8AbgAAAAAAAQAAABQAAABuAG8ALQBhAGMAdABpAG8AbgAAAAIBAIAIIAYAAAAA AMAAAAAAAABGAQAAADYAAABJAG4AVAByAGEAbgBzAGkAdABNAGUAcwBzAGEAZwBlAEMAbwByAHIA ZQBsAGEAdABvAHIAAAAAAAEAAAAQAAAAPivJoPpX2kSQQ3dwtBIQUwMADTT9PwAAHwAAgIYDAgAA AAAAwAAAAAAAAEYBAAAAIAAAAHgALQBtAHMALQBoAGEAcwAtAGEAdAB0AGEAYwBoAAAAAQAAAAIA AAAAAAAAHwAAgIYDAgAAAAAAwAAAAAAAAEYBAAAAIgAAAHgALQBvAHIAaQBnAGkAbgBhAHQAaQBu AGcALQBpAHAAAAAAAAEAAAAgAAAAWwAxADAALgAyADMAOQAuADEAMgA3AC4ANAAwAF0AAABMCg== --_000_FAD0D7E0AE0FA54D987F6E72435CAFD50AFE03F5SHSMSX101ccrcor_--