'Check Dr.Backup compressed Storage Usage from Local Catalog 'Update version 6/10/2011 - MDR '6/10/2011 - bug fix on plugins '4/11/2012 - support long filenames '12/5/2012 - backup destination support '3/18/2013 - added statistics by extension '3/27/2013 - adapted to run the report on a per backupset basis to handle large catalog 'Future - add delete field to catalog if not present CONST RBSProvider = "Dr.Backup" CONST Version = "(v2.7.1)" 'Don't report local storage deleted stats. CONST SHOWDELETEDMIRROR = FALSE CONST SHOWDELETEDCLOUD = FALSE 'Enumerates file system to detect deleted files and report CONST CHECKFORDELETES = TRUE CONST ShowDeletedExts = FALSE 'can toggle this value to FALSE to turn off deleted file extension stats CONST MAXVAL = 10000 'maximum number of extension types tracked CONST LongFileLength = 255 'reports files in catalog with more than this number of characters 'statistics counters REDIM extstr(maxval) 'file extension string array REDIM extcount(maxval) 'number of times extension string appears REDIM extbytes(maxval) 'uncompressed bytes running counter REDIM extcbytes(maxval) 'compressed bytes running counter DIM extlist 'string of previously seen extensions and index DIM NextExt 'next free slot in array DIM FirstPass 'write display column headers in .csv on first pass through 'initialize for extension tracking string NextExt = 1 extlist = ";NONE=0;" extstr(0) = "NONE" extcount(0) = 0 extbytes(0) = 0 extcbytes(0) = 0 FirstPass = True 'logical to tell us to write header to output file Dim FullFilename 'filename being inspected. could be longer than 255 characters LongFiles = 0 'counter to track number of long files in catalog for warning message. CatalogRecords = 0 'total records in the catalog. sum of all backupset records. '** standard pre-amble for all interactive scripts ** 'get OS volume Set OSobj = CreateObject("Scripting.FileSystemObject") OSfolder = OSobj.getspecialfolder(0) objStartFolder = Left(OSfolder, 3) 'root of search file tree OSVolume = Left(OSfolder, 1) '** added to elevate privs - initial call will have zero arguments ** If WScript.Arguments.count = 0 AND NewOS() Then Set objShell = CreateObject("Shell.Application") 'Pass a bogus argument with leading blank space, say [ uac] objShell.ShellExecute "wscript.exe", Chr(34) & _ WScript.ScriptFullName & Chr(34) & " uac", "", "runas", 1 Wscript.Quit End If 'find location of 32-bit script processing program - in syswow64 on 64-bit machines ScriptEXE = OSFolder & "\SYSTEM32\Cscript.exe" Set objFSOexe = CreateObject("Scripting.FileSystemObject") If objFSOexe.FileExists(OSFolder & "\SYSWOW64\Cscript.exe") Then '640bit system found. switch to 32-bit cscript ScriptEXE = OSFolder & "\SYSWOW64\Cscript.exe" End If '** if we have UAC escalated count will be 1, otherwise 0 on legacy machines ** '** force use of cscript so we get console display ** If Wscript.Arguments.Count < 2 Then strPath = Wscript.ScriptFullName strCommand = "%comspec% /k " & ScriptEXE & " //nologo """ & strPath & """" & " 1 2" Set objShell = CreateObject("Wscript.Shell") objShell.Run(strCommand), 1, True Wscript.Quit End If 'we need to trap errors and continue due to SQL query try-retry logic 'unfrotunately, sometimes this can cause trouble On Error Resume Next Err.Clear Wscript.StdOut.WriteLine(RBSProvider & " - Export Catalog Analysis " & Version & VbCrLF) Wscript.StdOut.WriteLine("Start : " & Now() & VbCr) 'Get catalog location from Registry Const HKEY_LOCAL_MACHINE = &H80000002 strComputer = "." strKeyPath = "SOFTWARE\Quantum Tech, Inc.\Remote Backup\Settings" strEntryName = "ClientDB" Set objReg = GetObject("winmgmts:" _ & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\default:StdRegProv") status = objReg.GetStringValue( HKEY_LOCAL_MACHINE, strKeyPath, strEntryName, strValue) 'Sometimes security products block access to the registry. If so, lookup will fail. 'Give the user an opportunity to specify location of backup catalog manually rather than hard fail. If (status <> 0) or (Err.Number <> 0) Then strValue = InputBox("Unable to lookup database location in registry." & VbCrLf & "Please enter path below: ","Locate Backup Catalog", "C:\Program Files\Remote Backup") If Len(strValue) = 0 Then Wscript.StdOut.WriteLine("Cancelled. Script aborted." & VbCr) Wscript.Quit End If Err.Clear End If Database = strValue & "\" & "backup.mdb" 'Wscript.StdOut.WriteLine("Processing Database: " & Database) 'initialize stats counters CompressedSizeR = 0 OriginalSizeR = 0 FileCountR = 0 CompressedSizeM = 0 OriginalSizeM = 0 FileCountM = 0 CompressedSizeC = 0 OriginalSizeC = 0 FileCountC = 0 CompressedSizeT = 0 OriginalSizeT = 0 FileCountT = 0 'master record count with sum of all backup sets RecordCount = 0 'deleted data stats FilesDeletedR = 0 FilesDeletedSizeR = 0 FilesDeleteOriginalSizeR = 0 FilesDeletedM = 0 FilesDeletedSizeM = 0 FilesDeleteOriginalSizeM = 0 FilesDeletedC = 0 FilesDeletedSizeC = 0 FilesDeleteOriginalSizeC = 0 ForWriting = 2 'setup output file for catalog spreadsheet CatalogFile = strValue & "\Custom\catalog.csv" 'Wscript.StdOut.Writeline("Catalog Export = " & CatalogFile) Set objFSO = CreateObject("Scripting.FileSystemObject") Set objFile = objFSO.CreateTextFile(CatalogFile, ForWriting) 'string holding storage locations - support for mirror and cloud storage StorageLoc = "" 'In order to handle catalogs with ultra large record counts, we are going to do a catalog 'export based on backupset, then total everything up. The output catalog won't be sorted, but 'that can be done in excel. 'Create recordset for backupset enumeration Set rsSetname = CreateObject ("ADODB.Recordset") strConnectSetname = "Provider=MSDASQL; DRIVER={Microsoft Access Driver (*.mdb)};DBQ=" & DataBase & ";UID=admin;PWD=;" rsSetname.ActiveConnection = strConnectSetname rsSetname.CursorLocation = 3 rsSetname.CursorType = 3 sqlSetname = "Select * from SETNAMES" rsSetname.open sqlSetname 'enumerate through all backup sets in catalog Do Until rsSetname.EOF 'Wscript.Stdout.Writeline("SETID = " & rsSetname("ID")) 'Open up catalog for reading Set rsFileEntry = CreateObject ("ADODB.Recordset") strConnect = "Provider=MSDASQL; DRIVER={Microsoft Access Driver (*.mdb)};DBQ=" & DataBase & ";UID=admin;PWD=;" rsFileEntry.ActiveConnection = strConnect rsFileEntry.CursorLocation = 3 rsFileEntry.CursorType = 3 'put in advanced SQL query to backup location field for cloud storage sqlStmt = GetSQLQuery(2, rsSetname("ID")) 'Wscript.StdOut.Writeline("SQL: " & sqlStmt) err.clear Supports117 = TRUE 'flag that says full feature support available including cloud storage (backuplocation) rsFileEntry.open sqlStmt 'if all catalog features supported, we are done. otherwise, scale it back to older catalog format If Err.Number <> 0 Then Wscript.StdOut.Writeline("WARN: Old catalog doesn't support 'backuplocation' field. Using earlier catalog version.") Err.clear Supports117 = FALSE sqlStmt = GetSQLQuery(1, rsSetname("ID")) strConnect = "Provider=MSDASQL; DRIVER={Microsoft Access Driver (*.mdb)};DBQ=" & DataBase & ";UID=admin;PWD=;" rsFileEntry.ActiveConnection = strConnect rsFileEntry.CursorLocation = 3 rsFileEntry.CursorType = 3 rsFileEntry.open sqlStmt End If 'If non-complex query fails, there is probably catalog trouble, too many entries causing memory overflow If Err.Number <> 0 Then Wscript.StdOut.Writeline(VbCrLf & "Catalog query FAILED.") wscript.StdOut.Writeline(err.description & " (" & err.number & ")") Wscript.StdOut.WriteLine(VbCrLf & "Script aborted." & VbCr) Wscript.Quit End If 'if supporting v11.7 cloud storage, then add column to spreadsheet LocationStr = "" If Supports117 = True Then LocationStr = ",""Location""" End If If FirstPass = TRUE Then objFile.Writeline """Filename"",""CompressedSize"",""OrigSize"",""DateStamp"",""SetNameID"",""SubFolder"",""FullPFolder"",""Extension"",""Deleted""" & LocationStr FirstPass = False End If 'keep running counter of records in all backup sets CatalogRecords = CatalogRecords + rsFileentry.recordcount ''Wscript.StdOut.Writeline("Backupset Records: " & rsFileentry.recordcount) 'enumerate through all catalog entries for this backup set and compute stats Do Until rsFileEntry.EOF If RsFileEntry("PrepResult") = 0 Then 'Get Backuplocation(s) so we can handle separately for stats If Supports117 = True Then StorageLoc = GetBackupLocation(RsFileEntry("BackupLocation")) 'Wscript.StdOut.Writeline("StorageLoc = " & StorageLoc) Else 'if not supported in database, assume Remote server backup StorageLoc = "R" End If 'Check to see if filename exists in catalog table FullFilename = "" If Len(RsFileEntry("Filename") & " ") = 1 Then 'Null filename field means this is a longpath file. Get upto 512 chars from longpath table FullFilename = RsFileEntry("Longpath").Getchunk(512) Else 'Just a simple file. Load into Fullfilename field FullFilename = RsFileEntry("Filename") End If 'check if file exists on disk If Len(FullFilename & " ") <> 1 Then 'filename in catalog. Check disk '3/27/2013 - bypass the on disk checking here If CHECKFORDELETES = FALSE Then 'We don't need to do any delete checks Deleted = "No" ElseIf objFSO.FileExists(Fullfilename) Then 'Simple case. file on disk. nothing to do. Deleted = "No" Else 'If this is NOT a plugin, (empty or NULL string) then it is a deleted file If Len(RsFileEntry("Plugin") & " ") = 1 Then Deleted = "Yes" 'Wscript.StdOut.Writeline("Deleted: " & fullfilename) 'update deleted statistics 'Remote Server 'Wscript.StdOut.Writeline("StorageLoc=" & StorageLoc) If Instr(StorageLoc, "R") > 0 Then 'Remote server is a location. update deleted stats FilesDeletedR = FilesDeletedR + 1 FilesDeletedSizeR = FilesDeletedSizeR + RsFileEntry("PrepSize") FilesDeletedOriginalSizeR = FilesDeletedOriginalSizeR + RsFileEntry("OrigSize") End If 'Local Mirror If Instr(StorageLoc, "M") > 0 Then 'Mirror server is a location. update deleted stats FilesDeletedM = FilesDeletedM + 1 FilesDeletedSizeM = FilesDeletedSizeM + RsFileEntry("PrepSize") FilesDeletedOriginalSizeM = FilesDeletedOriginalSizeM + RsFileEntry("OrigSize") End If 'Private Cloud Storage If Instr(StorageLoc, "C") > 0 Then 'Cloud storage is a location. update deleted stats FilesDeletedC = FilesDeletedC + 1 FilesDeletedSizeC = FilesDeletedSizeC + RsFileEntry("PrepSize") FilesDeletedOriginalSizeC = FilesDeletedOriginalSizeC + RsFileEntry("OrigSize") End If Else 'This is a plugin. Ignore it as plugins are not ordinary user files. Deleted = "No" End If End If End If 'Update running stats - Maintain multiple sets of stats If Instr(StorageLoc, "R") > 0 Then 'Remote server is a location. update stats CompressedSizeR = CompressedSizeR + rsFileEntry("PrepSize") OriginalSizeR = OriginalSizeR + RsFileEntry("OrigSize") FileCountR = FileCountR + 1 End If If Instr(StorageLoc, "M") > 0 Then 'Local Mirror is a location. update stats CompressedSizeM = CompressedSizeM + rsFileEntry("PrepSize") OriginalSizeM = OriginalSizeM + RsFileEntry("OrigSize") FileCountM = FileCountM + 1 End If If Instr(StorageLoc, "C") > 0 Then 'Cloud storage is a location. update stats CompressedSizeC = CompressedSizeC + rsFileEntry("PrepSize") OriginalSizeC = OriginalSizeC + RsFileEntry("OrigSize") FileCountC = FileCountC + 1 End If 'summary totals updated CompressedSizeT = CompressedSizeT + rsFileEntry("PrepSize") OriginalSizeT = OriginalSizeT + RsFileEntry("OrigSize") FileCountT = FileCountT + 1 'Keep track if we have long filenames - may be troublesome to ultimately restore unless to orig path If Len(FullFilename) > LongFileLength Then LongFiles = Longfiles + 1 End If 'If version 11.7 or later, then display storage locations of data If Supports117 = True Then LocationStr = ",""" & StorageLoc & """" Else LocationStr = "" End If objFile.Writeline """" & Fullfilename & """,""" & _ RsFileEntry("PrepSize") & """,""" & RsFileentry("OrigSize") & """,""" & _ RsFileEntry("DateStamp") & """,""" & RsFileEntry("SetnameID") & """,""" & _ RsFileEntry("SubFolder") & """,""" & RsFileEntry("FullPFolder") & """,""" & _ GetExtension(FullFilename) & """,""" & _ Deleted & """" & LocationStr UpdateExtStats GetExtension(FullFilename), RsFileentry("OrigSize"), RsFileEntry("PrepSize"), Deleted Else 'Wscript.StdOut.Writeline("Plugin found (" & RsFileEntry("ID") & ") : " & fullfilename ) End If RecordCount = RecordCount + 1 'since catalog could be large, provide feedback here If (RecordCount Mod 100) = 0 Then Wscript.StdOut.Write("Processing : " & Recordcount & "/" & CatalogRecords & VbCr) End If rsFileEntry.MoveNext Loop 'files within backup set rsFileEntry.Close rsSetname.MoveNext Wscript.StdOut.Write("Processing : " & Recordcount & "/" & CatalogRecords & VbCr) Loop 'backupsetID 'done processing. wrap up and display stats. Wscript.StdOut.Write("Processing : " & Recordcount & "/" & CatalogRecords & VbCrLF) Wscript.StdOut.Write("End Processing : " & Now() & VbCrLF) GroupDigits = -1 Default = 0 'show report Wscript.StdOut.Writeline(" ") Wscript.StdOut.Writeline("Analysis - Findings" & VbCrLf) 'Report out for Remote server storage Wscript.StdOut.Writeline("Remote Offsite Storage - Maintained by " & RBSProvider) If FileCountR > 0 Then Wscript.StdOut.Writeline(" Compressed Storage (bytes) : " & FormatNumber(CompressedSizeR, Default, Default, Default, GroupDigits)) Wscript.StdOut.Writeline(" Raw Size on Disk (bytes) : " & FormatNumber(OriginalSizeR, Default, Default, Default, GroupDigits)) Wscript.StdOut.Writeline(" File Count : " & FormatNumber(FileCountR, Default, Default, Default, GroupDigits)) If FilesDeletedR > 0 Then Wscript.StdOut.Writeline(VbCrLf & " Deleted File Storage (bytes) : " & FormatNumber(FilesDeletedSizeR, Default, Default, Default, GroupDigits)) Wscript.StdOut.Writeline(" Deleted File Count : " & FormatNumber(FilesDeletedR, Default, Default, Default, GroupDigits) & VbCrLf) Else Wscript.StdOut.Writeline(VbCrLf & " No Deleted File Storage Reported." & VbCrLf) End If Else Wscript.StdOut.Writeline(VbCrLf & " No Offsite File Storage Reported." & VbCrLf) End If If FileCountM > 0 Then Wscript.StdOut.Writeline("Local Mirror Storage - Maintained by Client Locally") Wscript.StdOut.Writeline(" Compressed Storage (bytes) : " & FormatNumber(CompressedSizeM, Default, Default, Default, GroupDigits)) Wscript.StdOut.Writeline(" Raw Size on Disk (bytes) : " & FormatNumber(OriginalSizeM, Default, Default, Default, GroupDigits)) Wscript.StdOut.Writeline(" File Count : " & FormatNumber(FileCountM, Default, Default, Default, GroupDigits)) If SHOWDELETEDMIRROR = TRUE Then If FilesDeletedM > 0 Then Wscript.StdOut.Writeline(VbCrLf & " Deleted File Storage (bytes) : " & FormatNumber(FilesDeletedSizeM, Default, Default, Default, GroupDigits)) Wscript.StdOut.Writeline(" Deleted File Count : " & FormatNumber(FilesDeletedM, Default, Default, Default, GroupDigits) & VbCrLf) Else Wscript.StdOut.Writeline(VbCrLf & " No Deleted File Storage Detected." & VbCrLf) End If End If End If If FileCountC > 0 Then Wscript.StdOut.Writeline("Private Cloud Storage - Maintained by Client") Wscript.StdOut.Writeline(" Compressed Storage (bytes) : " & FormatNumber(CompressedSizeC, Default, Default, Default, GroupDigits)) Wscript.StdOut.Writeline(" Raw Size on Disk (bytes) : " & FormatNumber(OriginalSizeC, Default, Default, Default, GroupDigits)) Wscript.StdOut.Writeline(" File Count : " & FormatNumber(FileCountC, Default, Default, Default, GroupDigits)) If SHOWDELETEDCLOUD = TRUE Then If FilesDeletedC > 0 Then Wscript.StdOut.Writeline(VbCrLf & " Deleted File Storage (bytes) : " & FormatNumber(FilesDeletedSizeC, Default, Default, Default, GroupDigits)) Wscript.StdOut.Writeline(" Deleted File Count : " & FormatNumber(FilesDeletedC, Default, Default, Default, GroupDigits) & VbCrLf) Else Wscript.StdOut.Writeline(VbCrLf & " No Deleted File Storage Detected." & VbCrLf) End If End If End If If (FileCountT = 0) OR (FileCountT <> FileCountR) Then Wscript.StdOut.Writeline(VbCrLf & "Catalog Export Summary - All Backup Destinations") Wscript.StdOut.Writeline(" Compressed Storage (bytes) : " & FormatNumber(CompressedSizeT, Default, Default, Default, GroupDigits)) Wscript.StdOut.Writeline(" Raw Size on Disk (bytes) : " & FormatNumber(OriginalSizeT, Default, Default, Default, GroupDigits)) Wscript.StdOut.Writeline(" Total (Unique) File Count : " & FormatNumber(FileCountT, Default, Default, Default, GroupDigits) & VbCrLf) End If If LongFiles > 0 Then Wscript.StdOut.Writeline("WARN: Extremely long filenames detected. (" & LongFiles & ")") End If If RsFileEntry.RecordCount <> FileCountT Then Wscript.StdOut.Writeline("WARN: Locked or untransferred files detected. (" & RsFileEntry.RecordCount - FileCountT & ")") End If 'all done 'open file to write out .csv of statistics statslogFile = strValue & "\Custom\catalog_stats.csv" Set objFSOStats = CreateObject("Scripting.FileSystemObject") Set objstatsFile = objFSOStats.CreateTextFile(StatsLogFile, ForWriting) 'write out extended statistics on extensions (summary) MaxDisplay = 20 Wscript.StdOut.Writeline("Catalog Content Statistic Summary (by file extension)" & vbcrlf) Wscript.Echo LeftJustify("Ext",6) & space(2) & RightJustify("Count",7) & Space(2) & RightJustify("Compressed",15) & Space(2) & RightJustify("Bytes",15) Wscript.Echo LeftJustify("---",6) & space(2) & RightJustify("-----",7) & Space(2) & RightJustify("----------",15) & Space(2) & RightJustify("-----",15) 'header for .csv file objstatsFile.Writeline """Extension"",""Count"",""CompressedSize"",""OrigSize""" 'let's sort the statistics by compressed bytes, decending sort() For i = 0 to NextExt -1 If i <= maxdisplay -1 then Wscript.StdOut.Writeline(LeftJustify(extstr(i),6) & space(2) & RightJustify(FormatNumber(extcount(i),0,,,-1),7) & space(2) & RightJustify(FormatNumber(extcbytes(i),0,,,-1),15) & space(2) & RightJustify(FormatNumber(extbytes(i),0,,,-1),15)) End If objstatsFile.Writeline """" & extstr(i) & """,""" & _ extcount(i) & """,""" & extcbytes(i) & """,""" & _ extbytes(i) & """" Next objstatsfile.close Wscript.StdOut.Writeline("") If ShowDeletedExts = FALSE Then Wscript.StdOut.Writeline("Note: Deleted file extension statistics are suppressed.") End If Wscript.StdOut.Writeline("") 'all done Wscript.StdOut.Writeline("Catalog Export = " & CatalogFile) Wscript.StdOut.Writeline("Catalog Export Stats = " & StatsLogFile) Wscript.StdOut.WriteLine("Catalog Export Analysis Completed: " & Now()) objFile.Close WScript.Quit Function GetExtension(MyFilename) 'extract file extension to report out for sorting purposes GetExtension = "NONE" 'default to None 'empty filename means long file. not supported here. If Len(MyFilename & " ") = 1 then GetExtension = "Long Filenames Not Supported" Exit Function End If 'extract filename from path to file strFilename = Right(MyFilename, Len(MyFilename) - InstrRev(MyFilename,"\")) 'if no period, then no possible extension If Instr(strFilename, ".") = 0 Then Exit Function End If 'if last character is period, then no extension If Right(strFilename, 1) = "." Then Exit Function End If 'now we know there is a period and at least one character after it. grab extension. GetExtension = UCase(Right(strFilename, Len(strFilename) - InstrRev(strFilename,"."))) Exit Function End Function Function NewOS() On Error Resume Next strComputer = "." OScaption = "" NewOS = False Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2") Set colOperatingSystems = objWMIService.ExecQuery _ ("Select * from Win32_OperatingSystem") For Each objOperatingSystem in colOperatingSystems OScaption = objOperatingSystem.Caption Next If Instr(OScaption,"XP") > 0 OR _ Instr(OScaption, "2003") > 0 OR _ instr(OScaption, "2000") > 0 OR _ len(OScaption) = 0 Then NewOS = False Else NewOS = True End If Exit Function End Function Function GetSQLQuery(CatalogLevel, setID) '12/5/2012 - Format an SQL query string specific to level of software '3/28/2013 - delete field doesn't appear until user attempts to use delete I/F. removed from Case 2 ' Default = Generic, works with all catalogs (All) ' 1 = Longfilename support upto 259 characters (11.5.8) ' 2 = Delete and BackupLocation Support (11.7.x) ' Select Case CatalogLevel Case 1 GetSQLQuery = "SELECT Catalog.ID, Catalog.DateStamp, Catalog.SetNameID, Catalog.Extension, " & _ "Catalog.File, Catalog.Restore, Catalog.Status, Catalog.Attributes, Catalog.Filename, " & _ "Catalog.StoreMethod, Catalog.StoreName, Catalog.LongPathID, Catalog.OrigSize, " & _ "Catalog.PrepSize, Catalog.TrfResult, Catalog.PrepResult, Catalog.Patch, " & _ "Catalog.FullPFolder, LongPaths.LongPath, IIf(IsNull([LongPath]),[Filename], " & _ "[LongPath]) AS OrigName, SetNames.Name AS SetName, Catalog.SubFolder, " & _ "Catalog.EncryptMethod, Catalog.Plugin, Catalog.ModifiedDate, Catalog.PatchName, " & _ "Catalog.DependentFolder FROM SetNames INNER JOIN (LongPaths RIGHT JOIN [Catalog] " & _ "ON LongPaths.PathID = Catalog.LongPathID) ON SetNames.ID = Catalog.SetNameID WHERE SETNAMES.ID = " & SetID & ";" Case 2 GetSQLQuery = "SELECT Catalog.ID, Catalog.DateStamp, Catalog.SetNameID, Catalog.Extension, " & _ "Catalog.File, Catalog.Restore, Catalog.Status, Catalog.Attributes, Catalog.Filename, " & _ "Catalog.StoreMethod, Catalog.StoreName, Catalog.LongPathID, Catalog.OrigSize, " & _ "Catalog.PrepSize, Catalog.TrfResult, Catalog.PrepResult, Catalog.Patch, " & _ "Catalog.FullPFolder, Catalog.BackupLocation, LongPaths.LongPath, IIf(IsNull([LongPath]),[Filename], " & _ "[LongPath]) AS OrigName, SetNames.Name AS SetName, Catalog.SubFolder, " & _ "Catalog.EncryptMethod, Catalog.Plugin, Catalog.ModifiedDate, Catalog.PatchName, " & _ "Catalog.DependentFolder FROM SetNames INNER JOIN (LongPaths RIGHT JOIN [Catalog] " & _ "ON LongPaths.PathID = Catalog.LongPathID) ON SetNames.ID = Catalog.SetNameID WHERE SETNAMES.ID = " & SetID & ";" Case Else GetSQLQuery = "Select * FROM Catalog WHERE SETNAMES.ID = " & SetID & ";" End Select Exit Function End Function Function GetBackupLocation(Location) '12/5/2012 - translate bit string into readable string '1000 = (R)emote Server '0100 = Local (M)irror '0010 = (C)loud Storage '0001 = Future (unspecified - ignore for now) RemoteStr = "" MirrorStr = "" CloudStr = "" If Mid(Location,1,1) = "1" Then RemoteStr = "R" End If If Mid(Location,2,1) = "1" Then MirrorStr = "M" End If If Mid(Location,3,1) = "1" Then CloudStr = "C" End If GetBackupLocation = RemoteStr & MirrorStr & CloudStr Exit Function End Function Sub UpdateExtStats (ext, bytes, cbytes, deletes) 'update stats for extensions seen If (ShowDeletedExts = FALSE) AND (Ucase(deletes) = "YES") Then 'deleted file which we don't want to include Else If Instr(extlist, ";" & Ucase(ext) & "=") > 0 Then 'we've seen this string before i = getidx(extlist, Ucase(ext)) extcount(i) = extcount(i) + 1 extbytes(i) = extbytes(i) + bytes extcbytes(i) = extcbytes(i) + cbytes 'Wscript.Echo "updating: " & ext & "[" & i & "]" & " #: " & extcount(i) Else 'we haven't seen this extension yet 'special case, test for no extension If Len(ext) = 0 Then extcount(0) = extcount(0) + 1 extbytes(0) = extbytes(0) + bytes extcbytes(0) = extcbytes(0) + cbytes Else extlist = extlist & Ucase(ext) & "=" & NextExt & ";" i = NextExt extstr(i) = Ucase(ext) extcount(i) = 1 extbytes(i) = bytes extcbytes(i) = cbytes NextExt = NextExt + 1 'Wscript.Echo "Added: " & ext & " as index: " & i End If End If End If End Sub Function Getidx(master, extstr) 'scan master extensionstring for extstr and grab array index 'syntax is ;extension=index; ' 'handle NONE p1 = Instr(master, ";" & extstr & "=") If P1 = 0 Then Getidx = 0 Else p2 = p1 + len(extstr) + 2 p3 = Instr( p2, Master, ";") Getidx = Cint(mid(master, p2, p3-p2)) End If 'wscript.echo Cint(mid(master, p2, p3-p2)) End Function Function RightJustify(string, size) 'right justify a string in a buffer of size 'size' If Len(string) >= size Then RightJustify = string Else RightJustify = Space(size - Len(string)) & string End If End Function Function LeftJustify(string, size) 'left justify a string in a buffer of size 'size' If Len(string) >= size Then LeftJustify = Mid(string, 1, size) Else LeftJustify = string & Space(size - Len(string)) End If End Function Sub Sort( ) 'sort global array by compressed bytecount in decending order via XOR 'This is a pretty poor excuse for a sort, but its here as a future placeholder for a real sort routine Dim i, j, strHolder, Holder For i = (NextExt -2) to 0 Step -1 For j= 0 to i If (extcbytes(j) > extcbytes(j+1)) XOR TRUE Then strholder = extstr(j+1) extstr(j+1) = extstr(j) extstr(j) = strholder holder = extcount(j+1) extcount(j+1) = extcount(j) extcount(j) = holder holder = extbytes(j+1) extbytes(j+1) = extbytes(j) extbytes(j) = holder holder = extcbytes(j+1) extcbytes(j+1) = extcbytes(j) extcbytes(j) = holder End If Next Next End Sub '' SIG '' Begin signature block '' SIG '' MIIYpwYJKoZIhvcNAQcCoIIYmDCCGJQCAQExCzAJBgUr '' SIG '' DgMCGgUAMGcGCisGAQQBgjcCAQSgWTBXMDIGCisGAQQB '' SIG '' gjcCAR4wJAIBAQQQTvApFpkntU2P5azhDxfrqwIBAAIB '' SIG '' AAIBAAIBAAIBADAhMAkGBSsOAwIaBQAEFLg+h1SIGnOq '' SIG '' 9RM4RYaJOs/cvWlboIITVTCCBIQwggNsoAMCAQICEEIa '' SIG '' 8pQJhBkfUgpLxiQmp0swDQYJKoZIhvcNAQEFBQAwbzEL '' SIG '' MAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFC '' SIG '' MSYwJAYDVQQLEx1BZGRUcnVzdCBFeHRlcm5hbCBUVFAg '' SIG '' TmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJu '' SIG '' YWwgQ0EgUm9vdDAeFw0wNTA2MDcwODA5MTBaFw0yMDA1 '' SIG '' MzAxMDQ4MzhaMIGVMQswCQYDVQQGEwJVUzELMAkGA1UE '' SIG '' CBMCVVQxFzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4w '' SIG '' HAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAf '' SIG '' BgNVBAsTGGh0dHA6Ly93d3cudXNlcnRydXN0LmNvbTEd '' SIG '' MBsGA1UEAxMUVVROLVVTRVJGaXJzdC1PYmplY3QwggEi '' SIG '' MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDOqoE/ '' SIG '' o6NheKoxAFWVEZ4nDx8c3zqbgmgwwEphHfEvDvq+efel '' SIG '' I+9VUZaEzdvjuW4+MdgKIGfH9Nm/lOtHBD4CziqiXYcE '' SIG '' CfYwnRiKl7KqHPxB0qE2y/s9kbrn2XA1+uTnkMObo5vT '' SIG '' PPUSmXextwngaOYcuPOUY4hqav4Ldsm+9CLkZ7mrGl53 '' SIG '' wYUH3Q1sv+4Gx3dqQZ6nD9f77pQXt/yFvqSrxBwx3de2 '' SIG '' 0eTw798Wj7JSk9eh1ImhBy6/4QESQh4a4diVNNtkeSj/ '' SIG '' ui4RwuXoW5JI+0cLwmzarTKDQfOl5UFw/WWQbfr6UcT5 '' SIG '' vZYrGQQs022n3PB/b4Nl4mqrh4Z1AgMBAAGjgfQwgfEw '' SIG '' HwYDVR0jBBgwFoAUrb2YejS0Jvf6xCZU7wO94CTLVBow '' SIG '' HQYDVR0OBBYEFNrtZHQUnBQ8q92Zqb1bKE2LPMnYMA4G '' SIG '' A1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MBEG '' SIG '' A1UdIAQKMAgwBgYEVR0gADBEBgNVHR8EPTA7MDmgN6A1 '' SIG '' hjNodHRwOi8vY3JsLnVzZXJ0cnVzdC5jb20vQWRkVHJ1 '' SIG '' c3RFeHRlcm5hbENBUm9vdC5jcmwwNQYIKwYBBQUHAQEE '' SIG '' KTAnMCUGCCsGAQUFBzABhhlodHRwOi8vb2NzcC51c2Vy '' SIG '' dHJ1c3QuY29tMA0GCSqGSIb3DQEBBQUAA4IBAQBNQi+m '' SIG '' wYrrB4CQWEaM+Bk5Zio8Wixtz9TZh1WNeQsSiHtAj9XH '' SIG '' +EuNVRZjrbdX3DsrvdPBTx4Dh0tEm+PiQEUm8yZJK2qE '' SIG '' 8VR61ELa/NNqu2Z+yp7q6bvcB8fDkk6DPIFJn5LVMgnq '' SIG '' SS6hEXGaNtLFTmi2yw4bJRavbN5ddtgfcrGTJoYX2xje '' SIG '' r0Xp3/uYrxQY7aRe9omURfBVBErd/yfdBkpA9rS88eQP '' SIG '' mQK7/V0OLijBvjtfGj+XEIS8Fj7Yo5xjHWbLXF/aPvMP '' SIG '' Cgk1ItvbwD8A+eYNXWfR/aAeAyvZQPe+zIdmVICmo7j1 '' SIG '' GWLV0iaxmCbumstEp0VagZUVGvVRMIIEkzCCA3ugAwIB '' SIG '' AgIQR4qO+1nh2D8M4ULSoocHvjANBgkqhkiG9w0BAQUF '' SIG '' ADCBlTELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcw '' SIG '' FQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMV '' SIG '' VGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho '' SIG '' dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHTAbBgNVBAMT '' SIG '' FFVUTi1VU0VSRmlyc3QtT2JqZWN0MB4XDTEwMDUxMDAw '' SIG '' MDAwMFoXDTE1MDUxMDIzNTk1OVowfjELMAkGA1UEBhMC '' SIG '' R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQ '' SIG '' MA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RP '' SIG '' IENBIExpbWl0ZWQxJDAiBgNVBAMTG0NPTU9ETyBUaW1l '' SIG '' IFN0YW1waW5nIFNpZ25lcjCCASIwDQYJKoZIhvcNAQEB '' SIG '' BQADggEPADCCAQoCggEBALw1oDZwIoERw7KDudMoxjbN '' SIG '' JWupe7Ic9ptRnO819O0Ijl44CPh3PApC4PNw3KPXyvVM '' SIG '' C8//IpwKfmjWCaIqhHumnbSpwTPi7x8XSMo6zUbmxap3 '' SIG '' veN3mvpHU0AoWUOT8aSB6u+AtU+nCM66brzKdgyXZFmG '' SIG '' JLs9gpCoVbGS06CnBayfUyUIEEeZzZjeaOW0UHijrwHM '' SIG '' WUNY5HZufqzH4p4fT7BHLcgMo0kngHWMuwaRZQ+Qm/S6 '' SIG '' 0YHIXGrsFOklCb8jFvSVRkBAIbuDlv2GH3rIDRCOovgZ '' SIG '' B1h/n703AmDypOmdRD8wBeSncJlRmugX8VXKsmGJZUan '' SIG '' avJYRn6qoAcCAwEAAaOB9DCB8TAfBgNVHSMEGDAWgBTa '' SIG '' 7WR0FJwUPKvdmam9WyhNizzJ2DAdBgNVHQ4EFgQULi2w '' SIG '' CkRK04fAAgfOl31QYiD9D4MwDgYDVR0PAQH/BAQDAgbA '' SIG '' MAwGA1UdEwEB/wQCMAAwFgYDVR0lAQH/BAwwCgYIKwYB '' SIG '' BQUHAwgwQgYDVR0fBDswOTA3oDWgM4YxaHR0cDovL2Ny '' SIG '' bC51c2VydHJ1c3QuY29tL1VUTi1VU0VSRmlyc3QtT2Jq '' SIG '' ZWN0LmNybDA1BggrBgEFBQcBAQQpMCcwJQYIKwYBBQUH '' SIG '' MAGGGWh0dHA6Ly9vY3NwLnVzZXJ0cnVzdC5jb20wDQYJ '' SIG '' KoZIhvcNAQEFBQADggEBAMj7Y/gLdXUsOvHyE6cttqMa '' SIG '' nK0BB9M0jnfgwm6uAl1IT6TSIbY2/So1Q3xr34CHCxXw '' SIG '' djIAtM61Z6QvLyAbnFSegz8fXxSVYoIPIkEiH3Cz8/dC '' SIG '' 3mxRzUv4IaybO4yx5eYoj84qivmqUk2MW3e6TVpY27tq '' SIG '' BMxSHp3iKDcOu+cOkcf42/GBmOvNN7MOq2XTYuw6pXbr '' SIG '' E6g1k8kuCgHswOjMPX626+LB7NMUkoJmh1Dc/VCXrLNK '' SIG '' dnMGxIYROrNfQwRSb+qz0HQ2TMrxG3mEN3BjrXS5qg7z '' SIG '' mLCGCOvb4B+MEPI5ZJuuTwoskopPGLWR5Y0ak18frvGm '' SIG '' 8C6X0NL2KzwwggTnMIIDz6ADAgECAhAQcJ1P9VQI1zBg '' SIG '' AdjqkXW7MA0GCSqGSIb3DQEBBQUAMIGVMQswCQYDVQQG '' SIG '' EwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQg '' SIG '' TGFrZSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNU '' SIG '' IE5ldHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cudXNl '' SIG '' cnRydXN0LmNvbTEdMBsGA1UEAxMUVVROLVVTRVJGaXJz '' SIG '' dC1PYmplY3QwHhcNMTEwODI0MDAwMDAwWhcNMjAwNTMw '' SIG '' MTA0ODM4WjB7MQswCQYDVQQGEwJHQjEbMBkGA1UECBMS '' SIG '' R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxm '' SIG '' b3JkMRowGAYDVQQKExFDT01PRE8gQ0EgTGltaXRlZDEh '' SIG '' MB8GA1UEAxMYQ09NT0RPIENvZGUgU2lnbmluZyBDQSAy '' SIG '' MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA '' SIG '' y/jnp+jxlyhAaIA30sg/jpKKkjeHR4DqTJnPbvkVR73u '' SIG '' dfRErNDD1E33GcDTPE3BR7lZZRaTjNkKhJuf6PZqY1j+ '' SIG '' X9zRf0tRnwAcAIdUIAdXoILJL5ivM4q7e4AiJWpsr8Is '' SIG '' bHkTvaMqSNa1jmFV6WvoPYC/FAOFGI5+TOnCGYhzknLN '' SIG '' +v9QTcsspnsac7EAkCzZMuL7/ayVQjbsNMUTU2iywZ9A '' SIG '' n9p7yJ1ibJOiQtd5n5dPMVtQIaGrr9kcss51vlssVgAk '' SIG '' jRHBdR/w/tKV/vDhMSMYZ8BbE/1amJSU//9ZAh8ArObx '' SIG '' 8vo6c7MdQvxUdc9RMS/j24HZdyMqT1nOIwIDAQABo4IB '' SIG '' SjCCAUYwHwYDVR0jBBgwFoAU2u1kdBScFDyr3ZmpvVso '' SIG '' TYs8ydgwHQYDVR0OBBYEFB7FsSx9h9oCaHwlvAwHhD+2 '' SIG '' z97xMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAG '' SIG '' AQH/AgEAMBMGA1UdJQQMMAoGCCsGAQUFBwMDMBEGA1Ud '' SIG '' IAQKMAgwBgYEVR0gADBCBgNVHR8EOzA5MDegNaAzhjFo '' SIG '' dHRwOi8vY3JsLnVzZXJ0cnVzdC5jb20vVVROLVVTRVJG '' SIG '' aXJzdC1PYmplY3QuY3JsMHQGCCsGAQUFBwEBBGgwZjA9 '' SIG '' BggrBgEFBQcwAoYxaHR0cDovL2NydC51c2VydHJ1c3Qu '' SIG '' Y29tL1VUTkFkZFRydXN0T2JqZWN0X0NBLmNydDAlBggr '' SIG '' BgEFBQcwAYYZaHR0cDovL29jc3AudXNlcnRydXN0LmNv '' SIG '' bTANBgkqhkiG9w0BAQUFAAOCAQEAlYl3k2gBXnzZLTcH '' SIG '' kF1aQl4MZLQ2tQ/2q9U5J94iRqRJHGZLRhlZLnlJA/ac '' SIG '' kt9tUDVcDJEuYANZ0PFk92kJ9n7+6zSzbbG/ZpyjujF4 '' SIG '' uYc1YT2SMRvv9Oie1qxF+gw2PIBnu73vLsKQ4T1xLzvB '' SIG '' sFh+RcNScQMH9vM5TYs2IRsB39naXivrDpeAHkQcUIj1 '' SIG '' xhIzSqhNpY0vlAx7xr+aLMMyzb2MJybw4TADUAaCvPQ7 '' SIG '' s4N1Bsbvuu7TgPhSxqzLefI4nnuwklhCkQXIliGtuUsW '' SIG '' gRRp8Tew/jT33LDfl/VDEJt2j7Rl9eifE7cerG/EaYpf '' SIG '' ujxhfl5JhiMTLq8VSDCCBUcwggQvoAMCAQICEBmLWs2p '' SIG '' p0+2waAewzvLePwwDQYJKoZIhvcNAQEFBQAwezELMAkG '' SIG '' A1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hl '' SIG '' c3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR '' SIG '' Q09NT0RPIENBIExpbWl0ZWQxITAfBgNVBAMTGENPTU9E '' SIG '' TyBDb2RlIFNpZ25pbmcgQ0EgMjAeFw0xMjA1MjQwMDAw '' SIG '' MDBaFw0xNDA1MjQyMzU5NTlaMIGVMQswCQYDVQQGEwJV '' SIG '' UzEOMAwGA1UEEQwFMjA3MjMxCzAJBgNVBAgMAk1EMQ8w '' SIG '' DQYDVQQHDAZMYXVyZWwxHjAcBgNVBAkMFTg0MDUgQ2hl '' SIG '' cnJ5IExhdXJlbCBDdDEbMBkGA1UECgwSRG9jdG9yIEJh '' SIG '' Y2t1cCwgTExDMRswGQYDVQQDDBJEb2N0b3IgQmFja3Vw '' SIG '' LCBMTEMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK '' SIG '' AoIBAQC7J3zXlZApvLom5lGqSD+X5hjJFPtV/u7567uI '' SIG '' gbsybSHas6alSeQEZ1nSwb+6tSY+c6E4QrjCAOkwBovw '' SIG '' 3P5ACiihkwDS1UfDf1E7SgDtIN63mRCaQKTU6+HQT+Xq '' SIG '' mrA/GR0gMIRCmwYGzaM8sk1K6ZGUBvney5DW9zOWNVRM '' SIG '' /NKhugmqpQJ5fGcKUe5/YlSF1Y1DWQ1T6EW1PNSnR34I '' SIG '' mX88S+NiGQWfs3EZXhEl3FozQ04ATVXjrMVnlkdMAPzp '' SIG '' CYL73wJPG2EJs/nRY+h8U0vf2bmK4BgAr+TsnQFVSv8k '' SIG '' tHPwMSsqBfYjy8I3drE7dLW/W+M09P5A6x7XcLyHAgMB '' SIG '' AAGjggGqMIIBpjAfBgNVHSMEGDAWgBQexbEsfYfaAmh8 '' SIG '' JbwMB4Q/ts/e8TAdBgNVHQ4EFgQUf1PPfVV4Vx/+02AE '' SIG '' 0U13SRLeMXAwDgYDVR0PAQH/BAQDAgeAMAwGA1UdEwEB '' SIG '' /wQCMAAwEwYDVR0lBAwwCgYIKwYBBQUHAwMwEQYJYIZI '' SIG '' AYb4QgEBBAQDAgQQMEYGA1UdIAQ/MD0wOwYMKwYBBAGy '' SIG '' MQECAQMCMCswKQYIKwYBBQUHAgEWHWh0dHBzOi8vc2Vj '' SIG '' dXJlLmNvbW9kby5uZXQvQ1BTMEEGA1UdHwQ6MDgwNqA0 '' SIG '' oDKGMGh0dHA6Ly9jcmwuY29tb2RvY2EuY29tL0NPTU9E '' SIG '' T0NvZGVTaWduaW5nQ0EyLmNybDByBggrBgEFBQcBAQRm '' SIG '' MGQwPAYIKwYBBQUHMAKGMGh0dHA6Ly9jcnQuY29tb2Rv '' SIG '' Y2EuY29tL0NPTU9ET0NvZGVTaWduaW5nQ0EyLmNydDAk '' SIG '' BggrBgEFBQcwAYYYaHR0cDovL29jc3AuY29tb2RvY2Eu '' SIG '' Y29tMB8GA1UdEQQYMBaBFHN1cHBvcnRAZHJiYWNrdXAu '' SIG '' bmV0MA0GCSqGSIb3DQEBBQUAA4IBAQBmxIgS3RHockr5 '' SIG '' OPAcqmniK9N05oeSvsJS+GyUzUQs0FKPcwv5884Yl6c+ '' SIG '' O2cuk8TjOiMqMVRtzWAKsbKNpchnTjSyaDVcl5OHpa4s '' SIG '' zWZMDc17qTUtHqQQXXWOuNEbD86fiA3ocbfndM5Jhxa/ '' SIG '' tr7kZfYDKsZNcLsQs0oYnkvyKPZ/nuyrFvEzeTskhqaS '' SIG '' C+zU4Znxavof+qyl80zSF/OT7FPqsVsAMSaUSL6/qxeo '' SIG '' 5ka+mhoBLNR6YBA3WnFhVGy1v6YglFX9B5RPqndpS4AO '' SIG '' 1HJODZlf5e3lRmNvwzPDYr1nQW0E336PD9QNqSw3Aiv0 '' SIG '' AJEeyDVnSVMwsG3GGJxfMYIEvjCCBLoCAQEwgY8wezEL '' SIG '' MAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFu '' SIG '' Y2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE '' SIG '' ChMRQ09NT0RPIENBIExpbWl0ZWQxITAfBgNVBAMTGENP '' SIG '' TU9ETyBDb2RlIFNpZ25pbmcgQ0EgMgIQGYtazamnT7bB '' SIG '' oB7DO8t4/DAJBgUrDgMCGgUAoIG8MBkGCSqGSIb3DQEJ '' SIG '' AzEMBgorBgEEAYI3AgEEMBwGCisGAQQBgjcCAQsxDjAM '' SIG '' BgorBgEEAYI3AgEVMCMGCSqGSIb3DQEJBDEWBBQHTCnl '' SIG '' hge/B5AZ044pEi6A4gYhBzBcBgorBgEEAYI3AgEMMU4w '' SIG '' TKAugCwAQwBhAHQAYQBsAG8AZwAgAEUAeABwAG8AcgB0 '' SIG '' ACAAVQB0AGkAbABpAHQAeaEagBhodHRwOi8vd3d3LmRy '' SIG '' YmFja3VwLm5ldCAwDQYJKoZIhvcNAQEBBQAEggEAjxmE '' SIG '' 7IlZAhGlGG+JWkkWyowhAcW9S2vtSp508rSFcPA6hL+k '' SIG '' orTJ5Mlt8fvLPsV3Jsr64NyWdW7wMGSq/MsciZ6meqIY '' SIG '' AoASWqD7LSpRqDcvrnEpfXzMec+6m59EO4xq7CxXAysh '' SIG '' sO5h1MNls327j8xaRf9CZPcB4RrVWXTQYoLIXbDZQy1m '' SIG '' YAiuSnZp0GWTT1jAF+Jv+DhdfNKG7jUUFFp7UbGZ91+T '' SIG '' B3fiKb+M3/l9tsfar3/fnRYNSYduJRin9wdWKHVHKaw+ '' SIG '' /pQTuduuXK01+9H/7kMndtFFDwz1ZgGFBnKIkWw7NsZg '' SIG '' 1z3aLJ0iuCqK7qmYjgB3gCvSXpWtaaGCAkQwggJABgkq '' SIG '' hkiG9w0BCQYxggIxMIICLQIBADCBqjCBlTELMAkGA1UE '' SIG '' BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0 '' SIG '' IExha2UgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVT '' SIG '' VCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVz '' SIG '' ZXJ0cnVzdC5jb20xHTAbBgNVBAMTFFVUTi1VU0VSRmly '' SIG '' c3QtT2JqZWN0AhBHio77WeHYPwzhQtKihwe+MAkGBSsO '' SIG '' AwIaBQCgXTAYBgkqhkiG9w0BCQMxCwYJKoZIhvcNAQcB '' SIG '' MBwGCSqGSIb3DQEJBTEPFw0xNDA0MjMwNDIxMDFaMCMG '' SIG '' CSqGSIb3DQEJBDEWBBTIJ+wfjOKGGSsb+Dgcgx07K1h+ '' SIG '' CzANBgkqhkiG9w0BAQEFAASCAQCIiwv07T3arp+BvDFZ '' SIG '' 4oOZRVEv62yICXx3cxHF3YZ4LAvGqdD/pf5kKc3Ig3ZE '' SIG '' 78T+6/fasBwdm26gMp5copkhtlgkiU27/Gdp8QgBapbg '' SIG '' L78QmN8nTAUP2Bir9pLEaY+UE1r5asIlgXEvqQqK8yzv '' SIG '' 6gz79NzXneLpXMHb7FfgtnrYd4EOcL4BPvfqIB3+nmoZ '' SIG '' 6f+7gsCfnYX0OE9RZHjhJmDY3Q7i2+NiDbhgoOmQofsL '' SIG '' btlFbozjmPoM1XqZTbxjYkDPiaxt1brcxRHpHQHJcvDT '' SIG '' PdrIYPddYACGrefMsWblBF4tlPmEQ59OVpyoiji2l1ex '' SIG '' 29ueLHwsyNzMTdn4 '' SIG '' End signature block