#AutoIt3Wrapper_Icon=CD.ico
#AutoIt3Wrapper_Run_Obfuscator=y
#Obfuscator_Parameters=/sf /sv /om /cs=0 /cn=0
#AutoIt3Wrapper_UseX64=n
#AutoIt3Wrapper_Res_Description=creates an ISO image from a CD or DVD
#AutoIt3Wrapper_Res_Fileversion=1.0.0.0
#AutoIt3Wrapper_Res_Language=1033
#AutoIt3Wrapper_Res_Field=Version|1.0.0
#AutoIt3Wrapper_Res_Field=Build|2011-08-03 beta
#AutoIt3Wrapper_Res_Field=Coded by|UEZ
#AutoIt3Wrapper_Res_Field=Compile date|%longdate% %time%
#AutoIt3Wrapper_Res_Field=AutoIt Version|%AutoItVer%
#AutoIt3Wrapper_UseUpx=n
;~ #AutoIt3Wrapper_UPX_Parameters=--ultra-brute --crp-ms=999999 --all-methods --all-filters
;~ #AutoIt3Wrapper_Run_After=..\..\..\ResourceHacker\ResHacker.exe -delete %out%, %out%, ICON, 1,
;~ #AutoIt3Wrapper_Run_After=..\..\..\ResourceHacker\ResHacker.exe -delete %out%, %out%, ICON, 2,
;~ #AutoIt3Wrapper_Run_After=..\..\..\ResourceHacker\ResHacker.exe -delete %out%, %out%, ICON, 3,
;~ #AutoIt3Wrapper_Run_After=..\..\..\ResourceHacker\ResHacker.exe -delete %out%, %out%, MENU, 166,
;~ #AutoIt3Wrapper_Run_After=..\..\..\ResourceHacker\ResHacker.exe -delete %out%, %out%, DIALOG, 1000,
;~ #AutoIt3Wrapper_Run_After=..\..\..\ResourceHacker\ResHacker.exe -delete %out%, %out%, ICONGROUP, 162,
;~ #AutoIt3Wrapper_Run_After=..\..\..\ResourceHacker\ResHacker.exe -delete %out%, %out%, ICONGROUP, 164,
;~ #AutoIt3Wrapper_Run_After=..\..\..\ResourceHacker\ResHacker.exe -delete %out%, %out%, ICONGROUP, 169,
#AutoIt3Wrapper_Run_After=del /f /q "%scriptdir%\%scriptfile%_Obfuscated.au3"
;~ #AutoIt3Wrapper_Run_After=upx.exe --ultra-brute --crp-ms=999999 --all-methods --all-filters "%out%"
#AutoIt3Wrapper_Run_After=upx.exe --best --lzma "%out%"
;~ #AutoIt3Wrapper_AU3Check_Parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6
#include <Array.au3>
#include <ButtonConstants.au3>
#include <ComboConstants.au3>
#include <Constants.au3>
#include <Date.au3>
#include <GDIPlus.au3>
#include <EditConstants.au3>
#include <File.au3>
#include <GuiComboBoxEx.au3>
#include <GUIConstantsEx.au3>
#include <GUIMenu.au3>
#include <Memory.au3>
#include <ProgressConstants.au3>
#include <String.au3>
#include <WindowsConstants.au3>
;~ #NoTrayIcon
Opt("TrayMenuMode", 1)
Opt("MustDeclareVars", 1)

_GDIPlus_Startup()
Global Const $ini_file = @ScriptDir & "\ISO Creator.ini"
Global $bg_pic = "0"
If FileExists($ini_file) Then
	$bg_pic = IniRead($ini_file, "Settings", "Background_Pic", "0")
	If $bg_pic <> "0" And Not FileExists($bg_pic) Then $bg_pic = "0"
EndIf
Global $ok = 0
Global Const $w = 615
Global Const $h = 157
Global Const $title = "ISO Creator v1.0.0 by UEZ 2011 v2"
Global Const $build = " build 2011-08-03 beta"
Global Const $hGUI = GUICreate($title, $w, $h, -1, -1)
Global Const $idPic = GUICtrlCreatePic("", 0, 0, $w, $h)
GUICtrlSetState(-1, $GUI_DISABLE)
Global Const $idButton_Create = GUICtrlCreateButton("&Create" & @LF & "ISO", 528, 8, 75, 73, BitOR($BS_CENTER, $BS_VCENTER, $BS_MULTILINE))
GUICtrlSetState(-1, $GUI_DISABLE)
GUICtrlSetTip(-1, "Start creating ISO")
GUICtrlSetFont(-1, 12, 400, 0, "Times New Roman")
Global Const $idButton_Abort = GUICtrlCreateButton("A&bort", 528, 8, 75, 73, BitOR($BS_CENTER, $BS_VCENTER, $BS_MULTILINE))
GUICtrlSetState(-1, $GUI_HIDE)
GUICtrlSetTip(-1, "Abort the ISO creation")
GUICtrlSetFont(-1, 14, 400, 0, "Times New Roman")
Global Const $idProgressbar = GUICtrlCreateProgress(8, 94, 595, 27, $PBS_SMOOTH)
;~ Global Const $idInput_Filename = GUICtrlCreateInput("", 160, 31, 257, 24, BitOR($GUI_SS_DEFAULT_INPUT, $ES_READONLY, $ES_WANTRETURN))
Global Const $idInput_Filename = GUICtrlCreateInput("", 160, 31, 257, 24, $GUI_SS_DEFAULT_INPUT)
GUICtrlSetFont(-1, 11, 600, 0, "Times New Roman")
GUICtrlSetTip(-1, "Click on the Save As button to create a iso file")
Global Const $hInput_Filename = GUICtrlGetHandle($idInput_Filename)
Global Const $idInput_Filename_Color = 0x002000
Global Const $idLabel_filename = GUICtrlCreateLabel("Filename:", 96, 34, 60, 21)
GUICtrlSetFont(-1, 11, 800, 0, "Times New Roman")
GUICtrlSetBkColor(-1, -2)
GUICtrlSetColor(-1, 0x101080)
Global Const $idButton_Browse = GUICtrlCreateButton("&Save as", 426, 30, 75, 25)
GUICtrlSetTip(-1, "Save ISO image")
Global Const $idLabel_Drive = GUICtrlCreateLabel("Drive:", 8, 34, 37, 21)
GUICtrlSetFont(-1, 11, 800, 0, "Times New Roman")
GUICtrlSetBkColor(-1, -2)
GUICtrlSetColor(-1, 0xF0F0FF)
Global Const $idCB_MD5 = GUICtrlCreateCheckbox("", 8, 132, 12, 12)
GUICtrlSetTip(-1, "Create MD5 checksum")
Global Const $idLabel_MD5 = GUICtrlCreateLabel("Create MD5 checksum", 24, 132, 95, 18)
GUICtrlSetTip(-1, "Create MD5 checksum after ISO has been created")
GUICtrlSetFont(-1, 8, 800, 0, "Times New Roman")
GUICtrlSetBkColor(-1, -2)
GUICtrlSetColor(-1, 0x101060)

Global Const $IOCTL_STORAGE_MEDIA_REMOVAL = 0x002D4804
Global Const $IOCTL_SCSI_PASS_THROUGH = 0x0004D004
Global Const $IOCTL_STORAGE_EJECT_MEDIA = 0x002D4808
Global Const $IOCTL_STORAGE_LOAD_MEDIA = 0x002D480C
Global $aMediaTypes[0x10000]
$aMediaTypes[0x0000] = "No media"
$aMediaTypes[0x0008] =  "CD-ROM"
$aMediaTypes[0x0009] =  "CD-R"
$aMediaTypes[0x000A] =  "CD-RW"
$aMediaTypes[0x0010] =  "DVD-ROM"
$aMediaTypes[0x0011] =  "DVD-R Seq. Rec." ;Sequential Recording
$aMediaTypes[0x0012] =  "DVD-RAM"
$aMediaTypes[0x0013] =  "DVD-RW Restricted Overwrite"
$aMediaTypes[0x0014] =  "DVD-RW Seq. Rec." ;Sequential Recording
$aMediaTypes[0x0015] =  "DVD-R DL" ;Dual Layer
$aMediaTypes[0x0016] =  "DVD-R DL Jmp Rec." ;Dual Layer Jump Recording
$aMediaTypes[0x0017] =  "DVD-RW DL"
$aMediaTypes[0x0018] =  "DVD-Download Disc Rec."
$aMediaTypes[0x001A] =  "DVD+RW"
$aMediaTypes[0x001B] =  "DVD+R"
$aMediaTypes[0x0040] =  "BD-ROM"
$aMediaTypes[0x0041] =  "BD-R SRM" ;Sequential Recording Mode
$aMediaTypes[0x0042] =  "BD-R RRM" ;Random Recording Mode (RRM)
$aMediaTypes[0x0043] =  "BD-RE"
$aMediaTypes[0x0050] =  "HD DVD-ROM"
$aMediaTypes[0x0051] =  "HD DVD-R"
$aMediaTypes[0x0052] =  "HD DVD-RAM"
$aMediaTypes[0x0053] =  "HD DVD-RW"
$aMediaTypes[0x0058] =  "HD DVD-R DL"
$aMediaTypes[0x005A] =  "HD DVD-RW DL"
$aMediaTypes[0xFFFF] =  "Unknown"

Global $sDrives = GetDrivesInfo()
Global $drv_tmp = $sDrives
Global $aInfo_o = StringSplit($sDrives, "|", 2)
Global Const $idCombo = GUICtrlCreateCombo("", 48, 31, 38, 25, BitOR($CBS_DROPDOWNLIST, $CBS_AUTOHSCROLL, $CBS_SORT, $CBS_UPPERCASE, $CBS_SORT), $WS_EX_TOPMOST)
GUICtrlSetData(-1, $sDrives)
GUICtrlSetTip(-1, "Select CD/DVD drive")
GUICtrlSetFont(-1, 9, 800, 0, "Times New Roman")
Global Const $hCombo = GUICtrlGetHandle($idCombo)

Global $nMsg, $saveas, $drv, $file, $pid, $aChild, $line, $aP, $po, $abort, $t, $i, $c, $fn, $td, $sek, $err, $drvl, $mo, $dummy, $aM
Global $fs = False, $start_dummy = False, $combo_min = True, $started = False
Global Const $perf = 250
Global $combo_size = 38

Global Const $dt = 1000 * 3600 ; if timer > 1h abort copy process

Global $hHBITMAP
If $bg_pic = "0" Then
	$hHBITMAP = Load_BMP_From_Mem(BackgroundPic(), True)
	_WinAPI_DeleteObject(GUICtrlSendMsg($idPic, 0x0172, 0, $hHBITMAP)) ;$STM_SETIMAGE = 0x0172, $IMAGE_BITMAP = 0
	_WinAPI_DeleteObject($hHBITMAP)
Else
	Change_Background_Pic($bg_pic)
	ControlFocus($hGUI, "", $idButton_Browse)
EndIf

GUISetIcon(@SystemDir & "\Shell32.dll", 189, $hGUI)

Global Const $hBitmap = Load_BMP_From_Mem(Texture(), True)
Global $aR = DllCall("Gdi32.dll", "Handle", "CreatePatternBrush", "Handle", $hBitmap)
Global $hBrush = $aR[0]
Global $mco = MouseGetCursor()
GUIRegisterMsg(0x0133, "WM_CTLCOLOREDIT") ;$WM_CTLCOLOREDIT = 0x0133

Global $auto_exit = False
If $CmdLine[0] > 3 And  $CmdLine[0] < 7 Then CheckCMDLine()

Global Const $AW_ACTIVATE = 0x00020000, $AW_BLEND = 0x00080000, $AW_HIDE = 0x00010000

If Not $auto_exit Then
	_WinAPI_AnimateWindow($hGUI, BitOR($AW_BLEND, $AW_ACTIVATE), 500)
	_GUICtrlComboBoxEx_SetCurSel($hCombo, 0)
	ControlFocus($hGUI, "", $idButton_Browse)
	GUICtrlSetPos($idCombo, 48, 31, 38, 27)
EndIf

GUISetState(@SW_SHOW, $hGUI)

Global Const $hDwmApiDll = DllOpen("dwmapi.dll")
Global Const $sChkAero = DllStructCreate("int;")
DllCall($hDwmApiDll, "int", "DwmIsCompositionEnabled", "ptr", DllStructGetPtr($sChkAero))
Global Const $aero = DllStructGetData($sChkAero, 1)
DllClose($hDwmApiDll)

DllCall('user32.dll', 'int', 'HideCaret', 'hwnd', $hGUI)
DllCall('user32.dll', 'int', 'DestroyCaret')

Global $_MD5_CodeBuffer, $_MD5_CodeBufferMemory
Global $_MD5_InitOffset, $_MD5_InputOffset, $_MD5_ResultOffset
Global $_HASH_MD5[4] = [16, 88, '_MD5_', '_MD5_']

Global $_MDCodeBuffer, $_MDLoadOffset, $_MDGetOffset, $_MDFreeOffset, $aResult
Global $_MFHookPtr, $_MFHookBak, $_MFHookApi = "LocalCompact"
Global $_MDKernel32Dll = DllOpen("kernel32.dll")
MemoryDllInit()

Global $cd2iso_DLL = MemoryDllOpen(cd2iso_DLL())

Global Enum $idAbout = 1000, $idChangeBGPic, $id_EjectMedia, $id_LoadMedia
Global Const $hMenu = _GUICtrlMenu_GetSystemMenu($hGUI)
_GUICtrlMenu_InsertMenuItem($hMenu, 5, 0, 0)
_GUICtrlMenu_InsertMenuItem($hMenu, 6, "&About", $idAbout)
_GUICtrlMenu_InsertMenuItem($hMenu, 7, 0, 0)
_GUICtrlMenu_InsertMenuItem($hMenu, 8, "Change &Background Pic", $idChangeBGPic)

Global Const $hBmp_About = _WinAPI_CreateBitmapFromIcon(@SystemDir & "\Shell32.dll", 221, 22, 22)
_GUICtrlMenu_SetItemBmp($hMenu, 6, $hBmp_About)
Global $Icon_ChP = 301
If @OSBuild < 6000 Then $Icon_ChP = 117
Global Const $hBmp_ChangeBG = _WinAPI_CreateBitmapFromIcon(@SystemDir & "\Shell32.dll", $Icon_ChP, 24, 24)
_GUICtrlMenu_SetItemBmp($hMenu, 8, $hBmp_ChangeBG)

Global Const $hQMenu = _GUICtrlMenu_CreatePopup()
_GUICtrlMenu_InsertMenuItem($hQMenu, 0, "Eject media from the device", $id_EjectMedia)
_GUICtrlMenu_InsertMenuItem($hQMenu, 1, "", 0)
_GUICtrlMenu_InsertMenuItem($hQMenu, 2, "Load Media", $id_LoadMedia)

Global Const $hBmp_EjectMedia = _WinAPI_CreateBitmapFromIcon(@SystemDir & "\Shell32.dll", 78, 32, 32)
_GUICtrlMenu_SetItemBmp($hQMenu, 0, $hBmp_EjectMedia)
;~ Global Const $hBmp_LoadMedia = _WinAPI_CreateBitmapFromIcon(@SystemDir & "\Shell32.dll", 11, 32, 32)
Global Const $hBmp_LoadMedia = Load_BMP_From_Mem(Icon_LM(), True)
_GUICtrlMenu_SetItemBmp($hQMenu, 2, $hBmp_LoadMedia)

GUIRegisterMsg(0x0112, "WM_SYSCOMMAND") ;$WM_SYSCOMMAND = 0x0112
GUIRegisterMsg(0x0111, "WM_COMMAND") ;$WM_COMMAND = 0x0111
GUIRegisterMsg(0x007B, "WM_CONTEXTMENU") ; $WM_CONTEXTMENU = 0x007B

$dummy = GUICtrlCreateDummy()

AdlibRegister("Chk_Drive_Status", 2000) ; checks every 2 seconds whether new media has been inserted to update combo box

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			_Exit()
		Case $idButton_Browse
			$saveas = FileSaveDialog("Enter ISO file name", "", "ISO (*.iso)")
			If Not @error Then
				If StringRight($saveas, 4) <> ".iso" Then $saveas &= ".iso"
				GUICtrlSetData($idInput_Filename, $saveas)
				$ok += 1
				$fs = True
			EndIf
		Case $idButton_Create, $dummy
			$fn = GUICtrlRead($idInput_Filename)
			If FileExists($fn) Then
				$c = MsgBox(48 + 4, "Information", $fn & " already exists!" & @CRLF & @CRLF & "Overwrite?", 0, $hGUI)
				If $c = 6 Then
					If FileDelete($fn) Then
						Create_ISO()
					Else
						MsgBox(16, "Error", "Unable to delete " & $fn, 30, $hGUI)
					EndIf
				EndIf
			Else
				Create_ISO()
			EndIf
	EndSwitch
	If $ok > 0 Then
		If BitAND(GUICtrlGetState($idButton_Create), $GUI_ENABLE) <> $GUI_ENABLE Then GUICtrlSetState($idButton_Create, $GUI_ENABLE)
	Else
		If BitAND(GUICtrlGetState($idButton_Create), $GUI_DISABLE) <> $GUI_DISABLE Then GUICtrlSetState($idButton_Create, $GUI_DISABLE)
	EndIf

	If $start_dummy Then
		GUICtrlSendToDummy($dummy)
		$start_dummy = False
	EndIf

	$aM = GUIGetCursorInfo($hGUI)
	If IsArray($aM) Then
		If $aM[4] = $idCombo Then
			If $combo_size = 38 Then
				GUICtrlSetPos($idCombo, 48, 31, 310, 27)
				$combo_size = 310
				If Not $aero Then _WinAPI_RedrawWindow($hGUI)
			EndIf
		Else
			If $combo_size = 310 And $combo_min Then
				GUICtrlSetPos($idCombo, 48, 31, 38, 27)
				$combo_size = 38
			EndIf
		EndIf
	EndIf

WEnd

Func Chk_Drive_Status()
	Local $z, $info
	Local $drv_info = GetDrivesInfo()
	Local $aInfo_c = StringSplit($drv_info, "|", 2)
	Local $ci = _GUICtrlComboBox_GetCurSel($hCombo)
	If $drv_info <> $drv_tmp Then
		GUICtrlSetState($idCombo, $GUI_DISABLE)
		_GUICtrlComboBox_ResetContent($hCombo)
		GUICtrlSetData($idCombo, $drv_info)
		_GUICtrlComboBoxEx_SetCurSel($hCombo, $ci)
		GUICtrlSetState($idCombo, $GUI_ENABLE)
		$drv_tmp = $drv_info
		For $z = 0 To UBound($aInfo_c) - 1
			If $aInfo_c[$z] <> $aInfo_o[$z]  Then $info &= $aInfo_c[$z]  & @CRLF
		Next
		TrayTip("Information", "CD/DVD media change detected:" & @CRLF & @CRLF & $info, 1, 1)
		$aInfo_o = $aInfo_c
	EndIf
EndFunc   ;==>Chk_Drive_Status

Func GetDrivesInfo()
	Local $k
	Local $aDrives = DriveGetDrive("CDROM")
	If @error Then Return
	For $k = 1 To $aDrives[0]
		$aDrives[$k] = StringUpper($aDrives[$k])
		$aDrives[$k] &= " [" & $aMediaTypes[_WinAPI_GetCDType($aDrives[$k])] & ", " & DriveGetLabel($aDrives[$k]) & ", " & Round(DriveSpaceTotal($aDrives[$k]), 2) & " MB]"
	Next
	Return _ArrayToString($aDrives, "|", 1)
EndFunc   ;==>GetDrivesInfo

