diff --git a/Makefile.Debug b/Makefile.Debug index e567520071..5f76b9b83b 100644 --- a/Makefile.Debug +++ b/Makefile.Debug @@ -1,6 +1,6 @@ ############################################################################# # Makefile for building: gridcoinresearch -# Generated by qmake (2.01a) (Qt 4.8.4) on: Sun Jun 5 17:50:12 2016 +# Generated by qmake (2.01a) (Qt 4.8.4) on: Mon Jun 13 20:01:48 2016 # Project: gridcoinresearch.pro # Template: app ############################################################################# diff --git a/Makefile.Release b/Makefile.Release index e6deac6998..ceed85b87f 100644 --- a/Makefile.Release +++ b/Makefile.Release @@ -1,6 +1,6 @@ ############################################################################# # Makefile for building: gridcoinresearch -# Generated by qmake (2.01a) (Qt 4.8.4) on: Sun Jun 5 17:50:15 2016 +# Generated by qmake (2.01a) (Qt 4.8.4) on: Mon Jun 13 20:01:49 2016 # Project: gridcoinresearch.pro # Template: app ############################################################################# diff --git a/contrib/Installer/GridcoinInstaller/GridcoinResearch.vdproj b/contrib/Installer/GridcoinInstaller/GridcoinResearch.vdproj index 4f412dac53..4a9ff72a4e 100644 --- a/contrib/Installer/GridcoinInstaller/GridcoinResearch.vdproj +++ b/contrib/Installer/GridcoinInstaller/GridcoinResearch.vdproj @@ -1120,19 +1120,19 @@ { "Name" = "8:Microsoft Visual Studio" "ProductName" = "8:Gridcoin Research" - "ProductCode" = "8:{11449F35-92F0-4A25-912E-910A9C8915C8}" - "PackageCode" = "8:{BB38A7E0-B695-4C35-BC49-6500233289A6}" + "ProductCode" = "8:{4C308408-9E66-4902-B378-759171FC8276}" + "PackageCode" = "8:{3CAB67D7-6E42-4453-975C-8762730EA179}" "UpgradeCode" = "8:{9617E9EA-252F-43CE-B53E-B48C85F71192}" "AspNetVersion" = "8:4.0.30319.0" "RestartWWWService" = "11:FALSE" "RemovePreviousVersions" = "11:TRUE" "DetectNewerInstalledVersion" = "11:FALSE" "InstallAllUsers" = "11:TRUE" - "ProductVersion" = "8:40.2" + "ProductVersion" = "8:40.3" "Manufacturer" = "8:GridcoinResearch" "ARPHELPTELEPHONE" = "8:" "ARPHELPLINK" = "8:" - "Title" = "8:Gridcoin Research 40.2" + "Title" = "8:Gridcoin Research 40.3" "Subject" = "8:" "ARPCONTACT" = "8:The Gridcoin Developers" "Keywords" = "8:Gridcoin Research" diff --git a/contrib/Installer/GridcoinRDTestHarness/GridcoinRDTestHarness/Form1.vb b/contrib/Installer/GridcoinRDTestHarness/GridcoinRDTestHarness/Form1.vb index 15cbeb798d..f3c2020b18 100644 --- a/contrib/Installer/GridcoinRDTestHarness/GridcoinRDTestHarness/Form1.vb +++ b/contrib/Installer/GridcoinRDTestHarness/GridcoinRDTestHarness/Form1.vb @@ -133,7 +133,8 @@ Public Class Form1 'mU.UpdateMagnitudesOnly() 'mU.ShowConfig() - mU.ShowFoundation() + 'mU.ShowFoundation() + mU.ShowDiagnostics() Exit Sub diff --git a/contrib/Installer/GridcoinRDTestHarness/GridcoinRDTestHarness/bin/Debug/GridcoinRDTestHarness.vshost.exe.manifest b/contrib/Installer/GridcoinRDTestHarness/GridcoinRDTestHarness/bin/Debug/GridcoinRDTestHarness.vshost.exe.manifest deleted file mode 100644 index 061c9ca950..0000000000 --- a/contrib/Installer/GridcoinRDTestHarness/GridcoinRDTestHarness/bin/Debug/GridcoinRDTestHarness.vshost.exe.manifest +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/contrib/Installer/boinc/boinc/GRCDiagnostics.vb b/contrib/Installer/boinc/boinc/GRCDiagnostics.vb new file mode 100644 index 0000000000..48d6120c47 --- /dev/null +++ b/contrib/Installer/boinc/boinc/GRCDiagnostics.vb @@ -0,0 +1,50 @@ +Imports System.IO +Imports System.Net.Sockets +Imports System.Globalization + +Public Class GRCDiagnostics + + Public Function GetNISTDateTime() As DateTime + Try + + Dim sNISTHOST As String = "time-nw.nist.gov" 'Atomic Clock Time Server in UTC + Dim client = New TcpClient(sNISTHOST, 13) + Dim localDateTime As DateTime + + Using streamReader = New StreamReader(client.GetStream()) + Dim response = streamReader.ReadToEnd() + Dim utcDateTimeString = response.Substring(7, 17) + '57551 16-06-12 16:57:53 50 0 0 353.8 UTC(NIST) + Dim sChopped As String = Mid(response, 7, 100) + sChopped = Replace(sChopped, "(NIST) *", "") + sChopped = Trim(Left(sChopped, 18)) + sChopped += " UTC" + Dim sYear As String = "20" + Mid(sChopped, 1, 2) + Dim sMonth As String = Mid(sChopped, 4, 2) + Dim sDay As String = Mid(sChopped, 7, 2) + Dim sHour As String = Mid(sChopped, 10, 2) + Dim sMinute As String = Mid(sChopped, 13, 2) + Dim sSecond As String = Mid(sChopped, 16, 2) + localDateTime = New Date(Val(sYear), Val(sMonth), Val(sDay), Val(sHour), Val(sMinute), Val(sSecond)) + End Using + Return localDateTime + Catch ex As Exception + Return CDate("1-1-1970") + End Try + End Function + Public Function VerifyPort(lPortNumber As Long, sHost As String) As Boolean + + Try + Dim client = New TcpClient(sHost, lPortNumber) + Using streamReader = New StreamReader(client.GetStream()) + Dim response = streamReader.ReadToEnd() + 'Note if we made it this far without an error, the result is positive + Return True + End Using + Return True + Catch ex As Exception + Return False + End Try + End Function + +End Class diff --git a/contrib/Installer/boinc/boinc/Utilization.vb b/contrib/Installer/boinc/boinc/Utilization.vb index 3fb47f5321..a60305bc49 100644 --- a/contrib/Installer/boinc/boinc/Utilization.vb +++ b/contrib/Installer/boinc/boinc/Utilization.vb @@ -12,8 +12,6 @@ Public Class Utilization Public _boincmagnitude As Double Private msSentence As String = "" Private mlSpeakMagnitude As Double - - Public ReadOnly Property Version As Double Get Return 409 @@ -21,37 +19,26 @@ Public Class Utilization End Property Private lfrmMiningCounter As Long = 0 - Public ReadOnly Property BoincUtilization As Double - Get - 'Return Val(clsGVM.BoincUtilization) - End Get - End Property - Public Function cGetCryptoPrice(sSymbol As String) As Double Return GetCryptoPrice(sSymbol).Price End Function Public Function cqGetCryptoPrice(sSymbol As String) As Quote Return GetCryptoPrice(sSymbol) End Function - - Public Function SetQuorumData(sData As String) As String - Dim sQuorumData As String = ExtractXML(sData, "") Dim sAge As String = ExtractXML(sQuorumData, "") Dim sQuorumHash As String = ExtractXML(sQuorumData, "") Dim TS As String = ExtractXML(sQuorumData, "") Dim sBlock As String = ExtractXML(sQuorumData, "") Dim sPrimaryCPID As String = ExtractXML(sQuorumData, "") - Log(sData) Call UpdateSuperblockAgeAndQuorumHash(sAge, sQuorumHash, TS, sBlock, sPrimaryCPID) - + Return "" End Function Public Sub TestGZIPBoincDownload() Dim c As New clsBoincProjectDownload c.DownloadGZipFiles() - End Sub Public Function WriteKey(sData As String) As String Try @@ -82,14 +69,12 @@ Public Class Utilization sReq = System.Text.Encoding.UTF8.GetString(b) Return sReq End Function - Public Function StringToByteArray(sData As String) As Byte() - Return modGRC.StringToByte(sData) - End Function Public Function BoincMagnitude(value As String) As String _boincmagnitude = Val(value) + Return "" End Function Public Function cAES512Encrypt(sData As String) As String Return AES512EncryptData(sData) @@ -109,14 +94,13 @@ Public Class Utilization Public Sub StopWireFrameRenderer() If Not mfrmWireFrame Is Nothing Then mfrmWireFrame.EndWireFrame() - End If End Sub Public Sub TestnetSetGenericRPCValue(sData As String) SetRPCReply(sData) End Sub Public Function TestnetGetGenericRPCValue() As String - + Return "" End Function Public ReadOnly Property ClientNeedsUpgrade As Double Get @@ -135,7 +119,6 @@ Public Class Utilization End If End If Log("Ready for upgrade") - If KeyValue("suppressupgrade") = "true" Then Log("Client needs upgraded; Not upgrading due to key.") Return 0 @@ -145,7 +128,6 @@ Public Class Utilization Return 1 End If Log("Client up to date") - Return 0 End Get End Property @@ -154,41 +136,25 @@ Public Class Utilization End Function Sub New() - mclsUtilization = Me - - - Log("L1") - Try - - Try UpdateKey("UpdatingLeaderboard", "false") - Catch ex As Exception Log(ex.Message) - End Try - Try PurgeLog() - Catch ex As Exception - End Try Log("Loading...") - Try - ' If Not DatabaseExists("gridcoin_leaderboard") Then ReplicateDatabase("gridcoin_leaderboard") Catch ex As Exception Log("New:" + ex.Message) End Try - Try Dim sContract As String = GetMagnitudeContract() If Len(sContract) = 0 Then bMagsDoneLoading = False - Catch ex As Exception Log("contract err " + ex.Message) End Try @@ -196,7 +162,6 @@ Public Class Utilization Log("While loading clsUtilization : " + ex.Message) End Try Log("Loaded") - End Sub Sub New(bLoadMiningConsole As Boolean) If bLoadMiningConsole Then ShowMiningConsole() @@ -256,12 +221,11 @@ Public Class Utilization Dim sContract As String = GetMagnitudeContract() Return sContract End Function - - Public Function ShowVotingConsole() + Public Function ShowVotingConsole() As Double Dim fmVoting As New frmVoting fmVoting.Show() + Return 1 End Function - Public Function ShowForm(sFormName As String) As String Try Dim vFormName() As String @@ -287,49 +251,61 @@ Public Class Utilization End Try End Function - - Public Function ShowNewUserWizard() + Public Function ShowNewUserWizard() As Double Dim fNUW As New frmNewUserWizard fNUW.Show() + Return 1 End Function - Public Function ShowConfig() + Public Function ShowConfig() As Double Try mfrmConfig = New frmConfiguration mfrmConfig.Show() Catch ex As Exception Log("Error while transitioning to frmConfig" + ex.Message) End Try + Return 1 End Function - Public Function ShowFAQ() + Public Function ShowFAQ() As Double Try - mfrmFaq = New frmFAQ - mfrmFaq.show() + mfrmFAQ = New frmFAQ + mfrmFAQ.Show() Catch ex As Exception Log("Error:FAQ") End Try + Return 1 End Function - Public Function ShowTicketAdd() + Public Function ShowTicketAdd() As Double Try mfrmTicketAdd = New frmTicketAdd mfrmTicketAdd.Show() Catch ex As Exception Log("Error while transitioning to frmTicketAdd" + ex.Message) End Try + Return 1 + End Function + Public Function ShowDiagnostics() As Double + Try + mFrmDiagnostics = New frmDiagnostics + mFrmDiagnostics.Show() + Catch ex As Exception + Log("Error while showing Diagnostics" + ex.Message) + End Try + Return 1 End Function Public Function muFileToBytes(SourceFile As String) As Byte() Return FileToBytes(SourceFile) End Function - Public Function ShowFoundation() + Public Function ShowFoundation() As Double Try mfrmFoundation = New frmFoundation mfrmFoundation.Show() Catch ex As Exception Log("Error while showing frmFoundation " + ex.Message) End Try + Return 1 End Function - - Public Function ShowTicketList() + Public Function ShowTicketList() As Double Try mGRCData = New GRCSec.GridcoinData mfrmLogin = New frmLogin @@ -338,61 +314,52 @@ Public Class Utilization Catch ex As Exception Log("Error while transitioning to frmTicketList" + ex.Message) End Try + Return 1 End Function - Public Function ShowTicker() + Public Function ShowTicker() As Double Try mfrmTicker = New frmLiveTicker mfrmTicker.Show() Catch ex As Exception Log("Error while booting ticker " + ex.Message) End Try + Return 1 End Function - - Public Function ShowLeaderboard() + Public Function ShowLeaderboard() As Double mfrmLeaderboard = New frmLeaderboard mfrmLeaderboard.Show() + Return 1 End Function - - Public Function ShowMiningConsole() + Public Function ShowMiningConsole() As Double Try lfrmMiningCounter = lfrmMiningCounter + 1 - If mfrmMining Is Nothing Then mfrmMining = New frmMining End If - mfrmMining.Show() - Catch ex As Exception End Try + Return 1 End Function - - Public ReadOnly Property SourceBlock As String - Get - - End Get - End Property - Public Function TestOutdated(ByVal sdata As String, ByVal mins As Long) As Boolean Return Outdated(sdata, mins) End Function Public Function TestKeyValue(ByVal sKey As String) As String Return KeyValue(sKey) End Function - Public Function TestUpdateKey(ByVal sKey As String, ByVal sValue As String) + Public Function TestUpdateKey(ByVal sKey As String, ByVal sValue As String) As Double Call UpdateKey(sKey, sValue) + Return 1 End Function Public Sub ExecuteCode(ByVal sCode As String) Log("Executing smart contract " + sCode) Dim classSmartContract As New GridcoinSmartContract classSmartContract.ExecuteContract(sCode) - End Sub Public Sub SpeakSentence(sSentence As String) msSentence = sSentence Dim t As New Threading.Thread(AddressOf SpeakOnBackgroundThread) t.Start() - End Sub Public Sub SpeakOnBackgroundThread() Dim S As New SpeechSynthesis @@ -421,17 +388,16 @@ Public Class Utilization End Function Public Function TrackConfirm(sTXID As String) As String - Log("Tracking " + Trim(sTXID)) Try Dim lOut As Double = mTrackConfirm(sTXID) Log("Returning " + Trim(lOut)) Return Trim(lOut) Catch ex As Exception - Log("HEINOUS ERROR" + ex.Message) + Log("ERROR" + ex.Message) Return "0" End Try - 'return a 0 or 1 + 'Return a 0 or 1 End Function Public Function InsertConfirm(sConfirm As String) As Double Log(sConfirm) @@ -457,11 +423,10 @@ Public Class Utilization mlMagnitude = Val(vSession(2)) Catch ex As Exception Log("SetSessionInfo " + ex.Message) - End Try + Return 1 End Function Public Function ExplainMag(sCPID As String) As String - ' Log("Neural request for " + sCPID) If bMagsDoneLoading = False Then Log("This node is still syncing.") Return "" @@ -488,7 +453,6 @@ Public Class Utilization End Try Return "SUCCESS" End Function - Public Function SetGenericVotingData(sValue As String) As Double Return SetGenericData("POLLS", sValue) End Function @@ -503,7 +467,6 @@ Public Class Utilization Catch ex As Exception Return 0 End Try - End Function Public Function SetTestNetFlag(sData As String) As Double Try @@ -519,28 +482,26 @@ Public Class Utilization End Try Return 1 End Function - Public Function TestMag2015() - StoreTestMagnitude() - - End Function - Public Function TestPDS() - TestPDS1() - - End Function Public Function SyncCPIDsWithDPORNodes(sData As String) As Double 'Write the Gridcoin CPIDs to the Persisted Data System Try msSyncData = sData - Call SyncDPOR2() Catch ex As Exception Log("Exception during SyncDpor2 : " + ex.Message) Return -2 End Try Log("Finished syncing DPOR cpids.") - Return 0 - + End Function + Public Function PushGridcoinDiagnosticData(sData As String) As Double + Try + msSyncData = sData + Catch ex As Exception + Log("Exception during PushGridcoinDiagnosticData : " + ex.Message) + Return -2 + End Try + Return 1 End Function Public Sub UpdateMagnitudesOnly() EnsureNNDirExists() @@ -549,7 +510,6 @@ Public Class Utilization Call UpdateMagnitudes() End Sub Public Sub AddressUserThread() - Try Log("Speaking " + Trim(mlSpeakMagnitude)) Dim s As New SpeechSynthesis @@ -557,13 +517,11 @@ Public Class Utilization Catch ex As Exception Log("Unable to initialize speech") End Try - End Sub Public Function AddressUser(sMagnitude As String) As Double Dim t As New Threading.Thread(AddressOf AddressUserThread) mlSpeakMagnitude = Val("0" + Trim(sMagnitude)) t.Start() - Return 1 End Function Public Sub SetSqlBlock(ByVal data As String) @@ -582,34 +540,20 @@ Public Class Utilization Public Function GetLanIP() As String Return GetLocalLanIP1() End Function - Public ReadOnly Property BoincProjectCount As Double - Get - End Get - End Property Public Sub clsLogOff() If mGRCData Is Nothing Then mGRCData = New GRCSec.GridcoinData - mGRCData.LogOff(GetSessionGuid) End Sub - Public ReadOnly Property BoincTotalHostAverageCredits As Double - Get - End Get - End Property - Public Sub ShowEmailModule() Dim e As New frmMail e.Show() e.RetrievePop3Emails() End Sub - Protected Overrides Sub Finalize() Try - MyBase.Finalize() Catch ex As Exception - End Try - End Sub End Class diff --git a/contrib/Installer/boinc/boinc/bin/Debug/BoincStake.tlb b/contrib/Installer/boinc/boinc/bin/Debug/BoincStake.tlb index e50fb8f878..50c7099d8f 100644 Binary files a/contrib/Installer/boinc/boinc/bin/Debug/BoincStake.tlb and b/contrib/Installer/boinc/boinc/bin/Debug/BoincStake.tlb differ diff --git a/contrib/Installer/boinc/boinc/bin/Debug/GRCSec.xml b/contrib/Installer/boinc/boinc/bin/Debug/GRCSec.xml index 2baee27df7..08cc22e273 100644 Binary files a/contrib/Installer/boinc/boinc/bin/Debug/GRCSec.xml and b/contrib/Installer/boinc/boinc/bin/Debug/GRCSec.xml differ diff --git a/contrib/Installer/boinc/boinc/boincstake.vbproj b/contrib/Installer/boinc/boinc/boincstake.vbproj index 2451c66ebf..cc8a99f317 100644 --- a/contrib/Installer/boinc/boinc/boincstake.vbproj +++ b/contrib/Installer/boinc/boinc/boincstake.vbproj @@ -96,6 +96,12 @@ + + frmDiagnostics.vb + + + Form + frmRain.vb @@ -246,6 +252,7 @@ Form + @@ -286,6 +293,9 @@ + + frmDiagnostics.vb + frmRain.vb diff --git a/contrib/Installer/boinc/boinc/frmDiagnostics.Designer.vb b/contrib/Installer/boinc/boinc/frmDiagnostics.Designer.vb new file mode 100644 index 0000000000..9fc99d6a86 --- /dev/null +++ b/contrib/Installer/boinc/boinc/frmDiagnostics.Designer.vb @@ -0,0 +1,122 @@ + _ +Partial Class frmDiagnostics + Inherits System.Windows.Forms.Form + + 'Form overrides dispose to clean up the component list. + _ + Protected Overrides Sub Dispose(ByVal disposing As Boolean) + Try + If disposing AndAlso components IsNot Nothing Then + components.Dispose() + End If + Finally + MyBase.Dispose(disposing) + End Try + End Sub + + 'Required by the Windows Form Designer + Private components As System.ComponentModel.IContainer + + 'NOTE: The following procedure is required by the Windows Form Designer + 'It can be modified using the Windows Form Designer. + 'Do not modify it using the code editor. + _ + Private Sub InitializeComponent() + Dim DataGridViewCellStyle1 As System.Windows.Forms.DataGridViewCellStyle = New System.Windows.Forms.DataGridViewCellStyle() + Dim DataGridViewCellStyle2 As System.Windows.Forms.DataGridViewCellStyle = New System.Windows.Forms.DataGridViewCellStyle() + Dim DataGridViewCellStyle3 As System.Windows.Forms.DataGridViewCellStyle = New System.Windows.Forms.DataGridViewCellStyle() + Dim DataGridViewCellStyle4 As System.Windows.Forms.DataGridViewCellStyle = New System.Windows.Forms.DataGridViewCellStyle() + Dim DataGridViewCellStyle5 As System.Windows.Forms.DataGridViewCellStyle = New System.Windows.Forms.DataGridViewCellStyle() + Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(frmDiagnostics)) + Me.btnRunDiagnostics = New System.Windows.Forms.Button() + Me.Label3 = New System.Windows.Forms.Label() + Me.dvDiag = New System.Windows.Forms.DataGridView() + CType(Me.dvDiag, System.ComponentModel.ISupportInitialize).BeginInit() + Me.SuspendLayout() + ' + 'btnRunDiagnostics + ' + Me.btnRunDiagnostics.BackColor = System.Drawing.Color.Black + Me.btnRunDiagnostics.ForeColor = System.Drawing.Color.FromArgb(CType(CType(128, Byte), Integer), CType(CType(255, Byte), Integer), CType(CType(128, Byte), Integer)) + Me.btnRunDiagnostics.Location = New System.Drawing.Point(25, 417) + Me.btnRunDiagnostics.Name = "btnRunDiagnostics" + Me.btnRunDiagnostics.Size = New System.Drawing.Size(177, 29) + Me.btnRunDiagnostics.TabIndex = 8 + Me.btnRunDiagnostics.Text = "Run Diagnostics" + Me.btnRunDiagnostics.UseVisualStyleBackColor = False + ' + 'Label3 + ' + Me.Label3.AutoSize = True + Me.Label3.ForeColor = System.Drawing.Color.Lime + Me.Label3.Location = New System.Drawing.Point(23, 30) + Me.Label3.Name = "Label3" + Me.Label3.Size = New System.Drawing.Size(139, 13) + Me.Label3.TabIndex = 5 + Me.Label3.Text = "Gridcoin Diagnostic System:" + ' + 'dvDiag + ' + DataGridViewCellStyle1.BackColor = System.Drawing.Color.Black + DataGridViewCellStyle1.ForeColor = System.Drawing.Color.Lime + DataGridViewCellStyle1.SelectionBackColor = System.Drawing.Color.Gray + DataGridViewCellStyle1.SelectionForeColor = System.Drawing.Color.FromArgb(CType(CType(128, Byte), Integer), CType(CType(255, Byte), Integer), CType(CType(128, Byte), Integer)) + Me.dvDiag.AlternatingRowsDefaultCellStyle = DataGridViewCellStyle1 + Me.dvDiag.BackgroundColor = System.Drawing.Color.Black + DataGridViewCellStyle2.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft + DataGridViewCellStyle2.BackColor = System.Drawing.Color.Black + DataGridViewCellStyle2.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte)) + DataGridViewCellStyle2.ForeColor = System.Drawing.Color.Lime + DataGridViewCellStyle2.SelectionBackColor = System.Drawing.SystemColors.Highlight + DataGridViewCellStyle2.SelectionForeColor = System.Drawing.SystemColors.HighlightText + DataGridViewCellStyle2.WrapMode = System.Windows.Forms.DataGridViewTriState.[True] + Me.dvDiag.ColumnHeadersDefaultCellStyle = DataGridViewCellStyle2 + Me.dvDiag.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize + DataGridViewCellStyle3.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft + DataGridViewCellStyle3.BackColor = System.Drawing.Color.Black + DataGridViewCellStyle3.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte)) + DataGridViewCellStyle3.ForeColor = System.Drawing.Color.Lime + DataGridViewCellStyle3.SelectionBackColor = System.Drawing.SystemColors.Highlight + DataGridViewCellStyle3.SelectionForeColor = System.Drawing.SystemColors.HighlightText + DataGridViewCellStyle3.WrapMode = System.Windows.Forms.DataGridViewTriState.[False] + Me.dvDiag.DefaultCellStyle = DataGridViewCellStyle3 + Me.dvDiag.EnableHeadersVisualStyles = False + Me.dvDiag.GridColor = System.Drawing.Color.FromArgb(CType(CType(0, Byte), Integer), CType(CType(64, Byte), Integer), CType(CType(64, Byte), Integer)) + Me.dvDiag.Location = New System.Drawing.Point(25, 46) + Me.dvDiag.Name = "dvDiag" + DataGridViewCellStyle4.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft + DataGridViewCellStyle4.BackColor = System.Drawing.Color.Black + DataGridViewCellStyle4.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte)) + DataGridViewCellStyle4.ForeColor = System.Drawing.Color.Lime + DataGridViewCellStyle4.SelectionBackColor = System.Drawing.SystemColors.Highlight + DataGridViewCellStyle4.SelectionForeColor = System.Drawing.Color.FromArgb(CType(CType(0, Byte), Integer), CType(CType(64, Byte), Integer), CType(CType(0, Byte), Integer)) + DataGridViewCellStyle4.WrapMode = System.Windows.Forms.DataGridViewTriState.[True] + Me.dvDiag.RowHeadersDefaultCellStyle = DataGridViewCellStyle4 + DataGridViewCellStyle5.BackColor = System.Drawing.Color.Black + DataGridViewCellStyle5.ForeColor = System.Drawing.Color.Lime + Me.dvDiag.RowsDefaultCellStyle = DataGridViewCellStyle5 + Me.dvDiag.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect + Me.dvDiag.Size = New System.Drawing.Size(882, 346) + Me.dvDiag.TabIndex = 65 + ' + 'frmDiagnostics + ' + Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) + Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font + Me.BackColor = System.Drawing.Color.Black + Me.ClientSize = New System.Drawing.Size(937, 666) + Me.Controls.Add(Me.dvDiag) + Me.Controls.Add(Me.btnRunDiagnostics) + Me.Controls.Add(Me.Label3) + Me.Icon = CType(resources.GetObject("$this.Icon"), System.Drawing.Icon) + Me.Name = "frmDiagnostics" + Me.Text = "Gridcoin Diagnostic System" + CType(Me.dvDiag, System.ComponentModel.ISupportInitialize).EndInit() + Me.ResumeLayout(False) + Me.PerformLayout() + + End Sub + Friend WithEvents btnRunDiagnostics As System.Windows.Forms.Button + Friend WithEvents Label3 As System.Windows.Forms.Label + Friend WithEvents dvDiag As System.Windows.Forms.DataGridView +End Class diff --git a/contrib/Installer/boinc/boinc/frmDiagnostics.resx b/contrib/Installer/boinc/boinc/frmDiagnostics.resx new file mode 100644 index 0000000000..57f5335e7e --- /dev/null +++ b/contrib/Installer/boinc/boinc/frmDiagnostics.resx @@ -0,0 +1,411 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + + AAABAAIAICAAAAAAIACoEAAAJgAAAEBAAAAAABgAKDIAAM4QAAAoAAAAIAAAAEAAAAABACAAAAAAAIAQ + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADo6vCV5ebs/+Dg5//l5Ov/5eXo/+Tk5v/i4+X/5Obq/+zv + 8//l6u7/3uXq/93k6v/e5uv/4eju/+Ho7//c5On/2uHm/93i5f/f4+X/5Obn/+bm5v/m5+X/6+ro/+ro + 5f/j4+D/4eDf/97g3v/g4uOVAAAAAAAAAAAAAAAAAAAAAOnr8JXm5+7/6+vy/+bl7P/i4uX/3t7h/+Lk + 5//q7PD/7O/z/+Xp7v/k6u//4ujv/9zi6P/i6e//3+Xs/9vh5//g5er/5Ojs/+fq7P/n6uv/6evr/+nq + 6f/m5uT/5eXi/+Li4P/h4uL/4uPj/+Xn6JUAAAAAAAAAAAAAAAAAAAAA6+7zlenr8f/r6/L/4+Tq/97d + 4f/f4OP/5ujr/+3v8v/U2Nv/5erv/+ft8f/n7PL/w8jM/87T2P/e5Or/4efs/+Tq7//n6+//6e3v/+rt + 7f/r7u7/6uzs/+fo6P/l5ub/5ebm/+bo6P/l6On/6OrtlQAAAAAAAAAAAAAAAAAAAADn7PCV5eju/+Dh + 6P/g4Of/4eLl/+jq7f/v8fT/8fP2/7O3uv/O09f/7/T4/+zw9v/P09n/qq6x/+Dm6f/n7PD/6e7y/+vw + 8//q7vD/7O/w/+rt7v/p6+v/6evr/+Xn6P/o6+z/7fDx/+3w8v/s8PKVAAAAAAAAAAAAAAAAAAAAAOPo + 7ZXi5uz/4OLp/+Dh5//l5+r/6u3v/+/y9f/r7vD/x8vO/7m9wf/t8PX/5efu/9zf5v+eoqX/3uLk/+ru + 8f/u8fX/7fL0/+3w8//t8fP/7e/y/+zv8P/s7/D/7PDy/+zw8v/r7vH/6+/x/+fs7pUAAAAAAAAAAAAA + AAAAAAAA4efsleDk6v/f4uj/4+br/+rt8P/r7/H/6u3w/+Dj5//Y297/rK+z/+Ll6//h4un/4+Tr/62w + s//U19n/8PP2//Dz9f/t8fP/7O/x/+3x8//u8vT/7vHz/+vv8f/t8fX/6/Dz/+js7//o7PD/5+vulQAA + AAAAAAAAAAAAAAAAAADg5eqV4OXq/+Xo7v/s7vT/6/Dy/+fs7v/i5+n/4eXo/+Tn7P+kp6r/0NPY/9LT + 2f/Jyc//q62w/6+ytP/Y293/4uXo/+zv8f/u8/X/7fL1/+7y9f/s8PT/6Ozw/+fs8f/r8fb/6e7z/+fs + 8f/k6e6VAAAAAAAAAAAAAAAAAAAAAN7l6pXl6u//6+70/+vt8//n7O//5Onr/+Dl5//j5+r/1tnd/5ib + nv+foaX/o6Sq/5+fpf+XmJv/hYiJ/5mbnf+anZ7/ra+w/8vP0P/f5Of/6u7y/+3x9f/q7vL/5uzx/+3z + +f/q8fb/6e7z/+fs8ZUAAAAAAAAAAAAAAAAAAAAA4efslenv9P/o7PL/4+js/+Hq7P/h6ez/4efr/87R + 1v+ur7X/o6Wr/6CiqP/X2+X/5On0/+br8f+ipqj/2Nzg/8XJzP+ipKf/gIKE/5aYmv/Hysz/6ezv/+ns + 8P/p7vL/7vP3/+7z9//u8/f/7vP3lQAAAAAAAAAAAAAAAAAAAADq7/OV5uvw/+Hm6//f5er/2+Xo/+Ts + 7//P1dn/vsHH/87Q2f/U1d//mp6i/9jd5f/f5u//5Onv/7W5vP/Lz9P/5+vw/+To7f/U19z/o6ao/4OF + h/+srrH/297i/+ru8v/v9Pf/8PX4/+/z9v/v8/aVAAAAAAAAAAAAAAAAAAAAAO/z9pXk6e3/4ufr/+Hn + 7P/i6u3/2N/i/8PIzf/O0tn/yszU/87P1v+nqq7/0dXb/+Xr8v/s8PX/19rd/7O2uf/n6u7/4eXq/93i + 5//k6O3/zdHV/6msr//X297/6e7x//D0+P/x9vn/8PT3//D095UAAAAAAAAAAAAAAAAAAAAA6+7xlefr + 7v/n6+//5Oru/+Pp7P/N09b/09ne/8DEyf/Dxcr/5ebt/77Bxv/Hy9H/7PH4/+7y+P/n6u7/q6+x/+zw + 9P/u8vX/5+zv/+bs8f+3vMD/u77A/+jt8P/v8/b/8vb5//D0+P/u8vX/7fL1lQAAAAAAAAAAAAAAAAAA + AADo6uyV6e3w/+bq7v/p7fD/3eDj/9LW2v/N0NX/rbCz/97h5f/u8Pb/0tbb/7a6v//u8/n/6e3x/8zO + 0v+WmZv/wsbJ/8fLzv/KztH/4Obr/6issP+7vsH/7fL1/+/z9v/w9Pf/7/T3//D09//x9fmVAAAAAAAA + AAAAAAAAAAAAAObp7JXo6+3/6Ovt/+zu8f/d3eD/2Njd/7S2uf+5u73/6Ovv/+7z9v/o7PH/pquu/+7z + +P/o7vL/vsTH/4eLjf+MkZP/l52f/6uxtP/l7fH/qrCz/7S5u//q8PP/7fL1//D1+P/v9Pf/7/P2/+7y + 9pUAAAAAAAAAAAAAAAAAAAAA5Ofnlert7v/s7/L/6Ort/9/d3//a2Nv/mZma/8rNz//s8fT/7fP2//D1 + +f+xtbj/3+Po/+Tq7v/l7vL/0drd/620tv/l7vP/5e7y/+fw9P+3vsH/qq+x/9/k6P/t8fX/8fX4//D0 + 9//v8/b/7/T3lQAAAAAAAAAAAAAAAAAAAADq7O2V6+7v/+jr7P/l5uj/3trb/9jT1v+NjI3/x8vM/+zx + 9P/t8/b/7vX3/83R1P++wcX/5evv/+Hp7f/k7O//oaep/9/n6v/k7PD/5e3x/+Hp7f/g5+r/6e/x//D0 + +P/y9vr/8fb5//H1+f/y9vmVAAAAAAAAAAAAAAAAAAAAAO7x8ZXr7u7/5Obn/+Xl5v/g2dv/2tTW/5OS + kv+2ubv/6e/x/+zz9v/s8/X/3+Pm/6yvsv/p7/L/6fDz/+ry9f+zubv/0dja/+ry9P/s8/b/6/L1/+72 + +f/w+Pr/8/f6//P3+//x9fn/8PX4//L2+ZUAAAAAAAAAAAAAAAAAAAAA7vHwlent7P/j5uf/5ubn/+Dc + 3f/a1tj/r66w/5GSk//d4eP/5+7w/+Pr7f/k6uz/qK2v/+Pp6//q8PP/6vDz/8nO0P/Axcf/6/Hz/+Xq + 7f/p7/L/7vX4//L3+//z9/r/8vf5//D0+P/u8vb/7fL1lQAAAAAAAAAAAAAAAAAAAADv8/GV5+rp/9/j + 4f/i5OP/4+Pk/97e4v/S1Nj/gYOE/66ys//b4+T/3+nq/+Pt7/+ss7T/1tvd/+vt8f/v8fX/3d/i/6+z + tf/a3eL/tbi8/9LW2v/t8fj/8fX6//P2+f/z9/r/8fX4/+vw8//n7fCVAAAAAAAAAAAAAAAAAAAAAOnr + 65Xk5+b/4OPh/+Hi4v/k5ej/5ebq/+fq7v+3u73/fYCC/6etrv/P2Nn/2uTm/77HyP+9wsT/8PP2/+zv + 8//i5ej/mZ2f/8nN0v+cn6P/o6eq/+fr8f/t8fX/8fT4//L1+P/t8fT/6O3w/+nt8JUAAAAAAAAAAAAA + AAAAAAAA5OTkleTk5P/k5eT/5eXl/+nq6//r7O//5+ns/+bt7//Dycv/g4mK/4eMjf+gpqj/s7q7/5KX + mf/Cxsj/s7e5/7G1uP+fpKf/x8/T/8nR1f+UmZr/193f/+zx9f/v8vX/7vH0/+/y9v/q7fH/4ubplQAA + AAAAAAAAAAAAAAAAAADi4uKV5uXm/+bm5v/p6er/6+3v/+3w8v/s7/L/5uvt/+Xs7//c5ej/vcbI/6ew + sf+dpab/iI2P/6Oqrf+5wsT/1d7h/83W2v+psLL/1d3f/8nP0f/b4eP/6u/x/+zu8v/q7PD/6+7y/+fq + 7v/e4eaVAAAAAAAAAAAAAAAAAAAAAOLh4pXo5+n/6err/+3u8P/s7vH/8PP2/+/y9f/s8PL/5+3v/+Hp + 6//g6u3/4Ovt/9zo6v+xur3/usTI/9rl6f/b5en/0dnc/5+lpv/c4uT/4ujp/93j4//i5+j/6Ort/+Xn + 6//k5ur/4ePo/+Dj5pUAAAAAAAAAAAAAAAAAAAAA5OPllerr7v/s7vH/7e/y/+7y8//u8vT/7PHz/+3x + 9P/t8vX/6vHz/+rx8//r8fP/5+/x/8rR0/+xt7v/3uXp/+Lp7P/k6uv/q6+x/9re3//i5+b/297e/97g + 4P/g4eT/3d7i/9/h5f/f4eX/4ePnlQAAAAAAAAAAAAAAAAAAAADm6OuV7fDz/+/y9v/t8fT/7PHz/+zx + 8//t8vT/7vP1/+3z9f/s8fT/7/X4//D3+f/r8fP/4Obq/6Wqrf/i6e3/6e7x/+zx8v+8v8D/w8bG/9/g + 4P/d3tz/4ODf/+Dh5P/e3uP/4OLm/9/h5f/h4+aVAAAAAAAAAAAAAAAAAAAAAOnu8JXr8PP/7vP3/+zy + 9f/n7e//7vT2/+/2+P/u9ff/8fb4/+/09v/v9Pb/7/X3/+7z9f/r7/T/pqqt/9zg5P/v8vX/7/Hz/9XW + 2P+sra3/397c/9/d2v/i4N//4eHk/+Dg5f/j5Oj/4uPn/+Pl6JUAAAAAAAAAAAAAAAAAAAAA7fL0lenx + 8//q8/f/6PH0/+vy9f/w9vj/8ff5//D2+P/x9/n/8PX3/+7z9f/u8/X/7vP1/+vv8//Cxsr/wcTH//Hz + 9v/t7vD/5eXl/9DOzf/h3dr/3trW/+Pg3f/i4eP/4eHl/+Tl6f/i5Of/4uXnlQAAAAAAAAAAAAAAAAAA + AADp7vCV6O7x/+jw8//r8vX/8PX4//D2+P/x9vj/7/X4/+709//r8PX/6vD1/+rw9P/n7fH/6e7z/+Hj + 6f/P0tX/7e/z/+fp6//i4eL/4+Hf/+Pf3P/i3tr/5ePg/+Pl5v/j5un/5Ojq/+Xo6v/d4uSVAAAAAAAA + AAAAAAAAAAAAAOPo6ZXo7vD/5+3x/+/1+P/w9Pf/8vb3//H1+P/s8fb/6u/0/+ju8//m7fP/5Orw/+Tq + 8P/p7/X/6+70/+nr7//p7O//5ujp/+Hh4f/i4N//5OHf/+jk4P/o5uT/5Ofo/+Lo6v/k6ev/5urs/+Xq + 7JUAAAAAAAAAAAAAAAAAAAAA3eLklezx8//k6u7/6vD0//D09v/w9Pb/7vL1/+ru8v/n7PD/5uzw/+bs + 8f/i6e7/5evx/+ft8//n7PL/5Onu/+Xp7f/j5un/3+Hh/+Lj4v/n5+b/6unm/+bl4//m6er/5ers/+br + 7f/i5+n/6/DylQAAAAAAAAAAAAAAAAAAAADi5+mV6u/y/+Dn6v/o7vH/8vb4/+/z9f/t8fP/7PDy/+vw + 8//q8fT/5+zx/+Lp7v/j6e//5Orw/+fu8//k6u//4efq/93i5P/g5OX/5+rq/+ns6//m5+b/4uTj/+To + 6f/k6ev/5Onr/+Hm6P/p7vCVAAAAAAAAAAAAAAAAAAAAAOnu8JXr8PP/5Ovt/+rw8v/y9Pb/8vX1//D0 + 9f/v8vT/7/P1/+3x9P/h5ur/4ufs/+Xr8P/k6/D/5e7y/+Hp7f/h6Ov/4ujq/+Xq7P/p7+//5erp/+Dk + 4//k6ej/4+jp/+Hm6P/h5uj/5Onr/+vw8pUAAAAAAAAAAMAAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AA + AAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AA + AAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADKAAAAEAAAACAAAAAAQAYAAAA + AAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMrJ + y8nIysnIysbIycPFxsDCw7W2t7W2t6epqqepqp2cnp2cnpeYmZeYmZeTlZeTlZKTlJCUk5CSko+Sk4+S + k5OSlJKRkpGSk4+RkpCPkYyLjIeKi4KDhIKDhH9/gH9/gHV1eXV1eXV1eXd3eHd3eHh5enx8fX5/gH+C + goeFhoeHioqKjYiJjIeIi4eIi4aHh4KDg35+gH5+gH1/gH1/gHt8fXt8fX17fX17fXt7fX16fX16fX98 + f3x8gH9+goKBhMrJy8nIysjHycbFx8PCxL2/wK+xsq+xsp+hop+hopqZmpqZmpaTlZaTlZOTlJOTlJGQ + kY+RkYyNjYqLjIqLjIyLjYuKi4mLi4iKioiHiYOEhX6BgXh3eHh3eG9wcG9wcGhoamhoamhoamhoaWho + aWxtbW9wcXJzdHd2eHx+foCDgoSGhYSFhYaFiIaFiIKBgn19fnh3eXh3eXZ2enZ2enZ3dXZ3dXV3d3V3 + d3l3eHh4enh4end4e3Z4ent7fX9+f8rJy8nIysjHycTGx77Awbi3uZKZoJKZoK3D2K3D2Ieqzoeqzoyw + 1Iyw1HGVuXGVuXCVum2RuYKmzmqPuWqPuZC134+03n6izGmPuWuQvT1kkBI5ZXOaxnOaxkpxnUpxnTpi + jjpijjpijhI6ZxI6ZzZeizxjkRc4aS9Of2+Pv2uMuXGTwHqdx57C6p7C6oWpz3OYvZK13ZK13X6gyn6g + ynmYwnmYwoSgyYSgyXSSt3WStHWStHKJonKAjnx9goJ/gcrJy8nIysXHyMHDxLu9vrKzt0tig0tig5q3 + 3Jq33I6ow46ow5SsxJSsxIymvoymvmuBmnWLpXmPqV50jl50jnWMp3mQqnaLpXOJol51jzVNZjNKY2uC + m2uCm09ngU9ngVlyjVlyjVlyjURceURceUtlg0pkgzRKbSE2V1VsjlxzlG6HpnSOrYWhvoWhvoSgvXOP + rJCszJCszHiUt3iUt3uWunuWuoefw4efw4Ccv4amyoamynOUtGOBoICFjISFhsvKzMnIysXExsC/wq+5 + x5y74nCCmnCCmpaVlpaVlpaUlZaUlZKUlJKUlI+RlI+RlIKFh3p7fXV0dV1dX11dX1ZVVk5PU0lOVEZM + VE1UXU5aZU9db1dpf1dpfzpMYTpMYUJQYkJQYkJQYjpBSjpBSjo+QzY2OTg4ODs7O0A/P0dGSFNbZVxl + b11lbV1lbWFocWlzfHqDjnqDjnR8iHR8iHmEjXmEjXt+gXt+gX9/f4Slx4Slx5W64IGQo4OEh4iKisvK + zMnIysXExsC/wq+5x5y74nCCmnCCmpaVlpaVlpaUlZaUlZKUlJKUlI+RlI+RlIKFh3p7fXV0dV1dX11d + X1ZVVk5PU0lOVEZMVE1UXU5aZU9db1dpf1dpfzpMYTpMYUJQYkJQYkJQYjpBSjpBSjo+QzY2OTg4ODs7 + O0A/P0dGSFNbZVxlb11lbV1lbWFocWlzfHqDjnqDjnR8iHR8iHmEjXmEjXt+gXt+gX9/f4Slx4Slx5W6 + 4IGQo4OEh4iKisrJy8nIysbFx7u8wpm015++5JucnpucnpSWlpSWlpSRk5SRk4yWnoyWnoiZq4iZq15v + gGVwfWt0fFtgZVtgZVBXYEFPXTlOZDdRa1Zwi0piekBWbD1PYj1PYjJBUjJBUi49TS49TS49TUBUa0BU + a0NTZTtETzc8Qjc3OTg4OUZLUmyNtnebxWJ/nmJ/nlp2l3KVu6LE7aLE7Xmbw3mbw4OkzIOkzHyJlnyJ + loOIjVt/pFt/pIyjuoSEhoWGiYqLjMrJy8nIysXExqa0xI6w1p20z5qbnJqbnJKTk5KTk36HlH6HlISm + y4Smy22XxG2XxCBJckpwll9+nF1ugF1ugEtngjdTbipCWSA1SSk6TCs7TDFBUj9UaD9UaEFXbEFXbCEu + OyEuOyEuOxwmMRwmMSw6STpQZzhKYDxFUDw/Q01aaHygyX6m04er1Yer1Vt6nGyEn4efu4efu2uDm2uD + m4ar1Iar1IyftIyftIGYsHuQp3uQp4eIi4SGi4uJi4+OkMrJy8nIysPDx4OlyZCszq+usJqZmpqZmnGK + pHGKpDtehjtehmp7i2p7i4iKj4iKj4KWqI+55HOYukFVZ0FVZ09nfVx7lmOColl9oFB4oVV/qVJ8pmeR + vGeRvIKs14Ks132m0X2m0X2m0WqOtGqOtC9HXx4sOhgfKBUdJj5QZVJhc0NGS0BBQVhmdlhmdnWbxV5z + i1FSUlFSUniLn3iLn4umw4umw5GYoZGYoYyju46Umo6Umn+gwHSInY6Oj5KRk8nIysjHybfAy4Wo0KGx + w7KwsJOapJOapHWUt3WUt4KBgoKBgoODg4ODg3yFkHyFkHKTtmqLrG2RtI+23I+23JG43Y+224yz2IKp + 0HefyXiizXehzG6Yw26Yw3CaxXCaxW+ax2+ax2+ax2uWwmuWwkl0oEt1oG6QuEZbchkgKREXHTRFWVJi + dEVGR0VGR4Sp03mWtn6Xs36Xs2l7kGl7kH+Ag3+Ag5OfrpOfrp2gnm6Rs26Rs1Fxk4GNmY2PjpGTlMnI + ysjHybW/y32hyaOwwLOysoeasIeasH2QpX2QpXx9fXx9fX18fn18foKev4Kev26LrHeXuYCkyYqv1Yqv + 1Ymv0o+12Iux1HifxW+XwW6Yw3ehzYSw24Sw23GcyXGcyYS05YS05YS05W6f0G6f0EJyo0FxoliDtm+U + wFFogyErNxMaIjxNYUtSWktSWnufxnKQs42qzo2qzllaXFlaXHp7e3p7e42esI2esJ+dnlyBqFyBqH+D + jY2Mj46Oj5STlszJy8jHycLFzIux26e4z7a2tn2fyH2fyIWFh4WFh3Z0dXZ0dXeLpXeLpYqozIqozH2f + x4Sn0JG13YSpz4Spz42y2I+02oaq0H2jymqTvnCcyoaz4ajc/6jc/32s3H2s3HOgz3Ogz3Ogz2eWxmeW + xnen2GaZzEN0rDttplWIw7Lm/3yiyTxOZCs3RCs3RE1kfWeBnj48PT48PUpLS0pLS2pra2pra4aZr4aZ + r5aUlEJplUJplYqLjomGioyLjpCRlMrJy8fGyMbFyIir0Zq01Li4uYCizYCizYeGh4eGh3FwcXFwcXSV + v3SVv4amzIamzGSIsHueyoGlzn+kyn+kyoar0YGly3qew3+lzHafyXKfzI245ZbB4pbB4pC97JC97Flt + hFlthFlthHaNpnaNpnGNrGiMrU9znkRrmkx4roe57aze/3ugyCYwPCYwPDdHWkxYZDo6Ojo6OkNDREND + RF5eX15eX4+jvY+jvYyOjjJZhjJZho2KjYqIiYmLi5CQlMnIysnIysfGyKWxwG2Ru4+kvG+OtG+OtIyL + jIyLjGd8kmd8kqfN9KfN9H2k0X2k0XSbyHidy4Kp1nOZwHOZwGOEp2iKr2uOtXWXu36Zsm95gnN1d3WH + mnWHmmOQvWOQvXOJn3OJn3OJn3GDk3GDk2ZmZ2VlZmVobGVueF96m0Z2r9z7+7rv/zhJXThJXQ8UGh0n + MUVOVkVOVjc3Nzc3N0tKSktKSmuFomuFooF9f0VsmUVsmYWEh4WChYqHio6NjMnIysnIysfGyKWxwG2R + u4+kvG+OtG+OtIyLjIyLjGd8kmd8kqfN9KfN9H2k0X2k0XSbyHidy4Kp1nOZwHOZwGOEp2iKr2uOtXWX + u36Zsm95gnN1d3WHmnWHmmOQvWOQvXOJn3OJn3OJn3GDk3GDk2ZmZ2VlZmVobGVueF96m0Z2r9z7+7rv + /zhJXThJXQ8UGh0nMUVOVkVOVjc3Nzc3N0tKSktKSmuFomuFooF9f0VsmUVsmYWEh4WChYqHio6NjMnI + ysnIysfGyKWxwG2Ru4+kvG+OtG+OtIyLjIyLjGd8kmd8kqfN9KfN9H2k0X2k0XSbyHidy4Kp1nOZwHOZ + wGOEp2iKr2uOtXWXu36Zsm95gnN1d3WHmnWHmmOQvWOQvXOJn3OJn3OJn3GDk3GDk2ZmZ2VlZmVobGVu + eF96m0Z2r9z7+7rv/zhJXThJXQ8UGh0nMUVOVkVOVjc3Nzc3N0tKSktKSmuFomuFooF9f0VsmUVsmYWE + h4WChYqHio6NjMnIysfGyMPCxL++wLi3uaOxwIat2oat2nyCinyCimONwmONwk96sU96sUhxpEhxpD1m + l053plN1mkxpi0xpi0RihU1QV1dXWWVkZm5xdWSFpzRbg2lpbGlpbHiMn3iMn2x8jWx8jWx8jYapy4ap + y3il01FylUFZdml4iW9xcm5ubXOXv7Pi/4Gq2YGq2WyRulVwjRIYHxIYH0NNWkNNWjo4Ojo4Ol17nl17 + nmxubnWcyXWcyYB8f39/goKFhomKjcfHx8XFxcHBwbu7u7Ozs6mmqIWr2IWr2GyUwGyUwHyexnyexl6F + sl6FsnafzHafzGeRvmODpik6S1BmfFBmfEVFRVRTVGRjZnR7hXeav2uMr3J4gV1jbF1jbKvT+avT+XWZ + v3WZv3WZv36MmX6MmY+87XOaxktjgGFugnh4eXV1dVd7pVqJwH6p2n6p2nGax3mjziMxPyMxPzZOZTZO + ZTIyMjIyMmF/qGF/qGJjZJzC7JzC7Hl3d3p9fIOChIqHi8nHx8XFxb/Awri4ua+vr6Wjo4Kn04Kn05O/ + 8ZO/8ZvD75vD72+WwG+WwIOt2IOt2HKbx01riS8/UFVmdlVmdlZdZF1ka2t2f4Kiv3WavmB5lF1yiTtZ + dztZd5e53Ze53YWmyoWmyoWmyn9+gH9+gJbC8Yat2F53lldvkHx+f3l6elR4oU9+tYKu3oKu3nehzneh + zjdPZzdPZys6Sys6SzIyMjIyMlV0nlV0nl9fYIWs04Ws03h1d3p7fH+AgIuHiMnHx8bExKuzv6Wps66t + raCgoIKkzIKkzJnG+ZnG+avW/6vW/2+XwW+XwXehzHehzGeOt0FdeENZb32ixX2ixYCct3WQqXiZuJC9 + 44mz3nWVuF97mV18nV18nXWElXWElYGSpIGSpIGSpISCg4SCg5fE9Zi633CEnlt5oH1/hn18fGqNtliH + vnOfz3Ofz3KcyXOdykBef0Befx0oMx0oMzExMjExMmWErmWErl1eXH+mzn+mznZ1dnx8fYCAgIqGh8nH + x8bExIOYtV95m6yrq56enouqz4uqz5XD9pXD9qrV/6rV/2SMtmSMtmWPumWPull7oC1CVjdNY2mAlmmA + lnKHnHaLn3SKno+74ZXE84ehvIGUqXygxnygxnNzdXNzdXt+gXt+gXt+gYWEhYWEhZG97JmyzIWRo2aH + sXuElH98fWaIslKBuFuHt1uHt2OMuXKcyUJmjEJmjBEaIxEaIzEzNzEzN3CQunCQulxdXIGn0YGn0XR1 + dXx6fIJ/gIuHiMjGxsXDw36TrSxOe5eco5ucn4upzIupzJ7M/p7M/qHM/KHM/GmRu2mRu2WPumWPuld2 + lx8tPCM4TDw8PDw8PEdHSFZWV2dnZ3yZspbD74KQn4CUqHaWtnaWtnZ2d3Z2d3p7e3p7e3p7e4KDhYKD + hYy245GeromRnmCGsXqKnYCAgFyBqVGBtz9qmz9qm094pW6XxFN7pVN7pQ8XIA8XIDU9RTU9RWaHsmaH + sltbXHacxnacxnF0dH56fYOAgYWFhsfHx8TExHeLpzJXh22NsoCfxYSkyYSkyYCt4ICt4I+66o+66nSc + xnScxmGLtmGLtklkgR4pNj9YcTc3Nzc3N0BAQExLTFhZWneLnY255oes1n6dwHx5enx5enaNqnaNqnl5 + fHl5fHl5fIKOoIKOoH6VrIiHh4qXpWiSv3eEl4GDg2eLtYW27X+r23+r20BplmiRvnuk0Xuk0R4oNR4o + NUFQX0FQX3ebxXebxVlZW091oE91oHR0dHl5eYGAgIaGhsjGxsXDw3+TrHSYxqGqtaWjo3ugzHugzJbD + 9ZbD9bLd/7Ld/3mhy3mhy3iizXiizTtTbBchKjtTazEzNDEzNEZQWXSSrpG11Yiju11kal5eXmpscHqd + w3qdw3mMo3mMo4CMmYCMmYCMmYekxYekxYWEh4OFjVV8plh8oIiIiYiHiYGmz3Kk2mGMvWGMvTlij0hx + noOr2IOr2DFAUDFAUEtZbEtZbHyhyXyhyVxdXktwnEtwnHd3d318fIGAgIuKisjGxsbExJ2wyGSItpae + qqWjo4mu2omu2nyp23yp26jT/6jT/3qizHqizHqkz3qkzzxUbRohKjpOY0BLV0BLV3OVtX2hwnSMok9S + VVBPUF5gZnGDmnCPtXCPtXZ2d3Z2d4ekyoekyoekyoKLloKLloKCgnGCmUFrmG2FnIeHiImKi32jzXap + 31R/sFR/sFR9qkdwnXGYxXGYxTZDUzZDU0lXaUlXaYSr0YSr0V5fX2SJtWSJtXl4eIF9fYKAgoqJi8jG + xsbExJ2wyGSItpaeqqWjo4mu2omu2nyp23yp26jT/6jT/3qizHqizHqkz3qkzzxUbRohKjpOY0BLV0BL + V3OVtX2hwnSMok9SVVBPUF5gZnGDmnCPtXCPtXZ2d3Z2d4ekyoekyoekyoKLloKLloKCgnGCmUFrmG2F + nIeHiImKi32jzXap31R/sFR/sFR9qkdwnXGYxXGYxTZDUzZDU0lXaUlXaYSr0YSr0V5fX2SJtWSJtXl4 + eIF9fYKAgoqJi8jGxsbExLHD2H+j0Z2msaSiokZsmUZsmYy67Yy67Z7J957J93aeyHaeyHCaxXCaxWKC + pSs6SBwoND9Waz9Wa19yhTo5Oj09PU9UW3OLpoKl0Iqq0n6Xtn6XtoWcuoWcun6Pp36Pp36Pp4KBgYKB + gW6Dnktxmll2lH9/gIGCg4uJinSaw2KVy1+MvF+MvHuk0XGaxzdeizdeiyw4SCw4SEdTYkdTYoCmzICm + zGRhYnGVw3GVw3p7fH5/gISCg4yIi8jGxsbExLHD2H+j0Z2msaSiokZsmUZsmYy67Yy67Z7J957J93ae + yHaeyHCaxXCaxWKCpSs6SBwoND9Waz9Wa19yhTo5Oj09PU9UW3OLpoKl0Iqq0n6Xtn6XtoWcuoWcun6P + p36Pp36Pp4KBgYKBgW6Dnktxmll2lH9/gIGCg4uJinSaw2KVy1+MvF+MvHuk0XGaxzdeizdeiyw4SCw4 + SEdTYkdTYoCmzICmzGRhYnGVw3GVw3p7fH5/gISCg4yIi8fFxcbExKq6zn+j0ZihraSiooit2oit2pjH + 9ZjH9Xml1Xml1U51n051n095pE95pGSOuV+Dp0tukT5ZcD5ZcFh0jU5calxxhHqbuniUtlxodFRTU1pZ + WlpZWoyv2oyv2nd0dXd0dXd0dXN4hHN4hFt9pk9kfG1pbHFscnZ0dnp6e57F3qXb/3Kfz3Kfz3aey2mS + vkdum0dumxgiLxgiL0lSXUlSXXufxHufxGVjZmOHtWOHtXx7fYF/gISCg4uLi8jGxsXDw6y6zYis2Jyl + sKOiooWp0YWp0afV+KfV+JK97pK97m2SvG2SvHafynafynSawDtXdDpeg2CHrWCHrVBxkEBWbEJWaGaB + nWhye1ZWVlVVVV5jbF5jbIKlzoKlzm1sbG1sbG1sbGqEpGqEpE5qi1teYmBfYGRjZWloaW5ub4et06jb + /4i14Yi14Yat2HadyF6Cr16CrxAZJRAZJUVLVEVLVHqexHqexGZlZmiNumiNun97f4OAhYWEhY2Mj8jG + xsXDw6+7zHeaxJ2msaWjo4qkw4qkw4u35ou35pO98JO98G2Qu22Qu32izH2izGSBoDdIWTdWdYy67Iy6 + 7FqItT9efkBUaEtgdV1gY11cXFtaW2eIqWeIqWiAmmiAmmNmamNmamNmal+Fr1+Fr1FZYlRUVFZVVVhX + WFtaW19eX5Cy06rZ/5bA6JbA6IKpz46023OWwXOWwRMbJxMbJz9ESj9ESnmdxnmdxmtoaHadynadyn5+ + gIKBgoWEhYyJjsjGxsbExK+8ym+Sup6nsZqjrpCXoZCXoaTQ/KTQ/I+47I+47GqNuGqNuHueyXueyVtz + jiIrNTJBUnOgz3Ogz5fB23ur3XGdy2mJqlhzjl9qd1d1kk9ogU9ogVJRU1JRU3CaxXCaxXCaxVR5o1R5 + oz9BRT8+Pz8+Pj8+Pz8/P0dGSaHF46TQ+53F6p3F6pK33Zi9432fyn2fyh4lMB4lMDQ1NjQ1Noms1Yms + 1WxsbIqx3oqx3oOBgoiFh4uHiJGNjsjGxsjGxrK9ynKXwJWktoOfvZiWl5iWl6zY/6zY/6fQ/6fQ/36h + zH6hzG2Qu22Qu156mS07STxNYFVwjFVwjFJcZXOUtn2u4H6p1F15lkJYcDxVbGdqbWdqbVVVV1VVV2uM + tGuMtGuMtEdokEdokEFNX0JGTTg5PDU1Njo8Pk9ca5K645e/6Je94Ze94ZC125e84nyeyXyeyRUdKBUd + KDc3ODc3OGWIsGWIsG5ubYeu24eu24aFhYiGiIuIio+NjsnHx8jGxrW+ynyjzYCfwqCtvJuZmZuZmaTP + +6TP+6XN/aXN/Yqt2Iqt2ICjzoCjzk5ngiYxPjxSazk4ODk4OEVERFZZXoOfvrHk/6HS/KDP/2+TvDpO + ZDpOZD9QZD9QZDE9TDE9TDE9TEhVa0hVaztKXjM+Tj5OYT1OYzdKXkRac2WBn3ucv5a835a834qv1Z3C + 6Iiq1Iiq1B0lLx0lLz8/Pz8/P1d5n1d5n3d3eGSLuGSLuIuHiI6Ki4uLi5CQkMnHx8jGxrW+ynyjzYCf + wqCtvJuZmZuZmaTP+6TP+6XN/aXN/Yqt2Iqt2ICjzoCjzk5ngiYxPjxSazk4ODk4OEVERFZZXoOfvrHk + /6HS/KDP/2+TvDpOZDpOZD9QZD9QZDE9TDE9TDE9TEhVa0hVaztKXjM+Tj5OYT1OYzdKXkRac2WBn3uc + v5a835a834qv1Z3C6Iiq1Iiq1B0lLx0lLz8/Pz8/P1d5n1d5n3d3eGSLuGSLuIuHiI6Ki4uLi5CQkMrI + yMnHx7i9xoyqzK6zvK2rq4OZsIOZsK3a/q3a/r/q/7/q/42w242w236hzH6hzE9lfRoiK0hfd0RJUERJ + UGR8lXaex2yOs2R1hnyAg4ypypvJ+Y+134+131BnhVBnhSc1Sic1Sic1SllqhFlqhHaOskxigkNad0Ja + d0xlgmF/onCUuXOXvXOZvHOZvHugxoSpz5a34Ja34Co1RCo1REtMTEtMTGWEqGWEqIWChTtijztij4uK + jYyMjI+LjZOOk8rIyMnHx7i9xoyqzK6zvK2rq4OZsIOZsK3a/q3a/r/q/7/q/42w242w236hzH6hzE9l + fRoiK0hfd0RJUERJUGR8lXaex2yOs2R1hnyAg4ypypvJ+Y+134+131BnhVBnhSc1Sic1Sic1SllqhFlq + hHaOskxigkNad0Jad0xlgmF/onCUuXOXvXOZvHOZvHugxoSpz5a34Ja34Co1RCo1REtMTEtMTGWEqGWE + qIWChTtijztij4uKjYyMjI+LjZOOk8jGxsjGxsDAwbG3wLa0tKWprnSXvHSXvKrV7KrV7MDt/8Dt/4yv + 2oyv2oir1oir1lBnfxsiKjpNYmN8l2N8l36kzXeXt2Zxfnh4eIODg4aIjI+w27Pg/7Pg/4+46I+46FRt + klRtklRtkoScwYScwaG96Xybx2iKtFZ5o2eLs4Cjy3qfxXWawHqgw3qgw3ugxoqv1XSTunSTukNTaENT + aFVUVVVUVWyLrmyLroiIhyJJdiJJdpCOj5GOkJGPkZOTk8jGxsbExMG/v6q1woao0IWiwYuJiYuJiX2U + rn2UrpK77ZK77X2gy32gy4Om0YOm0W2KqUhccmB7l0FBQ0FBQ0lJSVlYWGZmZnV5f36Ur3Waxn6fxYOE + iYOEiYy69Iy69K/Q+K/Q+K/Q+H2cyX2cyU9vnZy964er1nueyoes1JG234Sq0YOp0ICozICozHyhyX6i + xldujFdujHWJo3WJo2dlZmdlZneSs3eSs46Ki0RrmERrmJKQkJKPk5OSlJiZl8jGxsbExLG8yIap0Iql + waSiooiMlIiMlJC755C756HP/6HP/5vB7JvB7JK14JK14DZGVzRCUk9hdzw8Ozw8O0VFRVZdZWuHpX6j + y3WSsnyDjoF+f3aGmnaGmnuRq3uRq9X3/9X3/9X3/7HT+7HT+3+j0pS78XSe0n6o3J7J+KnV+JnG85/M + +ajW/KjW/LXi/5G54ldth1dth3FwcHFwcG9ub29ub22HpW2HpYmFh0RrmERrmJGPj5STlJaVl5mZmcjG + xsfFxau/14ir1Jmnt6Sjo4CcuYCcuZOy0ZOy0aLR/6LR/7Ha/7Ha/57B7J7B7DFATzA+TVBhcTw8PTw8 + PUxTXWJ/nm2RtnCIoXd3fHt4eH59gWuQumuQum18jm18jvD8//D8//D8/6bM96bM936hy4205omv4X6l + 1YSr14Oq1X2kzZO64qnP6qnP6rLX7KDL92R3jmR3jnZzdHZzdHNwb3Nwb36Ws36Ws4aFh0hvnEhvnI+M + kJCQkJaSk5yZncjGxsjGxrXL55a65Kuwt5+jqnSVuXSVuXl6fHl6fJrH+prH+rji/7ji/6PH7qPH7jJB + TygzP1VpfElQWklQWmWEomGComl5i2hnaHFwcHZ4fXCDm05znk5znnN6gXN6gbDg97Dg97Dg97DZ/7DZ + /2iAoH6Xt3uTsW+EoGyBmWt+lW5+kXqKnH6MnH6MnImWpJS02GqGp2qGp3R3fXR3fXV0dHV0dIScuISc + uIeChENqlkNqlpKNkZSQkpeVl56am8nHx8jGxrHD253A7LG2vH+WsoOVqoOVqnx7e3x7e5XB8JXB8Lfh + /bfh/ZzA5pzA5jVCURwkK0dabmuJqGuJqG2MqVplcFpaW2ZjZHByemR5llZ/slBvlVBvlX+Ej3+Ej3ed + zHedzHedzJ7K/p7K/lVmfWRqcmJhY15cXVpaW1taWl1cXGJhYW1sbm1sbnZzd3eKooupzYupzXKGoXKG + oXh2dnh2doWZs4WZs4iDhUBnk0Bnk5KOj5WRkpqXl5yamsnHx8jGxqy4yKTI8q28zm+OsJSVmJSVmH9+ + fn9+fqbR/6bR/5zI+JzI+Ja74pa74kJVaBYdIiczPnGQr3GQr1RcZVBOT1lZWWZqcWuDokZuoUtunm57 + i257i4OZuIOZuHWAj3WAj3WAj5K/9pK/9kxmhV1zjGVpcWJhYV5fYFxcXFtbW1xbXGJhYmJhYmpoaXWD + mIGcu4Gcu32hy32hy3x6fXx6fXqPpnqPpouIiFuCrluCrpOPkZWRk5qWl56cnMnHx8jGxsbExZez16rT + 9anM7p6dnZ6dnXaLpHaLpJXE8pXE8qDW/6DW/5nL/JnL/HOUtj5OYTlLXk1LTU1LTU5NTVheZ2iDo2SI + sUlojltmdHNycn57fH57fIKgx4Kgx3p8gHp8gHp8gHeGlneGlnKXxlNpgjE+TlhpfGdqcWRjZF1bXFdU + VVFRUlFRUl5mbnKQtGZpbmZpbnuJmHuJmHeMpneMpoSXrISXrJeTlGiPu2iPu5WTlJaUlpaXmp2coMnH + x8jGxsfFxcTCwq2utHiVuW+PtW+PtY6Xo46Xo4iHh4iHh3uEkHuEkJbO/pbO/oKw4S5BWC4+UGRvfmRv + fmyVxXul1GqOuVd5nytMc22Ms5e123uXvXuXvXSSuXSSuWqGrGqGrGqGrHOOtXOOtYus3aDC5oOl0ZG3 + 23OTtEhddzREVlJogXmXuHmXuIKiyGyKsIemzYemzWF9nmF9noqKjIqKjJCgsZCgsaOeoGuQt2uQt5qW + lpqWmJ2anKKen8nHx8jGxsfFxcTCwq2utHiVuW+PtW+PtY6Xo46Xo4iHh4iHh3uEkHuEkJbO/pbO/oKw + 4S5BWC4+UGRvfmRvfmyVxXul1GqOuVd5nytMc22Ms5e123uXvXuXvXSSuXSSuWqGrGqGrGqGrHOOtXOO + tYus3aDC5oOl0ZG323OTtEhddzREVlJogXmXuHmXuIKiyGyKsIemzYemzWF9nmF9noqKjIqKjJCgsZCg + saOeoGuQt2uQt5qWlpqWmJ2anKKen8nHx8jGxsfFxcTCwq2utHiVuW+PtW+PtY6Xo46Xo4iHh4iHh3uE + kHuEkJbO/pbO/oKw4S5BWC4+UGRvfmRvfmyVxXul1GqOuVd5nytMc22Ms5e123uXvXuXvXSSuXSSuWqG + rGqGrGqGrHOOtXOOtYus3aDC5oOl0ZG323OTtEhddzREVlJogXmXuHmXuIKiyGyKsIemzYemzWF9nmF9 + noqKjIqKjJCgsZCgsaOeoGuQt2uQt5qWlpqWmJ2anKKen8nHx8jGxsbExMG/v7Kzt1Nxlpejspejso+N + jY+NjYmNkomNknegynegylVzk1Vzk1OKyzFjnx06XVtjcVtjcWlpbWhnZ2NiYl5dXVlYWFZTVFNRUUxM + TExMTEtKSktKSklHSElHSElHSElIR0lIR0hHSEhIR0lKSm9/lLDa/ZS97UVcdS46SDk8QTk8QTIxMTMz + M0JBQUJBQVtaWVtaWXZ3dnZ3doeSoIeSoJyamniXuHiXuJSTlZeSlpWTlJmXmcnHx8jGxsXDw8C+vpGf + si1QfJiXl5iXl4uJiYuJiYifuIifuG+Nq2+Nq3h4eXh4eWGOxHWp5lV/szlQbzlQb1VgcWFnbWVobV5h + ZFdZWlhXWVVVWEtOUUtOUUJFSkJFSkA/QkA/QkA/Qj4+QD4+QD4/QEBBQ0FER0ZKUJ3C74ar1kJZcxMY + HkdXaUdXaTY6QDAvLzk5OTk5OUxNTExNTGhoaGhoaIKQnIKQnJOTk4GduoGdupKQkZSRkpeTlJSUlMrI + yMjGxsTDw6qzwHiax4CNoJORkZORkaa80aa80ZrC6ZrC6VZ6n1Z6n3F9inF9inV1dXyHlY2z43mi1nmi + 1lVwmzJGZCEvRRMhNhUkN0xbbU9ecT5LXj5LXi04SS04SS45TS45TS45TTdCWDdCWEFMYUFNYUNRZT9P + YVtyjHeVuGOEqDpPZg8UGQ8UGS06SE1gdjEyMzEyMz08PD08PFFRU1FRU3J7hHJ7hISCgnmPpnmPpoqI + iYiIiIuIiIyMjMnHx8fFxcTDw5KoxIakzqanqoWIjYWIjZGz35Gz34iXpoiXpnWdxXWdxWeIq2eIq3l6 + gXd0dXmBjKDM/KDM/KHL/3OXxj9WexgnPhQgLjQ/TD5JWDpHWDpHWDQ/UTQ/USQsPCQsPCQsPCozQioz + QjE4SDE6SjhEVDxMX111kX2bv3aZwGKBpR4mMR4mMQ8TGSs1QjxFTTxFTTo6Ojo6OktKSktKSmVudWVu + dXt9f3iKnXiKnYWFiIWFhYWFhYWHiMnHx8fFxcHBw3CRvpWita2rq1d5qVd5qXd/ind/ioB+foB+fpGw + z5Gwz4CGjoCGjoWkzISbvn+Fj3x/hHx/hJev0qLK94y4/12KzT1nnXqfyanJ74WjyoWjyo2q042q04CY + xoCYxoCYxniPvXiPvYGXx4egzYKgyXqbwoKjyous04KkzH2fyHaWvHaWvFpxjys2RB8oNB8oNE5TW05T + W09MTk9MTmFmbGFmbHJ+iXN/j3N/j1yAo4CEioGBgYSAg8nHx8fFxcDAxGSFtn6TsouTn4+mwY+mwYqI + iIqIiIOEhoOEhn6bwn6bwoGEi4GEi359foKPo3iTuH6Ln36Ln3+DiICAgYebt2eMwkhytF6Mzbbf/5S0 + 35S035e25Je25ICgy4Cgy4Cgy3eYw3eYw4OjzoSkzXmZwnmZwnmXwIGgyZGv2JCu15az3Jaz3JOx2oyp + 0Ss2Qys2Qyw5Riw5Rl9hZF9hZGtucmtucnyQpoGHjoGHjmGJsVuEq3+FjoSCg8nHx8fFxcbFxmSEtE1r + lFdofaWrsqWrspCPj5CPj4mVpImVpHCMsnCMsoWFhoWFhoOAgYOAgoGLm3ybw3ybw4OVr3+Fj3+Ahm+D + nV2CukRvtYu39sTp/8Tp/46w4I6w4Iuv24uv24uv23ecyXecyXqeyYGm0YWo03+izHqaxYOkz5275qG/ + 56C+6aC+6Zm345/A6WWBoGWBoCEqNSEqNV1tfF1tfHVxc3Vxc4irzoKDgoKDgnaSrHGYvYGKmIWChMrI + yMjGxsfFxXeQuUhxpixHaK2rrK2rrJSYn5SYn4yt14yt122Kr22Kr4eOmYeOmYmOmoKJlIGJlH+gyX+g + yXmVum6JqnWGn3aAjG99kklspmGP08Dl9cDl9afP/6fP/6fQ/qfQ/qfQ/ou26Yu26Yaw5Y+57ZrE9ZG7 + 64Ws3Y+156/T/7fb/67Q/q7Q/qnM/bjd/5S865S861JqhFJqhFd0kFd0kHt6ent6eo+x1YKJjoKJjoOI + kHqRqoSDioiEhcrIyMjGxsfFxXeQuUhxpixHaK2rrK2rrJSYn5SYn4yt14yt122Kr22Kr4eOmYeOmYmO + moKJlIGJlH+gyX+gyXmVum6JqnWGn3aAjG99kklspmGP08Dl9cDl9afP/6fP/6fQ/qfQ/qfQ/ou26Yu2 + 6Yaw5Y+57ZrE9ZG764Ws3Y+156/T/7fb/67Q/q7Q/qnM/bjd/5S865S861JqhFJqhFd0kFd0kHt6ent6 + eo+x1YKJjoKJjoOIkHqRqoSDioiEhcnHx8nHx8jGxsPCxWSBqnyi0ZqrwJqrwKmts6mts6SxwqSxwpGl + upGluoebs4ebs5Clvn6QqnySqYygvIygvIudtn6QpoWRpIeQnpqXl5uXmIqPnVFwo1Fwo2WEsmWEsqLC + 5qLC5qLC5py75Jy75I6s14GgyIyq0ZCs0o2q0JOt1KW84Ka/35+22p+22puw1qi+3Jaw0Zaw0aG+1qG+ + 1o+kvo+kvpKNj5KNj5GPkICkzYCkzYukvY6Ok5GNjpSQksrIyMnHx8rIyMnHx7q+xrfU8GyNtmyNtqmr + s6mrs62tr62tr6mpqampqaelpaelpaalpaakpKaipKikpqikpqGjpKGio6WjpKSjo6Wjo6elpKWmpJ+e + pJ+epJeanpeanpuen5uen5uen5ycoJycoJ+eoJ+cnp+bnZycnJybnqGcnp+bnp2bnJuXmZuXmZyYnJuX + nJ2bnJ2bnJeYmZeYmZqXmZqXmZeanJeanJucnX6fw36fw3acxIuYqZuYnJuZm8nHx8rIyMrIyMrIyMjG + xsjGxqixwaixwaLA5aLA5V2Bp12Bp22Rt22Rt22SuG2SuG6RuW2SuHOXvn2iyH2iyHqfxnCVvHyhx3yf + yIGizoGhz4Cg0G6PvW6PvXiZyHiZyEFikUFikUFikUdmlUdmlWOFspKz34yt1pCy2Yqp0YKiyoWkzIKi + yneWv3eWv36cxoGhyneawXeawXKZwHKZwIWs04Ws04amzoamzoCjypi955i953yhx4qlwrGrra+trcnH + x8nHx8nHx8rIyMnHx8rIyMjDxMjDxLvCzbvCzZ6yx56yx5SovZSovYCVrICVrIuftHyOpZGjuZSmvJSm + vJeqwZuuxZmtw5uuxZ+xyaK0zaGyy5OlvpOlvpanwJanwISXr4SXr4SXr3qJpXqJpXWFoIiZsqW4z6i7 + 0qm60qq706S1zKCwyaCvyqCvyp6vyJSnvpOmvpOmvpOpwZOpwZ6zyZ6zyaa30Ka30KW1zZ+yy5+yy56w + xbCvtbeys7eytP///////////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + + + \ No newline at end of file diff --git a/contrib/Installer/boinc/boinc/frmDiagnostics.vb b/contrib/Installer/boinc/boinc/frmDiagnostics.vb new file mode 100644 index 0000000000..eb27180491 --- /dev/null +++ b/contrib/Installer/boinc/boinc/frmDiagnostics.vb @@ -0,0 +1,149 @@ +Imports System.Windows.Forms +Imports System.Data.SqlClient + +Public Class frmDiagnostics + Private msDiagnosticCPID As String = "" + Private Sub frmDiagnostics_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load + 'Prepopulate the Diagnostic Test Name + Dim sDiagName As String = "Verify Boinc Path,Find CPID,Verify CPID Is Valid,Verify CPID has RAC,Verify CPID is in Neural Network,Verify Wallet Is Synced,Verify Clock,Verify Addnode,Verify TCP 32749" + Dim vDiagName As String() = Split(sDiagName, ",") + dvDiag.Rows.Clear() + dvDiag.Columns.Clear() + dvDiag.Columns.Add("Diagnostic Name", "Diagnostic Name") + dvDiag.Columns.Add("Diagnostic Result", "Diagnostic Result") + dvDiag.Columns(0).Width = 175 + dvDiag.Columns(1).Width = 500 + For x As Integer = 0 To UBound(vDiagName) + dvDiag.Rows.Add() + dvDiag.Rows(x).Cells(0).Value = vDiagName(x) + Next + End Sub + Private Sub btnRunDiagnostics_Click(sender As System.Object, e As System.EventArgs) Handles btnRunDiagnostics.Click + Cursor.Current = Cursors.WaitCursor + For x As Integer = 0 To dvDiag.Rows.Count - 1 + Dim sDiagnosticName As String = dvDiag.Rows(x).Cells(0).Value + GuiDoEvents() + System.Threading.Thread.Sleep(1000) + dvDiag.Refresh() + Select Case sDiagnosticName + Case "Verify Boinc Path" + VerifyBoincPath(x) + Case "Find CPID" + FindCPID(x) + Case "Verify CPID Is Valid" + VerifyCPIDIsValid(x) + Case "Verify CPID has RAC" + VerifyCPIDHasRac(x) + Case "Verify CPID is in Neural Network" + VerifyCPIDIsInNeuralNetwork(x) + Case "Verify Wallet Is Synced" + VerifyWalletIsSynced(x) + Case "Verify Clock" + VerifyClock(x) + Case "Verify Addnode" + VerifyAddNode(x) + Case "Verify TCP 32749" + VerifyTCP32749(x) + End Select + Next + Dim lErrorCount As Long = 0 + For x = 0 To dvDiag.Rows.Count - 2 + If Not dvDiag.Rows(x).Cells(1).Value Like "*PASSED*" And x <> 1 Then + dvDiag.Rows(x).Cells(1).Style.BackColor = Drawing.Color.Red + lErrorCount += 1 + End If + Next + dvDiag.Rows(dvDiag.Rows.Count - 1).Cells(0).Value = "Result" + dvDiag.Rows(dvDiag.Rows.Count - 1).Cells(1).Value = IIf(lErrorCount = 0, "PASSED", "FAILED") + If dvDiag.Rows(dvDiag.Rows.Count - 1).Cells(1).Value = "FAILED" Then dvDiag.Rows(dvDiag.Rows.Count - 1).Cells(1).Style.BackColor = Drawing.Color.Red + + Cursor.Current = Cursors.Default + + End Sub + Private Sub VerifyCPIDIsInNeuralNetwork(iRow As Integer) + 'Check the wallet to see if they ever sent the beacon + Dim sBeacons As String = ExtractXML(msSyncData, "") + If sBeacons.ToLower().Contains(LCase(msDiagnosticCPID)) Then + dvDiag.Rows(iRow).Cells(1).Value = "PASSED" + Else + dvDiag.Rows(iRow).Cells(1).Value = "FAILED (execute advertisebeacon force)" + End If + If Len(sBeacons) < 100 Then + dvDiag.Rows(iRow).Cells(1).Value = "BEACON DATA EMPTY, SYNC WALLET" + End If + End Sub + Private Sub VerifyWalletIsSynced(iRow As Integer) + Dim sWalletAge As String = ExtractXML(msSyncData, "") + Dim lWalletAge As Long = Val("0" + sWalletAge) + If lWalletAge > (60 * 60) Then + dvDiag.Rows(iRow).Cells(1).Value = "FAILED" + Else + dvDiag.Rows(iRow).Cells(1).Value = "PASSED" + End If + If Len(sWalletAge) = 0 Then + dvDiag.Rows(iRow).Cells(1).Value = "SYNC DATA EMPTY" + End If + End Sub + Private Sub VerifyCPIDHasRac(iRow As Integer) + Dim sCPID As String = dvDiag.Rows(iRow - 2).Cells(1).Value + Dim sError As String = "" + Dim dTotalRac As Double = GetTotalCPIDRAC(sCPID, sError) + If dTotalRac > 1 Then sError = "PASSED (" + Trim(dTotalRac) + ")" Else sError = "FAILED" + dvDiag.Rows(iRow).Cells(1).Value = sError + End Sub + Private Sub VerifyAddNode(iRow As Integer) + Dim sNarr As String = GetAddNodeNarrative(iRow) + dvDiag.Rows(iRow).Cells(1).Value = sNarr + End Sub + Private Function GetAddNodeNarrative(iRow As Integer) As String + Dim lPeerSize As Long = GetPeersSize() + Dim sAddNode As String = KeyValue("addnode") + If Len(sAddNode) = 0 And lPeerSize > 100 Then Return "PASSED (ADDNODE DOES NOT EXIST BUT PEERS ARE SYNCED)" + If Len(sAddNode) > 4 And lPeerSize = 0 Then Return "PASSED (ADDNODE EXISTS BUT PEERS NOT SYNCED)" + If lPeerSize > 100 Then Return "PASSED" + If lPeerSize = 0 And sAddNode = "" Then Return "FAILED (Please addnode=node.gridcoin.us in config file)" + Return "FAILED" + End Function + Private Sub VerifyCPIDIsValid(iRow As Integer) + Dim sCPID As String = dvDiag.Rows(iRow - 1).Cells(1).Value + Dim sError As String = "" + Dim dTotalRac As Double = GetTotalCPIDRAC(sCPID, sError) + If sError = "" Then sError = "PASSED" + dvDiag.Rows(iRow).Cells(1).Value = sError + End Sub + Private Sub VerifyBoincPath(iRow As Integer) + Dim dSz As Double = GetClientStateSize() + If dSz > 1000 Then + dvDiag.Rows(iRow).Cells(1).Value = "PASSED" + Else + dvDiag.Rows(iRow).Cells(1).Value = "Boinc Data dir not found. Please set the 'datadir=' key to the boinc data path." + End If + End Sub + Private Sub FindCPID(iRow As Integer) + 'First calculate the CPID + Dim sCPID = ComputeLocalCPID() + dvDiag.Rows(iRow).Cells(1).Value = sCPID + msDiagnosticCPID = sCPID + End Sub + Private Sub VerifyClock(iRow As Integer) + Dim d As New GRCDiagnostics + Dim dtNIST As DateTime = d.GetNISTDateTime() + Dim dtNowUTC As DateTime = DateTime.UtcNow + Dim minDiff As Integer = DateDiff(DateInterval.Minute, dtNIST, dtNowUTC) + Dim sResult As String + If minDiff < 3 Then + sResult = "PASSED" + Else + sResult = "Clock Off By " + Trim(minDiff) + " Minute(s). Please update your system time." + End If + dvDiag.Rows(iRow).Cells(1).Value = sResult + + End Sub + Private Sub VerifyTCP32749(iRow As Integer) + Dim d As New GRCDiagnostics + Dim bResult As Boolean = d.VerifyPort(32749, "node.gridcoin.us") + Dim sResult As String = IIf(bResult = True, "PASSED", "FAILED") + If sResult = "FAILED" Then sResult = "Outbound connection to 32749 failed. Please try unblocking outbound traffic to 32749." + dvDiag.Rows(iRow).Cells(1).Value = sResult + End Sub +End Class diff --git a/contrib/Installer/boinc/boinc/frmMining.Designer.vb b/contrib/Installer/boinc/boinc/frmMining.Designer.vb index 40d53c46ed..64cc6c7423 100644 --- a/contrib/Installer/boinc/boinc/frmMining.Designer.vb +++ b/contrib/Installer/boinc/boinc/frmMining.Designer.vb @@ -87,7 +87,6 @@ Partial Class frmMining Me.btnSync = New System.Windows.Forms.Button() Me.lblQueue = New System.Windows.Forms.Label() Me.lblNeuralDetail = New System.Windows.Forms.Label() - Me.Button1 = New System.Windows.Forms.Button() CType(Me.Chart1, System.ComponentModel.ISupportInitialize).BeginInit() CType(Me.chtCurCont, System.ComponentModel.ISupportInitialize).BeginInit() Me.MenuStrip1.SuspendLayout() @@ -695,15 +694,6 @@ Partial Class frmMining Me.lblNeuralDetail.TabIndex = 76 Me.lblNeuralDetail.Text = " " ' - 'Button1 - ' - Me.Button1.Location = New System.Drawing.Point(1023, 7) - Me.Button1.Name = "Button1" - Me.Button1.Size = New System.Drawing.Size(12, 13) - Me.Button1.TabIndex = 77 - Me.Button1.Text = "Button1" - Me.Button1.UseVisualStyleBackColor = True - ' 'frmMining ' Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) @@ -712,7 +702,6 @@ Partial Class frmMining Me.BackgroundImage = Global.BoincStake.My.Resources.Resources.GradientU Me.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch Me.ClientSize = New System.Drawing.Size(1071, 793) - Me.Controls.Add(Me.Button1) Me.Controls.Add(Me.lblNeuralDetail) Me.Controls.Add(Me.lblQueue) Me.Controls.Add(Me.btnSync) @@ -809,5 +798,4 @@ Partial Class frmMining Friend WithEvents lblQueue As System.Windows.Forms.Label Friend WithEvents lblNeuralDetail As System.Windows.Forms.Label Friend WithEvents WebBrowserBoinc As System.Windows.Forms.WebBrowser - Friend WithEvents Button1 As System.Windows.Forms.Button End Class diff --git a/contrib/Installer/boinc/boinc/frmMining.vb b/contrib/Installer/boinc/boinc/frmMining.vb index fa45e5a87b..c58a82b557 100644 --- a/contrib/Installer/boinc/boinc/frmMining.vb +++ b/contrib/Installer/boinc/boinc/frmMining.vb @@ -811,7 +811,7 @@ Refresh: Return GetWindowsFileAge(GetGridFolder() + "NeuralNetwork\contract.dat") End Function - Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click + Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) 'Export Contract Dim sFullPath As String = GetGridFolder() + "NeuralNetwork\contract.dat" Dim swContract As New StreamWriter(sFullPath) diff --git a/contrib/Installer/boinc/boinc/modGRC.vb b/contrib/Installer/boinc/boinc/modGRC.vb index 44030abdd3..44becd4d75 100644 --- a/contrib/Installer/boinc/boinc/modGRC.vb +++ b/contrib/Installer/boinc/boinc/modGRC.vb @@ -33,6 +33,7 @@ Module modGRC Public mfrmTicketAdd As frmTicketAdd Public mfrmFoundation As frmFoundation + Public mFrmDiagnostics As frmDiagnostics Public mfrmTicketList As frmTicketList Public mfrmLogin As frmLogin @@ -344,7 +345,6 @@ Module modGRC End Try End Function - Public Function AttachProject(sURL As String, sEmail As String, sPass As String, sUserName As String) As String Dim sResult As String = "" Dim BJ As New BatchJob @@ -364,9 +364,7 @@ Module modGRC sKey = BJ.Value End If End If - 'Attach project to boinc - BJ = BoincAttachProject(sURL, sKey) If BJ.Status = True Then sResult += "Attached project " + sURL + " to boinc successfully." + vbCrLf @@ -374,7 +372,6 @@ Module modGRC sResult += "Failed to attach project : " + BJ.OutputError + vbCrLf 'Dont fail here; maybe already attached End If - 'Get the Gridcoin team ID Dim sTeam As String sTeam = BoincRetrieveTeamID(sURL) @@ -387,11 +384,111 @@ Module modGRC Else sResult += "Failed to add user to Team Gridcoin." + vbCrLf End If - Return sResult + End Function + Public Function GetClientStateSize() As Double + Dim sPath As String = "" + Try + sPath = GetBoincClientStatePath() + Dim fiBoinc As New FileInfo(sPath) + Return fiBoinc.Length + Catch ex As Exception + Log("Path " + sPath + " does not exist.") + Return 0 + End Try + End Function + Public Function GetBoincClientStatePath() + Dim sDataDir As String = GetBoincDataDir() + "client_state.xml" + Return sDataDir + End Function + Public Function GetPeersSize() As Double + Dim sPath As String = GetGridPath("") + "peers.dat" + If Not File.Exists(sPath) Then Return 0 + Dim fiSz As New FileInfo(sPath) + Return fiSz.Length + End Function + Public Function GetBoincDataDir() As String + Dim sDir1 As String = "c:\programdata\BOINC\" + If System.IO.Directory.Exists(sDir1) Then Return sDir1 + sDir1 = KeyValue("boincdatadir") + If System.IO.Directory.Exists(sDir1) Then Return sDir1 + Return "" + End Function + Public Function ComputeLocalCPID() As String + Dim sBPK As String = GetBoincPublicKey() + Dim sCPID As String = "" + Dim sLocalEmail As String = KeyValue("email") + If sLocalEmail = "" Then Return "EMAIL_EMPTY" + If sBPK = "" Then Return "PUB_KEY_EMPTY" + sCPID = GetMd5String(LCase(sBPK) + LCase(sLocalEmail)) + Return sCPID + End Function + Public Function GetTotalCPIDRAC(sCPID As String, ByRef sError As String) As Double + Dim sTable As String = "" + Dim sLocalError As String = "" + Dim dProjByteLen As Double = 0 + Dim dTotalRac As Double = GetUserRac(sCPID, sLocalError, sTable, dProjByteLen) + sError += sLocalError + If dTotalRac = 0 And dProjByteLen > 200 Then + sError += "No projects on team Gridcoin." + End If + If dTotalRac = 0 And sLocalError = "" And dProjByteLen < 250 Then + sError += "Invalid CPID" + End If + Return dTotalRac + End Function + + Public Function GetUserRac(sCPID As String, ByRef errors As String, ByRef sTable As String, ByRef dProjectByteLength As Double) As Double + Dim RACURL As String = "http://cpid.gridcoin.us:5000/" + Dim sURL As String = RACURL + "get_user.php?cpid=" + sCPID + Dim w As New MyWebClient + Dim sRAC As String + sRAC = w.DownloadString(sURL) + Dim vRAC() As String + vRAC = Split(sRAC, "") + dProjectByteLength = Len(sRAC) + Dim x As Integer = 0 + Dim rac As Double + errors = "" + Dim totalrac As Double + Dim team As String + Dim team_out As String = "" + Dim projname As String = "" + sTable = "" + For x = 0 To UBound(vRAC) + rac = ExtractXML(vRAC(x), "", "") + team = ExtractXML(vRAC(x), "", "") + projname = ExtractXML(vRAC(x), "", "") + If Trim(LCase(team)) = "gridcoin" Then + totalrac = totalrac + rac + team_out = "gridcoin" + sTable += "" + End If + Next + sTable += "
ProjectRACTEAM
" + projname + "" + Trim(rac) + "" + Trim(team_out) + "
" + If team_out <> "gridcoin" Then + errors = errors + "CPID not part of team gridcoin. " + End If + If totalrac < 100 Then + errors = errors + "Total RAC for Team Gridcoin below 100." + End If + Return totalrac End Function + Public Function GetBoincPublicKey() As String + Dim sStatePath As String = GetBoincClientStatePath() + Dim fiIn As New StreamReader(sStatePath) + While fiIn.EndOfStream = False + Dim sTemp As String = fiIn.ReadLine + Dim sPK As String = ExtractXML(sTemp, "") + If Len(sPK) > 0 Then + fiIn.Close() + Return sPK + End If + End While + Return "" + End Function Public Function GetBoincAppDir() As String Dim sDir1 As String = "c:\program files\BOINC\" If System.IO.Directory.Exists(sDir1) Then Return sDir1 diff --git a/src/clientversion.h b/src/clientversion.h index 7aafd9c14a..789542408b 100644 --- a/src/clientversion.h +++ b/src/clientversion.h @@ -9,7 +9,7 @@ #define CLIENT_VERSION_MAJOR 3 #define CLIENT_VERSION_MINOR 5 #define CLIENT_VERSION_REVISION 6 -#define CLIENT_VERSION_BUILD 5 +#define CLIENT_VERSION_BUILD 7 // Converts the parameter X to a string after macro replacement on X has been performed. // Don't merge these into one macro! diff --git a/src/main.cpp b/src/main.cpp index dc86ca1add..22705c22e1 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -33,15 +33,16 @@ extern std::string NodeAddress(CNode* pfrom); extern std::string ConvertBinToHex(std::string a); extern std::string ConvertHexToBin(std::string a); extern void RecoverNode(); - - +extern bool PushGridcoinDiagnostics(); +double qtPushGridcoinDiagnosticData(std::string data); bool RequestSupermajorityNeuralData(); - extern std::string UnpackBinarySuperblock(std::string sBlock); extern std::string PackBinarySuperblock(std::string sBlock); extern std::vector StringToVector(std::string sData); +extern bool TallyResearchAverages(bool Forcefully); +extern void SyncChain(); extern double GetStandardDeviation(std::string sPriceHistory); extern double GetVolatility(std::string sPriceHistory); bool GetExpiredOption(std::string& rsRecipient, double& rdSinglePrice, double& rdAmountOwed, std::string& rsOpra); @@ -83,7 +84,7 @@ json_spirit::Array MagnitudeReport(std::string cpid); extern void AddCPIDBlockHash(std::string cpid, std::string blockhash); extern void ZeroOutResearcherTotals(std::string cpid); -extern bool ShaveChain(CTxDB& txdb); +extern bool ShaveChain(CTxDB& txdb,int iHaircut); extern StructCPID GetLifetimeCPID(std::string cpid,std::string sFrom); @@ -685,6 +686,34 @@ bool UpdateNeuralNetworkQuorumData() return false; } +bool PushGridcoinDiagnostics() +{ + #if defined(WIN32) && defined(QT_GUI) + if (!bGlobalcomInitialized) return false; + std::string errors1 = ""; + LoadAdminMessages(false,errors1); + std::string cpiddata = GetListOf("beacon"); + std::string sWhitelist = GetListOf("project"); + int64_t superblock_age = GetAdjustedTime() - mvApplicationCacheTimestamp["superblock;magnitudes"]; + double popularity = 0; + std::string consensus_hash = GetNeuralNetworkSupermajorityHash(popularity); + std::string sAge = RoundToString((double)superblock_age,0); + std::string sBlock = mvApplicationCache["superblock;block_number"]; + std::string sTimestamp = TimestampToHRDate(mvApplicationCacheTimestamp["superblock;magnitudes"]); + printf("Pushing diagnostic data..."); + double lastblockage = PreviousBlockAge(); + double PORDiff = GetDifficulty(GetLastBlockIndex(pindexBest, true)); + std::string data = "" + sWhitelist + "" + + cpiddata + "" + sAge + "" + consensus_hash + "" + sBlock + "" + + sTimestamp + "" + msPrimaryCPID + "" + RoundToString(lastblockage,0) + "" + RoundToString(PORDiff,2) + ""; + std::string testnet_flag = fTestNet ? "TESTNET" : "MAINNET"; + qtExecuteGenericFunction("SetTestNetFlag",testnet_flag); + double dResponse = qtPushGridcoinDiagnosticData(data); + return true; + #endif + return false; +} + bool FullSyncWithDPORNodes() { #if defined(WIN32) && defined(QT_GUI) @@ -715,15 +744,12 @@ bool FullSyncWithDPORNodes() std::string sAge = RoundToString((double)superblock_age,0); std::string sBlock = mvApplicationCache["superblock;block_number"]; std::string sTimestamp = TimestampToHRDate(mvApplicationCacheTimestamp["superblock;magnitudes"]); - std::string data = "" + sWhitelist + "" + cpiddata + "" + sAge + "" + consensus_hash + "" + sBlock + "" + sTimestamp + "" + msPrimaryCPID + ""; - //if (fDebug3) printf("Syncing neural network %s \r\n",data.c_str()); std::string testnet_flag = fTestNet ? "TESTNET" : "MAINNET"; qtExecuteGenericFunction("SetTestNetFlag",testnet_flag); - qtSyncWithDPORNodes(data); #endif return true; @@ -3683,6 +3709,10 @@ bool CBlock::ConnectBlock(CTxDB& txdb, CBlockIndex* pindex, bool fJustCheck, boo */ bDoTally = true; } + else + { + if (fDebug3) printf("ConnectBlock(): Superblock Not Loaded %f\r\n",(double)pindex->nHeight); + } } } @@ -3775,9 +3805,8 @@ bool CBlock::ConnectBlock(CTxDB& txdb, CBlockIndex* pindex, bool fJustCheck, boo -bool ShaveChain(CTxDB& txdb) +bool ShaveChain(CTxDB& txdb, int iHaircut) { - int iHaircut = 100; int iTarget = 0; int iStart = 0; printf("Shaving %f blocks off of main chain\n",(double)iHaircut); @@ -3846,32 +3875,24 @@ bool ShaveChain(CTxDB& txdb) return error("ShaveChain() : WriteHashBestChain failed"); // Make sure it's successfully written to disk before changing memory structure - //if (!txdb.TxnCommit()) return error("ShaveChain() : TxnCommit failed"); - - // Buzz each block pointer BOOST_FOREACH(CBlockIndex* pindex, vDisconnect) if (pindex->pprev) pindex->pprev->pnext = NULL; - // Resurrect memory transactions that were in the disconnected branch BOOST_FOREACH(CTransaction& tx, vResurrect) AcceptToMemoryPool(mempool, tx, NULL); - CBlock block; if (!block.ReadFromDisk(pHaircut)) { printf("ShaveChain(): Fatal Error while reading new best block.\r\n"); return false; } - if (!block.SetBestChain(txdb, pHaircut)) { printf("ShaveChain(): Fatal Error while setting best chain inner.\r\n"); return false; } - if (bHaircutFailed) return false; - printf("ShaveChain: done\n"); return true; } @@ -4727,12 +4748,13 @@ bool ServicesIncludesNN(CNode* pNode) bool VerifySuperblock(std::string superblock, int nHeight) { bool bPassed = false; + double out_avg = 0; + double out_beacon_count=0; + double out_participant_count=0; + double avg_mag = 0; if (superblock.length() > 20) { - double out_avg = 0; - double out_beacon_count=0; - double out_participant_count=0; - double avg_mag = GetSuperblockAvgMag(superblock,out_beacon_count,out_participant_count,out_avg,false); + avg_mag = GetSuperblockAvgMag(superblock,out_beacon_count,out_participant_count,out_avg,false); bPassed=true; if (!IsResearchAgeEnabled(nHeight)) { @@ -4743,6 +4765,11 @@ bool VerifySuperblock(std::string superblock, int nHeight) if (out_avg < 70 && !fTestNet) bPassed = false; if (avg_mag < 10) bPassed = false; } + if (fDebug3 && !bPassed) + { + if (fDebug) printf(" Verification of Superblock Failed "); + // printf("\r\n Verification of Superblock Failed outavg: %f, avg_mag %f, Height %f, Out_Beacon_count %f, Out_participant_count %f, block %s", (double)out_avg,(double)avg_mag,(double)nHeight,(double)out_beacon_count,(double)out_participant_count,superblock.c_str()); + } return bPassed; } @@ -4817,11 +4844,12 @@ void GridcoinServices() if (TimerMain("OutOfSync",120)) { - if (OutOfSyncByMoreThan(30)) + double PORDiff = GetDifficulty(GetLastBlockIndex(pindexBest, true)); + bool fGhostChain = (!fTestNet && PORDiff < .75); + if (OutOfSyncByMoreThan(30) || fGhostChain) { RecoverNode(); } - } if (false && TimerMain("FixSpentCoins",60)) @@ -4998,20 +5026,74 @@ void GridcoinServices() } + + +void AskForOutstandingBlocks() +{ + LOCK(cs_vNodes); + BOOST_FOREACH(CNode* pNode, vNodes) + { + pNode->ClearBanned(); + // Ask for outstanding blocks + if (true) + { + if (!pNode->fClient && !pNode->fOneShot && (pNode->nStartingHeight > (nBestHeight - 144)) && (pNode->nVersion < NOBLKS_VERSION_START || pNode->nVersion >= NOBLKS_VERSION_END) ) + { + pNode->PushGetBlocks(pindexBest, uint256(0)); + printf("."); + } + } + } +} +void SyncChain() +{ + printf("\r\n * Sync Chain * \r\n"); + //6-11-2016 + CTxDB txdb; + LOCK(cs_main); + ShaveChain(txdb,200); + AskForOutstandingBlocks(); + std::string sOut = ""; + LoadAdminMessages(true,sOut); + InitializeBoincProjects(); + TallyResearchAverages(true); + ComputeNeuralNetworkSupermajorityHashes(); + LoadCPIDsInBackground(); + printf("\r\n * Finished * \r\n"); +} + + void RecoverNode() +{ + + SyncChain(); +} + +void ReloadBlockIndexHot() { printf("\r\n * Recovering Node * \r\n"); + // clear vectors, clear orphans, clear mapindex + mapOrphanBlocks.clear(); + mapBlockIndex.clear(); + setStakeSeen.clear(); setStakeSeenOrphan.clear(); + mvResearchAge.clear(); mapOrphanBlocks.clear(); - // Load block index - CTxDB txdb("r"); - txdb.LoadBlockIndex(); + mapOrphanBlocksByPrev.clear(); + mvApplicationCache.clear(); + mvApplicationCacheTimestamp.clear(); + mvNeuralVersion.clear(); + mvDPOR.clear(); + mvDPORCopy.clear(); + mvBlockIndex.clear(); + mvCPIDBlockHashes.clear(); + LoadBlockIndex(true); LOCK(cs_vNodes); BOOST_FOREACH(CNode* pNode, vNodes) { pNode->ClearBanned(); // Ask for some more blocks - if (LessVerbose(100)) + if (true) { if (!pNode->fClient && !pNode->fOneShot && (pNode->nStartingHeight > (nBestHeight - 144)) && (pNode->nVersion < NOBLKS_VERSION_START || pNode->nVersion >= NOBLKS_VERSION_END) ) { @@ -5076,7 +5158,9 @@ bool ProcessBlock(CNode* pfrom, CBlock* pblock, bool generated_by_me) if (TimerMain("OrphanBarrage", 25)) { bool fOut = OutOfSyncByMoreThan(30); - if (fOut) + double PORDiff = GetDifficulty(GetLastBlockIndex(pindexBest, true)); + bool fGhostChain = (!fTestNet && PORDiff < .75); + if (fOut || fGhostChain) { RecoverNode(); } diff --git a/src/qt/bitcoingui.cpp b/src/qt/bitcoingui.cpp index 0ae94b8070..82e4d5d65d 100644 --- a/src/qt/bitcoingui.cpp +++ b/src/qt/bitcoingui.cpp @@ -100,6 +100,9 @@ extern void qtSyncWithDPORNodes(std::string data); extern double qtExecuteGenericFunction(std::string function,std::string data); std::string GetArgument(std::string arg, std::string defaultvalue); extern std::string getMacAddress(); +extern double qtPushGridcoinDiagnosticData(std::string data); + +bool PushGridcoinDiagnostics(); extern std::string FromQString(QString qs); extern std::string qtExecuteDotNetStringFunction(std::string function, std::string data); @@ -508,6 +511,17 @@ void qtInsertConfirm(double dAmt, std::string sFrom, std::string sTo, std::strin #endif } +double qtPushGridcoinDiagnosticData(std::string data) +{ + if (!bGlobalcomInitialized) return 0; + int result = 0; + #if defined(WIN32) && defined(QT_GUI) + QString qsData = ToQstring(data); + result = globalcom->dynamicCall("PushGridcoinDiagnosticData(Qstring)",qsData).toInt(); + #endif + return (double)result; +} + //R Halford - 6/19/2015 - Let's clean up the windows side by removing all these functions and making a generic interface for comm between Windows and Linux; Start with one new generic function here: double qtExecuteGenericFunction(std::string function, std::string data) @@ -978,6 +992,11 @@ void BitcoinGUI::createActions() foundationAction->setStatusTip(tr("Foundation")); foundationAction->setMenuRole(QAction::TextHeuristicRole); + diagnosticsAction = new QAction(QIcon(":/icons/bitcoin"), tr("&Diagnostics"), this); + diagnosticsAction->setStatusTip(tr("Diagnostics")); + diagnosticsAction->setMenuRole(QAction::TextHeuristicRole); + + faqAction = new QAction(QIcon(":/icons/bitcoin"), tr("FA&Q"), this); faqAction->setStatusTip(tr("Interactive FAQ")); faqAction->setMenuRole(QAction::TextHeuristicRole); @@ -1027,10 +1046,11 @@ void BitcoinGUI::createActions() connect(tickerAction, SIGNAL(triggered()), this, SLOT(tickerClicked())); connect(ticketListAction, SIGNAL(triggered()), this, SLOT(ticketListClicked())); + connect(diagnosticsAction, SIGNAL(triggered()), this, SLOT(diagnosticsClicked())); connect(foundationAction, SIGNAL(triggered()), this, SLOT(foundationClicked())); connect(faqAction, SIGNAL(triggered()), this, SLOT(faqClicked())); - + connect(galazaAction, SIGNAL(triggered()), this, SLOT(galazaClicked())); connect(newUserWizardAction, SIGNAL(triggered()), this, SLOT(newUserWizardClicked())); @@ -1114,6 +1134,8 @@ void BitcoinGUI::createMenuBar() qmAdvanced->addSeparator(); qmAdvanced->addAction(faqAction); qmAdvanced->addAction(foundationAction); + qmAdvanced->addAction(diagnosticsAction); + #endif /* defined(WIN32) */ } @@ -1770,6 +1792,18 @@ void BitcoinGUI::ticketListClicked() #endif } +void BitcoinGUI::diagnosticsClicked() +{ +#ifdef WIN32 + if (!bGlobalcomInitialized) return; + qtSetSessionInfo(DefaultWalletAddress(), GlobalCPUMiningCPID.cpid, GlobalCPUMiningCPID.Magnitude); + bool result = PushGridcoinDiagnostics(); + globalcom->dynamicCall("ShowDiagnostics()"); +#endif +} + + + /* void BitcoinGUI::browserClicked() { diff --git a/src/qt/bitcoingui.h b/src/qt/bitcoingui.h index 0a229cb44d..105bda1b1f 100644 --- a/src/qt/bitcoingui.h +++ b/src/qt/bitcoingui.h @@ -120,6 +120,7 @@ class BitcoinGUI : public QMainWindow QAction *newUserWizardAction; QAction *foundationAction; QAction *faqAction; + QAction *diagnosticsAction; QAction *verifyMessageAction; QAction *aboutAction; @@ -220,6 +221,7 @@ private slots: void miningClicked(); void votingClicked(); void faqClicked(); + void diagnosticsClicked(); void tickerClicked(); diff --git a/src/rpcblockchain.cpp b/src/rpcblockchain.cpp index fbf02f0535..012cd54d48 100644 --- a/src/rpcblockchain.cpp +++ b/src/rpcblockchain.cpp @@ -29,6 +29,9 @@ extern bool UserAcknowledgedHoldHarmlessClause(std::string sAddress); std::string ConvertBinToHex(std::string a); std::string ConvertHexToBin(std::string a); void RecoverNode(); +bool TallyResearchAverages(bool Forcefully); + +void SyncChain(); extern bool GetExpiredOption(std::string& rsRecipient, double& rdSinglePrice, double& rdAmountOwed, std::string& rsOpra); @@ -74,7 +77,7 @@ double GetNetworkPaymentsTotal(); double GetOutstandingAmountOwed(StructCPID &mag, std::string cpid, int64_t locktime, double& total_owed, double block_magnitude); bool ComputeNeuralNetworkSupermajorityHashes(); bool UpdateNeuralNetworkQuorumData(); -bool ShaveChain(CTxDB& txdb); +bool ShaveChain(CTxDB& txdb,int iHowMuch); extern Array LifetimeReport(std::string cpid); Array StakingReport(); extern std::string AddContract(std::string sType, std::string sName, std::string sContract); @@ -2100,9 +2103,14 @@ Value execute(const Array& params, bool fHelp) results.push_back(entry); } + else if (sItem == "syncchain") + { + SyncChain(); + entry.push_back(Pair("SyncChain",1)); + results.push_back(entry); + } else if (sItem == "recover") { - //5-13-2016 RecoverNode(); entry.push_back(Pair("Recover",1)); @@ -2429,7 +2437,7 @@ Value execute(const Array& params, bool fHelp) else if (sItem == "shavechain") { CTxDB txdb; - if (ShaveChain(txdb)) + if (ShaveChain(txdb,100)) { entry.push_back(Pair("Warning!","This command is deprecated and can cause temporary instability. It is not recommended any longer. You may have to reboot the wallet to recover. ")); entry.push_back(Pair("Shave Succeeded.",(double)pindexBest->nHeight)); @@ -3141,7 +3149,8 @@ Value execute(const Array& params, bool fHelp) { bNetAveragesLoaded = false; nLastTallied = 0; - BusyWaitForTally(); + // BusyWaitForTally(); + bool bTallied = TallyResearchAverages(true); entry.push_back(Pair("Tally Network Averages",1)); results.push_back(entry); } @@ -3408,7 +3417,6 @@ Value execute(const Array& params, bool fHelp) } else if (sItem == "currentcontractaverage") { - //7-18-2015 std::string contract = ""; #if defined(WIN32) && defined(QT_GUI) contract = qtGetNeuralContract(""); @@ -3424,6 +3432,18 @@ Value execute(const Array& params, bool fHelp) entry.push_back(Pair("avg_mag",out_avg)); entry.push_back(Pair("beacon_participant_count",out_participant_count)); entry.push_back(Pair("superblock_valid",bValid)); + //Show current contract neural hash + std::string sNeuralHash = ""; + + #if defined(WIN32) && defined(QT_GUI) + sNeuralHash = qtGetNeuralHash(""); + entry.push_back(Pair(".NET Neural Hash",sNeuralHash.c_str())); + #endif + + entry.push_back(Pair("Length",(double)contract.length())); + std::string neural_hash = GetQuorumHash(contract); + entry.push_back(Pair("Wallet Neural Hash",neural_hash)); + results.push_back(entry); } diff --git a/src/rpcnet.cpp b/src/rpcnet.cpp index c65b414679..17ac587c11 100644 --- a/src/rpcnet.cpp +++ b/src/rpcnet.cpp @@ -341,16 +341,11 @@ Value getpeerinfo(const Array& params, bool fHelp) obj.push_back(Pair("startingheight", stats.nStartingHeight)); obj.push_back(Pair("sNeuralNetworkVersion",stats.sNeuralNetwork)); obj.push_back(Pair("nTrust",stats.nTrust)); - obj.push_back(Pair("GRCAddress",stats.sGRCAddress)); - - obj.push_back(Pair("banscore", stats.nMisbehavior)); - + obj.push_back(Pair("banscore", stats.nMisbehavior)); bool bNeural = false; bNeural = Contains(stats.strSubVer,"1999"); - obj.push_back(Pair("Neural Network", bNeural)); obj.push_back(Pair("Neural Hash",stats.NeuralHash)); - ret.push_back(obj); }