Logitech G15/G19 Shortcut Tool
Verfasst: 02.10.2017 14:25
Habe mir gestern eben was zusammengebastelt, vielleicht kann es ja jemand gebrauchen.
Problem war, ich habe auf meinen Gxx Tasten meiner G19 verschiedene Shortcuts angelegt, wie Monitor rechts aus, beide Monitore an, Soundausgabe Lautsprecher, Soundausgabe Kopfhörer, ...
Leider bin ich im fortgeschrittenen Alter und konnte mir ums verrecken nicht merken, welcher Shortcut wo ist.
Bei den Monitorumschaltungen ist es nicht so schlimm, das sieht man's ja eine Sekunde später, aber beim Lautsprecherumschalten, sehe ich nix, und musste es immer erst ausprobieren.
Also dachte ich, das Keyboard hat doch nen Display, wieso kann mir das nicht zusätzlich anzeigen was ich gerade aktiviert habe.
Mit der Logitechsoftware scheint das nur möglich zu sein, wenn ich "mehrere Tasten", also ein Makro verwende, das wollte ich aber nicht.
Also kann man das Tool hier verwenden, es sitzt dann quasi zwischen der Logitechsoftware und dem eigentlichen Tool und aktiviert zusätzlich das Display.
Man kann Texte und/oder Hintergrundbilder angeben und einen Timeout, wie lange das Display angezeigt werden soll.
Genug BlaBla, hier der Code:
Problem war, ich habe auf meinen Gxx Tasten meiner G19 verschiedene Shortcuts angelegt, wie Monitor rechts aus, beide Monitore an, Soundausgabe Lautsprecher, Soundausgabe Kopfhörer, ...
Leider bin ich im fortgeschrittenen Alter und konnte mir ums verrecken nicht merken, welcher Shortcut wo ist.
Bei den Monitorumschaltungen ist es nicht so schlimm, das sieht man's ja eine Sekunde später, aber beim Lautsprecherumschalten, sehe ich nix, und musste es immer erst ausprobieren.
Also dachte ich, das Keyboard hat doch nen Display, wieso kann mir das nicht zusätzlich anzeigen was ich gerade aktiviert habe.
Mit der Logitechsoftware scheint das nur möglich zu sein, wenn ich "mehrere Tasten", also ein Makro verwende, das wollte ich aber nicht.
Also kann man das Tool hier verwenden, es sitzt dann quasi zwischen der Logitechsoftware und dem eigentlichen Tool und aktiviert zusätzlich das Display.
Man kann Texte und/oder Hintergrundbilder angeben und einen Timeout, wie lange das Display angezeigt werden soll.
Genug BlaBla, hier der Code:
Code: Alles auswählen
;/-------------------------
;| Logitech G15/G19 Shortcut Tool
;|
;| You select in Logitech Gaming Software this tool as shortcut
;| with the parameter you entered in the app (Shortcut Name),
;| then you are able to use the G15/G19 display also.
;|
;| Written in 2h, because I often forgot which shortcut I set to my G-keys
;| Now the display will inform me also.
;|
;| (c)HeX0R, completely free for personal use
;|
;/-------------------------
;Include G15_G19 Include
HTTPInclude "http://www.purebasic.fr/german/viewtopic.php?f=8&t=23463"
;XIncludeFile "..\G15_G19_v2_devel.pbi"
;No HTTP Include??
;Get it from here:
;http://www.purebasic.fr/english/viewtopic.php?f=12&t=62689
UsePNGImageDecoder()
UseJPEGImageDecoder()
Enumeration Window
#Window_Main
EndEnumeration
Enumeration Gadget
#Frame_Shortcuts
#Tree_Shortcuts
#ButtonImage_Add
#ButtonImage_Delete
#Frame_Settings
#Text_ShortcutName
#String_Shortcut_Name
#Text_Shortcut
#String_Shortcut
#Button_BrowseShortcut
#Frame_G19_Settings
#Text_ShowPicture
#String_ShowPicture
#Button_BrowsePicture
#Text_ShowText
#Editor_ShowText
#Text_Duration
#Button_TestShortCut
#Button_Apply
#Text_Params
#String_Params
#Text_WorkingDir
#String_WorkingDir
#Button_BrowseWorkingDir
#String_Duration
#Text_ms
EndEnumeration
Enumeration Image
#Img_Add
#Img_Delete
EndEnumeration
EnableExplicit
Structure _SHORTCUTS_
Name.s
ShortCut.s
Parameters.s
WorkingDir.s
PathToPicture.s
Text.s
Duration.i
EndStructure
Global NewList SC._SHORTCUTS_()
Global EditorBug.i ;Editor fires an EventType_Change, without user input!
Macro CLEARFIELDS
SetGadgetText(#String_Shortcut, "")
SetGadgetText(#String_Params, "")
SetGadgetText(#String_WorkingDir, "")
SetGadgetText(#String_ShowPicture, "")
SetGadgetText(#String_Duration, "1000")
ClearGadgetItems(#Editor_ShowText)
EndMacro
Procedure Instance_Running(LockStr$)
Protected *MyMutex = CreateMutex_(#Null, 1, LockStr$)
If *MyMutex <> 0 And GetLastError_() = #ERROR_ALREADY_EXISTS
CloseHandle_(*MyMutex)
ProcedureReturn #True
Else
ProcedureReturn #False
EndIf
EndProcedure
Procedure DisableApplyButton()
Protected i, j, k, State, a$
i = CountGadgetItems(#Tree_Shortcuts)
If i > -1
i - 1
For j = 0 To CountGadgetItems(#Tree_Shortcuts) - 1
a$ = GetGadgetItemText(#Tree_Shortcuts, j)
For k = 0 To CountGadgetItems(#Tree_Shortcuts) - 1
If k <> j
If a$ = GetGadgetItemText(#Tree_Shortcuts, k)
;double found
State = 1
Break 2
EndIf
EndIf
Next k
Next j
EndIf
DisableGadget(#Button_Apply, State)
EndProcedure
Procedure DoShortCut(Name.s, TestMode = #False)
Protected Found, H, ImageID, Logi, i, Color, b$, Type = #LOGI_LCD_TYPE_COLOR
If TestMode
Found = #True
Else
ForEach SC()
If SC()\Name = Name
Found = #True
Break
EndIf
Next
EndIf
If Found And SC()\ShortCut
If SC()\PathToPicture Or SC()\Text
If LOGILCD::Init("ShortCut0R", Type)
Logi = #True
Else
Type = #LOGI_LCD_TYPE_MONO
If LOGILCD::Init("ShortCut0R", Type)
Logi = #True
EndIf
EndIf
If Logi
If SC()\PathToPicture
ImageID = LoadImage(#PB_Any, SC()\PathToPicture)
EndIf
EndIf
EndIf
H = RunProgram(SC()\ShortCut, SC()\Parameters, SC()\WorkingDir)
If Logi
If ImageID
LOGILCD::SetBackgroundImage(ImageID, Type)
EndIf
For i = 0 To CountString(SC()\Text, "\n")
b$ = StringField(SC()\Text, i + 1, "\n")
If Left(b$, 1) = "#"
Color = Val("$" + Mid(b$, 6, 2) + Mid(b$, 4, 2) + Mid(b$, 2, 2))
b$ = Mid(b$, 8)
Else
Color = #White
EndIf
If i = 0
;title
LOGILCD::SetTitle(b$, Color)
Else
LOGILCD::SetText(b$, i, Color, Type)
EndIf
Next i
LOGILCD::Update()
Delay(SC()\Duration)
LOGILCD::Shutdown()
If ImageID
FreeImage(ImageID)
EndIf
EndIf
EndIf
EndProcedure
Procedure DisableGadgets()
Protected i, State
i = GetGadgetState(#Tree_Shortcuts)
If i = -1
State = 1
EndIf
DisableGadget(#String_Params, State)
DisableGadget(#String_Shortcut, State)
DisableGadget(#String_Shortcut_Name, State)
DisableGadget(#String_ShowPicture, State)
DisableGadget(#String_WorkingDir, State)
DisableGadget(#Editor_ShowText, State)
DisableGadget(#Button_BrowsePicture, State)
DisableGadget(#Button_BrowseShortcut, State)
DisableGadget(#Button_BrowseWorkingDir, State)
DisableGadget(#String_Duration, State)
DisableGadget(#ButtonImage_Delete, State)
DisableGadget(#Button_TestShortCut, State)
EndProcedure
Procedure GadgetEvent_TestShortcut()
DoShortCut(SC()\Name, #True)
EndProcedure
Procedure GadgetEvent_BrowseWorkingDir()
Protected a$, i, *SC._SHORTCUTS_
a$ = PathRequester("Select Working Dir", GetGadgetText(#String_WorkingDir))
SetGadgetText(#String_WorkingDir, a$)
i = GetGadgetState(#Tree_Shortcuts)
If i > -1
*SC = GetGadgetItemData(#Tree_Shortcuts, i)
*SC\WorkingDir = a$
EndIf
EndProcedure
Procedure GadgetEvent_BrowsePicture()
Protected a$, i, *SC._SHORTCUTS_
a$ = OpenFileRequester("Select Picture", GetGadgetText(#String_ShowPicture), "Pictures|*.png;*.jpg;*.jpeg;*.bmp|All Files (*.*)|*.*", 0)
SetGadgetText(#String_ShowPicture, a$)
i = GetGadgetState(#Tree_Shortcuts)
If i > -1
*SC = GetGadgetItemData(#Tree_Shortcuts, i)
*SC\PathToPicture = a$
EndIf
EndProcedure
Procedure GadgetEvent_BrowseShortCut()
Protected a$, i, *SC._SHORTCUTS_
a$ = OpenFileRequester("Select Executable", GetGadgetText(#String_Shortcut), "Executables (*.exe)|*.exe|All Files (*.*)|*.*", 0)
SetGadgetText(#String_Shortcut, a$)
i = GetGadgetState(#Tree_Shortcuts)
If i > -1
*SC = GetGadgetItemData(#Tree_Shortcuts, i)
*SC\ShortCut = a$
EndIf
EndProcedure
Procedure GadgetEvent_AddShortCut()
Protected a$, i, k
a$ = "NewShortCut"
i = 0
k = #True
While k
k = #False
ForEach SC()
If SC()\Name = a$
i + 1
a$ = "NewShortCut_" + Str(i)
k = #True
Break
EndIf
Next
Wend
AddElement(SC())
SC()\Name = a$
SC()\Duration = 1000
SC()\Parameters = ""
SC()\PathToPicture = ""
SC()\ShortCut = ""
SC()\Text = ""
SC()\WorkingDir = ""
i = CountGadgetItems(#Tree_Shortcuts)
AddGadgetItem(#Tree_Shortcuts, -1, a$)
SetGadgetItemData(#Tree_Shortcuts, i, @SC())
SetGadgetState(#Tree_Shortcuts, i)
SetGadgetText(#String_Shortcut_Name, a$)
CLEARFIELDS
DisableGadgets()
EndProcedure
Procedure GadgetEvent_Tree()
Protected i, j, *SC._SHORTCUTS_
EditorBug = #True
i = GetGadgetState(#Tree_Shortcuts)
If i = -1
CLEARFIELDS
SetGadgetText(#String_Shortcut_Name, "")
Else
*SC = GetGadgetItemData(#Tree_Shortcuts, i)
ChangeCurrentElement(SC(), *SC)
SetGadgetText(#String_Params, *SC\Parameters)
SetGadgetText(#String_Shortcut, *SC\ShortCut)
SetGadgetText(#String_Shortcut_Name, *SC\Name)
SetGadgetText(#String_ShowPicture, *SC\PathToPicture)
SetGadgetText(#String_WorkingDir, *SC\WorkingDir)
ClearGadgetItems(#Editor_ShowText)
For j = 0 To CountString(*SC\Text, "\n")
AddGadgetItem(#Editor_ShowText, -1, StringField(*SC\Text, j + 1, "\n"))
Next j
SetGadgetText(#String_Duration, Str(*SC\Duration))
EndIf
DisableGadgets()
EditorBug = #False
EndProcedure
Procedure GadgetEvent_DelShortCut()
Protected a$, i
i = GetGadgetState(#Tree_Shortcuts)
If i > -1
ChangeCurrentElement(SC(), GetGadgetItemData(#Tree_Shortcuts, i))
DeleteElement(SC())
RemoveGadgetItem(#Tree_Shortcuts, i)
If CountGadgetItems(#Tree_Shortcuts) > 0
SetGadgetState(#Tree_Shortcuts, 0)
EndIf
GadgetEvent_Tree()
EndIf
EndProcedure
Procedure GadgetEvent_Apply()
If FileSize(GetUserDirectory(#PB_Directory_ProgramData) + "g19scd/") <> -2
CreateDirectory(GetUserDirectory(#PB_Directory_ProgramData) + "g19scd/")
EndIf
If ListSize(SC()) > 0
If CreateJSON(0)
InsertJSONList(JSONValue(0), SC())
SaveJSON(0, GetUserDirectory(#PB_Directory_ProgramData) + "g19scd/g19scd.json", #PB_JSON_PrettyPrint)
FreeJSON(0)
EndIf
EndIf
EndProcedure
Procedure GadgetEvent_StringChanged()
Protected i, j, *SC._SHORTCUTS_
If EventGadget() = #Editor_ShowText And EditorBug
ProcedureReturn
EndIf
i = GetGadgetState(#Tree_Shortcuts)
*SC = GetGadgetItemData(#Tree_Shortcuts, i)
*SC\PathToPicture = GetGadgetText(#String_ShowPicture)
*SC\Duration = Val(GetGadgetText(#String_Duration))
If *SC\Duration < 0
*SC\Duration = 1000
EndIf
*SC\Parameters = GetGadgetText(#String_Params)
*SC\WorkingDir = GetGadgetText(#String_WorkingDir)
*SC\ShortCut = GetGadgetText(#String_Shortcut)
*SC\Text = ""
For j = 0 To CountGadgetItems(#Editor_ShowText) - 1
*SC\Text + GetGadgetItemText(#Editor_ShowText, j) + "\n"
Next j
*SC\Text = Left(*SC\Text, Len(*SC\Text) - 2)
EndProcedure
Procedure GadgetEvent_ChangeName()
Protected a$, i, *SC._SHORTCUTS_
a$ = GetGadgetText(#String_Shortcut_Name)
i = GetGadgetState(#Tree_Shortcuts)
SetGadgetItemText(#Tree_Shortcuts, i, a$)
*SC = GetGadgetItemData(#Tree_Shortcuts, i)
*SC\Name = a$
DisableApplyButton()
EndProcedure
Procedure main()
Protected a$, i
If FileSize(GetUserDirectory(#PB_Directory_ProgramData) + "g19scd/g19scd.json") > 0
If LoadJSON(0, GetUserDirectory(#PB_Directory_ProgramData) + "g19scd/g19scd.json")
ExtractJSONList(JSONValue(0), SC())
FreeJSON(0)
EndIf
EndIf
a$ = ProgramParameter()
If a$
;shortcut mode!
While Instance_Running("Logi_Shortut_T00l") = #True
Delay(50)
Wend
DoShortCut(a$)
Else
CatchImage(#Img_Add, ?Img_Add)
CatchImage(#Img_Delete, ?Img_Delete)
OpenWindow(#Window_Main, 0, 0, 600, 480, "G15/G19 ShortCut Tool", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
FrameGadget(#Frame_Shortcuts, 5, 5, 190, 435, "Shortcuts")
TreeGadget(#Tree_Shortcuts, 10, 25, 180, 385, #PB_Tree_AlwaysShowSelection | #PB_Tree_NoLines | #PB_Tree_NoButtons)
ButtonImageGadget(#ButtonImage_Add, 10, 415, 20, 20, ImageID(#Img_Add))
ButtonImageGadget(#ButtonImage_Delete, 169, 415, 20, 20, ImageID(#Img_Delete))
FrameGadget(#Frame_Settings, 205, 5, 390, 435, "Shortcut Settings")
TextGadget(#Text_ShortcutName, 215, 40, 90, 25, "Name:")
StringGadget(#String_Shortcut_Name, 310, 30, 280, 30, "")
TextGadget(#Text_Shortcut, 215, 75, 90, 25, "Shortcut:")
StringGadget(#String_Shortcut, 310, 65, 240, 30, "")
ButtonGadget(#Button_BrowseShortcut, 555, 65, 35, 30, "...")
FrameGadget(#Frame_G19_Settings, 210, 175, 380, 260, "G15/G19 Settings")
TextGadget(#Text_ShowPicture, 215, 205, 105, 25, "Show Picture:")
StringGadget(#String_ShowPicture, 325, 195, 220, 30, "")
ButtonGadget(#Button_BrowsePicture, 550, 195, 35, 30, "...")
TextGadget(#Text_ShowText, 215, 235, 105, 25, "Show Text:")
EditorGadget(#Editor_ShowText, 325, 230, 260, 125)
TextGadget(#Text_Duration, 215, 365, 100, 25, "Duration:")
StringGadget(#String_Duration, 325, 360, 220, 30, "")
ButtonGadget(#Button_TestShortCut, 325, 395, 150, 30, "Test Shortcut")
TextGadget(#Text_Params, 215, 105, 90, 25, "Parameter:")
StringGadget(#String_Params, 310, 100, 280, 30, "")
TextGadget(#Text_WorkingDir, 215, 140, 90, 25, "Working Dir:")
StringGadget(#String_WorkingDir, 310, 135, 240, 30, "")
ButtonGadget(#Button_BrowseWorkingDir, 555, 135, 35, 30, "...")
TextGadget(#Text_ms, 550, 360, 35, 25, "ms")
ButtonGadget(#Button_Apply, 220, 445, 125, 30, "Save Settings", #PB_Button_Default)
GadgetToolTip(#String_Shortcut_Name, "Initialize shortcut via '" + GetFilePart(ProgramFilename()) + " NAME' (don't use blanks here!)")
GadgetToolTip(#String_Duration, "Duration (in ms) of the G15/G19 showing the message on the display")
GadgetToolTip(#String_Params, "Enter parameters for the shortcut")
GadgetToolTip(#String_ShowPicture, "Select a picture as background image for the G15/G19 Display")
GadgetToolTip(#String_WorkingDir, "Enter working directory for the shortcut (if needed)")
GadgetToolTip(#Editor_ShowText, "First line will be the title (leave empty if you don't need a title), add html colors at the beginning of a line, e.g. black text: #000000Test")
GadgetToolTip(#Button_BrowsePicture, "Browse for a picture")
GadgetToolTip(#Button_BrowseShortcut, "Browse for the application you want to start")
GadgetToolTip(#Button_BrowseWorkingDir, "Browse for the working directory")
GadgetToolTip(#Button_TestShortCut, "Test your entered data")
GadgetToolTip(#ButtonImage_Add, "Add a new shortcut")
GadgetToolTip(#ButtonImage_Delete, "Delete selected shortcut")
GadgetToolTip(#Tree_Shortcuts, "Here are all of your shortcuts")
BindGadgetEvent(#ButtonImage_Add, @GadgetEvent_AddShortCut())
BindGadgetEvent(#ButtonImage_Delete, @GadgetEvent_DelShortCut())
BindGadgetEvent(#Button_Apply, @GadgetEvent_Apply())
BindGadgetEvent(#String_Shortcut_Name, @GadgetEvent_ChangeName(), #PB_EventType_Change)
BindGadgetEvent(#String_Shortcut, @GadgetEvent_StringChanged(), #PB_EventType_Change)
BindGadgetEvent(#String_ShowPicture, @GadgetEvent_StringChanged(), #PB_EventType_Change)
BindGadgetEvent(#String_Duration, @GadgetEvent_StringChanged(), #PB_EventType_Change)
BindGadgetEvent(#Editor_ShowText, @GadgetEvent_StringChanged(), #PB_EventType_Change)
BindGadgetEvent(#String_Params, @GadgetEvent_StringChanged(), #PB_EventType_Change)
BindGadgetEvent(#String_WorkingDir, @GadgetEvent_StringChanged(), #PB_EventType_Change)
BindGadgetEvent(#Tree_Shortcuts, @GadgetEvent_Tree(), #PB_EventType_Change)
BindGadgetEvent(#Button_BrowseWorkingDir, @GadgetEvent_BrowseWorkingDir())
BindGadgetEvent(#Button_BrowsePicture, @GadgetEvent_BrowsePicture())
BindGadgetEvent(#Button_BrowseShortcut, @GadgetEvent_BrowseShortCut())
BindGadgetEvent(#Button_TestShortCut, @GadgetEvent_TestShortcut())
i = 0
ForEach SC()
AddGadgetItem(#Tree_Shortcuts, -1, SC()\Name)
SetGadgetItemData(#Tree_Shortcuts, i, @SC())
i + 1
Next
DisableGadgets()
Repeat
Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
EndProcedure
main()
End
DataSection
;Both images from:
;http://www.famfamfam.com/lab/icons/silk/
Img_Add:
Data.l $474E5089, $0A1A0A0D, $0D000000, $52444849, $10000000, $10000000, $00000608, $FFF31F00
Data.l $00000061, $4D416704, $AF000041, $8A0537C8, $000000E9, $58457419, $666F5374, $72617774
Data.l $64410065, $2065626F, $67616D49, $61655265, $C9717964, $00003C65, $44496F02, $CB385441
Data.l $4BEB93A5, $87186193, $2FB65BFD, $86A48305, $29A82859, $6F285825, $8A8A6CD9, $7396DB4E
Data.l $F6CE8A6B, $BA9D2E6E, $9D2D03CD, $B5150F13, $A468DBA1, $C30F383B, $D4E26603, $EBEA45D2
Data.l $228DA250, $AFC36A08, $4D15DEBF, $1E88CB47, $E0797DF8, $BEE79EBA, $0024EFB9, $DF93FF49
Data.l $75D3742E, $848F0ECC, $A889756C, $584109E6, $DC3AA2FE, $9282BCF0, $D148CB5A, $44F33168
Data.l $4A5A6E81, $424A4FB4, $B17BD6CF, $FF845A1A, $3FD606F3, $603260AD, $0353D287, $E21389BE
Data.l $244EB93D, $C584FC14, $3B3DE991, $61EDBE0E, $260B83F6, $778F106A, $9BEFB00C, $0E71F4B0
Data.l $4A1905DA, $DC23F247, $4E223CC1, $32929DA0, $DEE83868, $EBEF60B5, $F5B78636, $81D6B878
Data.l $0C2B5F6E, $FCFA1D7E, $B66F745A, $07607DC0, $D0A211E9, $D0582578, $0988CD9B, $BFD15868
Data.l $2FBBC6AC, $7D8BF49B, $42D2DDE8, $5F894AF3, $8326BD47, $C508517C, $FB9C2D72, $C91CDC36
Data.l $0C83DE41, $E2D04C45, $015CA1AC, $3355FD1B, $6855573A, $3643915B, $04098A2B, $661A2E36
Data.l $2A9D20CA, $1D1BC0C6, $B8CD4BF4, $C5469DDC, $FE718A04, $0BBDF7A1, $34756FFD, $1D3F84DC
Data.l $141164F1, $FC587CF3, $A5D2C8C3, $4D04C61E, $44E1DE76, $0DDA0C60, $FD5F2A12, $5BD20289
Data.l $087FAB0D, $23EC1DE9, $9CADBD41, $30B4FA32, $F4D0696C, $7CF10852, $1BD67805, $77346071
Data.l $FBF45C3D, $DEF2E8D4, $F27505C3, $B1E20951, $2B6DC512, $02C04701, $24257CD9, $351FD2DE
Data.l $9C88171F, $8BB9D41C, $E335D8E1, $D82A4F52, $4D4759F7, $188B9A14, $830B4F55, $718047A4
Data.l $B0D6346A, $8CEB5828, $31730A26, $1DC263B1, $1C28ADCB, $669E564C, $F9520DC4, $64A202A3
Data.l $D1A46AE8, $2D270951, $41DAFA31, $3E4154CE, $6AE30955, $2C341C1B, $56C070B4, $4C3422B1
Data.l $CE651C24, $18412E40, $03F94272, $2059E899, $806D7E61, $8D00C379, $5D5911B7, $74385129
Data.l $4CB84E1C, $CC99F4D7, $32749EDC, $9522F3BB, $A70949A1, $9F0D9FB5, $9D433D6F, $64C8B153
Data.l $5FE629E5, $F35FF1B7, $CB46411D, $D328001F, $000000C1, $4E454900, $6042AE44
Data.b $82
Img_Delete:
Data.l $474E5089, $0A1A0A0D, $0D000000, $52444849, $10000000, $10000000, $00000608, $FFF31F00
Data.l $00000061, $4D416704, $AF000041, $8A0537C8, $000000E9, $58457419, $666F5374, $72617774
Data.l $64410065, $2065626F, $67616D49, $61655265, $C9717964, $00003C65, $44495D02, $CB385441
Data.l $4BFB93A5, $C7186153, $1FB65BFD, $6E8904A2, $50518484, $7732F398, $A6DCDAD6, $8F4CB3CE
Data.l $69622C5B, $9A619D8E, $5CC58D41, $A5A843F8, $5FCAD576, $946C4D32, $D76A465A, $F2B1E5A1
Data.l $6A4D4ED2, $6BB39E6D, $60B9B7CA, $7A232E26, $CBCBFBE1, $3CBCF9FB, $0293CF0F, $B27FE520
Data.l $AF5662E6, $1550CE17, $1954F7E6, $B925A533, $7B86AD49, $7199AA47, $95766952, $0AEB85C8
Data.l $E27A74E6, $DFB14523, $0784361C, $19BC889D, $08646445, $CC0EDDFC, $AAF14A1A, $AB9F6090
Data.l $C15244C5, $4E5D3C32, $3BB70BF1, $16F534B0, $883BBED1, $6D11DBB6, $371F873E, $DC38B09B
Data.l $80C98F07, $FF366551, $AC499E4C, $74E8CC12, $E6EC1882, $8963B7AE, $F17A2171, $0B767C0C
Data.l $846AB6FC, $6910582F, $9EB611A0, $0DDEF840, $31251DCC, $FB9F687C, $208F6CB1, $F4C18821
Data.l $8B19AD7C, $8FF8B1AE, $EF0D0721, $75822359, $4EE155BA, $5D770892, $0CBCCBC1, $E833480C
Data.l $7503E084, $5D740984, $19B3B445, $BE256B3E, $66934916, $6F0492A1, $52C781AB, $3A448785
Data.l $E5301093, $7EE460DA, $0B0EA217, $F80DA77C, $7228F1D3, $E10AA5E0, $33846E6F, $2130476F
Data.l $828B2498, $8456CEA1, $9E080DEB, $30575B2A, $BF82AA5F, $E2FD11A9, $89822B2D, $B5E31512
Data.l $A76420D6, $C7571DC1, $328D261F, $135ABE0F, $F4464D66, $4A56D289, $69CB1570, $B0422646
Data.l $AD3E0DB3, $C952DE0C, $6795981A, $20902D83, $43097ED0, $CDE86DE2, $C4D2B4DA, $C15245D7
Data.l $9EE10D0B, $7020D0AB, $B0DE35AB, $17F89579, $2B05C8A8, $3132C18B, $8C16B6F8, $61974B17
Data.l $A368B777, $8D20D560, $2310E415, $F4FC038A, $D7021561, $9EBDF15A, $E2548786, $6F015AB3
Data.l $E5FC199D, $F3A84C16, $CA9593D1, $E92260C7, $EF953F28, $DC1C9E27, $764A8ECB, $11B54BE1
Data.l $F1F386DE, $863AAA7C, $975B3947, $3877F661, $4A0D32E9, $C4070B77, $B12766E9, $BF907993
Data.l $6D17EB9D, $D3737AE6, $54EC9E98, $06E67773, $F1B75FE1, $1D13F35F, $49B9CED2, $00FE1B72
Data.l $49000000, $AE444E45
Data.b $42, $60, $82
EndDataSection