Func CheckCMDLine()
	Local $ps, $pd, $md5, $index, $sText, $exit
	$index = _ArraySearch($CmdLine, "-s")
	If @error Then Return
	$ps = $CmdLine[$index + 1]
	$index = _ArraySearch($CmdLine, "-d")
	If @error Then Return
	$md5 = _ArraySearch($CmdLine, "-md5" )
	$exit = _ArraySearch($CmdLine, "-exit" )
	$pd = $CmdLine[$index + 1]
	If StringRight($pd, 4) <> ".iso" Then $pd &= ".iso"
	If StringRegExp($ps, "(?i)\A[a-z]:", 0) And _GUICtrlComboBox_FindString($hCombo, $ps) > -1 And StringRegExp($pd, "((?<!.)([a-zA-Z]\:\\)(?!\s)(([\w-+.]*((?<!\s)(\s{1})(?!\\)|(?<!\\)(\\{1})(?!\s))*)*)(\\?)(?!.))", 0) Then
		_GUICtrlComboBox_GetLBText($hCombo, _GUICtrlComboBox_FindString($hCombo, $ps), $sText)
		GUICtrlSetData($idCombo, $sText)
		GUICtrlSetData($idInput_Filename, $pd)
		If $md5 > -1 Then GUICtrlSetState($idCB_MD5, $GUI_CHECKED)
		If $exit > -1 Then $auto_exit = True
		$ok = 2
		$start_dummy = True
	EndIf
EndFunc   ;==>CheckCMDLine

Func Create_ISO()
	Local $dl, $drvl, $speed
	$drvl = GUICtrlRead($idCombo)
	$dl = StringLeft($drvl, 1) & ":"
	If DriveStatus($dl) = "READY"  And ISO9660_Check($dl) Then
		AdlibUnRegister("Chk_Drive_Status")
		$abort = False
		$started = True
		GUICtrlSetState($idButton_Browse, $GUI_DISABLE)
		GUICtrlSetState($idCB_MD5, $GUI_DISABLE)
		GUICtrlSetState($idCombo, $GUI_DISABLE)
		GUICtrlSetState($idButton_Create, $GUI_HIDE)
		GUICtrlSetState($idButton_Abort, $GUI_SHOW)
		ControlFocus($hGUI, "", $idButton_Abort)
		$mo = MouseGetCursor()
		GUISetCursor(15, 1, $hGUI)
		$drv = StringLeft($drvl, 1)
		$aResult = MemoryDllCall($cd2iso_DLL, "int:cdecl", "cd2iso_main_init", "str", $drv, "str", $fn)
		Opt("GUIOnEventMode", 1)
		GUICtrlSetOnEvent($idButton_Abort, "Abort_Ctrl")
		AdlibRegister("Progress", $perf)
		$t = TimerInit()
		$err = TimerInit()
		For $i = 17 To $aResult[0]
			$po = Ceiling(($i - 17) / $aResult[0] * 100)
			MemoryDllCall($cd2iso_DLL, "int:cdecl", "CopySector")
			If TimerDiff($t) > $dt Then $abort = True
			If $abort Then ExitLoop
		Next
		MemoryDllCall($cd2iso_DLL, "none:cdecl", "Cleanup")
		AdlibUnRegister("Progress")
		Opt("GUIOnEventMode", 0)
		GUISetCursor($mo)
		If ProcessExists($pid) Then ProcessClose($pid)
		AdlibRegister("Chk_Drive_Status", 2000)
		GUISetState(@SW_DISABLE, $hGUI)
		If $abort Then
			$c = MsgBox(48 + 4, "Information", "Process aborted!" & @CRLF & @CRLF & _
					"Delete incomplete iso file?", 0, $hGUI)
			If $c = 6 Then
				If FileDelete($fn) Then
					MsgBox(64, "Information", $fn & " has been properly deleted!", 10, $hGUI)
				Else
					MsgBox(16, "Error", "Unable to delete " & $fn, 30, $hGUI)
				EndIf
			EndIf
		Else
			If TimerDiff($err) < 1000 Then
				FileDelete($fn)
				MsgBox(16, "Error", "An unexpected error has occured." & @CRLF & @CRLF & "Currently only ISO 9660 default CD/DVD format is supported :-(", 30, $hGUI)
			Else
				If Not $auto_exit Then
					$speed = Round((FileGetSize($fn) / 1024^2) / $sek, 2) ;mb/s
					MsgBox(64, "Information", "ISO file has been created successfully in " & $td & " (" & $speed & " mb/s)", 30, $hGUI)
				EndIf
				If BitAND(GUICtrlRead($idCB_MD5), $GUI_CHECKED) Then Create_MD5($fn)
			EndIf
		EndIf
		$started = False
		GUISetState(@SW_ENABLE, $hGUI)
		GUICtrlSetState($idButton_Browse, $GUI_ENABLE)
		GUICtrlSetState($idCB_MD5, $GUI_ENABLE)
		GUICtrlSetState($idCombo, $GUI_ENABLE)
		GUICtrlSetState($idButton_Create, $GUI_SHOW)
		GUICtrlSetState($idButton_Abort, $GUI_HIDE)
		GUICtrlSetData($idProgressbar, 0)
		WinSetTitle($hGUI, "", $title)
	Else
		GUISetState(@SW_DISABLE, $hGUI)
		MsgBox(16, "Error", "An error has occured." & @CRLF & @CRLF & _
										   "Maybe no media is inserted to the drive or not a ISO9660 CD/DVD with 2048 bytes/sector !?!", 30, $hGUI)
		GUISetState(@SW_ENABLE, $hGUI)
	EndIf
	If $auto_exit Then _Exit()
EndFunc   ;==>Create_ISO

Func Progress()
	$sek = Int(TimerDiff($t) / 1000)
	$td = Sec_2_Time_Format(Int(TimerDiff($t) / 1000))
	WinSetTitle($hGUI, "", $title & "  -  Created: " & $po & " % / Elapsed: " & $td)
	GUICtrlSetData($idProgressbar, $po)
EndFunc

Func ISO9660_Check($drv)
	Local Const $sector = 2048
	Local $hFile = FileOpen("\\.\" & $drv, 16)
	If @error Then Return SetError(1, 0, 0)
	Local $p = FileSetPos($hFile, 0x8000, $FILE_BEGIN)
	Local $bytes = FileRead($hFile, 0x0808)
	FileClose($hFile)
	If $bytes = "" Then Return SetError(2, 0, 0)
	Local $id1 =  BinaryToString(("0x" & StringMid($bytes, 3 + 2 * 1, 10))) ;get the ISO 9660 id -> CD001 (0x4344303031)
	If $id1 <> "CD001" Then Return SetError(3, 0, 0)
	Local $id2 =  BinaryToString(("0x" & StringMid($bytes, 3 + 2 * 0x0801, 10))) ;get the ISO 9660 id -> CD001 (0x4344303031) from EL TORITO SPECIFICATION
	If $id2<> "CD001" Then Return SetError(4, 0, 0)
	Local $blocks = "0x" & StringMid($bytes, 3 + 2 * 0x54, 8) ;get block size
	Local $logical_block_size = "0x" & StringMid($bytes, 3 + 2 * 0x82, 4) ;logical block size, default is 2048 or 0x0800
	If $logical_block_size <> 0x0800 Then Return SetError(5, 0, 0)
;~ 	Local $dir_rec = "0x" & StringMid($bytes, 3 + 2 * 0x9C, 6) ;24 bytes for the directory record
	Local $diff = DriveSpaceTotal($drv) * 1024^2 - ($blocks * $sector) ;if the CD/DVD is a standard ISO 9660 media then the difference must be zero
	If $diff Then Return SetError(6, 0, 0)
	Return 1
EndFunc   ;==>ISO9660_Check

Func Abort_Ctrl()
	$abort = True
EndFunc   ;==>Abort_Ctrl

Func Create_MD5($file)
	GUISetState(@SW_DISABLE, $hGUI)
	Local $aWinPos = WinGetPos($hGUI)
	Local Const $sw = 260
	Local Const $sh = 50
	Local Const $x = $aWinPos[0] + $aWinPos[2] / 2 - $sw / 2
	Local Const $y = $aWinPos[1] + $aWinPos[3] / 2 - $sh / 2
	Local Const $txt = "Creating MD5 checksum "
	Local Const $hSplash = SplashTextOn("MD5 Creation", $txt, $sw, $sh, $x, $y, 5, "Times New Roman", 16, 400)
	TrayTip("MD5 Checksum", "Started with creation of MD5 checksum...", 3, 1)
	Local $i, $j = 0
	Local $t = TimerInit()
	Local $BufferSize = 0x100000
	Local $State = _MD5Init()
	Local $hFile = FileOpen($file, 16)
	For $i = 1 To Ceiling(FileGetSize($file) / $BufferSize)
		_MD5Input_Thread($State, FileRead($hFile, $BufferSize))
		If TimerDiff($t) > 500 Then
			ControlSetText($hSplash, "Creating MD5 checksum...", "Static1", $txt & _StringRepeat(".", Mod($j, 4)))
			$t = TimerInit()
			$j += 1
		EndIf
	Next
	FileClose($hFile)
	Local $Hash = StringTrimLeft(_MD5Result($State), 2)
	Local $fname = " *" & StringRegExpReplace($file, ".*\\(.*)", "$1")
	Local $w = "# Generated on " & _Now() & @CRLF & @CRLF & $Hash & $fname
	$hFile = FileOpen($file & ".md5", 2)
	FileWrite($hFile, $w)
	FileClose($hFile)
	SplashOff()
	TrayTip("MD5 Checksum", "MD5 checksum creation has been finished", 2, 1)
	GUISetState(@SW_ENABLE, $hGUI)
	If Not $auto_exit Then MsgBox(64, "Information", "MD5 checksum creation has been finished", 10, $hGUI)
EndFunc   ;==>Create_MD5

Func Sec_2_Time_Format($time)
	Local $sec = Mod($time, 60)
	Local $min = Mod(Int($time / 60), 60)
	Local $hr = Int($time / 60 ^ 2)
	Return StringFormat("%02i:%02i:%02i", $hr, $min, $sec)
EndFunc   ;==>Sec_2_Time_Format

Func _WinAPI_CreateBitmapFromIcon($file, $iIndex = 0, $iW = 16, $iH = 16)
	If FileExists($file) Then
		Local $aRet, $hIcon, $hBitmap
		Local $hDC, $hBackDC, $hBackObj

		$aRet = DllCall("shell32", "long", "ExtractAssociatedIcon", "int", 0, "str", $file, "word*", $iIndex)
		If @error Then Return SetError(@error, @extended, 0)
		$hIcon = $aRet[0]

		$hDC = _WinAPI_GetDC(0)
		$hBackDC = _WinAPI_CreateCompatibleDC($hDC)
		$hBitmap = _WinAPI_CreateSolidBitmap(0, _WinAPI_GetSysColor($COLOR_MENU), $iW, $iH)
		$hBackObj = _WinAPI_SelectObject($hBackDC, $hBitmap)
		_WinAPI_DrawIconEx($hBackDC, 0, 0, $hIcon, $iW, $iH, 0, 0, 3)
		_WinAPI_DestroyIcon($hIcon)

		_WinAPI_SelectObject($hBackDC, $hBackObj)
		_WinAPI_ReleaseDC(0, $hDC)
		_WinAPI_DeleteDC($hBackDC)
		Return $hBitmap
	Else
		Return SetError(1, 0, 0)
	EndIf
EndFunc   ;==>_WinAPI_CreateBitmapFromIcon

Func Change_Background_Pic($new_pic)
	Local Const $hImage = _GDIPlus_ImageLoadFromFile($new_pic)
	If Not $hImage Then Return SetError(1, 0, 0)
	Local $aResult = DllCall($ghGDIPDll, "uint", "GdipCreateBitmapFromScan0", "int", $w, "int", $h, "int", 0, "int", 0x0026200A, "ptr", 0, "int*", 0)
	Local Const $hBmp = $aResult[6]
	Local Const $hCtx = _GDIPlus_ImageGetGraphicsContext($hBmp)
	DllCall($ghGDIPDll, "uint", "GdipSetInterpolationMode", "handle", $hCtx, "int", 7)
	_GDIPlus_GraphicsDrawImageRect($hCtx, $hImage, 0, 0, $w, $h)
	Local Const $hHBMP = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBmp)
	_WinAPI_DeleteObject(GUICtrlSendMsg($idPic, 0x0172, 0, $hHBMP))
	_WinAPI_DeleteObject($hHBMP)
	_GDIPlus_ImageDispose($hImage)
	_GDIPlus_BitmapDispose($hBmp)
	_GDIPlus_GraphicsDispose($hCtx)
	_WinAPI_RedrawWindow($hGUI)
	Return 1
EndFunc   ;==>Change_Background_Pic

Func _Exit()
	_WinAPI_DeleteObject($hBmp_About)
	_WinAPI_DeleteObject($hBmp_ChangeBG)
	_WinAPI_DeleteObject($hBmp_EjectMedia)
	_WinAPI_DeleteObject($hBmp_LoadMedia)
	GUISetCursor($mco, 1, $hGUI)
	AdlibUnRegister("Chk_Drive_Status")
	GUIRegisterMsg(0x0111, "")
	GUIRegisterMsg(0x0112, "")
	GUIRegisterMsg(0x0133, "")
	_WinAPI_DeleteObject($hBitmap)
	DllCall("Gdi32.dll", "BOOL", "DeleteObject", "Handle", $hBrush)
	MemoryDllClose($cd2iso_DLL)
	MemoryDllExit()
	If Not $auto_exit Then _WinAPI_AnimateWindow($hGUI, BitOR($AW_BLEND, $AW_HIDE), 750)
	GUIDelete($hGUI)
	_GDIPlus_Shutdown()
	Exit
EndFunc   ;==>_Exit

;======================================================================================
; Function Name:		Load_BMP_From_Mem
; Description:			Loads an image which is saved as a binary string and converts it to a bitmap or hbitmap
;
; Parameters:    		$bImage:		the binary string which contains any valid image which is supported by GDI+
; Optional:  				$hHBITMAP:		if false a bitmap will be created, if true a hbitmap will be created
;
; Remark:					hbitmap format is used generally for GUI internal images, $bitmap is more a GDI+ image format
;
; Requirement(s):		GDIPlus.au3, Memory.au3
; Return Value(s):	Success: handle to bitmap or hbitmap, Error: 0
; Error codes:			1: $bImage is not a binary string
;
; Author(s):				UEZ
; Additional Code:	thanks to progandy for the MemGlobalAlloc and tVARIANT lines
; Version:					v0.95 Build 2011-06-14 Beta
;=======================================================================================
Func Load_BMP_From_Mem($bImage, $hHBITMAP = False)
	If Not IsBinary($bImage) Then Return SetError(1, 0, 0)
	Local $declared = True
	If Not $ghGDIPDll Then
		_GDIPlus_Startup()
		$declared = False
	EndIf
	Local Const $memBitmap = Binary($bImage) ;load image  saved in variable (memory) and convert it to binary
	Local Const $len = BinaryLen($memBitmap) ;get length of image
	Local Const $hData = _MemGlobalAlloc($len, $GMEM_MOVEABLE) ;allocates movable memory  ($GMEM_MOVEABLE = 0x0002)
	Local Const $pData = _MemGlobalLock($hData) ;translate the handle into a pointer
	Local $tMem = DllStructCreate("byte[" & $len & "]", $pData) ;create struct
	DllStructSetData($tMem, 1, $memBitmap) ;fill struct with image data
	_MemGlobalUnlock($hData) ;decrements the lock count  associated with a memory object that was allocated with GMEM_MOVEABLE
	Local $hStream = DllCall("ole32.dll", "int", "CreateStreamOnHGlobal", "handle", $pData, "int", True, "ptr*", 0)
	$hStream = $hStream[3]
	Local $hBitmap = DllCall($ghGDIPDll, "uint", "GdipCreateBitmapFromStream", "ptr", $hStream, "int*", 0) ;Creates a Bitmap object based on an IStream COM interface
	$hBitmap = $hBitmap[2]
	Local Const $tVARIANT = DllStructCreate("word vt;word r1;word r2;word r3;ptr data; ptr")
	DllCall("oleaut32.dll", "long", "DispCallFunc", "ptr", $hStream, "dword", 8 + 8 * @AutoItX64, _
			"dword", 4, "dword", 23, "dword", 0, "ptr", 0, "ptr", 0, "ptr", DllStructGetPtr($tVARIANT)) ;release memory from $hStream to avoid memory leak
	$tMem = 0
	If $hHBITMAP Then
		Local Const $hHBmp = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBitmap)
		_GDIPlus_BitmapDispose($hBitmap)
		If Not $declared Then _GDIPlus_Shutdown()
		Return $hHBmp
	EndIf
	If Not $declared Then _GDIPlus_Shutdown()
	Return $hBitmap
EndFunc   ;==>Load_BMP_From_Mem

#region Windows Message Code Section
Func WM_COMMAND($hWnd, $Msg, $wParam, $lParam)
	Local $hWndFrom, $iIDFrom, $iCode, $d
	$hWndFrom = $lParam
	$iIDFrom = BitAND($wParam, 0xFFFF)
	$iCode = BitShift($wParam, 16)
	Switch $hWndFrom
		Case $hCombo
			Switch $iCode
				Case $CBN_SELENDOK, $CBN_CLOSEUP
					ControlFocus($hGUI, '', $idButton_Browse)
					$combo_min = True
				Case $CBN_DROPDOWN
					$combo_min = False
			EndSwitch
	EndSwitch

	Switch $wParam
		Case $id_EjectMedia
			$d = StringLeft(GUICtrlRead($idCombo), 1) & ":"
			If Not _WinAPI_IsDoorOpen($d) Then _WinAPI_EjectMedia($d)
		Case $id_LoadMedia
			$d = StringLeft(GUICtrlRead($idCombo), 1) & ":"
			If _WinAPI_IsDoorOpen($d) Then _WinAPI_LoadMedia($d)
	EndSwitch

	Switch $iIDFrom
		Case $idInput_Filename
			DllCall('user32.dll', 'int', 'HideCaret', 'hwnd', $hWnd)
			DllCall('user32.dll', 'int', 'DestroyCaret')
			If Not $fs Then
				If StringLen(GUICtrlRead($idInput_Filename)) < 2 Then GUICtrlSetData($idInput_Filename, "")
			Else
				GUICtrlSetData($idInput_Filename, $saveas)
			EndIf
	EndSwitch

	Return "GUI_RUNDEFMSG"
EndFunc   ;==>WM_COMMAND

Func WM_CONTEXTMENU($hWnd, $Msg, $wParam, $lParam)
	#forceref $hWnd, $Msg, $wParam, $lParam
	Local $mi = GUIGetCursorInfo()
	If IsArray($mi) Then
		If $mi[4] = $idCombo And Not $started Then
			_GUICtrlMenu_TrackPopupMenu($hQMenu, $hWnd)
			Return True
		EndIf
	EndIf
	Return "GUI_RUNDEFMSG"
EndFunc   ;==>WM_CONTEXTMENU

