blob: 6291bea6a20ad99bf604d02c3d56654921680bc1 [file] [log] [blame]
David Pinedo1e368f72016-02-04 17:04:44 -07001# Copyright (c) 2015-2016 The Khronos Group Inc.
2# Copyright (c) 2015-2016 Valve Corporation
3# Copyright (c) 2015-2016 LunarG, Inc.
David Pinedoc21fdb92016-01-04 16:31:57 -07004#
Jon Ashburn3ebf1252016-04-19 11:30:31 -06005# Licensed under the Apache License, Version 2.0 (the "License");
6# you may not use this file except in compliance with the License.
7# You may obtain a copy of the License at
David Pinedoc21fdb92016-01-04 16:31:57 -07008#
Jon Ashburn3ebf1252016-04-19 11:30:31 -06009# http://www.apache.org/licenses/LICENSE-2.0
David Pinedoc21fdb92016-01-04 16:31:57 -070010#
Jon Ashburn3ebf1252016-04-19 11:30:31 -060011# Unless required by applicable law or agreed to in writing, software
12# distributed under the License is distributed on an "AS IS" BASIS,
13# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14# See the License for the specific language governing permissions and
15# limitations under the License.
David Pinedoc21fdb92016-01-04 16:31:57 -070016#
17# Author: David Pinedo <david@LunarG.com>
David Pinedo1e368f72016-02-04 17:04:44 -070018# Author: Mark Young <mark@LunarG.com>
David Pinedoc21fdb92016-01-04 16:31:57 -070019#
20
David Pinedo1e368f72016-02-04 17:04:44 -070021
David Pinedoc21fdb92016-01-04 16:31:57 -070022# This Powershell script is used by the Vulkan Run Time Installer/Uninstaller to:
23# - Copy the most recent vulkan-<majorabi>-*.dll in C:\Windows\System32
24# to vulkan-<majorabi>.dll
25# - Copy the most recent version of vulkaninfo-<abimajor>-*.exe in
26# C:\Windows\System32 to vulkaninfo.exe
Mark Young4b8b5482016-01-15 15:09:39 -070027# - The same thing is done for those files in C:\Windows\SysWOW64 on a 64-bit
28# target.
David Pinedoc21fdb92016-01-04 16:31:57 -070029# - Set the layer registry entries to point to the layer json files
30# in the Vulkan SDK associated with the most recent vulkan*dll.
31#
Mark Youngaf87f222016-01-20 16:33:18 -070032# This script takes the following parameters:
Mark Young4b8b5482016-01-15 15:09:39 -070033# $majorabi : a single string number specifying the major abi version.
Mark Youngaf87f222016-01-20 16:33:18 -070034# $ossize : an integer indicating if the target is a 64 (64) or 32 (32) bit OS.
David Pinedoc21fdb92016-01-04 16:31:57 -070035#
36
Mark Young4b8b5482016-01-15 15:09:39 -070037Param(
38 [string]$majorabi,
39 [int]$ossize
40)
David Pinedoc21fdb92016-01-04 16:31:57 -070041
David Pinedoef68bbe2016-03-29 13:46:12 -060042# Start logging
43$log=$Env:Temp+"\VulkanRT"
44New-Item -ItemType Directory -Force -Path $log | Out-Null
David Pinedoff291412016-03-29 16:26:50 -060045$logascii=$log+"\ConfigLayersAndVulkanDLL.log"
46$log=$log+"\ConfigLayersAndVulkanDLL16.log"
David Pinedoef68bbe2016-03-29 13:46:12 -060047echo "ConfigLayersAndVulkanDLL.ps1 $majorabi $ossize" >$log
48(Get-Date).ToString() >>$log
49
David Pinedoc21fdb92016-01-04 16:31:57 -070050$vulkandll = "vulkan-"+$majorabi+".dll"
Mark Young71e2a402016-02-12 12:07:45 -070051$windrive = $env:SYSTEMDRIVE
52$winfolder = $env:SYSTEMROOT
David Pinedod133b782016-03-16 14:41:56 -060053$script:VulkanDllList=@()
David Pinedoc21fdb92016-01-04 16:31:57 -070054
David Pinedoc27e0442016-03-15 11:07:19 -060055function notNumeric ($x) {
56 try {
57 0 + $x | Out-Null
58 return $false
59 } catch {
60 return $true
61 }
62}
63
David Pinedoc21fdb92016-01-04 16:31:57 -070064# The name of the versioned vulkan dll file is one of the following:
65#
David Pinedo3bdbe5d2016-01-12 16:14:53 -070066# vulkan-<majorabi>-<major>-<minor>-<patch>-<buildno>-<prerelease>-<prebuildno>
67# vulkan-<majorabi>-<major>-<minor>-<patch>-<buildno>-<prerelease>
68# vulkan-<majorabi>-<major>-<minor>-<patch>-<buildno>-<prebuildno>
David Pinedoc21fdb92016-01-04 16:31:57 -070069# vulkan-<majorabi>-<major>-<minor>-<patch>-<buildno>.dll
David Pinedoc21fdb92016-01-04 16:31:57 -070070#
David Pinedo3bdbe5d2016-01-12 16:14:53 -070071# <major>, <minor>, <patch>, <buildno> and <prebuildno> are 1 to 10 numeric digits.
72# <prerelease> is any combination of alpha and numeric characters.
73# If <prerelease> and/or <prebuildno> are present, this identifies a prerelease,
74# and the vulkan dll file will be considered less recent than one with the same
75# <major>, <minor>, <patch>, <buildno> numbers without the <prerelease> and/or
76# <prebuildno>.
David Pinedoc21fdb92016-01-04 16:31:57 -070077
78
79# We first create an array, with one array element for each vulkan-*dll in
Mark Young4b8b5482016-01-15 15:09:39 -070080# C:\Windows\System32 (and C:\Windows\SysWOW64 on 64-bit systems), with each element
81# containing:
David Pinedo1df3ecd2016-04-04 11:43:50 -060082# <major>=<minor>=<patch>=<buildno>=<prebuildno>=<prerelease>=
David Pinedoc21fdb92016-01-04 16:31:57 -070083# filename
David Pinedo3bdbe5d2016-01-12 16:14:53 -070084# @<major>@<minor>@<patch>@<buildno>@<prerelease>@<prebuildno>@
David Pinedoc21fdb92016-01-04 16:31:57 -070085# [Note that the above three lines are one element in the array.]
86# The build identifiers separated by "=" are suitable for sorting, i.e.
David Pinedo3bdbe5d2016-01-12 16:14:53 -070087# expanded to 10 digits with leading 0s. If <prerelease> or <prebuildno> are
88# not specified, "zzzzzzzzzz" is substituted for them, so that they sort
David Pinedo1df3ecd2016-04-04 11:43:50 -060089# to a position after those that do specify them. Note that <prerelease>
90# is "less significant" in the sort than <prebuildno>, and that <prerelease> is
91# always treated as an alpha string, even though it may contain numeric characters.
David Pinedoc21fdb92016-01-04 16:31:57 -070092# The build identifiers separated by "@" are the original values extracted
93# from the file name. They are used later to find the path to the SDK
94# install directory for the given filename.
95
David Pinedoc27e0442016-03-15 11:07:19 -060096
Mark Youngd6897a32016-01-20 14:48:21 -070097function UpdateVulkanSysFolder([string]$dir, [int]$writeSdkName)
Mark Younga81e6082016-01-15 12:35:39 -070098{
David Pinedoef68bbe2016-03-29 13:46:12 -060099 echo "UpdateVulkanSysFolder $dir $writeSdkName" >>$log
100
Mark Younga81e6082016-01-15 12:35:39 -0700101 # Push the current path on the stack and go to $dir
102 Push-Location -Path $dir
David Pinedo1e368f72016-02-04 17:04:44 -0700103
David Pinedod133b782016-03-16 14:41:56 -0600104 # Create a list for all the DLLs in the folder.
105 # First Initialize the list to empty
106 $script:VulkanDllList = @()
David Pinedo1e368f72016-02-04 17:04:44 -0700107
David Pinedoef68bbe2016-03-29 13:46:12 -0600108 # Find all vulkan dll files in this directory
Mark Younga81e6082016-01-15 12:35:39 -0700109 dir -name vulkan-$majorabi-*.dll |
David Pinedoc21fdb92016-01-04 16:31:57 -0700110 ForEach-Object {
David Pinedoef68bbe2016-03-29 13:46:12 -0600111 echo "File $_" >>$log
David Pinedoc27e0442016-03-15 11:07:19 -0600112 if ($_ -match "=" -or
113 $_ -match "@" -or
114 $_ -match " " -or
115 ($_.Split('-').count -lt 6) -or
116 ($_.Split('-').count -gt 8))
117 {
118 # If a file name contains "=", "@", or " ", or it contains less then 5 dashes or more than
119 # 7 dashes, it wasn't installed by the Vulkan Run Time.
120 # Note that we need to use return inside of ForEach-Object is to continue with iteration.
David Pinedoef68bbe2016-03-29 13:46:12 -0600121 echo "Rejected $_ - bad format" >>$log
David Pinedoc27e0442016-03-15 11:07:19 -0600122 return
123 }
David Pinedoef68bbe2016-03-29 13:46:12 -0600124
125 # If the corresponding vulkaninfo is not present, it wasn't installed by the Vulkan Run Time
126 $vulkaninfo=$_ -replace ".dll",".exe"
127 $vulkaninfo=$vulkaninfo -replace "vulkan","vulkaninfo"
128 if (-not (Test-Path $vulkaninfo)) {
129 echo "Rejected $_ - vulkaninfo not present" >>$log
130 return
131 }
132
David Pinedoc21fdb92016-01-04 16:31:57 -0700133 $major=$_.Split('-')[2]
134 $majorOrig=$major
135 $minor=$_.Split('-')[3]
136 $minorOrig=$minor
137 $patch=$_.Split('-')[4]
David Pinedo3bdbe5d2016-01-12 16:14:53 -0700138 $patchOrig=$patch
139 $buildno=$_.Split('-')[5]
David Pinedoc21fdb92016-01-04 16:31:57 -0700140
David Pinedo3bdbe5d2016-01-12 16:14:53 -0700141 if ($buildno -match ".dll") {
David Pinedoc27e0442016-03-15 11:07:19 -0600142 # prerelease and prebuildno are not in the name
143 # Extract buildno, and set prerelease and prebuildno to "z"s
144 $buildno=$buildno -replace ".dll",""
145 $buildnoOrig=$buildno
146 $prerelease="z"*10
147 $prereleaseOrig=""
148 $prebuildno="z"*10
149 $prebuildnoOrig=""
David Pinedoc21fdb92016-01-04 16:31:57 -0700150 } else {
David Pinedoc27e0442016-03-15 11:07:19 -0600151 # Extract buildno, prerelease, and prebuildno
David Pinedoc21fdb92016-01-04 16:31:57 -0700152 $f=$_ -replace ".dll",""
David Pinedo3bdbe5d2016-01-12 16:14:53 -0700153 $buildno=$f.Split('-')[5]
David Pinedo5da20dd2016-01-13 16:22:19 -0700154 $buildnoOrig=$buildno
David Pinedo3bdbe5d2016-01-12 16:14:53 -0700155 $prerelease=$f.Split('-')[6]
156 $prebuildno=$f.Split('-')[7]
157 if ($prebuildno.Length -eq 0) {
David Pinedoc21fdb92016-01-04 16:31:57 -0700158 if ($prerelease -match "^[0-9]") {
David Pinedo3bdbe5d2016-01-12 16:14:53 -0700159 # prerelease starts with a digit, it must be the prebuildno
160 $prebuildno=$prerelease
David Pinedoc21fdb92016-01-04 16:31:57 -0700161 $prerelease=""
162 }
163 }
David Pinedoc21fdb92016-01-04 16:31:57 -0700164 $prereleaseOrig=$prerelease
David Pinedo3bdbe5d2016-01-12 16:14:53 -0700165 $prebuildnoOrig=$prebuildno
David Pinedoc21fdb92016-01-04 16:31:57 -0700166
167 if ($prerelease.Length -eq 0) {
168 $prerelease="z"*10
169 }
David Pinedo3bdbe5d2016-01-12 16:14:53 -0700170 if ($prebuildno.Length -eq 0) {
171 $prebuildno="z"*10
David Pinedoc21fdb92016-01-04 16:31:57 -0700172 }
173 }
David Pinedoef68bbe2016-03-29 13:46:12 -0600174 echo "Version $majorOrig $minorOrig $patchOrig $buildnoOrig $prereleaseOrig $prebuildnoOrig" >>$log
David Pinedoc21fdb92016-01-04 16:31:57 -0700175
David Pinedoc27e0442016-03-15 11:07:19 -0600176 # Make sure fields that are supposed to be numbers are numbers
David Pinedoef68bbe2016-03-29 13:46:12 -0600177 if (notNumeric($major)) {
178 echo "Rejected $_ - bad major" >>$log
179 return
180 }
181 if (notNumeric($minor)) {
182 echo "Rejected $_ - bad minor" >>$log
183 return
184 }
185 if (notNumeric($patch)) {
186 echo "Rejected $_ - bad patch" >>$log
187 return
188 }
189 if (notNumeric($buildno)) {
190 echo "Rejected $_ - bad buildno" >>$log
191 return
192 }
David Pinedoc27e0442016-03-15 11:07:19 -0600193 if (notNumeric($prebuildno)) {
David Pinedoef68bbe2016-03-29 13:46:12 -0600194 if ($prebuildno -ne "z"*10) {
195 echo "Rejected $_ - bad prebuildno" >>$log
196 return
197 }
David Pinedoc27e0442016-03-15 11:07:19 -0600198 }
199
David Pinedoc21fdb92016-01-04 16:31:57 -0700200 $major = $major.padleft(10,'0')
201 $minor = $minor.padleft(10,'0')
202 $patch = $patch.padleft(10,'0')
David Pinedoc21fdb92016-01-04 16:31:57 -0700203 $buildno = $buildno.padleft(10,'0')
David Pinedo1df3ecd2016-04-04 11:43:50 -0600204 $prerelease = $prerelease.padright(10,'z')
David Pinedo3bdbe5d2016-01-12 16:14:53 -0700205 $prebuildno = $prebuildno.padleft(10,'0')
David Pinedoc21fdb92016-01-04 16:31:57 -0700206
207 # Add a new element to the $VulkanDllList array
David Pinedoef68bbe2016-03-29 13:46:12 -0600208 echo "Adding $_ to Vulkan dll list " >>$log
David Pinedo1df3ecd2016-04-04 11:43:50 -0600209 $script:VulkanDllList+="$major=$minor=$patch=$buildno=$prebuildno=$prerelease= $_ @$majorOrig@$minorOrig@$patchOrig@$buildnoOrig@$prereleaseOrig@$prebuildnoOrig@"
David Pinedoc21fdb92016-01-04 16:31:57 -0700210 }
211
Mark Younga81e6082016-01-15 12:35:39 -0700212 # If $VulkanDllList contains at least one element, there's at least one vulkan*.dll file.
213 # Copy the most recent vulkan*.dll (named in the last element of $VulkanDllList) to vulkan-$majorabi.dll.
David Pinedoc21fdb92016-01-04 16:31:57 -0700214
David Pinedod133b782016-03-16 14:41:56 -0600215 if ($script:VulkanDllList.Length -gt 0) {
David Pinedoc21fdb92016-01-04 16:31:57 -0700216
Mark Younga81e6082016-01-15 12:35:39 -0700217 # Sort the list. The most recent vulkan-*.dll will be in the last element of the list.
David Pinedod133b782016-03-16 14:41:56 -0600218 [array]::sort($script:VulkanDllList)
David Pinedoc21fdb92016-01-04 16:31:57 -0700219
Mark Younga81e6082016-01-15 12:35:39 -0700220 # Put the name of the most recent vulkan-*.dll in $mrVulkanDLL.
221 # The most recent vulkanDLL is the second word in the last element of the
222 # sorted $VulkanDllList. Copy it to $vulkandll.
David Pinedod133b782016-03-16 14:41:56 -0600223 $mrVulkanDll=$script:VulkanDllList[-1].Split(' ')[1]
David Pinedoef68bbe2016-03-29 13:46:12 -0600224 echo "copy $mrVulkanDll $vulkandll" >>$log
Mark Younga81e6082016-01-15 12:35:39 -0700225 copy $mrVulkanDll $vulkandll
David Pinedoc21fdb92016-01-04 16:31:57 -0700226
Mark Younga81e6082016-01-15 12:35:39 -0700227 # Copy the most recent version of vulkaninfo-<abimajor>-*.exe to vulkaninfo.exe.
228 # We create the source file name for the copy from $mrVulkanDll.
229 $mrVulkaninfo=$mrVulkanDll -replace ".dll",".exe"
230 $mrVulkaninfo=$mrVulkaninfo -replace "vulkan","vulkaninfo"
David Pinedoef68bbe2016-03-29 13:46:12 -0600231 echo "copy $mrVulkaninfo vulkaninfo.exe" >>$log
Mark Younga81e6082016-01-15 12:35:39 -0700232 copy $mrVulkaninfo vulkaninfo.exe
David Pinedo1e368f72016-02-04 17:04:44 -0700233
Mark Younga81e6082016-01-15 12:35:39 -0700234 # Create the name used in the registry for the SDK associated with $mrVulkanDll.
David Pinedod133b782016-03-16 14:41:56 -0600235 $major=$script:VulkanDllList[-1].Split('@')[1]
236 $minor=$script:VulkanDllList[-1].Split('@')[2]
237 $patch=$script:VulkanDllList[-1].Split('@')[3]
238 $buildno=$script:VulkanDllList[-1].Split('@')[4]
239 $prerelease=$script:VulkanDllList[-1].Split('@')[5]
240 $prebuildno=$script:VulkanDllList[-1].Split('@')[6]
David Pinedo1e368f72016-02-04 17:04:44 -0700241
Mark Youngd6897a32016-01-20 14:48:21 -0700242 $sdktempname="VulkanSDK"+$major + "." + $minor + "." + $patch + "." + $buildno
Mark Younga81e6082016-01-15 12:35:39 -0700243 if ($prerelease -ne "") {
Mark Youngd6897a32016-01-20 14:48:21 -0700244 $sdktempname=$sdktempname + "." + $prerelease
Mark Younga81e6082016-01-15 12:35:39 -0700245 }
246 if ($prebuildno -ne "") {
Mark Youngd6897a32016-01-20 14:48:21 -0700247 $sdktempname=$sdktempname + "." + $prebuildno
Mark Younga81e6082016-01-15 12:35:39 -0700248 }
David Pinedoef68bbe2016-03-29 13:46:12 -0600249 echo "sdkname = $sdktempname" >>$log
David Pinedoc21fdb92016-01-04 16:31:57 -0700250 }
David Pinedo1e368f72016-02-04 17:04:44 -0700251
Mark Youngd6897a32016-01-20 14:48:21 -0700252 # Return to our previous folder
253 Pop-Location
254
255 # Only update the overall script-scope SDK name if we're told to
256 if ($writeSdkName -ne 0) {
257 $script:sdkname = $sdktempname
258 }
259
260 return
David Pinedoc21fdb92016-01-04 16:31:57 -0700261}
262
Mark Young4b8b5482016-01-15 15:09:39 -0700263# We only care about SYSWOW64 if we're targeting a 64-bit OS
Mark Youngb628d162016-01-19 15:29:34 -0700264if ($ossize -eq 64) {
Mark Young4b8b5482016-01-15 15:09:39 -0700265 # Update the SYSWOW64 Vulkan DLLS/EXEs
David Pinedoef68bbe2016-03-29 13:46:12 -0600266 echo "Calling UpdateVulkanSysFolder $winfolder\SYSWOW64 0" >>$log
Mark Young71e2a402016-02-12 12:07:45 -0700267 UpdateVulkanSysFolder $winfolder\SYSWOW64 0
Mark Young4b8b5482016-01-15 15:09:39 -0700268}
269
270# Update the SYSTEM32 Vulkan DLLS/EXEs
David Pinedoef68bbe2016-03-29 13:46:12 -0600271echo "Calling UpdateVulkanSysFolder $winfolder\SYSTEM32 1" >>$log
Mark Young71e2a402016-02-12 12:07:45 -0700272UpdateVulkanSysFolder $winfolder\SYSTEM32 1
David Pinedoc21fdb92016-01-04 16:31:57 -0700273
274# Create an array of vulkan sdk install dirs
275
David Pinedoef68bbe2016-03-29 13:46:12 -0600276echo "Creating array of of Vulkan SDK Install dirs" >>$log
David Pinedoc21fdb92016-01-04 16:31:57 -0700277$mrVulkanDllInstallDir=""
278$VulkanSdkDirs=@()
David Pinedo1e368f72016-02-04 17:04:44 -0700279Get-ChildItem -Path Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall |
David Pinedoc21fdb92016-01-04 16:31:57 -0700280 ForEach-Object {
281 $regkey=$_ -replace ".*\\",""
282 if ($_ -match "\\VulkanSDK") {
283 # Get the install path from UninstallString
284 $tmp=Get-ItemProperty -Path Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$regkey -Name UninstallString
285 $tmp=$tmp -replace "\\Uninstall.exe.*",""
286 $tmp=$tmp -replace ".*=.",""
David Pinedoef68bbe2016-03-29 13:46:12 -0600287 echo "Adding $tmp to VulkanSDKDirs" >>$log
David Pinedoc21fdb92016-01-04 16:31:57 -0700288 $VulkanSdkDirs+=$tmp
Mark Youngd6897a32016-01-20 14:48:21 -0700289 if ($regkey -eq $script:sdkname) {
David Pinedoc21fdb92016-01-04 16:31:57 -0700290 # Save away the sdk install dir for the the most recent vulkandll
David Pinedoef68bbe2016-03-29 13:46:12 -0600291 echo "Setting mrVulkanDllInstallDir to $tmp" >>$log
David Pinedoc21fdb92016-01-04 16:31:57 -0700292 $mrVulkanDllInstallDir=$tmp
293 }
294 }
295 }
296
David Pinedod133b782016-03-16 14:41:56 -0600297
298# Search list of sdk install dirs for an sdk compatible with $script:sdkname.
299# We go backwards through VulkanDllList to generate SDK names, because we want the most recent SDK.
300if ($mrVulkanDllInstallDir -eq "") {
David Pinedoef68bbe2016-03-29 13:46:12 -0600301 echo "Searching VulkanDllList" >>$log
David Pinedod133b782016-03-16 14:41:56 -0600302 ForEach ($idx in ($script:VulkanDllList.Length-1)..0) {
David Pinedoef68bbe2016-03-29 13:46:12 -0600303 $tmp=$script:VulkanDllList[$idx]
David Pinedod133b782016-03-16 14:41:56 -0600304 $vulkanDllMajor=$script:VulkanDllList[$idx].Split('@')[1]
305 $vulkanDllMinor=$script:VulkanDllList[$idx].Split('@')[2]
306 $vulkanDllPatch=$script:VulkanDllList[$idx].Split('@')[3]
307 $vulkanDllBuildno=$script:VulkanDllList[$idx].Split('@')[4]
308 $vulkanDllPrerelease=$script:VulkanDllList[$idx].Split('@')[5]
309 $vulkanDllPrebuildno=$script:VulkanDllList[$idx].Split('@')[6]
310 $regEntry="VulkanSDK"+$vulkanDllMajor+"."+$vulkanDllMinor+"."+$vulkanDllPatch+"."+$vulkanDllBuildno
311 if ($vulkanDllPrerelease) {
312 $regEntry=$regEntry+"."+$vulkanDllPrerelease
313 }
314 if ($vulkanDllPrebuildno) {
315 $regEntry=$regEntry+"."+$vulkanDllPrebuildno
316 }
David Pinedoef68bbe2016-03-29 13:46:12 -0600317 echo "Comparing $regEntry" >>$log
David Pinedod133b782016-03-16 14:41:56 -0600318 $rval=Get-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$regEntry -ErrorAction SilentlyContinue
319 $instDir=$rval
320 $instDir=$instDir -replace "\\Uninstall.exe.*",""
321 $instDir=$instDir -replace ".*=.",""
322 if ($rval) {
323 $rval=$rval -replace ".* DisplayVersion=",""
324 $rval=$rval -replace ";.*",""
325 $reMajor=$rval.Split('.')[0]
326 $reMinor=$rval.Split('.')[1]
327 $rePatch=$rval.Split('.')[2]
328 if ($reMajor+$reMinor+$rePatch -eq $vulkanDllMajor+$vulkanDllMinor+$vulkanDllPatch) {
David Pinedoef68bbe2016-03-29 13:46:12 -0600329 echo "Setting mrVulkanDllInstallDir to $instDir" >>$log
David Pinedod133b782016-03-16 14:41:56 -0600330 $mrVulkanDllInstallDir=$instDir
331 break
332 }
333 }
334 }
335}
336
David Pinedoc21fdb92016-01-04 16:31:57 -0700337# Add C:\Vulkan\SDK\0.9.3 to list of SDK install dirs.
338# We do this because there is in a bug in SDK 0.9.3 in which layer
339# reg entries were not removed on uninstall. So we'll try to clean up
340# and remove them now.
341# This works only if 0.9.3 was installed to the default location.
342# If it was not installed to the default location, those entries will
343# need to be cleaned up manually.
344
345$VulkanSdkDirs+="C:\VulkanSDK\0.9.3"
Mark Young71e2a402016-02-12 12:07:45 -0700346$VulkanSdkDirs+="$windrive\VulkanSDK\0.9.3"
David Pinedoc21fdb92016-01-04 16:31:57 -0700347
David Pinedo84f946e2016-04-07 15:54:59 -0600348# Remove layer registry values associated with all installed Vulkan SDKs.
David Pinedoc21fdb92016-01-04 16:31:57 -0700349# Note that we remove only those entries created by Vulkan SDKs. If other
350# layers were installed that are not from an SDK, we don't mess with them.
351
David Pinedo84f946e2016-04-07 15:54:59 -0600352echo "Removing old layer registry values from HKLM\SOFTWARE\Khronos\Vulkan\ExplicitLayers" >>$log
David Pinedoc21fdb92016-01-04 16:31:57 -0700353Get-Item -Path Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Khronos\Vulkan\ExplicitLayers | Select-Object -ExpandProperty Property |
354 ForEach-Object {
355 $regval=$_
356 ForEach ($sdkdir in $VulkanSdkDirs) {
357 if ($regval -like "$sdkdir\*.json") {
David Pinedo9bb478f2016-01-19 21:19:11 -0700358 Remove-ItemProperty -ErrorAction SilentlyContinue -Path HKLM:\SOFTWARE\Khronos\Vulkan\ExplicitLayers -name $regval
David Pinedo84f946e2016-04-07 15:54:59 -0600359 echo "Removed registry value $regval" >>$log
David Pinedoc21fdb92016-01-04 16:31:57 -0700360 }
361 }
362 }
David Pinedo84f946e2016-04-07 15:54:59 -0600363# Remove 32-bit layer registry value if we're targeting a 64-bit OS
Mark Youngb628d162016-01-19 15:29:34 -0700364if ($ossize -eq 64) {
365 Get-Item -Path Registry::HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Khronos\Vulkan\ExplicitLayers | Select-Object -ExpandProperty Property |
366 ForEach-Object {
367 $regval=$_
368 ForEach ($sdkdir in $VulkanSdkDirs) {
369 if ($regval -like "$sdkdir\*.json") {
Mark Youngd6897a32016-01-20 14:48:21 -0700370 Remove-ItemProperty -ErrorAction SilentlyContinue -Path HKLM:\SOFTWARE\WOW6432Node\Khronos\Vulkan\ExplicitLayers -name $regval
David Pinedo84f946e2016-04-07 15:54:59 -0600371 echo "Removed WOW6432Node registry value $regval" >>$log
Mark Youngb628d162016-01-19 15:29:34 -0700372 }
373 }
374 }
375}
David Pinedoc21fdb92016-01-04 16:31:57 -0700376
377
David Pinedo84f946e2016-04-07 15:54:59 -0600378# Create layer registry values associated with Vulkan SDK from which $mrVulkanDll is from
David Pinedoc21fdb92016-01-04 16:31:57 -0700379
David Pinedo84f946e2016-04-07 15:54:59 -0600380echo "Creating new layer registry values" >>$log
David Pinedoc21fdb92016-01-04 16:31:57 -0700381if ($mrVulkanDllInstallDir -ne "") {
David Pinedo84f946e2016-04-07 15:54:59 -0600382
383 # Create registry keys if they don't exist
384 if (-not (Test-Path -Path HKLM:\SOFTWARE\Khronos\Vulkan\ExplicitLayers)) {
385 echo "Creating new registry key HKLM\SOFTWARE\Khronos\Vulkan\ExplicitLayers" >>$log
386 New-Item -Force -ErrorAction SilentlyContinue -Path HKLM:\SOFTWARE\Khronos\Vulkan\ExplicitLayers | out-null
387 }
388 if ($ossize -eq 64) {
389 if (-not (Test-Path -Path HKLM:\SOFTWARE\WOW6432Node\Khronos\Vulkan\ExplicitLayers)) {
390 echo "Creating new registry key HKLM\SOFTWARE\WOW6432Node\Khronos\Vulkan\ExplicitLayers" >>$log
391 New-Item -Force -ErrorAction SilentlyContinue -Path HKLM:\SOFTWARE\WOW6432Node\Khronos\Vulkan\ExplicitLayers | out-null
392 }
393 }
394
395
Mark Youngb628d162016-01-19 15:29:34 -0700396 if ($ossize -eq 64) {
Mark Young51d35072016-02-09 15:30:34 -0700397
David Pinedo84f946e2016-04-07 15:54:59 -0600398 # Create registry values in normal registry location for 64-bit items on a 64-bit OS
Mark Young51d35072016-02-09 15:30:34 -0700399 Get-ChildItem $mrVulkanDllInstallDir\Bin -Filter VkLayer*json |
400 ForEach-Object {
David Pinedo84f946e2016-04-07 15:54:59 -0600401 echo "Creating registry value $mrVulkanDllInstallDir\Bin\$_" >>$log
Mark Young51d35072016-02-09 15:30:34 -0700402 New-ItemProperty -Path HKLM:\SOFTWARE\Khronos\Vulkan\ExplicitLayers -Name $mrVulkanDllInstallDir\Bin\$_ -PropertyType DWord -Value 0 | out-null
403 }
404
David Pinedo84f946e2016-04-07 15:54:59 -0600405 # Create registry values for the WOW6432Node registry location for 32-bit items on a 64-bit OS
David Pinedo431b82a2016-02-05 09:48:26 -0700406 Get-ChildItem $mrVulkanDllInstallDir\Bin32 -Filter VkLayer*json |
Mark Youngb628d162016-01-19 15:29:34 -0700407 ForEach-Object {
David Pinedo84f946e2016-04-07 15:54:59 -0600408 echo "Creating WOW6432Node registry value $mrVulkanDllInstallDir\Bin32\$_" >>$log
Mark Youngd6897a32016-01-20 14:48:21 -0700409 New-ItemProperty -Path HKLM:\SOFTWARE\WOW6432Node\Khronos\Vulkan\ExplicitLayers -Name $mrVulkanDllInstallDir\Bin32\$_ -PropertyType DWord -Value 0 | out-null
Mark Youngb628d162016-01-19 15:29:34 -0700410 }
Mark Young51d35072016-02-09 15:30:34 -0700411
412 } else {
413
David Pinedo84f946e2016-04-07 15:54:59 -0600414 # Create registry values in normal registry location for 32-bit items on a 32-bit OS
Mark Young51d35072016-02-09 15:30:34 -0700415 Get-ChildItem $mrVulkanDllInstallDir\Bin32 -Filter VkLayer*json |
416 ForEach-Object {
David Pinedo84f946e2016-04-07 15:54:59 -0600417 echo "Creating registry value $mrVulkanDllInstallDir\Bin\$_" >>$log
Mark Young51d35072016-02-09 15:30:34 -0700418 New-ItemProperty -Path HKLM:\SOFTWARE\Khronos\Vulkan\ExplicitLayers -Name $mrVulkanDllInstallDir\Bin32\$_ -PropertyType DWord -Value 0 | out-null
419 }
420
Mark Youngb628d162016-01-19 15:29:34 -0700421 }
David Pinedoc21fdb92016-01-04 16:31:57 -0700422}
David Pinedo0b5e2082016-03-22 14:33:50 -0600423
David Pinedoff291412016-03-29 16:26:50 -0600424# Final log output
David Pinedoef68bbe2016-03-29 13:46:12 -0600425echo "ConfigLayersAndVulkanDLL.ps1 completed" >>$log
426(Get-Date).ToString() >>$log
427
David Pinedoff291412016-03-29 16:26:50 -0600428# Convert logfile to ascii
429cat $log | out-File -encoding ascii -filepath $logascii
430remove-item $log
431
David Pinedoef68bbe2016-03-29 13:46:12 -0600432
433
David Pinedo0b5e2082016-03-22 14:33:50 -0600434# SIG # Begin signature block
435# MIIcZgYJKoZIhvcNAQcCoIIcVzCCHFMCAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB
436# gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR
David Pinedo84f946e2016-04-07 15:54:59 -0600437# AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUQ4I+TKoMwtXHArekRd5/bX04
438# sreggheVMIIFHjCCBAagAwIBAgIQDmYEpPtQ2iBY4vC2AGq6uzANBgkqhkiG9w0B
David Pinedo0b5e2082016-03-22 14:33:50 -0600439# AQsFADByMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYD
440# VQQLExB3d3cuZGlnaWNlcnQuY29tMTEwLwYDVQQDEyhEaWdpQ2VydCBTSEEyIEFz
441# c3VyZWQgSUQgQ29kZSBTaWduaW5nIENBMB4XDTE1MDQzMDAwMDAwMFoXDTE2MDcw
442# NjEyMDAwMFowZTELMAkGA1UEBhMCVVMxETAPBgNVBAgTCENvbG9yYWRvMRUwEwYD
443# VQQHEwxGb3J0IENvbGxpbnMxFTATBgNVBAoTDEx1bmFyRywgSW5jLjEVMBMGA1UE
444# AxMMTHVuYXJHLCBJbmMuMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA
445# jaLJm/Joxsn/IeopiGY3XPeSZeIhjSjSlQUkDyIyDGcBG7CvfiSsXIw3EgdGkjQg
446# yBcW5YsPz9bPGPUjo5go7CwZaRkhW7/LmSkAlx0UAv8EMLuJrAZ3jBNZvpPPqfWd
447# zgi/Rkm2gWQ6eSKouy7IjcLk+EwkeBbB+UBnYfMp0BfCPzR3mPgGAJH6efAmEaqQ
448# FBCrX97joYgDqp3v8u42jALLl/Ict/GNMHLxP+QWagIHIICCRgS6s02OsildLF6R
449# nqJOOG/43f2qUD4Cab65kzlI+0+uQyOl1UlxNxp0XareghGTqECsYA03j64Esxyo
450# 2xrNbV2LJm9crTX6QthxywIDAQABo4IBuzCCAbcwHwYDVR0jBBgwFoAUWsS5eyoK
451# o6XqcQPAYPkt9mV1DlgwHQYDVR0OBBYEFOSdVsqodGWApfCjHtAcn8sAzLBGMA4G
452# A1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzB3BgNVHR8EcDBuMDWg
453# M6Axhi9odHRwOi8vY3JsMy5kaWdpY2VydC5jb20vc2hhMi1hc3N1cmVkLWNzLWcx
454# LmNybDA1oDOgMYYvaHR0cDovL2NybDQuZGlnaWNlcnQuY29tL3NoYTItYXNzdXJl
455# ZC1jcy1nMS5jcmwwQgYDVR0gBDswOTA3BglghkgBhv1sAwEwKjAoBggrBgEFBQcC
456# ARYcaHR0cHM6Ly93d3cuZGlnaWNlcnQuY29tL0NQUzCBhAYIKwYBBQUHAQEEeDB2
457# MCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5jb20wTgYIKwYBBQUH
458# MAKGQmh0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFNIQTJBc3N1
459# cmVkSURDb2RlU2lnbmluZ0NBLmNydDAMBgNVHRMBAf8EAjAAMA0GCSqGSIb3DQEB
460# CwUAA4IBAQCIt1S8zfvzMQEVmdAssjrwqBaq78xhtGPLjkNF06EvtWoV6VMLI/A6
461# 45KoULsaXeYuszLxNI+OT/b4HfD0e2LxImaTDZRmCLeIs+2pMLSlWDSV4okm8Vk2
462# rObLBlgiI1x0PiMa1le9D832COWM4EJcH7pxM+9JfiHYMLlZbcfNEVgv6Dhhl4MG
463# mOTMTl7vQNNQaJ1coNVf9m5Bez1DV9Iu2Cgd8BHp1oLVCQCHjVv0Ifj48RIPi4SQ
464# khzalrnrf+L/BWRDhpLnxYasazdV5WfrMHurPuBvYUiLQNkU9SqKgRk9XrzDAfMe
465# gPbGybMr0kqtbE/A/cDcTVnvRuTZnhXSMIIFMDCCBBigAwIBAgIQBAkYG1/Vu2Z1
466# U0O1b5VQCDANBgkqhkiG9w0BAQsFADBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMM
467# RGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQD
468# ExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMTMxMDIyMTIwMDAwWhcN
469# MjgxMDIyMTIwMDAwWjByMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQg
470# SW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMTEwLwYDVQQDEyhEaWdpQ2Vy
471# dCBTSEEyIEFzc3VyZWQgSUQgQ29kZSBTaWduaW5nIENBMIIBIjANBgkqhkiG9w0B
472# AQEFAAOCAQ8AMIIBCgKCAQEA+NOzHH8OEa9ndwfTCzFJGc/Q+0WZsTrbRPV/5aid
473# 2zLXcep2nQUut4/6kkPApfmJ1DcZ17aq8JyGpdglrA55KDp+6dFn08b7KSfH03sj
474# lOSRI5aQd4L5oYQjZhJUM1B0sSgmuyRpwsJS8hRniolF1C2ho+mILCCVrhxKhwjf
475# DPXiTWAYvqrEsq5wMWYzcT6scKKrzn/pfMuSoeU7MRzP6vIK5Fe7SrXpdOYr/mzL
476# fnQ5Ng2Q7+S1TqSp6moKq4TzrGdOtcT3jNEgJSPrCGQ+UpbB8g8S9MWOD8Gi6CxR
477# 93O8vYWxYoNzQYIH5DiLanMg0A9kczyen6Yzqf0Z3yWT0QIDAQABo4IBzTCCAckw
478# EgYDVR0TAQH/BAgwBgEB/wIBADAOBgNVHQ8BAf8EBAMCAYYwEwYDVR0lBAwwCgYI
479# KwYBBQUHAwMweQYIKwYBBQUHAQEEbTBrMCQGCCsGAQUFBzABhhhodHRwOi8vb2Nz
480# cC5kaWdpY2VydC5jb20wQwYIKwYBBQUHMAKGN2h0dHA6Ly9jYWNlcnRzLmRpZ2lj
481# ZXJ0LmNvbS9EaWdpQ2VydEFzc3VyZWRJRFJvb3RDQS5jcnQwgYEGA1UdHwR6MHgw
482# OqA4oDaGNGh0dHA6Ly9jcmw0LmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEFzc3VyZWRJ
483# RFJvb3RDQS5jcmwwOqA4oDaGNGh0dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9EaWdp
484# Q2VydEFzc3VyZWRJRFJvb3RDQS5jcmwwTwYDVR0gBEgwRjA4BgpghkgBhv1sAAIE
485# MCowKAYIKwYBBQUHAgEWHGh0dHBzOi8vd3d3LmRpZ2ljZXJ0LmNvbS9DUFMwCgYI
486# YIZIAYb9bAMwHQYDVR0OBBYEFFrEuXsqCqOl6nEDwGD5LfZldQ5YMB8GA1UdIwQY
487# MBaAFEXroq/0ksuCMS1Ri6enIZ3zbcgPMA0GCSqGSIb3DQEBCwUAA4IBAQA+7A1a
488# JLPzItEVyCx8JSl2qB1dHC06GsTvMGHXfgtg/cM9D8Svi/3vKt8gVTew4fbRknUP
489# UbRupY5a4l4kgU4QpO4/cY5jDhNLrddfRHnzNhQGivecRk5c/5CxGwcOkRX7uq+1
490# UcKNJK4kxscnKqEpKBo6cSgCPC6Ro8AlEeKcFEehemhor5unXCBc2XGxDI+7qPjF
491# Emifz0DLQESlE/DmZAwlCEIysjaKJAL+L3J+HNdJRZboWR3p+nRka7LrZkPas7CM
492# 1ekN3fYBIM6ZMWM9CBoYs4GbT8aTEAb8B4H6i9r5gkn3Ym6hU/oSlBiFLpKR6mhs
493# RDKyZqHnGKSaZFHvMIIGajCCBVKgAwIBAgIQAwGaAjr/WLFr1tXq5hfwZjANBgkq
494# hkiG9w0BAQUFADBiMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5j
495# MRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBB
496# c3N1cmVkIElEIENBLTEwHhcNMTQxMDIyMDAwMDAwWhcNMjQxMDIyMDAwMDAwWjBH
497# MQswCQYDVQQGEwJVUzERMA8GA1UEChMIRGlnaUNlcnQxJTAjBgNVBAMTHERpZ2lD
498# ZXJ0IFRpbWVzdGFtcCBSZXNwb25kZXIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
499# ggEKAoIBAQCjZF38fLPggjXg4PbGKuZJdTvMbuBTqZ8fZFnmfGt/a4ydVfiS457V
500# WmNbAklQ2YPOb2bu3cuF6V+l+dSHdIhEOxnJ5fWRn8YUOawk6qhLLJGJzF4o9GS2
501# ULf1ErNzlgpno75hn67z/RJ4dQ6mWxT9RSOOhkRVfRiGBYxVh3lIRvfKDo2n3k5f
502# 4qi2LVkCYYhhchhoubh87ubnNC8xd4EwH7s2AY3vJ+P3mvBMMWSN4+v6GYeofs/s
503# jAw2W3rBerh4x8kGLkYQyI3oBGDbvHN0+k7Y/qpA8bLOcEaD6dpAoVk62RUJV5lW
504# MJPzyWHM0AjMa+xiQpGsAsDvpPCJEY93AgMBAAGjggM1MIIDMTAOBgNVHQ8BAf8E
505# BAMCB4AwDAYDVR0TAQH/BAIwADAWBgNVHSUBAf8EDDAKBggrBgEFBQcDCDCCAb8G
506# A1UdIASCAbYwggGyMIIBoQYJYIZIAYb9bAcBMIIBkjAoBggrBgEFBQcCARYcaHR0
507# cHM6Ly93d3cuZGlnaWNlcnQuY29tL0NQUzCCAWQGCCsGAQUFBwICMIIBVh6CAVIA
508# QQBuAHkAIAB1AHMAZQAgAG8AZgAgAHQAaABpAHMAIABDAGUAcgB0AGkAZgBpAGMA
509# YQB0AGUAIABjAG8AbgBzAHQAaQB0AHUAdABlAHMAIABhAGMAYwBlAHAAdABhAG4A
510# YwBlACAAbwBmACAAdABoAGUAIABEAGkAZwBpAEMAZQByAHQAIABDAFAALwBDAFAA
511# UwAgAGEAbgBkACAAdABoAGUAIABSAGUAbAB5AGkAbgBnACAAUABhAHIAdAB5ACAA
512# QQBnAHIAZQBlAG0AZQBuAHQAIAB3AGgAaQBjAGgAIABsAGkAbQBpAHQAIABsAGkA
513# YQBiAGkAbABpAHQAeQAgAGEAbgBkACAAYQByAGUAIABpAG4AYwBvAHIAcABvAHIA
514# YQB0AGUAZAAgAGgAZQByAGUAaQBuACAAYgB5ACAAcgBlAGYAZQByAGUAbgBjAGUA
515# LjALBglghkgBhv1sAxUwHwYDVR0jBBgwFoAUFQASKxOYspkH7R7for5XDStnAs0w
516# HQYDVR0OBBYEFGFaTSS2STKdSip5GoNL9B6Jwcp9MH0GA1UdHwR2MHQwOKA2oDSG
517# Mmh0dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEFzc3VyZWRJRENBLTEu
518# Y3JsMDigNqA0hjJodHRwOi8vY3JsNC5kaWdpY2VydC5jb20vRGlnaUNlcnRBc3N1
519# cmVkSURDQS0xLmNybDB3BggrBgEFBQcBAQRrMGkwJAYIKwYBBQUHMAGGGGh0dHA6
520# Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBBBggrBgEFBQcwAoY1aHR0cDovL2NhY2VydHMu
521# ZGlnaWNlcnQuY29tL0RpZ2lDZXJ0QXNzdXJlZElEQ0EtMS5jcnQwDQYJKoZIhvcN
522# AQEFBQADggEBAJ0lfhszTbImgVybhs4jIA+Ah+WI//+x1GosMe06FxlxF82pG7xa
523# FjkAneNshORaQPveBgGMN/qbsZ0kfv4gpFetW7easGAm6mlXIV00Lx9xsIOUGQVr
524# NZAQoHuXx/Y/5+IRQaa9YtnwJz04HShvOlIJ8OxwYtNiS7Dgc6aSwNOOMdgv420X
525# Ewbu5AO2FKvzj0OncZ0h3RTKFV2SQdr5D4HRmXQNJsQOfxu19aDxxncGKBXp2JPl
526# VRbwuwqrHNtcSCdmyKOLChzlldquxC5ZoGHd2vNtomHpigtt7BIYvfdVVEADkitr
527# wlHCCkivsNRu4PQUCjob4489yq9qjXvc2EQwggbNMIIFtaADAgECAhAG/fkDlgOt
528# 6gAK6z8nu7obMA0GCSqGSIb3DQEBBQUAMGUxCzAJBgNVBAYTAlVTMRUwEwYDVQQK
529# EwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xJDAiBgNV
530# BAMTG0RpZ2lDZXJ0IEFzc3VyZWQgSUQgUm9vdCBDQTAeFw0wNjExMTAwMDAwMDBa
531# Fw0yMTExMTAwMDAwMDBaMGIxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2Vy
532# dCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xITAfBgNVBAMTGERpZ2lD
533# ZXJ0IEFzc3VyZWQgSUQgQ0EtMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
534# ggEBAOiCLZn5ysJClaWAc0Bw0p5WVFypxNJBBo/JM/xNRZFcgZ/tLJz4FlnfnrUk
535# FcKYubR3SdyJxArar8tea+2tsHEx6886QAxGTZPsi3o2CAOrDDT+GEmC/sfHMUiA
536# fB6iD5IOUMnGh+s2P9gww/+m9/uizW9zI/6sVgWQ8DIhFonGcIj5BZd9o8dD3QLo
537# Oz3tsUGj7T++25VIxO4es/K8DCuZ0MZdEkKB4YNugnM/JksUkK5ZZgrEjb7Szgau
538# rYRvSISbT0C58Uzyr5j79s5AXVz2qPEvr+yJIvJrGGWxwXOt1/HYzx4KdFxCuGh+
539# t9V3CidWfA9ipD8yFGCV/QcEogkCAwEAAaOCA3owggN2MA4GA1UdDwEB/wQEAwIB
540# hjA7BgNVHSUENDAyBggrBgEFBQcDAQYIKwYBBQUHAwIGCCsGAQUFBwMDBggrBgEF
541# BQcDBAYIKwYBBQUHAwgwggHSBgNVHSAEggHJMIIBxTCCAbQGCmCGSAGG/WwAAQQw
542# ggGkMDoGCCsGAQUFBwIBFi5odHRwOi8vd3d3LmRpZ2ljZXJ0LmNvbS9zc2wtY3Bz
543# LXJlcG9zaXRvcnkuaHRtMIIBZAYIKwYBBQUHAgIwggFWHoIBUgBBAG4AeQAgAHUA
544# cwBlACAAbwBmACAAdABoAGkAcwAgAEMAZQByAHQAaQBmAGkAYwBhAHQAZQAgAGMA
545# bwBuAHMAdABpAHQAdQB0AGUAcwAgAGEAYwBjAGUAcAB0AGEAbgBjAGUAIABvAGYA
546# IAB0AGgAZQAgAEQAaQBnAGkAQwBlAHIAdAAgAEMAUAAvAEMAUABTACAAYQBuAGQA
547# IAB0AGgAZQAgAFIAZQBsAHkAaQBuAGcAIABQAGEAcgB0AHkAIABBAGcAcgBlAGUA
548# bQBlAG4AdAAgAHcAaABpAGMAaAAgAGwAaQBtAGkAdAAgAGwAaQBhAGIAaQBsAGkA
549# dAB5ACAAYQBuAGQAIABhAHIAZQAgAGkAbgBjAG8AcgBwAG8AcgBhAHQAZQBkACAA
550# aABlAHIAZQBpAG4AIABiAHkAIAByAGUAZgBlAHIAZQBuAGMAZQAuMAsGCWCGSAGG
551# /WwDFTASBgNVHRMBAf8ECDAGAQH/AgEAMHkGCCsGAQUFBwEBBG0wazAkBggrBgEF
552# BQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tMEMGCCsGAQUFBzAChjdodHRw
553# Oi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRBc3N1cmVkSURSb290Q0Eu
554# Y3J0MIGBBgNVHR8EejB4MDqgOKA2hjRodHRwOi8vY3JsMy5kaWdpY2VydC5jb20v
555# RGlnaUNlcnRBc3N1cmVkSURSb290Q0EuY3JsMDqgOKA2hjRodHRwOi8vY3JsNC5k
556# aWdpY2VydC5jb20vRGlnaUNlcnRBc3N1cmVkSURSb290Q0EuY3JsMB0GA1UdDgQW
557# BBQVABIrE5iymQftHt+ivlcNK2cCzTAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYun
558# pyGd823IDzANBgkqhkiG9w0BAQUFAAOCAQEARlA+ybcoJKc4HbZbKa9Sz1LpMUer
559# Vlx71Q0LQbPv7HUfdDjyslxhopyVw1Dkgrkj0bo6hnKtOHisdV0XFzRyR4WUVtHr
560# uzaEd8wkpfMEGVWp5+Pnq2LN+4stkMLA0rWUvV5PsQXSDj0aqRRbpoYxYqioM+Sb
561# OafE9c4deHaUJXPkKqvPnHZL7V/CSxbkS3BMAIke/MV5vEwSV/5f4R68Al2o/vsH
562# OE8Nxl2RuQ9nRc3Wg+3nkg2NsWmMT/tZ4CMP0qquAHzunEIOz5HXJ7cW7g/DvXwK
563# oO4sCFWFIrjrGBpN/CohrUkxg0eVd3HcsRtLSxwQnHcUwZ1PL1qVCCkQJjGCBDsw
564# ggQ3AgEBMIGGMHIxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMx
565# GTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xMTAvBgNVBAMTKERpZ2lDZXJ0IFNI
566# QTIgQXNzdXJlZCBJRCBDb2RlIFNpZ25pbmcgQ0ECEA5mBKT7UNogWOLwtgBqursw
567# CQYFKw4DAhoFAKB4MBgGCisGAQQBgjcCAQwxCjAIoAKAAKECgAAwGQYJKoZIhvcN
568# AQkDMQwGCisGAQQBgjcCAQQwHAYKKwYBBAGCNwIBCzEOMAwGCisGAQQBgjcCARUw
David Pinedo84f946e2016-04-07 15:54:59 -0600569# IwYJKoZIhvcNAQkEMRYEFAoOC46C6ArmxtlmLsUTidSbkN3rMA0GCSqGSIb3DQEB
570# AQUABIIBADXG8YUKEPQHyMUpBvGWwb5VeZ8oWPyiSSE649GXu5tHDn+N2lhDPngR
571# Cksh4FpF56hP4RgTzH/Nmxf2D4kZUzPCrs2Il1S+U0ZoFpoAwrN8dbnvw2Wvf7ns
572# LZHXKG9eIaMYx6r/nn+VV8qvL/25fZ8oNyIFCYy4FYRLmla5g1+Vmtg6anHj89c+
573# EMSIwR8BR5UlAagfhfKJQHYMz4xkdqMrR6ZDsMHvYjbOg3MILrrdgomH2R5JKAHK
574# IaD3EqM+Tgu8LH1MMt/hIf4RS/lgqT12qM88J64dyhquaM1BUzw5dnwb+h3aAF2O
575# ZJ4IhONECJbJf8wVT8rTUA+6uUm/Y6ihggIPMIICCwYJKoZIhvcNAQkGMYIB/DCC
David Pinedo0b5e2082016-03-22 14:33:50 -0600576# AfgCAQEwdjBiMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkw
577# FwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBBc3N1
578# cmVkIElEIENBLTECEAMBmgI6/1ixa9bV6uYX8GYwCQYFKw4DAhoFAKBdMBgGCSqG
David Pinedo84f946e2016-04-07 15:54:59 -0600579# SIb3DQEJAzELBgkqhkiG9w0BBwEwHAYJKoZIhvcNAQkFMQ8XDTE2MDQwNzIxNTM0
580# OFowIwYJKoZIhvcNAQkEMRYEFERKj5qmhGjIIeKV/myZFhJ/EUO7MA0GCSqGSIb3
581# DQEBAQUABIIBAJYQytkxzpn/UVwVJ0tsompGzVKSEgjuqAiI2jA0LiQwWM9iBHpG
582# 8ijDH6Dh+Fqa1JSsynyFixF26SuHeDoY/LX14HhRPDEkBa70qt9h9gc/73f9AzUy
583# eSbxwRhlF/UAyk0E3fbK1of431HxfvcdhnvCIDW8orfiG5v7gS0Mub4C70TlMXTp
584# b6XT1orYqnih9j4EVCYWZwv+EsOADRHW7o1RvIC2gI2dzmAkMSEjehk3we6u8KXI
585# xkggPOXy5O8TFgFdjvKU6XaoTTCklKWFIQIRG9r5m//Qj3jwzwN/03gLPphi6zze
586# 8fAJmClDyH+kHivSSfFnFUB7elvajTvasQE=
David Pinedo0b5e2082016-03-22 14:33:50 -0600587# SIG # End signature block