From 0c4e901504da8775bd05d27cf2b203779ececcb3 Mon Sep 17 00:00:00 2001 From: "Valeriano A.R" Date: Fri, 4 Sep 2020 00:53:07 +0200 Subject: [PATCH] Use a WinForm form for easy inputs. --- BasicBlockChain/BasicBlockChain.csproj | 24 +- BasicBlockChain/FrmMain.Designer.cs | 195 ++++++++++++ BasicBlockChain/FrmMain.cs | 58 ++++ BasicBlockChain/FrmMain.resx | 408 +++++++++++++++++++++++++ BasicBlockChain/Program.cs | 43 +-- BasicBlockChain/blocks.ico | Bin 0 -> 16958 bytes 6 files changed, 689 insertions(+), 39 deletions(-) create mode 100644 BasicBlockChain/FrmMain.Designer.cs create mode 100644 BasicBlockChain/FrmMain.cs create mode 100644 BasicBlockChain/FrmMain.resx create mode 100644 BasicBlockChain/blocks.ico diff --git a/BasicBlockChain/BasicBlockChain.csproj b/BasicBlockChain/BasicBlockChain.csproj index 44a4f11..174d2f9 100644 --- a/BasicBlockChain/BasicBlockChain.csproj +++ b/BasicBlockChain/BasicBlockChain.csproj @@ -5,7 +5,7 @@ Debug AnyCPU {34581A96-29BE-4AB6-9298-BC1AD3E78369} - Exe + WinExe BasicBlockChain BasicBlockChain v4.8 @@ -33,9 +33,17 @@ prompt 4 + + + + + blocks.ico + + + @@ -47,6 +55,12 @@ + + Form + + + FrmMain.cs + @@ -59,5 +73,13 @@ BasicBlockChain.Core + + + FrmMain.cs + + + + + \ No newline at end of file diff --git a/BasicBlockChain/FrmMain.Designer.cs b/BasicBlockChain/FrmMain.Designer.cs new file mode 100644 index 0000000..b5b4890 --- /dev/null +++ b/BasicBlockChain/FrmMain.Designer.cs @@ -0,0 +1,195 @@ +namespace BasicBlockChain +{ + partial class FrmMain + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FrmMain)); + this.lsbTransactions = new System.Windows.Forms.ListBox(); + this.lsbPendingTransactions = new System.Windows.Forms.ListBox(); + this.btnMine = new System.Windows.Forms.Button(); + this.grpAddTransaction = new System.Windows.Forms.GroupBox(); + this.btnAdd = new System.Windows.Forms.Button(); + this.lblFrom = new System.Windows.Forms.Label(); + this.lblTo = new System.Windows.Forms.Label(); + this.lblAmount = new System.Windows.Forms.Label(); + this.txtMinerName = new System.Windows.Forms.TextBox(); + this.txtFrom = new System.Windows.Forms.TextBox(); + this.txtTo = new System.Windows.Forms.TextBox(); + this.txtAmount = new System.Windows.Forms.TextBox(); + this.grpAddTransaction.SuspendLayout(); + this.SuspendLayout(); + // + // lsbTransactions + // + this.lsbTransactions.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left))); + this.lsbTransactions.FormattingEnabled = true; + this.lsbTransactions.Location = new System.Drawing.Point(12, 12); + this.lsbTransactions.Name = "lsbTransactions"; + this.lsbTransactions.Size = new System.Drawing.Size(225, 303); + this.lsbTransactions.TabIndex = 0; + // + // lsbPendingTransactions + // + this.lsbPendingTransactions.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left))); + this.lsbPendingTransactions.FormattingEnabled = true; + this.lsbPendingTransactions.Location = new System.Drawing.Point(243, 12); + this.lsbPendingTransactions.Name = "lsbPendingTransactions"; + this.lsbPendingTransactions.Size = new System.Drawing.Size(225, 277); + this.lsbPendingTransactions.TabIndex = 1; + // + // btnMine + // + this.btnMine.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.btnMine.Location = new System.Drawing.Point(393, 297); + this.btnMine.Name = "btnMine"; + this.btnMine.Size = new System.Drawing.Size(75, 23); + this.btnMine.TabIndex = 2; + this.btnMine.Text = "Mine"; + this.btnMine.UseVisualStyleBackColor = true; + this.btnMine.Click += new System.EventHandler(this.btnMine_Click); + // + // grpAddTransaction + // + this.grpAddTransaction.Controls.Add(this.txtAmount); + this.grpAddTransaction.Controls.Add(this.txtTo); + this.grpAddTransaction.Controls.Add(this.txtFrom); + this.grpAddTransaction.Controls.Add(this.lblAmount); + this.grpAddTransaction.Controls.Add(this.lblTo); + this.grpAddTransaction.Controls.Add(this.lblFrom); + this.grpAddTransaction.Controls.Add(this.btnAdd); + this.grpAddTransaction.Location = new System.Drawing.Point(474, 12); + this.grpAddTransaction.Name = "grpAddTransaction"; + this.grpAddTransaction.Size = new System.Drawing.Size(155, 135); + this.grpAddTransaction.TabIndex = 3; + this.grpAddTransaction.TabStop = false; + this.grpAddTransaction.Text = "Add transaction"; + // + // btnAdd + // + this.btnAdd.Location = new System.Drawing.Point(72, 97); + this.btnAdd.Name = "btnAdd"; + this.btnAdd.Size = new System.Drawing.Size(75, 23); + this.btnAdd.TabIndex = 0; + this.btnAdd.Text = "Add"; + this.btnAdd.UseVisualStyleBackColor = true; + this.btnAdd.Click += new System.EventHandler(this.btnAdd_Click); + // + // lblFrom + // + this.lblFrom.AutoSize = true; + this.lblFrom.Location = new System.Drawing.Point(6, 22); + this.lblFrom.Name = "lblFrom"; + this.lblFrom.Size = new System.Drawing.Size(30, 13); + this.lblFrom.TabIndex = 1; + this.lblFrom.Text = "From"; + // + // lblTo + // + this.lblTo.AutoSize = true; + this.lblTo.Location = new System.Drawing.Point(6, 48); + this.lblTo.Name = "lblTo"; + this.lblTo.Size = new System.Drawing.Size(20, 13); + this.lblTo.TabIndex = 2; + this.lblTo.Text = "To"; + // + // lblAmount + // + this.lblAmount.AutoSize = true; + this.lblAmount.Location = new System.Drawing.Point(6, 74); + this.lblAmount.Name = "lblAmount"; + this.lblAmount.Size = new System.Drawing.Size(43, 13); + this.lblAmount.TabIndex = 3; + this.lblAmount.Text = "Amount"; + // + // txtMinerName + // + this.txtMinerName.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.txtMinerName.Location = new System.Drawing.Point(287, 300); + this.txtMinerName.Name = "txtMinerName"; + this.txtMinerName.Size = new System.Drawing.Size(100, 20); + this.txtMinerName.TabIndex = 4; + // + // txtFrom + // + this.txtFrom.Location = new System.Drawing.Point(47, 19); + this.txtFrom.Name = "txtFrom"; + this.txtFrom.Size = new System.Drawing.Size(100, 20); + this.txtFrom.TabIndex = 4; + // + // txtTo + // + this.txtTo.Location = new System.Drawing.Point(47, 45); + this.txtTo.Name = "txtTo"; + this.txtTo.Size = new System.Drawing.Size(100, 20); + this.txtTo.TabIndex = 5; + // + // txtAmount + // + this.txtAmount.Location = new System.Drawing.Point(47, 71); + this.txtAmount.Name = "txtAmount"; + this.txtAmount.Size = new System.Drawing.Size(100, 20); + this.txtAmount.TabIndex = 6; + // + // FrmMain + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(651, 338); + this.Controls.Add(this.txtMinerName); + this.Controls.Add(this.grpAddTransaction); + this.Controls.Add(this.btnMine); + this.Controls.Add(this.lsbPendingTransactions); + this.Controls.Add(this.lsbTransactions); + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.Name = "FrmMain"; + this.Text = "BasicBlockChain"; + this.grpAddTransaction.ResumeLayout(false); + this.grpAddTransaction.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.ListBox lsbTransactions; + private System.Windows.Forms.ListBox lsbPendingTransactions; + private System.Windows.Forms.Button btnMine; + private System.Windows.Forms.GroupBox grpAddTransaction; + private System.Windows.Forms.TextBox txtAmount; + private System.Windows.Forms.TextBox txtTo; + private System.Windows.Forms.TextBox txtFrom; + private System.Windows.Forms.Label lblAmount; + private System.Windows.Forms.Label lblTo; + private System.Windows.Forms.Label lblFrom; + private System.Windows.Forms.Button btnAdd; + private System.Windows.Forms.TextBox txtMinerName; + } +} \ No newline at end of file diff --git a/BasicBlockChain/FrmMain.cs b/BasicBlockChain/FrmMain.cs new file mode 100644 index 0000000..c0b7761 --- /dev/null +++ b/BasicBlockChain/FrmMain.cs @@ -0,0 +1,58 @@ +using System; +using System.Windows.Forms; +using BasicBlockChain.Core; + +namespace BasicBlockChain +{ + public partial class FrmMain : Form + { + private BlockChain _nullCoin = null; + + public FrmMain() + { + InitializeComponent(); + _nullCoin = new BlockChain(genesisDate: new DateTime(2000, 1, 1), difficulty: 2); + } + + private void btnAdd_Click(object sender, EventArgs e) + { + if (string.IsNullOrEmpty(txtTo.Text) || string.IsNullOrEmpty(txtFrom.Text) || string.IsNullOrEmpty(txtAmount.Text)) { return; } + long amount = Convert.ToInt64(txtAmount.Text); + _nullCoin.AddTransaction(new Transaction(txtFrom.Text, txtTo.Text, amount, DateTime.UtcNow)); + txtTo.Text = string.Empty; + txtFrom.Text = string.Empty; + txtAmount.Text = string.Empty; + Lists_Update(); + } + + private void btnMine_Click(object sender, EventArgs e) + { + if (string.IsNullOrEmpty(txtMinerName.Text)) { return; } + _nullCoin.ProcessPendingTransactions(DateTime.UtcNow, txtMinerName.Text); + Lists_Update(); + } + + private void Lists_Update() + { + lsbTransactions.Items.Clear(); + foreach (Block block in _nullCoin.Chain) + { + foreach (Transaction transaction in block.Transactions) + { + lsbTransactions.Items.Add(Transaction_ToString(transaction)); + } + } + + lsbPendingTransactions.Items.Clear(); + foreach (Transaction transaction in _nullCoin.PendingTransactions) + { + lsbPendingTransactions.Items.Add(Transaction_ToString(transaction)); + } + } + + private string Transaction_ToString(Transaction transaction) + { + return string.Format("{0} - {1} - {2} - {3}", transaction.Date, transaction.Sender, transaction.Receiver, transaction.MicroCoinAmount); + } + } +} diff --git a/BasicBlockChain/FrmMain.resx b/BasicBlockChain/FrmMain.resx new file mode 100644 index 0000000..1eaa6e7 --- /dev/null +++ b/BasicBlockChain/FrmMain.resx @@ -0,0 +1,408 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + + AAABAAEAQEAAAAEAIAAoQgAAFgAAACgAAABAAAAAgAAAAAEAIAAAAAAAAEAAAHYCAAB2AgAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBA + AAhATgCDQE0A6kBNAOpBTQCCSUkABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAEFMAC9ATQDQQE0A/0BNAP9ATQD/QE0A/0BNANQ+TgAxAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAM2YABUBNAHdATQD6QE0A/0BNAP9ATQD/QE0A/0BNAP9ATQD/QE0A+kBO + AIBVVQADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQ04ALkBNAM5ATQD/QE0A/0BNAP9ATQD/QE0A/0BN + AP9ATQD/QE0A/0BNAP9ATQD/QE0AxkBOACQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQAAEQE0Adz9NAPlATQD/QE0A/0BN + AP9ATQD/QE0A/0BNAP9ATQD/QE0A/0BNAP9ATQD/QE0A/0BNAP9ATQDyQU4AZgAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABASwAsQE4AzEBN + AP9ATQD/QE0A/0BNAP9ATQD/QE0A/0BNAP9ATQD/QE0A/0BNAP9ATQD/QE0A/0BNAP9ATQD/QE0A/0BN + AP9ATQC3RU4AGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBA + AARATQB3QE0A+EBNAP9ATQD/QE0A/0BNAP9ATQD/QE0A/0BNAP9ATQD/QE0A/0BNAP9ATQD/QE0A/0BN + AP9ATQD/QE0A/0BNAP9ATQD/QE0A/0BNAOo/TABRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAEBLACxATgDMQE0A/0BNAP9ATQD/QE0A/0BNAP9ATQD/QE0A/0BNAv9BThL/QE0A/0BN + AP9ATQD/QE0A/0FOC/9ATQD/QE0A/0BNAP9ATQD/QE0A/0BNAP9ATQD/QE0A/0FNAJ5JSQAOAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAVVUAA0BNAHdATQD4QE0A/0BNAP9ATQD/QE0A/0BNAP9ATQD/QE0A/0NO + If9NUb7/Rk5V/0BNAP9ATQD/QE0A/0BNAP9GTlX/TFCs/0FNFP9ATQD/QE0A/0BNAP9ATQD/QE0A/0BN + AP9ATQD/QE0A4EBMAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQlAAI0BOAMJATQD/QE0A/0BNAP9ATQD/QE0A/0BN + AP9ATQD/QE0B/0dPZv9RUvP/UlL//0ZOVf9ATQD/QE0A/0BNAP9ATQD/Rk5V/1JS//9RUun/RU5O/0BN + AP9ATQD/QE0A/0BNAP9ATQD/QE0A/0BNAP9ATQD+P00AkUlJAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAACQU4AZj9NAPVATQD/QE0A/0BN + AP9ATQD/QE0A/0BNAP9ATQD/Qk0g/05Rvf9SUv//UlL//1JS//9GTlX/QE0A/0BNAP9ATQD/QE0A/0ZO + Vf9SUv//UlL//1JS//9MUKH/QU0M/0BNAP9ATQD/QE0A/0BNAP9ATQD/QE0A/0BNAP9ATQDUQk0AMgAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABNTQAKQE0AvkBN + AP9ATQD/QE0A/0BNAP9ATQD/QE0A/0BNAP9ATQH/R09o/1FS8/9SUv//UlL//1JS//9SUv//Rk5V/0BN + AP9ATQD/QE0A/0BNAP9GTlX/UlL//1JS//9SUv//UlL//1BS3P9ETjr/QE0A/0BNAP9ATQD/QE0A/0BN + AP9ATQD/QE0A/z9NAPk/TQBxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAP04AeUBNAP9ATQD/QE0A/0BNAP9ATQD/QE0A/0BNAP9CTh7/TVG7/1JS//9SUv//UlL//1JS + //9SUv//UlL//0ZOVf9ATQD/QE0A/0BNAP9ATQD/Rk5V/1JS//9SUv//UlL//1JS//9SUv//UlL8/0pQ + hf9ATQb/QE0A/0BNAP9ATQD/QE0A/0BNAP9ATQD/QE0A/0FOAFIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBNAKhATQD/QE0A/0BNAP9ATQD/QE0A/0BNAf9HT2T/UVHx/1JS + //9SUv//UlL//1JS//9SUv//UlL//1JS//9GTlX/QE0A/0BNAP9ATQD/QE0A/0ZOVf9SUv//UlL//1JS + //9SUv//UlL//1JS//9SUv//TlHO/0NOK/9ATQD/QE0A/0BNAP9ATQD/QE0A/0BNAP8/TgChAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBTQCqQE0A/0BNAP9ATQD/QE0A/0FN + F/9NUbf/UlL//1JS//9SUv//UlL//1JS//9SUv//UlL//1JS//9SUv//Rk5V/0BNAP9ATQD/QE0A/0BN + AP9GTlX/UlL//1JS//9SUv//UlL//1JS//9SUv//UlL//1JS//9RUff/SFBy/0BNAv9ATQD/QE0A/0BN + AP9ATQD/QU0AqgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQU0AqkBN + AP9ATQD/QE0A/0BNAP9GTlX/UlL//1JS//9SUv//UlL//1JS//9SUv//UlL//1JS//9SUv//UlL//0ZO + Vf9ATQD/QE0A/0BNAP9ATQD/Rk5V/1JS//9SUv//UlL//1JS//9SUv//UlL//1JS//9SUv//UlL//1JS + //9FTlL/QE0A/0BNAP9ATQD/QE0A/0FNAKoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAEFNAKpATQD/QE0A/0BNAP9ATQD/Rk5V/1JS//9SUv//UlL//1JS//9SUv//UlL//1JS + //9SUv//UlL//1JS//9GTlX/QE0A/0BNAP9ATQD/QE0A/0ZOVf9SUv//UlL//1JS//9SUv//UlL//1JS + //9SUv//UlL//1JS//9SUv//Rk5V/0BNAP9ATQD/QE0A/0BNAP9BTQCqAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBTQCqQE0A/0BNAP9ATQD/QE0A/0ZOVf9SUv//UlL//1JS + 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 + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAEFNAKpATQD/QE0A/0BNAP9ATQD/QE0A/0BNAP9ATQD/QE0A/0BN + AP9ATQD/Qk8A/2+CAP+ivAD/pb8A/6W/AP9icwD/QE0A/0BNAP9ATQD/QE0A/2FzAP+lvwD/pb8A/5+4 + AP9ldgD/QE0A/0BNAP9ATQD/QE0A/0BNAP9ATQD/QE0A/0BNAP9ATQD/QE0A/0BNAP9BTQCqAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBTQCqQE0A/0BNAP9ATQD/QE0A/0BN + AP9ATQD/QE0A/0BNAP9ATQD/UF8A/5CnAP+lvwD/pb8A/6W/AP+lvwD/YnMA/0BNAP9ATQD/QE0A/0BN + AP9hcwD/pb8A/6W/AP+lvwD/pb8A/4OZAP9HVQD/QE0A/0BNAP9ATQD/QE0A/0BNAP9ATQD/QE0A/0BN + AP9ATQD/QU0AqgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQU0AqkBN + AP9ATQD/QE0A/0BNAP9ATQD/QE0A/0BNAP9ATQD/aHoA/6K7AP+lvwD/pb8A/6W/AP+lvwD/pb8A/2Jz + AP9ATQD/QE0A/0BNAP9ATQD/YXMA/6W/AP+lvwD/pb8A/6W/AP+lvwD/m7QA/11uAP9ATQD/QE0A/0BN + AP9ATQD/QE0A/0BNAP9ATQD/QE0A/0FNAKoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAEFNAKpATQD/QE0A/0BNAP9ATQD/QE0A/0BNAP9NXAD/jaQA/6W/AP+lvwD/pb8A/6W/ + AP+lvwD/pb8A/6W/AP9icwD/QE0A/0BNAP9ATQD/QE0A/2FzAP+lvwD/pb8A/6W/AP+lvwD/pb8A/6W/ + AP+kvgD/fZIA/0RSAP9ATQD/QE0A/0BNAP9ATQD/QE0A/0BNAP9BTQCqAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBTQCqQE0A/0BNAP9ATQD/QE0A/0FOAP9oegD/oboA/6W/ + AP+lvwD/pb8A/6W/AP+lvwD/pb8A/6W/AP+lvwD/YnMA/0BNAP9ATQD/QE0A/0BNAP9hcwD/pb8A/6W/ + AP+lvwD/pb8A/6W/AP+lvwD/pb8A/6W/AP+UrAD/VWQA/0BNAP9ATQD/QE0A/0BNAP9ATQD/P00AqQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQU0AqkBNAP9ATQD/QE0A/0BN + AP9hcgD/pb8A/6W/AP+lvwD/pb8A/6W/AP+lvwD/pb8A/6W/AP+lvwD/pb8A/2JzAP9ATQD/QE0A/0BN + AP9ATQD/YXMA/6W/AP+lvwD/pb8A/6W/AP+lvwD/pb8A/6W/AP+lvwD/pb8A/6O9AP9YaQD/QE0A/0BN + AP9ATQD/QE0A/z9NAKkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEFN + AKpATQD/QE0A/0BNAP9ATQD/YnMA/6W/AP+lvwD/pb8A/6W/AP+lvwD/pb8A/6W/AP+lvwD/pb8A/6W/ + AP9icwD/QE0A/0BNAP9ATQD/QE0A/2FzAP+lvwD/pb8A/6W/AP+lvwD/pb8A/6W/AP+lvwD/pb8A/6W/ + AP+lvwD/YnMA/0BNAP9ATQD/QE0A/0BNAP8/TQCpAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABBTQCqQE0A/0BNAP9ATQD/QE0A/2JzAP+lvwD/pb8A/6W/AP+lvwD/pb8A/6W/ + AP+lvwD/pb8A/6W/AP+lvwD/YnMA/0BNAP9ATQD/QE0A/0BNAP9hcwD/pb8A/6W/AP+lvwD/pb8A/6W/ + AP+lvwD/pb8A/6W/AP+lvwD/pb8A/2JzAP9ATQD/QE0A/0BNAP9ATQD/P00AqQAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQU0AqkBNAP9ATQD/QE0A/0BNAP9icwD/pb8A/6W/ + AP+lvwD/pb8A/6W/AP+lvwD/pb8A/6W/AP+lvwD/pb8A/2JzAP9ATQD/QE0A/0BNAP9ATQD/YXMA/6W/ + AP+lvwD/pb8A/6W/AP+lvwD/pb8A/6W/AP+lvwD/pb8A/6W/AP9icwD/QE0A/0BNAP9ATQD/QE0A/z9N + AKkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEFNAKpATQD/QE0A/0BN + AP9ATQD/YnMA/6W/AP+lvwD/pb8A/6W/AP+lvwD/pb8A/6W/AP+lvwD/pb8A/6W/AP9fcAD/QE0A/0BN + AP9ATQD/QE0A/15vAP+lvwD/pb8A/6W/AP+lvwD/pb8A/6W/AP+lvwD/pb8A/6W/AP+lvwD/YnMA/0BN + AP9ATQD/QE0A/0BNAP8/TQCpAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABBTQCqQE0A/0BNAP9ATQD/QE0A/2JzAP+lvwD/pb8A/6W/AP+lvwD/pb8A/6W/AP+lvwD/pb8A/6C5 + AP9neQD/QE0A/0BNAP9ATQD/QE0A/0BNAP9ATQD/ZXcA/5+5AP+lvwD/pb8A/6W/AP+lvwD/pb8A/6W/ + AP+lvwD/pb8A/2JzAP9ATQD/QE0A/0BNAP9ATQD/P00AqQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAQU0AqkBNAP9ATQD/QE0A/0BNAP9icwD/pb8A/6W/AP+lvwD/pb8A/6W/ + AP+lvwD/pb8A/46mAP9OXQD/QE0A/0BNAP9ATQD/QE0A/0BNAP9ATQD/QE0A/0BNAP9LWgD/i6IA/6W/ + AP+lvwD/pb8A/6W/AP+lvwD/pb8A/6W/AP9icwD/QE0A/0BNAP9ATQD/QE0A/z9NAKkAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEFNAKpATQD/QE0A/0BNAP9ATQD/YnMA/6W/ + AP+lvwD/pb8A/6W/AP+lvwD/orsA/2+CAP9BTgD/QE0A/0BNAP9ATQD/QE0A/0BNAP9ATQD/QE0A/0BN + AP9ATQD/QE0A/0FOAP9oegD/orsA/6W/AP+lvwD/pb8A/6W/AP+lvwD/YnMA/0BNAP9ATQD/QE0A/0BN + AP8/TQCpAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBTQCqQE0A/0BN + AP9ATQD/QE0A/2JzAP+lvwD/pb8A/6W/AP+lvwD/lKsA/1NjAP9ATQD/QE0A/0BNAP9ATQD/QE0A/0BN + AP9ATQD/QE0A/0BNAP9ATQD/QE0A/0BNAP9ATQD/QE0A/1BfAP+RqAD/pb8A/6W/AP+lvwD/pb8A/2Jz + AP9ATQD/QE0A/0BNAP9ATQD/P00AqQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAQU0AqkBNAP9ATQD/QE0A/0BNAP9icwD/pb8A/6W/AP+kvgD/dYkA/0JPAP9ATQD/QE0A/0BN + AP9ATQD/QE0A/0BNAP9ATQD/V2cA/1dmAP9ATQD/QE0A/0BNAP9ATQD/QE0A/0BNAP9ATQD/Qk8A/3WJ + AP+kvgD/pb8A/6W/AP9icwD/QE0A/0BNAP9ATQD/QE0A/z9NAKkAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAEFNAKpATQD/QE0A/0BNAP9ATQD/YnMA/6W/AP+XsAD/V2YA/0BN + AP9ATQD/QE0A/0BNAP9ATQD/QE0A/0BNAP9CTwD/dYkA/6S+AP+kvgD/dYkA/0JPAP9ATQD/QE0A/0BN + AP9ATQD/QE0A/0BNAP9ATQD/V2cA/5evAP+lvwD/YnMA/0BNAP9ATQD/QE0A/0BNAP8/TQCpAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBTQCqQE0A/0BNAP9ATQD/QE0A/2Jz + AP+AlQD/RVIA/0BNAP9ATQD/QE0A/0BNAP9ATQD/QE0A/0BNAP9QXwD/kagA/6W/AP+lvwD/pb8A/6W/ + AP+UqwD/U2MA/0BNAP9ATQD/QE0A/0BNAP9ATQD/QE0A/0BNAP9EUQD/eY4A/2FzAP9ATQD/QE0A/0BN + AP9ATQD/P00AqQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQU0AqkBN + AP9ATQD/QE0A/0BNAP9CTwD/QE0A/0BNAP9ATQD/QE0A/0BNAP9ATQD/QE0A/0BNAP9tgAD/orsA/6W/ + AP+lvwD/pb8A/6W/AP+lvwD/pb8A/6K8AP9ugQD/QE0A/0BNAP9ATQD/QE0A/0BNAP9ATQD/QE0A/0BN + AP9CTwD/QE0A/0BNAP9ATQD/QE0A/z9NAKkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAEFNAKpATQD/QE0A/0BNAP9ATQD/QE0A/0BNAP9ATQD/QE0A/0BNAP9ATQD/QE0A/0ta + AP+LogD/pb8A/6W/AP+lvwD/pb8A/6W/AP+lvwD/pb8A/6W/AP+lvwD/pb8A/46mAP9OXQD/QE0A/0BN + AP9ATQD/QE0A/0BNAP9ATQD/QE0A/0BNAP9ATQD/QE0A/0BNAP8/TQCpAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBTQCqQE0A/0BNAP9ATQD/QE0A/0BNAP9ATQD/QE0A/0BN + AP9ATQD/QE0A/2JzAP+etwD/pb8A/6W/AP+lvwD/pb8A/6W/AP+lvwD/pb8A/6W/AP+lvwD/pb8A/6W/ + AP+lvwD/oLkA/2h6AP9ATQD/QE0A/0BNAP9ATQD/QE0A/0BNAP9ATQD/QE0A/0BNAP9ATQD/P00AqQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQU0AqkBNAP9ATQD/QE0A/0BN + AP9ATQD/QE0A/0BNAP9ATQD/RlQA/4KXAP+lvwD/pb8A/6W/AP+lvwD/pb8A/6W/AP+lvwD/pb8A/6W/ + AP+lvwD/pb8A/6W/AP+lvwD/pb8A/6W/AP+lvwD/iJ4A/0pYAP9ATQD/QE0A/0BNAP9ATQD/QE0A/0BN + AP9ATQD/QE0A/z9NAKkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEFN + AKpATQD/QE0A/0BNAP9ATQD/QE0A/0BNAP9ATQD/XG0A/5u0AP+lvwD/pb8A/6W/AP+lvwD/pb8A/6W/ + AP+lvwD/pb8A/6W/AP+lvwD/pb8A/6W/AP+lvwD/pb8A/6W/AP+lvwD/pb8A/6W/AP+dtgD/X3AA/0BN + AP9ATQD/QE0A/0BNAP9ATQD/QE0A/0BNAP8/TQCpAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAA/TgChQE0A/0BNAP9ATQD/QE0A/0BNAP9ATQD/R1UA/5KpAP+lvwD/pb8A/6W/ + AP+lvwD/pb8A/6W/AP+lvwD/pb8A/6W/AP+lvwD/pb8A/6W/AP+lvwD/pb8A/6W/AP+lvwD/pb8A/6W/ + AP+lvwD/pb8A/5KpAP9HVQD/QE0A/0BNAP9ATQD/QE0A/0BNAP9ATQD/QE0AoAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQU4AUkBNAP9ATQD/QE0A/0BNAP9ATQD/QE0A/0BN + AP9CTwD/dIgA/6O9AP+lvwD/pb8A/6W/AP+lvwD/pb8A/6W/AP+lvwD/pb8A/6W/AP+lvwD/pb8A/6W/ + AP+lvwD/pb8A/6W/AP+lvwD/o70A/3SIAP9CTwD/QE0A/0BNAP9ATQD/QE0A/0BNAP9ATQD/QE0A/0FO + AFIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/TQBxP00A+UBN + AP9ATQD/QE0A/0BNAP9ATQD/QE0A/0BNAP9XZwD/lq4A/6W/AP+lvwD/pb8A/6W/AP+lvwD/pb8A/6W/ + AP+lvwD/pb8A/6W/AP+lvwD/pb8A/6W/AP+lvwD/l68A/1dnAP9ATQD/QE0A/0BNAP9ATQD/QE0A/0BN + AP9ATQD/P00A+T9NAHEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAEBLACxATQDOQE0A/0BNAP9ATQD/QE0A/0BNAP9ATQD/QE0A/0RRAP95jgD/pL4A/6W/ + AP+lvwD/pb8A/6W/AP+lvwD/pb8A/6W/AP+lvwD/pb8A/6W/AP+lvwD/gJUA/0VSAP9ATQD/QE0A/0BN + AP9ATQD/QE0A/0BNAP9ATQD/QE0A1EJNADIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAM2YABUBOAIBATQD8QE0A/0BNAP9ATQD/QE0A/0BN + AP9ATQD/QE0A/1tsAP+bswD/pb8A/6W/AP+lvwD/pb8A/6W/AP+lvwD/pb8A/6W/AP+ctQD/X3AA/0BN + AP9ATQD/QE0A/0BNAP9ATQD/QE0A/0BNAP9ATQD+P00AkUlJAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP0wAOUBN + ANtATQD/QE0A/0BNAP9ATQD/QE0A/0BNAP9ATQD/RlQA/4CWAP+lvwD/pb8A/6W/AP+lvwD/pb8A/6W/ + AP+EmgD/SFYA/0BNAP9ATQD/QE0A/0BNAP9ATQD/QE0A/0BNAP9ATQDgQEwAQAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAA7TgANP00AmUBNAP9ATQD/QE0A/0BNAP9ATQD/QE0A/0BNAP9ATQD/YnMA/563 + AP+lvwD/pb8A/6C5AP9oegD/QE0A/0BNAP9ATQD/QE0A/0BNAP9ATQD/QE0A/0BNAP9BTQCqPEsAEQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/TQBJQE0A5kBNAP9ATQD/QE0A/0BN + AP9ATQD/QE0A/0BNAP9KWAD/iJ4A/46lAP9NXAD/QE0A/0BNAP9ATQD/QE0A/0BNAP9ATQD/QE0A/0BN + AOo/TABRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEZR + ABY/TACxQE0A/0BNAP9ATQD/QE0A/0BNAP9ATQD/QE0A/0FOAP9BTgD/QE0A/0BNAP9ATQD/QE0A/0BN + AP9ATQD/QE0A/0BNALJDTgAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAD9OAFVATQDvQE0A/0BNAP9ATQD/QE0A/0BNAP9ATQD/QE0A/0BN + AP9ATQD/QE0A/0BNAP9ATQD/P00A9UBOAG8AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQkoAH0BNAL9ATQD/QE0A/0BN + AP9ATQD/QE0A/0BNAP9ATQD/QE0A/0BNAP9ATQD/QE0Axz5MACUAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAABQE4Ab0BNAPhATQD/QE0A/0BNAP9ATQD/QE0A/0BNAP9ATQD6QE4AgFVVAAMAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBTQArQE0AzkBNAP9ATQD/QE0A/0BNAP9ATQDUPk4AMQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAElJAAdBTQCCQE0A60BN + AOtATgCDSUkABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAA////+B/////////wD////////8AD////////gAH///////4AAP///////AAAP//////wAAAf + /////+AAAAf/////gAAAA/////8AAAAA/////AAAAAB////4AAAAAD////gAAAAAH///+AAAAAAf///4 + AAAAAB////gAAAAAH///+AAAAAAf///4AAAAAB////gAAAAAH///+AAAAAAf///4AAAAAB////gAAAAA + H///+AAAAAAf///4AAAAAB////gAAAAAH///+AAAAAAf///4AAAAAB////gAAAAAH///+AAAAAAf///4 + AAAAAB////gAAAAAH///+AAAAAAf///4AAAAAB////gAAAAAH///+AAAAAAf///4AAAAAB////gAAAAA + H///+AAAAAAf///4AAAAAB////gAAAAAH///+AAAAAAf///4AAAAAB////gAAAAAH///+AAAAAAf///4 + AAAAAB////gAAAAAH///+AAAAAAf///4AAAAAB////gAAAAAH///+AAAAAAf///4AAAAAB////gAAAAA + H////AAAAAA////+AAAAAH////8AAAAA/////8AAAAP/////4AAAB//////4AAAf//////wAAD////// + /wAAf///////gAH////////AA/////////AP////////+B////8= + + + \ No newline at end of file diff --git a/BasicBlockChain/Program.cs b/BasicBlockChain/Program.cs index 299272c..59cc372 100644 --- a/BasicBlockChain/Program.cs +++ b/BasicBlockChain/Program.cs @@ -1,49 +1,16 @@ using System; -using BasicBlockChain.Core; -using VAR.Json; +using System.Windows.Forms; namespace BasicBlockChain { internal class Program { + [STAThread] private static void Main(string[] args) { - // Example BlockChain with some example data - Console.WriteLine(); - Console.WriteLine("#### Mining BlockChain with sample data"); - var startTime = DateTime.UtcNow; - BlockChain nullCoin = new BlockChain(genesisDate: new DateTime(2000, 1, 1), difficulty: 3); - nullCoin.AddTransaction(new Transaction("VAR", "NAM", 10_000_000, new DateTime(2000, 1, 2))); - nullCoin.ProcessPendingTransactions(new DateTime(2000, 1, 2), "Kable"); - nullCoin.AddTransaction(new Transaction("NAM", "VAR", 5_000_000, new DateTime(2000, 1, 3))); - nullCoin.ProcessPendingTransactions(new DateTime(2000, 1, 3), "Kable"); - nullCoin.AddTransaction(new Transaction("NAM", "VAR", 5_000_000, new DateTime(2000, 1, 4))); - nullCoin.ProcessPendingTransactions(new DateTime(2000, 1, 4), "Kable"); - Console.WriteLine(JsonWriter.WriteObject(nullCoin, indent: true)); - var endTime = DateTime.UtcNow; - Console.WriteLine($"Duration: {endTime - startTime}"); - - // Verify - Console.WriteLine("BlockChain is Valid? {0}", nullCoin.Verify() ? "True" : "False"); - - // Show balance - Console.WriteLine("Balance of \"{0}\": {1}", "VAR", nullCoin.GetMicroCoinBalance("VAR")); - Console.WriteLine("Balance of \"{0}\": {1}", "NAM", nullCoin.GetMicroCoinBalance("NAM")); - Console.WriteLine("Balance of \"{0}\": {1}", "Kable", nullCoin.GetMicroCoinBalance("Kable")); - - // Tamper with the data - Console.WriteLine(); - Console.WriteLine("#### Tampering with the data"); - nullCoin.Chain[1].Transactions[0].MicroCoinAmount = 1000_000_000; - Console.WriteLine(JsonWriter.WriteObject(nullCoin, indent: true)); - - // Verify - Console.WriteLine("BlockChain is Valid? {0}", nullCoin.Verify() ? "True" : "False"); - Console.WriteLine("Balance of \"{0}\": {1}", "VAR", nullCoin.GetMicroCoinBalance("VAR")); - Console.WriteLine("Balance of \"{0}\": {1}", "NAM", nullCoin.GetMicroCoinBalance("NAM")); - Console.WriteLine("Balance of \"{0}\": {1}", "Kable", nullCoin.GetMicroCoinBalance("Kable")); - - Console.Read(); + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new FrmMain()); } } } diff --git a/BasicBlockChain/blocks.ico b/BasicBlockChain/blocks.ico new file mode 100644 index 0000000000000000000000000000000000000000..8df318e04a1363fe5fadf98e61a9f1ca2b0eda1b GIT binary patch literal 16958 zcmZQzU}RuqaBu+83Je-f3=Con3=A3!3=9qo3=9nn5OD?&aA064V}f81cc8F?0|SSH zA49W)FT*PkcJyUv^7Le2A1L?G(_Tj(27L!#h6@h94FA#a6+1r$LwdS}o^~0hF|a!L zGL$>`GWTIg$cM4!o zcJO03gyu#xKQR7x_fPvD81(snP|$yz{s+kg2EF|6>gR{1AET}C&)%0|;()f98W@;B z<+Hsn!&iKMck)&E?-#fi>~E0&Ko}I)=z2h6AUPQJ30U~w(U*r%I9ze^WiX;jM3P{L zuP+0agD=BAbU&c-L2;e|k8_y6Ks3m&sA?I&X#ymNj01x1{CDxQ!W#yly4Bv7p^yaU zQ>@h9kD(IX{m6VLKe_+DfxA)S9NAyQ`X8d_&wsCg*8dK^Y;*E1Be}@0XZ4Cbt ziZJ~jo5%1!tA^n}p|An@9h4r>!wgg=5m|gutPErqy8VRsfe8%%C#+!jzjQyt|D<9} z|0fnhgyjf-gZu`<_~IWV55vtf8UDM65*H32H&N^{A`Jl9 zh0ot0xr{1?|BH5G`W@sqV*L+NJ9`Vme^A)~G7}#Lxrs>UQ>+YR7cRH>#xVTvU4q@; zApd|cDgFnkU$T$kf9)iO|1Lqe(*np%6nl(F13-46`yW(pgW`PQF8qE6`G-{hgY6Ms%hoyzo za)$r&cM=WY;R7-QWERLwSQrdu|4-jQnx8=a0{IW*Pf(cP!l1C4z8+F83|9X)OlA1*il>hP z@*A!+O-x>K31s+R*~jo7)K&zUg^UNf{3jHDAh+f=;O-NH(l%&}B(D*FegK(+&8~s= zKgeCUFfnx+$p0`*Y+Z?L-(dAWD6h`j4#~GL{}Drj+Df205ZRCT*n`dgZXpc+o2HZQ zZ}hO~n8)znD}r#I7)<_;$z}Kt8n;6C3%UHc+Zg_1>oXvy2YUJ+wAKjOZe%uSymHb? z%Hth9tUzXh%tp2gjlF>4fgK_Z0IfAcvm0gJ15`ejbTIq}jn$z0gH%4q43JqMGx6C8 zauboxr;0MrnnTdqLws%mwOOXEBR?&G+B+aK@Yw-!1IR5@@f3-MfY*By*w+DTvw+%p zq{KZjZ7By|h5=dsiX2SfeLa2*4Gz8xfAGaqbPmJ+*_#Qcg*jUZmvs)l3M zZR>!>-EF)X1d;6=jBI;f22TfHhG!tZ;=-Ud4XAC?x0K;OXwC?iI;i-N*#CkY7jA(J zV)i}^8=>w;sUKltpm81$hVgOGo1Fa^#F5P&N^E;ShENAzhW9x9hBaJ3YQg&|{221V z+jobOhq1WT$%{eW!Ixn_$X`U_<90p_s#uH~%0i3|ehm2p_DBuO{jbQ8=IG0yjbktD zu-^ZS90s6$TcADf4!#Vp!Pt+X86<|RhFRtO literal 0 HcmV?d00001