Func WM_SYSCOMMAND($hGUI, $Msg, $wParam, $lParam)
	#forceref $hGUI, $Msg, $lParam
	Switch BitAND($wParam, 0xFFFF)
		Case $idAbout
			GUISetState(@SW_DISABLE, $hGUI)
			MsgBox(64, "About", $title & $build & @CRLF & @CRLF & _
					"Credits:" & @CRLF & _
					"GUI coded by UEZ using AutoIt ;-)" & @CRLF & _
					"MD5 checksum code by Ward" & @CRLF & _
					"WinAPIEx by Yashied" & @CRLF & _
					"Thanks to smashly for pointing me to right direction ;-)" & @CRLF & _
					"And smartee for his efforts on this little project :-)", 90, $hGUI)
			GUISetState(@SW_ENABLE, $hGUI)

		Case $idChangeBGPic
			Local $chk_bg = MsgBox(3 + 48 + 4096, "Setting", 	"Change default background picture?" & @CRLF & @CRLF & _
																									"Yes = Browse and select a new picture" & @CRLF & _
																									"No = Reset to default picture" & @CRLF & _
																									"Cancel = Cancel this operation", 0, $hGUI)
			Switch $chk_bg
				Case 6
					Local  Const $new_pic = FileOpenDialog("Select an image (best dimension: 615x157)", "", "Images (*.jpg;*png;*.bmp;*.gif)", 3, "", $hGUI)
					If @error Then Return 0
					Local $Result = Change_Background_Pic($new_pic)
					If $Result Then IniWrite($ini_file, "Settings", "Background_Pic", $new_pic)
					ControlFocus($hGUI, "", $idButton_Browse)
					Return 1
				Case 7
					Local Const $hHBITMAP = Load_BMP_From_Mem(BackgroundPic(), True)
					_WinAPI_DeleteObject(GUICtrlSendMsg($idPic, 0x0172, 0, $hHBITMAP)) ;$STM_SETIMAGE = 0x0172, $IMAGE_BITMAP = 0
					_WinAPI_DeleteObject($hHBITMAP)
					_WinAPI_RedrawWindow($hGUI)
					IniWrite($ini_file, "Settings", "Background_Pic", "0")
			EndSwitch
	EndSwitch
	Return "GUI_RUNDEFMSG"
EndFunc   ;==>WM_SYSCOMMAND

Func WM_CTLCOLOREDIT($hGUI, $Msg, $wParam, $lParam)
	#forceref $hGUI, $Msg
	If $lParam = $hInput_Filename Then
		If Not $started Then GUISetCursor(2, 1, $hGUI)
		DllCall("Gdi32.dll", "UINT", "SetTextColor", "Handle", $wParam, "UInt", $idInput_Filename_Color)
		DllCall("Gdi32.dll", "Int", "SetBkMode", "Handle", $wParam, "Int", 1)
		Return $hBrush
	EndIf
	Return "GUI_RUNDEFMSG"
EndFunc   ;==>WM_CTLCOLOREDIT
#endregion

