Browse Source

Build 1.0.8

Cross compatible. Can compile with Delphi (Windows only) or with Lazarus
(Windows + Linux). See COMPILE_INSTRUCTIONS file
PascalCoin 8 years ago
parent
commit
5737342419
52 changed files with 14937 additions and 3130 deletions
  1. 135 0
      COMPILE_INSTRUCTIONS.txt
  2. 5 4
      PascalCoinWallet.dpr
  3. BIN
      PascalCoinWallet.res
  4. 57 0
      PascalCoinWalletLazarus.dpr
  5. 240 0
      PascalCoinWalletLazarus.lpi
  6. BIN
      PascalCoinWalletLazarus.res
  7. 13 6
      README.md
  8. 13 6
      README.txt
  9. 276 0
      Units/Forms/UFRMAbout.lfm
  10. 36 5
      Units/Forms/UFRMAbout.pas
  11. 95 0
      Units/Forms/UFRMNewPrivateKeyType.lfm
  12. 18 5
      Units/Forms/UFRMNewPrivateKeyType.pas
  13. 85 0
      Units/Forms/UFRMNodesIp.lfm
  14. 15 2
      Units/Forms/UFRMNodesIp.pas
  15. 583 0
      Units/Forms/UFRMOperation.lfm
  16. 72 13
      Units/Forms/UFRMOperation.pas
  17. 310 0
      Units/Forms/UFRMPascalCoinWalletConfig.lfm
  18. 17 3
      Units/Forms/UFRMPascalCoinWalletConfig.pas
  19. 269 0
      Units/Forms/UFRMPayloadDecoder.lfm
  20. 24 2
      Units/Forms/UFRMPayloadDecoder.pas
  21. 64 191
      Units/Forms/UFRMWallet.dfm
  22. 1957 0
      Units/Forms/UFRMWallet.lfm
  23. 97 146
      Units/Forms/UFRMWallet.pas
  24. 723 0
      Units/Forms/UFRMWalletKeys.lfm
  25. 16 3
      Units/Forms/UFRMWalletKeys.pas
  26. 68 23
      Units/PascalCoin/UAES.pas
  27. 127 29
      Units/PascalCoin/UAccounts.pas
  28. 246 23
      Units/PascalCoin/UBlockChain.pas
  29. 19 5
      Units/PascalCoin/UConst.pas
  30. 85 24
      Units/PascalCoin/UCrypto.pas
  31. 0 996
      Units/PascalCoin/UDBStorage.pas
  32. 92 36
      Units/PascalCoin/UECIES.pas
  33. 50 46
      Units/PascalCoin/UFileStorage.pas
  34. 10 0
      Units/PascalCoin/ULog.pas
  35. 1 1
      Units/PascalCoin/UMiner.pas
  36. 17 20
      Units/PascalCoin/UNetProtocol.pas
  37. 15 15
      Units/PascalCoin/UNode.pas
  38. 19 5
      Units/PascalCoin/UOpTransaction.pas
  39. 400 0
      Units/PascalCoin/UOpenSSL.pas
  40. 7576 0
      Units/PascalCoin/UOpenSSLdef.pas
  41. 12 2
      Units/PascalCoin/UPoolMining.pas
  42. 4 0
      Units/PascalCoin/URPC.pas
  43. 11 5
      Units/PascalCoin/UTCPIP.pas
  44. 1 1
      Units/PascalCoin/UThread.pas
  45. 1 1
      Units/PascalCoin/UTime.pas
  46. 3 1
      Units/PascalCoin/UWalletKeys.pas
  47. 82 0
      Units/PascalCoin/config.inc
  48. 4 0
      Units/Utils/UAppParams.pas
  49. 0 1486
      Units/Utils/UDBGridUtils.pas
  50. 36 11
      Units/Utils/UFolderHelper.pas
  51. 868 12
      Units/Utils/UGridUtils.pas
  52. 70 2
      Units/Utils/UJSONFunctions.pas

+ 135 - 0
COMPILE_INSTRUCTIONS.txt

@@ -0,0 +1,135 @@
+*********************************
+*** HOW TO COMPILE PASCALCOIN ***
+*********************************
+(File updated 2016-10-20)
+
+Instruction about how to compile Pascal Coin Wallet 1.0.8  (2016-10-20)
+For newer versions... I hope will be similar ;-)
+
+IMPORTANT NOTE:
+- In Windows, it's tested with XP, W7 and W10.  In Linux, is tested on Ubuntu 16.04.1 (Graphical version) 64 bits
+- In Ubuntu 16.04.1, there is a Lazarus installation issue. See FAQ 01 (at the end of this document)
+
+- You can compile with Delphi (Tested Delphi version 2010), or with Lazarus (Tested version 1.6)
+- Cross-compatible if using Lazarus  (Windows + Linux + Mac)  (Note: Not tested in Mac, only Windows or Ubuntu)
+
+
+PLEASE READ CAREFULLY:
+
+
+**************************
+** DOWNLOAD SOURCE CODE **
+**************************
+
+- Create a source code folder, we will call this folder "SOURCE_CODE_FOLDER" 
+
+- Download PascalCoin source code from: https://github.com/PascalCoin/PascalCoin  (Tested with Build 1.0.8)
+- Download Synapse source code from: http://www.ararat.cz/synapse/lib/exe/fetch.php/file:synapse40.zip  (Tested with version Synapse40)
+  - Also you can download a new version from svn: https://sourceforge.net/p/synalist/code/HEAD/tree/trunk/
+  - If URL is broken, try searching "Synapse ararat" at Google and Download
+
+** WINDOWS **
+- If you want to compile for ** WINDOWS **, oobtain OpenSSL DLL's from: https://indy.fulgan.com/SSL/
+  - If compiler is Delphi, you must obtain a 32 bits DLL file
+  - If compiler is Lazarus, you must obtain a 64 bits DLL file
+  - You must unzip file "libeay32.dll" and put in "SOURCE_CODE_FOLDER"
+  - If you compile with Lazarus, RENAME this file to "libeay64.dll" because is 64 bits version
+
+** LAZARUS **
+- If you want to compile for Lazarus, obtain OpenSSL source code from: https://www.openssl.org/source/
+  - See section ** BUILD OPENSSL FOR LINUX **
+  - Tested with openssl-1.1.0b.targ.gz (2016-Sep-26)  
+
+*************************
+** DOWNLOAD BLOCKCHAIN **
+*************************
+
+- You don't need to obtain Blockchain, but is more quickly if you have downloaded it than to wait App download it from other nodes...
+- You will find a valid BlockChain at SourceForge PascalCoin downloads: https://sourceforge.net/projects/pascalcoin/files/ - Search for "BlockChain" file
+- Blockchain must be unziped and stored at PascalCoin data folder: (We will call it "PASCALCOIN_DATA_FOLDER")
+  - PascalCoin data folder for Windows:   c:\Users\(your user)\AppData\Roaming\PascalCoin\Data
+  - PascalCoin data folder for Linux: /home/(your user)/PascalCoin/Data
+
+REMEMBER TO PUT BLOCKCHAIN IN CORRECT "PASCALCOIN_DATA_FOLDER"
+REMEMBER TO GRANT PERMISIONS TO USER AT "PASCALCOIN_DATA_FOLDER"
+
+  
+*************************
+** COMPILE WITH DELPHI **
+*************************
+
+(In Delphi, you can only run in Windows)
+
+- Just open Delphi 2010, open project "PascalCoinWallet.dpr" located at "SOURCE_CODE_FOLDER"
+- Go to "Project > Options" and put "Synapse\lib" folder at Search Path option  (This will enable Delphi to find Synapse source code)
+- Build + Compile
+- Exe file will be: "PascalCoinWallet.exe"
+
+*************************
+** COMPILE WITH LAZARUS **
+*************************
+
+- Just open Lazarus (tested with Lazarus 1.6 and FPC 3.0)
+- Open project "PascalCoinWalletLazarus.lpi"
+- Check that 
+- Build + Compile
+- Executable file will be: "PascalCoinWalletLazarus"
+
+*****************************
+** BUILD OPENSSL FOR LINUX **
+*****************************
+
+Build OpenSSL is only necessary in Linux. In Windows you can download a build version from https://indy.fulgan.com/SSL/
+If you want to build on Windows, search how to at Google.
+Note: Tested with OpenSSL 1.1.0b (2016-Sep-26)
+- LINUX INSTRUCTIONS
+- Download OpenSSL from www.openssl.org (Preferred version 1.1.0b)
+- Unzip files to any folder, we will call it "OpenSSLSourceFolder"
+- Open a linux terminal
+  - Go to "OpenSSLSourceFolder"
+    cd /"OpenSSLSourceFolder"
+  - Create a temporal destination folder
+    mkdir tmp_openssl
+  - Config build options with this temporal destination dir
+    ./config shared --prefix=/"OpenSSLSourceFolder"/tmp_openssl
+  - Execute make and install
+    make
+	install
+  - We will find a file called "libcrypto.so.1.1" at folder "OpenSSLSourceFolder"/tmp_openssl/lib
+  - copy "libcrypto.so.1.1" to your executable folder (where you have been compiled PascalCoinWalletLazarus = "SOURCE_CODE_FOLDER")
+  - DON'T RENAME this file, because PascalCoin executable needs a file called "libcrypto.so.1.1" when compiled in Linux with OpenSSLv1.1 option enabled
+- If you download a version 1.0, then file name of compiled OpenSSL library must be "libcrypto.so.1.0.0" and save it at "SOURCE_CODE_FOLDER"
+
+*******************
+** FAQ's section **
+*******************
+
+************
+** FAQ 01 **
+************
+
+FAQ 01 -> Lazarus does not compile with Linux (example: file "interfaces" not found or missing)
+Explanation: In a fresh Ubuntu 16.04.1 (perhaps other versions too) with Lazarus 1.6 (downloaded and fresh installed) you cannot compile PascalCoin (and nor anyone other Pascal program)
+This is because you must build Lazarus core.
+Solution:
+- Open Lazarus and close all projects
+- Go to menu "Tools" > "Configure Build Lazarus"
+- Select Profile to build "Clean Up+ Build all"
+- Click to "Build"
+  - Lazarus will build itself and reboot
+- Open Lazarus again and check if you can compile without "interfaces" file error
+  - If not, then try again to build Lazarus selecting other Profile to build options (Perhaps "Debug IDE")
+  - If not... sorry... google search ;-)
+
+************
+** FAQ 02 **
+************
+
+If Application does not start showing a "file not found libeay32.dll" or "libcrypto.so.1.1" or "libeay64.dll"...
+Solution: Read "DOWNLOAD SOURCE CODE" section
+
+
+Copyright (c) 2016 Albert Molina
+
+If you like it, consider a donation using BitCoin:
+16K3HCZRhFUtM8GdWRcfKeaa6KsuyxZaYk

+ 5 - 4
PascalCoinWallet.dpr

@@ -14,7 +14,6 @@ uses
   ULog in 'Units\PascalCoin\ULog.pas',
   UNode in 'Units\PascalCoin\UNode.pas',
   UECIES in 'Units\PascalCoin\UECIES.pas',
-  UDBStorage in 'Units\PascalCoin\UDBStorage.pas',
   UFRMWallet in 'Units\Forms\UFRMWallet.pas' {FRMWallet},
   UFolderHelper in 'Units\Utils\UFolderHelper.pas',
   UAppParams in 'Units\Utils\UAppParams.pas',
@@ -24,15 +23,17 @@ uses
   UFRMOperation in 'Units\Forms\UFRMOperation.pas' {FRMOperation},
   UFRMWalletKeys in 'Units\Forms\UFRMWalletKeys.pas' {FRMWalletKeys},
   UFRMNewPrivateKeyType in 'Units\Forms\UFRMNewPrivateKeyType.pas' {FRMNewPrivateKeyType},
-  UAES in 'Units\Utils\UAES.pas',
   UFRMPayloadDecoder in 'Units\Forms\UFRMPayloadDecoder.pas' {FRMPayloadDecoder},
   UFRMNodesIp in 'Units\Forms\UFRMNodesIp.pas' {FRMNodesIp},
-  UDBGridUtils in 'Units\Utils\UDBGridUtils.pas',
   UTCPIP in 'Units\PascalCoin\UTCPIP.pas',
   UJSONFunctions in 'Units\Utils\UJSONFunctions.pas',
   URPC in 'Units\PascalCoin\URPC.pas',
   UPoolMining in 'Units\PascalCoin\UPoolMining.pas',
-  UMiner in 'Units\PascalCoin\UMiner.pas';
+  UMiner in 'Units\PascalCoin\UMiner.pas',
+  UFileStorage in 'Units\PascalCoin\UFileStorage.pas',
+  UOpenSSL in 'Units\PascalCoin\UOpenSSL.pas',
+  UOpenSSLdef in 'Units\PascalCoin\UOpenSSLdef.pas',
+  UAES in 'Units\PascalCoin\UAES.pas';
 
 {$R *.res}
 

BIN
PascalCoinWallet.res


+ 57 - 0
PascalCoinWalletLazarus.dpr

@@ -0,0 +1,57 @@
+program PascalCoinWalletLazarus;
+
+{$IFDEF FPC}
+  {$MODE Delphi}
+{$ENDIF}
+
+uses
+{$IFnDEF FPC}
+{$ELSE}
+  {$IFDEF LINUX}cthreads,{$ENDIF}
+  Interfaces,
+{$ENDIF}
+  Forms,
+  UBlockChain in 'Units\PascalCoin\UBlockChain.pas',
+  UCrypto in 'Units\PascalCoin\UCrypto.pas',
+  UTime in 'Units\PascalCoin\UTime.pas',
+  UWalletKeys in 'Units\PascalCoin\UWalletKeys.pas',
+  UOpTransaction in 'Units\PascalCoin\UOpTransaction.pas',
+  UNetProtocol in 'Units\PascalCoin\UNetProtocol.pas',
+  UAccounts in 'Units\PascalCoin\UAccounts.pas',
+  UConst in 'Units\PascalCoin\UConst.pas',
+  UThread in 'Units\PascalCoin\UThread.pas',
+  ULog in 'Units\PascalCoin\ULog.pas',
+  UNode in 'Units\PascalCoin\UNode.pas',
+  UECIES in 'Units\PascalCoin\UECIES.pas',
+  UAES in 'Units\PascalCoin\UAES.pas',
+  UFRMWallet in 'Units\Forms\UFRMWallet.pas' {FRMWallet},
+  UFileStorage in 'Units\PascalCoin\UFileStorage.pas',
+  UFolderHelper in 'Units\Utils\UFolderHelper.pas',
+  UAppParams in 'Units\Utils\UAppParams.pas',
+  UGridUtils in 'Units\Utils\UGridUtils.pas',
+  UFRMPascalCoinWalletConfig in 'Units\Forms\UFRMPascalCoinWalletConfig.pas' {FRMPascalCoinWalletConfig},
+  UFRMAbout in 'Units\Forms\UFRMAbout.pas' {FRMAbout},
+  UFRMOperation in 'Units\Forms\UFRMOperation.pas' {FRMOperation},
+  UFRMWalletKeys in 'Units\Forms\UFRMWalletKeys.pas' {FRMWalletKeys},
+  UFRMNewPrivateKeyType in 'Units\Forms\UFRMNewPrivateKeyType.pas' {FRMNewPrivateKeyType},
+  UFRMPayloadDecoder in 'Units\Forms\UFRMPayloadDecoder.pas' {FRMPayloadDecoder},
+  UFRMNodesIp in 'Units\Forms\UFRMNodesIp.pas' {FRMNodesIp},
+  UTCPIP in 'Units\PascalCoin\UTCPIP.pas',
+  UJSONFunctions in 'Units\Utils\UJSONFunctions.pas',
+  URPC in 'Units\PascalCoin\URPC.pas',
+  UPoolMining in 'Units\PascalCoin\UPoolMining.pas',
+  UMiner in 'Units\PascalCoin\UMiner.pas',
+  UOpenSSL in 'Units\PascalCoin\UOpenSSL.pas',
+  UOpenSSLdef in 'Units\PascalCoin\UOpenSSLdef.pas';
+
+{.$R *.res}
+
+{$R *.res}
+
+begin
+  Application.Initialize;
+  Application.MainFormOnTaskbar := True;
+  Application.Title := 'Pascal Coin Wallet, Miner & Explorer';
+  Application.CreateForm(TFRMWallet, FRMWallet);
+  Application.Run;
+end.

+ 240 - 0
PascalCoinWalletLazarus.lpi

@@ -0,0 +1,240 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<CONFIG>
+  <ProjectOptions>
+    <Version Value="9"/>
+    <PathDelim Value="\"/>
+    <General>
+      <Flags>
+        <MainUnitHasUsesSectionForAllUnits Value="False"/>
+        <MainUnitHasCreateFormStatements Value="False"/>
+        <MainUnitHasTitleStatement Value="False"/>
+      </Flags>
+      <SessionStorage Value="InProjectDir"/>
+      <MainUnit Value="0"/>
+      <Title Value="PascalCoinWalletLazarus"/>
+      <UseAppBundle Value="False"/>
+      <ResourceType Value="res"/>
+      <Icon Value="0"/>
+    </General>
+    <i18n>
+      <EnableI18N LFM="False"/>
+    </i18n>
+    <VersionInfo>
+      <StringTable ProductVersion=""/>
+    </VersionInfo>
+    <BuildModes Count="1">
+      <Item1 Name="Default" Default="True"/>
+    </BuildModes>
+    <PublishOptions>
+      <Version Value="2"/>
+    </PublishOptions>
+    <RunParams>
+      <local>
+        <FormatVersion Value="1"/>
+      </local>
+    </RunParams>
+    <RequiredPackages Count="1">
+      <Item1>
+        <PackageName Value="LCL"/>
+      </Item1>
+    </RequiredPackages>
+    <Units Count="34">
+      <Unit0>
+        <Filename Value="PascalCoinWalletLazarus.dpr"/>
+        <IsPartOfProject Value="True"/>
+      </Unit0>
+      <Unit1>
+        <Filename Value="Units\PascalCoin\UBlockChain.pas"/>
+        <IsPartOfProject Value="True"/>
+      </Unit1>
+      <Unit2>
+        <Filename Value="Units\PascalCoin\UCrypto.pas"/>
+        <IsPartOfProject Value="True"/>
+      </Unit2>
+      <Unit3>
+        <Filename Value="Units\PascalCoin\UTime.pas"/>
+        <IsPartOfProject Value="True"/>
+      </Unit3>
+      <Unit4>
+        <Filename Value="Units\PascalCoin\UWalletKeys.pas"/>
+        <IsPartOfProject Value="True"/>
+      </Unit4>
+      <Unit5>
+        <Filename Value="Units\PascalCoin\UOpTransaction.pas"/>
+        <IsPartOfProject Value="True"/>
+      </Unit5>
+      <Unit6>
+        <Filename Value="Units\PascalCoin\UNetProtocol.pas"/>
+        <IsPartOfProject Value="True"/>
+      </Unit6>
+      <Unit7>
+        <Filename Value="Units\PascalCoin\UAccounts.pas"/>
+        <IsPartOfProject Value="True"/>
+      </Unit7>
+      <Unit8>
+        <Filename Value="Units\PascalCoin\UConst.pas"/>
+        <IsPartOfProject Value="True"/>
+      </Unit8>
+      <Unit9>
+        <Filename Value="Units\PascalCoin\UThread.pas"/>
+        <IsPartOfProject Value="True"/>
+      </Unit9>
+      <Unit10>
+        <Filename Value="Units\PascalCoin\ULog.pas"/>
+        <IsPartOfProject Value="True"/>
+      </Unit10>
+      <Unit11>
+        <Filename Value="Units\PascalCoin\UNode.pas"/>
+        <IsPartOfProject Value="True"/>
+      </Unit11>
+      <Unit12>
+        <Filename Value="Units\PascalCoin\UECIES.pas"/>
+        <IsPartOfProject Value="True"/>
+      </Unit12>
+      <Unit13>
+        <Filename Value="Units\Forms\UFRMWallet.pas"/>
+        <IsPartOfProject Value="True"/>
+        <ComponentName Value="FRMWallet"/>
+        <HasResources Value="True"/>
+        <ResourceBaseClass Value="Form"/>
+      </Unit13>
+      <Unit14>
+        <Filename Value="Units\Utils\UFolderHelper.pas"/>
+        <IsPartOfProject Value="True"/>
+      </Unit14>
+      <Unit15>
+        <Filename Value="Units\Utils\UAppParams.pas"/>
+        <IsPartOfProject Value="True"/>
+      </Unit15>
+      <Unit16>
+        <Filename Value="Units\Utils\UGridUtils.pas"/>
+        <IsPartOfProject Value="True"/>
+      </Unit16>
+      <Unit17>
+        <Filename Value="Units\Forms\UFRMPascalCoinWalletConfig.pas"/>
+        <IsPartOfProject Value="True"/>
+        <ComponentName Value="FRMPascalCoinWalletConfig"/>
+        <HasResources Value="True"/>
+        <ResourceBaseClass Value="Form"/>
+      </Unit17>
+      <Unit18>
+        <Filename Value="Units\Forms\UFRMAbout.pas"/>
+        <IsPartOfProject Value="True"/>
+        <ComponentName Value="FRMAbout"/>
+        <HasResources Value="True"/>
+        <ResourceBaseClass Value="Form"/>
+      </Unit18>
+      <Unit19>
+        <Filename Value="Units\Forms\UFRMOperation.pas"/>
+        <IsPartOfProject Value="True"/>
+        <ComponentName Value="FRMOperation"/>
+        <HasResources Value="True"/>
+        <ResourceBaseClass Value="Form"/>
+      </Unit19>
+      <Unit20>
+        <Filename Value="Units\Forms\UFRMWalletKeys.pas"/>
+        <IsPartOfProject Value="True"/>
+        <ComponentName Value="FRMWalletKeys"/>
+        <HasResources Value="True"/>
+        <ResourceBaseClass Value="Form"/>
+      </Unit20>
+      <Unit21>
+        <Filename Value="Units\Forms\UFRMNewPrivateKeyType.pas"/>
+        <IsPartOfProject Value="True"/>
+        <ComponentName Value="FRMNewPrivateKeyType"/>
+        <HasResources Value="True"/>
+        <ResourceBaseClass Value="Form"/>
+      </Unit21>
+      <Unit22>
+        <Filename Value="Units\Forms\UFRMPayloadDecoder.pas"/>
+        <IsPartOfProject Value="True"/>
+        <ComponentName Value="FRMPayloadDecoder"/>
+        <HasResources Value="True"/>
+        <ResourceBaseClass Value="Form"/>
+      </Unit22>
+      <Unit23>
+        <Filename Value="Units\Forms\UFRMNodesIp.pas"/>
+        <IsPartOfProject Value="True"/>
+        <ComponentName Value="FRMNodesIp"/>
+        <HasResources Value="True"/>
+        <ResourceBaseClass Value="Form"/>
+      </Unit23>
+      <Unit24>
+        <Filename Value="Units\PascalCoin\UTCPIP.pas"/>
+        <IsPartOfProject Value="True"/>
+      </Unit24>
+      <Unit25>
+        <Filename Value="Units\Utils\UJSONFunctions.pas"/>
+        <IsPartOfProject Value="True"/>
+      </Unit25>
+      <Unit26>
+        <Filename Value="Units\PascalCoin\URPC.pas"/>
+        <IsPartOfProject Value="True"/>
+      </Unit26>
+      <Unit27>
+        <Filename Value="Units\PascalCoin\UPoolMining.pas"/>
+        <IsPartOfProject Value="True"/>
+      </Unit27>
+      <Unit28>
+        <Filename Value="Units\PascalCoin\UMiner.pas"/>
+        <IsPartOfProject Value="True"/>
+      </Unit28>
+      <Unit29>
+        <Filename Value="Units\PascalCoin\UOpenSSL.pas"/>
+        <IsPartOfProject Value="True"/>
+      </Unit29>
+      <Unit30>
+        <Filename Value="Units\PascalCoin\UOpenSSLdef.pas"/>
+        <IsPartOfProject Value="True"/>
+      </Unit30>
+      <Unit31>
+        <Filename Value="Units\PascalCoin\UFileStorage.pas"/>
+        <IsPartOfProject Value="True"/>
+      </Unit31>
+      <Unit32>
+        <Filename Value="Units\PascalCoin\config.inc"/>
+        <IsPartOfProject Value="True"/>
+      </Unit32>
+      <Unit33>
+        <Filename Value="Units\PascalCoin\UAES.pas"/>
+        <IsPartOfProject Value="True"/>
+      </Unit33>
+    </Units>
+  </ProjectOptions>
+  <CompilerOptions>
+    <Version Value="11"/>
+    <PathDelim Value="\"/>
+    <SearchPaths>
+      <IncludeFiles Value="$(ProjOutDir)"/>
+      <OtherUnitFiles Value="Synapse\lib;Units\Forms;Units\PascalCoin"/>
+    </SearchPaths>
+    <Parsing>
+      <SyntaxOptions>
+        <SyntaxMode Value="Delphi"/>
+      </SyntaxOptions>
+    </Parsing>
+    <Linking>
+      <Options>
+        <Win32>
+          <GraphicApplication Value="True"/>
+        </Win32>
+      </Options>
+    </Linking>
+    <Other>
+      <CustomOptions Value="-dBorland -dVer150 -dDelphi7 -dCompiler6_Up -dPUREPASCAL"/>
+    </Other>
+  </CompilerOptions>
+  <Debugging>
+    <Exceptions Count="3">
+      <Item1>
+        <Name Value="EAbort"/>
+      </Item1>
+      <Item2>
+        <Name Value="ECodetoolError"/>
+      </Item2>
+      <Item3>
+        <Name Value="EFOpenError"/>
+      </Item3>
+    </Exceptions>
+  </Debugging>
+</CONFIG>

BIN
PascalCoinWalletLazarus.res


+ 13 - 6
README.md

@@ -20,15 +20,14 @@ https://github.com/PascalCoin/PascalCoin
 
 HOW TO COMPILE:
 
-Version 1.0 of Pascal Coin Wallet, Miner & Explorer is compiled with
+Version 1.0.8 of Pascal Coin Wallet can be compiled with Delphi and Lazarus and run in Windows or Linux
 
 - Included source code available at https://github.com/PascalCoin/PascalCoin
-- Delphi 2010 (Future versions will compile with Lazarus...)
-- Source code of OpenSSL-Delphi that can be obtained from: https://github.com/Arvur/OpenSSL-Delphi - Put it on any directory and make it available to compile.
+- Read "COMPILE_INSTRUCTIONS" file with instructions (available at github)
 
-
-To run:
-- libeay32.dll - Can be downloaded from https://indy.fulgan.com/SSL/
+To run it needs a OpenSSL library:
+- Windows: libeay32.dll - Can be downloaded from https://indy.fulgan.com/SSL/
+- Linux: libcrypto.so.1.0.0 or libcrypto.so.1.1 (Instructions in "COMPILE_INSTRUCTIONS" file)
 
 
 Enjoy Pascal Coin!
@@ -38,6 +37,14 @@ If you like it, consider a donation using BitCoin:
 
 History:
 
+Build 1.0.8.0 - 2016-10-20
+--------------------------
+- Cross compatible
+- Can compile with Delphi or Lazarus (Free Pascal)
+- New storage system. No more access database
+- Network hashrate calculation
+
+
 Build 1.0.7.0 - 2016-10-10
 --------------------------
 - Introducing basic JSON-RPC to allow GPU miners development (Third party).

+ 13 - 6
README.txt

@@ -20,15 +20,14 @@ https://github.com/PascalCoin/PascalCoin
 
 HOW TO COMPILE:
 
-Version 1.0 of Pascal Coin Wallet, Miner & Explorer is compiled with
+Version 1.0.8 of Pascal Coin Wallet can be compiled with Delphi and Lazarus and run in Windows or Linux
 
 - Included source code available at https://github.com/PascalCoin/PascalCoin
-- Delphi 2010 (Future versions will compile with Lazarus...)
-- Source code of OpenSSL-Delphi that can be obtained from: https://github.com/Arvur/OpenSSL-Delphi - Put it on any directory and make it available to compile.
+- Read "COMPILE_INSTRUCTIONS" file with instructions (available at github)
 
-
-To run:
-- libeay32.dll - Can be downloaded from https://indy.fulgan.com/SSL/
+To run it needs a OpenSSL library:
+- Windows: libeay32.dll - Can be downloaded from https://indy.fulgan.com/SSL/
+- Linux: libcrypto.so.1.0.0 or libcrypto.so.1.1 (Instructions in "COMPILE_INSTRUCTIONS" file)
 
 
 Enjoy Pascal Coin!
@@ -38,6 +37,14 @@ If you like it, consider a donation using BitCoin:
 
 History:
 
+Build 1.0.8.0 - 2016-10-20
+--------------------------
+- Cross compatible
+- Can compile with Delphi or Lazarus (Free Pascal)
+- New storage system. No more access database
+- Network hashrate calculation
+
+
 Build 1.0.7.0 - 2016-10-10
 --------------------------
 - Introducing basic JSON-RPC to allow GPU miners development (Third party).

+ 276 - 0
Units/Forms/UFRMAbout.lfm

@@ -0,0 +1,276 @@
+object FRMAbout: TFRMAbout
+  Left = 291
+  Height = 405
+  Top = 184
+  Width = 585
+  ActiveControl = bbClose
+  BorderIcons = [biSystemMenu]
+  BorderStyle = bsDialog
+  Caption = 'About...'
+  ClientHeight = 405
+  ClientWidth = 585
+  Color = clBtnFace
+  Font.Color = clWindowText
+  Font.Height = -11
+  Font.Name = 'Tahoma'
+  OnCreate = FormCreate
+  Position = poOwnerFormCenter
+  LCLVersion = '1.6.0.4'
+  object Image1: TImage
+    Left = 15
+    Height = 62
+    Top = 15
+    Width = 62
+    AutoSize = True
+    Picture.Data = {
+      1754506F727461626C654E6574776F726B477261706869630A0F000089504E47
+      0D0A1A0A0000000D494844520000003E0000003E080600000073C1A844000000
+      0473424954080808087C086488000000097048597300000B1200000B1201D2DD
+      7EFC0000001C74455874536F6674776172650041646F62652046697265776F72
+      6B7320435336E8BCB28C00000016744558744372656174696F6E2054696D6500
+      30362F30372F313610A27E9700000E62494441546881CD9B7D9C54D579C7BFE7
+      CEECEEC0BE22B02F2CB033B3C2F2EA0ED0801491B56068ADBCA40511492DD12A
+      A468C57CAC298444AC1113623EB15A6391A8D40815431B8C2FA9489301444113
+      1844C00576980576D91D0177667760999DB9A77FDCBB77EFECBCEDABEDEFF339
+      9FB973EFB9E79CDF739EE7B9CF7913524AFA0B42881B80BF016600A5C020200B
+      50F424F51401424003E0050E00FF25A5FCBCDFDAD6D7C485100B818780C9D936
+      6BFD8D15458D55134B2C958EC1B9F3A69655267B2F100A07F71EBB70E6A8EF72
+      F3EF3EAD8FEE3D76C1DE165107000781E7A494EFF7693BFB82B8106234F028F0
+      0D4751EEC97B6EAD883C78FB841BF2B333F37A53AEB72158F7FADE9A331B7E75
+      7870A8353200D80ABC28A53CDBEB36F786B810620CB0D6A288998B66387D1BEE
+      FEDA2867715E696F1B9508DE8660DDA2A7767B0F7B2F8E045E03364929CFF5B4
+      BC1E1117420C02FE1158B96466F9914DAB664EEE6DEF7615260194038F4B295F
+      EC4939DD262E84A804B60FC9B35D39F8D38585FDD5C3E970B0DA7F72FE13EF85
+      FC81ABA7815552CA2FBAF37EB7880B21165B14F1E4FABBA634AE5B32F9A6EE36
+      361D3CDE4B3485AE612FCAC55E980B80CFDF8CAFB19982EC2C5CCEC171EF2CF9
+      F16EF71B1F7887032BA594FFD3D5BA94AE641242D884103FC81D90F183FD1B17
+      C8F4A40508058405146B6C128AF63C01566FFE905BD6BECD96DD278D7B5B769F
+      E496B56FB37AF38709DFD9FEDD3955BFF9FEDC904511BF1442ACEC0A1FE82271
+      E0896C9BF5CE73AF2C1B39ADA27074C21C4268C42C5960CD02AB2D41CAEAF8B5
+      649904A1C173E612404CCFBA8FD60350357158D2C6CD9B5A56B97FE382E61C5B
+      C63F74957C4AE2428801428817726C19B7D56DF9666942072614B06480A59D98
+      89744622F29D8460C9024B264D57DA0884C200869A83A6EA00F6A2DCB8AACD98
+      565138FAFC9665A5B90332560921D60B21327B4C1C7838DB669D757ECBB2E109
+      492B197AC36D897BD992E6BF21A82C3CBEA051ACB9C76BFD2DBA3072D23415F2
+      B333F3CEBDB26C648E2D6331B03455DEA4CE4D08B1386F60E69AB32FDF551E47
+      5A283A69ABF6AB5841B1E836ADFF0A85E54FFE0A5FC3971DEF49F385D4FF6BD7
+      E7BF085253DF44CE800CA6940F05244DA1304774F57F6CE91443282EE7E018AD
+      E88C83D5FE93331E7DD31A55E5FDC91C5E42E24288511645ECDABF714138CEA6
+      8502964C4DBD0DD266E765D105A3206E7C3869E37A8B4AC760562F98C8F2D989
+      5DCE5B1FD71E99FFC47BB940A594B2A5F3F338551742E4015BBF7DDBB8DAE4A4
+      CD292B36E92AEFF6F43AAA4C8923672EF1AD67DCD8EFDD86C77B29EEF9BCA965
+      9577DCE43C0BFC520831A0F3F34436FE9DC2FC01D6E756CC981573570813D98C
+      8E6B6B668CADB6DBAFAF3198A0E8BE47ADBF85490FFDA7E1FDCDD8FEDD395585
+      F903CA4860EF31C4F561E4CA8F9E5E5018578A92614A995A4AD6F3D62C7C0D4D
+      7DC7AE0B58F8E42EE30B60C66FBE3F371B7854085164BEDFB9C7D72D99597E22
+      2E0C55AC1DCECC92614A26D2E65EB764E1FE43BF0DA51322100AB3FAC58FE2EE
+      4FAB281C3DC939C40F3C60BE6F38372184D3A288BD97B6FD6D6EAC17171D0187
+      35CB445427AD98D4BF5D408A85823F594AA03994B091F9B9D9B8C6D8D13CBBE4
+      7CE3256ACEF9C91998C5948A1180CAF9C6266AEA2F775B00675E5A1AE7F1BD0D
+      C1BAF2FB5EB7A239BA4688EDF1EF2D9AE13C15F7E952F44F94D9735B4C6A1FD3
+      FB9A709A426D494903B8C695E3DEF613DCAFFD08F7AB3FE4F659DAA76AF6D4B1
+      B8373D8CFBE70FB06EF96C00460CCDE3D78F2D60568AC8CD8C67DE3C1A77CF59
+      9C573AC939E414F06D8396E9F9E20D777F6D54DC5B8A0584D524800C530C9E41
+      BC97CFC473F27CCAC6554D9F1CE3283DD5B59A40C6D80DE1B6FB08E7B0412CBC
+      A902F7C6453C347F625AE2893C3CC08E35731CC0FD31C4851077388A728FC5D9
+      B631D050620394CEDFEE4E42F09C3893B271F691238C50154B269ECF7D3A7187
+      519EFBB05713D224871E1B587866C54CCAD24470EDF17E67388BF34AB36DD626
+      21C4748338B0FA9E5B2B2271B985253625251FABF29E13A753132F1B61984B53
+      4B2B81E62BDAFDD222A30EDF052DE2B3175F6704440885E5B32B5296DD1EEF27
+      C23F2D725D0256012842080BE07AF0F60937C41357B4EFB7503A7ADFF84D2200
+      2503DFF986948DAB9AF9A7BA63B4E2F9BCD6B8EF1A576E945BDBA039367BC975
+      3175271A93771577CDBADE01FC851042518049D9366B6DE2919799B41223F9D8
+      7BB182D8F3E11F92565E39616C4CA8EB3951A3DD1FE330CA72FFB1633C5E35D9
+      691AC30B7CFEB8E83306B32694247DE62CCE2BCDB02A2D80430196DE5851D498
+      90B45E59CC35ED5A904028C282AF2E756FDBCB46EA31BDE6307DE7B5AAEDC38B
+      0D82BE0B5A6F97150F32699D9692392FA3FC34C3D79BC7979C011629C0F43B6F
+      2EB7C56769AFACF33526219885A391F77C762A65C5AE1B26749041C1734CEB5D
+      4DCDB57A7CF51735122566B5D6EAD97920B5E34C3561A13D2FB100D3ACC0B0A2
+      820129E2CB04D3444224BE063C9F9D4859B146BC43909E639AA05C639D467DEE
+      4FB4A8AF6ACAF531F53FF3EB43299D1740D5C4E4AA0E50E9189C0B14588141F3
+      A6969525CFDA3E76360D5F63AED598BC69894F1CA7BD2F254D812081667DA261
+      787B282DF1D56B13A6F692EB681FC47B6A1A7878D39E94652F98664F394E07B8
+      797C8903685580046A8ED1386375CB206F4A52D5F3A820A320557C67EB52566C
+      1F51026A146414CFD18E78DE35C661D4597B41B3637BF12090929D1F9CA0EA3B
+      DB52960BB07AC184B47974276EB302D6C45924A0EAA4CC044D8958D2A8518E1C
+      AB4E5AE9AC193742B40DD43650238676548E751AE5B83FFECCC8EFBB7099AACD
+      EFB2C793DAAE41EBED74F66D824D00AA7CEBFEC4F3BD964CD37C996986D49829
+      B5C50C60DC1F1FE796250F242CAA3F51569883E7D9451464A79C5F3420E6BD18
+      4DD2DB3A8CDEEC94543D8908A8FA373CAAE03B973A46EF0FE46767B2F37B73BB
+      4CBA1D0A104DFA54464155759B543B08CB28A8119011ED574FE9ECBBAF919F9D
+      897BC3BC9E4473AA156D513E71CF4B69EAE5881678A851CD468502510B9AEC34
+      4B711FF0F49C453751E918CCCE755F4FEBC593E08A15080642E170D2D54E43AD
+      75F2BA5A77C4EDC2F896B7879FFD89FCEC4C56CF9FC8FABBA6F4A698162BF0C5
+      DE63172249772B18BD6DD1ED59271B8D5D036B0A868C51567FA0AC3087E5B32B
+      58BD6062B7EDD98CB73EAE3D029A8A9F3DEABB9C3B6F6A8A18468DE8443BC7E6
+      0223C038EE4DDDF06143B19716D2BE9070FAEC05EAFC5F32A42087F1CE61804A
+      C3C520D567FDD832AD4C1B5B8ACB39047B610E55E30B713906F598AC19FEC0D5
+      56E00B2B70E0779FD6FFD9DA3B2625CF2D555DCD15888AF86752E2F93C35F1F5
+      7FFFD72C9F3FD38801AAEEDD409DFF4B562D9EC5FABF9B0BD136D6FFE2B73CFE
+      F26EA68D2DC5FDD33B2112866858F3297D84FFD853D30AECB5026FEF3D76E19E
+      B46FA8914EA3341D06F1DA646F02602FCA83482BA082AAE2A9D6161C5CD71741
+      E41AA811DC87B4098CAACAE1A640A7EF48031CACF60F05762AC0F1B6889AE76D
+      08A6FF1645DB40D57B211AD61A1C0D43F41ABEFAD4C3C52A975D231EB9465353
+      138196AB80BE32DA5E46FBACCBD06CFD5EDF920E84C2C196D6B6A152CA538A94
+      B215D8B76DCFE9F47121688D899AC847AF41F41A7B3CC955BD72D4309DB496CC
+      66E1720ED6CB0853DB1800C03E74A04EBA6FB7A23DFFCEB14F817DD031E7B6E9
+      473B3C5D8F02D4B60ED29130BE3A7FCAECF6A2824EC43535AF2C2F32B4A05DCD
+      01AAC6EB4EB08FF1D2FBD556E025E8085C76855A2343BC0DC1BA2E6FE6512346
+      48EB3999DA4A5CE54375FBD6465F0BA73B71399651909DA1094F8DE2B2E7F3FB
+      A7E6771AE6F61DBC0DC13A6F43B01870834E5C4A191142FC6CD153BB6F3BF42F
+      7FD5F55D4C5285A88AE774EAE92697E33A9DB8F68E7D880DFBE0422D4688B482
+      1AA5C026A89A50DC33565DC0DA573F3905EC97525E81D805857F3DECBD38A14B
+      4EAE133C3517533E77D9F34DAA7EADE33A7A4DB3E57EEAE5760442E1E08EFDDE
+      E180B127CE202EA56C067EB1E8A9DD5D737226245AA534C33E382B96ACDAA68F
+      01FA6F03B1192B9EDF7728AACAADE6ADA09D574B9F3DECBD587AB0DA7F926EE0
+      4892D50B689FEEFD6A082682B72158B77D5FCD04E0DFCCF76388EB7B43D7CF7F
+      E2BDE42B7E9D906841DE8C74D3BDFD8DE98FBCE9071E9152C638A2443B2276F8
+      03576B96FC78B7BB2B05A79BE077397ABEF2D15B6C78E3F007FEC0D54629E5BF
+      777E16475CF77AF7BFF1817774FB4826157C8DA9EDBB374B3EBDC1C16AFFC9C7
+      B6FD7120DADEF93824DCE726A5FC1258F48D27770D4C67EFE954DDE51CD2C5A6
+      F61D02A17070CEBA772291A8FAB8943261FB936EF093527E1455E5DA39EBDE89
+      0642E1A43B79922DCB823669D09BB1734F1008858323BEB5B5B6A5B5ED15E09D
+      64F952EE6C9452EE68696DDB317CF9D6BA44E49B42E1942B1B5FB57DEBA4CF36
+      5F6DFBB994F2692965D2F9C42E6DDB1642ACCC1B98B962D73FDF36D0BCF7AD29
+      14C6E34D1EBC98B75FF73702A17070F8F2AD752DAD6D6F4829D7A7CBDFE5FDEA
+      4288FB142136EC5CF7F5BA54876AFE2F70B0DA7F72EE63EF360742E15780CD52
+      CAD40B6C748FB802CC069E5E32B3FCF2EB8FCEAEEA556BFB080F6EDABFE78577
+      8F5F1F55E57D52CADF76F5BD9E1CCD7002CFE7D83246EEFEE15F5A93EE5FEF67
+      781B8275D31F79D3EF0F5C6D04BE29A54C3D13D2093D3E85A49F2F7B619273C8
+      E91D6BE638BEAAB329815038B8E2F97D87B6EFAB71001B81D7A494DDDE3FDADB
+      E35783D0760C3E34C939E4F88E35739CFD79FC6AEDAB9F9CDAB1DF6B8FAA7207
+      F0EC577EFC2AAE106D9FE8DDC0BD39B60C75CD62D7A53B6F2EEFB5160442E1E0
+      736F7FF6E9CBEF575BCF34368F0236A311BED0EB36F7C311CB29685BAA6EC9B4
+      2A6D33C797D48F1B39885B5DA505378F2F71245BB1E97CC4F240756361A83552
+      0C7C023CFDFFF28865D2C2852803FE1CED50ED686018900B64A2CDFE48200C5C
+      035A8046A006F83DF0DF40BD94FD334BF1BFCAF3090585D7E9BD000000004945
+      4E44AE426082
+    }
+  end
+  object Label1: TLabel
+    Left = 90
+    Height = 25
+    Top = 15
+    Width = 425
+    Caption = 'Pascal Coin Wallet, Miner && Explorer'
+    Font.Color = clBlack
+    Font.Height = -21
+    Font.Name = 'Tahoma'
+    Font.Style = [fsBold]
+    ParentColor = False
+    ParentFont = False
+  end
+  object lblBuild: TLabel
+    Left = 15
+    Height = 13
+    Top = 356
+    Width = 36
+    Caption = 'Build:'
+    Font.Color = clWindowText
+    Font.Height = -11
+    Font.Name = 'Tahoma'
+    Font.Style = [fsBold]
+    ParentColor = False
+    ParentFont = False
+  end
+  object lblProtocolVersion: TLabel
+    Left = 15
+    Height = 13
+    Top = 375
+    Width = 57
+    Caption = 'Protocol:'
+    Font.Color = clWindowText
+    Font.Height = -11
+    Font.Name = 'Tahoma'
+    Font.Style = [fsBold]
+    ParentColor = False
+    ParentFont = False
+  end
+  object Label2: TLabel
+    Left = 90
+    Height = 13
+    Top = 320
+    Width = 76
+    Caption = 'Source Code:'
+    ParentColor = False
+  end
+  object Label3: TLabel
+    Left = 90
+    Height = 13
+    Top = 339
+    Width = 154
+    Caption = 'Check For New Versions:'
+    Font.Color = clWindowText
+    Font.Height = -11
+    Font.Name = 'Tahoma'
+    Font.Style = [fsBold]
+    ParentColor = False
+    ParentFont = False
+  end
+  object Label4: TLabel
+    Cursor = crHandPoint
+    Left = 170
+    Height = 13
+    Top = 320
+    Width = 260
+    Caption = 'https://github.com/PascalCoin/PascalCoin'
+    Font.Color = clBlue
+    Font.Height = -11
+    Font.Name = 'Tahoma'
+    Font.Style = [fsBold]
+    ParentColor = False
+    ParentFont = False
+    OnClick = Label4Click
+  end
+  object Label5: TLabel
+    Cursor = crHandPoint
+    Left = 237
+    Height = 13
+    Top = 339
+    Width = 270
+    Caption = 'https://sourceforge.net/projects/pascalcoin'
+    Font.Color = clBlue
+    Font.Height = -11
+    Font.Name = 'Tahoma'
+    Font.Style = [fsBold]
+    ParentColor = False
+    ParentFont = False
+    OnClick = Label5Click
+  end
+  object Memo1: TMemo
+    Left = 90
+    Height = 266
+    Top = 46
+    Width = 478
+    BorderStyle = bsNone
+    Lines.Strings = (
+      'Copyright (c) 2016 Albert Molina'
+      ''
+      'This software is a Node of the Pascal Coin P2P Cryptocurrency. A Crypto currency without need of historical operations. It can be used to Mine and Explore blocks and operations.'
+      ''
+      'Distributed under the MIT software license, see the accompanying file LICENSE  or visit http://www.opensource.org/licenses/mit-license.php.'
+      ''
+      'THIS IS EXPERIMENTAL SOFTWARE. Use it for educational purposes only.'
+      ''
+      'This product includes software developed by the OpenSSL Project and Denis Grinyuk (https://github.com/Arvur/OpenSSL-Delphi), some cryptographic functions inspirated in code written by Ladar Levison and Marco Ferrante, and Synapse Socket code copyright of Lukas Gebauer.'
+      'Original source code is written in Pascal Language and is available at https://github.com/PascalCoin/PascalCoin'
+      ''
+      'If you like it, consider a donation using BitCoin:'
+      '16K3HCZRhFUtM8GdWRcfKeaa6KsuyxZaYk'
+    )
+    ParentColor = True
+    ReadOnly = True
+    ScrollBars = ssAutoBoth
+    TabOrder = 0
+  end
+  object bbClose: TBitBtn
+    Left = 456
+    Height = 31
+    Top = 358
+    Width = 111
+    Caption = 'Close'
+    Kind = bkOK
+    ModalResult = 1
+    TabOrder = 1
+  end
+end

+ 36 - 5
Units/Forms/UFRMAbout.pas

@@ -1,5 +1,9 @@
 unit UFRMAbout;
 
+{$IFDEF FPC}
+  {$MODE Delphi}
+{$ENDIF}
+
 { Copyright (c) 2016 by Albert Molina
 
   Distributed under the MIT software license, see the accompanying file LICENSE
@@ -16,10 +20,18 @@ unit UFRMAbout;
 interface
 
 uses
-  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
-  Dialogs, pngimage, ExtCtrls, StdCtrls, Buttons;
+{$IFnDEF FPC}
+  pngimage, Windows,
+{$ELSE}
+  LCLIntf, LCLType, LMessages,
+{$ENDIF}
+  Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
+  Dialogs, ExtCtrls, StdCtrls, Buttons;
 
 type
+
+  { TFRMAbout }
+
   TFRMAbout = class(TForm)
     Image1: TImage;
     Label1: TLabel;
@@ -43,15 +55,30 @@ type
 
 implementation
 
-uses UFolderHelper, UConst, ShellApi;
-
-{$R *.dfm}
+uses
+{$IFnDEF FPC}
+  ShellApi,
+{$ELSE}
+{$ENDIF}
+  UFolderHelper, UConst;
+
+{$IFnDEF FPC}
+  {$R *.dfm}
+{$ELSE}
+  {$R *.lfm}
+{$ENDIF}
 
 procedure TFRMAbout.FormCreate(Sender: TObject);
+{$IFnDEF FPC}
 Var fvi : TFileVersionInfo;
+{$ENDIF}
 begin
+  {$IFDEF FPC}
+  lblBuild.Caption :=  'Build: '+CT_ClientAppVersion;
+  {$ELSE}
   fvi := TFolderHelper.GetTFileVersionInfo(Application.ExeName);
   lblBuild.Caption :=  'Build: '+fvi.FileVersion;
+  {$ENDIF}
   lblProtocolVersion.Caption := Format('BlockChain Protocol: %d (%d)  -  Net Protocol: %d (%d)',[CT_BlockChain_Protocol_Version,CT_BlockChain_Protocol_Available,
     CT_NetProtocol_Version, CT_NetProtocol_Available]);
 end;
@@ -68,7 +95,11 @@ end;
 
 procedure TFRMAbout.OpenURL(Url: String);
 begin
+  {$IFDEF FPC}
+   OpenDocument(pchar(URL)) { *Convertido desde ShellExecute* }
+  {$ELSE}
   shellexecute(0, 'open', pchar(URL), nil, nil, SW_SHOW)
+  {$ENDIF}
 end;
 
 end.

+ 95 - 0
Units/Forms/UFRMNewPrivateKeyType.lfm

@@ -0,0 +1,95 @@
+object FRMNewPrivateKeyType: TFRMNewPrivateKeyType
+  Left = 763
+  Height = 229
+  Top = 434
+  Width = 311
+  BorderIcons = [biSystemMenu]
+  BorderStyle = bsDialog
+  Caption = 'New Private Key'
+  ClientHeight = 229
+  ClientWidth = 311
+  Color = clBtnFace
+  Font.Color = clWindowText
+  Font.Height = -11
+  Font.Name = 'Tahoma'
+  OnCreate = FormCreate
+  OnDestroy = FormDestroy
+  Position = poOwnerFormCenter
+  LCLVersion = '1.6.0.4'
+  object Label1: TLabel
+    Left = 30
+    Height = 13
+    Top = 25
+    Width = 27
+    Caption = 'Name'
+    ParentColor = False
+  end
+  object ebName: TEdit
+    Left = 70
+    Height = 21
+    Top = 22
+    Width = 206
+    TabOrder = 0
+    Text = 'ebName'
+  end
+  object rgKeyType: TRadioGroup
+    Left = 30
+    Height = 105
+    Top = 60
+    Width = 246
+    AutoFill = True
+    Caption = ' Key Type: '
+    ChildSizing.LeftRightSpacing = 6
+    ChildSizing.EnlargeHorizontal = crsHomogenousChildResize
+    ChildSizing.EnlargeVertical = crsHomogenousChildResize
+    ChildSizing.ShrinkHorizontal = crsScaleChilds
+    ChildSizing.ShrinkVertical = crsScaleChilds
+    ChildSizing.Layout = cclLeftToRightThenTopToBottom
+    ChildSizing.ControlsPerLine = 1
+    ClientHeight = 87
+    ClientWidth = 242
+    Items.Strings = (
+      'asdf'
+    )
+    TabOrder = 1
+  end
+  object bbOk: TBitBtn
+    Left = 112
+    Height = 25
+    Top = 181
+    Width = 75
+    Caption = 'OK'
+    Default = True
+    Glyph.Data = {
+      DE010000424DDE01000000000000760000002800000024000000120000000100
+      0400000000006801000000000000000000001000000000000000000000000000
+      80000080000000808000800000008000800080800000C0C0C000808080000000
+      FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00333333333333
+      3333333333333333333333330000333333333333333333333333F33333333333
+      00003333344333333333333333388F3333333333000033334224333333333333
+      338338F3333333330000333422224333333333333833338F3333333300003342
+      222224333333333383333338F3333333000034222A22224333333338F338F333
+      8F33333300003222A3A2224333333338F3838F338F33333300003A2A333A2224
+      33333338F83338F338F33333000033A33333A222433333338333338F338F3333
+      0000333333333A222433333333333338F338F33300003333333333A222433333
+      333333338F338F33000033333333333A222433333333333338F338F300003333
+      33333333A222433333333333338F338F00003333333333333A22433333333333
+      3338F38F000033333333333333A223333333333333338F830000333333333333
+      333A333333333333333338330000333333333333333333333333333333333333
+      0000
+    }
+    NumGlyphs = 2
+    OnClick = bbOkClick
+    TabOrder = 2
+  end
+  object bbCancel: TBitBtn
+    Left = 201
+    Height = 25
+    Top = 181
+    Width = 75
+    Cancel = True
+    Kind = bkCancel
+    ModalResult = 2
+    TabOrder = 3
+  end
+end

+ 18 - 5
Units/Forms/UFRMNewPrivateKeyType.pas

@@ -1,5 +1,9 @@
 unit UFRMNewPrivateKeyType;
 
+{$IFDEF FPC}
+  {$MODE Delphi}
+{$ENDIF}
+
 { Copyright (c) 2016 by Albert Molina
 
   Distributed under the MIT software license, see the accompanying file LICENSE
@@ -16,7 +20,12 @@ unit UFRMNewPrivateKeyType;
 interface
 
 uses
-  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
+{$IFnDEF FPC}
+  Windows,
+{$ELSE}
+  LCLIntf, LCLType, LMessages,
+{$ENDIF}
+  Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
   Dialogs, StdCtrls, Buttons, ExtCtrls, UWalletKeys,UCrypto;
 
 type
@@ -44,9 +53,13 @@ type
 implementation
 
 uses
-  UAccounts ;
+  UAccounts, UConst ;
 
-{$R *.dfm}
+{$IFnDEF FPC}
+  {$R *.dfm}
+{$ELSE}
+  {$R *.lfm}
+{$ENDIF}
 
 procedure TFRMNewPrivateKeyType.bbOkClick(Sender: TObject);
 begin
@@ -56,7 +69,7 @@ begin
   if Assigned(FGeneratedPrivateKey) then FGeneratedPrivateKey.Free;
 
   FGeneratedPrivateKey := TECPrivateKey.Create;
-  FGeneratedPrivateKey.GenerateRandomPrivateKey( Integer(rgKeyType.Items.Objects[rgKeyType.ItemIndex]) );
+  FGeneratedPrivateKey.GenerateRandomPrivateKey( PtrInt(rgKeyType.Items.Objects[rgKeyType.ItemIndex]) );
   WalletKeys.AddPrivateKey(ebName.Text,FGeneratedPrivateKey);
   ModalResult := MrOk;
 end;
@@ -73,7 +86,7 @@ begin
   Try
     TAccountComp.ValidsEC_OpenSSL_NID(l);
     for i := 0 to l.Count - 1 do begin
-      rgKeyType.Items.AddObject(TAccountComp.GetECInfoTxt(integer(l[i])),l[i]);
+      rgKeyType.Items.AddObject(TAccountComp.GetECInfoTxt(PtrInt(l[i])),l[i]);
     end;
   Finally
     l.free;

+ 85 - 0
Units/Forms/UFRMNodesIp.lfm

@@ -0,0 +1,85 @@
+object FRMNodesIp: TFRMNodesIp
+  Left = 716
+  Height = 367
+  Top = 383
+  Width = 334
+  BorderIcons = [biSystemMenu]
+  BorderStyle = bsSingle
+  Caption = 'Nodes IP'
+  ClientHeight = 367
+  ClientWidth = 334
+  Color = clBtnFace
+  Font.Color = clWindowText
+  Font.Height = -11
+  Font.Name = 'Tahoma'
+  OnCreate = FormCreate
+  Position = poOwnerFormCenter
+  LCLVersion = '1.6.0.4'
+  object Label1: TLabel
+    Left = 30
+    Height = 13
+    Top = 25
+    Width = 143
+    Caption = 'Available Nodes Ip to connect'
+    ParentColor = False
+  end
+  object memoNodesIp: TMemo
+    Left = 30
+    Height = 226
+    Top = 45
+    Width = 276
+    Lines.Strings = (
+      'memoNodesIp'
+    )
+    ScrollBars = ssBoth
+    TabOrder = 0
+  end
+  object bbOk: TBitBtn
+    Left = 138
+    Height = 25
+    Top = 317
+    Width = 75
+    Caption = 'OK'
+    Default = True
+    Glyph.Data = {
+      DE010000424DDE01000000000000760000002800000024000000120000000100
+      0400000000006801000000000000000000001000000000000000000000000000
+      80000080000000808000800000008000800080800000C0C0C000808080000000
+      FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00333333333333
+      3333333333333333333333330000333333333333333333333333F33333333333
+      00003333344333333333333333388F3333333333000033334224333333333333
+      338338F3333333330000333422224333333333333833338F3333333300003342
+      222224333333333383333338F3333333000034222A22224333333338F338F333
+      8F33333300003222A3A2224333333338F3838F338F33333300003A2A333A2224
+      33333338F83338F338F33333000033A33333A222433333338333338F338F3333
+      0000333333333A222433333333333338F338F33300003333333333A222433333
+      333333338F338F33000033333333333A222433333333333338F338F300003333
+      33333333A222433333333333338F338F00003333333333333A22433333333333
+      3338F38F000033333333333333A223333333333333338F830000333333333333
+      333A333333333333333338330000333333333333333333333333333333333333
+      0000
+    }
+    NumGlyphs = 2
+    OnClick = bbOkClick
+    TabOrder = 1
+  end
+  object bbCancel: TBitBtn
+    Left = 231
+    Height = 25
+    Top = 317
+    Width = 75
+    Cancel = True
+    Kind = bkCancel
+    ModalResult = 2
+    TabOrder = 2
+  end
+  object cbTryOnlyWithThisServers: TCheckBox
+    Left = 35
+    Height = 19
+    Top = 285
+    Width = 201
+    Caption = 'Try to connect ONLY with this servers'
+    OnClick = cbTryOnlyWithThisServersClick
+    TabOrder = 3
+  end
+end

+ 15 - 2
Units/Forms/UFRMNodesIp.pas

@@ -1,9 +1,18 @@
 unit UFRMNodesIp;
 
+{$IFDEF FPC}
+  {$MODE Delphi}
+{$ENDIF}
+
 interface
 
 uses
-  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
+{$IFnDEF FPC}
+  Windows,
+{$ELSE}
+  LCLIntf, LCLType, LMessages,
+{$ENDIF}
+  Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
   Dialogs, StdCtrls, Buttons, UAppParams;
 
 type
@@ -31,7 +40,11 @@ implementation
 uses
   UNetProtocol, UNode, UConst;
 
-{$R *.dfm}
+{$IFnDEF FPC}
+  {$R *.dfm}
+{$ELSE}
+  {$R *.lfm}
+{$ENDIF}
 
 { TFRMNodesIp }
 

+ 583 - 0
Units/Forms/UFRMOperation.lfm

@@ -0,0 +1,583 @@
+object FRMOperation: TFRMOperation
+  Left = 628
+  Height = 474
+  Top = 283
+  Width = 608
+  BorderIcons = [biSystemMenu]
+  BorderStyle = bsSingle
+  Caption = 'New Operation'
+  ClientHeight = 474
+  ClientWidth = 608
+  Color = clBtnFace
+  Font.Color = clWindowText
+  Font.Height = -11
+  Font.Name = 'Tahoma'
+  OnCreate = FormCreate
+  OnDestroy = FormDestroy
+  Position = poOwnerFormCenter
+  LCLVersion = '1.6.0.4'
+  object lblAccountCaption: TLabel
+    Left = 25
+    Height = 13
+    Top = 20
+    Width = 43
+    Caption = 'Account:'
+    ParentColor = False
+  end
+  object lblAccountBalance: TLabel
+    Left = 440
+    Height = 19
+    Top = 15
+    Width = 149
+    Caption = 'lblAccountBalance'
+    Font.Color = clGreen
+    Font.Height = -16
+    Font.Name = 'Tahoma'
+    Font.Style = [fsBold]
+    ParentColor = False
+    ParentFont = False
+  end
+  object Label2: TLabel
+    Left = 387
+    Height = 13
+    Top = 20
+    Width = 41
+    Caption = 'Balance:'
+    ParentColor = False
+  end
+  object lblAccountsCount: TLabel
+    Left = 387
+    Height = 13
+    Top = 58
+    Width = 18
+    Caption = 'XXX'
+    ParentColor = False
+  end
+  object bbExecute: TBitBtn
+    Left = 300
+    Height = 31
+    Top = 416
+    Width = 130
+    Caption = 'Execute (F12)'
+    Glyph.Data = {
+      DE010000424DDE01000000000000760000002800000024000000120000000100
+      0400000000006801000000000000000000001000000000000000000000000000
+      80000080000000808000800000008000800080800000C0C0C000808080000000
+      FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00333333333333
+      3333333333333333333333330000333333333333333333333333F33333333333
+      00003333344333333333333333388F3333333333000033334224333333333333
+      338338F3333333330000333422224333333333333833338F3333333300003342
+      222224333333333383333338F3333333000034222A22224333333338F338F333
+      8F33333300003222A3A2224333333338F3838F338F33333300003A2A333A2224
+      33333338F83338F338F33333000033A33333A222433333338333338F338F3333
+      0000333333333A222433333333333338F338F33300003333333333A222433333
+      333333338F338F33000033333333333A222433333333333338F338F300003333
+      33333333A222433333333333338F338F00003333333333333A22433333333333
+      3338F38F000033333333333333A223333333333333338F830000333333333333
+      333A333333333333333338330000333333333333333333333333333333333333
+      0000
+    }
+    NumGlyphs = 2
+    OnClick = actExecuteExecute
+    TabOrder = 2
+  end
+  object bbCancel: TBitBtn
+    Left = 465
+    Height = 31
+    Top = 416
+    Width = 116
+    Cancel = True
+    Caption = 'Cancel'
+    Kind = bkCancel
+    ModalResult = 2
+    TabOrder = 3
+  end
+  object PageControl: TPageControl
+    Left = 25
+    Height = 333
+    Top = 75
+    Width = 556
+    ActivePage = tsGlobalError
+    TabIndex = 1
+    TabOrder = 1
+    object tsOperation: TTabSheet
+      Caption = 'Operation'
+      ClientHeight = 307
+      ClientWidth = 548
+      TabVisible = False
+      object gbOperation: TGroupBox
+        Left = 13
+        Height = 167
+        Top = 8
+        Width = 521
+        Caption = ' Operation: '
+        ClientHeight = 149
+        ClientWidth = 517
+        TabOrder = 0
+        object lblDestAccount: TLabel
+          Left = 50
+          Height = 13
+          Top = 30
+          Width = 95
+          Caption = 'Destination account'
+          ParentColor = False
+        end
+        object lblAmount: TLabel
+          Left = 249
+          Height = 13
+          Top = 30
+          Width = 37
+          Caption = 'Amount'
+          ParentColor = False
+        end
+        object lblNewPrivateKey: TLabel
+          Left = 50
+          Height = 13
+          Top = 77
+          Width = 78
+          Caption = 'New private key'
+          ParentColor = False
+        end
+        object lblTransactionErrors: TLabel
+          Left = 168
+          Height = 13
+          Top = 7
+          Width = 331
+          Alignment = taRightJustify
+          AutoSize = False
+          Caption = 'Errors detected'
+          Font.Color = clRed
+          Font.Height = -11
+          Font.Name = 'Tahoma'
+          ParentColor = False
+          ParentFont = False
+        end
+        object lblChangeKeyErrors: TLabel
+          Left = 168
+          Height = 13
+          Top = 49
+          Width = 331
+          Alignment = taRightJustify
+          AutoSize = False
+          Caption = 'Errors detected'
+          Font.Color = clRed
+          Font.Height = -11
+          Font.Name = 'Tahoma'
+          ParentColor = False
+          ParentFont = False
+        end
+        object lblNewOwnerPublicKey: TLabel
+          Left = 48
+          Height = 13
+          Top = 124
+          Width = 111
+          Caption = 'New owner''s public key'
+          ParentColor = False
+        end
+        object lblNewOwnerErrors: TLabel
+          Left = 197
+          Height = 13
+          Top = 99
+          Width = 302
+          Alignment = taRightJustify
+          AutoSize = False
+          Caption = 'Errors detected'
+          Font.Color = clRed
+          Font.Height = -11
+          Font.Name = 'Tahoma'
+          ParentColor = False
+          ParentFont = False
+        end
+        object lblFee: TLabel
+          Left = 401
+          Height = 13
+          Top = 30
+          Width = 18
+          Caption = 'Fee'
+          ParentColor = False
+        end
+        object rbTransaction: TRadioButton
+          Left = 13
+          Height = 19
+          Top = 5
+          Width = 97
+          Caption = 'Transaction (tx)'
+          Checked = True
+          OnClick = rbTransactionClick
+          TabOrder = 0
+          TabStop = True
+        end
+        object rbChangeKey: TRadioButton
+          Left = 13
+          Height = 19
+          Top = 48
+          Width = 114
+          Caption = 'Change private key'
+          OnClick = rbTransactionClick
+          TabOrder = 4
+        end
+        object ebDestAccount: TEdit
+          Left = 168
+          Height = 21
+          Top = 25
+          Width = 76
+          OnChange = ebDestAccountChange
+          OnClick = rbTransactionClick
+          OnExit = ebDestAccountExit
+          TabOrder = 1
+          Text = 'ebDestAccount'
+        end
+        object ebAmount: TEdit
+          Left = 296
+          Height = 21
+          Top = 25
+          Width = 86
+          OnChange = ebAmountChange
+          OnClick = rbTransactionClick
+          OnExit = ebFeeExit
+          TabOrder = 2
+          Text = 'Edit1'
+        end
+        object cbNewPrivateKey: TComboBox
+          Left = 168
+          Height = 21
+          Top = 68
+          Width = 294
+          ItemHeight = 13
+          OnChange = cbNewPrivateKeyChange
+          OnClick = rbTransactionClick
+          Sorted = True
+          Style = csDropDownList
+          TabOrder = 5
+        end
+        object rbTransferToANewOwner: TRadioButton
+          Left = 13
+          Height = 19
+          Top = 98
+          Width = 180
+          Caption = 'Transfer account to a new owner'
+          OnClick = rbTransactionClick
+          TabOrder = 7
+        end
+        object ebNewPublicKey: TEdit
+          Left = 192
+          Height = 21
+          Top = 121
+          Width = 307
+          OnChange = ebNewPublicKeyChange
+          OnClick = rbTransactionClick
+          OnExit = ebNewPublicKeyExit
+          TabOrder = 8
+          Text = 'ebDestAccount'
+        end
+        object ebFee: TEdit
+          Left = 429
+          Height = 21
+          Top = 25
+          Width = 70
+          OnChange = ebFeeChange
+          OnClick = rbTransactionClick
+          OnExit = ebFeeExit
+          TabOrder = 3
+          Text = 'ebFee'
+        end
+        object bbKeys: TBitBtn
+          Left = 468
+          Height = 22
+          Top = 67
+          Width = 31
+          Glyph.Data = {
+            36050000424D3605000000000000360400002800000010000000100000000100
+            0800000000000001000000000000000000000001000000010000FF00FF008C6B
+            6C0087707000AE877C000D7FA9006F7C88006D7C94001F7ECE000E80AA001180
+            A7001081AB00048CB900078DBC000B8DBA000C8DBA00088EBC001285B0007882
+            95006092BD005EA8BE000A91C1000F9DCE002087DE0011A7D10030BCDC001F89
+            E00059A9DC0044BADD004ABFE00057AEF4004DB1F90049B2FF004EB7FF0057B1
+            F60050B6FE0022D7FC0024D7FF0024D8FD0039D7FB0035D8FD004BC6DC0046C6
+            E40048D5EE0075D3E90058E9FD006FE6FF0070E6FF0071F9FE007BFFFF008683
+            88008B8697008F989B00969594009C919000AD858000AD868500AB939500A49E
+            9900B1979400B5A09F008AA5AD00CAA08C00CDAC9300C2A69A00F3BE8000C6AE
+            A000CFB7A100D3BBA200F4C88E00F5CB9A00F5D09C00F8D09800DAC5B700E4CC
+            A900EFD2A900ECD1AC00F6DAAB00F5DEB500F5E1B600F9E1B100FEEAB900FFF2
+            BA00A1C6C8008DE6FA0081F8FE008CFAFD008DFCFE0097FCFD009BFBFD00B8ED
+            F600A7FFFF00AAFFFE00ADFFFE00B6F6FF00B1FCFD00B4FFFF00ECDDCC00E8DD
+            D600FFF7C600FCF5CD00FCF7D100FAF6D600FFFBD500FEFED600F7F2D900FEFF
+            D900FFFEDD00C6F5FF00C6FEFF00D2FFFF00FEF7E000FBFCE100FDFFE100FFFF
+            E400E3FEFF00F9F6F200FFFFF400F1FBFC00F5FFFE00FBFFFF00000000000000
+            0000000000000000000000000000000000000000000000000000000000000000
+            0000000000000000000000000000000000000000000000000000000000000000
+            0000000000000000000000000000000000000000000000000000000000000000
+            0000000000000000000000000000000000000000000000000000000000000000
+            0000000000000000000000000000000000000000000000000000000000000000
+            0000000000000000000000000000000000000000000000000000000000000000
+            0000000000000000000000000000000000000000000000000000000000000000
+            0000000000000000000000000000000000000000000000000000000000000000
+            0000000000000000000000000000000000000000000000000000000000000000
+            0000000000000000000000000000000000000000000000000000000000000000
+            0000000000000000000000000000000000000000000000000000000000000000
+            0000000000000000000000000000000000000000000000000000000000000000
+            0000000000000000000000000000000000000000000000000000000000000000
+            0000000000000000000000000000000000000000000000000000000000000000
+            0000000000000000000000000000000000000000000000000000000000000000
+            0000000000000000000000000000000000000000000000000000000000000000
+            0000000000000000000000000000000000000000000000000000000000000000
+            00000000000000000605000004080408080A000000000011191A000B2A23272D
+            531B080000001116201D0B552C23272E531C1509003207201D000F552C23272B
+            3A3F41030112202000000F552C252938606771684236200000000B5F5D6B3B61
+            74676A67513D000000000B59181735716A676A63474B360000000F282C23396A
+            6A6A6A4C404D360000000B552C2534656A654F455049360000000B552C251343
+            6247446E7336000000000B552C25263C3E4B4E483636000000000F55542F3057
+            523331020000000000000B77766D5F5C5C5C2F08000000000000001476726C5C
+            5A58100000000000000000000F0F0B0F0F0F0000000000000000
+          }
+          OnClick = bbKeysClick
+          TabOrder = 6
+        end
+      end
+      object gbPayload: TGroupBox
+        Left = 13
+        Height = 119
+        Top = 181
+        Width = 521
+        Caption = ' Payload: '
+        ClientHeight = 101
+        ClientWidth = 517
+        TabOrder = 1
+        object lblEncryptPassword: TLabel
+          Left = 36
+          Height = 13
+          Top = 62
+          Width = 50
+          Caption = 'Password:'
+          ParentColor = False
+        end
+        object Label4: TLabel
+          Left = 253
+          Height = 13
+          Top = 1
+          Width = 67
+          Caption = 'Payload data:'
+          ParentColor = False
+        end
+        object lblEncryptionErrors: TLabel
+          Left = 253
+          Height = 13
+          Top = 82
+          Width = 246
+          AutoSize = False
+          Caption = 'Errors detected'
+          Font.Color = clRed
+          Font.Height = -11
+          Font.Name = 'Tahoma'
+          ParentColor = False
+          ParentFont = False
+        end
+        object lblPayloadLength: TLabel
+          Left = 344
+          Height = 13
+          Top = 1
+          Width = 158
+          Alignment = taRightJustify
+          AutoSize = False
+          Caption = '000'
+          ParentColor = False
+        end
+        object rbEncryptedWithEC: TRadioButton
+          Left = 13
+          Height = 19
+          Top = 21
+          Width = 207
+          Caption = 'Encrypted with dest account public key'
+          Checked = True
+          OnClick = memoPayloadClick
+          TabOrder = 1
+          TabStop = True
+        end
+        object rbEncrptedWithPassword: TRadioButton
+          Left = 13
+          Height = 19
+          Top = 39
+          Width = 141
+          Caption = 'Encrypted with password'
+          OnClick = memoPayloadClick
+          TabOrder = 2
+        end
+        object rbNotEncrypted: TRadioButton
+          Left = 13
+          Height = 19
+          Top = 79
+          Width = 164
+          Caption = 'Don''t encrypt (Public payload)'
+          OnClick = memoPayloadClick
+          TabOrder = 4
+        end
+        object ebEncryptPassword: TEdit
+          Left = 92
+          Height = 21
+          Top = 59
+          Width = 122
+          OnChange = ebEncryptPasswordChange
+          OnClick = memoPayloadClick
+          TabOrder = 3
+          Text = 'ebDestAccount'
+        end
+        object memoPayload: TMemo
+          Left = 253
+          Height = 57
+          Top = 23
+          Width = 246
+          Font.Color = clBlack
+          Font.Height = -16
+          Font.Name = 'Tahoma'
+          OnChange = memoPayloadClick
+          OnClick = memoPayloadClick
+          ParentFont = False
+          TabOrder = 5
+          WantReturns = False
+        end
+        object rbEncryptedWithOldEC: TRadioButton
+          Left = 13
+          Height = 19
+          Top = 2
+          Width = 159
+          Caption = 'Encrypted with old public key'
+          OnClick = memoPayloadClick
+          TabOrder = 0
+        end
+      end
+    end
+    object tsGlobalError: TTabSheet
+      Caption = 'Alert message'
+      ClientHeight = 307
+      ClientWidth = 548
+      ImageIndex = 1
+      TabVisible = False
+      object lblGlobalErrors: TLabel
+        Left = 40
+        Height = 156
+        Top = 50
+        Width = 456
+        Alignment = taCenter
+        AutoSize = False
+        Caption = '????'
+        Font.Color = clRed
+        Font.Height = -21
+        Font.Name = 'Tahoma'
+        Font.Style = [fsBold]
+        ParentColor = False
+        ParentFont = False
+        WordWrap = True
+      end
+      object bbPassword: TBitBtn
+        Left = 191
+        Height = 38
+        Top = 243
+        Width = 159
+        Caption = 'Password'
+        Font.Color = clWindowText
+        Font.Height = -13
+        Font.Name = 'Tahoma'
+        Font.Style = [fsBold]
+        Glyph.Data = {
+          76060000424D7606000000000000360400002800000018000000180000000100
+          0800000000004002000000000000000000000001000000010000000000000101
+          0100020202000303030004040400050505000606060007070700080808000909
+          09000A0A0A000B0B0B000C0C0C000D0D0D000E0E0E000F0F0F00101010001111
+          1100121212001313130014141400151515001616160017171700181818001919
+          19001A1A1A001B1B1B001C1C1C001D1D1D001E1E1E001F1F1F00202020002121
+          2100222222002323230024242400252525002626260027272700282828002929
+          29002A2A2A002B2B2B002C2C2C002D2D2D002E2E2E002F2F2F00303030003131
+          3100323232003333330034343400353535003636360037373700383838003939
+          39003A3A3A003B3B3B003C3C3C003D3D3D003E3E3E003F3F3F00404040004141
+          4100424242004343430044444400454545004646460047474700484848004949
+          49004A4A4A004B4B4B004C4C4C004D4D4D004E4E4E004F4F4F00505050005151
+          5100525252005353530054545400555555005656560057575700585858005959
+          59005A5A5A005B5B5B005C5C5C005D5D5D005E5E5E00685968007C4F7C009441
+          9400B72CB700DD15DD00F506F500FD01FD00FE00FE00FE00FE00FE00FE00FE00
+          FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00
+          FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00
+          FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00
+          FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00
+          FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00
+          FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00
+          FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00
+          FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00
+          FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00
+          FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00
+          FE00FE00FE00FE00FE00FE00FE00F008F900D517F000BD24E800A830E1007B4B
+          D0005065C1003774B7002B7DB100237FAC001F82AD001C83AD001785AE001687
+          AF001489B100128AB300108CB6000F8EB9000D91BB000C94BF000A97C3000A99
+          C5000A9AC7000B9BC8000B9CCA000C9ECC000C9FCD000DA0CE000DA1CE000EA2
+          CF0011A3CF0015A4CF0018A5CF001CA7D10021A9D1002AAAD00035AACD0035AD
+          D00035AFD30035B1D60037B5D8003AB8DB003EB9DC0040BBDD0045BEDE004CC1
+          E00055C6E3005BC8E40061CAE40066CBE3006BCCE30072D3E60078D8EB0080D8
+          EE0083D9F10085DCF40088DBF5008BDBF6008EDAF70091DAF70095DCF70097E0
+          F7009EE3F800A4E7F900A9E9F900AEE9F900B5EBF900B2EBF800919191919191
+          919191919191919191919191919191919191919191919191D5E7E8E7E3DED591
+          919191919191919191919191919191D6DDF7F8F8F7F6F4EEE6D5919191919191
+          919191919191D7DADEF8F8F6F7F6EDF1F8F1E69191919191919191919191DADE
+          DFFAFAF8F7F7E9EDF7F7F8EB91919191919191919191DDE5E3FCFCFAFAEEE0E9
+          F3F7F7F7DC919191919191919191DEE7E4FEFEFCFCEDC5E0EFF7F6F6DC919191
+          919191919191DEEAE7FEFEFEFDFBC4C4F5F7F6F6DC919191919191919191E3EC
+          E9FEFEFEFEFEE0C3F9F7F6F6DC919191919191919191E3E9E3F8F8F1F1F8FBFB
+          FCFAF7F6DC919191919191919191DCEAEAE0E1E9E5E3DEE4EBF2FAF9DC919191
+          919191919191DBF3EEC5C5EFF3EBE5DDD9D6E6F5DC91919191919191919191D5
+          E8EDF1FAF6F0EAE4DAD1D2DBDC919191919191919191919191DBE8F0F3F3F3E4
+          D0CFE4D8DC919191919191919191919191919191D5DEE4DED2CFD4D491919191
+          91919191919191919191919191919191D2CE9191919191919191919191919191
+          91C8C89191919191D2CE919191919191919191919191919191D9D09191919191
+          D2CE919191919191919191919191919191E6E39191919191D2CE919191919191
+          919191919191919191E0F3CE91919191D2CE9191919191919191919191919191
+          9191EFF6E1C9C8CDD9CC91919191919191919191919191919191C9EDF9F3F3EB
+          DC91919191919191919191919191919191919191CBE0E1CF9191919191919191
+          9191919191919191919191919191919191919191919191919191
+        }
+        OnClick = bbPasswordClick
+        ParentFont = False
+        TabOrder = 0
+      end
+    end
+  end
+  object memoAccounts: TMemo
+    Left = 74
+    Height = 59
+    Top = 12
+    Width = 307
+    Font.Color = clWindowText
+    Font.Height = -12
+    Font.Name = 'Tahoma'
+    Font.Style = [fsBold]
+    Lines.Strings = (
+      '123456-11 (0.0000); 123456-11 (0.0000); '
+      '123456-11 (0.0000); 123456-11 (0.0000); '
+    )
+    ParentFont = False
+    ReadOnly = True
+    ScrollBars = ssVertical
+    TabOrder = 4
+  end
+  object ebSenderAccount: TEdit
+    Left = 74
+    Height = 27
+    Top = 12
+    Width = 97
+    Font.Color = clBlack
+    Font.Height = -16
+    Font.Name = 'Tahoma'
+    Font.Style = [fsBold]
+    OnExit = ebSenderAccountExit
+    OnKeyPress = ebSenderAccountKeyPress
+    ParentFont = False
+    TabOrder = 0
+    Text = 'ebSenderAccount'
+  end
+  object ActionList1: TActionList
+    left = 140
+    top = 350
+    object actExecute: TAction
+      Caption = 'Execute (F12)'
+      OnExecute = actExecuteExecute
+      ShortCut = 123
+    end
+  end
+end

+ 72 - 13
Units/Forms/UFRMOperation.pas

@@ -1,5 +1,9 @@
 unit UFRMOperation;
 
+{$IFDEF FPC}
+  {$MODE Delphi}
+{$ENDIF}
+
 { Copyright (c) 2016 by Albert Molina
 
   Distributed under the MIT software license, see the accompanying file LICENSE
@@ -16,11 +20,19 @@ unit UFRMOperation;
 interface
 
 uses
-  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
+{$IFnDEF FPC}
+  Windows,
+{$ELSE}
+  LCLIntf, LCLType, LMessages,
+{$ENDIF}
+  Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
   Dialogs, StdCtrls, UNode, UWalletKeys, UCrypto, Buttons, UBlockChain,
   UAccounts, ActnList, ComCtrls;
 
 type
+
+  { TFRMOperation }
+
   TFRMOperation = class(TForm)
     lblAccountCaption: TLabel;
     bbExecute: TBitBtn;
@@ -66,6 +78,9 @@ type
     bbPassword: TBitBtn;
     memoAccounts: TMemo;
     lblAccountsCount: TLabel;
+    procedure ebAmountChange(Sender: TObject);
+    procedure ebFeeChange(Sender: TObject);
+    procedure ebNewPublicKeyExit(Sender: TObject);
     procedure FormCreate(Sender: TObject);
     procedure rbTransactionClick(Sender: TObject);
     procedure FormDestroy(Sender: TObject);
@@ -111,7 +126,11 @@ implementation
 uses
   UECIES, UConst, UOpTransaction, UFRMNewPrivateKeyType, UAES, UFRMWalletKeys;
 
-{$R *.dfm}
+{$IFnDEF FPC}
+  {$R *.dfm}
+{$ELSE}
+  {$R *.lfm}
+{$ENDIF}
 
 { TFRMOperation }
 
@@ -173,7 +192,7 @@ begin
         end;
         operationstxt := 'Transaction to '+TAccountComp.AccountNumberToAccountTxtNumber(FTxDestAccount);
       end else if rbChangeKey.Checked then begin
-        i := Integer(cbNewPrivateKey.Items.Objects[cbNewPrivateKey.ItemIndex]);
+        i := PtrInt(cbNewPrivateKey.Items.Objects[cbNewPrivateKey.ItemIndex]);
         if (i<0) Or (i>=WalletKeys.Count) then raise Exception.Create('Invalid selected key');
         FNewAccountPublicKey := WalletKeys.Key[i].AccountKey;
         if account.balance>fee then _fee := fee
@@ -263,25 +282,31 @@ end;
 procedure TFRMOperation.cbNewPrivateKeyChange(Sender: TObject);
 begin
   If FDisabled then exit;
-  rbChangeKey.Checked := true;
-  rbTransactionClick(Nil);
+  If not rbChangeKey.Checked then begin
+    rbChangeKey.Checked := true;
+    rbTransactionClick(Nil);
+  end;
 end;
 
 procedure TFRMOperation.ebDestAccountChange(Sender: TObject);
 begin
   if FDisabled then exit;
-  rbTransaction.Checked := true;
-  rbTransactionClick(Nil);
+  If not rbTransaction.Checked then begin
+    rbTransaction.Checked := true;
+    rbTransactionClick(Nil);
+  end;
 end;
 
 procedure TFRMOperation.ebDestAccountExit(Sender: TObject);
 Var an : Cardinal;
+  errors : AnsiString;
 begin
   If TAccountComp.AccountTxtNumberToAccountNumber(ebDestAccount.Text,an) then begin
     ebDestAccount.Text := TAccountComp.AccountNumberToAccountTxtNumber(an);
   end else begin
     ebDestAccount.Text := '';
   end;
+  UpdateOperationOptions(errors);
 end;
 
 procedure TFRMOperation.ebEncryptPasswordChange(Sender: TObject);
@@ -293,10 +318,12 @@ end;
 
 procedure TFRMOperation.ebFeeExit(Sender: TObject);
 Var l : boolean;
+  errors : AnsiString;
 begin
   l := FDisabled;
   FDisabled := true;
   try
+    UpdateOperationOptions(errors);
     ebFee.Text := TAccountComp.FormatMoney(Fee);
     if SenderAccounts.Count<=1 then begin
       ebAmount.Text := TAccountComp.FormatMoney(FTxAmount);
@@ -309,8 +336,10 @@ end;
 procedure TFRMOperation.ebNewPublicKeyChange(Sender: TObject);
 begin
   if FDisabled then exit;
-  rbTransferToANewOwner.Checked := true;
-  rbTransactionClick(Nil);
+  if not rbTransferToANewOwner.Checked then begin
+    rbTransferToANewOwner.Checked := true;
+    rbTransactionClick(Nil);
+  end;
 end;
 
 procedure TFRMOperation.ebSenderAccountExit(Sender: TObject);
@@ -363,6 +392,32 @@ begin
   memoAccounts.Lines.Clear;
 end;
 
+procedure TFRMOperation.ebAmountChange(Sender: TObject);
+begin
+  If FDisabled then exit;
+  TAccountComp.TxtToMoney(ebAmount.text,FTxAmount);
+  If not rbTransaction.Checked then begin
+    rbTransaction.Checked := true;
+    rbTransactionClick(Nil);
+  end;
+end;
+
+procedure TFRMOperation.ebFeeChange(Sender: TObject);
+begin
+  If FDisabled then exit;
+  TAccountComp.TxtToMoney(ebFee.text,FFee);
+  If not rbTransaction.Checked then begin
+    rbTransaction.Checked := true;
+    rbTransactionClick(Nil);
+  end;
+end;
+
+procedure TFRMOperation.ebNewPublicKeyExit(Sender: TObject);
+var errors : AnsiString;
+begin
+  UpdateOperationOptions(errors);
+end;
+
 procedure TFRMOperation.FormDestroy(Sender: TObject);
 begin
   FreeAndNil(FSenderAccounts);
@@ -421,7 +476,7 @@ begin
   cbNewPrivateKey.items.BeginUpdate;
   Try
     cbNewPrivateKey.Items.Clear;
-    cbNewPrivateKey.Items.AddObject('Generate a new Private Key',TObject(-1));
+    //cbNewPrivateKey.Items.AddObject('Generate a new Private Key',TObject(-1));
     For i:=0 to FWalletKeys.Count-1 do begin
       wk := FWalletKeys.Key[i];
       if (wk.Name='') then begin
@@ -538,12 +593,16 @@ begin
       end;
       lblGlobalErrors.Caption := '';
     Finally
-      tsGlobalError.TabVisible := false;
-      tsOperation.TabVisible := false;
       if lblGlobalErrors.Caption<>'' then begin
         PageControl.ActivePage := tsGlobalError;
+        tsGlobalError.visible := true;
+        tsGlobalError.tabvisible := {$IFDEF LINUX}true{$ELSE}false{$ENDIF};
+        tsOperation.TabVisible := false;
       end else begin
         PageControl.ActivePage := tsOperation;
+        tsOperation.visible := true;
+        tsOperation.tabvisible := {$IFDEF LINUX}true{$ELSE}false{$ENDIF};
+        tsGlobalError.TabVisible := false;
       end;
     End;
     if rbTransaction.Checked then begin
@@ -689,7 +748,7 @@ begin
       end else if rbChangeKey.Checked then begin
         // With new key generated
         if (cbNewPrivateKey.ItemIndex>=0) then begin
-          i := Integer(cbNewPrivateKey.Items.Objects[cbNewPrivateKey.ItemIndex]);
+          i := PtrInt(cbNewPrivateKey.Items.Objects[cbNewPrivateKey.ItemIndex]);
           if (i>=0) then FNewAccountPublicKey := WalletKeys.Key[i].AccountKey;
         end else begin
           valid := false;

+ 310 - 0
Units/Forms/UFRMPascalCoinWalletConfig.lfm

@@ -0,0 +1,310 @@
+object FRMPascalCoinWalletConfig: TFRMPascalCoinWalletConfig
+  Left = 462
+  Height = 460
+  Top = 234
+  Width = 374
+  BorderIcons = [biSystemMenu]
+  BorderStyle = bsSingle
+  Caption = 'Options'
+  ClientHeight = 460
+  ClientWidth = 374
+  Color = clBtnFace
+  Font.Color = clWindowText
+  Font.Height = -11
+  Font.Name = 'Tahoma'
+  OnCreate = FormCreate
+  Position = poOwnerFormCenter
+  LCLVersion = '1.6.0.4'
+  object Label1: TLabel
+    Left = 30
+    Height = 13
+    Top = 335
+    Width = 120
+    Caption = 'Default fee for operation'
+    ParentColor = False
+  end
+  object Label2: TLabel
+    Left = 30
+    Height = 13
+    Top = 116
+    Width = 98
+    Caption = 'Internet Server Port'
+    ParentColor = False
+  end
+  object lblDefaultInternetServerPort: TLabel
+    Left = 248
+    Height = 13
+    Top = 116
+    Width = 70
+    Caption = '(Default XXXX)'
+    ParentColor = False
+  end
+  object Label3: TLabel
+    Left = 15
+    Height = 13
+    Top = 67
+    Width = 60
+    Caption = 'Miner Name:'
+    ParentColor = False
+  end
+  object Label4: TLabel
+    Left = 90
+    Height = 13
+    Top = 90
+    Width = 259
+    Caption = 'This name will be included in each new block you mine!'
+    Font.Color = clGray
+    Font.Height = -11
+    Font.Name = 'Tahoma'
+    ParentColor = False
+    ParentFont = False
+  end
+  object Label5: TLabel
+    Left = 30
+    Height = 13
+    Top = 176
+    Width = 73
+    Caption = 'JSON-RPC Port'
+    ParentColor = False
+  end
+  object lblDefaultJSONRPCMinerServerPort: TLabel
+    Left = 248
+    Height = 13
+    Top = 176
+    Width = 70
+    Caption = '(Default XXXX)'
+    ParentColor = False
+  end
+  object cbJSONRPCMinerServerActive: TCheckBox
+    Left = 15
+    Height = 19
+    Top = 150
+    Width = 225
+    Caption = 'JSON-RPC Server Miner (TCP/IP, no HTTP)'
+    TabOrder = 4
+  end
+  object ebDefaultFee: TEdit
+    Left = 170
+    Height = 21
+    Top = 332
+    Width = 56
+    Alignment = taRightJustify
+    TabOrder = 7
+    Text = '0'
+  end
+  object cbSaveLogFiles: TCheckBox
+    Left = 15
+    Height = 19
+    Top = 359
+    Width = 78
+    Caption = 'Save log file'
+    OnClick = cbSaveLogFilesClick
+    TabOrder = 8
+  end
+  object cbShowLogs: TCheckBox
+    Left = 15
+    Height = 19
+    Top = 397
+    Width = 68
+    Caption = 'Show logs'
+    TabOrder = 10
+  end
+  object bbOk: TBitBtn
+    Left = 171
+    Height = 25
+    Top = 410
+    Width = 75
+    Kind = bkOK
+    OnClick = bbOkClick
+    TabOrder = 11
+  end
+  object bbCancel: TBitBtn
+    Left = 261
+    Height = 25
+    Top = 410
+    Width = 75
+    Cancel = True
+    Kind = bkCancel
+    ModalResult = 2
+    TabOrder = 12
+  end
+  object udInternetServerPort: TUpDown
+    Left = 226
+    Height = 21
+    Top = 113
+    Width = 16
+    Associate = ebInternetServerPort
+    Max = 25000
+    Min = 1
+    Position = 4004
+    TabOrder = 3
+    Thousands = False
+    Wrap = False
+  end
+  object ebInternetServerPort: TEdit
+    Left = 170
+    Height = 21
+    Top = 113
+    Width = 56
+    Alignment = taRightJustify
+    TabOrder = 2
+    Text = '4004'
+  end
+  object bbUpdatePassword: TBitBtn
+    Left = 15
+    Height = 38
+    Top = 14
+    Width = 336
+    Caption = 'Wallet Password'
+    Font.Color = clWindowText
+    Font.Height = -13
+    Font.Name = 'Tahoma'
+    Font.Style = [fsBold]
+    Glyph.Data = {
+      76060000424D7606000000000000360400002800000018000000180000000100
+      0800000000004002000000000000000000000001000000010000000000000101
+      0100020202000303030004040400050505000606060007070700080808000909
+      09000A0A0A000B0B0B000C0C0C000D0D0D000E0E0E000F0F0F00101010001111
+      1100121212001313130014141400151515001616160017171700181818001919
+      19001A1A1A001B1B1B001C1C1C001D1D1D001E1E1E001F1F1F00202020002121
+      2100222222002323230024242400252525002626260027272700282828002929
+      29002A2A2A002B2B2B002C2C2C002D2D2D002E2E2E002F2F2F00303030003131
+      3100323232003333330034343400353535003636360037373700383838003939
+      39003A3A3A003B3B3B003C3C3C003D3D3D003E3E3E003F3F3F00404040004141
+      4100424242004343430044444400454545004646460047474700484848004949
+      49004A4A4A004B4B4B004C4C4C004D4D4D004E4E4E004F4F4F00505050005151
+      5100525252005353530054545400555555005656560057575700585858005959
+      59005A5A5A005B5B5B005C5C5C005D5D5D005E5E5E00685968007C4F7C009441
+      9400B72CB700DD15DD00F506F500FD01FD00FE00FE00FE00FE00FE00FE00FE00
+      FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00
+      FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00
+      FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00
+      FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00
+      FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00
+      FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00
+      FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00
+      FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00
+      FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00
+      FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00
+      FE00FE00FE00FE00FE00FE00FE00F008F900D517F000BD24E800A830E1007B4B
+      D0005065C1003774B7002B7DB100237FAC001F82AD001C83AD001785AE001687
+      AF001489B100128AB300108CB6000F8EB9000D91BB000C94BF000A97C3000A99
+      C5000A9AC7000B9BC8000B9CCA000C9ECC000C9FCD000DA0CE000DA1CE000EA2
+      CF0011A3CF0015A4CF0018A5CF001CA7D10021A9D1002AAAD00035AACD0035AD
+      D00035AFD30035B1D60037B5D8003AB8DB003EB9DC0040BBDD0045BEDE004CC1
+      E00055C6E3005BC8E40061CAE40066CBE3006BCCE30072D3E60078D8EB0080D8
+      EE0083D9F10085DCF40088DBF5008BDBF6008EDAF70091DAF70095DCF70097E0
+      F7009EE3F800A4E7F900A9E9F900AEE9F900B5EBF900B2EBF800919191919191
+      919191919191919191919191919191919191919191919191D5E7E8E7E3DED591
+      919191919191919191919191919191D6DDF7F8F8F7F6F4EEE6D5919191919191
+      919191919191D7DADEF8F8F6F7F6EDF1F8F1E69191919191919191919191DADE
+      DFFAFAF8F7F7E9EDF7F7F8EB91919191919191919191DDE5E3FCFCFAFAEEE0E9
+      F3F7F7F7DC919191919191919191DEE7E4FEFEFCFCEDC5E0EFF7F6F6DC919191
+      919191919191DEEAE7FEFEFEFDFBC4C4F5F7F6F6DC919191919191919191E3EC
+      E9FEFEFEFEFEE0C3F9F7F6F6DC919191919191919191E3E9E3F8F8F1F1F8FBFB
+      FCFAF7F6DC919191919191919191DCEAEAE0E1E9E5E3DEE4EBF2FAF9DC919191
+      919191919191DBF3EEC5C5EFF3EBE5DDD9D6E6F5DC91919191919191919191D5
+      E8EDF1FAF6F0EAE4DAD1D2DBDC919191919191919191919191DBE8F0F3F3F3E4
+      D0CFE4D8DC919191919191919191919191919191D5DEE4DED2CFD4D491919191
+      91919191919191919191919191919191D2CE9191919191919191919191919191
+      91C8C89191919191D2CE919191919191919191919191919191D9D09191919191
+      D2CE919191919191919191919191919191E6E39191919191D2CE919191919191
+      919191919191919191E0F3CE91919191D2CE9191919191919191919191919191
+      9191EFF6E1C9C8CDD9CC91919191919191919191919191919191C9EDF9F3F3EB
+      DC91919191919191919191919191919191919191CBE0E1CF9191919191919191
+      9191919191919191919191919191919191919191919191919191
+    }
+    OnClick = bbUpdatePasswordClick
+    ParentFont = False
+    TabOrder = 0
+  end
+  object ebMinerName: TEdit
+    Left = 90
+    Height = 21
+    Top = 64
+    Width = 261
+    TabOrder = 1
+    Text = 'ebMinerName'
+  end
+  object cbShowModalMessages: TCheckBox
+    Left = 170
+    Height = 19
+    Top = 359
+    Width = 127
+    Caption = 'Show modal messages'
+    TabOrder = 13
+  end
+  object udJSONRPCMinerServerPort: TUpDown
+    Left = 226
+    Height = 21
+    Top = 173
+    Width = 16
+    Associate = ebJSONRPCMinerServerPort
+    Max = 25000
+    Min = 1
+    Position = 4009
+    TabOrder = 6
+    Thousands = False
+    Wrap = False
+  end
+  object ebJSONRPCMinerServerPort: TEdit
+    Left = 170
+    Height = 21
+    Top = 173
+    Width = 56
+    Alignment = taRightJustify
+    TabOrder = 5
+    Text = '4009'
+  end
+  object gbMinerPrivateKey: TGroupBox
+    Left = 8
+    Height = 121
+    Top = 200
+    Width = 334
+    Caption = ' Miner Server Private Key: '
+    ClientHeight = 103
+    ClientWidth = 330
+    TabOrder = 14
+    object rbGenerateANewPrivateKeyEachBlock: TRadioButton
+      Left = 18
+      Height = 19
+      Top = 6
+      Width = 277
+      Caption = 'Generate a new private key for each generated block'
+      TabOrder = 0
+    end
+    object rbUseARandomKey: TRadioButton
+      Left = 18
+      Height = 19
+      Top = 26
+      Width = 146
+      Caption = 'Use a random existing key'
+      TabOrder = 1
+    end
+    object rbMineAllwaysWithThisKey: TRadioButton
+      Left = 18
+      Height = 19
+      Top = 47
+      Width = 146
+      Caption = 'Always mine with this key:'
+      TabOrder = 2
+    end
+    object cbPrivateKeyToMine: TComboBox
+      Left = 43
+      Height = 21
+      Top = 71
+      Width = 266
+      ItemHeight = 13
+      Style = csDropDownList
+      TabOrder = 3
+    end
+  end
+  object cbSaveDebugLogs: TCheckBox
+    Left = 31
+    Height = 19
+    Top = 377
+    Width = 118
+    Caption = 'Save debug logs too'
+    TabOrder = 9
+  end
+end

+ 17 - 3
Units/Forms/UFRMPascalCoinWalletConfig.pas

@@ -1,5 +1,9 @@
 unit UFRMPascalCoinWalletConfig;
 
+{$IFDEF FPC}
+  {$MODE Delphi}
+{$ENDIF}
+
 { Copyright (c) 2016 by Albert Molina
 
   Distributed under the MIT software license, see the accompanying file LICENSE
@@ -16,7 +20,12 @@ unit UFRMPascalCoinWalletConfig;
 interface
 
 uses
-  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
+{$IFnDEF FPC}
+  Windows,
+{$ELSE}
+  LCLIntf, LCLType, LMessages,
+{$ENDIF}
+  Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
   Dialogs, StdCtrls, Buttons, ComCtrls, UAppParams, UWalletKeys;
 
 type
@@ -68,7 +77,11 @@ implementation
 
 uses UConst, UAccounts, ULog, UCrypto, UMiner;
 
-{$R *.dfm}
+{$IFnDEF FPC}
+  {$R *.dfm}
+{$ELSE}
+  {$R *.lfm}
+{$ENDIF}
 
 procedure TFRMPascalCoinWalletConfig.bbOkClick(Sender: TObject);
 Var df : Int64;
@@ -89,7 +102,7 @@ begin
   else if rbMineAllwaysWithThisKey.Checked then begin
     mpk := mpk_Selected;
     if cbPrivateKeyToMine.ItemIndex<0 then raise Exception.Create('Must select a private key');
-    i := Integer(cbPrivateKeyToMine.Items.Objects[cbPrivateKeyToMine.ItemIndex]);
+    i := PtrInt(cbPrivateKeyToMine.Items.Objects[cbPrivateKeyToMine.ItemIndex]);
     if (i<0) Or (i>=FWalletKeys.Count) then raise Exception.Create('Invalid private key');
     AppParams.ParamByName[CT_PARAM_MinerPrivateKeySelectedPublicKey].SetAsString( TAccountComp.AccountKey2RawString( FWalletKeys.Key[i].AccountKey ) );
   end else mpk := mpk_Random;
@@ -102,6 +115,7 @@ begin
   AppParams.ParamByName[CT_PARAM_MinerName].SetAsString(ebMinerName.Text);
   AppParams.ParamByName[CT_PARAM_ShowModalMessages].SetAsBoolean(cbShowModalMessages.Checked);
   AppParams.ParamByName[CT_PARAM_JSONRPCMinerServerPort].SetAsInteger(udJSONRPCMinerServerPort.Position);
+  ModalResult := MrOk;
 end;
 
 procedure TFRMPascalCoinWalletConfig.bbUpdatePasswordClick(Sender: TObject);

+ 269 - 0
Units/Forms/UFRMPayloadDecoder.lfm

@@ -0,0 +1,269 @@
+object FRMPayloadDecoder: TFRMPayloadDecoder
+  Left = 507
+  Height = 360
+  Top = 250
+  Width = 569
+  BorderIcons = [biSystemMenu]
+  BorderStyle = bsSingle
+  Caption = 'Payload Decoder'
+  ClientHeight = 360
+  ClientWidth = 569
+  Color = clBtnFace
+  Font.Color = clWindowText
+  Font.Height = -11
+  Font.Name = 'Tahoma'
+  OnCreate = FormCreate
+  Position = poOwnerFormCenter
+  LCLVersion = '1.6.0.4'
+  object Label1: TLabel
+    Left = 20
+    Height = 13
+    Top = 20
+    Width = 28
+    Caption = 'Block:'
+    ParentColor = False
+  end
+  object lblBlock: TLabel
+    Left = 54
+    Height = 19
+    Top = 15
+    Width = 30
+    Caption = '000'
+    Font.Color = clBlack
+    Font.Height = -16
+    Font.Name = 'Tahoma'
+    Font.Style = [fsBold]
+    ParentColor = False
+    ParentFont = False
+  end
+  object lblDateTime: TLabel
+    Left = 169
+    Height = 19
+    Top = 15
+    Width = 30
+    Caption = '000'
+    Font.Color = clBlack
+    Font.Height = -16
+    Font.Name = 'Tahoma'
+    Font.Style = [fsBold]
+    ParentColor = False
+    ParentFont = False
+  end
+  object Label6: TLabel
+    Left = 111
+    Height = 13
+    Top = 20
+    Width = 52
+    Caption = 'Date Time:'
+    ParentColor = False
+  end
+  object Label2: TLabel
+    Left = 20
+    Height = 13
+    Top = 45
+    Width = 52
+    Caption = 'Operation:'
+    ParentColor = False
+  end
+  object lblOperationTxt: TLabel
+    Left = 90
+    Height = 39
+    Top = 40
+    Width = 457
+    AutoSize = False
+    Caption = '000'
+    Font.Color = clBlack
+    Font.Height = -16
+    Font.Name = 'Tahoma'
+    Font.Style = [fsBold]
+    ParentColor = False
+    ParentFont = False
+    WordWrap = True
+  end
+  object PageControl: TPageControl
+    Left = 20
+    Height = 206
+    Top = 90
+    Width = 521
+    ActivePage = tsDecoded
+    TabIndex = 0
+    TabOrder = 0
+    OnChanging = PageControlChanging
+    object tsDecoded: TTabSheet
+      Caption = 'Payload'
+      ClientHeight = 180
+      ClientWidth = 513
+      object Label7: TLabel
+        Left = 15
+        Height = 13
+        Top = 94
+        Width = 87
+        Caption = 'Decoded Payload:'
+        ParentColor = False
+      end
+      object lblDecodedMethod: TLabel
+        Left = 113
+        Height = 13
+        Top = 94
+        Width = 388
+        Alignment = taRightJustify
+        AutoSize = False
+        Caption = '(Method)'
+        Font.Color = clGray
+        Font.Height = -11
+        Font.Name = 'Tahoma'
+        ParentColor = False
+        ParentFont = False
+      end
+      object Label3: TLabel
+        Left = 15
+        Height = 13
+        Top = 9
+        Width = 155
+        Caption = 'Original Payload in Hexadecimal:'
+        ParentColor = False
+      end
+      object memoDecoded: TMemo
+        Left = 15
+        Height = 55
+        Top = 111
+        Width = 486
+        Font.Color = clBlack
+        Font.Height = -13
+        Font.Name = 'Tahoma'
+        Font.Style = [fsBold]
+        Lines.Strings = (
+          'memoDecoded'
+        )
+        OnKeyDown = memoDecodedKeyDown
+        ParentFont = False
+        ReadOnly = True
+        TabOrder = 0
+        TabStop = False
+      end
+      object memoOriginalPayloadInHexa: TMemo
+        Left = 15
+        Height = 55
+        Top = 28
+        Width = 486
+        Color = clBtnFace
+        Font.Color = clBlack
+        Font.Height = -13
+        Font.Name = 'Tahoma'
+        Font.Style = [fsBold]
+        Lines.Strings = (
+          'memoDecoded'
+        )
+        OnKeyDown = memoDecodedKeyDown
+        ParentFont = False
+        ReadOnly = True
+        TabOrder = 1
+        TabStop = False
+      end
+    end
+    object tsDecodeMethods: TTabSheet
+      Caption = 'Decode methods'
+      ClientHeight = 0
+      ClientWidth = 0
+      ImageIndex = 1
+      object lblPasswordsInfo: TLabel
+        Left = 235
+        Height = 13
+        Top = 162
+        Width = 81
+        Caption = 'lblPasswordsInfo'
+        ParentColor = False
+      end
+      object cbMethodPublicPayload: TCheckBox
+        Left = 16
+        Height = 17
+        Top = 15
+        Width = 225
+        Caption = 'Not encrypted (Public payload)'
+        OnClick = cbMethodPublicPayloadClick
+        TabOrder = 0
+      end
+      object cbUsingPrivateKeys: TCheckBox
+        Left = 16
+        Height = 17
+        Top = 38
+        Width = 225
+        Caption = 'Using Private keys of my Wallet'
+        OnClick = cbMethodPublicPayloadClick
+        TabOrder = 1
+      end
+      object cbUsingPasswords: TCheckBox
+        Left = 16
+        Height = 17
+        Top = 61
+        Width = 225
+        Caption = 'Using Passwords of the list'
+        OnClick = cbMethodPublicPayloadClick
+        TabOrder = 2
+      end
+      object memoPasswords: TMemo
+        Left = 235
+        Height = 146
+        Top = 10
+        Width = 261
+        OnChange = cbMethodPublicPayloadClick
+        ScrollBars = ssBoth
+        TabOrder = 3
+      end
+      object bbSaveMethods: TBitBtn
+        Left = 60
+        Height = 25
+        Top = 110
+        Width = 75
+        Caption = 'Save'
+        Glyph.Data = {
+          DE010000424DDE01000000000000760000002800000024000000120000000100
+          0400000000006801000000000000000000001000000000000000000000000000
+          80000080000000808000800000008000800080800000C0C0C000808080000000
+          FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00333333333333
+          3333333333333333333333330000333333333333333333333333F33333333333
+          00003333344333333333333333388F3333333333000033334224333333333333
+          338338F3333333330000333422224333333333333833338F3333333300003342
+          222224333333333383333338F3333333000034222A22224333333338F338F333
+          8F33333300003222A3A2224333333338F3838F338F33333300003A2A333A2224
+          33333338F83338F338F33333000033A33333A222433333338333338F338F3333
+          0000333333333A222433333333333338F338F33300003333333333A222433333
+          333333338F338F33000033333333333A222433333333333338F338F300003333
+          33333333A222433333333333338F338F00003333333333333A22433333333333
+          3338F38F000033333333333333A223333333333333338F830000333333333333
+          333A333333333333333338330000333333333333333333333333333333333333
+          0000
+        }
+        NumGlyphs = 2
+        OnClick = bbSaveMethodsClick
+        TabOrder = 4
+      end
+    end
+  end
+  object BitBtn1: TBitBtn
+    Left = 462
+    Height = 25
+    Top = 310
+    Width = 79
+    Cancel = True
+    Caption = 'Close'
+    Glyph.Data = {
+      76010000424D7601000000000000760000002800000020000000100000000100
+      04000000000000010000120B0000120B00001000000000000000000000000000
+      800000800000008080008000000080008000808000007F7F7F00BFBFBF000000
+      FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00555555555555
+      555555555555555555555555555555555555555555FF55555555555559055555
+      55555555577FF5555555555599905555555555557777F5555555555599905555
+      555555557777FF5555555559999905555555555777777F555555559999990555
+      5555557777777FF5555557990599905555555777757777F55555790555599055
+      55557775555777FF5555555555599905555555555557777F5555555555559905
+      555555555555777FF5555555555559905555555555555777FF55555555555579
+      05555555555555777FF5555555555557905555555555555777FF555555555555
+      5990555555555555577755555555555555555555555555555555
+    }
+    ModalResult = 2
+    NumGlyphs = 2
+    OnClick = BitBtn1Click
+    TabOrder = 1
+  end
+end

+ 24 - 2
Units/Forms/UFRMPayloadDecoder.pas

@@ -1,5 +1,9 @@
 unit UFRMPayloadDecoder;
 
+{$IFDEF FPC}
+  {$MODE Delphi}
+{$ENDIF}
+
 { Copyright (c) 2016 by Albert Molina
 
   Distributed under the MIT software license, see the accompanying file LICENSE
@@ -16,11 +20,19 @@ unit UFRMPayloadDecoder;
 interface
 
 uses
-  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
+{$IFnDEF FPC}
+  Windows,
+{$ELSE}
+  LCLIntf, LCLType, LMessages,
+{$ENDIF}
+  Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
   Dialogs, StdCtrls, UBlockChain, UCrypto, UWalletKeys, Buttons, ComCtrls,
   UAppParams;
 
 type
+
+  { TFRMPayloadDecoder }
+
   TFRMPayloadDecoder = class(TForm)
     Label1: TLabel;
     lblBlock: TLabel;
@@ -43,6 +55,7 @@ type
     memoDecoded: TMemo;
     memoOriginalPayloadInHexa: TMemo;
     lblPasswordsInfo: TLabel;
+    procedure BitBtn1Click(Sender: TObject);
     procedure FormCreate(Sender: TObject);
     procedure PageControlChanging(Sender: TObject; var AllowChange: Boolean);
     procedure cbMethodPublicPayloadClick(Sender: TObject);
@@ -66,7 +79,11 @@ type
 
 implementation
 
-{$R *.dfm}
+{$IFnDEF FPC}
+  {$R *.dfm}
+{$ELSE}
+  {$R *.lfm}
+{$ENDIF}
 
 Uses UNode, UTime, UECIES, UAES, UAccounts;
 
@@ -94,6 +111,11 @@ begin
   lblPasswordsInfo.Caption := '';
 end;
 
+procedure TFRMPayloadDecoder.BitBtn1Click(Sender: TObject);
+begin
+
+end;
+
 procedure TFRMPayloadDecoder.Init(block, timestamp : Cardinal; const OperationText : AnsiString; Const PayloadData : TRawBytes; WalletKeys : TWalletKeys; AppParams : TAppParams);
 begin
   FWalletKeys := WalletKeys;

+ 64 - 191
Units/Forms/UFRMWallet.dfm

@@ -2,9 +2,11 @@ object FRMWallet: TFRMWallet
   Left = 360
   Top = 328
   Caption = 'Pascal Coin Wallet, JSON-RPC Miner & Explorer'
-  ClientHeight = 545
-  ClientWidth = 903
+  ClientHeight = 542
+  ClientWidth = 849
   Color = clBtnFace
+  Constraints.MinHeight = 600
+  Constraints.MinWidth = 865
   Font.Charset = DEFAULT_CHARSET
   Font.Color = clWindowText
   Font.Height = -11
@@ -20,7 +22,7 @@ object FRMWallet: TFRMWallet
   object pnlTop: TPanel
     Left = 0
     Top = 0
-    Width = 903
+    Width = 849
     Height = 91
     Align = alTop
     BevelOuter = bvNone
@@ -343,8 +345,8 @@ object FRMWallet: TFRMWallet
   end
   object StatusBar: TStatusBar
     Left = 0
-    Top = 526
-    Width = 903
+    Top = 523
+    Width = 849
     Height = 19
     Panels = <
       item
@@ -364,22 +366,18 @@ object FRMWallet: TFRMWallet
   object PageControl: TPageControl
     Left = 0
     Top = 91
-    Width = 903
-    Height = 435
-    ActivePage = tsNodeStats
+    Width = 849
+    Height = 432
+    ActivePage = tsMyAccounts
     Align = alClient
     TabOrder = 2
     OnChange = PageControlChange
-    object tsAccountsExplorer: TTabSheet
+    object tsMyAccounts: TTabSheet
       Caption = 'Accounts Explorer'
-      ExplicitLeft = 0
-      ExplicitTop = 0
-      ExplicitWidth = 0
-      ExplicitHeight = 0
       object Splitter1: TSplitter
         Left = 380
         Top = 66
-        Height = 341
+        Height = 338
         ExplicitLeft = 390
         ExplicitTop = 140
         ExplicitHeight = 100
@@ -387,7 +385,7 @@ object FRMWallet: TFRMWallet
       object pnlMyAccountsTop: TPanel
         Left = 0
         Top = 0
-        Width = 895
+        Width = 841
         Height = 66
         Align = alTop
         TabOrder = 0
@@ -470,7 +468,7 @@ object FRMWallet: TFRMWallet
         Left = 0
         Top = 66
         Width = 380
-        Height = 341
+        Height = 338
         Align = alLeft
         BevelOuter = bvNone
         TabOrder = 1
@@ -478,7 +476,7 @@ object FRMWallet: TFRMWallet
           Left = 0
           Top = 0
           Width = 380
-          Height = 307
+          Height = 304
           Align = alLeft
           TabOrder = 0
           OnClick = dgAccountsClick
@@ -493,7 +491,7 @@ object FRMWallet: TFRMWallet
         end
         object pnlAccountsInfo: TPanel
           Left = 0
-          Top = 307
+          Top = 304
           Width = 380
           Height = 34
           Align = alBottom
@@ -574,22 +572,18 @@ object FRMWallet: TFRMWallet
       object pcAccountsOptions: TPageControl
         Left = 383
         Top = 66
-        Width = 512
-        Height = 341
-        ActivePage = tsMultiSelectAccounts
+        Width = 458
+        Height = 338
+        ActivePage = tsAccountOperations
         Align = alClient
         TabOrder = 2
         object tsAccountOperations: TTabSheet
           Caption = 'Operations of selected Account'
-          ExplicitLeft = 0
-          ExplicitTop = 0
-          ExplicitWidth = 0
-          ExplicitHeight = 0
           object dgAccountOperations: TDrawGrid
             Left = 0
             Top = 0
-            Width = 504
-            Height = 313
+            Width = 450
+            Height = 310
             Align = alClient
             TabOrder = 0
             OnDblClick = MiDecodePayloadClick
@@ -604,15 +598,11 @@ object FRMWallet: TFRMWallet
         object tsMultiSelectAccounts: TTabSheet
           Caption = 'Selected accounts for massive operations'
           ImageIndex = 1
-          ExplicitLeft = 0
-          ExplicitTop = 0
-          ExplicitWidth = 0
-          ExplicitHeight = 0
           object dgSelectedAccounts: TDrawGrid
             Left = 41
             Top = 31
             Width = 320
-            Height = 256
+            Height = 253
             Align = alLeft
             TabOrder = 0
             RowHeights = (
@@ -625,7 +615,7 @@ object FRMWallet: TFRMWallet
           object pnlSelectedAccountsTop: TPanel
             Left = 0
             Top = 0
-            Width = 504
+            Width = 450
             Height = 31
             Align = alTop
             BevelOuter = bvNone
@@ -646,8 +636,8 @@ object FRMWallet: TFRMWallet
           end
           object pnlSelectedAccountsBottom: TPanel
             Left = 0
-            Top = 287
-            Width = 504
+            Top = 284
+            Width = 450
             Height = 26
             Align = alBottom
             BevelOuter = bvNone
@@ -685,7 +675,7 @@ object FRMWallet: TFRMWallet
             Left = 0
             Top = 31
             Width = 41
-            Height = 256
+            Height = 253
             Align = alLeft
             BevelOuter = bvNone
             TabOrder = 3
@@ -797,15 +787,11 @@ object FRMWallet: TFRMWallet
     object tsPendingOperations: TTabSheet
       Caption = 'Pending Operations'
       ImageIndex = 5
-      ExplicitLeft = 0
-      ExplicitTop = 0
-      ExplicitWidth = 0
-      ExplicitHeight = 0
       object dgPendingOperations: TDrawGrid
         Left = 0
         Top = 86
-        Width = 895
-        Height = 321
+        Width = 841
+        Height = 318
         Align = alClient
         TabOrder = 0
         OnDblClick = MiDecodePayloadClick
@@ -813,7 +799,7 @@ object FRMWallet: TFRMWallet
       object pnlPendingOperations: TPanel
         Left = 0
         Top = 0
-        Width = 895
+        Width = 841
         Height = 86
         Align = alTop
         BevelOuter = bvNone
@@ -822,7 +808,7 @@ object FRMWallet: TFRMWallet
         object Label10: TLabel
           Left = 10
           Top = 10
-          Width = 875
+          Width = 821
           Height = 66
           Align = alClient
           AutoSize = False
@@ -848,26 +834,22 @@ object FRMWallet: TFRMWallet
     object tsBlockChain: TTabSheet
       Caption = 'BlockChain Explorer'
       ImageIndex = 1
-      ExplicitLeft = 0
-      ExplicitTop = 0
-      ExplicitWidth = 0
-      ExplicitHeight = 0
       object Panel2: TPanel
         Left = 0
         Top = 0
-        Width = 895
+        Width = 841
         Height = 41
         Align = alTop
         TabOrder = 0
         object Label9: TLabel
-          Left = 306
+          Left = 11
           Top = 10
           Width = 102
           Height = 13
           Caption = 'Filter by blocks range'
         end
         object ebBlockChainBlockStart: TEdit
-          Left = 414
+          Left = 125
           Top = 7
           Width = 57
           Height = 21
@@ -876,7 +858,7 @@ object FRMWallet: TFRMWallet
           OnKeyPress = ebBlockChainBlockStartKeyPress
         end
         object ebBlockChainBlockEnd: TEdit
-          Left = 474
+          Left = 185
           Top = 7
           Width = 57
           Height = 21
@@ -884,169 +866,68 @@ object FRMWallet: TFRMWallet
           OnExit = ebBlockChainBlockStartExit
           OnKeyPress = ebBlockChainBlockStartKeyPress
         end
-        object dtpBlockChainDateStart: TDateTimePicker
-          Left = 654
-          Top = 7
-          Width = 101
-          Height = 21
-          Date = 42556.766794687500000000
-          Time = 42556.766794687500000000
-          TabOrder = 2
-          OnChange = ebBlockChainBlockStartExit
-          OnExit = ebBlockChainBlockStartExit
-        end
-        object cbBlockChainFilterByDate: TCheckBox
-          Left = 557
-          Top = 9
-          Width = 91
-          Height = 17
-          Caption = 'Filter by date'
-          TabOrder = 3
-          OnClick = cbBlockChainFilterByDateClick
-        end
-        object dtpBlockChainDateEnd: TDateTimePicker
-          Left = 761
-          Top = 7
-          Width = 101
-          Height = 21
-          Date = 42556.766794687500000000
-          Time = 42556.766794687500000000
-          TabOrder = 4
-          OnChange = ebBlockChainBlockStartExit
-          OnExit = ebBlockChainBlockStartExit
-        end
       end
-      object dbGridBlockChain: TDBGrid
+      object dgBlockChainExplorer: TDrawGrid
         Left = 0
         Top = 41
-        Width = 895
-        Height = 366
+        Width = 841
+        Height = 363
         Align = alClient
-        Options = [dgTitles, dgIndicator, dgColumnResize, dgColLines, dgRowLines, dgTabs, dgConfirmDelete, dgCancelOnExit, dgTitleClick, dgTitleHotTrack]
-        ReadOnly = True
         TabOrder = 1
-        TitleFont.Charset = DEFAULT_CHARSET
-        TitleFont.Color = clWindowText
-        TitleFont.Height = -11
-        TitleFont.Name = 'Tahoma'
-        TitleFont.Style = []
       end
     end
     object tsOperations: TTabSheet
       Caption = 'Operations Explorer'
       ImageIndex = 1
-      ExplicitLeft = 0
-      ExplicitTop = 0
-      ExplicitWidth = 0
-      ExplicitHeight = 0
       object Panel1: TPanel
         Left = 0
         Top = 0
-        Width = 895
+        Width = 841
         Height = 41
         Align = alTop
         TabOrder = 0
-        object Label1: TLabel
-          Left = 11
-          Top = 10
-          Width = 80
-          Height = 13
-          Caption = 'Filter by account'
-        end
         object Label2: TLabel
-          Left = 306
+          Left = 11
           Top = 10
           Width = 102
           Height = 13
           Caption = 'Filter by blocks range'
         end
-        object ebFilterOperationsAccount: TEdit
-          Left = 108
-          Top = 7
-          Width = 173
-          Height = 21
-          TabOrder = 0
-          OnExit = ebFilterOperationsAccountExit
-          OnKeyPress = ebFilterOperationsAccountKeyPress
-        end
         object ebFilterOperationsStartBlock: TEdit
-          Left = 414
+          Left = 125
           Top = 7
           Width = 57
           Height = 21
-          TabOrder = 1
+          TabOrder = 0
           OnExit = ebFilterOperationsAccountExit
           OnKeyPress = ebFilterOperationsAccountKeyPress
         end
         object ebFilterOperationsEndBlock: TEdit
-          Left = 474
+          Left = 185
           Top = 7
           Width = 57
           Height = 21
-          TabOrder = 2
+          TabOrder = 1
           OnExit = ebFilterOperationsAccountExit
           OnKeyPress = ebFilterOperationsAccountKeyPress
         end
-        object dtpFilterOperationsDateStart: TDateTimePicker
-          Left = 654
-          Top = 7
-          Width = 101
-          Height = 21
-          Date = 42556.766794687500000000
-          Time = 42556.766794687500000000
-          TabOrder = 3
-          OnChange = ebFilterOperationsAccountExit
-          OnExit = ebFilterOperationsAccountExit
-        end
-        object cbFilterOperationsByDate: TCheckBox
-          Left = 557
-          Top = 9
-          Width = 91
-          Height = 17
-          Caption = 'Filter by date'
-          TabOrder = 4
-          OnClick = cbFilterOperationsByDateClick
-        end
-        object dtpFilterOperationsDateEnd: TDateTimePicker
-          Left = 761
-          Top = 7
-          Width = 101
-          Height = 21
-          Date = 42556.766794687500000000
-          Time = 42556.766794687500000000
-          TabOrder = 5
-          OnChange = ebFilterOperationsAccountExit
-          OnExit = ebFilterOperationsAccountExit
-        end
       end
-      object dbgridOperations: TDBGrid
+      object dgOperationsExplorer: TDrawGrid
         Left = 0
         Top = 41
-        Width = 895
-        Height = 366
+        Width = 841
+        Height = 363
         Align = alClient
-        Options = [dgTitles, dgIndicator, dgColumnResize, dgColLines, dgRowLines, dgTabs, dgConfirmDelete, dgCancelOnExit, dgTitleClick, dgTitleHotTrack]
-        ReadOnly = True
         TabOrder = 1
-        TitleFont.Charset = DEFAULT_CHARSET
-        TitleFont.Color = clWindowText
-        TitleFont.Height = -11
-        TitleFont.Name = 'Tahoma'
-        TitleFont.Style = []
-        OnDblClick = MiDecodePayloadClick
       end
     end
     object tsLogs: TTabSheet
       Caption = 'Logs'
       ImageIndex = 2
-      ExplicitLeft = 0
-      ExplicitTop = 0
-      ExplicitWidth = 0
-      ExplicitHeight = 0
       object pnlTopLogs: TPanel
         Left = 0
         Top = 0
-        Width = 895
+        Width = 841
         Height = 41
         Align = alTop
         TabOrder = 0
@@ -1062,8 +943,8 @@ object FRMWallet: TFRMWallet
       object memoLogs: TMemo
         Left = 0
         Top = 41
-        Width = 895
-        Height = 366
+        Width = 841
+        Height = 363
         Align = alClient
         ScrollBars = ssBoth
         TabOrder = 1
@@ -1072,13 +953,9 @@ object FRMWallet: TFRMWallet
     object tsNodeStats: TTabSheet
       Caption = 'Node Stats'
       ImageIndex = 3
-      ExplicitLeft = 0
-      ExplicitTop = 0
-      ExplicitWidth = 0
-      ExplicitHeight = 0
       DesignSize = (
-        895
-        407)
+        841
+        404)
       object Label3: TLabel
         Left = 15
         Top = 15
@@ -1088,7 +965,7 @@ object FRMWallet: TFRMWallet
       end
       object Label6: TLabel
         Left = 15
-        Top = 253
+        Top = 250
         Width = 169
         Height = 13
         Anchors = [akLeft, akBottom]
@@ -1097,7 +974,7 @@ object FRMWallet: TFRMWallet
       end
       object Label7: TLabel
         Left = 15
-        Top = 149
+        Top = 146
         Width = 86
         Height = 13
         Anchors = [akLeft, akBottom]
@@ -1107,8 +984,8 @@ object FRMWallet: TFRMWallet
       object memoNetConnections: TMemo
         Left = 15
         Top = 34
-        Width = 864
-        Height = 109
+        Width = 810
+        Height = 106
         Anchors = [akLeft, akTop, akRight, akBottom]
         ReadOnly = True
         ScrollBars = ssVertical
@@ -1116,8 +993,8 @@ object FRMWallet: TFRMWallet
       end
       object memoNetServers: TMemo
         Left = 15
-        Top = 272
-        Width = 864
+        Top = 269
+        Width = 810
         Height = 116
         Anchors = [akLeft, akRight, akBottom]
         ReadOnly = True
@@ -1126,8 +1003,8 @@ object FRMWallet: TFRMWallet
       end
       object memoNetBlackLists: TMemo
         Left = 15
-        Top = 168
-        Width = 864
+        Top = 165
+        Width = 810
         Height = 79
         Anchors = [akLeft, akRight, akBottom]
         ReadOnly = True
@@ -1138,13 +1015,9 @@ object FRMWallet: TFRMWallet
     object tsMessages: TTabSheet
       Caption = 'Messages'
       ImageIndex = 6
-      ExplicitLeft = 0
-      ExplicitTop = 0
-      ExplicitWidth = 0
-      ExplicitHeight = 0
       DesignSize = (
-        895
-        407)
+        841
+        404)
       object Label11: TLabel
         Left = 15
         Top = 151
@@ -1202,8 +1075,8 @@ object FRMWallet: TFRMWallet
       object memoMessages: TMemo
         Left = 15
         Top = 170
-        Width = 864
-        Height = 218
+        Width = 810
+        Height = 215
         Anchors = [akLeft, akTop, akRight, akBottom]
         Font.Charset = DEFAULT_CHARSET
         Font.Color = clWindowText
@@ -1370,7 +1243,7 @@ object FRMWallet: TFRMWallet
     Left = 105
     Top = 180
     Bitmap = {
-      494C010102000800480110003000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600
+      494C010102000800640110003000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600
       0000000000003600000028000000400000003000000001002000000000000030
       0000000000000000000000000000000000000000000000000000000000000000
       0000000000000000002A292929D60B0B0BF4111111EE0000006B000000000000

+ 1957 - 0
Units/Forms/UFRMWallet.lfm

@@ -0,0 +1,1957 @@
+object FRMWallet: TFRMWallet
+  Left = 360
+  Height = 500
+  Top = 328
+  Width = 837
+  Caption = 'Pascal Coin Wallet, JSON-RPC Miner & Explorer'
+  ClientHeight = 480
+  ClientWidth = 837
+  Color = clBtnFace
+  Constraints.MinHeight = 500
+  Constraints.MinWidth = 700
+  Font.Color = clWindowText
+  Font.Height = -11
+  Font.Name = 'Tahoma'
+  Menu = MainMenu
+  OnCreate = FormCreate
+  OnDestroy = FormDestroy
+  Position = poOwnerFormCenter
+  LCLVersion = '1.6.0.4'
+  object pnlTop: TPanel
+    Left = 0
+    Height = 91
+    Top = 0
+    Width = 837
+    Align = alTop
+    BevelOuter = bvNone
+    ClientHeight = 91
+    ClientWidth = 837
+    TabOrder = 0
+    object Image1: TImage
+      Left = 13
+      Height = 62
+      Top = 13
+      Width = 62
+      AutoSize = True
+      Picture.Data = {
+        1754506F727461626C654E6574776F726B477261706869630A0F000089504E47
+        0D0A1A0A0000000D494844520000003E0000003E080600000073C1A844000000
+        0473424954080808087C086488000000097048597300000B1200000B1201D2DD
+        7EFC0000001C74455874536F6674776172650041646F62652046697265776F72
+        6B7320435336E8BCB28C00000016744558744372656174696F6E2054696D6500
+        30362F30372F313610A27E9700000E62494441546881CD9B7D9C54D579C7BFE7
+        CEECEEC0BE22B02F2CB033B3C2F2EA0ED0801491B56068ADBCA40511492DD12A
+        A468C57CAC298444AC1113623EB15A6391A8D40815431B8C2FA9489301444113
+        1844C00576980576D91D0177667760999DB9A77FDCBB77EFECBCEDABEDEFF339
+        9FB973EFB9E79CDF739EE7B9CF7913524AFA0B42881B80BF016600A5C020200B
+        50F424F51401424003E0050E00FF25A5FCBCDFDAD6D7C485100B818780C9D936
+        6BFD8D15458D55134B2C958EC1B9F3A69655267B2F100A07F71EBB70E6A8EF72
+        F3EF3EAD8FEE3D76C1DE165107000781E7A494EFF7693BFB82B8106234F028F0
+        0D4751EEC97B6EAD883C78FB841BF2B333F37A53AEB72158F7FADE9A331B7E75
+        7870A8353200D80ABC28A53CDBEB36F786B810620CB0D6A288998B66387D1BEE
+        FEDA2867715E696F1B9508DE8660DDA2A7767B0F7B2F8E045E03364929CFF5B4
+        BC1E1117420C02FE1158B96466F9914DAB664EEE6DEF7615260194038F4B295F
+        EC4939DD262E84A804B60FC9B35D39F8D38585FDD5C3E970B0DA7F72FE13EF85
+        FC81ABA7815552CA2FBAF37EB7880B21165B14F1E4FABBA634AE5B32F9A6EE36
+        361D3CDE4B3485AE612FCAC55E980B80CFDF8CAFB19982EC2C5CCEC171EF2CF9
+        F16EF71B1F7887032BA594FFD3D5BA94AE641242D884103FC81D90F183FD1B17
+        C8F4A40508058405146B6C128AF63C01566FFE905BD6BECD96DD278D7B5B769F
+        E496B56FB37AF38709DFD9FEDD3955BFF9FEDC904511BF1442ACEC0A1FE82271
+        E0896C9BF5CE73AF2C1B39ADA27074C21C4268C42C5960CD02AB2D41CAEAF8B5
+        649904A1C173E612404CCFBA8FD60350357158D2C6CD9B5A56B97FE382E61C5B
+        C63F74957C4AE2428801428817726C19B7D56DF9666942072614B06480A59D98
+        89744622F29D8460C9024B264D57DA0884C200869A83A6EA00F6A2DCB8AACD98
+        565138FAFC9665A5B90332560921D60B21327B4C1C7838DB669D757ECBB2E109
+        492B197AC36D897BD992E6BF21A82C3CBEA051ACB9C76BFD2DBA3072D23415F2
+        B333F3CEBDB26C648E2D6331B03455DEA4CE4D08B1386F60E69AB32FDF551E47
+        5A283A69ABF6AB5841B1E836ADFF0A85E54FFE0A5FC3971DEF49F385D4FF6BD7
+        E7BF085253DF44CE800CA6940F05244DA1304774F57F6CE91443282EE7E018AD
+        E88C83D5FE93331E7DD31A55E5FDC91C5E42E24288511645ECDABF714138CEA6
+        8502964C4DBD0DD266E765D105A3206E7C3869E37A8B4AC760562F98C8F2D989
+        5DCE5B1FD71E99FFC47BB940A594B2A5F3F338551742E4015BBF7DDBB8DAE4A4
+        CD292B36E92AEFF6F43AAA4C8923672EF1AD67DCD8EFDD86C77B29EEF9BCA965
+        9577DCE43C0BFC520831A0F3F34436FE9DC2FC01D6E756CC981573570813D98C
+        8E6B6B668CADB6DBAFAF3198A0E8BE47ADBF85490FFDA7E1FDCDD8FEDD395585
+        F903CA4860EF31C4F561E4CA8F9E5E5018578A92614A995A4AD6F3D62C7C0D4D
+        7DC7AE0B58F8E42EE30B60C66FBE3F371B7854085164BEDFB9C7D72D99597E22
+        2E0C55AC1DCECC92614A26D2E65EB764E1FE43BF0DA51322100AB3FAC58FE2EE
+        4FAB281C3DC939C40F3C60BE6F38372184D3A288BD97B6FD6D6EAC17171D0187
+        35CB445427AD98D4BF5D408A85823F594AA03994B091F9B9D9B8C6D8D13CBBE4
+        7CE3256ACEF9C91998C5948A1180CAF9C6266AEA2F775B00675E5A1AE7F1BD0D
+        C1BAF2FB5EB7A239BA4688EDF1EF2D9AE13C15F7E952F44F94D9735B4C6A1FD3
+        FB9A709A426D494903B8C695E3DEF613DCAFFD08F7AB3FE4F659DAA76AF6D4B1
+        B8373D8CFBE70FB06EF96C00460CCDE3D78F2D60568AC8CD8C67DE3C1A77CF59
+        9C573AC939E414F06D8396E9F9E20D777F6D54DC5B8A0584D524800C530C9E41
+        BC97CFC473F27CCAC6554D9F1CE3283DD5B59A40C6D80DE1B6FB08E7B0412CBC
+        A902F7C6453C347F625AE2893C3CC08E35731CC0FD31C4851077388A728FC5D9
+        B631D050620394CEDFEE4E42F09C3893B271F691238C50154B269ECF7D3A7187
+        519EFBB05713D224871E1B587866C54CCAD24470EDF17E67388BF34AB36DD626
+        21C4748338B0FA9E5B2B2271B985253625251FABF29E13A753132F1B61984B53
+        4B2B81E62BDAFDD222A30EDF052DE2B3175F6704440885E5B32B5296DD1EEF27
+        C23F2D725D0256012842080BE07AF0F60937C41357B4EFB7503A7ADFF84D2200
+        2503DFF986948DAB9AF9A7BA63B4E2F9BCD6B8EF1A576E945BDBA039367BC975
+        3175271A93771577CDBADE01FC851042518049D9366B6DE2919799B41223F9D8
+        7BB182D8F3E11F92565E39616C4CA8EB3951A3DD1FE330CA72FFB1633C5E35D9
+        691AC30B7CFEB8E83306B32694247DE62CCE2BCDB02A2D80430196DE5851D498
+        90B45E59CC35ED5A904028C282AF2E756FDBCB46EA31BDE6307DE7B5AAEDC38B
+        0D82BE0B5A6F97150F32699D9692392FA3FC34C3D79BC7979C011629C0F43B6F
+        2EB7C56769AFACF33526219885A391F77C762A65C5AE1B26749041C1734CEB5D
+        4DCDB57A7CF51735122566B5D6EAD97920B5E34C3561A13D2FB100D3ACC0B0A2
+        820129E2CB04D3444224BE063C9F9D4859B146BC43909E639AA05C639D467DEE
+        4FB4A8AF6ACAF531F53FF3EB43299D1740D5C4E4AA0E50E9189C0B14588141F3
+        A6969525CFDA3E76360D5F63AED598BC69894F1CA7BD2F254D812081667DA261
+        787B282DF1D56B13A6F692EB681FC47B6A1A7878D39E94652F98664F394E07B8
+        797C8903685580046A8ED1386375CB206F4A52D5F3A820A320557C67EB52566C
+        1F51026A146414CFD18E78DE35C661D4597B41B3637BF12090929D1F9CA0EA3B
+        DB52960BB07AC184B47974276EB302D6C45924A0EAA4CC044D8958D2A8518E1C
+        AB4E5AE9AC193742B40DD43650238676548E751AE5B83FFECCC8EFBB7099AACD
+        EFB2C793DAAE41EBED74F66D824D00AA7CEBFEC4F3BD964CD37C996986D49829
+        B5C50C60DC1F1FE796250F242CAA3F51569883E7D9451464A79C5F3420E6BD18
+        4DD2DB3A8CDEEC94543D8908A8FA373CAAE03B973A46EF0FE46767B2F37B73BB
+        4CBA1D0A104DFA54464155759B543B08CB28A8119011ED574FE9ECBBAF919F9D
+        897BC3BC9E4473AA156D513E71CF4B69EAE5881678A851CD468502510B9AEC34
+        4B711FF0F49C453751E918CCCE755F4FEBC593E08A15080642E170D2D54E43AD
+        75F2BA5A77C4EDC2F896B7879FFD89FCEC4C56CF9FC8FABBA6F4A698162BF0C5
+        DE63172249772B18BD6DD1ED59271B8D5D036B0A868C51567FA0AC3087E5B32B
+        58BD6062B7EDD98CB73EAE3D029A8A9F3DEABB9C3B6F6A8A18468DE8443BC7E6
+        0223C038EE4DDDF06143B19716D2BE9070FAEC05EAFC5F32A42087F1CE61804A
+        C3C520D567FDD832AD4C1B5B8ACB39047B610E55E30B713906F598AC19FEC0D5
+        56E00B2B70E0779FD6FFD9DA3B2625CF2D555DCD15888AF86752E2F93C35F1F5
+        7FFFD72C9F3FD38801AAEEDD409DFF4B562D9EC5FABF9B0BD136D6FFE2B73CFE
+        F26EA68D2DC5FDD33B2112866858F3297D84FFD853D30AECB5026FEF3D76E19E
+        B46FA8914EA3341D06F1DA646F02602FCA83482BA082AAE2A9D6161C5CD71741
+        E41AA811DC87B4098CAACAE1A640A7EF48031CACF60F05762AC0F1B6889AE76D
+        08A6FF1645DB40D57B211AD61A1C0D43F41ABEFAD4C3C52A975D231EB9465353
+        138196AB80BE32DA5E46FBACCBD06CFD5EDF920E84C2C196D6B6A152CA538A94
+        B215D8B76DCFE9F47121688D899AC847AF41F41A7B3CC955BD72D4309DB496CC
+        66E1720ED6CB0853DB1800C03E74A04EBA6FB7A23DFFCEB14F817DD031E7B6E9
+        473B3C5D8F02D4B60ED29130BE3A7FCAECF6A2824EC43535AF2C2F32B4A05DCD
+        01AAC6EB4EB08FF1D2FBD556E025E8085C76855A2343BC0DC1BA2E6FE6512346
+        48EB3999DA4A5CE54375FBD6465F0BA73B71399651909DA1094F8DE2B2E7F3FB
+        A7E6771AE6F61DBC0DC13A6F43B01870834E5C4A191142FC6CD153BB6F3BF42F
+        7FD5F55D4C5285A88AE774EAE92697E33A9DB8F68E7D880DFBE0422D4688B482
+        1AA5C026A89A50DC33565DC0DA573F3905EC97525E81D805857F3DECBD38A14B
+        4EAE133C3517533E77D9F34DAA7EADE33A7A4DB3E57EEAE5760442E1E08EFDDE
+        E180B127CE202EA56C067EB1E8A9DD5D737226245AA534C33E382B96ACDAA68F
+        01FA6F03B1192B9EDF7728AACAADE6ADA09D574B9F3DECBD587AB0DA7F926EE0
+        4892D50B689FEEFD6A082682B72158B77D5FCD04E0DFCCF76388EB7B43D7CF7F
+        E2BDE42B7E9D906841DE8C74D3BDFD8DE98FBCE9071E9152C638A2443B2276F8
+        03576B96FC78B7BB2B05A79BE077397ABEF2D15B6C78E3F007FEC0D54629E5BF
+        777E16475CF77AF7BFF1817774FB4826157C8DA9EDBB374B3EBDC1C16AFFC9C7
+        B6FD7120DADEF93824DCE726A5FC1258F48D27770D4C67EFE954DDE51CD2C5A6
+        F61D02A17070CEBA772291A8FAB8943261FB936EF093527E1455E5DA39EBDE89
+        0642E1A43B79922DCB823669D09BB1734F1008858323BEB5B5B6A5B5ED15E09D
+        64F952EE6C9452EE68696DDB317CF9D6BA44E49B42E1942B1B5FB57DEBA4CF36
+        5F6DFBB994F2692965D2F9C42E6DDB1642ACCC1B98B962D73FDF36D0BCF7AD29
+        14C6E34D1EBC98B75FF73702A17070F8F2AD752DAD6D6F4829D7A7CBDFE5FDEA
+        4288FB142136EC5CF7F5BA54876AFE2F70B0DA7F72EE63EF360742E15780CD52
+        CAD40B6C748FB802CC069E5E32B3FCF2EB8FCEAEEA556BFB080F6EDABFE78577
+        8F5F1F55E57D52CADF76F5BD9E1CCD7002CFE7D83246EEFEE15F5A93EE5FEF67
+        781B8275D31F79D3EF0F5C6D04BE29A54C3D13D2093D3E85A49F2F7B619273C8
+        E91D6BE638BEAAB329815038B8E2F97D87B6EFAB71001B81D7A494DDDE3FDADB
+        E35783D0760C3E34C939E4F88E35739CFD79FC6AEDAB9F9CDAB1DF6B8FAA7207
+        F0EC577EFC2AAE106D9FE8DDC0BD39B60C75CD62D7A53B6F2EEFB5160442E1E0
+        736F7FF6E9CBEF575BCF34368F0236A311BED0EB36F7C311CB29685BAA6EC9B4
+        2A6D33C797D48F1B39885B5DA505378F2F71245BB1E97CC4F240756361A83552
+        0C7C023CFDFFF28865D2C2852803FE1CED50ED686018900B64A2CDFE48200C5C
+        035A8046A006F83DF0DF40BD94FD334BF1BFCAF3090585D7E9BD000000004945
+        4E44AE426082
+      }
+    end
+    object lblCurrentBlockCaption: TLabel
+      Left = 88
+      Height = 13
+      Top = 9
+      Width = 60
+      Caption = 'Total Blocks:'
+      ParentColor = False
+    end
+    object lblCurrentBlock: TLabel
+      Left = 161
+      Height = 13
+      Top = 9
+      Width = 18
+      Caption = '000'
+      ParentColor = False
+    end
+    object lblCurrentBlockTimeCaption: TLabel
+      Left = 88
+      Height = 13
+      Top = 24
+      Width = 89
+      Caption = 'Current Block age:'
+      ParentColor = False
+    end
+    object lblCurrentBlockTime: TLabel
+      Left = 200
+      Height = 13
+      Top = 24
+      Width = 81
+      Caption = '000 seconds ago'
+      ParentColor = False
+    end
+    object lblOperationsPendingCaption: TLabel
+      Left = 88
+      Height = 13
+      Top = 39
+      Width = 98
+      Caption = 'Pending Operations:'
+      ParentColor = False
+    end
+    object lblOperationsPending: TLabel
+      Left = 208
+      Height = 13
+      Top = 39
+      Width = 18
+      Caption = '000'
+      ParentColor = False
+    end
+    object lblMiningStatusCaption: TLabel
+      Left = 88
+      Height = 13
+      Top = 54
+      Width = 68
+      Caption = 'Miners clients:'
+      ParentColor = False
+    end
+    object lblMinersClients: TLabel
+      Left = 182
+      Height = 13
+      Top = 54
+      Width = 18
+      Caption = '000'
+      ParentColor = False
+    end
+    object lblCurrentDifficultyCaption: TLabel
+      Left = 427
+      Height = 13
+      Top = 9
+      Width = 76
+      Caption = 'Current Target:'
+      ParentColor = False
+    end
+    object lblCurrentDifficulty: TLabel
+      Left = 518
+      Height = 13
+      Top = 9
+      Width = 18
+      Caption = '000'
+      ParentColor = False
+    end
+    object lblTimeAverage: TLabel
+      Left = 368
+      Height = 13
+      Top = 24
+      Width = 18
+      Caption = '000'
+      ParentColor = False
+    end
+    object Label4: TLabel
+      Left = 283
+      Height = 13
+      Top = 24
+      Width = 69
+      Caption = 'Time average:'
+      ParentColor = False
+    end
+    object Label8: TLabel
+      Left = 88
+      Height = 13
+      Top = 68
+      Width = 63
+      Caption = 'Node Status:'
+      ParentColor = False
+    end
+    object lblNodeStatus: TLabel
+      Left = 168
+      Height = 13
+      Top = 68
+      Width = 15
+      Caption = '???'
+      ParentColor = False
+    end
+    object Label5: TLabel
+      Left = 283
+      Height = 13
+      Top = 9
+      Width = 48
+      Caption = 'Accounts:'
+      ParentColor = False
+    end
+    object lblCurrentAccounts: TLabel
+      Left = 344
+      Height = 13
+      Top = 9
+      Width = 18
+      Caption = '000'
+      ParentColor = False
+    end
+    object lblTimeAverageAux: TLabel
+      Left = 368
+      Height = 13
+      Top = 39
+      Width = 18
+      Caption = '000'
+      Font.Color = clGray
+      Font.Height = -11
+      Font.Name = 'Tahoma'
+      ParentColor = False
+      ParentFont = False
+    end
+    object Label16: TLabel
+      Left = 358
+      Height = 13
+      Top = 54
+      Width = 74
+      Caption = 'Blocks found:'
+      Font.Color = clWindowText
+      Font.Height = -11
+      Font.Name = 'Tahoma'
+      Font.Style = [fsBold]
+      ParentColor = False
+      ParentFont = False
+    end
+    object lblBlocksFound: TLabel
+      Left = 448
+      Height = 13
+      Hint = 'Blocks found while Miner is running...'
+      Top = 54
+      Width = 21
+      Caption = '000'
+      Font.Color = clWindowText
+      Font.Height = -11
+      Font.Name = 'Tahoma'
+      Font.Style = [fsBold]
+      ParentColor = False
+      ParentFont = False
+      ParentShowHint = False
+      ShowHint = True
+    end
+    object lblReceivedMessages: TLabel
+      Cursor = crHandPoint
+      Left = 358
+      Height = 23
+      Top = 64
+      Width = 185
+      Caption = 'Received messages'
+      Font.Color = clRed
+      Font.Height = -19
+      Font.Name = 'Tahoma'
+      Font.Style = [fsBold]
+      ParentColor = False
+      ParentFont = False
+      OnClick = lblReceivedMessagesClick
+    end
+    object lblBuild: TLabel
+      Left = 584
+      Height = 23
+      Top = 1
+      Width = 49
+      Caption = 'Build'
+      Font.Color = clWindowText
+      Font.Height = -19
+      Font.Name = 'Tahoma'
+      Font.Style = [fsBold]
+      ParentColor = False
+      ParentFont = False
+    end
+  end
+  object StatusBar: TStatusBar
+    Left = 0
+    Height = 23
+    Top = 457
+    Width = 837
+    Panels = <    
+      item
+        Alignment = taCenter
+        Text = 'Server Active'
+        Width = 130
+      end    
+      item
+        Text = 'Connection status'
+        Width = 430
+      end    
+      item
+        Text = 'Blocks'
+        Width = 50
+      end>
+    SimplePanel = False
+  end
+  object PageControl: TPageControl
+    Left = 0
+    Height = 366
+    Top = 91
+    Width = 837
+    ActivePage = tsBlockChain
+    Align = alClient
+    TabIndex = 2
+    TabOrder = 2
+    OnChange = PageControlChange
+    object tsMyAccounts: TTabSheet
+      Caption = 'Accounts Explorer'
+      ClientHeight = 361
+      ClientWidth = 833
+      object Splitter1: TSplitter
+        Left = 380
+        Height = 295
+        Top = 66
+        Width = 5
+      end
+      object pnlMyAccountsTop: TPanel
+        Left = 0
+        Height = 66
+        Top = 0
+        Width = 833
+        Align = alTop
+        ClientHeight = 66
+        ClientWidth = 833
+        TabOrder = 0
+        object Label18: TLabel
+          Left = 9
+          Height = 13
+          Top = 39
+          Width = 70
+          Caption = 'Find account'
+          ParentColor = False
+        end
+        object cbMyPrivateKeys: TComboBox
+          Left = 312
+          Height = 21
+          Top = 5
+          Width = 357
+          ItemHeight = 13
+          OnChange = cbMyPrivateKeysChange
+          Style = csDropDownList
+          TabOrder = 0
+        end
+        object cbExploreMyAccounts: TCheckBox
+          Left = 9
+          Height = 24
+          Top = 8
+          Width = 329
+          Caption = 'Explore accounts with one of my Wallet Keys'
+          OnClick = cbExploreMyAccountsClick
+          TabOrder = 1
+        end
+        object ebFindAccountNumber: TEdit
+          Left = 85
+          Height = 23
+          Top = 33
+          Width = 83
+          OnChange = ebFindAccountNumberChange
+          OnExit = ebFindAccountNumberExit
+          TabOrder = 3
+        end
+        object bbChangeKeyName: TBitBtn
+          Left = 683
+          Height = 25
+          Top = 3
+          Width = 126
+          Caption = 'Change Key name'
+          OnClick = bbChangeKeyNameClick
+          TabOrder = 2
+        end
+        object cbFilterAccounts: TCheckBox
+          Left = 258
+          Height = 24
+          Top = 34
+          Width = 173
+          Caption = 'Filter accounts by balance'
+          OnClick = cbFilterAccountsClick
+          TabOrder = 4
+        end
+        object ebFilterAccountByBalanceMin: TEdit
+          Left = 440
+          Height = 23
+          Hint = 'Min balance'
+          Top = 33
+          Width = 83
+          OnExit = ebFilterAccountByBalanceMinExit
+          OnKeyPress = ebFilterAccountByBalanceMinKeyPress
+          TabOrder = 5
+        end
+        object ebFilterAccountByBalanceMax: TEdit
+          Left = 531
+          Height = 23
+          Hint = 'Max balance'
+          Top = 33
+          Width = 83
+          OnExit = ebFilterAccountByBalanceMinExit
+          OnKeyPress = ebFilterAccountByBalanceMinKeyPress
+          TabOrder = 6
+        end
+      end
+      object pnlAccounts: TPanel
+        Left = 0
+        Height = 295
+        Top = 66
+        Width = 380
+        Align = alLeft
+        BevelOuter = bvNone
+        ClientHeight = 295
+        ClientWidth = 380
+        TabOrder = 1
+        object dgAccounts: TDrawGrid
+          Left = 0
+          Height = 261
+          Top = 0
+          Width = 380
+          Align = alLeft
+          ExtendedSelect = False
+          TabOrder = 0
+          TitleFont.Color = clWindowText
+          TitleFont.Height = -11
+          TitleFont.Name = 'Tahoma'
+          OnClick = dgAccountsClick
+        end
+        object pnlAccountsInfo: TPanel
+          Left = 0
+          Height = 34
+          Top = 261
+          Width = 380
+          Align = alBottom
+          BevelOuter = bvNone
+          ClientHeight = 34
+          ClientWidth = 380
+          TabOrder = 1
+          object Label17: TLabel
+            Left = 3
+            Height = 13
+            Top = 8
+            Width = 55
+            Caption = 'Accounts:'
+            ParentColor = False
+          end
+          object Label19: TLabel
+            Left = 118
+            Height = 13
+            Top = 8
+            Width = 104
+            Caption = 'Accounts Balance:'
+            ParentColor = False
+          end
+          object lblAccountsCount: TLabel
+            Left = 58
+            Height = 13
+            Top = 8
+            Width = 21
+            Caption = '000'
+            ParentColor = False
+          end
+          object lblAccountsBalance: TLabel
+            Left = 224
+            Height = 13
+            Top = 8
+            Width = 21
+            Caption = '000'
+            ParentColor = False
+          end
+          object bbAccountsRefresh: TBitBtn
+            Left = 300
+            Height = 25
+            Top = 4
+            Width = 75
+            Anchors = [akTop, akRight]
+            Caption = 'Refresh'
+            Glyph.Data = {
+              36030000424D3603000000000000360000002800000010000000100000000100
+              18000000000000030000120B0000120B00000000000000000000FF00FFFF00FF
+              C2A6A4C2A6A4C2A6A4C2A6A4C2A6A4C2A6A4C2A6A4C2A6A4C2A6A4C2A6A4C2A6
+              A4C2A6A4FF00FFFF00FFFF00FFFF00FFC2A6A4FEFCFBFEFCFBFEFCFBFEFCFBFE
+              FCFBFEFCFBFEFCFBFEFCFBFEFCFBFEFCFBC2A6A4FF00FFFF00FFFF00FFFF00FF
+              C2A6A4FEFCFBFEFCFBFEFCFBFEFCFBD8EBD6018A02018A02D8EBD6FEFCFBFEFC
+              FBC2A6A4FF00FFFF00FFFF00FFFF00FFC2A6A4FEFBF7FEFBF7018A02D8EAD201
+              8A02D8EAD2D8EAD2018A02FEFBF7FEFBF7C2A6A4FF00FFFF00FFFF00FFFF00FF
+              C2A6A4FEF9F4FEF9F4018A02018A02D8E8D0FEF9F4FEF9F4D8E8D0FEF9F4FEF9
+              F4C2A6A4FF00FFFF00FFFF00FFFF00FFC2A6A4FEF7F0FEF7F0018A02018A0201
+              8A02FEF7F0FEF7F0FEF7F0FEF7F0FEF7F0C2A6A4FF00FFFF00FFFF00FFFF00FF
+              C2A6A4FEF5ECFEF5ECFEF5ECFEF5ECFEF5EC018A02018A02018A02FEF5ECFEF5
+              ECC2A6A4FF00FFFF00FFFF00FFFF00FFC2A6A4FEF3E9FEF3E9D8E3C7FEF3E9FE
+              F3E9D8E3C7018A02018A02FEF3E9FEF3E9C2A6A4FF00FFFF00FFFF00FFFF00FF
+              C2A6A4FFF1E5FFF1E5018A02D9E2C3D9E2C3018A02D9E2C3018A02FFF1E5FFF1
+              E5C2A6A4FF00FFFF00FFFF00FFFF00FFC2A6A4FFF0E2FFF0E2D9E1C1018A0201
+              8A02D9E1C1DDCFC2DDCFC2DDCFC2DDCFC2C2A6A4FF00FFFF00FFFF00FFFF00FF
+              C2A6A4FFEEDEFFEEDEFFEEDEFFEEDEFFEEDEFFEEDEC5B5A9C3B4A8C2B3A7C1B2
+              A6C2A6A4FF00FFFF00FFFF00FFFF00FFC2A6A4FFECDAFFECDAFFECDAFFECDAFF
+              ECDAFFECDAB0A296B0A296B0A296B0A296C2A6A4FF00FFFF00FFFF00FFFF00FF
+              C2A6A4FFEAD7FFEAD7FFEAD7FFEAD7FFEAD7C9B9ACFBF8F4FBF8F4E6DAD9C2A6
+              A4FF00FFFF00FFFF00FFFF00FFFF00FFC2A6A4FFE8D3FFE8D3FFE8D3FFE8D3FF
+              E8D3C9B9ACFBF8F4DFCEC7C2A6A4FF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+              C2A6A4FFE6D0FFE6D0FFE6D0FFE6D0FFE6D0C9B9ACDFCEC7C2A6A4FF00FFFF00
+              FFFF00FFFF00FFFF00FFFF00FFFF00FFC2A6A4C2A6A4C2A6A4C2A6A4C2A6A4C2
+              A6A4C2A6A4C2A6A4FF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+            }
+            OnClick = bbAccountsRefreshClick
+            TabOrder = 0
+          end
+        end
+      end
+      object pcAccountsOptions: TPageControl
+        Left = 385
+        Height = 295
+        Top = 66
+        Width = 448
+        ActivePage = tsAccountOperations
+        Align = alClient
+        TabIndex = 0
+        TabOrder = 2
+        object tsAccountOperations: TTabSheet
+          Caption = 'Operations of selected Account'
+          ClientHeight = 268
+          ClientWidth = 444
+          object dgAccountOperations: TDrawGrid
+            Left = 0
+            Height = 268
+            Top = 0
+            Width = 444
+            Align = alClient
+            ExtendedSelect = False
+            TabOrder = 0
+            TitleFont.Color = clWindowText
+            TitleFont.Height = -11
+            TitleFont.Name = 'Tahoma'
+            OnDblClick = MiDecodePayloadClick
+          end
+        end
+        object tsMultiSelectAccounts: TTabSheet
+          Caption = 'Selected accounts for massive operations'
+          ClientHeight = 268
+          ClientWidth = 444
+          ImageIndex = 1
+          object dgSelectedAccounts: TDrawGrid
+            Left = 41
+            Height = 253
+            Top = 31
+            Width = 320
+            Align = alLeft
+            ExtendedSelect = False
+            TabOrder = 0
+            TitleFont.Color = clWindowText
+            TitleFont.Height = -11
+            TitleFont.Name = 'Tahoma'
+          end
+          object pnlSelectedAccountsTop: TPanel
+            Left = 0
+            Height = 31
+            Top = 0
+            Width = 450
+            Align = alTop
+            BevelOuter = bvNone
+            ClientHeight = 31
+            ClientWidth = 450
+            Font.Color = clWindowText
+            Font.Height = -13
+            Font.Name = 'Tahoma'
+            Font.Style = [fsBold]
+            ParentFont = False
+            TabOrder = 1
+            object Label15: TLabel
+              Left = 39
+              Height = 16
+              Top = 2
+              Width = 361
+              Caption = 'Select multiple accounts to execute massive operations'
+              ParentColor = False
+            end
+          end
+          object pnlSelectedAccountsBottom: TPanel
+            Left = 0
+            Height = 26
+            Top = 284
+            Width = 450
+            Align = alBottom
+            BevelOuter = bvNone
+            ClientHeight = 26
+            ClientWidth = 450
+            TabOrder = 2
+            object Label20: TLabel
+              Left = 39
+              Height = 13
+              Top = 4
+              Width = 48
+              Caption = 'Accounts:'
+              ParentColor = False
+            end
+            object lblSelectedAccountsCount: TLabel
+              Left = 94
+              Height = 13
+              Top = 4
+              Width = 18
+              Caption = '000'
+              ParentColor = False
+            end
+            object Label22: TLabel
+              Left = 154
+              Height = 13
+              Top = 4
+              Width = 88
+              Caption = 'Accounts Balance:'
+              ParentColor = False
+            end
+            object lblSelectedAccountsBalance: TLabel
+              Left = 248
+              Height = 13
+              Top = 4
+              Width = 18
+              Caption = '000'
+              ParentColor = False
+            end
+          end
+          object pnlSelectedAccountsLeft: TPanel
+            Left = 0
+            Height = 253
+            Top = 31
+            Width = 41
+            Align = alLeft
+            BevelOuter = bvNone
+            ClientHeight = 253
+            ClientWidth = 41
+            TabOrder = 3
+            object sbSelectedAccountsAdd: TSpeedButton
+              Left = 0
+              Height = 31
+              Top = 0
+              Width = 33
+              Caption = '>'
+              OnClick = sbSelectedAccountsAddClick
+            end
+            object sbSelectedAccountsAddAll: TSpeedButton
+              Left = 0
+              Height = 31
+              Top = 35
+              Width = 33
+              Caption = '>>'
+              OnClick = sbSelectedAccountsAddAllClick
+            end
+            object sbSelectedAccountsDel: TSpeedButton
+              Left = 0
+              Height = 31
+              Top = 72
+              Width = 33
+              Caption = '<'
+              OnClick = sbSelectedAccountsDelClick
+            end
+            object sbSelectedAccountsDelAll: TSpeedButton
+              Left = 0
+              Height = 31
+              Top = 109
+              Width = 33
+              Caption = '<<'
+              OnClick = sbSelectedAccountsDelAllClick
+            end
+          end
+          object bbSelectedAccountsOperation: TBitBtn
+            Left = 367
+            Height = 61
+            Top = 31
+            Width = 75
+            Caption = 'Operations'
+            Glyph.Data = {
+              F6060000424DF606000000000000360000002800000018000000180000000100
+              180000000000C0060000120B0000120B00000000000000000000FF00FFFF00FF
+              FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+              FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+              00FFFF00FFFF00FF019ACF019ACF019ACF019ACFFF00FFFF00FFFF00FFFF00FF
+              FF00FFFF00FFFF00FFFF00FFFF00FFFF00FF0C8518FF00FFFF00FFFF00FFFF00
+              FFFF00FFFF00FFFF00FFFF00FF0D9FD18BD4EE6BD3F845C0ED28B0E0019ACF01
+              9ACF019ACF019ACFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF0C85180C8518
+              FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF069CD076C8E5A9E9FE6DD8
+              FF75DBFF77DCFF77DBFF63D1F930B3E3029BD0019ACF019ACF019ACF019ACFFF
+              00FF0C85181399220C8518FF00FFFF00FFFF00FFFF00FFFF00FFFF00FF019ACF
+              34AFD9BCE9F86ED8FF6FD8FE70D8FE70D8FE71D8FF0C85180C85180C85180C85
+              180C85180C85180C85180C85181DAC31139A220C8518FF00FFFF00FFFF00FFFF
+              00FFFF00FF019ACF1FA9D68FD3EB97E4FF6FD9FE71D9FE71D9FE71D9FE0C8518
+              57E38851DD7E4AD77443D0693BC95E34C1522BBA4725B33C1EAE33149B230C85
+              18FF00FFFF00FFFF00FFFF00FF019ACF31B1DC49B7DEBDEEFB71DDFE77DEFE77
+              DEFE77DEFE0C85185EE89059E48953DE804CD87645D16C3DCA6035C2542DBB49
+              26B53F1FAF35149B250C8518FF00FFFF00FFFF00FF019ACF52C2E71DA7D5ADE2
+              F38FE8FF7CE2FE7CE3FE7CE3FE0C851861EB955FE9925AE58B54DF824DD97846
+              D26D3ECB6237C4562FBD4C27B64021B037159B250C8518FF00FFFF00FF019ACF
+              60CAEF1FA8D85EC1E1C2E6ED8ACEE08FCFE18ECFE10C851861EB9561EB955FEA
+              935CE58D56E0844FDB7A48D47040CD6538C65931BF4D1DA3320C8518FF00FFFF
+              00FFFF00FF019ACF65CFF53EB7E52CA9D4C5EFF8ACF3FEA5F2FFA5F2FF0C8518
+              61EB9561EB9561EB9561EB945CE68E57E18650DC7C49D57242CE6727AD410C85
+              18FF00FFFF00FFFF00FFFF00FF019ACF69D1F855C4F32A9CC673CBE7D6FEFDB1
+              FBFDB2FBFD0C85180C85180C85180C85180C85180C85180C85180C851852DD7F
+              32B6500C851898FAFF019ACFFF00FFFF00FFFF00FF019ACF77D5FC5CC8FB748E
+              A224A8D5B9E7F3D5F5F9D5F6F9D6F6FADCFAFBCDFDFCB9FCFCAFFAFCB0FAFCB1
+              FAFC0C85183ABE5C0C85189FFCFFA4FFFF43C1E2019ACFFF00FFFF00FF019ACF
+              8BDBFF5FCDFFB7898973C3DD18A2D218A2D216A2D215A1D21AA4D391D7EBEBFE
+              FDDBFDFCC5FBFBC2FBFB0C85180C851883E4F3B6FDFFBAFFFFB5FCFD019ACFFF
+              00FFFF00FF019ACF99E2FF67D3FFB88989FEF5ECFDF3EBF0EFEAE5EBE8D6E5E6
+              A4D2E025A6D34DB9DDE5F8FBF5FDFCEBFCFB0C8518C4FBFF9CE4F2DAFEFFD9FE
+              FFE3FFFFADE9F5019ACFFF00FF019ACF9FE9FF70DCFFB88989FEF3E9FFF2E6FE
+              F3E9FEF3E9FEF3E9FEF3E9D4E4E439ADD422A5D49DD8ECF1F9FBEEEFEFE9FDFF
+              CEEEF7F8FFFFF7FFFFFEFFFFE9F9FD019ACFFF00FF019ACFA7EFFF76E5FFB889
+              89FFF2E5FFF0E2FFF2E5FFF2E5FFF2E5FFF2E5FFF2E5EAEBE38EC9DA44B0D501
+              9ACF019ACF019ACF019ACF019ACF019ACF019ACF019ACF019ACFFF00FF019ACF
+              ABF6FF7EEDFFB88989FFF0E2FFEFDFFFF0E2FFF0E2FFF0E2FFF0E2FFF0E2FEEE
+              E0FBECDEFAEBDEF6E6D9B8898993F7FF019ACFFF00FFFF00FFFF00FFFF00FFFF
+              00FFFF00FF019ACFC7FFFF82F5FFB88989FFEEDFFFECDBFFEEDFFFEEDFFFEEDF
+              FFEEDFF9E8D9DECCC1D9CABDCFBDB4C8B3ACB88989B5FFFF019ACFFF00FFFF00
+              FFFF00FFFF00FFFF00FFFF00FF019ACFA4E0F0A0FDFFB88989FFECDBFFEBD8FF
+              ECDBFFECDBFFECDBFFECDBF5E2D2C4ABA7C2A8A5BBA39FC2AFA9B88989019ACF
+              FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF019ACFECFFFFB889
+              89FFEBD8FFEAD5FFEBD8FFEBD8FFEBD8FFEBD8FFEBD8D9C8C5FEFEFDFEF6EFDE
+              C9C0B88989FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+              FF00FF019ACFB88989FFE9D5FFE8D3FFE9D5FFE9D5FFE9D5FFE9D5FFE9D5C6AD
+              A9FEF8F2E8D4CACD9999FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+              00FFFF00FFFF00FFFF00FFFF00FFB88989FFE7D1FFE7D0FFE7D1FFE7D1FFE7D1
+              FFE7D1E7CEBFD3BFB9E8D5CCCD9999FF00FFFF00FFFF00FFFF00FFFF00FFFF00
+              FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFB88989FFE6CFFFE6CFFF
+              E6CFFFE6CFFFE6CFFFE6CFD5BBB2E0CCC5CD9999FF00FFFF00FFFF00FFFF00FF
+              FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFB889
+              89B88989B88989B88989B88989B88989B88989B88989B88989FF00FFFF00FFFF
+              00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+            }
+            Layout = blGlyphTop
+            OnClick = bbSelectedAccountsOperationClick
+            TabOrder = 4
+          end
+        end
+      end
+    end
+    object tsPendingOperations: TTabSheet
+      Caption = 'Pending Operations'
+      ClientHeight = 340
+      ClientWidth = 829
+      ImageIndex = 5
+      object dgPendingOperations: TDrawGrid
+        Left = 0
+        Height = 254
+        Top = 86
+        Width = 829
+        Align = alClient
+        ExtendedSelect = False
+        TabOrder = 0
+        TitleFont.Color = clWindowText
+        TitleFont.Height = -11
+        TitleFont.Name = 'Tahoma'
+        OnDblClick = MiDecodePayloadClick
+      end
+      object pnlPendingOperations: TPanel
+        Left = 0
+        Height = 86
+        Top = 0
+        Width = 829
+        Align = alTop
+        BevelOuter = bvNone
+        BorderWidth = 10
+        ClientHeight = 86
+        ClientWidth = 829
+        TabOrder = 1
+        object Label10: TLabel
+          Left = 10
+          Height = 66
+          Top = 10
+          Width = 809
+          Align = alClient
+          AutoSize = False
+          Caption = 'Here you can see Operations transmited/received from other nodes that will be included in next block. There is no guarantee that other nodes will include them when mining, so it''s important that you mine too to help include Operations to the main BlockChain'
+          Font.Color = clWindowText
+          Font.Height = -16
+          Font.Name = 'Tahoma'
+          ParentColor = False
+          ParentFont = False
+          WordWrap = True
+        end
+      end
+    end
+    object tsBlockChain: TTabSheet
+      Caption = 'BlockChain Explorer'
+      ClientHeight = 340
+      ClientWidth = 829
+      ImageIndex = 1
+      object Panel2: TPanel
+        Left = 0
+        Height = 41
+        Top = 0
+        Width = 829
+        Align = alTop
+        ClientHeight = 41
+        ClientWidth = 829
+        TabOrder = 0
+        object Label9: TLabel
+          Left = 9
+          Height = 13
+          Top = 8
+          Width = 102
+          Caption = 'Filter by blocks range'
+          ParentColor = False
+        end
+        object ebBlockChainBlockStart: TEdit
+          Left = 152
+          Height = 21
+          Top = 5
+          Width = 87
+          OnExit = ebBlockChainBlockStartExit
+          OnKeyPress = ebBlockChainBlockStartKeyPress
+          TabOrder = 0
+        end
+        object ebBlockChainBlockEnd: TEdit
+          Left = 248
+          Height = 21
+          Top = 5
+          Width = 87
+          OnExit = ebBlockChainBlockStartExit
+          OnKeyPress = ebBlockChainBlockStartKeyPress
+          TabOrder = 1
+        end
+      end
+      object dgBlockChainExplorer: TDrawGrid
+        Left = 0
+        Height = 299
+        Top = 41
+        Width = 829
+        Align = alClient
+        ExtendedSelect = False
+        TabOrder = 1
+        TitleFont.Color = clWindowText
+        TitleFont.Height = -11
+        TitleFont.Name = 'Tahoma'
+      end
+    end
+    object tsOperations: TTabSheet
+      Caption = 'Operations Explorer'
+      ClientHeight = 361
+      ClientWidth = 833
+      ImageIndex = 1
+      object Panel1: TPanel
+        Left = 0
+        Height = 41
+        Top = 0
+        Width = 833
+        Align = alTop
+        ClientHeight = 41
+        ClientWidth = 833
+        TabOrder = 0
+        object Label2: TLabel
+          Left = 9
+          Height = 13
+          Top = 8
+          Width = 121
+          Caption = 'Filter by blocks range'
+          ParentColor = False
+        end
+        object ebFilterOperationsStartBlock: TEdit
+          Left = 152
+          Height = 23
+          Top = 5
+          Width = 87
+          OnExit = ebFilterOperationsAccountExit
+          OnKeyPress = ebFilterOperationsAccountKeyPress
+          TabOrder = 0
+        end
+        object ebFilterOperationsEndBlock: TEdit
+          Left = 248
+          Height = 23
+          Top = 5
+          Width = 87
+          OnExit = ebFilterOperationsAccountExit
+          OnKeyPress = ebFilterOperationsAccountKeyPress
+          TabOrder = 1
+        end
+      end
+      object dgOperationsExplorer: TDrawGrid
+        Left = 0
+        Height = 320
+        Top = 41
+        Width = 833
+        Align = alClient
+        ExtendedSelect = False
+        TabOrder = 1
+        TitleFont.Color = clWindowText
+        TitleFont.Height = -11
+        TitleFont.Name = 'Tahoma'
+      end
+    end
+    object tsLogs: TTabSheet
+      Caption = 'Logs'
+      ClientHeight = 361
+      ClientWidth = 833
+      ImageIndex = 2
+      object pnlTopLogs: TPanel
+        Left = 0
+        Height = 41
+        Top = 0
+        Width = 833
+        Align = alTop
+        ClientHeight = 41
+        ClientWidth = 833
+        TabOrder = 0
+        object cbShowDebugLogs: TCheckBox
+          Left = 13
+          Height = 24
+          Top = 8
+          Width = 145
+          Caption = 'Show Debug logs'
+          TabOrder = 0
+        end
+      end
+      object memoLogs: TMemo
+        Left = 0
+        Height = 320
+        Top = 41
+        Width = 833
+        Align = alClient
+        ScrollBars = ssBoth
+        TabOrder = 1
+      end
+    end
+    object tsNodeStats: TTabSheet
+      Caption = 'Node Stats'
+      ClientHeight = 361
+      ClientWidth = 833
+      ImageIndex = 3
+      object Label3: TLabel
+        Left = 15
+        Height = 13
+        Top = 15
+        Width = 207
+        Caption = 'Active Net Connections of this Node:'
+        ParentColor = False
+      end
+      object Label6: TLabel
+        Left = 16
+        Height = 13
+        Top = 204
+        Width = 202
+        Anchors = [akLeft, akBottom]
+        Caption = 'Available or possible Node Servers:'
+        ParentColor = False
+      end
+      object Label7: TLabel
+        Left = 16
+        Height = 13
+        Top = 100
+        Width = 103
+        Anchors = [akLeft, akBottom]
+        Caption = 'BlackList of Nodes'
+        ParentColor = False
+      end
+      object memoNetConnections: TMemo
+        Left = 15
+        Height = 58
+        Top = 34
+        Width = 798
+        Anchors = [akTop, akLeft, akRight, akBottom]
+        ReadOnly = True
+        ScrollBars = ssVertical
+        TabOrder = 0
+      end
+      object memoNetServers: TMemo
+        Left = 16
+        Height = 116
+        Top = 223
+        Width = 798
+        Anchors = [akLeft, akRight, akBottom]
+        ReadOnly = True
+        ScrollBars = ssVertical
+        TabOrder = 1
+      end
+      object memoNetBlackLists: TMemo
+        Left = 16
+        Height = 79
+        Top = 119
+        Width = 798
+        Anchors = [akLeft, akRight, akBottom]
+        ReadOnly = True
+        ScrollBars = ssVertical
+        TabOrder = 2
+      end
+    end
+    object tsMessages: TTabSheet
+      Caption = 'Messages'
+      ClientHeight = 361
+      ClientWidth = 833
+      ImageIndex = 6
+      object Label11: TLabel
+        Left = 15
+        Height = 13
+        Top = 151
+        Width = 59
+        Caption = 'Messages:'
+        ParentColor = False
+      end
+      object Label12: TLabel
+        Left = 315
+        Height = 13
+        Top = 11
+        Width = 99
+        Caption = 'Message to send:'
+        ParentColor = False
+      end
+      object Label13: TLabel
+        Left = 15
+        Height = 13
+        Top = 11
+        Width = 126
+        Caption = 'Available connections:'
+        ParentColor = False
+      end
+      object Label14: TLabel
+        Left = 410
+        Height = 13
+        Top = 11
+        Width = 430
+        Caption = '(Messages will be encrypted, so only dest connection will be able to read it)'
+        Font.Color = clGrayText
+        Font.Height = -11
+        Font.Name = 'Tahoma'
+        ParentColor = False
+        ParentFont = False
+      end
+      object lbNetConnections: TListBox
+        Left = 15
+        Height = 96
+        Top = 30
+        Width = 275
+        ItemHeight = 0
+        MultiSelect = True
+        ScrollWidth = 273
+        TabOrder = 0
+      end
+      object bbSendAMessage: TButton
+        Left = 315
+        Height = 25
+        Top = 101
+        Width = 381
+        Caption = 'Send a Message'
+        OnClick = bbSendAMessageClick
+        TabOrder = 1
+      end
+      object memoMessages: TMemo
+        Left = 15
+        Height = 170
+        Top = 170
+        Width = 804
+        Anchors = [akTop, akLeft, akRight, akBottom]
+        Font.Color = clWindowText
+        Font.Height = -16
+        Font.Name = 'Tahoma'
+        Lines.Strings = (
+          'dsfa ñldsaf ñlk dasf'
+          'dsfkldañfs ñl'
+        )
+        ParentFont = False
+        ReadOnly = True
+        ScrollBars = ssBoth
+        TabOrder = 2
+      end
+      object memoMessageToSend: TMemo
+        Left = 315
+        Height = 61
+        Top = 30
+        Width = 381
+        Lines.Strings = (
+          'memoMessageToSend'
+        )
+        TabOrder = 3
+        WantReturns = False
+      end
+    end
+  end
+  object TrayIcon: TTrayIcon
+    Icon.Data = {
+      3E3E00000000010001003E3E000001002000283E000016000000280000003E00
+      00007C0000000100200000000000103C00006400000064000000000000000000
+      0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000
+      001F00000067000000A2000000C8000000E2000000EF000000F5000000F90000
+      00F8000000F2000000EB000000DF000000C8000000A5000000640000001C0000
+      0002FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF00000000330000009E000000DF020406DA1B2F43C02C4D
+      6DC0477DB2D060A8F0F166B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF60A8F0F1477DB2D0355D85C31B2F43C004080BD6000000EE000000B90000
+      0045FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000017000000750000
+      00D805080CD6355D85C3589BDDE466B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF60A8F0F1345C83C30D1721C7000000EC0000
+      008700000019FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00000000110000007D000000EC142231C2589BDDE466B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF589BDDE4233D57BF010203DF0000
+      008B0000001DFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00000000500000
+      00E7142231C3589BDDE466B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF60A8F0F1233D57BF000000E00000
+      006A0000000EFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF0000000022000000B705080CD5508CC8D966B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF589BDDE4090F16CE000000B70000
+      0013FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00000000020000
+      0045000000D1233D57BF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF2B4C6CC0010203E400000049FFFF
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000065010102EB477DB2D066B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF508CC8D9060B0FCC0000006B00000006FFFF
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF0000000068060A0ECF508CC8D966B3FFFF66B3FFFF66B3FFFF60A8
+      EFFF4C86BFFF4C86BFFF4C86BFFF4C86BFFF4C86BFFF4C86BFFF4C86BFFF599D
+      DFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF60A8F0F105080CD600000080FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00000000820508
+      0CD660A8F0F166B3FFFF66B3FFFF66B3FFFF66B3FFFF60A8EFFF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF192C3FFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF60A8F0F105090DD300000068FFFFFF00FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF00FFFFFF000000005405080CD660A8F0F166B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF060B0FFF000000FF000000FF0000
+      00FF000000FF000000FF000000FF060B0FFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF60A8F0F105090DD20000007400000003FFFFFF00FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+      FF0000000039010203DA508CC8D966B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF192C3FFF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF60A8EFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF60A8
+      F0F105080CD50000004EFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000011000000E5477D
+      B2D066B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF33597FFF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF4C86BFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF508CC8D90203
+      04CD00000026FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF000000000A000000AB223C56BF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF40709FFF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF39648FFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF355D85C3000000B7FFFF
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+      FF000000005E090F16CE66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF4C86BFFF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF26435FFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF090F16CE0000005FFFFFFF00FFFF
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000001D000000DE508C
+      C8D966B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF192C3FFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF589BDDE4000000EB00000018FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF00FFFFFF000000008B142231C366B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF13212FFF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF67B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF233D57BF00000080FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+      FF000000000D000000EF589BDDE466B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF2037
+      4FFF000000FF000000FF000000FF000000FF000000FF000000FF000000FF60A0
+      DFFF6EB7FFFF6EB7FFFF6DB6FFFF6BB5FFFF69B4FFFF67B4FFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF60A8
+      F0F1010203DB0000001EFFFFFF00FFFFFF00FFFFFF00FFFFFF00000000791422
+      31C366B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF345A7FFF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF5180AFFF76BBFFFF76BB
+      FFFF74BAFFFF73B9FFFF71B8FFFF6EB7FFFF6BB6FFFF68B4FFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF233D57BF0000
+      0084FFFFFF00FFFFFF00FFFFFF0000000004000000EA589BDDE466B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF68B4FFFF6BB6FFFF4C7EAFFF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF3F5F7FFF7EBFFFFF7DBFFFFF7CBEFFFF6BA5
+      DFFF5B8DBFFF6098CFFF73BAFFFF70B8FFFF65ABEFFF4E87BFFF4C86BFFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF589BDDE4000000DF0000000AFFFF
+      FF00FFFFFF000000004A04080BD666B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF6AB5FFFF6EB7
+      FFFF73B9FFFF67A4DFFF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF2A3C4FFF86C3FFFF85C2FFFF84C2FFFF496C8FFF000000FF1723
+      2FFF7ABDFFFF77BBFFFF568BBFFF000000FF000000FF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF0E1822C70000004AFFFFFF00FFFFFF000000
+      00B1345C83C366B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF6BB5FFFF70B8FFFF75BAFFFF79BDFFFF7DBF
+      FFFF000000FF000000FF000000FF000000FF000000FF000000FF000000FF1A25
+      2FFF8EC7FFFF8DC6FFFF8CC6FFFF6794BFFF000000FF000000FF82C1FFFF7EBF
+      FFFF7ABDFFFF000000FF000000FF5088BFFF67B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF355D85C3000000ADFFFFFF0000000008000000EE589BDDE466B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF6BB6FFFF71B8FFFF76BBFFFF7BBDFFFF80C0FFFF84C2FFFF22303FFF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF96CBFFFF95CA
+      FFFF94CAFFFF89BCEFFF000000FF000000FF6F9FCFFF85C2FFFF80C0FFFF0F17
+      1FFF000000FF46739FFF6CB6FFFF67B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF60A8
+      F0F1000000EAFFFFFF0000000032020405E066B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF6BB6FFFF71B8FFFF77BB
+      FFFF7CBEFFFF82C1FFFF86C3FFFF8BC5FFFF354A5FFF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF769BBFFF9DCEFFFF9BCEFFFF99CC
+      FFFF090C0FFF000000FF6289AFFF8BC5FFFF87C3FFFF20303FFF000000FF3B5E
+      7FFF72B9FFFF6CB6FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF05080CD50000
+      00250000007E1B2F43C066B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF6AB5FFFF70B8FFFF76BBFFFF7CBEFFFF82C1FFFF88C4
+      FFFF8CC6FFFF91C8FFFF54728FFF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF68849FFFA5D2FFFFA3D1FFFFA1D0FFFF27333FFF0000
+      00FF4B657FFF92C9FFFF8DC6FFFF44627FFF000000FF1F2F3FFF77BCFFFF71B8
+      FFFF6BB5FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF1B2F43C000000075000000B6355D
+      85C366B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF68B4
+      FFFF6EB7FFFF75BAFFFF7CBEFFFF82C1FFFF88C4FFFF8EC7FFFF92C9FFFF98CC
+      FFFF769ABFFF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF151A1FFF2B353FFF2A353FFF2A343FFF11161BFF000000FF0C1014FF2632
+      3FFF24323FFF161E27FF000000FF040608FF1F2F3FFF33516FFF3F678FFF5592
+      CFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF3E6E9CC8000000B3000000D4477DB2D066B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF6CB6FFFF73BAFFFF7ABD
+      FFFF80C0FFFF86C3FFFF8DC6FFFF93C9FFFF98CCFFFF9ECFFFFF99C4EFFF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF0C161FFF3359
+      7FFF60A8EFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF477DB2D0000000D0000000E960A8F0F166B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF69B4FFFF70B8FFFF77BBFFFF7EBFFFFF85C2FFFF8BC5
+      FFFF92C9FFFF98CCFFFF9ECFFFFFA4D2FFFFA9D4FFFF0A0D0FFF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF060B0FFF3359
+      7FFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF0000
+      00E4000000F766B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF6CB6FFFF73BAFFFF7ABDFFFF82C1FFFF89C4FFFF8FC8FFFF96CBFFFF9DCE
+      FFFFA3D1FFFFA9D4FFFFAFD7FFFF2D363FFF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF13212FFF599D
+      DFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF000000F0000000FB66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF67B4FFFF6FB7FFFF76BB
+      FFFF7EBFFFFF85C2FFFF8CC6FFFF94CAFFFF9ACDFFFFA1D1FFFFA8D4FFFFAFD7
+      FFFFB5DAFFFF5D6E7FFF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF060B0FFF5391CFFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF000000FA000000FE66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF6AB5FFFF71B9FFFF79BDFFFF80C0FFFF88C4
+      FFFF8FC8FFFF97CBFFFF9ECFFFFFA5D2FFFFACD6FFFFB3D9FFFFB9DCFFFF788C
+      9FFF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF060B0FFF5391CFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF000000FC000000FE66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF6CB6FFFF74BAFFFF7CBEFFFF83C1FFFF8BC5FFFF92C9FFFF9ACD
+      FFFFA1D1FFFFA9D4FFFFB0D8FFFFB7DBFFFFBEDFFFFF94A9BFFF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF0C161FFF60A8EFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF0000
+      00FC000000FD66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF6DB7
+      FFFF75BAFFFF7DBEFFFF85C2FFFF8CC6FFFF94CAFFFF9CCEFFFFA4D2FFFFACD6
+      FFFFB3D9FFFFBADDFFFFC2E1FFFFC9E4FFFF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF383B3FFFDDEEFFFFD7EBFFFFD0E8FFFF7180
+      8FFF000000FF22292FFFB4DAFFFFACD6FFFF7B9DBFFF000000FF000000FF597C
+      9FFF21303FFF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF20374FFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF000000F9000000F966B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF67B3FFFF6FB7FFFF77BBFFFF7FBF
+      FFFF86C3FFFF8EC7FFFF96CBFFFF9ECFFFFFA6D3FFFFADD6FFFFB5DAFFFFBDDE
+      FFFFC4E2FFFFCCE6FFFF272B2FFF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FFE2F1FFFFDCEDFFFFD4EAFFFF9AACBFFF000000FF0000
+      00FFB6DBFFFFAFD7FFFFA7D3FFFF000000FF000000FF6B95BFFF87C3FFFF5784
+      AFFF070B0FFF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF4C86BFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF000000F1000000F166B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF68B4FFFF70B8FFFF77BCFFFF7FC0FFFF87C3FFFF8FC8
+      FFFF97CBFFFF9FCFFFFFA7D3FFFFAFD7FFFFB6DBFFFFBFDFFFFFC7E3FFFFCEE7
+      FFFF42494FFF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FFC9D4DFFFDFEFFFFFD7EBFFFFC2D9EFFF000000FF000000FF95B3CFFFB0D8
+      FFFFA8D4FFFF13191FFF000000FF5A7D9FFF88C4FFFF80C0FFFF6199CFFF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF2037
+      4FFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF60A8F0F1000000E9000000E0477DB2D066B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF68B4FFFF70B8FFFF78BCFFFF80C0FFFF88C4FFFF8FC8FFFF97CBFFFFA0D0
+      FFFFA7D3FFFFAFD7FFFFB8DCFFFFBFDFFFFFC7E3FFFFCFE7FFFF6B757FFF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF9FA7AFFFE0F0
+      FFFFD8ECFFFFD0E8FFFF0C0D0FFF000000FF7E97AFFFB0D8FFFFA9D4FFFF2833
+      3FFF000000FF48647FFF89C4FFFF80C0FFFF79BCFFFF3F678FFF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF599DDFFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF477DB2D00000
+      00D3000000C63E6D9BC866B3FFFF66B3FFFF66B3FFFF66B3FFFF68B4FFFF70B8
+      FFFF77BCFFFF80C0FFFF88C4FFFF8FC8FFFF97CBFFFF9FCFFFFFA7D3FFFFAFD7
+      FFFFB7DBFFFFBFDFFFFFC7E3FFFFCFE7FFFF94A1AFFF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF73797FFFDFEFFFFFD7EBFFFFD0E7
+      FFFF31383FFF000000FF5C6E7FFFB0D8FFFFA8D4FFFF50687FFF000000FF2431
+      3FFF88C4FFFF80C0FFFF79BCFFFF71B8FFFF060B0FFF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF40709FFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF345C83C3000000AE0000008D1B2F
+      43C066B3FFFF66B3FFFF66B3FFFF66B3FFFF67B4FFFF6FB7FFFF77BBFFFF7FC0
+      FFFF87C3FFFF8FC7FFFF97CBFFFF9ECFFFFFA6D3FFFFAED7FFFFB6DBFFFFBEDF
+      FFFFC5E2FFFFCDE6FFFFB9CDDFFF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF474B4FFFDDEEFFFFD6EAFFFFCEE7FFFF57636FFF0000
+      00FF39444FFFAFD7FFFFA7D3FFFF64829FFF000000FF11181FFF88C4FFFF80C0
+      FFFF78BCFFFF70B8FFFF27435FFF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF26435FFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF1B2F43C0000000770000003404080BD766B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF6EB7FFFF76BBFFFF7EBFFFFF86C3FFFF8EC7
+      FFFF95CBFFFF9DCEFFFFA5D2FFFFACD6FFFFB4DAFFFFBCDEFFFFC3E1FFFFCAE5
+      FFFFD1E8FFFF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF292C2FFFD9ECFFFFD2E9FFFFCBE5FFFF6E7F8FFF000000FF21282FFFADD6
+      FFFFA6D3FFFF769BBFFF000000FF000000FF86C3FFFF7FBFFFFF77BBFFFF6FB7
+      FFFF3A658FFF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF192C3FFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF020405E10000002300000003000000F660A8F0F166B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF6DB6FFFF74BAFFFF7CBEFFFF84C2FFFF8CC6FFFF93C9FFFF9BCD
+      FFFFA3D1FFFFAAD5FFFFB2D9FFFFB9DCFFFFC0E0FFFFC7E3FFFFCDE6FFFF343A
+      3FFF000000FF000000FF000000FF000000FF000000FF000000FF000000FFD4EA
+      FFFFCEE7FFFFC7E3FFFF91A8BFFF000000FF000000FFABD5FFFFA3D1FFFF9CCE
+      FFFF000000FF000000FF6491BFFF7DBEFFFF76BBFFFF6EB7FFFF467BAFFF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF589BDDE4000000ED0000
+      0002FFFFFF00000000C6345C83C366B3FFFF66B3FFFF66B3FFFF66B3FFFF6BB5
+      FFFF73B9FFFF7ABDFFFF82C1FFFF89C5FFFF91C8FFFF98CCFFFFA0D0FFFFA7D3
+      FFFFAED7FFFFB5DAFFFFBCDEFFFFC2E1FFFFC8E4FFFF4C565FFF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF9AADBFFFC8E4FFFFC3E1
+      FFFFB0D0EFFF000000FF000000FF88ABCFFFA0D0FFFF99CCFFFF12181FFF0000
+      00FF52789FFF7BBDFFFF73BAFFFF6CB6FFFF33597FFF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF345C83C3000000A4FFFFFF00FFFFFF000000
+      00560D1721C766B3FFFF66B3FFFF66B3FFFF66B3FFFF68B4FFFF70B8FFFF77BC
+      FFFF7FC0FFFF86C3FFFF8EC7FFFF95CAFFFF9CCEFFFFA3D1FFFFAAD5FFFFB0D8
+      FFFFB7DBFFFFBDDEFFFFC2E1FFFF707F8FFF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF7D8E9FFFC3E1FFFFBEDFFFFFB8DCFFFF0A0D
+      0FFF000000FF7190AFFF9DCEFFFF96CBFFFF23313FFF000000FF40607FFF79BC
+      FFFF71B8FFFF6AB5FFFF0C161FFF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF060B0FFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF04080BD600000039FFFFFF00FFFFFF00FFFFFF00000000F2589B
+      DDE466B3FFFF66B3FFFF66B3FFFF66B3FFFF6DB7FFFF75BAFFFF7CBEFFFF83C2
+      FFFF8BC5FFFF91C8FFFF98CCFFFF9FCFFFFFA6D3FFFFACD6FFFFB2D9FFFFB7DB
+      FFFFBCDEFFFF91A8BFFF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF60707FFFBCDEFFFFB8DCFFFFB2D9FFFF2A353FFF000000FF5068
+      7FFF99CCFFFF92C9FFFF45627FFF000000FF1F2F3FFF76BBFFFF6EB7FFFF2D4E
+      6FFF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF192C3FFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF589BDDE40000
+      00E6FFFFFF00FFFFFF00FFFFFF00FFFFFF000000009D233D57BF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF6AB5FFFF71B9FFFF79BCFFFF80C0FFFF86C3FFFF8EC7
+      FFFF94CAFFFF9ACDFFFFA0D0FFFFA6D3FFFFACD6FFFFB1D8FFFFB6DBFFFFADCE
+      EFFF000000FF000000FF000000FF000000FF000000FF000000FF000000FF2E37
+      3FFFB6DBFFFFB2D9FFFFADD6FFFF495C6FFF000000FF30404FFF95CAFFFF8EC7
+      FFFF557A9FFF000000FF0E151DFF4F7FAFFF1A2D3FFF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF2C4E6FFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF142231C300000080FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF0000000022010203E460A8F0F166B3FFFF66B3FFFF66B3
+      FFFF67B3FFFF6EB7FFFF75BAFFFF7CBEFFFF82C1FFFF89C4FFFF8FC8FFFF95CB
+      FFFF9BCDFFFFA1D0FFFFA6D3FFFFAAD5FFFFAFD7FFFFB2D9FFFF0B0D0FFF0000
+      00FF000000FF000000FF000000FF000000FF000000FF0B0D0FFF2B353FFF2A35
+      3FFF29343FFF161D23FF000000FF070A0CFF24313FFF22313FFF121A23FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF599DDFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF589BDDE4000000E800000017FFFFFF00FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00000000AA233D57BF66B3FFFF66B3FFFF66B3FFFF66B3FFFF6AB5
+      FFFF71B8FFFF77BCFFFF7EBFFFFF84C2FFFF8AC5FFFF90C8FFFF95CBFFFF9BCD
+      FFFFA0D0FFFFA4D2FFFFA8D4FFFFABD5FFFF2B353FFF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF20374FFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF1422
+      31C200000083FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000
+      002E000000E8589BDDE466B3FFFF66B3FFFF66B3FFFF66B3FFFF6CB6FFFF73B9
+      FFFF79BCFFFF7FBFFFFF85C2FFFF8AC5FFFF8FC8FFFF94CAFFFF99CCFFFF9DCE
+      FFFFA1D0FFFFA4D2FFFF53697FFF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF060B0FFF599D
+      DFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF508CC8D9000000D800000017FFFF
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000080090F
+      16CE66B3FFFF66B3FFFF66B3FFFF66B3FFFF67B4FFFF6EB7FFFF74BAFFFF79BD
+      FFFF7FC0FFFF84C2FFFF89C5FFFF8EC7FFFF92C9FFFF96CBFFFF9ACDFFFF9DCE
+      FFFF63819FFF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF4C86BFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF090F16CE00000062FFFFFF00FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000E000000CA2B4C6CC066B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF68B4FFFF6EB7FFFF74BAFFFF79BDFFFF7EBF
+      FFFF83C1FFFF87C3FFFF8BC5FFFF8FC7FFFF92C9FFFF95CAFFFF7198BFFF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF0C161FFF5391CFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF223C
+      56BF000000AF00000009FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF00FFFFFF0000000025010203DF508CC8D966B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF68B4FFFF6EB7FFFF73BAFFFF78BCFFFF7CBEFFFF80C0
+      FFFF84C2FFFF88C4FFFF8BC5FFFF8DC6FFFF8FC8FFFF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF13212FFF40709FFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF477DB2D0000000DD0000000CFFFF
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF0000000055060A0ECE60A8F0F166B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF68B4FFFF6DB6FFFF71B9FFFF76BBFFFF7ABDFFFF7DBFFFFF80C0
+      FFFF83C2FFFF86C3FFFF88C4FFFF33495FFF22313FFF22313FFF22313FFF2230
+      3FFF22303FFF21303FFF20303FFF202F3FFF1F2F3FFF1E2F3FFF101A23FF0000
+      00FF05090CFF1A2C3FFF192C3FFF13212FFF000000FF000000FF33597FFF3359
+      7FFF467BAFFF599DDFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF508CC8D9010203DD00000043FFFFFF00FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF000000007A04080BD660A8F0F166B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF6BB5FFFF6FB7FFFF73B9FFFF76BBFFFF79BDFFFF7CBEFFFF7EBF
+      FFFF80C0FFFF81C0FFFF82C1FFFF82C1FFFF82C1FFFF81C0FFFF80C0FFFF7EBF
+      FFFF7CBEFFFF79BDFFFF76BBFFFF73BAFFFF5389BFFF000000FF000000FF66B3
+      FFFF66B3FFFF66B3FFFF000000FF000000FF4C86BFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF60A8F0F10508
+      0CD50000005FFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000
+      00090000009705080CD560A8F0F166B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF68B4FFFF6BB6FFFF6FB7FFFF71B9FFFF74BAFFFF76BBFFFF78BCFFFF79BD
+      FFFF7ABDFFFF7ABDFFFF7ABDFFFF79BDFFFF78BCFFFF76BBFFFF74BAFFFF72B9
+      FFFF6FB7FFFF6CB6FFFF61A9EFFF000000FF000000FF5391CFFF66B3FFFF66B3
+      FFFF0C161FFF000000FF40709FFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF60A8F0F105090DD30000008000000006FFFF
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000
+      008B04080BD660A8F0F166B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF67B4FFFF6AB5FFFF6DB6FFFF6EB7FFFF70B8FFFF71B8FFFF72B9FFFF72B9
+      FFFF72B9FFFF71B9FFFF70B8FFFF6EB7FFFF6DB6FFFF6AB5FFFF68B4FFFF66B3
+      FFFF66B3FFFF060B0FFF000000FF467BAFFF66B3FFFF66B3FFFF192C3FFF0000
+      00FF33597FFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF508CC8D905080CD600000068FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00000000080000007E0509
+      0DD3508CC8D966B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF67B3FFFF68B4FFFF69B4FFFF6AB5FFFF6AB5FFFF6AB5FFFF6AB5
+      FFFF68B4FFFF67B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF192C
+      3FFF000000FF33597FFF66B3FFFF66B3FFFF33597FFF000000FF192C3FFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF477DB2D0010203E60000
+      0068FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000055010203DA345C
+      83C366B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF5391CFFF4C86BFFF599D
+      DFFF66B3FFFF66B3FFFF599DDFFF4C86BFFF5391CFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF223C56BF000000DB00000043FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000002F000000D8080E14CE589B
+      DDE466B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF508CC8D9090F
+      16CE000000AA00000015FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF00FFFFFF000000001100000086000000EE233D57BF60A8
+      F0F166B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF589BDDE4142231C2000000E500000066FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF00FFFFFF0000000028000000A2010203DF233D57BF589B
+      DDE466B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF589BDDE41422
+      31C2000000E0000000840000001DFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF00FFFFFF00000000260000009C000000ED0D1721C7345C
+      83C360A8F0F166B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF589BDDE4355D85C304080BD6000000DF000000840000001EFFFF
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000050000000BF000000F10408
+      0BD71B2F43C0345C83C3477DB2D066B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF60A8F0F1477DB2D0355D85C31B2F43C0020405E00000
+      00E9000000B200000045FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000002E0000008B0000
+      00C6000000E1000000F2000000F9000000FB000000FD000000FC000000FB0000
+      00F7000000EC000000D4000000B20000007A00000028FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000
+    }
+    Visible = True
+    OnDblClick = TrayIconDblClick
+    left = 45
+    top = 20
+  end
+  object TimerUpdateStatus: TTimer
+    OnTimer = TimerUpdateStatusTimer
+    left = 25
+    top = 45
+  end
+  object MainMenu: TMainMenu
+    left = 165
+    top = 160
+    object miProject: TMenuItem
+      Caption = 'Project'
+      object miPrivatekeys: TMenuItem
+        Caption = 'Private keys'
+        ShortCut = 16464
+        OnClick = miPrivatekeysClick
+      end
+      object miN1: TMenuItem
+        Caption = '-'
+      end
+      object miOptions: TMenuItem
+        Caption = 'Options'
+        ShortCut = 16463
+        OnClick = miOptionsClick
+      end
+      object IPnodes1: TMenuItem
+        Caption = 'IP nodes'
+        OnClick = IPnodes1Click
+      end
+      object N1: TMenuItem
+        Caption = '-'
+      end
+      object MiClose: TMenuItem
+        Caption = 'Close'
+        OnClick = MiCloseClick
+      end
+    end
+    object MiOperations: TMenuItem
+      Caption = 'Operations'
+      object miNewOperation: TMenuItem
+        Caption = 'New single Operation'
+        ShortCut = 120
+        OnClick = miNewOperationClick
+      end
+      object MiDecodePayload: TMenuItem
+        Caption = 'Decode Payload'
+        ShortCut = 113
+        OnClick = MiDecodePayloadClick
+      end
+      object MiFindaccount: TMenuItem
+        Caption = 'Find account'
+        ShortCut = 16454
+        OnClick = MiFindaccountClick
+      end
+      object N2: TMenuItem
+        Caption = '-'
+      end
+      object MiAddaccounttoSelected: TMenuItem
+        Caption = 'Add account to selected'
+        ShortCut = 117
+        OnClick = MiAddaccounttoSelectedClick
+      end
+      object MiRemoveaccountfromselected: TMenuItem
+        Caption = 'Remove account from selected'
+        ShortCut = 118
+        OnClick = MiRemoveaccountfromselectedClick
+      end
+      object MiMultiaccountoperation: TMenuItem
+        Caption = 'Multi account operation'
+        OnClick = MiMultiaccountoperationClick
+      end
+      object N3: TMenuItem
+        Caption = '-'
+      end
+      object MiFindpreviousaccountwithhighbalance: TMenuItem
+        Caption = 'Find previous account with high balance'
+        ShortCut = 16498
+        OnClick = MiFindpreviousaccountwithhighbalanceClick
+      end
+      object MiFindnextaccountwithhighbalance: TMenuItem
+        Caption = 'Find next account with high balance'
+        ShortCut = 114
+        OnClick = MiFindnextaccountwithhighbalanceClick
+      end
+    end
+    object miAbout: TMenuItem
+      Caption = 'About'
+      object miAboutPascalCoin: TMenuItem
+        Caption = 'About Pascal Coin...'
+        OnClick = miAboutPascalCoinClick
+      end
+    end
+  end
+  object ImageListIcons: TImageList
+    Height = 48
+    left = 105
+    top = 180
+    Bitmap = {
+      4C69020000001000000030000000000000000000000000000000000000000000
+      00000000000016161616010101010C0C0C0C7171717100000000000000000000
+      0000000000000000000000000000000000000000000000000000000000002324
+      252266B3FF0066B3FF0066B3FF0066B3FF0066B3FF00586D7F40000000000000
+      0000000000000000000000000000000000000000000000000000000000002324
+      252266B3FF0066B3FF0066B3FF0066B3FF0066B3FF00586D7F40000000000000
+      00000000000000000000000000000000000000000000000000005252525266B3
+      FF0066B3FF0066B3FF0066B3FF0066B3FF0066B3FF0066B3FF00252627240000
+      000000000000000000000000000000000000000000007878787866B3FF0066B3
+      FF0066B3FF0066B3FF0066B3FF0066B3FF0066B3FF0033597F0066B3FF001D1E
+      1F1D00000000000000000000000000000000000000007878787866B3FF0066B3
+      FF0066B3FF0066B3FF0066B3FF0066B3FF0066B3FF0033597F0066B3FF001D1E
+      1F1D00000000000000000000000000000000000000002B2F302966B3FF0066B3
+      FF006CB6FF006EB7FF006AB5FF0066B3FF0066B3FF00060B0F0066B3FF0068AC
+      F00E000000000000000000000000000000007474747466B3FF0067B4FF0077BB
+      FF0080C0FF0083C1FF007DBFFF00558BBF0066B3FF002C4E6F0066B3FF0066B3
+      FF003234382E0000000000000000000000007474747466B3FF0067B4FF0077BB
+      FF0080C0FF0083C1FF007DBFFF00558BBF0066B3FF002C4E6F0066B3FF0066B3
+      FF003234382E0000000000000000000000002B2F302966B3FF0070B8FF0080C0
+      FF007AACDF0000000000000000000000000000000000000000002C4E6F0066B3
+      FF0068ACF00E00000000000000000000000066B3FF0068B4FF007FC0FF0092C9
+      FF004F677F000000000000000000000000000000000000000000000000001321
+      2F0066B3FF006E6E6E6E000000000000000066B3FF0068B4FF007FC0FF0092C9
+      FF004F677F000000000000000000000000000000000000000000000000001321
+      2F0066B3FF006E6E6E6E000000000000000066B3FF006EB7FF0087C3FF009BCD
+      FF0034424F000000000000000000000000000000000000000000000000000000
+      000066B3FF002B2C2F29000000002122232066B3FF0079BDFF0094CAFF00ACD6
+      FF000000000000000000B7DBFF00000000006894BF00375B7F00000000000000
+      000066B3FF0066B3FF00000000002122232066B3FF0079BDFF0094CAFF00ACD6
+      FF000000000000000000B7DBFF00000000006894BF00375B7F00000000000000
+      000066B3FF0066B3FF00000000005E768F3F66B3FF007EBFFF009ACDFF00B3D9
+      FF000000000000000000C0E0FF0000000000597D9F0073BAFF00000000000000
+      000066B3FF0066B3FF000000000066B3FF0067B3FF0085C2FF00A3D1FF00BFDF
+      FF000000000000000000CFE7FF000000000025323F007ABDFF00000000000000
+      000066B3FF0066B3FF000000000066B3FF0067B3FF0085C2FF00A3D1FF00BFDF
+      FF000000000000000000CFE7FF000000000025323F007ABDFF00000000000000
+      000066B3FF0066B3FF000000000066B3FF0068B4FF0087C3FF00A6D3FF00C3E1
+      FF000000000000000000D5EAFF000B0D0F0013191F007CBEFF00000000000000
+      000066B3FF0066B3FF000000000066B3FF006AB5FF0089C4FF00A8D4FF00C7E3
+      FF000000000000000000DAEDFF0051606F00000000007DBFFF00000000000000
+      000066B3FF0066B3FF002323232366B3FF006AB5FF0089C4FF00A8D4FF00C7E3
+      FF000000000000000000DAEDFF0051606F00000000007DBFFF00000000000000
+      000066B3FF0066B3FF002323232366B3FF0069B4FF0088C4FF00A7D3FF00C6E3
+      FF000000000000000000D9ECFF00697C8F0000000000659ACF00000000000000
+      000066B3FF0066B3FF000D0D0D0D66B3FF0067B3FF0085C2FF00A3D1FF00BFDF
+      FF00000000000000000033393F002A323B000000000000000000000000002037
+      4F0066B3FF0066B3FF000202020266B3FF0067B3FF0085C2FF00A3D1FF00BFDF
+      FF00000000000000000033393F002A323B000000000000000000000000002037
+      4F0066B3FF0066B3FF000202020266B3FF0066B3FF0082C1FF009ECFFF00B9DC
+      FF000000000000000000000000000000000000000000000000000000000060A8
+      EF0066B3FF0066B3FF000505050566B3FF0066B3FF0079BDFF0094CAFF0096BA
+      DF0000000000000000000000000000000000000000000000000039648F0066B3
+      FF0066B3FF0066B3FF001111111166B3FF0066B3FF0079BDFF0094CAFF0096BA
+      DF0000000000000000000000000000000000000000000000000039648F0066B3
+      FF0066B3FF0066B3FF001111111166B3FF0066B3FF0074BAFF008EC7FF007A9D
+      BF0000000000000000000000000000000000000000000D161F0066B3FF0066B3
+      FF0066B3FF0066B3FF002323232366B3FF0066B3FF0068B4FF007FC0FF002D3E
+      4F000000000065829F0026333F008CC6FF0070B0EF0066B3FF0066B3FF0066B3
+      FF0066B3FF0066B3FF000000000066B3FF0066B3FF0068B4FF007FC0FF002D3E
+      4F000000000065829F0026333F008CC6FF0070B0EF0066B3FF0066B3FF0066B3
+      FF0066B3FF0066B3FF000000000066B3FF0066B3FF0066B3FF0077BCFF001924
+      2F00000000007198BF0012181F0083C2FF0070B8FF0066B3FF0066B3FF0066B3
+      FF0066B3FF0066B3FF0000000000586D7F4066B3FF0066B3FF0067B4FF000000
+      00000000000083C1FF003E5F7F005C96CF0066B3FF0066B3FF0066B3FF0066B3
+      FF0066B3FF0066B3FF0000000000586D7F4066B3FF0066B3FF0067B4FF000000
+      00000000000083C1FF003E5F7F005C96CF0066B3FF0066B3FF0066B3FF0066B3
+      FF0066B3FF0066B3FF00000000002022221F66B3FF0066B3FF0066B3FF000000
+      00000000000079BCFF0073BAFF0068B4FF0066B3FF0066B3FF0066B3FF0066B3
+      FF0066B3FF0066B3FF00000000000000000066B3FF0066B3FF0066B3FF000000
+      00000000000066B3FF0066B3FF0066B3FF0066B3FF0066B3FF0066B3FF0066B3
+      FF0066B3FF002022221F000000000000000066B3FF0066B3FF0066B3FF000000
+      00000000000066B3FF0066B3FF0066B3FF0066B3FF0066B3FF0066B3FF0066B3
+      FF0066B3FF002022221F000000000000000066B3FF0066B3FF0066B3FF000000
+      00000000000066B3FF0066B3FF0066B3FF0066B3FF0066B3FF0066B3FF0066B3
+      FF0066B3FF006868686800000000000000001414151466B3FF0066B3FF000000
+      00000000000066B3FF0066B3FF0066B3FF0066B3FF0066B3FF0066B3FF0066B3
+      FF0068ACF00E0000000000000000000000001414151466B3FF0066B3FF000000
+      00000000000066B3FF0066B3FF0066B3FF0066B3FF0066B3FF0066B3FF0066B3
+      FF0068ACF00E0000000000000000000000007F7F7F7F66B3FF0066B3FF000000
+      00000000000066B3FF0066B3FF0066B3FF0066B3FF0066B3FF0066B3FF0066B3
+      FF002B2F3029000000000000000000000000000000002B2F312966B3FF0066B3
+      FF0066B3FF0066B3FF0066B3FF0066B3FF0066B3FF0066B3FF0066B3FF0068AC
+      F00E00000000000000000000000000000000000000002B2F312966B3FF0066B3
+      FF0066B3FF0066B3FF0066B3FF0066B3FF0066B3FF0066B3FF0066B3FF0068AC
+      F00E00000000000000000000000000000000000000000000000066B3FF0066B3
+      FF0066B3FF0066B3FF0066B3FF0066B3FF0066B3FF0066B3FF0066B3FF002C30
+      322A0000000000000000000000000000000000000000000000006D6D6D6D66B3
+      FF0066B3FF0066B3FF0066B3FF0066B3FF0066B3FF0066B3FF00292A2D270000
+      00000000000000000000000000000000000000000000000000006D6D6D6D66B3
+      FF0066B3FF0066B3FF0066B3FF0066B3FF0066B3FF0066B3FF00292A2D270000
+      0000000000000000000000000000000000000000000000000000000000002A2B
+      2E2866B3FF0066B3FF0066B3FF0066B3FF0066B3FF005E768F3F000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000292929290B0B0B0B111111110000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000292929290B0B0B0B111111110000000000000000000000000000
+      0000000000000000000000000000000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF
+    }
+  end
+  object ApplicationEvents: TApplicationProperties
+    OnMinimize = ApplicationEventsMinimize
+    left = 256
+    top = 184
+  end
+end

+ 97 - 146
Units/Forms/UFRMWallet.pas

@@ -1,5 +1,9 @@
 unit UFRMWallet;
 
+{$IFDEF FPC}
+  {$MODE Delphi}
+{$ENDIF}
+
 { Copyright (c) 2016 by Albert Molina
 
   Distributed under the MIT software license, see the accompanying file LICENSE
@@ -16,21 +20,28 @@ unit UFRMWallet;
 interface
 
 uses
-  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
-  Dialogs, pngimage, ExtCtrls, ComCtrls, UWalletKeys, ShlObj, ADOInt, StdCtrls,
-  ULog, DB, ADODB, Grids, DBGrids, DBCGrids, UAppParams,
-  UBlockChain, UNode, DBCtrls, UGridUtils, UDBGridUtils, UMiner, UAccounts, Menus, ImgList,
-  AppEvnts, UNetProtocol, UCrypto, Buttons, UPoolMining;
+{$IFnDEF FPC}
+  pngimage, ADODB, Windows, AppEvnts, ShlObj,
+{$ELSE}
+  sqldb, LCLIntf, LCLType, LMessages,
+{$ENDIF}
+  Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
+  Dialogs, ExtCtrls, ComCtrls, UWalletKeys, StdCtrls,
+  ULog, DB, Grids, DBGrids, UAppParams,
+  UBlockChain, UNode, DBCtrls, UGridUtils, UMiner, UAccounts, Menus, ImgList,
+  UNetProtocol, UCrypto, Buttons, UPoolMining;
 
 type
   TMinerPrivateKey = (mpk_NewEachTime, mpk_Random, mpk_Selected);
 
+  { TFRMWallet }
+
   TFRMWallet = class(TForm)
     pnlTop: TPanel;
     Image1: TImage;
     StatusBar: TStatusBar;
     PageControl: TPageControl;
-    tsAccountsExplorer: TTabSheet;
+    tsMyAccounts: TTabSheet;
     tsOperations: TTabSheet;
     TrayIcon: TTrayIcon;
     TimerUpdateStatus: TTimer;
@@ -51,15 +62,9 @@ type
     miAboutPascalCoin: TMenuItem;
     miNewOperation: TMenuItem;
     Panel1: TPanel;
-    Label1: TLabel;
-    dbgridOperations: TDBGrid;
-    ebFilterOperationsAccount: TEdit;
     Label2: TLabel;
     ebFilterOperationsStartBlock: TEdit;
     ebFilterOperationsEndBlock: TEdit;
-    dtpFilterOperationsDateStart: TDateTimePicker;
-    cbFilterOperationsByDate: TCheckBox;
-    dtpFilterOperationsDateEnd: TDateTimePicker;
     tsNodeStats: TTabSheet;
     memoNetConnections: TMemo;
     memoNetServers: TMemo;
@@ -84,10 +89,6 @@ type
     Label9: TLabel;
     ebBlockChainBlockStart: TEdit;
     ebBlockChainBlockEnd: TEdit;
-    dtpBlockChainDateStart: TDateTimePicker;
-    cbBlockChainFilterByDate: TCheckBox;
-    dtpBlockChainDateEnd: TDateTimePicker;
-    dbGridBlockChain: TDBGrid;
     Label8: TLabel;
     lblNodeStatus: TLabel;
     tsPendingOperations: TTabSheet;
@@ -99,7 +100,7 @@ type
     MiClose: TMenuItem;
     MiDecodePayload: TMenuItem;
     ImageListIcons: TImageList;
-    ApplicationEvents: TApplicationEvents;
+    ApplicationEvents: {$IFDEF FPC}TApplicationProperties{$ELSE}TApplicationEvents{$ENDIF};
     Label5: TLabel;
     lblCurrentAccounts: TLabel;
     lblTimeAverageAux: TLabel;
@@ -157,6 +158,8 @@ type
     ebFilterAccountByBalanceMin: TEdit;
     ebFilterAccountByBalanceMax: TEdit;
     bbAccountsRefresh: TBitBtn;
+    dgBlockChainExplorer: TDrawGrid;
+    dgOperationsExplorer: TDrawGrid;
     procedure FormCreate(Sender: TObject);
     procedure FormDestroy(Sender: TObject);
     procedure TimerUpdateStatusTimer(Sender: TObject);
@@ -172,10 +175,8 @@ type
     procedure PageControlChange(Sender: TObject);
     procedure ebFilterOperationsAccountExit(Sender: TObject);
     procedure ebFilterOperationsAccountKeyPress(Sender: TObject; var Key: Char);
-    procedure cbFilterOperationsByDateClick(Sender: TObject);
     procedure ebBlockChainBlockStartExit(Sender: TObject);
     procedure ebBlockChainBlockStartKeyPress(Sender: TObject; var Key: Char);
-    procedure cbBlockChainFilterByDateClick(Sender: TObject);
     procedure cbExploreMyAccountsClick(Sender: TObject);
     procedure MiCloseClick(Sender: TObject);
     procedure MiDecodePayloadClick(Sender: TObject);
@@ -218,11 +219,11 @@ type
     FNodeNotifyEvents : TNodeNotifyEvents;
     FAccountsGrid : TAccountsGrid;
     FSelectedAccountsGrid : TAccountsGrid;
-    FOperationsGrid : TOperationsGrid;
+    FOperationsAccountGrid : TOperationsGrid;
     FPendingOperationsGrid : TOperationsGrid;
     FOrderedAccountsKeyList : TOrderedAccountKeysList;
-    FOperationsDBGrid : TOperationsDBGrid;
-    FBlockChainDBGrid : TBlockChainDBGrid;
+    FOperationsExplorerGrid : TOperationsGrid;
+    FBlockChainGrid : TBlockChainGrid;
     FMinerPrivateKeyType : TMinerPrivateKey;
     FUpdating : Boolean;
     FMessagesUnreadCount : Integer;
@@ -267,10 +268,14 @@ var
 
 implementation
 
-{$R *.dfm}
+{$IFnDEF FPC}
+  {$R *.dfm}
+{$ELSE}
+  {$R *.lfm}
+{$ENDIF}
 
-Uses UFolderHelper, ssl_lib, UConst, UTime,
-  UDBStorage, UThread, UOpTransaction, UECIES, UFRMPascalCoinWalletConfig,
+Uses UFolderHelper, UOpenSSL, UOpenSSLdef, UConst, UTime, UFileStorage,
+  UThread, UOpTransaction, UECIES, UFRMPascalCoinWalletConfig,
   UFRMAbout, UFRMOperation, UFRMWalletKeys, UFRMPayloadDecoder, UFRMNodesIp;
 
 Type
@@ -306,7 +311,7 @@ begin
     TCrypto.InitCrypto;
     // Read Wallet
     Try
-      FWalletKeys.WalletFileName := TFolderHelper.GetPascalCoinDataFolder+'\WalletKeys.dat';
+      FWalletKeys.WalletFileName := TFolderHelper.GetPascalCoinDataFolder+PathDelim+'WalletKeys.dat';
     Except
       On E:Exception do begin
         E.Message := 'Cannot open your wallet... Perhaps another instance of Pascal Coin is active!'+#10+#10+E.Message;
@@ -322,23 +327,17 @@ begin
     FNode.NetServer.Port := FAppParams.ParamByName[CT_PARAM_InternetServerPort].GetAsInteger(CT_NetServer_Port);
     FNode.PeerCache := FAppParams.ParamByName[CT_PARAM_PeerCache].GetAsString('')+';'+CT_Discover_IPs;
     // Check Database
-    FNode.Bank.StorageClass := TDBStorage;
-    TDBStorage(FNode.Bank.Storage).AccessFileName := TFolderHelper.GetPascalCoinDataFolder+'\pascalcoinB03.mdb';
+    FNode.Bank.StorageClass := TFileStorage;
+    TFileStorage(FNode.Bank.Storage).DatabaseFolder := TFolderHelper.GetPascalCoinDataFolder+PathDelim+'Data';
     // Init Grid
-    FAccountsGrid.Node := FNode;
+    //FAccountsGrid.Node := FNode;
     FSelectedAccountsGrid.Node := FNode;
     FWalletKeys.OnChanged := OnWalletChanged;
-    FOperationsGrid.Node := FNode;
-    FPendingOperationsGrid.Node := FNode;
+    FAccountsGrid.Node := FNode;
+    FOperationsAccountGrid.Node := FNode;
     // Reading database
     TThreadActivate.Create(false).FreeOnTerminate := true;
     FNodeNotifyEvents.Node := FNode;
-    FOperationsDBGrid.Node := FNode;
-    FOperationsDBGrid.AdoConnection := TDBStorage(FNode.Bank.Storage).ADOConnection;
-    FOperationsDBGrid.DBGrid := dbgridOperations;
-    FBlockChainDBGrid.Node := FNode;
-    FBlockChainDBGrid.AdoConnection := TDBStorage(FNode.Bank.Storage).ADOConnection;
-    FBlockChainDBGrid.DBGrid := dbGridBlockChain;
     // Init
     TNetData.NetData.OnReceivedHelloMessage := OnReceivedHelloMessage;
     TNetData.NetData.OnStatisticsChanged := OnNetStatisticsChanged;
@@ -366,11 +365,13 @@ end;
 
 procedure TFRMWallet.ApplicationEventsMinimize(Sender: TObject);
 begin
+  {$IFnDEF FPC}
   Hide();
   WindowState := wsMinimized;
   { Show the animated tray icon and also a hint balloon. }
   TrayIcon.Visible := True;
   TrayIcon.ShowBalloonHint;
+  {$ENDIF}
 end;
 
 procedure TFRMWallet.bbAccountsRefreshClick(Sender: TObject);
@@ -383,7 +384,7 @@ var i : Integer;
   name : String;
 begin
   if (cbMyPrivateKeys.ItemIndex<0) then  exit;
-  i := Integer(cbMyPrivateKeys.Items.Objects[cbMyPrivateKeys.ItemIndex]);
+  i := PtrInt(cbMyPrivateKeys.Items.Objects[cbMyPrivateKeys.ItemIndex]);
   if (i<0) Or (i>=FWalletKeys.Count) then raise Exception.Create('Must select a Key');
   name := FWalletKeys.Key[i].Name;
   if InputQuery('Change Key name','Input new name',name) then begin
@@ -462,13 +463,6 @@ begin
     'Message: '+#10+m),PChar(Application.Title),MB_ICONINFORMATION+MB_OK);
 end;
 
-procedure TFRMWallet.cbBlockChainFilterByDateClick(Sender: TObject);
-begin
-  dtpBlockChainDateStart.Enabled := cbBlockChainFilterByDate.Checked;
-  dtpBlockChainDateEnd.Enabled := cbBlockChainFilterByDate.Checked;
-  ebBlockChainBlockStartExit(Nil);
-end;
-
 procedure TFRMWallet.cbExploreMyAccountsClick(Sender: TObject);
 begin
   cbMyPrivateKeys.Enabled := cbExploreMyAccounts.Checked;
@@ -481,13 +475,6 @@ begin
   If not DoUpdateAccountsFilter then UpdateAccounts(true);
 end;
 
-procedure TFRMWallet.cbFilterOperationsByDateClick(Sender: TObject);
-begin
-  dtpFilterOperationsDateStart.Enabled := cbFilterOperationsByDate.Checked;
-  dtpFilterOperationsDateEnd.Enabled := cbFilterOperationsByDate.Checked;
-  ebFilterOperationsAccountExit(Nil);
-end;
-
 procedure TFRMWallet.cbMyPrivateKeysChange(Sender: TObject);
 begin
   UpdateAccounts(true);
@@ -622,31 +609,16 @@ begin
 end;
 
 procedure TFRMWallet.ebBlockChainBlockStartExit(Sender: TObject);
-var i64 : Int64;
+var bstart,bend : Int64;
 begin
   If FUpdating then exit;
   FUpdating := True;
   Try
-    FBlockChainDBGrid.Disable;
-    try
-      i64 := StrToInt64Def(ebBlockChainBlockStart.Text,-1);
-      FBlockChainDBGrid.BlockStart := i64;
-      if i64>=0 then ebBlockChainBlockStart.Text := Inttostr(i64) else ebBlockChainBlockStart.Text := '';
-      i64 := StrToInt64Def(ebBlockChainBlockEnd.Text,-1);
-      FBlockChainDBGrid.BlockEnd := i64;
-      if i64>=0 then ebBlockChainBlockEnd.Text := Inttostr(i64) else ebBlockChainBlockEnd.Text := '';
-      if cbBlockChainFilterByDate.Checked then begin
-        if dtpBlockChainDateStart.Date<encodedate(2016,01,01) then dtpBlockChainDateStart.Date := encodedate(2016,01,01);
-        if dtpBlockChainDateStart.Date>dtpBlockChainDateEnd.Date then dtpBlockChainDateEnd.Date := dtpBlockChainDateStart.Date;
-        FBlockChainDBGrid.SetDates(dtpBlockChainDateStart.Date,dtpBlockChainDateEnd.Date);
-        dtpBlockChainDateStart.Date := FBlockChainDBGrid.DateStart;
-        dtpBlockChainDateEnd.Date := FBlockChainDBGrid.DateEnd;
-      end else begin
-        FBlockChainDBGrid.SetDates(0,0);
-      end;
-    finally
-      FBlockChainDBGrid.Enable;
-    end;
+    bstart := StrToInt64Def(ebBlockChainBlockStart.Text,-1);
+    bend := StrToInt64Def(ebBlockChainBlockEnd.Text,-1);
+    FBlockChainGrid.SetBlocks(bstart,bend);
+    if FBlockChainGrid.BlockStart>=0 then ebBlockChainBlockStart.Text := Inttostr(FBlockChainGrid.BlockStart) else ebBlockChainBlockStart.Text := '';
+    if FBlockChainGrid.BlockEnd>=0 then ebBlockChainBlockEnd.Text := Inttostr(FBlockChainGrid.BlockEnd) else ebBlockChainBlockEnd.Text := '';
   Finally
     FUpdating := false;
   End;
@@ -670,40 +642,16 @@ begin
 end;
 
 procedure TFRMWallet.ebFilterOperationsAccountExit(Sender: TObject);
-Var acc : Cardinal;
-  i64 : Int64;
+Var bstart,bend : Int64;
 begin
   If FUpdating then exit;
   FUpdating := True;
   Try
-    FOperationsDBGrid.Disable;
-    try
-      if TAccountComp.AccountTxtNumberToAccountNumber(ebFilterOperationsAccount.Text,acc) then begin
-        FOperationsDBGrid.AccountNumber := acc;
-        ebFilterOperationsAccount.Text := TAccountComp.AccountNumberToAccountTxtNumber(acc);
-      end else begin
-        FOperationsDBGrid.AccountNumber := -1;
-        ebFilterOperationsAccount.Text := '';
-      end;
-      i64 := StrToInt64Def(ebFilterOperationsStartBlock.Text,-1);
-      FOperationsDBGrid.BlockStart := i64;
-      if i64>=0 then ebFilterOperationsStartBlock.Text := Inttostr(i64) else ebFilterOperationsStartBlock.Text := '';
-      i64 := StrToInt64Def(ebFilterOperationsEndBlock.Text,-1);
-      FOperationsDBGrid.BlockEnd := i64;
-      if i64>=0 then ebFilterOperationsEndBlock.Text := Inttostr(i64) else ebFilterOperationsEndBlock.Text := '';
-      if cbFilterOperationsByDate.Checked then begin
-        if dtpFilterOperationsDateStart.Date<encodedate(2016,01,01) then dtpFilterOperationsDateStart.Date := encodedate(2016,01,01);
-        if dtpFilterOperationsDateStart.Date>dtpFilterOperationsDateEnd.Date then dtpFilterOperationsDateEnd.Date := dtpFilterOperationsDateStart.Date;
-        FOperationsDBGrid.SetDates(dtpFilterOperationsDateStart.Date,dtpFilterOperationsDateEnd.Date);
-        dtpFilterOperationsDateStart.Date := FOperationsDBGrid.DateStart;
-        dtpFilterOperationsDateEnd.Date := FOperationsDBGrid.DateEnd;
-      end else begin
-        FOperationsDBGrid.SetDates(0,0);
-      end;
-      //
-    finally
-      FOperationsDBGrid.Enable;
-    end;
+    bstart := StrToInt64Def(ebFilterOperationsStartBlock.Text,-1);
+    if bstart>=0 then ebFilterOperationsStartBlock.Text := Inttostr(bstart) else ebFilterOperationsStartBlock.Text := '';
+    bend := StrToInt64Def(ebFilterOperationsEndBlock.Text,-1);
+    if bend>=0 then ebFilterOperationsEndBlock.Text := Inttostr(bend) else ebFilterOperationsEndBlock.Text := '';
+    FOperationsExplorerGrid.SetBlocks(bstart,bend);
   Finally
     FUpdating := false;
   End;
@@ -757,7 +705,6 @@ end;
 
 procedure TFRMWallet.FormCreate(Sender: TObject);
 Var i : Integer;
-  fvi : TFileVersionInfo;
 begin
   FMinAccountBalance := 0;
   FMaxAccountBalance := CT_MaxWalletAmount;
@@ -782,7 +729,7 @@ begin
   FLog.SaveTypes := [];
   If Not ForceDirectories(TFolderHelper.GetPascalCoinDataFolder) then raise Exception.Create('Cannot create dir: '+TFolderHelper.GetPascalCoinDataFolder);
   FAppParams := TAppParams.Create(self);
-  FAppParams.FileName := TFolderHelper.GetPascalCoinDataFolder+'\AppParams.prm';
+  FAppParams.FileName := TFolderHelper.GetPascalCoinDataFolder+PathDelim+'AppParams.prm';
   FNodeNotifyEvents := TNodeNotifyEvents.Create(Self);
   FNodeNotifyEvents.OnBlocksChanged := OnNewAccount;
   FNodeNotifyEvents.OnNodeMessageEvent := OnNodeMessageEvent;
@@ -791,31 +738,27 @@ begin
   FSelectedAccountsGrid := TAccountsGrid.Create(Self);
   FSelectedAccountsGrid.DrawGrid := dgSelectedAccounts;
   FSelectedAccountsGrid.OnUpdated := OnSelectedAccountsGridUpdated;
-  FOperationsGrid := TOperationsGrid.Create(Self);
-  FOperationsGrid.DrawGrid := dgAccountOperations;
+  FOperationsAccountGrid := TOperationsGrid.Create(Self);
+  FOperationsAccountGrid.DrawGrid := dgAccountOperations;
   FPendingOperationsGrid := TOperationsGrid.Create(Self);
   FPendingOperationsGrid.DrawGrid := dgPendingOperations;
   FPendingOperationsGrid.AccountNumber := -1; // all
   FPendingOperationsGrid.PendingOperations := true;
+  FOperationsExplorerGrid := TOperationsGrid.Create(Self);
+  FOperationsExplorerGrid.DrawGrid := dgOperationsExplorer;
+  FOperationsExplorerGrid.AccountNumber := -1;
+  FOperationsExplorerGrid.PendingOperations := False;
+  FBlockChainGrid := TBlockChainGrid.Create(Self);
+  FBlockChainGrid.DrawGrid := dgBlockChainExplorer;
   FWalletKeys.OnChanged := OnWalletChanged;
-  FOperationsDBGrid := TOperationsDBGrid.Create(Self);
-  FBlockChainDBGrid := TBlockChainDBGrid.Create(Self);
   LoadAppParams;
   UpdatePrivateKeys;
   UpdateBlockChainState;
   UpdateConnectionStatus;
-  ebFilterOperationsAccount.Text := '';
-  PageControl.ActivePage := tsAccountsExplorer;
+  PageControl.ActivePage := tsMyAccounts;
   pcAccountsOptions.ActivePage := tsAccountOperations;
-  dtpFilterOperationsDateStart.Date := Trunc(Now);
-  dtpFilterOperationsDateEnd.Date := Trunc(Now);
-  dtpBlockChainDateStart.Date := Trunc(Now);
-  dtpBlockChainDateEnd.Date := Trunc(Now);
-  ebFilterOperationsAccount.Text := '';
   ebFilterOperationsStartBlock.Text := '';
   ebFilterOperationsEndBlock.Text := '';
-  cbFilterOperationsByDate.Checked := false;
-  cbFilterOperationsByDateClick(nil);
   cbExploreMyAccountsClick(nil);
 
   TrayIcon.Visible := true;
@@ -825,8 +768,7 @@ begin
     'Double click the system tray icon to restore Pascal Coin';
   TrayIcon.BalloonFlags := bfInfo;
   MinersBlocksFound := 0;
-  fvi := TFolderHelper.GetTFileVersionInfo(Application.ExeName);
-  lblBuild.Caption := 'Build: '+fvi.FileVersion;
+  lblBuild.Caption := 'Build: '+CT_ClientAppVersion;
   FPoolMiningServer := Nil;
 end;
 
@@ -845,7 +787,8 @@ begin
   step := 'Assigning nil events';
   FLog.OnNewLog :=Nil;
   FNodeNotifyEvents.Node := Nil;
-  FOperationsGrid.Node := Nil;
+  FOperationsAccountGrid.Node := Nil;
+  FOperationsExplorerGrid.Node := Nil;
   FPendingOperationsGrid.Node := Nil;
   FAccountsGrid.Node := Nil;
   FSelectedAccountsGrid.Node := Nil;
@@ -875,8 +818,9 @@ begin
   TNetData.NetData.OnStatisticsChanged := Nil;
 
   step := 'Destroying grids operators';
-  FreeAndNil(FOperationsDBGrid);
-  FreeAndNil(FBlockChainDBGrid);
+  FreeAndNil(FOperationsAccountGrid);
+  FreeAndNil(FOperationsExplorerGrid);
+  FreeAndNil(FBlockChainGrid);
 
   step := 'Ordered Accounts Key list';
   FreeAndNil(FOrderedAccountsKeyList);
@@ -995,7 +939,7 @@ end;
 
 procedure TFRMWallet.MiAddaccounttoSelectedClick(Sender: TObject);
 begin
-  PageControl.ActivePage := tsAccountsExplorer;
+  PageControl.ActivePage := tsMyAccounts;
   PageControlChange(Nil);
   pcAccountsOptions.ActivePage := tsMultiSelectAccounts;
   sbSelectedAccountsAddClick(Sender);
@@ -1009,17 +953,17 @@ end;
 procedure TFRMWallet.MiDecodePayloadClick(Sender: TObject);
 begin
   if PageControl.ActivePage=tsOperations then begin
-    FOperationsDBGrid.ShowModalDecoder(FWalletKeys,FAppParams);
+    FOperationsExplorerGrid.ShowModalDecoder(FWalletKeys,FAppParams);
   end else if PageControl.ActivePage=tsPendingOperations then begin
     FPendingOperationsGrid.ShowModalDecoder(FWalletKeys,FAppParams);
-  end else if PageControl.ActivePage=tsAccountsExplorer then begin
-    FOperationsGrid.ShowModalDecoder(FWalletKeys,FAppParams);
+  end else if PageControl.ActivePage=tsMyAccounts then begin
+    FOperationsAccountGrid.ShowModalDecoder(FWalletKeys,FAppParams);
   end;
 end;
 
 procedure TFRMWallet.MiFindaccountClick(Sender: TObject);
 begin
-  PageControl.ActivePage := tsAccountsExplorer;
+  PageControl.ActivePage := tsMyAccounts;
   PageControlChange(Nil);
   ebFindAccountNumber.SetFocus;
 end;
@@ -1029,7 +973,7 @@ Var an  : Cardinal;
   an64 : Int64;
   start : TAccount;
 begin
-  PageControl.ActivePage := tsAccountsExplorer;
+  PageControl.ActivePage := tsMyAccounts;
   PageControlChange(Nil);
   an64 := FAccountsGrid.AccountNumber(dgAccounts.Row);
   if an64<0 then an := 0
@@ -1050,7 +994,7 @@ Var an  : Cardinal;
   an64 : Int64;
   start : TAccount;
 begin
-  PageControl.ActivePage := tsAccountsExplorer;
+  PageControl.ActivePage := tsMyAccounts;
   PageControlChange(Nil);
   an64 := FAccountsGrid.AccountNumber(dgAccounts.Row);
   if an64<0 then an := FNode.Bank.SafeBox.AccountsCount-1
@@ -1068,7 +1012,7 @@ end;
 
 procedure TFRMWallet.MiMultiaccountoperationClick(Sender: TObject);
 begin
-  PageControl.ActivePage := tsAccountsExplorer;
+  PageControl.ActivePage := tsMyAccounts;
   pcAccountsOptions.ActivePage := tsMultiSelectAccounts;
   bbSelectedAccountsOperationClick(Sender);
 end;
@@ -1117,7 +1061,7 @@ end;
 
 procedure TFRMWallet.MiRemoveaccountfromselectedClick(Sender: TObject);
 begin
-  PageControl.ActivePage := tsAccountsExplorer;
+  PageControl.ActivePage := tsMyAccounts;
   PageControlChange(Nil);
   pcAccountsOptions.ActivePage := tsMultiSelectAccounts;
   sbSelectedAccountsDelClick(Sender);
@@ -1289,8 +1233,15 @@ end;
 
 procedure TFRMWallet.OnNewAccount(Sender: TObject);
 begin
-  UpdateAccounts(false);
-  UpdateBlockChainState;
+  Try
+    UpdateAccounts(false);
+    UpdateBlockChainState;
+  Except
+    On E:Exception do begin
+      E.Message := 'Error at OnNewAccount '+E.Message;
+      Raise;
+    end;
+  end;
 end;
 
 procedure TFRMWallet.OnNewLog(logtype: TLogType; Time : TDateTime; ThreadID : Cardinal; const sender,logtext: AnsiString);
@@ -1369,24 +1320,24 @@ end;
 procedure TFRMWallet.PageControlChange(Sender: TObject);
 begin
   MiDecodePayload.Enabled := false;
-  if PageControl.ActivePage=tsAccountsExplorer then begin
-    FAccountsGrid.Node := FNode;
+  if PageControl.ActivePage=tsMyAccounts then begin
+    //FAccountsGrid.Node := FNode;
     MiDecodePayload.Enabled := true;
     FSelectedAccountsGrid.Node := FNode;
   end else begin
-    FAccountsGrid.Node := Nil;
+    //FAccountsGrid.Node := Nil;
     FSelectedAccountsGrid.Node := Nil;
   end;
   if PageControl.ActivePage=tsPendingOperations then begin
     FPendingOperationsGrid.Node := FNode;
     MiDecodePayload.Enabled := true;
   end else FPendingOperationsGrid.Node := Nil;
-  if PageControl.ActivePage=tsBlockChain then FBlockChainDBGrid.Node := FNode
-  else FBlockChainDBGrid.Node := Nil;
+  if PageControl.ActivePage=tsBlockChain then FBlockChainGrid.Node := FNode
+  else FBlockChainGrid.Node := Nil;
   if PageControl.ActivePage=tsOperations then begin
-    FOperationsDBGrid.Node := FNode;
+    FOperationsExplorerGrid.Node := FNode;
     MiDecodePayload.Enabled := true;
-  end else FOperationsDBGrid.Node := Nil;
+  end else FOperationsExplorerGrid.Node := Nil;
   if PageControl.ActivePage=tsMessages then begin
     UpdateAvailableConnections;
     FMessagesUnreadCount := 0;
@@ -1538,7 +1489,7 @@ begin
             end;
           end;
         end else begin
-          i := Integer(cbMyPrivateKeys.Items.Objects[cbMyPrivateKeys.ItemIndex]);
+          i := PtrInt(cbMyPrivateKeys.Items.Objects[cbMyPrivateKeys.ItemIndex]);
           if (i>=0) And (i<FWalletKeys.Count) then begin
             j := FOrderedAccountsKeyList.IndexOfAccountKey(FWalletKeys[i].AccountKey);
             if (j>=0) then begin
@@ -1672,12 +1623,12 @@ begin
   tsLogs.TabVisible := FAppParams.ParamByName[CT_PARAM_ShowLogs].GetAsBoolean(false);
   if (Not tsLogs.TabVisible) then begin
     FLog.OnNewLog := Nil;
-    if PageControl.ActivePage = tsLogs then PageControl.ActivePage := tsAccountsExplorer;
+    if PageControl.ActivePage = tsLogs then PageControl.ActivePage := tsMyAccounts;
   end else FLog.OnNewLog := OnNewLog;
   if FAppParams.ParamByName[CT_PARAM_SaveLogFiles].GetAsBoolean(false) then begin
     if FAppParams.ParamByName[CT_PARAM_SaveDebugLogs].GetAsBoolean(false) then FLog.SaveTypes := CT_TLogTypes_ALL
     else FLog.SaveTypes := CT_TLogTypes_DEFAULT;
-    FLog.FileName := TFolderHelper.GetPascalCoinDataFolder+'\PascalCointWallet.log';
+    FLog.FileName := TFolderHelper.GetPascalCoinDataFolder+PathDelim+'PascalCointWallet.log';
   end else begin
     FLog.SaveTypes := [];
     FLog.FileName := '';
@@ -1751,7 +1702,7 @@ procedure TFRMWallet.UpdateOperations;
 Var accn : Int64;
 begin
   accn := FAccountsGrid.AccountNumber(dgAccounts.Row);
-  FOperationsGrid.AccountNumber := accn;
+  FOperationsAccountGrid.AccountNumber := accn;
 end;
 
 procedure TFRMWallet.UpdatePrivateKeys;
@@ -1762,7 +1713,7 @@ begin
   If (Not Assigned(FOrderedAccountsKeyList)) And (Assigned(FNode)) Then begin
     FOrderedAccountsKeyList := TOrderedAccountKeysList.Create(FNode.Bank.SafeBox,false);
   end;
-  if (cbMyPrivateKeys.ItemIndex>=0) then last_i := Integer(cbMyPrivateKeys.Items.Objects[cbMyPrivateKeys.ItemIndex])
+  if (cbMyPrivateKeys.ItemIndex>=0) then last_i := PtrInt(cbMyPrivateKeys.Items.Objects[cbMyPrivateKeys.ItemIndex])
   else last_i := -1;
   cbMyPrivateKeys.items.BeginUpdate;
   Try

+ 723 - 0
Units/Forms/UFRMWalletKeys.lfm

@@ -0,0 +1,723 @@
+object FRMWalletKeys: TFRMWalletKeys
+  Left = 628
+  Height = 478
+  Top = 282
+  Width = 569
+  BorderIcons = [biSystemMenu]
+  BorderStyle = bsSingle
+  Caption = 'Wallet keys'
+  ClientHeight = 478
+  ClientWidth = 569
+  Color = clBtnFace
+  Font.Color = clWindowText
+  Font.Height = -11
+  Font.Name = 'Tahoma'
+  OnCreate = FormCreate
+  Position = poOwnerFormCenter
+  LCLVersion = '1.6.0.4'
+  object lblEncryptionTypeCaption: TLabel
+    Left = 30
+    Height = 13
+    Top = 298
+    Width = 80
+    Caption = 'Encryption type:'
+    ParentColor = False
+  end
+  object lblEncryptionType: TLabel
+    Left = 125
+    Height = 13
+    Top = 298
+    Width = 54
+    Caption = '000000000'
+    ParentColor = False
+  end
+  object lblKeyNameCaption: TLabel
+    Left = 30
+    Height = 13
+    Top = 317
+    Width = 51
+    Caption = 'Key name:'
+    ParentColor = False
+  end
+  object lblKeyName: TLabel
+    Left = 125
+    Height = 13
+    Top = 317
+    Width = 329
+    AutoSize = False
+    Caption = '000000000'
+    ParentColor = False
+  end
+  object lblPrivateKeyCaption: TLabel
+    Left = 30
+    Height = 13
+    Top = 336
+    Width = 58
+    Caption = 'Private key:'
+    ParentColor = False
+  end
+  object lblPrivateKeyCaption2: TLabel
+    Left = 30
+    Height = 13
+    Top = 355
+    Width = 80
+    Caption = '(In hexa format)'
+    ParentColor = False
+  end
+  object lblKeysEncrypted: TLabel
+    Left = 30
+    Height = 39
+    Top = 15
+    Width = 346
+    AutoSize = False
+    Caption = 'lblKeysEncrypted'
+    Font.Color = clBlack
+    Font.Height = -16
+    Font.Name = 'Tahoma'
+    Font.Style = [fsBold]
+    ParentColor = False
+    ParentFont = False
+    WordWrap = True
+  end
+  object lbWalletKeys: TListBox
+    Left = 30
+    Height = 227
+    Top = 60
+    Width = 346
+    ItemHeight = 0
+    OnClick = lbWalletKeysClick
+    TabOrder = 0
+  end
+  object bbExportPrivateKey: TBitBtn
+    Left = 382
+    Height = 36
+    Top = 136
+    Width = 159
+    Caption = 'Export Private key'
+    Glyph.Data = {
+      76060000424D7606000000000000360400002800000018000000180000000100
+      0800000000004002000000000000000000000001000000010000FF00FF005251
+      5100565758005A5958005B5D5D005D5E5E006361610066666600696969006C6B
+      6B0073706F0072707000747271000E80AA001788AF000B86B2000C85B000098A
+      B700078CBA00198EB7000E91BE001E94BC002898BA003E99BB000493C4000997
+      C7000A9ECF00229BC20035A0C30030AACA0032AACE003DAACC003FB0CB0036A9
+      D0003BB1D9003DBDDA0039B8DE0029BBE0004DBBD90068B0CA0019C7F1001BD4
+      FE002FC6E7003ECDE9002CD3F9002ED8FE003CE0FE0054C0D40059C4D70059C2
+      DD006FC2D6007CC0D50078C1D80049DDFE0054DFFE0061C6E5006CD4EE0064D9
+      E90076DFE9007DDFE90055E0FF0058E0FE006BE3F40063E6FE0060ECFE0075E2
+      FA0077E6FF007BE8FF0071F2FE0088828000928E8C0096908F00969291009794
+      94009E969400A09C9B00A19F9E00ACA09E00A6A2A100A6A4A400ADA5A300AAA5
+      A400ABA8A800ADAAA900B0A5A300B2A7A500B2ABAB00B4ABA900BBB1AE00BEB1
+      AF00BAB3B200BAB4B200BEB6B400C4B8B600C1BCBB0083DFE9008ADAEB0094DF
+      E90089DDF100A4DFEA009AE2F40095EBFD0095EDFE009EEDFF0084F3F90080F5
+      FC008FF6FB0083F8FE0093F2FE0097F9FE0094FDFE0099FFFE009EFFFE00AAEF
+      FD00B4EEF300A4FFFE00A8F9FE00ADFBFE00AAFFFE00B6F1FF00BCF2F800B3F9
+      FF00B3FFFE00B9FFFE00C7C2C100C7C6C600CCC4C200CAC7C600CFCCCC00D1C7
+      C500D4CBC900D1CDCD00D5CFCE00D8D0CE00D7D1D000D9D5D400DCD7D600DFD8
+      D600E3DEDD00C3DFEA00CCF6FF00C9FFFE00CFFFFF00D1F7FF00DBF8FE00DFFF
+      FF00E7E3E200E9E5E500ECE9E900EFEEED00F1EBEA00F1EFEE00E5FFFF00F3F1
+      F100F6F2F000F8F5F300F8F5F400F0F7FA00F5FFFF00FBF8F800FAFFFF00FFFE
+      FE00000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0007070707000000000000000000000000000000000000000746967E07000000
+      0000000000000000000000000000000D085E489A5E080D0D0000000000000000
+      00000000000D0D2626075E48A1071F130D0D000000000000000000000D163940
+      3F35075E4C93070707100D000000000000000000123A6B402E353D075E519580
+      4E0707070707000000000000123A6B402E293D42075E4EA19289858281550700
+      00000000123A6B402E292D4266075E4C9689865A475D4D0700000000123A6B40
+      2E292D3C6671077D928A7D0A0A58580700000000123A6B402E292D3C4371079A
+      958007035151550700000000123A6D6C6667778C8F90079A860701574C024A07
+      0000000012727860311E1B151C3407A17E0B534C000445070000000011322023
+      2A282C36426407539A8882040404570700000000103169402E292D3643716207
+      5393825A515A5A0700000000123A6B402E292D3C436662370707070708070700
+      00000000123A6B402E292D3C43663837222117000000000000000000123A6B40
+      2E292D3C436638231A180D000000000000000000123A6B402E292D3C43663822
+      1A180D000000000000000000123A6B402E292D3C436638231A180D0000000000
+      00000000123B757975756F6F6F6F6A3E25190D000000000000000000128BA190
+      8E79736F6F6F6F6D442B0D00000000000000000012279D9D908E796F6F6F6F6F
+      691E0D000000000000000000001214333363615F3B3A2F2F0E0D000000000000
+      0000000000000014121212121212121200000000000000000000
+    }
+    OnClick = bbExportPrivateKeyClick
+    TabOrder = 4
+  end
+  object memoPrivateKey: TMemo
+    Left = 125
+    Height = 80
+    Top = 336
+    Width = 416
+    Color = clBtnFace
+    Font.Color = clBlack
+    Font.Height = -16
+    Font.Name = 'Tahoma'
+    Lines.Strings = (
+      'memoPrivateKey'
+    )
+    ParentFont = False
+    ReadOnly = True
+    TabOrder = 9
+    TabStop = False
+  end
+  object bbChangeName: TBitBtn
+    Left = 460
+    Height = 25
+    Top = 305
+    Width = 81
+    Caption = 'Change Name'
+    OnClick = bbChangeNameClick
+    TabOrder = 8
+  end
+  object bbImportPrivateKey: TBitBtn
+    Left = 382
+    Height = 36
+    Top = 98
+    Width = 159
+    Caption = 'Import Private key'
+    Glyph.Data = {
+      76060000424D7606000000000000360400002800000018000000180000000100
+      0800000000004002000000000000000000000001000000010000FF00FF000571
+      0A0008750D0024B53B0029B942002ABA44002EBD4A002FBF4C0033C1500034C2
+      520035C3540037C5570039C659003BC85C003CC95E003FCC630040CC650045D0
+      6B0046D16C0049D472004BD675004ED8790050D97B0051DA7E000E80AA001788
+      AF000B86B200098AB700078CBA00198EB700118EB9000E91BE001E94BC002898
+      BA0055DD810056DF850058E087000493C4000997C7000C9BCB000A9DCE00229B
+      C20015AFD90026A0C80021AACF0035A0C30030AACA0032AACE003DAACC003FB0
+      CB0031AED7003DBDDA0039B8DE0029BBE00056B1CE0052BDDB0068B0CA006BBD
+      D70019C7F1001BD4FE002FC6E70026C2E9003ECDE9002CD3F9002ED8FE003CE0
+      FE0054C0D40059C4D70059C2DD006FC2D60062C3DE007CC0D5007AC6DF0043C8
+      E90054DFFE0060CEEA0079CFE9006CD4EE0064D9E90076DFE9007DDFE90055E0
+      FF006BE3F40060ECFE0075E2FA007BE8FF0071F2FE008FD0E60083DFE9008ADA
+      EB0094DFE90081DBF100A4DFEA0095EBFD0095EEFE009EEDFF0084F3F90080F5
+      FC008FF6FB0083F8FE0093F2FE0097F9FE0094FDFE0099FFFE009EFFFE00AFE8
+      F600B4EEF300A4FFFE00A8F9FE00ADFBFE00AAFFFE00B6F1FF00BCF2F800B3F9
+      FF00B3FFFE00B9FFFE00C3DFEA00CCF6FF00C9FFFE00CFFFFF00D1F6FE00DFFF
+      FF00E5FFFF00F0F7FA00F5FFFF00FAFFFF000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000202020200000000000000000000000000000000000000
+      0002040302000000000000000000001818181818181818180002060402000000
+      000000000018182C2C2A3D494B46301D18020906020000000000000018214E53
+      413B4051555D4D3427020D0902000000000000001C4F6353413B405102020202
+      02020F0D02020202020200001C4F6353413B405102242317151311100D090906
+      040200001C4F6353413B40510224242323151311100F0D09060200001C4F6353
+      413B4051020101010102171302010101020100001C4F6353413B4051555D4D34
+      2702231702000000000000001C4F65645D5F6F757878694C3202242302000000
+      000000001C6A7059442F29202D3639485702242402000000000000001B453134
+      3C3A3F4A545B372B1E02242402000000000000001A436153413B4051555D4D34
+      2701020202000000000000001C4F6353413B4051555D4D342725180000000000
+      000000001C4F6353413B4051555D4D342725180000000000000000001C4F6353
+      413B4051555D4D342725180000000000000000001C4F6353413B4051555D4D34
+      2825180000000000000000001C4F6353413B4051555D4D342725180000000000
+      000000001C506D716D6D6767676762523527180000000000000000001C747D7A
+      77716B6767676765563E180000000000000000001C387B7C7977716767676767
+      612F18000000000000000000001C1F47475C5A58504F42421918000000000000
+      000000000000001C1C1C1C1C1C1C1C1C00000000000000000000
+    }
+    OnClick = bbImportPrivateKeyClick
+    TabOrder = 3
+  end
+  object bbExportPublicKey: TBitBtn
+    Left = 382
+    Height = 36
+    Top = 212
+    Width = 159
+    Caption = 'Export Public key'
+    Glyph.Data = {
+      F6060000424DF606000000000000360000002800000018000000180000000100
+      180000000000C0060000120B0000120B00000000000000000000FF00FFFF00FF
+      FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+      FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+      00FFFF00FFFF00FF019ACF019ACF019ACF019ACFFF00FFFF00FFFF00FFFF00FF
+      FF00FFFF00FFFF00FFFF00FFFF00FFFF00FF0C8518FF00FFFF00FFFF00FFFF00
+      FFFF00FFFF00FFFF00FFFF00FF0D9FD18BD4EE6BD3F845C0ED28B0E0019ACF01
+      9ACF019ACF019ACFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF0C85180C8518
+      FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF069CD076C8E5A9E9FE6DD8
+      FF75DBFF77DCFF77DBFF63D1F930B3E3029BD0019ACF019ACF019ACF019ACFFF
+      00FF0C85181399220C8518FF00FFFF00FFFF00FFFF00FFFF00FFFF00FF019ACF
+      34AFD9BCE9F86ED8FF6FD8FE70D8FE70D8FE71D8FF0C85180C85180C85180C85
+      180C85180C85180C85180C85181DAC31139A220C8518FF00FFFF00FFFF00FFFF
+      00FFFF00FF019ACF1FA9D68FD3EB97E4FF6FD9FE71D9FE71D9FE71D9FE0C8518
+      57E38851DD7E4AD77443D0693BC95E34C1522BBA4725B33C1EAE33149B230C85
+      18FF00FFFF00FFFF00FFFF00FF019ACF31B1DC49B7DEBDEEFB71DDFE77DEFE77
+      DEFE77DEFE0C85185EE89059E48953DE804CD87645D16C3DCA6035C2542DBB49
+      26B53F1FAF35149B250C8518FF00FFFF00FFFF00FF019ACF52C2E71DA7D5ADE2
+      F38FE8FF7CE2FE7CE3FE7CE3FE0C851861EB955FE9925AE58B54DF824DD97846
+      D26D3ECB6237C4562FBD4C27B64021B037159B250C8518FF00FFFF00FF019ACF
+      60CAEF1FA8D85EC1E1C2E6ED8ACEE08FCFE18ECFE10C851861EB9561EB955FEA
+      935CE58D56E0844FDB7A48D47040CD6538C65931BF4D1DA3320C8518FF00FFFF
+      00FFFF00FF019ACF65CFF53EB7E52CA9D4C5EFF8ACF3FEA5F2FFA5F2FF0C8518
+      61EB9561EB9561EB9561EB945CE68E57E18650DC7C49D57242CE6727AD410C85
+      18FF00FFFF00FFFF00FFFF00FF019ACF69D1F855C4F32A9CC673CBE7D6FEFDB1
+      FBFDB2FBFD0C85180C85180C85180C85180C85180C85180C85180C851852DD7F
+      32B6500C851898FAFF019ACFFF00FFFF00FFFF00FF019ACF77D5FC5CC8FB748E
+      A224A8D5B9E7F3D5F5F9D5F6F9D6F6FADCFAFBCDFDFCB9FCFCAFFAFCB0FAFCB1
+      FAFC0C85183ABE5C0C85189FFCFFA4FFFF43C1E2019ACFFF00FFFF00FF019ACF
+      8BDBFF5FCDFFB7898973C3DD18A2D218A2D216A2D215A1D21AA4D391D7EBEBFE
+      FDDBFDFCC5FBFBC2FBFB0C85180C851883E4F3B6FDFFBAFFFFB5FCFD019ACFFF
+      00FFFF00FF019ACF99E2FF67D3FFB88989FEF5ECFDF3EBF0EFEAE5EBE8D6E5E6
+      A4D2E025A6D34DB9DDE5F8FBF5FDFCEBFCFB0C8518C4FBFF9CE4F2DAFEFFD9FE
+      FFE3FFFFADE9F5019ACFFF00FF019ACF9FE9FF70DCFFB88989FEF3E9FFF2E6FE
+      F3E9FEF3E9FEF3E9FEF3E9D4E4E439ADD422A5D49DD8ECF1F9FBEEEFEFE9FDFF
+      CEEEF7F8FFFFF7FFFFFEFFFFE9F9FD019ACFFF00FF019ACFA7EFFF76E5FFB889
+      89FFF2E5FFF0E2FFF2E5FFF2E5FFF2E5FFF2E5FFF2E5EAEBE38EC9DA44B0D501
+      9ACF019ACF019ACF019ACF019ACF019ACF019ACF019ACF019ACFFF00FF019ACF
+      ABF6FF7EEDFFB88989FFF0E2FFEFDFFFF0E2FFF0E2FFF0E2FFF0E2FFF0E2FEEE
+      E0FBECDEFAEBDEF6E6D9B8898993F7FF019ACFFF00FFFF00FFFF00FFFF00FFFF
+      00FFFF00FF019ACFC7FFFF82F5FFB88989FFEEDFFFECDBFFEEDFFFEEDFFFEEDF
+      FFEEDFF9E8D9DECCC1D9CABDCFBDB4C8B3ACB88989B5FFFF019ACFFF00FFFF00
+      FFFF00FFFF00FFFF00FFFF00FF019ACFA4E0F0A0FDFFB88989FFECDBFFEBD8FF
+      ECDBFFECDBFFECDBFFECDBF5E2D2C4ABA7C2A8A5BBA39FC2AFA9B88989019ACF
+      FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF019ACFECFFFFB889
+      89FFEBD8FFEAD5FFEBD8FFEBD8FFEBD8FFEBD8FFEBD8D9C8C5FEFEFDFEF6EFDE
+      C9C0B88989FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+      FF00FF019ACFB88989FFE9D5FFE8D3FFE9D5FFE9D5FFE9D5FFE9D5FFE9D5C6AD
+      A9FEF8F2E8D4CACD9999FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+      00FFFF00FFFF00FFFF00FFFF00FFB88989FFE7D1FFE7D0FFE7D1FFE7D1FFE7D1
+      FFE7D1E7CEBFD3BFB9E8D5CCCD9999FF00FFFF00FFFF00FFFF00FFFF00FFFF00
+      FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFB88989FFE6CFFFE6CFFF
+      E6CFFFE6CFFFE6CFFFE6CFD5BBB2E0CCC5CD9999FF00FFFF00FFFF00FFFF00FF
+      FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFB889
+      89B88989B88989B88989B88989B88989B88989B88989B88989FF00FFFF00FFFF
+      00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+    }
+    OnClick = bbExportPublicKeyClick
+    TabOrder = 6
+  end
+  object bbImportPublicKey: TBitBtn
+    Left = 382
+    Height = 36
+    Top = 174
+    Width = 159
+    Caption = 'Import Public key'
+    Glyph.Data = {
+      F6060000424DF606000000000000360000002800000018000000180000000100
+      180000000000C0060000120B0000120B00000000000000000000FF00FFFF00FF
+      FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+      FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+      00FFFF00FFFF00FF019ACF019ACF019ACF019ACFFF00FFFF00FFFF00FFFF00FF
+      FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+      FFFF00FFFF00FFFF00FFFF00FF0D9FD18BD4EE6BD3F845C0ED28B0E0019ACF01
+      9ACF019ACF019ACFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+      FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF069CD076C8E5A9E9FE6DD8
+      FF75DBFF77DCFF77DBFF63D1F930B3E3029BD0019ACF019ACF019ACF019ACFFF
+      00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF019ACF
+      34AFD9BCE9F86ED8FF6FD8FE70D8FE70D8FE71D8FF74DBFF7ADEFF79DDFF73D9
+      FF5CCCF522ACDD019ACF019ACF019ACFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+      00FFFF00FF019ACF1FA9D68FD3EB97E4FF6FD9FE71D9FE71D9FE71D9FE71D9FE
+      71D9FE71D9FE73DAFE76DCFF7BDFFF7ADEFF78DCFF77DCFF019ACFFF00FFFF00
+      FFFF00FFFF00FFFF00FFFF00FF019ACF31B1DC49B7DEBDEEFB71DDFE77DEFE77
+      DEFE77DEFE77DEFE77DEFE77DEFE77DEFE76DEFE76DEFE76DEFE78DFFF7CE1FF
+      65D2F8019ACFFF00FFFF00FFFF00FFFF00FFFF00FF019ACF52C2E71DA7D5ADE2
+      F38FE8FF7CE2FE7CE3FE7CE3FE7CE3FE7CE3FE7CE3FE7CE3FE7CE3FE7CE3FE7C
+      E3FE7DE4FE7DE3FE5ED1F3019ACFFF00FFFF00FFFF00FFFF00FFFF00FF019ACF
+      60CAEF1FA8D85EC1E2BBF4FE7DE7FE82E8FE81E8FE81E8FE81E8FE81E8FE81E8
+      FE81E8FE81E8FE81E8FE82E8FE84E9FE5ED3F18DEEFF019ACFFF00FFFF00FFFF
+      00FFFF00FF019ACF65CFF53EB7E529ACD8BFEEF88DEFFF85EDFF85EDFF85EDFF
+      85EDFF86EDFF86EDFF86EDFF86EDFF86EDFF87EDFF89EEFF65D9F396F5FF019A
+      CFFF00FFFF00FFFF00FFFF00FF019ACF69D1F855C4F31FA7D773CBE7C5FCFF93
+      F7FF93F7FF92F6FF8DF4FF89F3FF89F2FF8BF2FF8BF2FF8BF2FF8BF2FF8EF3FF
+      6ADEF395F8FF98FAFF019ACFFF00FFFF00FFFF00FF019ACF77D5FC5CC8FB3EB8
+      E920A7D5B6E6F3D0F4FAD1F5FAD2F6FAD5F9FCB9FBFE9BF8FF8FF6FF91F6FF92
+      F6FF93F7FF6BD0B70C85188BEAE0A4FFFF43C1E2019ACFFF00FFFF00FF019ACF
+      8BDBFF5FCDFF64CDFE2CAFE30D9FD30FA0D310A0D310A0D317A3D38ED7ECE2FD
+      FEC3FAFFA5F8FFA3F8FF84DDCF0C851838B5570C8518ABF3EBB5FCFD019ACFFF
+      00FFFF00FF019ACF99E2FF67D3FF6DD4FE6CD4FE69D1FE64CEFB61CDF95BC9F5
+      48BEEB17A3D54BB8DDDFF7FBE8FCFFB1E7DD0C85184ACE7361EB9541C1640C85
+      18D6F6F0ADE9F5019ACFFF00FF019ACF9FE9FF70DCFF76DDFE76DDFE76DDFE75
+      DCFE74DCFE73DCFE73DBFE61CEF61CA8D91CA5D58CCED70C851842C5665BE68C
+      59E1895DE78F3EBD600C8518DBF1EF019ACFFF00FF019ACFA7EFFF76E5FF7CE5
+      FF7CE5FF7CE5FF7CE5FF7DE5FF7DE5FF7DE5FF7DE3FF72DDFB40B8D20C85182D
+      AD474AD47250D97B55DE8359E1885AE38B33AF510C85180197C3FF00FF019ACF
+      ABF6FF7EEDFF85ECFF85ECFF85ECFF85ECFF84ECFF80ECFF7CECFF7DECFF7EEC
+      FF0C85180C85180C85180C851840C7634FDA7A55DF830C85180C85180C85180C
+      8518FF00FF019ACFC7FFFF82F5FF8FF5FF8FF5FF8FF5FF8EF5FF8DF4FFA0FDFF
+      B7FFFFAFFFFFAEFFFFA6F9F4A5FBF8A3FCFA4CB07732B74F48D6704AD3720C85
+      18FF00FFFF00FFFF00FFFF00FF019ACFA4E0F0A0FDFF8AFCFF90FCFF90FCFF90
+      FCFF99FDFF86E8F5019ACF019ACF019ACF019ACF019ACF019ACF0486642CB347
+      41D16636BC540C8518FF00FFFF00FFFF00FFFF00FFFF00FF019ACFECFFFFBCFF
+      FFBCFFFFBCFFFFC0FFFF9DF5FB019ACFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+      00FF0C85182BB74538C9580C8518FF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+      FF00FF019ACF019ACF019ACF019ACF019ACF019ACFFF00FFFF00FFFF00FFFF00
+      FFFF00FFFF00FFFF00FF0C851828BB4126B13E0C8518FF00FFFF00FFFF00FFFF
+      00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+      FF00FFFF00FFFF00FFFF00FFFF00FF0C851814A4241CAE310C8518FF00FFFF00
+      FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+      00FFFF00FFFF00FFFF00FFFF00FFFF00FF0C85180C85180C96170D991A0C8518
+      FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+      FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF0C85180C85180C85180C85180C
+      8518FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+    }
+    OnClick = bbImportPublicKeyClick
+    TabOrder = 5
+  end
+  object bbGenerateNewKey: TBitBtn
+    Left = 382
+    Height = 36
+    Top = 60
+    Width = 159
+    Caption = 'Generate a new Key'
+    Glyph.Data = {
+      76060000424D7606000000000000360400002800000018000000180000000100
+      0800000000004002000000000000000000000001000000010000FF00FF007D33
+      2F00993300000C35EB000335FB001342FB00224EFB00325BFC005274FC000E80
+      AA001788AF000B86B200098AB700078CBA00078EBD00118EB9000E91BE001E94
+      BC002898BA000493C4000997C7000A9DCE00229BC20015AFD90026A0C80021AA
+      CF0035A0C30030AACA0032AACE003FB0CB003DBDDA0039B8DE0029BBE00046A6
+      C90056B1CE0052BDDB0068B0CA006BBDD700718DFC0019C7F1001BD4FE002FC6
+      E70026C2E9003ECDE9002CD3F9002ED8FE003CE0FE0054C0D40059C4D70059C2
+      DD006FC2D6007CC0D50076C4DF007AC6DF0043C8E90054DFFE0060CEEA006CD4
+      EE0064D9E90076DFE9007DDFE90055E0FF006BE3F40060ECFE0075E2FA007BE8
+      FF0071F2FE008099FC00A0B2FD00AFBFFD008FD0E60083DFE9008ADAEB0094DF
+      E90081DBF100A4DFEA0095EBFD0095EEFE009EEDFF0084F3F90080F5FC008FF6
+      FB0083F8FE0093F2FE0097F9FE0094FDFE0099FFFE009EFFFE00B4EEF300A4FF
+      FE00A8F9FE00ADFBFE00AAFFFE00B6F1FF00BCF2F800B3F9FF00B3FFFE00B9FF
+      FE00C3DFEA00CFD8FD00DFE5FE00CCF6FF00C9FFFE00CFFFFF00D1F7FF00DFFF
+      FF00EEF1FE00E5FFFF00F0F7FA00F5FFFF00FAFFFF00FEFEFE00000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000020202020202020202020200000000000000000000000000026F6F6F6F
+      64076A6F6F0200000000000000090909090909026F6F6F450504446F6F020000
+      00000009091919172A3638026F6F26040404066F6F020000000009123A3F2E28
+      2D3D41026A070404260504456F02000000000D3B523F2E282D3D410206040545
+      6F4304066F02000000000D3B523F2E282D3D41024407636F6F6A050443020000
+      00000D3B523F2E282D3D41026F6F6F6F6F6F44040401000000000D3B523F2E28
+      2D3D41026F6F6F6F6F6F6F080403000000000D3B523F2E282D3D41026F6F6F6F
+      6F6F6F6A0704040000000D3B54534D4E5D656802020202020202020201030404
+      00000D585E48311C16111A2225354634090000000000040404000C321D1E2927
+      2C37404A23180F21090000000000000404040B30503F2E282D3D414D391E150D
+      090000000000000000000D3B523F2E282D3D414D391E15130900000000000000
+      00000D3B523F2E282D3D414D391F1513090000000000000000000D3B523F2E28
+      2D3D414D391F1513090000000000000000000D3B523F2E282D3D414D391E1513
+      090000000000000000000D3B523F2E282D3D414D391F15130900000000000000
+      00000D3C5B5F5B5B56565656513E2014090000000000000000000D626F69675F
+      595656565654422B090000000000000000000D246C6D69675F5656565656501C
+      09000000000000000000000D1033334B49473C3B2F2F0A090000000000000000
+      00000000000D0D0D0D0D0D0D0D0D000000000000000000000000
+    }
+    OnClick = bbGenerateNewKeyClick
+    TabOrder = 2
+  end
+  object bbDelete: TBitBtn
+    Left = 382
+    Height = 36
+    Top = 251
+    Width = 159
+    Caption = 'Delete'
+    Glyph.Data = {
+      F6060000424DF606000000000000360000002800000018000000180000000100
+      180000000000C0060000120B0000120B00000000000000000000FF00FFFF00FF
+      FF00FFFF00FFFF00FFFF00FFFF00FFFF00FF00009A00009A00039D020DA4020D
+      A400039D00009A00009AFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+      00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF00009A020DA4041FB3072FC0
+      0732C20732C20732C20732C2072FC0041FB3020DA400009AFF00FFFF00FFFF00
+      FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF00009A01079F0526B807
+      32C20732C20732C20732C20732C20732C20732C20732C20732C20732C20526B8
+      01079F00009AFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF00009A0210
+      A7062FC50732C50732C20732C20732C20732C20732C20732C20732C20732C207
+      32C20732C20732C2072FC00210A700009AFF00FFFF00FFFF00FFFF00FFFF00FF
+      00009A0210A80633D00633CF0632CA0732C60732C20732C20732C20732C20732
+      C20732C20732C20732C20732C20732C20732C20732C20210A700009AFF00FFFF
+      00FFFF00FFFF00FF01079F0530D70533DA0633D50633D00632CB0732C70732C3
+      0732C20732C20732C20732C20732C20732C20732C20732C20732C20732C2072F
+      C001079FFF00FFFF00FFFF00FF00009A0427CC0534E40533DF0533DB022FD512
+      3DD44868DA042FC70430C30732C20732C20631C2002BC03E5FD01F46C8012CC0
+      0732C20732C20732C20526B800009AFF00FFFF00FF010DA90434EC0434EA0534
+      E50533E1113ADDB3C1F3FEFEFF7F95E50029C7042FC40631C20026BE5F7BD7F9
+      FAFDCED6F32146C80732C20732C20732C20732C2020DA4FF00FF00009A0321CB
+      0335F50434F00434EB0534E6224AE5EFF2FDFFFFFFFFFFFF7E95E60029C80024
+      C25F7AD7F9FAFEFFFFFFFFFFFF4464D10732C20732C20732C20732C2041FB300
+      009A00009A0431E90335FA0335F60434F10434EC002DE64164EAEBEEFCFFFFFF
+      FFFFFF718AE35875DCF9FAFEFFFFFFFCFCFE6781D9022CC00732C20732C20732
+      C20732C2072FC000009A00039E0737F30839FB0537FB0335F70434F20434ED00
+      28E64063EAEAEEFDFFFFFFFDFDFFFCFCFFFFFFFFFBFBFE6781DA0027BE0531C2
+      0732C20732C20732C20732C20732C200039D010DAC1241FB1E4AFB0C3CFB0335
+      FB0335F80435F30434EE0027E7385EEBE9EDFDFFFFFFFFFFFFF8F9FE5F7CDF00
+      25C50631C30732C20732C20732C20732C20732C20732C2020DA4020EAD224EFB
+      456AFC204CFB0335FB0335FB0335F90333F50029EF5272F1ECF0FDFFFFFFFFFF
+      FFF8F9FE718BE5002ACD0430CA0732C50732C20732C20732C20732C20732C202
+      0DA400039F2852F86785FD3E65FC0738FB0335FB0234FB002AFA5D7CF9F9FAFF
+      FFFFFFF4F6FEEEF1FDFFFFFFFFFFFF7E96E8002ACE0430CB0732C60732C30732
+      C20732C20732C200039D00009A2048F37792FD6B88FD1946FB0335FB0130FB5D
+      7DFDF9FAFFFFFFFFFCFCFF5978F3395DEDEBEEFDFFFFFFFFFFFF7F96E90631D1
+      0632CC0732C80732C30732C2072FC000009A00009A112ED76B88FD9AAEFD466B
+      FC093AFB214CFBFAFBFFFFFFFFFCFCFF6482FB002AF20027EC4063EEEBEEFDFF
+      FFFFFFFFFF4466E00633D20633CD0732C90732C4041FB300009AFF00FF0511B2
+      456AFCA8B9FE8FA5FD2E58FC0835FB92A7FDF1F4FF6583FD002AFB0234F90435
+      F40028ED4064EFE6EBFCABBAF5113ADE0633D80633D30633CF0632C9020DA4FF
+      00FFFF00FF00009A1B3DE57A94FDBFCCFE89A1FD2A54FC0637FB2652FC0030FB
+      0234FB0335FB0335FA0335F6002DF01F4AEE0A39E70130E20533DE0533D90633
+      D40526BF00009AFF00FFFF00FFFF00FF0108A72F56F792A8FDCDD7FE97ACFD45
+      6AFC1745FB0637FB0335FB0335FB0335FB0335FA0335F70434F20535ED0535E8
+      0534E40533DF0530D301079FFF00FFFF00FFFF00FFFF00FF00009A0717BA3A61
+      FC95AAFDCFD8FEB6C4FE7A94FD456AFC2752FC1745FB103FFB103FFB1543FB1B
+      48F91A46F40D3BEF0434E90533DF0210A900009AFF00FFFF00FFFF00FFFF00FF
+      FF00FF00009A0717BA3158F7839CFDC0CCFECDD7FEB8C6FE99ADFD7E97FD6C89
+      FD6583FD607FFC5073FC2E58FA0F3DF40431E60210AB00009AFF00FFFF00FFFF
+      00FFFF00FFFF00FFFF00FFFF00FF00009A0209A81F40E65073FC819AFDA1B4FE
+      AEBEFEA9BAFE9AAEFD839CFD6281FD3860FC1644F90529D90107A200009AFF00
+      FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF00009A07
+      13B41733DA2C53F73A61FB4066FC3961FC2A54F81741F00826D2010DAD00009A
+      FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+      FFFF00FFFF00FFFF00FF00009A00009A0105A0020EB1010DB00003A000009A00
+      009AFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+    }
+    OnClick = bbDeleteClick
+    TabOrder = 7
+  end
+  object bbUpdatePassword: TBitBtn
+    Left = 382
+    Height = 38
+    Top = 8
+    Width = 159
+    Caption = 'Password'
+    Font.Color = clWindowText
+    Font.Height = -13
+    Font.Name = 'Tahoma'
+    Font.Style = [fsBold]
+    Glyph.Data = {
+      76060000424D7606000000000000360400002800000018000000180000000100
+      0800000000004002000000000000000000000001000000010000000000000101
+      0100020202000303030004040400050505000606060007070700080808000909
+      09000A0A0A000B0B0B000C0C0C000D0D0D000E0E0E000F0F0F00101010001111
+      1100121212001313130014141400151515001616160017171700181818001919
+      19001A1A1A001B1B1B001C1C1C001D1D1D001E1E1E001F1F1F00202020002121
+      2100222222002323230024242400252525002626260027272700282828002929
+      29002A2A2A002B2B2B002C2C2C002D2D2D002E2E2E002F2F2F00303030003131
+      3100323232003333330034343400353535003636360037373700383838003939
+      39003A3A3A003B3B3B003C3C3C003D3D3D003E3E3E003F3F3F00404040004141
+      4100424242004343430044444400454545004646460047474700484848004949
+      49004A4A4A004B4B4B004C4C4C004D4D4D004E4E4E004F4F4F00505050005151
+      5100525252005353530054545400555555005656560057575700585858005959
+      59005A5A5A005B5B5B005C5C5C005D5D5D005E5E5E00685968007C4F7C009441
+      9400B72CB700DD15DD00F506F500FD01FD00FE00FE00FE00FE00FE00FE00FE00
+      FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00
+      FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00
+      FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00
+      FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00
+      FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00
+      FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00
+      FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00
+      FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00
+      FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00
+      FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00
+      FE00FE00FE00FE00FE00FE00FE00F008F900D517F000BD24E800A830E1007B4B
+      D0005065C1003774B7002B7DB100237FAC001F82AD001C83AD001785AE001687
+      AF001489B100128AB300108CB6000F8EB9000D91BB000C94BF000A97C3000A99
+      C5000A9AC7000B9BC8000B9CCA000C9ECC000C9FCD000DA0CE000DA1CE000EA2
+      CF0011A3CF0015A4CF0018A5CF001CA7D10021A9D1002AAAD00035AACD0035AD
+      D00035AFD30035B1D60037B5D8003AB8DB003EB9DC0040BBDD0045BEDE004CC1
+      E00055C6E3005BC8E40061CAE40066CBE3006BCCE30072D3E60078D8EB0080D8
+      EE0083D9F10085DCF40088DBF5008BDBF6008EDAF70091DAF70095DCF70097E0
+      F7009EE3F800A4E7F900A9E9F900AEE9F900B5EBF900B2EBF800919191919191
+      919191919191919191919191919191919191919191919191D5E7E8E7E3DED591
+      919191919191919191919191919191D6DDF7F8F8F7F6F4EEE6D5919191919191
+      919191919191D7DADEF8F8F6F7F6EDF1F8F1E69191919191919191919191DADE
+      DFFAFAF8F7F7E9EDF7F7F8EB91919191919191919191DDE5E3FCFCFAFAEEE0E9
+      F3F7F7F7DC919191919191919191DEE7E4FEFEFCFCEDC5E0EFF7F6F6DC919191
+      919191919191DEEAE7FEFEFEFDFBC4C4F5F7F6F6DC919191919191919191E3EC
+      E9FEFEFEFEFEE0C3F9F7F6F6DC919191919191919191E3E9E3F8F8F1F1F8FBFB
+      FCFAF7F6DC919191919191919191DCEAEAE0E1E9E5E3DEE4EBF2FAF9DC919191
+      919191919191DBF3EEC5C5EFF3EBE5DDD9D6E6F5DC91919191919191919191D5
+      E8EDF1FAF6F0EAE4DAD1D2DBDC919191919191919191919191DBE8F0F3F3F3E4
+      D0CFE4D8DC919191919191919191919191919191D5DEE4DED2CFD4D491919191
+      91919191919191919191919191919191D2CE9191919191919191919191919191
+      91C8C89191919191D2CE919191919191919191919191919191D9D09191919191
+      D2CE919191919191919191919191919191E6E39191919191D2CE919191919191
+      919191919191919191E0F3CE91919191D2CE9191919191919191919191919191
+      9191EFF6E1C9C8CDD9CC91919191919191919191919191919191C9EDF9F3F3EB
+      DC91919191919191919191919191919191919191CBE0E1CF9191919191919191
+      9191919191919191919191919191919191919191919191919191
+    }
+    OnClick = bbUpdatePasswordClick
+    ParentFont = False
+    TabOrder = 1
+  end
+  object bbExportAllWalletKeys: TBitBtn
+    Left = 30
+    Height = 36
+    Top = 425
+    Width = 201
+    Caption = 'Export all Wallet Keys to a file'
+    Glyph.Data = {
+      F6060000424DF606000000000000360000002800000018000000180000000100
+      180000000000C0060000120B0000120B00000000000000000000FF00FFFF00FF
+      FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+      FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+      00FFFF00FFFF00FF019ACF019ACF019ACF019ACFFF00FFFF00FFFF00FFFF00FF
+      FF00FFFF00FFFF00FFFF00FFFF00FFFF00FF0C8518FF00FFFF00FFFF00FFFF00
+      FFFF00FFFF00FFFF00FFFF00FF0D9FD18BD4EE6BD3F845C0ED28B0E0019ACF01
+      9ACF019ACF019ACFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF0C85180C8518
+      FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF069CD076C8E5A9E9FE6DD8
+      FF75DBFF77DCFF77DBFF63D1F930B3E3029BD0019ACF019ACF019ACF019ACFFF
+      00FF0C85181399220C8518FF00FFFF00FFFF00FFFF00FFFF00FFFF00FF019ACF
+      34AFD9BCE9F86ED8FF6FD8FE70D8FE70D8FE71D8FF0C85180C85180C85180C85
+      180C85180C85180C85180C85181DAC31139A220C8518FF00FFFF00FFFF00FFFF
+      00FFFF00FF019ACF1FA9D68FD3EB97E4FF6FD9FE71D9FE71D9FE71D9FE0C8518
+      57E38851DD7E4AD77443D0693BC95E34C1522BBA4725B33C1EAE33149B230C85
+      18FF00FFFF00FFFF00FFFF00FF019ACF31B1DC49B7DEBDEEFB71DDFE77DEFE77
+      DEFE77DEFE0C85185EE89059E48953DE804CD87645D16C3DCA6035C2542DBB49
+      26B53F1FAF35149B250C8518FF00FFFF00FFFF00FF019ACF52C2E71DA7D5ADE2
+      F38FE8FF7CE2FE7CE3FE7CE3FE0C851861EB955FE9925AE58B54DF824DD97846
+      D26D3ECB6237C4562FBD4C27B64021B037159B250C8518FF00FFFF00FF019ACF
+      60CAEF1FA8D85EC1E1C2E6ED8ACEE08FCFE18ECFE10C851861EB9561EB955FEA
+      935CE58D56E0844FDB7A48D47040CD6538C65931BF4D1DA3320C8518FF00FFFF
+      00FFFF00FF019ACF65CFF53EB7E52CA9D4C5EFF8ACF3FEA5F2FFA5F2FF0C8518
+      61EB9561EB9561EB9561EB945CE68E57E18650DC7C49D57242CE6727AD410C85
+      18FF00FFFF00FFFF00FFFF00FF019ACF69D1F855C4F32A9CC673CBE7D6FEFDB1
+      FBFDB2FBFD0C85180C85180C85180C85180C85180C85180C85180C851852DD7F
+      32B6500C851898FAFF019ACFFF00FFFF00FFFF00FF019ACF77D5FC5CC8FB748E
+      A224A8D5B9E7F3D5F5F9D5F6F9D6F6FADCFAFBCDFDFCB9FCFCAFFAFCB0FAFCB1
+      FAFC0C85183ABE5C0C85189FFCFFA4FFFF43C1E2019ACFFF00FFFF00FF019ACF
+      8BDBFF5FCDFFB7898973C3DD18A2D218A2D216A2D215A1D21AA4D391D7EBEBFE
+      FDDBFDFCC5FBFBC2FBFB0C85180C851883E4F3B6FDFFBAFFFFB5FCFD019ACFFF
+      00FFFF00FF019ACF99E2FF67D3FFB88989FEF5ECFDF3EBF0EFEAE5EBE8D6E5E6
+      A4D2E025A6D34DB9DDE5F8FBF5FDFCEBFCFB0C8518C4FBFF9CE4F2DAFEFFD9FE
+      FFE3FFFFADE9F5019ACFFF00FF019ACF9FE9FF70DCFFB88989FEF3E9FFF2E6FE
+      F3E9FEF3E9FEF3E9FEF3E9D4E4E439ADD422A5D49DD8ECF1F9FBEEEFEFE9FDFF
+      CEEEF7F8FFFFF7FFFFFEFFFFE9F9FD019ACFFF00FF019ACFA7EFFF76E5FFB889
+      89FFF2E5FFF0E2FFF2E5FFF2E5FFF2E5FFF2E5FFF2E5EAEBE38EC9DA44B0D501
+      9ACF019ACF019ACF019ACF019ACF019ACF019ACF019ACF019ACFFF00FF019ACF
+      ABF6FF7EEDFFB88989FFF0E2FFEFDFFFF0E2FFF0E2FFF0E2FFF0E2FFF0E2FEEE
+      E0FBECDEFAEBDEF6E6D9B8898993F7FF019ACFFF00FFFF00FFFF00FFFF00FFFF
+      00FFFF00FF019ACFC7FFFF82F5FFB88989FFEEDFFFECDBFFEEDFFFEEDFFFEEDF
+      FFEEDFF9E8D9DECCC1D9CABDCFBDB4C8B3ACB88989B5FFFF019ACFFF00FFFF00
+      FFFF00FFFF00FFFF00FFFF00FF019ACFA4E0F0A0FDFFB88989FFECDBFFEBD8FF
+      ECDBFFECDBFFECDBFFECDBF5E2D2C4ABA7C2A8A5BBA39FC2AFA9B88989019ACF
+      FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF019ACFECFFFFB889
+      89FFEBD8FFEAD5FFEBD8FFEBD8FFEBD8FFEBD8FFEBD8D9C8C5FEFEFDFEF6EFDE
+      C9C0B88989FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+      FF00FF019ACFB88989FFE9D5FFE8D3FFE9D5FFE9D5FFE9D5FFE9D5FFE9D5C6AD
+      A9FEF8F2E8D4CACD9999FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+      00FFFF00FFFF00FFFF00FFFF00FFB88989FFE7D1FFE7D0FFE7D1FFE7D1FFE7D1
+      FFE7D1E7CEBFD3BFB9E8D5CCCD9999FF00FFFF00FFFF00FFFF00FFFF00FFFF00
+      FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFB88989FFE6CFFFE6CFFF
+      E6CFFFE6CFFFE6CFFFE6CFD5BBB2E0CCC5CD9999FF00FFFF00FFFF00FFFF00FF
+      FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFB889
+      89B88989B88989B88989B88989B88989B88989B88989B88989FF00FFFF00FFFF
+      00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+    }
+    OnClick = bbExportAllWalletKeysClick
+    TabOrder = 10
+  end
+  object bbImportKeysFile: TBitBtn
+    Left = 247
+    Height = 36
+    Top = 425
+    Width = 174
+    Caption = 'Import a Wallet Keys File'
+    Glyph.Data = {
+      F6060000424DF606000000000000360000002800000018000000180000000100
+      180000000000C0060000120B0000120B00000000000000000000FF00FFFF00FF
+      FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+      FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+      00FFFF00FFFF00FF019ACF019ACF019ACF019ACFFF00FFFF00FFFF00FFFF00FF
+      FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+      FFFF00FFFF00FFFF00FFFF00FF0D9FD18BD4EE6BD3F845C0ED28B0E0019ACF01
+      9ACF019ACF019ACFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+      FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF069CD076C8E5A9E9FE6DD8
+      FF75DBFF77DCFF77DBFF63D1F930B3E3029BD0019ACF019ACF019ACF019ACFFF
+      00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF019ACF
+      34AFD9BCE9F86ED8FF6FD8FE70D8FE70D8FE71D8FF74DBFF7ADEFF79DDFF73D9
+      FF5CCCF522ACDD019ACF019ACF019ACFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+      00FFFF00FF019ACF1FA9D68FD3EB97E4FF6FD9FE71D9FE71D9FE71D9FE71D9FE
+      71D9FE71D9FE73DAFE76DCFF7BDFFF7ADEFF78DCFF77DCFF019ACFFF00FFFF00
+      FFFF00FFFF00FFFF00FFFF00FF019ACF31B1DC49B7DEBDEEFB71DDFE77DEFE77
+      DEFE77DEFE77DEFE77DEFE77DEFE77DEFE76DEFE76DEFE76DEFE78DFFF7CE1FF
+      65D2F8019ACFFF00FFFF00FFFF00FFFF00FFFF00FF019ACF52C2E71DA7D5ADE2
+      F38FE8FF7CE2FE7CE3FE7CE3FE7CE3FE7CE3FE7CE3FE7CE3FE7CE3FE7CE3FE7C
+      E3FE7DE4FE7DE3FE5ED1F3019ACFFF00FFFF00FFFF00FFFF00FFFF00FF019ACF
+      60CAEF1FA8D85EC1E2BBF4FE7DE7FE82E8FE81E8FE81E8FE81E8FE81E8FE81E8
+      FE81E8FE81E8FE81E8FE82E8FE84E9FE5ED3F18DEEFF019ACFFF00FFFF00FFFF
+      00FFFF00FF019ACF65CFF53EB7E529ACD8BFEEF88DEFFF85EDFF85EDFF85EDFF
+      85EDFF86EDFF86EDFF86EDFF86EDFF86EDFF87EDFF89EEFF65D9F396F5FF019A
+      CFFF00FFFF00FFFF00FFFF00FF019ACF69D1F855C4F31FA7D773CBE7C5FCFF93
+      F7FF93F7FF92F6FF8DF4FF89F3FF89F2FF8BF2FF8BF2FF8BF2FF8BF2FF8EF3FF
+      6ADEF395F8FF98FAFF019ACFFF00FFFF00FFFF00FF019ACF77D5FC5CC8FB3EB8
+      E920A7D5B6E6F3D0F4FAD1F5FAD2F6FAD5F9FCB9FBFE9BF8FF8FF6FF91F6FF92
+      F6FF93F7FF6BD0B70C85188BEAE0A4FFFF43C1E2019ACFFF00FFFF00FF019ACF
+      8BDBFF5FCDFF64CDFE2CAFE30D9FD30FA0D310A0D310A0D317A3D38ED7ECE2FD
+      FEC3FAFFA5F8FFA3F8FF84DDCF0C851838B5570C8518ABF3EBB5FCFD019ACFFF
+      00FFFF00FF019ACF99E2FF67D3FF6DD4FE6CD4FE69D1FE64CEFB61CDF95BC9F5
+      48BEEB17A3D54BB8DDDFF7FBE8FCFFB1E7DD0C85184ACE7361EB9541C1640C85
+      18D6F6F0ADE9F5019ACFFF00FF019ACF9FE9FF70DCFF76DDFE76DDFE76DDFE75
+      DCFE74DCFE73DCFE73DBFE61CEF61CA8D91CA5D58CCED70C851842C5665BE68C
+      59E1895DE78F3EBD600C8518DBF1EF019ACFFF00FF019ACFA7EFFF76E5FF7CE5
+      FF7CE5FF7CE5FF7CE5FF7DE5FF7DE5FF7DE5FF7DE3FF72DDFB40B8D20C85182D
+      AD474AD47250D97B55DE8359E1885AE38B33AF510C85180197C3FF00FF019ACF
+      ABF6FF7EEDFF85ECFF85ECFF85ECFF85ECFF84ECFF80ECFF7CECFF7DECFF7EEC
+      FF0C85180C85180C85180C851840C7634FDA7A55DF830C85180C85180C85180C
+      8518FF00FF019ACFC7FFFF82F5FF8FF5FF8FF5FF8FF5FF8EF5FF8DF4FFA0FDFF
+      B7FFFFAFFFFFAEFFFFA6F9F4A5FBF8A3FCFA4CB07732B74F48D6704AD3720C85
+      18FF00FFFF00FFFF00FFFF00FF019ACFA4E0F0A0FDFF8AFCFF90FCFF90FCFF90
+      FCFF99FDFF86E8F5019ACF019ACF019ACF019ACF019ACF019ACF0486642CB347
+      41D16636BC540C8518FF00FFFF00FFFF00FFFF00FFFF00FF019ACFECFFFFBCFF
+      FFBCFFFFBCFFFFC0FFFF9DF5FB019ACFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+      00FF0C85182BB74538C9580C8518FF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+      FF00FF019ACF019ACF019ACF019ACF019ACF019ACFFF00FFFF00FFFF00FFFF00
+      FFFF00FFFF00FFFF00FF0C851828BB4126B13E0C8518FF00FFFF00FFFF00FFFF
+      00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+      FF00FFFF00FFFF00FFFF00FFFF00FF0C851814A4241CAE310C8518FF00FFFF00
+      FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+      00FFFF00FFFF00FFFF00FFFF00FFFF00FF0C85180C85180C96170D991A0C8518
+      FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+      FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF0C85180C85180C85180C85180C
+      8518FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+    }
+    OnClick = bbImportKeysFileClick
+    TabOrder = 11
+  end
+  object SaveDialog: TSaveDialog
+    DefaultExt = '.dat'
+    Filter = 'Wallet keys file|*.dat|All files|*.*'
+    FilterIndex = 0
+    left = 150
+    top = 150
+  end
+  object OpenDialog: TOpenDialog
+    DefaultExt = '.dat'
+    Filter = 'Wallet keys file (*.dat)|*.dat|All files (*.*)|*.*'
+    FilterIndex = 0
+    left = 205
+    top = 155
+  end
+end

+ 16 - 3
Units/Forms/UFRMWalletKeys.pas

@@ -1,5 +1,9 @@
 unit UFRMWalletKeys;
 
+{$IFDEF FPC}
+  {$MODE Delphi}
+{$ENDIF}
+
 { Copyright (c) 2016 by Albert Molina
 
   Distributed under the MIT software license, see the accompanying file LICENSE
@@ -71,9 +75,18 @@ type
 implementation
 
 uses
-  UCrypto, UAccounts, Windows, UFRMNewPrivateKeyType, UAES;
-
-{$R *.dfm}
+{$IFnDEF FPC}
+  Windows,
+{$ELSE}
+  LCLIntf, LCLType, LMessages,
+{$ENDIF}
+  UCrypto, UAccounts, UFRMNewPrivateKeyType, UAES;
+
+{$IFnDEF FPC}
+  {$R *.dfm}
+{$ELSE}
+  {$R *.lfm}
+{$ENDIF}
 
 { TFRMWalletKeys }
 

+ 68 - 23
Units/Utils/UAES.pas → Units/PascalCoin/UAES.pas

@@ -26,6 +26,7 @@ unit UAES;
 
   }
 
+{$I config.inc}
 interface
 
 uses
@@ -41,16 +42,26 @@ Type
     Class function EVP_Decrypt_AES256(const EncryptedMessage: TRawBytes; APassword: AnsiString; var Decrypted : AnsiString) : Boolean; overload;
   End;
 
+{$IFDEF FPC}
+procedure CopyMemory(Destination: Pointer; Source: Pointer; Length: DWORD);
+{$ENDIF}
+
 implementation
 
 uses
 {$IFnDEF FPC}
   Windows,
 {$ELSE}
-  LCLIntf, LCLType, LMessages, Windows,
+  LCLIntf, LCLType, LMessages,
 {$ENDIF}
-  ssl_const, ssl_bn, ssl_types, ssl_evp;
+  UOpenSSL, UOpenSSLdef;
 
+{$IFDEF FPC}
+procedure CopyMemory(Destination: Pointer; Source: Pointer; Length: DWORD);
+begin
+  Move(Source^, Destination^, Length);
+end;
+{$ENDIF}
 
 CONST SALT_MAGIC: AnsiString = 'Salted__'; SALT_MAGIC_LEN: integer = 8; SALT_SIZE = 8;
 
@@ -62,7 +73,10 @@ end;
 
 Function EVP_GetKeyIV(APassword: TBytes; ACipher: PEVP_CIPHER; const ASalt: TBytes; out Key, IV: TBytes) : Boolean;
 var
+  pctx: PEVP_MD_CTX;
+  {$IFDEF OpenSSL10}
   ctx: EVP_MD_CTX;
+  {$ENDIF}
   hash: PEVP_MD;
   mdbuff: TBytes;
   mds: integer;
@@ -93,30 +107,38 @@ begin
   // This method relies on the fact that the hashing method produces a key of
   // the correct size. EVP_BytesToKey goes through muptiple hashing passes if
   // necessary to make the key big enough when using smaller hashes.
-
+  {$IFDEF OpenSSL10}
   EVP_MD_CTX_init(@ctx);
+  pctx := @ctx;
+  {$ELSE}
+  pctx := EVP_MD_CTX_new;
+  {$ENDIF}
   try
     // Key first
-    If EVP_DigestInit_ex(@ctx, hash, nil)<>1 then exit;
-    If EVP_DigestUpdate(@ctx, @APassword[0], Length(APassword))<>1 then exit;
+    If EVP_DigestInit_ex(pctx, hash, nil)<>1 then exit;
+    If EVP_DigestUpdate(pctx, @APassword[0], Length(APassword))<>1 then exit;
     if (ASalt <> nil) then begin
-      if EVP_DigestUpdate(@ctx, @ASalt[0], Length(ASalt))<>1 then exit;
+      if EVP_DigestUpdate(pctx, @ASalt[0], Length(ASalt))<>1 then exit;
     end;
-    if (EVP_DigestFinal_ex(@ctx, @Key[0], mds)<>1) then exit;
+    if (EVP_DigestFinal_ex(pctx, @Key[0], mds)<>1) then exit;
 
     // Derive IV next
-    If EVP_DigestInit_ex(@ctx, hash, nil)<>1 then exit;
-    If EVP_DigestUpdate(@ctx, @Key[0], mds)<>1 then exit;
-    If EVP_DigestUpdate(@ctx, @APassword[0], Length(APassword))<>1 then exit;
+    If EVP_DigestInit_ex(pctx, hash, nil)<>1 then exit;
+    If EVP_DigestUpdate(pctx, @Key[0], mds)<>1 then exit;
+    If EVP_DigestUpdate(pctx, @APassword[0], Length(APassword))<>1 then exit;
     if (ASalt <> nil) then begin
-      if EVP_DigestUpdate(@ctx, @ASalt[0], Length(ASalt))<>1 then exit;
+      if EVP_DigestUpdate(pctx, @ASalt[0], Length(ASalt))<>1 then exit;
     end;
-    If EVP_DigestFinal_ex(@ctx, @IV[0], mds)<>1 then exit;
+    If EVP_DigestFinal_ex(pctx, @IV[0], mds)<>1 then exit;
 
     SetLength(IV, niv);
     Result := true;
   finally
-    EVP_MD_CTX_cleanup(@ctx);
+    {$IFDEF OpenSSL10}
+    EVP_MD_CTX_cleanup(pctx);
+    {$ELSE}
+    EVP_MD_CTX_free(pctx);
+    {$ENDIF}
   end;
 end;
 
@@ -139,7 +161,10 @@ end;
 class function TAESComp.EVP_Decrypt_AES256(const Value: TBytes; APassword: TBytes; var Decrypted: TBytes) : Boolean;
 var
   cipher: PEVP_CIPHER;
+  pctx: PEVP_CIPHER_CTX;
+  {$IFDEF OpenSSL10}
   ctx: EVP_CIPHER_CTX;
+  {$ENDIF}
   salt, key, iv, buf: TBytes;
   src_start, buf_start, out_len: integer;
 begin
@@ -158,21 +183,29 @@ begin
     If Not EVP_GetKeyIV(APassword, cipher, nil, key, iv) then exit;
     src_start := 0;
   end;
-
+  {$IFDEF OpenSSL10}
   EVP_CIPHER_CTX_init(@ctx);
+  pctx := @ctx;
+  {$ELSE}
+  pctx := EVP_CIPHER_CTX_new;
+  {$ENDIF}
   try
-    If EVP_DecryptInit(@ctx, cipher, @key[0], @iv[0])<>1 then exit;
+    If EVP_DecryptInit(pctx, cipher, @key[0], @iv[0])<>1 then exit;
     SetLength(buf, Length(Value));
     buf_start := 0;
-    If EVP_DecryptUpdate(@ctx, @buf[buf_start], out_len, @Value[src_start], Length(Value) - src_start)<>1 then exit;
+    If EVP_DecryptUpdate(pctx, @buf[buf_start], out_len, @Value[src_start], Length(Value) - src_start)<>1 then exit;
     Inc(buf_start, out_len);
-    If EVP_DecryptFinal(@ctx, @buf[buf_start], out_len)<>1 then exit;
+    If EVP_DecryptFinal(pctx, @buf[buf_start], out_len)<>1 then exit;
     Inc(buf_start, out_len);
     SetLength(buf, buf_start);
     Decrypted := buf;
     Result := true;
   finally
-    EVP_CIPHER_CTX_cleanup(@ctx);
+    {$IFDEF OpenSSL10}
+    EVP_CIPHER_CTX_cleanup(pctx);
+    {$ELSE}
+    EVP_CIPHER_CTX_free(pctx);
+    {$ENDIF}
   end;
 end;
 
@@ -191,7 +224,10 @@ end;
 class function TAESComp.EVP_Encrypt_AES256(Value, APassword: TBytes): TBytes;
 var
   cipher: PEVP_CIPHER;
+  pctx: PEVP_CIPHER_CTX;
+  {$IFDEF OpenSSL10}
   ctx: EVP_CIPHER_CTX;
+  {$ENDIF}
   salt, key, iv, buf: TBytes;
   block_size: integer;
   buf_start, out_len: integer;
@@ -200,24 +236,33 @@ begin
   salt := EVP_GetSalt;
   EVP_GetKeyIV(APassword, cipher, salt, key, iv);
 
+  {$IFDEF OpenSSL10}
   EVP_CIPHER_CTX_init(@ctx);
+  pctx := @ctx;
+  {$ELSE}
+  pctx := EVP_CIPHER_CTX_new;
+  {$ENDIF}
   try
-    EVP_EncryptInit(@ctx, cipher, @key[0], @iv[0]);
-    block_size := EVP_CIPHER_CTX_block_size(@ctx);
+    EVP_EncryptInit(pctx, cipher, @key[0], @iv[0]);
+    block_size := EVP_CIPHER_CTX_block_size(pctx);
     SetLength(buf, Length(Value) + block_size + SALT_MAGIC_LEN + PKCS5_SALT_LEN);
     buf_start := 0;
     Move(PAnsiChar(SALT_MAGIC)^, buf[buf_start], SALT_MAGIC_LEN);
     Inc(buf_start, SALT_MAGIC_LEN);
     Move(salt[0], buf[buf_start], PKCS5_SALT_LEN);
     Inc(buf_start, PKCS5_SALT_LEN);
-    EVP_EncryptUpdate(@ctx, @buf[buf_start], out_len, @Value[0], Length(Value));
+    EVP_EncryptUpdate(pctx, @buf[buf_start], out_len, @Value[0], Length(Value));
     Inc(buf_start, out_len);
-    EVP_EncryptFinal(@ctx, @buf[buf_start], out_len);
+    EVP_EncryptFinal(pctx, @buf[buf_start], out_len);
     Inc(buf_start, out_len);
     SetLength(buf, buf_start);
     result := buf;
   finally
-    EVP_CIPHER_CTX_cleanup(@ctx);
+    {$IFDEF OpenSSL10}
+    EVP_CIPHER_CTX_cleanup(pctx);
+    {$ELSE}
+    EVP_CIPHER_CTX_free(pctx);
+    {$ENDIF}
   end;
 end;
 

+ 127 - 29
Units/PascalCoin/UAccounts.pas

@@ -20,11 +20,6 @@ unit UAccounts;
 interface
 
 uses
-{$IFnDEF FPC}
-  Windows,
-{$ELSE}
-  LCLIntf, LCLType, LMessages,
-{$ENDIF}
   Classes, UConst, UCrypto, SyncObjs;
 
 Type
@@ -50,6 +45,7 @@ Type
     Class Function AccountKeyFromImport(Const HumanReadable : AnsiString; var account : TAccountKey; var errors : AnsiString) : Boolean;
     Class Function AccountPublicKeyExport(Const account : TAccountKey) : AnsiString;
     Class Function AccountPublicKeyImport(Const HumanReadable : AnsiString; var account : TAccountKey; var errors : AnsiString) : Boolean;
+    Class Function AccountBlock(Const account_number : Cardinal) : Cardinal;
   End;
 
   TAccount = Record
@@ -58,6 +54,8 @@ Type
     balance: UInt64;          // Balance, allways >= 0
     updated_block: Cardinal;  // Number of block where was updated
     n_operation: Cardinal;    // count number of owner operations (when receive, this is not updated)
+    //
+    previous_updated_block : Cardinal; // New Build 1.0.8 -> Only used to store this info to storage. It helps App to search when an account was updated. NOT USED FOR HASH CALCULATIONS!
   End;
   PAccount = ^TAccount;
 
@@ -66,6 +64,8 @@ Type
     accounts : Array[0..CT_AccountsPerBlock-1] of TAccount;
     timestamp: Cardinal;      // FIXED: Same value that stored in BlockChain. Included here because I need it to calculate new target value
     block_hash: AnsiString;   // Calculated on every block change (on create and on accounts updated)
+    // New Build 1.0.8 "target" stored in TBlockAccount to increase performance calculating network hash rate.
+    target: Cardinal;         // FIXED: Same value that stored in BlockChain. ** NOT USED TO CALC BLOCK HASHING **
   end;
   PBlockAccount = ^TBlockAccount;
 
@@ -106,6 +106,8 @@ Type
   // happens only when a new BlockChain is included. After this, a new "SafeBoxHash"
   // is created, so each SafeBox has a unique SafeBoxHash
 
+  { TPCSafeBox }
+
   TPCSafeBox = Class
   private
     FBlockAccountsList : TList;
@@ -129,12 +131,14 @@ Type
     Procedure CopyFrom(accounts : TPCSafeBox);
     Class Function CalcBlockHash(const block : TBlockAccount):AnsiString;
     Class Function BlockAccountToText(Const block : TBlockAccount):AnsiString;
-    Function LoadFromStream(Stream : TStream; var LastReadBlock : TBlockAccount; var errors : AnsiString) : Boolean;
-    Procedure SaveToStream(Stream : TStream);
+    Function LoadSafeBoxFromStream(Stream : TStream; var LastReadBlock : TBlockAccount; var errors : AnsiString) : Boolean;
+    Class Function LoadSafeBoxStreamHeader(Stream : TStream; var BlocksCount : Cardinal) : Boolean;
+    Procedure SaveSafeBoxToAStream(Stream : TStream);
     Procedure Clear;
     Function Account(account_number : Cardinal) : TAccount;
     Function Block(block_number : Cardinal) : TBlockAccount;
     Function CalcSafeBoxHash : TRawBytes;
+    Function CalcBlockHashRateInKhs(block_number : Cardinal; Previous_blocks_average : Cardinal) : Int64;
     Property TotalBalance : Int64 read FTotalBalance;
     Procedure StartThreadSafe;
     Procedure EndThreadSave;
@@ -216,19 +220,20 @@ Const
   CT_BlockAccount_NUL : TBlockAccount = (
     blockaccount:0;
     accounts:(
-    (account:0;accountkey:(EC_OpenSSL_NID:0;x:'';y:'');balance:0;updated_block:0;n_operation:0),
-    (account:0;accountkey:(EC_OpenSSL_NID:0;x:'';y:'');balance:0;updated_block:0;n_operation:0),
-    (account:0;accountkey:(EC_OpenSSL_NID:0;x:'';y:'');balance:0;updated_block:0;n_operation:0),
-    (account:0;accountkey:(EC_OpenSSL_NID:0;x:'';y:'');balance:0;updated_block:0;n_operation:0),
-    (account:0;accountkey:(EC_OpenSSL_NID:0;x:'';y:'');balance:0;updated_block:0;n_operation:0)
+    (account:0;accountkey:(EC_OpenSSL_NID:0;x:'';y:'');balance:0;updated_block:0;n_operation:0;previous_updated_block:0),
+    (account:0;accountkey:(EC_OpenSSL_NID:0;x:'';y:'');balance:0;updated_block:0;n_operation:0;previous_updated_block:0),
+    (account:0;accountkey:(EC_OpenSSL_NID:0;x:'';y:'');balance:0;updated_block:0;n_operation:0;previous_updated_block:0),
+    (account:0;accountkey:(EC_OpenSSL_NID:0;x:'';y:'');balance:0;updated_block:0;n_operation:0;previous_updated_block:0),
+    (account:0;accountkey:(EC_OpenSSL_NID:0;x:'';y:'');balance:0;updated_block:0;n_operation:0;previous_updated_block:0)
     );
     timestamp:0;
-    block_hash:'');
+    block_hash:'';
+    target:0;);
 
 implementation
 
 uses
-  SysUtils, ULog, ssl_const, ssl_err, UThread;
+  SysUtils, ULog, UOpenSSLdef, UOpenSSL, UThread;
 
 { TStreamOp }
 
@@ -294,6 +299,11 @@ begin
 end;
 
 
+class function TAccountComp.AccountBlock(const account_number: Cardinal): Cardinal;
+begin
+  Result := account_number DIV CT_AccountsPerBlock;
+end;
+
 class function TAccountComp.AccountKey2RawString(account: TAccountKey): AnsiString;
 Var s : TMemoryStream;
 begin
@@ -454,25 +464,30 @@ class function TAccountComp.AccountTxtNumberToAccountNumber(const account_txt_nu
 Var i : Integer;
   char1 : AnsiChar;
   char2 : AnsiChar;
-  n : Int64;
+  an,rn,anaux : Int64;
 begin
   Result := false;
   if length(trim(account_txt_number))=0 then exit;
-  n := 0;
-  for i := 1 to length(account_txt_number) do begin
+  an := 0;
+  i := 1;
+  while (i<=length(account_txt_number)) do begin
     if account_txt_number[i] in ['0'..'9'] then begin
-      n := (n * 10) + ord( account_txt_number[i] ) - ord('0');
-    end else break;
+      an := (an * 10) + ord( account_txt_number[i] ) - ord('0');
+    end else begin
+      break;
+    end;
+    inc(i);
   end;
-  account_number := n;
-  if i>length(account_txt_number) then begin
+  account_number := an;
+  if (i>length(account_txt_number)) then begin
     result := true;
     exit;
   end;
   if (account_txt_number[i] in ['-','.',' ']) then inc(i);
   if length(account_txt_number)-1<>i then exit;
-  n := StrToIntDef(copy(account_txt_number,i,length(account_txt_number)),0);
-  Result := n = (((((((account_number * 3) MOD 97) * 7) MOD 101) * 5) MOD 89)+10);
+  rn := StrToIntDef(copy(account_txt_number,i,length(account_txt_number)),0);
+  anaux := (((((((an * 3) MOD 97) * 7) MOD 101) * 5) MOD 89)+10);
+  Result := rn = anaux;
 end;
 
 class function TAccountComp.Equal(account1, account2: TAccountKey): Boolean;
@@ -588,7 +603,9 @@ begin
   Result := PBlockAccount(FBlockAccountsList.Items[b])^.accounts[account_number MOD CT_AccountsPerBlock];
 end;
 
-function TPCSafeBox.AddNew(Const accountkey: TAccountKey; reward: UInt64; timestamp: Cardinal; compact_target: Cardinal; Const proof_of_work: AnsiString) : TBlockAccount;
+function TPCSafeBox.AddNew(const accountkey: TAccountKey; reward: UInt64;
+  timestamp: Cardinal; compact_target: Cardinal; const proof_of_work: AnsiString
+  ): TBlockAccount;
 var i, base_addr : Integer;
   P : PBlockAccount;
   accs : Array of cardinal;
@@ -612,6 +629,7 @@ begin
   end;
   Result.timestamp := timestamp;
   Result.block_hash := CalcBlockHash(Result);
+  Result.target := compact_target;
   New(P);
   P^ := Result;
   FBlockAccountsList.Add(P);
@@ -685,6 +703,51 @@ begin
   end;
 end;
 
+function TPCSafeBox.CalcBlockHashRateInKhs(block_number: Cardinal;
+  Previous_blocks_average: Cardinal): Int64;
+Var c,t : Cardinal;
+  t_sum : Extended;
+  bn, bn_sum : TBigNum;
+begin
+  FLock.Acquire;
+  Try
+    bn_sum := TBigNum.Create;
+    try
+      if (block_number=0) then begin
+        Result := 1;
+        exit;
+      end;
+      if (block_number<0) Or (block_number>=FBlockAccountsList.Count) then raise Exception.Create('Invalid block number: '+inttostr(block_number));
+      if (Previous_blocks_average<=0) then raise Exception.Create('Dev error 20161016-1');
+      if (Previous_blocks_average>block_number) then Previous_blocks_average := block_number;
+      //
+      c := (block_number - Previous_blocks_average)+1;
+      t_sum := 0;
+      while (c<=block_number) do begin
+        bn := TBigNum.TargetToHashRate(PBlockAccount(FBlockAccountsList.Items[c])^.target);
+        try
+          bn_sum.Add(bn);
+        finally
+          bn.Free;
+        end;
+        t_sum := t_sum + (PBlockAccount(FBlockAccountsList.Items[c])^.timestamp - PBlockAccount(FBlockAccountsList.Items[c-1])^.timestamp);
+        inc(c);
+      end;
+      bn_sum.Divide(Previous_blocks_average); // Obtain target average
+      t_sum := t_sum / Previous_blocks_average; // time average
+      t := Round(t_sum);
+      if (t<>0) then begin
+        bn_sum.Divide(t);
+      end;
+      Result := bn_sum.Divide(1024).Value; // Value in Kh/s
+    Finally
+      bn_sum.Free;
+    end;
+  Finally
+    FLock.Release;
+  End;
+end;
+
 function TPCSafeBox.CalcSafeBoxHash: TRawBytes;
 begin
   // If No buffer to hash is because it's firts block... so use Genesis: CT_Genesis_Magic_String_For_Old_Block_Hash
@@ -764,13 +827,14 @@ begin
   FLock.Release;
 end;
 
-function TPCSafeBox.LoadFromStream(Stream : TStream; var LastReadBlock : TBlockAccount; var errors : AnsiString) : Boolean;
+function TPCSafeBox.LoadSafeBoxFromStream(Stream : TStream; var LastReadBlock : TBlockAccount; var errors : AnsiString) : Boolean;
 Var w : Word;
   blockscount,iblock,iacc : Cardinal;
   s : AnsiString;
   block : TBlockAccount;
   P : PBlockAccount;
   j : Integer;
+  safeBoxBankVersion : Word;
 begin
   Clear;
   Result := false;
@@ -782,7 +846,11 @@ begin
     if Stream.Size<8 then exit;
     Stream.Read(w,2);
     if w<>CT_BlockChain_Protocol_Version then exit;
-    Stream.Read(w,2); // protocol version available, nothing to do with it
+    Stream.Read(safeBoxBankVersion,2);
+    if safeBoxBankVersion<>CT_SafeBoxBankVersion then begin
+      errors := 'Invalid SafeBoxBank version: '+InttostR(safeBoxBankVersion);
+      exit;
+    end;
     Stream.Read(blockscount,4);
     if blockscount>(CT_NewLineSecondsAvg*2000000) then exit; // Protection for corrupted data...
     errors := 'Corrupted stream';
@@ -799,6 +867,9 @@ begin
         if Stream.Read(block.accounts[iacc].balance,SizeOf(UInt64))<SizeOf(UInt64) then exit;
         if Stream.Read(block.accounts[iacc].updated_block,4)<4 then exit;
         if Stream.Read(block.accounts[iacc].n_operation,4)<4 then exit;
+        if safeBoxBankVersion>=1 then begin
+          if Stream.Read(block.accounts[iacc].previous_updated_block,4)<4 then exit;
+        end;
         // check valid
         if not TAccountComp.IsValidAccountKey(block.accounts[iacc].accountkey,s) then begin
           errors := errors + ' > '+s;
@@ -812,6 +883,9 @@ begin
       block.block_hash := s;
       // Check is valid:
       if CalcBlockHash(block)<>block.block_hash then exit;
+      if safeBoxBankVersion>=2 then begin
+        if Stream.Read(block.target,4)<4 then exit;
+      end;
       // Add
       New(P);
       P^ := block;
@@ -828,14 +902,32 @@ begin
   End;
 end;
 
-procedure TPCSafeBox.SaveToStream(Stream: TStream);
+class function TPCSafeBox.LoadSafeBoxStreamHeader(Stream: TStream; var BlocksCount: Cardinal): Boolean;
+Var w : Word;
+  s : AnsiString;
+  safeBoxBankVersion : Word;
+begin
+  Result := false;
+  TStreamOp.ReadAnsiString(Stream,s);
+  if (s<>CT_MagicIdentificator) then exit;
+  if Stream.Size<8 then exit;
+  Stream.Read(w,2);
+  if w<>CT_BlockChain_Protocol_Version then exit;
+  Stream.Read(safeBoxBankVersion,2);
+  if safeBoxBankVersion<>CT_SafeBoxBankVersion then exit;
+  Stream.Read(BlocksCount,4);
+  if BlocksCount>(CT_NewLineSecondsAvg*2000000) then exit; // Protection for corrupted data...
+  Result := True;
+end;
+
+procedure TPCSafeBox.SaveSafeBoxToAStream(Stream: TStream);
 Var
   c,iblock,iacc : Cardinal;
   b : TBlockAccount;
 begin
   TStreamOp.WriteAnsiString(Stream,CT_MagicIdentificator);
   Stream.Write(CT_BlockChain_Protocol_Version,SizeOf(CT_BlockChain_Protocol_Version));
-  Stream.Write(CT_BlockChain_Protocol_Available,SizeOf(CT_BlockChain_Protocol_Available));
+  Stream.Write(CT_SafeBoxBankVersion,SizeOf(CT_SafeBoxBankVersion));
   c := BlocksCount;
   Stream.Write(c,Sizeof(c));
   for iblock := 0 to c-1 do begin
@@ -847,9 +939,11 @@ begin
       Stream.Write(b.accounts[iacc].balance,Sizeof(b.accounts[iacc].balance));
       Stream.Write(b.accounts[iacc].updated_block,Sizeof(b.accounts[iacc].updated_block));
       Stream.Write(b.accounts[iacc].n_operation,Sizeof(b.accounts[iacc].n_operation));
+      Stream.Write(b.accounts[iacc].previous_updated_block,Sizeof(b.accounts[iacc].previous_updated_block));
     end;
     Stream.Write(b.timestamp,Sizeof(b.timestamp));
     TStreamOp.WriteAnsiString(Stream,b.block_hash);
+    Stream.Write(b.target,Sizeof(b.target));
   end;
 end;
 
@@ -870,6 +964,7 @@ begin
   P^.accounts[iAccount].accountkey := newAccountkey;
   lastbalance := P^.accounts[iAccount].balance;
   P^.accounts[iAccount].balance := newBalance;
+  P^.accounts[iAccount].previous_updated_block := P^.accounts[iAccount].updated_block;
   P^.accounts[iAccount].updated_block := BlocksCount;
   P^.accounts[iAccount].n_operation := newN_operation;
   P^.block_hash := CalcBlockHash(P^);
@@ -1055,6 +1150,8 @@ begin
     errors := 'Max fee';
     Exit;
   end;
+  PaccSender^.previous_updated_block := PaccSender^.updated_block;
+  PaccTarget^.previous_updated_block := PaccTarget.updated_block;
   PaccSender^.updated_block := FFreezedAccounts.BlocksCount;
   PaccTarget^.updated_block := FFreezedAccounts.BlocksCount;
   PaccSender^.n_operation := n_operation;
@@ -1089,6 +1186,7 @@ begin
     errors := 'Insuficient founds';
     Exit;
   end;
+  P^.previous_updated_block := P^.updated_block;
   P^.updated_block := FFreezedAccounts.BlocksCount;
   P^.n_operation := n_operation;
   P^.accountkey := accountkey;
@@ -1179,7 +1277,7 @@ Type
 
 function SortOrdered(Item1, Item2: Pointer): Integer;
 begin
-   Result := Integer(Item1) - Integer(Item2);
+   Result := PtrInt(Item1) - PtrInt(Item2);
 end;
 
 procedure TOrderedAccountKeysList.AddAccountKey(const AccountKey: TAccountKey);

+ 246 - 23
Units/PascalCoin/UBlockChain.pas

@@ -20,11 +20,6 @@ unit UBlockChain;
 interface
 
 uses
-{$IFnDEF FPC}
-  Windows,
-{$ELSE}
-  LCLIntf, LCLType, LMessages,
-{$ENDIF}
   Classes, UCrypto, UAccounts, ULog, UThread, SyncObjs;
 
 
@@ -134,10 +129,40 @@ Type
   TPCOperation = Class;
   TPCOperationClass = Class of TPCOperation;
 
+  TOperationResume = Record
+    Block : Cardinal;
+    NOpInsideBlock : Integer;
+    time : Cardinal;
+    AffectedAccount : Cardinal;
+    OperationTxt : AnsiString;
+    Amount : Int64;
+    Fee : Int64;
+    Balance : Int64;
+    OriginalPayload : TRawBytes;
+    PrintablePayload : AnsiString;
+  end;
+
+  TOperationsResumeList = Class
+  private
+    FList : TPCThreadList;
+    function GetOperationResume(index: Integer): TOperationResume;
+  public
+    Constructor Create;
+    Destructor Destroy; override;
+    Procedure Add(Const OperationResume : TOperationResume);
+    Function Count : Integer;
+    Procedure Delete(index : Integer);
+    Procedure Clear;
+    Property OperationResume[index : Integer] : TOperationResume read GetOperationResume; default;
+  End;
+
   TPCOperation = Class
   Private
     Ftag: integer;
-    FAuxBalance: Int64;
+    //FAuxBalance: Int64;
+  Protected
+    FPrevious_Sender_updated_block: Cardinal;
+    FPrevious_Destination_updated_block : Cardinal;
   public
     function GetOperationBufferToHash: TRawBytes; virtual; abstract;
     function DoOperation(AccountTransaction : TPCSafeBoxTransaction; var errors: AnsiString): Boolean; virtual; abstract;
@@ -145,18 +170,26 @@ Type
     function LoadFromStream(Stream: TStream): Boolean; virtual; abstract;
     procedure AffectedAccounts(list : TList); virtual; abstract;
     class function OpType: Byte; virtual; abstract;
+    Class Function OperationToOperationResume(Operation : TPCOperation; Affected_account_number : Cardinal; var OperationResume : TOperationResume) : Boolean;
     function OperationAmount : Int64; virtual; abstract;
     function OperationFee: UInt64; virtual; abstract;
     function OperationPayload : TRawBytes; virtual; abstract;
     function SenderAccount : Cardinal; virtual; abstract;
     Property tag : integer read Ftag Write Ftag;
-    Property AuxBalance : Int64 read FAuxBalance Write FAuxBalance;
+    // Property AuxBalance : Int64 read FAuxBalance Write FAuxBalance; Deprecated, not used
+    // New Build 1.0.8 To save previous updated block in storage
+    function SaveToStorage(Stream: TStream): Boolean;
+    function LoadFromStorage(Stream: TStream): Boolean;
+    Property Previous_Sender_updated_block : Cardinal read FPrevious_Sender_updated_block;
+    Property Previous_Destination_updated_block : Cardinal read FPrevious_Destination_updated_block;
   End;
 
   TOperationsHashTree = Class
   private
     FHashTreeOperations : TPCThreadList;
     FHashTree: TRawBytes;
+    FTotalAmount : Int64;
+    FTotalFee : Int64;
     Procedure InternalAddOperationToHashTree(list : TList; op : TPCOperation);
   public
     Constructor Create;
@@ -168,6 +201,8 @@ Type
     Function GetOperation(index : Integer) : TPCOperation;
     Function GetOperationsAffectingAccount(account_number : Cardinal; List : TList) : Integer;
     Procedure CopyFromHashTree(Sender : TOperationsHashTree);
+    Property TotalAmount : Int64 read FTotalAmount;
+    Property TotalFee : Int64 read FTotalFee;
   End;
 
   TPCOperationsComp = Class(TComponent)
@@ -196,6 +231,8 @@ Type
     procedure SetBlockPayload(const Value: TRawBytes);
   protected
     procedure Notification(AComponent: TComponent; Operation: TOperation); Override;
+    function SaveBlockToStreamExt(save_only_OperationBlock : Boolean; Stream: TStream; SaveToStorage : Boolean): Boolean;
+    function LoadBlockFromStreamExt(Stream: TStream; LoadingFromStorage : Boolean; var errors: AnsiString): Boolean;
   public
     Constructor Create(AOwner: TComponent); Override;
     Destructor Destroy; Override;
@@ -216,7 +253,9 @@ Type
     Property BlockPayload : TRawBytes read GetBlockPayload write SetBlockPayload;
     Function IncrementNOnce: Boolean;
     procedure UpdateTimestamp;
+    function SaveBlockToStorage(Stream: TStream): Boolean;
     function SaveBlockToStream(save_only_OperationBlock : Boolean; Stream: TStream): Boolean;
+    function LoadBlockFromStorage(Stream: TStream; var errors: AnsiString): Boolean;
     function LoadBlockFromStream(Stream: TStream; var errors: AnsiString): Boolean;
     //
     Function ValidateOperationBlock(var errors : AnsiString) : Boolean;
@@ -289,6 +328,8 @@ Type
 
   TStorageClass = Class of TStorage;
 
+  { TPCBank }
+
   TPCBank = Class(TComponent)
   private
     FStorage : TStorage;
@@ -319,6 +360,7 @@ Type
     function GetActualTargetHash: AnsiString;
     function GetActualTargetSecondsAverage(BackBlocks : Cardinal): Real;
     function LoadBankFromStream(Stream : TStream; var errors : AnsiString) : Boolean;
+    Class Function LoadBankStreamHeader(Stream : TStream; var BlocksCount : Cardinal) : Boolean;
     Procedure SaveBankToStream(Stream : TStream);
     Procedure Clear;
     Function LoadOperations(Operations : TPCOperationsComp; Block : Cardinal) : Boolean;
@@ -335,15 +377,18 @@ Type
   End;
 
 Const
+  CT_TOperationResume_NUL : TOperationResume = (Block:0;NOpInsideBlock:-1;time:0;AffectedAccount:0; OperationTxt:'';Amount:0;Fee:0;Balance:0;OriginalPayload:'';PrintablePayload:'');
+
   CT_OperationBlock_NUL : TOperationBlock = (block:0;account_key:(EC_OpenSSL_NID:0;x:'';y:'');reward:0;fee:0;protocol_version:0;
     protocol_available:0;timestamp:0;compact_target:0;nonce:0;block_payload:'';initial_safe_box_hash:'';operations_hash:'';proof_of_work:'');
 
 implementation
 
 uses
-  Messages, SysUtils, Variants, Graphics, Controls, Forms,
-  Dialogs, StdCtrls,
-  UTime, UConst;
+  Messages, SysUtils, Variants, {Graphics,}
+  {Controls, Forms,}
+  Dialogs, {StdCtrls,}
+  UTime, UConst, UOpTransaction;
 
 { TPCBank }
 
@@ -636,7 +681,8 @@ begin
   Result := (ts1 - ts2) / BackBlocks;
 end;
 
-class function TPCBank.GetNewTarget(vteorical, vreal: Cardinal; Const actualTarget: TRawBytes): TRawBytes;
+class function TPCBank.GetNewTarget(vteorical, vreal: Cardinal;
+  const actualTarget: TRawBytes): TRawBytes;
 Var
   bnact, bnaux, bnmindiff, bnremainder, bn: TBigNum;
   ts1, ts2: Cardinal;
@@ -728,7 +774,7 @@ Var LastReadBlock : TBlockAccount;
   i : Integer;
 begin
   Clear;
-  Result := SafeBox.LoadFromStream(Stream,LastReadBlock,errors);
+  Result := SafeBox.LoadSafeBoxFromStream(Stream,LastReadBlock,errors);
   if Result then begin
     TPCThread.ProtectEnterCriticalSection(Self,FBankLock);
     try
@@ -757,6 +803,11 @@ begin
   end;
 end;
 
+class function TPCBank.LoadBankStreamHeader(Stream: TStream; var BlocksCount: Cardinal): Boolean;
+begin
+  Result := TPCSafeBox.LoadSafeBoxStreamHeader(Stream,BlocksCount);
+end;
+
 function TPCBank.LoadOperations(Operations: TPCOperationsComp; Block: Cardinal): Boolean;
 begin
   TPCThread.ProtectEnterCriticalSection(Self,FBankLock);
@@ -785,7 +836,7 @@ end;
 
 procedure TPCBank.SaveBankToStream(Stream: TStream);
 begin
-  SafeBox.SaveToStream(Stream);
+  SafeBox.SaveSafeBoxToAStream(Stream);
 end;
 
 procedure TPCBank.SetStorageClass(const Value: TStorageClass);
@@ -799,7 +850,6 @@ class function TPCBank.TargetFromCompact(encoded: Cardinal): TRawBytes;
 Var
   nbits, high, offset, i: Cardinal;
   bn: TBigNum;
-  s1,s2 : String;
 begin
   {
     Compact Target is a 4 byte value that tells how many "0" must have the hash at left if presented in binay format.
@@ -838,13 +888,16 @@ begin
   offset := ((offset XOR $00FFFFFF) OR ($01000000));
 
   bn := TBigNum.Create(offset);
-  bn.LShift(256 - nbits - 25);
-  Result := bn.RawValue;
-  Result := StringOfChar(#0, 32 - Length(Result)) + Result;
-  if length(Result)<>32 then begin
-    raise Exception.Create('TargetFromCompact result length<>32 '+inttostr(Length(Result)));
-  end;
-  bn.Free;
+  Try
+    bn.LShift(256 - nbits - 25);
+    Result := bn.RawValue;
+    Result := StringOfChar(#0, 32 - Length(Result)) + Result;
+    if length(Result)<>32 then begin
+      raise Exception.Create('TargetFromCompact result length<>32 '+inttostr(Length(Result)));
+    end;
+  Finally
+    bn.Free;
+  End;
 end;
 
 class function TPCBank.TargetToCompact(target: TRawBytes): Cardinal;
@@ -1202,7 +1255,18 @@ begin
   Result := -1;
 end;
 
+function TPCOperationsComp.LoadBlockFromStorage(Stream: TStream; var errors: AnsiString): Boolean;
+begin
+  Result := LoadBlockFromStreamExt(Stream,true,errors);
+end;
+
 function TPCOperationsComp.LoadBlockFromStream(Stream: TStream; var errors: AnsiString): Boolean;
+begin
+  Result := LoadBlockFromStreamExt(Stream,false,errors);
+end;
+
+function TPCOperationsComp.LoadBlockFromStreamExt(Stream: TStream;
+  LoadingFromStorage: Boolean; var errors: AnsiString): Boolean;
 Var
   c, i, lastfee: Cardinal;
   soob : Byte;
@@ -1276,7 +1340,9 @@ begin
     errors := 'Invalid operation ' + inttostr(i) + '/' + inttostr(c)+' Class:'+OpClass.ClassName;
     bcop := OpClass.Create;
     Try
-      if not bcop.LoadFromStream(Stream) then begin
+      if LoadingFromStorage then begin
+        If not bcop.LoadFromStorage(Stream) then exit;
+      end else if not bcop.LoadFromStream(Stream) then begin
         exit;
       end;
       if Not AddOperation(false,bcop, errors2) then begin
@@ -1388,7 +1454,18 @@ begin
   end;
 end;
 
+function TPCOperationsComp.SaveBlockToStorage(Stream: TStream): Boolean;
+begin
+  Result := SaveBlockToStreamExt(false,Stream,true);
+end;
+
 function TPCOperationsComp.SaveBlockToStream(save_only_OperationBlock : Boolean; Stream: TStream): Boolean;
+begin
+  Result := SaveBlockToStreamExt(save_only_OperationBlock,Stream,false);
+end;
+
+function TPCOperationsComp.SaveBlockToStreamExt(save_only_OperationBlock: Boolean;
+  Stream: TStream; SaveToStorage: Boolean): Boolean;
 Var
   c, opl, i, OpType: Cardinal;
   soob : Byte;
@@ -1430,7 +1507,8 @@ begin
       bcop := Operation[i - 1];
       OpType := bcop.OpType;
       Stream.write(OpType, 4);
-      bcop.SaveToStream(Stream);
+      if SaveToStorage then bcop.SaveToStorage(Stream)
+      else bcop.SaveToStream(Stream);
     end;
   end;
   Result := true;
@@ -1599,6 +1677,8 @@ begin
   l := FHashTreeOperations.LockList;
   try
     InternalAddOperationToHashTree(l,op);
+    inc(FTotalAmount,op.OperationAmount);
+    inc(FTotalFee,op.OperationFee);
   finally
     FHashTreeOperations.UnlockList;
   end;
@@ -1611,6 +1691,8 @@ var op : TPCOperation;
 begin
   l := FHashTreeOperations.LockList;
   try
+    FTotalAmount := 0;
+    FTotalFee := 0;
     Try
       for i := 0 to l.Count - 1 do begin
         op := l[i];
@@ -1649,6 +1731,8 @@ end;
 
 constructor TOperationsHashTree.Create;
 begin
+  FTotalAmount := 0;
+  FTotalFee := 0;
   FHashTree := TCrypto.DoSha256('');
   FHashTreeOperations := TPCThreadList.Create;
 end;
@@ -1707,6 +1791,8 @@ begin
       op.SaveToStream(ms);
       ms.Position := 0;
       newOp.LoadFromStream(ms);
+      newOp.FPrevious_Sender_updated_block := op.Previous_Sender_updated_block;
+      newOp.FPrevious_Destination_updated_block := op.FPrevious_Destination_updated_block;
       h := TCrypto.DoSha256(ms.Memory,ms.Size);
       list.Add(newOp);
   finally
@@ -1808,10 +1894,147 @@ begin
   FReadOnly := Value;
 end;
 
+
 { TPCOperation }
 
+function TPCOperation.LoadFromStorage(Stream: TStream): Boolean;
+begin
+  Result := false;
+  If LoadFromStream(Stream) then begin
+    if Stream.Size - Stream.Position<8 then exit;
+    Stream.Read(FPrevious_Sender_updated_block,Sizeof(FPrevious_Sender_updated_block));
+    Stream.Read(FPrevious_Destination_updated_block,Sizeof(FPrevious_Destination_updated_block));
+    Result := true;
+  end;
+end;
+
+class function TPCOperation.OperationToOperationResume(Operation: TPCOperation;
+  Affected_account_number: Cardinal;
+  var OperationResume: TOperationResume): Boolean;
+Var spayload : AnsiString;
+begin
+  OperationResume := CT_TOperationResume_NUL;
+  OperationResume.Fee := (-1)*Int64(Operation.OperationFee);
+  OperationResume.AffectedAccount := Affected_account_number;
+  Result := false;
+  case Operation.OpType of
+    CT_Op_Transaction : Begin
+      if TOpTransaction(Operation).Data.sender=Affected_account_number then begin
+        OperationResume.OperationTxt := 'Transaction Sent to '+TAccountComp.AccountNumberToAccountTxtNumber(TOpTransaction(Operation).Data.target);
+        OperationResume.Amount := Int64(TOpTransaction(Operation).Data.amount) * (-1);
+        Result := true;
+      end else if TOpTransaction(Operation).Data.target=Affected_account_number then begin
+        OperationResume.OperationTxt := 'Transaction Received from '+TAccountComp.AccountNumberToAccountTxtNumber(TOpTransaction(Operation).Data.sender);
+        OperationResume.Amount := TOpTransaction(Operation).Data.amount;
+        OperationResume.Fee := 0;
+        Result := true;
+      end else exit;
+    End;
+    CT_Op_Changekey : Begin
+      OperationResume.OperationTxt := 'Change Key to '+TAccountComp.GetECInfoTxt( TOpChangeKey(Operation).Data.new_accountkey.EC_OpenSSL_NID );
+      OperationResume.Fee := TOpChangeKey(Operation).Data.fee;
+      Result := true;
+    End;
+    CT_Op_Recover : Begin
+      OperationResume.OperationTxt := 'Recover founds';
+      OperationResume.Fee := TOpRecoverFounds(Operation).Data.fee;
+    End;
+  else Exit;
+  end;
+  OperationResume.OriginalPayload := Operation.OperationPayload;
+  If TCrypto.IsHumanReadable(OperationResume.OriginalPayload) then OperationResume.PrintablePayload := OperationResume.OriginalPayload
+  else OperationResume.PrintablePayload := TCrypto.ToHexaString(OperationResume.OriginalPayload);
+end;
+
+function TPCOperation.SaveToStorage(Stream: TStream): Boolean;
+begin
+  Result := SaveToStream(Stream);
+  Stream.Write(FPrevious_Sender_updated_block,Sizeof(FPrevious_Sender_updated_block));
+  Stream.Write(FPrevious_Destination_updated_block,SizeOf(FPrevious_Destination_updated_block));
+  Result := true;
+end;
+
+{ TOperationsResumeList }
+
+Type POperationResume = ^TOperationResume;
+
+procedure TOperationsResumeList.Add(const OperationResume: TOperationResume);
+Var P : POperationResume;
+begin
+  New(P);
+  P^ := OperationResume;
+  FList.Add(P);
+end;
+
+procedure TOperationsResumeList.Clear;
+Var P : POperationResume;
+  i : Integer;
+  l : TList;
+begin
+  l := FList.LockList;
+  try
+    for i := 0 to l.Count - 1 do begin
+      P := l[i];
+      Dispose(P);
+    end;
+    l.Clear;
+  finally
+    FList.UnlockList;
+  end;
+end;
+
+function TOperationsResumeList.Count: Integer;
+Var l : TList;
+begin
+  l := FList.LockList;
+  Try
+    Result := l.Count;
+  Finally
+    FList.UnlockList;
+  End;
+end;
+
+constructor TOperationsResumeList.Create;
+begin
+  FList := TPCThreadList.Create;
+end;
+
+procedure TOperationsResumeList.Delete(index: Integer);
+Var P : POperationResume;
+  l : TList;
+begin
+  l := FList.LockList;
+  Try
+    P := l[index];
+    l.Delete(index);
+    Dispose(P);
+  Finally
+    FList.UnlockList;
+  End;
+end;
+
+destructor TOperationsResumeList.Destroy;
+begin
+  Clear;
+  FreeAndNil(FList);
+  inherited;
+end;
+
+function TOperationsResumeList.GetOperationResume(index: Integer): TOperationResume;
+Var l : TList;
+begin
+  l := FList.LockList;
+  try
+    if index<l.Count then Result := POperationResume(l[index])^
+    else Result := CT_TOperationResume_NUL;
+  finally
+    FList.UnlockList;
+  end;
+end;
+
 initialization
   SetLength(_OperationsClass, 0);
+  RegisterOperationsClass;
 finalization
 
 end.

+ 19 - 5
Units/PascalCoin/UConst.pas

@@ -17,10 +17,22 @@ unit UConst;
 
   }
 
+{$IFNDEF PRODUCTION}
+  {$IFNDEF TESTNET}
+    {$DEFINE PRODUCTION}
+  {$ENDIF}
+{$ENDIF}
 
 interface
 
-Uses ssl_const;
+Uses UOpenSSLdef;
+
+{$IFNDEF FPC}
+  // See http://wiki.freepascal.org/Code_Conversion_Guide
+type
+  PtrInt = integer;
+  PtrUInt = cardinal;
+{$ENDIF}
 
 Const
   CT_Genesis_Magic_String_For_Old_Block_Hash :
@@ -61,7 +73,7 @@ Const
   CT_MaxPayloadSize = 255; // Max payload size in bytes
   CT_MaxSecondsDifferenceOfNetworkNodes = 180; // 3 minutes. If a Node has a +- value difference, will be blacklisted
 
-  CT_MaxServersConnected = 5;
+  CT_MaxServersConnected = 3; // Build 1.0.8 downgrading from 5 to 3 servers...
 
   CT_MaxClientsConnected = 100;
 
@@ -80,6 +92,8 @@ Const
   // NetProtocol_Available MUST BE allways >= NetProtocol_version
   CT_NetProtocol_Available: Word = $0003;  // Remember, >= NetProtocol_version !!!
 
+  CT_SafeBoxBankVersion : Word = 2;
+
   CT_MagicIdentificator: AnsiString = 'PascalCoin'; //
 
   // Value of Operations type in Protocol 1
@@ -87,7 +101,7 @@ Const
   CT_Op_Changekey = $02;
   CT_Op_Recover = $03;
 
-  CT_ClientAppVersion : AnsiString = {$IFDEF PRODUCTION}'1.0.7'{$ELSE}{$IFDEF TESTNET}'TESTNET'{$ELSE}{$ENDIF}{$ENDIF};
+  CT_ClientAppVersion : AnsiString = {$IFDEF PRODUCTION}'1.0.8'{$ELSE}{$IFDEF TESTNET}'TESTNET'{$ELSE}{$ENDIF}{$ENDIF};
 
   CT_Discover_IPs =  'bpascal1.dynamic-dns.net;bpascal2.dynamic-dns.net;pascalcoin1.ddns.net;pascalcoin2.ddns.net;pascalcoin1.dynamic-dns.net;pascalcoin1.dns1.us';
 
@@ -98,7 +112,7 @@ Const
   CT_PARAM_GridAccountsPos = 'GridAccountsPos';
   CT_PARAM_DefaultFee = 'DefaultFee';
   CT_PARAM_InternetServerPort = 'InternetServerPort';
-  //CT_PARAM_AutomaticMineWhenConnectedToNodes = 'AutomaticMineWhenConnectedToNodes';
+  {$IFDEF TESTNET}CT_PARAM_AutomaticMineWhenConnectedToNodes = 'AutomaticMineWhenConnectedToNodes';{$ENDIF}
   CT_PARAM_MinerPrivateKeyType = 'MinerPrivateKeyType';
   CT_PARAM_MinerPrivateKeySelectedPublicKey = 'MinerPrivateKeySelectedPublicKey';
   CT_PARAM_SaveLogFiles = 'SaveLogFiles';
@@ -107,7 +121,7 @@ Const
   CT_PARAM_MinerName = 'MinerName';
   CT_PARAM_FirstTime = 'FirstTime';
   CT_PARAM_ShowModalMessages = 'ShowModalMessages';
-  // CT_PARAM_MaxCPUs = 'MaxCPUs'; deprecated
+  {$IFDEF TESTNET}CT_PARAM_MaxCPUs = 'MaxCPUs'; {$ENDIF} //deprecated
   CT_PARAM_PeerCache = 'PeerCache';
   CT_PARAM_TryToConnectOnlyWithThisFixedServers = 'TryToConnectOnlyWithFixedServers';
   CT_PARAM_JSONRPCMinerServerPort = 'JSONRPCMinerServerPort';

+ 85 - 24
Units/PascalCoin/UCrypto.pas

@@ -17,11 +17,12 @@ unit UCrypto;
 
   }
 
+{$I config.inc}
+
 interface
 
 uses
-  Classes, SysUtils, ssl_err, ssl_const, ssl_bn, ssl_ec, ssl_types, ssl_ecdsa, ssl_sha, ssl_ripemd, ssl_util,
-  ssl_evp, ssl_ecdh, ssl_hmac;
+  Classes, SysUtils, UOpenSSL, UOpenSSLDef;
 
 Type
   ECryptoException = Class(Exception);
@@ -52,7 +53,7 @@ Type
     Constructor Create;
     Procedure GenerateRandomPrivateKey(EC_OpenSSL_NID : Word);
     Destructor Destroy;
-    Property PrivateKey : PEC_KEY read FPrivateKey;// write SetPrivateKey;
+    Property PrivateKey : PEC_KEY read FPrivateKey;
     Property PublicKey : TECDSA_Public read GetPublicKey;
     Property PublicKeyPoint : PEC_POINT read GetPublicKeyPoint;
     Function SetPrivateKeyFromHexa(EC_OpenSSL_NID : Word; hexa : AnsiString) : Boolean;
@@ -116,6 +117,7 @@ Type
     Property Value : Int64 read GetValue write SetValue;
     Function IsZero : Boolean;
     Class Function HexaToDecimal(hexa : AnsiString) : AnsiString;
+    Class Function TargetToHashRate(EncodedTarget : Cardinal) : TBigNum;
   End;
 
 Const
@@ -124,11 +126,6 @@ Const
 implementation
 
 uses
-{$IFnDEF FPC}
-  Windows,
-{$ELSE}
-  LCLIntf, LCLType, LMessages,
-{$ENDIF}
   ULog, UConst, UAccounts;
 
 Var _initialized : Boolean = false;
@@ -137,16 +134,7 @@ Procedure _DoInit;
 Begin
   if Not (_initialized) then begin
     _initialized := true;
-    SSL_InitERR;
-    SSL_InitEC;
-    SSL_InitECDSA;
-    SSL_InitBN;
-    SSL_Initsha;
-    SSL_Initripemd;
-    // Used by UECIES & UAES
-    SSL_InitEVP;
-    SSL_InitSSLDH;
-    SSL_InitHMAC;
+    InitSSLFunctions;
   end;
 End;
 
@@ -170,8 +158,8 @@ begin
   ms := TMemoryStream.Create;
   Try
     ms.Write(FEC_OpenSSL_NID,sizeof(FEC_OpenSSL_NID));
-    SetLength(aux,BN_num_bytes(FPrivateKey^.priv_key));
-    BN_bn2bin(FPrivateKey^.priv_key,@aux[1]);
+    SetLength(aux,BN_num_bytes(EC_KEY_get0_private_key(FPrivateKey)));
+    BN_bn2bin(EC_KEY_get0_private_key(FPrivateKey),@aux[1]);
     TStreamOp.WriteAnsiString(ms,aux);
     SetLength(Result,ms.Size);
     ms.Position := 0;
@@ -307,9 +295,9 @@ begin
     if EC_KEY_set_private_key(FPrivateKey,bn)<>1 then raise ECryptoException.Create('Invalid num to set as private key');
     //
     ctx := BN_CTX_new;
-    pub_key := EC_POINT_new(FPrivateKey.group);
+    pub_key := EC_POINT_new(EC_KEY_get0_group(FPrivateKey));
     try
-      if EC_POINT_mul(FPrivateKey.group,pub_key,bn,nil,nil,ctx)<>1 then raise ECryptoException.Create('Error obtaining public key');
+      if EC_POINT_mul(EC_KEY_get0_group(FPrivateKey),pub_key,bn,nil,nil,ctx)<>1 then raise ECryptoException.Create('Error obtaining public key');
       EC_KEY_set_public_key(FPrivateKey,pub_key);
     finally
       BN_CTX_free(ctx);
@@ -346,7 +334,7 @@ begin
   PC := PS;
   Result := '';
   for I := 1 to 20 do begin
-    Result := Result + IntToHex(Integer(PC^),2);
+    Result := Result + IntToHex(PtrInt(PC^),2);
     inc(PC);
   end;
   FreeMem(PS,33);
@@ -372,11 +360,16 @@ class function TCrypto.ECDSASign(Key: PEC_KEY; const digest: AnsiString): TECDSA
 Var PECS : PECDSA_SIG;
   p, pr,ps : PAnsiChar;
   i : Integer;
+  {$IFDEF OpenSSL10}
+  {$ELSE}
+  bnr,bns : PBIGNUM;
+  {$ENDIF}
 begin
   PECS := ECDSA_do_sign(PAnsiChar(digest),length(digest),Key);
   Try
     if PECS = Nil then raise ECryptoException.Create('Error signing');
 
+    {$IFDEF OpenSSL10}
     i := BN_num_bytes(PECS^._r);
     SetLength(Result.r,i);
     p := @Result.r[1];
@@ -386,6 +379,17 @@ begin
     SetLength(Result.s,i);
     p := @Result.s[1];
     i := BN_bn2bin(PECS^._s,p);
+    {$ELSE}
+    ECDSA_SIG_get0(PECS,@bnr,@bns);
+    i := BN_num_bytes(bnr);
+    SetLength(Result.r,i);
+    p := @Result.r[1];
+    i := BN_bn2bin(bnr,p);
+    i := BN_num_bytes(bns);
+    SetLength(Result.s,i);
+    p := @Result.s[1];
+    i := BN_bn2bin(bns,p);
+    {$ENDIF}
   Finally
     ECDSA_SIG_free(PECS);
   End;
@@ -394,11 +398,24 @@ end;
 class function TCrypto.ECDSAVerify(EC_OpenSSL_NID : Word; PubKey: EC_POINT; const digest: AnsiString; Signature: TECDSA_SIG): Boolean;
 Var PECS : PECDSA_SIG;
   PK : PEC_KEY;
+  {$IFDEF OpenSSL10}
+  {$ELSE}
+  bnr,bns : PBIGNUM;
+  {$ENDIF}
 begin
   PECS := ECDSA_SIG_new;
   Try
+    {$IFDEF OpenSSL10}
     BN_bin2bn(PAnsiChar(Signature.r),length(Signature.r),PECS^._r);
     BN_bin2bn(PAnsiChar(Signature.s),length(Signature.s),PECS^._s);
+    {$ELSE}
+{    ECDSA_SIG_get0(PECS,@bnr,@bns);
+    BN_bin2bn(PAnsiChar(Signature.r),length(Signature.r),bnr);
+    BN_bin2bn(PAnsiChar(Signature.s),length(Signature.s),bns);}
+    bnr := BN_bin2bn(PAnsiChar(Signature.r),length(Signature.r),nil);
+    bns := BN_bin2bn(PAnsiChar(Signature.s),length(Signature.s),nil);
+    if ECDSA_SIG_set0(PECS,bnr,bns)<>1 then Raise Exception.Create('Dev error 20161019-1 '+ERR_error_string(ERR_get_error(),nil));
+    {$ENDIF}
 
     PK := EC_KEY_new_by_curve_name(EC_OpenSSL_NID);
     EC_KEY_set_public_key(PK,@PubKey);
@@ -471,7 +488,8 @@ end;
 class function TCrypto.PrivateKey2Hexa(Key: PEC_KEY): AnsiString;
 Var p : PAnsiChar;
 begin
-  p := BN_bn2hex(Key^.priv_key);
+  p := BN_bn2hex(EC_KEY_get0_private_key(Key));
+//  p := BN_bn2hex(Key^.priv_key);
   Result := strpas(p);
   OPENSSL_free(p);
 end;
@@ -706,6 +724,49 @@ begin
   bn.Free;
 end;
 
+class function TBigNum.TargetToHashRate(EncodedTarget: Cardinal): TBigNum;
+Var bn1,bn2 : TBigNum;
+  part_A, part_B : Cardinal;
+  ctx : PBN_CTX;
+begin
+  { Target is 2 parts: First byte (A) is "0" bits on the left. Bytes 1,2,3 (B) are number after first "1" bit
+    Example: Target 23FEBFCE
+       Part_A: 23  -> 35 decimal
+       Part_B: FEBFCE
+    Target to Hash rate Formula:
+      Result = 2^Part_A + ( (2^(Part_A-24)) * Part_B )
+  }
+  Result := TBigNum.Create(2);
+  part_A := EncodedTarget shr 24;
+  bn1 := TBigNum.Create(part_A);
+  ctx := BN_CTX_new;
+  try
+    if BN_exp(Result.FBN,Result.FBN,bn1.FBN,ctx)<>1 then raise Exception.Create('Error 20161017-3');
+  finally
+    BN_CTX_free(ctx);
+    bn1.Free;
+  end;
+  //
+  if part_A<=24 then exit;
+  //
+  part_B := (EncodedTarget shl 8) shr 8;
+  bn2 := TBigNum.Create(2);
+  Try
+    bn1 := TBigNum.Create(part_A - 24);
+    ctx := BN_CTX_new;
+    try
+      If BN_exp(bn2.FBN,bn2.FBN,bn1.FBN,ctx)<>1 then raise Exception.Create('Error 20161017-4');
+    finally
+      BN_CTX_free(ctx);
+      bn1.Free;
+    end;
+    bn2.Multiply(part_B);
+    Result.Add(bn2);
+  Finally
+    bn2.Free;
+  End;
+end;
+
 function TBigNum.ToDecimal: AnsiString;
 var p : PAnsiChar;
 begin

+ 0 - 996
Units/PascalCoin/UDBStorage.pas

@@ -1,996 +0,0 @@
-unit UDBStorage;
-
-{ Copyright (c) 2016 by Albert Molina
-
-  Distributed under the MIT software license, see the accompanying file LICENSE
-  or visit http://www.opensource.org/licenses/mit-license.php.
-
-  This unit is a part of Pascal Coin, a P2P crypto currency without need of
-  historical operations.
-
-  If you like it, consider a donation using BitCoin:
-  16K3HCZRhFUtM8GdWRcfKeaa6KsuyxZaYk
-
-  }
-
-{ ABOUT THIS UNIT:
-  This unit is used only in Windows version to use an Microsoft Access database
-  to store data to be more accessible and quickly readable.
-
-  All the blockchain is stored in a table "tblockchain" in stream format, but
-  also the operationblock is also saved in individual fields to easily
-  search it with SQL select statements.
-
-  This unit will store 2 additional tables:
-  First table is "tbank" that will help this application when reading all
-  the blockchain and only will need to read from "last stored bank"
-
-  Second table is "toperations" thans stores all the operations made to
-  the accounts (transfers, change key...). It's usefull to quickly search
-  operations that affects an account.
-
-  FINAL NOTE:
-  To compile in other OS you can use "UFileStorage" or another unit to
-  store data in other database types or simply as a file }
-
-interface
-
-uses
-  UBlockChain, Classes, db, ADODB, SysUtils, UAccounts, ULog, Variants, UCrypto,
-  UConst, UOpTransaction, UThread;
-
-Const
-  CT_TblName_BlockChain = 'tblockchain';
-  CT_TblName_Operations = 'toperations';
-  CT_TblName_Bank = 'tbank';
-
-  CT_TblFld_BlockChain_id = 'idblockchain';
-  CT_TblFld_BlockChain_block = 'block';
-  CT_TblFld_BlockChain_accountkey = 'accountkey';
-  CT_TblFld_BlockChain_s_reward = 's_reward';
-  CT_TblFld_BlockChain_s_fee = 's_fee';
-  CT_TblFld_BlockChain_protocol_version = 'protocol_version';
-  CT_TblFld_BlockChain_protocol_available = 'protocol_available';
-  CT_TblFld_BlockChain_s_timestamp = 's_timestamp';
-  CT_TblFld_BlockChain_s_compact_target = 's_compact_target';
-  CT_TblFld_BlockChain_s_nonce = 's_nonce';
-  CT_TblFld_BlockChain_rawpayload = 'rawpayload';
-  CT_TblFld_BlockChain_safe_box_hash = 'safe_box_hash';
-  CT_TblFld_BlockChain_operations_hash = 'operations_hash';
-  CT_TblFld_BlockChain_proof_of_work = 'proof_of_work';
-  CT_TblFld_BlockChain_operations_stream = 'operations_stream';
-  CT_TblFld_BlockChain_orphan = 'orphan';
-  CT_TblFld_BlockChain_operations_count = 'operations_count';
-
-  CT_TblFld_Operations_id = 'idoperation';
-  CT_TblFld_Operations_optype = 'optype';
-  CT_TblFld_Operations_block = 'block';
-  CT_TblFld_Operations_s_timestamp = 's_timestamp';
-  CT_TblFld_Operations_nopblock = 'nopblock';
-  CT_TblFld_Operations_account = 'account';
-  CT_TblFld_Operations_other_account = 'other_account';
-  CT_TblFld_Operations_n_operation = 'n_operation';
-  CT_TblFld_Operations_optype_op = 'optype_op';
-  CT_TblFld_Operations_s_amount = 's_amount';
-  CT_TblFld_Operations_s_fee = 's_fee';
-  CT_TblFld_Operations_s_balance = 's_balance';
-  CT_TblFld_Operations_rawpayload = 'payload';
-  CT_TblFld_Operations_newaccountkey = 'newaccountkey';
-  CT_TblFld_Operations_orphan = 'orphan';
-
-  CT_TblFld_Bank_id = 'idbank';
-  CT_TblFld_Bank_block = 'block';
-  CT_TblFld_Bank_bank_stream = 'bank_stream';
-  CT_TblFld_Bank_orphan = 'orphan';
-
-Type
-  TOperationResume = Record
-    Block : Cardinal;
-    time : Cardinal;
-    AffectedAccount : Cardinal;
-    OperationTxt : AnsiString;
-    Amount : Int64;
-    Fee : Int64;
-    Balance : Int64;
-    OriginalPayload : TRawBytes;
-    PrintablePayload : AnsiString;
-  end;
-
-Const
-  CT_TOperationResume_NUL : TOperationResume = (Block:0;time:0;AffectedAccount:0; OperationTxt:'';Amount:0;Fee:0;Balance:0;OriginalPayload:'';PrintablePayload:'');
-
-Type
-
-  TOperationsResumeList = Class
-  private
-    FList : TPCThreadList;
-    function GetOperationResume(index: Integer): TOperationResume;
-  public
-    Constructor Create;
-    Destructor Destroy; override;
-    Procedure Add(Const OperationResume : TOperationResume);
-    Function Count : Integer;
-    Procedure Delete(index : Integer);
-    Procedure Clear;
-    Property OperationResume[index : Integer] : TOperationResume read GetOperationResume; default;
-  End;
-
-  TDBStorage = Class(TStorage)
-  private
-    FAdoConnection : TADOConnection;
-    FAccessFileName: AnsiString;
-    procedure SetAccessFileName(const Value: AnsiString);
-  protected
-    Function DoLoadBlockChain(Operations : TPCOperationsComp; Block : Cardinal) : Boolean; override;
-    Function DoSaveBlockChain(Operations : TPCOperationsComp) : Boolean; override;
-    Function DoMoveBlockChain(Start_Block : Cardinal; Const DestOrphan : TOrphan; DestStorage : TStorage) : Boolean; override;
-    Procedure DoDeleteBlockChainBlocks(StartingDeleteBlock : Cardinal); override;
-    Function DoSaveBank : Boolean; override;
-    Function DoRestoreBank(max_block : Int64) : Boolean; override;
-    Function BlockExists(Block : Cardinal) : Boolean; override;
-  public
-    Constructor Create(AOwner : TComponent); Override;
-    Destructor Destroy; override;
-    Property AccessFileName : AnsiString read FAccessFileName write SetAccessFileName;
-    Function SQL_UPDATE(const TblName : AnsiString; Const SetValue : AnsiString; const Where : String): Boolean;
-    Function SQL_DELETE(const TblName : AnsiString; const Where : String): Boolean;
-    Class Function ValueToSql(const Value : Variant) : String;
-    Procedure CopyConfiguration(Const CopyFrom : TStorage); override;
-    Property ADOConnection : TADOConnection read FAdoConnection;
-    Class Function DBPayloadToReadableText(Const DBRawPayload : TRawBytes; Var ReadableText : AnsiString) : Boolean;
-    //
-    Class Function OperationToOperationResume(Operation : TPCOperation; Affected_account_number : Cardinal; var OperationResume : TOperationResume) : Boolean;
-    Function GetOperationsFromAccount(Const OperationsResume : TOperationsResumeList; account_number : Cardinal; start,max : Integer) :Integer;
-    Class Function GetOperationsFromAccountSQL(account_number, block_start, block_end : Int64; dateStart,dateEnd : TDate; start,max : Integer) :String;
-    Class Function GetBlockChainSQL(block_start, block_end : Int64; dateStart,dateEnd : TDate; start,max : Integer) :String;
-    Class Function BlobSaveToStream(Blob : TBlobField; Stream : TStream) : Boolean;
-    Class Procedure BlobLoadFromStream(Blob : TBlobField; Stream : TStream);
-    //
-    Class Function DBStringFieldToRaw(Field : TField; var raw : TRawBytes) : Boolean;
-    Class Procedure DBRawToStringField(Field : TField; const raw : TRawBytes);
-  End;
-
-implementation
-
-uses
-  Forms, UTime;
-
-{ TDBStorage }
-
-class procedure TDBStorage.BlobLoadFromStream(Blob: TBlobField; Stream: TStream);
-Var ms : TMemoryStream;
-  b : Byte;
-begin
-  { NOTE:
-    Access database has a "bug" when storing data as a memo if data size is odd.
-    So we need to indicate when data size is odd in order to read correctly
-    data when reading
-  }
-  ms := TMemoryStream.Create;
-  try
-    if stream.Size MOD 2=0 then b := 0
-    else b := 1;
-    ms.Write(b,1);
-    Stream.Position := 0;
-    ms.CopyFrom(Stream,Stream.Size);
-    ms.Position := ms.Size;
-    ms.Write(b,1);
-    ms.Position := 0;
-    Blob.LoadFromStream(ms);
-  finally
-    ms.Free;
-  end;
-end;
-
-class function TDBStorage.BlobSaveToStream(Blob: TBlobField; Stream: TStream) : Boolean;
-Var ms : TMemoryStream;
-  ac : AnsiChar;
-  b : Byte;
-begin
-  { NOTE:
-    Access database has a "bug" when storing data as a memo if data size is odd.
-    So we need to indicate when data size is odd in order to read correctly
-    data when reading
-  }
-  Result := false;
-  ms := TMemoryStream.Create;
-  try
-    Blob.SaveToStream(ms);
-    if ms.size>0 then begin
-      ms.Position := 0;
-      ms.Read(b,1);
-      if (b<>0) and (b<>1) then exit;
-      stream.size := 0;
-      if b=0 then stream.CopyFrom(ms,ms.Size-2)
-      else stream.CopyFrom(ms,ms.Size-1);
-      Result := true;
-    end else Result := true;
-  finally
-    ms.Free;
-  end;
-end;
-
-function TDBStorage.BlockExists(Block: Cardinal): Boolean;
-Var ds : TADOQuery;
-  whereorphan : AnsiString;
-begin
-  if Orphan='' then whereorphan := '('+CT_TblFld_BlockChain_orphan+' IS NULL)'
-  else whereorphan := '('+CT_TblFld_BlockChain_orphan+' LIKE '''+Orphan+''')';
-  ds := TADOQuery.Create(Self);
-  Try
-    ds.Connection := FAdoConnection;
-    ds.SQL.Text := 'SELECT * FROM '+CT_TblName_BlockChain+' WHERE ('+CT_TblFld_BlockChain_block+'='+Inttostr(Block)+') AND '+whereorphan+
-      ' ORDER BY '+CT_TblFld_BlockChain_id;
-    ds.Open;
-    Result := Not ds.IsEmpty;
-  Finally
-    ds.Free;
-  End;
-end;
-
-procedure TDBStorage.CopyConfiguration(const CopyFrom: TStorage);
-begin
-  inherited;
-  if CopyFrom is TDBStorage then AccessFileName := TDBStorage(CopyFrom).AccessFileName;
-end;
-
-constructor TDBStorage.Create(AOwner: TComponent);
-begin
-  inherited;
-  FAdoConnection := TADOConnection.Create(Self);
-end;
-
-class function TDBStorage.DBPayloadToReadableText(const DBRawPayload: TRawBytes; var ReadableText: AnsiString): Boolean;
-begin
-  Result := TCrypto.IsHumanReadable(DBRawPayload);
-  if Result then ReadableText := DBRawPayload;
-end;
-
-class procedure TDBStorage.DBRawToStringField(Field: TField; const raw: TRawBytes);
-  {
-  Microsoft Access Database does not store string values as a Raw value... if there
-  is a "0" character bad things happen... This function ensures that there will
-  not be any "0" in a saved string.
-  }
-Var dbraw : TRawBytes;
-  i : Integer;
-begin
-  dbraw := '';
-  for i := 1 to length(raw) do begin
-    if raw[i]=chr(0) then dbraw := dbraw + chr(255)+chr(1)
-    else if raw[i]=chr(255) then dbraw := dbraw + chr(255)+chr(2)
-    else dbraw := dbraw + raw[i];
-  end;
-  Field.AsAnsiString := dbRaw;
-end;
-
-class function TDBStorage.DBStringFieldToRaw(Field: TField; var raw: TRawBytes): Boolean;
-  {
-  Microsoft Access Database does not store string values as a Raw value... if there
-  is a "0" character bad things happen... This function restores a previously
-  raw value saved without "0" character.
-  }
-Var dbraw : TRawBytes;
-  i : Integer;
-begin
-  dbraw := Field.AsAnsiString;
-  Result := false;
-  raw := '';
-  i := 1;
-  while (i<=length(dbraw)) do begin
-    if (dbraw[i]=chr(255)) then begin
-      if (i<length(dbraw)) then begin
-        inc(i);
-        if dbraw[i]=chr(1) then raw := raw + chr(0)
-        else if dbraw[i]=chr(2) then raw := raw + chr(255)
-        else exit;
-      end else exit;
-    end else raw := raw + dbraw[i];
-    inc(i);
-  end;
-  Result := true;
-end;
-
-destructor TDBStorage.Destroy;
-begin
-  FreeAndNil(FAdoConnection);
-  inherited;
-end;
-
-procedure TDBStorage.DoDeleteBlockChainBlocks(StartingDeleteBlock: Cardinal);
-Var ds : TADOQuery;
-  whereorphan : AnsiString;
-begin
-  if Orphan='' then begin
-    whereorphan := '('+CT_TblFld_BlockChain_orphan+' IS NULL)';
-    TLog.NewLog(ltdebug,Classname,Format('DoDeleteBlockChainBlocks Starting Block:%d (Main blockchain)',[StartingDeleteBlock,Orphan]));
-  end else begin
-    whereorphan := '('+CT_TblFld_BlockChain_orphan+' LIKE '''+Orphan+''')';
-    TLog.NewLog(ltdebug,Classname,Format('DoDeleteBlockChainBlocks Starting Block:%d (Orphan:%s)',[StartingDeleteBlock,Orphan]));
-  end;
-  SQL_DELETE(CT_TblName_BlockChain,'('+CT_TblFld_BlockChain_block+'>='+inttostr(StartingDeleteBlock)+') AND '+whereorphan);
-  if Orphan='' then begin
-    whereorphan := '('+CT_TblFld_Bank_orphan+' IS NULL)';
-  end else begin
-    whereorphan := '('+CT_TblFld_Bank_orphan+' LIKE '''+Orphan+''')';
-  end;
-  SQL_DELETE(CT_TblName_Bank,'('+CT_TblFld_Bank_block+'>='+inttostr(StartingDeleteBlock)+') AND '+whereorphan);
-  if Orphan='' then begin
-    whereorphan := '('+CT_TblFld_Operations_orphan+' IS NULL)';
-  end else begin
-    whereorphan := '('+CT_TblFld_Operations_orphan+' LIKE '''+Orphan+''')';
-  end;
-  SQL_DELETE(CT_TblName_Operations,'('+CT_TblFld_Operations_block+'>='+inttostr(StartingDeleteBlock)+') AND '+whereorphan);
-end;
-
-function TDBStorage.DoLoadBlockChain(Operations: TPCOperationsComp; Block: Cardinal): Boolean;
-Var ds : TADOQuery;
-  whereorphan : AnsiString;
-  bf : TBlobField;
-  ms : TMemoryStream;
-  errors : AnsiString;
-begin
-  if Orphan='' then begin
-    whereorphan := '('+CT_TblFld_BlockChain_orphan+' IS NULL)';
-    TLog.NewLog(ltdebug,Classname,Format('DoLoadBlockChain Block:%d (Main blockchain)',[Block,Orphan]));
-  end else begin
-    whereorphan := '('+CT_TblFld_BlockChain_orphan+' LIKE '''+Orphan+''')';
-    TLog.NewLog(ltdebug,Classname,Format('DoLoadBlockChain Block:%d (Orphan:%s)',[Block,Orphan]));
-  end;
-  Result := false;
-  Operations.Clear(true);
-  ds := TADOQuery.Create(Self);
-  Try
-    ds.Connection := FAdoConnection;
-    ds.SQL.Text := 'SELECT * FROM '+CT_TblName_BlockChain+' WHERE ('+CT_TblFld_BlockChain_block+'='+Inttostr(Block)+') AND '+whereorphan+
-      ' ORDER BY '+CT_TblFld_BlockChain_id;
-    ds.Open;
-    if Not ds.IsEmpty then begin
-      bf := ds.FieldByName(CT_TblFld_BlockChain_operations_stream) as TBlobField;
-      ms := TMemoryStream.Create;
-      try
-        BlobSaveToStream(bf,ms);
-        ms.Position := 0;
-        Result := Operations.LoadBlockFromStream(ms,errors);
-        if Not Result then begin
-          TLog.NewLog(lterror,Classname,Format('Error reading databse Block %d: %s Stream size:%d',[Block,errors,ms.Size]));
-        end;
-      finally
-        ms.Free;
-      end;
-    end else begin
-      TLog.NewLog(lterror,Classname,Format('Block %d not found in database. SQL:%s',[Block,ds.SQL.Text]));
-    end;
-  Finally
-    ds.Free;
-  End;
-end;
-
-function TDBStorage.DoMoveBlockChain(Start_Block: Cardinal; const DestOrphan: TOrphan; DestStorage : TStorage): Boolean;
-Var whereorphan : AnsiString;
-  setvalue : AnsiString;
-begin
-  Result := true;
-  FAdoConnection.BeginTrans;
-  try
-    TLog.NewLog(ltdebug,Classname,Format('DoMoveBlockChain start:%d From:%s to Dest:%s',[start_block,Orphan,DestOrphan]));
-    // Moving BlockChain table
-    if Orphan='' then whereorphan := '('+CT_TblFld_BlockChain_orphan+' IS NULL)'
-    else whereorphan := '('+CT_TblFld_BlockChain_orphan+' LIKE '''+Orphan+''')';
-    if DestOrphan='' then setvalue := CT_TblFld_BlockChain_orphan+'=NULL'
-    else setvalue := CT_TblFld_BlockChain_orphan+ '='''+DestOrphan+'''';
-    SQL_UPDATE(CT_TblName_BlockChain,setvalue,whereorphan+' AND ('+CT_TblFld_BlockChain_block+'>='+inttostr(Start_Block)+')');
-
-    // Moving Operations table
-    if Orphan='' then whereorphan := '('+CT_TblFld_Operations_orphan+' IS NULL)'
-    else whereorphan := '('+CT_TblFld_Operations_orphan+' LIKE '''+Orphan+''')';
-    if DestOrphan='' then setvalue := CT_TblFld_Operations_orphan+'=NULL'
-    else setvalue := CT_TblFld_Operations_orphan+ '='''+DestOrphan+'''';
-    SQL_UPDATE(CT_TblName_Operations,setvalue,whereorphan+' AND ('+CT_TblFld_Operations_block+'>='+inttostr(Start_Block)+')');
-
-    // Moving Bank table
-    if Orphan='' then whereorphan := '('+CT_TblFld_Bank_orphan+' IS NULL)'
-    else whereorphan := '('+CT_TblFld_Bank_orphan+' LIKE '''+Orphan+''')';
-    if DestOrphan='' then setvalue := CT_TblFld_Bank_orphan+'=NULL'
-    else setvalue := CT_TblFld_Bank_orphan+ '='''+DestOrphan+'''';
-    SQL_UPDATE(CT_TblName_Bank,setvalue,whereorphan+' AND ('+CT_TblFld_Bank_block+'>='+inttostr(Start_Block)+')');
-    FAdoConnection.CommitTrans;
-  Except
-    // Rollback changes
-    On E:Exception do begin
-      FAdoConnection.RollbackTrans;
-      Result :=False;
-      Raise;
-    end;
-  end;
-end;
-
-function TDBStorage.DoRestoreBank(max_block: Int64): Boolean;
-var ds : TAdoQuery;
-  whereorphan : AnsiString;
-  sql,errors : AnsiString;
-  bf : TBlobField;
-  ms : TMemoryStream;
-begin
-  Result := false;
-  TLog.NewLog(ltdebug,Classname,'DoRestoreBank max:'+inttostr(max_block));
-  if Orphan='' then whereorphan := '('+CT_TblFld_BlockChain_orphan+' IS NULL)'
-  else whereorphan := '('+CT_TblFld_BlockChain_orphan+' LIKE '''+Orphan+''')';
-  sql := 'SELECT * FROM '+CT_TblName_Bank+' WHERE ('+whereorphan+')';
-  if max_block<MaxInt then sql := sql+ ' AND ('+CT_TblFld_Bank_block+'<='+Inttostr(max_block)+') ';
-  sql := sql +' ORDER BY '+CT_TblFld_Bank_block+' DESC';
-  ds := TADOQuery.Create(Self);
-  Try
-    ds.Connection := FAdoConnection;
-    ds.CursorLocation := clUseServer; // Important: This improves speed!
-    ds.SQL.Text := sql;
-    ds.Open;
-    while (Not ds.Eof) do begin
-      bf := ds.FieldByName(CT_TblFld_Bank_bank_stream) as TBlobField;
-      ms := TMemoryStream.Create;
-      try
-        BlobSaveToStream(bf,ms);
-        ms.Position := 0;
-        Result := Bank.LoadBankFromStream(ms,errors);
-        if Not Result then begin
-          TLog.NewLog(lterror,Classname,Format('Error reading databse Bank block %d: %s',[ds.FieldByName(CT_TblFld_Bank_block).AsInteger,errors]));
-        end else begin
-          // Bye bye
-          Result := true;
-          break;
-        end;
-      finally
-        ms.Free;
-      end;
-      ds.Next;
-    end;
-  Finally
-    ds.Free;
-  End;
-end;
-
-function TDBStorage.DoSaveBank: Boolean;
-var ds : TAdoQuery;
-  whereorphan : AnsiString;
-  sql,errors : AnsiString;
-  bf : TBlobField;
-  ms : TMemoryStream;
-begin
-  Result := false;
-  FAdoConnection.BeginTrans;
-  try
-    TLog.NewLog(ltdebug,Classname,'DoSaveBank blockscount:'+inttostr(Bank.BlocksCount));
-    if Orphan='' then whereorphan := '('+CT_TblFld_BlockChain_orphan+' IS NULL)'
-    else whereorphan := '('+CT_TblFld_BlockChain_orphan+' LIKE '''+Orphan+''')';
-    SQL_DELETE(CT_TblName_Bank,whereorphan+' AND ('+CT_TblFld_Bank_block+'='+inttostr(Bank.BlocksCount)+')');
-
-    ds := TADOQuery.Create(Self);
-    try
-      ds.Connection := FAdoConnection;
-      SQL := 'SELECT * FROM '+CT_TblName_Bank+' WHERE (1=0)';
-      ds.SQL.Text := sql;
-      ds.Open;
-      ds.Insert;
-      ds.FieldByName(CT_TblFld_Bank_block).AsInteger := Bank.BlocksCount;
-      if Orphan<>'' then ds.FieldByName(CT_TblFld_Bank_orphan).AsAnsiString := Orphan
-      else ds.FieldByName(CT_TblFld_Bank_orphan).Value := Null;
-      bf := ds.FieldByName(CT_TblFld_Bank_bank_stream) as TBlobField;
-      ms := TMemoryStream.Create;
-      Try
-        Bank.SaveBankToStream(ms);
-        ms.Position := 0;
-        BlobLoadFromStream(bf,ms);
-        TLog.NewLog(ltdebug,Classname,Format('Saving bank of block %d with stream size %d bytes',[Bank.BlocksCount,ms.Size]));
-      Finally
-        ms.Free;
-      End;
-      ds.Post;
-      Result := true;
-    finally
-      ds.Free;
-    end;
-    FAdoConnection.CommitTrans;
-  Except
-    FAdoConnection.RollbackTrans;
-    raise;
-  end;
-end;
-
-function TDBStorage.DoSaveBlockChain(Operations: TPCOperationsComp): Boolean;
-  Function GetOperationBalance(iOperation : Integer; nAccount : Cardinal) : Int64;
-  Var i : Integer;
-    op : TPCOperation;
-  Begin
-    Result := Operations.bank.SafeBox.Account(nAccount).balance;
-    for i := (Operations.OperationsHashTree.OperationsCount-1) downto (iOperation+1) do begin
-      op := Operations.OperationsHashTree.GetOperation(i);
-      Case op.OpType of
-        CT_Op_Transaction : Begin
-          if TOpTransaction(op).Data.sender=nAccount then Result := Result + op.OperationAmount + op.OperationFee
-          else if TOpTransaction(op).Data.target=nAccount then Result := Result - op.OperationAmount;
-        End;
-      End;
-    end;
-  End;
-var ds : TADOQuery;
-  whereorphan : AnsiString;
-  sql,errors,aux : AnsiString;
-  bf : TBlobField;
-  ms : TMemoryStream;
-  i : Integer;
-  op : TPCOperation;
-  vOrphan : Variant;
-  trans : Integer;
-begin
-  Result := false;
-  trans := FAdoConnection.BeginTrans;
-  try
-    TLog.NewLog(ltdebug,Classname,'DoSaveBlockChain:'+TPCOperationsComp.OperationBlockToText(Operations.OperationBlock));
-    if Orphan='' then begin
-      whereorphan := '('+CT_TblFld_BlockChain_orphan+' IS NULL)';
-      vOrphan := Null;
-    end else begin
-      whereorphan := '('+CT_TblFld_BlockChain_orphan+' LIKE '''+Orphan+''')';
-      vOrphan := Orphan;
-    end;
-    SQL_DELETE(CT_TblName_BlockChain,whereorphan+' AND ('+CT_TblFld_BlockChain_block+'='+Inttostr(Operations.OperationBlock.block)+')');
-
-    if Orphan='' then whereorphan := '('+CT_TblFld_Operations_orphan+' IS NULL)'
-    else whereorphan := '('+CT_TblFld_Operations_orphan+' LIKE '''+Orphan+''')';
-    SQL_DELETE(CT_TblName_Operations,whereorphan+' AND ('+CT_TblFld_Operations_block+'='+Inttostr(Operations.OperationBlock.block)+')');
-
-    ds := TADOQuery.Create(Self);
-    ms := TMemoryStream.Create;
-    try
-      ds.Connection := FAdoConnection;
-      //
-      SQL := 'SELECT * FROM '+CT_TblName_BlockChain+' WHERE (1=0)';
-      ds.SQL.Text := SQL;
-      ds.Open;
-      ds.Insert;
-      ds.FieldByName(CT_TblFld_BlockChain_block).Value := Operations.OperationBlock.block;
-      aux := TCrypto.ToHexaString( TAccountComp.AccountKey2RawString(Operations.OperationBlock.account_key) );
-      if (length(aux)>255) then aux := copy(aux,1,252)+'...';
-      ds.FieldByName(CT_TblFld_BlockChain_accountkey).Value := Copy(aux,1,255);
-      ds.FieldByName(CT_TblFld_BlockChain_s_reward).Value := Format('%.18d', [Operations.OperationBlock.reward] );
-      ds.FieldByName(CT_TblFld_BlockChain_s_fee).Value := Format('%.18d', [Operations.OperationBlock.fee] );
-      ds.FieldByName(CT_TblFld_BlockChain_protocol_version).Value := Operations.OperationBlock.protocol_version;
-      ds.FieldByName(CT_TblFld_BlockChain_protocol_available).Value := Operations.OperationBlock.protocol_available;
-      ds.FieldByName(CT_TblFld_BlockChain_s_timestamp).Value := Format('%.10d', [Operations.OperationBlock.timestamp] );
-      ds.FieldByName(CT_TblFld_BlockChain_s_compact_target).Value := Format('%.10d', [Operations.OperationBlock.compact_target] );
-      ds.FieldByName(CT_TblFld_BlockChain_s_nonce).Value := Format('%.10d', [Operations.OperationBlock.nonce] );
-      DBRawToStringField(ds.FieldByName(CT_TblFld_BlockChain_rawpayload),Operations.OperationBlock.block_payload);
-      ds.FieldByName(CT_TblFld_BlockChain_safe_box_hash).Value := TCrypto.ToHexaString( Operations.OperationBlock.initial_safe_box_hash );
-      ds.FieldByName(CT_TblFld_BlockChain_operations_hash).Value := TCrypto.ToHexaString( Operations.OperationBlock.operations_hash );
-      ds.FieldByName(CT_TblFld_BlockChain_proof_of_work).Value :=  TCrypto.ToHexaString( Operations.OperationBlock.proof_of_work );
-      ds.FieldByName(CT_TblFld_BlockChain_orphan).Value := vOrphan;
-      ds.FieldByName(CT_TblFld_BlockChain_operations_count).Value := Operations.Count;
-      bf := ds.FieldByName(CT_TblFld_BlockChain_operations_stream) as TBlobField;
-      Operations.SaveBlockToStream(False,ms);
-      ms.Position := 0;
-      BlobLoadFromStream(bf,ms);
-      ds.Post;
-      // Save operations:
-      ds.Close;
-      ds.SQL.Text := 'SELECT * FROM '+CT_TblName_Operations+' WHERE (1=0)';
-      ds.Open;
-      // First insert reward
-      ds.Insert;
-      ds.FieldByName(CT_TblFld_Operations_optype).Value := 0;
-      ds.FieldByName(CT_TblFld_Operations_block).Value := Operations.OperationBlock.block;
-      ds.FieldByName(CT_TblFld_Operations_s_timestamp).Value := Format('%.10d', [Operations.OperationBlock.timestamp] );
-      ds.FieldByName(CT_TblFld_Operations_nopblock).Value := -1;
-      ds.FieldByName(CT_TblFld_Operations_optype_op).Value := 0;
-      ds.FieldByName(CT_TblFld_Operations_s_fee).Value := '0';
-      ds.FieldByName(CT_TblFld_Operations_orphan).Value := vOrphan;
-      ds.FieldByName(CT_TblFld_Operations_n_operation).Value := 0;
-      ds.FieldByName(CT_TblFld_Operations_account).Value := Operations.OperationBlock.block * CT_AccountsPerBlock;
-      ds.FieldByName(CT_TblFld_Operations_other_account).Value := Operations.OperationBlock.block * CT_AccountsPerBlock;
-      ds.FieldByName(CT_TblFld_Operations_s_amount).Value := Format('%.18d', [Operations.OperationBlock.reward+Operations.OperationBlock.fee] );
-      ds.FieldByName(CT_TblFld_Operations_s_balance).Value := Format('%.18d', [Operations.OperationBlock.reward+Operations.OperationBlock.fee] );
-      ds.Post;
-      // Insert operations
-      for i := 0 to Operations.Count-1 do begin
-        ds.Insert;
-        op := Operations.Operation[i];
-        ds.FieldByName(CT_TblFld_Operations_optype).Value := op.OpType;
-        ds.FieldByName(CT_TblFld_Operations_block).Value := Operations.OperationBlock.block;
-        ds.FieldByName(CT_TblFld_Operations_s_timestamp).Value := Format('%.10d', [Operations.OperationBlock.timestamp] );
-        ds.FieldByName(CT_TblFld_Operations_nopblock).Value := i;
-        ds.FieldByName(CT_TblFld_Operations_optype_op).Value := 0;
-        ds.FieldByName(CT_TblFld_Operations_s_fee).Value := Format('%.18d', [(-1)*op.OperationFee] ); // Fee is a Negative number
-        ds.FieldByName(CT_TblFld_Operations_orphan).Value := vOrphan;
-        case op.OpType of
-          CT_Op_Transaction : Begin
-            ds.FieldByName(CT_TblFld_Operations_n_operation).Value := TOpTransaction(op).Data.n_operation;
-            ds.FieldByName(CT_TblFld_Operations_account).Value :=  TOpTransaction(op).Data.sender;
-            ds.FieldByName(CT_TblFld_Operations_other_account).Value :=  TOpTransaction(op).Data.target;
-            ds.FieldByName(CT_TblFld_Operations_s_amount).Value := Format('%.18d', [(-1)*TOpTransaction(op).Data.amount] );
-            DBRawToStringField(ds.FieldByName(CT_TblFld_Operations_rawpayload),TOpTransaction(op).Data.payload);
-            ds.FieldByName(CT_TblFld_Operations_s_balance).Value := Format('%.18d', [GetOperationBalance(i,TOpTransaction(op).Data.sender)] );
-            ds.Post;
-            ds.Insert;
-            ds.FieldByName(CT_TblFld_Operations_optype).Value := op.OpType;
-            ds.FieldByName(CT_TblFld_Operations_block).Value := Operations.OperationBlock.block;
-            ds.FieldByName(CT_TblFld_Operations_s_timestamp).Value := Format('%.10d', [Operations.OperationBlock.timestamp] );
-            ds.FieldByName(CT_TblFld_Operations_nopblock).Value := i;
-            ds.FieldByName(CT_TblFld_Operations_optype_op).Value := 1; // Receive transaction
-            ds.FieldByName(CT_TblFld_Operations_s_fee).Value := '0';  // No fee for receiver
-            ds.FieldByName(CT_TblFld_Operations_s_balance).Value := Format('%.18d', [GetOperationBalance(i,TOpTransaction(op).Data.target)] );
-            ds.FieldByName(CT_TblFld_Operations_orphan).Value := vOrphan;
-            ds.FieldByName(CT_TblFld_Operations_n_operation).Value := 0; // No n_operation for receiver
-            ds.FieldByName(CT_TblFld_Operations_account).Value :=  TOpTransaction(op).Data.target;
-            ds.FieldByName(CT_TblFld_Operations_other_account).Value :=  TOpTransaction(op).Data.sender;
-            ds.FieldByName(CT_TblFld_Operations_s_amount).Value := Format('%.18d', [TOpTransaction(op).Data.amount] );
-            DBRawToStringField(ds.FieldByName(CT_TblFld_Operations_rawpayload),TOpTransaction(op).Data.payload);
-            ds.Post;
-          End;
-          CT_Op_Changekey : Begin
-            ds.FieldByName(CT_TblFld_Operations_n_operation).Value := TOpChangeKey(op).Data.n_operation;
-            ds.FieldByName(CT_TblFld_Operations_account).Value :=  TOpChangeKey(op).Data.account;
-            ds.FieldByName(CT_TblFld_Operations_s_amount).Value := '0';
-            DBRawToStringField(ds.FieldByName(CT_TblFld_Operations_rawpayload),TOpChangeKey(op).Data.payload);
-            ds.FieldByName(CT_TblFld_Operations_s_balance).Value := Format('%.18d', [GetOperationBalance(i,TOpChangeKey(op).Data.account)] );
-            aux := TCrypto.ToHexaString( TAccountComp.AccountKey2RawString(TOpChangeKey(op).Data.new_accountkey) );
-            if (length(aux)>255) then aux := copy(aux,1,252)+'...';
-            ds.FieldByName(CT_TblFld_Operations_newaccountkey).Value := Copy(aux,1,255);
-            ds.Post;
-          End;
-          CT_Op_Recover : Begin
-            ds.FieldByName(CT_TblFld_Operations_n_operation).Value := TOpRecoverFounds(op).Data.n_operation;
-            ds.FieldByName(CT_TblFld_Operations_account).Value :=  TOpRecoverFounds(op).Data.account;
-            ds.FieldByName(CT_TblFld_Operations_s_amount).Value := '0';
-            ds.FieldByName(CT_TblFld_Operations_s_balance).Value := Format('%.18d', [GetOperationBalance(i,TOpRecoverFounds(op).Data.account)] );
-            ds.Post;
-          End;
-        else raise Exception.Create('Development error: OpType not available to save to the Database '+Inttostr(Op.OpType));
-        end;
-      end;
-    finally
-      ms.Free;
-      ds.Free;
-    end;
-    SaveBank;
-    FAdoConnection.CommitTrans;
-    Result := true;
-  Except
-    FAdoConnection.RollbackTrans;
-    raise;
-  end;
-end;
-
-class function TDBStorage.GetBlockChainSQL(block_start, block_end: Int64;
-  dateStart, dateEnd: TDate; start, max: Integer): String;
-var sqltop : String;
-  whereorphan, where : String;
-begin
-  if (start=0) AND (max>0) then sqltop := ' TOP '+inttostr(max)+' '
-  else sqltop := '';
-  where := 'WHERE ('+CT_TblFld_Operations_orphan+' IS NULL)';
-  if (block_start>=0) then begin
-    where := where + ' AND ('+CT_TblFld_BlockChain_block+'>='+IntToStr(block_start)+')';
-  end;
-  if (block_end>=0) then begin
-    where := where + ' AND ('+CT_TblFld_BlockChain_block+'<='+IntToStr(block_end)+')';
-  end;
-  if (dateStart>1000) then begin
-    where := where + ' AND ('+CT_TblFld_BlockChain_s_timestamp+'>='+TDBStorage.ValueToSql(Format('%.10d', [UnivDateTimeToUnix(DateTime2UnivDateTime(dateStart))]))+')';
-  end;
-  if (dateEnd>1000) then begin
-    where := where + ' AND ('+CT_TblFld_BlockChain_s_timestamp+'<'+ValueToSql(Format('%.10d', [UnivDateTimeToUnix(DateTime2UnivDateTime(dateEnd+1))]))+')';
-  end;
-
-  Result := 'SELECT '+sqltop+' * '+
-    ' FROM '+CT_TblName_BlockChain+
-    ' '+where+
-    ' ORDER BY '+CT_TblFld_BlockChain_block+' DESC';
-end;
-
-function TDBStorage.GetOperationsFromAccount(Const OperationsResume : TOperationsResumeList; account_number : Cardinal; start,max : Integer) :Integer;
-var sqltop,whereorphan,sql,spayload : AnsiString;
-  ds : TADOQuery;
-  OPR : TOperationResume;
-  nrow : Integer;
-  ms : TMemoryStream;
-begin
-  if (start=0) AND (max>0) then sqltop := ' TOP '+inttostr(max)+' '
-  else sqltop := '';
-  if Orphan='' then whereorphan := '(('+CT_TblFld_BlockChain_orphan+' IS NULL) AND ('+CT_TblFld_Operations_orphan+' IS NULL))'
-  else whereorphan := '(('+CT_TblFld_BlockChain_orphan+' LIKE '''+Orphan+''') AND ('+CT_TblFld_Operations_orphan+' LIKE '''+Orphan+'''))';
-  sql := 'SELECT '+sqltop+' * '+
-    ' FROM '+CT_TblName_Operations+
-    ' WHERE ('+CT_TblFld_Operations_account+'='+inttostr(account_number)+') AND '+whereorphan+
-    ' ORDER BY '+CT_TblFld_Operations_block+' DESC, '+CT_TblFld_Operations_nopblock+' DESC, '+CT_TblFld_Operations_optype_op+' DESC';
-  ms := TMemoryStream.Create;
-    ds := TADOQuery.Create(Self);
-    try
-      ds.Connection := FAdoConnection;
-      ds.SQL.Text := sql;
-      ds.Open;
-      nrow := 0;
-      while not ds.Eof do begin
-        if (nrow>=start) then begin
-          OPR := CT_TOperationResume_NUL;
-          OPR.Block := ds.FieldByName(CT_TblFld_Operations_block).AsInteger;
-          OPR.AffectedAccount := account_number;
-          OPR.time := StrToIntDef( ds.FieldByName(CT_TblFld_BlockChain_s_timestamp).AsString,0);
-          case ds.FieldByName(CT_TblFld_Operations_optype).AsInteger of
-            0 : OPR.OperationTxt := 'Blockchain reward';
-            CT_Op_Transaction : begin
-              if ds.FieldByName(CT_TblFld_Operations_optype_op).AsInteger=0 then begin
-                OPR.OperationTxt := 'Transaction Sent to '+TAccountComp.AccountNumberToAccountTxtNumber(ds.FieldByName(CT_TblFld_Operations_other_account).AsLargeInt);
-              end else begin
-                OPR.OperationTxt := 'Transaction Received from '+TAccountComp.AccountNumberToAccountTxtNumber(ds.FieldByName(CT_TblFld_Operations_other_account).AsLargeInt);
-              end;
-            end;
-            CT_Op_Changekey : Begin
-              OPR.OperationTxt := 'Change Key';
-            End;
-            CT_Op_Recover : begin
-              OPR.OperationTxt := 'Recover founds';
-            end;
-          else
-            OPR.OperationTxt := 'Unknown OpType:'+Inttostr(ds.FieldByName(CT_TblFld_Operations_optype).AsInteger);
-          end;
-          OPR.Amount := StrToInt64Def( ds.FieldByName(CT_TblFld_Operations_s_amount).AsString ,0 );
-          OPR.Fee := StrToInt64Def( ds.FieldByName(CT_TblFld_Operations_s_fee).AsString ,0);
-          OPR.Balance := StrToInt64Def( ds.FieldByName(CT_TblFld_Operations_s_balance).AsString ,0);
-          DBStringFieldToRaw(ds.FieldByName(CT_TblFld_Operations_rawpayload),OPR.OriginalPayload);
-          If DBPayloadToReadableText(OPR.OriginalPayload,spayload) then OPR.PrintablePayload := spayload
-          else OPR.PrintablePayload := TCrypto.ToHexaString(OPR.OriginalPayload);
-          OperationsResume.Add(OPR);
-          //
-          if (max>0) And (OperationsResume.Count>=max) then exit;
-        end;
-        ds.Next;
-        inc(nrow);
-      end;
-    finally
-      ds.Free;
-      ms.Free;
-    end;
-end;
-
-class function TDBStorage.GetOperationsFromAccountSQL(account_number, block_start, block_end : Int64; dateStart,dateEnd : TDate; start,max : Integer) :String;
-var sqltop : String;
-  whereorphan, where : String;
-begin
-  if (start=0) AND (max>0) then sqltop := ' TOP '+inttostr(max)+' '
-  else sqltop := '';
-  where := 'WHERE ('+CT_TblFld_Operations_orphan+' IS NULL)';
-  if account_number>=0 then begin
-    where := where + ' AND ('+CT_TblFld_Operations_account+'='+inttostr(account_number)+')';
-  end;
-  if (block_start>=0) then begin
-    where := where + ' AND ('+CT_TblFld_Operations_block+'>='+IntToStr(block_start)+')';
-  end;
-  if (block_end>=0) then begin
-    where := where + ' AND ('+CT_TblFld_Operations_block+'<='+IntToStr(block_end)+')';
-  end;
-  if (dateStart>1000) then begin
-    where := where + ' AND ('+CT_TblFld_Operations_s_timestamp+'>='+ValueToSql( Format('%.10d', [UnivDateTimeToUnix(DateTime2UnivDateTime(dateStart))]))+')';
-  end;
-  if (dateEnd>1000) then begin
-    where := where + ' AND ('+CT_TblFld_Operations_s_timestamp+'<'+ValueToSql( Format('%.10d', [UnivDateTimeToUnix(DateTime2UnivDateTime(dateEnd+1))]))+')';
-  end;
-
-  Result := 'SELECT '+sqltop+' * '+
-    ' FROM '+CT_TblName_Operations+
-    ' '+where+
-    ' ORDER BY '+CT_TblFld_Operations_block+' DESC, '+CT_TblFld_Operations_nopblock+' DESC, '+CT_TblFld_Operations_optype_op+' DESC';
-end;
-
-class function TDBStorage.OperationToOperationResume(Operation : TPCOperation; Affected_account_number : Cardinal; var OperationResume : TOperationResume) : Boolean;
-Var spayload : AnsiString;
-begin
-  OperationResume := CT_TOperationResume_NUL;
-  OperationResume.Fee := (-1)*Operation.OperationFee;
-  OperationResume.AffectedAccount := Affected_account_number;
-  Result := false;
-  case Operation.OpType of
-    CT_Op_Transaction : Begin
-      if TOpTransaction(Operation).Data.sender=Affected_account_number then begin
-        OperationResume.OperationTxt := 'Transaction Sent to '+TAccountComp.AccountNumberToAccountTxtNumber(TOpTransaction(Operation).Data.target);
-        OperationResume.Amount := TOpTransaction(Operation).Data.amount * (-1);
-        Result := true;
-      end else if TOpTransaction(Operation).Data.target=Affected_account_number then begin
-        OperationResume.OperationTxt := 'Transaction Received from '+TAccountComp.AccountNumberToAccountTxtNumber(TOpTransaction(Operation).Data.sender);
-        OperationResume.Amount := TOpTransaction(Operation).Data.amount;
-        OperationResume.Fee := 0;
-        Result := true;
-      end else exit;
-    End;
-    CT_Op_Changekey : Begin
-      OperationResume.OperationTxt := 'Change Key';
-      OperationResume.Fee := TOpChangeKey(Operation).Data.fee;
-      Result := true;
-    End;
-    CT_Op_Recover : Begin
-      OperationResume.OperationTxt := 'Recover founds';
-      OperationResume.Fee := TOpRecoverFounds(Operation).Data.fee;
-    End;
-  else Exit;
-  end;
-  OperationResume.OriginalPayload := Operation.OperationPayload;
-  If DBPayloadToReadableText(OperationResume.OriginalPayload,spayload) then OperationResume.PrintablePayload := spayload
-  else OperationResume.PrintablePayload := TCrypto.ToHexaString(OperationResume.OriginalPayload);
-end;
-
-procedure TDBStorage.SetAccessFileName(const Value: AnsiString);
-begin
-  if FAccessFileName=Value then exit;
-  FAccessFileName := Value;
-  FAdoConnection.LoginPrompt := false;
-  FAdoConnection.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+Value+';Persist Security Info=False';
-  FAdoConnection.Connected := true;
-end;
-
-function TDBStorage.SQL_DELETE(const TblName: AnsiString; const Where: String): Boolean;
-Var sql : AnsiString;
-  ds : TADOQuery;
-begin
-  sql := 'DELETE * FROM '+TblName+' WHERE '+Where;
-  Try
-    ds := TADOQuery.Create(Self);
-    try
-      ds.Connection := FAdoConnection;
-      ds.SQL.Text := sql;
-      ds.ExecSQL;
-    finally
-      ds.Free;
-    end;
-  Except
-    On E:Exception do begin
-      E.Message := 'Error deleting'+#10+E.Message+#10+'SQL: '+sql;
-      raise;
-    end;
-  End;
-end;
-
-function TDBStorage.SQL_UPDATE(const TblName : AnsiString; Const SetValue : AnsiString; const Where : String): Boolean;
-Var sql : AnsiString;
-  ds : TADOQuery;
-begin
-  sql := 'UPDATE '+TblName+' SET '+SetValue+' WHERE '+Where;
-  try
-    ds := TADOQuery.Create(Self);
-    try
-      ds.Connection := FAdoConnection;
-      ds.SQL.Text := sql;
-      ds.ExecSQL;
-    finally
-      ds.Free;
-    end;
-  Except
-    On E:Exception do begin
-      E.Message := 'Error updating'+#10+E.Message+#10+'SQL: '+sql;
-      raise;
-    end;
-  End;
-end;
-
-class function TDBStorage.ValueToSql(const Value: Variant): String;
-Var decs,ths : Char;
-  dates,times : char;
-begin
-   decs := DecimalSeparator;
-   ths := ThousandSeparator;
-   times := TimeSeparator;
-   dates := DateSeparator;
-   try
-     DecimalSeparator := '.';
-     ThousandSeparator := ',';
-     TimeSeparator := ':';
-     DateSeparator := '-';
-
-     Case VarType(Value) of
-         varNull, varEmpty : Begin
-            Result := 'NULL';
-                   End;
-         varSmallint,
-         varInteger, varByte, varWord,
-         varLongWord,varInt64,varUInt64 : Result := IntToStr(Value);
-         varSingle,varDouble : begin
-           Result := FormatFloat('0.0#################',Value);
-         end;
-         varCurrency : Result := FormatCurr('0.0#######',Value);
-         varDate : Begin
-           Result := FormatFloat('0.0#################',Value);
-                   End;
-         varBoolean : Begin
-           If Value then Result := 'TRUE'
-           Else Result := 'FALSE'
-                      End;
-         varString,varOleStr,varUString  : Begin
-             Result := ''''+VarToStr(Value)+'''';
-           End;
-      Else // Case
-        Raise Exception.Create('Invalid variant Type: '+InttoHex(VarType(Value),8));
-      End;
-   finally
-     DecimalSeparator := decs;
-     ThousandSeparator := ths;
-     TimeSeparator := times;
-     DateSeparator := dates;
-   end;
-end;
-
-{ TOperationsResumeList }
-
-Type POperationResume = ^TOperationResume;
-
-procedure TOperationsResumeList.Add(const OperationResume: TOperationResume);
-Var P : POperationResume;
-begin
-  New(P);
-  P^ := OperationResume;
-  FList.Add(P);
-end;
-
-procedure TOperationsResumeList.Clear;
-Var P : POperationResume;
-  i : Integer;
-  l : TList;
-begin
-  l := FList.LockList;
-  try
-    for i := 0 to l.Count - 1 do begin
-      P := l[i];
-      Dispose(P);
-    end;
-    l.Clear;
-  finally
-    FList.UnlockList;
-  end;
-end;
-
-function TOperationsResumeList.Count: Integer;
-Var l : TList;
-begin
-  l := FList.LockList;
-  Try
-    Result := l.Count;
-  Finally
-    FList.UnlockList;
-  End;
-end;
-
-constructor TOperationsResumeList.Create;
-begin
-  FList := TPCThreadList.Create;
-end;
-
-procedure TOperationsResumeList.Delete(index: Integer);
-Var P : POperationResume;
-  l : TList;
-begin
-  l := FList.LockList;
-  Try
-    P := l[index];
-    l.Delete(index);
-    Dispose(P);
-  Finally
-    FList.UnlockList;
-  End;
-end;
-
-destructor TOperationsResumeList.Destroy;
-begin
-  Clear;
-  FreeAndNil(FList);
-  inherited;
-end;
-
-function TOperationsResumeList.GetOperationResume(index: Integer): TOperationResume;
-Var l : TList;
-begin
-  l := FList.LockList;
-  try
-    if index<l.Count then Result := POperationResume(l[index])^
-    else Result := CT_TOperationResume_NUL;
-  finally
-    FList.UnlockList;
-  end;
-end;
-
-end.

+ 92 - 36
Units/PascalCoin/UECIES.pas

@@ -37,12 +37,16 @@ unit UECIES;
 
   }
 
+{$I config.inc}
+
 interface
 
-Uses ssl_ecdh,ssl_types,ssl_evp,ssl_const,ssl_ec, UCrypto, ULog, ssl_hmac, ssl_err, UConst;
+Uses UOpenSSLdef, UOpenSSL, UCrypto, ULog, UConst;
 
 Const CT_Max_Bytes_To_Encrypt = 32000;
 
+Type size_t = Word;
+
 function ECIESEncrypt(const ECDSAPubKey: TECDSA_Public; const MessageToEncrypt: AnsiString): TRawBytes; overload;
 function ECIESEncrypt(EC_OpenSSL_NID : Word; PubKey: EC_POINT; const MessageToEncrypt: AnsiString): TRawBytes; overload;
 function ECIESDecrypt(EC_OpenSSL_NID : Word; PrivateKey: PEC_KEY; logErrors : Boolean; const MessageToDecrypt: TRawBytes; Var Decrypted : AnsiString): Boolean;
@@ -52,10 +56,8 @@ implementation
 uses
 {$IFnDEF FPC}
   Windows,
-{$ELSE}
-  LCLIntf, LCLType, LMessages, Windows,
 {$ENDIF}
-  ssl_sha, SysUtils, ssl_bn;
+  SysUtils, UAES;
 
 Type
   Psecure_t = Pointer;
@@ -95,17 +97,17 @@ end;
 
 function secure_key_data(cryptex : Psecure_t): Pointer;
 begin
-  Result := Pointer(Integer(cryptex) + Sizeof(secure_head_t));
+  Result := Pointer(PtrInt(cryptex) + Sizeof(secure_head_t));
 end;
 
 function secure_mac_data(cryptex : Psecure_t): Pointer;
 begin
-  Result := Pointer(Integer(cryptex) + Sizeof(secure_head_t) + Psecure_head_t(cryptex)^.key);
+  Result := Pointer(PtrInt(cryptex) + Sizeof(secure_head_t) + Psecure_head_t(cryptex)^.key);
 end;
 
 function secure_body_data(cryptex : Psecure_t): Pointer;
 begin
-  Result := Pointer(Integer(cryptex) + Sizeof(secure_head_t) + Psecure_head_t(cryptex)^.key + Psecure_head_t(cryptex)^.mac);
+  Result := Pointer(PtrInt(cryptex) + Sizeof(secure_head_t) + Psecure_head_t(cryptex)^.key + Psecure_head_t(cryptex)^.mac);
 end;
 
 function secure_alloc(key, mac, orig, body : UInt64) : Psecure_t;
@@ -185,9 +187,13 @@ Var PK,PEphemeral : PEC_KEY;
   iv: Array[1..EVP_MAX_IV_LENGTH] of byte;
   block:Array[1..EVP_MAX_BLOCK_LENGTH] of byte;
   cryptex : Psecure_t;
-  cipher : EVP_CIPHER_CTX;
+  pcipher : PEVP_CIPHER_CTX;
   body,aux : Pointer;
+  phmac : PHMAC_CTX;
+  {$IFDEF OpenSSL10}
+  cipher : EVP_CIPHER_CTX;
   hmac : HMAC_CTX;
+  {$ENDIF}
 begin
   Result := '';
   if length(MessageToEncrypt)>CT_Max_Bytes_To_Encrypt then begin
@@ -249,14 +255,20 @@ begin
       FillMemory(@iv,EVP_MAX_IV_LENGTH,0);
       {$ENDIF}
       // Setup the cipher context, the body length, and store a pointer to the body buffer location.
+
+      {$IFDEF OpenSSL10}
       EVP_CIPHER_CTX_init(@cipher);
+      pcipher := @cipher;
+      {$ELSE}
+      pcipher := EVP_CIPHER_CTX_new;
+      {$ENDIF}
       try
         body := secure_body_data(cryptex);
         body_length := secure_body_length(cryptex);
         // Initialize the cipher with the envelope key.
-        if (EVP_EncryptInit_ex(@cipher,EVP_aes_256_cbc,nil,@envelope_key,@iv)<>1) or
-          (EVP_CIPHER_CTX_set_padding(@cipher,0)<>1) or
-          (EVP_EncryptUpdate(@cipher,body,body_length,@MessageToEncrypt[1],
+        if (EVP_EncryptInit_ex(pcipher,EVP_aes_256_cbc,nil,@envelope_key,@iv)<>1) or
+          (EVP_CIPHER_CTX_set_padding(pcipher,0)<>1) or
+          (EVP_EncryptUpdate(pcipher,body,body_length,@MessageToEncrypt[1],
             Length(MessageToEncrypt) - (Length(MessageToEncrypt) MOD block_length))<>1) then begin
               TLog.NewLog(lterror,'ECIES',Format('An error occurred while trying to secure the data using the chosen symmetric cipher. {error = %s}',
               [ERR_error_string(ERR_get_error(),nil)]));
@@ -277,9 +289,9 @@ begin
           {$ELSE}
           FillMemory(@block,length(block),0);
           {$ENDIF}
-          CopyMemory(@block,Pointer(Integer(@MessageToEncrypt[1])+body_length),Length(MessageToEncrypt)-body_length);
+          CopyMemory(@block,Pointer(PtrInt(@MessageToEncrypt[1])+body_length),Length(MessageToEncrypt)-body_length);
           // Advance the body pointer to the location of the remaining space, and calculate just how much room is still available.
-          body := Pointer(integer(body)+body_length);
+          body := Pointer(PtrInt(body)+body_length);
           body_length := secure_body_length(cryptex) - body_length;
           if (body_length <0) then begin
              TLog.NewLog(lterror,'ECIES','The symmetric cipher overflowed!');
@@ -287,7 +299,7 @@ begin
           end;
           // Pass the final partially filled data block into the cipher as a complete block.
           // The padding will be removed during the decryption process.
-          if (EVP_EncryptUpdate(@cipher, body, body_length, @block, block_length)<>1) then begin
+          if (EVP_EncryptUpdate(pcipher, body, body_length, @block, block_length)<>1) then begin
             TLog.NewLog(lterror,'ECIES',Format('Unable to secure the data using the chosen symmetric cipher. {error = %s}',
             [ERR_error_string(ERR_get_error(),nil)]));
             exit;
@@ -295,35 +307,48 @@ begin
         end;
         // Advance the pointer, then use pointer arithmetic to calculate how much of the body buffer has been used. The complex logic is needed so that we get
         // the correct status regardless of whether there was a partial data block.
-        body := Pointer(integer(body)+body_length);
-        body_length := secure_body_length(cryptex) - (Integer(body)-Integer(secure_body_data(cryptex)));
+        body := Pointer(PtrInt(body)+body_length);
+        body_length := secure_body_length(cryptex) - (PtrInt(body)-PtrInt(secure_body_data(cryptex)));
         if (body_length < 0) then begin
           TLog.NewLog(lterror,'ECIES','The symmetric cipher overflowed!');
           exit;
         end;
-        if (EVP_EncryptFinal_ex(@cipher, body, body_length)<>1) then begin
+        if (EVP_EncryptFinal_ex(pcipher, body, body_length)<>1) then begin
           TLog.NewLog(lterror,'ECIES',Format('Unable to secure the data using the chosen symmetric cipher. {error = %s}',
           [ERR_error_string(ERR_get_error(),nil)]));
           exit;
         end;
       finally
-        EVP_CIPHER_CTX_cleanup(@cipher);
+        {$IFDEF OpenSSL10}
+        EVP_CIPHER_CTX_cleanup(pcipher);
+        {$ELSE}
+        EVP_CIPHER_CTX_free(pcipher);
+        {$ENDIF}
       end;
       // Generate an authenticated hash which can be used to validate the data during decryption.
+      {$IFDEF OpenSSL10}
       HMAC_CTX_init(@hmac);
+      phmac := @hmac;
+      {$ELSE}
+      phmac := HMAC_CTX_new;
+      {$ENDIF}
       Try
         mac_length := secure_mac_length(cryptex);
         // At the moment we are generating the hash using encrypted data. At some point we may want to validate the original text instead.
-        aux := Pointer(Integer(@envelope_key) + key_length);
-        if (HMAC_Init_ex(@hmac, aux, key_length, ECIES_HASHER, nil)<>1)
-          OR (HMAC_Update(@hmac, secure_body_data(cryptex), secure_body_length(cryptex))<>1)
-          OR (HMAC_Final(@hmac, secure_mac_data(cryptex),mac_length)<>1) then begin
+        aux := Pointer(PtrInt(@envelope_key) + key_length);
+        if (HMAC_Init_ex(phmac, aux, key_length, ECIES_HASHER, nil)<>1)
+          OR (HMAC_Update(phmac, secure_body_data(cryptex), secure_body_length(cryptex))<>1)
+          OR (HMAC_Final(phmac, secure_mac_data(cryptex),mac_length)<>1) then begin
           TLog.NewLog(lterror,'ECIES',Format('Unable to generate a data authentication code. {error = %s}',
           [ERR_error_string(ERR_get_error(),nil)]));
           exit;
         end;
       Finally
-        HMAC_CTX_cleanup(@hmac);
+        {$IFDEF OpenSSL10}
+        HMAC_CTX_cleanup(phmac);
+        {$ELSE}
+        HMAC_CTX_free(phmac);
+        {$ENDIF}
       End;
       SetLength(Result,secure_total_length(cryptex));
       CopyMemory(@Result[1],cryptex,length(Result));
@@ -366,7 +391,7 @@ End;
 function ECIESDecrypt(EC_OpenSSL_NID : Word; PrivateKey: PEC_KEY; logErrors : Boolean; const MessageToDecrypt: TRawBytes; Var Decrypted : AnsiString): Boolean;
 var
   cryptex : Psecure_t;
-  hmac : HMAC_CTX;
+  phmac : PHMAC_CTX;
   key_length : size_t;
   ephemeral : PEC_KEY;
   envelope_key : Array[1..SHA512_DIGEST_LENGTH] of byte;
@@ -376,7 +401,11 @@ var
   mac_length : Cardinal;
   aux : Pointer;
   output_length : Integer;
+  pcipher : PEVP_CIPHER_CTX;
+  {$IFDEF OpenSSL10}
   cipher : EVP_CIPHER_CTX;
+  hmac : HMAC_CTX;
+  {$ENDIF}
 Begin
   Result := false;
   Decrypted := '';
@@ -398,7 +427,11 @@ Begin
     // Use the intersection of the provided keys to generate the envelope data used by the ciphers below.
     // The ecies_key_derivation() function uses SHA 512 to ensure we have a sufficient amount of envelope key
     // material and that the material created is sufficiently secure.
+    {$IFDEF FPC}
+    FillByte(envelope_key,length(envelope_key),0);
+    {$ELSE}
     FillMemory(@envelope_key,length(envelope_key),0);
+    {$ENDIF}
     if (ECDH_compute_key(@envelope_key,SHA512_DIGEST_LENGTH,EC_KEY_get0_public_key(ephemeral),
       PrivateKey, ecies_key_derivation_512)<>SHA512_DIGEST_LENGTH) then begin
       if logErrors then TLog.NewLog(lterror,'ECIES',Format('An error occurred while trying to compute the envelope key. {error = %s}',[ERR_error_string(ERR_get_error, nil)]));
@@ -409,19 +442,28 @@ Begin
     EC_KEY_free(ephemeral);
   end;
   // Use the authenticated hash of the ciphered data to ensure it was not modified after being encrypted.
+  {$IFDEF OpenSSL10}
   HMAC_CTX_init(@hmac);
+  phmac := @hmac;
+  {$ELSE}
+  phmac := HMAC_CTX_new;
+  {$ENDIF}
   try
     // At the moment we are generating the hash using encrypted data. At some point we may want to validate the original text instead.
-    aux := Pointer(Integer(@envelope_key) + key_length);
-    if (HMAC_Init_ex(@hmac, aux, key_length, ECIES_HASHER, Nil)<>1) Or
-       (HMAC_Update(@hmac, secure_body_data(cryptex), secure_body_length(cryptex))<>1) Or
-       (HMAC_Final(@hmac, @md, mac_length)<>1) then begin
+    aux := Pointer(PtrInt(@envelope_key) + key_length);
+    if (HMAC_Init_ex(phmac, aux, key_length, ECIES_HASHER, Nil)<>1) Or
+       (HMAC_Update(phmac, secure_body_data(cryptex), secure_body_length(cryptex))<>1) Or
+       (HMAC_Final(phmac, @md, mac_length)<>1) then begin
        if logErrors then TLog.NewLog(lterror,'ECIES',Format('Unable to generate the authentication code needed for validation. {error = %s}',
          [ERR_error_string(ERR_get_error(), nil)]));
        exit;
     end;
   finally
-    HMAC_CTX_cleanup(@hmac);
+    {$IFDEF OpenSSL10}
+    HMAC_CTX_cleanup(phmac);
+    {$ELSE}
+    HMAC_CTX_free(phmac);
+    {$ENDIF}
   end;
   // We can use the generated hash to ensure the encrypted data was not altered after being encrypted.
   if (mac_length<>secure_mac_length(cryptex)) OR ( Not CompareMem(@md,secure_mac_data(cryptex), mac_length)) then begin
@@ -434,24 +476,34 @@ Begin
   block := output;
   try
     // For now we use an empty initialization vector. We also clear out the result buffer just to be on the safe side.
+    {$IFDEF FPC}
+    FillByte(iv,EVP_MAX_IV_LENGTH,0);
+    FillByte(output^,output_length+1,0);
+    {$ELSE}
     FillMemory(@iv,EVP_MAX_IV_LENGTH,0);
     FillMemory(output,output_length+1,0);
+    {$ENDIF}
+    {$IFDEF OpenSSL10}
     EVP_CIPHER_CTX_init(@cipher);
+    pcipher := @cipher;
+    {$ELSE}
+    pcipher := EVP_CIPHER_CTX_new;
+    {$ENDIF}
     try
       // Decrypt the data using the chosen symmetric cipher.
-      if (EVP_DecryptInit_ex(@cipher, EVP_aes_256_cbc, nil,@envelope_key, @iv)<>1) Or
-         (EVP_CIPHER_CTX_set_padding(@cipher, 0)<>1) Or
-         (EVP_DecryptUpdate(@cipher, block, output_length, secure_body_data(cryptex), secure_body_length(cryptex))<>1) then begin
+      if (EVP_DecryptInit_ex(pcipher, EVP_aes_256_cbc, nil,@envelope_key, @iv)<>1) Or
+         (EVP_CIPHER_CTX_set_padding(pcipher, 0)<>1) Or
+         (EVP_DecryptUpdate(pcipher, block, output_length, secure_body_data(cryptex), secure_body_length(cryptex))<>1) then begin
          if logErrors then TLog.NewLog(lterror,'ECIES',Format('Unable to decrypt the data using the chosen symmetric cipher. {error = %s}',[ERR_error_string(ERR_get_error(), nil)]));
          exit;
       end;
-      block := Pointer(Integer(block) + output_length);
+      block := Pointer(PtrInt(block) + output_length);
       output_length := secure_body_length(cryptex) - output_length;
       if (output_length<>0) then begin
         if logErrors then TLog.NewLog(lterror,'ECIES',Format('The symmetric cipher failed to properly decrypt the correct amount of data! {output_length:%d}',[output_length]));
         exit;
       end;
-      if (EVP_DecryptFinal_ex(@cipher,block,output_length)<>1) then begin
+      if (EVP_DecryptFinal_ex(pcipher,block,output_length)<>1) then begin
         if logErrors then TLog.NewLog(lterror,'ECIES',Format('Unable to decrypt the data using the chosen symmetric cipher. {error = %s}',[ERR_error_string(ERR_get_error(), nil)]));
         exit;
       end;
@@ -459,10 +511,14 @@ Begin
       CopyMemory(@Decrypted[1],output,length(Decrypted));
       Result := true;
     finally
-      FreeMemory(output);
+      {$IFDEF OpenSSL10}
+      EVP_CIPHER_CTX_cleanup(pcipher);
+      {$ELSE}
+      EVP_CIPHER_CTX_free(pcipher);
+      {$ENDIF}
     end;
   finally
-     EVP_CIPHER_CTX_cleanup(@cipher);
+    FreeMemory(output);
   end;
 End;
 

+ 50 - 46
Units/PascalCoin/UFileStorage.pas

@@ -20,11 +20,6 @@ unit UFileStorage;
 interface
 
 uses
-{$IFnDEF FPC}
-  Windows,
-{$ELSE}
-  LCLIntf, LCLType, LMessages,
-{$ENDIF}
   Classes, UBlockChain, SyncObjs;
 
 Type
@@ -34,6 +29,8 @@ Type
     BlockSize : Cardinal;
   end; // 16 bytes
 
+  { TFileStorage }
+
   TFileStorage = Class(TStorage)
   private
     FStorageLock : TCriticalSection;
@@ -61,6 +58,7 @@ Type
     Function BlockExists(Block : Cardinal) : Boolean; override;
     Function LockBlockChainStream : TFileStream;
     Procedure UnlockBlockChainStream;
+    Function LoadBankFileInfo(Const Filename : AnsiString; var BlocksCount : Cardinal) : Boolean;
   public
     Constructor Create(AOwner : TComponent); Override;
     Destructor Destroy; Override;
@@ -253,52 +251,42 @@ end;
 function TFileStorage.DoRestoreBank(max_block: Int64): Boolean;
 var
     sr: TSearchRec;
-    FileAttrs,errcode: Integer;
+    FileAttrs: Integer;
     folder : AnsiString;
     filename,auxfn : AnsiString;
     fs : TFileStream;
     errors : AnsiString;
-    c,lastc : Cardinal;
-    operations : TPCOperationsComp;
+    blockscount, c : Cardinal;
 begin
   LockBlockChainStream;
   Try
     FileAttrs := faArchive;
     folder := GetFolder(Orphan);
     filename := '';
-    operations := TPCOperationsComp.Create(Nil);
-    try
-      if SysUtils.FindFirst(folder+'\bank*.bank', FileAttrs, sr) = 0 then begin
-        lastc := 0;
-        repeat
-          if (sr.Attr and FileAttrs) = FileAttrs then begin
-            auxfn := ChangeFileExt(sr.Name,'');
-            val(copy(auxfn,5,length(auxfn)),c,errcode);
-            if (errcode=0) And ((c<=max_block)) then begin
-                if (filename='') then begin
-                  filename := sr.Name;
-                  lastc := c;
-                end else if (lastc<c) then begin
-                  filename := sr.Name;
-                  lastc := c;
-                end;
+    blockscount := 0;
+    if SysUtils.FindFirst(folder+PathDelim+'*.bank', FileAttrs, sr) = 0 then begin
+      repeat
+        if (sr.Attr and FileAttrs) = FileAttrs then begin
+          auxfn := folder+PathDelim+sr.Name;
+          If LoadBankFileInfo(auxfn,c) then begin
+            if ((c<=max_block) AND (c>blockscount)) then begin
+              filename := auxfn;
+              blockscount := c;
             end;
           end;
-        until FindNext(sr) <> 0;
-        FindClose(sr);
-      end;
-      if (filename<>'') then begin
-        fs := TFileStream.Create(folder+'\'+filename,fmOpenRead);
-        try
-          if not Bank.LoadBankFromStream(fs,errors) then begin
-            TLog.NewLog(lterror,ClassName,'Error reading bank from file: '+filename+ ' Error: '+errors);
-          end;
-        finally
-          fs.Free;
         end;
+      until FindNext(sr) <> 0;
+      FindClose(sr);
+    end;
+    if (filename<>'') then begin
+      fs := TFileStream.Create(filename,fmOpenRead);
+      try
+        if not Bank.LoadBankFromStream(fs,errors) then begin
+          TLog.NewLog(lterror,ClassName,'Error reading bank from file: '+filename+ ' Error: '+errors);
+        end;
+      finally
+        fs.Free;
       end;
-    finally
-      operations.Free;
     end;
   Finally
     UnlockBlockChainStream;
@@ -352,7 +340,8 @@ Var c : Cardinal;
 begin
   Result := '';
   If not ForceDirectories(BaseDataFolder) then exit;
-  Result := BaseDataFolder + '\bank'+Format('%.6d',[Block])+'.bank';
+  // We will store last 5 banks
+  Result := BaseDataFolder + PathDelim+'bank'+ inttostr(block MOD 5)+'.bank';
 end;
 
 function TFileStorage.GetBlockHeaderFirstBytePosition(Stream : TStream; Block: Cardinal; var StreamBlockHeaderStartPos: Int64; var BlockHeaderFirstBlock: Cardinal): Boolean;
@@ -392,7 +381,7 @@ begin
       inc(start);
     end;
   End;
-  StreamBlockHeaderStartPos := FBlockHeadersFirstBytePosition[high(FBlockHeadersFirstBytePosition)];
+  StreamBlockHeaderStartPos := FBlockHeadersFirstBytePosition[iPos];
   BlockHeaderFirstBlock := FStreamFirstBlockNumber + (iPos * CT_GroupBlockSize);
   Result := true;
 end;
@@ -405,11 +394,26 @@ end;
 function TFileStorage.GetFolder(const AOrphan: TOrphan): AnsiString;
 begin
   if FDatabaseFolder = '' then raise Exception.Create('No Database Folder');
-  if AOrphan<>'' then Result := FDatabaseFolder + '\'+AOrphan
+  if AOrphan<>'' then Result := FDatabaseFolder + PathDelim+AOrphan
   else Result := FDatabaseFolder;
   if not ForceDirectories(Result) then raise Exception.Create('Cannot create database folder: '+Result);
 end;
 
+function TFileStorage.LoadBankFileInfo(const Filename: AnsiString; var BlocksCount: Cardinal): Boolean;
+var fs: TFileStream;
+begin
+  Result := false;
+  BlocksCount:=0;
+  If Not FileExists(Filename) then exit;
+  fs := TFileStream.Create(Filename,fmOpenRead);
+  try
+    fs.Position:=0;
+    Result := Bank.LoadBankStreamHeader(fs,BlocksCount);
+  finally
+    fs.Free;
+  end;
+end;
+
 function TFileStorage.LockBlockChainStream: TFileStream;
 Var fn : TFileName;
   fm : Word;
@@ -417,13 +421,13 @@ begin
   TPCThread.ProtectEnterCriticalSection(Self,FStorageLock);
   Try
     if Not Assigned(FBlockChainStream) then begin
-      fn := GetFolder(Orphan)+'\BlockChainStream.blocks';
+      fn := GetFolder(Orphan)+PathDelim+'BlockChainStream.blocks';
       if ReadOnly then begin
         if FileExists(fn) then fm := fmOpenRead+fmShareDenyNone
-        else raise Exception.Create('DBFileStorage not exists for open ReadOnly: '+fn);
+        else raise Exception.Create('FileStorage not exists for open ReadOnly: '+fn);
       end else begin
-        if FileExists(fn) then fm := fmOpenReadWrite+fmShareDenyNone  // XXXXXXXXX Sure not to use fmShareDenyWrite ???
-        else fm := fmCreate+fmShareDenyNone  // XXXXXXXXX Sure not to use fmShareDenyWrite too ???
+        if FileExists(fn) then fm := fmOpenReadWrite+fmShareDenyWrite  // DenyNone -> XXXXXXXXX Sure not to use fmShareDenyWrite ???
+        else fm := fmCreate+fmShareDenyWrite  // XXXXXXXXX Sure not to use fmShareDenyWrite too ???
       end;
       FBlockChainStream := TFileStream.Create(fn,fm);
       // Read Headers:
@@ -490,7 +494,7 @@ begin
   try
     _ops.CopyFrom(Stream,_BlockSizeC);
     _ops.Position := 0;
-    If Not Operations.LoadBlockFromStream(_ops,errors) then begin
+    If Not Operations.LoadBlockFromStorage(_ops,errors) then begin
       TLog.NewLog(lterror,Classname,'Error reading OperationBlock '+inttostr(Block)+' from stream. Errors: '+errors);
       exit;
     end;
@@ -536,7 +540,7 @@ begin
   end;
   _ops := TMemoryStream.Create;
   Try
-    Operations.SaveBlockToStream(false,_ops);
+    Operations.SaveBlockToStorage(_ops);
     _Header.BlockSize := _ops.Size;
     // Positioning until Header Position to save Header data
     _intBlockIndex := (_Header.BlockNumber-BlockHeaderFirstBlock);

+ 10 - 0
Units/PascalCoin/ULog.pas

@@ -29,11 +29,16 @@ type
   TNewLogEvent = procedure(logtype : TLogType; Time : TDateTime; ThreadID : Cardinal; Const sender, logtext : AnsiString) of object;
 
   TLog = Class;
+
+  { TThreadSafeLogEvent }
+
   TThreadSafeLogEvent = Class(TPCThread)
     FLog : TLog;
     Procedure SynchronizedProcess;
   protected
     procedure BCExecute; override;
+  public
+    Constructor Create(Suspended : Boolean);
   End;
 
   TLogData = Record
@@ -183,6 +188,11 @@ begin
   end;
 end;
 
+constructor TThreadSafeLogEvent.Create(Suspended: Boolean);
+begin
+  inherited Create(Suspended);
+end;
+
 procedure TThreadSafeLogEvent.SynchronizedProcess;
 Var l : TList;
   i : Integer;

+ 1 - 1
Units/PascalCoin/UMiner.pas

@@ -23,7 +23,7 @@ Uses
 {$IFnDEF FPC}
   Windows,
 {$ELSE}
-  LCLIntf, LCLType, LMessages,
+  {LCLIntf, LCLType, LMessages,}
 {$ENDIF}
   UBlockChain, Classes, SyncObjs, UAccounts, UThread;
 

+ 17 - 20
Units/PascalCoin/UNetProtocol.pas

@@ -23,11 +23,13 @@ Uses
 {$IFnDEF FPC}
   Windows,
 {$ELSE}
-  LCLIntf, LCLType, LMessages,
+  {LCLIntf, LCLType, LMessages,}
 {$ENDIF}
-  UBlockChain, Classes, SysUtils, UAccounts, UThread, ExtCtrls,
+  UBlockChain, Classes, SysUtils, UAccounts, UThread,
   UCrypto, UTCPIP, SyncObjs;
 
+{$I config.inc}
+
 Const
   CT_MagicRequest = $0001;
   CT_MagicResponse = $0002;
@@ -1064,8 +1066,8 @@ begin
     // NOTE: FRemoteOperationBlock.block >= TNode.Node.Bank.BlocksCount
     // First capture same block than me (TNode.Node.Bank.BlocksCount-1) to check if i'm an orphan block...
     my_op := TNode.Node.Bank.LastOperationBlock;
-    If Not Do_GetOperationBlock(my_op.block,10000,client_op) then begin
-      TLog.NewLog(lterror,CT_LogSender,'Cannot receive information about my block ('+inttostr(my_op.block)+')... Invalid client');
+    If Not Do_GetOperationBlock(my_op.block,5000,client_op) then begin
+      TLog.NewLog(lterror,CT_LogSender,'Cannot receive information about my block ('+inttostr(my_op.block)+')...');
       // Disabled at Build 1.0.6 >  Connection.DisconnectInvalidClient(false,'Cannot receive information about my block ('+inttostr(my_op.block)+')... Invalid client. Disconnecting');
       exit;
     end;
@@ -1373,7 +1375,7 @@ begin
       end;
     Finally
       Try
-        TLog.NewLog(ltdebug,Classname,'Finalizing ServerAccept '+IntToHex(Integer(n),8)+' '+n.ClientRemoteAddr);
+        TLog.NewLog(ltdebug,Classname,'Finalizing ServerAccept '+IntToHex(PtrInt(n),8)+' '+n.ClientRemoteAddr);
         DebugStep := 'Disconnecting NetServerClient';
         n.Connected := false;
         sleep(10);
@@ -1481,7 +1483,7 @@ Var Pnsa : PNodeServerAddress;
   lns : TList;
   i : Integer;
 begin
-  TLog.NewLog(ltdebug,ClassName,'Destroying '+Classname+' '+IntToHex(Integer(Self),8));
+  TLog.NewLog(ltdebug,ClassName,'Destroying '+Classname+' '+IntToHex(PtrInt(Self),8));
 
   Connected := false;
 
@@ -1503,8 +1505,8 @@ begin
   Finally
     FreeAndNil(FNetLock);
     FreeAndNil(FClientBufferRead);
-    inherited;
     FreeAndNil(FTcpIpClient);
+    inherited;
   End;
 end;
 
@@ -2172,7 +2174,7 @@ begin
               DisconnectInvalidClient(false,'Invalid operation: '+TNetData.HeaderDataToText(HeaderData));
             end;
           end;
-        end;
+        end else sleep(1);
       Until (Result) Or (GetTickCount>(MaxWaitTime+tc));
     finally
       if was_waiting_for_response then FIsWaitingForResponse := false;
@@ -2184,6 +2186,7 @@ end;
 
 procedure TNetConnection.FinalizeConnection;
 begin
+  If FDoFinalizeConnection then exit;
   TLog.NewLog(ltdebug,ClassName,'Executing FinalizeConnection to '+ClientRemoteAddr);
   FDoFinalizeConnection := true;
 end;
@@ -2205,7 +2208,9 @@ end;
 procedure TNetConnection.Notification(AComponent: TComponent; Operation: TOperation);
 begin
   inherited;
-  if (Operation=opRemove) And (AComponent = FTcpIpClient) then FTcpIpClient := Nil;
+  if (Operation=opRemove) And (AComponent = FTcpIpClient) then begin
+    FTcpIpClient := Nil;
+  end;
 end;
 
 function TNetConnection.ReadTcpClientBuffer(MaxWaitMiliseconds: Cardinal; var HeaderData: TNetHeaderData; BufferData: TStream): Boolean;
@@ -2250,7 +2255,7 @@ begin
               ClientRemoteAddr+' (v '+inttostr(HeaderData.protocol.protocol_version)+' '+inttostr(HeaderData.protocol.protocol_available)+') '+
               '... Visit official download website for possible updates: https://sourceforge.net/projects/pascalcoin/');
           end;
-
+          // Remove data from buffer and save only data not processed (higher than stream.position)
           auxstream := TMemoryStream.Create;
           try
             if FClientBufferRead.Position<FClientBufferRead.Size then begin
@@ -2511,7 +2516,7 @@ begin
         data.Write(nsa.last_connection,4);
       end;
       // Send client version
-      TStreamOp.WriteAnsiString(data,CT_ClientAppVersion);
+      TStreamOp.WriteAnsiString(data,CT_ClientAppVersion{$IFDEF LINUX}+'l'{$ELSE}+'w'{$IFDEF Synapse}+'s'{$ENDIF}{$ENDIF}{$IFDEF OpenSSL10}+'0'{$ELSE}+'1'{$ENDIF});
     finally
       op.free;
     end;
@@ -2627,21 +2632,13 @@ end;
 { TNetClientThread }
 
 procedure TNetClientThread.BCExecute;
-Var clientIp : AnsiString;
 begin
-  debugstep := 'Initiating...';
-  clientIp := FNetClient.ClientRemoteAddr;
-  debugstep := 'Chenking terminated';
   while (Not Terminated) do begin
-    debugstep := 'Check connection '+clientIp;
     If FNetClient.Connected then begin
-      debugstep := 'Processing Buffer '+clientIp;
       FNetClient.DoProcessBuffer;
     end;
-    debugstep := 'Sleeping '+clientIp;
     Sleep(1);
   end;
-  debugstep := 'Finalizing...'+clientIp;
 end;
 
 constructor TNetClientThread.Create(NetClient: TNetClient; AOnTerminateThread : TNotifyEvent);
@@ -2770,7 +2767,7 @@ begin
         for i := l.Count-1 downto 0 do begin
           netconn := TNetConnection(l.Items[i]);
           if (netconn is TNetClient) then begin
-            if (Not TNetClient(netconn).Connected) And (netconn.CreatedTime+EncodeTime(0,0,1,0)<now) then begin
+            if (Not TNetClient(netconn).Connected) And (netconn.CreatedTime+EncodeTime(0,0,5,0)<now) then begin
               // Free this!
               TNetClient(netconn).FinalizeConnection;
               inc(ndeleted);

+ 15 - 15
Units/PascalCoin/UNode.pas

@@ -30,11 +30,6 @@ unit UNode;
 interface
 
 uses
-{$IFnDEF FPC}
-  Windows,
-{$ELSE}
-  LCLIntf, LCLType, LMessages,
-{$ENDIF}
   Classes, UBlockChain, UNetProtocol, UMiner, UAccounts, UCrypto, UThread, SyncObjs;
 
 Type
@@ -139,7 +134,7 @@ Type
 
 implementation
 
-Uses UOpTransaction, SysUtils, ULog, Forms, UConst, UTime;
+Uses UOpTransaction, SysUtils, ULog, UConst, UTime;
 
 var _Node : TNode;
 
@@ -174,12 +169,12 @@ Var i : Integer;
 begin
   Result := false;
   if FDisabledsNewBlocksCount>0 then begin
-    TLog.NewLog(ltinfo,Classname,Format('Cannot Add new BlockChain due is adding disabled - Miner:%s Connection:%s NewBlock:%s',[Inttohex(Integer(SenderMiner),8),
-    Inttohex(Integer(SenderConnection),8),TPCOperationsComp.OperationBlockToText(NewBlockOperations.OperationBlock)]));
+    TLog.NewLog(ltinfo,Classname,Format('Cannot Add new BlockChain due is adding disabled - Miner:%s Connection:%s NewBlock:%s',[Inttohex(PtrInt(SenderMiner),8),
+    Inttohex(PtrInt(SenderConnection),8),TPCOperationsComp.OperationBlockToText(NewBlockOperations.OperationBlock)]));
     exit;
   end;
-  TLog.NewLog(ltdebug,Classname,Format('AddNewBlockChain Miner:%s Connection:%s NewBlock:%s',[Inttohex(Integer(SenderMiner),8),
-    Inttohex(Integer(SenderConnection),8),TPCOperationsComp.OperationBlockToText(NewBlockOperations.OperationBlock)]));
+  TLog.NewLog(ltdebug,Classname,Format('AddNewBlockChain Miner:%s Connection:%s NewBlock:%s',[Inttohex(PtrInt(SenderMiner),8),
+    Inttohex(PtrInt(SenderConnection),8),TPCOperationsComp.OperationBlockToText(NewBlockOperations.OperationBlock)]));
   If Not TPCThread.TryProtectEnterCriticalSection(Self,2000,FLockNodeOperations) then begin
     s := 'Cannot AddNewBlockChain due blocking lock operations node';
     TLog.NewLog(lterror,Classname,s);
@@ -264,8 +259,8 @@ begin
     end;
   finally
     FLockNodeOperations.Release;
-    TLog.NewLog(ltdebug,Classname,Format('Finalizing AddNewBlockChain Miner:%s Connection:%s NewBlock:%s',[Inttohex(Integer(SenderMiner),8),
-      Inttohex(Integer(SenderConnection),8),TPCOperationsComp.OperationBlockToText(NewBlockOperations.OperationBlock) ]));
+    TLog.NewLog(ltdebug,Classname,Format('Finalizing AddNewBlockChain Miner:%s Connection:%s NewBlock:%s',[Inttohex(PtrInt(SenderMiner),8),
+      Inttohex(PtrInt(SenderConnection),8),TPCOperationsComp.OperationBlockToText(NewBlockOperations.OperationBlock) ]));
   End;
   if Result then begin
     // Notify it!
@@ -303,7 +298,7 @@ begin
     exit;
   end;
   TLog.NewLog(ltdebug,Classname,Format('AddOperations Connection:%s Operations:%d',[
-    Inttohex(Integer(SenderConnection),8),Operations.OperationsCount]));
+    Inttohex(PtrInt(SenderConnection),8),Operations.OperationsCount]));
   if Not TPCThread.TryProtectEnterCriticalSection(Self,4000,FLockNodeOperations) then begin
     s := 'Cannot AddOperations due blocking lock operations node';
     TLog.NewLog(lterror,Classname,s);
@@ -359,7 +354,7 @@ begin
   finally
     FLockNodeOperations.Release;
     TLog.NewLog(ltdebug,Classname,Format('Finalizing AddOperations Connection:%s Operations:%d',[
-      Inttohex(Integer(SenderConnection),8),Operations.OperationsCount ]));
+      Inttohex(PtrInt(SenderConnection),8),Operations.OperationsCount ]));
   end;
   // Notify it!
   for i := 0 to FNotifyList.Count-1 do begin
@@ -382,6 +377,7 @@ end;
 
 constructor TNode.Create(AOwner: TComponent);
 begin
+  RegisterOperationsClass;
   if Assigned(_Node) then raise Exception.Create('Duplicate nodes protection');
   TLog.NewLog(ltInfo,ClassName,'TNode.Create');
   inherited;
@@ -755,17 +751,21 @@ begin
     If (Terminated) Or (Not Assigned(FNodeNotifyEvents)) then exit;
     if FNotifyBlocksChanged then begin
       FNotifyBlocksChanged := false;
+      DebugStep:='Notify OnBlocksChanged';
       if Assigned(FNodeNotifyEvents) And (Assigned(FNodeNotifyEvents.FOnBlocksChanged)) then
         FNodeNotifyEvents.FOnBlocksChanged(FNodeNotifyEvents);
     end;
     if FNotifyOperationsChanged then begin
       FNotifyOperationsChanged := false;
+      DebugStep:='Notify OnOperationsChanged';
       if Assigned(FNodeNotifyEvents) And (Assigned(FNodeNotifyEvents.FOnOperationsChanged)) then
         FNodeNotifyEvents.FOnOperationsChanged(FNodeNotifyEvents);
     end;
     if FNodeNotifyEvents.FMessages.Count>0 then begin
+      DebugStep:='Notify OnNodeMessageEvent';
       if Assigned(FNodeNotifyEvents) And (Assigned(FNodeNotifyEvents.FOnNodeMessageEvent)) then begin
         for i := 0 to FNodeNotifyEvents.FMessages.Count - 1 do begin
+          DebugStep:='Notify OnNodeMessageEvent '+inttostr(i+1)+'/'+inttostr(FNodeNotifyEvents.FMessages.Count);
           FNodeNotifyEvents.FOnNodeMessageEvent(TNetConnection(FNodeNotifyEvents.FMessages.Objects[i]),FNodeNotifyEvents.FMessages.Strings[i]);
         end;
       end;
@@ -773,7 +773,7 @@ begin
     end;
   Except
     On E:Exception do begin
-      TLog.NewLog(lterror,ClassName,'Exception inside a Synchronized process: '+E.ClassName+':'+E.Message);
+      TLog.NewLog(lterror,ClassName,'Exception inside a Synchronized process: '+E.ClassName+':'+E.Message+' Step:'+DebugStep);
     end;
   End;
 end;

+ 19 - 5
Units/PascalCoin/UOpTransaction.pas

@@ -115,13 +115,19 @@ Type
     Function toString : String; Override;
   End;
 
-
+Procedure RegisterOperationsClass;
 
 implementation
 
 uses
   SysUtils, UConst, ULog;
 
+Procedure RegisterOperationsClass;
+Begin
+  TPCOperationsComp.RegisterOperationClass(TOpTransaction);
+  TPCOperationsComp.RegisterOperationClass(TOpChangeKey);
+  TPCOperationsComp.RegisterOperationClass(TOpRecoverFounds);
+End;
 
 { TOpTransaction }
 
@@ -208,6 +214,9 @@ begin
     errors := 'Invalid sign';
     Exit;
   end;
+  //
+  FPrevious_Sender_updated_block := sender.updated_block;
+  FPrevious_Destination_updated_block := target.updated_block;
   // Do operation
   Result := AccountTransaction.TransferAmount(FData.sender,FData.target,FData.n_operation,FData.amount,FData.fee,errors);
 end;
@@ -398,6 +407,7 @@ begin
     errors := 'Invalid sign';
     exit;
   end;
+  FPrevious_Sender_updated_block := account.updated_block;
   Result := AccountTransaction.UpdateAccountkey(FData.account,FData.n_operation,FData.new_accountkey,FData.fee,errors);
 end;
 
@@ -558,7 +568,12 @@ begin
   end;
   acc := AccountTransaction.Account(FData.account);
   if (acc.updated_block + CT_RecoverFoundsWaitInactiveCount >= AccountTransaction.FreezedSafeBox.BlocksCount) then begin
-    errors := Format('Is active to recover founds! Account %d Updated %d + %d >= BlockCount : %d',[FData.account,acc.updated_block,CT_RecoverFoundsWaitInactiveCount,AccountTransaction.FreezedSafeBox.BlocksCount]);
+    errors := Format('Account is active to recover founds! Account %d Updated %d + %d >= BlockCount : %d',[FData.account,acc.updated_block,CT_RecoverFoundsWaitInactiveCount,AccountTransaction.FreezedSafeBox.BlocksCount]);
+    Exit;
+  end;
+  // Build 1.0.8 ... there was a BUG. Need to prevent recent created accounts
+  if (TAccountComp.AccountBlock(FData.account) + CT_RecoverFoundsWaitInactiveCount >= AccountTransaction.FreezedSafeBox.BlocksCount) then begin
+    errors := Format('AccountBlock is active to recover founds! AccountBlock %d + %d >= BlockCount : %d',[TAccountComp.AccountBlock(FData.account),CT_RecoverFoundsWaitInactiveCount,AccountTransaction.FreezedSafeBox.BlocksCount]);
     Exit;
   end;
   if ((acc.n_operation+1)<>FData.n_operation) then begin
@@ -573,6 +588,7 @@ begin
     errors := 'Insuficient founds';
     exit;
   end;
+  FPrevious_Sender_updated_block := acc.updated_block;
   Result := AccountTransaction.TransferAmount(FData.account,FData.account,FData.n_operation,0,FData.fee,errors);
 end;
 
@@ -643,7 +659,5 @@ begin
 end;
 
 initialization
-  TPCOperationsComp.RegisterOperationClass(TOpTransaction);
-  TPCOperationsComp.RegisterOperationClass(TOpChangeKey);
-  TPCOperationsComp.RegisterOperationClass(TOpRecoverFounds);
+  RegisterOperationsClass;
 end.

+ 400 - 0
Units/PascalCoin/UOpenSSL.pas

@@ -0,0 +1,400 @@
+unit UOpenSSL;
+
+{ Copyright (c) 2016 by Albert Molina
+
+  Distributed under the MIT software license, see the accompanying file LICENSE
+  or visit http://www.opensource.org/licenses/mit-license.php.
+
+  This unit is a part of Pascal Coin, a P2P crypto currency without need of
+  historical operations.
+
+  If you like it, consider a donation using BitCoin:
+  16K3HCZRhFUtM8GdWRcfKeaa6KsuyxZaYk
+
+  ********************
+  Note:
+  Part of this unit contains some code of https://github.com/Arvur/OpenSSL-Delphi
+  Unknown license but public
+
+  }
+
+interface
+
+Uses UOpenSSLdef;
+{$I config.inc}
+
+var
+{$IFDEF UNIX}
+  {$IFDEF OpenSSL10}
+  SSL_C_LIB : AnsiString = './libcrypto.so.1.0.0';
+  {$ELSE}
+  SSL_C_LIB : AnsiString = './libcrypto.so.1.1';
+  {$ENDIF}
+{$ELSE}
+  {$IFDEF FPC}
+  // Windows + Lazarus uses a OpenSSL v1.0 64 bits
+  SSL_C_LIB : AnsiString = 'libeay64.dll';
+  {$ELSE}
+  // Windows + Delphi only allows OpenSSL v1.0 32 bits
+  SSL_C_LIB : AnsiString = 'libeay32.dll';
+  {$ENDIF}
+{$ENDIF}
+
+var
+  ERR_get_error: function: TC_ULONG; cdecl = nil;
+  ERR_error_string: function(e: TC_ULONG; _buf: PAnsiChar): PAnsiChar; cdecl = nil;
+  ERR_clear_error: procedure; cdecl = nil;
+
+  BN_CTX_new: function: PBN_CTX; cdecl = nil;
+  BN_CTX_free: procedure(c: PBN_CTX) cdecl = nil;
+  BN_num_bits: function(a: PBIGNUM): TC_INT; cdecl = nil;
+  BN_bin2bn: function(s: PAnsiChar; len: TC_INT; ret: PBIGNUM): PBIGNUM; cdecl = nil;
+  BN_bn2bin: function(a: PBIGNUM; _to: PAnsiChar): TC_INT; cdecl = nil;
+  BN_new: function: PBIGNUM; cdecl = nil;
+  BN_free: procedure(a: PBIGNUM); cdecl = nil;
+  BN_bn2hex: function(const a: PBIGNUM): PAnsiChar; cdecl = nil;
+  BN_bn2dec: function(const a: PBIGNUM): PAnsiChar;cdecl = nil;
+  BN_hex2bn: function(a: PPBIGNUM; str: PAnsiChar): TC_INT; cdecl = nil;
+  BN_add: function(r: PBIGNUM; a: PBIGNUM; b: PBIGNUM): TC_INT; cdecl = nil;
+  BN_mul: function(r: PBIGNUM; a: PBIGNUM; b: PBIGNUM; ctx: PBN_CTX): TC_INT; cdecl = nil;
+  BN_sqr: function(r: PBIGNUM; a: PBIGNUM; ctx: PBN_CTX): TC_INT; cdecl = nil;
+  BN_set_negative: procedure(b: PBIGNUM; n: TC_INT); cdecl = nil;
+  BN_div: function(dv: PBIGNUM; rem: PBIGNUM; m: PBIGNUM; d: PBIGNUM; ctx : PBN_CTX): TC_INT; cdecl = nil;
+  BN_nnmod: function(r: PBIGNUM; m: PBIGNUM; d: PBIGNUM; ctx: PBN_CTX ): TC_INT; cdecl = nil;
+  BN_cmp: function(a: PBIGNUM; b: PBIGNUM): TC_INT; cdecl = nil;
+  BN_copy: function(a: PBIGNUM;b: PBIGNUM): PBIGNUM; cdecl = nil;
+  BN_lshift: function(r: PBIGNUM; a: PBIGNUM; n: TC_INT): TC_INT; cdecl = nil;
+  BN_lshift1: function(r: PBIGNUM; a: PBIGNUM): TC_INT; cdecl = nil;
+  BN_rshift: function(r: PBIGNUM; const a: PBIGNUM; n: TC_INT): TC_INT; cdecl = nil;
+  BN_rshift1: function(r: PBIGNUM; const a: PBIGNUM): TC_INT; cdecl = nil;
+  BN_clear: procedure(a: PBIGNUM); cdecl = nil;
+  BN_dec2bn: function(a: PPBIGNUM; str: PAnsiChar): TC_INT; cdecl = nil;
+  BN_set_word: function(a: PBIGNUM; w: BN_ULONG): TC_INT; cdecl = nil;
+  BN_sub: function(r: PBIGNUM; a: PBIGNUM; b: PBIGNUM): TC_INT; cdecl = nil;
+  BN_exp: function(r: PBIGNUM; a: PBIGNUM; p: PBIGNUM; ctx: PBN_CTX): TC_INT; cdecl = nil;
+
+  EC_KEY_new: function: PEC_KEY; cdecl = nil;
+  EC_KEY_free: procedure(key: PEC_KEY); cdecl = nil;
+  EC_KEY_new_by_curve_name: function(nid: TC_INT): PEC_KEY; cdecl = nil;
+  EC_KEY_generate_key: function(key: PEC_KEY): TC_INT; cdecl = nil;
+  EC_KEY_get0_group: function(const key: PEC_KEY): PEC_GROUP; cdecl = nil;
+  EC_KEY_get0_private_key: function(const key: PEC_KEY): PBIGNUM; cdecl = nil;
+  EC_KEY_set_private_key: function(key: PEC_KEY; const prv: PBIGNUM): TC_INT; cdecl = nil;
+  EC_KEY_get0_public_key: function(const key: PEC_KEY): PEC_POINT; cdecl = nil;
+  EC_KEY_set_public_key: function(key: PEC_KEY; const pub: PEC_POINT): TC_INT; cdecl = nil;
+  EC_KEY_set_group: function(key: PEC_KEY; group: PEC_GROUP): TC_INT; cdecl = nil;
+  EC_KEY_check_key: function(key: PEC_KEY): TC_INT; cdecl = nil;
+  EC_GROUP_new_by_curve_name: function(nid: TC_INT): PEC_GROUP; cdecl = nil;
+  EC_GROUP_free: procedure (group: PEC_GROUP); cdecl = nil;
+  EC_POINT_new: function(const group: PEC_GROUP): PEC_POINT; cdecl = nil;
+  EC_POINT_free: procedure(point: PEC_POINT); cdecl = nil;
+  EC_POINT_set_affine_coordinates_GFp: function( group: PEC_GROUP; p: PEC_POINT;	 x: PBIGNUM;  y: PBIGNUM; ctx: PBN_CTX): TC_INT; cdecl = nil;
+  EC_POINT_get_affine_coordinates_GFp: function( group: PEC_GROUP;	 p: PEC_POINT; x: PBIGNUM; y: PBIGNUM; ctx: PBN_CTX): TC_INT; cdecl = nil;
+  EC_POINT_mul: function( group: PEC_GROUP; r: PEC_POINT;  bn: PBIGNUM;  pq: PEC_POINT;  bm: PBIGNUM; ctx: PBN_CTX): TC_INT; cdecl = nil;
+  EC_POINT_point2oct: function( group: PEC_GROUP;  p: PEC_POINT; form: point_conversion_form_t; buf: PAnsiChar; len: TC_SIZE_T; ctx: PBN_CTX): TC_SIZE_T; cdecl = nil;
+  EC_POINT_oct2point: function( group: PEC_GROUP; p: PEC_POINT;  buf: PAnsiChar; len: TC_SIZE_T; ctx: PBN_CTX): TC_INT; cdecl = nil;
+  EC_POINT_point2bn: function( group: PEC_GROUP;  point: PEC_POINT; form: point_conversion_form_t; b: PBIGNUM; ctx: PBN_CTX): PBIGNUM; cdecl = nil;
+  EC_POINT_bn2point: function( group: PEC_GROUP;  b: PBIGNUM;	point: PEC_POINT; ctx: PBN_CTX): PEC_POINT; cdecl = nil;
+
+  CRYPTO_free : procedure(ptr : Pointer) cdecl = nil;
+
+  SHA256_Init: function(c: PSHA256_CTX): TC_INT; cdecl = nil;
+  SHA256_Update: function(c: PSHA256_CTX; const data: Pointer; len: TC_SIZE_T): TC_INT; cdecl = nil;
+  SHA256_Final: function(md: PAnsiChar; c: PSHA256_CTX): TC_INT; cdecl = nil;
+  SHA256: function(const d: PAnsiChar; n: TC_SIZE_T;md: PAnsiChar): PAnsiChar; cdecl = nil;
+  SHA256_Transform: procedure(c: PSHA256_CTX; const data: PAnsiChar); cdecl = nil;
+  SHA512: function(const d: PAnsiChar; n: TC_SIZE_T;md: PAnsiChar): PAnsiChar; cdecl = nil;
+
+  RIPEMD160_Init: function(_c: PRIPEMD160_CTX): TC_INT; cdecl = nil;
+  RIPEMD160_Update: function(_c: PRIPEMD160_CTX; const _data: Pointer; _len: TC_SIZE_T): TC_INT; cdecl = nil;
+  RIPEMD160_Final: function(_md: PAnsiChar; _c: PRIPEMD160_CTX): TC_INT; cdecl = nil;
+  RIPEMD160: function(const _d: PAnsiChar; _n: TC_SIZE_T; _md: PAnsiChar): PAnsiChar; cdecl = nil;
+  RIPEMD160_Transform: procedure(_c: PRIPEMD160_CTX; const _b: PAnsiChar); cdecl = nil;
+
+  ECDSA_SIG_new: function: PECDSA_SIG; cdecl = nil;
+  ECDSA_SIG_free: procedure(_sig: PECDSA_SIG); cdecl = nil;
+  i2d_ECDSA_SIG: function(const _sig: PECDSA_SIG; _pp: PPAnsiChar): TC_INT; cdecl = nil;
+  d2i_ECDSA_SIG: function(_sig: PPECDSA_SIG; const _pp: PPAnsiChar; _len: TC_LONG): PECDSA_SIG; cdecl = nil;
+  ECDSA_do_sign: function(const _dgst: PAnsiChar; _dgst_len: TC_INT; _eckey: PEC_KEY): PECDSA_SIG; cdecl = nil;
+  ECDSA_do_sign_ex: function(const _dgst: PAnsiChar; _dgstlen: TC_INT; const _kinv: PBIGNUM; const _rp: Pointer; _eckey: PEC_KEY): PECDSA_SIG; cdecl = nil;
+  ECDSA_do_verify: function(const _dgst: PAnsiChar; _dgst_len: TC_INT; const _sig: PECDSA_SIG; _eckey: PEC_KEY): TC_INT; cdecl = nil;
+  {$IFDEF OpenSSL10}
+  {$ELSE}
+  ECDSA_SIG_get0: procedure(const _sig : PECDSA_SIG; const pr: PPBIGNUM; const ps:PPBIGNUM);
+  ECDSA_SIG_set0: function(_sig : PECDSA_SIG; r,s : PBIGNUM): TC_INT; cdecl = nil;
+  {$ENDIF}
+  ECDSA_size: function(const _eckey: PEC_KEY): TC_INT; cdecl = nil;
+  ECDSA_sign_setup: function(_eckey: PEC_KEY; _ctx: PBN_CTX; _kinv: PPBIGNUM; _rp: PPBIGNUM): TC_INT; cdecl = nil;
+  ECDSA_sign: function(_type: TC_INT; const _dgst: PAnsiChar; _dgstlen: TC_INT; _sig: PAnsiChar; var _siglen: TC_UINT; _eckey: PEC_KEY): TC_INT; cdecl = nil;
+  ECDSA_sign_ex: function(_type: TC_INT; const _dgst: PAnsiChar; _dgstlen: TC_INT; _sig: PAnsiChar; var _siglen: TC_UINT; const _kinv: PBIGNUM;const _rp: PBIGNUM; _eckey: PEC_KEY): TC_INT; cdecl = nil;
+  ECDSA_verify: function(_type: TC_INT; const _dgst: PAnsiChar; _dgstlen: TC_INT; const _sig: PAnsiChar; _siglen: TC_INT; _eckey: PEC_KEY): TC_INT; cdecl = nil;
+
+  RAND_pseudo_bytes: function(buf: PAnsiChar; num: TC_INT): TC_INT; cdecl = nil;
+
+  EVP_sha256: function: PEVP_MD; cdecl = nil;
+  {$IFDEF OpenSSL10}
+  EVP_MD_CTX_init: procedure(ctx: PEVP_MD_CTX); cdecl = nil;
+  EVP_MD_CTX_cleanup: function(ctx: PEVP_MD_CTX): TC_INT; cdecl = nil;
+  EVP_MD_CTX_create: function: PEVP_MD_CTX; cdecl = nil;
+  EVP_MD_CTX_destroy: procedure(ctx: PEVP_MD_CTX); cdecl = nil;
+  EVP_CIPHER_CTX_init: procedure(a: PEVP_CIPHER_CTX); cdecl = nil;
+  EVP_CIPHER_CTX_cleanup: function(a: PEVP_CIPHER_CTX): TC_INT; cdecl = nil;
+  {$ELSE}
+  EVP_MD_CTX_new: function : PEVP_MD_CTX; cdecl = nil;
+  EVP_MD_CTX_free: function(ctx: PEVP_MD_CTX): TC_INT; cdecl = nil;
+  {$ENDIF}
+  EVP_DigestInit_ex: function(ctx: PEVP_MD_CTX; const _type: PEVP_MD; impl: PENGINE): TC_INT; cdecl = nil;
+  EVP_DigestUpdate: function(ctx: PEVP_MD_CTX;const d: Pointer; cnt: TC_SIZE_T): TC_INT; cdecl = nil;
+  EVP_DigestFinal_ex: function(ctx: PEVP_MD_CTX;md: PAnsiChar;var s: TC_INT): TC_INT; cdecl = nil;
+  EVP_aes_256_cbc: function: PEVP_CIPHER; cdecl = nil;
+  EVP_CIPHER_CTX_free: procedure(a: PEVP_CIPHER_CTX); cdecl = nil;
+  EVP_CIPHER_CTX_new: function: PEVP_CIPHER_CTX; cdecl = nil;
+  EVP_DecryptInit: function(ctx: PEVP_CIPHER_CTX;const cipher: PEVP_CIPHER; const key: PAnsiChar; const iv: PAnsiChar): TC_INT; cdecl = nil;
+  EVP_DecryptInit_ex: function(ctx: PEVP_CIPHER_CTX;const cipher: PEVP_CIPHER; impl: PENGINE; const key: PAnsiChar; const iv: PAnsiChar): TC_INT; cdecl = nil;
+  EVP_DecryptUpdate: function(ctx: PEVP_CIPHER_CTX; _out: PAnsiChar; var outl: TC_INT; const _in: PAnsiChar; inl: TC_INT): TC_INT; cdecl = nil;
+  EVP_DecryptFinal: function(ctx: PEVP_CIPHER_CTX; outm: PAnsiChar; var outl: TC_INT): TC_INT; cdecl = nil;
+  EVP_EncryptInit: function(ctx: PEVP_CIPHER_CTX;const cipher: PEVP_CIPHER; const key: PAnsiChar; const iv: PAnsiChar): TC_INT; cdecl = nil;
+  EVP_EncryptInit_ex: function(ctx: PEVP_CIPHER_CTX;const cipher: PEVP_CIPHER; impl: PENGINE;   const key: PAnsiChar; const iv: PAnsiChar): TC_INT; cdecl = nil;
+  EVP_EncryptUpdate: function(ctx: PEVP_CIPHER_CTX; _out: PAnsiChar; var outl: TC_INT; const _in: PAnsiChar; inl: TC_INT): TC_INT; cdecl = nil;
+  EVP_EncryptFinal_ex: function(ctx: PEVP_CIPHER_CTX; _out: PAnsiChar; var outl: TC_INT): TC_INT; cdecl = nil;
+  EVP_EncryptFinal: function(ctx: PEVP_CIPHER_CTX; _out: PAnsiChar; var outl: TC_INT): TC_INT; cdecl = nil;
+  EVP_CIPHER_CTX_block_size: function(const ctx: PEVP_CIPHER_CTX): TC_INT; cdecl = nil;
+  EVP_md5: function: PEVP_MD; cdecl = nil;
+  EVP_CIPHER_key_length: function(const cipher: PEVP_CIPHER): TC_INT; cdecl = nil;
+  EVP_CIPHER_block_size: function(const cipher: PEVP_CIPHER): TC_INT; cdecl = nil;
+  EVP_MD_size: function(const md: PEVP_MD): TC_INT; cdecl = nil;
+  EVP_CIPHER_CTX_set_padding: function(c: PEVP_CIPHER_CTX; pad: TC_INT): TC_INT; cdecl = nil;
+  EVP_DecryptFinal_ex: function(ctx: PEVP_CIPHER_CTX; outm: PAnsiChar; var outl: TC_INT): TC_INT; cdecl = nil;
+
+  ECDH_compute_key: function(_out: Pointer; outlen: TC_SIZE_T; const _pub_key: PEC_POINT; _ecdh: PEC_KEY; KDF: ecdh_kdf): TC_INT; cdecl = nil;
+
+  {$IFDEF OpenSSL10}
+  HMAC_CTX_init: procedure(_ctx: PHMAC_CTX); cdecl = nil;
+  HMAC_CTX_cleanup: procedure(_ctx: PHMAC_CTX); cdecl = nil;
+  {$ELSE}
+  HMAC_CTX_new: function : PHMAC_CTX; cdecl = nil;
+  HMAC_CTX_free: procedure(_ctx: PHMAC_CTX); cdecl = nil;
+  {$ENDIF}
+
+  HMAC_Init: function(_ctx: PHMAC_CTX; const _key: Pointer; _len: TC_INT;const _md: PEVP_MD): TC_INT; cdecl = nil;
+  HMAC_Init_ex: function(_ctx: PHMAC_CTX; const _key: Pointer; _len: TC_INT;const _md: PEVP_MD; _impl: PENGINE): TC_INT; cdecl = nil;
+  HMAC_Update: function(_ctx: PHMAC_CTX; const _data: PAnsiChar; _len: TC_SIZE_T): TC_INT; cdecl = nil;
+  HMAC_Final: function(_ctx: PHMAC_CTX; _md: PAnsiChar; var _len: TC_UINT): TC_INT; cdecl = nil;
+  HMAC: function(const _evp_md: PEVP_MD; const _key: Pointer; _key_len: TC_INT; const _d: PAnsiChar; _n: TC_SIZE_T; _md: PAnsiChar; var _md_len: TC_UINT): PAnsiChar; cdecl = nil;
+  HMAC_CTX_copy: function(_dctx: PHMAC_CTX; _sctx: PHMAC_CTX): TC_INT; cdecl = nil;
+  HMAC_CTX_set_flags: procedure(_ctx: PHMAC_CTX; _flags: TC_ULONG); cdecl = nil;
+
+function SSLCryptHandle: THandle;
+function LoadSSLCrypt: Boolean;
+function LoadFunctionCLib(const FceName: String; const ACritical : Boolean = True): Pointer;
+function InitSSLFunctions : Boolean;
+function BN_num_bytes(a: PBIGNUM): TC_INT;
+procedure OpenSSL_free(ptr: Pointer);
+
+implementation
+
+uses {$IFDEF UNIX}dynlibs{$ELSE}windows{$ENDIF}, sysutils;
+
+var hCrypt: THandle = 0;
+
+function SSLCryptHandle: THandle;
+begin
+  Result := hCrypt;
+end;
+
+function LoadSSLCrypt: Boolean;
+begin
+  {$IFDEF UNIX}
+  hCrypt := LoadLibrary(SSL_C_LIB);
+  {$ELSE}
+  hCrypt := LoadLibraryA(PAnsiChar(SSL_C_LIB));
+  {$ENDIF}
+  Result := hCrypt <> 0;
+end;
+
+
+function LoadFunctionCLib(const FceName: String; const ACritical : Boolean = True): Pointer;
+begin
+  if SSLCryptHandle = 0 then begin
+    LoadSSLCrypt;
+  end;
+  {$IFDEF UNIX}
+  Result := GetProcAddress(SSLCryptHandle, AnsiString(FceName));
+  {$ELSE}
+  Result := Windows.GetProcAddress(SSLCryptHandle, PChar(FceName));
+  {$ENDIF}
+  if ACritical then begin
+    if Result = nil then begin
+    {$IFDEF FPC}
+     raise Exception.CreateFmt('Error loading OpenSSL library function "%s" error: "%s". Are you sure that using OpenSSL good version?', [FceName, SysErrorMessage(GetLastOSError)]);
+    {$ELSE}
+     raise Exception.CreateFmt('Error loading OpenSSL library function "%s" error: "%s". Are you sure that using OpenSSL good version?', [FceName, SysErrorMessage(GetLastError)]);
+    {$ENDIF}
+    end;
+  end;
+end;
+
+function InitSSLFunctions : Boolean;
+Begin
+  if @ERR_get_error = nil then begin
+    @ERR_get_error:= LoadFunctionCLib('ERR_get_error');
+    @ERR_clear_error:= LoadFunctionCLib('ERR_clear_error');
+    @ERR_error_string:= LoadFunctionCLib('ERR_error_string');
+    @BN_CTX_new:= LoadFunctionCLib('BN_CTX_new');
+    @BN_CTX_free:= LoadFunctionCLib('BN_CTX_free');
+    @BN_num_bits:= LoadFunctionCLib('BN_num_bits');
+    @BN_bin2bn:= LoadFunctionCLib('BN_bin2bn');
+    @BN_bn2bin:= LoadFunctionCLib('BN_bn2bin');
+    @BN_new:= LoadFunctionCLib('BN_new');
+    @BN_free:= LoadFunctionCLib('BN_free');
+    @BN_bn2hex:= LoadFunctionCLib('BN_bn2hex');
+    @BN_bn2dec:= LoadFunctionCLib('BN_bn2dec');
+    @BN_hex2bn:= LoadFunctionCLib('BN_hex2bn');
+    @BN_add:= LoadFunctionCLib('BN_add');
+    @BN_mul:= LoadFunctionCLib('BN_mul');
+    @BN_sqr:= LoadFunctionCLib('BN_sqr');
+    @BN_set_negative:= LoadFunctionCLib('BN_set_negative');
+    @BN_div:= LoadFunctionCLib('BN_div');
+    @BN_nnmod:= LoadFunctionCLib('BN_nnmod');
+    @BN_cmp:= LoadFunctionCLib('BN_cmp');
+    @BN_copy:= LoadFunctionCLib('BN_copy');
+    @BN_lshift:= LoadFunctionCLib('BN_lshift');
+    @BN_lshift1:= LoadFunctionCLib('BN_lshift1');
+    @BN_rshift:= LoadFunctionCLib('BN_rshift');
+    @BN_rshift1:= LoadFunctionCLib('BN_rshift1');
+    @BN_clear:= LoadFunctionCLib('BN_clear');
+    @BN_dec2bn:= LoadFunctionCLib('BN_dec2bn');
+    @BN_set_word:= LoadFunctionCLib('BN_set_word');
+    @BN_sub:= LoadFunctionCLib('BN_sub');
+    @BN_exp:= LoadFunctionCLib('BN_exp');
+    @EC_KEY_new := LoadFunctionCLib('EC_KEY_new');
+    @EC_KEY_free := LoadFunctionCLib('EC_KEY_free');
+    @EC_KEY_new_by_curve_name:= LoadFunctionCLib('EC_KEY_new_by_curve_name');
+    @EC_KEY_generate_key := LoadFunctionCLib('EC_KEY_generate_key');
+    @EC_KEY_get0_group:= LoadFunctionCLib('EC_KEY_get0_group');
+    @EC_KEY_get0_private_key:= LoadFunctionCLib('EC_KEY_get0_private_key');
+    @EC_KEY_set_private_key:= LoadFunctionCLib('EC_KEY_set_private_key');
+    @EC_KEY_get0_public_key:= LoadFunctionCLib('EC_KEY_get0_public_key');
+    @EC_KEY_set_public_key:= LoadFunctionCLib('EC_KEY_set_public_key');
+    @EC_KEY_set_group := LoadFunctionCLib('EC_KEY_set_group');
+    @EC_KEY_check_key := LoadFunctionCLib('EC_KEY_check_key');
+    @EC_GROUP_new_by_curve_name := LoadFunctionCLib('EC_GROUP_new_by_curve_name');
+    @EC_GROUP_free := LoadFunctionCLib('EC_GROUP_free');
+    @EC_POINT_new:= LoadFunctionCLib('EC_POINT_new');
+    @EC_POINT_free:= LoadFunctionCLib('EC_POINT_free');
+    @EC_POINT_set_affine_coordinates_GFp:= LoadFunctionCLib('EC_POINT_set_affine_coordinates_GFp');
+    @EC_POINT_get_affine_coordinates_GFp:= LoadFunctionCLib('EC_POINT_get_affine_coordinates_GFp');
+    @EC_POINT_mul:= LoadFunctionCLib('EC_POINT_mul');
+    @EC_POINT_point2oct:= LoadFunctionCLib('EC_POINT_point2oct');
+    @EC_POINT_oct2point:= LoadFunctionCLib('EC_POINT_oct2point');
+    @EC_POINT_point2bn:= LoadFunctionCLib('EC_POINT_point2bn');
+    @EC_POINT_bn2point:= LoadFunctionCLib('EC_POINT_bn2point');
+
+    @CRYPTO_free := LoadFunctionCLib('CRYPTO_free');
+
+    @SHA256_Init:= LoadFunctionCLib('SHA256_Init');
+    @SHA256_Update:= LoadFunctionCLib('SHA256_Update');
+    @SHA256_Final:= LoadFunctionCLib('SHA256_Final');
+    @SHA256:= LoadFunctionCLib('SHA256');
+    @SHA256_Transform:= LoadFunctionCLib('SHA256_Transform');
+    @SHA512:= LoadFunctionCLib('SHA512');
+
+    @RIPEMD160_Init:= LoadFunctionCLib('RIPEMD160_Init');
+    @RIPEMD160_Update:= LoadFunctionCLib('RIPEMD160_Update');
+    @RIPEMD160_Final:= LoadFunctionCLib('RIPEMD160_Final');
+    @RIPEMD160:= LoadFunctionCLib('RIPEMD160');
+    @RIPEMD160_Transform:= LoadFunctionCLib('RIPEMD160_Transform');
+
+    @ECDSA_SIG_new:= LoadFunctionCLib('ECDSA_SIG_new');
+    @ECDSA_SIG_free:= LoadFunctionCLib('ECDSA_SIG_free');
+    @i2d_ECDSA_SIG:= LoadFunctionCLib('i2d_ECDSA_SIG');
+    @d2i_ECDSA_SIG:= LoadFunctionCLib('d2i_ECDSA_SIG');
+    @ECDSA_do_sign:= LoadFunctionCLib('ECDSA_do_sign');
+    @ECDSA_do_sign_ex:= LoadFunctionCLib('ECDSA_do_sign_ex');
+    @ECDSA_do_verify:= LoadFunctionCLib('ECDSA_do_verify');
+    {$IFDEF OpenSSL10}
+    {$ELSE}
+    @ECDSA_SIG_get0:= LoadFunctionCLib('ECDSA_SIG_get0');
+    @ECDSA_SIG_set0:= LoadFunctionCLib('ECDSA_SIG_set0');
+    {$ENDIF}
+    @ECDSA_size:= LoadFunctionCLib('ECDSA_size');
+    @ECDSA_sign_setup:= LoadFunctionCLib('ECDSA_sign_setup');
+    @ECDSA_sign:= LoadFunctionCLib('ECDSA_sign');
+    @ECDSA_sign_ex:= LoadFunctionCLib('ECDSA_sign_ex');
+    @ECDSA_verify:= LoadFunctionCLib('ECDSA_verify');
+
+    @RAND_pseudo_bytes:= LoadFunctionCLib('RAND_pseudo_bytes');
+
+    @EVP_sha256:= LoadFunctionCLib('EVP_sha256');
+    {$IFDEF OpenSSL10}
+    @EVP_MD_CTX_init:= LoadFunctionCLib('EVP_MD_CTX_init');
+    @EVP_MD_CTX_cleanup:= LoadFunctionCLib('EVP_MD_CTX_cleanup');
+    @EVP_MD_CTX_create:= LoadFunctionCLib('EVP_MD_CTX_create');
+    @EVP_MD_CTX_destroy:= LoadFunctionCLib('EVP_MD_CTX_destroy');
+    @EVP_CIPHER_CTX_init:= LoadFunctionCLib('EVP_CIPHER_CTX_init');
+    @EVP_CIPHER_CTX_cleanup:= LoadFunctionCLib('EVP_CIPHER_CTX_cleanup');
+    {$ELSE}
+    @EVP_MD_CTX_new:= LoadFunctionCLib('EVP_MD_CTX_new');
+    @EVP_MD_CTX_free:= LoadFunctionCLib('EVP_MD_CTX_free');
+    {$ENDIF}
+    @EVP_DigestInit_ex:= LoadFunctionCLib('EVP_DigestInit_ex');
+    @EVP_DigestUpdate:= LoadFunctionCLib('EVP_DigestUpdate');
+    @EVP_DigestFinal_ex:= LoadFunctionCLib('EVP_DigestFinal_ex');
+    @EVP_aes_256_cbc:= LoadFunctionCLib('EVP_aes_256_cbc');
+    @EVP_CIPHER_CTX_free:= LoadFunctionCLib('EVP_CIPHER_CTX_free');
+    @EVP_CIPHER_CTX_new:= LoadFunctionCLib('EVP_CIPHER_CTX_new');
+    @EVP_DecryptInit:= LoadFunctionCLib('EVP_DecryptInit');
+    @EVP_DecryptInit_ex:= LoadFunctionCLib('EVP_DecryptInit_ex');
+    @EVP_DecryptUpdate:= LoadFunctionCLib('EVP_DecryptUpdate');
+    @EVP_DecryptFinal:= LoadFunctionCLib('EVP_DecryptFinal');
+    @EVP_EncryptInit:= LoadFunctionCLib('EVP_EncryptInit');
+    @EVP_EncryptInit_ex:= LoadFunctionCLib('EVP_EncryptInit_ex');
+    @EVP_EncryptUpdate:= LoadFunctionCLib('EVP_EncryptUpdate');
+    @EVP_EncryptFinal_ex:= LoadFunctionCLib('EVP_EncryptFinal_ex');
+    @EVP_EncryptFinal:= LoadFunctionCLib('EVP_EncryptFinal');
+    @EVP_CIPHER_CTX_block_size:= LoadFunctionCLib('EVP_CIPHER_CTX_block_size');
+    @EVP_md5:= LoadFunctionCLib('EVP_md5');
+    @EVP_CIPHER_key_length:= LoadFunctionCLib('EVP_CIPHER_key_length');
+    @EVP_CIPHER_block_size:= LoadFunctionCLib('EVP_CIPHER_block_size');
+    @EVP_MD_size:= LoadFunctionCLib('EVP_MD_size');
+    @EVP_CIPHER_CTX_set_padding:= LoadFunctionCLib('EVP_CIPHER_CTX_set_padding');
+    @EVP_DecryptFinal_ex:= LoadFunctionCLib('EVP_DecryptFinal_ex');
+    @ECDH_compute_key:= LoadFunctionCLib('ECDH_compute_key');
+
+    {$IFDEF OpenSSL10}
+    @HMAC_CTX_init:= LoadFunctionCLib('HMAC_CTX_init');
+    @HMAC_CTX_cleanup:= LoadFunctionCLib('HMAC_CTX_cleanup');
+    {$ELSE}
+    @HMAC_CTX_new:= LoadFunctionCLib('HMAC_CTX_new');
+    @HMAC_CTX_free:= LoadFunctionCLib('HMAC_CTX_free');
+    {$ENDIF}
+    @HMAC_Init:= LoadFunctionCLib('HMAC_Init');
+    @HMAC_Init_ex:= LoadFunctionCLib('HMAC_Init_ex');
+    @HMAC_Update:= LoadFunctionCLib('HMAC_Update');
+    @HMAC_Final:= LoadFunctionCLib('HMAC_Final');
+    @HMAC:= LoadFunctionCLib('HMAC');
+    @HMAC_CTX_copy:= LoadFunctionCLib('HMAC_CTX_copy');
+    @HMAC_CTX_set_flags:= LoadFunctionCLib('HMAC_CTX_set_flags');
+  end;
+End;
+
+function BN_num_bytes(a: PBIGNUM): TC_INT;
+begin
+  Result := (BN_num_bits(a)+7) div 8;
+end;
+
+procedure OpenSSL_free(ptr: Pointer);
+begin
+  if @CRYPTO_Free <> nil then begin
+    CRYPTO_free(ptr);
+  end;
+end;
+
+initialization
+
+finalization
+  if hCrypt <> 0 then begin
+    FreeLibrary(hCrypt);
+  end;
+end.
+

+ 7576 - 0
Units/PascalCoin/UOpenSSLdef.pas

@@ -0,0 +1,7576 @@
+unit UOpenSSLdef;
+
+{ Copyright (c) 2016 by Albert Molina
+
+  Distributed under the MIT software license, see the accompanying file LICENSE
+  or visit http://www.opensource.org/licenses/mit-license.php.
+
+  This unit is a part of Pascal Coin, a P2P crypto currency without need of
+  historical operations.
+
+  If you like it, consider a donation using BitCoin:
+  16K3HCZRhFUtM8GdWRcfKeaa6KsuyxZaYk
+
+  ********************
+  Note:
+  This unit contains code obtained from https://github.com/Arvur/OpenSSL-Delphi
+  Unknown license but public
+
+  }
+
+interface
+
+uses {$IFDEF UNIX}BaseUnix {$ELSE} Windows{$ENDIF};
+
+{$REGION 'OBJECT'}
+const
+ SN_undef                                               = 'UNDEF';
+ LN_undef                                               = 'undefined';
+ NID_undef                                              = 0;
+ SN_Algorithm                                           = 'Algorithm';
+ LN_algorithm                                           = 'algorithm';
+ NID_algorithm                                          = 38;
+ LN_rsadsi                                              = 'rsadsi';
+ NID_rsadsi                                             = 1;
+ LN_pkcs                                                = 'pkcs';
+ NID_pkcs                                               = 2;
+ SN_md2                                                 = 'MD2';
+ LN_md2                                                 = 'md2';
+ NID_md2                                                = 3;
+ SN_md5                                                 = 'MD5';
+ LN_md5                                                 = 'md5';
+ NID_md5                                                = 4;
+ SN_rc4                                                 = 'RC4';
+ LN_rc4                                                 = 'rc4';
+ NID_rc4                                                = 5;
+ LN_rsaEncryption                                       = 'rsaEncryption';
+ NID_rsaEncryption                                      = 6;
+ SN_md2WithRSAEncryption                                = 'RSA-MD2';
+ LN_md2WithRSAEncryption                                = 'md2WithRSAEncryption';
+ NID_md2WithRSAEncryption                               = 7;
+ SN_md5WithRSAEncryption                                = 'RSA-MD5';
+ LN_md5WithRSAEncryption                                = 'md5WithRSAEncryption';
+ NID_md5WithRSAEncryption                               = 8;
+ SN_pbeWithMD2AndDES_CBC                                = 'PBE-MD2-DES';
+ LN_pbeWithMD2AndDES_CBC                                = 'pbeWithMD2AndDES-CBC';
+ NID_pbeWithMD2AndDES_CBC                               = 9;
+ SN_pbeWithMD5AndDES_CBC                                = 'PBE-MD5-DES';
+ LN_pbeWithMD5AndDES_CBC                                = 'pbeWithMD5AndDES-CBC';
+ NID_pbeWithMD5AndDES_CBC                               = 10;
+ LN_X500                                                = 'X500';
+ NID_X500                                               = 11;
+ LN_X509                                                = 'X509';
+ NID_X509                                               = 12;
+ SN_commonName                                          = 'CN';
+ LN_commonName                                          = 'commonName';
+ NID_commonName                                         = 13;
+ SN_countryName                                         = 'C';
+ LN_countryName                                         = 'countryName';
+ NID_countryName                                        = 14;
+ SN_localityName                                        = 'L';
+ LN_localityName                                        = 'localityName';
+ NID_localityName                                       = 15;
+ SN_stateOrProvinceName                                 = 'ST';
+ LN_stateOrProvinceName                                 = 'stateOrProvinceName';
+ NID_stateOrProvinceName                                = 16;
+ SN_organizationName                                    = 'O';
+ LN_organizationName                                    = 'organizationName';
+ NID_organizationName                                   = 17;
+ SN_organizationalUnitName                              = 'OU';
+ LN_organizationalUnitName                              = 'organizationalUnitName';
+ NID_organizationalUnitName                             = 18;
+ SN_rsa                                                 = 'RSA';
+ LN_rsa                                                 = 'rsa';
+ NID_rsa                                                = 19;
+ LN_pkcs7                                               = 'pkcs7';
+ NID_pkcs7                                              = 20;
+ LN_pkcs7_data                                          = 'pkcs7-data';
+ NID_pkcs7_data                                         = 21;
+ LN_pkcs7_signed                                        = 'pkcs7-signedData';
+ NID_pkcs7_signed                                       = 22;
+ LN_pkcs7_enveloped                                     = 'pkcs7-envelopedData';
+ NID_pkcs7_enveloped                                    = 23;
+ LN_pkcs7_signedAndEnveloped                            = 'pkcs7-signedAndEnvelopedData';
+ NID_pkcs7_signedAndEnveloped                           = 24;
+ LN_pkcs7_digest                                        = 'pkcs7-digestData';
+ NID_pkcs7_digest                                       = 25;
+ LN_pkcs7_encrypted                                     = 'pkcs7-encryptedData';
+ NID_pkcs7_encrypted                                    = 26;
+ LN_pkcs3                                               = 'pkcs3';
+ NID_pkcs3                                              = 27;
+ LN_dhKeyAgreement                                      = 'dhKeyAgreement';
+ NID_dhKeyAgreement                                     = 28;
+ SN_des_ecb                                             = 'DES-ECB';
+ LN_des_ecb                                             = 'des-ecb';
+ NID_des_ecb                                            = 29;
+ SN_des_cfb64                                           = 'DES-CFB';
+ LN_des_cfb64                                           = 'des-cfb';
+ NID_des_cfb64                                          = 30;
+ SN_des_cbc                                             = 'DES-CBC';
+ LN_des_cbc                                             = 'des-cbc';
+ NID_des_cbc                                            = 31;
+ SN_des_ede                                             = 'DES-EDE';
+ LN_des_ede                                             = 'des-ede';
+ NID_des_ede                                            = 32;
+ SN_des_ede3                                            = 'DES-EDE3';
+ LN_des_ede3                                            = 'des-ede3';
+ NID_des_ede3                                           = 33;
+ SN_idea_cbc                                            = 'IDEA-CBC';
+ LN_idea_cbc                                            = 'idea-cbc';
+ NID_idea_cbc                                           = 34;
+ SN_idea_cfb64                                          = 'IDEA-CFB';
+ LN_idea_cfb64                                          = 'idea-cfb';
+ NID_idea_cfb64                                         = 35;
+ SN_idea_ecb                                            = 'IDEA-ECB';
+ LN_idea_ecb                                            = 'idea-ecb';
+ NID_idea_ecb                                           = 36;
+ SN_rc2_cbc                                             = 'RC2-CBC';
+ LN_rc2_cbc                                             = 'rc2-cbc';
+ NID_rc2_cbc                                            = 37;
+ SN_rc2_ecb                                             = 'RC2-ECB';
+ LN_rc2_ecb                                             = 'rc2-ecb';
+ NID_rc2_ecb                                            = 38;
+ SN_rc2_cfb64                                           = 'RC2-CFB';
+ LN_rc2_cfb64                                           = 'rc2-cfb';
+ NID_rc2_cfb64                                          = 39;
+ SN_rc2_ofb64                                           = 'RC2-OFB';
+ LN_rc2_ofb64                                           = 'rc2-ofb';
+ NID_rc2_ofb64                                          = 40;
+ SN_sha                                                 = 'SHA';
+ LN_sha                                                 = 'sha';
+ NID_sha                                                = 41;
+ SN_shaWithRSAEncryption                                = 'RSA-SHA';
+ LN_shaWithRSAEncryption                                = 'shaWithRSAEncryption';
+ NID_shaWithRSAEncryption                               = 42;
+ SN_des_ede_cbc                                         = 'DES-EDE-CBC';
+ LN_des_ede_cbc                                         = 'des-ede-cbc';
+ NID_des_ede_cbc                                        = 43;
+ SN_des_ede3_cbc                                        = 'DES-EDE3-CBC';
+ LN_des_ede3_cbc                                        = 'des-ede3-cbc';
+ NID_des_ede3_cbc                                       = 44;
+ SN_des_ofb64                                           = 'DES-OFB';
+ LN_des_ofb64                                           = 'des-ofb';
+ NID_des_ofb64                                          = 45;
+ SN_idea_ofb64                                          = 'IDEA-OFB';
+ LN_idea_ofb64                                          = 'idea-ofb';
+ NID_idea_ofb64                                         = 46;
+ LN_pkcs9                                               = 'pkcs9';
+ NID_pkcs9                                              = 47;
+ SN_pkcs9_emailAddress                                  = 'Email';
+ LN_pkcs9_emailAddress                                  = 'emailAddress';
+ NID_pkcs9_emailAddress                                 = 48;
+ LN_pkcs9_unstructuredName                              = 'unstructuredName';
+ NID_pkcs9_unstructuredName                             = 49;
+ LN_pkcs9_contentType                                   = 'contentType';
+ NID_pkcs9_contentType                                  = 50;
+ LN_pkcs9_messageDigest                                 = 'messageDigest';
+ NID_pkcs9_messageDigest                                = 51;
+ LN_pkcs9_signingTime                                   = 'signingTime';
+ NID_pkcs9_signingTime                                  = 52;
+ LN_pkcs9_countersignature                              = 'countersignature';
+ NID_pkcs9_countersignature                             = 53;
+ LN_pkcs9_challengePassword                             = 'challengePassword';
+ NID_pkcs9_challengePassword                            = 54;
+ LN_pkcs9_unstructuredAddress                           = 'unstructuredAddress';
+ NID_pkcs9_unstructuredAddress                          = 55;
+ LN_pkcs9_extCertAttributes                             = 'extendedCertificateAttributes';
+ NID_pkcs9_extCertAttributes                            = 56;
+ SN_netscape                                            = 'Netscape';
+ LN_netscape                                            = 'Netscape Communications Corp.';
+ NID_netscape                                           = 57;
+ SN_netscape_cert_extension                             = 'nsCertExt';
+ LN_netscape_cert_extension                             = 'Netscape Certificate Extension';
+ NID_netscape_cert_extension                            = 58;
+ SN_netscape_data_type                                  = 'nsDataType';
+ LN_netscape_data_type                                  = 'Netscape Data Type';
+ NID_netscape_data_type                                 = 59;
+ SN_des_ede_cfb64                                       = 'DES-EDE-CFB';
+ LN_des_ede_cfb64                                       = 'des-ede-cfb';
+ NID_des_ede_cfb64                                      = 60;
+ SN_des_ede3_cfb64                                      = 'DES-EDE3-CFB';
+ LN_des_ede3_cfb64                                      = 'des-ede3-cfb';
+ NID_des_ede3_cfb64                                     = 61;
+ SN_des_ede_ofb64                                       = 'DES-EDE-OFB';
+ LN_des_ede_ofb64                                       = 'des-ede-ofb';
+ NID_des_ede_ofb64                                      = 62;
+ SN_des_ede3_ofb64                                      = 'DES-EDE3-OFB';
+ LN_des_ede3_ofb64                                      = 'des-ede3-ofb';
+ NID_des_ede3_ofb64                                     = 63;
+ SN_sha1                                                = 'SHA1';
+ LN_sha1                                                = 'sha1';
+ NID_sha1                                               = 64;
+ SN_sha1WithRSAEncryption                               = 'RSA-SHA1';
+ LN_sha1WithRSAEncryption                               = 'sha1WithRSAEncryption';
+ NID_sha1WithRSAEncryption                              = 65;
+ SN_dsaWithSHA                                          = 'DSA-SHA';
+ LN_dsaWithSHA                                          = 'dsaWithSHA';
+ NID_dsaWithSHA                                         = 66;
+ SN_dsa_2                                               = 'DSA-old';
+ LN_dsa_2                                               = 'dsaEncryption-old';
+ NID_dsa_2                                              = 67;
+ SN_pbeWithSHA1AndRC2_CBC                               = 'PBE-SHA1-RC2-64';
+ LN_pbeWithSHA1AndRC2_CBC                               = 'pbeWithSHA1AndRC2-CBC';
+ NID_pbeWithSHA1AndRC2_CBC                              = 68;
+  LN_id_pbkdf2                                          = 'PBKDF2';
+ NID_id_pbkdf2                                          = 69;
+ SN_dsaWithSHA1_2                                       = 'DSA-SHA1-old';
+ LN_dsaWithSHA1_2                                       = 'dsaWithSHA1-old';
+ NID_dsaWithSHA1_2                                      = 70;
+ SN_netscape_cert_type                                  = 'nsCertType';
+ LN_netscape_cert_type                                  = 'Netscape Cert Type';
+ NID_netscape_cert_type                                 = 71;
+ SN_netscape_base_url                                   = 'nsBaseUrl';
+ LN_netscape_base_url                                   = 'Netscape Base Url';
+ NID_netscape_base_url                                  = 72;
+ SN_netscape_revocation_url                             = 'nsRevocationUrl';
+ LN_netscape_revocation_url                             = 'Netscape Revocation Url';
+ NID_netscape_revocation_url                            = 73;
+ SN_netscape_ca_revocation_url                          = 'nsCaRevocationUrl';
+ LN_netscape_ca_revocation_url                          = 'Netscape CA Revocation Url';
+ NID_netscape_ca_revocation_url                         = 74;
+ SN_netscape_renewal_url                                = 'nsRenewalUrl';
+ LN_netscape_renewal_url                                = 'Netscape Renewal Url';
+ NID_netscape_renewal_url                               = 75;
+ SN_netscape_ca_policy_url                              = 'nsCaPolicyUrl';
+ LN_netscape_ca_policy_url                              = 'Netscape CA Policy Url';
+ NID_netscape_ca_policy_url                             = 76;
+ SN_netscape_ssl_server_name                            = 'nsSslServerName';
+ LN_netscape_ssl_server_name                            = 'Netscape SSL Server Name';
+ NID_netscape_ssl_server_name                           = 77;
+ SN_netscape_comment                                    = 'nsComment';
+ LN_netscape_comment                                    = 'Netscape Comment';
+ NID_netscape_comment                                   = 78;
+ SN_netscape_cert_sequence                              = 'nsCertSequence';
+ LN_netscape_cert_sequence                              = 'Netscape Certificate Sequence';
+ NID_netscape_cert_sequence                             = 79;
+ SN_desx_cbc                                            = 'DESX-CBC';
+ LN_desx_cbc                                            = 'desx-cbc';
+ NID_desx_cbc                                           = 80;
+ SN_id_ce                                               = 'id-ce';
+ NID_id_ce                                              = 81;
+ SN_subject_key_identifier                              = 'subjectKeyIdentifier';
+ LN_subject_key_identifier                              = 'X509v3 Subject Key Identifier';
+ NID_subject_key_identifier                             = 82;
+ SN_key_usage                                           = 'keyUsage';
+ LN_key_usage                                           = 'X509v3 Key Usage';
+ NID_key_usage                                          = 83;
+ SN_private_key_usage_period                            = 'privateKeyUsagePeriod';
+ LN_private_key_usage_period                            = 'X509v3 Private Key Usage Period';
+ NID_private_key_usage_period                           = 84;
+ SN_subject_alt_name                                    = 'subjectAltName';
+ LN_subject_alt_name                                    = 'X509v3 Subject Alternative Name';
+ NID_subject_alt_name                                   = 85;
+ SN_issuer_alt_name                                     = 'issuerAltName';
+ LN_issuer_alt_name                                     = 'X509v3 Issuer Alternative Name';
+ NID_issuer_alt_name                                    = 86;
+ SN_basic_constraints                                   = 'basicConstraints';
+ LN_basic_constraints                                   = 'X509v3 Basic Constraints';
+ NID_basic_constraints                                  = 87;
+ SN_crl_number                                          = 'crlNumber';
+ LN_crl_number                                          = 'X509v3 CRL Number';
+ NID_crl_number                                         = 88;
+ SN_certificate_policies                                = 'certificatePolicies';
+ LN_certificate_policies                                = 'X509v3 Certificate Policies';
+ NID_certificate_policies                               = 89;
+ SN_authority_key_identifier                            = 'authorityKeyIdentifier';
+ LN_authority_key_identifier                            = 'X509v3 Authority Key Identifier';
+ NID_authority_key_identifier                           = 90;
+ SN_bf_cbc                                              = 'BF-CBC';
+ LN_bf_cbc                                              = 'bf-cbc';
+ NID_bf_cbc                                             = 91;
+ SN_bf_ecb                                              = 'BF-ECB';
+ LN_bf_ecb                                              = 'bf-ecb';
+ NID_bf_ecb                                             = 92;
+ SN_bf_cfb64                                            = 'BF-CFB';
+ LN_bf_cfb64                                            = 'bf-cfb';
+ NID_bf_cfb64                                           = 93;
+ SN_bf_ofb64                                            = 'BF-OFB';
+ LN_bf_ofb64                                            = 'bf-ofb';
+ NID_bf_ofb64                                           = 94;
+ SN_mdc2                                                = 'MDC2';
+ LN_mdc2                                                = 'mdc2';
+ NID_mdc2                                               = 95;
+ SN_mdc2WithRSA                                         = 'RSA-MDC2';
+ LN_mdc2WithRSA                                         = 'mdc2withRSA';
+ NID_mdc2WithRSA                                        = 96;
+ SN_rc4_40                                              = 'RC4-40';
+ LN_rc4_40                                              = 'rc4-40';
+ NID_rc4_40                                             = 97;
+ SN_rc2_40_cbc                                          = 'RC2-40-CBC';
+ LN_rc2_40_cbc                                          = 'rc2-40-cbc';
+ NID_rc2_40_cbc                                         = 98;
+ SN_givenName                                           = 'G';
+ LN_givenName                                           = 'givenName';
+ NID_givenName                                          = 99;
+ SN_surname                                             = 'S';
+ LN_surname                                             = 'surname';
+ NID_surname                                            = 100;
+ SN_initials                                            = 'I';
+ LN_initials                                            = 'initials';
+ NID_initials                                           = 101;
+ SN_uniqueIdentifier                                    = 'UID';
+ LN_uniqueIdentifier                                    = 'uniqueIdentifier';
+ NID_uniqueIdentifier                                   = 102;
+ SN_crl_distribution_points                             = 'crlDistributionPoints';
+ LN_crl_distribution_points                             = 'X509v3 CRL Distribution Points';
+ NID_crl_distribution_points                            = 103;
+ SN_md5WithRSA                                          = 'RSA-NP-MD5';
+ LN_md5WithRSA                                          = 'md5WithRSA';
+ NID_md5WithRSA                                         = 104;
+ SN_serialNumber                                        = 'SN';
+ LN_serialNumber                                        = 'serialNumber';
+ NID_serialNumber                                       = 105;
+ SN_title                                               = 'T';
+ LN_title                                               = 'title';
+ NID_title                                              = 106;
+ SN_description                                         = 'D';
+ LN_description                                         = 'description';
+ NID_description                                        = 107;
+ SN_cast5_cbc                                           = 'CAST5-CBC';
+ LN_cast5_cbc                                           = 'cast5-cbc';
+ NID_cast5_cbc                                          = 108;
+ SN_cast5_ecb                                           = 'CAST5-ECB';
+ LN_cast5_ecb                                           = 'cast5-ecb';
+ NID_cast5_ecb                                          = 109;
+ SN_cast5_cfb64                                         = 'CAST5-CFB';
+ LN_cast5_cfb64                                         = 'cast5-cfb';
+ NID_cast5_cfb64                                        = 110;
+ SN_cast5_ofb64                                         = 'CAST5-OFB';
+ LN_cast5_ofb64                                         = 'cast5-ofb';
+ NID_cast5_ofb64                                        = 111;
+ LN_pbeWithMD5AndCast5_CBC                              = 'pbeWithMD5AndCast5CBC';
+ NID_pbeWithMD5AndCast5_CBC                             = 112;
+ SN_dsaWithSHA1                                         = 'DSA-SHA1';
+ LN_dsaWithSHA1                                         = 'dsaWithSHA1';
+ NID_dsaWithSHA1                                        = 113;
+ NID_md5_sha1                                           = 114;
+ SN_md5_sha1                                            = 'MD5-SHA1';
+ LN_md5_sha1                                            = 'md5-sha1';
+ SN_sha1WithRSA                                         = 'RSA-SHA1-2';
+ LN_sha1WithRSA                                         = 'sha1WithRSA';
+ NID_sha1WithRSA                                        = 115;
+ SN_dsa                                                 = 'DSA';
+ LN_dsa                                                 = 'dsaEncryption';
+ NID_dsa                                                = 116;
+ SN_ripemd160                                           = 'RIPEMD160';
+ LN_ripemd160                                           = 'ripemd160';
+ NID_ripemd160                                          = 117;
+ SN_ripemd160WithRSA                                    = 'RSA-RIPEMD160';
+ LN_ripemd160WithRSA                                    = 'ripemd160WithRSA';
+ NID_ripemd160WithRSA                                   = 119;
+ SN_rc5_cbc                                             = 'RC5-CBC';
+ LN_rc5_cbc                                             = 'rc5-cbc';
+ NID_rc5_cbc                                            = 120;
+ SN_rc5_ecb                                             = 'RC5-ECB';
+ LN_rc5_ecb                                             = 'rc5-ecb';
+ NID_rc5_ecb                                            = 121;
+ SN_rc5_cfb64                                           = 'RC5-CFB';
+ LN_rc5_cfb64                                           = 'rc5-cfb';
+ NID_rc5_cfb64                                          = 122;
+ SN_rc5_ofb64                                           = 'RC5-OFB';
+ LN_rc5_ofb64                                           = 'rc5-ofb';
+ NID_rc5_ofb64                                          = 123;
+ SN_rle_compression                                     = 'RLE';
+ LN_rle_compression                                     = 'run length compression';
+ NID_rle_compression                                    = 124;
+ SN_zlib_compression                                    = 'ZLIB';
+ LN_zlib_compression                                    = 'zlib compression';
+ NID_zlib_compression                                   = 125;
+ SN_ext_key_usage                                       = 'extendedKeyUsage';
+ LN_ext_key_usage                                       = 'X509v3 Extended Key Usage';
+ NID_ext_key_usage                                      = 126;
+ SN_id_pkix                                             = 'PKIX';
+ NID_id_pkix                                            = 127;
+ SN_id_kp                                               = 'id-kp';
+ NID_id_kp                                              = 128;
+ SN_server_auth                                         = 'serverAuth';
+ LN_server_auth                                         = 'TLS Web Server Authentication';
+ NID_server_auth                                        = 129;
+ SN_client_auth                                         = 'clientAuth';
+ LN_client_auth                                         = 'TLS Web Client Authentication';
+ NID_client_auth                                        = 130;
+ SN_code_sign                                           = 'codeSigning';
+ LN_code_sign                                           = 'Code Signing';
+ NID_code_sign                                          = 131;
+ SN_email_protect                                       = 'emailProtection';
+ LN_email_protect                                       = 'E-mail Protection';
+ NID_email_protect                                      = 132;
+ SN_time_stamp                                          = 'timeStamping';
+ LN_time_stamp                                          = 'Time Stamping';
+ NID_time_stamp                                         = 133;
+ SN_ms_code_ind                                         = 'msCodeInd';
+ LN_ms_code_ind                                         = 'Microsoft Individual Code Signing';
+ NID_ms_code_ind                                        = 134;
+ SN_ms_code_com                                         = 'msCodeCom';
+ LN_ms_code_com                                         = 'Microsoft Commercial Code Signing';
+ NID_ms_code_com                                        = 135;
+ SN_ms_ctl_sign                                         = 'msCTLSign';
+ LN_ms_ctl_sign                                         = 'Microsoft Trust List Signing';
+ NID_ms_ctl_sign                                        = 136;
+ SN_ms_sgc                                              = 'msSGC';
+ LN_ms_sgc                                              = 'Microsoft Server Gated Crypto';
+ NID_ms_sgc                                             = 137;
+ SN_ms_efs                                              = 'msEFS';
+ LN_ms_efs                                              = 'Microsoft Encrypted File System';
+ NID_ms_efs                                             = 138;
+ SN_ns_sgc                                              = 'nsSGC';
+ LN_ns_sgc                                              = 'Netscape Server Gated Crypto';
+ NID_ns_sgc                                             = 139;
+ SN_delta_crl                                           = 'deltaCRL';
+ LN_delta_crl                                           = 'X509v3 Delta CRL Indicator';
+ NID_delta_crl                                          = 140;
+ SN_crl_reason                                          = 'CRLReason';
+ LN_crl_reason                                          = 'CRL Reason Code';
+ NID_crl_reason                                         = 141;
+ SN_invalidity_date                                     = 'invalidityDate';
+ LN_invalidity_date                                     = 'Invalidity Date';
+ NID_invalidity_date                                    = 142;
+ SN_sxnet                                               = 'SXNetID';
+ LN_sxnet                                               = 'Strong Extranet ID';
+ NID_sxnet                                              = 143;
+ SN_pbe_WithSHA1And128BitRC4                            = 'PBE-SHA1-RC4-128';
+ LN_pbe_WithSHA1And128BitRC4                            = 'pbeWithSHA1And128BitRC4';
+ NID_pbe_WithSHA1And128BitRC4                           = 144;
+ SN_pbe_WithSHA1And40BitRC4                             = 'PBE-SHA1-RC4-40';
+ LN_pbe_WithSHA1And40BitRC4                             = 'pbeWithSHA1And40BitRC4';
+ NID_pbe_WithSHA1And40BitRC4                            = 145;
+ SN_pbe_WithSHA1And3_Key_TripleDES_CBC                  = 'PBE-SHA1-3DES';
+ LN_pbe_WithSHA1And3_Key_TripleDES_CBC                  = 'pbeWithSHA1And3-KeyTripleDES-CBC';
+ NID_pbe_WithSHA1And3_Key_TripleDES_CBC                 = 146;
+ SN_pbe_WithSHA1And2_Key_TripleDES_CBC                  = 'PBE-SHA1-2DES';
+ LN_pbe_WithSHA1And2_Key_TripleDES_CBC                  = 'pbeWithSHA1And2-KeyTripleDES-CBC';
+ NID_pbe_WithSHA1And2_Key_TripleDES_CBC                 = 147;
+ SN_pbe_WithSHA1And128BitRC2_CBC                        = 'PBE-SHA1-RC2-128';
+ LN_pbe_WithSHA1And128BitRC2_CBC                        = 'pbeWithSHA1And128BitRC2-CBC';
+ NID_pbe_WithSHA1And128BitRC2_CBC                       = 148;
+ SN_pbe_WithSHA1And40BitRC2_CBC                         = 'PBE-SHA1-RC2-40';
+ LN_pbe_WithSHA1And40BitRC2_CBC                         = 'pbeWithSHA1And40BitRC2-CBC';
+ NID_pbe_WithSHA1And40BitRC2_CBC                        = 149;
+ LN_keyBag                                              = 'keyBag';
+ NID_keyBag                                             = 150;
+ LN_pkcs8ShroudedKeyBag                                 = 'pkcs8ShroudedKeyBag';
+ NID_pkcs8ShroudedKeyBag                                = 151;
+ LN_certBag                                             = 'certBag';
+ NID_certBag                                            = 152;
+ LN_crlBag                                              = 'crlBag';
+ NID_crlBag                                             = 153;
+ LN_secretBag                                           = 'secretBag';
+ NID_secretBag                                          = 154;
+ LN_safeContentsBag                                     = 'safeContentsBag';
+ NID_safeContentsBag                                    = 155;
+ LN_friendlyName                                        = 'friendlyName';
+ NID_friendlyName                                       = 156;
+ LN_localKeyID                                          = 'localKeyID';
+    NID_localKeyID                                      = 157;
+ LN_x509Certificate                                     = 'x509Certificate';
+    NID_x509Certificate                                 = 158;
+ LN_sdsiCertificate                                     = 'sdsiCertificate';
+    NID_sdsiCertificate                                 = 159;
+ LN_x509Crl                                             = 'x509Crl';
+    NID_x509Crl                                         = 160;
+ LN_pbes2                                               = 'PBES2';
+ NID_pbes2                                              = 161;
+ LN_pbmac1                                              = 'PBMAC1';
+ NID_pbmac1                                             = 162;
+  LN_hmacWithSHA1                                       = 'hmacWithSHA1';
+ NID_hmacWithSHA1                                       = 163;
+ LN_id_qt_cps                                           = 'Policy Qualifier CPS';
+ SN_id_qt_cps                                           = 'id-qt-cps';
+ NID_id_qt_cps                                          = 164;
+ LN_id_qt_unotice                                       = 'Policy Qualifier User Notice';
+ SN_id_qt_unotice                                       = 'id-qt-unotice';
+ NID_id_qt_unotice                                      = 165;
+ SN_rc2_64_cbc                                          = 'RC2-64-CBC';
+ LN_rc2_64_cbc                                          = 'rc2-64-cbc';
+ NID_rc2_64_cbc                                         = 166;
+ SN_SMIMECapabilities                                   = 'SMIME-CAPS';
+ LN_SMIMECapabilities                                   = 'S/MIME Capabilities';
+ NID_SMIMECapabilities                                  = 167;
+ SN_pbeWithMD2AndRC2_CBC                                = 'PBE-MD2-RC2-64';
+ LN_pbeWithMD2AndRC2_CBC                                = 'pbeWithMD2AndRC2-CBC';
+ NID_pbeWithMD2AndRC2_CBC                               = 168;
+ SN_pbeWithMD5AndRC2_CBC                                = 'PBE-MD5-RC2-64';
+ LN_pbeWithMD5AndRC2_CBC                                = 'pbeWithMD5AndRC2-CBC';
+ NID_pbeWithMD5AndRC2_CBC                               = 169;
+ SN_pbeWithSHA1AndDES_CBC                               = 'PBE-SHA1-DES';
+ LN_pbeWithSHA1AndDES_CBC                               = 'pbeWithSHA1AndDES-CBC';
+ NID_pbeWithSHA1AndDES_CBC                              = 170;
+ LN_ms_ext_req                                          = 'Microsoft Extension Request';
+ SN_ms_ext_req                                          = 'msExtReq';
+ NID_ms_ext_req                                         = 171;
+ LN_ext_req                                             = 'Extension Request';
+ SN_ext_req                                             = 'extReq';
+ NID_ext_req                                            = 172;
+ SN_name                                                = 'name';
+ LN_name                                                = 'name';
+ NID_name                                               = 173;
+ SN_dnQualifier                                         = 'dnQualifier';
+ LN_dnQualifier                                         = 'dnQualifier';
+ NID_dnQualifier                                        = 174;
+ SN_id_pe                                               = 'id-pe';
+ NID_id_pe                                              = 175;
+ SN_id_ad                                               = 'id-ad';
+ NID_id_ad                                              = 176;
+ SN_info_access                                         = 'authorityInfoAccess';
+ LN_info_access                                         = 'Authority Information Access';
+ NID_info_access                                        = 177;
+ SN_ad_OCSP                                             = 'OCSP';
+ LN_ad_OCSP                                             = 'OCSP';
+ NID_ad_OCSP                                            = 178;
+ SN_ad_ca_issuers                                       = 'caIssuers';
+ LN_ad_ca_issuers                                       = 'CA Issuers';
+ NID_ad_ca_issuers                                      = 179;
+ SN_OCSP_sign                                           = 'OCSPSigning';
+ LN_OCSP_sign                                           = 'OCSP Signing';
+ NID_OCSP_sign                                          = 180;
+ SN_itu_t                                               = 'ITU-T';
+ LN_itu_t                                               = 'itu-t';
+ NID_itu_t                                              = 645;
+ NID_ccitt                                              = 404;
+ SN_iso                                                 = 'ISO';
+ LN_iso                                                 = 'iso';
+ NID_iso                                                = 181;
+ SN_joint_iso_itu_t                                     = 'JOINT-ISO-ITU-T';
+ LN_joint_iso_itu_t                                     = 'joint-iso-itu-t';
+ NID_joint_iso_itu_t                                    = 646;
+ NID_joint_iso_ccitt                                    = 393;
+ SN_member_body                                         = 'member-body';
+ LN_member_body                                         = 'ISO Member Body';
+ NID_member_body                                        = 182;
+ SN_identified_organization                             = 'identified-organization';
+ NID_identified_organization                            = 676;
+ SN_hmac_md5                                            = 'HMAC-MD5';
+ LN_hmac_md5                                            = 'hmac-md5';
+ NID_hmac_md5                                           = 780;
+ SN_hmac_sha1                                           = 'HMAC-SHA1';
+ LN_hmac_sha1                                           = 'hmac-sha1';
+ NID_hmac_sha1                                          = 781;
+ SN_certicom_arc                                        = 'certicom-arc';
+ NID_certicom_arc                                       = 677;
+ SN_international_organizations                         = 'international-organizations';
+ LN_international_organizations                         = 'International Organizations';
+ NID_international_organizations                        = 647;
+ SN_wap                                                 = 'wap';
+ NID_wap                                                = 678;
+ SN_wap_wsg                                             = 'wap-wsg';
+ NID_wap_wsg                                            = 679;
+  SN_selected_attribute_types                           = 'selected-attribute-types';
+ LN_selected_attribute_types                            = 'Selected Attribute Types';
+ NID_selected_attribute_types                           = 394;
+ SN_clearance                                           = 'clearance';
+ NID_clearance                                          = 395;
+ SN_ISO_US                                              = 'ISO-US';
+ LN_ISO_US                                              = 'ISO US Member Body';
+ NID_ISO_US                                             = 183;
+ SN_X9_57                                               = 'X9-57';
+ LN_X9_57                                               = 'X9.57';
+ NID_X9_57                                              = 184;
+ SN_X9cm                                                = 'X9cm';
+ LN_X9cm                                                = 'X9.57 CM ?';
+ NID_X9cm                                               = 185;
+ SN_ansi_X9_62                                          = 'ansi-X9-62';
+ LN_ansi_X9_62                                          = 'ANSI X9.62';
+ NID_ansi_X9_62                                         = 405;
+ SN_X9_62_prime_field                                   = 'prime-field';
+ NID_X9_62_prime_field                                  = 406;
+ SN_X9_62_characteristic_two_field                      = 'characteristic-two-field';
+ NID_X9_62_characteristic_two_field                     = 407;
+ SN_X9_62_id_characteristic_two_basis                   = 'id-characteristic-two-basis';
+ NID_X9_62_id_characteristic_two_basis                  = 680;
+ SN_X9_62_onBasis                                       = 'onBasis';
+ NID_X9_62_onBasis                                      = 681;
+ SN_X9_62_tpBasis                                       = 'tpBasis';
+ NID_X9_62_tpBasis                                      = 682;
+ SN_X9_62_ppBasis                                       = 'ppBasis';
+ NID_X9_62_ppBasis                                      = 683;
+ SN_X9_62_id_ecPublicKey                                = 'id-ecPublicKey';
+ NID_X9_62_id_ecPublicKey                               = 408;
+ SN_X9_62_c2pnb163v1                                    = 'c2pnb163v1';
+ NID_X9_62_c2pnb163v1                                   = 684;
+ SN_X9_62_c2pnb163v2                                    = 'c2pnb163v2';
+ NID_X9_62_c2pnb163v2                                   = 685;
+ SN_X9_62_c2pnb163v3                                    = 'c2pnb163v3';
+ NID_X9_62_c2pnb163v3                                   = 686;
+ SN_X9_62_c2pnb176v1                                    = 'c2pnb176v1';
+ NID_X9_62_c2pnb176v1                                   = 687;
+ SN_X9_62_c2tnb191v1                                    = 'c2tnb191v1';
+ NID_X9_62_c2tnb191v1                                   = 688;
+ SN_X9_62_c2tnb191v2                                    = 'c2tnb191v2';
+ NID_X9_62_c2tnb191v2                                   = 689;
+ SN_X9_62_c2tnb191v3                                    = 'c2tnb191v3';
+ NID_X9_62_c2tnb191v3                                   = 690;
+ SN_X9_62_c2onb191v4                                    = 'c2onb191v4';
+ NID_X9_62_c2onb191v4                                   = 691;
+ SN_X9_62_c2onb191v5                                    = 'c2onb191v5';
+ NID_X9_62_c2onb191v5                                   = 692;
+ SN_X9_62_c2pnb208w1                                    = 'c2pnb208w1';
+ NID_X9_62_c2pnb208w1                                   = 693;
+ SN_X9_62_c2tnb239v1                                    = 'c2tnb239v1';
+ NID_X9_62_c2tnb239v1                                   = 694;
+ SN_X9_62_c2tnb239v2                                    = 'c2tnb239v2';
+ NID_X9_62_c2tnb239v2                                   = 695;
+ SN_X9_62_c2tnb239v3                                    = 'c2tnb239v3';
+ NID_X9_62_c2tnb239v3                                   = 696;
+ SN_X9_62_c2onb239v4                                    = 'c2onb239v4';
+ NID_X9_62_c2onb239v4                                   = 697;
+ SN_X9_62_c2onb239v5                                    = 'c2onb239v5';
+ NID_X9_62_c2onb239v5                                   = 698;
+ SN_X9_62_c2pnb272w1                                    = 'c2pnb272w1';
+ NID_X9_62_c2pnb272w1                                   = 699;
+ SN_X9_62_c2pnb304w1                                    = 'c2pnb304w1';
+ NID_X9_62_c2pnb304w1                                   = 700;
+ SN_X9_62_c2tnb359v1                                    = 'c2tnb359v1';
+ NID_X9_62_c2tnb359v1                                   = 701;
+ SN_X9_62_c2pnb368w1                                    = 'c2pnb368w1';
+ NID_X9_62_c2pnb368w1                                   = 702;
+ SN_X9_62_c2tnb431r1                                    = 'c2tnb431r1';
+ NID_X9_62_c2tnb431r1                                   = 703;
+ SN_X9_62_prime192v1                                    = 'prime192v1';
+ NID_X9_62_prime192v1                                   = 409;
+ SN_X9_62_prime192v2                                    = 'prime192v2';
+ NID_X9_62_prime192v2                                   = 410;
+ SN_X9_62_prime192v3                                    = 'prime192v3';
+ NID_X9_62_prime192v3                                   = 411;
+ SN_X9_62_prime239v1                                    = 'prime239v1';
+ NID_X9_62_prime239v1                                   = 412;
+ SN_X9_62_prime239v2                                    = 'prime239v2';
+ NID_X9_62_prime239v2                                   = 413;
+ SN_X9_62_prime239v3                                    = 'prime239v3';
+ NID_X9_62_prime239v3                                   = 414;
+ SN_X9_62_prime256v1                                    = 'prime256v1';
+ NID_X9_62_prime256v1                                   = 415;
+ SN_ecdsa_with_SHA1                                     = 'ecdsa-with-SHA1';
+ NID_ecdsa_with_SHA1                                    = 416;
+ SN_ecdsa_with_Recommended                              = 'ecdsa-with-Recommended';
+ NID_ecdsa_with_Recommended                             = 791;
+ SN_ecdsa_with_Specified                                = 'ecdsa-with-Specified';
+ NID_ecdsa_with_Specified                               = 792;
+ SN_ecdsa_with_SHA224                                   = 'ecdsa-with-SHA224';
+ NID_ecdsa_with_SHA224                                  = 793;
+ SN_ecdsa_with_SHA256                                   = 'ecdsa-with-SHA256';
+ NID_ecdsa_with_SHA256                                  = 794;
+ SN_ecdsa_with_SHA384                                   = 'ecdsa-with-SHA384';
+ NID_ecdsa_with_SHA384                                  = 795;
+ SN_ecdsa_with_SHA512                                   = 'ecdsa-with-SHA512';
+ NID_ecdsa_with_SHA512                                  = 796;
+ SN_secp112r1                                           = 'secp112r1';
+ NID_secp112r1                                          = 704;
+ SN_secp112r2                                           = 'secp112r2';
+ NID_secp112r2                                          = 705;
+ SN_secp128r1                                           = 'secp128r1';
+ NID_secp128r1                                          = 706;
+ SN_secp128r2                                           = 'secp128r2';
+ NID_secp128r2                                          = 707;
+ SN_secp160k1                                           = 'secp160k1';
+ NID_secp160k1                                          = 708;
+ SN_secp160r1                                           = 'secp160r1';
+ NID_secp160r1                                          = 709;
+ SN_secp160r2                                           = 'secp160r2';
+ NID_secp160r2                                          = 710;
+ SN_secp192k1                                           = 'secp192k1';
+ NID_secp192k1                                          = 711;
+ SN_secp224k1                                           = 'secp224k1';
+ NID_secp224k1                                          = 712;
+ SN_secp224r1                                           = 'secp224r1';
+ NID_secp224r1                                          = 713;
+ SN_secp256k1                                           = 'secp256k1';
+ NID_secp256k1                                          = 714;
+ SN_secp384r1                                           = 'secp384r1';
+ NID_secp384r1                                          = 715;
+ SN_secp521r1                                           = 'secp521r1';
+ NID_secp521r1                                          = 716;
+ SN_sect113r1                                           = 'sect113r1';
+ NID_sect113r1                                          = 717;
+ SN_sect113r2                                           = 'sect113r2';
+ NID_sect113r2                                          = 718;
+ SN_sect131r1                                           = 'sect131r1';
+ NID_sect131r1                                          = 719;
+ SN_sect131r2                                           = 'sect131r2';
+ NID_sect131r2                                          = 720;
+ SN_sect163k1                                           = 'sect163k1';
+ NID_sect163k1                                          = 721;
+ SN_sect163r1                                           = 'sect163r1';
+ NID_sect163r1                                          = 722;
+ SN_sect163r2                                           = 'sect163r2';
+ NID_sect163r2                                          = 723;
+ SN_sect193r1                                           = 'sect193r1';
+ NID_sect193r1                                          = 724;
+ SN_sect193r2                                           = 'sect193r2';
+ NID_sect193r2                                          = 725;
+ SN_sect233k1                                           = 'sect233k1';
+ NID_sect233k1                                          = 726;
+ SN_sect233r1                                           = 'sect233r1';
+ NID_sect233r1                                          = 727;
+ SN_sect239k1                                           = 'sect239k1';
+ NID_sect239k1                                          = 728;
+ SN_sect283k1                                           = 'sect283k1';
+ NID_sect283k1                                          = 729;
+ SN_sect283r1                                           = 'sect283r1';
+ NID_sect283r1                                          = 730;
+ SN_sect409k1                                           = 'sect409k1';
+ NID_sect409k1                                          = 731;
+ SN_sect409r1                                           = 'sect409r1';
+ NID_sect409r1                                          = 732;
+ SN_sect571k1                                           = 'sect571k1';
+ NID_sect571k1                                          = 733;
+ SN_sect571r1                                           = 'sect571r1';
+ NID_sect571r1                                          = 734;
+ SN_wap_wsg_idm_ecid_wtls1                              = 'wap-wsg-idm-ecid-wtls1';
+ NID_wap_wsg_idm_ecid_wtls1                             = 735;
+ SN_wap_wsg_idm_ecid_wtls3                              = 'wap-wsg-idm-ecid-wtls3';
+ NID_wap_wsg_idm_ecid_wtls3                             = 736;
+ SN_wap_wsg_idm_ecid_wtls4                              = 'wap-wsg-idm-ecid-wtls4';
+ NID_wap_wsg_idm_ecid_wtls4                             = 737;
+ SN_wap_wsg_idm_ecid_wtls5                              = 'wap-wsg-idm-ecid-wtls5';
+ NID_wap_wsg_idm_ecid_wtls5                             = 738;
+ SN_wap_wsg_idm_ecid_wtls6                              = 'wap-wsg-idm-ecid-wtls6';
+ NID_wap_wsg_idm_ecid_wtls6                             = 739;
+ SN_wap_wsg_idm_ecid_wtls7                              = 'wap-wsg-idm-ecid-wtls7';
+ NID_wap_wsg_idm_ecid_wtls7                             = 740;
+ SN_wap_wsg_idm_ecid_wtls8                              = 'wap-wsg-idm-ecid-wtls8';
+ NID_wap_wsg_idm_ecid_wtls8                             = 741;
+ SN_wap_wsg_idm_ecid_wtls9                              = 'wap-wsg-idm-ecid-wtls9';
+ NID_wap_wsg_idm_ecid_wtls9                             = 742;
+ SN_wap_wsg_idm_ecid_wtls10                             = 'wap-wsg-idm-ecid-wtls10';
+ NID_wap_wsg_idm_ecid_wtls10                            = 743;
+ SN_wap_wsg_idm_ecid_wtls11                             = 'wap-wsg-idm-ecid-wtls11';
+ NID_wap_wsg_idm_ecid_wtls11                            = 744;
+ SN_wap_wsg_idm_ecid_wtls12                             = 'wap-wsg-idm-ecid-wtls12';
+ NID_wap_wsg_idm_ecid_wtls12                            = 745;
+ SN_id_PasswordBasedMAC                                 = 'id-PasswordBasedMAC';
+ LN_id_PasswordBasedMAC                                 = 'password based MAC';
+ NID_id_PasswordBasedMAC                                = 782;
+ SN_id_DHBasedMac                                       = 'id-DHBasedMac';
+ LN_id_DHBasedMac                                       = 'Diffie-Hellman based MAC';
+ NID_id_DHBasedMac                                      = 783;
+ SN_rsadsi                                              = 'rsadsi';
+ SN_pkcs                                                = 'pkcs';
+ SN_pkcs1                                               = 'pkcs1';
+ NID_pkcs1                                              = 186;
+ SN_md4WithRSAEncryption                                = 'RSA-MD4';
+ LN_md4WithRSAEncryption                                = 'md4WithRSAEncryption';
+ NID_md4WithRSAEncryption                               = 396;
+ SN_rsaesOaep                                           = 'RSAES-OAEP';
+ LN_rsaesOaep                                           = 'rsaesOaep';
+ NID_rsaesOaep                                          = 919;
+ SN_mgf1                                                = 'MGF1';
+ LN_mgf1                                                = 'mgf1';
+ NID_mgf1                                               = 911;
+ SN_rsassaPss                                           = 'RSASSA-PSS';
+ LN_rsassaPss                                           = 'rsassaPss';
+ NID_rsassaPss                                          = 912;
+ SN_sha256WithRSAEncryption                             = 'RSA-SHA256';
+ LN_sha256WithRSAEncryption                             = 'sha256WithRSAEncryption';
+ NID_sha256WithRSAEncryption                            = 668;
+ SN_sha384WithRSAEncryption                             = 'RSA-SHA384';
+ LN_sha384WithRSAEncryption                             = 'sha384WithRSAEncryption';
+ NID_sha384WithRSAEncryption                            = 669;
+ SN_sha512WithRSAEncryption                             = 'RSA-SHA512';
+ LN_sha512WithRSAEncryption                             = 'sha512WithRSAEncryption';
+ NID_sha512WithRSAEncryption                            = 670;
+ SN_sha224WithRSAEncryption                             = 'RSA-SHA224';
+ LN_sha224WithRSAEncryption                             = 'sha224WithRSAEncryption';
+ NID_sha224WithRSAEncryption                            = 671;
+ SN_pkcs3                                               = 'pkcs3';
+ SN_pkcs5                                               = 'pkcs5';
+ NID_pkcs5                                              = 187;
+ SN_SMIME                                               = 'SMIME';
+ LN_SMIME                                               = 'S/MIME';
+ NID_SMIME                                              = 188;
+ SN_id_smime_mod                                        = 'id-smime-mod';
+ NID_id_smime_mod                                       = 189;
+ SN_id_smime_ct                                         = 'id-smime-ct';
+ NID_id_smime_ct                                        = 190;
+ SN_id_smime_aa                                         = 'id-smime-aa';
+ NID_id_smime_aa                                        = 191;
+ SN_id_smime_alg                                        = 'id-smime-alg';
+ NID_id_smime_alg                                       = 192;
+ SN_id_smime_cd                                         = 'id-smime-cd';
+ NID_id_smime_cd                                        = 193;
+ SN_id_smime_spq                                        = 'id-smime-spq';
+ NID_id_smime_spq                                       = 194;
+ SN_id_smime_cti                                        = 'id-smime-cti';
+ NID_id_smime_cti                                       = 195;
+ SN_id_smime_mod_cms                                    = 'id-smime-mod-cms';
+ NID_id_smime_mod_cms                                   = 196;
+ SN_id_smime_mod_ess                                    = 'id-smime-mod-ess';
+ NID_id_smime_mod_ess                                   = 197;
+ SN_id_smime_mod_oid                                    = 'id-smime-mod-oid';
+ NID_id_smime_mod_oid                                   = 198;
+ SN_id_smime_mod_msg_v3                                 = 'id-smime-mod-msg-v3';
+ NID_id_smime_mod_msg_v3                                = 199;
+ SN_id_smime_mod_ets_eSignature_88                      = 'id-smime-mod-ets-eSignature-88';
+ NID_id_smime_mod_ets_eSignature_88                     = 200;
+ SN_id_smime_mod_ets_eSignature_97                      = 'id-smime-mod-ets-eSignature-97';
+ NID_id_smime_mod_ets_eSignature_97                     = 201;
+ SN_id_smime_mod_ets_eSigPolicy_88                      = 'id-smime-mod-ets-eSigPolicy-88';
+ NID_id_smime_mod_ets_eSigPolicy_88                     = 202;
+ SN_id_smime_mod_ets_eSigPolicy_97                      = 'id-smime-mod-ets-eSigPolicy-97';
+ NID_id_smime_mod_ets_eSigPolicy_97                     = 203;
+ SN_id_smime_ct_receipt                                 = 'id-smime-ct-receipt';
+ NID_id_smime_ct_receipt                                = 204;
+ SN_id_smime_ct_authData                                = 'id-smime-ct-authData';
+ NID_id_smime_ct_authData                               = 205;
+ SN_id_smime_ct_publishCert                             = 'id-smime-ct-publishCert';
+ NID_id_smime_ct_publishCert                            = 206;
+ SN_id_smime_ct_TSTInfo                                 = 'id-smime-ct-TSTInfo';
+ NID_id_smime_ct_TSTInfo                                = 207;
+ SN_id_smime_ct_TDTInfo                                 = 'id-smime-ct-TDTInfo';
+ NID_id_smime_ct_TDTInfo                                = 208;
+ SN_id_smime_ct_contentInfo                             = 'id-smime-ct-contentInfo';
+ NID_id_smime_ct_contentInfo                            = 209;
+ SN_id_smime_ct_DVCSRequestData                         = 'id-smime-ct-DVCSRequestData';
+ NID_id_smime_ct_DVCSRequestData                        = 210;
+ SN_id_smime_ct_DVCSResponseData                        = 'id-smime-ct-DVCSResponseData';
+ NID_id_smime_ct_DVCSResponseData                       = 211;
+ SN_id_smime_ct_compressedData                          = 'id-smime-ct-compressedData';
+ NID_id_smime_ct_compressedData                         = 786;
+ SN_id_ct_asciiTextWithCRLF                             = 'id-ct-asciiTextWithCRLF';
+ NID_id_ct_asciiTextWithCRLF                            = 787;
+ SN_id_smime_aa_receiptRequest                          = 'id-smime-aa-receiptRequest';
+ NID_id_smime_aa_receiptRequest                         = 212;
+ SN_id_smime_aa_securityLabel                           = 'id-smime-aa-securityLabel';
+ NID_id_smime_aa_securityLabel                          = 213;
+ SN_id_smime_aa_mlExpandHistory                         = 'id-smime-aa-mlExpandHistory';
+ NID_id_smime_aa_mlExpandHistory                        = 214;
+ SN_id_smime_aa_contentHint                             = 'id-smime-aa-contentHint';
+ NID_id_smime_aa_contentHint                            = 215;
+ SN_id_smime_aa_msgSigDigest                            = 'id-smime-aa-msgSigDigest';
+ NID_id_smime_aa_msgSigDigest                           = 216;
+ SN_id_smime_aa_encapContentType                        = 'id-smime-aa-encapContentType';
+ NID_id_smime_aa_encapContentType                       = 217;
+ SN_id_smime_aa_contentIdentifier                       = 'id-smime-aa-contentIdentifier';
+ NID_id_smime_aa_contentIdentifier                      = 218;
+ SN_id_smime_aa_macValue                                = 'id-smime-aa-macValue';
+ NID_id_smime_aa_macValue                               = 219;
+ SN_id_smime_aa_equivalentLabels                        = 'id-smime-aa-equivalentLabels';
+ NID_id_smime_aa_equivalentLabels                       = 220;
+ SN_id_smime_aa_contentReference                        = 'id-smime-aa-contentReference';
+ NID_id_smime_aa_contentReference                       = 221;
+ SN_id_smime_aa_encrypKeyPref                           = 'id-smime-aa-encrypKeyPref';
+ NID_id_smime_aa_encrypKeyPref                          = 222;
+ SN_id_smime_aa_signingCertificate                      = 'id-smime-aa-signingCertificate';
+ NID_id_smime_aa_signingCertificate                     = 223;
+ SN_id_smime_aa_smimeEncryptCerts                       = 'id-smime-aa-smimeEncryptCerts';
+ NID_id_smime_aa_smimeEncryptCerts                      = 224;
+ SN_id_smime_aa_timeStampToken                          = 'id-smime-aa-timeStampToken';
+ NID_id_smime_aa_timeStampToken                         = 225;
+ SN_id_smime_aa_ets_sigPolicyId                         = 'id-smime-aa-ets-sigPolicyId';
+ NID_id_smime_aa_ets_sigPolicyId                        = 226;
+ SN_id_smime_aa_ets_commitmentType                      = 'id-smime-aa-ets-commitmentType';
+ NID_id_smime_aa_ets_commitmentType                     = 227;
+ SN_id_smime_aa_ets_signerLocation                      = 'id-smime-aa-ets-signerLocation';
+ NID_id_smime_aa_ets_signerLocation                     = 228;
+ SN_id_smime_aa_ets_signerAttr                          = 'id-smime-aa-ets-signerAttr';
+ NID_id_smime_aa_ets_signerAttr                         = 229;
+ SN_id_smime_aa_ets_otherSigCert                        = 'id-smime-aa-ets-otherSigCert';
+ NID_id_smime_aa_ets_otherSigCert                       = 230;
+ SN_id_smime_aa_ets_contentTimestamp                    = 'id-smime-aa-ets-contentTimestamp';
+ NID_id_smime_aa_ets_contentTimestamp                   = 231;
+ SN_id_smime_aa_ets_CertificateRefs                     = 'id-smime-aa-ets-CertificateRefs';
+ NID_id_smime_aa_ets_CertificateRefs                    = 232;
+ SN_id_smime_aa_ets_RevocationRefs                      = 'id-smime-aa-ets-RevocationRefs';
+ NID_id_smime_aa_ets_RevocationRefs                     = 233;
+ SN_id_smime_aa_ets_certValues                          = 'id-smime-aa-ets-certValues';
+ NID_id_smime_aa_ets_certValues                         = 234;
+ SN_id_smime_aa_ets_revocationValues                    = 'id-smime-aa-ets-revocationValues';
+ NID_id_smime_aa_ets_revocationValues                   = 235;
+ SN_id_smime_aa_ets_escTimeStamp                        = 'id-smime-aa-ets-escTimeStamp';
+ NID_id_smime_aa_ets_escTimeStamp                       = 236;
+ SN_id_smime_aa_ets_certCRLTimestamp                    = 'id-smime-aa-ets-certCRLTimestamp';
+ NID_id_smime_aa_ets_certCRLTimestamp                   = 237;
+ SN_id_smime_aa_ets_archiveTimeStamp                    = 'id-smime-aa-ets-archiveTimeStamp';
+ NID_id_smime_aa_ets_archiveTimeStamp                   = 238;
+ SN_id_smime_aa_signatureType                           = 'id-smime-aa-signatureType';
+ NID_id_smime_aa_signatureType                          = 239;
+ SN_id_smime_aa_dvcs_dvc                                = 'id-smime-aa-dvcs-dvc';
+ NID_id_smime_aa_dvcs_dvc                               = 240;
+ SN_id_smime_alg_ESDHwith3DES                           = 'id-smime-alg-ESDHwith3DES';
+ NID_id_smime_alg_ESDHwith3DES                          = 241;
+ SN_id_smime_alg_ESDHwithRC2                            = 'id-smime-alg-ESDHwithRC2';
+ NID_id_smime_alg_ESDHwithRC2                           = 242;
+ SN_id_smime_alg_3DESwrap                               = 'id-smime-alg-3DESwrap';
+ NID_id_smime_alg_3DESwrap                              = 243;
+ SN_id_smime_alg_RC2wrap                                = 'id-smime-alg-RC2wrap';
+ NID_id_smime_alg_RC2wrap                               = 244;
+ SN_id_smime_alg_ESDH                                   = 'id-smime-alg-ESDH';
+ NID_id_smime_alg_ESDH                                  = 245;
+ SN_id_smime_alg_CMS3DESwrap                            = 'id-smime-alg-CMS3DESwrap';
+ NID_id_smime_alg_CMS3DESwrap                           = 246;
+ SN_id_smime_alg_CMSRC2wrap                             = 'id-smime-alg-CMSRC2wrap';
+ NID_id_smime_alg_CMSRC2wrap                            = 247;
+ SN_id_alg_PWRI_KEK                                     = 'id-alg-PWRI-KEK';
+ NID_id_alg_PWRI_KEK                                    = 893;
+ SN_id_smime_cd_ldap                                    = 'id-smime-cd-ldap';
+ NID_id_smime_cd_ldap                                   = 248;
+ SN_id_smime_spq_ets_sqt_uri                            = 'id-smime-spq-ets-sqt-uri';
+ NID_id_smime_spq_ets_sqt_uri                           = 249;
+ SN_id_smime_spq_ets_sqt_unotice                        = 'id-smime-spq-ets-sqt-unotice';
+ NID_id_smime_spq_ets_sqt_unotice                       = 250;
+ SN_id_smime_cti_ets_proofOfOrigin                      = 'id-smime-cti-ets-proofOfOrigin';
+ NID_id_smime_cti_ets_proofOfOrigin                     = 251;
+ SN_id_smime_cti_ets_proofOfReceipt                     = 'id-smime-cti-ets-proofOfReceipt';
+ NID_id_smime_cti_ets_proofOfReceipt                    = 252;
+ SN_id_smime_cti_ets_proofOfDelivery                    = 'id-smime-cti-ets-proofOfDelivery';
+ NID_id_smime_cti_ets_proofOfDelivery                   = 253;
+ SN_id_smime_cti_ets_proofOfSender                      = 'id-smime-cti-ets-proofOfSender';
+ NID_id_smime_cti_ets_proofOfSender                     = 254;
+ SN_id_smime_cti_ets_proofOfApproval                    = 'id-smime-cti-ets-proofOfApproval';
+ NID_id_smime_cti_ets_proofOfApproval                   = 255;
+ SN_id_smime_cti_ets_proofOfCreation                    = 'id-smime-cti-ets-proofOfCreation';
+ NID_id_smime_cti_ets_proofOfCreation                   = 256;
+ SN_ms_csp_name                                         = 'CSPName';
+ LN_ms_csp_name                                         = 'Microsoft CSP Name';
+ NID_ms_csp_name                                        = 417;
+ SN_LocalKeySet                                         = 'LocalKeySet';
+ LN_LocalKeySet                                         = 'Microsoft Local Key set';
+ NID_LocalKeySet                                        = 856;
+ SN_md4                                                 = 'MD4';
+ LN_md4                                                 = 'md4';
+ NID_md4                                                = 257;
+ LN_hmacWithMD5                                         = 'hmacWithMD5';
+ NID_hmacWithMD5                                        = 797;
+ LN_hmacWithSHA224                                      = 'hmacWithSHA224';
+ NID_hmacWithSHA224                                     = 798;
+ LN_hmacWithSHA256                                      = 'hmacWithSHA256';
+ NID_hmacWithSHA256                                     = 799;
+ LN_hmacWithSHA384                                      = 'hmacWithSHA384';
+ NID_hmacWithSHA384                                     = 800;
+ LN_hmacWithSHA512                                      = 'hmacWithSHA512';
+ NID_hmacWithSHA512                                     = 801;
+ SN_ms_smartcard_login                                  = 'msSmartcardLogin';
+ LN_ms_smartcard_login                                  = 'Microsoft Smartcardlogin';
+ NID_ms_smartcard_login                                 = 648;
+ SN_ms_upn                                              = 'msUPN';
+ LN_ms_upn                                              = 'Microsoft Universal Principal Name';
+ NID_ms_upn                                             = 649;
+ SN_id_pkix_mod                                         = 'id-pkix-mod';
+ NID_id_pkix_mod                                        = 258;
+ SN_id_qt                                               = 'id-qt';
+ NID_id_qt                                              = 259;
+ SN_id_it                                               = 'id-it';
+ NID_id_it                                              = 260;
+ SN_id_pkip                                             = 'id-pkip';
+ NID_id_pkip                                            = 261;
+ SN_id_alg                                              = 'id-alg';
+ NID_id_alg                                             = 262;
+ SN_id_cmc                                              = 'id-cmc';
+ NID_id_cmc                                             = 263;
+ SN_id_on                                               = 'id-on';
+ NID_id_on                                              = 264;
+ SN_id_pda                                              = 'id-pda';
+ NID_id_pda                                             = 265;
+ SN_id_aca                                              = 'id-aca';
+ NID_id_aca                                             = 266;
+ SN_id_qcs                                              = 'id-qcs';
+ NID_id_qcs                                             = 267;
+ SN_id_cct                                              = 'id-cct';
+ NID_id_cct                                             = 268;
+ SN_id_ppl                                              = 'id-ppl';
+ NID_id_ppl                                             = 662;
+ SN_id_pkix1_explicit_88                                = 'id-pkix1-explicit-88';
+ NID_id_pkix1_explicit_88                               = 269;
+ SN_id_pkix1_implicit_88                                = 'id-pkix1-implicit-88';
+ NID_id_pkix1_implicit_88                               = 270;
+ SN_id_pkix1_explicit_93                                = 'id-pkix1-explicit-93';
+ NID_id_pkix1_explicit_93                               = 271;
+ SN_id_pkix1_implicit_93                                = 'id-pkix1-implicit-93';
+ NID_id_pkix1_implicit_93                               = 272;
+ SN_id_mod_crmf                                         = 'id-mod-crmf';
+ NID_id_mod_crmf                                        = 273;
+ SN_id_mod_cmc                                          = 'id-mod-cmc';
+ NID_id_mod_cmc                                         = 274;
+ SN_id_mod_kea_profile_88                               = 'id-mod-kea-profile-88';
+ NID_id_mod_kea_profile_88                              = 275;
+ SN_id_mod_kea_profile_93                               = 'id-mod-kea-profile-93';
+ NID_id_mod_kea_profile_93                              = 276;
+ SN_id_mod_cmp                                          = 'id-mod-cmp';
+ NID_id_mod_cmp                                         = 277;
+ SN_id_mod_qualified_cert_88                            = 'id-mod-qualified-cert-88';
+ NID_id_mod_qualified_cert_88                           = 278;
+ SN_id_mod_qualified_cert_93                            = 'id-mod-qualified-cert-93';
+ NID_id_mod_qualified_cert_93                           = 279;
+ SN_id_mod_attribute_cert                               = 'id-mod-attribute-cert';
+ NID_id_mod_attribute_cert                              = 280;
+ SN_id_mod_timestamp_protocol                           = 'id-mod-timestamp-protocol';
+ NID_id_mod_timestamp_protocol                          = 281;
+ SN_id_mod_ocsp                                         = 'id-mod-ocsp';
+ NID_id_mod_ocsp                                        = 282;
+ SN_id_mod_dvcs                                         = 'id-mod-dvcs';
+ NID_id_mod_dvcs                                        = 283;
+ SN_id_mod_cmp2000                                      = 'id-mod-cmp2000';
+ NID_id_mod_cmp2000                                     = 284;
+ SN_biometricInfo                                       = 'biometricInfo';
+ LN_biometricInfo                                       = 'Biometric Info';
+ NID_biometricInfo                                      = 285;
+ SN_qcStatements                                        = 'qcStatements';
+ NID_qcStatements                                       = 286;
+ SN_ac_auditEntity                                      = 'ac-auditEntity';
+ NID_ac_auditEntity                                     = 287;
+ SN_ac_targeting                                        = 'ac-targeting';
+ NID_ac_targeting                                       = 288;
+ SN_aaControls                                          = 'aaControls';
+ NID_aaControls                                         = 289;
+ SN_sbgp_ipAddrBlock                                    = 'sbgp-ipAddrBlock';
+ NID_sbgp_ipAddrBlock                                   = 290;
+ SN_sbgp_autonomousSysNum                               = 'sbgp-autonomousSysNum';
+ NID_sbgp_autonomousSysNum                              = 291;
+ SN_sbgp_routerIdentifier                               = 'sbgp-routerIdentifier';
+ NID_sbgp_routerIdentifier                              = 292;
+ SN_ac_proxying                                         = 'ac-proxying';
+ NID_ac_proxying                                        = 397;
+ SN_sinfo_access                                        = 'subjectInfoAccess';
+ LN_sinfo_access                                        = 'Subject Information Access';
+ NID_sinfo_access                                       = 398;
+ SN_proxyCertInfo                                       = 'proxyCertInfo';
+ LN_proxyCertInfo                                       = 'Proxy Certificate Information';
+ NID_proxyCertInfo                                      = 663;
+ SN_textNotice                                          = 'textNotice';
+ NID_textNotice                                         = 293;
+ SN_ipsecEndSystem                                      = 'ipsecEndSystem';
+ LN_ipsecEndSystem                                      = 'IPSec End System';
+ NID_ipsecEndSystem                                     = 294;
+ SN_ipsecTunnel                                         = 'ipsecTunnel';
+ LN_ipsecTunnel                                         = 'IPSec Tunnel';
+ NID_ipsecTunnel                                        = 295;
+ SN_ipsecUser                                           = 'ipsecUser';
+ LN_ipsecUser                                           = 'IPSec User';
+ NID_ipsecUser                                          = 296;
+ SN_dvcs                                                = 'DVCS';
+ LN_dvcs                                                = 'dvcs';
+ NID_dvcs                                               = 297;
+ SN_id_it_caProtEncCert                                 = 'id-it-caProtEncCert';
+ NID_id_it_caProtEncCert                                = 298;
+ SN_id_it_signKeyPairTypes                              = 'id-it-signKeyPairTypes';
+ NID_id_it_signKeyPairTypes                             = 299;
+ SN_id_it_encKeyPairTypes                               = 'id-it-encKeyPairTypes';
+ NID_id_it_encKeyPairTypes                              = 300;
+ SN_id_it_preferredSymmAlg                              = 'id-it-preferredSymmAlg';
+ NID_id_it_preferredSymmAlg                             = 301;
+ SN_id_it_caKeyUpdateInfo                               = 'id-it-caKeyUpdateInfo';
+ NID_id_it_caKeyUpdateInfo                              = 302;
+ SN_id_it_currentCRL                                    = 'id-it-currentCRL';
+ NID_id_it_currentCRL                                   = 303;
+ SN_id_it_unsupportedOIDs                               = 'id-it-unsupportedOIDs';
+ NID_id_it_unsupportedOIDs                              = 304;
+ SN_id_it_subscriptionRequest                           = 'id-it-subscriptionRequest';
+ NID_id_it_subscriptionRequest                          = 305;
+ SN_id_it_subscriptionResponse                          = 'id-it-subscriptionResponse';
+ NID_id_it_subscriptionResponse                         = 306;
+ SN_id_it_keyPairParamReq                               = 'id-it-keyPairParamReq';
+ NID_id_it_keyPairParamReq                              = 307;
+ SN_id_it_keyPairParamRep                               = 'id-it-keyPairParamRep';
+ NID_id_it_keyPairParamRep                              = 308;
+ SN_id_it_revPassphrase                                 = 'id-it-revPassphrase';
+ NID_id_it_revPassphrase                                = 309;
+ SN_id_it_implicitConfirm                               = 'id-it-implicitConfirm';
+ NID_id_it_implicitConfirm                              = 310;
+ SN_id_it_confirmWaitTime                               = 'id-it-confirmWaitTime';
+ NID_id_it_confirmWaitTime                              = 311;
+ SN_id_it_origPKIMessage                                = 'id-it-origPKIMessage';
+ NID_id_it_origPKIMessage                               = 312;
+ SN_id_it_suppLangTags                                  = 'id-it-suppLangTags';
+ NID_id_it_suppLangTags                                 = 784;
+ SN_id_regCtrl                                          = 'id-regCtrl';
+ NID_id_regCtrl                                         = 313;
+ SN_id_regInfo                                          = 'id-regInfo';
+ NID_id_regInfo                                         = 314;
+ SN_id_regCtrl_regToken                                 = 'id-regCtrl-regToken';
+ NID_id_regCtrl_regToken                                = 315;
+ SN_id_regCtrl_authenticator                            = 'id-regCtrl-authenticator';
+ NID_id_regCtrl_authenticator                           = 316;
+ SN_id_regCtrl_pkiPublicationInfo                       = 'id-regCtrl-pkiPublicationInfo';
+ NID_id_regCtrl_pkiPublicationInfo                      = 317;
+ SN_id_regCtrl_pkiArchiveOptions                        = 'id-regCtrl-pkiArchiveOptions';
+ NID_id_regCtrl_pkiArchiveOptions                       = 318;
+ SN_id_regCtrl_oldCertID                                = 'id-regCtrl-oldCertID';
+ NID_id_regCtrl_oldCertID                               = 319;
+ SN_id_regCtrl_protocolEncrKey                          = 'id-regCtrl-protocolEncrKey';
+ NID_id_regCtrl_protocolEncrKey                         = 320;
+ SN_id_regInfo_utf8Pairs                                = 'id-regInfo-utf8Pairs';
+ NID_id_regInfo_utf8Pairs                               = 321;
+ SN_id_regInfo_certReq                                  = 'id-regInfo-certReq';
+ NID_id_regInfo_certReq                                 = 322;
+ SN_id_alg_des40                                        = 'id-alg-des40';
+ NID_id_alg_des40                                       = 323;
+ SN_id_alg_noSignature                                  = 'id-alg-noSignature';
+ NID_id_alg_noSignature                                 = 324;
+ SN_id_alg_dh_sig_hmac_sha1                             = 'id-alg-dh-sig-hmac-sha1';
+ NID_id_alg_dh_sig_hmac_sha1                            = 325;
+ SN_id_alg_dh_pop                                       = 'id-alg-dh-pop';
+ NID_id_alg_dh_pop                                      = 326;
+ SN_id_cmc_statusInfo                                   = 'id-cmc-statusInfo';
+ NID_id_cmc_statusInfo                                  = 327;
+ SN_id_cmc_identification                               = 'id-cmc-identification';
+ NID_id_cmc_identification                              = 328;
+ SN_id_cmc_identityProof                                = 'id-cmc-identityProof';
+ NID_id_cmc_identityProof                               = 329;
+ SN_id_cmc_dataReturn                                   = 'id-cmc-dataReturn';
+ NID_id_cmc_dataReturn                                  = 330;
+ SN_id_cmc_transactionId                                = 'id-cmc-transactionId';
+ NID_id_cmc_transactionId                               = 331;
+ SN_id_cmc_senderNonce                                  = 'id-cmc-senderNonce';
+ NID_id_cmc_senderNonce                                 = 332;
+ SN_id_cmc_recipientNonce                               = 'id-cmc-recipientNonce';
+ NID_id_cmc_recipientNonce                              = 333;
+ SN_id_cmc_addExtensions                                = 'id-cmc-addExtensions';
+ NID_id_cmc_addExtensions                               = 334;
+ SN_id_cmc_encryptedPOP                                 = 'id-cmc-encryptedPOP';
+ NID_id_cmc_encryptedPOP                                = 335;
+ SN_id_cmc_decryptedPOP                                 = 'id-cmc-decryptedPOP';
+ NID_id_cmc_decryptedPOP                                = 336;
+ SN_id_cmc_lraPOPWitness                                = 'id-cmc-lraPOPWitness';
+ NID_id_cmc_lraPOPWitness                               = 337;
+ SN_id_cmc_getCert                                      = 'id-cmc-getCert';
+ NID_id_cmc_getCert                                     = 338;
+ SN_id_cmc_getCRL                                       = 'id-cmc-getCRL';
+ NID_id_cmc_getCRL                                      = 339;
+ SN_id_cmc_revokeRequest                                = 'id-cmc-revokeRequest';
+ NID_id_cmc_revokeRequest                               = 340;
+ SN_id_cmc_regInfo                                      = 'id-cmc-regInfo';
+ NID_id_cmc_regInfo                                     = 341;
+ SN_id_cmc_responseInfo                                 = 'id-cmc-responseInfo';
+ NID_id_cmc_responseInfo                                = 342;
+ SN_id_cmc_queryPending                                 = 'id-cmc-queryPending';
+ NID_id_cmc_queryPending                                = 343;
+ SN_id_cmc_popLinkRandom                                = 'id-cmc-popLinkRandom';
+ NID_id_cmc_popLinkRandom                               = 344;
+ SN_id_cmc_popLinkWitness                               = 'id-cmc-popLinkWitness';
+ NID_id_cmc_popLinkWitness                              = 345;
+ SN_id_cmc_confirmCertAcceptance                        = 'id-cmc-confirmCertAcceptance';
+ NID_id_cmc_confirmCertAcceptance                       = 346;
+ SN_id_on_personalData                                  = 'id-on-personalData';
+ NID_id_on_personalData                                 = 347;
+ SN_id_on_permanentIdentifier                           = 'id-on-permanentIdentifier';
+ LN_id_on_permanentIdentifier                           = 'Permanent Identifier';
+ NID_id_on_permanentIdentifier                          = 858;
+ SN_id_pda_dateOfBirth                                  = 'id-pda-dateOfBirth';
+ NID_id_pda_dateOfBirth                                 = 348;
+ SN_id_pda_placeOfBirth                                 = 'id-pda-placeOfBirth';
+ NID_id_pda_placeOfBirth                                = 349;
+ SN_id_pda_gender                                       = 'id-pda-gender';
+ NID_id_pda_gender                                      = 351;
+ SN_id_pda_countryOfCitizenship                         = 'id-pda-countryOfCitizenship';
+ NID_id_pda_countryOfCitizenship                        = 352;
+ SN_id_pda_countryOfResidence                           = 'id-pda-countryOfResidence';
+ NID_id_pda_countryOfResidence                          = 353;
+ SN_id_aca_authenticationInfo                           = 'id-aca-authenticationInfo';
+ NID_id_aca_authenticationInfo                          = 354;
+ SN_id_aca_accessIdentity                               = 'id-aca-accessIdentity';
+ NID_id_aca_accessIdentity                              = 355;
+ SN_id_aca_chargingIdentity                             = 'id-aca-chargingIdentity';
+ NID_id_aca_chargingIdentity                            = 356;
+ SN_id_aca_group                                        = 'id-aca-group';
+ NID_id_aca_group                                       = 357;
+ SN_id_aca_role                                         = 'id-aca-role';
+ NID_id_aca_role                                        = 358;
+ SN_id_aca_encAttrs                                     = 'id-aca-encAttrs';
+ NID_id_aca_encAttrs                                    = 399;
+ SN_id_qcs_pkixQCSyntax_v1                              = 'id-qcs-pkixQCSyntax-v1';
+ NID_id_qcs_pkixQCSyntax_v1                             = 359;
+ SN_id_cct_crs                                          = 'id-cct-crs';
+ NID_id_cct_crs                                         = 360;
+ SN_id_cct_PKIData                                      = 'id-cct-PKIData';
+ NID_id_cct_PKIData                                     = 361;
+ SN_id_cct_PKIResponse                                  = 'id-cct-PKIResponse';
+ NID_id_cct_PKIResponse                                 = 362;
+ SN_id_ppl_anyLanguage                                  = 'id-ppl-anyLanguage';
+ LN_id_ppl_anyLanguage                                  = 'Any language';
+ NID_id_ppl_anyLanguage                                 = 664;
+ SN_id_ppl_inheritAll                                   = 'id-ppl-inheritAll';
+ LN_id_ppl_inheritAll                                   = 'Inherit all';
+ NID_id_ppl_inheritAll                                  = 665;
+ SN_Independent                                         = 'id-ppl-independent';
+ LN_Independent                                         = 'Independent';
+ NID_Independent                                        = 667;
+ SN_ad_timeStamping                                     = 'ad_timestamping';
+ LN_ad_timeStamping                                     = 'AD Time Stamping';
+ NID_ad_timeStamping                                    = 363;
+ SN_ad_dvcs                                             = 'AD_DVCS';
+ LN_ad_dvcs                                             = 'ad dvcs';
+ NID_ad_dvcs                                            = 364;
+ SN_caRepository                                        = 'caRepository';
+ LN_caRepository                                        = 'CA Repository';
+ NID_caRepository                                       = 785;
+ SN_id_pkix_OCSP_basic                                  = 'basicOCSPResponse';
+ LN_id_pkix_OCSP_basic                                  = 'Basic OCSP Response';
+ NID_id_pkix_OCSP_basic                                 = 365;
+ SN_id_pkix_OCSP_Nonce                                  = 'Nonce';
+ LN_id_pkix_OCSP_Nonce                                  = 'OCSP Nonce';
+ NID_id_pkix_OCSP_Nonce                                 = 366;
+ SN_id_pkix_OCSP_CrlID                                  = 'CrlID';
+ LN_id_pkix_OCSP_CrlID                                  = 'OCSP CRL ID';
+ NID_id_pkix_OCSP_CrlID                                 = 367;
+ SN_id_pkix_OCSP_acceptableResponses                    = 'acceptableResponses';
+ LN_id_pkix_OCSP_acceptableResponses                    = 'Acceptable OCSP Responses';
+ NID_id_pkix_OCSP_acceptableResponses                   = 368;
+ SN_id_pkix_OCSP_noCheck                                = 'noCheck';
+ LN_id_pkix_OCSP_noCheck                                = 'OCSP No Check';
+ NID_id_pkix_OCSP_noCheck                               = 369;
+ SN_id_pkix_OCSP_archiveCutoff                          = 'archiveCutoff';
+ LN_id_pkix_OCSP_archiveCutoff                          = 'OCSP Archive Cutoff';
+ NID_id_pkix_OCSP_archiveCutoff                         = 370;
+ SN_id_pkix_OCSP_serviceLocator                         = 'serviceLocator';
+ LN_id_pkix_OCSP_serviceLocator                         = 'OCSP Service Locator';
+ NID_id_pkix_OCSP_serviceLocator                        = 371;
+ SN_id_pkix_OCSP_extendedStatus                         = 'extendedStatus';
+ LN_id_pkix_OCSP_extendedStatus                         = 'Extended OCSP Status';
+ NID_id_pkix_OCSP_extendedStatus                        = 372;
+ SN_id_pkix_OCSP_valid                                  = 'valid';
+ NID_id_pkix_OCSP_valid                                 = 373;
+ SN_id_pkix_OCSP_path                                   = 'path';
+ NID_id_pkix_OCSP_path                                  = 374;
+ SN_id_pkix_OCSP_trustRoot                              = 'trustRoot';
+ LN_id_pkix_OCSP_trustRoot                              = 'Trust Root';
+ NID_id_pkix_OCSP_trustRoot                             = 375;
+ SN_rsaSignature                                        = 'rsaSignature';
+ NID_rsaSignature                                       = 377;
+ SN_des_ede_ecb                                         = 'DES-EDE';
+ LN_des_ede_ecb                                         = 'des-ede';
+ NID_des_ede_ecb                                        = 32;
+ SN_des_ede3_ecb                                        = 'DES-EDE3';
+ LN_des_ede3_ecb                                        = 'des-ede3';
+ NID_des_ede3_ecb                                       = 33;
+ SN_streetAddress                                       = 'street';
+ LN_streetAddress                                       = 'streetAddress';
+ NID_streetAddress                                      = 660;
+ LN_searchGuide                                         = 'searchGuide';
+ NID_searchGuide                                        = 859;
+ LN_businessCategory                                    = 'businessCategory';
+ NID_businessCategory                                   = 860;
+ LN_postalAddress                                       = 'postalAddress';
+ NID_postalAddress                                      = 861;
+ LN_postalCode                                          = 'postalCode';
+ NID_postalCode                                         = 661;
+ LN_postOfficeBox                                       = 'postOfficeBox';
+ NID_postOfficeBox                                      = 862;
+ LN_physicalDeliveryOfficeName                          = 'physicalDeliveryOfficeName';
+ NID_physicalDeliveryOfficeName                         = 863;
+ LN_telephoneNumber                                     = 'telephoneNumber';
+ NID_telephoneNumber                                    = 864;
+ LN_telexNumber                                         = 'telexNumber';
+ NID_telexNumber                                        = 865;
+ LN_teletexTerminalIdentifier                           = 'teletexTerminalIdentifier';
+ NID_teletexTerminalIdentifier                          = 866;
+ LN_facsimileTelephoneNumber                            = 'facsimileTelephoneNumber';
+ NID_facsimileTelephoneNumber                           = 867;
+ LN_x121Address                                         = 'x121Address';
+ NID_x121Address                                        = 868;
+ LN_internationaliSDNNumber                             = 'internationaliSDNNumber';
+ NID_internationaliSDNNumber                            = 869;
+ LN_registeredAddress                                   = 'registeredAddress';
+ NID_registeredAddress                                  = 870;
+ LN_destinationIndicator                                = 'destinationIndicator';
+ NID_destinationIndicator                               = 871;
+ LN_preferredDeliveryMethod                             = 'preferredDeliveryMethod';
+ NID_preferredDeliveryMethod                            = 872;
+ LN_presentationAddress                                 = 'presentationAddress';
+ NID_presentationAddress                                = 873;
+ LN_supportedApplicationContext                         = 'supportedApplicationContext';
+ NID_supportedApplicationContext                        = 874;
+ SN_member                                              = 'member';
+ NID_member                                             = 875;
+ SN_owner                                               = 'owner';
+ NID_owner                                              = 876;
+ LN_roleOccupant                                        = 'roleOccupant';
+ NID_roleOccupant                                       = 877;
+ SN_seeAlso                                             = 'seeAlso';
+ NID_seeAlso                                            = 878;
+ LN_userPassword                                        = 'userPassword';
+ NID_userPassword                                       = 879;
+ LN_userCertificate                                     = 'userCertificate';
+ NID_userCertificate                                    = 880;
+ LN_cACertificate                                       = 'cACertificate';
+ NID_cACertificate                                      = 881;
+ LN_authorityRevocationList                             = 'authorityRevocationList';
+ NID_authorityRevocationList                            = 882;
+ LN_certificateRevocationList                           = 'certificateRevocationList';
+ NID_certificateRevocationList                          = 883;
+ LN_crossCertificatePair                                = 'crossCertificatePair';
+ NID_crossCertificatePair                               = 884;
+ LN_generationQualifier                                 = 'generationQualifier';
+ NID_generationQualifier                                = 509;
+ LN_x500UniqueIdentifier                                = 'x500UniqueIdentifier';
+ NID_x500UniqueIdentifier                               = 503;
+ LN_enhancedSearchGuide                                 = 'enhancedSearchGuide';
+ NID_enhancedSearchGuide                                = 885;
+ LN_protocolInformation                                 = 'protocolInformation';
+ NID_protocolInformation                                = 886;
+ LN_distinguishedName                                   = 'distinguishedName';
+ NID_distinguishedName                                  = 887;
+ LN_uniqueMember                                        = 'uniqueMember';
+ NID_uniqueMember                                       = 888;
+ LN_houseIdentifier                                     = 'houseIdentifier';
+ NID_houseIdentifier                                    = 889;
+ LN_supportedAlgorithms                                 = 'supportedAlgorithms';
+ NID_supportedAlgorithms                                = 890;
+ LN_deltaRevocationList                                 = 'deltaRevocationList';
+ NID_deltaRevocationList                                = 891;
+ SN_dmdName                                             = 'dmdName';
+ NID_dmdName                                            = 892;
+ LN_pseudonym                                           = 'pseudonym';
+ NID_pseudonym                                          = 510;
+ SN_role                                                = 'role';
+ LN_role                                                = 'role';
+ NID_role                                               = 400;
+ SN_X500algorithms                                      = 'X500algorithms';
+ LN_X500algorithms                                      = 'directory services - algorithms';
+ NID_X500algorithms                                     = 378;
+ SN_subject_directory_attributes                        = 'subjectDirectoryAttributes';
+ LN_subject_directory_attributes                        = 'X509v3 Subject Directory Attributes';
+ NID_subject_directory_attributes                       = 769;
+ SN_issuing_distribution_point                          = 'issuingDistributionPoint';
+ LN_issuing_distribution_point                          = 'X509v3 Issuing Distrubution Point';
+ NID_issuing_distribution_point                         = 770;
+ SN_certificate_issuer                                  = 'certificateIssuer';
+ LN_certificate_issuer                                  = 'X509v3 Certificate Issuer';
+ NID_certificate_issuer                                 = 771;
+ SN_name_constraints                                    = 'nameConstraints';
+ LN_name_constraints                                    = 'X509v3 Name Constraints';
+ NID_name_constraints                                   = 666;
+ SN_any_policy                                          = 'anyPolicy';
+ LN_any_policy                                          = 'X509v3 Any Policy';
+ NID_any_policy                                         = 746;
+ SN_policy_mappings                                     = 'policyMappings';
+ LN_policy_mappings                                     = 'X509v3 Policy Mappings';
+ NID_policy_mappings                                    = 747;
+ SN_policy_constraints                                  = 'policyConstraints';
+ LN_policy_constraints                                  = 'X509v3 Policy Constraints';
+ NID_policy_constraints                                 = 401;
+ SN_freshest_crl                                        = 'freshestCRL';
+ LN_freshest_crl                                        = 'X509v3 Freshest CRL';
+ NID_freshest_crl                                       = 857;
+ SN_inhibit_any_policy                                  = 'inhibitAnyPolicy';
+ LN_inhibit_any_policy                                  = 'X509v3 Inhibit Any Policy';
+ NID_inhibit_any_policy                                 = 748;
+ SN_target_information                                  = 'targetInformation';
+ LN_target_information                                  = 'X509v3 AC Targeting';
+ NID_target_information                                 = 402;
+ SN_no_rev_avail                                        = 'noRevAvail';
+ LN_no_rev_avail                                        = 'X509v3 No Revocation Available';
+ NID_no_rev_avail                                       = 403;
+ SN_anyExtendedKeyUsage                                 = 'anyExtendedKeyUsage';
+ LN_anyExtendedKeyUsage                                 = 'Any Extended Key Usage';
+ NID_anyExtendedKeyUsage                                = 910;
+ SN_org                                                 = 'ORG';
+ LN_org                                                 = 'org';
+ NID_org                                                = 379;
+ SN_dod                                                 = 'DOD';
+ LN_dod                                                 = 'dod';
+ NID_dod                                                = 380;
+ SN_iana                                                = 'IANA';
+ LN_iana                                                = 'iana';
+ NID_iana                                               = 381;
+ SN_Directory                                           = 'directory';
+ LN_Directory                                           = 'Directory';
+ NID_Directory                                          = 382;
+ SN_Management                                          = 'mgmt';
+ LN_Management                                          = 'Management';
+ NID_Management                                         = 383;
+ SN_Experimental                                        = 'experimental';
+ LN_Experimental                                        = 'Experimental';
+ NID_Experimental                                       = 384;
+ SN_Private                                             = 'private';
+ LN_Private                                             = 'Private';
+ NID_Private                                            = 385;
+ SN_Security                                            = 'security';
+ LN_Security                                            = 'Security';
+ NID_Security                                           = 386;
+ SN_SNMPv2                                              = 'snmpv2';
+ LN_SNMPv2                                              = 'SNMPv2';
+ NID_SNMPv2                                             = 387;
+ LN_Mail                                                = 'Mail';
+ NID_Mail                                               = 388;
+ SN_Enterprises                                         = 'enterprises';
+ LN_Enterprises                                         = 'Enterprises';
+ NID_Enterprises                                        = 389;
+ SN_dcObject                                            = 'dcobject';
+ LN_dcObject                                            = 'dcObject';
+ NID_dcObject                                           = 390;
+ SN_mime_mhs                                            = 'mime-mhs';
+ LN_mime_mhs                                            = 'MIME MHS';
+ NID_mime_mhs                                           = 504;
+ SN_mime_mhs_headings                                   = 'mime-mhs-headings';
+ LN_mime_mhs_headings                                   = 'mime-mhs-headings';
+ NID_mime_mhs_headings                                  = 505;
+ SN_mime_mhs_bodies                                     = 'mime-mhs-bodies';
+ LN_mime_mhs_bodies                                     = 'mime-mhs-bodies';
+ NID_mime_mhs_bodies                                    = 506;
+ SN_id_hex_partial_message                              = 'id-hex-partial-message';
+ LN_id_hex_partial_message                              = 'id-hex-partial-message';
+ NID_id_hex_partial_message                             = 507;
+ SN_id_hex_multipart_message                            = 'id-hex-multipart-message';
+ LN_id_hex_multipart_message                            = 'id-hex-multipart-message';
+ NID_id_hex_multipart_message                           = 508;
+ SN_aes_128_ecb                                         = 'AES-128-ECB';
+ LN_aes_128_ecb                                         = 'aes-128-ecb';
+ NID_aes_128_ecb                                        = 418;
+ SN_aes_128_cbc                                         = 'AES-128-CBC';
+ LN_aes_128_cbc                                         = 'aes-128-cbc';
+ NID_aes_128_cbc                                        = 419;
+ SN_aes_128_ofb128                                      = 'AES-128-OFB';
+ LN_aes_128_ofb128                                      = 'aes-128-ofb';
+ NID_aes_128_ofb128                                     = 420;
+ SN_aes_128_cfb128                                      = 'AES-128-CFB';
+ LN_aes_128_cfb128                                      = 'aes-128-cfb';
+ NID_aes_128_cfb128                                     = 421;
+ SN_id_aes128_wrap                                      = 'id-aes128-wrap';
+ NID_id_aes128_wrap                                     = 788;
+ SN_aes_128_gcm                                         = 'id-aes128-GCM';
+ LN_aes_128_gcm                                         = 'aes-128-gcm';
+ NID_aes_128_gcm                                        = 895;
+ SN_aes_128_ccm                                         = 'id-aes128-CCM';
+ LN_aes_128_ccm                                         = 'aes-128-ccm';
+ NID_aes_128_ccm                                        = 896;
+ SN_id_aes128_wrap_pad                                  = 'id-aes128-wrap-pad';
+ NID_id_aes128_wrap_pad                                 = 897;
+ SN_aes_192_ecb                                         = 'AES-192-ECB';
+ LN_aes_192_ecb                                         = 'aes-192-ecb';
+ NID_aes_192_ecb                                        = 422;
+ SN_aes_192_cbc                                         = 'AES-192-CBC';
+ LN_aes_192_cbc                                         = 'aes-192-cbc';
+ NID_aes_192_cbc                                        = 423;
+ SN_aes_192_ofb128                                      = 'AES-192-OFB';
+ LN_aes_192_ofb128                                      = 'aes-192-ofb';
+ NID_aes_192_ofb128                                     = 424;
+ SN_aes_192_cfb128                                      = 'AES-192-CFB';
+ LN_aes_192_cfb128                                      = 'aes-192-cfb';
+ NID_aes_192_cfb128                                     = 425;
+ SN_id_aes192_wrap                                      = 'id-aes192-wrap';
+ NID_id_aes192_wrap                                     = 789;
+ SN_aes_192_gcm                                         = 'id-aes192-GCM';
+ LN_aes_192_gcm                                         = 'aes-192-gcm';
+ NID_aes_192_gcm                                        = 898;
+ SN_aes_192_ccm                                         = 'id-aes192-CCM';
+ LN_aes_192_ccm                                         = 'aes-192-ccm';
+ NID_aes_192_ccm                                        = 899;
+ SN_id_aes192_wrap_pad                                  = 'id-aes192-wrap-pad';
+ NID_id_aes192_wrap_pad                                 = 900;
+ SN_aes_256_ecb                                         = 'AES-256-ECB';
+ LN_aes_256_ecb                                         = 'aes-256-ecb';
+ NID_aes_256_ecb                                        = 426;
+ SN_aes_256_cbc                                         = 'AES-256-CBC';
+ LN_aes_256_cbc                                         = 'aes-256-cbc';
+ NID_aes_256_cbc                                        = 427;
+ SN_aes_256_ofb128                                      = 'AES-256-OFB';
+ LN_aes_256_ofb128                                      = 'aes-256-ofb';
+ NID_aes_256_ofb128                                     = 428;
+ SN_aes_256_cfb128                                      = 'AES-256-CFB';
+ LN_aes_256_cfb128                                      = 'aes-256-cfb';
+ NID_aes_256_cfb128                                     = 429;
+ SN_id_aes256_wrap                                      = 'id-aes256-wrap';
+ NID_id_aes256_wrap                                     = 790;
+ SN_aes_256_gcm                                         = 'id-aes256-GCM';
+ LN_aes_256_gcm                                         = 'aes-256-gcm';
+ NID_aes_256_gcm                                        = 901;
+ SN_aes_256_ccm                                         = 'id-aes256-CCM';
+ LN_aes_256_ccm                                         = 'aes-256-ccm';
+ NID_aes_256_ccm                                        = 902;
+ SN_id_aes256_wrap_pad                                  = 'id-aes256-wrap-pad';
+ NID_id_aes256_wrap_pad                                 = 903;
+ SN_aes_128_cfb1                                        = 'AES-128-CFB1';
+ LN_aes_128_cfb1                                        = 'aes-128-cfb1';
+ NID_aes_128_cfb1                                       = 650;
+ SN_aes_192_cfb1                                        = 'AES-192-CFB1';
+ LN_aes_192_cfb1                                        = 'aes-192-cfb1';
+ NID_aes_192_cfb1                                       = 651;
+ SN_aes_256_cfb1                                        = 'AES-256-CFB1';
+ LN_aes_256_cfb1                                        = 'aes-256-cfb1';
+ NID_aes_256_cfb1                                       = 652;
+ SN_aes_128_cfb8                                        = 'AES-128-CFB8';
+ LN_aes_128_cfb8                                        = 'aes-128-cfb8';
+ NID_aes_128_cfb8                                       = 653;
+ SN_aes_192_cfb8                                        = 'AES-192-CFB8';
+ LN_aes_192_cfb8                                        = 'aes-192-cfb8';
+ NID_aes_192_cfb8                                       = 654;
+ SN_aes_256_cfb8                                        = 'AES-256-CFB8';
+ LN_aes_256_cfb8                                        = 'aes-256-cfb8';
+ NID_aes_256_cfb8                                       = 655;
+ SN_aes_128_ctr                                         = 'AES-128-CTR';
+ LN_aes_128_ctr                                         = 'aes-128-ctr';
+ NID_aes_128_ctr                                        = 904;
+ SN_aes_192_ctr                                         = 'AES-192-CTR';
+ LN_aes_192_ctr                                         = 'aes-192-ctr';
+ NID_aes_192_ctr                                        = 905;
+ SN_aes_256_ctr                                         = 'AES-256-CTR';
+ LN_aes_256_ctr                                         = 'aes-256-ctr';
+ NID_aes_256_ctr                                        = 906;
+ SN_aes_128_xts                                         = 'AES-128-XTS';
+ LN_aes_128_xts                                         = 'aes-128-xts';
+ NID_aes_128_xts                                        = 913;
+ SN_aes_256_xts                                         = 'AES-256-XTS';
+ LN_aes_256_xts                                         = 'aes-256-xts';
+ NID_aes_256_xts                                        = 914;
+ SN_des_cfb1                                            = 'DES-CFB1';
+ LN_des_cfb1                                            = 'des-cfb1';
+ NID_des_cfb1                                           = 656;
+ SN_des_cfb8                                            = 'DES-CFB8';
+ LN_des_cfb8                                            = 'des-cfb8';
+ NID_des_cfb8                                           = 657;
+ SN_des_ede3_cfb1                                       = 'DES-EDE3-CFB1';
+ LN_des_ede3_cfb1                                       = 'des-ede3-cfb1';
+ NID_des_ede3_cfb1                                      = 658;
+ SN_des_ede3_cfb8                                       = 'DES-EDE3-CFB8';
+ LN_des_ede3_cfb8                                       = 'des-ede3-cfb8';
+ NID_des_ede3_cfb8                                      = 659;
+ SN_sha256                                              = 'SHA256';
+ LN_sha256                                              = 'sha256';
+ NID_sha256                                             = 672;
+ SN_sha384                                              = 'SHA384';
+ LN_sha384                                              = 'sha384';
+ NID_sha384                                             = 673;
+ SN_sha512                                              = 'SHA512';
+ LN_sha512                                              = 'sha512';
+ NID_sha512                                             = 674;
+ SN_sha224                                              = 'SHA224';
+ LN_sha224                                              = 'sha224';
+ NID_sha224                                             = 675;
+ SN_dsa_with_SHA224                                     = 'dsa_with_SHA224';
+ NID_dsa_with_SHA224                                    = 802;
+ SN_dsa_with_SHA256                                     = 'dsa_with_SHA256';
+ NID_dsa_with_SHA256                                    = 803;
+ SN_hold_instruction_code                               = 'holdInstructionCode';
+ LN_hold_instruction_code                               = 'Hold Instruction Code';
+ NID_hold_instruction_code                              = 430;
+ SN_hold_instruction_none                               = 'holdInstructionNone';
+ LN_hold_instruction_none                               = 'Hold Instruction None';
+ NID_hold_instruction_none                              = 431;
+ SN_hold_instruction_call_issuer                        = 'holdInstructionCallIssuer';
+ LN_hold_instruction_call_issuer                        = 'Hold Instruction Call Issuer';
+ NID_hold_instruction_call_issuer                       = 432;
+ SN_hold_instruction_reject                             = 'holdInstructionReject';
+ LN_hold_instruction_reject                             = 'Hold Instruction Reject';
+ NID_hold_instruction_reject                            = 433;
+ SN_data                                                = 'data';
+ NID_data                                               = 434;
+ SN_pss                                                 = 'pss';
+ NID_pss                                                = 435;
+ SN_ucl                                                 = 'ucl';
+ NID_ucl                                                = 436;
+ SN_pilot                                               = 'pilot';
+ NID_pilot                                              = 437;
+ LN_pilotAttributeType                                  = 'pilotAttributeType';
+ NID_pilotAttributeType                                 = 438;
+ LN_pilotAttributeSyntax                                = 'pilotAttributeSyntax';
+ NID_pilotAttributeSyntax                               = 439;
+ LN_pilotObjectClass                                    = 'pilotObjectClass';
+ NID_pilotObjectClass                                   = 440;
+ LN_pilotGroups                                         = 'pilotGroups';
+ NID_pilotGroups                                        = 441;
+ LN_iA5StringSyntax                                     = 'iA5StringSyntax';
+ NID_iA5StringSyntax                                    = 442;
+ LN_caseIgnoreIA5StringSyntax                           = 'caseIgnoreIA5StringSyntax';
+ NID_caseIgnoreIA5StringSyntax                          = 443;
+ LN_pilotObject                                         = 'pilotObject';
+ NID_pilotObject                                        = 444;
+ LN_pilotPerson                                         = 'pilotPerson';
+ NID_pilotPerson                                        = 445;
+ SN_account                                             = 'account';
+ NID_account                                            = 446;
+ SN_document                                            = 'document';
+ NID_document                                           = 447;
+ SN_room                                                = 'room';
+ NID_room                                               = 448;
+ LN_documentSeries                                      = 'documentSeries';
+ NID_documentSeries                                     = 449;
+ SN_Domain                                              = 'domain';
+ LN_Domain                                              = 'Domain';
+ NID_Domain                                             = 392;
+ LN_rFC822localPart                                     = 'rFC822localPart';
+ NID_rFC822localPart                                    = 450;
+ LN_dNSDomain                                           = 'dNSDomain';
+ NID_dNSDomain                                          = 451;
+ LN_domainRelatedObject                                 = 'domainRelatedObject';
+ NID_domainRelatedObject                                = 452;
+ LN_friendlyCountry                                     = 'friendlyCountry';
+ NID_friendlyCountry                                    = 453;
+ LN_simpleSecurityObject                                = 'simpleSecurityObject';
+ NID_simpleSecurityObject                               = 454;
+ LN_pilotOrganization                                   = 'pilotOrganization';
+ NID_pilotOrganization                                  = 455;
+ LN_pilotDSA                                            = 'pilotDSA';
+ NID_pilotDSA                                           = 456;
+ LN_qualityLabelledData                                 = 'qualityLabelledData';
+ NID_qualityLabelledData                                = 457;
+ SN_userId                                              = 'UID';
+ LN_userId                                              = 'userId';
+ NID_userId                                             = 458;
+ LN_textEncodedORAddress                                = 'textEncodedORAddress';
+ NID_textEncodedORAddress                               = 459;
+ SN_rfc822Mailbox                                       = 'mail';
+ LN_rfc822Mailbox                                       = 'rfc822Mailbox';
+ NID_rfc822Mailbox                                      = 460;
+ SN_info                                                = 'info';
+ NID_info                                               = 461;
+ LN_favouriteDrink                                      = 'favouriteDrink';
+ NID_favouriteDrink                                     = 462;
+ LN_roomNumber                                          = 'roomNumber';
+ NID_roomNumber                                         = 463;
+ SN_photo                                               = 'photo';
+ NID_photo                                              = 464;
+ LN_userClass                                           = 'userClass';
+ NID_userClass                                          = 465;
+ SN_host                                                = 'host';
+ NID_host                                               = 466;
+ SN_manager                                             = 'manager';
+ NID_manager                                            = 467;
+ LN_documentIdentifier                                  = 'documentIdentifier';
+ NID_documentIdentifier                                 = 468;
+ LN_documentTitle                                       = 'documentTitle';
+ NID_documentTitle                                      = 469;
+ LN_documentVersion                                     = 'documentVersion';
+ NID_documentVersion                                    = 470;
+ LN_documentAuthor                                      = 'documentAuthor';
+ NID_documentAuthor                                     = 471;
+ LN_documentLocation                                    = 'documentLocation';
+ NID_documentLocation                                   = 472;
+ LN_homeTelephoneNumber                                 = 'homeTelephoneNumber';
+ NID_homeTelephoneNumber                                = 473;
+ SN_secretary                                           = 'secretary';
+ NID_secretary                                          = 474;
+ LN_otherMailbox                                        = 'otherMailbox';
+ NID_otherMailbox                                       = 475;
+ LN_lastModifiedTime                                    = 'lastModifiedTime';
+ NID_lastModifiedTime                                   = 476;
+ LN_lastModifiedBy                                      = 'lastModifiedBy';
+ NID_lastModifiedBy                                     = 477;
+ SN_domainComponent                                     = 'DC';
+ LN_domainComponent                                     = 'domainComponent';
+ NID_domainComponent                                    = 391;
+ LN_aRecord                                             = 'aRecord';
+ NID_aRecord                                            = 478;
+ LN_pilotAttributeType27                                = 'pilotAttributeType27';
+ NID_pilotAttributeType27                               = 479;
+ LN_mXRecord                                            = 'mXRecord';
+ NID_mXRecord                                           = 480;
+ LN_nSRecord                                            = 'nSRecord';
+ NID_nSRecord                                           = 481;
+ LN_sOARecord                                           = 'sOARecord';
+ NID_sOARecord                                          = 482;
+ LN_cNAMERecord                                         = 'cNAMERecord';
+ NID_cNAMERecord                                        = 483;
+ LN_associatedDomain                                    = 'associatedDomain';
+ NID_associatedDomain                                   = 484;
+ LN_associatedName                                      = 'associatedName';
+ NID_associatedName                                     = 485;
+ LN_homePostalAddress                                   = 'homePostalAddress';
+ NID_homePostalAddress                                  = 486;
+ LN_personalTitle                                       = 'personalTitle';
+ NID_personalTitle                                      = 487;
+ LN_mobileTelephoneNumber                               = 'mobileTelephoneNumber';
+ NID_mobileTelephoneNumber                              = 488;
+ LN_pagerTelephoneNumber                                = 'pagerTelephoneNumber';
+ NID_pagerTelephoneNumber                               = 489;
+ LN_friendlyCountryName                                 = 'friendlyCountryName';
+ NID_friendlyCountryName                                = 490;
+ LN_organizationalStatus                                = 'organizationalStatus';
+ NID_organizationalStatus                               = 491;
+ LN_janetMailbox                                        = 'janetMailbox';
+ NID_janetMailbox                                       = 492;
+ LN_mailPreferenceOption                                = 'mailPreferenceOption';
+ NID_mailPreferenceOption                               = 493;
+ LN_buildingName                                        = 'buildingName';
+ NID_buildingName                                       = 494;
+ LN_dSAQuality                                          = 'dSAQuality';
+ NID_dSAQuality                                         = 495;
+ LN_singleLevelQuality                                  = 'singleLevelQuality';
+ NID_singleLevelQuality                                 = 496;
+ LN_subtreeMinimumQuality                               = 'subtreeMinimumQuality';
+ NID_subtreeMinimumQuality                              = 497;
+ LN_subtreeMaximumQuality                               = 'subtreeMaximumQuality';
+ NID_subtreeMaximumQuality                              = 498;
+ LN_personalSignature                                   = 'personalSignature';
+ NID_personalSignature                                  = 499;
+ LN_dITRedirect                                         = 'dITRedirect';
+ NID_dITRedirect                                        = 500;
+ SN_audio                                               = 'audio';
+ NID_audio                                              = 501;
+ LN_documentPublisher                                   = 'documentPublisher';
+ NID_documentPublisher                                  = 502;
+ SN_id_set                                              = 'id-set';
+ LN_id_set                                              = 'Secure Electronic Transactions';
+ NID_id_set                                             = 512;
+ SN_set_ctype                                           = 'set-ctype';
+ LN_set_ctype                                           = 'content types';
+ NID_set_ctype                                          = 513;
+ SN_set_msgExt                                          = 'set-msgExt';
+ LN_set_msgExt                                          = 'message extensions';
+ NID_set_msgExt                                         = 514;
+ SN_set_attr                                            = 'set-attr';
+ NID_set_attr                                           = 515;
+ SN_set_policy                                          = 'set-policy';
+ NID_set_policy                                         = 516;
+ SN_set_certExt                                         = 'set-certExt';
+ LN_set_certExt                                         = 'certificate extensions';
+ NID_set_certExt                                        = 517;
+ SN_set_brand                                           = 'set-brand';
+ NID_set_brand                                          = 518;
+ SN_setct_PANData                                       = 'setct-PANData';
+ NID_setct_PANData                                      = 519;
+ SN_setct_PANToken                                      = 'setct-PANToken';
+ NID_setct_PANToken                                     = 520;
+ SN_setct_PANOnly                                       = 'setct-PANOnly';
+ NID_setct_PANOnly                                      = 521;
+ SN_setct_OIData                                        = 'setct-OIData';
+ NID_setct_OIData                                       = 522;
+ SN_setct_PI                                            = 'setct-PI';
+ NID_setct_PI                                           = 523;
+ SN_setct_PIData                                        = 'setct-PIData';
+ NID_setct_PIData                                       = 524;
+ SN_setct_PIDataUnsigned                                = 'setct-PIDataUnsigned';
+ NID_setct_PIDataUnsigned                               = 525;
+ SN_setct_HODInput                                      = 'setct-HODInput';
+ NID_setct_HODInput                                     = 526;
+ SN_setct_AuthResBaggage                                = 'setct-AuthResBaggage';
+ NID_setct_AuthResBaggage                               = 527;
+ SN_setct_AuthRevReqBaggage                             = 'setct-AuthRevReqBaggage';
+ NID_setct_AuthRevReqBaggage                            = 528;
+ SN_setct_AuthRevResBaggage                             = 'setct-AuthRevResBaggage';
+ NID_setct_AuthRevResBaggage                            = 529;
+ SN_setct_CapTokenSeq                                   = 'setct-CapTokenSeq';
+ NID_setct_CapTokenSeq                                  = 530;
+ SN_setct_PInitResData                                  = 'setct-PInitResData';
+ NID_setct_PInitResData                                 = 531;
+ SN_setct_PI_TBS                                        = 'setct-PI-TBS';
+ NID_setct_PI_TBS                                       = 532;
+ SN_setct_PResData                                      = 'setct-PResData';
+ NID_setct_PResData                                     = 533;
+ SN_setct_AuthReqTBS                                    = 'setct-AuthReqTBS';
+ NID_setct_AuthReqTBS                                   = 534;
+ SN_setct_AuthResTBS                                    = 'setct-AuthResTBS';
+ NID_setct_AuthResTBS                                   = 535;
+ SN_setct_AuthResTBSX                                   = 'setct-AuthResTBSX';
+ NID_setct_AuthResTBSX                                  = 536;
+ SN_setct_AuthTokenTBS                                  = 'setct-AuthTokenTBS';
+ NID_setct_AuthTokenTBS                                 = 537;
+ SN_setct_CapTokenData                                  = 'setct-CapTokenData';
+ NID_setct_CapTokenData                                 = 538;
+ SN_setct_CapTokenTBS                                   = 'setct-CapTokenTBS';
+ NID_setct_CapTokenTBS                                  = 539;
+ SN_setct_AcqCardCodeMsg                                = 'setct-AcqCardCodeMsg';
+ NID_setct_AcqCardCodeMsg                               = 540;
+ SN_setct_AuthRevReqTBS                                 = 'setct-AuthRevReqTBS';
+ NID_setct_AuthRevReqTBS                                = 541;
+ SN_setct_AuthRevResData                                = 'setct-AuthRevResData';
+ NID_setct_AuthRevResData                               = 542;
+ SN_setct_AuthRevResTBS                                 = 'setct-AuthRevResTBS';
+ NID_setct_AuthRevResTBS                                = 543;
+ SN_setct_CapReqTBS                                     = 'setct-CapReqTBS';
+ NID_setct_CapReqTBS                                    = 544;
+ SN_setct_CapReqTBSX                                    = 'setct-CapReqTBSX';
+ NID_setct_CapReqTBSX                                   = 545;
+ SN_setct_CapResData                                    = 'setct-CapResData';
+ NID_setct_CapResData                                   = 546;
+ SN_setct_CapRevReqTBS                                  = 'setct-CapRevReqTBS';
+ NID_setct_CapRevReqTBS                                 = 547;
+ SN_setct_CapRevReqTBSX                                 = 'setct-CapRevReqTBSX';
+ NID_setct_CapRevReqTBSX                                = 548;
+ SN_setct_CapRevResData                                 = 'setct-CapRevResData';
+ NID_setct_CapRevResData                                = 549;
+ SN_setct_CredReqTBS                                    = 'setct-CredReqTBS';
+ NID_setct_CredReqTBS                                   = 550;
+ SN_setct_CredReqTBSX                                   = 'setct-CredReqTBSX';
+ NID_setct_CredReqTBSX                                  = 551;
+ SN_setct_CredResData                                   = 'setct-CredResData';
+ NID_setct_CredResData                                  = 552;
+ SN_setct_CredRevReqTBS                                 = 'setct-CredRevReqTBS';
+ NID_setct_CredRevReqTBS                                = 553;
+ SN_setct_CredRevReqTBSX                                = 'setct-CredRevReqTBSX';
+ NID_setct_CredRevReqTBSX                               = 554;
+ SN_setct_CredRevResData                                = 'setct-CredRevResData';
+ NID_setct_CredRevResData                               = 555;
+ SN_setct_PCertReqData                                  = 'setct-PCertReqData';
+ NID_setct_PCertReqData                                 = 556;
+ SN_setct_PCertResTBS                                   = 'setct-PCertResTBS';
+ NID_setct_PCertResTBS                                  = 557;
+ SN_setct_BatchAdminReqData                             = 'setct-BatchAdminReqData';
+ NID_setct_BatchAdminReqData                            = 558;
+ SN_setct_BatchAdminResData                             = 'setct-BatchAdminResData';
+ NID_setct_BatchAdminResData                            = 559;
+ SN_setct_CardCInitResTBS                               = 'setct-CardCInitResTBS';
+ NID_setct_CardCInitResTBS                              = 560;
+ SN_setct_MeAqCInitResTBS                               = 'setct-MeAqCInitResTBS';
+ NID_setct_MeAqCInitResTBS                              = 561;
+ SN_setct_RegFormResTBS                                 = 'setct-RegFormResTBS';
+ NID_setct_RegFormResTBS                                = 562;
+ SN_setct_CertReqData                                   = 'setct-CertReqData';
+ NID_setct_CertReqData                                  = 563;
+ SN_setct_CertReqTBS                                    = 'setct-CertReqTBS';
+ NID_setct_CertReqTBS                                   = 564;
+ SN_setct_CertResData                                   = 'setct-CertResData';
+ NID_setct_CertResData                                  = 565;
+ SN_setct_CertInqReqTBS                                 = 'setct-CertInqReqTBS';
+ NID_setct_CertInqReqTBS                                = 566;
+ SN_setct_ErrorTBS                                      = 'setct-ErrorTBS';
+ NID_setct_ErrorTBS                                     = 567;
+ SN_setct_PIDualSignedTBE                               = 'setct-PIDualSignedTBE';
+ NID_setct_PIDualSignedTBE                              = 568;
+ SN_setct_PIUnsignedTBE                                 = 'setct-PIUnsignedTBE';
+ NID_setct_PIUnsignedTBE                                = 569;
+ SN_setct_AuthReqTBE                                    = 'setct-AuthReqTBE';
+ NID_setct_AuthReqTBE                                   = 570;
+ SN_setct_AuthResTBE                                    = 'setct-AuthResTBE';
+ NID_setct_AuthResTBE                                   = 571;
+ SN_setct_AuthResTBEX                                   = 'setct-AuthResTBEX';
+ NID_setct_AuthResTBEX                                  = 572;
+ SN_setct_AuthTokenTBE                                  = 'setct-AuthTokenTBE';
+ NID_setct_AuthTokenTBE                                 = 573;
+ SN_setct_CapTokenTBE                                   = 'setct-CapTokenTBE';
+ NID_setct_CapTokenTBE                                  = 574;
+ SN_setct_CapTokenTBEX                                  = 'setct-CapTokenTBEX';
+ NID_setct_CapTokenTBEX                                 = 575;
+ SN_setct_AcqCardCodeMsgTBE                             = 'setct-AcqCardCodeMsgTBE';
+ NID_setct_AcqCardCodeMsgTBE                            = 576;
+ SN_setct_AuthRevReqTBE                                 = 'setct-AuthRevReqTBE';
+ NID_setct_AuthRevReqTBE                                = 577;
+ SN_setct_AuthRevResTBE                                 = 'setct-AuthRevResTBE';
+ NID_setct_AuthRevResTBE                                = 578;
+ SN_setct_AuthRevResTBEB                                = 'setct-AuthRevResTBEB';
+ NID_setct_AuthRevResTBEB                               = 579;
+ SN_setct_CapReqTBE                                     = 'setct-CapReqTBE';
+ NID_setct_CapReqTBE                                    = 580;
+ SN_setct_CapReqTBEX                                    = 'setct-CapReqTBEX';
+ NID_setct_CapReqTBEX                                   = 581;
+ SN_setct_CapResTBE                                     = 'setct-CapResTBE';
+ NID_setct_CapResTBE                                    = 582;
+ SN_setct_CapRevReqTBE                                  = 'setct-CapRevReqTBE';
+ NID_setct_CapRevReqTBE                                 = 583;
+ SN_setct_CapRevReqTBEX                                 = 'setct-CapRevReqTBEX';
+ NID_setct_CapRevReqTBEX                                = 584;
+ SN_setct_CapRevResTBE                                  = 'setct-CapRevResTBE';
+ NID_setct_CapRevResTBE                                 = 585;
+ SN_setct_CredReqTBE                                    = 'setct-CredReqTBE';
+ NID_setct_CredReqTBE                                   = 586;
+ SN_setct_CredReqTBEX                                   = 'setct-CredReqTBEX';
+ NID_setct_CredReqTBEX                                  = 587;
+ SN_setct_CredResTBE                                    = 'setct-CredResTBE';
+ NID_setct_CredResTBE                                   = 588;
+ SN_setct_CredRevReqTBE                                 = 'setct-CredRevReqTBE';
+ NID_setct_CredRevReqTBE                                = 589;
+ SN_setct_CredRevReqTBEX                                = 'setct-CredRevReqTBEX';
+ NID_setct_CredRevReqTBEX                               = 590;
+ SN_setct_CredRevResTBE                                 = 'setct-CredRevResTBE';
+ NID_setct_CredRevResTBE                                = 591;
+ SN_setct_BatchAdminReqTBE                              = 'setct-BatchAdminReqTBE';
+ NID_setct_BatchAdminReqTBE                             = 592;
+ SN_setct_BatchAdminResTBE                              = 'setct-BatchAdminResTBE';
+ NID_setct_BatchAdminResTBE                             = 593;
+ SN_setct_RegFormReqTBE                                 = 'setct-RegFormReqTBE';
+ NID_setct_RegFormReqTBE                                = 594;
+ SN_setct_CertReqTBE                                    = 'setct-CertReqTBE';
+ NID_setct_CertReqTBE                                   = 595;
+ SN_setct_CertReqTBEX                                   = 'setct-CertReqTBEX';
+ NID_setct_CertReqTBEX                                  = 596;
+ SN_setct_CertResTBE                                    = 'setct-CertResTBE';
+ NID_setct_CertResTBE                                   = 597;
+ SN_setct_CRLNotificationTBS                            = 'setct-CRLNotificationTBS';
+ NID_setct_CRLNotificationTBS                           = 598;
+ SN_setct_CRLNotificationResTBS                         = 'setct-CRLNotificationResTBS';
+ NID_setct_CRLNotificationResTBS                        = 599;
+ SN_setct_BCIDistributionTBS                            = 'setct-BCIDistributionTBS';
+ NID_setct_BCIDistributionTBS                           = 600;
+ SN_setext_genCrypt                                     = 'setext-genCrypt';
+ LN_setext_genCrypt                                     = 'generic cryptogram';
+ NID_setext_genCrypt                                    = 601;
+ SN_setext_miAuth                                       = 'setext-miAuth';
+ LN_setext_miAuth                                       = 'merchant initiated auth';
+ NID_setext_miAuth                                      = 602;
+ SN_setext_pinSecure                                    = 'setext-pinSecure';
+ NID_setext_pinSecure                                   = 603;
+ SN_setext_pinAny                                       = 'setext-pinAny';
+ NID_setext_pinAny                                      = 604;
+ SN_setext_track2                                       = 'setext-track2';
+ NID_setext_track2                                      = 605;
+ SN_setext_cv                                           = 'setext-cv';
+ LN_setext_cv                                           = 'additional verification';
+ NID_setext_cv                                          = 606;
+ SN_set_policy_root                                     = 'set-policy-root';
+ NID_set_policy_root                                    = 607;
+ SN_setCext_hashedRoot                                  = 'setCext-hashedRoot';
+ NID_setCext_hashedRoot                                 = 608;
+ SN_setCext_certType                                    = 'setCext-certType';
+ NID_setCext_certType                                   = 609;
+ SN_setCext_merchData                                   = 'setCext-merchData';
+ NID_setCext_merchData                                  = 610;
+ SN_setCext_cCertRequired                               = 'setCext-cCertRequired';
+ NID_setCext_cCertRequired                              = 611;
+ SN_setCext_tunneling                                   = 'setCext-tunneling';
+ NID_setCext_tunneling                                  = 612;
+ SN_setCext_setExt                                      = 'setCext-setExt';
+ NID_setCext_setExt                                     = 613;
+ SN_setCext_setQualf                                    = 'setCext-setQualf';
+ NID_setCext_setQualf                                   = 614;
+ SN_setCext_PGWYcapabilities                            = 'setCext-PGWYcapabilities';
+ NID_setCext_PGWYcapabilities                           = 615;
+ SN_setCext_TokenIdentifier                             = 'setCext-TokenIdentifier';
+ NID_setCext_TokenIdentifier                            = 616;
+ SN_setCext_Track2Data                                  = 'setCext-Track2Data';
+ NID_setCext_Track2Data                                 = 617;
+ SN_setCext_TokenType                                   = 'setCext-TokenType';
+ NID_setCext_TokenType                                  = 618;
+ SN_setCext_IssuerCapabilities                          = 'setCext-IssuerCapabilities';
+ NID_setCext_IssuerCapabilities                         = 619;
+ SN_setAttr_Cert                                        = 'setAttr-Cert';
+ NID_setAttr_Cert                                       = 620;
+ SN_setAttr_PGWYcap                                     = 'setAttr-PGWYcap';
+ LN_setAttr_PGWYcap                                     = 'payment gateway capabilities';
+ NID_setAttr_PGWYcap                                    = 621;
+ SN_setAttr_TokenType                                   = 'setAttr-TokenType';
+ NID_setAttr_TokenType                                  = 622;
+ SN_setAttr_IssCap                                      = 'setAttr-IssCap';
+ LN_setAttr_IssCap                                      = 'issuer capabilities';
+ NID_setAttr_IssCap                                     = 623;
+ SN_set_rootKeyThumb                                    = 'set-rootKeyThumb';
+ NID_set_rootKeyThumb                                   = 624;
+ SN_set_addPolicy                                       = 'set-addPolicy';
+ NID_set_addPolicy                                      = 625;
+ SN_setAttr_Token_EMV                                   = 'setAttr-Token-EMV';
+ NID_setAttr_Token_EMV                                  = 626;
+ SN_setAttr_Token_B0Prime                               = 'setAttr-Token-B0Prime';
+ NID_setAttr_Token_B0Prime                              = 627;
+ SN_setAttr_IssCap_CVM                                  = 'setAttr-IssCap-CVM';
+ NID_setAttr_IssCap_CVM                                 = 628;
+ SN_setAttr_IssCap_T2                                   = 'setAttr-IssCap-T2';
+ NID_setAttr_IssCap_T2                                  = 629;
+ SN_setAttr_IssCap_Sig                                  = 'setAttr-IssCap-Sig';
+ NID_setAttr_IssCap_Sig                                 = 630;
+ SN_setAttr_GenCryptgrm                                 = 'setAttr-GenCryptgrm';
+ LN_setAttr_GenCryptgrm                                 = 'generate cryptogram';
+ NID_setAttr_GenCryptgrm                                = 631;
+ SN_setAttr_T2Enc                                       = 'setAttr-T2Enc';
+ LN_setAttr_T2Enc                                       = 'encrypted track 2';
+ NID_setAttr_T2Enc                                      = 632;
+ SN_setAttr_T2cleartxt                                  = 'setAttr-T2cleartxt';
+ LN_setAttr_T2cleartxt                                  = 'cleartext track 2';
+ NID_setAttr_T2cleartxt                                 = 633;
+ SN_setAttr_TokICCsig                                   = 'setAttr-TokICCsig';
+ LN_setAttr_TokICCsig                                   = 'ICC or token signature';
+ NID_setAttr_TokICCsig                                  = 634;
+ SN_setAttr_SecDevSig                                   = 'setAttr-SecDevSig';
+ LN_setAttr_SecDevSig                                   = 'secure device signature';
+ NID_setAttr_SecDevSig                                  = 635;
+ SN_set_brand_IATA_ATA                                  = 'set-brand-IATA-ATA';
+ NID_set_brand_IATA_ATA                                 = 636;
+ SN_set_brand_Diners                                    = 'set-brand-Diners';
+ NID_set_brand_Diners                                   = 637;
+ SN_set_brand_AmericanExpress                           = 'set-brand-AmericanExpress';
+ NID_set_brand_AmericanExpress                          = 638;
+ SN_set_brand_JCB                                       = 'set-brand-JCB';
+ NID_set_brand_JCB                                      = 639;
+ SN_set_brand_Visa                                      = 'set-brand-Visa';
+ NID_set_brand_Visa                                     = 640;
+ SN_set_brand_MasterCard                                = 'set-brand-MasterCard';
+ NID_set_brand_MasterCard                               = 641;
+ SN_set_brand_Novus                                     = 'set-brand-Novus';
+ NID_set_brand_Novus                                    = 642;
+ SN_des_cdmf                                            = 'DES-CDMF';
+ LN_des_cdmf                                            = 'des-cdmf';
+ NID_des_cdmf                                           = 643;
+ SN_rsaOAEPEncryptionSET                                = 'rsaOAEPEncryptionSET';
+ NID_rsaOAEPEncryptionSET                               = 644;
+ SN_ipsec3                                              = 'Oakley-EC2N-3';
+ LN_ipsec3                                              = 'ipsec3';
+ NID_ipsec3                                             = 749;
+ SN_ipsec4                                              = 'Oakley-EC2N-4';
+ LN_ipsec4                                              = 'ipsec4';
+ NID_ipsec4                                             = 750;
+ SN_whirlpool                                           = 'whirlpool';
+ NID_whirlpool                                          = 804;
+ SN_cryptopro                                           = 'cryptopro';
+ NID_cryptopro                                          = 805;
+ SN_cryptocom                                           = 'cryptocom';
+ NID_cryptocom                                          = 806;
+ SN_id_GostR3411_94_with_GostR3410_2001                 = 'id-GostR3411-94-with-GostR3410-2001';
+ LN_id_GostR3411_94_with_GostR3410_2001                 = 'GOST R 34.11-94 with GOST R 34.10-2001';
+ NID_id_GostR3411_94_with_GostR3410_2001                = 807;
+ SN_id_GostR3411_94_with_GostR3410_94                   = 'id-GostR3411-94-with-GostR3410-94';
+ LN_id_GostR3411_94_with_GostR3410_94                   = 'GOST R 34.11-94 with GOST R 34.10-94';
+ NID_id_GostR3411_94_with_GostR3410_94                  = 808;
+ SN_id_GostR3411_94                                     = 'md_gost94';
+ LN_id_GostR3411_94                                     = 'GOST R 34.11-94';
+ NID_id_GostR3411_94                                    = 809;
+ SN_id_HMACGostR3411_94                                 = 'id-HMACGostR3411-94';
+ LN_id_HMACGostR3411_94                                 = 'HMAC GOST 34.11-94';
+ NID_id_HMACGostR3411_94                                = 810;
+ SN_id_GostR3410_2001                                   = 'gost2001';
+ LN_id_GostR3410_2001                                   = 'GOST R 34.10-2001';
+ NID_id_GostR3410_2001                                  = 811;
+ SN_id_GostR3410_94                                     = 'gost94';
+ LN_id_GostR3410_94                                     = 'GOST R 34.10-94';
+ NID_id_GostR3410_94                                    = 812;
+ SN_id_Gost28147_89                                     = 'gost89';
+ LN_id_Gost28147_89                                     = 'GOST 28147-89';
+ NID_id_Gost28147_89                                    = 813;
+ SN_gost89_cnt                                          = 'gost89-cnt';
+ NID_gost89_cnt                                         = 814;
+ SN_id_Gost28147_89_MAC                                 = 'gost-mac';
+ LN_id_Gost28147_89_MAC                                 = 'GOST 28147-89 MAC';
+ NID_id_Gost28147_89_MAC                                = 815;
+ SN_id_GostR3411_94_prf                                 = 'prf-gostr3411-94';
+ LN_id_GostR3411_94_prf                                 = 'GOST R 34.11-94 PRF';
+ NID_id_GostR3411_94_prf                                = 816;
+ SN_id_GostR3410_2001DH                                 = 'id-GostR3410-2001DH';
+ LN_id_GostR3410_2001DH                                 = 'GOST R 34.10-2001 DH';
+ NID_id_GostR3410_2001DH                                = 817;
+ SN_id_GostR3410_94DH                                   = 'id-GostR3410-94DH';
+ LN_id_GostR3410_94DH                                   = 'GOST R 34.10-94 DH';
+ NID_id_GostR3410_94DH                                  = 818;
+ SN_id_Gost28147_89_CryptoPro_KeyMeshing                = 'id-Gost28147-89-CryptoPro-KeyMeshing';
+ NID_id_Gost28147_89_CryptoPro_KeyMeshing               = 819;
+ SN_id_Gost28147_89_None_KeyMeshing                     = 'id-Gost28147-89-None-KeyMeshing';
+ NID_id_Gost28147_89_None_KeyMeshing                    = 820;
+ SN_id_GostR3411_94_TestParamSet                        = 'id-GostR3411-94-TestParamSet';
+ NID_id_GostR3411_94_TestParamSet                       = 821;
+ SN_id_GostR3411_94_CryptoProParamSet                   = 'id-GostR3411-94-CryptoProParamSet';
+ NID_id_GostR3411_94_CryptoProParamSet                  = 822;
+ SN_id_Gost28147_89_TestParamSet                        = 'id-Gost28147-89-TestParamSet';
+ NID_id_Gost28147_89_TestParamSet                       = 823;
+ SN_id_Gost28147_89_CryptoPro_A_ParamSet                = 'id-Gost28147-89-CryptoPro-A-ParamSet';
+ NID_id_Gost28147_89_CryptoPro_A_ParamSet               = 824;
+ SN_id_Gost28147_89_CryptoPro_B_ParamSet                = 'id-Gost28147-89-CryptoPro-B-ParamSet';
+ NID_id_Gost28147_89_CryptoPro_B_ParamSet               = 825;
+ SN_id_Gost28147_89_CryptoPro_C_ParamSet                = 'id-Gost28147-89-CryptoPro-C-ParamSet';
+ NID_id_Gost28147_89_CryptoPro_C_ParamSet               = 826;
+ SN_id_Gost28147_89_CryptoPro_D_ParamSet                = 'id-Gost28147-89-CryptoPro-D-ParamSet';
+ NID_id_Gost28147_89_CryptoPro_D_ParamSet               = 827;
+ SN_id_Gost28147_89_CryptoPro_Oscar_1_1_ParamSet        = 'id-Gost28147-89-CryptoPro-Oscar-1-1-ParamSet';
+ NID_id_Gost28147_89_CryptoPro_Oscar_1_1_ParamSet       = 828;
+ SN_id_Gost28147_89_CryptoPro_Oscar_1_0_ParamSet        = 'id-Gost28147-89-CryptoPro-Oscar-1-0-ParamSet';
+ NID_id_Gost28147_89_CryptoPro_Oscar_1_0_ParamSet       = 829;
+ SN_id_Gost28147_89_CryptoPro_RIC_1_ParamSet            = 'id-Gost28147-89-CryptoPro-RIC-1-ParamSet';
+ NID_id_Gost28147_89_CryptoPro_RIC_1_ParamSet           = 830;
+ SN_id_GostR3410_94_TestParamSet                        = 'id-GostR3410-94-TestParamSet';
+ NID_id_GostR3410_94_TestParamSet                       = 831;
+ SN_id_GostR3410_94_CryptoPro_A_ParamSet                = 'id-GostR3410-94-CryptoPro-A-ParamSet';
+ NID_id_GostR3410_94_CryptoPro_A_ParamSet               = 832;
+ SN_id_GostR3410_94_CryptoPro_B_ParamSet                = 'id-GostR3410-94-CryptoPro-B-ParamSet';
+ NID_id_GostR3410_94_CryptoPro_B_ParamSet               = 833;
+ SN_id_GostR3410_94_CryptoPro_C_ParamSet                = 'id-GostR3410-94-CryptoPro-C-ParamSet';
+ NID_id_GostR3410_94_CryptoPro_C_ParamSet               = 834;
+ SN_id_GostR3410_94_CryptoPro_D_ParamSet                = 'id-GostR3410-94-CryptoPro-D-ParamSet';
+ NID_id_GostR3410_94_CryptoPro_D_ParamSet               = 835;
+ SN_id_GostR3410_94_CryptoPro_XchA_ParamSet             = 'id-GostR3410-94-CryptoPro-XchA-ParamSet';
+ NID_id_GostR3410_94_CryptoPro_XchA_ParamSet            = 836;
+ SN_id_GostR3410_94_CryptoPro_XchB_ParamSet             = 'id-GostR3410-94-CryptoPro-XchB-ParamSet';
+ NID_id_GostR3410_94_CryptoPro_XchB_ParamSet            = 837;
+ SN_id_GostR3410_94_CryptoPro_XchC_ParamSet             = 'id-GostR3410-94-CryptoPro-XchC-ParamSet';
+ NID_id_GostR3410_94_CryptoPro_XchC_ParamSet            = 838;
+ SN_id_GostR3410_2001_TestParamSet                      = 'id-GostR3410-2001-TestParamSet';
+ NID_id_GostR3410_2001_TestParamSet                     = 839;
+ SN_id_GostR3410_2001_CryptoPro_A_ParamSet              = 'id-GostR3410-2001-CryptoPro-A-ParamSet';
+ NID_id_GostR3410_2001_CryptoPro_A_ParamSet             = 840;
+ SN_id_GostR3410_2001_CryptoPro_B_ParamSet              = 'id-GostR3410-2001-CryptoPro-B-ParamSet';
+ NID_id_GostR3410_2001_CryptoPro_B_ParamSet             = 841;
+ SN_id_GostR3410_2001_CryptoPro_C_ParamSet              = 'id-GostR3410-2001-CryptoPro-C-ParamSet';
+ NID_id_GostR3410_2001_CryptoPro_C_ParamSet             = 842;
+ SN_id_GostR3410_2001_CryptoPro_XchA_ParamSet           = 'id-GostR3410-2001-CryptoPro-XchA-ParamSet';
+ NID_id_GostR3410_2001_CryptoPro_XchA_ParamSet          = 843;
+ SN_id_GostR3410_2001_CryptoPro_XchB_ParamSet           = 'id-GostR3410-2001-CryptoPro-XchB-ParamSet';
+ NID_id_GostR3410_2001_CryptoPro_XchB_ParamSet          = 844;
+ SN_id_GostR3410_94_a                                   = 'id-GostR3410-94-a';
+ NID_id_GostR3410_94_a                                  = 845;
+ SN_id_GostR3410_94_aBis                                = 'id-GostR3410-94-aBis';
+ NID_id_GostR3410_94_aBis                               = 846;
+ SN_id_GostR3410_94_b                                   = 'id-GostR3410-94-b';
+ NID_id_GostR3410_94_b                                  = 847;
+ SN_id_GostR3410_94_bBis                                = 'id-GostR3410-94-bBis';
+ NID_id_GostR3410_94_bBis                               = 848;
+ SN_id_Gost28147_89_cc                                  = 'id-Gost28147-89-cc';
+ LN_id_Gost28147_89_cc                                  = 'GOST 28147-89 Cryptocom ParamSet';
+ NID_id_Gost28147_89_cc                                 = 849;
+ SN_id_GostR3410_94_cc                                  = 'gost94cc';
+ LN_id_GostR3410_94_cc                                  = 'GOST 34.10-94 Cryptocom';
+ NID_id_GostR3410_94_cc                                 = 850;
+ SN_id_GostR3410_2001_cc                                = 'gost2001cc';
+ LN_id_GostR3410_2001_cc                                = 'GOST 34.10-2001 Cryptocom';
+ NID_id_GostR3410_2001_cc                               = 851;
+ SN_id_GostR3411_94_with_GostR3410_94_cc                = 'id-GostR3411-94-with-GostR3410-94-cc';
+ LN_id_GostR3411_94_with_GostR3410_94_cc                = 'GOST R 34.11-94 with GOST R 34.10-94 Cryptocom';
+ NID_id_GostR3411_94_with_GostR3410_94_cc               = 852;
+ SN_id_GostR3411_94_with_GostR3410_2001_cc              = 'id-GostR3411-94-with-GostR3410-2001-cc';
+ LN_id_GostR3411_94_with_GostR3410_2001_cc              = 'GOST R 34.11-94 with GOST R 34.10-2001 Cryptocom';
+ NID_id_GostR3411_94_with_GostR3410_2001_cc             = 853;
+ SN_id_GostR3410_2001_ParamSet_cc                       = 'id-GostR3410-2001-ParamSet-cc';
+ LN_id_GostR3410_2001_ParamSet_cc                       = 'GOST R 3410-2001 Parameter Set Cryptocom';
+ NID_id_GostR3410_2001_ParamSet_cc                      = 854;
+ SN_camellia_128_cbc                                    = 'CAMELLIA-128-CBC';
+ LN_camellia_128_cbc                                    = 'camellia-128-cbc';
+ NID_camellia_128_cbc                                   = 751;
+ SN_camellia_192_cbc                                    = 'CAMELLIA-192-CBC';
+ LN_camellia_192_cbc                                    = 'camellia-192-cbc';
+ NID_camellia_192_cbc                                   = 752;
+ SN_camellia_256_cbc                                    = 'CAMELLIA-256-CBC';
+ LN_camellia_256_cbc                                    = 'camellia-256-cbc';
+ NID_camellia_256_cbc                                   = 753;
+ SN_id_camellia128_wrap                                 = 'id-camellia128-wrap';
+ NID_id_camellia128_wrap                                = 907;
+ SN_id_camellia192_wrap                                 = 'id-camellia192-wrap';
+ NID_id_camellia192_wrap                                = 908;
+ SN_id_camellia256_wrap                                 = 'id-camellia256-wrap';
+ NID_id_camellia256_wrap                                = 909;
+ SN_camellia_128_ecb                                    = 'CAMELLIA-128-ECB';
+ LN_camellia_128_ecb                                    = 'camellia-128-ecb';
+ NID_camellia_128_ecb                                   = 754;
+ SN_camellia_128_ofb128                                 = 'CAMELLIA-128-OFB';
+ LN_camellia_128_ofb128                                 = 'camellia-128-ofb';
+ NID_camellia_128_ofb128                                = 766;
+ SN_camellia_128_cfb128                                 = 'CAMELLIA-128-CFB';
+ LN_camellia_128_cfb128                                 = 'camellia-128-cfb';
+ NID_camellia_128_cfb128                                = 757;
+ SN_camellia_192_ecb                                    = 'CAMELLIA-192-ECB';
+ LN_camellia_192_ecb                                    = 'camellia-192-ecb';
+ NID_camellia_192_ecb                                   = 755;
+ SN_camellia_192_ofb128                                 = 'CAMELLIA-192-OFB';
+ LN_camellia_192_ofb128                                 = 'camellia-192-ofb';
+ NID_camellia_192_ofb128                                = 767;
+ SN_camellia_192_cfb128                                 = 'CAMELLIA-192-CFB';
+ LN_camellia_192_cfb128                                 = 'camellia-192-cfb';
+ NID_camellia_192_cfb128                                = 758;
+ SN_camellia_256_ecb                                    = 'CAMELLIA-256-ECB';
+ LN_camellia_256_ecb                                    = 'camellia-256-ecb';
+ NID_camellia_256_ecb                                   = 756;
+ SN_camellia_256_ofb128                                 = 'CAMELLIA-256-OFB';
+ LN_camellia_256_ofb128                                 = 'camellia-256-ofb';
+ NID_camellia_256_ofb128                                = 768;
+ SN_camellia_256_cfb128                                 = 'CAMELLIA-256-CFB';
+ LN_camellia_256_cfb128                                 = 'camellia-256-cfb';
+ NID_camellia_256_cfb128                                = 759;
+ SN_camellia_128_cfb1                                   = 'CAMELLIA-128-CFB1';
+ LN_camellia_128_cfb1                                   = 'camellia-128-cfb1';
+ NID_camellia_128_cfb1                                  = 760;
+ SN_camellia_192_cfb1                                   = 'CAMELLIA-192-CFB1';
+ LN_camellia_192_cfb1                                   = 'camellia-192-cfb1';
+ NID_camellia_192_cfb1                                  = 761;
+ SN_camellia_256_cfb1                                   = 'CAMELLIA-256-CFB1';
+ LN_camellia_256_cfb1                                   = 'camellia-256-cfb1';
+ NID_camellia_256_cfb1                                  = 762;
+ SN_camellia_128_cfb8                                   = 'CAMELLIA-128-CFB8';
+ LN_camellia_128_cfb8                                   = 'camellia-128-cfb8';
+ NID_camellia_128_cfb8                                  = 763;
+ SN_camellia_192_cfb8                                   = 'CAMELLIA-192-CFB8';
+ LN_camellia_192_cfb8                                   = 'camellia-192-cfb8';
+ NID_camellia_192_cfb8                                  = 764;
+ SN_camellia_256_cfb8                                   = 'CAMELLIA-256-CFB8';
+ LN_camellia_256_cfb8                                   = 'camellia-256-cfb8';
+ NID_camellia_256_cfb8                                  = 765;
+ SN_kisa                                                = 'KISA';
+ LN_kisa                                                = 'kisa';
+ NID_kisa                                               = 773;
+ SN_seed_ecb                                            = 'SEED-ECB';
+ LN_seed_ecb                                            = 'seed-ecb';
+ NID_seed_ecb                                           = 776;
+ SN_seed_cbc                                            = 'SEED-CBC';
+ LN_seed_cbc                                            = 'seed-cbc';
+ NID_seed_cbc                                           = 777;
+ SN_seed_cfb128                                         = 'SEED-CFB';
+ LN_seed_cfb128                                         = 'seed-cfb';
+ NID_seed_cfb128                                        = 779;
+ SN_seed_ofb128                                         = 'SEED-OFB';
+ LN_seed_ofb128                                         = 'seed-ofb';
+ NID_seed_ofb128                                        = 778;
+ SN_hmac                                                = 'HMAC';
+ LN_hmac                                                = 'hmac';
+ NID_hmac                                               = 855;
+ SN_cmac                                                = 'CMAC';
+ LN_cmac                                                = 'cmac';
+ NID_cmac                                               = 894;
+ SN_rc4_hmac_md5                                        = 'RC4-HMAC-MD5';
+ LN_rc4_hmac_md5                                        = 'rc4-hmac-md5';
+ NID_rc4_hmac_md5                                       = 915;
+ SN_aes_128_cbc_hmac_sha1                               = 'AES-128-CBC-HMAC-SHA1';
+ LN_aes_128_cbc_hmac_sha1                               = 'aes-128-cbc-hmac-sha1';
+ NID_aes_128_cbc_hmac_sha1                              = 916;
+ SN_aes_192_cbc_hmac_sha1                               = 'AES-192-CBC-HMAC-SHA1';
+ LN_aes_192_cbc_hmac_sha1                               = 'aes-192-cbc-hmac-sha1';
+ NID_aes_192_cbc_hmac_sha1                              = 917;
+ SN_aes_256_cbc_hmac_sha1                               = 'AES-256-CBC-HMAC-SHA1';
+ LN_aes_256_cbc_hmac_sha1                               = 'aes-256-cbc-hmac-sha1';
+ NID_aes_256_cbc_hmac_sha1                              = 918;
+
+
+
+
+ OBJ_NAME_TYPE_UNDEF            = $00;
+ OBJ_NAME_TYPE_MD_METH          = $01;
+ OBJ_NAME_TYPE_CIPHER_METH      = $02;
+ OBJ_NAME_TYPE_PKEY_METH        = $03;
+ OBJ_NAME_TYPE_COMP_METH        = $04;
+ OBJ_NAME_TYPE_NUM              = $05;
+ OBJ_NAME_ALIAS                         = $8000;
+ OBJ_BSEARCH_VALUE_ON_NOMATCH           = $01;
+ OBJ_BSEARCH_FIRST_VALUE_ON_MATCH       = $02;
+
+
+{$ENDREGION}
+
+const
+  ASIdentifierChoice_inherit = 0;
+  ASIdentifierChoice_asIdsOrRanges = 1;
+  IPAddressOrRange_addressPrefix = 0;
+  IPAddressOrRange_addressRange = 1;
+  IPAddressChoice_inherit = 0;
+  IPAddressChoice_addressesOrRanges = 1;
+  SHA_LBLOCK = 16;
+  SHA_CBLOCK = 64;
+  SHA_DIGEST_LENGTH = 20;
+  SHA_LAST_BLOCK = (SHA_CBLOCK - 8);
+  SHA256_CBLOCK = (SHA_LBLOCK * 4);
+  SHA224_DIGEST_LENGTH = 28;
+  SHA256_DIGEST_LENGTH = 32;
+  SHA384_DIGEST_LENGTH = 48;
+  SHA512_DIGEST_LENGTH = 64;
+  SHA512_CBLOCK = (SHA_LBLOCK * 8);
+  EVP_MAX_MD_SIZE = 64;
+  EVP_MAX_KEY_LENGTH = 32;
+  EVP_MAX_IV_LENGTH = 16;
+  EVP_MAX_BLOCK_LENGTH = 32;
+{$REGION 'AES'}
+const
+  AES_ENCRYPT    = 1;
+  AES_DECRYPT    = 0;
+  AES_MAXNR = 14;
+  AES_BLOCK_SIZE = 16;
+{$ENDREGION}
+{$REGION 'BlowFish'}
+const
+    BF_ENCRYPT  = 1;
+    BF_DECRYPT  = 0;
+    BF_LONG_LOG2 = 3;
+    BF_ROUNDS    = 16;
+    BF_BLOCK    = 8;
+{$ENDREGION}
+{$REGION 'ASN'}
+const
+ V_ASN1_UNIVERSAL               = $00;
+ V_ASN1_APPLICATION             = $40;
+ V_ASN1_CONTEXT_SPECIFIC        = $80;
+ V_ASN1_PRIVATE                 = $c0;
+ V_ASN1_CONSTRUCTED         = $20;
+ V_ASN1_PRIMITIVE_TAG       = $1f;
+ V_ASN1_PRIMATIVE_TAG       = $1f;
+ V_ASN1_APP_CHOOSE      = -2;
+ V_ASN1_OTHER           = -3;
+ V_ASN1_ANY             = -4;
+ V_ASN1_NEG         = $100;
+ V_ASN1_UNDEF                = -1;
+ V_ASN1_EOC                  = 0;
+ V_ASN1_BOOLEAN              = 1;
+ V_ASN1_INTEGER              = 2;
+ V_ASN1_NEG_INTEGER          = (2  or  V_ASN1_NEG);
+ V_ASN1_BIT_STRING           = 3;
+ V_ASN1_OCTET_STRING         = 4;
+ V_ASN1_NULL                 = 5;
+ V_ASN1_OBJECT               = 6;
+ V_ASN1_OBJECT_DESCRIPTOR    = 7;
+ V_ASN1_EXTERNAL             = 8;
+ V_ASN1_REAL                 = 9;
+ V_ASN1_ENUMERATED           = 10;
+ V_ASN1_NEG_ENUMERATED       = (10  or  V_ASN1_NEG);
+ V_ASN1_UTF8STRING           = 12;
+ V_ASN1_SEQUENCE             = 16;
+ V_ASN1_SET                  = 17;
+ V_ASN1_NUMERICSTRING        = 18;
+ V_ASN1_PRINTABLESTRING      = 19;
+ V_ASN1_T61STRING            = 20;
+ V_ASN1_TELETEXSTRING        = 20;
+ V_ASN1_VIDEOTEXSTRING       = 21;
+ V_ASN1_IA5STRING            = 22;
+ V_ASN1_UTCTIME              = 23;
+ V_ASN1_GENERALIZEDTIME      = 24;
+ V_ASN1_GRAPHICSTRING        = 25;
+ V_ASN1_ISO64STRING          = 26;
+ V_ASN1_VISIBLESTRING        = 26;
+ V_ASN1_GENERALSTRING        = 27;
+ V_ASN1_UNIVERSALSTRING      = 28;
+ V_ASN1_BMPSTRING            = 30;
+ B_ASN1_NUMERICSTRING   = $0001;
+ B_ASN1_PRINTABLESTRING = $0002;
+ B_ASN1_T61STRING       = $0004;
+ B_ASN1_TELETEXSTRING   = $0004;
+ B_ASN1_VIDEOTEXSTRING  = $0008;
+ B_ASN1_IA5STRING       = $0010;
+ B_ASN1_GRAPHICSTRING   = $0020;
+ B_ASN1_ISO64STRING     = $0040;
+ B_ASN1_VISIBLESTRING   = $0040;
+ B_ASN1_GENERALSTRING   = $0080;
+ B_ASN1_UNIVERSALSTRING = $0100;
+ B_ASN1_OCTET_STRING    = $0200;
+ B_ASN1_BIT_STRING      = $0400;
+ B_ASN1_BMPSTRING       = $0800;
+ B_ASN1_UNKNOWN         = $1000;
+ B_ASN1_UTF8STRING      = $2000;
+ B_ASN1_UTCTIME         = $4000;
+ B_ASN1_GENERALIZEDTIME = $8000;
+ B_ASN1_SEQUENCE        = $10000;
+ MBSTRING_FLAG      = $1000;
+ MBSTRING_UTF8      = (MBSTRING_FLAG);
+ MBSTRING_ASC       = (MBSTRING_FLAG or 1);
+ MBSTRING_BMP       = (MBSTRING_FLAG or 2);
+ MBSTRING_UNIV      = (MBSTRING_FLAG or 4);
+ SMIME_OLDMIME      = $400;
+ SMIME_CRLFEOL      = $800;
+ SMIME_STREAM       = $1000;
+ ASN1_OBJECT_FLAG_DYNAMIC         = $01;
+ ASN1_OBJECT_FLAG_CRITICAL        = $02;
+ ASN1_OBJECT_FLAG_DYNAMIC_STRINGS = $04;
+ ASN1_OBJECT_FLAG_DYNAMIC_DATA    = $08;
+ ASN1_STRING_FLAG_BITS_LEFT       = $08;
+ ASN1_STRING_FLAG_NDEF            = $010;
+ ASN1_STRING_FLAG_CONT            = $020;
+ ASN1_STRING_FLAG_MSTRING         = $040 ;
+ ASN1_LONG_UNDEF    = $7fffffff;
+ STABLE_FLAGS_MALLOC    = $01;
+ STABLE_NO_MASK         = $02;
+ DIRSTRING_TYPE         = (B_ASN1_PRINTABLESTRING or B_ASN1_T61STRING or B_ASN1_BMPSTRING or B_ASN1_UTF8STRING);
+ PKCS9STRING_TYPE       = (DIRSTRING_TYPE or B_ASN1_IA5STRING);
+
+ ub_name                    = 32768;
+ ub_common_name             = 64;
+ ub_locality_name           = 128;
+ ub_state_name              = 128;
+ ub_organization_name       = 64;
+ ub_organization_unit_name  = 64;
+ ub_title                   = 64;
+ ub_email_address           = 128;
+
+ ASN1_STRFLGS_ESC_2253      = 1;
+ ASN1_STRFLGS_ESC_CTRL      = 2;
+ ASN1_STRFLGS_ESC_MSB       = 4;
+ ASN1_STRFLGS_ESC_QUOTE     = 8;
+ CHARTYPE_PRINTABLESTRING   = $10;
+ CHARTYPE_FIRST_ESC_2253        = $20;
+ CHARTYPE_LAST_ESC_2253     = $40;
+ ASN1_STRFLGS_UTF8_CONVERT  = $10;
+ ASN1_STRFLGS_IGNORE_TYPE   = $20;
+ ASN1_STRFLGS_DUMP_ALL      = $80;
+ ASN1_STRFLGS_DUMP_UNKNOWN  = $100;
+ ASN1_STRFLGS_DUMP_DER      = $200;
+ ASN1_STRFLGS_RFC2253   = (ASN1_STRFLGS_ESC_2253  or  ASN1_STRFLGS_ESC_CTRL  or  ASN1_STRFLGS_ESC_MSB  or  ASN1_STRFLGS_UTF8_CONVERT  or  ASN1_STRFLGS_DUMP_UNKNOWN  or  ASN1_STRFLGS_DUMP_DER);
+ ASN1_PCTX_FLAGS_SHOW_ABSENT            = $001  ;
+ ASN1_PCTX_FLAGS_SHOW_SEQUENCE          = $002;
+ ASN1_PCTX_FLAGS_SHOW_SSOF              = $004;
+ ASN1_PCTX_FLAGS_SHOW_TYPE              = $008;
+ ASN1_PCTX_FLAGS_NO_ANY_TYPE            = $010;
+ ASN1_PCTX_FLAGS_NO_MSTRING_TYPE        = $020;
+ ASN1_PCTX_FLAGS_NO_FIELD_NAME          = $040;
+ ASN1_PCTX_FLAGS_SHOW_FIELD_STRUCT_NAME = $080;
+ ASN1_PCTX_FLAGS_NO_STRUCT_NAME         = $100;
+ ASN1_F_A2D_ASN1_OBJECT                      = 100;
+ ASN1_F_A2I_ASN1_ENUMERATED                  = 101;
+ ASN1_F_A2I_ASN1_INTEGER                     = 102;
+ ASN1_F_A2I_ASN1_STRING                      = 103;
+ ASN1_F_APPEND_EXP                           = 176;
+ ASN1_F_ASN1_BIT_STRING_SET_BIT              = 183;
+ ASN1_F_ASN1_CB                              = 177;
+ ASN1_F_ASN1_CHECK_TLEN                      = 104;
+ ASN1_F_ASN1_COLLATE_PRIMITIVE               = 105;
+ ASN1_F_ASN1_COLLECT                         = 106;
+ ASN1_F_ASN1_D2I_EX_PRIMITIVE                = 108;
+ ASN1_F_ASN1_D2I_FP                          = 109;
+ ASN1_F_ASN1_D2I_READ_BIO                    = 107;
+ ASN1_F_ASN1_DIGEST                          = 184;
+ ASN1_F_ASN1_DO_ADB                          = 110;
+ ASN1_F_ASN1_DUP                             = 111;
+ ASN1_F_ASN1_ENUMERATED_SET                  = 112;
+ ASN1_F_ASN1_ENUMERATED_TO_BN                = 113;
+ ASN1_F_ASN1_EX_C2I                          = 204;
+ ASN1_F_ASN1_FIND_END                        = 190;
+ ASN1_F_ASN1_GENERALIZEDTIME_ADJ             = 216;
+ ASN1_F_ASN1_GENERALIZEDTIME_SET             = 185;
+ ASN1_F_ASN1_GENERATE_V3                     = 178;
+ ASN1_F_ASN1_GET_OBJECT                      = 114;
+ ASN1_F_ASN1_HEADER_NEW                      = 115;
+ ASN1_F_ASN1_I2D_BIO                         = 116;
+ ASN1_F_ASN1_I2D_FP                          = 117;
+ ASN1_F_ASN1_INTEGER_SET                     = 118;
+ ASN1_F_ASN1_INTEGER_TO_BN                   = 119;
+ ASN1_F_ASN1_ITEM_D2I_FP                     = 206;
+ ASN1_F_ASN1_ITEM_DUP                        = 191;
+ ASN1_F_ASN1_ITEM_EX_COMBINE_NEW             = 121;
+ ASN1_F_ASN1_ITEM_EX_D2I                     = 120;
+ ASN1_F_ASN1_ITEM_I2D_BIO                    = 192;
+ ASN1_F_ASN1_ITEM_I2D_FP                     = 193;
+ ASN1_F_ASN1_ITEM_PACK                       = 198;
+ ASN1_F_ASN1_ITEM_SIGN                       = 195;
+ ASN1_F_ASN1_ITEM_SIGN_CTX                   = 220;
+ ASN1_F_ASN1_ITEM_UNPACK                     = 199;
+ ASN1_F_ASN1_ITEM_VERIFY                     = 197;
+ ASN1_F_ASN1_MBSTRING_NCOPY                  = 122;
+ ASN1_F_ASN1_OBJECT_NEW                      = 123;
+ ASN1_F_ASN1_OUTPUT_DATA                     = 214;
+ ASN1_F_ASN1_PACK_STRING                     = 124;
+ ASN1_F_ASN1_PCTX_NEW                        = 205;
+ ASN1_F_ASN1_PKCS5_PBE_SET                   = 125;
+ ASN1_F_ASN1_SEQ_PACK                        = 126;
+ ASN1_F_ASN1_SEQ_UNPACK                      = 127;
+ ASN1_F_ASN1_SIGN                            = 128;
+ ASN1_F_ASN1_STR2TYPE                        = 179;
+ ASN1_F_ASN1_STRING_SET                      = 186;
+ ASN1_F_ASN1_STRING_TABLE_ADD                = 129;
+ ASN1_F_ASN1_STRING_TYPE_NEW                 = 130;
+ ASN1_F_ASN1_TEMPLATE_EX_D2I                 = 132;
+ ASN1_F_ASN1_TEMPLATE_NEW                    = 133;
+ ASN1_F_ASN1_TEMPLATE_NOEXP_D2I              = 131;
+ ASN1_F_ASN1_TIME_ADJ                        = 217;
+ ASN1_F_ASN1_TIME_SET                        = 175;
+ ASN1_F_ASN1_TYPE_GET_INT_OCTETSTRING        = 134;
+ ASN1_F_ASN1_TYPE_GET_OCTETSTRING            = 135;
+ ASN1_F_ASN1_UNPACK_STRING                   = 136;
+ ASN1_F_ASN1_UTCTIME_ADJ                     = 218;
+ ASN1_F_ASN1_UTCTIME_SET                     = 187;
+ ASN1_F_ASN1_VERIFY                          = 137;
+ ASN1_F_B64_READ_ASN1                        = 209;
+ ASN1_F_B64_WRITE_ASN1                       = 210;
+ ASN1_F_BIO_NEW_NDEF                         = 208;
+ ASN1_F_BITSTR_CB                            = 180;
+ ASN1_F_BN_TO_ASN1_ENUMERATED                = 138;
+ ASN1_F_BN_TO_ASN1_INTEGER                   = 139;
+ ASN1_F_C2I_ASN1_BIT_STRING                  = 189;
+ ASN1_F_C2I_ASN1_INTEGER                     = 194;
+ ASN1_F_C2I_ASN1_OBJECT                      = 196;
+ ASN1_F_COLLECT_DATA                         = 140;
+ ASN1_F_D2I_ASN1_BIT_STRING                  = 141;
+ ASN1_F_D2I_ASN1_BOOLEAN                     = 142;
+ ASN1_F_D2I_ASN1_BYTES                       = 143;
+ ASN1_F_D2I_ASN1_GENERALIZEDTIME             = 144;
+ ASN1_F_D2I_ASN1_HEADER                      = 145;
+ ASN1_F_D2I_ASN1_INTEGER                     = 146;
+ ASN1_F_D2I_ASN1_OBJECT                      = 147;
+ ASN1_F_D2I_ASN1_SET                         = 148;
+ ASN1_F_D2I_ASN1_TYPE_BYTES                  = 149;
+ ASN1_F_D2I_ASN1_UINTEGER                    = 150;
+ ASN1_F_D2I_ASN1_UTCTIME                     = 151;
+ ASN1_F_D2I_AUTOPRIVATEKEY                   = 207;
+ ASN1_F_D2I_NETSCAPE_RSA                     = 152;
+ ASN1_F_D2I_NETSCAPE_RSA_2                   = 153;
+ ASN1_F_D2I_PRIVATEKEY                       = 154;
+ ASN1_F_D2I_PUBLICKEY                        = 155;
+ ASN1_F_D2I_RSA_NET                          = 200;
+ ASN1_F_D2I_RSA_NET_2                        = 201;
+ ASN1_F_D2I_X509                             = 156;
+ ASN1_F_D2I_X509_CINF                        = 157;
+ ASN1_F_D2I_X509_PKEY                        = 159;
+ ASN1_F_I2D_ASN1_BIO_STREAM                  = 211;
+ ASN1_F_I2D_ASN1_SET                         = 188;
+ ASN1_F_I2D_ASN1_TIME                        = 160;
+ ASN1_F_I2D_DSA_PUBKEY                       = 161;
+ ASN1_F_I2D_EC_PUBKEY                        = 181;
+ ASN1_F_I2D_PRIVATEKEY                       = 163;
+ ASN1_F_I2D_PUBLICKEY                        = 164;
+ ASN1_F_I2D_RSA_NET                          = 162;
+ ASN1_F_I2D_RSA_PUBKEY                       = 165;
+ ASN1_F_LONG_C2I                             = 166;
+ ASN1_F_OID_MODULE_INIT                      = 174;
+ ASN1_F_PARSE_TAGGING                        = 182;
+ ASN1_F_PKCS5_PBE2_SET_IV                    = 167;
+ ASN1_F_PKCS5_PBE_SET                        = 202;
+ ASN1_F_PKCS5_PBE_SET0_ALGOR                 = 215;
+ ASN1_F_PKCS5_PBKDF2_SET                     = 219;
+ ASN1_F_SMIME_READ_ASN1                      = 212;
+ ASN1_F_SMIME_TEXT                           = 213;
+ ASN1_F_X509_CINF_NEW                        = 168;
+ ASN1_F_X509_CRL_ADD0_REVOKED                = 169;
+ ASN1_F_X509_INFO_NEW                        = 170;
+ ASN1_F_X509_NAME_ENCODE                     = 203;
+ ASN1_F_X509_NAME_EX_D2I                     = 158;
+ ASN1_F_X509_NAME_EX_NEW                     = 171;
+ ASN1_F_X509_NEW                             = 172;
+ ASN1_F_X509_PKEY_NEW                        = 173;
+//* Reason codes. */
+ ASN1_R_ADDING_OBJECT                                       = 171;
+ ASN1_R_ASN1_PARSE_ERROR                                    = 203;
+ ASN1_R_ASN1_SIG_PARSE_ERROR                                = 204;
+ ASN1_R_AUX_ERROR                                           = 100;
+ ASN1_R_BAD_CLASS                                           = 101;
+ ASN1_R_BAD_OBJECT_HEADER                                   = 102;
+ ASN1_R_BAD_PASSWORD_READ                                   = 103;
+ ASN1_R_BAD_TAG                                             = 104;
+ ASN1_R_BMPSTRING_IS_WRONG_LENGTH                           = 214;
+ ASN1_R_BN_LIB                                              = 105;
+ ASN1_R_BOOLEAN_IS_WRONG_LENGTH                             = 106;
+ ASN1_R_BUFFER_TOO_SMALL                                    = 107;
+ ASN1_R_CIPHER_HAS_NO_OBJECT_IDENTIFIER                     = 108;
+ ASN1_R_CONTEXT_NOT_INITIALISED                             = 217;
+ ASN1_R_DATA_IS_WRONG                                       = 109;
+ ASN1_R_DECODE_ERROR                                        = 110;
+ ASN1_R_DECODING_ERROR                                      = 111;
+ ASN1_R_DEPTH_EXCEEDED                                      = 174;
+ ASN1_R_DIGEST_AND_KEY_TYPE_NOT_SUPPORTED                   = 198;
+ ASN1_R_ENCODE_ERROR                                        = 112;
+ ASN1_R_ERROR_GETTING_TIME                                  = 173;
+ ASN1_R_ERROR_LOADING_SECTION                               = 172;
+ ASN1_R_ERROR_PARSING_SET_ELEMENT                           = 113;
+ ASN1_R_ERROR_SETTING_CIPHER_PARAMS                         = 114;
+ ASN1_R_EXPECTING_AN_INTEGER                                = 115;
+ ASN1_R_EXPECTING_AN_OBJECT                                 = 116;
+ ASN1_R_EXPECTING_A_BOOLEAN                                 = 117;
+ ASN1_R_EXPECTING_A_TIME                                    = 118;
+ ASN1_R_EXPLICIT_LENGTH_MISMATCH                            = 119;
+ ASN1_R_EXPLICIT_TAG_NOT_CONSTRUCTED                        = 120;
+ ASN1_R_FIELD_MISSING                                       = 121;
+ ASN1_R_FIRST_NUM_TOO_LARGE                                 = 122;
+ ASN1_R_HEADER_TOO_LONG                                     = 123;
+ ASN1_R_ILLEGAL_BITSTRING_FORMAT                            = 175;
+ ASN1_R_ILLEGAL_BOOLEAN                                     = 176;
+ ASN1_R_ILLEGAL_CHARACTERS                                  = 124;
+ ASN1_R_ILLEGAL_FORMAT                                      = 177;
+ ASN1_R_ILLEGAL_HEX                                         = 178;
+ ASN1_R_ILLEGAL_IMPLICIT_TAG                                = 179;
+ ASN1_R_ILLEGAL_INTEGER                                     = 180;
+ ASN1_R_ILLEGAL_NESTED_TAGGING                              = 181;
+ ASN1_R_ILLEGAL_NULL                                        = 125;
+ ASN1_R_ILLEGAL_NULL_VALUE                                  = 182;
+ ASN1_R_ILLEGAL_OBJECT                                      = 183;
+ ASN1_R_ILLEGAL_OPTIONAL_ANY                                = 126;
+ ASN1_R_ILLEGAL_OPTIONS_ON_ITEM_TEMPLATE                    = 170;
+ ASN1_R_ILLEGAL_TAGGED_ANY                                  = 127;
+ ASN1_R_ILLEGAL_TIME_VALUE                                  = 184;
+ ASN1_R_INTEGER_NOT_ASCII_FORMAT                            = 185;
+ ASN1_R_INTEGER_TOO_LARGE_FOR_LONG                          = 128;
+ ASN1_R_INVALID_BMPSTRING_LENGTH                            = 129;
+ ASN1_R_INVALID_DIGIT                                       = 130;
+ ASN1_R_INVALID_MIME_TYPE                                   = 205;
+ ASN1_R_INVALID_MODIFIER                                    = 186;
+ ASN1_R_INVALID_NUMBER                                      = 187;
+ ASN1_R_INVALID_OBJECT_ENCODING                             = 216;
+ ASN1_R_INVALID_SEPARATOR                                   = 131;
+ ASN1_R_INVALID_TIME_FORMAT                                 = 132;
+ ASN1_R_INVALID_UNIVERSALSTRING_LENGTH                      = 133;
+ ASN1_R_INVALID_UTF8STRING                                  = 134;
+ ASN1_R_IV_TOO_LARGE                                        = 135;
+ ASN1_R_LENGTH_ERROR                                        = 136;
+ ASN1_R_LIST_ERROR                                          = 188;
+ ASN1_R_MIME_NO_CONTENT_TYPE                                = 206;
+ ASN1_R_MIME_PARSE_ERROR                                    = 207;
+ ASN1_R_MIME_SIG_PARSE_ERROR                                = 208;
+ ASN1_R_MISSING_EOC                                         = 137;
+ ASN1_R_MISSING_SECOND_NUMBER                               = 138;
+ ASN1_R_MISSING_VALUE                                       = 189;
+ ASN1_R_MSTRING_NOT_UNIVERSAL                               = 139;
+ ASN1_R_MSTRING_WRONG_TAG                                   = 140;
+ ASN1_R_NESTED_ASN1_STRING                                  = 197;
+ ASN1_R_NON_HEX_CHARACTERS                                  = 141;
+ ASN1_R_NOT_ASCII_FORMAT                                    = 190;
+ ASN1_R_NOT_ENOUGH_DATA                                     = 142;
+ ASN1_R_NO_CONTENT_TYPE                                     = 209;
+ ASN1_R_NO_DEFAULT_DIGEST                                   = 201;
+ ASN1_R_NO_MATCHING_CHOICE_TYPE                             = 143;
+ ASN1_R_NO_MULTIPART_BODY_FAILURE                           = 210;
+ ASN1_R_NO_MULTIPART_BOUNDARY                               = 211;
+ ASN1_R_NO_SIG_CONTENT_TYPE                                 = 212;
+ ASN1_R_NULL_IS_WRONG_LENGTH                                = 144;
+ ASN1_R_OBJECT_NOT_ASCII_FORMAT                             = 191;
+ ASN1_R_ODD_NUMBER_OF_CHARS                                 = 145;
+ ASN1_R_PRIVATE_KEY_HEADER_MISSING                          = 146;
+ ASN1_R_SECOND_NUMBER_TOO_LARGE                             = 147;
+ ASN1_R_SEQUENCE_LENGTH_MISMATCH                            = 148;
+ ASN1_R_SEQUENCE_NOT_CONSTRUCTED                            = 149;
+ ASN1_R_SEQUENCE_OR_SET_NEEDS_CONFIG                        = 192;
+ ASN1_R_SHORT_LINE                                          = 150;
+ ASN1_R_SIG_INVALID_MIME_TYPE                               = 213;
+ ASN1_R_STREAMING_NOT_SUPPORTED                             = 202;
+ ASN1_R_STRING_TOO_LONG                                     = 151;
+ ASN1_R_STRING_TOO_SHORT                                    = 152;
+ ASN1_R_TAG_VALUE_TOO_HIGH                                  = 153;
+ ASN1_R_THE_ASN1_OBJECT_IDENTIFIER_IS_NOT_KNOWN_FOR_THIS_MD = 154;
+ ASN1_R_TIME_NOT_ASCII_FORMAT                               = 193;
+ ASN1_R_TOO_LONG                                            = 155;
+ ASN1_R_TYPE_NOT_CONSTRUCTED                                = 156;
+ ASN1_R_UNABLE_TO_DECODE_RSA_KEY                            = 157;
+ ASN1_R_UNABLE_TO_DECODE_RSA_PRIVATE_KEY                    = 158;
+ ASN1_R_UNEXPECTED_EOC                                      = 159;
+ ASN1_R_UNIVERSALSTRING_IS_WRONG_LENGTH                     = 215;
+ ASN1_R_UNKNOWN_FORMAT                                      = 160;
+ ASN1_R_UNKNOWN_MESSAGE_DIGEST_ALGORITHM                    = 161;
+ ASN1_R_UNKNOWN_OBJECT_TYPE                                 = 162;
+ ASN1_R_UNKNOWN_PUBLIC_KEY_TYPE                             = 163;
+ ASN1_R_UNKNOWN_SIGNATURE_ALGORITHM                         = 199;
+ ASN1_R_UNKNOWN_TAG                                         = 194;
+ ASN1_R_UNKOWN_FORMAT                                       = 195;
+ ASN1_R_UNSUPPORTED_ANY_DEFINED_BY_TYPE                     = 164;
+ ASN1_R_UNSUPPORTED_CIPHER                                  = 165;
+ ASN1_R_UNSUPPORTED_ENCRYPTION_ALGORITHM                    = 166;
+ ASN1_R_UNSUPPORTED_PUBLIC_KEY_TYPE                         = 167;
+ ASN1_R_UNSUPPORTED_TYPE                                    = 196;
+ ASN1_R_WRONG_PUBLIC_KEY_TYPE                               = 200;
+ ASN1_R_WRONG_TAG                                           = 168;
+ ASN1_R_WRONG_TYPE                                          = 169;
+
+
+ ASN1_ITYPE_PRIMITIVE       = $0;
+ ASN1_ITYPE_SEQUENCE        = $1;
+ ASN1_ITYPE_CHOICE          = $2;
+ ASN1_ITYPE_COMPAT          = $3;
+ ASN1_ITYPE_EXTERN          = $4;
+ ASN1_ITYPE_MSTRING         = $5;
+ ASN1_ITYPE_NDEF_SEQUENCE   = $6;
+
+
+{$ENDREGION}
+{$REGION 'BIO'}
+const
+  BIO_F_ACPT_STATE            = 100;
+  BIO_F_BIO_ACCEPT            = 101;
+  BIO_F_BIO_BER_GET_HEADER    = 102;
+  BIO_F_BIO_CALLBACK_CTRL     = 131;
+  BIO_F_BIO_CTRL              = 103;
+  BIO_F_BIO_GETHOSTBYNAME     = 120;
+  BIO_F_BIO_GETS              = 104;
+  BIO_F_BIO_GET_ACCEPT_SOCKET = 105;
+  BIO_F_BIO_GET_HOST_IP       = 106;
+  BIO_F_BIO_GET_PORT          = 107;
+  BIO_F_BIO_MAKE_PAIR         = 121;
+  BIO_F_BIO_NEW               = 108;
+  BIO_F_BIO_NEW_FILE          = 109;
+  BIO_F_BIO_NEW_MEM_BUF       = 126;
+  BIO_F_BIO_NREAD             = 123;
+  BIO_F_BIO_NREAD0            = 124;
+  BIO_F_BIO_NWRITE            = 125;
+  BIO_F_BIO_NWRITE0           = 122;
+  BIO_F_BIO_PUTS              = 110;
+  BIO_F_BIO_READ              = 111;
+  BIO_F_BIO_SOCK_INIT         = 112;
+  BIO_F_BIO_WRITE             = 113;
+  BIO_F_BUFFER_CTRL           = 114;
+  BIO_F_CONN_CTRL             = 127;
+  BIO_F_CONN_STATE            = 115;
+  BIO_F_DGRAM_SCTP_READ       = 132;
+  BIO_F_FILE_CTRL             = 116;
+  BIO_F_FILE_READ             = 130;
+  BIO_F_LINEBUFFER_CTRL       = 129;
+  BIO_F_MEM_READ              = 128;
+  BIO_F_MEM_WRITE             = 117;
+  BIO_F_SSL_NEW               = 118;
+  BIO_F_WSASTARTUP            = 119;
+  BIO_R_ACCEPT_ERROR                          = 100;
+  BIO_R_BAD_FOPEN_MODE                        = 101;
+  BIO_R_BAD_HOSTNAME_LOOKUP                   = 102;
+  BIO_R_BROKEN_PIPE                           = 124;
+  BIO_R_CONNECT_ERROR                         = 103;
+  BIO_R_EOF_ON_MEMORY_BIO                     = 127;
+  BIO_R_ERROR_SETTING_NBIO                    = 104;
+  BIO_R_ERROR_SETTING_NBIO_ON_ACCEPTED_SOCKET = 105;
+  BIO_R_ERROR_SETTING_NBIO_ON_ACCEPT_SOCKET   = 106;
+  BIO_R_GETHOSTBYNAME_ADDR_IS_NOT_AF_INET     = 107;
+  BIO_R_INVALID_ARGUMENT                      = 125;
+  BIO_R_INVALID_IP_ADDRESS                    = 108;
+  BIO_R_IN_USE                                = 123;
+  BIO_R_KEEPALIVE                             = 109;
+  BIO_R_NBIO_CONNECT_ERROR                    = 110;
+  BIO_R_NO_ACCEPT_PORT_SPECIFIED              = 111;
+  BIO_R_NO_HOSTNAME_SPECIFIED                 = 112;
+  BIO_R_NO_PORT_DEFINED                       = 113;
+  BIO_R_NO_PORT_SPECIFIED                     = 114;
+  BIO_R_NO_SUCH_FILE                          = 128;
+  BIO_R_NULL_PARAMETER                        = 115;
+  BIO_R_TAG_MISMATCH                          = 116;
+  BIO_R_UNABLE_TO_BIND_SOCKET                 = 117;
+  BIO_R_UNABLE_TO_CREATE_SOCKET               = 118;
+  BIO_R_UNABLE_TO_LISTEN_SOCKET               = 119;
+  BIO_R_UNINITIALIZED                         = 120;
+  BIO_R_UNSUPPORTED_METHOD                    = 121;
+  BIO_R_WRITE_TO_READ_ONLY_BIO                = 126;
+  BIO_R_WSASTARTUP                            = 122;
+  BIO_BIND_NORMAL                 = 0;
+  BIO_BIND_REUSEADDR              = 2;
+  BIO_BIND_REUSEADDR_IF_UNUSED    = 1;
+  BIO_CB_CTRL                     = $06;
+  BIO_CB_FREE                     = $01;
+  BIO_CB_GETS                     = $05;
+  BIO_CB_PUTS                     = $04;
+  BIO_CB_READ                     = $02;
+  BIO_CB_RETURN                   = $80;
+  BIO_CB_WRITE                    = $03;
+  BIO_CLOSE                       = $01;
+  BIO_CONN_S_BEFORE               = 1;
+  BIO_CONN_S_BLOCKED_CONNECT      = 7;
+  BIO_CONN_S_CONNECT              = 5;
+  BIO_CONN_S_CREATE_SOCKET        = 4;
+  BIO_CONN_S_GET_IP               = 2;
+  BIO_CONN_S_GET_PORT             = 3;
+  BIO_CONN_S_NBIO                 = 8;
+  BIO_CONN_S_OK                   = 6;
+  BIO_CTRL_DUP                    = 12;
+  BIO_CTRL_EOF                    = 2;
+  BIO_CTRL_FLUSH                  = 11;
+  BIO_CTRL_GET                    = 5;
+  BIO_CTRL_GET_CALLBACK           = 15;
+  BIO_CTRL_GET_CLOSE              = 8;
+  BIO_CTRL_INFO                   = 3;
+  BIO_CTRL_PENDING                = 10;
+  BIO_CTRL_POP                    = 7;
+  BIO_CTRL_PUSH                   = 6;
+  BIO_CTRL_RESET                  = 1;
+  BIO_CTRL_SET                    = 4;
+  BIO_CTRL_SET_CALLBACK           = 14;
+  BIO_CTRL_SET_CLOSE              = 9;
+  BIO_CTRL_SET_FILENAME           = 30;
+  BIO_CTRL_DGRAM_CONNECT          = 31;
+  BIO_CTRL_DGRAM_SET_CONNECTED    = 32;
+  BIO_CTRL_DGRAM_SET_RECV_TIMEOUT = 33; //* setsockopt, essentially */
+  BIO_CTRL_DGRAM_GET_RECV_TIMEOUT = 34; //* getsockopt, essentially */
+  BIO_CTRL_DGRAM_SET_SEND_TIMEOUT = 35; //* setsockopt, essentially */
+  BIO_CTRL_DGRAM_GET_SEND_TIMEOUT = 36; //* getsockopt, essentially */
+  BIO_CTRL_DGRAM_GET_RECV_TIMER_EXP = 37; //* flag whether the last */
+  BIO_CTRL_DGRAM_GET_SEND_TIMER_EXP = 38; //* I/O operation tiemd out */
+  BIO_CTRL_DGRAM_MTU_DISCOVER       = 39; //* set DF bit on egress packets */
+  BIO_CTRL_DGRAM_QUERY_MTU          = 40; //* as kernel for current MTU */
+  BIO_CTRL_DGRAM_GET_MTU            = 41; //* get cached value for MTU */
+  BIO_CTRL_DGRAM_SET_MTU            = 42; //* set cached value for
+  BIO_CTRL_DGRAM_MTU_EXCEEDED       = 43; //* check whether the MTU
+  BIO_CTRL_DGRAM_GET_PEER           = 46;
+  BIO_CTRL_DGRAM_SET_PEER           = 44; //* Destination for the data */
+  BIO_CTRL_DGRAM_SET_NEXT_TIMEOUT   = 45; //* Next DTLS handshake timeout to
+  BIO_CTRL_WPENDING                 = 13;
+  BIO_C_DESTROY_BIO_PAIR            = 139;
+  BIO_C_DO_STATE_MACHINE            = 101;
+  BIO_C_FILE_SEEK                   = 128;
+  BIO_C_FILE_TELL                   = 133;
+  BIO_C_GET_ACCEPT                  = 124;
+  BIO_C_GET_BIND_MODE               = 132;
+  BIO_C_GET_BUFF_NUM_LINES          = 116;
+  BIO_C_GET_BUF_MEM_PTR             = 115;
+  BIO_C_GET_CIPHER_CTX              = 129;
+  BIO_C_GET_CIPHER_STATUS           = 113;
+  BIO_C_GET_CONNECT                 = 123;
+  BIO_C_GET_FD                      = 105;
+  BIO_C_GET_FILE_PTR                = 107;
+  BIO_C_GET_MD                      = 112;
+  BIO_C_GET_MD_CTX                  = 120;
+  BIO_C_GET_PROXY_PARAM             = 121;
+  BIO_C_GET_READ_REQUEST            = 141;
+  BIO_C_GET_SOCKS                   = 134;
+  BIO_C_GET_SSL                     = 110;
+  BIO_C_GET_SSL_NUM_RENEGOTIATES    = 126;
+  BIO_C_GET_WRITE_BUF_SIZE          = 137;
+  BIO_C_GET_WRITE_GUARANTEE         = 140;
+  BIO_C_MAKE_BIO_PAIR               = 138;
+  BIO_C_SET_ACCEPT                  = 118;
+  BIO_C_SET_BIND_MODE               = 131;
+  BIO_C_SET_BUFF_READ_DATA          = 122;
+  BIO_C_SET_BUFF_SIZE               = 117;
+  BIO_C_SET_BUF_MEM                 = 114;
+  BIO_C_SET_BUF_MEM_EOF_RETURN      = 130;
+  BIO_C_SET_CONNECT                 = 100;
+  BIO_C_SET_FD                      = 104;
+  BIO_C_SET_FILENAME                = 108;
+  BIO_C_SET_FILE_PTR                = 106;
+  BIO_C_SET_MD                      = 111;
+  BIO_C_SET_NBIO                    = 102;
+  BIO_C_SET_PROXY_PARAM             = 103;
+  BIO_C_SET_SOCKS                   = 135;
+  BIO_C_SET_SSL                     = 109;
+  BIO_C_SET_SSL_RENEGOTIATE_BYTES   = 125;
+  BIO_C_SET_SSL_RENEGOTIATE_TIMEOUT = 127;
+  BIO_C_SET_WRITE_BUF_SIZE          = 136;
+  BIO_C_SHUTDOWN_WR                 = 142;
+  BIO_C_SSL_MODE                    = 119;
+  BIO_FLAGS_BASE64_NO_NL            = $100;
+  BIO_FLAGS_IO_SPECIAL              = $04;
+  BIO_FLAGS_READ                    = $01;
+  BIO_FLAGS_WRITE                   = $02;
+  BIO_FLAGS_RWS                     = BIO_FLAGS_READ or
+                          BIO_FLAGS_WRITE or
+                          BIO_FLAGS_IO_SPECIAL;
+  BIO_FLAGS_SHOULD_RETRY            = $08;
+  BIO_FP_APPEND                     = $08;
+  BIO_FP_READ                       = $02;
+  BIO_FP_TEXT                       = $10;
+  BIO_FP_WRITE                      = $04;
+  BIO_GHBN_CTRL_CACHE_SIZE          = 3;
+  BIO_GHBN_CTRL_FLUSH               = 5;
+  BIO_GHBN_CTRL_GET_ENTRY           = 4;
+  BIO_GHBN_CTRL_HITS                = 1;
+  BIO_GHBN_CTRL_MISSES              = 2;
+  BIO_NOCLOSE                       = $00;
+  BIO_RR_CONNECT                    = $02;
+  BIO_RR_SSL_X509_LOOKUP            = $01;
+  BIO_TYPE_ACCEPT                   = 13 or $0400 or $0100;
+  BIO_TYPE_BASE64                   = 11 or $0200;
+  BIO_TYPE_BER                      = 18 or $0200;
+  BIO_TYPE_BIO                      = 19 or $0400;
+  BIO_TYPE_BUFFER                   = 9 or $0200;
+  BIO_TYPE_CIPHER                   = 10 or $0200;
+  BIO_TYPE_CONNECT                  = 12 or $0400 or $0100;
+  BIO_TYPE_DESCRIPTOR               = $0100;
+  BIO_TYPE_FD                       = 4 or $0400 or $0100;
+  BIO_TYPE_FILE                     = 2 or $0400;
+  BIO_TYPE_FILTER                   = $0200;
+  BIO_TYPE_MD                       = 8 or $0200;
+  BIO_TYPE_MEM                      = 1 or $0400;
+  BIO_TYPE_NBIO_TEST                = 16 or $0200;
+  BIO_TYPE_NONE                     = 0;
+  BIO_TYPE_NULL                     = 6 or $0400;
+  BIO_TYPE_NULL_FILTER              = 17 or $0200;
+  BIO_TYPE_PROXY_CLIENT             = 14 or $0200;
+  BIO_TYPE_PROXY_SERVER             = 15 or $0200;
+  BIO_TYPE_SOCKET                   = 5 or $0400 or $0100;
+  BIO_TYPE_SOURCE_SINK              = $0400;
+  BIO_TYPE_SSL                      = 7 or $0200;
+  BIO_TYPE_LINEBUFFER               = 20 or $0200;
+  BIO_TYPE_DGRAM                    = 21 or $0400 or $0100;
+  BIO_TYPE_COMP                     = 23 or $0200;
+{$ENDREGION}
+{$REGION 'BN'}
+ BN_BITS        = 128;
+ BN_BYTES       = 8;
+ BN_BITS2       = 64;
+ BN_BITS4       = 32;
+ BN_MASK2       = $ffffffffffffffff;
+ BN_MASK2l      = $ffffffff;
+ BN_MASK2h      = $ffffffff00000000;
+ BN_MASK2h1     = $ffffffff80000000;
+ BN_TBIT        = $8000000000000000;
+ BN_DEC_CONV    = 10000000000000000000;
+ BN_DEC_FMT1    = '%lu';
+ BN_DEC_FMT2    = '%019lu';
+ BN_DEC_NUM     = 19;
+ BN_HEX_FMT1    = '%lX';
+ BN_HEX_FMT2    = '%016lX';
+ BN_CTX_POOL_SIZE   = 16;
+ BN_CTX_START_FRAMES    = 32;
+ BN_F_BNRAND                                 = 127;
+ BN_F_BN_BLINDING_CONVERT_EX                 = 100;
+ BN_F_BN_BLINDING_CREATE_PARAM               = 128;
+ BN_F_BN_BLINDING_INVERT_EX                  = 101;
+ BN_F_BN_BLINDING_NEW                        = 102;
+ BN_F_BN_BLINDING_UPDATE                     = 103;
+ BN_F_BN_BN2DEC                              = 104;
+ BN_F_BN_BN2HEX                              = 105;
+ BN_F_BN_CTX_GET                             = 116;
+ BN_F_BN_CTX_NEW                             = 106;
+ BN_F_BN_CTX_START                           = 129;
+ BN_F_BN_DIV                                 = 107;
+ BN_F_BN_DIV_NO_BRANCH                       = 138;
+ BN_F_BN_DIV_RECP                            = 130;
+ BN_F_BN_EXP                                 = 123;
+ BN_F_BN_EXPAND2                             = 108;
+ BN_F_BN_EXPAND_INTERNAL                     = 120;
+ BN_F_BN_GF2M_MOD                            = 131;
+ BN_F_BN_GF2M_MOD_EXP                        = 132;
+ BN_F_BN_GF2M_MOD_MUL                        = 133;
+ BN_F_BN_GF2M_MOD_SOLVE_QUAD                 = 134;
+ BN_F_BN_GF2M_MOD_SOLVE_QUAD_ARR             = 135;
+ BN_F_BN_GF2M_MOD_SQR                        = 136;
+ BN_F_BN_GF2M_MOD_SQRT                       = 137;
+ BN_F_BN_MOD_EXP2_MONT                       = 118;
+ BN_F_BN_MOD_EXP_MONT                        = 109;
+ BN_F_BN_MOD_EXP_MONT_CONSTTIME              = 124;
+ BN_F_BN_MOD_EXP_MONT_WORD                   = 117;
+ BN_F_BN_MOD_EXP_RECP                        = 125;
+ BN_F_BN_MOD_EXP_SIMPLE                      = 126;
+ BN_F_BN_MOD_INVERSE                         = 110;
+ BN_F_BN_MOD_INVERSE_NO_BRANCH               = 139;
+ BN_F_BN_MOD_LSHIFT_QUICK                    = 119;
+ BN_F_BN_MOD_MUL_RECIPROCAL                  = 111;
+ BN_F_BN_MOD_SQRT                            = 121;
+ BN_F_BN_MPI2BN                              = 112;
+ BN_F_BN_NEW                                 = 113;
+ BN_F_BN_RAND                                = 114;
+ BN_F_BN_RAND_RANGE                          = 122;
+ BN_F_BN_USUB                                = 115;
+
+ BN_R_ARG2_LT_ARG3                       = 100;
+ BN_R_BAD_RECIPROCAL                     = 101;
+ BN_R_BIGNUM_TOO_LONG                    = 114;
+ BN_R_CALLED_WITH_EVEN_MODULUS           = 102;
+ BN_R_DIV_BY_ZERO                        = 103;
+ BN_R_ENCODING_ERROR                     = 104;
+ BN_R_EXPAND_ON_STATIC_BIGNUM_DATA       = 105;
+ BN_R_INPUT_NOT_REDUCED                  = 110;
+ BN_R_INVALID_LENGTH                     = 106;
+ BN_R_INVALID_RANGE                      = 115;
+ BN_R_NOT_A_SQUARE                       = 111;
+ BN_R_NOT_INITIALIZED                    = 107;
+ BN_R_NO_INVERSE                         = 108;
+ BN_R_NO_SOLUTION                        = 116;
+ BN_R_P_IS_NOT_PRIME                     = 112;
+ BN_R_TOO_MANY_ITERATIONS                = 113;
+ BN_R_TOO_MANY_TEMPORARY_VARIABLES       = 109;
+
+{$ENDREGION}
+{$REGION 'BUFFER'}
+ BUF_F_BUF_MEMDUP                    = 103;
+ BUF_F_BUF_MEM_GROW                  = 100;
+ BUF_F_BUF_MEM_GROW_CLEAN            = 105;
+ BUF_F_BUF_MEM_NEW                   = 101;
+ BUF_F_BUF_STRDUP                    = 102;
+ BUF_F_BUF_STRNDUP                   = 104;
+{$ENDREGION}
+{$REGION 'CMS'}
+ CMS_SIGNERINFO_ISSUER_SERIAL   = 0;
+ CMS_SIGNERINFO_KEYIDENTIFIER   = 1;
+ CMS_RECIPINFO_TRANS        = 0;
+ CMS_RECIPINFO_AGREE        = 1;
+ CMS_RECIPINFO_KEK          = 2;
+ CMS_RECIPINFO_PASS         = 3;
+ CMS_RECIPINFO_OTHER        = 4;
+ CMS_TEXT                   = $1;
+ CMS_NOCERTS                = $2;
+ CMS_NO_CONTENT_VERIFY      = $4;
+ CMS_NO_ATTR_VERIFY         = $8;
+ CMS_NOSIGS                 = (CMS_NO_CONTENT_VERIFY or CMS_NO_ATTR_VERIFY);
+ CMS_NOINTERN               = $10;
+ CMS_NO_SIGNER_CERT_VERIFY  = $20;
+ CMS_NOVERIFY               = $20;
+ CMS_DETACHED               = $40;
+ CMS_BINARY                 = $80;
+ CMS_NOATTR                 = $100;
+ CMS_NOSMIMECAP             = $200;
+ CMS_NOOLDMIMETYPE          = $400;
+ CMS_CRLFEOL                = $800;
+ CMS_STREAM                 = $1000;
+ CMS_NOCRL                  = $2000;
+ CMS_PARTIAL                = $4000;
+ CMS_REUSE_DIGEST           = $8000;
+ CMS_USE_KEYID              = $10000;
+ CMS_DEBUG_DECRYPT          = $20000;
+ CMS_F_CHECK_CONTENT                             = 99;
+ CMS_F_CMS_ADD0_CERT                             = 164;
+ CMS_F_CMS_ADD0_RECIPIENT_KEY                    = 100;
+ CMS_F_CMS_ADD0_RECIPIENT_PASSWORD               = 165;
+ CMS_F_CMS_ADD1_RECEIPTREQUEST                   = 158;
+ CMS_F_CMS_ADD1_RECIPIENT_CERT                   = 101;
+ CMS_F_CMS_ADD1_SIGNER                           = 102;
+ CMS_F_CMS_ADD1_SIGNINGTIME                      = 103;
+ CMS_F_CMS_COMPRESS                              = 104;
+ CMS_F_CMS_COMPRESSEDDATA_CREATE                 = 105;
+ CMS_F_CMS_COMPRESSEDDATA_INIT_BIO               = 106;
+ CMS_F_CMS_COPY_CONTENT                          = 107;
+ CMS_F_CMS_COPY_MESSAGEDIGEST                    = 108;
+ CMS_F_CMS_DATA                                  = 109;
+ CMS_F_CMS_DATAFINAL                             = 110;
+ CMS_F_CMS_DATAINIT                              = 111;
+ CMS_F_CMS_DECRYPT                               = 112;
+ CMS_F_CMS_DECRYPT_SET1_KEY                      = 113;
+ CMS_F_CMS_DECRYPT_SET1_PASSWORD                 = 166;
+ CMS_F_CMS_DECRYPT_SET1_PKEY                     = 114;
+ CMS_F_CMS_DIGESTALGORITHM_FIND_CTX              = 115;
+ CMS_F_CMS_DIGESTALGORITHM_INIT_BIO              = 116;
+ CMS_F_CMS_DIGESTEDDATA_DO_FINAL                 = 117;
+ CMS_F_CMS_DIGEST_VERIFY                         = 118;
+ CMS_F_CMS_ENCODE_RECEIPT                        = 161;
+ CMS_F_CMS_ENCRYPT                               = 119;
+ CMS_F_CMS_ENCRYPTEDCONTENT_INIT_BIO             = 120;
+ CMS_F_CMS_ENCRYPTEDDATA_DECRYPT                 = 121;
+ CMS_F_CMS_ENCRYPTEDDATA_ENCRYPT                 = 122;
+ CMS_F_CMS_ENCRYPTEDDATA_SET1_KEY                = 123;
+ CMS_F_CMS_ENVELOPEDDATA_CREATE                  = 124;
+ CMS_F_CMS_ENVELOPEDDATA_INIT_BIO                = 125;
+ CMS_F_CMS_ENVELOPED_DATA_INIT                   = 126;
+ CMS_F_CMS_FINAL                                 = 127;
+ CMS_F_CMS_GET0_CERTIFICATE_CHOICES              = 128;
+ CMS_F_CMS_GET0_CONTENT                          = 129;
+ CMS_F_CMS_GET0_ECONTENT_TYPE                    = 130;
+ CMS_F_CMS_GET0_ENVELOPED                        = 131;
+ CMS_F_CMS_GET0_REVOCATION_CHOICES               = 132;
+ CMS_F_CMS_GET0_SIGNED                           = 133;
+ CMS_F_CMS_MSGSIGDIGEST_ADD1                     = 162;
+ CMS_F_CMS_RECEIPTREQUEST_CREATE0                = 159;
+ CMS_F_CMS_RECEIPT_VERIFY                        = 160;
+ CMS_F_CMS_RECIPIENTINFO_DECRYPT                 = 134;
+ CMS_F_CMS_RECIPIENTINFO_KEKRI_DECRYPT           = 135;
+ CMS_F_CMS_RECIPIENTINFO_KEKRI_ENCRYPT           = 136;
+ CMS_F_CMS_RECIPIENTINFO_KEKRI_GET0_ID           = 137;
+ CMS_F_CMS_RECIPIENTINFO_KEKRI_ID_CMP            = 138;
+ CMS_F_CMS_RECIPIENTINFO_KTRI_CERT_CMP           = 139;
+ CMS_F_CMS_RECIPIENTINFO_KTRI_DECRYPT            = 140;
+ CMS_F_CMS_RECIPIENTINFO_KTRI_ENCRYPT            = 141;
+ CMS_F_CMS_RECIPIENTINFO_KTRI_GET0_ALGS          = 142;
+ CMS_F_CMS_RECIPIENTINFO_KTRI_GET0_SIGNER_ID     = 143;
+ CMS_F_CMS_RECIPIENTINFO_PWRI_CRYPT              = 167;
+ CMS_F_CMS_RECIPIENTINFO_SET0_KEY                = 144;
+ CMS_F_CMS_RECIPIENTINFO_SET0_PASSWORD           = 168;
+ CMS_F_CMS_RECIPIENTINFO_SET0_PKEY               = 145;
+ CMS_F_CMS_SET1_SIGNERIDENTIFIER                 = 146;
+ CMS_F_CMS_SET_DETACHED                          = 147;
+ CMS_F_CMS_SIGN                                  = 148;
+ CMS_F_CMS_SIGNED_DATA_INIT                      = 149;
+ CMS_F_CMS_SIGNERINFO_CONTENT_SIGN               = 150;
+ CMS_F_CMS_SIGNERINFO_SIGN                       = 151;
+ CMS_F_CMS_SIGNERINFO_VERIFY                     = 152;
+ CMS_F_CMS_SIGNERINFO_VERIFY_CERT                = 153;
+ CMS_F_CMS_SIGNERINFO_VERIFY_CONTENT             = 154;
+ CMS_F_CMS_SIGN_RECEIPT                          = 163;
+ CMS_F_CMS_STREAM                                = 155;
+ CMS_F_CMS_UNCOMPRESS                            = 156;
+ CMS_F_CMS_VERIFY                                = 157;
+ CMS_R_ADD_SIGNER_ERROR                          = 99;
+ CMS_R_CERTIFICATE_ALREADY_PRESENT               = 175;
+ CMS_R_CERTIFICATE_HAS_NO_KEYID                  = 160;
+ CMS_R_CERTIFICATE_VERIFY_ERROR                  = 100;
+ CMS_R_CIPHER_INITIALISATION_ERROR               = 101;
+ CMS_R_CIPHER_PARAMETER_INITIALISATION_ERROR     = 102;
+ CMS_R_CMS_DATAFINAL_ERROR                       = 103;
+ CMS_R_CMS_LIB                                   = 104;
+ CMS_R_CONTENTIDENTIFIER_MISMATCH                = 170;
+ CMS_R_CONTENT_NOT_FOUND                         = 105;
+ CMS_R_CONTENT_TYPE_MISMATCH                     = 171;
+ CMS_R_CONTENT_TYPE_NOT_COMPRESSED_DATA          = 106;
+ CMS_R_CONTENT_TYPE_NOT_ENVELOPED_DATA           = 107;
+ CMS_R_CONTENT_TYPE_NOT_SIGNED_DATA              = 108;
+ CMS_R_CONTENT_VERIFY_ERROR                      = 109;
+ CMS_R_CTRL_ERROR                                = 110;
+ CMS_R_CTRL_FAILURE                              = 111;
+ CMS_R_DECRYPT_ERROR                             = 112;
+ CMS_R_DIGEST_ERROR                              = 161;
+ CMS_R_ERROR_GETTING_PUBLIC_KEY                  = 113;
+ CMS_R_ERROR_READING_MESSAGEDIGEST_ATTRIBUTE     = 114;
+ CMS_R_ERROR_SETTING_KEY                         = 115;
+ CMS_R_ERROR_SETTING_RECIPIENTINFO               = 116;
+ CMS_R_INVALID_ENCRYPTED_KEY_LENGTH              = 117;
+ CMS_R_INVALID_KEY_ENCRYPTION_PARAMETER          = 176;
+ CMS_R_INVALID_KEY_LENGTH                        = 118;
+ CMS_R_MD_BIO_INIT_ERROR                         = 119;
+ CMS_R_MESSAGEDIGEST_ATTRIBUTE_WRONG_LENGTH      = 120;
+ CMS_R_MESSAGEDIGEST_WRONG_LENGTH                = 121;
+ CMS_R_MSGSIGDIGEST_ERROR                        = 172;
+ CMS_R_MSGSIGDIGEST_VERIFICATION_FAILURE         = 162;
+ CMS_R_MSGSIGDIGEST_WRONG_LENGTH                 = 163;
+ CMS_R_NEED_ONE_SIGNER                           = 164;
+ CMS_R_NOT_A_SIGNED_RECEIPT                      = 165;
+ CMS_R_NOT_ENCRYPTED_DATA                        = 122;
+ CMS_R_NOT_KEK                                   = 123;
+ CMS_R_NOT_KEY_TRANSPORT                         = 124;
+ CMS_R_NOT_PWRI                                  = 177;
+ CMS_R_NOT_SUPPORTED_FOR_THIS_KEY_TYPE           = 125;
+ CMS_R_NO_CIPHER                                 = 126;
+ CMS_R_NO_CONTENT                                = 127;
+ CMS_R_NO_CONTENT_TYPE                           = 173;
+ CMS_R_NO_DEFAULT_DIGEST                         = 128;
+ CMS_R_NO_DIGEST_SET                             = 129;
+ CMS_R_NO_KEY                                    = 130;
+ CMS_R_NO_KEY_OR_CERT                            = 174;
+ CMS_R_NO_MATCHING_DIGEST                        = 131;
+ CMS_R_NO_MATCHING_RECIPIENT                     = 132;
+ CMS_R_NO_MATCHING_SIGNATURE                     = 166;
+ CMS_R_NO_MSGSIGDIGEST                           = 167;
+ CMS_R_NO_PASSWORD                               = 178;
+ CMS_R_NO_PRIVATE_KEY                            = 133;
+ CMS_R_NO_PUBLIC_KEY                             = 134;
+ CMS_R_NO_RECEIPT_REQUEST                        = 168;
+ CMS_R_NO_SIGNERS                                = 135;
+ CMS_R_PRIVATE_KEY_DOES_NOT_MATCH_CERTIFICATE    = 136;
+ CMS_R_RECEIPT_DECODE_ERROR                      = 169;
+ CMS_R_RECIPIENT_ERROR                           = 137;
+ CMS_R_SIGNER_CERTIFICATE_NOT_FOUND              = 138;
+ CMS_R_SIGNFINAL_ERROR                           = 139;
+ CMS_R_SMIME_TEXT_ERROR                          = 140;
+ CMS_R_STORE_INIT_ERROR                          = 141;
+ CMS_R_TYPE_NOT_COMPRESSED_DATA                  = 142;
+ CMS_R_TYPE_NOT_DATA                             = 143;
+ CMS_R_TYPE_NOT_DIGESTED_DATA                    = 144;
+ CMS_R_TYPE_NOT_ENCRYPTED_DATA                   = 145;
+ CMS_R_TYPE_NOT_ENVELOPED_DATA                   = 146;
+ CMS_R_UNABLE_TO_FINALIZE_CONTEXT                = 147;
+ CMS_R_UNKNOWN_CIPHER                            = 148;
+ CMS_R_UNKNOWN_DIGEST_ALGORIHM                   = 149;
+ CMS_R_UNKNOWN_ID                                = 150;
+ CMS_R_UNSUPPORTED_COMPRESSION_ALGORITHM         = 151;
+ CMS_R_UNSUPPORTED_CONTENT_TYPE                  = 152;
+ CMS_R_UNSUPPORTED_KEK_ALGORITHM                 = 153;
+ CMS_R_UNSUPPORTED_KEY_ENCRYPTION_ALGORITHM      = 179;
+ CMS_R_UNSUPPORTED_RECIPIENT_TYPE                = 154;
+ CMS_R_UNSUPPORTED_RECPIENTINFO_TYPE             = 155;
+ CMS_R_UNSUPPORTED_TYPE                          = 156;
+ CMS_R_UNWRAP_ERROR                              = 157;
+ CMS_R_UNWRAP_FAILURE                            = 180;
+ CMS_R_VERIFICATION_FAILURE                      = 158;
+ CMS_R_WRAP_ERROR                                = 159;
+{$ENDREGION}
+{$REGION 'DSA'}
+const
+ DSA_F_D2I_DSA_SIG                       = 110;
+ DSA_F_DO_DSA_PRINT                      = 104;
+ DSA_F_DSAPARAMS_PRINT                   = 100;
+ DSA_F_DSAPARAMS_PRINT_FP                = 101;
+ DSA_F_DSA_DO_SIGN                       = 112;
+ DSA_F_DSA_DO_VERIFY                     = 113;
+ DSA_F_DSA_GENERATE_KEY                  = 124;
+ DSA_F_DSA_GENERATE_PARAMETERS_EX        = 123;
+ DSA_F_DSA_NEW_METHOD                    = 103;
+ DSA_F_DSA_PARAM_DECODE                  = 119;
+ DSA_F_DSA_PRINT_FP                      = 105;
+ DSA_F_DSA_PRIV_DECODE                   = 115;
+ DSA_F_DSA_PRIV_ENCODE                   = 116;
+ DSA_F_DSA_PUB_DECODE                    = 117;
+ DSA_F_DSA_PUB_ENCODE                    = 118;
+ DSA_F_DSA_SIGN                          = 106;
+ DSA_F_DSA_SIGN_SETUP                    = 107;
+ DSA_F_DSA_SIG_NEW                       = 109;
+ DSA_F_DSA_SIG_PRINT                     = 125;
+ DSA_F_DSA_VERIFY                        = 108;
+ DSA_F_I2D_DSA_SIG                       = 111;
+ DSA_F_OLD_DSA_PRIV_DECODE               = 122;
+ DSA_F_PKEY_DSA_CTRL                     = 120;
+ DSA_F_PKEY_DSA_KEYGEN                   = 121;
+ DSA_F_SIG_CB                            = 114;
+
+ DSA_R_BAD_Q_VALUE                       = 102;
+ DSA_R_BN_DECODE_ERROR                   = 108;
+ DSA_R_BN_ERROR                          = 109;
+ DSA_R_DATA_TOO_LARGE_FOR_KEY_SIZE       = 100;
+ DSA_R_DECODE_ERROR                      = 104;
+ DSA_R_INVALID_DIGEST_TYPE               = 106;
+ DSA_R_MISSING_PARAMETERS                = 101;
+ DSA_R_MODULUS_TOO_LARGE                 = 103;
+ DSA_R_NEED_NEW_SETUP_VALUES             = 110;
+ DSA_R_NON_FIPS_DSA_METHOD               = 111;
+ DSA_R_NO_PARAMETERS_SET                 = 107;
+ DSA_R_PARAMETER_ENCODING_ERROR          = 105;
+{$ENDREGION}
+{$REGION 'EC'}
+const
+  POINT_CONVERSION_COMPRESSED = 2;
+  POINT_CONVERSION_UNCOMPRESSED = 4;
+  POINT_CONVERSION_HYBRID = 6;
+ EC_F_BN_TO_FELEM                                    = 224;
+ EC_F_COMPUTE_WNAF                                   = 143;
+ EC_F_D2I_ECPARAMETERS                               = 144;
+ EC_F_D2I_ECPKPARAMETERS                             = 145;
+ EC_F_D2I_ECPRIVATEKEY                               = 146;
+ EC_F_DO_EC_KEY_PRINT                                = 221;
+ EC_F_ECKEY_PARAM2TYPE                               = 223;
+ EC_F_ECKEY_PARAM_DECODE                             = 212;
+ EC_F_ECKEY_PRIV_DECODE                              = 213;
+ EC_F_ECKEY_PRIV_ENCODE                              = 214;
+ EC_F_ECKEY_PUB_DECODE                               = 215;
+ EC_F_ECKEY_PUB_ENCODE                               = 216;
+ EC_F_ECKEY_TYPE2PARAM                               = 220;
+ EC_F_ECPARAMETERS_PRINT                             = 147;
+ EC_F_ECPARAMETERS_PRINT_FP                          = 148;
+ EC_F_ECPKPARAMETERS_PRINT                           = 149;
+ EC_F_ECPKPARAMETERS_PRINT_FP                        = 150;
+ EC_F_ECP_NIST_MOD_192                               = 203;
+ EC_F_ECP_NIST_MOD_224                               = 204;
+ EC_F_ECP_NIST_MOD_256                               = 205;
+ EC_F_ECP_NIST_MOD_521                               = 206;
+ EC_F_EC_ASN1_GROUP2CURVE                            = 153;
+ EC_F_EC_ASN1_GROUP2FIELDID                          = 154;
+ EC_F_EC_ASN1_GROUP2PARAMETERS                       = 155;
+ EC_F_EC_ASN1_GROUP2PKPARAMETERS                     = 156;
+ EC_F_EC_ASN1_PARAMETERS2GROUP                       = 157;
+ EC_F_EC_ASN1_PKPARAMETERS2GROUP                     = 158;
+ EC_F_EC_EX_DATA_SET_DATA                            = 211;
+ EC_F_EC_GF2M_MONTGOMERY_POINT_MULTIPLY              = 208;
+ EC_F_EC_GF2M_SIMPLE_GROUP_CHECK_DISCRIMINANT        = 159;
+ EC_F_EC_GF2M_SIMPLE_GROUP_SET_CURVE                 = 195;
+ EC_F_EC_GF2M_SIMPLE_OCT2POINT                       = 160;
+ EC_F_EC_GF2M_SIMPLE_POINT2OCT                       = 161;
+ EC_F_EC_GF2M_SIMPLE_POINT_GET_AFFINE_COORDINATES    = 162;
+ EC_F_EC_GF2M_SIMPLE_POINT_SET_AFFINE_COORDINATES    = 163;
+ EC_F_EC_GF2M_SIMPLE_SET_COMPRESSED_COORDINATES      = 164;
+ EC_F_EC_GFP_MONT_FIELD_DECODE                       = 133;
+ EC_F_EC_GFP_MONT_FIELD_ENCODE                       = 134;
+ EC_F_EC_GFP_MONT_FIELD_MUL                          = 131;
+ EC_F_EC_GFP_MONT_FIELD_SET_TO_ONE                   = 209;
+ EC_F_EC_GFP_MONT_FIELD_SQR                          = 132;
+ EC_F_EC_GFP_MONT_GROUP_SET_CURVE                    = 189;
+ EC_F_EC_GFP_MONT_GROUP_SET_CURVE_GFP                = 135;
+ EC_F_EC_GFP_NISTP224_GROUP_SET_CURVE                = 225;
+ EC_F_EC_GFP_NISTP224_POINTS_MUL                     = 228;
+ EC_F_EC_GFP_NISTP224_POINT_GET_AFFINE_COORDINATES   = 226;
+ EC_F_EC_GFP_NISTP256_GROUP_SET_CURVE                = 230;
+ EC_F_EC_GFP_NISTP256_POINTS_MUL                     = 231;
+ EC_F_EC_GFP_NISTP256_POINT_GET_AFFINE_COORDINATES   = 232;
+ EC_F_EC_GFP_NISTP521_GROUP_SET_CURVE                = 233;
+ EC_F_EC_GFP_NISTP521_POINTS_MUL                     = 234;
+ EC_F_EC_GFP_NISTP521_POINT_GET_AFFINE_COORDINATES   = 235;
+ EC_F_EC_GFP_NIST_FIELD_MUL                          = 200;
+ EC_F_EC_GFP_NIST_FIELD_SQR                          = 201;
+ EC_F_EC_GFP_NIST_GROUP_SET_CURVE                    = 202;
+ EC_F_EC_GFP_SIMPLE_GROUP_CHECK_DISCRIMINANT         = 165;
+ EC_F_EC_GFP_SIMPLE_GROUP_SET_CURVE                  = 166;
+ EC_F_EC_GFP_SIMPLE_GROUP_SET_CURVE_GFP              = 100;
+ EC_F_EC_GFP_SIMPLE_GROUP_SET_GENERATOR              = 101;
+ EC_F_EC_GFP_SIMPLE_MAKE_AFFINE                      = 102;
+ EC_F_EC_GFP_SIMPLE_OCT2POINT                        = 103;
+ EC_F_EC_GFP_SIMPLE_POINT2OCT                        = 104;
+ EC_F_EC_GFP_SIMPLE_POINTS_MAKE_AFFINE               = 137;
+ EC_F_EC_GFP_SIMPLE_POINT_GET_AFFINE_COORDINATES     = 167;
+ EC_F_EC_GFP_SIMPLE_POINT_GET_AFFINE_COORDINATES_GFP = 105;
+ EC_F_EC_GFP_SIMPLE_POINT_SET_AFFINE_COORDINATES     = 168;
+ EC_F_EC_GFP_SIMPLE_POINT_SET_AFFINE_COORDINATES_GFP = 128;
+ EC_F_EC_GFP_SIMPLE_SET_COMPRESSED_COORDINATES       = 169;
+ EC_F_EC_GFP_SIMPLE_SET_COMPRESSED_COORDINATES_GFP   = 129;
+ EC_F_EC_GROUP_CHECK                                 = 170;
+ EC_F_EC_GROUP_CHECK_DISCRIMINANT                    = 171;
+ EC_F_EC_GROUP_COPY                                  = 106;
+ EC_F_EC_GROUP_GET0_GENERATOR                        = 139;
+ EC_F_EC_GROUP_GET_COFACTOR                          = 140;
+ EC_F_EC_GROUP_GET_CURVE_GF2M                        = 172;
+ EC_F_EC_GROUP_GET_CURVE_GFP                         = 130;
+ EC_F_EC_GROUP_GET_DEGREE                            = 173;
+ EC_F_EC_GROUP_GET_ORDER                             = 141;
+ EC_F_EC_GROUP_GET_PENTANOMIAL_BASIS                 = 193;
+ EC_F_EC_GROUP_GET_TRINOMIAL_BASIS                   = 194;
+ EC_F_EC_GROUP_NEW                                   = 108;
+ EC_F_EC_GROUP_NEW_BY_CURVE_NAME                     = 174;
+ EC_F_EC_GROUP_NEW_FROM_DATA                         = 175;
+ EC_F_EC_GROUP_PRECOMPUTE_MULT                       = 142;
+ EC_F_EC_GROUP_SET_CURVE_GF2M                        = 176;
+ EC_F_EC_GROUP_SET_CURVE_GFP                         = 109;
+ EC_F_EC_GROUP_SET_EXTRA_DATA                        = 110;
+ EC_F_EC_GROUP_SET_GENERATOR                         = 111;
+ EC_F_EC_KEY_CHECK_KEY                               = 177;
+ EC_F_EC_KEY_COPY                                    = 178;
+ EC_F_EC_KEY_GENERATE_KEY                            = 179;
+ EC_F_EC_KEY_NEW                                     = 182;
+ EC_F_EC_KEY_PRINT                                   = 180;
+ EC_F_EC_KEY_PRINT_FP                                = 181;
+ EC_F_EC_KEY_SET_PUBLIC_KEY_AFFINE_COORDINATES       = 229;
+ EC_F_EC_POINTS_MAKE_AFFINE                          = 136;
+ EC_F_EC_POINT_ADD                                   = 112;
+ EC_F_EC_POINT_CMP                                   = 113;
+ EC_F_EC_POINT_COPY                                  = 114;
+ EC_F_EC_POINT_DBL                                   = 115;
+ EC_F_EC_POINT_GET_AFFINE_COORDINATES_GF2M           = 183;
+ EC_F_EC_POINT_GET_AFFINE_COORDINATES_GFP            = 116;
+ EC_F_EC_POINT_GET_JPROJECTIVE_COORDINATES_GFP       = 117;
+ EC_F_EC_POINT_INVERT                                = 210;
+ EC_F_EC_POINT_IS_AT_INFINITY                        = 118;
+ EC_F_EC_POINT_IS_ON_CURVE                           = 119;
+ EC_F_EC_POINT_MAKE_AFFINE                           = 120;
+ EC_F_EC_POINT_MUL                                   = 184;
+ EC_F_EC_POINT_NEW                                   = 121;
+ EC_F_EC_POINT_OCT2POINT                             = 122;
+ EC_F_EC_POINT_POINT2OCT                             = 123;
+ EC_F_EC_POINT_SET_AFFINE_COORDINATES_GF2M           = 185;
+ EC_F_EC_POINT_SET_AFFINE_COORDINATES_GFP            = 124;
+ EC_F_EC_POINT_SET_COMPRESSED_COORDINATES_GF2M       = 186;
+ EC_F_EC_POINT_SET_COMPRESSED_COORDINATES_GFP        = 125;
+ EC_F_EC_POINT_SET_JPROJECTIVE_COORDINATES_GFP       = 126;
+ EC_F_EC_POINT_SET_TO_INFINITY                       = 127;
+ EC_F_EC_PRE_COMP_DUP                                = 207;
+ EC_F_EC_PRE_COMP_NEW                                = 196;
+ EC_F_EC_WNAF_MUL                                    = 187;
+ EC_F_EC_WNAF_PRECOMPUTE_MULT                        = 188;
+ EC_F_I2D_ECPARAMETERS                               = 190;
+ EC_F_I2D_ECPKPARAMETERS                             = 191;
+ EC_F_I2D_ECPRIVATEKEY                               = 192;
+ EC_F_I2O_ECPUBLICKEY                                = 151;
+ EC_F_NISTP224_PRE_COMP_NEW                          = 227;
+ EC_F_NISTP256_PRE_COMP_NEW                          = 236;
+ EC_F_NISTP521_PRE_COMP_NEW                          = 237;
+ EC_F_O2I_ECPUBLICKEY                                = 152;
+ EC_F_OLD_EC_PRIV_DECODE                             = 222;
+ EC_F_PKEY_EC_CTRL                                   = 197;
+ EC_F_PKEY_EC_CTRL_STR                               = 198;
+ EC_F_PKEY_EC_DERIVE                                 = 217;
+ EC_F_PKEY_EC_KEYGEN                                 = 199;
+ EC_F_PKEY_EC_PARAMGEN                               = 219;
+ EC_F_PKEY_EC_SIGN                                   = 218;
+ EC_R_ASN1_ERROR                             = 115;
+ EC_R_ASN1_UNKNOWN_FIELD                     = 116;
+ EC_R_BIGNUM_OUT_OF_RANGE                    = 144;
+ EC_R_BUFFER_TOO_SMALL                       = 100;
+ EC_R_COORDINATES_OUT_OF_RANGE               = 146;
+ EC_R_D2I_ECPKPARAMETERS_FAILURE             = 117;
+ EC_R_DECODE_ERROR                           = 142;
+ EC_R_DISCRIMINANT_IS_ZERO                   = 118;
+ EC_R_EC_GROUP_NEW_BY_NAME_FAILURE           = 119;
+ EC_R_FIELD_TOO_LARGE                        = 143;
+ EC_R_GF2M_NOT_SUPPORTED                     = 147;
+ EC_R_GROUP2PKPARAMETERS_FAILURE             = 120;
+ EC_R_I2D_ECPKPARAMETERS_FAILURE             = 121;
+ EC_R_INCOMPATIBLE_OBJECTS                   = 101;
+ EC_R_INVALID_ARGUMENT                       = 112;
+ EC_R_INVALID_COMPRESSED_POINT               = 110;
+ EC_R_INVALID_COMPRESSION_BIT                = 109;
+ EC_R_INVALID_CURVE                          = 141;
+ EC_R_INVALID_DIGEST_TYPE                    = 138;
+ EC_R_INVALID_ENCODING                       = 102;
+ EC_R_INVALID_FIELD                          = 103;
+ EC_R_INVALID_FORM                           = 104;
+ EC_R_INVALID_GROUP_ORDER                    = 122;
+ EC_R_INVALID_PENTANOMIAL_BASIS              = 132;
+ EC_R_INVALID_PRIVATE_KEY                    = 123;
+ EC_R_INVALID_TRINOMIAL_BASIS                = 137;
+ EC_R_KEYS_NOT_SET                           = 140;
+ EC_R_MISSING_PARAMETERS                     = 124;
+ EC_R_MISSING_PRIVATE_KEY                    = 125;
+ EC_R_NOT_A_NIST_PRIME                       = 135;
+ EC_R_NOT_A_SUPPORTED_NIST_PRIME             = 136;
+ EC_R_NOT_IMPLEMENTED                        = 126;
+ EC_R_NOT_INITIALIZED                        = 111;
+ EC_R_NO_FIELD_MOD                           = 133;
+ EC_R_NO_PARAMETERS_SET                      = 139;
+ EC_R_PASSED_NULL_PARAMETER                  = 134;
+ EC_R_PKPARAMETERS2GROUP_FAILURE             = 127;
+ EC_R_POINT_AT_INFINITY                      = 106;
+ EC_R_POINT_IS_NOT_ON_CURVE                  = 107;
+ EC_R_SLOT_FULL                              = 108;
+ EC_R_UNDEFINED_GENERATOR                    = 113;
+ EC_R_UNDEFINED_ORDER                        = 128;
+ EC_R_UNKNOWN_GROUP                          = 129;
+ EC_R_UNKNOWN_ORDER                          = 114;
+ EC_R_UNSUPPORTED_FIELD                      = 131;
+ EC_R_WRONG_CURVE_PARAMETERS                 = 145;
+ EC_R_WRONG_ORDER                            = 130;
+{$ENDREGION}
+{$REGION 'ENGINE'}
+const
+ ENGINE_F_DYNAMIC_CTRL                       = 180;
+ ENGINE_F_DYNAMIC_GET_DATA_CTX               = 181;
+ ENGINE_F_DYNAMIC_LOAD                       = 182;
+ ENGINE_F_DYNAMIC_SET_DATA_CTX               = 183;
+ ENGINE_F_ENGINE_ADD                         = 105;
+ ENGINE_F_ENGINE_BY_ID                       = 106;
+ ENGINE_F_ENGINE_CMD_IS_EXECUTABLE           = 170;
+ ENGINE_F_ENGINE_CTRL                        = 142;
+ ENGINE_F_ENGINE_CTRL_CMD                    = 178;
+ ENGINE_F_ENGINE_CTRL_CMD_STRING             = 171;
+ ENGINE_F_ENGINE_FINISH                      = 107;
+ ENGINE_F_ENGINE_FREE_UTIL                   = 108;
+ ENGINE_F_ENGINE_GET_CIPHER                  = 185;
+ ENGINE_F_ENGINE_GET_DEFAULT_TYPE            = 177;
+ ENGINE_F_ENGINE_GET_DIGEST                  = 186;
+ ENGINE_F_ENGINE_GET_NEXT                    = 115;
+ ENGINE_F_ENGINE_GET_PKEY_ASN1_METH          = 193;
+ ENGINE_F_ENGINE_GET_PKEY_METH               = 192;
+ ENGINE_F_ENGINE_GET_PREV                    = 116;
+ ENGINE_F_ENGINE_INIT                        = 119;
+ ENGINE_F_ENGINE_LIST_ADD                    = 120;
+ ENGINE_F_ENGINE_LIST_REMOVE                 = 121;
+ ENGINE_F_ENGINE_LOAD_PRIVATE_KEY            = 150;
+ ENGINE_F_ENGINE_LOAD_PUBLIC_KEY             = 151;
+ ENGINE_F_ENGINE_LOAD_SSL_CLIENT_CERT        = 194;
+ ENGINE_F_ENGINE_NEW                         = 122;
+ ENGINE_F_ENGINE_REMOVE                      = 123;
+ ENGINE_F_ENGINE_SET_DEFAULT_STRING          = 189;
+ ENGINE_F_ENGINE_SET_DEFAULT_TYPE            = 126;
+ ENGINE_F_ENGINE_SET_ID                      = 129;
+ ENGINE_F_ENGINE_SET_NAME                    = 130;
+ ENGINE_F_ENGINE_TABLE_REGISTER              = 184;
+ ENGINE_F_ENGINE_UNLOAD_KEY                  = 152;
+ ENGINE_F_ENGINE_UNLOCKED_FINISH             = 191;
+ ENGINE_F_ENGINE_UP_REF                      = 190;
+ ENGINE_F_INT_CTRL_HELPER                    = 172;
+ ENGINE_F_INT_ENGINE_CONFIGURE               = 188;
+ ENGINE_F_INT_ENGINE_MODULE_INIT             = 187;
+ ENGINE_F_LOG_MESSAGE                        = 141;
+ ENGINE_R_ALREADY_LOADED                     = 100;
+ ENGINE_R_ARGUMENT_IS_NOT_A_NUMBER           = 133;
+ ENGINE_R_CMD_NOT_EXECUTABLE                 = 134;
+ ENGINE_R_COMMAND_TAKES_INPUT                = 135;
+ ENGINE_R_COMMAND_TAKES_NO_INPUT             = 136;
+ ENGINE_R_CONFLICTING_ENGINE_ID              = 103;
+ ENGINE_R_CTRL_COMMAND_NOT_IMPLEMENTED       = 119;
+ ENGINE_R_DH_NOT_IMPLEMENTED                 = 139;
+ ENGINE_R_DSA_NOT_IMPLEMENTED                = 140;
+ ENGINE_R_DSO_FAILURE                        = 104;
+ ENGINE_R_DSO_NOT_FOUND                      = 132;
+ ENGINE_R_ENGINES_SECTION_ERROR              = 148;
+ ENGINE_R_ENGINE_CONFIGURATION_ERROR         = 102;
+ ENGINE_R_ENGINE_IS_NOT_IN_LIST              = 105;
+ ENGINE_R_ENGINE_SECTION_ERROR               = 149;
+ ENGINE_R_FAILED_LOADING_PRIVATE_KEY         = 128;
+ ENGINE_R_FAILED_LOADING_PUBLIC_KEY          = 129;
+ ENGINE_R_FINISH_FAILED                      = 106;
+ ENGINE_R_GET_HANDLE_FAILED                  = 107;
+ ENGINE_R_ID_OR_NAME_MISSING                 = 108;
+ ENGINE_R_INIT_FAILED                        = 109;
+ ENGINE_R_INTERNAL_LIST_ERROR                = 110;
+ ENGINE_R_INVALID_ARGUMENT                   = 143;
+ ENGINE_R_INVALID_CMD_NAME                   = 137;
+ ENGINE_R_INVALID_CMD_NUMBER                 = 138;
+ ENGINE_R_INVALID_INIT_VALUE                 = 151;
+ ENGINE_R_INVALID_STRING                     = 150;
+ ENGINE_R_NOT_INITIALISED                    = 117;
+ ENGINE_R_NOT_LOADED                         = 112;
+ ENGINE_R_NO_CONTROL_FUNCTION                = 120;
+ ENGINE_R_NO_INDEX                           = 144;
+ ENGINE_R_NO_LOAD_FUNCTION                   = 125;
+ ENGINE_R_NO_REFERENCE                       = 130;
+ ENGINE_R_NO_SUCH_ENGINE                     = 116;
+ ENGINE_R_NO_UNLOAD_FUNCTION                 = 126;
+ ENGINE_R_PROVIDE_PARAMETERS                 = 113;
+ ENGINE_R_RSA_NOT_IMPLEMENTED                = 141;
+ ENGINE_R_UNIMPLEMENTED_CIPHER               = 146;
+ ENGINE_R_UNIMPLEMENTED_DIGEST               = 147;
+ ENGINE_R_UNIMPLEMENTED_PUBLIC_KEY_METHOD    = 101;
+ ENGINE_R_VERSION_INCOMPATIBILITY            = 145;
+
+  ENGINE_CMD_FLAG_NUMERIC       = $0001;
+  ENGINE_CMD_FLAG_STRING      = $0002;
+  ENGINE_CMD_FLAG_NO_INPUT  = $0004;
+  ENGINE_CMD_FLAG_INTERNAL  = $0008;
+  ENGINE_CTRL_SET_LOGSTREAM     = 1;
+  ENGINE_CTRL_SET_PASSWORD_CALLBACK   = 2;
+  ENGINE_CTRL_HUP                             = 3; // Close and reinitialise any  handles/connections etc.
+  ENGINE_CTRL_SET_USER_INTERFACE      = 4; { Alternative to callback }
+  ENGINE_CTRL_SET_CALLBACK_DATA       = 5; { User-specific data, used   when calling the password
+                                                         callback and the user
+                                                         interface }
+  ENGINE_CTRL_LOAD_CONFIGURATION      = 6; { Load a configuration, given
+                                                         a string that represents a
+                                                         file name or so }
+  ENGINE_CTRL_LOAD_SECTION              = 7; { Load data from a given
+                                                         section in the already loaded
+                                             configuration }
+  ENGINE_CTRL_HAS_CTRL_FUNCTION         = 10;
+{ Returns a positive command number for the first command supported by the
+ * engine. Returns zero if no ctrl commands are supported. }
+  ENGINE_CTRL_GET_FIRST_CMD_TYPE          = 11;
+{ The 'long' argument specifies a command implemented by the engine, and the
+ * return value is the next command supported, or zero if there are no more. }
+  ENGINE_CTRL_GET_NEXT_CMD_TYPE         = 12;
+{ The 'void*' argument is a command name (cast from 'const char *'), and the
+ * return value is the command that corresponds to it. }
+  ENGINE_CTRL_GET_CMD_FROM_NAME         = 13;
+{ The next two allow a command to be converted into its corresponding string
+ * form. In each case, the 'long' argument supplies the command. In the NAME_LEN
+ * case, the return value is the length of the command name (not counting a
+ * trailing EOL). In the NAME case, the 'void*' argument must be a string buffer
+ * large enough, and it will be populated with the name of the command (WITH a
+ * trailing EOL). }
+  ENGINE_CTRL_GET_NAME_LEN_FROM_CMD   = 14;
+  ENGINE_CTRL_GET_NAME_FROM_CMD         = 15;
+{ The next two are similar but give a "short description" of a command. }
+  ENGINE_CTRL_GET_DESC_LEN_FROM_CMD   = 16;
+  ENGINE_CTRL_GET_DESC_FROM_CMD          = 17;
+{ With this command, the return value is the OR'd combination of
+ * ENGINE_CMD_FLAG_*** values that indicate what kind of input a given
+ * engine-specific ctrl command expects. }
+  ENGINE_CTRL_GET_CMD_FLAGS             = 18;
+
+{ ENGINE implementations should start the numbering of their own control
+ * commands from this value. (ie. ENGINE_CMD_BASE, ENGINE_CMD_BASE + 1, etc). }
+  ENGINE_CMD_BASE                             = 200;
+{ NB: These 2 nCipher "chil" control commands are deprecated, and their
+ * functionality is now available through ENGINE-specific control commands
+ * (exposed through the above-mentioned 'CMD'-handling). Code using these 2
+ * commands should be migrated to the more general command handling before these
+ * are removed. }
+{ Flags specific to the nCipher "chil" engine }
+  ENGINE_CTRL_CHIL_SET_FORKCHECK          = 100;
+    { Depending on the value of the (long)i argument, this sets or
+     * unsets the SimpleForkCheck flag in the CHIL API to enable or
+     * disable checking and workarounds for applications that fork().
+     }
+  ENGINE_CTRL_CHIL_NO_LOCKING             = 101;
+
+  ENGINE_METHOD_RSA               = $0001;
+  ENGINE_METHOD_DSA               = $0002;
+  ENGINE_METHOD_DH                = $0004;
+  ENGINE_METHOD_RAND                = $0008;
+  ENGINE_METHOD_ECDH                = $0010;
+  ENGINE_METHOD_ECDSA               = $0020;
+  ENGINE_METHOD_CIPHERS           = $0040;
+  ENGINE_METHOD_DIGESTS           = $0080;
+  ENGINE_METHOD_STORE               = $0100;
+  ENGINE_METHOD_PKEY_METHS      = $0200;
+  ENGINE_METHOD_PKEY_ASN1_METHS = $0400;
+  ENGINE_METHOD_ALL               = $FFFF;
+  ENGINE_METHOD_NONE                = $0000;
+
+
+{$ENDREGION}
+{$REGION 'RAND'}
+const
+ RAND_F_RAND_GET_RAND_METHOD                 = 101;
+ RAND_F_RAND_INIT_FIPS                       = 102;
+ RAND_F_SSLEAY_RAND_BYTES                    = 100;
+ RAND_R_ERROR_INITIALISING_DRBG              = 102;
+ RAND_R_ERROR_INSTANTIATING_DRBG             = 103;
+ RAND_R_NO_FIPS_RANDOM_METHOD_SET            = 101;
+ RAND_R_PRNG_NOT_SEEDED                      = 100;
+{$ENDREGION}
+{$REGION 'CAMELLIA'}
+const
+ CAMELLIA_BLOCK_SIZE                         = 16;
+ CAMELLIA_TABLE_BYTE_LEN                     = 272;
+ CAMELLIA_TABLE_WORD_LEN                     = (CAMELLIA_TABLE_BYTE_LEN div 4);
+{$ENDREGION}
+{$REGION 'DES'}
+{$ENDREGION}
+{$REGION 'EVP'}
+const
+  EVP_PKEY_NONE                              = NID_undef;
+  EVP_PKEY_RSA                               = NID_rsaEncryption;
+  EVP_PKEY_RSA2                              = NID_rsa;
+  EVP_PKEY_DSA                               = NID_dsa;
+  EVP_PKEY_DSA1                              = NID_dsa_2;
+  EVP_PKEY_DSA2                              = NID_dsaWithSHA;
+  EVP_PKEY_DSA3                              = NID_dsaWithSHA1;
+  EVP_PKEY_DSA4                              = NID_dsaWithSHA1_2;
+  EVP_PKEY_DH                                = NID_dhKeyAgreement;
+  EVP_PKEY_EC                                = NID_X9_62_id_ecPublicKey;
+  EVP_PKEY_HMAC                              = NID_hmac;
+  EVP_PKEY_CMAC                              = NID_cmac;
+  EVP_PKEY_MO_SIGN                           = $1;
+  EVP_PKEY_MO_VERIFY                         = $2;
+  EVP_PKEY_MO_ENCRYPT                        = $4;
+  EVP_PKEY_MO_DECRYPT                        = $8;
+  EVP_PKEY_OP_UNDEFINED                      = 0;
+  EVP_PKEY_OP_PARAMGEN                       = 1 shl 1;
+  EVP_PKEY_OP_KEYGEN                         = 1 shl 2;
+  EVP_PKEY_OP_SIGN                           = 1 shl 3;
+  EVP_PKEY_OP_VERIFY                         = 1 shl 4;
+  EVP_PKEY_OP_VERIFYRECOVER                  = 1 shl 5;
+  EVP_PKEY_OP_SIGNCTX                        = 1 shl 6;
+  EVP_PKEY_OP_VERIFYCTX                      = 1 shl 7;
+  EVP_PKEY_OP_ENCRYPT                        = 1 shl 8;
+  EVP_PKEY_OP_DECRYPT                        = 1 shl 9;
+  EVP_PKEY_OP_DERIVE                         = 1 shl 10;
+
+    EVP_CIPH_STREAM_CIPHER          = $0;
+    EVP_CIPH_ECB_MODE               = $1;
+    EVP_CIPH_CBC_MODE               = $2;
+    EVP_CIPH_CFB_MODE               = $3;
+    EVP_CIPH_OFB_MODE               = $4;
+    EVP_CIPH_CTR_MODE               = $5;
+    EVP_CIPH_GCM_MODE               = $6;
+    EVP_CIPH_CCM_MODE               = $7;
+    EVP_CIPH_XTS_MODE               = $10001;
+    EVP_CIPH_MODE                   = $F0007;
+    EVP_CIPH_VARIABLE_LENGTH        = $8;
+    EVP_CIPH_CUSTOM_IV              = $10;
+    EVP_CIPH_ALWAYS_CALL_INIT       = $20;
+    EVP_CIPH_CTRL_INIT              = $40;
+    EVP_CIPH_CUSTOM_KEY_LENGTH      = $80;
+    EVP_CIPH_NO_PADDING             = $100;
+    EVP_CIPH_RAND_KEY               = $200;
+    EVP_CIPH_CUSTOM_COPY            = $400;
+    EVP_CIPH_FLAG_DEFAULT_ASN1      = $1000;
+    EVP_CIPH_FLAG_LENGTH_BITS       = $2000;
+    EVP_CIPH_FLAG_FIPS              = $4000;
+    EVP_CIPH_FLAG_NON_FIPS_ALLOW    = $8000;
+    EVP_CIPH_FLAG_CUSTOM_CIPHER     = $100000;
+    EVP_CIPH_FLAG_AEAD_CIPHER       = $200000;
+
+    EVP_CTRL_INIT                       = $0;
+    EVP_CTRL_SET_KEY_LENGTH             = $1;
+    EVP_CTRL_GET_RC2_KEY_BITS           = $2;
+    EVP_CTRL_SET_RC2_KEY_BITS           = $3;
+    EVP_CTRL_GET_RC5_ROUNDS             = $4;
+    EVP_CTRL_SET_RC5_ROUNDS             = $5;
+    EVP_CTRL_RAND_KEY                   = $6;
+    EVP_CTRL_PBE_PRF_NID                = $7;
+    EVP_CTRL_COPY                       = $8;
+    EVP_CTRL_GCM_SET_IVLEN              = $9;
+    EVP_CTRL_GCM_GET_TAG                = $10;
+    EVP_CTRL_GCM_SET_TAG                = $11;
+    EVP_CTRL_GCM_SET_IV_FIXED           = $12;
+    EVP_CTRL_GCM_IV_GEN                 = $13;
+    EVP_CTRL_CCM_SET_IVLEN              = EVP_CTRL_GCM_SET_IVLEN;
+    EVP_CTRL_CCM_GET_TAG                = EVP_CTRL_GCM_GET_TAG;
+    EVP_CTRL_CCM_SET_TAG                = EVP_CTRL_GCM_SET_TAG;
+    EVP_CTRL_CCM_SET_L                  = $14;
+    EVP_CTRL_CCM_SET_MSGLEN             = $15;
+    EVP_CTRL_AEAD_TLS1_AAD              = $16;
+    EVP_CTRL_AEAD_SET_MAC_KEY           = $17;
+    EVP_CTRL_GCM_SET_IV_INV             = $18;
+    EVP_GCM_TLS_FIXED_IV_LEN            = 4;
+    EVP_GCM_TLS_EXPLICIT_IV_LEN         = 8;
+    EVP_GCM_TLS_TAG_LEN                 = 16;
+
+
+  EVP_PKEY_CTRL_MD              = 1;
+  EVP_PKEY_CTRL_PEER_KEY        = 2;
+  EVP_PKEY_CTRL_PKCS7_ENCRYPT   = 3;
+  EVP_PKEY_CTRL_PKCS7_DECRYPT   = 4;
+  EVP_PKEY_CTRL_PKCS7_SIGN      = 5;
+  EVP_PKEY_CTRL_SET_MAC_KEY     = 6;
+  EVP_PKEY_CTRL_DIGESTINIT      = 7;
+  EVP_PKEY_CTRL_SET_IV          = 8;
+  EVP_PKEY_CTRL_CMS_ENCRYPT     = 9;
+  EVP_PKEY_CTRL_CMS_DECRYPT     = 10;
+  EVP_PKEY_CTRL_CMS_SIGN        = 11;
+  EVP_PKEY_CTRL_CIPHER          = 12;
+  EVP_PKEY_ALG_CTRL             = $1000;
+  EVP_PKEY_FLAG_AUTOARGLEN      = 2;
+  EVP_PKEY_FLAG_SIGCTX_CUSTOM   = 4;
+
+  EVP_PKEY_CTRL_RSA_PADDING     = (EVP_PKEY_ALG_CTRL + 1);
+  EVP_PKEY_CTRL_RSA_PSS_SALTLEN  = (EVP_PKEY_ALG_CTRL + 2);
+
+  EVP_PKEY_CTRL_RSA_KEYGEN_BITS  = (EVP_PKEY_ALG_CTRL + 3);
+  EVP_PKEY_CTRL_RSA_KEYGEN_PUBEXP    = (EVP_PKEY_ALG_CTRL + 4);
+  EVP_PKEY_CTRL_RSA_MGF1_MD  = (EVP_PKEY_ALG_CTRL + 5);
+
+  EVP_PKEY_CTRL_GET_RSA_PADDING      = (EVP_PKEY_ALG_CTRL + 6);
+  EVP_PKEY_CTRL_GET_RSA_PSS_SALTLEN  = (EVP_PKEY_ALG_CTRL + 7);
+  EVP_PKEY_CTRL_GET_RSA_MGF1_MD      = (EVP_PKEY_ALG_CTRL + 8);
+
+
+  EVP_PKEY_CTRL_EC_PARAMGEN_CURVE_NID        = (EVP_PKEY_ALG_CTRL + 1);
+
+  EVP_PKEY_OP_TYPE_SIG   = (EVP_PKEY_OP_SIGN  or  EVP_PKEY_OP_VERIFY  or  EVP_PKEY_OP_VERIFYRECOVER  or  EVP_PKEY_OP_SIGNCTX  or  EVP_PKEY_OP_VERIFYCTX);
+  EVP_PKEY_OP_TYPE_CRYPT =  (EVP_PKEY_OP_ENCRYPT  or  EVP_PKEY_OP_DECRYPT);
+//  EVP_PKEY_OP_TYPE_NOGEN =  (EVP_PKEY_OP_SIG  or  EVP_PKEY_OP_CRYPT  or  EVP_PKEY_OP_DERIVE);
+  EVP_PKEY_OP_TYPE_GEN  = (EVP_PKEY_OP_PARAMGEN  or  EVP_PKEY_OP_KEYGEN);
+
+
+
+{$ENDREGION}
+{$REGION 'ERR'}
+const
+  ERR_NUM_ERRORS = 16;
+{$ENDREGION}
+{$REGION 'X509'}
+ X509_F_ADD_CERT_DIR                         = 100;
+ X509_F_BY_FILE_CTRL                         = 101;
+ X509_F_CHECK_POLICY                         = 145;
+ X509_F_DIR_CTRL                             = 102;
+ X509_F_GET_CERT_BY_SUBJECT                  = 103;
+ X509_F_NETSCAPE_SPKI_B64_DECODE             = 129;
+ X509_F_NETSCAPE_SPKI_B64_ENCODE             = 130;
+ X509_F_X509AT_ADD1_ATTR                     = 135;
+ X509_F_X509V3_ADD_EXT                       = 104;
+ X509_F_X509_ATTRIBUTE_CREATE_BY_NID         = 136;
+ X509_F_X509_ATTRIBUTE_CREATE_BY_OBJ         = 137;
+ X509_F_X509_ATTRIBUTE_CREATE_BY_TXT         = 140;
+ X509_F_X509_ATTRIBUTE_GET0_DATA             = 139;
+ X509_F_X509_ATTRIBUTE_SET1_DATA             = 138;
+ X509_F_X509_CHECK_PRIVATE_KEY               = 128;
+ X509_F_X509_CRL_PRINT_FP                    = 147;
+ X509_F_X509_EXTENSION_CREATE_BY_NID         = 108;
+ X509_F_X509_EXTENSION_CREATE_BY_OBJ         = 109;
+ X509_F_X509_GET_PUBKEY_PARAMETERS           = 110;
+ X509_F_X509_LOAD_CERT_CRL_FILE              = 132;
+ X509_F_X509_LOAD_CERT_FILE                  = 111;
+ X509_F_X509_LOAD_CRL_FILE                   = 112;
+ X509_F_X509_NAME_ADD_ENTRY                  = 113;
+ X509_F_X509_NAME_ENTRY_CREATE_BY_NID        = 114;
+ X509_F_X509_NAME_ENTRY_CREATE_BY_TXT        = 131;
+ X509_F_X509_NAME_ENTRY_SET_OBJECT           = 115;
+ X509_F_X509_NAME_ONELINE                    = 116;
+ X509_F_X509_NAME_PRINT                      = 117;
+ X509_F_X509_PRINT_EX_FP                     = 118;
+ X509_F_X509_PUBKEY_GET                      = 119;
+ X509_F_X509_PUBKEY_SET                      = 120;
+ X509_F_X509_REQ_CHECK_PRIVATE_KEY           = 144;
+ X509_F_X509_REQ_PRINT_EX                    = 121;
+ X509_F_X509_REQ_PRINT_FP                    = 122;
+ X509_F_X509_REQ_TO_X509                     = 123;
+ X509_F_X509_STORE_ADD_CERT                  = 124;
+ X509_F_X509_STORE_ADD_CRL                   = 125;
+ X509_F_X509_STORE_CTX_GET1_ISSUER           = 146;
+ X509_F_X509_STORE_CTX_INIT                  = 143;
+ X509_F_X509_STORE_CTX_NEW                   = 142;
+ X509_F_X509_STORE_CTX_PURPOSE_INHERIT       = 134;
+ X509_F_X509_TO_X509_REQ                     = 126;
+ X509_F_X509_TRUST_ADD                       = 133;
+ X509_F_X509_TRUST_SET                       = 141;
+ X509_F_X509_VERIFY_CERT                     = 127;
+ X509_R_BAD_X509_FILETYPE                    = 100;
+ X509_R_BASE64_DECODE_ERROR                  = 118;
+ X509_R_CANT_CHECK_DH_KEY                    = 114;
+ X509_R_CERT_ALREADY_IN_HASH_TABLE           = 101;
+ X509_R_ERR_ASN1_LIB                         = 102;
+ X509_R_INVALID_DIRECTORY                    = 113;
+ X509_R_INVALID_FIELD_NAME                   = 119;
+ X509_R_INVALID_TRUST                        = 123;
+ X509_R_KEY_TYPE_MISMATCH                    = 115;
+ X509_R_KEY_VALUES_MISMATCH                  = 116;
+ X509_R_LOADING_CERT_DIR                     = 103;
+ X509_R_LOADING_DEFAULTS                     = 104;
+ X509_R_METHOD_NOT_SUPPORTED                 = 124;
+ X509_R_NO_CERT_SET_FOR_US_TO_VERIFY         = 105;
+ X509_R_PUBLIC_KEY_DECODE_ERROR              = 125;
+ X509_R_PUBLIC_KEY_ENCODE_ERROR              = 126;
+ X509_R_SHOULD_RETRY                         = 106;
+ X509_R_UNABLE_TO_FIND_PARAMETERS_IN_CHAIN   = 107;
+ X509_R_UNABLE_TO_GET_CERTS_PUBLIC_KEY       = 108;
+ X509_R_UNKNOWN_KEY_TYPE                     = 117;
+ X509_R_UNKNOWN_NID                          = 109;
+ X509_R_UNKNOWN_PURPOSE_ID                   = 121;
+ X509_R_UNKNOWN_TRUST_ID                     = 120;
+ X509_R_UNSUPPORTED_ALGORITHM                = 111;
+ X509_R_WRONG_LOOKUP_TYPE                    = 112;
+ X509_R_WRONG_TYPE                           = 122;
+
+ X509V3_F_A2I_GENERAL_NAME                       = 164;
+ X509V3_F_ASIDENTIFIERCHOICE_CANONIZE            = 161;
+ X509V3_F_ASIDENTIFIERCHOICE_IS_CANONICAL        = 162;
+ X509V3_F_COPY_EMAIL                             = 122;
+ X509V3_F_COPY_ISSUER                            = 123;
+ X509V3_F_DO_DIRNAME                             = 144;
+ X509V3_F_DO_EXT_CONF                            = 124;
+ X509V3_F_DO_EXT_I2D                             = 135;
+ X509V3_F_DO_EXT_NCONF                           = 151;
+ X509V3_F_DO_I2V_NAME_CONSTRAINTS                = 148;
+ X509V3_F_GNAMES_FROM_SECTNAME                   = 156;
+ X509V3_F_HEX_TO_STRING                          = 111;
+ X509V3_F_I2S_ASN1_ENUMERATED                    = 121;
+ X509V3_F_I2S_ASN1_IA5STRING                     = 149;
+ X509V3_F_I2S_ASN1_INTEGER                       = 120;
+ X509V3_F_I2V_AUTHORITY_INFO_ACCESS              = 138;
+ X509V3_F_NOTICE_SECTION                         = 132;
+ X509V3_F_NREF_NOS                               = 133;
+ X509V3_F_POLICY_SECTION                         = 131;
+ X509V3_F_PROCESS_PCI_VALUE                      = 150;
+ X509V3_F_R2I_CERTPOL                            = 130;
+ X509V3_F_R2I_PCI                                = 155;
+ X509V3_F_S2I_ASN1_IA5STRING                     = 100;
+ X509V3_F_S2I_ASN1_INTEGER                       = 108;
+ X509V3_F_S2I_ASN1_OCTET_STRING                  = 112;
+ X509V3_F_S2I_ASN1_SKEY_ID                       = 114;
+ X509V3_F_S2I_SKEY_ID                            = 115;
+ X509V3_F_SET_DIST_POINT_NAME                    = 158;
+ X509V3_F_STRING_TO_HEX                          = 113;
+ X509V3_F_SXNET_ADD_ID_ASC                       = 125;
+ X509V3_F_SXNET_ADD_ID_INTEGER                   = 126;
+ X509V3_F_SXNET_ADD_ID_ULONG                     = 127;
+ X509V3_F_SXNET_GET_ID_ASC                       = 128;
+ X509V3_F_SXNET_GET_ID_ULONG                     = 129;
+ X509V3_F_V2I_ASIDENTIFIERS                      = 163;
+ X509V3_F_V2I_ASN1_BIT_STRING                    = 101;
+ X509V3_F_V2I_AUTHORITY_INFO_ACCESS              = 139;
+ X509V3_F_V2I_AUTHORITY_KEYID                    = 119;
+ X509V3_F_V2I_BASIC_CONSTRAINTS                  = 102;
+ X509V3_F_V2I_CRLD                               = 134;
+ X509V3_F_V2I_EXTENDED_KEY_USAGE                 = 103;
+ X509V3_F_V2I_GENERAL_NAMES                      = 118;
+ X509V3_F_V2I_GENERAL_NAME_EX                    = 117;
+ X509V3_F_V2I_IDP                                = 157;
+ X509V3_F_V2I_IPADDRBLOCKS                       = 159;
+ X509V3_F_V2I_ISSUER_ALT                         = 153;
+ X509V3_F_V2I_NAME_CONSTRAINTS                   = 147;
+ X509V3_F_V2I_POLICY_CONSTRAINTS                 = 146;
+ X509V3_F_V2I_POLICY_MAPPINGS                    = 145;
+ X509V3_F_V2I_SUBJECT_ALT                        = 154;
+ X509V3_F_V3_ADDR_VALIDATE_PATH_INTERNAL         = 160;
+ X509V3_F_V3_GENERIC_EXTENSION                   = 116;
+ X509V3_F_X509V3_ADD1_I2D                        = 140;
+ X509V3_F_X509V3_ADD_VALUE                       = 105;
+ X509V3_F_X509V3_EXT_ADD                         = 104;
+ X509V3_F_X509V3_EXT_ADD_ALIAS                   = 106;
+ X509V3_F_X509V3_EXT_CONF                        = 107;
+ X509V3_F_X509V3_EXT_I2D                         = 136;
+ X509V3_F_X509V3_EXT_NCONF                       = 152;
+ X509V3_F_X509V3_GET_SECTION                     = 142;
+ X509V3_F_X509V3_GET_STRING                      = 143;
+ X509V3_F_X509V3_GET_VALUE_BOOL                  = 110;
+ X509V3_F_X509V3_PARSE_LIST                      = 109;
+ X509V3_F_X509_PURPOSE_ADD                       = 137;
+ X509V3_F_X509_PURPOSE_SET                       = 141;
+
+
+ X509V3_R_BAD_IP_ADDRESS                                = 118;
+ X509V3_R_BAD_OBJECT                                    = 119;
+ X509V3_R_BN_DEC2BN_ERROR                               = 100;
+ X509V3_R_BN_TO_ASN1_INTEGER_ERROR                      = 101;
+ X509V3_R_DIRNAME_ERROR                                 = 149;
+ X509V3_R_DISTPOINT_ALREADY_SET                         = 160;
+ X509V3_R_DUPLICATE_ZONE_ID                             = 133;
+ X509V3_R_ERROR_CONVERTING_ZONE                         = 131;
+ X509V3_R_ERROR_CREATING_EXTENSION                      = 144;
+ X509V3_R_ERROR_IN_EXTENSION                            = 128;
+ X509V3_R_EXPECTED_A_SECTION_NAME                       = 137;
+ X509V3_R_EXTENSION_EXISTS                              = 145;
+ X509V3_R_EXTENSION_NAME_ERROR                          = 115;
+ X509V3_R_EXTENSION_NOT_FOUND                           = 102;
+ X509V3_R_EXTENSION_SETTING_NOT_SUPPORTED               = 103;
+ X509V3_R_EXTENSION_VALUE_ERROR                         = 116;
+ X509V3_R_ILLEGAL_EMPTY_EXTENSION                       = 151;
+ X509V3_R_ILLEGAL_HEX_DIGIT                             = 113;
+ X509V3_R_INCORRECT_POLICY_SYNTAX_TAG                   = 152;
+ X509V3_R_INVALID_MULTIPLE_RDNS                         = 161;
+ X509V3_R_INVALID_ASNUMBER                              = 162;
+ X509V3_R_INVALID_ASRANGE                               = 163;
+ X509V3_R_INVALID_BOOLEAN_STRING                        = 104;
+ X509V3_R_INVALID_EXTENSION_STRING                      = 105;
+ X509V3_R_INVALID_INHERITANCE                           = 165;
+ X509V3_R_INVALID_IPADDRESS                             = 166;
+ X509V3_R_INVALID_NAME                                  = 106;
+ X509V3_R_INVALID_NULL_ARGUMENT                         = 107;
+ X509V3_R_INVALID_NULL_NAME                             = 108;
+ X509V3_R_INVALID_NULL_VALUE                            = 109;
+ X509V3_R_INVALID_NUMBER                                = 140;
+ X509V3_R_INVALID_NUMBERS                               = 141;
+ X509V3_R_INVALID_OBJECT_IDENTIFIER                     = 110;
+ X509V3_R_INVALID_OPTION                                = 138;
+ X509V3_R_INVALID_POLICY_IDENTIFIER                     = 134;
+ X509V3_R_INVALID_PROXY_POLICY_SETTING                  = 153;
+ X509V3_R_INVALID_PURPOSE                               = 146;
+ X509V3_R_INVALID_SAFI                                  = 164;
+ X509V3_R_INVALID_SECTION                               = 135;
+ X509V3_R_INVALID_SYNTAX                                = 143;
+ X509V3_R_ISSUER_DECODE_ERROR                           = 126;
+ X509V3_R_MISSING_VALUE                                 = 124;
+ X509V3_R_NEED_ORGANIZATION_AND_NUMBERS                 = 142;
+ X509V3_R_NO_CONFIG_DATABASE                            = 136;
+ X509V3_R_NO_ISSUER_CERTIFICATE                         = 121;
+ X509V3_R_NO_ISSUER_DETAILS                             = 127;
+ X509V3_R_NO_POLICY_IDENTIFIER                          = 139;
+ X509V3_R_NO_PROXY_CERT_POLICY_LANGUAGE_DEFINED         = 154;
+ X509V3_R_NO_PUBLIC_KEY                                 = 114;
+ X509V3_R_NO_SUBJECT_DETAILS                            = 125;
+ X509V3_R_ODD_NUMBER_OF_DIGITS                          = 112;
+ X509V3_R_OPERATION_NOT_DEFINED                         = 148;
+ X509V3_R_OTHERNAME_ERROR                               = 147;
+ X509V3_R_POLICY_LANGUAGE_ALREADY_DEFINED               = 155;
+ X509V3_R_POLICY_PATH_LENGTH                            = 156;
+ X509V3_R_POLICY_PATH_LENGTH_ALREADY_DEFINED            = 157;
+ X509V3_R_POLICY_SYNTAX_NOT_CURRENTLY_SUPPORTED         = 158;
+ X509V3_R_POLICY_WHEN_PROXY_LANGUAGE_REQUIRES_NO_POLICY = 159;
+ X509V3_R_SECTION_NOT_FOUND                             = 150;
+ X509V3_R_UNABLE_TO_GET_ISSUER_DETAILS                  = 122;
+ X509V3_R_UNABLE_TO_GET_ISSUER_KEYID                    = 123;
+ X509V3_R_UNKNOWN_BIT_STRING_ARGUMENT                   = 111;
+ X509V3_R_UNKNOWN_EXTENSION                             = 129;
+ X509V3_R_UNKNOWN_EXTENSION_NAME                        = 130;
+ X509V3_R_UNKNOWN_OPTION                                = 120;
+ X509V3_R_UNSUPPORTED_OPTION                            = 117;
+ X509V3_R_UNSUPPORTED_TYPE                              = 167;
+ X509V3_R_USER_TOO_LONG                                 = 132;
+
+ X509V3_EXT_DYNAMIC     = $1;
+ X509V3_EXT_CTX_DEP     = $2;
+ X509V3_EXT_MULTILINE   = $4;
+
+ GEN_OTHERNAME  = 0;
+ GEN_EMAIL      = 1;
+ GEN_DNS        = 2;
+ GEN_X400       = 3;
+ GEN_DIRNAME    = 4;
+ GEN_EDIPARTY   = 5;
+ GEN_URI        = 6;
+ GEN_IPADD      = 7;
+ GEN_RID        = 8;
+
+ CRLDP_ALL_REASONS                  = $807f;
+ CRL_REASON_NONE                    = -1;
+ CRL_REASON_UNSPECIFIED             = 0;
+ CRL_REASON_KEY_COMPROMISE          = 1;
+ CRL_REASON_CA_COMPROMISE           = 2;
+ CRL_REASON_AFFILIATION_CHANGED     = 3;
+ CRL_REASON_SUPERSEDED              = 4;
+ CRL_REASON_CESSATION_OF_OPERATION  = 5;
+ CRL_REASON_CERTIFICATE_HOLD        = 6;
+ CRL_REASON_REMOVE_FROM_CRL         = 8;
+ CRL_REASON_PRIVILEGE_WITHDRAWN     = 9;
+ CRL_REASON_AA_COMPROMISE           = 10;
+
+ IDP_PRESENT        = $1;
+ IDP_INVALID        = $2;
+ IDP_ONLYUSER       = $4;
+ IDP_ONLYCA         = $8;
+ IDP_ONLYATTR       = $10;
+ IDP_INDIRECT       = $20;
+ IDP_REASONS        = $40;
+
+ EXFLAG_BCONS           = $1;
+ EXFLAG_KUSAGE          = $2;
+ EXFLAG_XKUSAGE         = $4;
+ EXFLAG_NSCERT          = $8;
+ EXFLAG_CA              = $10;
+ EXFLAG_SI              = $20;
+ EXFLAG_SS              = $20;
+ EXFLAG_V1              = $40;
+ EXFLAG_INVALID         = $80;
+ EXFLAG_SET             = $100;
+ EXFLAG_CRITICAL        = $200;
+ EXFLAG_PROXY           = $400;
+
+ EXFLAG_INVALID_POLICY  = $800;
+ EXFLAG_FRESHEST        = $1000;
+
+ KU_DIGITAL_SIGNATURE   = $0080;
+ KU_NON_REPUDIATION     = $0040;
+ KU_KEY_ENCIPHERMENT    = $0020;
+ KU_DATA_ENCIPHERMENT   = $0010;
+ KU_KEY_AGREEMENT       = $0008;
+ KU_KEY_CERT_SIGN       = $0004;
+ KU_CRL_SIGN            = $0002;
+ KU_ENCIPHER_ONLY       = $0001;
+ KU_DECIPHER_ONLY       = $8000;
+
+ NS_SSL_CLIENT      = $80;
+ NS_SSL_SERVER      = $40;
+ NS_SMIME           = $20;
+ NS_OBJSIGN         = $10;
+ NS_SSL_CA          = $04;
+ NS_SMIME_CA        = $02;
+ NS_OBJSIGN_CA      = $01;
+ NS_ANY_CA          = (NS_SSL_CA or NS_SMIME_CA or NS_OBJSIGN_CA);
+
+ XKU_SSL_SERVER     = $1    ;
+ XKU_SSL_CLIENT     = $2;
+ XKU_SMIME          = $4;
+ XKU_CODE_SIGN      = $8;
+ XKU_SGC            = $10;
+ XKU_OCSP_SIGN      = $20;
+ XKU_TIMESTAMP      = $40;
+ XKU_DVCS           = $80;
+
+ X509_PURPOSE_DYNAMIC       = $1;
+ X509_PURPOSE_DYNAMIC_NAME  = $2;
+
+ X509_PURPOSE_SSL_CLIENT        = 1;
+ X509_PURPOSE_SSL_SERVER        = 2;
+ X509_PURPOSE_NS_SSL_SERVER     = 3;
+ X509_PURPOSE_SMIME_SIGN        = 4;
+ X509_PURPOSE_SMIME_ENCRYPT     = 5;
+ X509_PURPOSE_CRL_SIGN          = 6;
+ X509_PURPOSE_ANY               = 7;
+ X509_PURPOSE_OCSP_HELPER       = 8;
+ X509_PURPOSE_TIMESTAMP_SIGN    = 9;
+
+ X509_PURPOSE_MIN       = 1;
+ X509_PURPOSE_MAX       = 9;
+
+ X509V3_EXT_UNKNOWN_MASK        = ($f shl 16);
+ X509V3_EXT_DEFAULT             = 0;
+ X509V3_EXT_ERROR_UNKNOWN       = (1 shl 16);
+ X509V3_EXT_PARSE_UNKNOWN       = (2 shl 16);
+ X509V3_EXT_DUMP_UNKNOWN        = (3 shl 16);
+
+ X509V3_ADD_OP_MASK             = $f;
+ X509V3_ADD_DEFAULT             = 0;
+ X509V3_ADD_APPEND              = 1;
+ X509V3_ADD_REPLACE             = 2;
+ X509V3_ADD_REPLACE_EXISTING    = 3;
+ X509V3_ADD_KEEP_EXISTING       = 4;
+ X509V3_ADD_DELETE              = 5;
+ X509V3_ADD_SILENT              = $10;
+
+{$ENDREGION}
+
+{$REGION 'PKCS7}
+
+ PKCS7_TEXT             = $1;
+ PKCS7_NOCERTS          = $2;
+ PKCS7_NOSIGS           = $4;
+ PKCS7_NOCHAIN          = $8;
+ PKCS7_NOINTERN         = $10;
+ PKCS7_NOVERIFY         = $20;
+ PKCS7_DETACHED         = $40;
+ PKCS7_BINARY           = $80;
+ PKCS7_NOATTR           = $100;
+ PKCS7_NOSMIMECAP       = $200;
+ PKCS7_NOOLDMIMETYPE    = $400;
+ PKCS7_CRLFEOL          = $800;
+ PKCS7_STREAM           = $1000;
+ PKCS7_NOCRL            = $2000;
+ PKCS7_PARTIAL          = $4000;
+ PKCS7_REUSE_DIGEST     = $8000;
+
+ SMIME_TEXT     = PKCS7_TEXT;
+ SMIME_NOCERTS  = PKCS7_NOCERTS;
+ SMIME_NOSIGS   = PKCS7_NOSIGS;
+ SMIME_NOCHAIN  = PKCS7_NOCHAIN;
+ SMIME_NOINTERN = PKCS7_NOINTERN;
+ SMIME_NOVERIFY = PKCS7_NOVERIFY;
+ SMIME_DETACHED = PKCS7_DETACHED;
+ SMIME_BINARY   = PKCS7_BINARY;
+ SMIME_NOATTR   = PKCS7_NOATTR;
+
+
+{$ENDREGION}
+
+const
+  CRYPTO_LOCK       = 1;
+  CRYPTO_UNLOCK     = 2;
+  CRYPTO_READ       = 4;
+  CRYPTO_WRITE   =  8;
+
+const
+  HMAC_MAX_MD_CBLOCK     = 128;
+
+    MD4_CBLOCK      = 64;
+    MD4_LBLOCK      = (MD4_CBLOCK div 4);
+    MD4_DIGEST_LENGTH  = 16;
+
+    MD5_CBLOCK      = 64;
+    MD5_LBLOCK      = (MD5_CBLOCK div 4);
+    MD5_DIGEST_LENGTH  = 16;
+
+    MDC2_BLOCK              = 8;
+    MDC2_DIGEST_LENGTH      = 16;
+
+    RC5_32_BLOCK        = 8;
+    RC5_32_KEY_LENGTH   = 16;
+
+    RC5_8_ROUNDS        = 8;
+    RC5_12_ROUNDS       = 12;
+    RC5_16_ROUNDS       = 16;
+
+    RIPEMD160_CBLOCK    = 64;
+    RIPEMD160_LBLOCK    = (RIPEMD160_CBLOCK div 4);
+    RIPEMD160_DIGEST_LENGTH     = 20;
+
+    PKCS5_SALT_LEN			= 8;
+
+  SSL_MAX_SSL_SESSION_ID_LENGTH		= 32;
+  SSL_MAX_SID_CTX_LENGTH			    = 32;
+
+  SSL_MAX_KRB5_PRINCIPAL_LENGTH   = 256;
+  SSL_MIN_RSA_MODULUS_LENGTH_IN_BYTES	  = (512 div 8);
+  SSL_MAX_KEY_ARG_LENGTH			= 8;
+  SSL_MAX_MASTER_KEY_LENGTH		= 48;
+
+type
+    qword = UInt64;
+    PVOID = Pointer;
+    TC_INT   = LongInt;
+    PC_INT   = ^TC_INT;
+    TC_UINT  = LongWord;
+    PC_UINT  = ^TC_UINT;
+    TC_LONG  = LongInt;
+    PC_LONG = ^TC_LONG;
+    TC_ULONG = LongWord;
+    PC_ULONG = ^TC_ULONG;
+    TC_ULONGLONG = qword;
+    TC_time_t = TC_LONG;
+    TC_USHORT = Word;
+    PC_USHORT = ^TC_USHORT;
+    TC_SIZE_T = LongWord;
+    PC_SIZE_T = ^TC_SIZE_T;
+    BN_ULONG = TC_ULONGLONG;
+    PBN_ULONG = ^BN_ULONG;
+    TC_UCHAR = AnsiChar;
+    DES_LONG= TC_ULONG;
+    PDES_LONG = ^DES_LONG;
+    point_conversion_form_t = byte;
+    TC_OSSL_SSIZE_T = TC_LONG;
+    IDEA_INT = TC_UINT;
+    MD4_LONG = TC_ULONG;
+    MD5_LONG = TC_ULONG;
+    RC2_INT = TC_UINT;
+    RC4_INT = TC_UINT;
+    RC5_32_INT = TC_ULONG;
+    RIPEMD160_LONG = TC_ULONG;
+    SHA_LONG = TC_ULONG;
+    SHA_LONG64 = UInt64;
+
+    // AMP: Needed in Delphi 2010
+    size_t = Word;
+
+type
+
+  PX509_PUBKEY = ^X509_PUBKEY;
+  PPKCS8_PRIV_KEY_INFO = ^PKCS8_PRIV_KEY_INFO;
+  PPPKCS8_PRIV_KEY_INFO = ^PPKCS8_PRIV_KEY_INFO;
+
+  PX509_ALGOR  = ^X509_ALGOR;
+  PPX509_ALGOR =^PX509_ALGOR;
+  PEVP_MD_CTX = ^EVP_MD_CTX;
+  PPEVP_MD_CTX = ^PEVP_MD_CTX;
+
+  PENGINE = ^ENGINE;
+  PPENGINE = ^PENGINE;
+  PRSA_METHOD = ^RSA_METHOD;
+  PUI_METHOD = Pointer;
+  PSSL = ^SSL;
+  PEVP_PKEY = ^EVP_PKEY;
+  PX509 = ^X509;
+  PEVP_MD = ^EVP_MD;
+  PPEVP_MD = ^PEVP_MD;
+  PEVP_CIPHER = ^EVP_CIPHER;
+  PPEVP_CIPHER = ^PEVP_CIPHER;
+  PEVP_PKEY_METHOD = ^EVP_PKEY_METHOD;
+  PPEVP_PKEY_METHOD = ^PEVP_PKEY_METHOD;
+  PEVP_PKEY_ASN1_METHOD = ^EVP_PKEY_ASN1_METHOD;
+  PPEVP_PKEY_ASN1_METHOD = ^PEVP_PKEY_ASN1_METHOD;
+
+
+  STACK = record
+    num : TC_INT;
+    data : PPAnsiChar;
+    sorted : TC_INT;
+    num_alloc : TC_INT;
+    comp : function (_para1: PPAnsiChar; _para2: PPAnsiChar):  TC_INT; cdecl;
+  end;
+
+  STACK_OF = record
+    _stack: STACK;
+  end;
+  PSTACK_OF = ^STACK_OF;
+  PSTACK    = PSTACK_OF;
+  PSTACK_OF_X509 = PSTACK_OF;
+  PSTACK_OF_X509_NAME = PSTACK_OF;
+
+  CRYPTO_EX_DATA = record
+    sk : PSTACK;
+    dummy : TC_INT;
+  end;
+
+  PENGINE_CMD_DEFN = ^ENGINE_CMD_DEFN;
+  ENGINE_CMD_DEFN = record
+    cmd_num: TC_UINT;
+    cmd_name: PAnsiChar;
+    cmd_desc: PAnsiChar;
+    cmd_flags: TC_UINT;
+  end;
+
+  ENGINE_CB_FUNC = procedure;
+  ENGINE_GEN_FUNC_PTR = function: TC_INT; cdecl;
+  ENGINE_GEN_INT_FUNC_PTR = function(engine: PENGINE): TC_INT; cdecl;
+  ENGINE_CTRL_FUNC_PTR = function(engine: PENGINE; _par1: TC_INT; _par2: TC_LONG; _par3: Pointer; f: ENGINE_CB_FUNC): TC_INT; cdecl;
+  ENGINE_LOAD_KEY_PTR = function(engine: PENGINE; buf: PAnsiChar; ui_method: PUI_METHOD; callback_data: Pointer): PEVP_PKEY; cdecl;
+  ENGINE_SSL_CLIENT_CERT_PTR = function(engine: PENGINE; ssl: PSSL; ca_dn: PSTACK_OF_X509_NAME; var cert: PX509; var key: PEVP_PKEY; var pother: PSTACK_OF_X509; ui_method: PUI_METHOD; callback_data: Pointer): TC_INT; cdecl;
+  ENGINE_CIPHERS_PTR =  function(engine: PENGINE; cipher: PPEVP_CIPHER; var par1: PC_INT; par2: TC_INT): TC_INT; cdecl;
+  ENGINE_DIGESTS_PTR = function(engine: PENGINE; md: PPEVP_MD; var par1: PC_INT; par2: TC_INT): TC_INT; cdecl;
+  ENGINE_PKEY_METHS_PTR = function(engine: PENGINE; meth: PPEVP_PKEY_METHOD; var par1: PC_INT; par2: TC_INT): TC_INT; cdecl;
+  ENGINE_PKEY_ASN1_METHS_PTR = function(engine: PENGINE; meth: PPEVP_PKEY_ASN1_METHOD; var par1: PC_INT; par2: TC_INT): TC_INT; cdecl;
+  ENGINE = record
+    id: PAnsiChar;
+    name: PAnsiChar;
+    rsa_meth: PRSA_METHOD;
+    dsa_meth: Pointer;
+    dh_meth: Pointer;
+    ecdh_meth: Pointer;
+    ecdsa_meth: Pointer;
+    rand_meth: Pointer;
+    store_meth: Pointer;
+    ciphers: ENGINE_CIPHERS_PTR;
+    digests: ENGINE_DIGESTS_PTR;
+    pkey_meths: ENGINE_PKEY_METHS_PTR;
+    pkey_asn1_meths: ENGINE_PKEY_ASN1_METHS_PTR;
+    _destroy: ENGINE_GEN_INT_FUNC_PTR;
+    init: ENGINE_GEN_INT_FUNC_PTR;
+    finish: ENGINE_GEN_INT_FUNC_PTR;
+    ctrl: ENGINE_CTRL_FUNC_PTR;
+    load_privkey: ENGINE_LOAD_KEY_PTR;
+    load_pubkey: ENGINE_LOAD_KEY_PTR;
+    load_ssl_client_cert: ENGINE_SSL_CLIENT_CERT_PTR;
+    cmd_defns: PENGINE_CMD_DEFN;
+    flags: TC_INT;
+    struct_ref: TC_INT;
+    funct_ref: TC_INT;
+    ex_data: CRYPTO_EX_DATA;
+    prev: PENGINE;
+    next: PENGINE;
+  end;
+
+  BF_LONG = TC_ULONG;
+  PBF_LONG = ^BF_LONG;
+
+  BUF_MEM = record
+    length : TC_SIZE_T;
+    data : PAnsiChar;
+    max: TC_SIZE_T;
+  end;
+  PBUF_MEM = ^BUF_MEM;
+
+  POBJ_NAME = ^OBJ_NAME;
+  OBJ_NAME = record
+      _type: TC_INT;
+    _alias: TC_INT;
+      _name: PAnsiChar;
+      _data: PAnsiChar;
+  end;
+  OBJ_NAME_CALLBACK = procedure(_par1: POBJ_NAME; arg: Pointer); cdecl;
+  OBJ_CMP_CALLBACK = function(_par1, _par2: Pointer): TC_INT; cdecl;
+
+  OBJ_hash_func = function(_par1: PAnsiChar): TC_ULONG; cdecl;
+  OBJ_cmp_func = function(_par1: PAnsiChar; _par2: PAnsiChar): TC_INT; cdecl;
+  OBJ_free_func = procedure(_par1: PAnsiChar; _par2: TC_INT; _par3: PAnsiChar); cdecl;
+
+{$REGION 'CRYPTO'}
+
+  PCRYPTO_THREADID = ^CRYPTO_THREADID;
+
+  CRYPTO_THREADID = record
+    ptr: Pointer;
+    val: TC_ULONG;
+  end;
+
+  PCRYPTO_EX_DATA = ^CRYPTO_EX_DATA;
+
+  CRYPTO_EX_new = function(parent: Pointer; ptr: Pointer; ad: PCRYPTO_EX_DATA;
+                    idx: TC_INT; argl: TC_LONG; argp: Pointer): TC_INT; cdecl;
+
+  CRYPTO_EX_free = procedure(parent: Pointer; ptr: Pointer; ad: PCRYPTO_EX_DATA;
+                    idx: TC_INT; argl: TC_LONG; argp: Pointer); cdecl;
+
+  CRYPTO_EX_dup = function(_to: PCRYPTO_EX_DATA; _from: PCRYPTO_EX_DATA; from_d: Pointer;
+                    idx: TC_INT; argl: TC_LONG; argp: Pointer): TC_INT; cdecl;
+
+  CRYPTO_mem_alloc_func = function(_size: TC_SIZE_T): Pointer; cdecl;
+  CRYPTO_mem_realloc_func = function(_mem: Pointer; _size: TC_SIZE_T): Pointer; cdecl;
+  CRYPTO_mem_free_func = procedure(_mem: pointer); cdecl;
+
+{$ENDREGION}
+
+
+{$REGION 'ERR'}
+
+  ERR_STATE = record
+    tid: CRYPTO_THREADID;
+    err_flags: array [0..ERR_NUM_ERRORS-1] of TC_INT;
+    err_buffer: array[0..ERR_NUM_ERRORS-1] of TC_ULONG;
+    err_data: array[0..ERR_NUM_ERRORS-1] of PAnsiChar;
+    err_data_flags: array[0..ERR_NUM_ERRORS-1] of TC_INT;
+    err_file: array[0..ERR_NUM_ERRORS-1] of PAnsiChar;
+    err_line: array[0..ERR_NUM_ERRORS-1] of TC_INT;
+    top,bottom: TC_INT;
+  end;
+  PERR_STATE = ^ERR_STATE;
+
+  ERR_STRING_DATA = record
+      error: TC_LONG;
+      _string: PAnsiChar;
+  end;
+  PERR_STRING_DATA = ^ERR_STRING_DATA;
+
+  ERR_CALLBACK = function(str: PAnsiChar; len: TC_SIZE_T; u: Pointer): TC_INT; cdecl;
+  PERR_FNS = Pointer;
+
+{$ENDREGION}
+
+
+{$REGION 'BN'}
+  BIGNUM = record
+    d : PBN_ULONG;
+    top : TC_INT;
+    dmax : TC_INT;
+    neg : TC_INT;
+    flags : TC_INT;
+  end;
+  PBIGNUM = ^BIGNUM;
+  PPBIGNUM = ^PBIGNUM;
+  BIGNUM_ARR = array[0..1] of BIGNUM;
+  PBIGNUM_ARR = ^BIGNUM_ARR;
+
+  PBN_GENCB = ^BN_GENCB;
+  BN_cb_1 = procedure (p1, p2 : TC_INT; p3 : Pointer); cdecl;
+  BN_cb_2 = function (p1, p2 : TC_INT; p3 : PBN_GENCB): TC_INT; cdecl;
+
+  BN_GENCB_union = record
+    case Integer of
+        0 : (cb_1 : BN_cb_1);
+        1 : (cb_2 : BN_cb_2);
+  end;
+
+  BN_GENCB = record
+    ver : TC_UINT;
+    arg : Pointer;
+    cb : BN_GENCB_union;
+  end;
+
+  BN_MONT_CTX = record
+    ri : TC_INT;
+    RR: BIGNUM;
+    N: BIGNUM;
+    Ni: BIGNUM;
+    n0 : array[0..1] of  BN_ULONG;
+    flags : TC_INT;
+  end;
+  PBN_MONT_CTX = ^BN_MONT_CTX;
+  PPBN_MONT_CTX = ^PBN_MONT_CTX;
+
+  PBN_CTX_STACK = ^BN_CTX_STACK;
+  BN_CTX_STACK = record
+    indexes: PC_UINT;
+    depth: TC_UINT;
+    size: TC_UINT;
+  end;
+  BN_STACK = BN_CTX_STACK;
+  PBN_STACK = ^BN_STACK;
+
+  PBN_POOL_ITEM = ^BN_POOL_ITEM;
+  BN_POOL_ITEM = record
+    vals: array[0..BN_CTX_POOL_SIZE-1] of BIGNUM;
+    prev: PBN_POOL_ITEM;
+    next: PBN_POOL_ITEM;
+  end;
+
+  BN_POOL = record
+    head: PBN_POOL_ITEM;
+    current: PBN_POOL_ITEM;
+    tail: PBN_POOL_ITEM;
+    used: TC_UINT;
+    size: TC_UINT;
+  end;
+
+  PBN_CTX = ^BN_CTX;
+  BN_CTX = record
+   pool: BN_POOL;
+   stack: BN_STACK;
+   used: TC_UINT;
+   err_stack: TC_INT;
+   too_many: TC_INT;
+  end;
+
+  PPBN_CTX = ^PBN_CTX;
+  PBN_BLINDING = ^BN_BLINDING;
+
+  BN_BLINDING = record
+   A: PBIGNUM;
+   Ai: PBIGNUM;
+   e: PBIGNUM;
+   _mod: PBIGNUM;
+   thread_id: TC_ULONG;
+   tid: CRYPTO_THREADID;
+   counter: TC_INT;
+   flags: TC_ULONG;
+   m_ctx: PBN_MONT_CTX;
+   bn_mod_exp: function(r: PBIGNUM; a: PBIGNUM; p: PBIGNUM; m: PBIGNUM; ctx: PBN_CTX; m_ctx: PBN_MONT_CTX): TC_INT;
+  end;
+
+  PBN_RECP_CTX = ^BN_RECP_CTX;
+  BN_RECP_CTX = record
+   N: BIGNUM;
+   Nr: BIGNUM;
+   num_bits: TC_INT;
+   shift: TC_INT;
+   flags: TC_INT;
+  end;
+
+  BN_mod_exp_cb = function(r: PBIGNUM; a: PBIGNUM; p: PBIGNUM; m: PBIGNUM; ctx: PBN_CTX; m_ctx: PBN_MONT_CTX): TC_INT; cdecl;
+{$ENDREGION}
+
+{$REGION 'CAST'}
+
+
+  CAST_LONG = TC_UINT;
+  PCAST_LONG = ^CAST_LONG;
+
+  CAST_KEY = record
+    data: array[0..31] of CAST_LONG;
+    short_key: TC_INT;
+  end;
+  PCAST_KEY = ^CAST_KEY;
+
+{$ENDREGION}
+
+{$REGION 'EC'}
+  EC_builtin_curve = record
+    nid : TC_INT;
+    comment : PAnsiChar;
+  end;
+
+  PEC_GROUP = ^EC_GROUP;
+  PPEC_GROUP = ^PEC_GROUP;
+
+  PEC_METHOD = ^EC_METHOD;
+
+  PEC_POINT = ^EC_POINT;
+  EC_POINT = record
+    meth: PEC_METHOD;
+    X: BIGNUM;
+    Y: BIGNUM;
+    Z: BIGNUM;
+    Z_is_one: TC_INT;
+  end;
+  EC_POINT_ARR = array[0..0] of EC_POINT;
+  PEC_POINT_ARR = ^EC_POINT_ARR;
+
+  EC_METHOD = record
+    flags: TC_INT;
+    field_type: TC_INT;
+    group_init: function: PEC_GROUP; cdecl;
+    group_finsh: procedure(_group: PEC_GROUP); cdecl;
+    group_clear_finish: procedure(_group: PEC_GROUP); cdecl;
+    group_copy: function(dst: PEC_GROUP; src: PEC_GROUP): TC_INT; cdecl;
+    group_set_curve: function(_gr: PEC_GROUP; p: PBIGNUM; a: PBIGNUM; b: PBIGNUM; ctx: PBN_CTX): TC_INT; cdecl;
+    group_get_curve: function(_gr: PEC_GROUP; p: PBIGNUM; a: PBIGNUM; b: PBIGNUM; ctx: PBN_CTX): TC_INT; cdecl;
+    group_get_degree: function(g: PEC_GROUP): TC_INT; cdecl;
+    group_check_discriminant: function(_gr: PEC_GROUP; ctx: PBN_CTX): TC_INT; cdecl;
+    point_init: function: PEC_POINT;
+    point_finish: procedure(p: PEC_POINT); cdecl;
+    point_finish_clear: procedure(p: PEC_POINT); cdecl;
+    point_copy: function(p1, p2: PEC_POINT): TC_INT; cdecl;
+    point_set_to_infinity: function(g: PEC_GROUP; p: PEC_POINT): TC_INT; cdecl;
+    point_set_Jprojective_coordinates_GFp: function(g: PEC_GROUP; p: PEC_POINT; x,y,z: PBIGNUM; ctx: PBN_CTX): TC_INT; cdecl;
+    point_get_Jprojective_coordinates_GFp: function(g: PEC_GROUP; p: PEC_POINT; x,y,z: PBIGNUM; ctx: PBN_CTX): TC_INT; cdecl;
+    point_set_affine_coordinates: function(g: PEC_GROUP; p: PEC_POINT; x,y,z: PBIGNUM; ctx: PBN_CTX): TC_INT; cdecl;
+    point_get_affine_coordinates: function(g: PEC_GROUP; p: PEC_POINT; x,y,z: PBIGNUM; ctx: PBN_CTX): TC_INT; cdecl;
+    point_set_compressed_coordinates: function(g: PEC_GROUP; p: PEC_POINT; x: PBIGNUM; y_bit: TC_INT; ctx: PBN_CTX): TC_INT; cdecl;
+    point2oct: function(g: PEC_GROUP; p: PEC_POINT; _form: point_conversion_form_t; buf: PAnsiChar; len: TC_SIZE_T; ctx: PBN_CTX): TC_SIZE_T; cdecl;
+    oct2point: function(g: PEC_GROUP; p: PEC_POINT; buf: PAnsiChar; len: TC_SIZE_T; ctx: PBN_CTX): TC_INT; cdecl;
+    add: function(g: PEC_GROUP; r,a,b: PEC_POINT; ctx: PBN_CTX): TC_INT; cdecl;
+    dbl: function(g: PEC_GROUP; r,a: PEC_POINT; ctx: PBN_CTX): TC_INT; cdecl;
+    invert: function(g: PEC_GROUP; p: PEC_POINT; ctx: PBN_CTX): TC_INT; cdecl;
+    is_at_infinity: function(g: PEC_GROUP; p: PEC_POINT): TC_INT; cdecl;
+    is_on_curve: function(g: PEC_GROUP; p: PEC_POINT; ctx: PBN_CTX): TC_INT; cdecl;
+    point_cmp: function(g: PEC_GROUP; a,b: PEC_POINT; ctx: PBN_CTX): TC_INT; cdecl;
+    make_affine: function(g: PEC_GROUP; p: PEC_POINT; ctx: PBN_CTX): TC_INT; cdecl;
+    points_make_affine: function(g: PEC_GROUP; num: TC_SIZE_T; p: PEC_POINT_ARR; ctx: PBN_CTX): TC_INT; cdecl;
+    mul: function(g: PEC_GROUP; r: PEC_POINT; scalar: PBIGNUM; num: TC_SIZE_T; points: PEC_POINT_ARR; scalars: PBIGNUM_ARR; ctx: PBN_CTX): TC_INT; cdecl;
+    precompute_mult: function(g: PEC_GROUP; ctx: PBN_CTX): TC_INT; cdecl;
+    have_precompute_mult: function(g: PEC_GROUP): TC_INT; cdecl;
+      field_mul: function(g: PEC_GROUP; r, a, b: PBIGNUM; ctx: PBN_CTX): TC_INT; cdecl;
+      field_sqr: function(g: PEC_GROUP; r, a: PBIGNUM; ctx: PBN_CTX): TC_INT; cdecl;
+      field_div: function(g: PEC_GROUP; r, a, b: PBIGNUM; ctx: PBN_CTX): TC_INT; cdecl;
+      field_encode: function(g: PEC_GROUP; r, a: PBIGNUM; ctx: PBN_CTX): TC_INT; cdecl;
+      field_decode: function(g: PEC_GROUP; r, a: PBIGNUM; ctx: PBN_CTX): TC_INT; cdecl;
+      field_set_to_one: function(g: PEC_GROUP; r : PBIGNUM; ctx: PBN_CTX): TC_INT; cdecl;
+  end;
+
+  PEC_EXTRA_DATA = ^EC_EXTRA_DATA;
+  PPEC_EXTRA_DATA = ^PEC_EXTRA_DATA;
+  EC_EXTRA_DATA = record
+    next: PEC_EXTRA_DATA;
+    data: Pointer;
+      dup_func: function: pointer; cdecl;
+      free_func: procedure(_par: Pointer); cdecl;
+      clear_free_func: procedure(_par: Pointer); cdecl;
+  end;
+
+
+  EC_GROUP = record
+    meth: PEC_METHOD;
+    generator: PEC_POINT;
+    order, cofactor: BIGNUM;
+    curve_name : TC_INT;
+    asn1_flag: TC_INT;
+    asn1_form: point_conversion_form_t;
+    seed: PAnsiChar;
+    seed_len: TC_SIZE_T;
+    extra_data: PEC_EXTRA_DATA;
+    field : BIGNUM;
+    poly: array[0..5] of TC_INT;
+    a, b: BIGNUM;
+    a_is_minus3: TC_INT;
+    field_data1: Pointer;
+    field_data2: Pointer;
+    field_mod_func: function(a, b, c: PBIGNUM; ctx: PBN_CTX): TC_INT; cdecl;
+  end;
+
+  EC_builtin_curves = array[0..0] of EC_builtin_curve;
+  PEC_builtin_curves = ^EC_builtin_curves;
+
+
+  PEC_KEY = ^EC_KEY;
+  PPEC_KEY = ^PEC_KEY;
+  EC_KEY = record
+    version: TC_INT;
+    group: PEC_GROUP;
+
+    pub_key: PEC_POINT;
+    priv_key:PBIGNUM;
+
+    enc_flag: TC_UINT;
+    conv_form: point_conversion_form_t;
+
+    references: TC_INT;
+    flags: TC_INT;
+    method_data: PEC_EXTRA_DATA;
+  end;
+
+  PEC_PKEY_CTX = ^EC_PKEY_CTX;
+  PPEC_PKEY_CTX = ^PEC_PKEY_CTX;
+  EC_PKEY_CTX = record
+      gen_group: PEC_GROUP;
+      md: PEVP_MD;
+  end;
+
+  EC_dup_func = function(par: Pointer): Pointer; cdecl;
+  EC_free_func = procedure(par: Pointer); cdecl;
+  EC_clear_free_func = procedure(par: Pointer); cdecl;
+
+
+{$ENDREGION}
+
+
+  PSTACK_OF_IPAddressFamily = PSTACK;
+  PSTACK_OF_ASN1_TYPE = PSTACK; // may be ^
+  PSTACK_OF_ASN1_OBJECT = PSTACK;
+  PSTACK_OF_ASN1_INTEGER = PSTACK_OF;
+  PSTACK_OF_GENERAL_NAME = PSTACK;
+  PGENERAL_NAMES = PSTACK_OF_GENERAL_NAME;
+  PPGENERAL_NAMES = ^PGENERAL_NAMES;
+  PSTACK_OF_GENERAL_NAMES = PSTACK_OF;
+  PPSTACK_OF_GENERAL_NAMES = ^PSTACK_OF_GENERAL_NAMES;
+  PSTACK_OF_ASIdOrRange = PSTACK;
+  PASIdOrRanges = PSTACK_OF_ASIdOrRange;
+  PSTACK_OF_CONF_VALUE = PSTACK;
+  PPSTACK_OF_CONF_VALUE = ^PSTACK_OF_CONF_VALUE;
+
+
+
+  BIT_STRING_BITNAME = record
+    bitnum : TC_INT;
+    lname : PAnsiChar;
+    sname : PAnsiChar;
+  end;
+  PBIT_STRING_BITNAME = ^BIT_STRING_BITNAME;
+
+
+{$REGION 'BIO'}
+  PBIO = ^BIO;
+  PPBIO = ^PBIO;
+  PBIO_METHOD = ^BIO_METHOD;
+
+  Pbio_info_cb = procedure (_para1 : PBIO; _para2 : TC_INT; _para3 : PAnsiChar;
+     _para4 : TC_INT; _para5, _para6 : TC_LONG); cdecl;
+  pbio_dump_cb = function(data: Pointer; len: TC_SIZE_T; u: pointer): TC_INT; cdecl;
+
+  BIO_METHOD = record
+    _type : TC_INT;
+    name : PAnsiChar;
+    bwrite : function(_para1 : PBIO; _para2 : PAnsiChar; _para3 : TC_Int) : TC_Int; cdecl;
+    bread : function(_para1: PBIO; _para2: PAnsiChar; _para3: TC_Int) : TC_Int; cdecl;
+    bputs : function (_para1 : PBIO; _para2 : PAnsiChar) : TC_Int; cdecl;
+    bgets : function (_para1 : PBIO; _para2 : PAnsiChar; _para3 : TC_Int) : TC_Int; cdecl;
+    ctrl : function (_para1 : PBIO; _para2 : TC_Int; _para3 : TC_LONG; _para4 : Pointer) : TC_LONG; cdecl;
+    create : function(_para1 : PBIO) : TC_Int; cdecl;
+    destroy : function (_para1 : PBIO) : TC_Int; cdecl;
+    callback_ctrl : function (_para1 : PBIO; _para2 : TC_Int; _para3 : pbio_info_cb): TC_LONG; cdecl;
+  end;
+
+  BIO = record
+    method : PBIO_METHOD;
+    callback : function (_para1 : PBIO; _para2 : TC_INT; _para3 : PAnsiChar;
+       _para4 : TC_INT; _para5, _para6 : TC_LONG) : TC_LONG cdecl;
+    cb_arg : PAnsiChar;
+    init : TC_INT;
+    shutdown : TC_INT;
+    flags : TC_INT;
+    retry_reason : TC_INT;
+    num : TC_INT;
+    ptr : Pointer;
+    next_bio : PBIO;
+    prev_bio : PBIO;
+    references : TC_INT;
+    num_read : TC_ULONG;
+    num_write : TC_ULONG;
+    ex_data : CRYPTO_EX_DATA;
+  end;
+
+{$ENDREGION}
+
+{$REGION 'ASN1'}
+  ASN1_OBJECT = record
+    sn, ln : PAnsiChar;
+    nid    : TC_INT;
+    length : TC_INT;
+    data   : PAnsiChar;
+    flags  : TC_INT; // Should we free this one
+  end;
+
+  asn1_string_st = record
+    length : TC_INT;
+    _type : TC_INT;
+    data : PAnsiChar;
+    flags : TC_LONG;
+  end;
+
+  ASN1_STRING = asn1_string_st;
+  PASN1_STRING = ^ASN1_STRING;
+  PPASN1_STRING = ^PASN1_STRING;
+  ASN1_INTEGER = ASN1_STRING;
+  PASN1_INTEGER = ^ASN1_INTEGER;
+  PPASN1_INTEGER = ^PASN1_INTEGER;
+
+  PASN1_OBJECT = ^ASN1_OBJECT;
+  PPASN1_OBJECT = ^PASN1_OBJECT;
+
+  ASN1_UNIVERSALSTRING = ASN1_STRING;
+  PASN1_UNIVERSALSTRING = ^ASN1_UNIVERSALSTRING;
+  PPASN1_UNIVERSALSTRING = ^PASN1_UNIVERSALSTRING;
+  ASN1_BMPSTRING = ASN1_STRING;
+  PASN1_BMPSTRING = ^ASN1_BMPSTRING;
+  PPASN1_BMPSTRING = ^PASN1_BMPSTRING;
+  ASN1_VISIBLESTRING = ASN1_STRING;
+  PASN1_VISIBLESTRING = ^ASN1_VISIBLESTRING;
+  PPASN1_VISIBLESTRING = ^PASN1_VISIBLESTRING;
+  ASN1_UTF8STRING = ASN1_STRING;
+  PASN1_UTF8STRING = ^ASN1_UTF8STRING;
+  PPASN1_UTF8STRING = ^PASN1_UTF8STRING;
+  ASN1_BOOLEAN = TC_INT;
+  PASN1_BOOLEAN = ^ASN1_BOOLEAN;
+  PPASN1_BOOLEAN = ^PASN1_BOOLEAN;
+  ASN1_NULL = TC_INT;
+  PASN1_NULL = ^ASN1_NULL;
+  PPASN1_NULL = ^PASN1_NULL;
+  ASN1_ENUMERATED = ASN1_STRING;
+  PASN1_ENUMERATED = ^ASN1_ENUMERATED;
+  PPASN1_ENUMERATED = ^PASN1_ENUMERATED;
+  ASN1_BIT_STRING = ASN1_STRING;
+  PASN1_BIT_STRING = ^ASN1_BIT_STRING;
+  PPASN1_BIT_STRING = ^PASN1_BIT_STRING;
+  ASN1_OCTET_STRING = ASN1_STRING;
+  PASN1_OCTET_STRING = ^ASN1_OCTET_STRING;
+  PPASN1_OCTET_STRING = ^PASN1_OCTET_STRING;
+  ASN1_PRINTABLESTRING = ASN1_STRING;
+  PASN1_PRINTABLESTRING = ^ASN1_PRINTABLESTRING;
+  PPASN1_PRINTABLESTRING = ^PASN1_PRINTABLESTRING;
+  ASN1_T61STRING = ASN1_STRING;
+  PASN1_T61STRING = ^ASN1_T61STRING;
+  PPASN1_T61STRING = ^PASN1_T61STRING;
+  ASN1_IA5STRING = ASN1_STRING;
+  PASN1_IA5STRING = ^ASN1_IA5STRING;
+  PPASN1_IA5STRING = ^PASN1_IA5STRING;
+  ASN1_GENERALSTRING = ASN1_STRING;
+  PASN1_GENERALSTRING = ^ASN1_GENERALSTRING;
+  PPASN1_GENERALSTRING = ^PASN1_GENERALSTRING;
+  ASN1_UTCTIME = ASN1_STRING;
+  PASN1_UTCTIME = ^ASN1_UTCTIME;
+  PPASN1_UTCTIME = ^PASN1_UTCTIME;
+  ASN1_GENERALIZEDTIME = ASN1_STRING;
+  PASN1_GENERALIZEDTIME = ^ASN1_GENERALIZEDTIME;
+  PPASN1_GENERALIZEDTIME = ^PASN1_GENERALIZEDTIME;
+  ASN1_TIME = ASN1_STRING;
+  PASN1_TIME = ^ASN1_TIME;
+  PPASN1_TIME = ^PASN1_TIME;
+
+  ASN1_ENCODING = record
+    enc: PAnsiChar;
+    len: TC_LONG;
+    modified: TC_INT;
+  end;
+  PASN1_ENCODING = ^ASN1_ENCODING;
+
+  ASN1_TYPE = record
+    case Integer of
+      0:  (ptr: PAnsiChar);
+      1:  (boolean: ASN1_BOOLEAN);
+      2:  (asn1_string: PASN1_STRING);
+      3:  (_object: PASN1_OBJECT);
+      4:  (integer: PASN1_INTEGER);
+      5:  (enumerated: PASN1_ENUMERATED);
+      6:  (bit_string: PASN1_BIT_STRING);
+      7:  (octet_string: PASN1_OCTET_STRING);
+      8:  (printablestring: PASN1_PRINTABLESTRING);
+      9:  (t61string: PASN1_T61STRING);
+      10: (ia5string: PASN1_IA5STRING);
+      11: (generalstring: PASN1_GENERALSTRING);
+      12: (bmpstring: PASN1_BMPSTRING);
+      13: (universalstring: PASN1_UNIVERSALSTRING);
+      14: (utctime: PASN1_UTCTIME);
+      15: (generalizedtime: PASN1_GENERALIZEDTIME);
+      16: (visiblestring: PASN1_VISIBLESTRING);
+      17: (utf8string: PASN1_UTF8STRING);
+      18: (_set: PASN1_STRING);
+      19: (sequence: PASN1_STRING);
+  end;
+  PASN1_TYPE = ^ASN1_TYPE;
+  PPASN1_TYPE = ^PASN1_TYPE;
+
+  AUTHORITY_KEYID = record
+    keyid : PASN1_OCTET_STRING;
+    issuer : PGENERAL_NAMES;
+    serial : PASN1_INTEGER;
+  end;
+  PAUTHORITY_KEYID = ^AUTHORITY_KEYID;
+  PPAUTHORITY_KEYID = ^PAUTHORITY_KEYID;
+
+  PASRange = ^ASRange;
+  ASRange = record
+    min, max: PASN1_INTEGER;
+  end;
+
+  ASIdOrRange_union = record
+  case byte of
+    0: (id: PASN1_INTEGER);
+    1: (range: PASRange);
+  end;
+
+  PASIdOrRange = ^ASIdOrRange;
+  ASIdOrRange = record
+    _type: TC_INT;
+    u: ASIdOrRange_union;
+  end;
+
+  ASIdentifierChoice_union = record
+  case byte of
+   ASIdentifierChoice_inherit : (inherit : PASN1_NULL);
+   ASIdentifierChoice_asIdsOrRanges : (asIdsOrRanges : PASIdOrRanges);
+  end;
+  ASIdentifierChoice = record
+    _type : TC_INT;
+    u : ASIdentifierChoice_union;
+  end;
+  PASIdentifierChoice = ^ASIdentifierChoice;
+
+
+  ASIdentifiers = record
+    asnum : PASIdentifierChoice;
+    rdi : PASIdentifierChoice;
+  end;
+  PASIdentifiers = ^ASIdentifiers;
+
+  PIPAddressRange = ^IPAddressRange;
+  IPAddressRange = record
+    min, max: PASN1_BIT_STRING;
+  end;
+
+  IPAddressOrRange_union = record
+  case byte of
+    0: (addressPrefix: PASN1_BIT_STRING);
+    1: (addressRange: PIPAddressRange);
+  end;
+
+  PIPAddressOrRange = ^IPAddressOrRange;
+  IPAddressOrRange = record
+    _type: TC_INT;
+    u: IPAddressOrRange_union;
+  end;
+
+  PSTACK_OF_IPAddressOrRange = PSTACK_OF;
+  PIPAddressOrRanges = PSTACK_OF_IPAddressOrRange;
+
+  IPAddressChoice_union = record
+  case byte of
+    0: (inherit: PASN1_NULL);
+    1: (addressesOrRanges: PIPAddressOrRanges);
+  end;
+
+  PIPAddressChoice = ^IPAddressChoice;
+  IPAddressChoice = record
+    _type: TC_INT;
+    u: IPAddressChoice_union;
+  end;
+
+  PIPAddressFamily = ^IPAddressFamily;
+  IPAddressFamily = record
+    addressFamily: PASN1_OCTET_STRING;
+    ipAddressChoice: PIPAddressChoice;
+  end;
+
+  PIPAddrBlocks = PSTACK_OF_IPAddressFamily;
+
+  ASN1_CTX = record
+    p : PAnsiChar;   // work char pointer
+    eos : TC_INT;    // end of sequence read for indefinite encoding
+    error : TC_INT;  // error code to use when returning an error
+    inf : TC_INT;    // constructed if 0x20; indefinite is 0x21
+    tag : TC_INT;    // tag from last 'get object'
+    xclass : TC_INT; // class from last 'get object'
+    slen : TC_LONG;  // length of last 'get object'
+    max : PAnsiChar; // largest value of p allowed
+    q : PAnsiChar;   // temporary variable
+    pp : PPAnsiChar; // variable
+    line : TC_INT;   // used in error processing
+  end;
+  PASN1_CTX = ^ASN1_CTX;
+
+  ASN1_PCTX = record
+    flags: TC_ULONG;
+    nm_flags: TC_ULONG;
+    cert_flags: TC_ULONG;
+    oid_flags: TC_ULONG;
+    str_flags: TC_ULONG;
+  end;
+
+  PASN1_PCTX = ^ASN1_PCTX;
+
+  void_func = function: pointer;
+  I2D_OF_void = function(_para1 : Pointer; var _para2 : PByte) : TC_INT cdecl;
+  D2I_OF_void = function (_para1 : PPointer;  var _para2 : PByte; _para3 : TC_LONG) : Pointer cdecl;
+
+  ASN1_METHOD = record
+    i2d : i2d_of_void;
+    d2i : i2d_of_void;
+    create : function: Pointer; cdecl;
+    destroy : procedure(ptr: Pointer); cdecl;
+  end;
+  PASN1_METHOD = ^ASN1_METHOD;
+
+  ASN1_HEADER = record
+    header : PASN1_OCTET_STRING;
+    data : Pointer;
+    meth : PASN1_METHOD;
+  end;
+  PASN1_HEADER = ^ASN1_HEADER;
+
+  ASN1_STRING_TABLE = record
+    nid : TC_INT;
+    minsize : TC_LONG;
+    maxsize : TC_LONG;
+    mask : TC_ULONG;
+    flags : TC_ULONG;
+  end;
+  PASN1_STRING_TABLE = ^ASN1_STRING_TABLE;
+  PSTACK_OF_ASN1_STRING_TABLE = PSTACK;
+
+  PASN1_ITEM = ^ASN1_ITEM;
+  PASN1_ITEM_EXP = PASN1_ITEM;
+
+  ASN1_TEMPLATE = record
+    flags : TC_ULONG;         // Various flags
+    tag : TC_LONG;            // tag; not used if no tagging
+    offset : TC_ULONG;        // Offset of this field in structure
+    field_name : PAnsiChar;   // Field name
+    item : PASN1_ITEM_EXP;    // Relevant ASN1_ITEM or ASN1_ADB
+  end;
+
+  PASN1_TEMPLATE = ^ASN1_TEMPLATE;
+  ASN1_ITEM = record
+    itype : Char;               // The item type; primitive; SEQUENCE; CHOICE or extern
+    utype : TC_LONG;            // underlying type
+    templates : PASN1_TEMPLATE; // If SEQUENCE or CHOICE this contains the contents
+    tcount : TC_LONG;           // Number of templates if SEQUENCE or CHOICE
+    funcs : Pointer;            // functions that handle this type
+    size : TC_LONG;             // Structure size (usually)
+    sname : PAnsiChar;            // Structure name
+  end;
+
+  PSTACK_OF_ASN1_ADB_TABLE = PSTACK;
+  PPSTACK_OF_ASN1_ADB_TABLE = ^PSTACK_OF_ASN1_ADB_TABLE;
+  PASN1_ADB_TABLE = ^ASN1_ADB_TABLE;
+  PASN1_ADB = ^ASN1_ADB;
+
+  ASN1_ADB = record
+    flags : TC_ULONG;                       // Various flags
+    offset : TC_ULONG;                      // Offset of selector field
+    app_items : PPSTACK_OF_ASN1_ADB_TABLE;  // Application defined items
+    tbl : PASN1_ADB_TABLE;                  // Table of possible types
+    tblcount : TC_LONG;                     // Number of entries in tbl
+    default_tt : PASN1_TEMPLATE;            // Type to use if no match
+    null_tt : PASN1_TEMPLATE;               // Type to use if selector is NULL
+  end;
+  ASN1_ADB_TABLE = record
+    flags : TC_LONG;                        // Various flags
+    offset : TC_LONG;                         // Offset of selector field
+    app_items : PPSTACK_OF_ASN1_ADB_TABLE;  // Application defined items
+    tbl : PASN1_ADB_TABLE;                  // Table of possible types
+    tblcount : TC_LONG;                     // Number of entries in tbl
+    default_tt : PASN1_TEMPLATE;            // Type to use if no match
+    null_tt : PASN1_TEMPLATE;               // Type to use if selector is NULL
+  end;
+
+  PASN1_TLC = ^ASN1_TLC;
+  ASN1_TLC = record
+      valid : Byte;     // Values below are valid
+      ret : TC_INT;     // return value
+      plen : TC_LONG;     // length
+      ptag : TC_INT;      // class value
+      pclass : TC_INT;  // class value
+      hdrlen : TC_INT;  // header length
+  end;
+  PASN1_VALUE = Pointer;
+  PPASN1_VALUE = ^PASN1_VALUE;
+
+  ASN1_new_func = function : PASN1_VALUE; cdecl;
+  ASN1_free_func = procedure (a : PASN1_VALUE); cdecl;
+  ASN1_d2i_func = function (a : PASN1_VALUE; var _in : PByte; length : TC_LONG ) : PASN1_VALUE; cdecl;
+  ASN1_i2d_func = function (a : PASN1_VALUE; var _in : PByte)  : TC_INT; cdecl;
+  ASN1_ex_d2i = function(var pval : PASN1_VALUE; var _in : PByte; len : TC_LONG; it : PASN1_ITEM; tag, aclass : TC_INT;
+                   opt : Byte; ctx : PASN1_TLC) : TC_INT; cdecl;
+  ASN1_ex_i2d = function(var pval : PASN1_VALUE; var _out : PByte;  it : PASN1_ITEM; tag, aclass : TC_INT) : TC_INT; cdecl;
+  ASN1_ex_new_func = function(var pval : PASN1_VALUE; it : PASN1_ITEM) : TC_INT; cdecl;
+  ASN1_ex_free_func = procedure(var pval : PASN1_VALUE; it : PASN1_ITEM); cdecl;
+  ASN1_primitive_i2c = function (var pval : PASN1_VALUE; cont : PByte; putype : PC_INT; it : PASN1_ITEM ) : TC_INT; cdecl;
+  ASN1_primitive_c2i = function (var pval : PASN1_VALUE; cont : PByte; len, utype : TC_INT; free_cont : PByte; it: PASN1_ITEM) : TC_INT; cdecl;
+
+  ASN1_COMPAT_FUNCS = record
+      asn1_new : ASN1_new_func;
+      asn1_free : ASN1_free_func;
+      asn1_d2i : ASN1_d2i_func;
+     asn1_i2d : ASN1_i2d_func;
+  end;
+  PASN1_COMPAT_FUNCS = ^ASN1_COMPAT_FUNCS;
+
+  ASN1_EXTERN_FUNCS = record
+      app_data : Pointer;
+    asn1_ex_new : ASN1_ex_new_func;   //    ASN1_ex_new_func *asn1_ex_new;
+    asn1_ex_free : ASN1_ex_free_func; //    ASN1_ex_free_func *asn1_ex_free;
+    asn1_ex_clear: ASN1_ex_free_func; //    ASN1_ex_free_func *asn1_ex_clear;
+    asn1_ex_d2i : ASN1_ex_d2i;        //    ASN1_ex_d2i *asn1_ex_d2i;
+    asn1_ex_i2d : ASN1_ex_i2d;        //    ASN1_ex_i2d *asn1_ex_i2d;
+  end;
+  PASN1_EXTERN_FUNCS = ^ASN1_EXTERN_FUNCS;
+
+  ASN1_PRIMITIVE_FUNCS = record
+    app_data : Pointer;
+    flags : TC_ULONG;
+    prim_new : ASN1_ex_new_func;
+    prim_free : ASN1_ex_free_func;
+    prim_clear : ASN1_ex_free_func;
+    prim_c2i : ASN1_primitive_c2i;
+    prim_i2c : ASN1_primitive_i2c;
+  end;
+  PASN1_PRIMITIVE_FUNCS = ^ASN1_PRIMITIVE_FUNCS;
+
+  ASN1_aux_cb = function (operation : TC_INT; var _in : PASN1_VALUE; it : PASN1_ITEM) : TC_INT; cdecl;
+  asn1_ps_func = function(b: PBIO; var pbuf: PAnsiChar; plen: PC_INT; var parg: Pointer): TC_INT; cdecl;
+
+  ASN1_AUX = record
+    app_data : Pointer;
+    flags : TC_INT;
+    ref_offset : TC_INT;        // Offset of reference value
+    ref_lock : TC_INT;        // Lock type to use
+    asn1_cb : ASN1_aux_cb;
+    enc_offset : TC_INT;        // Offset of ASN1_ENCODING structure
+  end;
+  PASN1_AUX = ^ASN1_AUX;
+
+{$ENDREGION}
+
+{$REGION 'LHASH'}
+
+  PLHASH_NODE = ^LHASH_NODE;
+  PPLHASH_NODE = ^PLHASH_NODE;
+  LHASH_NODE = record
+    data : Pointer;
+    next : PLHASH_NODE;
+    hash : TC_ULONG;
+  end;
+
+  LHASH_COMP_FN_TYPE = function (const p1;p2 : Pointer) : TC_INT; cdecl;
+  LHASH_HASH_FN_TYPE = function(const p1 : Pointer) : TC_ULONG; cdecl;
+    LHASH_DOALL_FN_TYPE = procedure(_p: pointer); cdecl;
+    LHASH_DOALL_ARG_FN_TYPE = procedure(_p1, _p2: Pointer); cdecl;
+
+  LHASH = record
+    b : PPLHASH_NODE;
+    comp : LHASH_COMP_FN_TYPE;
+    hash : LHASH_HASH_FN_TYPE;
+    num_nodes : TC_UINT;
+    num_alloc_nodes : TC_UINT;
+    p : TC_UINT;
+    pmax : TC_UINT;
+    up_load : TC_ULONG;
+    down_load : TC_ULONG;
+    num_items : TC_ULONG;
+    num_expands : TC_ULONG;
+    num_expand_reallocs : TC_ULONG;
+    num_contracts : TC_ULONG;
+    num_contract_reallocs : TC_ULONG;
+    num_hash_calls : TC_ULONG;
+    num_comp_calls : TC_ULONG;
+    num_insert : TC_ULONG;
+    num_replace : TC_ULONG;
+    num_delete : TC_ULONG;
+    num_no_delete : TC_ULONG;
+    num_retrieve : TC_ULONG;
+    num_retrieve_miss : TC_ULONG;
+    num_hash_comps : TC_ULONG;
+    error : TC_INT;
+  end;
+  PLHASH = ^LHASH;
+  _LHASH = LHASH;
+  P_LHASH = ^_LHASH;
+
+  PLHASH_OF = ^LHASH_OF;
+  PPLHASH_OF = ^PLHASH_OF;
+  LHASH_OF = record
+    dummy: TC_INT;
+  end; { record }
+
+{$ENDREGION}
+
+{$REGION 'CONF'}
+  CONF_VALUE = record
+    section : PAnsiChar;
+    name : PAnsiChar;
+    value : PAnsiChar;
+  end;
+  PCONF_VALUE = ^CONF_VALUE;
+  PLHASH_OF_CONF_VALUE = PLHASH;
+
+  PCONF_METHOD = ^CONF_METHOD;
+  PCONF_IMODULE = ^CONF_IMODULE;
+  PCONF_MODULE = ^CONF_MODULE;
+  PCONF = ^CONF;
+
+  CONF_METHOD = record
+    name: PAnsiChar;
+    create: function(meth: PCONF_METHOD): PCONF; cdecl;
+    init: function(_conf: PCONF): TC_INT; cdecl;
+    destroy: function(_conf: PCONF): TC_INT; cdecl;
+    destroy_data: function(_conf: PCONF): TC_INT; cdecl;
+    load_bio: function(_conf: PCONF; bp: PBIO; eline: PC_LONG): TC_INT; cdecl;
+    dump: function(_conf: PCONF; bp: PBIO): TC_INT; cdecl;
+    is_number: function(_conf: PCONF; c: AnsiChar): TC_INT; cdecl;
+    to_int: function(_conf: PCONF; c: AnsiChar): TC_INT; cdecl;
+    load: function(_conf: PCONF; name: PAnsiChar; eline: PC_LONG): TC_INT; cdecl;
+  end;
+
+  CONF = record
+    method: PCONF_METHOD;
+    meth_data: Pointer;
+    data: PLHASH;
+  end;
+
+  t_list_cb = function(const  _elem: PAnsiChar; _len: TC_INT; usr: Pointer): TC_INT; cdecl;
+  t_conf_init_func = function(md: PCONF_IMODULE; const cnf: PCONF): TC_INT; cdecl;
+  t_conf_finish_func = procedure(md: PCONF_IMODULE); cdecl;
+
+  CONF_MODULE = record
+    dso: Pointer;
+     _name: PAnsiChar;
+    init: t_conf_init_func;
+    finish: t_conf_finish_func;
+    _links: TC_INT;
+    usr_data: Pointer;
+  end;
+
+  CONF_IMODULE = record
+	pmod: PCONF_MODULE;
+	 _name: PAnsiChar;
+	 _value: PAnsiChar;
+	s: TC_ULONG;
+	usr_data: Pointer;
+  end;
+
+
+{$ENDREGION}
+
+{$REGION 'DH'}
+
+  DH_Callback = procedure(_par1: TC_INT;_par2: TC_INT; _par3: Pointer); cdecl;
+  PDH = ^DH;
+  PPDH = ^PDH;
+
+  PDH_METHOD = ^DH_METHOD;
+  DH_METHOD = record
+    name: PAnsiChar;
+    generate_key: function(_dh: PDH): TC_INT; cdecl;
+    compute_key: function(key: PAnsiChar; pub_key: PBIGNUM; _dh: PDH): TC_INT; cdecl;
+    bn_mod_exp: function(_dh: PDH; r: PBIGNUM; a: PBIGNUM; p: PBIGNUM; m: PBIGNUM; ctx: PBN_CTX; m_ctx: PBN_MONT_CTX): TC_INT; cdecl;
+    init: function(_dh: PDH): TC_INT; cdecl;
+    finish: function(_dh: PDH): TC_INT; cdecl;
+    flags: TC_INT;
+    app_data: PAnsiChar;
+    generate_params: function(_dh: PDH; prime_len: TC_INT; generator: TC_INT; cb: PBN_GENCB): TC_INT; cdecl;
+  end;
+
+  DH = record
+    pad : TC_INT;
+    version : TC_INT;
+    p: PBIGNUM;
+    g: PBIGNUM;
+    _length: TC_LONG;
+    pub_key: PBIGNUM;
+    priv_key: PBIGNUM;
+    flags: TC_INT;
+    method_mont_p: PBN_MONT_CTX;
+    q: PBIGNUM;
+    j: PBIGNUM;
+    seed: PAnsiChar;
+    seedlen: TC_INT;
+    counter: PBIGNUM;
+    references: TC_INT;
+    ex_data: CRYPTO_EX_DATA;
+    meth : PDH_METHOD;
+    engine: PENGINE;
+  end;
+
+{$ENDREGION}
+
+
+{$REGION 'RSA'}
+
+  PRSA = ^RSA;
+  PPRSA = ^PRSA;
+  RSA_METHOD = record
+    name : PAnsiChar;
+    rsa_pub_enc : function (flen : TC_INT; const from : PAnsiChar;
+      _to : PAnsiChar; rsa : PRSA; padding : TC_INT) : TC_INT; cdecl;
+    rsa_pub_dec : function (flen : TC_INT; const from : PAnsiChar;
+      _to : PAnsiChar; rsa : PRSA; padding : TC_INT) : TC_INT; cdecl;
+    rsa_priv_enc : function (flen : TC_INT; const from : PAnsiChar;
+      _to : PAnsiChar; rsa : PRSA; padding : TC_INT) : TC_INT; cdecl;
+    rsa_priv_dec : function (flen : TC_INT; const from : PAnsiChar;
+       _to : PAnsiChar; rsa : PRSA; padding : TC_INT) : TC_INT; cdecl;
+    rsa_mod_exp : function (r0 : PBIGNUM; const I : PBIGNUM;  rsa : PRSA; ctx : PBN_CTX) : TC_INT cdecl;
+    bn_mod_exp : function (r : PBIGNUM; const a : PBIGNUM; const p : PBIGNUM; const m: PBIGNUM; ctx : PBN_CTX;
+      m_ctx : PBN_MONT_CTX ) : TC_INT; cdecl;
+    init : function (rsa : PRSA) : TC_INT; cdecl;
+    finish : function (rsa : PRSA) : TC_INT; cdecl;
+    flags : TC_INT;
+    app_data : PAnsiChar;
+    rsa_sign : function (_type : TC_INT; const m : PAnsiChar; m_length : TC_UINT; sigret : PAnsiChar; siglen : PC_UINT; const rsa : PRSA) : TC_INT; cdecl;
+    rsa_verify : function(dtype : TC_INT; const m : PAnsiChar; m_length : PC_UINT; sigbuf : PAnsiChar; siglen : PC_UINT; const rsa :PRSA) : TC_INT; cdecl;
+    rsa_keygen : function (rsa : PRSA; bits : TC_INT; e : PBIGNUM; cb : PBN_GENCB) : TC_INT; cdecl;
+  end;
+
+  RSA = record
+    pad : TC_INT;
+    version : TC_LONG;
+    meth : PRSA_METHOD;
+    engine : PENGINE;
+    n : PBIGNUM;
+    e : PBIGNUM;
+    d : PBIGNUM;
+    p : PBIGNUM;
+    q : PBIGNUM;
+    dmp1 : PBIGNUM;
+    dmq1 : PBIGNUM;
+    iqmp : PBIGNUM;
+    ex_data : CRYPTO_EX_DATA;
+    references : TC_INT;
+    flags : TC_INT;
+    _method_mod_n : PBN_MONT_CTX;
+    _method_mod_p : PBN_MONT_CTX;
+    _method_mod_q : PBN_MONT_CTX;
+    bignum_data : PAnsiChar;
+    blinding : PBN_BLINDING;
+    mt_blinding : PBN_BLINDING;
+  end;
+
+  PRSA_PKEY_CTX = ^RSA_PKEY_CTX;
+  RSA_PKEY_CTX = record
+      nbits: TC_INT;
+      pub_exp: PBIGNUM;
+      gentmp: array[0..1] of TC_INT;
+      pad_mode: TC_INT;
+      md: PEVP_MD;
+      mgf1md: PEVP_MD;
+      saltlen: TC_INT;
+      tbuf: PAnsiChar;
+  end;
+
+  PRSA_PSS_PARAMS = ^RSA_PSS_PARAMS;
+  PPRSA_PSS_PARAMS = ^PRSA_PSS_PARAMS;
+
+  RSA_PSS_PARAMS = record
+    _hashAlgorithm: PX509_ALGOR;
+    _maskGenAlgorithm: PX509_ALGOR;
+    _saltLength: PASN1_INTEGER;
+    _trailerField: PASN1_INTEGER;
+  end; { record }
+
+  RSA_NET_CALLBACK_FUNC = function (_buf: PAnsiChar; _len: TC_INT; const _prompt: PAnsiChar; _verify: TC_INT): TC_INT; cdecl;
+{$ENDREGION}
+
+
+{$REGION 'DSA'}
+  PDSA = ^DSA;
+  PPDSA = ^PDSA;
+  DSA_SIG = record
+    r : PBIGNUM;
+    s : PBIGNUM;
+  end;
+  PDSA_SIG = ^DSA_SIG;
+  PPDSA_SIG = ^PDSA_SIG;
+
+  DSA_METHOD = record
+    name : PAnsiChar;
+    dsa_do_sign : function (const dgst : PAnsiChar; dlen : TC_INT; dsa : PDSA) : PDSA_SIG; cdecl;
+    dsa_sign_setup : function (dsa : PDSA; ctx_in : PBN_CTX; kinvp, rp : PPBN_CTX) : TC_INT; cdecl;
+    dsa_do_verify : function(dgst : PAnsiChar; dgst_len : TC_INT; sig : PDSA_SIG; dsa : PDSA) : TC_INT; cdecl;
+    dsa_mod_exp : function(dsa : PDSA; rr, a1, p1, a2, p2, m : PBIGNUM; ctx : PBN_CTX; in_mont : PBN_MONT_CTX) : TC_INT; cdecl;
+    bn_mod_exp : function (dsa : PDSA; r, a : PBIGNUM; const p; m : PBIGNUM;  ctx : PBN_CTX; m_ctx : PBN_CTX): TC_INT; cdecl; // Can be null
+    init : function (dsa : PDSA) : TC_INT; cdecl;
+    finish : function (dsa : PDSA) : TC_INT; cdecl;
+    flags : TC_INT;
+    app_data : PAnsiChar;
+    dsa_paramgen : function (dsa : PDSA; bits : TC_INT; seed : PAnsiChar;  seed_len : TC_INT; counter_ret : PC_INT; h_ret : PC_ULONG;
+       cb : PBN_GENCB ) : TC_INT; cdecl;
+    dsa_keygen : function(dsa : PDSA) : TC_INT; cdecl;
+  end;
+  PDSA_METHOD = ^DSA_METHOD;
+
+  DSA = record
+    pad : TC_INT;
+    version : TC_LONG;
+    write_params : TC_INT;
+    p : PBIGNUM;
+    q : PBIGNUM;
+    g : PBIGNUM;
+    pub_key : PBIGNUM;
+    priv_key : PBIGNUM;
+    kinv : BIGNUM;
+    r : PBIGNUM;
+    flags : TC_INT;
+    method_mont_p : PBN_MONT_CTX;
+    references : TC_INT;
+    ex_data : CRYPTO_EX_DATA;
+    meth : PDSA_METHOD;
+    engine : PENGINE;
+  end;
+{$ENDREGION}
+
+{$REGION 'EVP'}
+
+  PEVP_PKEY_CTX = ^EVP_PKEY_CTX;
+  PPEVP_PKEY_CTX = ^PEVP_PKEY_CTX;
+
+  EVP_SIGN_METHOD = function(_type: TC_INT; m: PAnsiChar; m_length: TC_UINT; sigret: PAnsiChar; var siglen: TC_UINT; key: Pointer): TC_INT; cdecl;
+  EVP_VERIFY_METHOD = function(_type: TC_INT; m: PAnsiChar; m_length: TC_UINT; sigbuf: PAnsiChar; siglen: TC_UINT; key: Pointer): TC_INT; cdecl;
+  EVP_PKEY_gen_cb = function(ctx: PEVP_PKEY_CTX): TC_INT; cdecl;
+
+  EVP_PKEY_CTX = record
+      pmeth: PEVP_PKEY_METHOD;
+      engine: PENGINE;
+      pkey: PEVP_PKEY;
+      peerkey: PEVP_PKEY;
+      operation: TC_INT;
+    data: Pointer;
+      app_data: Pointer;
+      pkey_gencb: EVP_PKEY_gen_cb;
+      keygen_info: PC_INT;
+    keygen_info_count: TC_INT;
+    end;
+
+    EVP_PKEY_METHOD = record
+        _pkey_id: TC_INT;
+        _flags: TC_INT;
+
+        init: function(_ctx: PEVP_PKEY_CTX): TC_INT; cdecl;
+        copy: function(_dst: PEVP_PKEY_CTX; _src: PEVP_PKEY_CTX): TC_INT; cdecl;
+        cleanup: procedure(_ctx: PEVP_PKEY_CTX); cdecl;
+
+        paramgen_init: function(_ctx: PEVP_PKEY_CTX): TC_INT; cdecl;
+        paramgen: function(_ctx: PEVP_PKEY_CTX; _pkey: PEVP_PKEY): TC_INT; cdecl;
+
+        keygen_init: function(_ctx: PEVP_PKEY_CTX): TC_INT; cdecl;
+        keygen: function(_ctx: PEVP_PKEY_CTX; _pkey: PEVP_PKEY): TC_INT; cdecl;
+
+        sign_init: function(_ctx: PEVP_PKEY_CTX): TC_INT; cdecl;
+        sign: function(_ctx: PEVP_PKEY_CTX; _sig: PAnsiChar; var _siglen: TC_SIZE_T;const _tbs: PAnsiChar; _tbslen: TC_SIZE_T): TC_INT; cdecl;
+
+        verify_init: function(_ctx: PEVP_PKEY_CTX): TC_INT; cdecl;
+        verify: function(_ctx: PEVP_PKEY_CTX;const _sig: PAnsiChar; _siglen: TC_SIZE_T; const _tbs: PAnsiChar; _tbslen: TC_SIZE_T): TC_INT; cdecl;
+
+        verify_recover_init: function(_ctx: PEVP_PKEY_CTX): TC_INT; cdecl;
+        verify_recover: function(_ctx: PEVP_PKEY_CTX;_rout: PAnsiChar; var _routlen: TC_SIZE_T;const _sig: PAnsiChar; _siglen: TC_SIZE_T): TC_INT; cdecl;
+
+        signctx_init: function(_ctx: PEVP_PKEY_CTX; _mctx: PEVP_MD_CTX): TC_INT; cdecl;
+        signctx: function(_ctx: PEVP_PKEY_CTX; _sig: PAnsiChar; var siglen: TC_SIZE_T; _mctx: PEVP_MD_CTX): TC_INT; cdecl;
+
+        verifyctx_init: function(_ctx: PEVP_PKEY_CTX; _mctx: PEVP_MD_CTX): TC_INT; cdecl;
+        verifyctx: function(_ctx: PEVP_PKEY_CTX; const _sig: PAnsiChar;_siglen: TC_INT;_mctx: PEVP_MD_CTX): TC_INT; cdecl;
+
+        encrypt_init: function(_ctx: PEVP_PKEY_CTX): TC_INT; cdecl;
+        encrypt: function(_ctx: PEVP_PKEY_CTX; _out: PAnsiChar; var _outlen: TC_SIZE_T;const _in: PAnsiChar; _inlen: TC_SIZE_T): TC_INT; cdecl;
+
+        decrypt_init: function(_ctx: PEVP_PKEY_CTX): TC_INT; cdecl;
+        decrypt: function(_ctx: PEVP_PKEY_CTX; _out: PAnsiChar; var _outlen: TC_SIZE_T;const _in: PAnsiChar; _inlen: TC_SIZE_T): TC_INT; cdecl;
+
+        derive_init: function(_ctx: PEVP_PKEY_CTX): TC_INT; cdecl;
+        derive: function(_ctx: PEVP_PKEY_CTX; _key: PAnsiChar; var _keylen: TC_SIZE_T): TC_INT; cdecl;
+
+        ctrl: function(_ctx: PEVP_PKEY_CTX; _type: TC_INT; _p1: TC_INT; _p2: Pointer): TC_INT; cdecl;
+        ctrl_str: function(_ctx: PEVP_PKEY_CTX; const _type: PAnsiChar; const _value: PAnsiChar): TC_INT; cdecl;
+
+    end; { record }
+
+
+
+  EVP_PKEY_union = record
+    case byte of
+      0: (ptr : PAnsiChar);
+      1: (rsa : PRSA);    // RSA
+      2: (dsa : PDSA);    // DSA
+      3: (dh :PDH);       // DH
+      4: (ec : PEC_KEY);  // ECC
+  end;
+
+  STACK_OF_X509_ATTRIBUTE = record
+    _stack: STACK;
+  end;
+  PSTACK_OF_X509_ATTRIBUTE = ^STACK_OF_X509_ATTRIBUTE;
+  PPSTACK_OF_X509_ATTRIBUTE = ^PSTACK_OF_X509_ATTRIBUTE;
+
+  PPEVP_PKEY = ^PEVP_PKEY;
+  EVP_PKEY = record
+    _type : TC_INT;
+    save_type : TC_INT;
+    references : TC_INT;
+    ameth : PEVP_PKEY_ASN1_METHOD;
+    enigne: PENGINE;
+    pkey : EVP_PKEY_union;
+    save_parameters: TC_INT;
+    attributes : PSTACK_OF_X509_ATTRIBUTE;
+  end;
+
+    EVP_PKEY_ASN1_METHOD = record
+        _pkey_id: TC_INT;
+        _pkey_base_id: TC_INT;
+        _pkey_flags: TC_ULONG;
+
+        _pem_str: PAnsiChar;
+        _info: PAnsiChar;
+
+        pub_decode: function(_pk: PEVP_PKEY; _pub: PX509_PUBKEY): TC_INT; cdecl;
+        pub_encode: function(_pub: PX509_PUBKEY; const _pk: PEVP_PKEY): TC_INT; cdecl;
+        pub_cmp: function(const _a: PEVP_PKEY; const _b: PEVP_PKEY): TC_INT; cdecl;
+        pub_print: function(_out: PBIO; const _pkey: PEVP_PKEY; _indent: TC_INT;_pctx: PASN1_PCTX): TC_INT; cdecl;
+
+        priv_decode: function(_pk: PEVP_PKEY; _p8inf: PPKCS8_PRIV_KEY_INFO): TC_INT; cdecl;
+        priv_encode: function(_p8: PPKCS8_PRIV_KEY_INFO; const _pk: PEVP_PKEY): TC_INT; cdecl;
+        priv_print: function(_out: PBIO; const _pkey: PEVP_PKEY; _indent: TC_INT;_pctx: PASN1_PCTX): TC_INT; cdecl;
+
+        pkey_size: function(const _pk: PEVP_PKEY): TC_INT; cdecl;
+        pkey_bits: function(const _pk: PEVP_PKEY): TC_INT; cdecl;
+
+        param_decode: function(_pkey: PEVP_PKEY;const _pder: PPAnsiChar; _derlen: TC_INT): TC_INT; cdecl;
+        param_encode: function(const _pkey: PEVP_PKEY; _pder: PPAnsiChar): TC_INT; cdecl;
+        param_missing: function(const _pk: PEVP_PKEY): TC_INT; cdecl;
+        param_copy: function(_to: PEVP_PKEY; const _from: PEVP_PKEY): TC_INT; cdecl;
+        param_cmp: function(const _a: PEVP_PKEY; const _b: PEVP_PKEY): TC_INT; cdecl;
+        param_print: function(_out: PBIO; const _pkey: PEVP_PKEY; _indent: TC_INT; _pctx: PASN1_PCTX): TC_INT; cdecl;
+        sig_print: function(_out: PBIO;const _sigalg: PX509_ALGOR; const _sig: PASN1_STRING;_indent: TC_INT; _pctx: PASN1_PCTX): TC_INT; cdecl;
+
+
+        pkey_free: procedure(_pkey: PEVP_PKEY); cdecl;
+        pkey_ctrl: function(_pkey: PEVP_PKEY; _op: TC_INT; _arg1: TC_LONG; _arg2: Pointer): TC_INT; cdecl;
+
+        old_priv_decode: function(_pkey: Pointer;const _pder: PPAnsiChar; _derlen: TC_INT): TC_INT; cdecl;
+        old_priv_encode: function(const _pkey: PEVP_PKEY; _pder: PPAnsiChar): TC_INT; cdecl;
+        item_verify: function(_ctx: PEVP_MD_CTX; const _it: PASN1_ITEM; _asn: Pvoid; _a: PX509_ALGOR; _sig: PASN1_BIT_STRING; _pkey: PEVP_PKEY): TC_INT; cdecl;
+        item_sign: function(_ctx: PEVP_MD_CTX; const _it: PASN1_ITEM; _asn: Pointer; _alg1: PX509_ALGOR; _alg2: PX509_ALGOR; _sig: PASN1_BIT_STRING): TC_INT; cdecl;
+    end; { record }
+
+  PEVP_CIPHER_CTX = ^EVP_CIPHER_CTX;
+  EVP_CIPHER = record
+    nid : TC_Int;
+    block_size : TC_Int;
+    key_len : TC_Int;
+    iv_len : TC_Int;
+    flags : TC_ULONG;
+    init : function (ctx : PEVP_CIPHER_CTX; key : PAnsiChar; iv : PAnsiChar; enc : TC_Int): TC_Int; cdecl;
+    do_cipher : function (ctx : PEVP_CIPHER_CTX; _out : PAnsiChar; _in : PAnsiChar; inl : size_t) : TC_Int; cdecl;
+    cleanup : function (_para1 : PEVP_CIPHER_CTX): TC_Int; cdecl;
+    ctx_size : TC_Int;
+    set_asn1_parameters : function (_para1 : PEVP_CIPHER_CTX; _para2 : PASN1_TYPE) : TC_Int; cdecl;
+    get_asn1_parameters :function (_para1 : PEVP_CIPHER_CTX; _para2 :  PASN1_TYPE) : TC_Int; cdecl;
+    ctrl : function (_para1 : PEVP_CIPHER_CTX; _type : TC_Int; arg : TC_Int;  ptr : Pointer): TC_Int; cdecl;
+    app_data : Pointer;
+  end;
+
+  EVP_CIPHER_DO = procedure(ciph: PEVP_CIPHER; from: PAnsiChar; _to: PAnsiChar; x: Pointer); cdecl;
+  EVP_MD_DO = procedure(ciph: PEVP_MD; from: PAnsiChar; _to: PAnsiChar; x: Pointer); cdecl;
+
+  EVP_CIPHER_CTX = record
+    cipher : PEVP_CIPHER;
+    engine : PENGINE;
+    encrypt: TC_INT;
+    buf_len : TC_INT;
+    oiv : array [0..EVP_MAX_IV_LENGTH-1] of AnsiChar;
+    iv : array [0..EVP_MAX_IV_LENGTH -1] of AnsiChar;
+    buf : array [0..EVP_MAX_BLOCK_LENGTH -1] of AnsiChar;
+    num : TC_INT;
+    app_data : Pointer;
+    key_len : TC_INT;
+    flags : TC_ULONG;
+    cipher_data : Pointer;
+    final_used : TC_INT;
+    block_mask : TC_INT;
+    _final : array [0..EVP_MAX_BLOCK_LENGTH-1] of AnsiChar;
+  end;
+
+
+  EVP_CIPHER_INFO = record
+    cipher : PEVP_CIPHER;
+    iv : array [0..EVP_MAX_IV_LENGTH -1] of AnsiChar;
+  end;
+
+
+  EVP_MD_CTX = record
+    digest : PEVP_MD;
+    engine : PENGINE;
+    flags : TC_ULONG;
+    md_data : Pointer;
+    pctx : PEVP_PKEY_CTX;
+    update : function (ctx : PEVP_MD_CTX; const data : Pointer; count : size_t) : TC_INT cdecl;
+  end;
+
+
+  EVP_MD = record
+    _type : TC_Int;
+    pkey_type : TC_Int;
+    md_size : TC_Int;
+    flags : TC_ULONG;
+    init : function (ctx : PEVP_MD_CTX) : TC_Int; cdecl;
+    update : function (ctx : PEVP_MD_CTX; data : Pointer; count : size_t):TC_Int; cdecl;
+    _final : function (ctx : PEVP_MD_CTX; md : PAnsiChar) : TC_Int; cdecl;
+    copy : function (_to : PEVP_MD_CTX; from : PEVP_MD_CTX ) : TC_Int; cdecl;
+    cleanup : function(ctx : PEVP_MD_CTX) : TC_Int; cdecl;
+    sign : function(_type : TC_Int; m : PAnsiChar; m_length : TC_UINT;  sigret : PAnsiChar; siglen : TC_UINT; key : Pointer) : TC_Int; cdecl;
+    verify : function(_type : TC_Int; m : PAnsiChar; m_length : PAnsiChar;  sigbuf : PAnsiChar; siglen : TC_UINT; key : Pointer) : TC_Int; cdecl;
+    required_pkey_type : array [0..4] of TC_Int; // EVP_PKEY_xxx
+    block_size : TC_Int;
+    ctx_size : TC_Int;
+    md_ctrl: function( ctx: PEVP_MD_CTX; cmd: TC_INT; p1: TC_INT; p2: Pointer): TC_INT; cdecl;
+  end;
+
+  PEVP_ENCODE_CTX = ^EVP_ENCODE_CTX;
+  EVP_ENCODE_CTX = record
+    num: TC_INT;
+    _length: TC_INT;
+    enc_data: array[0..79] of AnsiChar;
+    line_num: TC_INT;
+    expect_nl: TC_INT;
+  end;
+
+  EVP_PBE_KEYGEN = function(ctx: PEVP_CIPHER_CTX; pass: PAnsiChar; passlen: TC_INT; param: PASN1_TYPE; cipher: PEVP_CIPHER; md: PEVP_MD; en_de: TC_INT): TC_INT;
+  PEVP_PBE_KEYGEN = ^EVP_PBE_KEYGEN;
+
+
+{$ENDREGION}
+
+
+
+{$REGION 'X509'}
+
+  PPX509 = ^PX509;
+  PX509_REQ = ^X509_REQ;
+  PX509_CRL = ^X509_CRL;
+  PX509_NAME = ^X509_NAME;
+  PPX509_NAME = ^PX509_NAME;
+  PX509_NAME_ENTRY = ^X509_NAME_ENTRY;
+  PPX509_NAME_ENTRY = ^PX509_NAME_ENTRY;
+  PX509_REQ_INFO = ^X509_REQ_INFO;
+  PPX509_REQ_INFO = ^PX509_REQ_INFO;
+  PX509_POLICY_CACHE = ^X509_POLICY_CACHE;
+  PX509_CRL_METHOD = Pointer;
+  PSTACK_OF_X509_REVOKED = PSTACK_OF;
+
+
+  PPSTACK_OF_X509 = ^PSTACK_OF_X509;
+
+  PSTACK_OF_X509_NAME_ENTRY = PSTACK_OF;
+
+  PX509_OBJECTS = ^X509_OBJECTS;
+  X509_OBJECTS = record
+    nid: TC_INT;
+    a2i: function: TC_INT; cdecl;
+    i2a: function: TC_INT; cdecl;
+  end;
+
+  X509_HASH_DIR_CTX = record
+    num_dirs : TC_INT;
+    dirs : PPAnsiChar;
+    dirs_type : PC_INT;
+    num_dirs_alloced : TC_INT;
+  end;
+  PX509_HASH_DIR_CTX = ^X509_HASH_DIR_CTX;
+
+  X509_CERT_FILE_CTX = record
+    num_paths : TC_INT;  // number of paths to files or directories
+    num_alloced : TC_INT;
+    paths : PPAnsiChar;  // the list of paths or directories
+    path_type : TC_INT;
+  end;
+  PX509_CERT_FILE_CTX = ^X509_CERT_FILE_CTX;
+
+  x509_object_union = record
+    case byte of
+      0: (ptr : PAnsiChar);
+      1: (_x509 : Px509);
+      2: (crl : PX509_CRL);
+      3: (pkey : PEVP_PKEY);
+  end;
+
+  X509_OBJECT = record
+    _type : TC_Int;
+    data : x509_object_union;
+  end;
+  PX509_OBJECT  = ^X509_OBJECT;
+  PPX509_OBJECT  = ^PX509_OBJECT;
+
+  PSTACK_OF_X509_OBJECT = PSTACK;
+
+  X509_ALGOR = record
+    algorithm : PASN1_OBJECT;
+    parameter : PASN1_TYPE;
+  end;
+
+  PSTACK_OF_X509_ALGOR = PSTACK;
+  PPSTACK_OF_X509_ALGOR = ^PSTACK_OF_X509_ALGOR;
+
+  X509_VAL = record
+    notBefore : PASN1_TIME;
+    notAfter : PASN1_TIME;
+  end;
+  PX509_VAL = ^X509_VAL;
+  PPX509_VAL =^PX509_VAL;
+
+  X509_PUBKEY = record
+    algor : PX509_ALGOR;
+    public_key : PASN1_BIT_STRING;
+    pkey : PEVP_PKEY;
+  end;
+
+  PPX509_PUBKEY =^PX509_PUBKEY;
+
+  X509_SIG = record
+    algor : PX509_ALGOR;
+    digest : PASN1_OCTET_STRING;
+  end;
+  PX509_SIG = X509_SIG;
+  PPX509_SIG =^PX509_SIG;
+
+  X509_NAME_ENTRY = record
+    _object : PASN1_OBJECT;
+    value : PASN1_STRING;
+    _set : TC_Int;
+    size : TC_Int;
+  end;
+
+  X509_NAME = record
+    entries : PSTACK_OF_X509_NAME_ENTRY;
+    modified : TC_Int;
+    bytes : PBUF_MEM;
+    canon_enc: PAnsiChar;
+    canon_enclen: TC_INT;
+  end;
+
+  X509_EXTENSION = record
+    _object : PASN1_OBJECT;
+    critical : ASN1_BOOLEAN;
+    value : PASN1_OCTET_STRING;
+  end;
+  PX509_EXTENSION = ^X509_EXTENSION;
+  PPX509_EXTENSION =^PX509_EXTENSION;
+
+  PSTACK_OF_X509_EXTENSION = PSTACK;
+  PPSTACK_OF_X509_EXTENSION = ^PSTACK_OF_X509_EXTENSION;
+  PX509_EXTENSIONS = PPSTACK_OF_X509_EXTENSION;
+
+  x509_attributes_union = record
+    case Byte of
+      $FF :(Ptr : PAnsiChar);
+      0  : (_set: PSTACK_OF_ASN1_TYPE); // 0
+      1  : (_single: PASN1_TYPE);
+  end;
+
+  X509_ATTRIBUTE = record
+    _object : PASN1_OBJECT;
+    single : TC_Int;
+    value : x509_attributes_union;
+  end;
+  PX509_ATTRIBUTE = ^X509_ATTRIBUTE;
+  PPX509_ATTRIBUTE = ^PX509_ATTRIBUTE;
+
+  X509_REQ_INFO = record
+    enc: ASN1_ENCODING;
+    version: PASN1_INTEGER;
+    subject: PX509_NAME;
+    pubkey: PX509_PUBKEY;
+    attributes: PSTACK_OF_X509_ATTRIBUTE;
+  end;
+
+  X509_REQ = record
+    req_info: PX509_REQ_INFO;
+    sig_alg: PX509_ALGOR;
+    signature: PASN1_BIT_STRING;
+    references: TC_Int;
+  end;
+  PPX509_REQ = ^PX509_REQ;
+
+
+  X509_CINF = record
+    version: PASN1_INTEGER;
+    serialNumber: PASN1_INTEGER;
+    signature: PX509_ALGOR;
+    issuer: PX509_NAME;
+    validity: PX509_VAL;
+    subject: PX509_NAME;
+    key: PX509_PUBKEY;
+    issuerUID: PASN1_BIT_STRING;
+    subjectUID: PASN1_BIT_STRING;
+    extensions: PSTACK_OF_X509_EXTENSION;
+    enc : ASN1_ENCODING;
+  end;
+  PX509_CINF = ^X509_CINF;
+  PPX509_CINF = ^PX509_CINF;
+
+
+  X509_CERT_AUX = record
+    trust : PSTACK_OF_ASN1_OBJECT;
+    reject : PSTACK_OF_ASN1_OBJECT;
+    alias : PASN1_UTF8STRING;
+    keyid : PASN1_OCTET_STRING;
+    other : PSTACK_OF_X509_ALGOR;
+  end;
+  PX509_CERT_AUX = ^X509_CERT_AUX;
+  PPX509_CERT_AUX = ^PX509_CERT_AUX;
+
+  X509 = record
+    cert_info: PX509_CINF;
+    sig_alg : PX509_ALGOR;
+    signature : PASN1_BIT_STRING;
+    valid : TC_Int;
+    references : TC_Int;
+    name : PAnsiChar;
+    ex_data : CRYPTO_EX_DATA;
+    ex_pathlen : TC_LONG;
+    ex_pcpathlen : TC_LONG;
+    ex_flags : TC_ULONG;
+    ex_kusage : TC_ULONG;
+    ex_xkusage : TC_ULONG;
+    ex_nscert : TC_ULONG;
+    skid : PASN1_OCTET_STRING;
+    akid : PAUTHORITY_KEYID;
+    policy_cache : PX509_POLICY_CACHE;
+    crldp: PSTACK_OF;
+    altName: PSTACK_OF;
+    nc: Pointer;
+    rfc3779_addr : PSTACK_OF_IPAddressFamily;
+    rfc3779_asid : PASIdentifiers;
+    sha1_hash : array [0..SHA_DIGEST_LENGTH-1] of AnsiChar;
+    aux : PX509_CERT_AUX;
+  end;
+
+  X509_CRL_INFO = record
+    version : PASN1_INTEGER;
+    sig_alg : PX509_ALGOR;
+    issuer : PX509_NAME;
+    lastUpdate : PASN1_TIME;
+    nextUpdate : PASN1_TIME;
+    revoked : PSTACK_OF_X509_REVOKED;
+    extensions : PSTACK_OF_X509_EXTENSION; // [0]
+    enc : ASN1_ENCODING;
+  end;
+
+  PX509_CRL_INFO     = ^X509_CRL_INFO;
+  PPX509_CRL_INFO    =^PX509_CRL_INFO;
+  PSTACK_OF_X509_CRL_INFO = PSTACK;
+  PX509_LOOKUP = ^X509_LOOKUP;
+  PSTACK_OF_X509_LOOKUP = PSTACK;
+  PX509_VERIFY_PARAM = ^X509_VERIFY_PARAM;
+  PX509_STORE_CTX = ^X509_STORE_CTX;
+  PPX509_CRL = ^PX509_CRL;
+  X509_STORE = record
+    cache : TC_Int;
+    objs : PSTACK_OF_X509_OBJECT;
+    get_cert_methods : PSTACK_OF_X509_LOOKUP;
+    param : PX509_VERIFY_PARAM;
+    verify : function (ctx : PX509_STORE_CTX) : TC_Int; cdecl;
+    verify_cb : function (ok : TC_Int; ctx : PX509_STORE_CTX) : TC_Int; cdecl;
+    get_issuer : function (issuer : PPX509; ctx : PX509_STORE_CTX; x : PX509) : TC_Int; cdecl;
+    check_issued : function (ctx : PX509_STORE_CTX; x : PX509; issuer : PX509) : TC_Int; cdecl;
+    check_revocation : function (ctx : PX509_STORE_CTX) : TC_Int; cdecl;
+    get_crl : function (ctx : PX509_STORE_CTX; crl : PPX509_CRL; x : PX509) : TC_Int; cdecl;
+    check_crl : function(ctx : PX509_STORE_CTX; crl : PX509_CRL) : TC_Int; cdecl;
+    cert_crl : function(ctx : PX509_STORE_CTX; crl : PX509_CRL; x : PX509) : TC_Int; cdecl;
+    cleanup : function(ctx : PX509_STORE_CTX) : TC_Int; cdecl;
+    ex_data : CRYPTO_EX_DATA;
+    references : TC_Int;
+  end;
+  PX509_STORE = ^X509_STORE;
+  X509_CRL = record
+    crl : PX509_CRL_INFO;
+    sig_alg : PX509_ALGOR;
+    signature : PASN1_BIT_STRING;
+    references : TC_Int;
+    flags: TC_INT;
+    akid: PAUTHORITY_KEYID;
+    idp: Pointer;
+    idp_flags: TC_INT;
+    idp_reason: TC_INT;
+    crl_number: PASN1_INTEGER;
+    base_crl_number: PASN1_INTEGER;
+    sha1_hash: array[0..SHA_DIGEST_LENGTH-1] of AnsiChar;
+    issuers: PSTACK_OF;
+    meth: PX509_CRL_METHOD;
+    meth_data: Pointer;
+  end;
+  PSTACK_OF_X509_CRL = PSTACK;
+
+  X509_LOOKUP_METHOD = record
+    name : PAnsiChar;
+    new_item : function (ctx : PX509_LOOKUP): TC_Int; cdecl;
+    free : procedure (ctx : PX509_LOOKUP); cdecl;
+    init : function(ctx : PX509_LOOKUP) : TC_Int; cdecl;
+    shutdown : function(ctx : PX509_LOOKUP) : TC_Int; cdecl;
+    ctrl: function(ctx : PX509_LOOKUP; cmd : TC_Int; const argc : PAnsiChar; argl : TC_LONG; out ret : PAnsiChar ) : TC_Int; cdecl;
+    get_by_subject: function(ctx : PX509_LOOKUP; _type : TC_Int; name : PX509_NAME; ret : PX509_OBJECT ) : TC_Int; cdecl;
+    get_by_issuer_serial : function(ctx : PX509_LOOKUP; _type : TC_Int; name : PX509_NAME; serial : PASN1_INTEGER; ret : PX509_OBJECT) : TC_Int; cdecl;
+    get_by_fingerprint : function (ctx : PX509_LOOKUP; _type : TC_Int; bytes : PAnsiChar; len : TC_Int; ret : PX509_OBJECT): TC_Int; cdecl;
+    get_by_alias : function(ctx : PX509_LOOKUP; _type : TC_Int; str : PAnsiChar; ret : PX509_OBJECT) : TC_Int; cdecl;
+  end;
+  PX509_LOOKUP_METHOD      = ^X509_LOOKUP_METHOD;
+  PPX509_LOOKUP_METHOD     = ^PX509_LOOKUP_METHOD;
+
+  X509_VERIFY_PARAM = record
+    name : PAnsiChar;
+    check_time : TC_time_t;
+    inh_flags : TC_ULONG;
+    flags : TC_ULONG;
+    purpose : TC_Int;
+    trust : TC_Int;
+    depth : TC_Int;
+    policies : PSTACK_OF_ASN1_OBJECT;
+  end;
+  PSTACK_OF_X509_VERIFY_PARAM = PSTACK;
+
+  X509_LOOKUP = record
+    init : TC_Int;
+    skip : TC_Int;
+    method : PX509_LOOKUP_METHOD;
+    method_data : PAnsiChar;
+    store_ctx : PX509_STORE;
+  end;
+  PPSTACK_OF_X509_LOOKUP = ^PSTACK_OF_X509_LOOKUP;
+
+  X509_STORE_CTX = record
+    ctx : PX509_STORE;
+    current_method : TC_Int;
+    cert : PX509;
+    untrusted : PSTACK_OF_X509;
+    crls : PSTACK_OF_X509_CRL;
+    param : PX509_VERIFY_PARAM;
+    other_ctx : Pointer;
+    verify : function (ctx : PX509_STORE_CTX) : TC_Int; cdecl;
+    verify_cb : function (ok : TC_Int; ctx : PX509_STORE_CTX) : TC_Int; cdecl;
+    get_issuer : function (var issuer : PX509; ctx : PX509_STORE_CTX; x : PX509) : TC_Int; cdecl;
+    check_issued : function(ctx : PX509_STORE_CTX; x, issuer : PX509) : TC_Int; cdecl;
+    check_revocation : function (ctx : PX509_STORE_CTX): TC_Int; cdecl;
+    get_crl : function (ctx : PX509_STORE_CTX; var crl : X509_CRL; x : PX509): TC_Int; cdecl;
+    check_crl : function (ctx : PX509_STORE_CTX; var crl : X509_CRL) : TC_Int; cdecl;
+    cert_crl : function (ctx : PX509_STORE_CTX; crl : PX509_CRL; x : PX509) : TC_Int; cdecl;
+    check_policy : function (ctx : PX509_STORE_CTX) : TC_Int;  cdecl;
+    cleanup : function (ctx : PX509_STORE_CTX) : TC_Int;  cdecl;
+  end;
+  PX509_EXTENSION_METHOD   = Pointer;
+
+  PX509_TRUST = ^X509_TRUST;
+  X509_TRUST_check_trust = function(_para1 : PX509_TRUST; para2 : PX509; _para3 : TC_Int) : TC_Int; cdecl;
+  X509_TRUST = record
+    trust : TC_Int;
+    flags : TC_Int;
+    check_trust : X509_TRUST_check_trust;
+    name : PAnsiChar;
+    arg1 : TC_Int;
+    arg2 : Pointer;
+  end;
+  PPX509_TRUST = ^PX509_TRUST;
+  PSTACK_OF_509_TRUST = PSTACK;
+
+  X509_REVOKED = record
+    serialNumber: PASN1_INTEGER;
+    revocationDate: PASN1_TIME;
+    extensions: PSTACK_OF_X509_EXTENSION;
+    issuer: PSTACK_OF;
+    reason: TC_INT;
+    sequence: TC_Int;
+  end;
+  PX509_REVOKED      = ^X509_REVOKED;
+  PPX509_REVOKED     =^PX509_REVOKED;
+
+  PX509_PKEY       = ^X509_PKEY;
+  PPX509_PKEY      =^PX509_PKEY;
+  X509_PKEY = record
+    version: TC_INT;
+    enc_algor: PX509_ALGOR;
+    enc_pkey: PASN1_OCTET_STRING;
+    dec_pkey: PEVP_PKEY;
+    key_length: TC_INT;
+    key_data: PAnsiChar;
+    key_free: TC_INT;
+    cipher: EVP_CIPHER_INFO;
+    references: TC_INT;
+  end;
+
+  X509_INFO = record
+    x509 : PX509;
+    crl : PX509_CRL;
+    x_pkey : PX509_PKEY;
+    enc_cipher: EVP_CIPHER_INFO;
+    enc_len: TC_Int;
+    enc_data: PAnsiChar;
+    references: TC_Int;
+  end;
+  PX509_INFO       = ^X509_INFO;
+  PPX509_INFO      =^PX509_INFO;
+  PSTACK_OF_X509_INFO = PSTACK;
+
+  PX509_CERT_PAIR = ^X509_CERT_PAIR;
+  X509_CERT_PAIR = record
+    _forward: PX509;
+    _reverse: PX509;
+  end;
+  PPX509_CERT_PAIR = ^PX509_CERT_PAIR;
+
+  PKCS8_PRIV_KEY_INFO = record
+        broken: TC_INT;
+        version: PASN1_INTEGER;
+        pkeyalg: PX509_ALGOR;
+        pkey: PASN1_TYPE;
+        attributes: PSTACK_OF_X509_ATTRIBUTE;
+  end;
+
+
+  NETSCAPE_SPKAC = record
+    pubkey : PX509_PUBKEY;
+    challenge : PASN1_IA5STRING;
+  end;
+  PNETSCAPE_SPKAC = ^NETSCAPE_SPKAC;
+  PPNETSCAPE_SPKAC = ^PNETSCAPE_SPKAC;
+
+  NETSCAPE_SPKI = record
+    spkac : PNETSCAPE_SPKAC;
+    sig_algor : PX509_ALGOR;
+    signature : PASN1_BIT_STRING;
+  end;
+  PNETSCAPE_SPKI = ^NETSCAPE_SPKI;
+  PPNETSCAPE_SPKI = ^PNETSCAPE_SPKI;
+
+  NETSCAPE_CERT_SEQUENCE = record
+    _type : PASN1_OBJECT;
+    certs : PSTACK_OF_X509;
+  end;
+  PNETSCAPE_CERT_SEQUENCE = ^NETSCAPE_CERT_SEQUENCE;
+  PPNETSCAPE_CERT_SEQUENCE = ^PNETSCAPE_CERT_SEQUENCE;
+
+  PPBEPARAM = ^PBEPARAM;
+  PBEPARAM = record
+    salt: PASN1_OCTET_STRING;
+    iter: PASN1_INTEGER;
+  end;
+
+  PPBE2PARAM = ^PBE2PARAM;
+  PBE2PARAM = record
+    keyfunc: PX509_ALGOR;
+    encryption: PX509_ALGOR;
+  end;
+
+  PPBKDF2PARAM = ^PBKDF2PARAM;
+  PBKDF2PARAM = record
+    salt: PASN1_TYPE;
+    iter: PASN1_INTEGER;
+    keylength: PASN1_INTEGER;
+    prf: PX509_ALGOR;
+  end;
+
+  EVP_pub_decode_t = function(pk: PEVP_PKEY; pub: PX509_PUBKEY): TC_INT; cdecl;
+  EVP_pub_encode_t = function(pub: PX509_PUBKEY;  pk: PEVP_PKEY): TC_INT; cdecl;
+  EVP_pub_cmp_t = function(const a: PEVP_PKEY; const b: PEVP_PKEY): TC_INT; cdecl;
+  EVP_pub_print_t = function(_out: PBIO; const pkey: PEVP_PKEY; indent: TC_INT; pctx: ASN1_PCTX): TC_INT; cdecl;
+  EVP_pkey_size_t = function(const pk: PEVP_PKEY): TC_INT; cdecl;
+  EVP_pkey_bits_t = function(const pk: PEVP_PKEY): TC_INT; cdecl;
+
+  EVP_priv_decode_t = function(pk: PEVP_PKEY; p8inf: PPKCS8_PRIV_KEY_INFO): TC_INT; cdecl;
+  EVP_priv_encode_t = function(p8: PPKCS8_PRIV_KEY_INFO; const pk : PEVP_PKEY): TC_INT; cdecl;
+  EVP_priv_print_t =  function(_out: PBIO; const pkey: PEVP_PKEY; indent: TC_INT; pctx: ASN1_PCTX): TC_INT; cdecl;
+
+  EVP_param_decode_t = function(pkey: PEVP_PKEY;var pder: PAnsiChar; derlen: TC_INT): TC_INT; cdecl;
+  EVP_param_encode_t = function(const pkey: PEVP_PKEY; var pder: PAnsiChar): TC_INT; cdecl;
+  EVP_param_missing_t = function(const pk: PEVP_PKEY): TC_INT; cdecl;
+  EVP_param_copy_t = function(_to: PEVP_PKEY; const _from: PEVP_PKEY): TC_INT; cdecl;
+  EVP_param_cmp_t = function(const a: PEVP_PKEY; const b: PEVP_PKEY): TC_INT; cdecl;
+  EVP_param_print_t = function(_out: PBIO; const pkey: PEVP_PKEY; indent: TC_INT;   pctx: ASN1_PCTX): TC_INT; cdecl;
+  EVP_pkey_free_t = procedure(pkey: PEVP_PKEY); cdecl;
+  EVP_pkey_ctrl_t = function(pkey: PEVP_PKEY; op:TC_INT;arg1: TC_LONG; arg2: Pointer): TC_INT; cdecl;
+{$ENDREGION}
+
+{$REGION 'X509V3}
+
+
+  PX509V3_CONF_METHOD = ^X509V3_CONF_METHOD;
+  X509V3_CONF_METHOD = record
+    get_string : function(db : Pointer; section, value : PAnsiChar) : PAnsiChar; cdecl;
+    get_section : function(db : Pointer; section : PAnsiChar) : PSTACK_OF_CONF_VALUE; cdecl;
+    free_string : procedure(db : Pointer; _string : PAnsiChar); cdecl;
+    free_section : procedure (db : Pointer; section : PSTACK_OF_CONF_VALUE);
+  end;
+
+  V3_EXT_CTX = record
+    flags : TC_INT;
+    issuer_cert : PX509;
+    subject_cert : PX509;
+    subject_req : PX509_REQ;
+    crl : PX509_CRL;
+    db_meth : X509V3_CONF_METHOD;
+    db : Pointer;
+  end;
+
+  X509V3_CTX = V3_EXT_CTX;
+  PX509V3_CTX = ^X509V3_CTX;
+
+  POTHERNAME = ^OTHERNAME;
+  PPOTHERNAME = ^POTHERNAME;
+  OTHERNAME = record
+    type_id: PASN1_OBJECT;
+    value: PASN1_TYPE;
+  end;
+
+  PEDIPARTYNAME = ^EDIPARTYNAME;
+  PPEDIPARTYNAME = ^PEDIPARTYNAME;
+  EDIPARTYNAME = record
+      nameAssigner: PASN1_STRING;
+      partyName: PASN1_STRING;
+  end;
+
+  GENERAL_NAME_union = record
+  case byte of
+    0: (ptr: PAnsiChar);
+    1: (otherName: POTHERNAME);
+      2: (rfc822Name: PASN1_IA5STRING);
+      3: (dNSName: PASN1_IA5STRING);
+      4: (x400Address: PASN1_TYPE);
+      5: (directoryName: PX509_NAME);
+      6: (ediPartyName: PEDIPARTYNAME);
+      7: (uniformResourceIdentifier: PASN1_IA5STRING);
+      8: (iPAddress: PASN1_OCTET_STRING);
+      9: (registeredID: PASN1_OBJECT);
+      10: (ip: PASN1_OCTET_STRING);
+      11: (dirn: PX509_NAME);
+      12: (ia5: PASN1_IA5STRING);
+    13: (rid: PASN1_OBJECT);
+      14: (other: PASN1_TYPE);
+  end;
+
+  PGENERAL_NAME = ^GENERAL_NAME;
+  PPGENERAL_NAME = ^PGENERAL_NAME;
+  GENERAL_NAME = record
+    _type: TC_INT;
+    d: GENERAL_NAME_union;
+  end;
+  PX509V3_EXT_METHOD = ^X509V3_EXT_METHOD;
+
+  X509V3_EXT_NEW_func = function: Pointer; cdecl;
+  X509V3_EXT_FREE_func = procedure(p: Pointer); cdecl;
+  X509V3_EXT_D2I_func = function(_par1: Pointer; var _par2: PAnsiChar; _par3: TC_LONG): Pointer; cdecl;
+  X509V3_EXT_I2D_func = function(_par1: Pointer; var _par2: PAnsiChar): TC_INT; cdecl;
+  X509V3_EXT_I2V_func = function(method: PX509V3_EXT_METHOD; ext: Pointer; extlist: PSTACK_OF_CONF_VALUE): PSTACK_OF_CONF_VALUE; cdecl;
+  X509V3_EXT_V2I_func = function(method: PX509V3_EXT_METHOD; ctx: PX509V3_CTX; values: PSTACK_OF_CONF_VALUE): Pointer; cdecl;
+  X509V3_EXT_I2S_func = function(method: PX509V3_EXT_METHOD; ext: Pointer): PAnsiChar; cdecl;
+  X509V3_EXT_S2I_func = function(method: PX509V3_EXT_METHOD; ctx: PX509V3_CTX; str: PAnsiChar): Pointer; cdecl;
+  X509V3_EXT_I2R_func = function(method: PX509V3_EXT_METHOD; ext: Pointer; _out: PBIO; indent: TC_INT): TC_INT; cdecl;
+  X509V3_EXT_R2I_func = function(method: PX509V3_EXT_METHOD; ctx: PX509V3_CTX; str: PAnsiChar): Pointer; cdecl;
+
+  V3_EXT_METHOD = record
+    ext_nid: TC_INT;
+    ext_flags: TC_INT;
+    it: PASN1_ITEM_EXP;
+    ext_new: X509V3_EXT_NEW_func;
+    ext_free: X509V3_EXT_FREE_func;
+    d2i: X509V3_EXT_D2I_func;
+    i2d: X509V3_EXT_I2D_func;
+    i2s: X509V3_EXT_I2S_func;
+    s2i: X509V3_EXT_S2I_func;
+    i2v: X509V3_EXT_I2V_func;
+    v2i: X509V3_EXT_V2I_func;
+    i2r: X509V3_EXT_I2R_func;
+    r2i: X509V3_EXT_R2I_func;
+    usr_data: Pointer;
+  end;
+  X509V3_EXT_METHOD = V3_EXT_METHOD;
+  PSTACK_OF_X509V3_EXT_METHOD = PSTACK_OF;
+  ENUMERATED_NAMES = BIT_STRING_BITNAME;
+  PEXTENDED_KEY_USAGE = PSTACK_OF_ASN1_OBJECT;
+  PPEXTENDED_KEY_USAGE = ^PEXTENDED_KEY_USAGE;
+
+  PBASIC_CONSTRAINTS = ^BASIC_CONSTRAINTS;
+  PPBASIC_CONSTRAINTS = ^PBASIC_CONSTRAINTS;
+  BASIC_CONSTRAINTS = record
+    ca: TC_INT;
+    pathlen: PASN1_INTEGER;
+  end;
+
+  PPKEY_USAGE_PERIOD = ^PKEY_USAGE_PERIOD;
+  PPPKEY_USAGE_PERIOD = ^PPKEY_USAGE_PERIOD;
+  PKEY_USAGE_PERIOD = record
+    notBefore: PASN1_GENERALIZEDTIME;
+    notAfter: PASN1_GENERALIZEDTIME;
+  end;
+
+  PACCESS_DESCRIPTION = ^ACCESS_DESCRIPTION;
+  PPACCESS_DESCRIPTION = ^PACCESS_DESCRIPTION;
+  ACCESS_DESCRIPTION = record
+      method: PASN1_OBJECT;
+      location: PGENERAL_NAME;
+  end;
+  PSTACK_OF_ACCESS_DESCRIPTION = PSTACK_OF;
+  PAUTHORITY_INFO_ACCESS = PSTACK_OF_ACCESS_DESCRIPTION;
+  PPAUTHORITY_INFO_ACCESS = ^PAUTHORITY_INFO_ACCESS;
+
+  DIST_POINT_NAME_union = record
+  case Byte of
+      0: (fullname: PGENERAL_NAMES);
+      1: (relativename: PSTACK_OF_X509_NAME_ENTRY);
+  end;
+
+  PDIST_POINT_NAME = ^DIST_POINT_NAME;
+  PPDIST_POINT_NAME = ^PDIST_POINT_NAME;
+  DIST_POINT_NAME = record
+    _type: TC_INT;
+    name: DIST_POINT_NAME_union;
+    dpname: PX509_NAME;
+  end;
+
+  PDIST_POINT = ^DIST_POINT;
+  PPDIST_POINT = ^PDIST_POINT;
+  DIST_POINT = record
+    distpoint: PDIST_POINT_NAME;
+    reasons: PASN1_BIT_STRING;
+    CRLissuer: PGENERAL_NAMES;
+    dp_reasons: TC_INT;
+  end;
+  PSTACK_OF_DIST_POINT = PSTACK_OF;
+  PCRL_DIST_POINTS = PSTACK_OF_DIST_POINT;
+  PPCRL_DIST_POINTS = ^PCRL_DIST_POINTS;
+
+  PSXNETID = ^SXNETID;
+  PPSXNETID = ^PSXNETID;
+  SXNETID = record
+      zone: PASN1_INTEGER;
+      user: PASN1_OCTET_STRING;
+  end;
+  PSTACK_OF_SXNETID = PSTACK_OF;
+
+  PSXNET = ^SXNET;
+  PPSXNET = ^PSXNET;
+  SXNET = record
+      version: PASN1_INTEGER;
+      ids: PSTACK_OF_SXNETID;
+  end;
+
+  PNOTICEREF = ^NOTICEREF;
+  PPNOTICEREF = ^PNOTICEREF;
+  NOTICEREF = record
+      organization: PASN1_STRING;
+      noticenos: PSTACK_OF_ASN1_INTEGER;
+  end;
+
+  PUSERNOTICE = ^USERNOTICE;
+  PPUSERNOTICE = ^PUSERNOTICE;
+  USERNOTICE = record
+      noticeref: PNOTICEREF;
+      exptext: PASN1_STRING;
+  end;
+
+  POLICYQUALINFO_union = record
+        cpsuri: PASN1_IA5STRING;
+        usernotice: PUSERNOTICE;
+        other: PASN1_TYPE;
+  end;
+
+  PPOLICYQUALINFO = ^POLICYQUALINFO;
+  PPPOLICYQUALINFO = ^PPOLICYQUALINFO;
+  POLICYQUALINFO = record
+      pqualid: PASN1_OBJECT;
+    d: POLICYQUALINFO_union
+  end;
+  PSTACK_OF_POLICYQUALINFO = PSTACK_OF;
+
+  PPOLICYINFO = ^POLICYINFO;
+  PPPOLICYINFO = ^PPOLICYINFO;
+  POLICYINFO =  record
+      policyid: PASN1_OBJECT;
+      qualifiers: PSTACK_OF_POLICYQUALINFO;
+  end;
+  PSTACK_OF_POLICYINFO = PSTACK_OF;
+  PCERTIFICATEPOLICIES = PSTACK_OF_POLICYINFO;
+  PPCERTIFICATEPOLICIES = ^PCERTIFICATEPOLICIES;
+
+  PPOLICY_MAPPING = ^POLICY_MAPPING;
+  POLICY_MAPPING = record
+      issuerDomainPolicy: PASN1_OBJECT;
+      subjectDomainPolicy: PASN1_OBJECT;
+  end;
+  PSTACK_OF_POLICY_MAPPING = PSTACK_OF;
+
+  PGENERAL_SUBTREE = ^GENERAL_SUBTREE;
+  GENERAL_SUBTREE = record
+      base: PGENERAL_NAME;
+      minimum: PASN1_INTEGER;
+      maximum: PASN1_INTEGER;
+  end;
+  PSTACK_OF_GENERAL_SUBTREE = PSTACK_OF;
+
+  PNAME_CONSTRAINTS = ^NAME_CONSTRAINTS;
+  NAME_CONSTRAINTS = record
+      permittedSubtrees: PSTACK_OF_GENERAL_SUBTREE;
+      excludedSubtrees: PSTACK_OF_GENERAL_SUBTREE;
+  end;
+
+  PPOLICY_CONSTRAINTS = ^POLICY_CONSTRAINTS;
+  POLICY_CONSTRAINTS = record
+      requireExplicitPolicy: PASN1_INTEGER;
+      inhibitPolicyMapping: PASN1_INTEGER;
+  end;
+
+  PPROXY_POLICY = ^PROXY_POLICY;
+  PPPROXY_POLICY = ^PPROXY_POLICY;
+  PROXY_POLICY = record
+    policyLanguage: PASN1_OBJECT;
+      policy: PASN1_OCTET_STRING;
+  end;
+
+  PPROXY_CERT_INFO_EXTENSION = ^PROXY_CERT_INFO_EXTENSION;
+  PPPROXY_CERT_INFO_EXTENSION = ^PPROXY_CERT_INFO_EXTENSION;
+  PROXY_CERT_INFO_EXTENSION = record
+      pcPathLengthConstraint: PASN1_INTEGER;
+      proxyPolicy: PPROXY_POLICY;
+  end;
+
+  PISSUING_DIST_POINT = ^ISSUING_DIST_POINT;
+  PPISSUING_DIST_POINT = ^PISSUING_DIST_POINT;
+  ISSUING_DIST_POINT = record
+      distpoint: PDIST_POINT_NAME;
+      onlyuser: TC_INT;
+      onlyCA: TC_INT;
+      onlysomereasons: PASN1_BIT_STRING;
+      indirectCRL: TC_INT;
+      onlyattr: TC_INT;
+  end;
+
+
+
+  PX509_PURPOSE = ^X509_PURPOSE;
+
+  X509_CHECK_PURPOSE_FUNC = function(p: PX509_PURPOSE; _x509: PX509; _i: TC_INT): TC_INT; cdecl;
+  X509_PURPOSE = record
+      purpose: TC_INT;
+      trust: TC_INT;
+      flags: TC_INT;
+      check_purpose: X509_CHECK_PURPOSE_FUNC;
+      name: PAnsiChar;
+      sname: PAnsiChar;
+      usr_data: Pointer;
+  end;
+  PSTACK_OF_X509_PURPOSE = PSTACK_OF;
+
+  PSTACK_OF_X509_POLICY_NODE = PSTACK_OF;
+  PSTACK_OF_OPENSSL_STRING = PSTACK_OF;
+
+  PX509_POLICY_DATA = ^X509_POLICY_DATA;
+  X509_POLICY_DATA = record
+      flags: TC_UINT;
+      valid_policy: PASN1_OBJECT;
+      qualifier_set: PSTACK_OF_POLICYQUALINFO;
+      expected_policy_set: PSTACK_OF_ASN1_OBJECT;
+  end;
+  PSTACK_OF_X509_POLICY_DATA = PSTACK_OF;
+
+  X509_POLICY_CACHE = record
+      anyPolicy: PX509_POLICY_DATA;
+      data: PSTACK_OF_X509_POLICY_DATA;
+      any_skip: TC_LONG;
+      explicit_skip: TC_LONG;
+      map_skip: TC_LONG;
+  end;
+
+
+  PX509_POLICY_NODE = ^X509_POLICY_NODE;
+  X509_POLICY_NODE = record
+    data: PX509_POLICY_DATA;
+      parent: PX509_POLICY_NODE;
+      nchild: TC_INT;
+  end;
+
+  PX509_POLICY_LEVEL = ^X509_POLICY_LEVEL;
+  X509_POLICY_LEVEL = record
+      cert: PX509;
+      nodes: PSTACK_OF_X509_POLICY_NODE;
+      anyPolicy: pX509_POLICY_NODE;
+      flags: TC_UINT;
+  end;
+
+  PX509_POLICY_TREE = ^X509_POLICY_TREE;
+  X509_POLICY_TREE = record
+      levels: PX509_POLICY_LEVEL;
+      nlevel: TC_INT;
+      extra_data: PSTACK_OF_X509_POLICY_DATA;
+      auth_policies: PSTACK_OF_X509_POLICY_NODE;
+      user_policies: PSTACK_OF_X509_POLICY_NODE;
+      flags: TC_UINT;
+  end;
+
+
+
+{$ENDREGION}
+
+{$REGION 'PEM'}
+
+    pem_password_cb = function(buf: PAnsiString; size: TC_INT; rwflag: TC_INT; userdata: pointer): integer; cdecl;
+
+{$ENDREGION}
+
+{$REGION 'PKCS7'}
+
+  PPKCS7 = ^PKCS7;
+  PPPKCS7 = ^PPKCS7;
+  PSTACK_OF_PKCS7_SIGNER_INFO = PSTACK;
+  PSTACK_OF_PKCS7_RECIP_INFO = PSTACK;
+
+  PKCS7_SIGNED = record
+    version : PASN1_INTEGER;
+    md_algs : PSTACK_OF_X509_ALGOR;
+    cert : PSTACK_OF_X509;
+    crl : PSTACK_OF_X509_CRL;
+    signer_info : PSTACK_OF_PKCS7_SIGNER_INFO;
+    contents : PPKCS7;
+  end;
+  PPKCS7_SIGNED = ^PKCS7_SIGNED;
+
+  PKCS7_ENC_CONTENT = record
+    content_type : PASN1_OBJECT;
+    algorithm : PX509_ALGOR;
+    enc_data : PASN1_OCTET_STRING;
+    cipher : PEVP_CIPHER;
+  end;
+  PPKCS7_ENC_CONTENT = ^PKCS7_ENC_CONTENT;
+
+  PKCS7_ENVELOPE = record
+    version : PASN1_INTEGER;
+    recipientinfo : PSTACK_OF_PKCS7_RECIP_INFO;
+    enc_data : PPKCS7_ENC_CONTENT;
+  end;
+  PPKCS7_ENVELOPE = ^PKCS7_ENVELOPE;
+  PPPKCS7_ENVELOPE = ^PPKCS7_ENVELOPE;
+
+  PKCS7_SIGN_ENVELOPE = record
+    version : PASN1_INTEGER;
+    md_algs : PSTACK_OF_X509_ALGOR;
+    cert : PSTACK_OF_X509;
+    crl : PSTACK_OF_X509_CRL;
+    signer_info : PSTACK_OF_PKCS7_SIGNER_INFO;
+    enc_data : PPKCS7_ENC_CONTENT;
+    recipientinfo : PSTACK_OF_PKCS7_RECIP_INFO;
+  end;
+  PPKCS7_SIGN_ENVELOPE = ^PKCS7_SIGN_ENVELOPE;
+  PPPKCS7_SIGN_ENVELOPE = ^PPKCS7_SIGN_ENVELOPE;
+
+  PKCS7_DIGEST = record
+    version : PASN1_INTEGER;
+    md : PX509_ALGOR;
+    contents : PPKCS7;
+    digest : PASN1_OCTET_STRING;
+  end;
+  PPKCS7_DIGEST = ^PKCS7_DIGEST;
+
+  PKCS7_ENCRYPT = record
+    version : PASN1_INTEGER;
+    enc_data : PPKCS7_ENC_CONTENT;
+  end;
+  PPKCS7_ENCRYPT = ^PKCS7_ENCRYPT;
+    PPPKCS7_ENCRYPT = ^PPKCS7_ENCRYPT;
+
+  PKCS7_union = record
+    case Integer of
+      0 : (ptr : PAnsiChar);
+      1 : (data : PASN1_OCTET_STRING);
+      2 : (sign : PPKCS7_SIGNED);
+      3 : (enveloped : PPKCS7_ENVELOPE);
+      4 : (signed_and_enveloped : PPKCS7_SIGN_ENVELOPE);
+      5 : (digest : PPKCS7_DIGEST);
+      6 : (encrypted : PPKCS7_ENCRYPT);
+  end;
+
+  PKCS7 = record
+    asn1 : PAnsiChar;
+    length : TC_LONG;
+    state : TC_INT;
+    detached : TC_INT;
+    _type : PASN1_OBJECT;
+    d : PKCS7_union;
+  end;
+{$ENDREGION}
+
+{$REGION 'AES'}
+
+
+  AES_KEY = record
+{$IFDEF AES_LONG}
+    rd_key: array[0..(4*(AES_MAXNR + 1))-1] of TC_ULONG;
+{$ELSE}
+    rd_key: array[0..(4*(AES_MAXNR + 1))-1] of TC_UINT;
+{$ENDIF}
+   rounds: TC_INT;
+  end;
+  PAES_KEY = ^AES_KEY;
+
+  aes_buf = array[0..AES_BLOCK_SIZE-1] of Char;
+
+{$ENDREGION}
+
+{$REGION 'BLOWFISH'}
+
+
+  BF_KEY = record
+    P: array [0..BF_ROUNDS+1] of BF_LONG;
+    S: array [0..(4*256)-1] of BF_LONG;
+  end;
+  PBF_KEY = ^BF_KEY;
+
+{$ENDREGION}
+
+{$REGION 'CMAX'}
+
+
+  CMAC_CTX = record
+    cctx: EVP_CIPHER_CTX;
+    k1: array[0..EVP_MAX_BLOCK_LENGTH - 1] of TC_UCHAR;
+    k2: array[0..EVP_MAX_BLOCK_LENGTH - 1] of TC_UCHAR;
+    tbl: array[0..EVP_MAX_BLOCK_LENGTH - 1] of TC_UCHAR;
+    last_block: array[0..EVP_MAX_BLOCK_LENGTH - 1] of TC_UCHAR;
+    nlast_block: TC_INT;
+  end;
+  PCMAC_CTX = ^CMAC_CTX;
+
+{$ENDREGION}
+
+{$REGION 'CMS'}
+
+  STACK_OF_CMS_SignerInfo = STACK_OF;
+  PSTACK_OF_CMS_SignerInfo = ^STACK_OF_CMS_SignerInfo;
+
+  STACK_OF_CMS_CertificateChoices = STACK_OF;
+  PSTACK_OF_CMS_CertificateChoices = ^STACK_OF_CMS_CertificateChoices;
+
+  STACK_OF_CMS_RevocationInfoChoice = STACK_OF;
+  PSTACK_OF_CMS_RevocationInfoChoice = ^STACK_OF_CMS_RevocationInfoChoice;
+
+  STACK_OF_CMS_RecipientInfo = STACK_OF;
+  PSTACK_OF_CMS_RecipientInfo = ^STACK_OF_CMS_RecipientInfo;
+
+  STACK_OF_CMS_RecipientEncryptedKey = STACK_OF;
+  PSTACK_OF_CMS_RecipientEncryptedKey = ^STACK_OF_CMS_RecipientEncryptedKey;
+
+  PCMS_EncapsulatedContentInfo = ^CMS_EncapsulatedContentInfo;
+  CMS_EncapsulatedContentInfo = record
+    eContentType: PASN1_OBJECT;
+    eContent : PASN1_OCTET_STRING;
+    partial: TC_INT;
+  end;
+
+  CMS_SignedData = record
+   version: TC_LONG;
+   digestAlgoritm: PSTACK_OF;
+   encapContentInfo: PCMS_EncapsulatedContentInfo;
+   certificates: PSTACK_OF_CMS_CertificateChoices;
+   signerInfos: PSTACK_OF_CMS_SignerInfo;
+  end;
+  PCMS_SignedData = ^CMS_SignedData;
+
+  PCMS_OriginatorInfo = ^CMS_OriginatorInfo;
+  CMS_OriginatorInfo = record
+     certificates: PSTACK_OF_CMS_CertificateChoices;
+     crls: PSTACK_OF_CMS_RevocationInfoChoice
+  end;
+
+  PCMS_EncryptedContentInfo = ^CMS_EncryptedContentInfo;
+  CMS_EncryptedContentInfo = record
+      contentType: PASN1_OBJECT;
+      contentEncryptionAlgorithm: PX509_ALGOR;
+      encryptedContent: PASN1_OCTET_STRING;
+      cipher: PEVP_CIPHER;
+    key: PAnsiChar;
+      keylen: TC_SIZE_T;
+      debug: TC_INT;
+    end;
+
+  PCMS_EnvelopedData = ^CMS_EnvelopedData;
+  CMS_EnvelopedData = record
+      version: TC_LONG;
+    originatorInfo: PCMS_OriginatorInfo;
+    recipientInfos: PSTACK_OF_CMS_RecipientInfo;
+      encryptedContentInfo: PCMS_EncryptedContentInfo;
+    unprotectedAttrs: PSTACK_OF_X509_ATTRIBUTE
+  end;
+
+  PCMS_DigestedData = ^CMS_DigestedData;
+  CMS_DigestedData = record
+      version: TC_LONG;
+      digestAlgorithm: PX509_ALGOR;
+      encapContentInfo: PCMS_EncapsulatedContentInfo;
+      digest: PASN1_OCTET_STRING;
+  end;
+
+  PCMS_EncryptedData = ^CMS_EncryptedData;
+  CMS_EncryptedData = record
+    version: TC_LONG;
+    encryptedContentInfo: PCMS_EncryptedContentInfo;
+    unprotectedAttrs: PSTACK_OF_X509_ATTRIBUTE
+  end;
+
+  PCMS_AuthenticatedData = ^CMS_AuthenticatedData;
+  CMS_AuthenticatedData = record
+    version: TC_LONG;
+      originatorInfo: PCMS_OriginatorInfo;
+    recipientInfos: PSTACK_OF_CMS_RecipientInfo;
+    macAlgorithm: PX509_ALGOR;
+      digestAlgorithm: PX509_ALGOR;
+      encapContentInfo: PCMS_EncapsulatedContentInfo;
+      authAttrs: PSTACK_OF_X509_ATTRIBUTE;
+      mac: PASN1_OCTET_STRING;
+      unauthAttrs: PSTACK_OF_X509_ATTRIBUTE;
+  end;
+
+  PCMS_CompressedData = ^CMS_CompressedData;
+  CMS_CompressedData = record
+    version: TC_LONG;
+    compressionAlgorithm: PX509_ALGOR;
+    recipientInfos: PSTACK_OF_CMS_RecipientInfo;
+    encapContentInfo: PCMS_EncapsulatedContentInfo;
+  end;
+
+  CMS_ContentInfo_union = record
+  case byte  of
+    0: (data: PASN1_OCTET_STRING);
+    1: (signedData: PCMS_SignedData);
+    2: (envelopedData: PCMS_EnvelopedData);
+    3: (digestedData: PCMS_DigestedData);
+    4: (encryptedData: PCMS_EncryptedData);
+    5: (authenticatedData: PCMS_AuthenticatedData);
+    6: (compressedData: PCMS_CompressedData);
+    7: (other: PASN1_TYPE);
+    8: (otherData: Pointer);
+  end;
+
+  PCMS_ContentInfo = ^CMS_ContentInfo;
+    PPCMS_ContentInfo = ^PCMS_ContentInfo;
+  CMS_ContentInfo = record
+     contentType: PASN1_OBJECT;
+     d: CMS_ContentInfo_union;
+  end;
+
+  PCMS_IssuerAndSerialNumber = ^CMS_IssuerAndSerialNumber;
+  CMS_IssuerAndSerialNumber = record
+      issuer: PX509_NAME;
+    serialNumber: PASN1_INTEGER;
+  end;
+
+   CMS_SignerIdentifier_union = record
+    case byte of
+      0: (issuerAndSerialNumber: PCMS_IssuerAndSerialNumber);
+      1: (subjectKeyIdentifier: PASN1_OCTET_STRING);
+   end;
+
+   PCMS_SignerIdentifier = ^CMS_SignerIdentifier;
+   CMS_SignerIdentifier = record
+       _type: TC_INT;
+     d: CMS_SignerIdentifier_union;
+   end;
+   PCMS_RecipientIdentifier = ^CMS_RecipientIdentifier;
+   CMS_RecipientIdentifier = CMS_SignerIdentifier;
+
+     PCMS_SignerInfo = ^CMS_SignerInfo;
+     PPCMS_SignerInfo = ^PCMS_SignerInfo;
+   CMS_SignerInfo = record
+     version: TC_LONG;
+     sid: PCMS_SignerIdentifier;
+     digestAlgorithm: PX509_ALGOR;
+     signedAttrs: PSTACK_OF_X509_ATTRIBUTE;
+     signatureAlgorithm: PX509_ALGOR;
+     signature: PASN1_OCTET_STRING;
+     unsignedAttrs: PSTACK_OF_X509_ATTRIBUTE;
+     signer: PX509;
+     pkey: PEVP_PKEY;
+   end;
+
+  PCMS_KeyTransRecipientInfo = ^CMS_KeyTransRecipientInfo;
+  CMS_KeyTransRecipientInfo = record
+    version: TC_LONG;
+    rid: PCMS_RecipientIdentifier;
+    keyEncryptionAlgorithm: PX509_ALGOR;
+    encryptedKey: PASN1_OCTET_STRING;
+    recip: PX509;
+    pkey: EVP_PKEY;
+  end;
+
+  PCMS_OriginatorPublicKey = ^CMS_OriginatorPublicKey;
+  CMS_OriginatorPublicKey = record
+    algorithm: PX509_ALGOR;
+    publicKey: PASN1_BIT_STRING;
+  end;
+
+  PCMS_OtherKeyAttribute= ^CMS_OtherKeyAttribute;
+  CMS_OtherKeyAttribute = record
+    keyAttrId: ASN1_OBJECT;
+    keyAttr: ASN1_TYPE;
+  end;
+
+
+  PCMS_RecipientKeyIdentifier = ^CMS_RecipientKeyIdentifier;
+  CMS_RecipientKeyIdentifier = record
+    subjectKeyIdentifier: PASN1_OCTET_STRING;
+    date: PASN1_GENERALIZEDTIME;
+    other: PCMS_OtherKeyAttribute;
+  end;
+
+  CMS_KeyAgreeRecipientIdentifier_union = record
+   case byte of
+    0: (issuerAndSerialNumber: PCMS_IssuerAndSerialNumber);
+    1: (rKeyId: PCMS_RecipientKeyIdentifier);
+  end;
+
+  PCMS_KeyAgreeRecipientIdentifier = ^CMS_KeyAgreeRecipientIdentifier;
+  CMS_KeyAgreeRecipientIdentifier = record
+       _type: TC_INT;
+     d: CMS_KeyAgreeRecipientIdentifier_union;
+  end;
+
+
+  PCMS_RecipientEncryptedKey = ^CMS_RecipientEncryptedKey;
+  CMS_RecipientEncryptedKey = record
+    rid: PCMS_KeyAgreeRecipientIdentifier;
+    encryptedKey: PASN1_OCTET_STRING;
+  end;
+
+
+  CMS_OriginatorIdentifierOrKey_union = record
+   case Byte of
+    0: (issuerAndSerialNumber: PCMS_IssuerAndSerialNumber);
+    1: (subjectKeyIdentifier: PASN1_OCTET_STRING);
+    2: (originatorKey: PCMS_OriginatorPublicKey);
+  end;
+
+  PCMS_OriginatorIdentifierOrKey = ^CMS_OriginatorIdentifierOrKey;
+  CMS_OriginatorIdentifierOrKey = record
+       _type: TC_INT;
+     d: CMS_OriginatorIdentifierOrKey_union;
+  end;
+
+  PCMS_KeyAgreeRecipientInfo = ^CMS_KeyAgreeRecipientInfo;
+  CMS_KeyAgreeRecipientInfo = record
+    version: TC_LONG;
+    originator: PCMS_OriginatorIdentifierOrKey;
+    ukm: PASN1_OCTET_STRING;
+    keyEncryptionAlgorithm: PX509_ALGOR;
+    recipientEncryptedKeys: PSTACK_OF_CMS_RecipientEncryptedKey;
+  end;
+
+  PCMS_KEKIdentifier = ^CMS_KEKIdentifier;
+  CMS_KEKIdentifier = record
+    keyIdentifier: PASN1_OCTET_STRING;
+    date: PASN1_GENERALIZEDTIME;
+    other: PCMS_OtherKeyAttribute;
+  end;
+
+  PCMS_KEKRecipientInfo = ^CMS_KEKRecipientInfo;
+  CMS_KEKRecipientInfo = record
+    version: TC_LONG;
+    kekid: CMS_KEKIdentifier;
+    keyEncryptionAlgorithm: PX509_ALGOR;
+    encryptedKey: PASN1_OCTET_STRING;
+    key: PAnsiChar;
+    keylen: TC_SIZE_T;
+  end;
+
+  PCMS_PasswordRecipientInfo = ^CMS_PasswordRecipientInfo;
+  CMS_PasswordRecipientInfo = record
+    version: TC_LONG;
+    keyDerivationAlgorithm: PX509_ALGOR;
+    keyEncryptionAlgorithm: PX509_ALGOR;
+    encryptedKey: PASN1_OCTET_STRING;
+    pass: PAnsiChar;
+    passlen: TC_SIZE_T;
+  end;
+
+  PCMS_OtherRecipientInfo = ^CMS_OtherRecipientInfo;
+  CMS_OtherRecipientInfo = record
+    oriType: ASN1_OBJECT;
+    oriValue: ASN1_TYPE;
+  end;
+
+  CMS_RecipientInfo_union = record
+  case byte of
+    0: (ktri: PCMS_KeyTransRecipientInfo);
+    1: (kari: PCMS_KeyAgreeRecipientInfo);
+    2: (kekri: PCMS_KEKRecipientInfo);
+    3: (pwri: PCMS_PasswordRecipientInfo);
+    4: (ori: PCMS_OtherRecipientInfo);
+  end;
+
+  PCMS_RecipientInfo = ^CMS_RecipientInfo;
+  CMS_RecipientInfo = record
+      _type: TC_INT;
+    d: CMS_RecipientInfo_union;
+  end;
+
+  PCMS_OtherRevocationInfoFormat = ^CMS_OtherRevocationInfoFormat;
+  CMS_OtherRevocationInfoFormat = record
+    otherRevInfoFormat: PASN1_OBJECT;
+    otherRevInfo: PASN1_TYPE;
+  end;
+
+  CMS_RevocationInfoChoice_union = record
+   case byte of
+    0: (crl: PX509_CRL);
+    1: (other: PCMS_OtherRevocationInfoFormat);
+  end;
+
+  PCMS_RevocationInfoChoice = ^CMS_RevocationInfoChoice;
+  CMS_RevocationInfoChoice = record
+      _type: TC_INT;
+      d:CMS_RevocationInfoChoice_union;
+  end;
+
+  PCMS_OtherCertificateFormat = ^CMS_OtherCertificateFormat;
+  CMS_OtherCertificateFormat = record
+    otherCertFormat: PASN1_OBJECT;
+    otherCert: PASN1_TYPE;
+  end;
+
+  CMS_CertificateChoices_union = record
+  case byte of
+    0: (certificate: PX509);
+    1: (extendedCertificate: PASN1_STRING);
+    2: (v1AttrCert: PASN1_STRING);
+    3: (v2AttrCert: PASN1_STRING);
+    4: (other: PCMS_OtherCertificateFormat);
+  end;
+
+  PCMS_CertificateChoices = ^CMS_CertificateChoices;
+  CMS_CertificateChoices = record
+    _type: TC_INT;
+    d:CMS_CertificateChoices_union;
+  end;
+
+    CMS_RECEIPTSFROM_union = record
+    case byte of
+        0: (_allOrFirstTier: TC_LONG);
+        1: (_receiptList: PSTACK_OF_GENERAL_NAMES);
+    end; { record }
+
+    PCMS_RECEIPTSFROM = ^CMS_RECEIPTSFROM;
+    PPCMS_RECEIPTSFROM = ^PCMS_RECEIPTSFROM;
+    CMS_RECEIPTSFROM = record
+        _type: TC_INT;
+        d: CMS_RECEIPTSFROM_union;
+    end; { record }
+
+    PCMS_RECEIPTREQUEST = ^CMS_RECEIPTREQUEST;
+    PPCMS_RECEIPTREQUEST = ^PCMS_RECEIPTREQUEST;
+    CMS_RECEIPTREQUEST = record
+        _signedContentIdentifier: PASN1_OCTET_STRING;
+        _receiptsFrom: PCMS_ReceiptsFrom;
+         _receiptsTo: PSTACK_OF_GENERAL_NAMES;
+    end; { record }
+
+{$ENDREGION}
+
+{$REGION 'DES'}
+
+
+  DES_cblock = array[0..7] of TC_UCHAR;
+  PDES_cblock = ^DES_cblock;
+  const_DES_cblock = array[0..7] of TC_UCHAR;
+  Pconst_DES_cblock = ^const_DES_cblock;
+  DES_cblock_array = array of DES_cblock;
+
+  DES_key_schedule_union = record
+  case Byte of
+     0: (cblock: DES_cblock);
+     1: (deslong: array[0..1] of DES_LONG);
+  end;
+
+  PDES_key_schedule = ^DES_key_schedule;
+  DES_key_schedule = record
+    ks: array[0..15] of DES_key_schedule_union;
+  end;
+
+{$ENDREGION}
+
+
+{$REGION 'ENGINE'}
+{$ENDREGION}
+
+{$REGION 'RAND'}
+
+    PRAND_METHOD = ^RAND_METHOD;
+    RAND_METHOD = record
+        seed: procedure(buf: Pointer; num: TC_INT); cdecl;
+        bytes: function(buf: PAnsiChar; num: TC_INT): TC_INT; cdecl;
+        cleanup: procedure; cdecl;
+        add: procedure(buf: Pointer;num: TC_INT;entropy: Double); cdecl;
+        pseudorand: function(buf: PAnsiChar; num: TC_INT): TC_INT; cdecl;
+        status: function: TC_INT; cdecl;
+    end;
+
+
+{$ENDREGION}
+
+
+  PECDH_METHOD = ^ECDH_METHOD;
+  PECDSA_METHOD = ^ECDSA_METHOD;
+  PSTORE_METHOD = Pointer;
+
+{$REGION 'CAMELLIA'}
+
+    KEY_TABLE_TYPE = array [0..CAMELLIA_TABLE_WORD_LEN-1] of TC_UINT;
+    CAMELLIA_BUF = array[0..CAMELLIA_BLOCK_SIZE-1] of AnsiChar;
+    CAMELLIA_KEY_union = record
+     case byte of
+        0: (d: double);
+        1: (rd_key: KEY_TABLE_TYPE);
+    end;
+
+    PCAMELLIA_KEY = ^CAMELLIA_KEY;
+    CAMELLIA_KEY = record
+        u: CAMELLIA_KEY_union;
+        grand_rounds: TC_INT;
+    end;
+
+{$ENDREGION}
+
+{$REGION 'COMP'}
+
+    PCOMP_CTX = ^COMP_CTX;
+    PCOMP_METHOD = ^COMP_METHOD;
+    COMP_METHOD = record
+        _type: TC_INT;
+        name: PAnsiChar;
+        init: function(ctx: PCOMP_CTX): TC_INT; cdecl;
+        finish: procedure(ctx: PCOMP_CTX); cdecl;
+        compress: function(ctx: PCOMP_CTX; _out: PAnsiChar; olen: TC_UINT; _in: PAnsiChar; ilen: TC_UINT): TC_INT; cdecl;
+        expand: function(ctx: PCOMP_CTX; _out: PAnsiChar; olen: TC_UINT; _in: PAnsiChar; ilen: TC_UINT): TC_INT; cdecl;
+        ctrl: function: TC_LONG; cdecl;
+        callback_ctrl: function: TC_LONG; cdecl;
+    end;
+
+    COMP_CTX = record
+        meth: PCOMP_METHOD;
+        compress_in: TC_ULONG;
+        compress_out: TC_ULONG;
+        expand_in: TC_ULONG;
+        expand_out: TC_ULONG;
+        ex_data: CRYPTO_EX_DATA;
+    end;
+
+
+{$ENDREGION}
+
+
+  SK_POP_FREE_PROC = procedure(_par1: Pointer); cdecl;
+
+  tm = record
+    tm_sec: Integer;            // Seconds. [0-60] (1 leap second)
+    tm_min: Integer;            // Minutes. [0-59]
+    tm_hour: Integer;           // Hours.[0-23]
+    tm_mday: Integer;           // Day.[1-31]
+    tm_mon: Integer;            // Month.[0-11]
+    tm_year: Integer;           // Year since 1900
+    tm_wday: Integer;           // Day of week [0-6] (Sunday = 0)
+    tm_yday: Integer;           // Days of year [0-365]
+    tm_isdst: Integer;          // Daylight Savings flag [-1/0/1]
+    tm_gmtoff: LongInt;         // Seconds east of UTC
+    tm_zone: PAnsiChar;         // Timezone abbreviation
+  end;
+  Ptm = ^tm;
+
+{$REGION 'PKCS12'}
+
+    PPKCS12_MAC_DATA = ^PKCS12_MAC_DATA;
+    PPPKCS12_MAC_DATA = ^PPKCS12_MAC_DATA;
+    PKCS12_MAC_DATA = record
+        dinfo: PX509_SIG;
+        salt: PASN1_OCTET_STRING;
+        iter: PASN1_INTEGER;
+    end;
+
+    PPKCS12 = ^PKCS12;
+    PPPKCS12 = ^PPKCS12;
+    PKCS12 = record
+        version: PASN1_INTEGER;
+        mac: PPKCS12_MAC_DATA;
+        authsafes: PPKCS7;
+    end;
+
+    PKCS12_BAGS_union = record
+    case byte of
+     0: (x509cert: PASN1_OCTET_STRING);
+     1: (x509crl: PASN1_OCTET_STRING);
+     2: (octet: PASN1_OCTET_STRING);
+     3: (sdsicert: PASN1_IA5STRING);
+     4: (other: PASN1_TYPE);
+    end; { record }
+
+    PPKCS12_BAGS = ^PKCS12_BAGS;
+    PPPKCS12_BAGS = ^PPKCS12_BAGS;
+    PKCS12_BAGS = record
+        _type: PASN1_OBJECT;
+        value: PKCS12_BAGS_union;
+    end; { record }
+
+    PSTACK_OF_PKCS12_SAFEBAG = PSTACK_OF;
+    PPSTACK_OF_PKCS12_SAFEBAG = ^PSTACK_OF_PKCS12_SAFEBAG;
+    PPKCS12_SAFEBAG = ^PKCS12_SAFEBAG;
+    PPPKCS12_SAFEBAG = ^PPKCS12_SAFEBAG;
+    PKCS12_SAFEBAG_union = record
+        bag: PPKCS12_BAGS;
+        keybag: PPKCS8_PRIV_KEY_INFO;
+        shkeybag: PX509_SIG;
+        safes: PSTACK_OF_PKCS12_SAFEBAG;
+        other: PASN1_TYPE;
+    end; { record }
+
+    PKCS12_SAFEBAG = record
+        _type: PASN1_OBJECT;
+        value: PKCS12_SAFEBAG_union;
+        attrib: PSTACK_OF_X509_ATTRIBUTE;
+    end; { record }
+    PSTACK_OF_PKCS7 = PSTACK_OF;
+    PPSTACK_OF_PKCS7 = ^PSTACK_OF_PKCS7;
+
+    PPKCS7_ISSUER_AND_SERIAL = ^PKCS7_ISSUER_AND_SERIAL;
+    PPPKCS7_ISSUER_AND_SERIAL = ^PPKCS7_ISSUER_AND_SERIAL;
+    PKCS7_ISSUER_AND_SERIAL = record
+        issuer: PX509_NAME;
+        serial: PASN1_INTEGER;
+    end; { record }
+
+    PPKCS7_SIGNER_INFO = ^PKCS7_SIGNER_INFO;
+    PPPKCS7_SIGNER_INFO = ^PPKCS7_SIGNER_INFO;
+    PKCS7_SIGNER_INFO = record
+        version: PASN1_INTEGER;
+        issuer_and_serial: PPKCS7_ISSUER_AND_SERIAL;
+        digest_alg: PX509_ALGOR;
+        auth_attr: PSTACK_OF_X509_ATTRIBUTE;
+        digest_enc_alg: PX509_ALGOR;
+        enc_digest: PASN1_OCTET_STRING;
+        unauth_attr: PSTACK_OF_X509_ATTRIBUTE;
+        pkey: PEVP_PKEY;
+    end; { record }
+
+
+    PPKCS7_RECIP_INFO = ^PKCS7_RECIP_INFO;
+    PPPKCS7_RECIP_INFO = ^PPKCS7_RECIP_INFO;
+    PKCS7_RECIP_INFO = record
+        _version: PASN1_INTEGER;
+        _issuer_and_serial: PPKCS7_ISSUER_AND_SERIAL;
+        _key_enc_algor: PX509_ALGOR;
+        _enc_key: PASN1_OCTET_STRING;
+        _cert: PX509;
+    end; { record }
+
+    PPPKCS7_SIGNED = ^PPKCS7_SIGNED;
+    PSTACK_OF_PKCS7_SIGNED = PSTACK_OF;
+
+    PPPKCS7_ENC_CONTENT = ^PPKCS7_ENC_CONTENT;
+
+    PPKCS7_ENVELOPED = ^PKCS7_ENVELOPED;
+    PPPKCS7_ENVELOPED = ^PPKCS7_ENVELOPED;
+    PKCS7_ENVELOPED = record
+        _version: PASN1_INTEGER;
+        recipientinfo: PSTACK_OF_PKCS7_RECIP_INFO;
+        _enc_data: PPKCS7_ENC_CONTENT;
+    end; { record }
+
+    PKCS7_SIGNEDANDENVELOPED = record
+        _version: PASN1_INTEGER;
+        _md_algs: PSTACK_OF_X509_ALGOR;
+        _cert: PSTACK_OF_X509;
+        _crl: PSTACK_OF_X509_CRL;
+        _signer_info: PSTACK_OF_PKCS7_SIGNER_INFO;
+        _enc_data: PPKCS7_ENC_CONTENT   ;
+        _recipientinfo: PSTACK_OF_PKCS7_RECIP_INFO;
+    end; { record }
+
+    PPPKCS7_DIGEST = ^PPKCS7_DIGEST;
+
+    PPKCS7_ENCRYPTED = ^PKCS7_ENCRYPTED;
+    PPPKCS7_ENCRYPTED = ^PPKCS7_ENCRYPTED;
+    PKCS7_ENCRYPTED = record
+        _version: PASN1_INTEGER;
+        _enc_data: PPKCS7_ENC_CONTENT;
+    end; { record }
+
+  PPKCS7_ATTR_SIGN = Pointer;
+    PPPKCS7_ATTR_SIGN = ^PPKCS7_ATTR_SIGN;
+    PPKCS7_ATTR_VERIFY = Pointer;
+    PPPKCS7_ATTR_VERIFY = ^PPKCS7_ATTR_VERIFY;
+{$ENDREGION}
+
+{$REGION 'ECDH'}
+
+    ecdh_kdf = function(const _in: Pointer; _inlen: TC_SIZE_T; _out: Pointer; var _outlen: TC_SIZE_T): pointer; cdecl;
+
+    PPECDH_METHOD = ^PECDH_METHOD;
+    ECDH_METHOD = record
+        _name: PAnsiChar;
+      _compute_key: function(_key: Pointer; _outlen: TC_SIZE_T; const _pub_key: PEC_POINT; _ecdh: PEC_KEY; kdf: ecdh_kdf): TC_INT; cdecl;
+      _init: function(_eckey: PEC_KEY): TC_INT; cdecl;
+      _finish: function(_eckey: PEC_KEY): TC_INT; cdecl;
+      _flags: TC_INT;
+      _app_data: PAnsiChar;
+    end; { record }
+
+{$ENDREGION}
+
+{$REGION 'ECDSA'}
+
+    PECDSA_SIG = ^ECDSA_SIG;
+    PPECDSA_SIG = ^PECDSA_SIG;
+    ECDSA_SIG = record
+        _r: PBIGNUM;
+        _s: PBIGNUM;
+    end; { record }
+
+    PPECDSA_METHOD = ^PECDSA_METHOD;
+    ECDSA_METHOD = record
+        _name: PAnsiChar;
+        ecdsa_do_sign: function(const _dgst: PAnsiChar; _dgst_len: TC_INT; const _inv: PBIGNUM; const _rp: PBIGNUM; _eckey: PEC_KEY): PECDSA_SIG; cdecl;
+        ecdsa_sign_setup: function(_eckey: PEC_KEY; _ctx: PBN_CTX; _kinv: PPBIGNUM ; _r: PPBIGNUM ): TC_INT; cdecl;
+        ecdsa_do_verify: function(const _dgst: PAnsiChar; _dgst_len: TC_INT; const _sig: PPECDSA_SIG; _eckey: PPEC_KEY): TC_INT; cdecl;
+        init: function(_eckey: PEC_KEY): TC_INT; cdecl;
+        finish: function(_eckey: PEC_KEY): TC_INT; cdecl;
+        _flags: TC_INT;
+        _app_data: PAnsiChar;
+    end; { record }
+
+{$ENDREGION}
+
+{$REGION 'HMAC'}
+    PHMAC_CTX = ^HMAC_CTX;
+    PPHMAC_CTX = ^PHMAC_CTX;
+    HMAC_CTX = record
+        _md: PEVP_MD;
+        _md_ctx: EVP_MD_CTX;
+        _i_ctx: EVP_MD_CTX;
+        _o_ctx: EVP_MD_CTX;
+        _key_length: TC_UINT;
+        key: array[0..HMAC_MAX_MD_CBLOCK - 1] of ansichar;
+    end; { record }
+
+{$ENDREGION}
+
+
+{$REGION 'IDEA'}
+
+  PIDEA_KEY_SCHEDULE = ^IDEA_KEY_SCHEDULE;
+    PPIDEA_KEY_SCHEDULE = ^PIDEA_KEY_SCHEDULE;
+    IDEA_KEY_SCHEDULE = record
+     _data: array[0..8,0..5] of IDEA_INT;
+    end;
+
+{$ENDREGION}
+
+{$REGION 'MD4'}
+
+    PMD4_CTX = ^MD4_CTX;
+    PPMD4_CTX = ^PMD4_CTX;
+    MD4_CTX = record
+        A,B,C,D: MD4_LONG;
+        Nl,Nh: MD4_LONG;
+        data: array[0..MD4_LBLOCK - 1] of MD4_LONG;
+        _num: TC_UINT;
+    end; { record }
+
+{$ENDREGION}
+
+{$REGION 'MD5'}
+
+    PMD5_CTX = ^MD5_CTX;
+    PPMD5_CTX = ^PMD5_CTX;
+    MD5_CTX = record
+        A,B,C,D: MD5_LONG;
+        Nl,Nh: MD5_LONG;
+        data: array[0..MD5_LBLOCK-1] of MD5_LONG;
+        _num: TC_UINT;
+    end; { record }
+
+{$ENDREGION}
+
+{$REGION 'MDC2'}
+
+    PMDC2_CTX = ^MDC2_CTX;
+    PPMDC2_CTX = ^PMDC2_CTX;
+    MDC2_CTX = record
+        _num: TC_UINT;
+        _data: array[0..MDC2_BLOCK-1] of AnsiChar;
+        _h, _hh: DES_cblock;
+        _pad_type: TC_INT;
+    end; { record }
+
+{$ENDREGION}
+
+{$REGION 'OCSP}
+
+    POCSP_CERTID = ^OCSP_CERTID;
+    PPOCSP_CERTID = ^POCSP_CERTID;
+    OCSP_CERTID = record
+        _hashAlgorithm: PX509_ALGOR;
+        _issuerNameHash: PASN1_OCTET_STRING;
+        _issuerKeyHash: PASN1_OCTET_STRING;
+        _serialNumber: PASN1_INTEGER;
+    end; { record }
+    PSTACK_OF_OCSP_CERT_ID = PSTACK_OF;
+
+    POCSP_ONEREQ = ^OCSP_ONEREQ;
+    PPOCSP_ONEREQ = ^POCSP_ONEREQ;
+    OCSP_ONEREQ = record
+        _reqCert: POCSP_CERTID;
+        _singleRequestExtensions: PSTACK_OF_X509_EXTENSION;
+    end; { record }
+    PSTACK_OF_OCSP_ONEREQ = PSTACK_OF;
+
+    POCSP_REQINFO = ^OCSP_REQINFO;
+    PPOCSP_REQINFO = ^POCSP_REQINFO;
+    OCSP_REQINFO = record
+        _version: PASN1_INTEGER;
+        _requestorName: PGENERAL_NAME;
+        _requestList: PSTACK_OF_OCSP_ONEREQ;
+        _requestExtensions: PSTACK_OF_X509_EXTENSION;
+    end; { record }
+
+    POCSP_SIGNATURE = ^OCSP_SIGNATURE;
+    PPOCSP_SIGNATURE = ^POCSP_SIGNATURE;
+    OCSP_SIGNATURE = record
+        _signatureAlgorithm: PX509_ALGOR;
+        _signature: PASN1_BIT_STRING;
+        _certs: PSTACK_OF_X509;
+    end; { record }
+
+    POCSP_REQUEST = ^OCSP_REQUEST;
+    PPOCSP_REQUEST = ^POCSP_REQUEST;
+    OCSP_REQUEST = record
+        _tbsRequest: POCSP_REQINFO;
+        _optionalSignature: POCSP_SIGNATURE;
+    end; { record }
+
+    POCSP_RESPBYTES = ^OCSP_RESPBYTES;
+    PPOCSP_RESPBYTES = ^POCSP_RESPBYTES;
+    OCSP_RESPBYTES = record
+        _responseType: PASN1_OBJECT;
+        _response: PASN1_OCTET_STRING;
+    end; { record }
+
+    POCSP_RESPONSE = ^OCSP_RESPONSE;
+    PPOCSP_RESPONSE = ^POCSP_RESPONSE;
+    OCSP_RESPONSE = record
+        _responseStatus: PASN1_ENUMERATED;
+        _responseBytes: POCSP_RESPBYTES ;
+    end; { record }
+
+    OCSP_RESPONDER_ID_union = record
+    case byte of
+        0: (_byName: PX509_NAME);
+        1: (_byKey: PASN1_OCTET_STRING);
+    end; { record }
+
+    POCSP_RESPID = ^OCSP_RESPID;
+    PPOCSP_RESPID = ^POCSP_RESPID;
+    OCSP_RESPID = record
+        _type: TC_INT;
+        _value: OCSP_RESPONDER_ID_union;
+    end; { record }
+
+    PSTACK_OF_OCSP_RESPID = PSTACK_OF;
+
+    POCSP_REVOKEDINFO = ^OCSP_REVOKEDINFO;
+    PPOCSP_REVOKEDINFO = ^POCSP_REVOKEDINFO;
+    OCSP_REVOKEDINFO = record
+        _revocationTime: PASN1_GENERALIZEDTIME;
+        _revocationReason: PASN1_ENUMERATED;
+    end; { record }
+
+    OCSP_CERTSTATUS_union = record
+    case byte of
+        0: (_good: PASN1_NULL);
+        1: (_revoked: POCSP_REVOKEDINFO);
+        2: (_unknown: PASN1_NULL);
+    end; { record }
+
+    POCSP_CERTSTATUS = ^OCSP_CERTSTATUS;
+    PPOCSP_CERTSTATUS = ^POCSP_CERTSTATUS;
+    OCSP_CERTSTATUS = record
+        _type: TC_INT;
+        _value :OCSP_CERTSTATUS_union;
+    end;
+
+    POCSP_SINGLERESP = ^OCSP_SINGLERESP;
+    PPOCSP_SINGLERESP = ^POCSP_SINGLERESP;
+    OCSP_SINGLERESP = record
+        _certId: POCSP_CERTID;
+        _certStatus: POCSP_CERTSTATUS;
+        _thisUpdate: PASN1_GENERALIZEDTIME;
+        _nextUpdate: PASN1_GENERALIZEDTIME;
+        _singleExtensions: PSTACK_OF_X509_EXTENSION;
+    end; { record }
+    PSTACK_OF_OCSP_SINGLERESP = PSTACK_OF;
+
+    POCSP_RESPDATA = ^OCSP_RESPDATA;
+    PPOCSP_RESPDATA = ^POCSP_RESPDATA;
+    OCSP_RESPDATA = record
+        _version: PASN1_INTEGER;
+        _responderId: POCSP_RESPID ;
+        _producedAt: PASN1_GENERALIZEDTIME;
+        _responses: PSTACK_OF_OCSP_SINGLERESP;
+        _responseExtensions: PSTACK_OF_X509_EXTENSION;
+    end; { record }
+
+    POCSP_BASICRESP = ^OCSP_BASICRESP;
+    PPOCSP_BASICRESP = ^POCSP_BASICRESP;
+    OCSP_BASICRESP = record
+        _tbsResponseData: POCSP_RESPDATA;
+        _signatureAlgorithm: PX509_ALGOR;
+        _signature: PASN1_BIT_STRING;
+        _certs: PSTACK_OF_X509;
+    end; { record }
+
+    POCSP_CRLID = ^OCSP_CRLID;
+    PPOCSP_CRLID = ^POCSP_CRLID;
+    OCSP_CRLID = record
+        _crlUrl: PASN1_IA5STRING;
+        _crlNum: PASN1_INTEGER;
+        _crlTime: PASN1_GENERALIZEDTIME;
+    end; { record }
+
+    POCSP_SERVICELOC = ^OCSP_SERVICELOC;
+    PPOCSP_SERVICELOC = ^POCSP_SERVICELOC;
+    OCSP_SERVICELOC = record
+        _issuer: PX509_NAME;
+        _locator: PSTACK_OF_ACCESS_DESCRIPTION;
+    end; { record }
+
+    POCSP_REQ_CTX  = ^OCSP_REQ_CTX ;
+    PPOCSP_REQ_CTX  = ^POCSP_REQ_CTX ;
+    OCSP_REQ_CTX = record
+      _state: TC_INT;
+      _iobuf: PAnsiChar;
+      _iobuflen: TC_INT;
+      _io: PBIO;
+      _mem: PBIO;
+      _asn1_len: TC_ULONG;
+    end;
+
+
+{$ENDREGION}
+
+    PRC2_KEY = ^RC2_KEY;
+    PPRC2_KEY = ^PRC2_KEY;
+    RC2_KEY = record
+        _data: array[0..63] of RC2_INT;
+    end; { record }
+
+    PRC4_KEY = ^RC4_KEY;
+    PPRC4_KEY = ^PRC4_KEY;
+    RC4_KEY = record
+        _x, _y: RC4_INT;
+        _data: array[0..255] of RC4_INT;
+    end; { record }
+
+    PRC5_KEY = ^RC5_KEY;
+    PPRC5_KEY = ^PRC5_KEY;
+    RC5_KEY = record
+        _rounds: TC_INT;
+        _data: array[0..(2*(RC5_16_ROUNDS+1))-1] of RC5_32_INT;
+    end; { record }
+
+    RC5_32_KEY = RC5_KEY;
+    PRC5_32_KEY = ^RC5_32_KEY;
+    PPRC5_32_KEY = ^PRC5_32_KEY;
+
+    PRIPEMD160_CTX = ^RIPEMD160_CTX;
+    PPRIPEMD160_CTX = ^PRIPEMD160_CTX;
+    RIPEMD160_CTX = record
+      _A,_B,_C,_D,_E: RIPEMD160_LONG;
+      _Nl,_Nh: RIPEMD160_LONG;
+      _data: array [0..RIPEMD160_LBLOCK-1] of RIPEMD160_LONG;
+      _num: TC_UINT;
+    end; { record }
+
+    PSHA_CTX = ^SHA_CTX;
+    PPSHA_CTX = ^PSHA_CTX;
+    SHA_CTX = record
+      _h0,_h1,_h2,_h3,_h4: SHA_LONG;
+      _Nl,_Nh: SHA_LONG;
+      _data: array[0..SHA_LBLOCK-1] of SHA_LONG;
+      _num: TC_UINT;
+    end; { record }
+
+    PSHA256_CTX = ^SHA256_CTX;
+    PPSHA256_CTX = ^PSHA256_CTX;
+    SHA256_CTX = record
+      _h: array[0..7] of SHA_LONG;
+      _Nl,_Nh: SHA_LONG;
+      _data: array[0..SHA_LBLOCK-1] of SHA_LONG;
+      _num,_md_len: TC_UINT;
+    end; { record }
+
+    SHA512_CTX_union = record
+    case Byte of
+      0: (_d: array [0..SHA_LBLOCK - 1] of SHA_LONG64);
+      1: (_p: array [0..SHA512_CBLOCK - 1] of AnsiChar);
+    end; { record }
+
+    PSHA512_CTX = ^SHA512_CTX;
+    PPSHA512_CTX = ^PSHA512_CTX;
+    SHA512_CTX = record
+      _h: array[0..7] of SHA_LONG64;
+      _Nl, _Nh: SHA_LONG64;
+      _u: SHA512_CTX_union;
+      _num,_md_len: TC_UINT;
+    end; { record }
+
+{$REGION 'SSL'}
+
+  PPSSL = ^PSSL;
+  PSSL_CIPHER = ^SSL_CIPHER;
+  PPSSL_CIPHER = ^PSSL_CIPHER;
+
+  PSSL3_ENC_METHOD = Pointer; //^SSL3_ENC_METHOD;
+  PPSSL3_ENC_METHOD = ^PSSL3_ENC_METHOD;
+  PSSL_SESSION = ^SSL_SESSION;
+  PPSSL_SESSION = ^PSSL_SESSION;
+  PSSL_METHOD = ^SSL_METHOD;
+  PPSSL_METHOD = ^PSSL_METHOD;
+  PSRP_CTX = ^SRP_CTX;
+  PPSRP_CTX = ^PSRP_CTX;
+  PSSL_COMP = ^SSL_COMP;
+  PPSSL_COMP = ^PSSL_COMP;
+  PSSL_CTX = ^SSL_CTX;
+  PPSSL_CTX = ^PSSL_CTX;
+  PCERT = pointer;
+  PSSL3_BUF_FREELIST = Pointer;
+  PSSL2_STATE = Pointer;
+  PSSL3_STATE = Pointer;
+  PDTLS1_STATE = Pointer;
+
+  SSL_METHOD_CALLBACK_FN = procedure; cdecl;
+
+  PSRTP_PROTECTION_PROFILE = ^SRTP_PROTECTION_PROFILE;
+  PPSRTP_PROTECTION_PROFILE = ^PSRTP_PROTECTION_PROFILE;
+  SRTP_PROTECTION_PROFILE = record
+    _name: PAnsiChar;
+    _id: TC_LONG;
+  end; { record }
+
+  PSTACK_OF_SSL_CIPHER = PSTACK_OF;
+  PSTACK_OF_SRTP_PROTECTION_PROFILE = PSTACK_OF;
+  PSTACK_OF_SSL_COMP = PSTACK_OF;
+  PLHASH_OF_SSL_SESSION = PLHASH_OF;
+
+  GEN_SESSION_CB = function(const _ssl: PSSL; _id: PAnsiChar; var _id_len: TC_UINT): TC_INT; cdecl;
+
+  TLS_SESSION_TICKET_EXT_CB_FN = function(_s: PSSL; const _data: PAnsiChar; _len: TC_INT; _arg: Pointer): TC_INT; cdecl;
+  TLS_SESSION_SECRET_CB_FN = function(_s: PSSL; _secret: Pointer; var _secret_len: TC_INT; _peer_ciphers: PSTACK_OF_SSL_CIPHER; _cipher: PPSSL_CIPHER; _arg: Pointer): TC_INT; cdecl;
+
+  PTLS_SESSION_TICKET_EXT = ^TLS_SESSION_TICKET_EXT;
+  PPTLS_SESSION_TICKET_EXT = ^PTLS_SESSION_TICKET_EXT;
+  TLS_SESSION_TICKET_EXT = record
+    _length: TC_USHORT;
+    _data: Pointer;
+  end; { record }
+
+
+  SSL_CIPHER = record
+    _valid: TC_INT;
+    _name: PAnsiChar;
+    _id: TC_ULONG;
+    _algorithm_mkey: TC_ULONG;
+    _algorithm_auth: TC_ULONG;
+    _algorithm_enc: TC_ULONG;
+    _algorithm_mac: TC_ULONG;
+    _algorithm_ssl: TC_ULONG;
+    _algo_strength: TC_ULONG;
+    _algorithm2: TC_ULONG;
+    _strength_bits: TC_INT;
+    _alg_bits: TC_INT;
+  end; { record }
+
+  SSL_METHOD = record
+    _version: TC_INT;
+    ssl_new: function(_s: PSSL): TC_INT; cdecl;
+    ssl_clear: procedure(_s: PSSL); cdecl;
+    ssl_free: procedure(_s: PSSL); cdecl;
+    ssl_accept: function(_s: PSSL): TC_INT; cdecl;
+    ssl_connect: function(_s: PSSL): TC_INT; cdecl;
+    ssl_read: function(_s: PSSL; _buf: Pointer;_len: TC_INT): TC_INT; cdecl;
+    ssl_peek: function(_s: PSSL; _buf: Pointer; _len: TC_INT): TC_INT; cdecl;
+    ssl_write: function(_s: PSSL; const _buf: Pointer; len: TC_INT): TC_INT; cdecl;
+    ssl_shutdown: function(_s: PSSL): TC_INT; cdecl;
+    ssl_renegotiate: function(_s: PSSL): TC_INT; cdecl;
+    ssl_renegotiate_check: function(_s: PSSL): TC_INT; cdecl;
+    ssl_get_message: function(_s: PSSL; _st1: TC_INT; _stn: TC_INT; _mt: TC_INT; _max: TC_LONG; var _ok: TC_INT): TC_INT; cdecl;
+    ssl_read_bytes: function(_s: PSSL; _type: TC_INT; _buf: PAnsiChar; len: TC_INT; _peek: TC_INT): TC_INT; cdecl;
+    ssl_write_bytes: function(_s: PSSL; _type: TC_INT; const _buf: Pointer; len: TC_INT): TC_INT; cdecl;
+    ssl_dispatch_alert: function(_s: PSSL): TC_INT; cdecl;
+    ssl_ctrl: function(_s: PSSL; _cmd: TC_INT; _larg: TC_LONG; _parg: Pointer): TC_LONG; cdecl;
+    ssl_ctx_ctrl: function(_ctx: PSSL_CTX; _cmd: TC_INT; _larg: TC_LONG; _parg: Pointer): TC_LONG; cdecl;
+    get_cipher_by_char: function(const _ptr: PAnsiChar): PSSL_CIPHER; cdecl;
+    put_cipher_by_char: function(const _cipher: PSSL_CIPHER; _ptr: PAnsiChar): TC_INT; cdecl;
+    ssl_pending: function(const _s: PSSL): TC_INT; cdecl;
+    num_ciphers: function: TC_INT; cdecl;
+    get_cipher: function(_ncipher: TC_INT): PSSL_CIPHER; cdecl;
+    get_ssl_method: function(_version: TC_INT): PSSL_METHOD; cdecl;
+    get_timeout: function: TC_LONG; cdecl;
+    ssl3_enc: function: PSSL3_ENC_METHOD;  cdecl;
+    ssl_version: function: TC_INT; cdecl;
+    ssl_callback_ctrl: function(_s: PSSL; _cb_id: TC_INT; fp: SSL_METHOD_CALLBACK_FN): TC_LONG; cdecl;
+    ssl_ctx_callback_ctrl: function(_s: PSSL_CTX; _cb_id: TC_INT; fp: SSL_METHOD_CALLBACK_FN): TC_LONG; cdecl;
+  end; { record }
+
+
+  SSL_SESSION = record
+    _ssl_version: TC_INT;
+    _key_arg_length: TC_UINT;
+    _key_arg: array[0..SSL_MAX_KEY_ARG_LENGTH-1] of AnsiChar;
+    _master_key_length: TC_INT;
+    _master_key: array[0..SSL_MAX_MASTER_KEY_LENGTH - 1] of AnsiChar;
+    _session_id_length: TC_UINT;
+    _session_id: array[0..SSL_MAX_SSL_SESSION_ID_LENGTH - 1] of AnsiChar;
+    _sid_ctx_length: TC_UINT;
+    _sid_ctx: array[0..SSL_MAX_SID_CTX_LENGTH - 1] of AnsiChar;
+    _krb5_client_princ_len: TC_UINT;
+    _krb5_client_princ: array[0..SSL_MAX_KRB5_PRINCIPAL_LENGTH - 1] of AnsiChar;
+    _psk_identity_hint: PAnsiChar;
+    _psk_identity: PAnsiChar;
+    _not_resumable: TC_INT;
+    _peer: PX509;
+    _verify_result: TC_LONG;
+    _references: TC_INT;
+    _timeout: TC_LONG;
+    _time: TC_LONG;
+    _compress_meth: TC_UINT;
+    _cipher: PSSL_CIPHER;
+    _cipher_id: TC_ULONG;
+    _ciphers: PSTACK_OF_SSL_CIPHER;
+    _ex_data: PCRYPTO_EX_DATA;
+    _prev, _next: PSSL_SESSION;
+    _tlsext_hostname: PAnsiChar;
+    _tlsext_ecpointformatlist_length: TC_SIZE_T;
+    _tlsext_ecpointformatlist: PAnsiChar;
+    _tlsext_ellipticcurvelist_length: TC_SIZE_T;
+    _tlsext_ellipticcurvelist: PAnsiChar;
+    _tlsext_tick: PAnsiChar;
+    _tlsext_ticklen: TC_SIZE_T;
+    _tlsext_tick_lifetime_hint: TC_LONG;
+    _srp_username: PAnsiChar;
+  end; { record }
+
+  SRP_CTX = record
+    _SRP_cb_arg: Pointer;
+    TLS_ext_srp_username_callback: function(_s: PSSL; var _i: TC_INT; _p: Pointer): TC_INT; cdecl;
+    SRP_verify_param_callback: function(_s: PSSL; _p: Pointer): TC_INT; cdecl;
+    SRP_give_srp_client_pwd_callback: function(_s: PSSL; _p: Pointer): PAnsiChar; cdecl;
+    _login: PAnsiChar;
+    _N,_g,_s,_B,_A: PBIGNUM;
+    _aa,_bb,_v: PBIGNUM;
+    _info: PAnsiChar;
+    _strength: TC_INT;
+    _srp_Mask: TC_LONG;
+  end; { record }
+
+  SSL_COMP = record
+    _id: TC_INT;
+    _name: PAnsiChar;
+{$ifndef OPENSSL_NO_COMP}
+    _method: PCOMP_METHOD;
+{$else}
+    _method: PAnsiChar;
+{$endif}
+  end; { record }
+
+  SSL_CTX_STATS = record
+    _sess_connect: TC_INT;
+    _sess_connect_renegotiate: TC_INT;
+    _sess_connect_good: TC_INT;
+    _sess_accept: TC_INT;
+    _sess_accept_renegotiate: TC_INT;
+    _sess_accept_good: TC_INT;
+    _sess_miss: TC_INT;
+    _sess_timeout: TC_INT;
+    _sess_cache_full: TC_INT;
+    _sess_hit: TC_INT;
+    _sess_cb_hit: TC_INT;
+  end; { record }
+
+  SSL_CTX = record
+    _method: PSSL_METHOD;
+    _cipher_list: PSTACK_OF_SSL_CIPHER;
+    _cipher_list_by_id: PSTACK_OF_SSL_CIPHER;
+    _cert_store: PX509_STORE ;
+    _sessions: PLHASH_OF_SSL_SESSION;
+    _session_cache_size: TC_ULONG;
+    _session_cache_head: PSSL_SESSION;
+    _session_cache_tail: PSSL_SESSION;
+    _session_cache_mode: TC_INT;
+    _session_timeout: TC_LONG;
+    new_session_cb: function(_ssl: PSSL; _sess: PSSL_SESSION): TC_INT; cdecl;
+    remove_session_cb: procedure(_ctx: PSSL; _sess: PSSL_SESSION); cdecl;
+    get_session_cb: function(_ssl: PSSL; _data: PAnsiChar; _len: TC_INT; var _copy: TC_INT): PSSL_SESSION; cdecl;
+    _stats: SSL_CTX_STATS;
+    _references: TC_INT;
+    app_verify_callback: function(_ctx: PX509_STORE_CTX; _p: Pointer): TC_INT; cdecl;
+    app_verify_arg: function: Pointer; cdecl;
+    _default_passwd_callback: pem_password_cb;
+    _default_passwd_callback_userdata: Pointer;
+    client_cert_cb: function(_ssl: PSSL; _x509: PPX509; _pkey: PPEVP_PKEY): TC_INT; cdecl;
+    app_gen_cookie_cb: function(_ssl: PSSL; _cookie: PAnsiChar; var _cookie_len: TC_INT): TC_INT; cdecl;
+    app_verify_cookie_cb: function(_ssl: PSSL; _cookie: PAnsiChar; _cookie_len: TC_UINT): TC_INT; cdecl;
+    _ex_data: CRYPTO_EX_DATA;
+    _rsa_md5: PEVP_MD;
+    _md5: PEVP_MD;
+    _sha1: PEVP_MD;
+    _extra_certs: PSTACK_OF_X509;
+    _comp_methods: PSTACK_OF_SSL_COMP;
+    info_callback: procedure(const _ssl: PSSL; _type: TC_INT; _val: TC_INT);  cdecl;
+    _client_CA: PSTACK_OF_X509_NAME;
+    _options: TC_ULONG;
+    _mode: TC_ULONG;
+    _max_cert_list: TC_LONG;
+    _cert: PCERT;
+    _read_ahead: TC_INT;
+    msg_callback: procedure(_write_p: TC_INT; _version: TC_INT; _content_type: TC_INT; const _buf: Pointer; _len: TC_SIZE_T; _ssl: PSSL;  _arg: Pointer); cdecl;
+    _msg_callback_arg: Pointer;
+    _verify_mode: TC_INT;
+    _sid_ctx_length: TC_UINT;
+    _sid_ctx: array[0..SSL_MAX_SID_CTX_LENGTH - 1] of AnsiChar;
+    default_verify_callback: function(_ok: TC_INT; _ctx: PX509_STORE_CTX): TC_INT; cdecl;
+    _generate_session_id: GEN_SESSION_CB;
+    _param: PX509_VERIFY_PARAM;
+    _purpose: TC_INT;
+    _trust: TC_INT;
+    _quiet_shutdown: TC_INT;
+    _max_send_fragment: TC_UINT;
+    _client_cert_engine: PENGINE;
+    tlsext_servername_callback: function(_s: PSSL; _i: PC_INT; _p: Pointer): TC_INT; cdecl;
+    _tlsext_servername_arg: Pointer;
+    _tlsext_tick_key_name: array[0..15] of ansichar;
+    _tlsext_tick_hmac_key: array[0..15] of ansichar;
+    _tlsext_tick_aes_key: array[0..15] of ansichar;
+    tlsext_ticket_key_cb: function(_ssl: PSSL; _name: PAnsiChar; _iv: PAnsiChar; _ectx: PEVP_CIPHER_CTX; _hctx: PHMAC_CTX; _enc: TC_INT): TC_INT; cdecl;
+    tlsext_status_cb: function(_ssl: PSSL; _arg: Pointer): TC_INT; cdecl;
+    _tlsext_status_arg: Pointer;
+    tlsext_opaque_prf_input_callback: function(_s: PSSL; _peerinput: Pointer; _len: TC_SIZE_T; _arg: Pointer): TC_INT; cdecl;
+    _tlsext_opaque_prf_input_callback_arg: Pointer;
+
+    _psk_identity_hint: PAnsiChar;
+    psk_client_callback: function(_ssl: PSSL; const _hint: PAnsiChar; _identity: PAnsiChar; _max_identity_len: TC_UINT; _psk: PAnsiChar; _max_psk_len: TC_UINT): TC_UINT; cdecl;
+    psk_server_callback: function(_ssl: PSSL; const _identity: PAnsiChar; _psk: PAnsiChar; _max_psk_len: TC_UINT): TC_UINT; cdecl;
+
+    _freelist_max_len: TC_UINT;
+    _wbuf_freelist: PSSL3_BUF_FREELIST;
+    _rbuf_freelist: PSSL3_BUF_FREELIST;
+    _srp_ctx: SRP_CTX;
+    next_protos_advertised_cb: function(_s: PSSL; const _buf: PPAnsiChar; _len: PC_UINT; _arg: PAnsiChar): TC_INT; cdecl;
+    _next_protos_advertised_cb_arg: Pointer;
+    next_proto_select_cb: function(_s: PSSL; _out: PPAnsiChar; _outlen: PAnsiChar; const _in: PAnsiChar; _inlen: TC_UINT; _arg: Pointer): TC_INT; cdecl;
+    _next_proto_select_cb_arg: Pointer;
+    _srtp_profiles: PSTACK_OF_SRTP_PROTECTION_PROFILE;
+  end; { record }
+
+  PKSSL_CTX = Pointer;
+
+  SSL = record
+    _version: TC_INT;
+    _type: TC_INT;
+    _method: PSSL_METHOD;
+{$IFNDEF NO_BIO}
+    _rbio: PBIO;
+    _wbio: PBIO;
+    _bbio: PBIO;
+{$else}
+    _rbio: PAnsiChar;
+    _wbio: PAnsiChar;
+    _bbio: PAnsiChar;
+{$endif}
+    _rwstate: TC_INT;
+    _in_handshake: TC_INT;
+    handshake_func: function(_s: PSSL): TC_INT; cdecl;
+    _server: TC_INT;
+    _new_session: TC_INT;
+    _quiet_shutdown: TC_INT;
+    _shutdown: TC_INT;
+    _state: TC_INT;
+    _rstate: TC_INT;
+    _init_buf: PBUF_MEM;
+    _init_msg: Pointer;
+    _init_num: TC_INT;
+    _init_off: TC_INT;
+    _packet: PAnsiChar;
+    _packet_length: TC_UINT;
+
+    _s2: PSSL2_STATE;
+    _s3: PSSL3_STATE;
+    _d1: PDTLS1_STATE;
+    _read_ahead: TC_INT;
+
+    msg_callback: procedure(_write_p: TC_INT; _version: TC_INT; _content_type: TC_INT; const _buf: Pointer; _len: TC_SIZE_T; _ssl: PSSL; _arg: Pointer); cdecl;
+    _msg_callback_arg: Pointer;
+
+    _hit: TC_INT;
+
+    _param: PX509_VERIFY_PARAM;
+
+    _purpose: TC_INT;
+    _trust: TC_INT;
+
+    _cipher_list: PSTACK_OF_SSL_CIPHER;
+    _cipher_list_by_id: PSTACK_OF_SSL_CIPHER;
+
+    _mac_flags: TC_INT;
+    _enc_read_ctx: PEVP_CIPHER_CTX;
+    _read_hash: PEVP_MD_CTX;
+{$ifndef OPENSSL_NO_COMP}
+    _expand: PCOMP_CTX;
+{$else}
+    _expand: PAnsiChar;
+{$endif}
+    _enc_write_ctx: PEVP_CIPHER_CTX;
+    _write_hash: PEVP_MD_CTX;
+{$ifndef OPENSSL_NO_COMP}
+    _compress: PCOMP_CTX;
+{$else}
+    _compress: PAnsiChar;
+{$endif}
+
+    _cert: PCERT;
+
+    _sid_ctx_length: TC_INT;
+    _sid_ctx: array[0..SSL_MAX_SID_CTX_LENGTH - 1] of ansichar;
+
+    _session: PSSL_SESSION;
+    _generate_session_id: GEN_SESSION_CB;
+
+    _verify_mode: TC_INT;
+    verify_callback: function(_ok: TC_INT; _ctx: PX509_STORE_CTX): TC_INT; cdecl;
+    info_callback: procedure(const _ssl: PSSL; _type: TC_INT; _val: TC_INT); cdecl;
+
+    _error: TC_INT;
+    _error_code: TC_INT;
+
+{$ifndef OPENSSL_NO_KRB5}
+    _kssl_ctx: PKSSL_CTX;
+{$endif}
+
+{$ifndef OPENSSL_NO_PSK}
+    psk_client_callback: function(_ssl: PSSL; const _hint: PAnsiChar; _identity: PAnsiChar; _max_identity_len: TC_UINT; _psk: PAnsiChar; _max_psk_len: TC_UINT): TC_UINT; cdecl;
+    psk_server_callback: function(_ssl: PSSL; const _identity: PAnsiChar; _psk: PAnsiChar; _max_psk_len: TC_UINT): TC_INT; cdecl;
+{$endif}
+
+    _ctx: PSSL_CTX;
+    _debug: TC_INT;
+
+    _verify_result: TC_LONG;
+    _ex_data: CRYPTO_EX_DATA;
+
+    _client_CA: PSTACK_OF_X509_NAME;
+
+    _references: TC_INT;
+    _options: TC_ULONG;
+    _mode: TC_ULONG;
+    _max_cert_list: TC_LONG;
+    _first_packet: TC_INT;
+    _client_version: TC_INT;
+    _max_send_fragment: TC_UINT;
+
+{$ifndef OPENSSL_NO_TLSEXT}
+    tlsext_debug_cb: procedure(_s: PSSL; _client_server: TC_INT; _type: TC_INT; _data: PAnsiChar; _len: TC_INT; _arg: Pointer); cdecl;
+    _tlsext_debug_arg: Pointer;
+    _tlsext_hostname: PAnsiChar;
+    _servername_done: TC_INT;
+    _tlsext_status_type: TC_INT;
+    _tlsext_status_expected: TC_INT;
+    _tlsext_ocsp_ids: PSTACK_OF_OCSP_RESPID;
+    _tlsext_ocsp_exts: PX509_EXTENSIONS;
+    _tlsext_ocsp_resp: PAnsiChar;
+    _tlsext_ocsp_resplen: TC_INT;
+    _tlsext_ticket_expected: TC_INT;
+{$ifndef OPENSSL_NO_EC}
+    _tlsext_ecpointformatlist_length: TC_SIZE_T;
+    _tlsext_ecpointformatlist: PAnsiChar;
+    _tlsext_ellipticcurvelist_length: TC_SIZE_T;
+    _tlsext_ellipticcurvelist: PAnsiChar;
+{$endif}
+
+    _tlsext_opaque_prf_input: Pointer;
+    _tlsext_opaque_prf_input_len: TC_SIZE_T;
+
+    _tlsext_session_ticket: PTLS_SESSION_TICKET_EXT;
+
+    _tls_session_ticket_ext_cb: TLS_SESSION_TICKET_EXT_CB_FN;
+    _tls_session_ticket_ext_cb_arg: Pointer;
+
+    _tls_session_secret_cb: TLS_SESSION_SECRET_CB_FN;
+    _tls_session_secret_cb_arg: Pointer;
+
+    _initial_ctx: PSSL_CTX;
+{$endif}
+
+{$ifndef OPENSSL_NO_NEXTPROTONEG}
+     _next_proto_negotiated: PAnsiChar;
+    _ext_proto_negotiated_len: PAnsiChar;
+{$endif}
+
+
+    _srtp_profiles: PSTACK_OF_SRTP_PROTECTION_PROFILE;
+    _srtp_profile: PSRTP_PROTECTION_PROFILE;
+
+    _tlsext_heartbeat: TC_UINT;
+    _tlsext_hb_pending: TC_UINT;
+    _tlsext_hb_seq: TC_UINT;
+
+  _renegotiate: TC_INT;
+
+{$ifndef OPENSSL_NO_SRP}
+    _srp_ctx: SRP_CTX;
+{$endif}
+  end; { record }
+
+
+
+{$ENDREGION}
+
+implementation
+
+end.

+ 12 - 2
Units/PascalCoin/UPoolMining.pas

@@ -1,5 +1,9 @@
 unit UPoolMining;
 
+{$IFDEF FPC}
+  {$MODE Delphi}
+{$ENDIF}
+
 { Copyright (c) 2016 by Albert Molina
 
   Distributed under the MIT software license, see the accompanying file LICENSE
@@ -15,8 +19,14 @@ unit UPoolMining;
 
 interface
 
-Uses UTCPIP, SysUtils, UThread, SyncObjs, Classes, Windows, UJSONFunctions, UNode, UCrypto,
-  UAccounts;
+Uses
+{$IFnDEF FPC}
+  Windows,
+{$ELSE}
+  LCLIntf, LCLType, LMessages,
+{$ENDIF}
+  UTCPIP, SysUtils, UThread, SyncObjs, Classes, UJSONFunctions, UAES, UNode,
+  UCrypto, UAccounts;
 
 Const
   CT_PoolMining_Method_STATUS = 'status';

+ 4 - 0
Units/PascalCoin/URPC.pas

@@ -1,5 +1,9 @@
 unit URPC;
 
+{$IFDEF FPC}
+  {$MODE Delphi}
+{$ENDIF}
+
 interface
 
 Uses UTCPIP;

+ 11 - 5
Units/PascalCoin/UTCPIP.pas

@@ -19,8 +19,8 @@ interface
   {$mode objfpc}
 {$ENDIF}
 
-{$DEFINE DelphiSockets}
-{.$DEFINE Synapse}
+{.$DEFINE DelphiSockets}
+{$DEFINE Synapse}
 {$IFDEF DelphiSockets}{$IFDEF Synapse}DelphiSockets and Synapse are defined! Choose one!{$ENDIF}{$ENDIF}
 {$IFNDEF DelphiSockets}{$IFNDEF Synapse}Nor DelphiSockets nor Synapse are defined! Choose one!{$ENDIF}{$ENDIF}
 
@@ -184,7 +184,13 @@ type
 
 implementation
 
-uses UConst, ULog, Windows;
+uses
+{$IFnDEF FPC}
+  Windows,
+{$ELSE}
+  LCLIntf, LCLType, LMessages,
+{$ENDIF}
+  UConst, ULog;
 
 { TNetTcpIpClient }
 
@@ -283,8 +289,8 @@ begin
   {$ENDIF}
   {$IFDEF Synapse}
   if Not FConnected then exit;
-  FTcpBlockSocket.CloseSocket;
   FConnected := false;
+  FTcpBlockSocket.CloseSocket;
   if Assigned(FOnDisconnect) then FOnDisconnect(Self);
   {$ENDIF}
 end;
@@ -540,7 +546,7 @@ constructor TBufferedNetTcpIpClient.Create(AOwner: TComponent);
 begin
   inherited;
   FLastReadTC := GetTickCount;
-  FCritical := TCriticalSection.Create;
+  FCritical := SyncObjs.TCriticalSection.Create;
   FSendBuffer := TMemoryStream.Create;
   FReadBuffer := TMemoryStream.Create;
   FBufferedNetTcpIpClientThread := TBufferedNetTcpIpClientThread.Create(Self);

+ 1 - 1
Units/PascalCoin/UThread.pas

@@ -23,7 +23,7 @@ uses
 {$IFnDEF FPC}
   Windows,
 {$ELSE}
-  LCLIntf, LCLType, LMessages,
+  {$IFDEF LINUX}cthreads,{$ENDIF}
 {$ENDIF}
   Classes, SyncObjs;
 

+ 1 - 1
Units/PascalCoin/UTime.pas

@@ -23,7 +23,7 @@ Uses
 {$IFnDEF FPC}
   Windows,
 {$ELSE}
-  LCLIntf, LCLType, LMessages,
+  {LCLIntf, LCLType, LMessages,}
 {$ENDIF}
   SysUtils;
 

+ 3 - 1
Units/PascalCoin/UWalletKeys.pas

@@ -20,7 +20,7 @@ unit UWalletKeys;
 interface
 
 uses
-  Classes, UBlockChain, UAccounts, UCrypto, ssl_types;
+  Classes, UBlockChain, UAccounts, UCrypto;
 
 Type
   TWalletKey = Record
@@ -261,6 +261,7 @@ begin
   if FIsReadingStream then exit;
   if Not Assigned(Stream) then exit;
   Stream.Size := 0;
+  Stream.Position:=0;
   TStreamOp.WriteAnsiString(Stream,CT_PrivateKeyFile_Magic);
   i := CT_PrivateKeyFile_Version;
   Stream.Write(i,4);
@@ -295,6 +296,7 @@ begin
     if FileExists(Value) then fm := fmOpenReadWrite
     else fm := fmCreate;
     FWalletFileStream := TFileStream.Create(WalletfileName,fm+fmShareDenyWrite);
+    FWalletFileStream.Position:=0;
     LoadFromStream(FWalletFileStream);
   end;
 end;

+ 82 - 0
Units/PascalCoin/config.inc

@@ -0,0 +1,82 @@
+{ Copyright (c) 2016 by Albert Molina
+
+  Distributed under the MIT software license, see the accompanying file LICENSE
+  or visit http://www.opensource.org/licenses/mit-license.php.
+
+  This unit is a part of Pascal Coin, a P2P crypto currency without need of
+  historical operations.
+
+  If you like it, consider a donation using BitCoin:
+  16K3HCZRhFUtM8GdWRcfKeaa6KsuyxZaYk
+
+  **************************************
+  PascalCoin configuration file to build
+  **************************************
+
+  Choose ONLY ONE of directives:
+
+    OPTIONS_BY_DEFAULT:
+      In Delphi = Synapse + OpenSSL v1.0
+      In FPC = Synapse + OpenSSL v1.1
+    DelphiSockets_OpenSSLv10
+    Synapse_OpenSSLv10
+    Synapse_OpenSSLv11
+
+}
+
+  {$DEFINE OPTIONS_BY_DEFAULT}
+  {.$DEFINE DelphiSockets_OpenSSLv10}
+  {.$DEFINE Synapse_OpenSSLv10}
+  {.$DEFINE Synapse_OpenSSLv11}
+
+{ ********************************************************************
+  Don't touch more code, it will addapt based on your preferences
+  ******************************************************************** }
+
+{$IFNDEF OPTIONS_BY_DEFAULT}{$IFNDEF DelphiSockets_OpenSSLv10}{$IFNDEF Synapse_OpenSSLv10}{$IFNDEF Synapse_OpenSSLv11}
+ERROR: You must select ONE option!
+{$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}
+{$IFDEF OPTIONS_BY_DEFAULT}
+  // By default are: Delphi = Synapse + OpenSSLv10  -  FPC = Synapse + OpenSSLv11
+  {$IFDEF FPC}
+    // With Free Pascal Compiler, only Synapse + OpenSSLv1.0 for Delphi or OpenSSLv1.1 for Linux
+    {$DEFINE Synapse}
+    {$IFDEF LINUX}
+    {$UNDEF OpenSSL10}
+    {$ELSE}
+    {$DEFINE OpenSSL10}
+    {$ENDIF}
+  {$ELSE}
+    // Delphi, Synapse + OpenSSL v1.0
+    {$DEFINE Synapse}
+    {$DEFINE OpenSSL10}
+  {$ENDIF}
+  {$IFDEF DelphiSockets_OpenSSLv10}ERROR: You selected more than 1 option{$ENDIF}
+  {$IFDEF Synapse_OpenSSLv10}ERROR: You selected more than 1 option{$ENDIF}
+  {$IFDEF Synapse_OpenSSLv11}ERROR: You selected more than 1 option{$ENDIF}
+{$ELSE}
+  {$IFDEF DelphiSockets_OpenSSLv10}
+    {$IFDEF FPC}
+      ERROR: With Free Pascal you cannot choose compiler directive DelphiSockets_OpenSSLv10
+    {$ELSE}
+      {$UNDEF Synapse}
+      {$DEFINE OpenSSL10}
+    {$ENDIF}
+    {$IFDEF Synapse_OpenSSLv10}ERROR: You selected more than 1 option{$ENDIF}
+    {$IFDEF Synapse_OpenSSLv11}ERROR: You selected more than 1 option{$ENDIF}
+  {$ELSE}
+    {$IFDEF Synapse_OpenSSLv10}
+      {$DEFINE Synapse}
+      {$DEFINE OpenSSL10}
+      {$IFDEF Synapse_OpenSSLv11}ERROR: You selected more than 1 option{$ENDIF}
+    {$ELSE}
+      {$IFDEF FPC}
+        {$DEFINE Synapse}
+        {$UNDEF OpenSSL10}
+      {$ELSE}
+        ERROR: With Delphi you cannot choose compiler directive Synapse_OpenSSLv11
+      {$ENDIF}
+    {$ENDIF}
+  {$ENDIF}
+{$ENDIF}
+

+ 4 - 0
Units/Utils/UAppParams.pas

@@ -1,5 +1,9 @@
 unit UAppParams;
 
+{$IFDEF FPC}
+  {$MODE Delphi}
+{$ENDIF}
+
 { Copyright (c) 2016 by Albert Molina
 
   Distributed under the MIT software license, see the accompanying file LICENSE

+ 0 - 1486
Units/Utils/UDBGridUtils.pas

@@ -1,1486 +0,0 @@
-unit UDBGridUtils;
-
-{ Copyright (c) 2016 by Albert Molina
-
-  Distributed under the MIT software license, see the accompanying file LICENSE
-  or visit http://www.opensource.org/licenses/mit-license.php.
-
-  This unit is a part of Pascal Coin, a P2P crypto currency without need of
-  historical operations.
-
-  If you like it, consider a donation using BitCoin:
-  16K3HCZRhFUtM8GdWRcfKeaa6KsuyxZaYk
-
-  ABOUT THIS UNIT:
-
-  This units works with UDBStorage.pas unit.
-  So, is to use in Windows version due UDBStorage works with Access database
-
-  }
-
-interface
-
-uses
-  Classes, Grids, Windows, UNode, UAccounts, UBlockChain, UDBStorage, DBGrids, DB, ADODB,
-  UWalletKeys, UAppParams;
-
-Type
-  // TAccountsGrid implements a visual integration of TDrawGrid
-  // to show accounts information
-  TAccountColumnType = (act_account_number,act_account_key,act_balance,act_updated,act_n_operation,act_updated_state);
-  TAccountColumn = Record
-    ColumnType : TAccountColumnType;
-    width : Integer;
-  End;
-
-  TAccountsGrid = Class(TComponent)
-  private
-    FAccountsBalance : Int64;
-    FAccountsList : TOrderedCardinalList;
-    FColumns : Array of TAccountColumn;
-    FDrawGrid : TDrawGrid;
-    FNodeNotifyEvents : TNodeNotifyEvents;
-    FShowAllAccounts: Boolean;
-    FOnUpdated: TNotifyEvent;
-    FAccountsCount: Integer;
-    procedure SetDrawGrid(const Value: TDrawGrid);
-    Procedure InitGrid;
-    Procedure OnNodeNewOperation(Sender : TObject);
-    procedure OnGridDrawCell(Sender: TObject; ACol, ARow: Longint; Rect: TRect; State: TGridDrawState);
-    procedure SetNode(const Value: TNode);
-    function GetNode: TNode;
-    procedure SetShowAllAccounts(const Value: Boolean);
-  protected
-    procedure Notification(AComponent: TComponent; Operation: TOperation); Override;
-  public
-    Constructor Create(AOwner : TComponent); override;
-    Destructor Destroy; override;
-    Property DrawGrid : TDrawGrid read FDrawGrid write SetDrawGrid;
-    Function LockAccountsList : TOrderedCardinalList;
-    Procedure UnlockAccountsList;
-    Property Node : TNode read GetNode write SetNode;
-    Function AccountNumber(GridRow : Integer) : Int64;
-    Procedure SaveToStream(Stream : TStream);
-    Procedure LoadFromStream(Stream : TStream);
-    Property ShowAllAccounts : Boolean read FShowAllAccounts write SetShowAllAccounts;
-    Property AccountsBalance : Int64 read FAccountsBalance;
-    Property AccountsCount : Integer read FAccountsCount;
-    Function MoveRowToAccount(nAccount : Cardinal) : Boolean;
-    Property OnUpdated : TNotifyEvent read FOnUpdated write FOnUpdated;
-  End;
-
-  TOperationsGrid = Class(TComponent)
-  private
-    FDrawGrid: TDrawGrid;
-    FAccountNumber: Int64;
-    FOperationsResume : TOperationsResumeList;
-    FNodeNotifyEvents : TNodeNotifyEvents;
-    FPendingOperations: Boolean;
-    Procedure OnNodeNewOperation(Sender : TObject);
-    Procedure OnNodeNewAccount(Sender : TObject);
-    Procedure InitGrid;
-    procedure OnGridDrawCell(Sender: TObject; ACol, ARow: Longint; Rect: TRect; State: TGridDrawState);
-    procedure SetDrawGrid(const Value: TDrawGrid);
-    procedure SetAccountNumber(const Value: Int64);
-    procedure SetNode(const Value: TNode);
-    function GetNode: TNode;
-    procedure SetPendingOperations(const Value: Boolean);
-  protected
-    procedure Notification(AComponent: TComponent; Operation: TOperation); Override;
-  public
-    Constructor Create(AOwner : TComponent); override;
-    Destructor Destroy; override;
-    Property DrawGrid : TDrawGrid read FDrawGrid write SetDrawGrid;
-    Property PendingOperations : Boolean read FPendingOperations write SetPendingOperations;
-    Property AccountNumber : Int64 read FAccountNumber write SetAccountNumber;
-    Property Node : TNode read GetNode write SetNode;
-    Procedure UpdateAccountOperations;
-    Procedure ShowModalDecoder(WalletKeys: TWalletKeys; AppParams : TAppParams);
-  End;
-
-  TOperationsDBGrid = Class(TComponent)
-  private
-    FDisableds : Integer;
-    FQrySQL : TAdoQuery;
-    FDBGrid: TDBGrid;
-    FAccountNumber: Int64;
-    FNodeNotifyEvents : TNodeNotifyEvents;
-    FDataSource : TDataSource;
-    FDateEnd: TDate;
-    FBlockStart: Int64;
-    FDateStart: TDate;
-    FBlockEnd: Int64;
-    FNeedRefreshSQL : Boolean;
-    function GetNode: TNode;
-    procedure SetAccountNumber(const Value: Int64);
-    procedure SetDBGrid(const Value: TDBGrid);
-    procedure SetNode(const Value: TNode);
-    Procedure OnGridDrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
-    procedure SetAdoConnection(const Value: TADOConnection);
-    function GetAdoConnection: TADOConnection;
-    Procedure OnQryCalcFields(DataSet: TDataSet);
-    Procedure OnNodeNewAccount(Sender : TObject);
-    procedure SetBlockEnd(const Value: Int64);
-    procedure SetBlockStart(const Value: Int64);
-    procedure SetDateEnd(const Value: TDate);
-    procedure SetDateStart(const Value: TDate);
-  protected
-    procedure Notification(AComponent: TComponent; Operation: TOperation); Override;
-  published
-  public
-    Constructor Create(AOwner : TComponent); override;
-    Destructor Destroy; override;
-    Property DBGrid : TDBGrid read FDBGrid write SetDBGrid;
-    Property AccountNumber : Int64 read FAccountNumber write SetAccountNumber;
-    Property BlockStart : Int64 read FBlockStart write SetBlockStart;
-    Property BlockEnd : Int64 read FBlockEnd write SetBlockEnd;
-    Procedure SetBlocks(bstart,bend : Int64);
-    Property DateStart : TDate read FDateStart write SetDateStart;
-    Property DateEnd : TDate read FDateEnd write SetDateEnd;
-    Procedure SetDates(dStart,dEnd : TDate);
-    Property Node : TNode read GetNode write SetNode;
-    Procedure RefreshData;
-    Property AdoConnection : TADOConnection read GetAdoConnection write SetAdoConnection;
-    Procedure Disable;
-    Procedure Enable;
-    Procedure ShowModalDecoder(WalletKeys: TWalletKeys; AppParams : TAppParams);
-  End;
-
-  TBlockChainDBGrid = Class(TComponent)
-  private
-    FDisableds : Integer;
-    FQrySQL : TAdoQuery;
-    FDBGrid: TDBGrid;
-    FNodeNotifyEvents : TNodeNotifyEvents;
-    FDataSource : TDataSource;
-    FDateEnd: TDate;
-    FBlockStart: Int64;
-    FDateStart: TDate;
-    FBlockEnd: Int64;
-    FAccountNumber: Int64;
-    FNeedRefreshSQL : Boolean;
-    function GetNode: TNode;
-    procedure SetDBGrid(const Value: TDBGrid);
-    procedure SetNode(const Value: TNode);
-    Procedure OnGridDrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
-    procedure SetAdoConnection(const Value: TADOConnection);
-    function GetAdoConnection: TADOConnection;
-    Procedure OnQryCalcFields(DataSet: TDataSet);
-    Procedure OnNodeNewAccount(Sender : TObject);
-    procedure SetBlockEnd(const Value: Int64);
-    procedure SetBlockStart(const Value: Int64);
-    procedure SetDateEnd(const Value: TDate);
-    procedure SetDateStart(const Value: TDate);
-  protected
-    procedure Notification(AComponent: TComponent; Operation: TOperation); Override;
-  published
-  public
-    Constructor Create(AOwner : TComponent); override;
-    Destructor Destroy; override;
-    Property DBGrid : TDBGrid read FDBGrid write SetDBGrid;
-    Property BlockStart : Int64 read FBlockStart write SetBlockStart;
-    Property BlockEnd : Int64 read FBlockEnd write SetBlockEnd;
-    Procedure SetBlocks(bstart,bend : Int64);
-    Property DateStart : TDate read FDateStart write SetDateStart;
-    Property DateEnd : TDate read FDateEnd write SetDateEnd;
-    Procedure SetDates(dStart,dEnd : TDate);
-    Property Node : TNode read GetNode write SetNode;
-    Procedure RefreshData;
-    Property AdoConnection : TADOConnection read GetAdoConnection write SetAdoConnection;
-    Procedure Disable;
-    Procedure Enable;
-  End;
-
-implementation
-
-uses
-  Graphics, UCrypto, SysUtils, UTime, UOpTransaction, UConst,
-  UFRMPayloadDecoder, ULog;
-
-{ TAccountsGrid }
-
-Const CT_ColumnHeader : Array[TAccountColumnType] Of String =
-  ('Account N.','Key','Balance','Updated','N Oper.','State');
-
-function TAccountsGrid.AccountNumber(GridRow: Integer): Int64;
-begin
-  if GridRow<1 then Result := -1
-  else if FShowAllAccounts then begin
-    if Assigned(Node) then begin
-      Result := GridRow-1;
-    end else Result := -1;
-  end else if GridRow<=FAccountsList.Count then begin
-    Result := Integer(FAccountsList.Get(GridRow-1));
-  end else Result := -1;
-end;
-
-constructor TAccountsGrid.Create(AOwner: TComponent);
-Var i : Integer;
-begin
-  inherited;
-  FOnUpdated := Nil;
-  FAccountsBalance := 0;
-  FAccountsCount := 0;
-  FShowAllAccounts := false;
-  FAccountsList := TOrderedCardinalList.Create;
-  FDrawGrid := Nil;
-  SetLength(FColumns,4);
-  FColumns[0].ColumnType := act_account_number;
-  FColumns[0].width := 80;
-  FColumns[1].ColumnType := act_balance;
-  FColumns[1].width := 100;
-  FColumns[2].ColumnType := act_n_operation;
-  FColumns[2].width := 50;
-  FColumns[3].ColumnType := act_updated_state;
-  FColumns[3].width := 50;
-  FNodeNotifyEvents := TNodeNotifyEvents.Create(Self);
-  FNodeNotifyEvents.OnOperationsChanged := OnNodeNewOperation;
-end;
-
-destructor TAccountsGrid.Destroy;
-begin
-  FNodeNotifyEvents.Free;
-  FAccountsList.Free;
-  inherited;
-end;
-
-function TAccountsGrid.GetNode: TNode;
-begin
-  Result := FNodeNotifyEvents.Node;
-end;
-
-procedure TAccountsGrid.InitGrid;
-Var i : Integer;
-  acc : TAccount;
-begin
-  FAccountsBalance := 0;
-  FAccountsCount := FAccountsList.Count;
-  if Not assigned(DrawGrid) then exit;
-  if FShowAllAccounts then begin
-    if Assigned(Node) then begin
-      if Node.Bank.AccountsCount<1 then DrawGrid.RowCount := 2
-      else DrawGrid.RowCount := Node.Bank.AccountsCount+1;
-      FAccountsBalance := Node.Bank.SafeBox.TotalBalance;
-    end else DrawGrid.RowCount := 2;
-  end else begin
-    if FAccountsList.Count<1 then DrawGrid.RowCount := 2
-    else DrawGrid.RowCount := FAccountsList.Count+1;
-    if Assigned(Node) then begin
-      for i := 0 to FAccountsList.Count - 1 do begin
-        acc := Node.Bank.SafeBox.Account( FAccountsList.Get(i) );
-        inc(FAccountsBalance, acc.balance);
-      end;
-    end;
-  end;
-  DrawGrid.FixedRows := 1;
-  if Length(FColumns)=0 then DrawGrid.ColCount := 1
-  else DrawGrid.ColCount := Length(FColumns);
-  DrawGrid.FixedCols := 0;
-  for i := low(FColumns) to high(FColumns) do begin
-    DrawGrid.ColWidths[i] := FColumns[i].width;
-  end;
-  FDrawGrid.DefaultRowHeight := 18;
-  DrawGrid.Options := [goFixedVertLine, goFixedHorzLine, goVertLine, goHorzLine,
-    {goRangeSelect, }goDrawFocusSelected, {goRowSizing, }goColSizing, {goRowMoving,}
-    {goColMoving, goEditing, }goTabs, goRowSelect, {goAlwaysShowEditor,}
-    goThumbTracking, goFixedColClick, goFixedRowClick, goFixedHotTrack];
-  FDrawGrid.Invalidate;
-  if Assigned(FOnUpdated) then FOnUpdated(Self);
-end;
-
-procedure TAccountsGrid.LoadFromStream(Stream: TStream);
-Var c,i,j : Integer;
-begin
-  if Stream.Read(c,sizeof(c))<sizeof(c) then exit;
-  if c<=0 then exit;
-  SetLength(FColumns,c);
-  for i := 0 to c - 1 do begin
-    Stream.Read(j,sizeof(j));
-    if (j>=Integer(Low(TAccountColumnType))) And (j<=Integer(High(TAccountColumnType))) then begin
-      FColumns[i].ColumnType := TAccountColumnType(j);
-    end else FColumns[i].ColumnType := act_account_number;
-    Stream.Read(FColumns[i].width,sizeof(FColumns[i].width));
-  end;
-  Stream.Read(j,sizeof(j));
-  If Assigned(FDrawGrid) then FDrawGrid.Width := j;
-  Stream.Read(j,sizeof(j));
-  If Assigned(FDrawGrid) then FDrawGrid.Height := j;
-end;
-
-function TAccountsGrid.LockAccountsList: TOrderedCardinalList;
-begin
-  Result := FAccountsList;
-end;
-
-function TAccountsGrid.MoveRowToAccount(nAccount: Cardinal): Boolean;
-Var oal : TOrderedCardinalList;
-  idx : Integer;
-begin
-  Result := false;
-  if Not Assigned(FDrawGrid) then exit;
-  if Not Assigned(Node) then exit;
-  if FDrawGrid.RowCount<=1 then exit;
-  if FShowAllAccounts then begin
-    If (FDrawGrid.RowCount>nAccount+1) And (nAccount>=0) And (nAccount<Node.Bank.AccountsCount) then begin
-      FDrawGrid.Row := nAccount+1;
-      Result := true;
-    end else begin
-      FDrawGrid.Row := FDrawGrid.RowCount-1;
-    end;
-  end else begin
-    oal := LockAccountsList;
-    try
-      If oal.Find(nAccount,idx) then begin
-        If FDrawGrid.RowCount>idx+1 then begin
-          FDrawGrid.Row := idx+1;
-          Result := true;
-        end else begin
-          FDrawGrid.Row := FDrawGrid.RowCount-1;
-        end;
-      end else begin
-        If FDrawGrid.RowCount>idx+1 then begin
-          FDrawGrid.Row := idx+1;
-        end else begin
-          FDrawGrid.Row := FDrawGrid.RowCount-1;
-        end;
-      end;
-    finally
-      UnlockAccountsList;
-    end;
-  end;
-end;
-
-procedure TAccountsGrid.Notification(AComponent: TComponent;
-  Operation: TOperation);
-begin
-  inherited;
-  if Operation=opRemove then begin
-    if (AComponent=FDrawGrid) then begin
-      SetDrawGrid(Nil);
-    end;
-  end;
-end;
-
-procedure TAccountsGrid.OnGridDrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState);
-  Function FromColorToColor(colorstart,colordest : Integer; step,totalsteps : Integer) : Integer;
-  var sr,sg,sb,dr,dg,db : Byte;
-    i : Integer;
-  begin
-    i := colorstart;
-    sr := GetRValue(i);
-    sg := GetGValue(i);
-    sb := GetBValue(i);
-    i := colordest;
-    dr := GetRValue(i);
-    dg := GetGValue(i);
-    db := GetBValue(i);
-    sr := sr + (((dr-sr) DIV totalsteps)*step);
-    sg := sg + (((dg-sg) DIV totalsteps)*step);
-    sb := sb + (((db-sb) DIV totalsteps)*step);
-    Result :=RGB(sr,sg,sb);
-  end;
-Var C : TAccountColumn;
-  s : String;
-  n_acc : Int64;
-  account : TAccount;
-  ndiff : Cardinal;
-begin
-  if Not Assigned(Node) then exit;
-
-  if (ACol>=0) AND (ACol<length(FColumns)) then begin
-    C := FColumns[ACol];
-  end else begin
-    C.ColumnType := act_account_number;
-    C.width := -1;
-  end;
-  if (ARow=0) then begin
-    // Header
-    s := CT_ColumnHeader[C.ColumnType];
-    DrawGrid.Canvas.TextRect(Rect,s,[tfCenter,tfVerticalCenter]);
-  end else begin
-    n_acc := AccountNumber(ARow);
-    if (n_acc>=0) then begin
-      if (n_acc>=Node.Bank.AccountsCount) then account := CT_Account_NUL
-      else account := Node.Operations.SafeBoxTransaction.Account(n_acc);
-      ndiff := Node.Bank.BlocksCount - account.updated_block;
-      if (gdSelected in State) then
-        If (gdFocused in State) then DrawGrid.Canvas.Brush.Color := clGradientActiveCaption
-        else DrawGrid.Canvas.Brush.Color := clGradientInactiveCaption
-      else DrawGrid.Canvas.Brush.Color := clWindow;
-      DrawGrid.Canvas.FillRect(Rect);
-      InflateRect(Rect,-2,-1);
-      case C.ColumnType of
-        act_account_number : Begin
-          s := TAccountComp.AccountNumberToAccountTxtNumber(n_acc);
-          DrawGrid.Canvas.TextRect(Rect,s,[tfRight,tfVerticalCenter,tfSingleLine]);
-        End;
-        act_account_key : Begin
-          s := Tcrypto.ToHexaString(TAccountComp.AccountKey2RawString(account.accountkey));
-          DrawGrid.Canvas.TextRect(Rect,s,[tfLeft,tfVerticalCenter,tfSingleLine]);
-        End;
-        act_balance : Begin
-          if ndiff=0 then begin
-            // Pending operation... showing final balance
-            DrawGrid.Canvas.Font.Color := clBlue;
-            s := '('+TAccountComp.FormatMoney(account.balance)+')';
-          end else begin
-            s := TAccountComp.FormatMoney(account.balance);
-            if account.balance>0 then DrawGrid.Canvas.Font.Color := ClGreen
-            else if account.balance=0 then DrawGrid.Canvas.Font.Color := clGrayText
-            else DrawGrid.Canvas.Font.Color := clRed;
-          end;
-          DrawGrid.Canvas.TextRect(Rect,s,[tfRight,tfVerticalCenter,tfSingleLine]);
-        End;
-        act_updated : Begin
-          s := Inttostr(account.updated_block);
-          DrawGrid.Canvas.TextRect(Rect,s,[tfRight,tfVerticalCenter,tfSingleLine]);
-        End;
-        act_n_operation : Begin
-          s := InttoStr(account.n_operation);
-          DrawGrid.Canvas.TextRect(Rect,s,[tfRight,tfVerticalCenter,tfSingleLine]);
-        End;
-        act_updated_state : Begin
-          if TAccountComp.IsAccountBlockedByProtocol(account.account,Node.Bank.BlocksCount) then begin
-            DrawGrid.Canvas.Brush.Color := clRed;
-            DrawGrid.Canvas.Ellipse(Rect.Left+1,Rect.Top+1,Rect.Right-1,Rect.Bottom-1);
-          end else if ndiff=0 then begin
-            DrawGrid.Canvas.Brush.Color := RGB(255,128,0);
-            DrawGrid.Canvas.Ellipse(Rect.Left+1,Rect.Top+1,Rect.Right-1,Rect.Bottom-1);
-          end else if ndiff<=8 then begin
-            DrawGrid.Canvas.Brush.Color := FromColorToColor(RGB(253,250,115),ColorToRGB(clGreen),ndiff-1,8-1);
-            DrawGrid.Canvas.Ellipse(Rect.Left+1,Rect.Top+1,Rect.Right-1,Rect.Bottom-1);
-          end else begin
-            DrawGrid.Canvas.Brush.Color := clGreen;
-            DrawGrid.Canvas.Ellipse(Rect.Left+1,Rect.Top+1,Rect.Right-1,Rect.Bottom-1);
-          end;
-        End;
-      else
-        s := '(???)';
-        DrawGrid.Canvas.TextRect(Rect,s,[tfCenter,tfVerticalCenter,tfSingleLine]);
-      end;
-    end;
-  end;
-end;
-
-procedure TAccountsGrid.OnNodeNewOperation(Sender: TObject);
-begin
-  If Assigned(FDrawGrid) then FDrawGrid.Invalidate;
-end;
-
-procedure TAccountsGrid.SaveToStream(Stream: TStream);
-Var c,i,j : Integer;
-begin
-  c := Length(FColumns);
-  Stream.Write(c,sizeof(c));
-  for i := 0 to c - 1 do begin
-    j := Integer(FColumns[i].ColumnType);
-    Stream.Write(j,sizeof(j));
-    if Assigned(FDrawGrid) then begin
-      FColumns[i].width := FDrawGrid.ColWidths[i];
-    end;
-    Stream.Write(FColumns[i].width,sizeof(FColumns[i].width));
-  end;
-  j := FDrawGrid.Width;
-  Stream.Write(j,sizeof(j));
-  j := FDrawGrid.Height;
-  Stream.Write(j,sizeof(j));
-end;
-
-procedure TAccountsGrid.SetDrawGrid(const Value: TDrawGrid);
-begin
-  if FDrawGrid=Value then exit;
-  FDrawGrid := Value;
-  if Assigned(Value) then begin
-    Value.FreeNotification(self);
-    FDrawGrid.OnDrawCell := OnGridDrawCell;
-    InitGrid;
-  end;
-end;
-
-procedure TAccountsGrid.SetNode(const Value: TNode);
-begin
-  if GetNode=Value then exit;
-  FNodeNotifyEvents.Node := Value;
-  InitGrid;
-end;
-
-procedure TAccountsGrid.SetShowAllAccounts(const Value: Boolean);
-begin
-  if FShowAllAccounts=Value then exit;
-  FShowAllAccounts := Value;
-  InitGrid;
-end;
-
-procedure TAccountsGrid.UnlockAccountsList;
-begin
-  InitGrid;
-end;
-
-{ TOperationsGrid }
-
-constructor TOperationsGrid.Create(AOwner: TComponent);
-begin
-  FAccountNumber := 0;
-  FDrawGrid := Nil;
-  FOperationsResume := TOperationsResumeList.Create;
-  FNodeNotifyEvents := TNodeNotifyEvents.Create(Self);
-  FNodeNotifyEvents.OnBlocksChanged := OnNodeNewAccount;
-  FNodeNotifyEvents.OnOperationsChanged := OnNodeNewOperation;
-  inherited;
-end;
-
-destructor TOperationsGrid.Destroy;
-begin
-  FOperationsResume.Free;
-  FNodeNotifyEvents.Free;
-  inherited;
-end;
-
-function TOperationsGrid.GetNode: TNode;
-begin
-  Result := FNodeNotifyEvents.Node;
-end;
-
-procedure TOperationsGrid.InitGrid;
-begin
-  if Not Assigned(FDrawGrid) then exit;
-  if FOperationsResume.Count>0 then FDrawGrid.RowCount := FOperationsResume.Count+1
-  else FDrawGrid.RowCount := 2;
-  DrawGrid.FixedRows := 1;
-  DrawGrid.DefaultDrawing := true;
-  DrawGrid.FixedCols := 0;
-  DrawGrid.ColCount := 8;
-  DrawGrid.ColWidths[0] := 110; // Time
-  DrawGrid.ColWidths[1] := 50; // Block
-  DrawGrid.ColWidths[2] := 60; // Account
-  DrawGrid.ColWidths[3] := 150; // OpType
-  DrawGrid.ColWidths[4] := 70; // Amount
-  DrawGrid.ColWidths[5] := 60; // Operation Fee
-  DrawGrid.ColWidths[6] := 70; // Balance
-  DrawGrid.ColWidths[7] := 500; // Payload
-  FDrawGrid.DefaultRowHeight := 18;
-  FDrawGrid.Invalidate;
-  DrawGrid.Options := [goFixedVertLine, goFixedHorzLine, goVertLine, goHorzLine,
-    {goRangeSelect, }goDrawFocusSelected, {goRowSizing, }goColSizing, {goRowMoving,}
-    {goColMoving, goEditing, }goTabs, goRowSelect, {goAlwaysShowEditor,}
-    goThumbTracking, goFixedColClick, goFixedRowClick, goFixedHotTrack];
-end;
-
-procedure TOperationsGrid.Notification(AComponent: TComponent; Operation: TOperation);
-begin
-  inherited;
-  if Operation=opRemove then begin
-    if (AComponent=FDrawGrid) then begin
-      SetDrawGrid(Nil);
-    end;
-  end;
-end;
-
-procedure TOperationsGrid.OnGridDrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState);
-Var s : String;
-  opr : TOperationResume;
-begin
-  opr := CT_TOperationResume_NUL;
-  Try
-  if (ARow=0) then begin
-    // Header
-    case ACol of
-      0 : s := 'Time';
-      1 : s := 'Block';
-      2 : s := 'Account';
-      3 : s := 'Operation';
-      4 : s := 'Amount';
-      5 : s := 'Fee';
-      6 : s := 'Balance';
-      7 : s := 'Payload';
-    else s:= '';
-    end;
-    DrawGrid.Canvas.TextRect(Rect,s,[tfCenter,tfVerticalCenter]);
-  end else begin
-    if (gdSelected in State) then
-      If (gdFocused in State) then DrawGrid.Canvas.Brush.Color := clGradientActiveCaption
-      else DrawGrid.Canvas.Brush.Color := clGradientInactiveCaption
-    else DrawGrid.Canvas.Brush.Color := clWindow;
-    DrawGrid.Canvas.FillRect(Rect);
-    InflateRect(Rect,-2,-1);
-    if (ARow<=FOperationsResume.Count) then begin
-      opr := FOperationsResume.OperationResume[ARow-1];
-      if ACol=0 then begin
-        if opr.time=0 then s := '(Pending)'
-        else s := DateTimeToStr(UnivDateTime2LocalDateTime(UnixToUnivDateTime(opr.time)));
-        DrawGrid.Canvas.TextRect(Rect,s,[tfleft,tfVerticalCenter,tfSingleLine]);
-      end else if ACol=1 then begin
-        s := Inttostr(opr.Block);
-        DrawGrid.Canvas.TextRect(Rect,s,[tfleft,tfVerticalCenter,tfSingleLine]);
-      end else if ACol=2 then begin
-        s := TAccountComp.AccountNumberToAccountTxtNumber(opr.AffectedAccount);
-        DrawGrid.Canvas.TextRect(Rect,s,[tfleft,tfVerticalCenter,tfSingleLine]);
-      end else if ACol=3 then begin
-        s := opr.OperationTxt;
-        DrawGrid.Canvas.TextRect(Rect,s,[tfleft,tfVerticalCenter,tfSingleLine]);
-      end else if ACol=4 then begin
-        s := TAccountComp.FormatMoney(opr.Amount);
-        if opr.Amount>0 then DrawGrid.Canvas.Font.Color := ClGreen
-        else if opr.Amount=0 then DrawGrid.Canvas.Font.Color := clGrayText
-        else DrawGrid.Canvas.Font.Color := clRed;
-        DrawGrid.Canvas.TextRect(Rect,s,[tfRight,tfVerticalCenter,tfSingleLine]);
-      end else if ACol=5 then begin
-        s := TAccountComp.FormatMoney(opr.Fee);
-        if opr.Fee>0 then DrawGrid.Canvas.Font.Color := ClGreen
-        else if opr.Fee=0 then DrawGrid.Canvas.Font.Color := clGrayText
-        else DrawGrid.Canvas.Font.Color := clRed;
-        DrawGrid.Canvas.TextRect(Rect,s,[tfRight,tfVerticalCenter,tfSingleLine]);
-      end else if ACol=6 then begin
-        if opr.time=0 then begin
-          // Pending operation... showing final balance
-          DrawGrid.Canvas.Font.Color := clBlue;
-          s := '('+TAccountComp.FormatMoney(opr.Balance)+')';
-        end else begin
-          s := TAccountComp.FormatMoney(opr.Balance);
-          if opr.Balance>0 then DrawGrid.Canvas.Font.Color := ClGreen
-          else if opr.Balance=0 then DrawGrid.Canvas.Font.Color := clGrayText
-          else DrawGrid.Canvas.Font.Color := clRed;
-        end;
-        DrawGrid.Canvas.TextRect(Rect,s,[tfRight,tfVerticalCenter,tfSingleLine]);
-      end else if ACol=7 then begin
-        s := opr.PrintablePayload;
-        DrawGrid.Canvas.TextRect(Rect,s,[tfLeft,tfVerticalCenter,tfSingleLine]);
-      end else begin
-        s := '(???)';
-        DrawGrid.Canvas.TextRect(Rect,s,[tfCenter,tfVerticalCenter,tfSingleLine]);
-      end;
-    end;
-  end;
-  Except
-    On E:Exception do begin
-      TLog.NewLog(lterror,Classname,Format('Error at OnGridDrawCell row %d col %d Block %d - %s',[ARow,ACol,opr.Block,E.Message]));
-    end;
-  End;
-end;
-
-procedure TOperationsGrid.OnNodeNewAccount(Sender: TObject);
-begin
-  UpdateAccountOperations;
-end;
-
-procedure TOperationsGrid.OnNodeNewOperation(Sender: TObject);
-Var Op : TPCOperation;
-  l : TList;
-begin
-  if AccountNumber<0 then UpdateAccountOperations
-  else begin
-    Op := TPCOperation(Sender);
-    l := TList.Create;
-    Try
-      Op.AffectedAccounts(l);
-      if l.IndexOf(TObject(Integer(AccountNumber)))>=0 then UpdateAccountOperations;
-    Finally
-      l.Free;
-    End;
-  end;
-end;
-
-procedure TOperationsGrid.SetAccountNumber(const Value: Int64);
-begin
-  if FAccountNumber=Value then exit;
-  FAccountNumber := Value;
-  if FAccountNumber>=0 then FPendingOperations := false;
-  UpdateAccountOperations;
-end;
-
-procedure TOperationsGrid.SetDrawGrid(const Value: TDrawGrid);
-begin
-  if FDrawGrid=Value then exit;
-  FDrawGrid := Value;
-  if Assigned(Value) then begin
-    Value.FreeNotification(self);
-    FDrawGrid.OnDrawCell := OnGridDrawCell;
-    InitGrid;
-  end;
-end;
-
-procedure TOperationsGrid.SetNode(const Value: TNode);
-begin
-  if GetNode=Value then exit;
-  FNodeNotifyEvents.Node := Value;
-  UpdateAccountOperations; // New Build 1.0.3
-end;
-
-procedure TOperationsGrid.SetPendingOperations(const Value: Boolean);
-begin
-  FPendingOperations := Value;
-  if FPendingOperations then  FAccountNumber := -1;
-  UpdateAccountOperations;
-end;
-
-procedure TOperationsGrid.ShowModalDecoder(WalletKeys: TWalletKeys; AppParams : TAppParams);
-Var i : Integer;
-  opr : TOperationResume;
-  FRM : TFRMPayloadDecoder;
-begin
-  if Not Assigned(FDrawGrid) then exit;
-  if (FDrawGrid.Row<=0) Or (FDrawGrid.Row>FOperationsResume.Count) then exit;
-  opr := FOperationsResume.OperationResume[FDrawGrid.Row-1];
-  FRM := TFRMPayloadDecoder.Create(FDrawGrid.Owner);
-  try
-    FRM.Init(opr.Block,opr.time,opr.OperationTxt,opr.OriginalPayload,WalletKeys,AppParams);
-    FRM.ShowModal;
-  finally
-    FRM.Free;
-  end;
-end;
-
-procedure TOperationsGrid.UpdateAccountOperations;
-Var list : TList;
-  i,j : Integer;
-  OPR : TOperationResume;
-  Op : TPCOperation;
-begin
-  FOperationsResume.Clear;
-  Try
-    if Not Assigned(Node) then exit;
-    if FPendingOperations then begin
-      for i := Node.Operations.Count - 1 downto 0 do begin
-        Op := Node.Operations.OperationsHashTree.GetOperation(i);
-        If TDBStorage.OperationToOperationResume(Op,Op.SenderAccount,OPR) then begin
-          OPR.Block := Node.Operations.OperationBlock.block;
-          OPR.Balance := Node.Operations.SafeBoxTransaction.Account(Op.SenderAccount).balance;
-          FOperationsResume.Add(OPR);
-        end;
-      end;
-    end else begin
-      if AccountNumber<0 then begin
-        list := TList.Create;
-        try
-          for i := 0 to Node.Operations.Count-1 do begin
-            Op := Node.Operations.Operation[i];
-            If TDBStorage.OperationToOperationResume(Op,Op.SenderAccount,OPR) then begin
-              OPR.Block := Node.Operations.OperationBlock.block;
-              OPR.Balance := Node.Operations.SafeBoxTransaction.Account(Op.SenderAccount).balance;
-              FOperationsResume.Add(OPR);
-            end;
-          end;
-        finally
-          list.Free;
-        end;
-      end else begin
-        list := TList.Create;
-        Try
-          Node.Operations.OperationsHashTree.GetOperationsAffectingAccount(AccountNumber,list);
-          for i := list.Count - 1 downto 0 do begin
-            Op := Node.Operations.OperationsHashTree.GetOperation(Integer(list[i]));
-            If TDBStorage.OperationToOperationResume(Op,AccountNumber,OPR) then begin
-              OPR.Block := Node.Operations.OperationBlock.block;
-              OPR.Balance := Node.Operations.SafeBoxTransaction.Account(AccountNumber).balance;
-              FOperationsResume.Add(OPR);
-            end;
-          end;
-        Finally
-          list.Free;
-        End;
-        if Node.Bank.Storage is TDBStorage then begin
-          TDBStorage(Node.Bank.Storage).GetOperationsFromAccount(FOperationsResume,AccountNumber,0,200);
-        end;
-      end;
-    end;
-  Finally
-    InitGrid;
-  End;
-end;
-
-{ TOperationsDBGrid }
-
-Type TAuxDBGrid = Class(TDBGrid);
-
-constructor TOperationsDBGrid.Create(AOwner: TComponent);
-Var i : Integer;
-  fld : TField;
-begin
-  inherited;
-  FNeedRefreshSQL := false;
-  FDisableds := 0;
-  FDBGrid := Nil;
-  FQrySQL := TADOQuery.Create(Self);
-  FQrySQL.OnCalcFields := OnQryCalcFields;
-  FqrySQL.CursorLocation := clUseClient;
-  FNodeNotifyEvents := TNodeNotifyEvents.Create(Self);
-  FNodeNotifyEvents.OnBlocksChanged := OnNodeNewAccount;
-  FDataSource := TDataSource.Create(Self);
-  FDataSource.DataSet := FQrySQL;
-  FAccountNumber := -1; // all
-  FBlockStart := -1;
-  FBlockEnd := -1;
-  FDateStart := 0;
-  FDateEnd := 0;
-  fld := TIntegerField.Create(FQrySQL);
-  fld.FieldName := CT_TblFld_Operations_block;
-  fld.DataSet := FQrySQL;
-  fld.Visible := false;
-  //
-  fld := TStringField.Create(FQrySQL);
-  fld.FieldName := CT_TblFld_Operations_s_timestamp;
-  fld.DataSet := FQrySQL;
-  fld.Visible := false;
-  //
-  fld := TIntegerField.Create(FQrySQL);
-  fld.FieldName := CT_TblFld_Operations_optype;
-  fld.DataSet := FQrySQL;
-  fld.Visible := false;
-  fld := TIntegerField.Create(FQrySQL);
-  fld.FieldName := CT_TblFld_Operations_optype_op;
-  fld.DataSet := FQrySQL;
-  fld.Visible := false;
-  fld := TIntegerField.Create(FQrySQL);
-  fld.FieldName := CT_TblFld_Operations_account;
-  fld.DataSet := FQrySQL;
-  fld.Visible := false;
-  fld := TIntegerField.Create(FQrySQL);
-  fld.FieldName := CT_TblFld_Operations_other_account;
-  fld.DataSet := FQrySQL;
-  fld.Visible := false;
-  fld := TDateTimeField.Create(FQrySQL);
-  fld.FieldName := 'datetime';
-  fld.Calculated := true;
-  fld.FieldKind := fkCalculated;
-  fld.DataSet := FQrySQL;
-  fld := TStringField.Create(FQrySQL);
-  fld.FieldName := 'op_account';
-  fld.Calculated := true;
-  fld.FieldKind := fkCalculated;
-  fld.DataSet := FQrySQL;
-  TStringField(fld).Size := 100;
-  fld := TStringField.Create(FQrySQL);
-  fld.FieldName := 'operation';
-  fld.Calculated := true;
-  fld.FieldKind := fkCalculated;
-  fld.DataSet := FQrySQL;
-  TStringField(fld).Size := 100;
-  fld := TStringField.Create(FQrySQL);
-  fld.FieldName := 'payload_txt';
-  fld.Calculated := true;
-  fld.FieldKind := fkCalculated;
-  fld.DataSet := FQrySQL;
-  TStringField(fld).Size := 600;
-  //
-  fld := TStringField.Create(FQrySQL);
-  fld.FieldName := CT_TblFld_Operations_s_amount;
-  fld.DataSet := FQrySQL;
-  fld := TLargeintField.Create(FQrySQL);
-  fld.FieldName := 'amount';
-  fld.Calculated := true;
-  fld.FieldKind := fkCalculated;
-  fld.DataSet := FQrySQL;
-
-  fld := TStringField.Create(FQrySQL);
-  fld.FieldName := CT_TblFld_Operations_s_fee;
-  fld.DataSet := FQrySQL;
-  fld := TLargeintField.Create(FQrySQL);
-  fld.FieldName := 'fee';
-  fld.Calculated := true;
-  fld.FieldKind := fkCalculated;
-  fld.DataSet := FQrySQL;
-
-  fld := TStringField.Create(FQrySQL);
-  fld.FieldName := CT_TblFld_Operations_s_balance;
-  fld.DataSet := FQrySQL;
-  fld := TLargeintField.Create(FQrySQL);
-  fld.FieldName := 'balance';
-  fld.Calculated := true;
-  fld.FieldKind := fkCalculated;
-  fld.DataSet := FQrySQL;
-
-  fld := TStringField.Create(FQrySQL);
-  fld.FieldName := CT_TblFld_Operations_rawpayload;
-  fld.DataSet := FQrySQL;
-  TStringField(fld).Size := 255;
-end;
-
-destructor TOperationsDBGrid.Destroy;
-begin
-  FNodeNotifyEvents.Free;
-  FDataSource.Free;
-  FQrySQL.Free;
-  inherited;
-end;
-
-procedure TOperationsDBGrid.Disable;
-begin
-  inc(FDisableds);
-end;
-
-procedure TOperationsDBGrid.Enable;
-begin
-  dec(FDisableds);
-  if FDisableds>0 then exit;
-  FDisableds := 0;
-  if FNeedRefreshSQL then RefreshData;
-end;
-
-function TOperationsDBGrid.GetAdoConnection: TADOConnection;
-begin
-  Result := FQrySQL.Connection;
-end;
-
-function TOperationsDBGrid.GetNode: TNode;
-begin
-  Result := FNodeNotifyEvents.Node;
-end;
-
-procedure TOperationsDBGrid.Notification(AComponent: TComponent;
-  Operation: TOperation);
-begin
-  inherited;
-  if Operation=opRemove then begin
-    if (AComponent=FDBGrid) then begin
-      SetDBGrid(Nil);
-    end;
-  end;
-end;
-
-procedure TOperationsDBGrid.OnGridDrawColumnCell(Sender: TObject;
-  const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
-Var c : TCanvas;
-  s : String;
-  r : TRect;
-begin
-  c := TDBGrid(Sender).Canvas;
-  r := Rect;
-  if (gdSelected in State) then
-    If (gdFocused in State) then c.Brush.Color := clGradientActiveCaption
-    else c.Brush.Color := clGradientInactiveCaption
-  else c.Brush.Color := clWindow;
-  c.FillRect(Rect);
-  if SameText(Column.FieldName,'amount') Or
-     SameText(Column.FieldName,'fee') Or
-     SameText(Column.FieldName,'balance')
-      then begin
-    c.FillRect(Rect);
-    if Column.Field.AsLargeInt>0 then c.Font.Color := ClGreen
-    else if Column.Field.AsLargeInt=0 then c.Font.Color := clGrayText
-    else c.Font.Color := clRed;
-    s := TAccountComp.FormatMoney(Column.Field.AsLargeInt);
-    c.TextRect(r,s,[tfRight,tfVerticalCenter,tfSingleLine]);
-  end else begin
-    TDBGrid(Sender).DefaultDrawColumnCell(Rect,DataCol,Column,State);
-  end;
-
-  if (gdFixed in State) and ([dgRowLines, dgColLines] * TDBGrid(Sender).Options =  [dgRowLines, dgColLines]) and
-     not (gdPressed in State) then
-  begin
-    InflateRect(r, 1, 1);
-    DrawEdge(c.Handle, r, BDR_RAISEDINNER, BF_BOTTOMRIGHT);
-    DrawEdge(c.Handle, r, BDR_RAISEDINNER, BF_TOPLEFT);
-  end;
-  //
-end;
-
-procedure TOperationsDBGrid.OnNodeNewAccount(Sender: TObject);
-begin
-  RefreshData;
-end;
-
-procedure TOperationsDBGrid.OnQryCalcFields(DataSet: TDataSet);
-Var fld : TField;
-  raw : TRawBytes;
-  s : AnsiString;
-begin
-  fld := DataSet.FieldByName('datetime');
-  fld.AsDateTime :=  UnivDateTime2LocalDateTime(UnixToUnivDateTime( StrToIntDef( DataSet.FieldByName(CT_TblFld_Operations_s_timestamp).AsString, 0)));
-  fld := DataSet.FieldByName('op_account');
-  fld.AsString := TAccountComp.AccountNumberToAccountTxtNumber(DataSet.FieldByName(CT_TblFld_Operations_account).AsInteger);
-  fld := DataSet.FieldByName('payload_txt');
-  TDBStorage.DBStringFieldToRaw(DataSet.FieldByName(CT_TblFld_Operations_rawpayload),raw);
-  If TDBStorage.DBPayloadToReadableText(raw,s) then begin
-    fld.AsString := s;
-  end else begin
-    fld.AsString := TCrypto.ToHexaString(raw);
-  end;
-  //
-  fld := DataSet.FieldByName('amount');
-  TLargeintField(fld).Value := StrToInt64Def(Dataset.FieldByName(CT_TblFld_Operations_s_amount).AsString,0);
-  fld := DataSet.FieldByName('balance');
-  TLargeintField(fld).Value := StrToInt64Def(Dataset.FieldByName(CT_TblFld_Operations_s_balance).AsString,0);
-  fld := DataSet.FieldByName('fee');
-  TLargeintField(fld).Value := StrToInt64Def(Dataset.FieldByName(CT_TblFld_Operations_s_fee).AsString,0);
-
-  fld := DataSet.FieldByName('operation');
-          case dataset.FieldByName(CT_TblFld_Operations_optype).AsInteger of
-            0 : fld.AsString := 'Blockchain reward';
-            CT_Op_Transaction : begin
-              if dataset.FieldByName(CT_TblFld_Operations_optype_op).AsInteger=0 then begin
-                fld.AsString := 'Transaction Sent to '+TAccountComp.AccountNumberToAccountTxtNumber(dataset.FieldByName(CT_TblFld_Operations_other_account).AsLargeInt);
-              end else begin
-                fld.AsString := 'Transaction Received from '+TAccountComp.AccountNumberToAccountTxtNumber(dataset.FieldByName(CT_TblFld_Operations_other_account).AsLargeInt);
-              end;
-            end;
-            CT_Op_Changekey : Begin
-              fld.AsString := 'Change Key';
-            End;
-            CT_Op_Recover : begin
-              fld.AsString := 'Recover founds';
-            end;
-          else
-            fld.AsString := 'Unknown OpType:'+Inttostr(dataset.FieldByName(CT_TblFld_Operations_optype).AsInteger);
-          end;
-end;
-
-procedure TOperationsDBGrid.RefreshData;
-Var sql : AnsiString;
-begin
-  if FDisableds>0 then begin
-    FNeedRefreshSQL := true;
-    exit;
-  end;
-  FNeedRefreshSQL := false;
-  sql := TDBStorage.GetOperationsFromAccountSQL(AccountNumber,BlockStart,BlockEnd,DateStart,DateEnd, 0,50000);
-  If FQrySQL.Connection=Nil then exit;
-  if Node=Nil then exit;
-  if FDBGrid=Nil then exit;
-
-  FQrySQL.DisableControls;
-  try
-    FQrySQL.Close;
-    FQrySQL.SQL.Text := sql;
-    FQrySQL.Open;
-  finally
-    FQrySQL.EnableControls;
-  end;
-end;
-
-procedure TOperationsDBGrid.SetAccountNumber(const Value: Int64);
-begin
-  if FAccountNumber=Value then exit;
-  FAccountNumber := Value;
-  RefreshData;
-end;
-
-procedure TOperationsDBGrid.SetAdoConnection(const Value: TADOConnection);
-begin
-  FQrySQL.Connection := Value;
-  RefreshData;
-end;
-
-procedure TOperationsDBGrid.SetBlockEnd(const Value: Int64);
-begin
-  if FBlockEnd=Value then exit;
-  FBlockEnd := Value;
-  RefreshData;
-end;
-
-procedure TOperationsDBGrid.SetBlocks(bstart, bend: Int64);
-begin
-  FBlockStart := bstart;
-  FBlockEnd := bend;
-  RefreshData;
-end;
-
-procedure TOperationsDBGrid.SetBlockStart(const Value: Int64);
-begin
-  if FBlockStart=Value then exit;
-  FBlockStart := Value;
-  RefreshData;
-end;
-
-procedure TOperationsDBGrid.SetDateEnd(const Value: TDate);
-Var d,h,m,y : word;
-begin
-  if FDateEnd=Value then exit;
-  decodedate(value,y,m,d);
-  FDateEnd := EncodeDate(y,m,d);
-  if FDateStart>=FDateEnd then FDateStart := FDateEnd;
-  RefreshData;
-end;
-
-procedure TOperationsDBGrid.SetDates(dStart, dEnd: TDate);
-begin
-  Disable;
-  try
-    DateStart := dStart;
-    DateEnd := dEnd;
-  finally
-    Enable;
-  end;
-end;
-
-procedure TOperationsDBGrid.SetDateStart(const Value: TDate);
-Var d,h,m,y : word;
-begin
-  if FDateStart=Value then exit;
-  decodedate(value,y,m,d);
-  FDateStart := EncodeDate(y,m,d);
-  if FDateStart>=FDateEnd then FDateEnd := FDateStart;
-  RefreshData;
-end;
-
-procedure TOperationsDBGrid.SetDBGrid(const Value: TDBGrid);
-  Procedure AddColumn(fieldname,displayname : String; colwidth : integer);
-  Var c : TColumn;
-  begin
-    c := DBgrid.Columns.Add;
-    c.FieldName := fieldname;
-    c.Title.Caption := displayname;
-    c.Width := colwidth;
-    c.Title.Font.Style := [fsBold];
-    c.Title.Alignment := taCenter;
-  end;
-begin
-  if FDBGrid=Value then exit;
-  if Assigned(FDBGrid) then FDBGrid.DataSource := Nil;
-  FDBGrid := Value;
-  if Assigned(Value) then begin
-    Value.FreeNotification(self);
-    Value.DataSource := FDataSource;
-    Value.ReadOnly := true;
-    FDBGrid.OnDrawColumnCell := OnGridDrawColumnCell;
-    FDBGrid.DefaultDrawing := false;
-    FDBGrid.Columns.Clear;
-    AddColumn(CT_TblFld_Operations_block,'Block',50);
-    AddColumn('datetime','Date/Time',120);
-    AddColumn('op_account','Account',70);
-    AddColumn('operation','Operation',150);
-    AddColumn('amount','Amount',80);
-    AddColumn('fee','Fee',60);
-    AddColumn('balance','Balance',80);
-    AddColumn('payload_txt','Payload',280);
-    RefreshData;
-  end;
-end;
-
-procedure TOperationsDBGrid.SetNode(const Value: TNode);
-begin
-  FNodeNotifyEvents.Node:= value;
-  RefreshData;
-end;
-
-procedure TOperationsDBGrid.ShowModalDecoder(WalletKeys: TWalletKeys; AppParams: TAppParams);
-Var FRM : TFRMPayloadDecoder;
-  raw : TRawBytes;
-begin
-  if Not Assigned(FDBGrid) Or Not Assigned(FQrySQL) then exit;
-  If FQrySQL.Eof then exit;
-  FRM := TFRMPayloadDecoder.Create(FDBGrid.Owner);
-  try
-    TDBStorage.DBStringFieldToRaw(FQrySQL.FieldByName(CT_TblFld_Operations_rawpayload),raw);
-    FRM.Init(FQrySQL.FieldByName(CT_TblFld_Operations_block).AsInteger,
-      StrToIntDef( FQrySQL.FieldByName(CT_TblFld_Operations_s_timestamp).AsString,0),
-      FQrySQL.FieldByName('operation').AsString,
-      raw,WalletKeys,AppParams);
-    FRM.ShowModal;
-  finally
-    FRM.Free;
-  end;
-end;
-
-{ TBlockChainDBGrid }
-
-constructor TBlockChainDBGrid.Create(AOwner: TComponent);
-Var fld : TField;
-begin
-  inherited;
-  FNeedRefreshSQL := False;
-  FBlockStart := -1;
-  FBlockEnd := -1;
-  FDateEnd := 0;
-  FDateStart := 0;
-  FDisableds := 0;
-  FQrySQL := TADOQuery.Create(Self);
-  FQrySQL.OnCalcFields := OnQryCalcFields;
-  FqrySQL.CursorLocation := clUseClient;
-  FDBGrid := Nil;
-  FNodeNotifyEvents := TNodeNotifyEvents.Create(Self);
-  FNodeNotifyEvents.OnBlocksChanged := OnNodeNewAccount;
-  FDataSource := TDataSource.Create(Self);
-  FDataSource.DataSet := FQrySQL;
-  fld := TIntegerField.Create(FQrySQL);
-  fld.FieldName := CT_TblFld_BlockChain_block;
-  fld.DataSet := FQrySQL;
-  fld.Visible := true;
-  fld := TStringField.Create(FQrySQL);
-  fld.FieldName := CT_TblFld_BlockChain_s_timestamp;
-  fld.DataSet := FQrySQL;
-  fld.Visible := false;
-  fld := TStringField.Create(FQrySQL);
-  fld.FieldName := CT_TblFld_BlockChain_s_reward;
-  fld.DataSet := FQrySQL;
-  fld.Visible := true;
-  fld := TStringField.Create(FQrySQL);
-  fld.FieldName := CT_TblFld_BlockChain_s_fee;
-  fld.DataSet := FQrySQL;
-  fld.Visible := true;
-  fld := TStringField.Create(FQrySQL);
-  fld.FieldName := CT_TblFld_BlockChain_s_compact_target;
-  fld.DataSet := FQrySQL;
-  fld.Visible := true;
-  fld := TIntegerField.Create(FQrySQL);
-  fld.FieldName := CT_TblFld_BlockChain_operations_count;
-  fld.DataSet := FQrySQL;
-  fld.Visible := false;
-  fld := TDateTimeField.Create(FQrySQL);
-  fld.FieldName := 'datetime';
-  fld.Calculated := true;
-  fld.FieldKind := fkCalculated;
-  fld.DataSet := FQrySQL;
-  fld := TStringField.Create(FQrySQL);
-  fld.FieldName := CT_TblFld_BlockChain_proof_of_work;
-  fld.DataSet := FQrySQL;
-  fld.Visible := false;
-  TStringField(fld).Size := 64;
-  fld := TStringField.Create(FQrySQL);
-  fld.FieldName := CT_TblFld_BlockChain_safe_box_hash;
-  fld.DataSet := FQrySQL;
-  fld.Visible := false;
-  TStringField(fld).Size := 64;
-  fld := TStringField.Create(FQrySQL);
-  fld.FieldName := 'target';
-  fld.Calculated := true;
-  fld.FieldKind := fkCalculated;
-  fld.DataSet := FQrySQL;
-  TStringField(fld).Size := 8;
-
-  fld := TLargeintField.Create(FQrySQL);
-  fld.FieldName := 'reward';
-  fld.Calculated := true;
-  fld.FieldKind := fkCalculated;
-  fld.DataSet := FQrySQL;
-
-  fld := TLargeintField.Create(FQrySQL);
-  fld.FieldName := 'fee';
-  fld.Calculated := true;
-  fld.FieldKind := fkCalculated;
-  fld.DataSet := FQrySQL;
-
-  fld := TStringField.Create(FQrySQL);
-  fld.FieldName := CT_TblFld_BlockChain_rawpayload;
-  fld.DataSet := FQrySQL;
-  TStringField(fld).Size := 255;
-
-  fld := TStringField.Create(FQrySQL);
-  fld.FieldName := 'payload_decoded';
-  fld.Calculated := true;
-  fld.FieldKind := fkCalculated;
-  fld.DataSet := FQrySQL;
-  TStringField(fld).Size := 600;
-end;
-
-destructor TBlockChainDBGrid.Destroy;
-begin
-  SetDBGrid(Nil);
-  FNodeNotifyEvents.Free;
-  FDataSource.Free;
-  FQrySQL.Free;
-  inherited;
-end;
-
-procedure TBlockChainDBGrid.Disable;
-begin
-  Inc(FDisableds);
-end;
-
-procedure TBlockChainDBGrid.Enable;
-begin
-  if FDisableds<0 then exit;
-  Dec(FDisableds);
-  if FNeedRefreshSQL then RefreshData;
-end;
-
-function TBlockChainDBGrid.GetAdoConnection: TADOConnection;
-begin
-  Result := FQrySQL.Connection;
-end;
-
-function TBlockChainDBGrid.GetNode: TNode;
-begin
-  Result := FNodeNotifyEvents.Node;
-end;
-
-procedure TBlockChainDBGrid.Notification(AComponent: TComponent;
-  Operation: TOperation);
-begin
-  inherited;
-  if Operation=OpRemove then begin
-    if AComponent=FDBGrid then FDBGrid:=Nil;
-  end;
-end;
-
-procedure TBlockChainDBGrid.OnGridDrawColumnCell(Sender: TObject;
-  const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
-Var c : TCanvas;
-  s : String;
-  r : TRect;
-begin
-  c := TDBGrid(Sender).Canvas;
-  r := Rect;
-  if (gdSelected in State) then
-    If (gdFocused in State) then c.Brush.Color := clGradientActiveCaption
-    else c.Brush.Color := clGradientInactiveCaption
-  else c.Brush.Color := clWindow;
-  c.FillRect(Rect);
-  if SameText(Column.FieldName,'reward') Or
-     SameText(Column.FieldName,'fee')
-      then begin
-    c.FillRect(Rect);
-    if Column.Field.AsLargeInt>0 then c.Font.Color := ClGreen
-    else if Column.Field.AsLargeInt=0 then c.Font.Color := clGrayText
-    else c.Font.Color := clRed;
-    s := TAccountComp.FormatMoney(Column.Field.AsLargeInt);
-    c.TextRect(r,s,[tfRight,tfVerticalCenter,tfSingleLine]);
-  end else begin
-    TDBGrid(Sender).DefaultDrawColumnCell(Rect,DataCol,Column,State);
-  end;
-
-  if (gdFixed in State) and ([dgRowLines, dgColLines] * TDBGrid(Sender).Options =  [dgRowLines, dgColLines]) and
-     not (gdPressed in State) then
-  begin
-    InflateRect(r, 1, 1);
-    DrawEdge(c.Handle, r, BDR_RAISEDINNER, BF_BOTTOMRIGHT);
-    DrawEdge(c.Handle, r, BDR_RAISEDINNER, BF_TOPLEFT);
-  end;
-  //
-end;
-
-procedure TBlockChainDBGrid.OnNodeNewAccount(Sender: TObject);
-begin
-  RefreshData;
-end;
-
-procedure TBlockChainDBGrid.OnQryCalcFields(DataSet: TDataSet);
-Var fld : TField;
-  raw : TRawBytes;
-  s : AnsiString;
-begin
-  fld := DataSet.FieldByName('datetime');
-  fld.AsDateTime :=  UnivDateTime2LocalDateTime(UnixToUnivDateTime(StrToIntDef( DataSet.FieldByName(CT_TblFld_BlockChain_s_timestamp).AsString,0)));
-  fld := DataSet.FieldByName('target');
-  fld.AsString :=  IntToHex(StrToIntDef( DataSet.FieldByName(CT_TblFld_BlockChain_s_compact_target).AsString,0),8);
-  DataSet.FieldByName('reward').AsLargeInt := StrToIntDef(DataSet.FieldByName(CT_TblFld_BlockChain_s_reward).AsString,0);
-  DataSet.FieldByName('fee').AsLargeInt := StrToIntDef(DataSet.FieldByName(CT_TblFld_BlockChain_s_fee).AsString,0);
-  fld := DataSet.FieldByName('payload_decoded');
-  TDBStorage.DBStringFieldToRaw(DataSet.FieldByName(CT_TblFld_BlockChain_rawpayload),raw);
-  If TDBStorage.DBPayloadToReadableText(raw,s) then begin
-    fld.AsString := s;
-  end else begin
-    fld.AsString := TCrypto.ToHexaString(raw);
-  end;
-end;
-
-procedure TBlockChainDBGrid.RefreshData;
-Var sql : AnsiString;
-begin
-  if FDisableds>0 then begin
-    FNeedRefreshSQL := true;
-    exit;
-  end;
-  FNeedRefreshSQL := false;
-  sql := TDBStorage.GetBlockChainSQL(BlockStart,BlockEnd,DateStart,DateEnd, 0,300);
-  If FQrySQL.Connection=Nil then exit;
-  if Node=Nil then exit;
-  if FDBGrid=Nil then exit;
-
-  FQrySQL.DisableControls;
-  try
-    FQrySQL.Close;
-    FQrySQL.SQL.Text := sql;
-    FQrySQL.Open;
-  finally
-    FQrySQL.EnableControls;
-  end;
-end;
-
-procedure TBlockChainDBGrid.SetAdoConnection(const Value: TADOConnection);
-begin
-  FQrySQL.Connection := Value;
-  RefreshData;
-end;
-
-procedure TBlockChainDBGrid.SetBlockEnd(const Value: Int64);
-begin
-  if FBlockEnd=Value then exit;
-  FBlockEnd := Value;
-  RefreshData;
-end;
-
-procedure TBlockChainDBGrid.SetBlocks(bstart, bend: Int64);
-begin
-  disable;
-  Try
-    BlockStart := bstart;
-    BlockEnd := bEnd;
-  Finally
-    Enable;
-  End;
-end;
-
-procedure TBlockChainDBGrid.SetBlockStart(const Value: Int64);
-begin
-  if FBlockStart=Value then exit;
-  FBlockStart:=Value;
-  RefreshData;
-end;
-
-procedure TBlockChainDBGrid.SetDateEnd(const Value: TDate);
-begin
-  if FDateEnd=Value then exit;
-  FDateEnd := Value;
-  RefreshData;
-end;
-
-procedure TBlockChainDBGrid.SetDates(dStart, dEnd: TDate);
-begin
-  Disable;
-  Try
-    DateStart := dStart;
-    DateEnd := dEnd;
-  Finally
-    Enable;
-  End;
-end;
-
-procedure TBlockChainDBGrid.SetDateStart(const Value: TDate);
-begin
-  if FDateStart=Value then exit;
-  FDateStart := Value;
-  RefreshData;
-end;
-
-procedure TBlockChainDBGrid.SetDBGrid(const Value: TDBGrid);
-  Procedure AddColumn(fieldname,displayname : String; colwidth : integer);
-  Var c : TColumn;
-  begin
-    c := DBgrid.Columns.Add;
-    c.FieldName := fieldname;
-    c.Title.Caption := displayname;
-    c.Width := colwidth;
-    c.Title.Font.Style := [fsBold];
-    c.Title.Alignment := taCenter;
-  end;
-begin
-  if FDBGrid=Value then exit;
-  if Assigned(FDBGrid) then FDBGrid.DataSource := Nil;
-  FDBGrid := Value;
-  if Assigned(Value) then begin
-    Value.FreeNotification(self);
-    Value.DataSource := FDataSource;
-    Value.ReadOnly := true;
-    FDBGrid.OnDrawColumnCell := OnGridDrawColumnCell;
-    FDBGrid.DefaultDrawing := false;
-    FDBGrid.Columns.Clear;
-    AddColumn(CT_TblFld_BlockChain_block,'Block',60);
-    AddColumn('datetime','Date/Time',120);
-    AddColumn(CT_TblFld_BlockChain_operations_count,'Ops.',30);
-    AddColumn('reward','Reward',80);
-    AddColumn('fee','Fee',60);
-    AddColumn('target','Target',60);
-    AddColumn('payload_decoded','Miner Payload',150);
-    AddColumn(CT_TblFld_BlockChain_proof_of_work,'Proof of Work',400);
-    AddColumn(CT_TblFld_BlockChain_safe_box_hash,'Safe Box Hash',400);
-    RefreshData;
-  end;
-end;
-
-procedure TBlockChainDBGrid.SetNode(const Value: TNode);
-begin
-  FNodeNotifyEvents.Node := Value;
-  RefreshData;
-end;
-
-end.

+ 36 - 11
Units/Utils/UFolderHelper.pas

@@ -1,5 +1,9 @@
 unit UFolderHelper;
 
+{$IFDEF FPC}
+  {$MODE Delphi}
+{$ENDIF}
+
 { Copyright (c) 2016 by Albert Molina
 
   Distributed under the MIT software license, see the accompanying file LICENSE
@@ -37,42 +41,66 @@ Type TFileVersionInfo = record
 
   TFolderHelper = record
   strict private
+    {$IFnDEF FPC}
     class function GetFolder(const aCSIDL: Integer): string; static;
+    {$ENDIF}
     class function GetAppDataFolder : string; static;
   public
     class function GetPascalCoinDataFolder : string; static;
     class Function GetTFileVersionInfo(Const FileName : String) : TFileVersionInfo; static;
-    class function GetUserDataFolder : string; static;
   end;
 
 implementation
 
 uses
-  ShlObj, Windows, SysUtils;
-
+{$IFnDEF FPC}
+  Windows, ShlObj,
+  {$DEFINE FILEVERSIONINFO}
+{$ELSE}
+  {$IFnDEF LINUX}
+  Windows,
+  {$DEFINE FILEVERSIONINFO}
+  {$ENDIF}
+  LCLIntf, LCLType, LMessages,
+{$ENDIF}
+  SysUtils;
+
+{$IFnDEF FPC}
 function SHGetFolderPath(hwnd: HWND; csidl: Integer; hToken: THandle;
   dwFlags: DWord; pszPath: LPWSTR): HRESULT; stdcall;
   forward;
 function SHGetFolderPath; external 'SHFolder.dll' name 'SHGetFolderPathW';
+{$ENDIF}
 
 class function TFolderHelper.GetAppDataFolder: string;
 begin
-  Result := GetFolder(CSIDL_APPDATA); //User Name / AppData
+  {$IFDEF FPC}
+  {$IFDEF LINUX}
+  Result :=GetEnvironmentVariable('HOME');
+  {$ELSE}
+  Result :=GetEnvironmentVariable('APPDATA');
+  {$ENDIF}
+  {$ELSE}
+  Result := GetFolder(CSIDL_APPDATA); // c:\Users\(User Name)\AppData\Roaming
+  {$ENDIF}
 end;
 
+{$IFnDEF FPC}
 class function TFolderHelper.GetFolder(const aCSIDL: Integer): string;
 var
   FolderPath: array[0 .. MAX_PATH] of Char;
 begin
   Result := '';
-  SetLastError(ERROR_SUCCESS);
+  //SetLastError(ERROR_SUCCESS);
+
   if SHGetFolderPath(0, aCSIDL, 0, 0, @FolderPath) = S_OK then
     Result := FolderPath;
 end;
+{$ENDIF}
 
 class function TFolderHelper.GetPascalCoinDataFolder: string;
 begin
-  Result := GetAppDataFolder+'\PascalCoin';
+  Result := GetAppDataFolder+PathDelim+'PascalCoin';
 end;
 
 class function TFolderHelper.GetTFileVersionInfo(Const FileName: String): TFileVersionInfo;
@@ -104,6 +132,7 @@ Begin
      InfoInferred := False;
      SpecialBuild := False;
    End;
+   {$IFDEF FILEVERSIONINFO}
    VerInfoSize := GetFileVersionInfoSize(PChar(FileName),GetInfoSizeJunk);
    If verInfoSize>0 Then
      Begin
@@ -145,11 +174,7 @@ Begin
          End;
        FreeMem(VersionInfo,VerInfoSize);
      End;
-end;
-
-class function TFolderHelper.GetUserDataFolder: string;
-begin
-  Result := GetFolder(CSIDL_APPDATA);
+   {$ENDIF}
 end;
 
 end.

+ 868 - 12
Units/Utils/UGridUtils.pas

@@ -1,5 +1,9 @@
 unit UGridUtils;
 
+{$IFDEF FPC}
+  {$MODE Delphi}
+{$ENDIF}
+
 { Copyright (c) 2016 by Albert Molina
 
   Distributed under the MIT software license, see the accompanying file LICENSE
@@ -16,8 +20,13 @@ unit UGridUtils;
 interface
 
 uses
-  Classes, Grids, Windows, UNode, UAccounts, UBlockChain,
-  UWalletKeys;
+{$IFnDEF FPC}
+  Windows,
+{$ELSE}
+  LCLIntf, LCLType, LMessages,
+{$ENDIF}
+  Classes, Grids, UNode, UAccounts, UBlockChain, UAppParams,
+  UWalletKeys, UCrypto;
 
 Type
   // TAccountsGrid implements a visual integration of TDrawGrid
@@ -64,10 +73,100 @@ Type
     Property OnUpdated : TNotifyEvent read FOnUpdated write FOnUpdated;
   End;
 
+  TOperationsGrid = Class(TComponent)
+  private
+    FDrawGrid: TDrawGrid;
+    FAccountNumber: Int64;
+    FOperationsResume : TOperationsResumeList;
+    FNodeNotifyEvents : TNodeNotifyEvents;
+    FPendingOperations: Boolean;
+    FBlockStart: Int64;
+    FBlockEnd: Int64;
+    Procedure OnNodeNewOperation(Sender : TObject);
+    Procedure OnNodeNewAccount(Sender : TObject);
+    Procedure InitGrid;
+    procedure OnGridDrawCell(Sender: TObject; ACol, ARow: Longint; Rect: TRect; State: TGridDrawState);
+    procedure SetDrawGrid(const Value: TDrawGrid);
+    procedure SetAccountNumber(const Value: Int64);
+    procedure SetNode(const Value: TNode);
+    function GetNode: TNode;
+    procedure SetPendingOperations(const Value: Boolean);
+
+    procedure SetBlockEnd(const Value: Int64);
+    procedure SetBlockStart(const Value: Int64);protected
+    Procedure GetStoredOperationsFromAccount(Const OperationsResume : TOperationsResumeList; account_number : Cardinal; MaxDeep : Integer); virtual;
+  protected
+    procedure Notification(AComponent: TComponent; Operation: TOperation); Override;
+  public
+    Constructor Create(AOwner : TComponent); override;
+    Destructor Destroy; override;
+    Property DrawGrid : TDrawGrid read FDrawGrid write SetDrawGrid;
+    Property PendingOperations : Boolean read FPendingOperations write SetPendingOperations;
+    Property AccountNumber : Int64 read FAccountNumber write SetAccountNumber;
+    Property Node : TNode read GetNode write SetNode;
+    Procedure UpdateAccountOperations; virtual;
+    Procedure ShowModalDecoder(WalletKeys: TWalletKeys; AppParams : TAppParams);
+    Property BlockStart : Int64 read FBlockStart write SetBlockStart;
+    Property BlockEnd : Int64 read FBlockEnd write SetBlockEnd;
+    Procedure SetBlocks(bstart,bend : Int64);
+  End;
+
+  TBlockChainData = Record
+    Block : Cardinal;
+    Timestamp : Cardinal;
+    OperationsCount : Cardinal;
+    Volume : Int64;
+    Reward, Fee : Int64;
+    Target : Cardinal;
+    HashRateKhs : Int64;
+    MinerPayload : TRawBytes;
+    PoW : TRawBytes;
+    SafeBoxHash : TRawBytes;
+  End;
+  TBlockChainDataArray = Array of TBlockChainData;
+
+  TBlockChainGrid = Class(TComponent)
+  private
+    FBlockChainDataArray : TBlockChainDataArray;
+    FBlockStart: Int64;
+    FMaxBlocks: Integer;
+    FBlockEnd: Int64;
+    FDrawGrid: TDrawGrid;
+    FNodeNotifyEvents : TNodeNotifyEvents;
+    FHashRateAverageBlocksCount: Integer;
+    Procedure OnNodeNewAccount(Sender : TObject);
+    Procedure InitGrid;
+    procedure OnGridDrawCell(Sender: TObject; ACol, ARow: Longint; Rect: TRect; State: TGridDrawState);
+    function GetNode: TNode;
+    procedure SetBlockEnd(const Value: Int64);
+    procedure SetBlockStart(const Value: Int64);
+    procedure SetDrawGrid(const Value: TDrawGrid);
+    procedure SetMaxBlocks(const Value: Integer);
+    procedure SetNode(const Value: TNode);
+    procedure SetHashRateAverageBlocksCount(const Value: Integer); public
+  protected
+    procedure Notification(AComponent: TComponent; Operation: TOperation); Override;
+  public
+    Constructor Create(AOwner : TComponent); override;
+    Destructor Destroy; override;
+    Property DrawGrid : TDrawGrid read FDrawGrid write SetDrawGrid;
+    Property Node : TNode read GetNode write SetNode;
+    Procedure UpdateBlockChainGrid; virtual;
+    Property BlockStart : Int64 read FBlockStart write SetBlockStart;
+    Property BlockEnd : Int64 read FBlockEnd write SetBlockEnd;
+    Procedure SetBlocks(bstart,bend : Int64);
+    Property MaxBlocks : Integer read FMaxBlocks write SetMaxBlocks;
+    Property HashRateAverageBlocksCount : Integer read FHashRateAverageBlocksCount write SetHashRateAverageBlocksCount;
+  End;
+
+Const
+  CT_TBlockChainData_NUL : TBlockChainData = (Block:0;Timestamp:0;OperationsCount:0;Volume:0;Reward:0;Fee:0;Target:0;HashRateKhs:0;MinerPayload:'';PoW:'';SafeBoxHash:'');
+
+
 implementation
 
 uses
-  Graphics, UCrypto, SysUtils, UTime, UOpTransaction, UConst,
+  Graphics, SysUtils, UTime, UOpTransaction, UConst,
   UFRMPayloadDecoder, ULog;
 
 { TAccountsGrid }
@@ -83,7 +182,7 @@ begin
       Result := GridRow-1;
     end else Result := -1;
   end else if GridRow<=FAccountsList.Count then begin
-    Result := Integer(FAccountsList.Get(GridRow-1));
+    Result := (FAccountsList.Get(GridRow-1));
   end else Result := -1;
 end;
 
@@ -156,7 +255,7 @@ begin
   DrawGrid.Options := [goFixedVertLine, goFixedHorzLine, goVertLine, goHorzLine,
     {goRangeSelect, }goDrawFocusSelected, {goRowSizing, }goColSizing, {goRowMoving,}
     {goColMoving, goEditing, }goTabs, goRowSelect, {goAlwaysShowEditor,}
-    goThumbTracking, goFixedColClick, goFixedRowClick, goFixedHotTrack];
+    goThumbTracking{$IFnDEF FPC}, goFixedColClick, goFixedRowClick, goFixedHotTrack{$ENDIF}];
   FDrawGrid.Invalidate;
   if Assigned(FOnUpdated) then FOnUpdated(Self);
 end;
@@ -234,6 +333,61 @@ begin
   end;
 end;
 
+{$IFDEF FPC}
+Type
+TTextFormats = (tfBottom, tfCalcRect, tfCenter, tfEditControl, tfEndEllipsis,
+  tfPathEllipsis, tfExpandTabs, tfExternalLeading, tfLeft, tfModifyString,
+  tfNoClip, tfNoPrefix, tfRight, tfRtlReading, tfSingleLine, tfTop,
+  tfVerticalCenter, tfWordBreak);
+TTextFormat = set of TTextFormats;
+
+Procedure Canvas_TextRect(Canvas : TCanvas; var Rect: TRect; var Text: string; State: TGridDrawState; TextFormat: TTextFormat = []);
+Var ts : TTextStyle;
+Begin
+  if (tfRight in TextFormat) then ts.Alignment:=taRightJustify
+  else if (tfCenter in TextFormat) then ts.Alignment:=taCenter
+  else ts.Alignment:=taLeftJustify;
+  if (tfWordBreak in TextFormat) then ts.Wordbreak:=true
+  else ts.Wordbreak:=false;
+  if (tfVerticalCenter in TextFormat) then ts.Layout:=tlCenter
+  else if (tfBottom in TextFormat) then ts.Layout:=tlBottom
+  else ts.Layout:=tlTop;
+  ts.Clipping:=Not (tfNoClip in TextFormat);
+  ts.SingleLine := (tfSingleLine in TextFormat);
+  ts.Wordbreak:= (tfWordBreak in TextFormat);
+  ts.EndEllipsis:= (tfEndEllipsis in TextFormat);
+  ts.ExpandTabs:=false;
+  ts.Opaque:=false;
+  ts.ShowPrefix:= not (tfNoPrefix in TextFormat);
+  ts.SystemFont:=false;
+  { XXXXXXXXXXX
+  if (gdSelected in State) Or (gdFocused in State) then begin
+    if (gdFocused in State) then begin
+      Canvas.Font.Color:=clHighlightText;
+    end;
+    if (State=[gdSelected]) then begin
+      Canvas.Font.Color:=clHighlightText;
+    end else begin
+      Canvas.Brush.Color:= clHighlight;
+      Canvas.Font.Color:=clHighlightText;
+    end;
+    Canvas.Brush.Color:= clHighlight;
+    Canvas.Font.Color:=clHighlightText;
+  end else if (gdRowHighlight in State) then begin
+    Canvas.Brush.Color:= clHighlight;
+    Canvas.Font.Color:=clHighlightText;
+  end;
+  Canvas.FillRect(Rect);
+  }
+  Canvas.TextRect(Rect,Rect.Left,Rect.Top,Text,ts);
+end;
+{$ELSE}
+Procedure Canvas_TextRect(Canvas : TCanvas; var Rect: TRect; var Text: string; State: TGridDrawState; TextFormat: TTextFormat = []);
+Begin
+  Canvas.TextRect(Rect,Text,TextFormat);
+end;
+{$ENDIF}
+
 procedure TAccountsGrid.OnGridDrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState);
   Function FromColorToColor(colorstart,colordest : Integer; step,totalsteps : Integer) : Integer;
   var sr,sg,sb,dr,dg,db : Byte;
@@ -266,10 +420,13 @@ begin
     C.ColumnType := act_account_number;
     C.width := -1;
   end;
+  {.$IFDEF FPC}
+  DrawGrid.Canvas.Font.Color:=clBlack;
+  {.$ENDIF}
   if (ARow=0) then begin
     // Header
     s := CT_ColumnHeader[C.ColumnType];
-    DrawGrid.Canvas.TextRect(Rect,s,[tfCenter,tfVerticalCenter]);
+    Canvas_TextRect(DrawGrid.Canvas,Rect,s,State,[tfCenter,tfVerticalCenter]);
   end else begin
     n_acc := AccountNumber(ARow);
     if (n_acc>=0) then begin
@@ -285,11 +442,11 @@ begin
       case C.ColumnType of
         act_account_number : Begin
           s := TAccountComp.AccountNumberToAccountTxtNumber(n_acc);
-          DrawGrid.Canvas.TextRect(Rect,s,[tfRight,tfVerticalCenter,tfSingleLine]);
+          Canvas_TextRect(DrawGrid.Canvas,Rect,s,State,[tfRight,tfVerticalCenter,tfSingleLine]);
         End;
         act_account_key : Begin
           s := Tcrypto.ToHexaString(TAccountComp.AccountKey2RawString(account.accountkey));
-          DrawGrid.Canvas.TextRect(Rect,s,[tfLeft,tfVerticalCenter,tfSingleLine]);
+          Canvas_TextRect(DrawGrid.Canvas,Rect,s,State,[tfLeft,tfVerticalCenter,tfSingleLine]);
         End;
         act_balance : Begin
           if ndiff=0 then begin
@@ -302,15 +459,15 @@ begin
             else if account.balance=0 then DrawGrid.Canvas.Font.Color := clGrayText
             else DrawGrid.Canvas.Font.Color := clRed;
           end;
-          DrawGrid.Canvas.TextRect(Rect,s,[tfRight,tfVerticalCenter,tfSingleLine]);
+          Canvas_TextRect(DrawGrid.Canvas,Rect,s,State,[tfRight,tfVerticalCenter,tfSingleLine]);
         End;
         act_updated : Begin
           s := Inttostr(account.updated_block);
-          DrawGrid.Canvas.TextRect(Rect,s,[tfRight,tfVerticalCenter,tfSingleLine]);
+          Canvas_TextRect(DrawGrid.Canvas,Rect,s,State,[tfRight,tfVerticalCenter,tfSingleLine]);
         End;
         act_n_operation : Begin
           s := InttoStr(account.n_operation);
-          DrawGrid.Canvas.TextRect(Rect,s,[tfRight,tfVerticalCenter,tfSingleLine]);
+          Canvas_TextRect(DrawGrid.Canvas,Rect,s,State,[tfRight,tfVerticalCenter,tfSingleLine]);
         End;
         act_updated_state : Begin
           if TAccountComp.IsAccountBlockedByProtocol(account.account,Node.Bank.BlocksCount) then begin
@@ -329,7 +486,7 @@ begin
         End;
       else
         s := '(???)';
-        DrawGrid.Canvas.TextRect(Rect,s,[tfCenter,tfVerticalCenter,tfSingleLine]);
+        Canvas_TextRect(DrawGrid.Canvas,Rect,s,State,[tfCenter,tfVerticalCenter,tfSingleLine]);
       end;
     end;
   end;
@@ -389,4 +546,703 @@ begin
   InitGrid;
 end;
 
+{ TOperationsGrid }
+
+constructor TOperationsGrid.Create(AOwner: TComponent);
+begin
+  FAccountNumber := 0;
+  FDrawGrid := Nil;
+  FOperationsResume := TOperationsResumeList.Create;
+  FNodeNotifyEvents := TNodeNotifyEvents.Create(Self);
+  FNodeNotifyEvents.OnBlocksChanged := OnNodeNewAccount;
+  FNodeNotifyEvents.OnOperationsChanged := OnNodeNewOperation;
+  FBlockStart := -1;
+  FBlockEnd := -1;
+  FPendingOperations := false;
+  inherited;
+end;
+
+destructor TOperationsGrid.Destroy;
+begin
+  FOperationsResume.Free;
+  FNodeNotifyEvents.Free;
+  inherited;
+end;
+
+function TOperationsGrid.GetNode: TNode;
+begin
+  Result := FNodeNotifyEvents.Node;
+end;
+
+procedure TOperationsGrid.GetStoredOperationsFromAccount(const OperationsResume: TOperationsResumeList; account_number: Cardinal; MaxDeep : Integer);
+  Procedure DoGetFromBlock(block_number : Cardinal; last_balance : Int64; act_deep : Integer);
+  var opc : TPCOperationsComp;
+    op : TPCOperation;
+    OPR : TOperationResume;
+    l : TList;
+    i : Integer;
+    next_block_number : Cardinal;
+  begin
+    if (act_deep<=0) Or ((block_number<=0) And (block_number>0)) then exit;
+
+    opc := TPCOperationsComp.Create(Nil);
+    Try
+      If not Node.Bank.Storage.LoadBlockChainBlock(opc,block_number) then begin
+        TLog.NewLog(lterror,ClassName,'Error searching for block '+inttostr(block_number));
+        exit;
+      end;
+      l := TList.Create;
+      try
+        next_block_number := 0;
+        opc.OperationsHashTree.GetOperationsAffectingAccount(account_number,l);
+        for i := l.Count - 1 downto 0 do begin
+          op := opc.Operation[PtrInt(l.Items[i])];
+          if (i=0) then begin
+            If op.SenderAccount=account_number then next_block_number := op.Previous_Sender_updated_block
+            else next_block_number := op.Previous_Destination_updated_block;
+          end;
+          If TPCOperation.OperationToOperationResume(Op,account_number,OPR) then begin
+            OPR.NOpInsideBlock := i;
+            OPR.time := opc.OperationBlock.timestamp;
+            OPR.Block := block_number;
+            OPR.Balance := last_balance;
+            last_balance := last_balance - ( OPR.Amount + OPR.Fee );
+            OperationsResume.Add(OPR);
+          end;
+        end;
+        // Is a new block operation?
+        if (TAccountComp.AccountBlock(account_number)=block_number) And ((account_number MOD CT_AccountsPerBlock)=0) then begin
+          OPR := CT_TOperationResume_NUL;
+          OPR.Block := block_number;
+          OPR.time := opc.OperationBlock.timestamp;
+          OPR.AffectedAccount := account_number;
+          OPR.Amount := opc.OperationBlock.reward;
+          OPR.Fee := opc.OperationBlock.fee;
+          OPR.Balance := last_balance;
+          OPR.OperationTxt := 'Blockchain reward';
+          OperationsResume.Add(OPR);
+        end;
+        //
+        opc.Clear(true);
+        if (next_block_number>0) And (next_block_number<block_number) And (act_deep>0) then DoGetFromBlock(next_block_number,last_balance,act_deep-1);
+      finally
+        l.Free;
+      end;
+    Finally
+      opc.Free;
+    End;
+  end;
+
+Var acc : TAccount;
+begin
+  if MaxDeep<0 then exit;
+  if account_number>=Node.Bank.SafeBox.AccountsCount then exit;
+  acc := Node.Bank.SafeBox.Account(account_number);
+  if (acc.updated_block>0) Or (acc.account=0) then DoGetFromBlock(acc.updated_block,acc.balance,MaxDeep);
+end;
+
+procedure TOperationsGrid.InitGrid;
+begin
+  if Not Assigned(FDrawGrid) then exit;
+  if FOperationsResume.Count>0 then FDrawGrid.RowCount := FOperationsResume.Count+1
+  else FDrawGrid.RowCount := 2;
+  DrawGrid.FixedRows := 1;
+  DrawGrid.DefaultDrawing := true;
+  DrawGrid.FixedCols := 0;
+  DrawGrid.ColCount := 8;
+  DrawGrid.ColWidths[0] := 110; // Time
+  DrawGrid.ColWidths[1] := 70; // Block/Op
+  DrawGrid.ColWidths[2] := 60; // Account
+  DrawGrid.ColWidths[3] := 180; // OpType
+  DrawGrid.ColWidths[4] := 70; // Amount
+  DrawGrid.ColWidths[5] := 60; // Operation Fee
+  DrawGrid.ColWidths[6] := 80; // Balance
+  DrawGrid.ColWidths[7] := 500; // Payload
+  FDrawGrid.DefaultRowHeight := 18;
+  FDrawGrid.Invalidate;
+  DrawGrid.Options := [goFixedVertLine, goFixedHorzLine, goVertLine, goHorzLine,
+    {goRangeSelect, }goDrawFocusSelected, {goRowSizing, }goColSizing, {goRowMoving,}
+    {goColMoving, goEditing, }goTabs, goRowSelect, {goAlwaysShowEditor,}
+    goThumbTracking{$IFnDEF FPC}, goFixedColClick, goFixedRowClick, goFixedHotTrack{$ENDIF}];
+end;
+
+procedure TOperationsGrid.Notification(AComponent: TComponent; Operation: TOperation);
+begin
+  inherited;
+  if Operation=opRemove then begin
+    if (AComponent=FDrawGrid) then begin
+      SetDrawGrid(Nil);
+    end;
+  end;
+end;
+
+procedure TOperationsGrid.OnGridDrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState);
+Var s : String;
+  opr : TOperationResume;
+begin
+  {.$IFDEF FPC}
+  DrawGrid.Canvas.Font.Color:=clBlack;
+  {.$ENDIF}
+  opr := CT_TOperationResume_NUL;
+  Try
+  if (ARow=0) then begin
+    // Header
+    case ACol of
+      0 : s := 'Time';
+      1 : s := 'Block/Op';
+      2 : s := 'Account';
+      3 : s := 'Operation';
+      4 : s := 'Amount';
+      5 : s := 'Fee';
+      6 : s := 'Balance';
+      7 : s := 'Payload';
+    else s:= '';
+    end;
+    Canvas_TextRect(DrawGrid.Canvas,Rect,s,State,[tfCenter,tfVerticalCenter]);
+  end else begin
+    if (gdSelected in State) then
+      If (gdFocused in State) then DrawGrid.Canvas.Brush.Color := clGradientActiveCaption
+      else DrawGrid.Canvas.Brush.Color := clGradientInactiveCaption
+    else DrawGrid.Canvas.Brush.Color := clWindow;
+    DrawGrid.Canvas.FillRect(Rect);
+    InflateRect(Rect,-2,-1);
+    if (ARow<=FOperationsResume.Count) then begin
+      opr := FOperationsResume.OperationResume[ARow-1];
+      if ACol=0 then begin
+        if opr.time=0 then s := '(Pending)'
+        else s := DateTimeToStr(UnivDateTime2LocalDateTime(UnixToUnivDateTime(opr.time)));
+        Canvas_TextRect(DrawGrid.Canvas,Rect,s,State,[tfleft,tfVerticalCenter,tfSingleLine]);
+      end else if ACol=1 then begin
+        s := Inttostr(opr.Block);
+        if opr.NOpInsideBlock>=0 then s := s + '/'+Inttostr(opr.NOpInsideBlock+1);
+        Canvas_TextRect(DrawGrid.Canvas,Rect,s,State,[tfleft,tfVerticalCenter,tfSingleLine]);
+      end else if ACol=2 then begin
+        s := TAccountComp.AccountNumberToAccountTxtNumber(opr.AffectedAccount);
+        Canvas_TextRect(DrawGrid.Canvas,Rect,s,State,[tfleft,tfVerticalCenter,tfSingleLine]);
+      end else if ACol=3 then begin
+        s := opr.OperationTxt;
+        Canvas_TextRect(DrawGrid.Canvas,Rect,s,State,[tfleft,tfVerticalCenter,tfSingleLine]);
+      end else if ACol=4 then begin
+        s := TAccountComp.FormatMoney(opr.Amount);
+        if opr.Amount>0 then DrawGrid.Canvas.Font.Color := ClGreen
+        else if opr.Amount=0 then DrawGrid.Canvas.Font.Color := clGrayText
+        else DrawGrid.Canvas.Font.Color := clRed;
+        Canvas_TextRect(DrawGrid.Canvas,Rect,s,State,[tfRight,tfVerticalCenter,tfSingleLine]);
+      end else if ACol=5 then begin
+        s := TAccountComp.FormatMoney(opr.Fee);
+        if opr.Fee>0 then DrawGrid.Canvas.Font.Color := ClGreen
+        else if opr.Fee=0 then DrawGrid.Canvas.Font.Color := clGrayText
+        else DrawGrid.Canvas.Font.Color := clRed;
+        Canvas_TextRect(DrawGrid.Canvas,Rect,s,State,[tfRight,tfVerticalCenter,tfSingleLine]);
+      end else if ACol=6 then begin
+        if opr.time=0 then begin
+          // Pending operation... showing final balance
+          DrawGrid.Canvas.Font.Color := clBlue;
+          s := '('+TAccountComp.FormatMoney(opr.Balance)+')';
+        end else begin
+          s := TAccountComp.FormatMoney(opr.Balance);
+          if opr.Balance>0 then DrawGrid.Canvas.Font.Color := ClGreen
+          else if opr.Balance=0 then DrawGrid.Canvas.Font.Color := clGrayText
+          else DrawGrid.Canvas.Font.Color := clRed;
+        end;
+        Canvas_TextRect(DrawGrid.Canvas,Rect,s,State,[tfRight,tfVerticalCenter,tfSingleLine]);
+      end else if ACol=7 then begin
+        s := opr.PrintablePayload;
+        Canvas_TextRect(DrawGrid.Canvas,Rect,s,State,[tfLeft,tfVerticalCenter,tfSingleLine]);
+      end else begin
+        s := '(???)';
+        Canvas_TextRect(DrawGrid.Canvas,Rect,s,State,[tfCenter,tfVerticalCenter,tfSingleLine]);
+      end;
+    end;
+  end;
+  Except
+    On E:Exception do begin
+      TLog.NewLog(lterror,Classname,Format('Error at OnGridDrawCell row %d col %d Block %d - %s',[ARow,ACol,opr.Block,E.Message]));
+    end;
+  End;
+end;
+
+procedure TOperationsGrid.OnNodeNewAccount(Sender: TObject);
+begin
+  If (AccountNumber<0) And (FBlockEnd<0) And (Not FPendingOperations) then UpdateAccountOperations;
+end;
+
+procedure TOperationsGrid.OnNodeNewOperation(Sender: TObject);
+Var //Op : TPCOperation;
+  l : TList;
+begin
+  Try
+    if (AccountNumber<0) then begin
+      If (FPendingOperations) then UpdateAccountOperations;
+    end else begin
+      { BUG on Build 1.0.7 -> Corrected on Build 1.0.8
+      Op := TPCOperation(Sender);
+      l := TList.Create;
+      Try
+        Op.AffectedAccounts(l);
+        if l.IndexOf(TObject(PtrInt(AccountNumber)))>=0 then UpdateAccountOperations;
+      Finally
+        l.Free;
+      End;
+      }
+      l := TList.Create;
+      Try
+        If Node.Operations.OperationsHashTree.GetOperationsAffectingAccount(AccountNumber,l)>0 then begin
+          if l.IndexOf(TObject(PtrInt(AccountNumber)))>=0 then UpdateAccountOperations;
+        end;
+      Finally
+        l.Free;
+      End;
+    end;
+  Except
+    On E:Exception do begin
+      E.message := 'Exception on updating OperationsGrid '+inttostr(AccountNumber)+': '+E.Message;
+      Raise;
+    end;
+  end;
+end;
+
+procedure TOperationsGrid.SetAccountNumber(const Value: Int64);
+begin
+  if FAccountNumber=Value then exit;
+  FAccountNumber := Value;
+  if FAccountNumber>=0 then FPendingOperations := false;
+  UpdateAccountOperations;
+end;
+
+procedure TOperationsGrid.SetBlockEnd(const Value: Int64);
+begin
+  FBlockEnd := Value;
+end;
+
+procedure TOperationsGrid.SetBlocks(bstart, bend: Int64);
+begin
+  if (bstart=FBlockStart) And (bend=FBlockEnd) then exit;
+  FBlockStart := bstart;
+  FBlockEnd := bend;
+  if (FBlockEnd>0) And (FBlockStart>FBlockEnd) then FBlockStart := -1;
+  FAccountNumber := -1;
+  FPendingOperations := false;
+  UpdateAccountOperations;
+end;
+
+procedure TOperationsGrid.SetBlockStart(const Value: Int64);
+begin
+  FBlockStart := Value;
+end;
+
+procedure TOperationsGrid.SetDrawGrid(const Value: TDrawGrid);
+begin
+  if FDrawGrid=Value then exit;
+  FDrawGrid := Value;
+  if Assigned(Value) then begin
+    Value.FreeNotification(self);
+    FDrawGrid.OnDrawCell := OnGridDrawCell;
+    InitGrid;
+  end;
+end;
+
+procedure TOperationsGrid.SetNode(const Value: TNode);
+begin
+  if GetNode=Value then exit;
+  FNodeNotifyEvents.Node := Value;
+  UpdateAccountOperations; // New Build 1.0.3
+end;
+
+procedure TOperationsGrid.SetPendingOperations(const Value: Boolean);
+begin
+  FPendingOperations := Value;
+  if FPendingOperations then  FAccountNumber := -1;
+  UpdateAccountOperations;
+end;
+
+procedure TOperationsGrid.ShowModalDecoder(WalletKeys: TWalletKeys; AppParams : TAppParams);
+Var i : Integer;
+  opr : TOperationResume;
+  FRM : TFRMPayloadDecoder;
+begin
+  if Not Assigned(FDrawGrid) then exit;
+  if (FDrawGrid.Row<=0) Or (FDrawGrid.Row>FOperationsResume.Count) then exit;
+  opr := FOperationsResume.OperationResume[FDrawGrid.Row-1];
+  FRM := TFRMPayloadDecoder.Create(FDrawGrid.Owner);
+  try
+    FRM.Init(opr.Block,opr.time,opr.OperationTxt,opr.OriginalPayload,WalletKeys,AppParams);
+    FRM.ShowModal;
+  finally
+    FRM.Free;
+  end;
+end;
+
+procedure TOperationsGrid.UpdateAccountOperations;
+Var list : TList;
+  i,j : Integer;
+  OPR : TOperationResume;
+  Op : TPCOperation;
+  opc : TPCOperationsComp;
+  bstart,bend : int64;
+begin
+  FOperationsResume.Clear;
+  Try
+    if Not Assigned(Node) then exit;
+    if FPendingOperations then begin
+      for i := Node.Operations.Count - 1 downto 0 do begin
+        Op := Node.Operations.OperationsHashTree.GetOperation(i);
+        If TPCOperation.OperationToOperationResume(Op,Op.SenderAccount,OPR) then begin
+          OPR.NOpInsideBlock := i;
+          OPR.Block := Node.Operations.OperationBlock.block;
+          OPR.Balance := Node.Operations.SafeBoxTransaction.Account(Op.SenderAccount).balance;
+          FOperationsResume.Add(OPR);
+        end;
+      end;
+    end else begin
+      if AccountNumber<0 then begin
+        opc := TPCOperationsComp.Create(Nil);
+        try
+          opc.bank := Node.Bank;
+          If FBlockEnd<0 then begin
+            If Node.Bank.BlocksCount>0 then bend := Node.Bank.BlocksCount-1
+            else bend := 0;
+          end else bend := FBlockEnd;
+          if FBlockStart<0 then begin
+            if (bend > 300) then bstart := bend - 300
+            else bstart := 0;
+          end else bstart:= FBlockStart;
+          If bstart<0 then bstart := 0;
+          if bend>=Node.Bank.BlocksCount then bend:=Node.Bank.BlocksCount;
+          while (bstart<=bend) do begin
+            opr := CT_TOperationResume_NUL;
+            if (Node.Bank.Storage.LoadBlockChainBlock(opc,bend)) then begin
+              // Reward operation
+              OPR := CT_TOperationResume_NUL;
+              OPR.Block := bend;
+              OPR.time := opc.OperationBlock.timestamp;
+              OPR.AffectedAccount := bend * CT_AccountsPerBlock;
+              OPR.Amount := opc.OperationBlock.reward;
+              OPR.Fee := opc.OperationBlock.fee;
+              OPR.Balance := OPR.Amount+OPR.Fee;
+              OPR.OperationTxt := 'Blockchain reward';
+              FOperationsResume.Add(OPR);
+              // Reverse operations inside a block
+              for i := opc.Count - 1 downto 0 do begin
+                if TPCOperation.OperationToOperationResume(opc.Operation[i],opc.Operation[i].SenderAccount,opr) then begin
+                  opr.NOpInsideBlock := i;
+                  opr.Block := bend;
+                  opr.time := opc.OperationBlock.timestamp;
+                  FOperationsResume.Add(opr);
+                end;
+              end;
+            end else break;
+            dec(bend);
+          end;
+        finally
+          opc.Free;
+        end;
+
+      end else begin
+        list := TList.Create;
+        Try
+          Node.Operations.OperationsHashTree.GetOperationsAffectingAccount(AccountNumber,list);
+          for i := list.Count - 1 downto 0 do begin
+            Op := Node.Operations.OperationsHashTree.GetOperation(PtrInt(list[i]));
+            If TPCOperation.OperationToOperationResume(Op,AccountNumber,OPR) then begin
+              OPR.NOpInsideBlock := i;
+              OPR.Block := Node.Operations.OperationBlock.block;
+              OPR.Balance := Node.Operations.SafeBoxTransaction.Account(AccountNumber).balance;
+              FOperationsResume.Add(OPR);
+            end;
+          end;
+        Finally
+          list.Free;
+        End;
+        GetStoredOperationsFromAccount(FOperationsResume,AccountNumber,100);
+      end;
+    end;
+  Finally
+    InitGrid;
+  End;
+end;
+
+{ TBlockChainGrid }
+
+constructor TBlockChainGrid.Create(AOwner: TComponent);
+begin
+  inherited;
+  FBlockStart:=-1;
+  FBlockEnd:=-1;
+  FMaxBlocks := 300;
+  FDrawGrid := Nil;
+  FNodeNotifyEvents := TNodeNotifyEvents.Create(Self);
+  FNodeNotifyEvents.OnBlocksChanged := OnNodeNewAccount;
+  FHashRateAverageBlocksCount := 50;
+  SetLength(FBlockChainDataArray,0);
+end;
+
+destructor TBlockChainGrid.Destroy;
+begin
+  FNodeNotifyEvents.OnBlocksChanged := Nil;
+  FNodeNotifyEvents.Node := Nil;
+  FreeAndNil(FNodeNotifyEvents);
+  inherited;
+end;
+
+function TBlockChainGrid.GetNode: TNode;
+begin
+  Result := FNodeNotifyEvents.Node;
+end;
+
+
+procedure TBlockChainGrid.InitGrid;
+begin
+  if Not Assigned(FDrawGrid) then exit;
+  FDrawGrid.RowCount := 2;
+  DrawGrid.FixedRows := 1;
+  DrawGrid.DefaultDrawing := true;
+  DrawGrid.FixedCols := 0;
+  DrawGrid.ColCount := 11;
+  DrawGrid.ColWidths[0] := 50; // Block
+  DrawGrid.ColWidths[1] := 110; // Time
+  DrawGrid.ColWidths[2] := 30; // Ops
+  DrawGrid.ColWidths[3] := 80; // Volume
+  DrawGrid.ColWidths[4] := 50; // Reward
+  DrawGrid.ColWidths[5] := 50; // Fee
+  DrawGrid.ColWidths[6] := 60; // Target
+  DrawGrid.ColWidths[7] := 80; // Hash Rate
+  DrawGrid.ColWidths[8] := 190; // Miner Payload
+  DrawGrid.ColWidths[9] := 190; // PoW
+  DrawGrid.ColWidths[10] := 190; // SafeBox Hash
+  FDrawGrid.DefaultRowHeight := 18;
+  FDrawGrid.Invalidate;
+  DrawGrid.Options := [goFixedVertLine, goFixedHorzLine, goVertLine, goHorzLine,
+    {goRangeSelect, }goDrawFocusSelected, {goRowSizing, }goColSizing, {goRowMoving,}
+    {goColMoving, goEditing, }goTabs, goRowSelect, {goAlwaysShowEditor,}
+    goThumbTracking{$IFnDEF FPC}, goFixedColClick, goFixedRowClick, goFixedHotTrack{$ENDIF}];
+  UpdateBlockChainGrid;
+end;
+
+
+procedure TBlockChainGrid.Notification(AComponent: TComponent;
+  Operation: TOperation);
+begin
+  inherited;
+  if Operation=opRemove then begin
+    if (AComponent=FDrawGrid) then begin
+      SetDrawGrid(Nil);
+    end;
+  end;
+end;
+
+procedure TBlockChainGrid.OnGridDrawCell(Sender: TObject; ACol, ARow: Integer;
+  Rect: TRect; State: TGridDrawState);
+Var s : String;
+  bcd : TBlockChainData;
+begin
+  {.$IFDEF FPC}
+  DrawGrid.Canvas.Font.Color:=clBlack;
+  {.$ENDIF}
+  if (ARow=0) then begin
+    // Header
+    case ACol of
+      0 : s := 'Block';
+      1 : s := 'Time';
+      2 : s := 'Ops';
+      3 : s := 'Volume';
+      4 : s := 'Reward';
+      5 : s := 'Fee';
+      6 : s := 'Target';
+      7 : s := 'Mh/s';
+      8 : s := 'Miner Payload';
+      9 : s := 'Proof of Work';
+      10 : s := 'SafeBox Hash';
+    else s:= '';
+    end;
+    Canvas_TextRect(DrawGrid.Canvas,Rect,s,State,[tfCenter,tfVerticalCenter]);
+  end else begin
+    if (gdSelected in State) then
+      If (gdFocused in State) then DrawGrid.Canvas.Brush.Color := clGradientActiveCaption
+      else DrawGrid.Canvas.Brush.Color := clGradientInactiveCaption
+    else DrawGrid.Canvas.Brush.Color := clWindow;
+    DrawGrid.Canvas.FillRect(Rect);
+    InflateRect(Rect,-2,-1);
+    if ((ARow-1)<=High(FBlockChainDataArray)) then begin
+      bcd := FBlockChainDataArray[ARow-1];
+      if ACol=0 then begin
+        s := IntToStr(bcd.Block);
+        Canvas_TextRect(DrawGrid.Canvas,Rect,s,State,[tfRight,tfVerticalCenter]);
+      end else if ACol=1 then begin
+        s := DateTimeToStr(UnivDateTime2LocalDateTime(UnixToUnivDateTime((bcd.Timestamp))));
+        Canvas_TextRect(DrawGrid.Canvas,Rect,s,State,[tfleft,tfVerticalCenter,tfSingleLine]);
+      end else if ACol=2 then begin
+        s := IntToStr(bcd.OperationsCount);
+        Canvas_TextRect(DrawGrid.Canvas,Rect,s,State,[tfRight,tfVerticalCenter]);
+      end else if ACol=3 then begin
+        s := TAccountComp.FormatMoney(bcd.Volume);
+        if FBlockChainDataArray[ARow-1].Volume>0 then DrawGrid.Canvas.Font.Color := ClGreen
+        else DrawGrid.Canvas.Font.Color := clGrayText;
+        Canvas_TextRect(DrawGrid.Canvas,Rect,s,State,[tfRight,tfVerticalCenter,tfSingleLine]);
+      end else if ACol=4 then begin
+        s := TAccountComp.FormatMoney(bcd.Reward);
+        if FBlockChainDataArray[ARow-1].Reward>0 then DrawGrid.Canvas.Font.Color := ClGreen
+        else DrawGrid.Canvas.Font.Color := clGrayText;
+        Canvas_TextRect(DrawGrid.Canvas,Rect,s,State,[tfRight,tfVerticalCenter,tfSingleLine]);
+      end else if ACol=5 then begin
+        s := TAccountComp.FormatMoney(bcd.Fee);
+        if bcd.Fee>0 then DrawGrid.Canvas.Font.Color := ClGreen
+        else DrawGrid.Canvas.Font.Color := clGrayText;
+        Canvas_TextRect(DrawGrid.Canvas,Rect,s,State,[tfRight,tfVerticalCenter,tfSingleLine]);
+      end else if ACol=6 then begin
+        s := IntToHex(bcd.Target,8);
+        Canvas_TextRect(DrawGrid.Canvas,Rect,s,State,[tfLeft,tfVerticalCenter]);
+      end else if ACol=7 then begin
+        s := Format('%.2n',[bcd.HashRateKhs/1024]);
+        Canvas_TextRect(DrawGrid.Canvas,Rect,s,State,[tfRight,tfVerticalCenter]);
+      end else if ACol=8 then begin
+        if TCrypto.IsHumanReadable(bcd.MinerPayload) then
+          s := bcd.MinerPayload
+        else s := TCrypto.ToHexaString( bcd.MinerPayload );
+        Canvas_TextRect(DrawGrid.Canvas,Rect,s,State,[tfLeft,tfVerticalCenter]);
+      end else if ACol=9 then begin
+        s := TCrypto.ToHexaString(bcd.PoW);
+        Canvas_TextRect(DrawGrid.Canvas,Rect,s,State,[tfLeft,tfVerticalCenter]);
+      end else if ACol=10 then begin
+        s := TCrypto.ToHexaString(bcd.SafeBoxHash);
+        Canvas_TextRect(DrawGrid.Canvas,Rect,s,State,[tfLeft,tfVerticalCenter]);
+      end;
+    end;
+  end;
+end;
+
+
+procedure TBlockChainGrid.OnNodeNewAccount(Sender: TObject);
+begin
+  if FBlockEnd<0 then UpdateBlockChainGrid;
+end;
+
+
+procedure TBlockChainGrid.SetBlockEnd(const Value: Int64);
+begin
+  if FBlockEnd=Value then exit;
+  FBlockEnd := Value;
+  UpdateBlockChainGrid;
+end;
+
+
+procedure TBlockChainGrid.SetBlocks(bstart, bend: Int64);
+begin
+  if (FBlockStart=bstart) And (FBlockEnd=bend) then exit;
+  FBlockStart := bstart;
+  FBlockEnd := bend;
+  UpdateBlockChainGrid;
+end;
+
+
+procedure TBlockChainGrid.SetBlockStart(const Value: Int64);
+begin
+  If FBlockStart=Value then exit;
+  FBlockStart := Value;
+  UpdateBlockChainGrid;
+end;
+
+
+procedure TBlockChainGrid.SetDrawGrid(const Value: TDrawGrid);
+begin
+  if FDrawGrid=Value then exit;
+  FDrawGrid := Value;
+  if Assigned(Value) then begin
+    Value.FreeNotification(self);
+    FDrawGrid.OnDrawCell := OnGridDrawCell;
+    InitGrid;
+  end;
+end;
+
+
+procedure TBlockChainGrid.SetHashRateAverageBlocksCount(const Value: Integer);
+begin
+  if FHashRateAverageBlocksCount=Value then exit;
+  FHashRateAverageBlocksCount := Value;
+  if FHashRateAverageBlocksCount<1 then FHashRateAverageBlocksCount := 1;
+  if FHashRateAverageBlocksCount>1000 then FHashRateAverageBlocksCount := 1000;
+  UpdateBlockChainGrid;
+end;
+
+procedure TBlockChainGrid.SetMaxBlocks(const Value: Integer);
+begin
+  if FMaxBlocks=Value then exit;
+  FMaxBlocks := Value;
+  if (FMaxBlocks<=0) Or (FMaxBlocks>500) then FMaxBlocks := 300;
+  UpdateBlockChainGrid;
+end;
+
+
+procedure TBlockChainGrid.SetNode(const Value: TNode);
+begin
+  FNodeNotifyEvents.Node := Value;
+  UpdateBlockChainGrid;
+end;
+
+
+procedure TBlockChainGrid.UpdateBlockChainGrid;
+Var nstart,nend : Cardinal;
+  opc : TPCOperationsComp;
+  bcd : TBlockChainData;
+  i : Integer;
+begin
+  if (FBlockStart>FBlockEnd) And (FBlockStart>=0) then FBlockEnd := -1;
+  if (FBlockEnd>=0) And (FBlockEnd<FBlockStart) then FBlockStart:=-1;
+
+  if Not Assigned(FNodeNotifyEvents.Node) then exit;
+
+  if FBlockStart>(FNodeNotifyEvents.Node.Bank.BlocksCount-1) then FBlockStart := -1;
+
+  try
+    if Node.Bank.BlocksCount<=0 then begin
+      SetLength(FBlockChainDataArray,0);
+      exit;
+    end;
+    if (FBlockEnd>=0) And (FBlockEnd<Node.Bank.BlocksCount) then begin
+      nend := FBlockEnd
+    end else begin
+      if (FBlockStart>=0) And (FBlockStart+MaxBlocks<=Node.Bank.BlocksCount) then nend := FBlockStart + MaxBlocks - 1
+      else nend := Node.Bank.BlocksCount-1;
+    end;
+
+    if (FBlockStart>=0) And (FBlockStart<Node.Bank.BlocksCount) then nstart := FBlockStart
+    else begin
+      if nend>MaxBlocks then nstart := nend - MaxBlocks + 1
+      else nstart := 0;
+    end;
+    SetLength(FBlockChainDataArray,nend - nstart +1);
+    opc := TPCOperationsComp.Create(Nil);
+    try
+      opc.bank := Node.Bank;
+      while (nstart<=nend) do begin
+        i := length(FBlockChainDataArray) - (nend-nstart+1);
+        bcd := CT_TBlockChainData_NUL;
+        if (Node.Bank.LoadOperations(opc,nend)) then begin
+          bcd.Block := opc.OperationBlock.block;
+          bcd.Timestamp := opc.OperationBlock.timestamp;
+          bcd.OperationsCount := opc.Count;
+          bcd.Volume := opc.OperationsHashTree.TotalAmount + opc.OperationsHashTree.TotalFee;
+          bcd.Reward := opc.OperationBlock.reward;
+          bcd.Fee := opc.OperationBlock.fee;
+          bcd.Target := opc.OperationBlock.compact_target;
+          bcd.HashRateKhs := Node.Bank.SafeBox.CalcBlockHashRateInKhs(bcd.Block,HashRateAverageBlocksCount);
+          bcd.MinerPayload := opc.OperationBlock.block_payload;
+          bcd.PoW := opc.OperationBlock.proof_of_work;
+          bcd.SafeBoxHash := opc.OperationBlock.initial_safe_box_hash;
+        end;
+        FBlockChainDataArray[i] := bcd;
+        if (nend>0) then dec(nend) else break;
+      end;
+    finally
+      opc.Free;
+    end;
+  finally
+    if Assigned(FDrawGrid) then begin
+      if Length(FBlockChainDataArray)>0 then FDrawGrid.RowCount := length(FBlockChainDataArray)+1
+      else FDrawGrid.RowCount := 2;
+      FDrawGrid.Invalidate;
+    end;
+  end;
+end;
+
 end.

+ 70 - 2
Units/Utils/UJSONFunctions.pas

@@ -1,5 +1,9 @@
 unit UJSONFunctions;
 
+{$IFDEF FPC}
+  {$MODE Delphi}
+{$ENDIF}
+
 { Copyright (c) 2016 by Albert Molina
 
   Distributed under the MIT software license, see the accompanying file LICENSE
@@ -15,9 +19,19 @@ unit UJSONFunctions;
 
 interface
 
-Uses DBXJSON, SysUtils, DateUtils, Variants, Classes;
+Uses
+  {$IFDEF FPC}
+  fpjson, jsonparser,
+  {$ELSE}
+  DBXJSON,
+  {$ENDIF}
+  SysUtils, DateUtils, Variants, Classes, ULog;
 
 Type
+  {$IFDEF FPC}
+  TJSONValue = TJSONData;
+  {$ENDIF}
+
   TPCJSONData = Class
   private
     FParent : TPCJSONData;
@@ -186,6 +200,17 @@ constructor TPCJSONArray.CreateFromJSONArray(JSONArray: TJSONArray);
 Var i : Integer;
 begin
   Create;
+{$IFDEF FPC}
+  for i := 0 to JSONArray.Count - 1 do begin
+    if (JSONArray.Items[i] is TJSONArray) then begin
+      Insert(i,TPCJSONArray.CreateFromJSONArray(TJSONArray(JSONArray.Items[i])));
+    end else if (JSONArray.Items[i] is TJSONObject) then begin
+      Insert(i,TPCJSONObject.CreateFromJSONObject(TJSONObject(JSONArray.Items[i])));
+    end else if (JSONArray.Items[i] is TJSONValue) then begin
+      Insert(i,TPCJSONVariantValue.CreateFromJSONValue(TJSONValue(JSONArray.Items[i])));
+    end else raise EPCParametresError.Create('Invalid TJSON Data: '+JSONArray.Items[i].ClassName);
+  end;
+{$ELSE}
   for i := 0 to JSONArray.Size - 1 do begin
     if (JSONArray.Get(i) is TJSONArray) then begin
       Insert(i,TPCJSONArray.CreateFromJSONArray(TJSONArray(JSONArray.Get(i))));
@@ -195,8 +220,10 @@ begin
       Insert(i,TPCJSONVariantValue.CreateFromJSONValue(TJSONValue(JSONArray.Get(i))));
     end else raise EPCParametresError.Create('Invalid TJSON Data: '+JSONArray.Get(i).ClassName);
   end;
+{$ENDIF}
 end;
 
+
 destructor TPCJSONArray.Destroy;
 begin
   inherited;
@@ -438,11 +465,16 @@ begin
 end;
 
 constructor TPCJSONVariantValue.CreateFromJSONValue(JSONValue: TJSONValue);
+{$IFnDEF FPC}
 Var d : Double;
     i : Integer;
   ds,ts : Char;
+{$ENDIF}
 begin
   Create;
+  {$IFDEF FPC}
+  Value := JSONValue.Value;
+  {$ELSE}
   if JSONValue is TJSONNumber then begin
     d := TJSONNumber(JSONValue).AsDouble;
     if Pos('.',JSONValue.ToString)>0 then i := 0
@@ -463,6 +495,7 @@ begin
   else if JSONValue is TJSONFalse then Value := false
   else if JSONValue is TJSONNull then Value := Null
   else Value := JSONValue.Value;
+  {$ENDIF}
 end;
 
 procedure TPCJSONVariantValue.SetValue(const Value: Variant);
@@ -476,7 +509,7 @@ Var   ds,ts : Char;
 begin
   Case VarType(Value) of
     varSmallint,varInteger,varByte,varWord : Result := IntToStr(Value);
-    varLongWord,varInt64 : Result := UIntToStr(Value);
+    varLongWord,varInt64 : Result := IntToStr(Value);
     varBoolean : if (Value) then Result := 'true' else Result:='false';
     varNull : Result := 'null';
     varDate,varDouble : begin
@@ -645,8 +678,24 @@ end;
 
 constructor TPCJSONObject.CreateFromJSONObject(JSONObject: TJSONObject);
 var i,i2 : Integer;
+  {$IFDEF FPC}
+  aname : TJSONStringType;
+  {$ENDIF}
 begin
   Create;
+  {$IFDEF FPC}
+  for i := 0 to JSONObject.Count - 1 do begin
+    aname := JSONObject.Names[i];
+    i2 := GetIndexOrCreateName(JSONObject.Names[i]);
+    if (JSONObject.Types[ aname ] = jtArray) then begin
+      (Items[i2] as TPCJSONNameValue).Value := TPCJSONArray.CreateFromJSONArray(JSONObject.Arrays[aname]);
+    end else if (JSONObject.Types[ aname ] = jtObject) then begin
+      (Items[i2] as TPCJSONNameValue).Value := TPCJSONObject.CreateFromJSONObject(JSONObject.Objects[aname]);
+    end else if (JSONObject.Types[ aname ] in [jtBoolean,jtNull,jtNumber,jtString]) then begin
+      (Items[i2] as TPCJSONNameValue).Value := TPCJSONVariantValue.CreateFromJSONValue(JSONObject.Items[i]);
+    end else raise EPCParametresError.Create('Invalid TJSON Data in JSONObject.'+aname+': '+JSONObject.Items[i].ClassName);
+  end;
+  {$ELSE}
   for i := 0 to JSONObject.Size - 1 do begin
     i2 := GetIndexOrCreateName(JSONObject.Get(i).JsonString.Value);
     if (JSONObject.Get(i).JsonValue is TJSONArray) then begin
@@ -657,8 +706,10 @@ begin
       (Items[i2] as TPCJSONNameValue).Value := TPCJSONVariantValue.CreateFromJSONValue(TJSONValue(JSONObject.Get(i).JsonValue));
     end else raise EPCParametresError.Create('Invalid TJSON Data in JSONObject.'+JSONObject.Get(i).JsonString.Value+': '+JSONObject.Get(i).ClassName);
   end;
+  {$ENDIF}
 end;
 
+
 procedure TPCJSONObject.DeleteName(Name: String);
 Var i : Integer;
 begin
@@ -878,9 +929,26 @@ end;
 
 class function TPCJSONData.ParseJSONValue(Const JSONObject: TBytes): TPCJSONData;
 Var JS : TJSONValue;
+  {$IFDEF FPC}
+  jss : TJSONStringType;
+  i : Integer;
+  {$ENDIF}
 begin
   Result := Nil;
+  {$IFDEF FPC}
+  SetLength(jss,length(JSONObject));
+  for i:=0 to High(JSONObject) do jss[i+1] := AnsiChar( JSONObject[i] );
+  JS := Nil;
+  Try
+    JS := GetJSON(jss);
+  Except
+    On E:Exception do begin
+      TLog.NewLog(ltDebug,ClassName,'Error processing JSON: '+E.Message);
+    end;
+  end;
+  {$ELSE}
   JS := TJSONObject.ParseJSONValue(JSONObject,0);
+  {$ENDIF}
   if Not Assigned(JS) then exit;
   Try
     if JS is TJSONObject then begin