#region WinAPIEx functions
; #FUNCTION# ====================================================================================================================
; Name...........: _WinAPI_IsDoorOpen
; Description....: Checks if a CD (DVD) tray is open.
; Syntax.........: _WinAPI_IsDoorOpen ( $sDrive )
; Parameters.....: $sDrive - The drive letter of the CD tray to check, in the format D:, E:, etc.
; Return values..: Success - 1 - CD (DVD) tray is open.
;                            0 - Otherwise.
;                  Failure - 0 and sets the @error flag to non-zero.
; Author.........: G.Sandler (CreatoR)
; Modified.......: Yashied
; Remarks........: None
; Related........:
; Link...........: @@MsdnLink@@ IOCTL_SCSI_PASS_THROUGH
; Example........: Yes
; ===============================================================================================================================
Func _WinAPI_IsDoorOpen($sDrive)
	If @AutoItX64 Then Return SetError(1, 0, 0)
	Local $hFile = _WinAPI_CreateFileEx('\\.\' & $sDrive, 3, 0xC0000000, 0x03)
	If Not $hFile Then Return SetError(1, 0, 0)
	Local $tSPT = DllStructCreate('ushort Length;byte ScsiStatus;byte PathId;byte TargetId;byte Lun;byte CdbLength;byte SenseInfoLength;byte DataIn;byte Alignment[3];ulong DataTransferLength;ulong TimeOutValue;ulong_ptr DataBufferOffset;ulong SenseInfoOffset;byte Cdb[16];byte Hdr[8]')
	Local $tCDB = DllStructCreate('byte;byte;byte[6];byte[2];byte;byte;byte[4]', DllStructGetPtr($tSPT, 'Cdb'))
	Local $tHDR = DllStructCreate('byte;byte;byte[3];byte;byte[2]', DllStructGetPtr($tSPT, 'Hdr'))
	Local $Size = DllStructGetSize($tSPT) - 8
	DllStructSetData($tSPT, 'Length', $Size)
	DllStructSetData($tSPT, 'ScsiStatus', 0)
	DllStructSetData($tSPT, 'PathId', 0)
	DllStructSetData($tSPT, 'TargetId', 0)
	DllStructSetData($tSPT, 'Lun', 0)
	DllStructSetData($tSPT, 'CdbLength', 12)
	DllStructSetData($tSPT, 'SenseInfoLength', 0)
	DllStructSetData($tSPT, 'DataIn', 1)
	DllStructSetData($tSPT, 'DataTransferLength', 8)
	DllStructSetData($tSPT, 'TimeOutValue', 86400)
	DllStructSetData($tSPT, 'DataBufferOffset', $Size)
	DllStructSetData($tSPT, 'SenseInfoOffset', 0)
	DllStructSetData($tCDB, 1, 0xBD)
	DllStructSetData($tCDB, 2, 0)
	DllStructSetData($tCDB, 4, 0, 1)
	DllStructSetData($tCDB, 4, 8, 2)
	DllStructSetData($tCDB, 5, 0)
	DllStructSetData($tCDB, 6, 0)
	Local $Ret = DllCall('kernel32.dll', 'int', 'DeviceIoControl', 'ptr', $hFile, 'dword', $IOCTL_SCSI_PASS_THROUGH, 'ptr', DllStructGetPtr($tSPT), 'dword', $Size, 'ptr', DllStructGetPtr($tSPT), 'dword', DllStructGetSize($tSPT), 'dword*', 0, 'ptr', 0)
	If (@error) Or (Not $Ret[0]) Then $Ret = 0
	_WinAPI_CloseHandle($hFile)
	If Not IsArray($Ret) Then Return SetError(2, 0, 0)
	Return Number(BitAND(DllStructGetData($tHDR, 2), 0x10) = 0x10)
EndFunc   ;==>_WinAPI_IsDoorOpen

; #FUNCTION# ====================================================================================================================
; Name...........: _WinAPI_LoadMedia
; Description....: Loads media into a device.
; Syntax.........: _WinAPI_LoadMedia ( $sDrive )
; Parameters.....: $sDrive - The drive letter of the CD tray to load, in the format D:, E:, etc.
; Return values..: Success - 1.
;                  Failure - 0 and sets the @error flag to non-zero.
; Author.........: Yashied
; Modified.......:
; Remarks........: None
; Related........:
; Link...........: @@MsdnLink@@ IOCTL_STORAGE_LOAD_MEDIA
; Example........: Yes
; ===============================================================================================================================
Func _WinAPI_LoadMedia($sDrive)
	Local $hFile = _WinAPI_CreateFileEx('\\.\' & $sDrive, 3, 0x80000000, 0x01)
	If Not $hFile Then Return SetError(1, 0, 0)
	Local $Ret = DllCall('kernel32.dll', 'int', 'DeviceIoControl', 'ptr', $hFile, 'dword', $IOCTL_STORAGE_LOAD_MEDIA, 'ptr', 0, 'dword', 0, 'ptr', 0, 'dword', 0, 'dword*', 0, 'ptr', 0)
	If (@error) Or (Not $Ret[0]) Then $Ret = 0
	_WinAPI_CloseHandle($hFile)
	If Not IsArray($Ret) Then Return SetError(2, 0, 0)
	Return $Ret[0]
EndFunc   ;==>_WinAPI_LoadMedia

; #FUNCTION# ====================================================================================================================
; Name...........: _WinAPI_EjectMedia
; Description....: Ejects media from a device.
; Syntax.........: _WinAPI_EjectMedia ( $sDrive )
; Parameters.....: $sDrive - The drive letter of the CD tray to eject, in the format D:, E:, etc.
; Return values..: Success - 1.
;                  Failure - 0 and sets the @error flag to non-zero.
; Author.........: Yashied
; Modified.......:
; Remarks........: None
; Related........:
; Link...........: @@MsdnLink@@ IOCTL_STORAGE_EJECT_MEDIA
; Example........: Yes
; ===============================================================================================================================
Func _WinAPI_EjectMedia($sDrive)
	Local $hFile = _WinAPI_CreateFileEx('\\.\' & $sDrive, 3, 0x80000000, 0x01)
	If Not $hFile Then Return SetError(1, 0, 0)
	Local $Ret = DllCall('kernel32.dll', 'int', 'DeviceIoControl', 'ptr', $hFile, 'dword', $IOCTL_STORAGE_EJECT_MEDIA, 'ptr', 0, 'dword', 0, 'ptr', 0, 'dword', 0, 'dword*', 0, 'ptr', 0)
	If (@error) Or (Not $Ret[0]) Then $Ret = 0
	_WinAPI_CloseHandle($hFile)
	If Not IsArray($Ret) Then Return SetError(2, 0, 0)
	Return 1
EndFunc   ;==>_WinAPI_EjectMedia

; #FUNCTION# ====================================================================================================================
; Name...........: _WinAPI_GetCDType
; Description....: Retrieves a type of the media which is loaded into a specified CD-ROM device.
; Syntax.........: _WinAPI_GetCDType ( $sDrive )
; Parameters.....: $sDrive - The drive letter of the CD tray to retrieve information, in the format D:, E:, etc.
; Return values..: Success - The type of the media, it must be one of the following values.
;
;                            0x0000 - No media
;                            0x0008 - CD-ROM
;                            0x0009 - CD-R
;                            0x000A - CD-RW
;                            0x0010 - DVD-ROM
;                            0x0011 - DVD-R Sequential Recording
;                            0x0012 - DVD-RAM
;                            0x0013 - DVD-RW Restricted Overwrite
;                            0x0014 - DVD-RW Sequential Recording
;                            0x0015 - DVD-R Dual Layer
;                            0x0016 - DVD-R Dual Layer Jump Recording
;                            0x0017 - DVD-RW Dual Layer
;                            0x0018 - DVD-Download Disc Recording
;                            0x001A - DVD+RW
;                            0x001B - DVD+R
;                            0x0040 - BD-ROM
;                            0x0041 - BD-R Sequential Recording Mode (SRM)
;                            0x0042 - BD-R Random Recording Mode (RRM)
;                            0x0043 - BD-RE
;                            0x0050 - HD DVD-ROM
;                            0x0051 - HD DVD-R
;                            0x0052 - HD DVD-RAM
;                            0x0053 - HD DVD-RW
;                            0x0058 - HD DVD-R Dual Layer
;                            0x005A - HD DVD-RW Dual Layer
;                            0xFFFF - Unknown
;
;                  Failure - 0 and sets the @error flag to non-zero.
; Author.........: Yashied
; Modified.......:
; Remarks........: None
; Related........:
; Link...........: @@MsdnLink@@ IOCTL_SCSI_PASS_THROUGH
; Example........: Yes
; ===============================================================================================================================
Func _WinAPI_GetCDType($sDrive)
	If @AutoItX64 Then Return SetError(1, 0, 0)
	Local $hFile = _WinAPI_CreateFileEx('\\.\' & $sDrive, 3, 0xC0000000, 0x03)
	If Not $hFile Then Return SetError(1, 0, 0)
	Local $tSPT = DllStructCreate('ushort Length;byte ScsiStatus;byte PathId;byte TargetId;byte Lun;byte CdbLength;byte SenseInfoLength;byte DataIn;byte Alignment[3];ulong DataTransferLength;ulong TimeOutValue;ulong_ptr DataBufferOffset;ulong SenseInfoOffset;byte Cdb[16];byte Hdr[8]')
	Local $tCDB = DllStructCreate('byte;byte;byte[2];byte[3];byte[2];byte;byte[2];byte[4]', DllStructGetPtr($tSPT, 'Cdb'))
	Local $tHDR = DllStructCreate('byte[4];byte;byte;byte[2]', DllStructGetPtr($tSPT, 'Hdr'))
	Local $Size = DllStructGetSize($tSPT) - 8
	DllStructSetData($tSPT, 'Length', $Size)
	DllStructSetData($tSPT, 'ScsiStatus', 0)
	DllStructSetData($tSPT, 'PathId', 0)
	DllStructSetData($tSPT, 'TargetId', 0)
	DllStructSetData($tSPT, 'Lun', 0)
	DllStructSetData($tSPT, 'CdbLength', 12)
	DllStructSetData($tSPT, 'SenseInfoLength', 0)
	DllStructSetData($tSPT, 'DataIn', 1)
	DllStructSetData($tSPT, 'DataTransferLength', 8)
	DllStructSetData($tSPT, 'TimeOutValue', 86400)
	DllStructSetData($tSPT, 'DataBufferOffset', $Size)
	DllStructSetData($tSPT, 'SenseInfoOffset', 0)
	DllStructSetData($tCDB, 1, 0x46)
	DllStructSetData($tCDB, 2, 0)
	DllStructSetData($tCDB, 3, 0, 1)
	DllStructSetData($tCDB, 3, 0, 2)
	DllStructSetData($tCDB, 5, 0, 1)
	DllStructSetData($tCDB, 5, 8, 2)
	DllStructSetData($tCDB, 6, 0)
	DllStructSetData($tCDB, 7, 0, 1)
	DllStructSetData($tCDB, 7, 0, 2)
	Local $Ret = DllCall('kernel32.dll', 'int', 'DeviceIoControl', 'ptr', $hFile, 'dword', $IOCTL_SCSI_PASS_THROUGH, 'ptr', DllStructGetPtr($tSPT), 'dword', $Size, 'ptr', DllStructGetPtr($tSPT), 'dword', DllStructGetSize($tSPT), 'dword*', 0, 'ptr', 0)
	If (@error) Or (Not $Ret[0]) Then $Ret = 0
	_WinAPI_CloseHandle($hFile)
	If Not IsArray($Ret) Then Return SetError(2, 0, 0)
	Return BitOR(BitShift(DllStructGetData($tHDR, 4, 1), -8), DllStructGetData($tHDR, 4, 2))
EndFunc   ;==>_WinAPI_GetCDType

; #FUNCTION# ====================================================================================================================
; Name...........: _WinAPI_CreateFileEx
; Description....: Creates or opens a file or I/O device.
; Syntax.........: _WinAPI_CreateFileEx ( $sFile, $iCreation, $iAccess, $iShare [, $iFlagsAndAttributes [, $tSecurity [, $hTemplate]]] )
; Parameters.....: $sFile               - The name of the file or device to be created or opened.
;                  $iCreation           - The action to take on a file or device that exists or does not exist. This parameter must be
;                                         one of the following values, which cannot be combined.
;
;                                         $CREATE_NEW
;                                         $CREATE_ALWAYS
;                                         $OPEN_EXISTING
;                                         $OPEN_ALWAYS
;                                         $TRUNCATE_EXISTING
;
;                  $iAccess             - The requested access to the file or device, which can be summarized as read, write, both
;                                         or neither (zero).
;
;                                         $GENERIC_READ
;                                         $GENERIC_WRITE
;
;                                         (See MSDN for more information)
;
;                  $iShare              - The requested sharing mode of the file or device, which can be read, write, both,
;                                         delete, all of these, or none. If this parameter is 0 and _WinAPI_CreateFileEx() succeeds,
;                                         the file or device cannot be shared and cannot be opened again until the handle to
;                                         the file or device is closed.
;
;                                         $FILE_SHARE_READ
;                                         $FILE_SHARE_WRITE
;                                         $FILE_SHARE_DELETE
;
;                  $iFlagsAndAttributes - The file or device attributes and flags. This parameter can be one or more of the
;                                         following values.
;
;                                         $FILE_ATTRIBUTE_READONLY
;                                         $FILE_ATTRIBUTE_HIDDEN
;                                         $FILE_ATTRIBUTE_SYSTEM
;                                         $FILE_ATTRIBUTE_DIRECTORY
;                                         $FILE_ATTRIBUTE_ARCHIVE
;                                         $FILE_ATTRIBUTE_DEVICE
;                                         $FILE_ATTRIBUTE_NORMAL
;                                         $FILE_ATTRIBUTE_TEMPORARY
;                                         $FILE_ATTRIBUTE_SPARSE_FILE
;                                         $FILE_ATTRIBUTE_REPARSE_POINT
;                                         $FILE_ATTRIBUTE_COMPRESSED
;                                         $FILE_ATTRIBUTE_OFFLINE
;                                         $FILE_ATTRIBUTE_NOT_CONTENT_INDEXED
;                                         $FILE_ATTRIBUTE_ENCRYPTED
;
;                                         $FILE_FLAG_BACKUP_SEMANTICS
;                                         $FILE_FLAG_DELETE_ON_CLOSE
;                                         $FILE_FLAG_NO_BUFFERING
;                                         $FILE_FLAG_OPEN_NO_RECALL
;                                         $FILE_FLAG_OPEN_REPARSE_POINT
;                                         $FILE_FLAG_OVERLAPPED
;                                         $FILE_FLAG_POSIX_SEMANTICS
;                                         $FILE_FLAG_RANDOM_ACCESS
;                                         $FILE_FLAG_SEQUENTIAL_SCAN
;                                         $FILE_FLAG_WRITE_THROUGH
;
;                                         $SECURITY_ANONYMOUS
;                                         $SECURITY_CONTEXT_TRACKING
;                                         $SECURITY_DELEGATION
;                                         $SECURITY_EFFECTIVE_ONLY
;                                         $SECURITY_IDENTIFICATION
;                                         $SECURITY_IMPERSONATION
;
;                  $tSecurity           - $tagSECURITY_ATTRIBUTES structure that contains two separate but related data members:
;                                         an optional security descriptor, and a Boolean value that determines whether the returned
;                                         handle can be inherited by child processes. If this parameter is 0, the handle cannot
;                                         be inherited by any child processes the application may create and the file or device
;                                         associated with the returned handle gets a default security descriptor.
;                  $hTemplate           - Handle to a template file with the $GENERIC_READ access right. The template file supplies
;                                         file attributes and extended attributes for the file that is being created.
; Return values..: Success              - Handle to the specified file, device, named pipe, or mail slot.
;                  Failure              - 0 and sets the @error flag to non-zero.
; Author.........: Yashied
; Modified.......:
; Remarks........: When an application is finished using the object handle returned by this function, use the _WinAPI_CloseHandle()
;                  function to close the handle. This not only frees up system resources, but can have wider influence on things
;                  like sharing the file or device and committing data to disk.
; Related........:
; Link...........: @@MsdnLink@@ CreateFile
; Example........: Yes
; ===============================================================================================================================
Func _WinAPI_CreateFileEx($sFile, $iCreation, $iAccess, $iShare, $iFlagsAndAttributes = 0, $tSecurity = 0, $hTemplate = 0)
	Local $Ret = DllCall('kernel32.dll', 'ptr', 'CreateFileW', 'wstr', $sFile, 'dword', $iAccess, 'dword', $iShare, 'ptr', DllStructGetPtr($tSecurity), 'dword', $iCreation, 'dword', $iFlagsAndAttributes, 'ptr', $hTemplate)
	If (@error) Or ($Ret[0] = Ptr(-1)) Then Return SetError(1, 0, 0)
	Return $Ret[0]
EndFunc   ;==>_WinAPI_CreateFileEx

; #FUNCTION# ====================================================================================================================
; Name...........: _WinAPI_AnimateWindow
; Description....: Enables you to produce special effects when showing or hiding windows.
; Syntax.........: _WinAPI_AnimateWindow ( $hWnd, $iFlags [, $iDuration] )
; Parameters.....: $hWnd      - Handle to the window to animate.
;                  $iFlags    - The flags that specify the type of animation. This parameter can be one or more of the following
;                               values. Note that, by default, these flags take effect when showing a window. To take effect when
;                               hiding a window, use AW_HIDE and a logical OR operator with the appropriate flags.
;
;                               $AW_SLIDE
;                               $AW_ACTIVATE
;                               $AW_BLEND
;                               $AW_HIDE
;                               $AW_CENTER
;                               $AW_HOR_POSITIVE
;                               $AW_HOR_NEGATIVE
;                               $AW_VER_POSITIVE
;                               $AW_VER_NEGATIVE
;
;                  $iDuration - Specifies how long it takes to play the animation, in milliseconds. Default is 1000.
; Return values..: Success    - 1.
;                  Failure    - 0 and sets the @error flag to non-zero.
; Author.........: Yashied
; Modified.......:
; Remarks........: None
; Related........:
; Link...........: @@MsdnLink@@ AnimateWindow
; Example........: Yes
; ===============================================================================================================================
Func _WinAPI_AnimateWindow($hWnd, $iFlags, $iDuration = 1000)
	Local $Ret = DllCall('user32.dll', 'int', 'AnimateWindow', 'hwnd', $hWnd, 'dword', $iDuration, 'dword', $iFlags)
	If (@error) Or (Not $Ret[0]) Then Return SetError(1, 0, 0)
	Return 1
EndFunc   ;==>_WinAPI_AnimateWindow
#endregion WinAPIEx functions

#region memory DLL call
Func MemoryFuncInit()
	Local $KernelHandle = DllCall($_MDKernel32Dll, "ptr", "LoadLibrary", "str", "kernel32.dll")
	Local $HookPtr = DllCall($_MDKernel32Dll, "ptr", "GetProcAddress", "ptr", $KernelHandle[0], "str", $_MFHookApi)
	$_MFHookPtr = $HookPtr[0]
	$_MFHookBak = DllStructCreate("ubyte[7]")
	DllCall($_MDKernel32Dll, "int", "WriteProcessMemory", "ptr", -1, "ptr", DllStructGetPtr($_MFHookBak), "ptr", $_MFHookPtr, "uint", 7, "uint*", 0)
	DllCall($_MDKernel32Dll, "int", "WriteProcessMemory", "ptr", -1, "ptr", $_MFHookPtr, "byte*", 0xB8, "uint", 1, "uint*", 0)
	DllCall($_MDKernel32Dll, "int", "WriteProcessMemory", "ptr", -1, "ptr", $_MFHookPtr + 5, "ushort*", 0xE0FF, "uint", 2, "uint*", 0)
EndFunc   ;==>MemoryFuncInit

Func MemoryFuncCall($RetType, $Address, $Type1 = "", $Param1 = 0, $Type2 = "", $Param2 = 0, $Type3 = "", $Param3 = 0, $Type4 = "", $Param4 = 0, $Type5 = "", $Param5 = 0, $Type6 = "", $Param6 = 0, $Type7 = "", $Param7 = 0, $Type8 = "", $Param8 = 0, $Type9 = "", $Param9 = 0, $Type10 = "", $Param10 = 0, $Type11 = "", $Param11 = 0, $Type12 = "", $Param12 = 0, $Type13 = "", $Param13 = 0, $Type14 = "", $Param14 = 0, $Type15 = "", $Param15 = 0, $Type16 = "", $Param16 = 0, $Type17 = "", $Param17 = 0, $Type18 = "", $Param18 = 0, $Type19 = "", $Param19 = 0, $Type20 = "", $Param20 = 0)
	If Not IsDllStruct($_MFHookBak) Then MemoryFuncInit()
	MemoryFuncSet($Address)
	Local $Ret
	Switch @NumParams
		Case 2
			$Ret = DllCall($_MDKernel32Dll, $RetType, $_MFHookApi)
		Case 4
			$Ret = DllCall($_MDKernel32Dll, $RetType, $_MFHookApi, $Type1, $Param1)
		Case 6
			$Ret = DllCall($_MDKernel32Dll, $RetType, $_MFHookApi, $Type1, $Param1, $Type2, $Param2)
		Case 8
			$Ret = DllCall($_MDKernel32Dll, $RetType, $_MFHookApi, $Type1, $Param1, $Type2, $Param2, $Type3, $Param3)
		Case 10
			$Ret = DllCall($_MDKernel32Dll, $RetType, $_MFHookApi, $Type1, $Param1, $Type2, $Param2, $Type3, $Param3, $Type4, $Param4)
		Case 12
			$Ret = DllCall($_MDKernel32Dll, $RetType, $_MFHookApi, $Type1, $Param1, $Type2, $Param2, $Type3, $Param3, $Type4, $Param4, $Type5, $Param5)
		Case Else
			Local $DllCallStr = 'DllCall($_MDKernel32Dll, $RetType, $_MFHookApi', $n, $i
			For $i = 4 To @NumParams Step 2
				$n = ($i - 2) / 2
				$DllCallStr &= ', $Type' & $n & ', $Param' & $n
			Next
			$DllCallStr &= ')'
			$Ret = Execute($DllCallStr)
	EndSwitch
	Return SetError(@error, 0, $Ret)
EndFunc   ;==>MemoryFuncCall

Func MemoryFuncSet($Address)
	DllCall($_MDKernel32Dll, "int", "WriteProcessMemory", "ptr", -1, "ptr", $_MFHookPtr + 1, "uint*", $Address, "uint", 4, "uint*", 0)
EndFunc   ;==>MemoryFuncSet

Func MemoryFuncExit()
	DllCall($_MDKernel32Dll, "int", "WriteProcessMemory", "ptr", -1, "ptr", $_MFHookPtr, "ptr", DllStructGetPtr($_MFHookBak), "uint", 7, "uint*", 0)
	$_MFHookBak = 0
EndFunc   ;==>MemoryFuncExit

Func MemoryDllInit()
	If IsDllStruct($_MDCodeBuffer) Then Return

	Local $Opcode = '0xFFFFFFFFFFFFFFFFB800000000FFE0B800000000FFE0B800000000FFE0B800000000FFE0B800000000FFE0B800000000FFE0B800000000FFE0B800000000FFE0B800000000FFE0B800000000FFE0B800000000FFE0B800000000FFE0B800000000FFE0B800000000FFE0B800000000FFE05589E55156578B7D088B750C8B4D10FCF3A45F5E595DC35589E5578B7D088A450C8B4D10F3AA5F5DC359585A5153E8000000005B81EBAC10400089830810400089930C104000E8000000005981E9C4104000518B9108104000E80D0000006B65726E656C33322E646C6C005850FFD2598B910C104000E80A0000006C737472636D70694100595150FFD2898311104000E8000000005981E90E114000518B9108104000E80D0000006B65726E656C33322E646C6C005850FFD2598B910C104000E80D0000005669727475616C416C6C6F6300595150FFD2898318104000E8000000005981E95B114000518B9108104000E80D0000006B65726E656C33322E646C6C005850FFD2598B910C104000E80C0000005669727475616C4672656500595150FFD289831F104000E8000000005981E9A7114000518B9108104000E80D0000006B65726E656C33322E646C6C005850FFD2598B910C104000E80F0000005669727475616C50726F7465637400595150FFD2898326104000E8000000005981E9F6114000518B91'
	$Opcode &= '08104000E80D0000006B65726E656C33322E646C6C005850FFD2598B910C104000E80E00000052746C5A65726F4D656D6F727900595150FFD289832D104000E8000000005981E944124000518B9108104000E80D0000006B65726E656C33322E646C6C005850FFD2598B910C104000E80D0000004C6F61644C6962726172794100595150FFD2898334104000E8000000005981E991124000518B9108104000E80D0000006B65726E656C33322E646C6C005850FFD2598B910C104000E80F00000047657450726F634164647265737300595150FFD289833B104000E8000000005981E9E0124000518B9108104000E80D0000006B65726E656C33322E646C6C005850FFD2598B910C104000E80D00000049734261645265616450747200595150FFD2898342104000E8000000005981E92D134000518B9108104000E80D0000006B65726E656C33322E646C6C005850FFD2598B910C104000E80F00000047657450726F636573734865617000595150FFD2898349104000E8000000005981E97C134000518B9108104000E80D0000006B65726E656C33322E646C6C005850FFD2598B910C104000E80A00000048656170416C6C6F6300595150FFD2898350104000E8000000005981E9C6134000518B9108104000E80D0000006B65726E656C33322E646C6C005850FFD2598B910C104000E809000000486561704672656500595150FFD2898357'
	$Opcode &= '104000E8000000005981E90F144000518B9108104000E80D0000006B65726E656C33322E646C6C005850FFD2598B910C104000E80C000000476C6F62616C416C6C6F6300595150FFD289835E104000E8000000005981E95B144000518B9108104000E80D0000006B65726E656C33322E646C6C005850FFD2598B910C104000E80E000000476C6F62616C5265416C6C6F6300595150FFD289836C104000E8000000005981E9A9144000518B9108104000E80D0000006B65726E656C33322E646C6C005850FFD2598B910C104000E80B000000476C6F62616C4672656500595150FFD2898365104000E8000000005981E9F4144000518B9108104000E80D0000006B65726E656C33322E646C6C005850FFD2598B910C104000E80C000000467265654C69627261727900595150FFD28983731040005B59585150E8BC01000059C35990585A515250E80E0000005A5AC35A585250E8C200000059C35589E583EC28895DF48B45088975F8897DFC8B50048B008955F08B587C31D285DB746D8B48788B5DF001CB8B431885C0745C8B531485D27455C745EC000000008B7B208B75F08B4B2401FE8B7DF001CF83F80076398D7426008DBC27000000008B168B45F001D0894424048B450C890424E839FAFFFF83EC0885C07422FF45EC83C60483C7028B55EC39531877D231D28B5DF489D08B75F88B7DFC89EC5DC30FB70783F8FF7'
	$Opcode &= '4E731D23B431477E28B731CC1E0028B55F001F08B0C1001CAEBD05589E5565383EC108B750885F674788B5E1085DB75788B4E0885C9743C8B560C31DB83FA007E2789F68DBC27000000008B049983F8FF7411890424E811FAFFFF8B4E0883EC048B560C4339DA7FE2890C24E8EDF9FFFF83EC048B06890424E8E0F9FFFF8B460483EC0485C0754CE8B5F9FFFF8974240831F689742404890424E8B1F9FFFF83EC0C8D65F85B5E5DC38B0631DB8B56048B4828895C24048914248D040A31C9894C2408FFD0C746100000000083EC0CE95DFFFFFF890424B90080000031D2894C240889542404E82DF9FFFF83EC0CEB988D7426008DBC27000000005531C089E557565383EC3C8B550866813A4D5A0F85110300008B4A3C01CA813A504500008955E80F85FD020000B8040000008944240CB800200000894424088B4250894424048B4234890424E8C5F8FFFF8945E483EC1085C00F8441050000E8E3F8FFFF89042431D2B91400000089542404BF00100000BE04000000894C2408E8C9F8FFFF8945EC8B5DE483EC0CC7400C00000000C7400800000000895804C7401000000000B8040000008944240C897C24088B7DE88B4750891C2489442404E851F8FFFF83EC10B900100000894C24088974240C8B4754891C2489442404E832F8FFFF8B575483EC10895424088B550889042489542404E87BF8FFFF8B4D088B47548B513C'
	$Opcode &= 'C704244000000029D089442404E844F8FFFF8B5DEC89C783EC088B4D0889038B45E889FB8B505489C68B413C29C283FA077617F7C7040000000F85ED0100008D7426008DBC2700000000FC89D1C1E90289DFF6C202F3A589FB740C0FB70683C30283C602668907F6C20174050FB6068803C745DC000000008B45EC8B55EC8B40048B3A8945C866837F06000FB747148D7407187563E9D90000008B4DE88B593885DB7E45895C2404B900100000BF04000000897C240C894C24088B560C8B45C801D0890424E846F7FFFF89460883EC1089C7895C240831C0893C2489442404E8A5F7FFFF8B5DEC8B3BFF45DC83C6280FB747063B45DC7E728B461085C0749BB900100000BB04000000894C2408895C240C8B4610894424048B560C8B45C801D0890424E8E8F6FFFF89C78B550883EC108B461401C28B4610893C248954240489442408E82AF7FFFF897E088B45EC83C628FF45DC8B380FB747063B45DC7F998D7426008DBC27000000008B55EC8B52048955C88B4DE88B5DE42B5934895DE00F84D50000008B9FA400000085DB0F84C70000008B45C88B8FA000000001C88945D889C28B0285C00F84AD0000008DB6000000008DBC27000000008B55C831F68B4DD801D083C1088945D48B45D88B58048D43F8D1E883F800EB0B8D43F846D1E883C10239F0765A0FB70189C2C1EA0C25FF0F000083FA0375E'
	$Opcode &= '18B55D48B5DE0011C028B45D88B5804EBD0BF0100000085FF0F85920100008B7DEC893C24E8F8FBFFFF31C08D65F45B5E5F5DC38B068D5F0483EA0489078B75E883C604E909FEFFFF015DD88B55D88B0285C00F8569FFFFFF89F68DBC27000000008BB78400000085F60F84410100008B4DC88B9F8000000001D9894DD08D742600B814000000894424048B5DD0891C24E8ACF5FFFF83EC0885C00F8571FFFFFF8B430C85C00F8466FFFFFF8B55C801D0890424E87BF5FFFF83EC0483F8FF89C70F8458FFFFFF8B5DEC8B430885C0742EBE40000000897424088B430C8D048504000000894424048B4308890424E879F5FFFF89430883EC0C85C089C275288B55EC8B420CC70424400000008D04850400000089442404E842F5FFFF8B4DEC83EC0889C28941088B5DEC8B430C893C828B55D04089430C8B0285C074658B4DC889CE8D1C088B4A1001CE8B0385C07432669085C078428B55C88D44100289442404893C24E8D2F4FFFF890683EC0885C00F84A9FEFFFF83C30483C6048B0385C075D0B90100000085C90F8490FEFFFF8345D014E9EAFEFFFF25FFFF0000EBBE8D76008B45D08B5DC88B501001D389DEEB99C745CC000000008B45EC8B380FB7471466837F06008D740718757CE9110100009085C00F84A800000083FA0119D283E2E083C2408DB6000000008DBC2700000000F7C300000004740681CA000200008B4E1085C9750CF6'
	$Opcode &= 'C340746C8B4F2085C97422895424088D45F08944240C894C24048B4608890424E8F9F3FFFF8B55EC83EC108B3AFF45CC83C6280FB747063B45CC0F8E9A0000008B5E2489D889DAC1E81E83E001C1EA1FF7C3000000200F856EFFFFFF85C0742A83FA0119D283E2FE83C204E97AFFFFFF84DB79B98B4F24EB8E9083FA0119D283E29083EA80E960FFFFFF83FA0119D283E2F983C208E950FFFFFFBF04000000BE00200000897C240C897424088B4DE88B4150C704240000000089442404E84EF3FFFF8945E483EC108B5DE431C085DB0F8584FAFFFFE94AFDFFFF8B472885C074350345E40F842DFDFFFF31FFBE01000000897C2408897424048B4DE4890C24FFD083EC0C85C00F840BFDFFFF8B5DECC74310010000008B45EC8D65F45B5E5F5DC3'

	$_MDLoadOffset = (StringInStr($Opcode, "59585A51") - 1) / 2 - 1
	$_MDGetOffset = (StringInStr($Opcode, "5990585A51") - 1) / 2 - 1
	$_MDFreeOffset = (StringInStr($Opcode, "5A585250") - 1) / 2 - 1

	Local $Buffer = _MemVirtualAlloc(0, BinaryLen($Opcode), $MEM_COMMIT, $PAGE_EXECUTE_READWRITE)
	$_MDCodeBuffer = DllStructCreate("byte[" & BinaryLen($Opcode) & "]", $Buffer)
	DllStructSetData($_MDCodeBuffer, 1, $Opcode)

	If Not IsDllStruct($_MFHookBak) Then MemoryFuncInit()
EndFunc   ;==>MemoryDllInit

Func MemoryDllExit()
	MemoryFuncExit()
	_MemVirtualFree(DllStructGetPtr($_MDCodeBuffer), 0, $MEM_RELEASE)
	$_MDCodeBuffer = 0
EndFunc   ;==>MemoryDllExit

Func MemoryDllOpen($DllBinary)
	If Not IsDllStruct($_MDCodeBuffer) Then MemoryDllInit()

	Local $Ret = DllCall($_MDKernel32Dll, "hwnd", "LoadLibraryA", "str", "kernel32.dll")
	Local $GetProcAddress = DllCall($_MDKernel32Dll, "uint", "GetProcAddress", "hwnd", $Ret[0], "str", "GetProcAddress")
	Local $LoadLibraryA = DllCall($_MDKernel32Dll, "uint", "GetProcAddress", "hwnd", $Ret[0], "str", "LoadLibraryA")

	Local $DllBuffer = DllStructCreate("byte[" & BinaryLen($DllBinary) & "]")
	DllStructSetData($DllBuffer, 1, $DllBinary)

	MemoryFuncSet(DllStructGetPtr($_MDCodeBuffer) + $_MDLoadOffset)
	Local $Module = DllCall($_MDKernel32Dll, "uint", $_MFHookApi, "uint", $LoadLibraryA[0], "uint", $GetProcAddress[0], "ptr", DllStructGetPtr($DllBuffer))

	If @error Then
		Return SetError(@error, 0, 0)
	Else
		Return SetError(0, 0, $Module[0])
	EndIf
EndFunc   ;==>MemoryDllOpen

Func MemoryDllClose($Module)
	MemoryFuncSet(DllStructGetPtr($_MDCodeBuffer) + $_MDFreeOffset)
	DllCall($_MDKernel32Dll, "none", $_MFHookApi, "uint", $Module)
EndFunc   ;==>MemoryDllClose

Func MemoryDllCall($Module, $RetType, $Funcname, $Type1 = "", $Param1 = 0, $Type2 = "", $Param2 = 0, $Type3 = "", $Param3 = 0, $Type4 = "", $Param4 = 0, $Type5 = "", $Param5 = 0, $Type6 = "", $Param6 = 0, $Type7 = "", $Param7 = 0, $Type8 = "", $Param8 = 0, $Type9 = "", $Param9 = 0, $Type10 = "", $Param10 = 0, $Type11 = "", $Param11 = 0, $Type12 = "", $Param12 = 0, $Type13 = "", $Param13 = 0, $Type14 = "", $Param14 = 0, $Type15 = "", $Param15 = 0, $Type16 = "", $Param16 = 0, $Type17 = "", $Param17 = 0, $Type18 = "", $Param18 = 0, $Type19 = "", $Param19 = 0, $Type20 = "", $Param20 = 0)
	Local $Ret, $OpenFlag = False
	Local Const $MaxParams = 20
	If (@NumParams < 3) Or (@NumParams > $MaxParams * 2 + 3) Or (Mod(@NumParams, 2) = 0) Then Return SetError(2, 0, 0)

	If Not IsNumber($Module) Then
		$OpenFlag = True
		$Module = MemoryDllOpen($Module)
	EndIf

	If $Module = 0 Then
		If $OpenFlag Then MemoryDllClose($Module)
		Return SetError(1, 0, 0)
	EndIf

	MemoryFuncSet(DllStructGetPtr($_MDCodeBuffer) + $_MDGetOffset)
	$Ret = DllCall($_MDKernel32Dll, "uint", $_MFHookApi, "uint", $Module, "str", $Funcname)
	If (@error Or ($Ret[0] = 0)) Then Return SetError(3, 0, 0)

	MemoryFuncSet($Ret[0])
	Switch @NumParams
		Case 3
			$Ret = DllCall($_MDKernel32Dll, $RetType, $_MFHookApi)
		Case 5
			$Ret = DllCall($_MDKernel32Dll, $RetType, $_MFHookApi, $Type1, $Param1)
		Case 7
			$Ret = DllCall($_MDKernel32Dll, $RetType, $_MFHookApi, $Type1, $Param1, $Type2, $Param2)
		Case 9
			$Ret = DllCall($_MDKernel32Dll, $RetType, $_MFHookApi, $Type1, $Param1, $Type2, $Param2, $Type3, $Param3)
		Case 11
			$Ret = DllCall($_MDKernel32Dll, $RetType, $_MFHookApi, $Type1, $Param1, $Type2, $Param2, $Type3, $Param3, $Type4, $Param4)
		Case 13
			$Ret = DllCall($_MDKernel32Dll, $RetType, $_MFHookApi, $Type1, $Param1, $Type2, $Param2, $Type3, $Param3, $Type4, $Param4, $Type5, $Param5)
		Case Else
			Local $DllCallStr = 'DllCall($_MDKernel32Dll, $RetType, $_MFHookApi', $n
			$n = 1
			For $i = 5 To @NumParams Step 2
				$DllCallStr &= ', $Type' & $n & ', $Param' & $n
				$n += 1
			Next
			$DllCallStr &= ')'
			$Ret = Execute($DllCallStr)
	EndSwitch

	Local $err = @error
	If $OpenFlag Then MemoryDllClose($Module)
	Return SetError($err, 0, $Ret)
EndFunc   ;==>MemoryDllCall
#endregion memory DLL call

#region MD5 checksum
Func _MD5Input_Thread(ByRef $Context, $Data)
	Local $Opcode
	If Not IsDllStruct($_MD5_CodeBuffer) Then _MD5_Startup()
	If Not IsDllStruct($Context) Then Return SetError(1, 0, 0)

	$Data = Binary($Data)
	Local $InputLen = BinaryLen($Data)
	Local $Input = DllStructCreate("byte[" & $InputLen & "]")
	DllStructSetData($Input, 1, $Data)

	If @AutoItX64 Then
		$Opcode = Binary('0x4883EC084989C8488B5110498B004D8B4820488B49084D8B40184883C408FFE0')
	Else
		$Opcode = Binary('0x83EC1C8B4424208B50108954240C8B500C895424088B5008895424048B5004891424FF1083EC1083C41CC20400')
	EndIf

	Local $CodeBufferMemory = _MemVirtualAlloc(0, BinaryLen($Opcode), $MEM_COMMIT, $PAGE_EXECUTE_READWRITE)
	Local $CodeBuffer = DllStructCreate("byte[" & BinaryLen($Opcode) & "]", $CodeBufferMemory)
	DllStructSetData($CodeBuffer, 1, $Opcode)

	Local $ThreadParam = DllStructCreate("ptr addr; ptr var1; ptr var2; uint var3; int var4")
	DllStructSetData($ThreadParam, 'addr', DllStructGetPtr($_MD5_CodeBuffer) + $_MD5_InputOffset)
	DllStructSetData($ThreadParam, 'var1', DllStructGetPtr($Context))
	DllStructSetData($ThreadParam, 'var2', DllStructGetPtr($Input))
	DllStructSetData($ThreadParam, 'var3', $InputLen)
	DllStructSetData($ThreadParam, 'var4', 0)

	Local $Ret = DllCall("kernel32.dll", "hwnd", "CreateThread", "ptr", 0, "uint", 0, "ptr", _
			DllStructGetPtr($CodeBuffer), "ptr", DllStructGetPtr($ThreadParam), "uint", 0, "uint", 0)
	Local $ThreadHandle = $Ret[0]
	Do
		Sleep(10)
		$Ret = DllCall("kernel32.dll", "int", "GetExitCodeThread", "hwnd", $ThreadHandle, "uint*", 0)
	Until $Ret[2] <> 259 ; STILL_ACTIVE
EndFunc   ;==>_MD5Input_Thread

Func _MD5_Exit()
	$_MD5_CodeBuffer = 0
	_MemVirtualFree($_MD5_CodeBufferMemory, 0, $MEM_RELEASE)
EndFunc   ;==>_MD5_Exit

Func _MD5_Startup()
	Local $Code
	If Not IsDllStruct($_MD5_CodeBuffer) Then
		If @AutoItX64 Then
			$Code = 'BQsAAIkO2+kECRwYhw5XCIPUBK4KD0GcnVYdVZxU/HcAU0iD7ChEiyHHBnoMZwKDWggZEnIECEkTWQMieRBBjbT4eKRqf9c/ifgGaRgx2C5jUV4h8PB8JBT3+PhHAY28OVa3x+j9bP0Q7AQG7t7BKPbBwAfYAfA9IcZ9d0EO94txCMPBxwx0FABEjawe23AgJDmJwzp0sxhQ82M2hCH7YBOKtDPuzjG9wdZcHcOwwxFG8CxjO977MdY+b+sKoIQ4rw98UPWLJNiKvonrxp7GFmo++0Wq7oSAriHzog0AhzcqxocoRwGfKYnzgAox64NGwxHANqwtE0YwUKi9HM2A3/oKjmjufURFDy7jlUb9Nijd6Tw2xRHmuP9We+OhBSBEcQJuXCQMgIwY2JiAVWmGo+t7hD+v94QWK3sgRw4VsVv/NXjb30L3eGzhuCyjcGXduQRDiR6+18+6+s7q74JsUv+mhUcwZSr3QYQiEZBrvzXIkhJ5NGBuiTwkpIkUk3GYunygjjHvdkEPwCHHRQrwCwwB/1A4rvgSRSH4QBI9jkN5ptk9pMVBukE8Avmb+aQy6UmQBtkI0UmbIELawGIlHmX2cs4ogYlm8abpSm/5DcLIi0xC9wSBBVj9D0Bys/iJ/5sy8YlQDc8Mag+8pA4EwScJAUZH7QpRWl4mmRzP1TGHN/fN16qStum'
			$Code &= 'NDu4TgA49zM1R+LQgQhi78jBdGxAv1hsyOv75FCw69/tRzyHPQJeMEVOYPWwCHfb4rIHRsO9jQCHvA9MFgeah2GUdLvlRfHTQbJCVihRxaIaBPsj70+ddeQlyAiMImnegBTjmzeFXIX9g/DnWBzdGw6Adhw0j1fTxDA8E7RRaRStRzwt9BAXp46ktCXYCRRiSe6ANOfij71L8g92gBC3ZAm9nOkhlg4pMKrV0i9KKHE16swz+JMjGfYJCOfr/Ac5EA6lFf02gMJo8FDiLRL+GxwTuBgGB9nGHiJJGknJd6A5t0jtT7wtE8YYFCyJhnW2sODTwwPE+DDjl/fTIx9bFiVzpELs+JCIG6r6k/9mDDMa7WmbbF0za321LsCijFG7YyeOpzyLeS9Bb5Y9ghrv2jbB4TQHBSXFUThYJcLy/vggYgYv4MaNQTA2HUonFhbn9CZQQLwYKzVgFiywkEmVR1IA8L4x+myhIzck4xSBrIPonoWbqXvUyJCwvcrQqiGsZCoUw79SyooRJ9X5SBEOoFMcL2YUB72SD2QvOoOkOBR2IUgSSVacxJQiHDGoO6kgUCIUmFx+BNTnQ1NmU5MaQZZr+kDcf5Zkk2+Zrtr0s7UZoGlXGjMD4fCSiH5lPzO5spAQlRCIp9JQFH5aoeokw77CDuqwvlxP/KkNQCWRJFDQQ8UC2MWVWrMSSz8D'
			$Code &= 'COKcjlKvVjQputcb31UJp8TIZ4wxWkyJJ1hsbCc45Kqb0RcbExAb0f8woCeXHSeA2GffQZu0lJYKtOaCT/IWjCkxG5Wzt3bCoxAOkHMNZW2UyIu98bGgAxw/JFAkGgOiuqicAoCuSzAxmj9IVjJAWCQnIicsPL0zTvMTzUKa8F30U9O//b2w640QkCeD7Irzu0RNdhIUVKPw2ENnTEwnriUoQ46qU35J3kg8GPE9+qG/T05Q2quEd+zHrjtmJ1Ggi00nOG0HOgfy0KODmLO6llxR21cgd4zHLwN6NnAcUQ/yjmIuQCmkK+KxwzOZNCVks4E6CoREITkD9AcOr/bHXwd0PULnzCdiQ7KongJcsgn5TUPekrAYuNfI6vd00id7uAZgJzzHfIncBvDO70tcqReQKhwaHhMgJxoCojTQu38k9fHTzJXIMg88cHwVPOZHThgDUwQMC99Hbw76QWggJTNnCAokCi0IEUDf+2Ni1EAiJfkoASIPEKFteX105QVxvCB28p8MYvEmJftVnVArMn8tMCfhmxR1NhcDBi3FQdF/w5j8DTI15QEG+nwwC6wANSQFcJFBIhR7/dEalo+T1KZdH6/A5+3YE9v372/vxM4rYhuq23ONgHEgGKd/osAJqBoP+QHXILGf6'
			$Code &= 'BuGRMPboMAH/41hGdVK6krPrhPRKSBiJ11YIzlPKaMOOjiBJgfh/dn5BkUFQ9OA/IHVHDGZAMe1A+cw+4szp30Q/m+h2r+WDOysGGvg/d+RENEPAOhvDXrtBYmcyVAeHhSbxAV5QkeMghcO9IdMpxUO06DMy75Drue7+u4gzorDx1cZ+NI0uoQtD6cZEUZcY6MejkXCHuFIHJAEjRWfrobCJq82blosgAxkI/ty6mAMRDHZUMhAbqkFAMG8rE5mXGEnYpRKGrCAKmCZmKArLBpB9aTAKAV44v4Cgq79/ZNpnxIFmwdP/mQrGIs1E8kTN99nkkNH10AEJwB74OEKIDBgDdnJIQbikz4H5Y6hqf5jUDSnAMdKaQYI/AUNL4j0W2ZRT9rdzDMMBujhRDzOFpQ1A+ccCkRSpiAQRsACJ0THAwekDKPbCzAzJ80irKq2LZBxRs0CD4gF0HybGBwoUGnIhOFDo0NAltQVDUIn2JXVMk8YOQw046Nb1+p4wQNxFMgxEBAQISBAIIExqDGIHT5CepARP8T9M0v9RKfTDxmADpI17AbIbN+lNhpBmxweohuoC0Da7GulGIwgQEhEEdCHpPmgPlUQykS8iP0hT7yTRbaxrKSAkW4nodBLNCqnfY+kmJhtWfpnPBtZAmsH88wqkX17DEETQMqpjogAA'
		Else
			$Code = 'XgsAAIkA24PsBItEJAjz26DoLgnhw/vE+cIQwYeRLxwbKIk3eRGKBCcgIVcICByJCR0PHxBhCqBVV1ZjU0JEix2EagxdMthaEHoEAIlMJDyNtDF4HqRq193px9kh+b7AAc6LSAQewcYHGP47OI0DrClWt8fo2Nkx+Tch8ULzTA2Ai2gIccE/DAF8Bpwd23Ag2kFc0fPZbOQ0MWH7Ngwhy5gOAyeNvAE97s69wYl8nT3PwMMRMfcBy8xLMEYQMyHfGgNhMfIurw/g9YlhdBbBxxbc3gHMMM5HLIAUIWb+FgMxAY2MKSrGh0dUiieTdfkQlYRkRygKGI9GAzGAhysTEEYwqJGXQYoEmRuBR/QKHIxwLwEZlUb9LSBWijLtWZYEkRCIjPDYmIBCaUGJFo7+g443YRxaSox4r/eQP4WMRBgIKHixW3H/hUQUCCx4vtfwiaSCiowzhSBHEFMwjMEiEZBrIhjaP42xCPZEIISN8PX8cBI0wcUKov2TPw6TcZjwkJBlYQgYhzY4IVLpjoAzjkN5polA0etUTg2Uiw71AZRA+4+eH96CWDyJyIrNnR/oM7TwQAydH+4IPrRJpsc+mzj5yvdgAAViACUe9on4MfAhb8gI70T8KoviwXjAJAH4EY5As16izMDBLRCZJLpl90BBw1FaXiabKzzz/AcJAU8izjHGrr+NAyNQBqr'
			$Code &= 'HtmnpQQbUfEEoxg6B8vcMMc8hxwgDwCONhChdEDAv1kEUiUSJx96Ii4RRA7Ej91MU4QIJAKIegeYpodiSoIeHgyF04Y10NUi4LKtpBPvI+9PnSBhIeNjmzX7hiQQagdYHN8OUQTB8R3XR+ASHDdX0SBzUCO0UWkWRCKgFEenjqSM0U/Cj7/zKQSCA1ArZAm9nfF6EbX31dM19LMqDDIyHikwqaRSE8DzxT4YDQjn6/4tDUIEmMWg9JigSkxwIdAROgYH2cYdJliQ3wcwxENYLmFTA9gYiYZ1tGYnoMTTI/camMSeSECBuBww4TOWkQcKTNPAoWheG9uobvqSJjCY0+FjkLAgEYKnP3kuE3Sk8XJVA3sE+Ac1pIIa/xdTnAA5gS0y7lEH4Zq9lMBQIau4OD3Blv77WyTSwnn0MUYvLZKoXiIQ4EsZ+m5M+QHQp0OeLIciQPGXiz0GL+ieh6lajNGz4wDEwoWn9AQaF6O/Uqusvva8EthI9JvrU0xgBeAUdiARMonSLQOSKwYZBGLni1Io5FdDU2aJmNPHAyjEMaSL0Ag3lmdvmia3QZHVMVjooBhj4fKIfyjIB+f/IGTQGzGDN/2VWrMSqlweB6PXGNq+9iegH7CIpYfQw99AJYrU/BNXWQBv'
			$Code &= 'ABgH98Iw5DZf/KkMhCZ0gJOkS99EJTQ0DGYHQPacjlKsxbsXXkuwKALkJzzHHjSR8PXdFKAmdDykGADw5oJP8izB4xi0M99ZcCfukgBHDWVtLZVtY7FQ32hXC+gH+CUcwsvz1D6GSzAyPRMtVme1IHc4UvZEKAZwZ4OYs/lC6ffTvSP+BakNTpA5SIH0G0V2ETIU+ajVvq20QHCYVD4CsNU9+qG+Yy4KQQAsJxqDSMf6zz7jBueykCU6o7hgLicPV99OS7pDYOxRDoqMuCAnmH/PBHB/Bww+BKiihEQhOsPQvLAHLyM3YRgfFwDYugn5T99rAN4V22ED2xjHejTRsN7s2KQI18jq9idkjNAFC92w2D9U2Biu70tcq7M03GOqh8mznkfKG6whowgMykWqJ4ItymAY5WgidSgyV3uMfiUKAg8REW15fH13DVQ/VV+PPVlMAoIPsTIXJi1DidBx5jUB+kuI/SXU8QMMc6z0ii1xWyTCuT4nHriUbA+JcoJlIUBFYAVSF/3RHvkCsJ6IBOf52AonSjy+S1lzmfvVRVPayd/TQehTyAttzJfDyg/oZQHWoFzxALeja93H/CjHS65eVEUyTiDIskopmSEFA2e38/n+okRwPOIaAVUTroEJQgwvgP3VEkPMx//bFsA1y2FzqpXl57zToi58P5jd/Rz936oBGwInCo86uWfZU'
			$Code &= 'ZBPqLlhhAXKhu3rrIeAslL+/gYnaKcdM6vk9AfsO/ujjeIrrop75zSqUbATChLIBBuu8cZhL0GA8Gum7UQasEEsHFI1QQMcuYQEjRWe9Du6lH5hCaqvNYO8OCP7cukCYDA12VDIQONYTeoiRcy4CCkS/1ETT5b5DccOydMbcSVBAQf2/jqjNkAr32SHRwJ4JR4gMA4LAAYDYOHZmupFyh8KNe4rqFQOeJAiZvMJCpiJQ8PqSEVR8ut/+e1H2o8zDATC6OD8PhZ7CDffHAqQMn0mJgNjAwekCOfbCmfOrJJ0VAC8BdCrGB6HpJaFmZiFjUe2EEY1DQIiUiyV7UAd90nBrVA+kDv0Dwed2CzsRgtRTPERq7kNQOIfoKPr1gf2ZWwYKRPxGBMgMSBAIIExJDNxkUnSiIFLLJkgDhsPGA7YDewGyN+lVcm4VZscHkhzqAuizK+lRELIbViFTMckgRBjZ+YwgbIGQmmLfpf7RCxggmBhbMelgG1ZXp78kgxCltCHm5C/8BIP5CHInggcBKQKWpElMEfQFEmalgwQLicqTEPPUhxnD4QO5pOu6FgZfXsNXd0QQMDEPttIMaSGHswOtCCF0AwUKqkkhCnX2Uj/8Qk0QQKpfYMMA'
		EndIf
		Local $Opcode = String(_MD5_CodeDecompress($Code))
		$_MD5_InitOffset = (StringInStr($Opcode, "89DB") - 3) / 2
		$_MD5_InputOffset = (StringInStr($Opcode, "87DB") - 3) / 2
		$_MD5_ResultOffset = (StringInStr($Opcode, "09DB") - 3) / 2
		$Opcode = Binary($Opcode)

		$_MD5_CodeBufferMemory = _MemVirtualAlloc(0, BinaryLen($Opcode), $MEM_COMMIT, $PAGE_EXECUTE_READWRITE)
		$_MD5_CodeBuffer = DllStructCreate("byte[" & BinaryLen($Opcode) & "]", $_MD5_CodeBufferMemory)
		DllStructSetData($_MD5_CodeBuffer, 1, $Opcode)
		OnAutoItExitRegister("_MD5_Exit")
	EndIf
EndFunc   ;==>_MD5_Startup

Func _MD5Init()
	If Not IsDllStruct($_MD5_CodeBuffer) Then _MD5_Startup()
	Local $Context = DllStructCreate("byte[" & $_HASH_MD5[1] & "]")
	DllCall("user32.dll", "none", "CallWindowProc", "ptr", DllStructGetPtr($_MD5_CodeBuffer) + $_MD5_InitOffset, _
			"ptr", DllStructGetPtr($Context), _
			"int", 0, _
			"int", 0, _
			"int", 0)

	Return $Context
EndFunc   ;==>_MD5Init

Func _MD5Input(ByRef $Context, $Data)
	If Not IsDllStruct($_MD5_CodeBuffer) Then _MD5_Startup()
	If Not IsDllStruct($Context) Then Return SetError(1, 0, 0)

	$Data = Binary($Data)
	Local $InputLen = BinaryLen($Data)
	Local $Input = DllStructCreate("byte[" & $InputLen & "]")
	DllStructSetData($Input, 1, $Data)
	DllCall("user32.dll", "none", "CallWindowProc", "ptr", DllStructGetPtr($_MD5_CodeBuffer) + $_MD5_InputOffset, _
			"ptr", DllStructGetPtr($Context), _
			"ptr", DllStructGetPtr($Input), _
			"uint", $InputLen, _
			"int", 0)
EndFunc   ;==>_MD5Input

Func _MD5Result(ByRef $Context)
	If Not IsDllStruct($_MD5_CodeBuffer) Then _MD5_Startup()
	If Not IsDllStruct($Context) Then Return SetError(1, 0, "")

	Local $Digest = DllStructCreate("byte[" & $_HASH_MD5[0] & "]")
	DllCall("user32.dll", "none", "CallWindowProc", "ptr", DllStructGetPtr($_MD5_CodeBuffer) + $_MD5_ResultOffset, _
			"ptr", DllStructGetPtr($Context), _
			"ptr", DllStructGetPtr($Digest), _
			"int", 0, _
			"int", 0)
	Return DllStructGetData($Digest, 1)
EndFunc   ;==>_MD5Result

Func _MD5($Data)
	Local $Context = _MD5Init()
	_MD5Input($Context, $Data)
	Return _MD5Result($Context)
EndFunc   ;==>_MD5

Func _MD5_CodeDecompress($Code)
	Local $Opcode
	If @AutoItX64 Then
		$Opcode = '0x89C04150535657524889CE4889D7FCB28031DBA4B302E87500000073F631C9E86C000000731D31C0E8630000007324B302FFC1B010E85600000010C073F77544AAEBD3E85600000029D97510E84B000000EB2CACD1E8745711C9EB1D91FFC8C1E008ACE8340000003D007D0000730A80FC05730783F87F7704FFC1FFC141904489C0B301564889FE4829C6F3A45EEB8600D275078A1648FFC610D2C331C9FFC1E8EBFFFFFF11C9E8E4FFFFFF72F2C35A4829D7975F5E5B4158C389D24883EC08C70100000000C64104004883C408C389F64156415541544D89CC555756534C89C34883EC20410FB64104418800418B3183FE010F84AB00000073434863D24D89C54889CE488D3C114839FE0F84A50100000FB62E4883C601E8C601000083ED2B4080FD5077E2480FBEED0FB6042884C00FBED078D3C1E20241885500EB7383FE020F841C01000031C083FE03740F4883C4205B5E5F5D415C415D415EC34863D24D89C54889CE488D3C114839FE0F84CA0000000FB62E4883C601E86401000083ED2B4080FD5077E2480FBEED0FB6042884C078D683E03F410845004983C501E964FFFFFF4863D24D89C54889CE488D3C114839FE0F84E00000000FB62E4883C601E81D01000083ED2B4080FD5077E2480FBEED0FB6042884C00FBED078D389D04D8D7501C1E20483E03041885501C1F804410845004839FE747B0FB62E4883C601E8DD00000083ED2B4080FD5077E6480FBEED0FB6042884C00FBED078D789D0C1E2064D8D6E0183E03C41885601C1F8024108064839FE0F8536FFFFFF41C7042403000000410FB6450041884424044489E84883C42029D85B5E5F5D415C415D415EC34863D24889CE4D89C6488D3C114839FE758541C7042402000000410FB60641884424044489F04883C42029D85B5E5F5D415C415D415EC341C7042401000000410FB6450041884424044489E829D8E998FEFFFF41C7042400000000410FB6450041884424044489E829D8E97CFEFFFF56574889CF4889D64C89C1FCF3A45F5EC3E8500000003EFFFFFF3F3435363738393A3B3C3DFFFFFFFEFFFFFF000102030405060708090A0B0C0D0E0F10111213141516171819FFFFFFFFFFFF1A1B1C1D1E1F202122232425262728292A2B2C2D2E2F3031323358C3'
	Else
		$Opcode = '0x89C0608B7424248B7C2428FCB28031DBA4B302E86D00000073F631C9E864000000731C31C0E85B0000007323B30241B010E84F00000010C073F7753FAAEBD4E84D00000029D97510E842000000EB28ACD1E8744D11C9EB1C9148C1E008ACE82C0000003D007D0000730A80FC05730683F87F770241419589E8B3015689FE29C6F3A45EEB8E00D275058A164610D2C331C941E8EEFFFFFF11C9E8E7FFFFFF72F2C32B7C2428897C241C61C389D28B442404C70000000000C6400400C2100089F65557565383EC1C8B6C243C8B5424388B5C24308B7424340FB6450488028B550083FA010F84A1000000733F8B5424388D34338954240C39F30F848B0100000FB63B83C301E8CD0100008D57D580FA5077E50FBED20FB6041084C00FBED078D78B44240CC1E2028810EB6B83FA020F841201000031C083FA03740A83C41C5B5E5F5DC210008B4C24388D3433894C240C39F30F84CD0000000FB63B83C301E8740100008D57D580FA5077E50FBED20FB6041084C078DA8B54240C83E03F080283C2018954240CE96CFFFFFF8B4424388D34338944240C39F30F84D00000000FB63B83C301E82E0100008D57D580FA5077E50FBED20FB6141084D20FBEC278D78B4C240C89C283E230C1FA04C1E004081189CF83C70188410139F374750FB60383C3018844240CE8EC0000000FB654240C83EA2B80FA5077E00FBED20FB6141084D20FBEC278D289C283E23CC1FA02C1E006081739F38D57018954240C8847010F8533FFFFFFC74500030000008B4C240C0FB60188450489C82B44243883C41C5B5E5F5DC210008D34338B7C243839F3758BC74500020000000FB60788450489F82B44243883C41C5B5E5F5DC210008B54240CC74500010000000FB60288450489D02B442438E9B1FEFFFFC7450000000000EB9956578B7C240C8B7424108B4C241485C9742FFC83F9087227F7C7010000007402A449F7C702000000740566A583E90289CAC1E902F3A589D183E103F3A4EB02F3A45F5EC3E8500000003EFFFFFF3F3435363738393A3B3C3DFFFFFFFEFFFFFF000102030405060708090A0B0C0D0E0F10111213141516171819FFFFFFFFFFFF1A1B1C1D1E1F202122232425262728292A2B2C2D2E2F3031323358C3'
	EndIf
	Local $AP_Decompress = (StringInStr($Opcode, "89C0") - 3) / 2
	Local $B64D_Init = (StringInStr($Opcode, "89D2") - 3) / 2
	Local $B64D_DecodeData = (StringInStr($Opcode, "89F6") - 3) / 2
	$Opcode = Binary($Opcode)

	Local $CodeBufferMemory = _MemVirtualAlloc(0, BinaryLen($Opcode), $MEM_COMMIT, $PAGE_EXECUTE_READWRITE)
	Local $CodeBuffer = DllStructCreate("byte[" & BinaryLen($Opcode) & "]", $CodeBufferMemory)
	DllStructSetData($CodeBuffer, 1, $Opcode)

	Local $B64D_State = DllStructCreate("byte[16]")
	Local $Length = StringLen($Code)
	Local $Output = DllStructCreate("byte[" & $Length & "]")

	DllCall("user32.dll", "none", "CallWindowProc", "ptr", DllStructGetPtr($CodeBuffer) + $B64D_Init, _
			"ptr", DllStructGetPtr($B64D_State), _
			"int", 0, _
			"int", 0, _
			"int", 0)

	DllCall("user32.dll", "int", "CallWindowProc", "ptr", DllStructGetPtr($CodeBuffer) + $B64D_DecodeData, _
			"str", $Code, _
			"uint", $Length, _
			"ptr", DllStructGetPtr($Output), _
			"ptr", DllStructGetPtr($B64D_State))

	Local $ResultLen = DllStructGetData(DllStructCreate("uint", DllStructGetPtr($Output)), 1)
	Local $Result = DllStructCreate("byte[" & ($ResultLen + 16) & "]")

	Local $Ret = DllCall("user32.dll", "uint", "CallWindowProc", "ptr", DllStructGetPtr($CodeBuffer) + $AP_Decompress, _
			"ptr", DllStructGetPtr($Output) + 4, _
			"ptr", DllStructGetPtr($Result), _
			"int", 0, _
			"int", 0)


	_MemVirtualFree($CodeBufferMemory, 0, $MEM_RELEASE)
	Return BinaryMid(DllStructGetData($Result, 1), 1, $Ret[0])
EndFunc   ;==>_MD5_CodeDecompress
#endregion MD5 checksum

#region binary strings
Func cd2iso_DLL()
	Local _
			$cd2iso_DLL = '0x4D5A90000300000004000000FFFF0000B800000000000000400000000000000000000000000000000000000000000000000000000000000000000000800000000E1FBA0E00B409CD21B8014CCD21546869732070726F6772616D2063616E6E6F742062652072756E20696E20444F53206D6F64652E0D0D0A2400000000000000504500004C01070041CDFB4D0000000000000000E0000E230B010238000C0000001A0000000C0000C010000000100000002000000000BC6F00100000000200000400000001000000040000000000000000800000000400001176000003000000000020000010000000001000001000000000000010000000005000007800000000600000D002000000000000000000000000000000000000000000000000000000700000F000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002E746578740000002C0B000000100000000C000000040000000000000000000000000000600050602E6461746100000008000000002000000002000000100000000000000000000000000000400030C02E7264617461000080020000003000000004000000120000000000000000000000000000400060402E62737300000000900A0000004000'
	$cd2iso_DLL &= '000000000000000000000000000000000000000000800060C02E6564617461000078000000005000000002000000160000000000000000000000000000400030402E69646174610000D0020000006000000004000000180000000000000000000000000000400030C02E72656C6F630000F00000000070000000020000001C00000000000000000000000000004000304200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
	$cd2iso_DLL &= '005589E583EC188B4508C74424081040BC6FC74424040040BC6F890424E81B0A0000C9C38DB6000000008DBC27000000005589E583EC188B4508C74424081040BC6FC74424040040BC6F890424E8EB090000C983F80119C0C3908DB426000000005589E55383EC148B150040BC6F85D274348B1D1040BC6F83EB0439DA77158B0385C074F3FFD08B150040BC6F83EB0439DA76EB891424E8A9090000C7050040BC6F00000000C7042400000000E89B09000083C4145B5DC389F68DBC27000000005589E583EC38895DF48B5D0C8975F88B7508897DFC8B7D1083FB01743B897C2408895C2404893424E86307000083EC0C85DB75158B150040BC6F85D274688945E4E85AFFFFFF8B45E48B5DF48B75F88B7DFC89EC5DC20C00C7042480000000E83009000085C0A30040BC6F7443C70000000000A31040BC6FE8C3040000E8EE060000897C2408C744240401000000893424E8FA06000083EC0C85C075ACE8FEFEFFFF31C0EBA331C0EB9F8DB600000000E8E7080000C7000C00000031C0EB8A905589E583EC18E87D0700008B0D0420BC6F85C97431C704240030BC6FE8030900005285C07422C74424040D30BC6F890424E8F608000083EC0885C07409C704240420BC6FFFD0C9C3B800000000EBEA905589E5C9C39090905589E5B801000000C9C20C005589E583EC38C745F400000000C7442410000000008D45F4894424'
	$cd2iso_DLL &= '0CC744240800080000C74424044042BC6FA12440BC6F890424E89708000083EC1431C0817DF4000800000F95C0C9C366905589E583EC38C745F400000000C7442410000000008D45F48944240CC744240800080000C74424044042BC6FA12040BC6F890424E85308000083EC1431C0817DF4000800000F95C0C9C366905589E583EC08E8A9FFFFFF85C07405C9C38D7600C9E94EFFFFFF66905589E583EC18E8D9FFFFFF85C0751EA04142BC6F3C4374183C637414C704243630BC6FE8A4070000B801000000C9C390A04242BC6F3C4474043C6475DF803D4342BC6F3075D6803D4442BC6F3075CD803D4542BC6F3175C4C704242430BC6FE8680700000FB6059342BC6FC1E0180FB6159242BC6FC1E21009D00FB6159042BC6F09D00FB6159142BC6FC1E20809D0C9C38D76005589E55383EC0431DB8D7600E83FFFFFFF85C075064383FB1075F15A5BC9C3905589E583EC18A12040BC6F85C07413890424E86107000050C7052040BC6F00000000A12440BC6F85C07413890424E84507000051C7052440BC6F00000000C9C35589E5565383EC208B5D088B750CE8ADFFFFFFC744241800000000C744241400000000C744241003000000C744240C00000000C744240801000000C744240400000080891C24E8F506000083EC1CA32040BC6F40744EC744241800000000C744241400000000C744241002000000C744240C00'
	$cd2iso_DLL &= '000000C744240800000000C744240400000040893424E8B206000083EC1CA32440BC6F40743331C08D65F85B5EC9C36690895C2408C74424045330BC6FA1F460BC6F83C040890424E820060000B8010000008D65F85B5EC9C389742408C74424046730BC6FEBD666905589E5565381EC10020000C744240800000000C744240401000000C704248030BC6FE8F50500008B450889442408C7442404C630BC6F8D9DF8FEFFFF891C24E8C80500008B450C894424048DB5F8FDFFFF893424E8BB05000089742408895C2404C70424CE30BC6FE8AF050000C7052040BC6F00000000C7052440BC6F0000000089742404891C24E897FEFFFF85C0740B81C4100200005B5EC9C390E823FEFFFF85C075ECE886FDFFFF81C4100200005B5EC9C3000000005589E583EC4885C9895DF489C38975F889D6897DFC89CF750D8B5DF48B75F88B7DFC89EC5DC38D45C8C74424081C00000089442404891C24E87705000083EC0C85C074768B45DC83F804742983F84074248D45E48944240C8B45D4C744240840000000894424048B45C8890424E84A05000083EC10897C240889742404891C24E8E70400008B45DC83F804748C83F84074878D45E48944240C8B45E4894424088B45D4894424048B45C8890424E80A05000083EC10E95FFFFFFFC744240834000000C7442404EC30BC6FC704240C31BC6FE89E0400008D76008DBC27000000'
	$cd2iso_DLL &= '005589E583EC28A1404ABC6F895DF48975F8897DFC85C0740D8B5DF48B75F88B7DFC89EC5DC3B88032BC6F2D8032BC6F83F807C705404ABC6F010000007EDA83F80BBB8032BC6F7E288B3D8032BC6F85FF751E8B358432BC6F85F675148B0D8832BC6F85C9750ABB8C32BC6F908D7426008B1385D2743A81FB8032BC6F739ABE0000BC6F8D7DE08B4304B90400000001F08B10031383C3088955E089FAE87FFEFFFF81FB8032BC6F72DDE96AFFFFFF66908B430485C075BF837B0801908D7426000F8552FFFFFF83C30C81FB8032BC6F0F8343FFFFFFBE0000BC6FEB338D74260083FA20747B83FA08745829CF83FA10897DE4743F83FA20746E83FA087453669083C30C81FB8032BC6F0F8309FFFFFF8B43048B0B0FB6530801F001F183FA108B3975BD0FB7106685D2784B29CA8D3C3A897DE4B9020000008D55E4E8E0FDFFFFEBBE0FB61084D2783C29CA8D3C3A897DE4B9010000008D55E4E8C2FDFFFFEBA0033829CF897DE4B9040000008D55E4E8ACFDFFFFEB8A81CA0000FFFF29CA01FA8955E4EBAE81CA00FFFFFF29CA01FA8955E4EBBD9090909090909090909090905589E583EC08A10020BC6F8B0085C07417FFD0A10020BC6F8D50048B400489150020BC6F85C075E9C9C38DB6000000005589E5565383EC108B1D181BBC6F83FBFF742D85DB74138D349D181BBC6F6690FF1683EE0483EB0175F6C70424A017'
	$cd2iso_DLL &= 'BC6FE82AF8FFFF83C4105B5E5DC38D760031DBEB0289C38D43018B1485181BBC6F85D275F0EBBD8D76008DBC27000000005589E583EC088B0D504ABC6F85C97402C9C3C705504ABC6F01000000C9EB819055B80100000089E55DC20C00909090905589E583EC08A1644ABC6F8B4048C9FFE08D76005589E5565383EC60C7442408490000008D5DAF895C24040FB7C0890424E84E02000083EC0C85C074338D55CE31C0B901000000EB0E8D760031F609F039DA7410D1E14A803A4175F089CE09F039DA75F083385075238D65F85B5EC9C3C74424085C000000C74424044031BC6FC704248831BC6FE8A8010000C744240862000000C74424044031BC6FC70424C431BC6FE88C0100005589E557565381ECCC0000008D559FB920000000B04189D7F3AA8D45BFB12989C7BE4032BC6FF3A4891424E8B4010000516685C00F85CE000000C7042450000000E80601000089C3B95000000031C089DFF3AAC70350000000C74318FFFFFFFFC74328FFFFFFFFC74330FFFFFFFFC743489C1ABC6FC7434C6018BC6F8DB556FFFFFF8D8575FFFFFFB101EB03D1E14889DA21CA83FA0119D283E22083C241881039F075E88D9576FFFFFFB92900000089D7BE4032BC6FF3A4890424E82C010000526685C074500FB7C0E89EFEFFFF39C37440891C24898544FFFFFFE85C0000008B8544FFFFFF8D50488915684ABC6F8D504C89156C4ABC'
	$cd2iso_DLL &= '6FA3644ABC6F8D65F45B5E5FC9C38D76000FB7C0E85CFEFFFFEBD489D8EBD0C744240897000000C74424044031BC6FC704241032BC6FE85A0000009090FF25E860BC6F9090FF250461BC6F9090FF25FC60BC6F9090FF250861BC6F9090FF25F060BC6F9090FF251461BC6F9090FF250061BC6F9090FF251861BC6F9090FF251C61BC6F9090FF251061BC6F9090FF250C61BC6F9090FF25EC60BC6F9090FF25F860BC6F9090FF25C860BC6F9090FF25CC60BC6F9090FF25DC60BC6F9090FF25D060BC6F9090FF25B860BC6F9090FF25BC60BC6F9090FF25D860BC6F9090FF25D460BC6F9090FF25C460BC6F9090FF25C060BC6F9090FF25B460BC6F90905589E583EC18E879F6FFFFC70424D011BC6FE81DF5FFFFC9C3909090FFFFFFFFFC1ABC6F00000000FFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
	$cd2iso_DLL &= '00281BBC6F000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
	$cd2iso_DLL &= '006C696267636A5F732E646C6C005F4A765F5265676973746572436C61737365730000000049534F393636302064657465637465642E004552524F523A2049534F39393630206E6F742064657465637465642E00436F756C64206E6F74206F70656E2025732E0A00436F756C64206E6F74206372656174652025732E0A0000000063643269736F2025642E256420436F70797269676874203230303820486172616C6420566973746E65732E0A4D6F6464656420746F20446C6C20627920736D61727465650A005C5C2E5C25733A00436F7079696E6720647269766520257320746F2025732E2E2E0A000000002E2E2F2E2E2F72756E74696D652F70736575646F2D72656C6F632E63000000005669727475616C51756572792028616464722C2026622C2073697A656F66286229290000000000000000000000000000000000002E2E2F2E2E2F2E2E2F2E2E2F6763632D342E342E312F6C69626763632F2E2E2F6763632F636F6E6669672F693338362F6379676D696E672D7368617265642D646174612E63000000302026262022436F756C646E2774207265747269657665206E616D65206F66204743436C69622073686172656420646174612061746F6D22000000007265742D3E73697A65203D3D2073697A656F66285F5F6379676D696E675F7368617265642920262620224743436C69622073686172656420646174'
	$cd2iso_DLL &= '612073697A65206D69736D617463682200302026262022436F756C646E277420616464204743436C69622073686172656420646174612061746F6D2200000000002D4743434C49424359474D494E472D45482D54444D312D534A4C4A2D475448522D4D494E475733320000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
	$cd2iso_DLL &= '000000000040CDFB4D00000000465000000100000003000000030000002850000034500000405000004C1300007C12000068140000545000005C5000006750000000000100020063643269736F646C6C2E646C6C00436C65616E757000436F7079536563746F720063643269736F5F6D61696E5F696E69740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
	$cd2iso_DLL &= '004060000000000000000000007C620000B4600000746000000000000000000000C4620000E860000000000000000000000000000000000000000000000000000024610000306100003E6100004C61000058610000686100007C6100008E6100009A610000AC610000BC6100000000000000000000C8610000D6610000E0610000EA610000F2610000FA610000046200000E62000016620000206200002A620000346200003C62000046620000000000000000000024610000306100003E6100004C61000058610000686100007C6100008E6100009A610000AC610000BC6100000000000000000000C8610000D6610000E0610000EA610000F2610000FA610000046200000E62000016620000206200002A620000346200003C6200004662000000000000010041646441746F6D4100002600436C6F736548616E646C6500440043726561746546696C654100B00046696E6441746F6D4100DD0047657441746F6D4E616D6541000051014765744D6F64756C6548616E646C654100006C0147657450726F6341646472657373000068025265616446696C6500001E035669727475616C50726F74656374000021035669727475616C517565727900003B03577269746546696C650034005F5F646C6C6F6E657869740089005F61737365727400B6005F6572726E6F00000A015F696F620000470261626F727400620266666C'
	$cd2iso_DLL &= '75736800006B02667072696E7466007102667265650000A4026D616C6C6F630000AA026D656D6370790000B1027072696E74660000B402707574730000C502737072696E746600CD02737472637079000000600000006000000060000000600000006000000060000000600000006000000060000000600000006000004B45524E454C33322E646C6C0000000014600000146000001460000014600000146000001460000014600000146000001460000014600000146000001460000014600000146000006D73766372742E646C6C0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
	$cd2iso_DLL &= '0000100000E40000000D3015303D3045306930733088309D30F630273134318D319831AA31C0310C32113258325D32A832B732C932D732E032E932F332FF32093315331E33533366336F338233DB331E3438343D34603486349A34CC34D734E134E635ED35073626362B36343642364A3654365E36673678367F36A336CB36D6360537A737B437C037DA37EA37FD371C38383844386738DC38E338F838FF382A3979398039BA39F339FC39013A2A3A313A3E3A463A4E3A563A5E3A663A6E3A763A7E3A863A8E3A963A9E3AA63AAE3AB63ABE3AC63ACE3AD63ADE3AE63AEE3AF63A0A3B1C3B002000000C0000000030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
	$cd2iso_DLL &= '00'
	Return Binary($cd2iso_DLL)
EndFunc   ;==>cd2iso_DLL

Func BackgroundPic()
	Local _
			$BackgroundPic = '0xFFD8FFE000104A46494600010101000000000000FFDB0043000A07070807060A0808080B0A0A0B0E18100E0D0D0E1D15161118231F2524221F2221262B372F26293429212230413134393B3E3E3E252E4449433C48373D3E3BFFDB0043010A0B0B0E0D0E1C10101C3B2822283B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3BFFC2001108009D026703011100021101031101FFC4001A000002030101000000000000000000000003040001020506FFC4001801010101010100000000000000000000000001020304FFDA000C03010002100310000001E29084210842108421084210842CB2CD58E5354EC3D2E96F3579A253D73B41CD5292E6D904E809B69836B11072E173296CAB06236F1C4241466C8409500C51084216599210842108421084210842108421A2C84324288421642044DD197A146072B2D7421A6628668A84B98829B5E7461836B100CABCD614C935951399673C5A4A5B305108510B216421451084210842108421084210858594CD1D4C6D29034240A0C194510842CD06B1BB6E9A9AE9C37185CB4DB24664836D49D0B21F58D5CE250CD28ABEA0D94994E9592821830B0868D8494EAC290A30091740262A8842108421084210859B95B9B7669B8610D66D2EB342A022E2D6282F208C90859BA2A376CA755ACEA4D3835211'
	$BackgroundPic &= '98989A567410DDC12E460979629A8165681822885166D4EADCAE0CCAC062C899508B0A09229723B324210842108421B9589A766DECD6C6192D9A4D25D5D519334017A54E788C81B3242CD05B18D0ABB9BE8CAF62B11BB9B280B5CF9A650F723B39D673805CAF022CA288695B97A0D3AADC86089A4B2968C940D432ACA9223627703B2108421084092BB3A3F9D390CA193483B056102864DD4A864CCA3B57979C736C4591D9442D095B5755E9B733A66431A4A336A6A8CA6B9972858B32A812884343134FCDF4E572C32112EC8546012AE80A2C196E5CA8655550B9E7EB02B9A2108421A1DCF4E967A3B0799C502E52B94B5036683CAE8EC341AD2C9645C4A1551798733595AE28868B1956E747A69891A94A9205A2DA9CC4552ECCD8AC833242C24AECDF4E69E86109A9A4AA1C0046C5114016556A1895C9A726989702B6F3EE79D798AC84210B0F35D3C757F3A6105AC72F59E7DC8B509A86DCCE6ADCEC36312B6392B21E34B46556950B79D70AEB1442065766D89A773A665DC582D16B12D639CE61B21928858C4D3F9E8FAB72152905A0513B141740D94558F75C96852AF8A3CD3E6BF34F2E9A565E6DC23AE79210858E67A74B3D19CDC5CF2F7CD3D635B8E75CB3BC9510E3B5796A812C1AD4B945048DAC36608D173A52E57D628858795A9B6B3B3CD6D4B1950D89EF095E4BDCE4842C3CD359DED73736CD82B041353562'
	$BackgroundPic &= '52D41422674ECF7C37AC85578573A539E858AD66BAD99A519E5DE63210868766DA9B1489DC07593EE747B61DDE4925E6F1B874CE170A6AD577F50870E5572CA935376625A95ACECD9DA1AE62B984343734EE7A319D9564617007594F5C93BCF150B189B6A695B81DCDEA6C1CB24876751DAF3D2AF9A7918ABAECF5CBFAC8E8762B49677CEE1A0634CDAEA8639F718210B341E6B2092CD6A3FDB1D3EB86F23658CDE172D6F1332F375A0DADEA1EE73801A09D0EB973AE16954E7B0F3D398E8114D73C90D0FCDF4F3D19CEB6B4085EC5EC535CD373CD4092F471D41AC87AF267A65CD4BCDE571D17306B34D52B1995846E4AB7BBD33D1B300345696CF41F2E8966A4C5A680D9928B0AB086A52B4F364D677DF8B5AC39831999978D962E719BCD9B51629E4E863374AEEF5FAC7BA656D6529795C7A4E5D1CCF4475CC1734157A93A74E6D98D123205554E76B1CFBCC7658EE7A3134AF6E2EF7E6F58F657CF5E779E8791645AD5AA830FA31202DF41B348255EEB135ACE8534B6749C8BDC66C960916422BED36BB9773446B761EE37ACD6B16CB121239B624C8E514AB35561F319E61EA8B77D0E86D406F29EE733179FC7A3BCFB8C435C723735D79D7A0ACB3A246414AB4D229CADF1535924BD5CF50EB37E9E1D3E997F159E7779BC6CDE648DC9813B743321005BBB7B56ED6E51ADCB9970A3CEB32E6E6B591D8A2731935762E9FC'
	$BackgroundPic &= '5366D2D2DD9765B3AB292D362F67393305991DB9D4A9318A2DDE9B5D6B2AC168BEE21A9CDC6B1C7AB18E9CDBC816745BEC4E8F21D9D25C61472A937CE9391BE4B6B2DCD7533D55EBC5FF004727A46B9E8D9A480CBC105987CCAB59D424B89A16AB94C2C8B944B72DE6C5A224B33A80B11B395231ABD995DC8B9B08B4B0B665912D28959AA8B4C03B161619AEB043007505B80D44E90E5B671D79B329B3D26FB0DBF21D8D2432A29A55BE61C7BC97B9E8BA741A5BA71E8EA3F8A58B4DC6A55C4D4D1B0A68B32B84B5CCD5E6DC52C2EAD2AB298D01ACA35CA996EDEC8DE6933645AD90B292A2266ACCD55917490C92889A896E01D98ABA46B9B29A6954E64CF42EFB334F6630CEAC895289A5274E6DBC7BC40CF5AF47141675E46E4B33185B8C10B495448B5B9725CB95B349692D890A5CD99D406A73ECE548FDBD81AC899D48A9745A6922D464C4B9AA2ACCD6921410B2AA81AC4CAEACA5E6AD6A0759E4E63BAD7533A73392A4B2D294734B368DBCB730C9D9DEBA32DA33906514D662A5DA5D559A08692195A346A366D35642195CC6173A93590EA73AB8F88F576E9CCD245CA39AC9B908964281AE4C1168B32A22C960D4500B16B076314F1BB71728272A0D459776137826F3BB2A55F9EC19D6255A4CC75777AA6E54F3AE64991868D3460D66921B0A8582268B8D96428C995C033155A93795ECE5C72F0D574CEA8E8596A5C4'
	$BackgroundPic &= 'D48DAEAE749644854B452E4A056E2860695106504C2103A9AA9160110BA36E31D326DE2CA81E742CEAB20668F3494736A1802197A56BEA68DCA4351A4226CD442116EA1830081A86AAC9AC8751139D92F951A183A35DA19CDC67785DDBB908CDA44D10A2D6AB26494316B3975CD45232421084210859AB2EAA2108B76662A5A2108434323E7506E5D16B726CD2C4D2D452CAA3061422F43B33ACAF673A45734643FFC4002410000300020202020301010100000000000001020311101213200421143031414022FFDA0008010100010502FF009D32689C9A2330B20B20F20DEC844F0FD28FF67D1B37CB66466463A1BF44F43ADFFDFA3475346BF4AA3B93908CA3B3C84511C6CD8B9A3FD9E686CD8A8745E52F3157B1FEAD1A346BFE6502C42C2784F00F00F00F08F19D0D7E89A3B6C44D116761D0BEC5CB192F96345BD1E42B2957B2D9BE3637E9A3A8B193845F1CFC73F1CFC71E01E23AFF00C2A48C64E22718B19E33A1D0F18F10F08F01580AC23835EC989FD27F71479055B245CB2C9A1336363AFACB66CAA1D8DEFD9493889C04FC71601623C6743A1D078CAC45612B10E0D7EC489C64E327193029346B9D1A3A9D078C788BC05E02B1E8D7AAA133B8AB6631317A522BE9C51B299765B3B0EB8DFA29D918B64602708B18A4D1AF66872541588BC639FD491104C1302911B43CA91E7479D0B223B7A68D0E4AC65E12F08E'
	$BackgroundPic &= '75EA99B319344B157AE43BF52731594AA1B29FAE89C7B230918852246B9D9D90F2A2BE423F2059D0B2266C6392A0BC654FE848C724C933C3BD159F45FC92B3B67959E564FC864FCA27E48B3216446FD1C978CC984B8D7B4512C9A2684CD9B1D14CC877D1E41D0EBD54EC8C44622604B9EC3C88ACE8BF9257CA1FC86CF23676677689CEC8CE4E5D9B1952648297BC22112B8BC9A32662B2367DB140B1953AE55B42CEC9F924FCA17C93CE8F2A3CA8768A68B49971EB2C962641B3B1B1945966CDFACC118C94909A3B21E4479D15F24AF9457C863CCD9D9BE12271ECF10F18E0FB44E5688CE4DEC6CA46491FB63441D8ACBA32651BD933B2718A0EBF594EA39E11389B1C549DDA166679D9E7679D9E61643FA5CFACD0AC9B3C82B3B1D8A6515ED322FA3CA79CFC83F2079D9E564AAA2B0B1AD08D1A12FBC33F5D0705632B11507F08CA4DEF8C857AA20EC5652B26F889D918C50741CFD65FECA1C9489FEE0EBACD33AB9FB6B852743AF10CA5B54BD61132283A9AE59687E9106B4AA8FB3AB3A71AE3E3E8CAE7AE5FE92246BEF0234751C9525C96B88B1642E87EA84C766F6751498E48424245AFFCE49FFD4C968BE23368F3EC7F6393462C7B1E22B11506F44BDAB91F28C64A1234751C8E4A298F9944AD2B629D938C9C25E2FAA5A690D0ADC8F33637BE2448FF007E3AFAD70CA1C6C784BC5A1AD0A98D8FD149D4D33A364E2271'
	$BackgroundPic &= '1E014689251A297D649FBD148C93CC22647239FBC11F4E0A82E0B9219ADAB9E6518E4842468D1A1C95264829738E4AFA5FD710441305C7D668D394742A0D1A2608C635A52B7585696C6C675343296CAC6788788F11506894440B09F8E784F19D448E87417D09F19570C71B1E23C44E3D1A2998E7B5628D2D0E4B93241AD38FE6491F18D18D12848D1A3434522D191712885F566392249912347C8C44FD34548F18B10A35C53314FDCFD2F5EA753A1E33C6382E4B463931C8A4D1D4EA75342E35CDCECAC6C58CE8753A9AE35D9E0C22431948B92E09FA1ADAC8B8C48844A17A32CC8647C6246B53ADB8825085C648ECB2E2D39DF0B1938CF18F11E023168D73A35CE8D1AE29168C88C48842F7D73BE3AA3A23A1E31E32A07062C44AD70C636522E46BED7F32A3FDC44122F465194BE30A2BF8BFB04AE766CB854783EFC62846971A1AFD8CA321661205FAB5C3E366CDF1D1096B96F8D1A3222BFB06693FDC463245E8CA3299046145CFD447DE3C7CECD9D8762B3B1B366CEC76367637FAA8C85988817EAD9B366FD362A36763B0E8EE7905652D993191266435F78D10C568F2A3CA8F2A3CA87951568B66427FB80D6C99D1DB43CA798F29E43B9B3676366FD34753A9D4D1A35ED4642FFB868C6C5E9BF6D1A346BD76761D9E42B30FE41E727393987499B48CD637F73934798F333C8C56CECCEECAB67918F214C9662B27223BA3'
	$BackgroundPic &= '2662B30B2315316C5EA91A3A9D4D1AF5D9B366F8D94CCB45326B463CE46742B4FD77EBA3468D1D4EA393A9A1C948B1B362A1653CE3CE564DFA2A158ACF21E41D9BE1F0AB42CCCF395937C498F4294283A8A4EA293A9AFD0F86C6CD9D8AC85E52EF7CEC9C8CC7968C75BE1FEED0D1664A2E87FAF66CD9B366CDFE844DB232331D6FF7B1BE6E8AB63AE7FFC4001E11000300030101010101000000000000000001111020304050021260FFDA0008010301013F01F8CB0FFC5AC3F9D084213D2B0FC708421084278A0913DA8587DE109C6109DA13BCF8109DA109CD2F1C2705E384F13435C52DAF784D96D34BC209795A1EE85A52E6F76B65BC1F0489C2EB4A52E294A5C3DD65B1BCD2E172A52970D6C997663D92C5294A5297779A5D9EE8A365CDD16D75B94F0F542D98F54B0D97C4BADC4C3DAF178A51098F542DDE884378A5F0417E44884E13105F920D0D1365D10B0D68970687948637E18412D21084DA68F309ADC52F042133F5942D2E8C78423F43E5733109EB8427447E5E1E17163C2C7EB138C213E142109C561E17278431909DE7C68421098785BA161E16D08426F09F61328F84FA978D294FE8FE84CA5DE94A5F9F4BD610FE4825D294BFE93FFFC4001F1100030001050101010000000000000000000111100212203040507060FFDA0008010201013F01FEAE7E097F6984213E94213C689886D368D7D142D26D368F'
	$BackgroundPic &= '4909DF058485A498D5C66277CF042109884E28D3983D235DD098484B2D9A8B9597986D261F9E109D48452970C7DE8D2B34631AE34B9D2420D754EC4242D2418F85E2B8D1B1F7A13294B984E34421170D0D0FBAF2D284B0D8DF52E14BE2A52F441AC2E0B0D0D0FB970469586CBE2BD4FA2F4B2714278686BC5A5086C7E0A5F8B70FC48A5EFBF1A94A52F8EE697EDBE109F15FC2B8485A4D86C360F493A61084F33F8A98B51B8DC6E1EAF7CCDF914A5CDF87FFC400141001000000000000000000000000000000A0FFDA0008010100063F02409FFFC40020100101000202030101010100000000000001001011214120316151713040FFDA0008010100013F21FF009778D4E45F6B69803583C9702DCA20CC8A2658228CB8092D5735B30F868F91FF0046D6F6D6F86BCB76ED186AEEDDDDA4B75B6603C4C79F847190C92346E08488F0B83726A6DDBB7E1B5BDBDB5CFF00C81B9199EAF847CC7C5F197F253A94EA51D4B3CB70CC3715ED6A628DB1F378FC5C438E50611ADF6BF56066E343C43686CAF52BD5F0BF89F89F898EA63A9649AFF7095B6DF0BE37C607E45D64FE47F91FE5F3BE321D4A4A3C061B9E1C0698D495E2ADDBC9A5B7E49CE4F1A04C6F1A9191EA77ABE117E467503F2D2D24FE47F90BD5F3B5F53128FF004DB6EBE77CB26620B58353222FC8DEAF8DA3A923A6770E338D2451C4ADDB9B710638EE76A2F6CAB3'
	$BackgroundPic &= 'A96EB782E522F4BE319D44750C62D5AC3261385EA2FCB4F531FE5BFC1C2805AAEE2FB42F73BB80F76F2C68B1BD5F398EA7F06ED31CE569CF0DB96616EAFA5B8B66737E06D34F9447519849AC2492EE37703BB5DFB95DDD85AB0DDB33DA1FF0D8F839A02083DAFADDA610FB85DDF78DEE57733B82DBC3A8981EAF94AA4D780F38396D25B3191C0DE61B2B95C781779D4F37F519D425A230821770BBBEB27EDDC4E12581DDB7B83B4148EEDD874BE45B1CF1A0805F6BB0C08E0D09F76D2ED227731DDF489EE13BBED6CEE54FCE09AF0D59AF58846A9CAF6B725BE01BB7418A2C1770BB90EE03BBE92BBBBA98236E6D6BF9BE739963E9088189C434F898384008C7B957DC9570F4DC67B46D68986D80E319FAE0777DA3F4BED2DEEDADC1B44E47569C4B0A4C5C819F00DE065D0BFA85FB6DFB23B94EF0A13732C09A6B07646FC6F8E0D36D72985BD91E2F7F1F69C10B47724DEDC8B8B0D5462F15A31772570B5CD18665CA2E4CE9A5F02DD962B1963E24376C915C97284B624B6834CBBE0B4F5870D915C535F0F9CB723698356F2F7F268249504C9BF3D9C035705ED0E993BDB71DE16BDF1383D5F0B546DCB4359F68F869C3620989F39DEC31D648ADF7C2D1EB850D5AB1867BB6A22DA085BC4C131E524DB8CAE05B4B66D60246DCC05137EAE3F57F13D380BBF1470B61812D32ADC170F89C1C56A6D6CCF439DCF94B3E0B343831'
	$BackgroundPic &= '280F090DB8CB33B4E4A2DA56D10645D462DD8DED49E16FBF89226B9D2D8DB6DBD5FC413A82751AE3D19D64E1BC972DBD5CB13963E310D2D449815F04ECDEF00E9C6E7C981C88356A71B9B5C7B6E5C7AF03B17B9D438A02429735F38E7A9FD4CED263964B76E4DCC63B5FC4FC5A2E2B436C73C57C0784BBB5831A96C49BB893F37F33A4BAB68D1CA5A0861BF3BCDAC6E963DF8502D5A9230968B638DAE41E2B5C6110436E09FA5A5247ABE37F32DC9E482F089E4C78635E190C1C572668C16AD5AB56B3267B9488449C2B2ADCBC919B782C1B60D5A68DDE68F3638987B8F31EEE6B8D779DC36ADC5E519708120405A2D22219B59D5AF07229F30BD703C356B1AC83038BDF1E520C341376F03CE3EB2DC27230279A1C5E1ED1E73856E8200B648F181F002F3B5C9B8F1DDB9BD307CE1EB8191B7970E5B9EFC25C869A910309B9AD170E1EA848DDC78904540DA6E104EA8D5A08CEED7F6FEB02F3B844332369850A3C68CB2DBB72E27383B852513380C39498DDF1D61DCAF84BADA3BBE97BFBBED027BC0E941940FA84EE3F4C89C0D84B6DA18C904EAB4773AFB99DCCC1BC6ED3698DC914C93C0B318C66E72DD8CEED7DCCEEEF2DEE66DC41F32E27018B9B09D4DBB6949CEE1FECAF7255B6C36A821B5B581B464238582EEDBF64BBE67CDB264118BAC3023C9B9652F80DD613BBEF6C64445EEDE9C736E56E2187FC1B5B9105C094'
	$BackgroundPic &= '91BDBFCB70ADEDEDEDADADE5F35A898E8398C8C383C56596724B2C816F4CE7FFDA000C03010002000300000010924924924924926117EBF9E997D1F760FACC764C82904924CA49249249249249242488249064FA159C07C2F4CEC2E8B4FB000482926492492492492492B904F1B7049205D5C15C0337401B8BCF4D9202FF000927E492492492487ABF83247AC62492742D922FB5FB579A5A0800C5F108B4AE649249248B473C4F4D8FACE32046DA7EA81C7A30AD9013D9E0AF486F4E692492488767F344EC92A2CB993DCE8BBF1956BA9242629119BEF19E5C78492497C0F260D87F0D9D161644BC97176F3461206C7E14C8958766230B92482FD0C7349A5C756A9C9D92045AC862E41213A2CE291D5FA8AF14646492234C269C951A8AF12C3E249FF1127309253F6FEA2441603B891A04C92577EB24F11C5A4BEBDC294903B93E8672084B2A3EB01C006BE3E9559202B66F04EFC9E578FDF97E320C9BB8C0C0BE9A767C020F4CBBF19B202416E874B99E0DA92CE826EE4404DBEC6142AD2CDB3E268041621B4BD58DD92BBC3567831F928927E050DE211E639DDB8685A94503E8226B095F9C97773E6B1F092BCE856CBF65F123843D2AE1FDD1DF0AA10913D2F6FBA22AC81ACB418A1320120A7C4B22F76CEEC14E5FE3044DAF66790738A9B69F008BDDE2CEF83C67E798D076959C8DA43D38477758955298F56599ABAB4420'
	$BackgroundPic &= '0D511DF78DCF0CD525113F87545D865A5530190358021A920ECAEF56FB79F598C89E6594561A9CD5A83F9A2B72076144F7B6E9B782C86CD7DD5A095177CE37EC945369218846703315CDD36E57F82CFEAF98040B6EA84A526A8B8D65524924991BD914892483DBB8ED71F907699CBA4FFFC4001E11010101010101010101010100000000000100111020302140314150FFDA0008010301013F10FEB3844B2F02597CCF4B279B6CB6CBFF0089965967DC6197811331E27841649336FD32CB2CFE5C88788CB2CB2CF98C3CC838CF4424988B6599F8E5910F207867F09C270B2DB6F72CB2CB3E3B0C1D492CE14909221965B7E1910E19CDB6DB799C3199F408A4C96599F1B6F8CE12CF6436F1B2CE0C3249D5F804438DB6DB7D0DBC635F903805B2CB32DB6FBD8E64C7D08859659659C2D9999F59109992CB6FADB618622DBFDF9007209678B316DB6DB7B96781E31A9E8772CE32C978597D1C3996CB3E5B6DB6DB6186DF20F6216492E4C66CBC0F76DB6DF3B0DF8F04CF032882CB2C93813E83819BFC96DB79B6F1B6DB2CF0213621087067DCB7A1B2CC66F3B6F76DB6DB7C021FBEA1E041B7A91F40E06135F586F97ADE0836C30C3C3E9F4B16598BC084C71B781B78BC6C3C934867A082C83A233E64CE0CDB7C36C796CB2CE283830CB3E8666EDA9325365916E4C18E259C1E2B62117032781C0DB6CB6CB29E8861C96780F84B'
	$BackgroundPic &= '3C6F1E6591D4B54737CE719D8770CCE13C50F596D8924E0CA706965D0E596DB6DBC4E0387258725E641C6D87BB2DBDC88700431FB35EC4E1059100E2CA49278649647E44D98F044CC964A5C849C3C2CB6F1B0C78443F253B60B238CC36F1B644CE816459044B2CF1988E6C36F19B2CB2C9387864D9641C6C924E2E0BA43C565B6D86187C06FF00939FD881E5209382133C05907765979B2CC5B6DB6DB6CCC964F9CE1E8CE671B248270FE7876596DB61862631197E437B659659659659659DC8226776DB7C333D3C6DB6F52CB24B2CF19659659E47F11E467A7479387F6C9E6790CB2CB2C83A044CB6DB6F59B78F487A9DDB7B9659659659659659659670E3F92F06D965B6D861E0F021B65820B0E32CB2CB24B2CE6DB6DB2DBE996DB7C8C30F1B3C6DB6DBE32CB2CB265E362D96DE6DB318F2384E6B6DB6C5B30A705EECB6DB6DB6DBF06597E1B1CCB249F1B6DB6DB6DB6F0C597BB6FA498F23E136DB621F036DB6DFAACBF22238CFC36DB6DB6DFB659659CCF8EDB6DB6DBE8F82CBEBFFC4001D110101010101010101010100000000000001001110203021403150FFDA0008010201013F10FE71878F52C83DBD3C9DC93DEFFCCDB6DE649C67B7A719E11D7FE26DB6DB6DBF53ACFC16D878D905967DB6DB6DB6DFE2598B6DB6DB0C36DB6FCB6DB2492C96DB78CF0F044FCB6DB6DF3B6DB6DBF5D965B7E5B6DB6DBECB6DE32F'
	$BackgroundPic &= '07CEC3DCE6FBDB6DF39F0D861F932CBE420B3E1B6C36DBE76DE2CF77859647C96DB7F8463E2B2DBC08383A32CF1B6F76DB61F4B33DDB618B2C8F7B2CBC23CE5907819259CCE0C7B6596D84408842653DCB2C9EE596707DB2DB6F06187E0B6F823996596705A4C7818C4B2CE1ED92C8820B5E066409CF438499965965924FE43E926659CD8618F4CC1E402382736DE15B7E487A29CCB2CF6C9C102DAC63F25E0A60C741E06B85C90887CACB6DBE063CADB0442BD91C7C9704383FC11BD166286F008861E19B108126CE4923CA49332CB2C823C2CB1DEA0489C30C3C6F90DB0C3D6B6DB7EAF9318C5E9F0598B871076D390E0F859F4310EB06F319FCE933C3CBC6DB6F0D5D99B618F196716DE05FE467B2DB12CB6591C49FB08218650DB7211E32CB2CB2CE30CB8CB1DE5FE7262CD925B6F7620E6DB6CDBC2F08F04CADE6C36C36F0B0C32DB6C30CB6FD419D1970FF007B591D7C659249041C6CE4B38A99EB31C6C8B6DB65E18B6F488B384C9679DB6DB6D86D9B22DE16DBD2188BB192CEBEF20EE59CB99BB6CB6DBCCB3C6DB6CC5B6DF244164C12493EB6DB6DB61B7D6F763ACAF0964127A78742C87266DBD36DB6DF0DB6DBCCB2CB2CE904164C4CC9279CB2CF1B0DB6DB6DB6DB6DBE4B2CFD82165965AE12082620B249B67C167ACB2CB2CF6444F03C6492CB3CE5965967ACB399641D39B6C45DB4E270785CD9310DB3367478'
	$BackgroundPic &= '07BDB6DF80410412986DB79936FC77D659059DDE6DB6DB6C361040B32606519C939B6DBD38FDF2CB2C881C62FA667FB85B56AD5ADADA97FA888E2CBDFFC400211001010101010101010101000301000000010011213141105161203040A171FFDA0008010100013F10FF00D3D8626FE5981DB83B16907D61DEB2B1B12B8AE0278FC8EB04B85B4B99C0972F100C43D8F73634B8D98EB22EC0DC6557E03DFC01F8F37B2EFF00D29CCFFD6C584F91FCEFF191F928F938FF009DFC08679AFECCC9C033BA3191B3675B08361302DA7641CB2DA7917094BC926E48524ECC7F509D621066EF6D0F67ACF004BB6AD5AFD05F909F2FF19FE161F2489FFA6BF17C9FC0331D9ACE309FF0A339F2244FF8DB5310AEC31362F4C646D98EC63D8C3365D2E0219BB1948BF8EF2CC1762D76D59B2A7222766FBD906EDEC11AB2EFEA7C5F399298D19214B18FC036E7CB97E3FF003A333E4B8D23E41C21C240FE5B7C9E45C540EC63722CE4F9F39E7FC61F9E6657A9FAD6CE76FA9F83281B728FC1EC33B71EC4379B28CBB6E819E776CF9B26FB20B0BC95F827CBE3D8F3036061B0D9F8203E2FF227F94DF89335207723EB22FE5E81FF00911F922391F2119079C803C802042106C30BF247C9DF264D4808E46D6449E4DF1FA6251D90E2CCEC078C681800562E0439EC7E68B4AD1C38160786DD7673036C966C36673DC716B6D8ACC79206CD036604'
	$BackgroundPic &= '3C80F919F20FF2CD8902440C0FC91F2318CDC89AC8AF9267FE16672DF148F9C80CE408090F52F8C817C5F317C75E7082FDB49C60617E5F023586EE445C8E3C933F36238951D878B0E01B7C76F86C69EC71F93E468A1383B684D90664BB1A3DBF9B3BFF00865C250E5DCD8290539010100B42FA17B82F8682704BC6471091FBE011FC408F21EE13B724CFFB58DD34880E4467222FB716C5E8479C56EFADEF299354860D3CD307E3F05F42CB291510F21D818A451C957E8E58C4E7664762F4B57B71F6D4F6088FB6E1B7B5232B617B625E332FBFF184C8792236106C20E42204217A497CB41B820172B072B4E2BEF31AFACE7AD8A2AE2D9953D31078B33CBD1C9DB9FF005EA208C0E4004E49BA5AAE445C502FDBE44F9E471C711E659FF567EA90354786DF6AFCE5C7713F320BD215E96966582A13AFCDB6D50E1D914971D88FB167B684EEC80DB8DA16423D80F65DFD4533391714843C8CF486F17C65F350CE56EE4D4C57D04875651B2E2D90E4E08B913E0C2DF644D5B6C1813A457C887963AE7FD01D6EA32C17BA9084740A5BECA1CB88A478E41D32C08B6ECE7C8232E05BE0C46F6198ABEB2E7EAD7EAE1EBF38BD9B67A94218FEB2B61ADE5D8C7B23EC97D8596D32315D9B58E36FEA29D4520FB21E3287903F538CFB89BCD5E2EBB6FC33A180C509323FFEC25C833C8980ECCB7927923DC6C0367276C40EA1DFFCF84266DE'
	$BackgroundPic &= '8A708449ECAED6E39073918391DF96FF002D9173F227C429B39DFEC10E256E634C3F1676F0609E339E40B6882C5A16D49FADD25CC98724FE581E487CB41D89F624BD618BFBA324639F8A7507E2EF8C8B5198721BE4E3A45CE6D0CCF2694C196FE410DC7687969F21C79003C831E482C23FCD6D0595EED2ECF57FC65CB78CD9B06420B72F74B0CE4007234F21FE45AC3E4CAE7D8074B0796C53ED060281E9431B7F14A099611C8480C62EF9349E17B2122FDF29DC910B321DA4896A72D09811B4FD65F2D9B6EA96AAE2E5B4DE4F8B929F67F9B7684EF1CB20A9B460ACA4E4DA63209FEDAA64DCA41BB334133E46352EAC2F197024E904F251E9F88B09E4F988F2C6F90CA1B050313E910F2C306342E56C59372CBC5B1B7550947C8D3C8C5C7B189C81C87DB9148B3C83BCBAB92B39618C5A5B5C93F14ACC39703970F23FC4FF009B7F913F2347929A92B6FE0D72471CB992C861CBA9C8C0E46BCF933A1F623251E5B184E433E4C9C8B1A5F190061F6335E7235AF905B46B23F20CC08F5A47A425ECFE0973A4FBC2656672CE722303EFEA58DBC20CE97C65E9098CB43B3148F4E48D1B3D72C7E5FC975818E462D8084B9F6CBE7CB9F96E3CB93CB4D7278E3369AE5A91ED89CB30E5C4E5C3F0FE53C83B3940993ED870EE9720910A5A07200722085CCB6427447E09C721782D9821CB03E4CE22A88C90A4E1B206347279CAFF003B'
	$BackgroundPic &= 'F8ACC3C807C875C8A7221C39101C833C85F964F903F920391545C64376C5E58E4A919E127A2D784FB38600F2213905CD01302C2030879123C9F5422EABB9969C769A91E1702E315FCFC2F49DAD1BED877C1FCB7DFF00B1839714187E0273C91C04E89F3A462916910796E430C2C89033F094BB1013BF965F967F920F966F22C62D7E3D12E65C4B87E1ADF71CC75AC99C219DB0E5C1D2F68BD20493CBF822C708DE16731B8D802058990103CC84EE42465E1FF60C7FCB37C8E47E4DC21C21CB2C8C391630A4C9C3671392E1FE451B8324C721908BFDAC0C987081A04274BE4101F2148FE301A136E456E18609D462C80921712E360375D82478873F190C03F9227E1FE4E9B083F248EC03D49CE41F57BE496E178C5C7EC314B269370B7D25CEF672C2FB2F04F84B96DB2BC5C9968C1DDA5DB3933C914E7D88948DCDBFD6FE9923EC71ED83EC0FAC2FDBA956CB0FB206360F243770A4CAC6C4B319DC7A9E0DD3134BCAF109B7B041877F14B9632C9DDA10EBB1E5C3716059837DB3FD847D81F441FA5F464B2F6139E906EFFE8B9224D60BB067A5FE85CBD27FA161F4B7FA45BDBB2D0420463CB5197DAFCB69E4770DFDB6FB23EAFF004BB46965FB6EC8F2EF2E44D198C9F9410CFF00813C45A881B75000B00C624973F0F216DBFE5B65A13B24D2AE7E5A8793806104B3ED97DBBBB1EA21A4DB05CD858605E93A1A491061EE01EC'
	$BackgroundPic &= 'A793C88FFA91F5B97AC43D6D0F5BFB5927595F6C1B3F5866A43E1222E464114F57D592FC4CD0F20BFB1889DFCCFF00304F901F2C0996120FEC5FDBFDFF000264460F62C4DB6610EDCA309344418208F61B008CFE3BC3F99BF84D88647F20CF2FE649F9BBA737B307B6C76C3ECFFBF86290AC9EC32AEDFED3EF58BD7E417D92FB29F7F2974D201E5B8F27F8DF656E64DCECB751E36206E47197C57F8419D253E5FC513E40401F3F36DB67F070B3FB63F6FF0058EFD807B00C0C423B765D76D9CE32667FF5300BFF00D83C564843FC3135B0F61E7E924E07AFD4BA309A70B7F67BFF000D7FBFF423EC2FB7FBCFF7BFD65FEC17DB84EBFF006AB967E32D08662226C72DC9656DBAB3924B96C92CD396E91949765B5D92EB2ABF9FFFD9'
	Return Binary($BackgroundPic)
EndFunc   ;==>BackgroundPic

Func Texture()
	Local _
			$Texture = '0x89504E470D0A1A0A0000000D4948445200000016000000160103000000FE7AFE7800000006504C5445F9F2F2FCFEFC0B8BD4BF0000001D49444154785E8DC3411100000001C16BA27F2B41CC50C163A9B9A1BC065AC320BF32D4F72C0000000049454E44AE426082'
	Return Binary($Texture)
EndFunc   ;==>Texture

Func Icon_LM()
	Local _
			$Icon_LM = '0x89504E470D0A1A0A0000000D4948445200000020000000200802000000FC18EDA30000000674524E53000000FF0000D03E337C0000000970485973000017120000171201679FD2520000061149444154785EB5966B6C1B5516C7673C4F8FDF633BB19DC4B163BB2DA9A02D6DD30D6CD3DD6D9306148502698576C36B77417C800A0408A97CD808115428858A0F5008542055CD6E582A6077A520027D6C7753282A4A689AC67592DA6EE2B7C719DBF3F4CCEC95CA5AADFA5855DEFE3E8CEF5C5F9DFF3DFF7346F7C2AAAA42570126C7C6C6BAB7764335A3BBF403C3F015B33A5D6767E7F8C9F189C9891A05AA195C9BD9D9D95030545B063724100884CF876F9540D5AEDA046AA476014DD36A1280FF0B78A90EAAAD55BB45E8E5E1AE1C68D5712DA03774409B99096318FAFFB1E8EACD7EF7DDF7FBF77F005D9FD3DF1CFEEBD0EE4FF6BCF4D1E0CE03BB5FF8F3FBBB4FFD7314BA12F87A192412899E9E5E8B99069FF4AE5D2F425732353E528C27044DE3454D162B8A2C699AA22AE029EA61A471C3AF576FD8FA7306DAB54826937D7DDB794E002B2ECCC506FE34085D4678EA5B93D5E1F0FB4D369AD0530846A0388913A4D962F634783CCB9AB97C78FCEBCFAFDBA69148A4AF6F07BB54B4586C2B5B57BBDD0D284A8E8D1DBDF4EFB9D988C3B5C26075EBCD5683C140E0188221088AE02466B11A6C2EA7CDE3757A57C9A4'
	$Icon_LM &= '71E46F5F81F5C8C0C040B50082200C0D0DEDDCF92C0CE95A5A7CFDDD776295128E220486FEF4D3998766FA9FD6DE74B9EA301C47003A585365AE2C9E8F6692399617248FB7C1DEE497607B26574927727353A7F7370EFD6C91288A870E1D6A6FBF6BCF9EBD16B3C5EEB0757575B59B179FF487FFE039D5EF38799F7D32198D2C45938A2073BC222804A47784E70B22E279E0E1279F7AE1E52DF73F3A76626E2E5A4E461773F148311D059B3E7AF424D2DFDFFFDE7BEF3EF1C41F47FE3202C33A9AA6ED76FB7DBDDBEEBDB75B499D35494904D25048FAC7F83415DAB86E5DAB060A5A2A0A65812D4A3F9C3ADDF7BB1D288A2A8A423BE8E5AD2B0F7F3CB4DC82438582C6717C052A9404B4AD6D3D572E8312E10401D6E949B2734B5767D796266F132B6F2B7C7142AFD713986EFBA6D613305CE4D40ACB68108160C60AAC992C3659962727A6D6AE5F0D6990C3692F55A08ABD5126CB6AB96CE1CA5236AF032BF494C1E36EA46D4E97ABC1E9F4F8FD2D7E7F3330D916DA90D7CC87FF15993E1F53F9251B949F9A892D648C0CEF1635AB813232996C6221D5E86D800030B410BD58E7A0EABD7443B0D91D08D4FB57506E3F42122404C38196A0DBE53199AD40697131653299BCDE46E0582E9346DDADEEE56B2E4C9E1460236B08D4DB110BC51AB122896A6E5F23CF64401EA09D0AB9C2F1D14F7D4E0C5559545BD2EB780A53484C'
	$Icon_LM &= '87DC76DB4A90046834BFAFC5E36EB25AAC044ECCCF45E7E763388E37DFD18ED78558BDEFC3BF9F4E6773EE15EDC18087401192029FA0B5CE812395ECECC4BF7F1C3F76EED418A1491559114A65892B55F8822C9410831BE9D8B4111C5B34ED48A55204819B4C1682244103D4D73B1886191D3D76E6CCCC9123C71772A51FE7B3040A795D2E9BCB6FB45929BD86C8ACC22F55F852459421189724451425D0AF3C2F8ABCB8B0C8F43EBC13D9BBF7ED8E8E0E5055209E4C248BA525A3D14492C0395C83A0A54209D80B5E300CD754656E6EAE28E0A155ABECB4018778109DA4ACD6BA66DAD5ECF62FCB67D24C9E11A58A28C9B124136ABBE7E0B2611854BFCAF0F0C8B123C70551ACABAB379B2D384E8882A043504D558B4536BE104BA792658EEBE8EE7CA0A733D0E014D96421152F00EFF2E5429113784106DB54E5F84262CDC69EDF3EFA18888940035095CF6EFF749F6D5F387C9E61F24019B42C4519C13C4828CFE4EBEB6849921926373D399989A7C55296E5B278059265A9CC09B224711C7B7131CEF0CAF6C79FB9A7A7F7524C10E71A5795A1F70F5C8846699BCDE5F258AD764D83104469BFFB17FBDE7A27994A00B160303838F8CAC558243A3991CA24F36C99A2288FD7BB76C3C635EBD64355AA0257F3DAE0EBD367A729CAD0D4E4B5D10E70702E5C8CA53369809E2286870FD67AE8EF7AF9A5CD9B7F0306D1D8855C'
	$Icon_LM &= '36CD160AAA0AAAAD77B9EAABD16BBD553CF6FB477AB7F558CCE6783CAA280A8A220603F5FC8BCFDDE4A17F435A57AEF0F97C9F7FF6A5A2AA288AEE78E8C1503000DD04D51AFC2F5E7DE58DAEEECD6D6D6B6FD5CD6ED3AF7E598D7E53FC0791D0DEF3CDE657E60000000049454E44AE426082'
	Return Binary($Icon_LM)
EndFunc   ;==>Icon_LM
#endregion binary strings
