From 14be0488ae5ccdd420d9f54859f6f0bffffea5dc Mon Sep 17 00:00:00 2001 From: Niels Date: Sun, 28 Mar 2010 20:08:50 +0200 Subject: [PATCH 01/22] Reverted something, because it was not needed :) --- Units/Misc/v_autocompleteform.pas | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Units/Misc/v_autocompleteform.pas b/Units/Misc/v_autocompleteform.pas index 7f003a4..a58de24 100644 --- a/Units/Misc/v_autocompleteform.pas +++ b/Units/Misc/v_autocompleteform.pas @@ -34,7 +34,7 @@ type {$IFDEF ccFORMCAPTION} procedure DoSelectionChange(User: Boolean); override; {$ENDIF} - procedure DrawItem(Control: TWinControl; Index: Integer; ARect: TRect; State: TOwnerDrawState); + procedure DrawItem(Index: Integer; ARect: TRect; State: TOwnerDrawState); override; {$IFDEF FPC} procedure WMEraseBkgnd(var message: TLMEraseBkgnd); message LM_ERASEBKGND; procedure WMVScroll(var message: TLMVScroll); message LM_VSCROLL; @@ -300,7 +300,7 @@ begin end; {$ENDIF} -procedure TAutoCompleteListBox.DrawItem(Control: TWinControl; Index: Integer; ARect: TRect; State: TOwnerDrawState); +procedure TAutoCompleteListBox.DrawItem(Index: Integer; ARect: TRect; State: TOwnerDrawState); var p1, p2, p3, tl, col: Integer; s, c: string; @@ -398,7 +398,6 @@ begin ControlStyle := ControlStyle + [csOpaque]; BorderStyle := bsNone; Style := lbOwnerDrawFixed; - OnDrawItem := {$IFDEF FPC}@{$ENDIF}DrawItem; IntegralHeight := True; {$IFDEF FPC} From 3ed1f42aabcb248c4b03c6842c21eb209b0dbf84 Mon Sep 17 00:00:00 2001 From: Niels Date: Thu, 1 Apr 2010 16:06:42 +0200 Subject: [PATCH 02/22] Fixed a bug in code insight so indexed properties should work better. --- Units/Misc/v_ideCodeInsight.pas | 46 +++++++++++++++++++++++++---- Units/Misc/v_ideCodeParser.pas | 51 +++++++++++++++++++++++++++++++-- 2 files changed, 88 insertions(+), 9 deletions(-) diff --git a/Units/Misc/v_ideCodeInsight.pas b/Units/Misc/v_ideCodeInsight.pas index 9ab8d10..712c0e3 100644 --- a/Units/Misc/v_ideCodeInsight.pas +++ b/Units/Misc/v_ideCodeInsight.pas @@ -548,7 +548,7 @@ begin end; end; -function TCodeInsight.GetExpressionAtPos(var BraceCount, BracketCount,CommaCount: Integer; out sp: Integer; IgnoreBrackets: Boolean): string; +function TCodeInsight.GetExpressionAtPos(var BraceCount, BracketCount, CommaCount: Integer; out sp: Integer; IgnoreBrackets: Boolean): string; var i, StartPos, EndPos: Integer; s: string; @@ -662,14 +662,14 @@ end; function TCodeInsight.FindVarBase(s: string; GetStruct: Boolean = False; Return: TVarBase = vbName): TDeclaration; - function PartOfWith(s: string; out Decl: TDeclaration; Return: TVarBase; CheckClass: Boolean): Boolean; + function PartOfWith(s: string; out Decl: TDeclaration; Return: TVarBase; CheckClass: Boolean; var ArrayCount: Integer): Boolean; var i: Integer; begin Result := False; for i := High(InWith) downto Low(InWith) do if CheckClass xor (i <> InClassFunction) then - if TciStruct(InWith[i]).HasField(s, Decl, Return) then + if TciStruct(InWith[i]).HasField(s, Decl, Return, ArrayCount) then begin Result := True; Break; @@ -823,10 +823,10 @@ begin VarBase := vbType; if (InStruct <> nil) then - Found := InStruct.HasField(f, Result, VarBase) + Found := InStruct.HasField(f, Result, VarBase, NeedArrayCount) else begin - Found := CheckVar and PartOfWith(f, Result, VarBase, False); + Found := CheckVar and PartOfWith(f, Result, VarBase, False, NeedArrayCount); if (not Found) and (i = Low(sa)) then begin Found := @@ -835,7 +835,7 @@ begin DoFindStruct(f, Result, VarBase, NeedArrayCount); end; if (not Found) and CheckVar then - Found := PartOfWith(f, Result, VarBase, True); + Found := PartOfWith(f, Result, VarBase, True, NeedArrayCount); end; if Found and (Result is TciTypeKind) then @@ -1065,6 +1065,38 @@ procedure TCodeInsight.Proposal_AddDeclaration(Item: TDeclaration; ItemList, Ins AddEnums(d, ItemList, InsertList); end; + function PropertyIndex(Item: TciClassProperty): string; + var + i: Integer; + d: TDeclaration; + a: TDeclarationArray; + begin + d := Item.Items.GetFirstItemOfClass(TciPropertyParameterList); + Result := ''; + + if (d <> nil) then + begin + a := d.Items.GetItemsOfClass(TciIdentifier); + for i := Low(a) to High(a) do + begin + if (Result <> '') then + Result := Result + ', '; + Result := Result + a[i].ShortText; + end; + + d := d.Items.GetFirstItemOfClass(TciTypeKind); + if (d <> nil) then + begin + if (Result <> '') then + Result := Result + ': '; + Result := Result + d.ShortText; + end; + end; + + if (Result <> '') then + Result := '['+Result+']'; + end; + var i: Integer; FirstColumn, s, n: string; @@ -1151,6 +1183,8 @@ begin Continue; {$ENDIF}*) s := FirstColumn + FormatMainName(n); + if (Item is TciClassProperty) then + s := s + FormatMainExtra(PropertyIndex(TciClassProperty(Item))); if (b[1] <> nil) then s := s + FormatMainExtra(' = ' + b[1].ShortText); if (b[2] <> nil) then diff --git a/Units/Misc/v_ideCodeParser.pas b/Units/Misc/v_ideCodeParser.pas index 4a5224b..58f0e8c 100644 --- a/Units/Misc/v_ideCodeParser.pas +++ b/Units/Misc/v_ideCodeParser.pas @@ -92,7 +92,8 @@ type private function GetShortText: string; override; public - function HasField(Name: string; out Decl: TDeclaration; Return: TVarBase = vbName): Boolean; + function HasField(Name: string; out Decl: TDeclaration; Return: TVarBase; var ArrayCount: Integer): Boolean; overload; + function HasField(Name: string; out Decl: TDeclaration; Return: TVarBase = vbName): Boolean; overload; function GetDefault(Return: TVarBase = vbName): TDeclaration; end; @@ -185,6 +186,8 @@ type TciClassMethodHeading = class(TciProcedureDeclaration); //Record + Class TciClassProperty = class(TDeclaration); //Record + Class TciPropertyDefault = class(TDeclaration); //Record + Class + TciIdentifier = class(TDeclaration); //Record + Class + TciPropertyParameterList = class(TDeclaration); //Record + Class TciSetType = class(TDeclaration); //Set TciOrdinalType = class(TDeclaration); //Set @@ -263,6 +266,8 @@ type procedure PropertyName; override; //Record + Class procedure TypeId; override; //Record + Class procedure PropertyDefault; override; //Record + Class + procedure Identifier; override; //Record + Class + procedure PropertyParameterList; override; //Record + Class procedure SetType; override; //Set procedure OrdinalType; override; //Set + Array Range @@ -630,10 +635,11 @@ begin Result := fShortText; end; -function TciStruct.HasField(Name: string; out Decl: TDeclaration; Return: TVarBase = vbName): Boolean; +function TciStruct.HasField(Name: string; out Decl: TDeclaration; Return: TVarBase; var ArrayCount: Integer): Boolean; var a, b: TDeclarationArray; i, ii: Integer; + t: TDeclaration; begin Result := False; Name := PrepareString(Name); @@ -665,6 +671,12 @@ begin if (PrepareString(b[ii].CleanText) = Name) then begin Result := True; + + t := a[i].Items.GetFirstItemOfClass(TciPropertyParameterList); + if (t <> nil) then + //ArrayCount := ArrayCount + t.Items.Count; [a, b] Indices count as 1 + Inc(ArrayCount); + if (Return = vbType) then Decl := b[ii].Owner.Items.GetFirstItemOfClass(TciTypeKind) else @@ -691,6 +703,13 @@ begin end; end; +function TciStruct.HasField(Name: string; out Decl: TDeclaration; Return: TVarBase = vbName): Boolean; +var + a: Integer; +begin + Result := HasField(Name, Decl, Return, a); +end; + function TciStruct.GetDefault(Return: TVarBase = vbName): TDeclaration; var d: TDeclaration; @@ -1662,7 +1681,7 @@ end; procedure TCodeParser.TypeId; begin - if (not InDeclaration(TciClassProperty)) then + if (not InDeclarations([TciClassProperty, TciPropertyParameterList])) then begin inherited; Exit; @@ -1686,6 +1705,32 @@ begin PopStack; end; +procedure TCodeParser.Identifier; +begin + if (not InDeclaration(TciPropertyParameterList)) then + begin + inherited; + Exit; + end; + + PushStack(TciIdentifier); + inherited; + PopStack; +end; + +procedure TCodeParser.PropertyParameterList; +begin + if (not InDeclaration(TciClassProperty)) then + begin + inherited; + Exit; + end; + + PushStack(TciPropertyParameterList); + inherited; + PopStack; +end; + procedure TCodeParser.SetType; begin PushStack(TciSetType); From 8f416c68e644e9347a9c9586583c4517f5ec25a8 Mon Sep 17 00:00:00 2001 From: Merlijn Wajer Date: Fri, 2 Apr 2010 01:48:06 +0200 Subject: [PATCH 03/22] Usable mouse class. Code is readable to the trained eye... I hope. --- Projects/MMLLib/libmml.lpr | 73 ++++++++++++++++++++----- Projects/MMLLib/pymml/mml.py | 14 ++++- Projects/MMLLib/pymml/mmlmouse.py | 89 ++++++++++++++++++++++++++----- Projects/MMLLib/pymml/mmltypes.py | 2 +- 4 files changed, 152 insertions(+), 26 deletions(-) diff --git a/Projects/MMLLib/libmml.lpr b/Projects/MMLLib/libmml.lpr index da42b68..4611afb 100644 --- a/Projects/MMLLib/libmml.lpr +++ b/Projects/MMLLib/libmml.lpr @@ -14,7 +14,10 @@ type Const RESULT_OK = 0; - RESULT_ERROR = 1; + RESULT_ERROR = -1; + + MOUSE_UP = 0; + MOUSE_DOWN = 1; var C: TClient; @@ -36,7 +39,7 @@ end; { Mouse } -function getmousepos(var t: tpoint): integer; cdecl; +function getMousePos(var t: tpoint): integer; cdecl; begin try @@ -50,17 +53,60 @@ begin end; end; -{function ConvIntClickType(Int : Integer) : TClickType;inline; -begin; - case int of - ps_mouse_right : result := mouse_Right; - ps_mouse_left : result := mouse_left; - ps_mouse_middle: result := mouse_middle; - else - raise exception.CreateFMT('Unknown Clicktype (%d) passed.',[int]); +function setMousePos(var t: tpoint): integer; cdecl; +begin + try + C.IOManager.SetMousePos(t.x,t.y); + result := RESULT_OK; + except on e : Exception do + begin + result := RESULT_ERROR; + last_error := PChar(e.Message); end; -end; } + end; +end; +function ConvIntClickType(Int : Integer) : TClickType;inline; +begin + case int of + 0 : result := mouse_Left; + 1 : result := mouse_Right; + 2: result := mouse_Middle; + end; +end; + +function getMouseButtonState(But: Integer): Integer; +begin + try + if C.IOManager.IsMouseButtonDown(ConvIntClickType(But)) then + result := MOUSE_DOWN; + except on e : Exception do + begin + result := RESULT_ERROR; + last_error := PChar(e.Message); + end; + end; +end; + +function setMouseButtonState(But, State, X, Y: Integer): Integer; +begin + try + if State = MOUSE_UP then + begin + C.IOManager.ReleaseMouse(X, Y, ConvIntClickType(But)); + result := RESULT_OK; + end else if state = MOUSE_DOWN then + begin + C.IOManager.HoldMouse(X, Y, ConvIntClickType(But)); + result := RESULT_OK; + end; + except on e : Exception do + begin + result := RESULT_ERROR; + last_error := PChar(e.Message); + end; + end; +end; function returnpoints: PTPoint; cdecl; @@ -170,7 +216,10 @@ end; exports test, init, - getmousepos, + getMousePos, + setMousePos, + getMouseButtonState, + setMouseButtonState, returnpoints, printpoints, hoi, diff --git a/Projects/MMLLib/pymml/mml.py b/Projects/MMLLib/pymml/mml.py index 22de916..99f1327 100755 --- a/Projects/MMLLib/pymml/mml.py +++ b/Projects/MMLLib/pymml/mml.py @@ -24,7 +24,19 @@ class MMLCore(object): DLL = MMLCore('../libmml.so') m = Mouse(DLL) -print m._getMousePos() + + + +print m[Mouse.Pos] + +for v in zip((Mouse.Left, Mouse.Right), m[(Mouse.Left, Mouse.Right)]): + print v + +m[(Mouse.Pos, Mouse.Right)] = ((300,300), True) +#print m._getMousePos() + +# Reset all buttons.. +m[(Mouse.Left, Mouse.Right, Mouse.Middle)] = [False for x in range(3)] del DLL diff --git a/Projects/MMLLib/pymml/mmlmouse.py b/Projects/MMLLib/pymml/mmlmouse.py index cb3c3dd..d8301b3 100644 --- a/Projects/MMLLib/pymml/mmlmouse.py +++ b/Projects/MMLLib/pymml/mmlmouse.py @@ -1,11 +1,19 @@ from ctypes import * -from mml import -from mmltypes import POINT +from mmltypes import POINT, PPOINT +from mmltypes import isiterable + +class MouseException(Exception): + def __init__(self, err): + Exception.__init__(self, err) # Usage: class Mouse(object): # _mc = MMLCore reference. _mc = None + Left ='Left' + Right = 'Right' + Middle = 'Middle' + Pos = 'Pos' # last pointer position _lpp = (0, 0) @@ -17,28 +25,85 @@ class Mouse(object): pass def _initialiseDLLFuncs(self): - self._mc.dll.getmousepos.restype = c_int - self._mc.dll.getmousepos.argtypes = [PPOINT] + self._mc.dll.getMousePos.restype = c_int + self._mc.dll.getMousePos.argtypes = [PPOINT] + + self._mc.dll.setMousePos.restype = c_int + self._mc.dll.setMousePos.argtypes = [PPOINT] + + self._mc.dll.getMouseButtonState.restype = c_int + self._mc.dll.getMouseButtonState.argtypes = [c_int] + + self._mc.dll.setMouseButtonState.restype = c_int + self._mc.dll.setMouseButtonState.argtypes = [c_int, c_int, c_int, c_int] pass - # Will be used to get the states of the mouse def __getitem__(self, item): - pass + if item == self.Pos: + return self._getMousePos() + if isiterable(item): + for i in item: + if i not in self._getButtons().keys(): + raise MouseException('Invalid mouse button') + + bs = [self._buttonToInt(x) for x in item] + return [self._getMouseButtonState(x) for x in bs] + + raise MouseException('item is not iterable, nor a (valid) string') - # Will be used to set states of the mouse def __setitem__(self, item, value): - pass + ak = self._getButtons().keys() + [self.Pos] + isfalse = lambda x: True if not x in ak else False + + for i in map(isfalse, item): + if i: + raise MouseException('One of the items is not valid. Items:', item) + + if isiterable(item) and isiterable(value): + if len(item) != len(value): + raise MouseException('Not enough values for items') + + for i, v in dict(zip(item, value)).iteritems(): + if i == self.Pos: + self._setMousePos(v) + if i in (self.Left, self.Right, self.Middle): + self._setMouseButtonState(self._buttonToInt(i), \ + 1 if v else 0) + return + + + raise MouseException('FIXME') + + # internal functions + + def _getButtons(self): + return {self.Left : 0, self.Right : 1, self.Middle : 2} + + def _buttonToInt(self, button): + return self._getButtons()[button] - # internal function def _getMousePos(self): ret = POINT() - ok = self._mc.dll.getmousepos(byref(ret)) + ok = self._mc.dll.getMousePos(byref(ret)) # FIXME: Perhaps use some sort of assertion? # We should print dll.last_error is ok != 0 self._lpp = (ret.x, ret.y) return (ret.x, ret.y) - # internal function + def _setMousePos(self, p): + ret = POINT() + ret.x, ret.y = p + ok = self._mc.dll.setMousePos(byref(ret)) + return ok + def _getMouseButtonState(self, button): - pass + ok = self._mc.dll.getMouseButtonState(button) + if ok < 0: + pass #Raise exception + return ok == 1 + + def _setMouseButtonState(self, button, state): + return self._mc.dll.setMouseButtonState(c_int(button), c_int(state), *map(lambda x: c_int(x), self._getMousePos())) + + diff --git a/Projects/MMLLib/pymml/mmltypes.py b/Projects/MMLLib/pymml/mmltypes.py index c5cef85..3d4abf6 100644 --- a/Projects/MMLLib/pymml/mmltypes.py +++ b/Projects/MMLLib/pymml/mmltypes.py @@ -6,4 +6,4 @@ class POINT(Structure): PPOINT = POINTER(POINT) - +isiterable = lambda x: hasattr(x, '__iter__') From e413c07d615fea46b0973a07820f56a4d640de1c Mon Sep 17 00:00:00 2001 From: Merlijn Wajer Date: Fri, 2 Apr 2010 01:56:26 +0200 Subject: [PATCH 04/22] Small cleanup --- Projects/MMLLib/pymml/mmlmouse.py | 49 +++++++++++++++++++------------ 1 file changed, 31 insertions(+), 18 deletions(-) diff --git a/Projects/MMLLib/pymml/mmlmouse.py b/Projects/MMLLib/pymml/mmlmouse.py index d8301b3..591315a 100644 --- a/Projects/MMLLib/pymml/mmlmouse.py +++ b/Projects/MMLLib/pymml/mmlmouse.py @@ -24,21 +24,9 @@ class Mouse(object): self._initialiseDLLFuncs() pass - def _initialiseDLLFuncs(self): - self._mc.dll.getMousePos.restype = c_int - self._mc.dll.getMousePos.argtypes = [PPOINT] - - self._mc.dll.setMousePos.restype = c_int - self._mc.dll.setMousePos.argtypes = [PPOINT] - - self._mc.dll.getMouseButtonState.restype = c_int - self._mc.dll.getMouseButtonState.argtypes = [c_int] - - self._mc.dll.setMouseButtonState.restype = c_int - self._mc.dll.setMouseButtonState.argtypes = [c_int, c_int, c_int, c_int] - pass - def __getitem__(self, item): + '''Can currently return the state of mouse buttons as well as the + mouse position. Supports iterable arguments''' if item == self.Pos: return self._getMousePos() if isiterable(item): @@ -52,6 +40,8 @@ class Mouse(object): raise MouseException('item is not iterable, nor a (valid) string') def __setitem__(self, item, value): + '''Can currently set the state of mouse buttons as well as the + mouse position. Supports iterable arguments''' ak = self._getButtons().keys() + [self.Pos] isfalse = lambda x: True if not x in ak else False @@ -66,7 +56,7 @@ class Mouse(object): for i, v in dict(zip(item, value)).iteritems(): if i == self.Pos: self._setMousePos(v) - if i in (self.Left, self.Right, self.Middle): + if i in self._getButtons().keys(): self._setMouseButtonState(self._buttonToInt(i), \ 1 if v else 0) return @@ -74,14 +64,17 @@ class Mouse(object): raise MouseException('FIXME') - # internal functions - + # Tools def _getButtons(self): + '''Return mouse buttons with their corresponding button DLL number as dict''' return {self.Left : 0, self.Right : 1, self.Middle : 2} def _buttonToInt(self, button): + '''Return button number for button''' return self._getButtons()[button] + + # Internal DLL stuff def _getMousePos(self): ret = POINT() ok = self._mc.dll.getMousePos(byref(ret)) @@ -95,6 +88,9 @@ class Mouse(object): ret = POINT() ret.x, ret.y = p ok = self._mc.dll.setMousePos(byref(ret)) + if ok != 0: + pass # Raise exception + self._lpp = (ret.x, ret.y) return ok def _getMouseButtonState(self, button): @@ -104,6 +100,23 @@ class Mouse(object): return ok == 1 def _setMouseButtonState(self, button, state): - return self._mc.dll.setMouseButtonState(c_int(button), c_int(state), *map(lambda x: c_int(x), self._getMousePos())) + ok = self._mc.dll.setMouseButtonState(c_int(button), c_int(state), *map(lambda x: c_int(x), self._getMousePos())) + if ok != 0: + pass # Raise exception + return ok + def _initialiseDLLFuncs(self): + '''Define all mouse related DLL-calls''' + self._mc.dll.getMousePos.restype = c_int + self._mc.dll.getMousePos.argtypes = [PPOINT] + + self._mc.dll.setMousePos.restype = c_int + self._mc.dll.setMousePos.argtypes = [PPOINT] + + self._mc.dll.getMouseButtonState.restype = c_int + self._mc.dll.getMouseButtonState.argtypes = [c_int] + + self._mc.dll.setMouseButtonState.restype = c_int + self._mc.dll.setMouseButtonState.argtypes = [c_int, c_int, c_int, c_int] + pass From e74cd3a92afbc4230094e85ddf5b8cb75749c036 Mon Sep 17 00:00:00 2001 From: Merlijn Wajer Date: Fri, 2 Apr 2010 11:36:47 +0200 Subject: [PATCH 05/22] Mouse class should be finished for now --- Projects/MMLLib/pymml/mml.py | 16 +++++---- Projects/MMLLib/pymml/mmlmouse.py | 57 ++++++++++++++++++++++++------- 2 files changed, 53 insertions(+), 20 deletions(-) diff --git a/Projects/MMLLib/pymml/mml.py b/Projects/MMLLib/pymml/mml.py index 99f1327..feb4495 100755 --- a/Projects/MMLLib/pymml/mml.py +++ b/Projects/MMLLib/pymml/mml.py @@ -3,6 +3,7 @@ from ctypes import * import platform from mmlmouse import Mouse +from time import sleep class MMLCoreException(Exception): def __init__(self, err): @@ -26,17 +27,18 @@ DLL = MMLCore('../libmml.so') m = Mouse(DLL) - -print m[Mouse.Pos] - -for v in zip((Mouse.Left, Mouse.Right), m[(Mouse.Left, Mouse.Right)]): - print v - +print m[(Mouse.Pos, Mouse.Left, Mouse.Right)] m[(Mouse.Pos, Mouse.Right)] = ((300,300), True) -#print m._getMousePos() +print m.getButtonStates() + +sleep(2) # Reset all buttons.. m[(Mouse.Left, Mouse.Right, Mouse.Middle)] = [False for x in range(3)] +for v in zip((Mouse.Left, Mouse.Right), m[(Mouse.Left, Mouse.Right)]): + print v +print m.getPos() + del DLL diff --git a/Projects/MMLLib/pymml/mmlmouse.py b/Projects/MMLLib/pymml/mmlmouse.py index 591315a..748a07b 100644 --- a/Projects/MMLLib/pymml/mmlmouse.py +++ b/Projects/MMLLib/pymml/mmlmouse.py @@ -23,45 +23,76 @@ class Mouse(object): self._mc = MC self._initialiseDLLFuncs() pass + + def setPos(self, pos): + return self.__setitem__(Mouse.Pos, pos) + + def getPos(self): + return self._getMousePos() + + def getButtonStates(self): + return zip(self._getButtons().keys(), \ + self.__getitem__(self._getButtons().keys())) + + def setButtonState(self, button, downup): + return self.__setitem__(button, downup) def __getitem__(self, item): '''Can currently return the state of mouse buttons as well as the mouse position. Supports iterable arguments''' - if item == self.Pos: - return self._getMousePos() if isiterable(item): + res = [] for i in item: - if i not in self._getButtons().keys(): + if i == self.Pos: + res.append(self._getMousePos()) + elif i in self._getButtons().keys(): + res.append(self._getMouseButtonState(self._buttonToInt(i))) + else: + print i raise MouseException('Invalid mouse button') + return res - bs = [self._buttonToInt(x) for x in item] - return [self._getMouseButtonState(x) for x in bs] + else: + if item == self.Pos: + return self._getMousePos() + if item in self._getButtons().keys(): + return self_getMouseButtonState(self_buttonToInt(item)) - raise MouseException('item is not iterable, nor a (valid) string') + raise MouseException('item is not iterable nor a (valid) string') def __setitem__(self, item, value): '''Can currently set the state of mouse buttons as well as the mouse position. Supports iterable arguments''' ak = self._getButtons().keys() + [self.Pos] - isfalse = lambda x: True if not x in ak else False - - for i in map(isfalse, item): - if i: - raise MouseException('One of the items is not valid. Items:', item) if isiterable(item) and isiterable(value): + isfalse = lambda x: True if not x in ak else False + for i in map(isfalse, item): + if i: + raise MouseException('One of the items is not valid. Items:', item) if len(item) != len(value): raise MouseException('Not enough values for items') for i, v in dict(zip(item, value)).iteritems(): if i == self.Pos: self._setMousePos(v) - if i in self._getButtons().keys(): + elif i in self._getButtons().keys(): self._setMouseButtonState(self._buttonToInt(i), \ 1 if v else 0) return - + else: + if item in ak: + if item == self.Pos: + self_.setMousePos(value) + elif item in self._getButtons().keys(): + self._setMouseButtonState(self._buttonToInt(item), \ + 1 if value else 0) + return + else: + raise MouseException('Invalid item / value') + + raise MouseException('FIXME') # Tools From 0c61053e07f8254bad73f263b09aec522870b265 Mon Sep 17 00:00:00 2001 From: Merlijn Wajer Date: Fri, 2 Apr 2010 12:00:40 +0200 Subject: [PATCH 06/22] Small fix --- Projects/MMLLib/pymml/mmlmouse.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Projects/MMLLib/pymml/mmlmouse.py b/Projects/MMLLib/pymml/mmlmouse.py index 748a07b..5c7d8ee 100644 --- a/Projects/MMLLib/pymml/mmlmouse.py +++ b/Projects/MMLLib/pymml/mmlmouse.py @@ -48,7 +48,6 @@ class Mouse(object): elif i in self._getButtons().keys(): res.append(self._getMouseButtonState(self._buttonToInt(i))) else: - print i raise MouseException('Invalid mouse button') return res @@ -56,7 +55,7 @@ class Mouse(object): if item == self.Pos: return self._getMousePos() if item in self._getButtons().keys(): - return self_getMouseButtonState(self_buttonToInt(item)) + return self._getMouseButtonState(self_buttonToInt(item)) raise MouseException('item is not iterable nor a (valid) string') From 61f3c1ce98b6693154ad6a970109168db075f298 Mon Sep 17 00:00:00 2001 From: Raymond Date: Fri, 2 Apr 2010 17:55:54 +0200 Subject: [PATCH 07/22] Added {$H+} to units where it was missing.. Should solve some string-issues! Started with cleaning up the units a bit.. Adding 'const' where needed (all of those big record structures like DTMs should require to be passed as a const.. Saves some (unneeded) memory copying). Settings in extensions should work now, see test extension. --- Projects/SAMufasaGUI/extensionmanager.pas | 2 +- Projects/SAMufasaGUI/extensionmanagergui.pas | 2 +- Projects/SAMufasaGUI/psextension.pas | 20 +- Projects/SAMufasaGUI/simbasettings.pas | 2 +- Projects/SAMufasaGUI/virtualextension.pas | 2 +- Units/MMLAddon/PSInc/Wrappers/settings.inc | 8 + Units/MMLAddon/PSInc/psexportedmethods.inc | 1 + Units/MMLAddon/mmisc.pas | 2 +- Units/MMLAddon/scriptproperties.pas | 2 +- Units/MMLAddon/settingssandbox.pas | 37 ++- Units/MMLAddon/stringutil.pas | 2 +- Units/MMLCore/client.pas | 10 +- Units/MMLCore/dtm.pas | 133 ++-------- Units/MMLCore/dtmutil.pas | 12 +- Units/MMLCore/finder.pas | 249 +++++++++++-------- Units/MMLCore/libloader.pas | 2 +- Units/MMLCore/mufasabase.pas | 2 +- 17 files changed, 213 insertions(+), 275 deletions(-) diff --git a/Projects/SAMufasaGUI/extensionmanager.pas b/Projects/SAMufasaGUI/extensionmanager.pas index 5f3eeba..6729c77 100644 --- a/Projects/SAMufasaGUI/extensionmanager.pas +++ b/Projects/SAMufasaGUI/extensionmanager.pas @@ -1,6 +1,6 @@ unit extensionmanager; -{$mode objfpc} +{$mode objfpc}{$H+} interface diff --git a/Projects/SAMufasaGUI/extensionmanagergui.pas b/Projects/SAMufasaGUI/extensionmanagergui.pas index d3417ea..e74df2c 100644 --- a/Projects/SAMufasaGUI/extensionmanagergui.pas +++ b/Projects/SAMufasaGUI/extensionmanagergui.pas @@ -1,6 +1,6 @@ unit extensionmanagergui; -{$mode objfpc} +{$mode objfpc}{$H+} interface diff --git a/Projects/SAMufasaGUI/psextension.pas b/Projects/SAMufasaGUI/psextension.pas index 179bc7b..14fd367 100644 --- a/Projects/SAMufasaGUI/psextension.pas +++ b/Projects/SAMufasaGUI/psextension.pas @@ -1,6 +1,6 @@ unit psextension; -{$mode objfpc} +{$mode objfpc}{$H+} interface @@ -49,7 +49,7 @@ uses uPSC_extctrls,uPSC_menus, //Compile libs uPSR_std, uPSR_controls,uPSR_classes,uPSR_graphics,uPSR_stdctrls,uPSR_forms, uPSR_extctrls,uPSR_menus, //Runtime-libs - testunit,updateform,settingssandbox//Writeln + testunit,updateform,settingssandbox,bitmaps//Writeln ; function TSimbaPSExtension.HookExists(HookName: String): Boolean; @@ -158,14 +158,14 @@ procedure TSimbaPSExtension.SIRegister_Settings(Cl: TPSPascalCompiler); begin with cl.AddClassN(nil,'TMMLSettingsSandbox') do begin; - RegisterMethod('function IsKey(KeyName: String): Boolean;'); - RegisterMethod('function IsDirectory(KeyName: String): Boolean;'); - RegisterMethod('function SetKeyValue(Keyname : string; Value : string) : boolean;'); - RegisterMethod('function GetKeyValue(KeyName: String): String;'); - RegisterMethod('function GetKeyValueDef(KeyName, defVal: String): String;'); - RegisterMethod('function ListKeys(KeyName: String): TStringArray;'); - RegisterMethod('function DeleteKey(KeyName: String): Boolean;'); - RegisterMethod('function DeleteSubKeys(KeyName: String): Boolean;'); + RegisterMethod('function IsKey(const KeyName: String): Boolean;'); + RegisterMethod('function IsDirectory(const KeyName: String): Boolean;'); + RegisterMethod('function SetKeyValue(const Keyname, Value : string) : boolean;'); + RegisterMethod('function GetKeyValue(const KeyName: String): String;'); + RegisterMethod('function GetKeyValueDef(const KeyName, defVal: String): String;'); + RegisterMethod('function ListKeys(const KeyName: String; out Keys :TStringArray): boolean;'); + RegisterMethod('function DeleteKey(const KeyName: String): Boolean;'); + RegisterMethod('function DeleteSubKeys(const KeyName: String): Boolean;'); RegisterProperty('Prefix','String',iptR); end; end; diff --git a/Projects/SAMufasaGUI/simbasettings.pas b/Projects/SAMufasaGUI/simbasettings.pas index 7ae34f9..2e20b0a 100644 --- a/Projects/SAMufasaGUI/simbasettings.pas +++ b/Projects/SAMufasaGUI/simbasettings.pas @@ -1,6 +1,6 @@ unit simbasettings; -{$mode objfpc} {$M+} +{$mode objfpc}{$H+} interface diff --git a/Projects/SAMufasaGUI/virtualextension.pas b/Projects/SAMufasaGUI/virtualextension.pas index 90a5633..c53e42e 100644 --- a/Projects/SAMufasaGUI/virtualextension.pas +++ b/Projects/SAMufasaGUI/virtualextension.pas @@ -1,6 +1,6 @@ unit virtualextension; -{$mode objfpc} +{$mode objfpc}{$H+} interface diff --git a/Units/MMLAddon/PSInc/Wrappers/settings.inc b/Units/MMLAddon/PSInc/Wrappers/settings.inc index 7618cb7..d9781e0 100644 --- a/Units/MMLAddon/PSInc/Wrappers/settings.inc +++ b/Units/MMLAddon/PSInc/Wrappers/settings.inc @@ -21,6 +21,14 @@ Settings.inc for the Mufasa Macro Library } +function SetSettingValue(KeyName,value : string) : boolean; +begin + if CurrThread.Sett <> nil then + result:= CurrThread.Sett.SetKeyValue(KeyName,Value) + else + result:=false; +end; + function KeyIsSetting(KeyName: String): Boolean; begin if CurrThread.Sett <> nil then diff --git a/Units/MMLAddon/PSInc/psexportedmethods.inc b/Units/MMLAddon/PSInc/psexportedmethods.inc index 6c2fa22..7d61c25 100644 --- a/Units/MMLAddon/PSInc/psexportedmethods.inc +++ b/Units/MMLAddon/PSInc/psexportedmethods.inc @@ -371,6 +371,7 @@ AddFunction(@KeyIsSetting, 'function KeyIsSetting(KeyName: String): Boolean;'); AddFunction(@KeyIsDirectory, 'function KeyIsDirectory(KeyName: String): Boolean;'); AddFunction(@GetSettingValue, 'function GetSettingValue(KeyName: String): String;'); AddFunction(@GetSettingValueDef, 'function GetSettingValueDef(KeyName, defVal: String): String;'); +AddFunction(@SetSettingValue,'function SetSettingValue(KeyName,value : string) : boolean;'); AddFunction(@ListSettings, 'function ListSettings(KeyName: String; var KeyReturn: TStringArray) : boolean;'); AddFunction(@DeleteSetting, 'function DeleteSetting(KeyName: String): Boolean;'); AddFunction(@DeleteSubSettings, 'function DeleteSubSettings(KeyName: String): Boolean;'); diff --git a/Units/MMLAddon/mmisc.pas b/Units/MMLAddon/mmisc.pas index 6ce81a7..47c2014 100644 --- a/Units/MMLAddon/mmisc.pas +++ b/Units/MMLAddon/mmisc.pas @@ -1,6 +1,6 @@ unit mmisc; -{$mode objfpc} +{$mode objfpc}{$H+} interface diff --git a/Units/MMLAddon/scriptproperties.pas b/Units/MMLAddon/scriptproperties.pas index 9d4db35..848a5a8 100644 --- a/Units/MMLAddon/scriptproperties.pas +++ b/Units/MMLAddon/scriptproperties.pas @@ -1,6 +1,6 @@ unit scriptproperties; -{$mode objfpc} +{$mode objfpc}{$H+} interface diff --git a/Units/MMLAddon/settingssandbox.pas b/Units/MMLAddon/settingssandbox.pas index e2e0355..baff809 100644 --- a/Units/MMLAddon/settingssandbox.pas +++ b/Units/MMLAddon/settingssandbox.pas @@ -22,7 +22,7 @@ } unit settingssandbox; -{$mode objfpc} +{$mode objfpc}{$H+} interface @@ -42,15 +42,14 @@ type public constructor Create(sett: TMMLSettings); destructor Destroy; override; - - function IsKey(KeyName: String): Boolean; - function IsDirectory(KeyName: String): Boolean; - function SetKeyValue(Keyname : string; Value : string) : boolean; - function GetKeyValue(KeyName: String): String; - function GetKeyValueDef(KeyName, defVal: String): String; - function ListKeys(KeyName: String; out Keys : TStringArray): boolean; - function DeleteKey(KeyName: String): Boolean; - function DeleteSubKeys(KeyName: String): Boolean; + function IsKey(const KeyName: String): Boolean; + function IsDirectory(const KeyName: String): Boolean; + function SetKeyValue(const Keyname, Value : string) : boolean; + function GetKeyValue(const KeyName: String): String; + function GetKeyValueDef(const KeyName, defVal: String): String; + function ListKeys(const KeyName: String; out Keys : TStringArray): boolean; + function DeleteKey(const KeyName: String): Boolean; + function DeleteSubKeys(const KeyName: String): Boolean; property prefix : string read GetPrefix write SetPrefix; end; @@ -80,45 +79,43 @@ begin FPrefix := s; end; -function TMMLSettingsSandbox.ListKeys(KeyName: String; out Keys :TStringArray): boolean; +function TMMLSettingsSandbox.ListKeys(const KeyName: String; out Keys :TStringArray): boolean; begin exit(ST.ListKeys(Prefix + KeyName,keys)) end; -function TMMLSettingsSandbox.GetKeyValue(KeyName: String): String; +function TMMLSettingsSandbox.GetKeyValue(const KeyName: String): String; begin exit(ST.GetKeyValue(Prefix + KeyName)) end; -function TMMLSettingsSandbox.GetKeyValueDef(KeyName, defVal: String): String; +function TMMLSettingsSandbox.GetKeyValueDef(const KeyName, defVal: String): String; begin exit(ST.GetKeyValueDef(Prefix + KeyName, defVal)) end; -function TMMLSettingsSandbox.IsKey(KeyName: String): Boolean; +function TMMLSettingsSandbox.IsKey(const KeyName: String): Boolean; begin exit(ST.IsKey(Prefix + KeyName)) end; -function TMMLSettingsSandbox.IsDirectory(KeyName: String): Boolean; +function TMMLSettingsSandbox.IsDirectory(const KeyName: String): Boolean; begin exit(ST.IsDirectory(Prefix + KeyName)) end; -function TMMLSettingsSandbox.SetKeyValue(Keyname: string; Value: string +function TMMLSettingsSandbox.SetKeyValue(const Keyname,Value: string ): boolean; begin - Writeln(KeyName); - Writeln(Value); exit(ST.SetKeyValue(prefix + keyname,value,true)); end; -function TMMLSettingsSandbox.DeleteKey(KeyName: String): Boolean; +function TMMLSettingsSandbox.DeleteKey(const KeyName: String): Boolean; begin exit(ST.DeleteKey(Prefix + KeyName)); end; -function TMMLSettingsSandbox.DeleteSubKeys(KeyName: String): Boolean; +function TMMLSettingsSandbox.DeleteSubKeys(const KeyName: String): Boolean; begin exit(ST.DeleteSubKeys(Prefix + KeyName)); end; diff --git a/Units/MMLAddon/stringutil.pas b/Units/MMLAddon/stringutil.pas index 4a22a96..ae1d92e 100644 --- a/Units/MMLAddon/stringutil.pas +++ b/Units/MMLAddon/stringutil.pas @@ -1,6 +1,6 @@ unit stringutil; -{$mode objfpc} +{$mode objfpc}{$H+} interface diff --git a/Units/MMLCore/client.pas b/Units/MMLCore/client.pas index d478f3e..00ac269 100644 --- a/Units/MMLCore/client.pas +++ b/Units/MMLCore/client.pas @@ -60,13 +60,9 @@ implementation procedure TClient.WriteLn(s: string); begin - if self <> nil then - begin; - if Assigned(WritelnProc) then - WritelnProc(s) - else - mDebugLn(s); - end else + if (self <> nil) and Assigned(WritelnProc) then + WritelnProc(s) + else mDebugLn(s); end; diff --git a/Units/MMLCore/dtm.pas b/Units/MMLCore/dtm.pas index 7630a8a..0c15f02 100644 --- a/Units/MMLCore/dtm.pas +++ b/Units/MMLCore/dtm.pas @@ -32,46 +32,19 @@ uses type TMDTM = class(TObject) - - private - - - public - function AddDTM(d: TDTM): Integer; - function AddpDTM(d: pDTM): Integer; - function GetDTM(index: Integer; out dtm: pDTM): Boolean; - procedure FreeDTM(DTM: Integer); - function StringToDTM(S: String): pDTM; - function SetDTMName(DTM: Integer; S: String): boolean; - - - { function FindDTM(DTM: Integer; out x, y: Integer; x1, y1, x2, - y2: Integer): Boolean; - function FindDTMs(DTM: Integer; out Points: TPointArray; x1, y1, x2, - y2: Integer): Boolean; - function FindDTMRotated(DTM: Integer; out x, y: Integer; x1, y1, x2, - y2: Integer; sAngle, eAngle, aStep: Extended; - out aFound: Extended): Boolean; - function FindDTMsRotated(DTM: Integer; out Points: TPointArray; x1, - y1, x2, y2: Integer; sAngle, eAngle, - aStep: Extended; out aFound: T2DExtendedArray) - : Boolean; - function pFindDTM(DTM: pDTM; out x, y: Integer; x1, y1, x2, y2: - Integer): Boolean; - function pFindDTMRotated(DTM: pDTM; out x, y: Integer; x1, y1, x2, - y2: Integer; sAngle, eAngle, aStep: Extended; - out aFound: Extended): Boolean; - function pFindDTMsRotated(DTM: pDTM; out Points: TPointArray; x1, - y1, x2, y2: Integer; sAngle, eAngle, - aStep: Extended; out aFound: T2DExtendedArray) - : Boolean; - } - constructor Create(Owner: TObject); - destructor Destroy; override; private - Client: TObject; - DTMList: Array Of pDTM; - FreeSpots: Array Of Integer; + Client: TObject; + DTMList: Array Of pDTM; + FreeSpots: Array Of Integer; + public + function AddDTM(const d: TDTM): Integer; + function AddpDTM(const d: pDTM): Integer; + function GetDTM(index: Integer; out dtm: pDTM): Boolean; + procedure FreeDTM(DTM: Integer); + function StringToDTM(const S: String): pDTM; + function SetDTMName(DTM: Integer;const S: String): boolean; + constructor Create(Owner: TObject); + destructor Destroy; override; end; implementation @@ -125,27 +98,20 @@ begin inherited Destroy; end; -{Function AreaShape(Color, Tolerance, Size, Shape: Integer; P: TPoint) : Boolean; inline; - -Begin - -End;} - // Rotates the given point (p) by A (in radians) around the point defined by cx, cy. -function RotatePoint(p: TPoint; angle, mx, my: Extended): TPoint; inline; - +function RotatePoint(const p: TPoint;const angle, mx, my: Extended): TPoint; inline; begin Result.X := Round(mx + cos(angle) * (p.x - mx) - sin(angle) * (p.y - my)); Result.Y := Round(my + sin(angle) * (p.x - mx) + cos(angle) * (p.y- my)); end; -function HexToInt(HexNum: string): LongInt;inline; +function HexToInt(const HexNum: string): LongInt;inline; begin Result:=StrToInt('$' + HexNum); end; -function TMDTM.StringToDTM(S: String): pDTM; +function TMDTM.StringToDTM(const S: String): pDTM; var b: PBufferByteArray; Source : String; @@ -192,7 +158,7 @@ begin result.l := length(result.p); end; -function TMDTM.AddDTM(d: TDTM): Integer; +function TMDTM.AddDTM(const d: TDTM): Integer; begin if Length(FreeSpots) > 0 then @@ -213,7 +179,7 @@ end; Adds the given pDTM to the DTM Array, and returns it's index. /\} -function TMDTM.AddpDTM(d: pDTM): Integer; +function TMDTM.AddpDTM(const d: pDTM): Integer; begin if Length(FreeSpots) > 0 then @@ -250,7 +216,7 @@ begin end end; -function TMDTM.SetDTMName(DTM: Integer; s: string): boolean; +function TMDTM.SetDTMName(DTM: Integer;const s: string): boolean; begin try DTMList[DTM].n:= s; @@ -284,62 +250,6 @@ begin FreeSpots[High(FreeSpots)] := DTM; end; - -{ - Tries to find the given DTM (index). If found will put the point the dtm has - been found at in x, y and result to true. -} -{function TMDTM.FindDTM(DTM: Integer; out x, y: Integer; x1, y1, x2, y2: Integer): Boolean; -var - temp: pDTM; -begin - if GetDTM(DTM, temp) then - Result := pFindDTM(temp, x, y, x1, y1, x2, y2) - else - begin - x := 0; - y := 0; - Result := False; - end; -end; } - -{ - Tries to find the given pDTM. If found will put the point the dtm has - been found at in x, y and result to true. -} - -{function TMDTM.pFindDTM(DTM: pDTM; out x, y: Integer; x1, y1, x2, y2: Integer): Boolean; - - -begin - -end; } - -{/\ - Tries to find the given DTM (index). Will return true if it has found one or more - DTM's. All the occurances are stored in the Points (TPointArray) -/\} - -{function TMDTM.FindDTMs(DTM: Integer; out Points: TPointArray; x1, y1, x2, y2: Integer): Boolean; -Var - temp: pDTM; -Begin - If GetDTM(DTM, temp) Then - Result := pFindDTMs(temp, Points, x1, y1, x2, y2) - Else - Begin - SetLength(Points, 0); - Result := False; - End; -End; } - -{/\ - Tries to find the given pDTM. Will return true if it has found one or more - DTM's. All the occurances are stored in the Points (TPointArray) -/\} - - - {wat} // Then, first find all occurances of all colours on the given client. // Each point has a colour, and we call them C_0...C_n. @@ -427,12 +337,5 @@ End; } Returns all Angles in a Two Dimensional Extended array. /\} -{Function TMDTM.pFindDTMsRotated(DTM: pDTM; out Points: TPointArray; x1, y1, x2, y2: Integer; sAngle, eAngle, aStep: Extended; out aFound: T2DExtendedArray): Boolean; - -Begin - // Don't forget to pre calculate the rotated points at the start. - // Saves a lot of rotatepoint() calls. -End; } - end. diff --git a/Units/MMLCore/dtmutil.pas b/Units/MMLCore/dtmutil.pas index 11cb4e4..6e6b990 100644 --- a/Units/MMLCore/dtmutil.pas +++ b/Units/MMLCore/dtmutil.pas @@ -33,13 +33,13 @@ uses Function pDTMToTDTM(Const DTM: pDTM): TDTM; Function tDTMTopDTM(Const DTM: TDTM): pDTM; -Procedure PrintpDTM(aDTM : pDTM); +Procedure PrintpDTM(const aDTM : pDTM); procedure initdtm(out d: pdtm; len: integer); function ValidMainPointBox(var dtm: pDTM; const x1, y1, x2, y2: Integer): TBox; -Function ValidMainPointBoxRotated(var dtm: pDTM; const x1, y1, x2, y2: Integer; +Function ValidMainPointBoxRotated(var dtm: pDTM; const x1, y1, x2, y2: Integer;const sAngle, eAngle, aStep: Extended): TBox; -function DTMConsistent(var dtm: pdtm): boolean; +function DTMConsistent(const dtm: pdtm): boolean; procedure NormalizeDTM(var dtm: pdtm); function RotateDTM(const dtm: pdtm; angle: extended) : pdtm; function copydtm(const dtm: pdtm): pdtm; @@ -99,7 +99,7 @@ begin d.bp[i] := False; end; -Procedure PrintpDTM(aDTM : pDTM); +Procedure PrintpDTM(const aDTM : pDTM); var i : integer; begin; @@ -185,7 +185,7 @@ Begin End; { TODO: Check if bounds are correct? } -function DTMConsistent(var dtm: pdtm): boolean; +function DTMConsistent(const dtm: pdtm): boolean; var i: integer; begin @@ -257,7 +257,7 @@ begin end; Function ValidMainPointBoxRotated(var dtm: pDTM; const x1, y1, x2, y2: Integer; - sAngle, eAngle, aStep: Extended): TBox; + const sAngle, eAngle, aStep: Extended): TBox; var i: Integer; diff --git a/Units/MMLCore/finder.pas b/Units/MMLCore/finder.pas index 31ecc33..c0e5bdd 100644 --- a/Units/MMLCore/finder.pas +++ b/Units/MMLCore/finder.pas @@ -30,7 +30,7 @@ interface {$define CheckAllBackground}//Undefine this to only check the first white point against the background (in masks). uses - Classes, SysUtils,bitmaps,MufasaBase, MufasaTypes; // Types + colour_conv, Classes, SysUtils,bitmaps,MufasaBase, MufasaTypes; // Types { TMFinder Class } @@ -42,69 +42,66 @@ uses } type - TMFinder = class(TObject) - constructor Create(aClient: TObject); - destructor Destroy; override; - private + TMFinder = class(TObject) + private + Client: TObject; + Percentage : array[0..255] of Extended; //We store all the possible RGB / 255 divisions. + CachedWidth, CachedHeight : integer; + ClientTPA : TPointArray; + hueMod, satMod: Extended; + CTS: Integer; + Procedure UpdateCachedValues(NewWidth,NewHeight : integer); + procedure DefaultOperations(var xs,ys,xe,ye : integer); + //Loads the Spiral into ClientTPA (Will not cause problems) + procedure LoadSpiralPath(startX, startY, x1, y1, x2, y2: Integer); + public + WarnOnly : boolean; + function FindColorsToleranceOptimised(out Points: TPointArray; Color,xs, ys, xe, ye, Tol: Integer): Boolean; + function FindColorToleranceOptimised(out x, y: Integer; Color, xs, ys,xe, ye, tol: Integer): Boolean; + function CountColorTolerance(Color, xs, ys, xe, ye, Tolerance: Integer): Integer; + function CountColor(Color, xs, ys, xe, ye: Integer): Integer; + function SimilarColors(Color1,Color2,Tolerance : Integer) : boolean; + // Possibly turn x, y into a TPoint var. + function FindColor(out x, y: Integer; Color, xs, ys, xe, ye: Integer): Boolean; + function FindColorSpiral(var x, y: Integer; color, xs, ys, xe, ye: Integer): Boolean; + function FindColorSpiralTolerance(var x, y: Integer; color, xs, ys, xe, ye,Tol: Integer): Boolean; + function FindColorTolerance(out x, y: Integer; Color, xs, ys, xe, ye, tol: Integer): Boolean; + function FindColorsTolerance(out Points: TPointArray; Color, xs, ys, xe, ye, Tol: Integer): Boolean; + function FindColorsSpiralTolerance(x, y: Integer; out Points: TPointArray; color, xs, ys, xe, ye: Integer; Tolerance: Integer) : boolean; + function FindColors(out TPA: TPointArray; Color, xs, ys, xe, ye: Integer): Boolean; + function FindColoredArea(var x, y: Integer; color, xs, ys, xe, ye: Integer; MinArea: Integer): Boolean; + function FindColoredAreaTolerance(var x, y: Integer; color, xs, ys, xe, ye: Integer; MinArea, tol: Integer): Boolean; + //Mask + function FindMaskTolerance(const mask: TMask; out x, y: Integer; xs, ys, xe, ye: Integer; Tolerance, ContourTolerance: Integer): Boolean; + procedure CheckMask(const Mask : TMask); + //Bitmap functions + function FindBitmap(bitmap: TMufasaBitmap; out x, y: Integer): Boolean; + function FindBitmapIn(bitmap: TMufasaBitmap; out x, y: Integer; xs, ys, xe, ye: Integer): Boolean; + function FindBitmapToleranceIn(bitmap: TMufasaBitmap; out x, y: Integer; xs, ys, xe, ye: Integer; tolerance: Integer): Boolean; + function FindBitmapSpiral(bitmap: TMufasaBitmap; var x, y: Integer; xs, ys, xe, ye: Integer): Boolean; + function FindBitmapSpiralTolerance(bitmap: TMufasaBitmap; var x, y: Integer; xs, ys, xe, ye,tolerance : integer): Boolean; + function FindBitmapsSpiralTolerance(bitmap: TMufasaBitmap; x, y: Integer; out Points : TPointArray; xs, ys, xe, ye,tolerance: Integer): Boolean; + function FindDeformedBitmapToleranceIn(bitmap: TMufasaBitmap; out x, y: Integer; xs, ys, xe, ye: Integer; tolerance: Integer; Range: Integer; AllowPartialAccuracy: Boolean; out accuracy: Extended): Boolean; - Procedure UpdateCachedValues(NewWidth,NewHeight : integer); - procedure DefaultOperations(var xs,ys,xe,ye : integer); - //Loads the Spiral into ClientTPA (Will not cause problems) - procedure LoadSpiralPath(startX, startY, x1, y1, x2, y2: Integer); - public - function FindColorsToleranceOptimised(out Points: TPointArray; Color, - xs, ys, xe, ye, Tol: Integer): Boolean; - function FindColorToleranceOptimised(out x, y: Integer; Color, xs, ys, - xe, ye, tol: Integer): Boolean; - function CountColorTolerance(Color, xs, ys, xe, ye, Tolerance: Integer): Integer; - function CountColor(Color, xs, ys, xe, ye: Integer): Integer; - function SimilarColors(Color1,Color2,Tolerance : Integer) : boolean; - // Possibly turn x, y into a TPoint var. - function FindColor(out x, y: Integer; Color, xs, ys, xe, ye: Integer): Boolean; - function FindColorSpiral(var x, y: Integer; color, xs, ys, xe, ye: Integer): Boolean; - function FindColorSpiralTolerance(var x, y: Integer; color, xs, ys, xe, ye,Tol: Integer): Boolean; - function FindColorTolerance(out x, y: Integer; Color, xs, ys, xe, ye, tol: Integer): Boolean; - function FindColorsTolerance(out Points: TPointArray; Color, xs, ys, xe, ye, Tol: Integer): Boolean; - function FindColorsSpiralTolerance(x, y: Integer; out Points: TPointArray; color, xs, ys, xe, ye: Integer; Tolerance: Integer) : boolean; - function FindColors(out TPA: TPointArray; Color, xs, ys, xe, ye: Integer): Boolean; - function FindColoredArea(var x, y: Integer; color, xs, ys, xe, ye: Integer; MinArea: Integer): Boolean; - function FindColoredAreaTolerance(var x, y: Integer; color, xs, ys, xe, ye: Integer; MinArea, tol: Integer): Boolean; - //Mask - function FindMaskTolerance(mask: TMask; out x, y: Integer; xs, ys, xe, ye: Integer; Tolerance, ContourTolerance: Integer): Boolean; - procedure CheckMask(Mask : TMask); - //Bitmap functions - function FindBitmap(bitmap: TMufasaBitmap; out x, y: Integer): Boolean; - function FindBitmapIn(bitmap: TMufasaBitmap; out x, y: Integer; xs, ys, xe, ye: Integer): Boolean; - function FindBitmapToleranceIn(bitmap: TMufasaBitmap; out x, y: Integer; xs, ys, xe, ye: Integer; tolerance: Integer): Boolean; - function FindBitmapSpiral(bitmap: TMufasaBitmap; var x, y: Integer; xs, ys, xe, ye: Integer): Boolean; - function FindBitmapSpiralTolerance(bitmap: TMufasaBitmap; var x, y: Integer; xs, ys, xe, ye,tolerance : integer): Boolean; - function FindBitmapsSpiralTolerance(bitmap: TMufasaBitmap; x, y: Integer; out Points : TPointArray; xs, ys, xe, ye,tolerance: Integer): Boolean; - function FindDeformedBitmapToleranceIn(bitmap: TMufasaBitmap; out x, y: Integer; xs, ys, xe, ye: Integer; tolerance: Integer; Range: Integer; AllowPartialAccuracy: Boolean; out accuracy: Extended): Boolean; - - function FindDTM(DTM: pDTM; out x, y: Integer; x1, y1, x2, y2: Integer): Boolean; - function FindDTMs(DTM: pDTM; out Points: TPointArray; x1, y1, x2, y2, maxToFind: Integer): Boolean; - function FindDTMRotated(DTM: pDTM; out x, y: Integer; x1, y1, x2, y2: Integer; sAngle, eAngle, aStep: Extended; out aFound: Extended; Alternating : boolean): Boolean; - function FindDTMsRotated(_DTM: pDTM; out Points: TPointArray; x1, y1, x2, y2: Integer; sAngle, eAngle, aStep: Extended; out aFound: T2DExtendedArray; maxToFind: Integer; Alternating : boolean): Boolean; - //Donno - function GetColors(Coords: TPointArray): TIntegerArray; - // tol speeds - procedure SetToleranceSpeed(nCTS: Integer); - function GetToleranceSpeed: Integer; - procedure SetToleranceSpeed2Modifiers(nHue, nSat: Extended); - procedure GetToleranceSpeed2Modifiers(out hMod, sMod: Extended); - protected - Client: TObject; - Percentage : array[0..255] of Extended; //We store all the possible RGB / 255 divisions. - CachedWidth, CachedHeight : integer; - ClientTPA : TPointArray; - hueMod, satMod: Extended; - CTS: Integer; - end; + function FindDTM(const DTM: pDTM; out x, y: Integer; x1, y1, x2, y2: Integer): Boolean; + function FindDTMs(DTM: pDTM; out Points: TPointArray; x1, y1, x2, y2, maxToFind: Integer): Boolean; + function FindDTMRotated(const DTM: pDTM; out x, y: Integer; x1, y1, x2, y2: Integer; sAngle, eAngle, aStep: Extended; out aFound: Extended; Alternating : boolean): Boolean; + function FindDTMsRotated(DTM: pDTM; out Points: TPointArray; x1, y1, x2, y2: Integer; sAngle, eAngle, aStep: Extended; out aFound: T2DExtendedArray; maxToFind: Integer; Alternating : boolean): Boolean; + //Donno + function GetColors(const Coords: TPointArray): TIntegerArray; + // tol speeds + procedure SetToleranceSpeed(nCTS: Integer); + function GetToleranceSpeed: Integer; + procedure SetToleranceSpeed2Modifiers(const nHue, nSat: Extended); + procedure GetToleranceSpeed2Modifiers(out hMod, sMod: Extended); + constructor Create(aClient: TObject); + destructor Destroy; override; + end; implementation uses - colour_conv,// For RGBToColor, etc. +// colour_conv,// For RGBToColor, etc. Client, // For the Client Casts. math, //min/max tpa, //TPABounds @@ -254,6 +251,7 @@ var begin inherited Create; + WarnOnly := False; Self.Client := aClient; Self.CTS := 1; Self.hueMod := 0.2; @@ -281,7 +279,7 @@ begin Result := Self.CTS; end; -procedure TMFinder.SetToleranceSpeed2Modifiers(nHue, nSat: Extended); +procedure TMFinder.SetToleranceSpeed2Modifiers(const nHue, nSat: Extended); begin Self.hueMod := nHue; Self.satMod := nSat; @@ -338,34 +336,64 @@ begin SetLength(ClientTPA,NewWidth * NewHeight); end; +procedure Swap(var A,B : integer); +var + c : integer; +begin + c := a; + a := b; + b := c; +end; + procedure TMFinder.DefaultOperations(var xs, ys, xe, ye: integer); var w,h : integer; begin - if xs > xe then - raise Exception.CreateFMT('Finder function: Xs > xe (%d,%d)',[xs,xe]); + if (xs > xe) then + if WarnOnly then + begin + TClient(Client).WriteLn(Format('Warning! You passed wrong values to a finder function: xs > xe (%d,%d). Swapping the values for now.',[xs,xe])); + swap(xs,xe); + end else + raise Exception.CreateFMT('You passed wrong values to a finder function: xs > xe (%d,%d).',[xs,xe]); if ys > ye then - raise Exception.CreateFMT('Finder function: Ys > ye (%d,%d)',[ys,ye]); + if WarnOnly then + begin + TClient(Client).WriteLn(Format('Warning! You passed wrong values to a finder function: ys > ye (%d,%d). Swapping the values for now.',[ys,ye])); + swap(ys,ye); + end else + raise Exception.CreateFMT('You passed wrong values to a finder function: ys > ye (%d,%d).',[ys,ye]); if xs < 0 then - // xs := 0; - raise Exception.createFMT('Any Find Function, you did not pass a ' + - 'correct xs: %d.', [xs]); + if WarnOnly then + begin + TClient(Client).WriteLn(Format('Warning! You passed a wrong xs to a finder function: %d. That is below 0, thus out of bounds. Setting the value to 0 for now.',[xs])); + xs := 0; + end else + raise Exception.createFMT('You passed a wrong xs to a finder function: %d. That is below 0, thus out of bounds.',[xs]); if ys < 0 then -// ys := 0; - raise Exception.createFMT('Any Find Function, you did not pass a ' + - 'correct ys: %d.', [ys]); - + if WarnOnly then + begin + TClient(Client).WriteLn(Format('Warning! You passed a wrong ys to a finder function: %d. That is below 0, thus out of bounds. Setting the value to 0 for now.',[ys])); + ys := 0; + end else + raise Exception.createFMT('You passed a wrong ys to a finder function: %d. That is below 0, thus out of bounds.',[ys]); TClient(Self.Client).IOManager.GetDimensions(w,h); if (w <> CachedWidth) or (h <> CachedHeight) then UpdateCachedValues(w,h); if xe >= w then -// xe := w-1; - raise Exception.createFMT('Any Find Function, you did not pass a ' + - 'correct xe: %d.', [xe]); + if WarnOnly then + begin + TClient(Client).WriteLn(Format('Warning! You passed a wrong xe to a finder function: %d. The client has a width of %d, thus the xe is out of bounds. Setting the value to %d (w-1) for now.',[xe,w,w-1])); + xe := w-1; + end else + raise Exception.createFMT('You passed a wrong xe to a finder function: %d. The client has a width of %d, thus the xe is out of bounds.',[xe,w]); if ye >= h then -// ye := h-1; - raise Exception.createFMT('Any Find Function, you did not pass a ' + - 'correct ye: %d.', [ye]); + if WarnOnly then + begin + TClient(Client).WriteLn(Format('Warning! You passed a wrong ye to a finder function: %d. The client has a height of %d, thus the ye is out of bounds. Setting the value to %d (h-1) for now.',[ye,h,h-1])); + ye := h-1; + end else + raise Exception.createFMT('You passed a wrong ye to a finder function: %d. The client has a height of %d, thus the ye is out of bounds.',[ye,h]); end; function TMFinder.CountColorTolerance(Color, xs, ys, xe, ye, Tolerance: Integer): Integer; @@ -1181,6 +1209,7 @@ begin //Finally lets test H2 if Abs(H2 - H1) > HueTol then continue; + //We survived the checks, this point is a match! hit: ClientTPA[c].x := xx; ClientTPA[c].y := yy; @@ -1323,7 +1352,7 @@ end; { Only works with CTS 1 for now.. Since Colorsame doesn't return a boolean :-( } //We do not check whether every white pixel is in tol range with every other white pixel.. -function TMFinder.FindMaskTolerance(mask: TMask; out x, y: Integer; xs, +function TMFinder.FindMaskTolerance(const mask: TMask; out x, y: Integer; xs, ys, xe, ye: Integer; Tolerance, ContourTolerance: Integer): Boolean; var MainRowdata : TPRGB32Array; @@ -1400,7 +1429,7 @@ begin TClient(Client).IOManager.FreeReturnData; end; -procedure TMFinder.CheckMask(Mask: TMask); +procedure TMFinder.CheckMask(const Mask: TMask); begin if (Mask.W < 1) or (Mask.H < 1) or (Mask.WhiteHi < 0) or (Mask.BlackHi < 0) then raise exception.CreateFMT('Mask is invalid. Width/Height: (%d,%d). WhiteHi/BlackHi: (%d,%d)',[Mask.W,Mask.H,Mask.WhiteHi,Mask.BlackHi]); @@ -1875,8 +1904,12 @@ begin end; end; -function TMFinder.FindDTM(DTM: pDTM; out x, y: Integer; x1, y1, x2, y2: Integer): Boolean; +{ + Tries to find the given DTM. If found will put the point the dtm has + been found at in x, y and result to true. +} +function TMFinder.FindDTM(const DTM: pDTM; out x, y: Integer; x1, y1, x2, y2: Integer): Boolean; var P: TPointArray; begin @@ -2048,7 +2081,7 @@ begin Result := (pc > 0); end; -function TMFinder.FindDTMRotated(DTM: pDTM; out x, y: Integer; x1, y1, x2, y2: Integer; sAngle, eAngle, aStep: Extended; out aFound: Extended; Alternating : boolean): Boolean; +function TMFinder.FindDTMRotated(const DTM: pDTM; out x, y: Integer; x1, y1, x2, y2: Integer; sAngle, eAngle, aStep: Extended; out aFound: Extended; Alternating : boolean): Boolean; var P: TPointArray; @@ -2063,9 +2096,9 @@ begin Exit(True); end; -function TMFinder.FindDTMsRotated(_DTM: pDTM; out Points: TPointArray; x1, y1, x2, y2: Integer; sAngle, eAngle, aStep: Extended; out aFound: T2DExtendedArray; maxToFind: Integer; Alternating : boolean): Boolean; +function TMFinder.FindDTMsRotated(DTM: pDTM; out Points: TPointArray; x1, y1, x2, y2: Integer; sAngle, eAngle, aStep: Extended; out aFound: T2DExtendedArray; maxToFind: Integer; Alternating : boolean): Boolean; var - DTM: pDTM; + DTMRot: pDTM; // Colours of DTMs clR,clG,clB : array of byte; @@ -2113,17 +2146,17 @@ var begin // Is the area valid? DefaultOperations(x1, y1, x2, y2); - if not DTMConsistent(_dtm) then + if not DTMConsistent(DTM) then begin - raise Exception.CreateFmt('FindDTMsRotated: DTM is not consistent.', []); + raise Exception.CreateFmt('FindDTMsRotated: DTMRot is not consistent.', []); Exit; end; - NormalizeDTM(_dtm); + NormalizeDTM(DTM); - setlength(goodPoints, _dtm.l); - for i := 0 to _dtm.l - 1 do - goodPoints[i] := not _dtm.bp[i]; + setlength(goodPoints, DTM.l); + for i := 0 to DTM.l - 1 do + goodPoints[i] := not DTM.bp[i]; // Init data structure B. W := x2 - x1; @@ -2139,18 +2172,18 @@ begin end; // Convert colors to there components - SetLength(clR,_dtm.l); - SetLength(clG,_dtm.l); - SetLength(clB,_dtm.l); - for i := 0 to _dtm.l - 1 do - ColorToRGB(_dtm.c[i],clR[i],clG[i],clB[i]); + SetLength(clR,DTM.l); + SetLength(clG,DTM.l); + SetLength(clB,DTM.l); + for i := 0 to DTM.l - 1 do + ColorToRGB(DTM.c[i],clR[i],clG[i],clB[i]); //Compiler hints - SetLength(hh,_dtm.l); - SetLength(ss,_dtm.l); - SetLength(ll,_dtm.l); - for i := 0 to _DTM.l - 1 do - ColorToHSL(_dtm.c[i],hh[i],ss[i],ll[i]); + SetLength(hh,DTM.l); + SetLength(ss,DTM.l); + SetLength(ll,DTM.l); + for i := 0 to DTM.l - 1 do + ColorToHSL(DTM.c[i],hh[i],ss[i],ll[i]); GetToleranceSpeed2Modifiers(hMod, sMod); ccts := CTS; @@ -2170,9 +2203,9 @@ begin s := sAngle; while s < eAngle do begin - dtm := RotateDTM(_dtm, s); - //Rotate the DTM, the rest is just like FindDTMs - MA := ValidMainPointBox(DTM, x1, y1, x2, y2); + DTMRot := RotateDTM(DTM, s); + //Rotate the DTMRot, the rest is just like FindDTMs + MA := ValidMainPointBox(DTMRot, x1, y1, x2, y2); //CD starts at 0,0.. We must adjust the MA, since this is still based on the xs,ys,xe,ye box. MA.x1 := MA.x1 - x1; MA.y1 := MA.y1 - y1; @@ -2183,14 +2216,14 @@ begin for xx := MA.x1 to MA.x2 do begin //Mainpoint can have area size as well, so we must check that just like any subpoint. - for i := 0 to dtm.l - 1 do + for i := 0 to DTMRot.l - 1 do begin //change to use other areashapes too. Found := false; //With area it can go out of bounds, therefore this max/min check - StartX := max(0,xx - dtm.asz[i] + dtm.p[i].x); - StartY := max(0,yy - dtm.asz[i] + dtm.p[i].y); - EndX := Min(Ma.x2,xx + dtm.asz[i] + dtm.p[i].x); - EndY := Min(ma.y2,yy + dtm.asz[i] + dtm.p[i].y); + StartX := max(0,xx - DTMRot.asz[i] + DTMRot.p[i].x); + StartY := max(0,yy - DTMRot.asz[i] + DTMRot.p[i].y); + EndX := Min(Ma.x2,xx + DTMRot.asz[i] + DTMRot.p[i].x); + EndY := Min(ma.y2,yy + DTMRot.asz[i] + DTMRot.p[i].y); for xxx := StartX to EndX do //The search area for the subpoint begin for yyy := StartY to EndY do @@ -2201,7 +2234,7 @@ begin // Checking point i now. (Store that we matched it) ch[xxx][yyy]:= ch[xxx][yyy] or (1 shl i); - if ColorSame(ccts,dtm.t[i],clR[i],clG[i],clB[i],cd[yyy][xxx].R, cd[yyy][xxx].G, cd[yyy][xxx].B,hh[i],ss[i],ll[i],hmod,smod) then + if ColorSame(ccts,DTMRot.t[i],clR[i],clG[i],clB[i],cd[yyy][xxx].R, cd[yyy][xxx].G, cd[yyy][xxx].B,hh[i],ss[i],ll[i],hmod,smod) then b[xxx][yyy] := b[xxx][yyy] or (1 shl i); end; @@ -2252,7 +2285,7 @@ begin // raise Exception.CreateFmt('Not done yet!', []); end; -function TMFinder.GetColors(Coords: TPointArray): TIntegerArray; +function TMFinder.GetColors(const Coords: TPointArray): TIntegerArray; var Box : TBox; Len, I,w,h : integer; diff --git a/Units/MMLCore/libloader.pas b/Units/MMLCore/libloader.pas index e8e15e3..1220a5f 100644 --- a/Units/MMLCore/libloader.pas +++ b/Units/MMLCore/libloader.pas @@ -1,6 +1,6 @@ unit libloader; -{$mode objfpc} +{$mode objfpc}{$H+} interface diff --git a/Units/MMLCore/mufasabase.pas b/Units/MMLCore/mufasabase.pas index b74d29f..a7a7bce 100644 --- a/Units/MMLCore/mufasabase.pas +++ b/Units/MMLCore/mufasabase.pas @@ -1,6 +1,6 @@ unit mufasabase; -{$mode objfpc} +{$mode objfpc}{$H+} interface {$undefine mDebug} From 1b44904328c4fe82d2a7cbece97228233e6ebaf6 Mon Sep 17 00:00:00 2001 From: Niels Date: Fri, 2 Apr 2010 21:34:09 +0200 Subject: [PATCH 08/22] Made code insight recognize function/constructor types in objects. --- Units/Misc/v_ideCodeInsight.pas | 17 ++++++++++++++--- Units/Misc/v_ideCodeParser.pas | 6 +++++- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/Units/Misc/v_ideCodeInsight.pas b/Units/Misc/v_ideCodeInsight.pas index 712c0e3..37be128 100644 --- a/Units/Misc/v_ideCodeInsight.pas +++ b/Units/Misc/v_ideCodeInsight.pas @@ -888,7 +888,7 @@ begin inherited Create; Proposal_InsertList := TStringList.Create; - //TStringList(Proposal_InsertList).Sorted := True; + TStringList(Proposal_InsertList).Sorted := True; Proposal_ItemList := TStringList.Create; fOnFindInclude := nil; @@ -1015,6 +1015,11 @@ procedure TCodeInsight.Proposal_AddDeclaration(Item: TDeclaration; ItemList, Ins else if a[ii].HasOwnerClass(TciProcedureDeclaration, d, True) and (d.Owner <> nil) then Continue;} + {$IFDEF ciCHECKDUPLICATES} + if (InsertList.IndexOf(a[ii].ShortText) > -1) then + Continue; + {$ENDIF} + s := FormatFirstColumn('enum') + FormatMainName(a[ii].ShortText); if a[ii].HasOwnerClass(TciTypeDeclaration, d, True) then begin @@ -1047,6 +1052,11 @@ procedure TCodeInsight.Proposal_AddDeclaration(Item: TDeclaration; ItemList, Ins Exit; n := d.ShortText; + {$IFDEF ciCHECKDUPLICATES} + if (InsertList.IndexOf(n) > -1) then + Exit; + {$ENDIF} + s := s + FormatMainName(n); if (Item.Params <> '') then begin @@ -1178,10 +1188,11 @@ begin for i := Low(a) to High(a) do begin n := a[i].ShortText; - (*{$IFDEF ciCHECKDUPLICATES} + + {$IFDEF ciCHECKDUPLICATES} if (InsertList.IndexOf(n) > -1) then Continue; - {$ENDIF}*) + {$ENDIF} s := FirstColumn + FormatMainName(n); if (Item is TciClassProperty) then s := s + FormatMainExtra(PropertyIndex(TciClassProperty(Item))); diff --git a/Units/Misc/v_ideCodeParser.pas b/Units/Misc/v_ideCodeParser.pas index 58f0e8c..026c91a 100644 --- a/Units/Misc/v_ideCodeParser.pas +++ b/Units/Misc/v_ideCodeParser.pas @@ -695,7 +695,11 @@ begin begin Result := True; if (Return = vbType) then - Decl := b[ii].Owner + //Decl := b[ii].Owner + if (a[ii] is TciProcedureDeclaration) and (LowerCase(TciProcedureDeclaration(a[i]).ProcType) = 'constructor') then + Decl := Self + else + Decl := b[ii].Owner.Items.GetFirstItemOfClass(TciTypeKind) else Decl := b[ii]; Exit; From 87440431fb70e8a28c7eb53ab8fb354ddfa5b68d Mon Sep 17 00:00:00 2001 From: Niels Date: Sat, 3 Apr 2010 09:34:58 +0200 Subject: [PATCH 09/22] Little style fix in code completion. --- Units/Misc/v_ideCodeInsight.pas | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/Units/Misc/v_ideCodeInsight.pas b/Units/Misc/v_ideCodeInsight.pas index 37be128..60302e6 100644 --- a/Units/Misc/v_ideCodeInsight.pas +++ b/Units/Misc/v_ideCodeInsight.pas @@ -985,9 +985,12 @@ procedure TCodeInsight.Proposal_AddDeclaration(Item: TDeclaration; ItemList, Ins begin Result := 'Enumeration'; if (Item.Items.Count > 0) then + begin Result := Result + '(' + Item.Items[0].ShortText; - if (Item.Items.Count > 1) then - Result := Result + '..' + Item.Items[Item.Items.Count - 1].ShortText + ')'; + if (Item.Items.Count > 1) then + Result := Result + '..' + Item.Items[Item.Items.Count - 1].ShortText; + Result := Result + ')'; + end; end; procedure AddEnums(Item: {TCodeInsight}TDeclaration; ItemList, InsertList: TStrings); overload; From b0a64c3331b0d6855dcb2a83db35518ccebf6071 Mon Sep 17 00:00:00 2001 From: Niels Date: Sat, 3 Apr 2010 10:05:59 +0200 Subject: [PATCH 10/22] Changed the way tabs are handled (no more SmartTabs by default). --- Projects/SAMufasaGUI/framescript.pas | 14 +++++++-- Units/Misc/v_ideCodeParser.pas | 47 ---------------------------- 2 files changed, 11 insertions(+), 50 deletions(-) diff --git a/Projects/SAMufasaGUI/framescript.pas b/Projects/SAMufasaGUI/framescript.pas index f816fa3..16abd9c 100644 --- a/Projects/SAMufasaGUI/framescript.pas +++ b/Projects/SAMufasaGUI/framescript.pas @@ -356,7 +356,13 @@ begin try Filter := WordAtCaret(Synedit, sp, ep); Form1.CodeCompletionStart := Point(sp, Synedit.CaretY); - mp.Run(ms, nil, Synedit.SelStart + (ep - Synedit.CaretX) - 1); + + //mp.Run(ms, nil, Synedit.SelStart + (ep - Synedit.CaretX) - 1); + s := SynEdit.Lines[SynEdit.Carety-1]; + if ep > length(s) then //We are outside the real text, go back to the last char + mp.Run(ms, nil, Synedit.SelStart - ep + length(s)) + else + mp.Run(ms, nil, Synedit.SelStart + (ep - Synedit.CaretX) - 1); s := mp.GetExpressionAtPos; if (s <> '') then @@ -602,11 +608,13 @@ begin FScriptState:= ss_None; ScriptErrorLine:= -1; OwnerSheet.Caption:= ScriptName; - SynEdit.Options:= SynEdit.Options- [eoGroupUndo]; - SynEdit.Options:= SynEdit.Options+ [eoGroupUndo,eoPersistentCaret]; + SynEdit.Options:= SynEdit.Options + [eoTabIndent] - [{eoGroupUndo,} eoSmartTabs]; + //SynEdit.Options:= SynEdit.Options + [eoTabIndent]; SynEdit.IncrementColor.Background := $30D070; SynEdit.HighlightAllColor.Background:= clYellow; SynEdit.HighlightAllColor.Foreground:= clDefault; + SynEdit.TabWidth := 2; + SynEdit.BlockIndent := 2; MarkCaret := TSynEditMarkupHighlightAllCaret(SynEdit.MarkupByClass[TSynEditMarkupHighlightAllCaret]); if assigned(MarkCaret) then begin diff --git a/Units/Misc/v_ideCodeParser.pas b/Units/Misc/v_ideCodeParser.pas index 026c91a..9314bd5 100644 --- a/Units/Misc/v_ideCodeParser.pas +++ b/Units/Misc/v_ideCodeParser.pas @@ -120,7 +120,6 @@ type function GetName: TciProcedureName; function GetProcType: string; function GetParams: string; - function GetSynParams: string; function GetShortText: string; override; public @@ -130,7 +129,6 @@ type property Name : TciProcedureName read GetName; property ProcType: string read GetProcType; property Params: string read GetParams; - property SynParams: string read GetSynParams; end; TciUsedUnit = class(TDeclaration); //Included Units @@ -872,51 +870,6 @@ begin end; end; -function TciProcedureDeclaration.GetSynParams: string; -var - i, ii: Integer; - a, b: TDeclarationArray; - d: TDeclaration; - s, t: string; -begin - Result := ''; - if (fSynParams <> '') then - Result := fSynParams - else if (fItems.Count > 0) then - begin - a := GetParamDeclarations; - for i := Low(a) to High(a) do - begin - if (a[i] is TciConstParameter) then - s := 'const ' - else if (a[i] is TciOutParameter) then - s := 'out ' - else if (a[i] is TciInParameter) then - s := 'in ' - else if (a[i] is TciVarParameter) then - s := 'var ' - else - s := ''; - d := a[i].Items.GetFirstItemOfClass(TciParameterType); - if (d <> nil) then - t := ': ' + d.ShortText - else - t := ''; - b := a[i].Items.GetItemsOfClass(TciParameterName); - for ii := Low(b) to High(b) do - begin - if (fSynParams <> '') then - fSynParams := fSynParams + ';","' + s + b[ii].ShortText + t - else - fSynParams := '"' + s + b[ii].ShortText + t; - end; - end; - if (fSynParams <> '') then - fSynParams := fSynParams + '"'; - Result := fSynParams; - end; -end; - function TciProcedureDeclaration.GetShortText: string; begin if (fShortText = '') then From 5ce90afbd6b9611a5c2a71165e54a0c12098fc3a Mon Sep 17 00:00:00 2001 From: Raymond Date: Sat, 3 Apr 2010 14:05:15 +0200 Subject: [PATCH 11/22] Cleaned up a bit, re-arranged some DTM stuff. Speeded FindDTMsRotated up a lil bit.. (Nanosec). Added some 'const' parameters. Fixed a small bug in File saving/opening. --- Projects/SAMufasaGUI/testunit.lfm | 71 +- Projects/SAMufasaGUI/testunit.lrs | 2083 ++++++++++---------- Projects/SAMufasaGUI/testunit.pas | 22 +- Units/MMLAddon/PSInc/Wrappers/dtm.inc | 122 +- Units/MMLAddon/PSInc/psexportedmethods.inc | 57 +- Units/MMLCore/dtm.pas | 102 +- Units/MMLCore/dtmutil.pas | 44 +- Units/MMLCore/finder.pas | 46 +- Units/MMLCore/mufasatypes.pas | 2 +- 9 files changed, 1244 insertions(+), 1305 deletions(-) diff --git a/Projects/SAMufasaGUI/testunit.lfm b/Projects/SAMufasaGUI/testunit.lfm index d128d5a..720d54e 100644 --- a/Projects/SAMufasaGUI/testunit.lfm +++ b/Projects/SAMufasaGUI/testunit.lfm @@ -1,13 +1,13 @@ object Form1: TForm1 - Left = 345 - Height = 555 - Top = 260 - Width = 739 + Left = 423 + Height = 557 + Top = 159 + Width = 666 ActiveControl = ScriptPanel AllowDropFiles = True Caption = 'THA FUKING SIMBA' - ClientHeight = 535 - ClientWidth = 739 + ClientHeight = 537 + ClientWidth = 666 KeyPreview = True Menu = MainMenu OnClose = FormClose @@ -21,7 +21,7 @@ object Form1: TForm1 Left = 0 Height = 24 Top = 0 - Width = 739 + Width = 666 Caption = 'ToolBar1' Images = Mufasa_Image_List ParentShowHint = False @@ -207,9 +207,9 @@ object Form1: TForm1 end object StatusBar: TStatusBar Left = 0 - Height = 22 - Top = 513 - Width = 739 + Height = 23 + Top = 514 + Width = 666 Panels = < item Width = 60 @@ -230,18 +230,21 @@ object Form1: TForm1 object PanelMemo: TPanel Left = 0 Height = 154 - Top = 359 - Width = 739 + Top = 360 + Width = 666 Align = alBottom ClientHeight = 154 - ClientWidth = 739 + ClientWidth = 666 TabOrder = 2 object Memo1: TMemo Left = 1 Height = 152 Top = 1 - Width = 737 + Width = 664 Align = alClient + Font.Height = -13 + Font.Name = 'Courier New' + ParentFont = False ScrollBars = ssAutoBoth TabOrder = 0 end @@ -250,29 +253,29 @@ object Form1: TForm1 Cursor = crVSplit Left = 0 Height = 5 - Top = 354 - Width = 739 + Top = 355 + Width = 666 Align = alBottom ResizeAnchor = akBottom end object ScriptPanel: TPanel Left = 0 - Height = 330 + Height = 331 Top = 24 - Width = 739 + Width = 666 Align = alClient BevelOuter = bvNone - ClientHeight = 330 - ClientWidth = 739 + ClientHeight = 331 + ClientWidth = 666 DockSite = True TabOrder = 4 OnDockDrop = ScriptPanelDockDrop OnDockOver = ScriptPanelDockOver object PageControl1: TPageControl Left = 155 - Height = 295 + Height = 296 Top = 0 - Width = 584 + Width = 511 Align = alClient Images = Mufasa_Image_List PopupMenu = TabPopup @@ -289,12 +292,12 @@ object Form1: TForm1 object SearchPanel: TPanel Left = 0 Height = 35 - Top = 295 - Width = 739 + Top = 296 + Width = 666 Align = alBottom BevelOuter = bvSpace ClientHeight = 35 - ClientWidth = 739 + ClientWidth = 666 TabOrder = 1 Visible = False object SpeedButtonSearch: TSpeedButton @@ -385,7 +388,7 @@ object Form1: TForm1 end object LabeledEditSearch: TLabeledEdit Left = 104 - Height = 23 + Height = 21 Top = 6 Width = 174 EditLabel.AnchorSideLeft.Control = LabeledEditSearch @@ -395,7 +398,7 @@ object Form1: TForm1 EditLabel.AnchorSideBottom.Control = LabeledEditSearch EditLabel.Left = 71 EditLabel.Height = 16 - EditLabel.Top = 9 + EditLabel.Top = 8 EditLabel.Width = 30 EditLabel.Caption = 'Find: ' EditLabel.ParentColor = False @@ -409,9 +412,9 @@ object Form1: TForm1 end object CheckBoxMatchCase: TCheckBox Left = 320 - Height = 19 + Height = 17 Top = 7 - Width = 80 + Width = 72 Caption = 'Match case' OnClick = CheckBoxMatchCaseClick TabOrder = 1 @@ -419,28 +422,28 @@ object Form1: TForm1 end object SplitterFunctionList: TSplitter Left = 150 - Height = 295 + Height = 296 Top = 0 Width = 5 OnCanResize = SplitterFunctionListCanResize Visible = False end inline frmFunctionList: TFunctionListFrame - Height = 295 + Height = 296 Width = 150 - ClientHeight = 295 + ClientHeight = 296 ClientWidth = 150 OnEndDock = nil TabOrder = 3 inherited FunctionList: TTreeView - Height = 252 + Height = 257 Width = 150 OnChange = FunctionListChange OnEnter = FunctionListEnter OnExit = FunctionListExit end inherited editSearchList: TEdit - Top = 272 + Top = 275 Width = 150 OnExit = editSearchListExit OnKeyDown = editSearchListKeyDown diff --git a/Projects/SAMufasaGUI/testunit.lrs b/Projects/SAMufasaGUI/testunit.lrs index c39be0a..e60271b 100644 --- a/Projects/SAMufasaGUI/testunit.lrs +++ b/Projects/SAMufasaGUI/testunit.lrs @@ -1,14 +1,14 @@ { This is an automatically generated lazarus resource file } LazarusResources.Add('TForm1','FORMDATA',[ - 'TPF0'#6'TForm1'#5'Form1'#4'Left'#3'Y'#1#6'Height'#3'+'#2#3'Top'#3#4#1#5'Widt' - +'h'#3#227#2#13'ActiveControl'#7#11'ScriptPanel'#14'AllowDropFiles'#9#7'Capti' - +'on'#6#16'THA FUKING SIMBA'#12'ClientHeight'#3#23#2#11'ClientWidth'#3#227#2 - +#10'KeyPreview'#9#4'Menu'#7#8'MainMenu'#7'OnClose'#7#9'FormClose'#8'OnCreate' - +#7#10'FormCreate'#9'OnDestroy'#7#11'FormDestroy'#11'OnDropFiles'#7#13'FormDr' - +'opFiles'#10'OnShortCut'#7#13'FormShortCuts'#10'LCLVersion'#6#6'0.9.29'#7'Vi' - +'sible'#9#0#8'TToolBar'#8'ToolBar1'#4'Left'#2#0#6'Height'#2#24#3'Top'#2#0#5 - +'Width'#3#227#2#7'Caption'#6#8'ToolBar1'#6'Images'#7#17'Mufasa_Image_List'#14 + 'TPF0'#6'TForm1'#5'Form1'#4'Left'#3#167#1#6'Height'#3'-'#2#3'Top'#3#159#0#5'W' + +'idth'#3#154#2#13'ActiveControl'#7#11'ScriptPanel'#14'AllowDropFiles'#9#7'Ca' + +'ption'#6#16'THA FUKING SIMBA'#12'ClientHeight'#3#25#2#11'ClientWidth'#3#154 + +#2#10'KeyPreview'#9#4'Menu'#7#8'MainMenu'#7'OnClose'#7#9'FormClose'#8'OnCrea' + +'te'#7#10'FormCreate'#9'OnDestroy'#7#11'FormDestroy'#11'OnDropFiles'#7#13'Fo' + +'rmDropFiles'#10'OnShortCut'#7#13'FormShortCuts'#10'LCLVersion'#6#6'0.9.29'#7 + +'Visible'#9#0#8'TToolBar'#8'ToolBar1'#4'Left'#2#0#6'Height'#2#24#3'Top'#2#0#5 + +'Width'#3#154#2#7'Caption'#6#8'ToolBar1'#6'Images'#7#17'Mufasa_Image_List'#14 +'ParentShowHint'#8#8'ShowHint'#9#8'TabOrder'#2#0#0#11'TToolButton'#6'TB_Run' +#4'Left'#3#168#0#4'Hint'#6#3'Run'#3'Top'#2#2#6'Action'#7#15'ActionRunScript' +#10'ImageIndex'#2#6#0#0#11'TToolButton'#8'TB_Pause'#4'Left'#3#191#0#4'Hint'#6 @@ -55,33 +55,34 @@ LazarusResources.Add('TForm1','FORMDATA',[ +#2#3#7'Caption'#6#11'ToolButton9'#5'Style'#7#10'tbsDivider'#0#0#11'TToolButt' +'on'#10'TT_Console'#4'Left'#3#151#1#4'Hint'#6#17'Hide/Show Console'#3'Top'#2 +#2#6'Action'#7#13'ActionConsole'#0#0#0#10'TStatusBar'#9'StatusBar'#4'Left'#2 - +#0#6'Height'#2#22#3'Top'#3#1#2#5'Width'#3#227#2#6'Panels'#14#1#5'Width'#2'<' + +#0#6'Height'#2#23#3'Top'#3#2#2#5'Width'#3#154#2#6'Panels'#14#1#5'Width'#2'<' +#0#1#4'Text'#6#8'MouseBla'#5'Width'#2'd'#0#1#4'Text'#6#8'Untitled'#5'Width'#2 +'d'#0#1#5'Width'#2'2'#0#0#11'SimplePanel'#8#0#0#6'TPanel'#9'PanelMemo'#4'Lef' - +'t'#2#0#6'Height'#3#154#0#3'Top'#3'g'#1#5'Width'#3#227#2#5'Align'#7#8'alBott' - +'om'#12'ClientHeight'#3#154#0#11'ClientWidth'#3#227#2#8'TabOrder'#2#2#0#5'TM' - +'emo'#5'Memo1'#4'Left'#2#1#6'Height'#3#152#0#3'Top'#2#1#5'Width'#3#225#2#5'A' - +'lign'#7#8'alClient'#10'ScrollBars'#7#10'ssAutoBoth'#8'TabOrder'#2#0#0#0#0#9 - +'TSplitter'#19'SplitterMemoSynedit'#6'Cursor'#7#8'crVSplit'#4'Left'#2#0#6'He' - +'ight'#2#5#3'Top'#3'b'#1#5'Width'#3#227#2#5'Align'#7#8'alBottom'#12'ResizeAn' - +'chor'#7#8'akBottom'#0#0#6'TPanel'#11'ScriptPanel'#4'Left'#2#0#6'Height'#3'J' - ,#1#3'Top'#2#24#5'Width'#3#227#2#5'Align'#7#8'alClient'#10'BevelOuter'#7#6'bv' - +'None'#12'ClientHeight'#3'J'#1#11'ClientWidth'#3#227#2#8'DockSite'#9#8'TabOr' - +'der'#2#4#10'OnDockDrop'#7#19'ScriptPanelDockDrop'#10'OnDockOver'#7#19'Scrip' - +'tPanelDockOver'#0#12'TPageControl'#12'PageControl1'#4'Left'#3#155#0#6'Heigh' - +'t'#3''''#1#3'Top'#2#0#5'Width'#3'H'#2#5'Align'#7#8'alClient'#6'Images'#7#17 - +'Mufasa_Image_List'#9'PopupMenu'#7#8'TabPopup'#8'TabOrder'#2#0#8'OnChange'#7 - +#18'PageControl1Change'#10'OnChanging'#7#20'PageControl1Changing'#14'OnConte' - +'xtPopup'#7#24'PageControl1ContextPopup'#10'OnDragDrop'#7#20'PageControl1Dra' - +'gDrop'#10'OnDragOver'#7#20'PageControl1DragOver'#11'OnMouseDown'#7#21'PageC' - +'ontrol1MouseDown'#9'OnMouseUp'#7#19'PageControl1MouseUp'#13'OnPageChanged'#7 - +#18'PageControl1Change'#0#0#6'TPanel'#11'SearchPanel'#4'Left'#2#0#6'Height'#2 - +'#'#3'Top'#3''''#1#5'Width'#3#227#2#5'Align'#7#8'alBottom'#10'BevelOuter'#7#7 - +'bvSpace'#12'ClientHeight'#2'#'#11'ClientWidth'#3#227#2#8'TabOrder'#2#1#7'Vi' - +'sible'#8#0#12'TSpeedButton'#17'SpeedButtonSearch'#4'Left'#2' '#6'Height'#2 - +#19#3'Top'#2#7#5'Width'#2#16#5'Color'#7#9'clBtnFace'#4'Flat'#9#10'Glyph.Data' - +#10':'#9#0#0'6'#9#0#0'BM6'#9#0#0#0#0#0#0'6'#0#0#0'('#0#0#0#24#0#0#0#24#0#0#0 - +#1#0' '#0#0#0#0#0#0#9#0#0'd'#0#0#0'd'#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +'t'#2#0#6'Height'#3#154#0#3'Top'#3'h'#1#5'Width'#3#154#2#5'Align'#7#8'alBott' + +'om'#12'ClientHeight'#3#154#0#11'ClientWidth'#3#154#2#8'TabOrder'#2#2#0#5'TM' + +'emo'#5'Memo1'#4'Left'#2#1#6'Height'#3#152#0#3'Top'#2#1#5'Width'#3#152#2#5'A' + +'lign'#7#8'alClient'#11'Font.Height'#2#243#9'Font.Name'#6#11'Courier New'#10 + +'ParentFont'#8#10'ScrollBars'#7#10'ssAutoBoth'#8'TabOrder'#2#0#0#0#0#9'TSpli' + +'tter'#19'SplitterMemoSynedit'#6'Cursor'#7#8'crVSplit'#4'Left'#2#0#6'Height' + +#2#5#3'Top'#3'c'#1#5'Width'#3#154#2#5'Align'#7#8'alBottom'#12'ResizeAnchor'#7 + ,#8'akBottom'#0#0#6'TPanel'#11'ScriptPanel'#4'Left'#2#0#6'Height'#3'K'#1#3'To' + +'p'#2#24#5'Width'#3#154#2#5'Align'#7#8'alClient'#10'BevelOuter'#7#6'bvNone' + +#12'ClientHeight'#3'K'#1#11'ClientWidth'#3#154#2#8'DockSite'#9#8'TabOrder'#2 + +#4#10'OnDockDrop'#7#19'ScriptPanelDockDrop'#10'OnDockOver'#7#19'ScriptPanelD' + +'ockOver'#0#12'TPageControl'#12'PageControl1'#4'Left'#3#155#0#6'Height'#3'(' + +#1#3'Top'#2#0#5'Width'#3#255#1#5'Align'#7#8'alClient'#6'Images'#7#17'Mufasa_' + +'Image_List'#9'PopupMenu'#7#8'TabPopup'#8'TabOrder'#2#0#8'OnChange'#7#18'Pag' + +'eControl1Change'#10'OnChanging'#7#20'PageControl1Changing'#14'OnContextPopu' + +'p'#7#24'PageControl1ContextPopup'#10'OnDragDrop'#7#20'PageControl1DragDrop' + +#10'OnDragOver'#7#20'PageControl1DragOver'#11'OnMouseDown'#7#21'PageControl1' + +'MouseDown'#9'OnMouseUp'#7#19'PageControl1MouseUp'#13'OnPageChanged'#7#18'Pa' + +'geControl1Change'#0#0#6'TPanel'#11'SearchPanel'#4'Left'#2#0#6'Height'#2'#'#3 + +'Top'#3'('#1#5'Width'#3#154#2#5'Align'#7#8'alBottom'#10'BevelOuter'#7#7'bvSp' + +'ace'#12'ClientHeight'#2'#'#11'ClientWidth'#3#154#2#8'TabOrder'#2#1#7'Visibl' + +'e'#8#0#12'TSpeedButton'#17'SpeedButtonSearch'#4'Left'#2' '#6'Height'#2#19#3 + +'Top'#2#7#5'Width'#2#16#5'Color'#7#9'clBtnFace'#4'Flat'#9#10'Glyph.Data'#10 + +':'#9#0#0'6'#9#0#0'BM6'#9#0#0#0#0#0#0'6'#0#0#0'('#0#0#0#24#0#0#0#24#0#0#0#1#0 + +' '#0#0#0#0#0#0#9#0#0'd'#0#0#0'd'#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 @@ -102,23 +103,23 @@ LazarusResources.Add('TForm1','FORMDATA',[ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#255 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#255#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 - +#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#255#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 - +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#0#0#0#0#0 - +#0#0#0#0#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#0#0#0#0#255#0#0#0#255#0#0#0 + +#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 - +#0#0#0#0#0#0#0#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#0#0#0#0#255#0#0#0#255#0#0 - +#0#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 - +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#255#0#0#0#255#0 + +#0#0#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 - +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#255#0#0#0#255 - +#0#0#0#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 - +#0#0#0#0#0#0#0#0#0#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#0 - +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 - +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#255#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#255#0#0#0 +#255#0#0#0#255#0#0#0#0#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#0#0#0#0#0#0 @@ -128,7 +129,6 @@ LazarusResources.Add('TForm1','FORMDATA',[ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 - +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 ,#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 @@ -143,958 +143,959 @@ LazarusResources.Add('TForm1','FORMDATA',[ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#9'NumGlyphs'#2#0#7'OnClick'#7#22'SpeedB' +'uttonSearchClick'#0#0#12'TLabeledEdit'#17'LabeledEditSearch'#4'Left'#2'h'#6 - +'Height'#2#23#3'Top'#2#6#5'Width'#3#174#0' EditLabel.AnchorSideLeft.Control' + +'Height'#2#21#3'Top'#2#6#5'Width'#3#174#0' EditLabel.AnchorSideLeft.Control' +#7#17'LabeledEditSearch'#31'EditLabel.AnchorSideTop.Control'#7#17'LabeledEdi' +'tSearch'#28'EditLabel.AnchorSideTop.Side'#7#9'asrCenter!EditLabel.AnchorSid' +'eRight.Control'#7#17'LabeledEditSearch"EditLabel.AnchorSideBottom.Control'#7 +#17'LabeledEditSearch'#14'EditLabel.Left'#2'G'#16'EditLabel.Height'#2#16#13 - +'EditLabel.Top'#2#9#15'EditLabel.Width'#2#30#17'EditLabel.Caption'#6#6'Find:' + +'EditLabel.Top'#2#8#15'EditLabel.Width'#2#30#17'EditLabel.Caption'#6#6'Find:' +' '#21'EditLabel.ParentColor'#8#13'LabelPosition'#7#6'lpLeft'#8'TabOrder'#2#0 +#8'OnChange'#7#16'EditSearchChange'#7'OnEnter'#7#22'LabeledEditSearchEnter'#6 +'OnExit'#7#21'LabeledEditSearchExit'#9'OnKeyDown'#7#24'LabeledEditSearchKeyD' +'own'#10'OnKeyPress'#7#25'LabeledEditSearchKeyPress'#0#0#9'TCheckBox'#17'Che' - +'ckBoxMatchCase'#4'Left'#3'@'#1#6'Height'#2#19#3'Top'#2#7#5'Width'#2'P'#7'Ca' + +'ckBoxMatchCase'#4'Left'#3'@'#1#6'Height'#2#17#3'Top'#2#7#5'Width'#2'H'#7'Ca' +'ption'#6#10'Match case'#7'OnClick'#7#22'CheckBoxMatchCaseClick'#8'TabOrder' +#2#1#0#0#0#9'TSplitter'#20'SplitterFunctionList'#4'Left'#3#150#0#6'Height'#3 - +''''#1#3'Top'#2#0#5'Width'#2#5#11'OnCanResize'#7#29'SplitterFunctionListCanR' - +'esize'#7'Visible'#8#0#0#244#18'TFunctionListFrame'#15'frmFunctionList'#6'He' - +'ight'#3''''#1#5'Width'#3#150#0#12'ClientHeight'#3''''#1#11'ClientWidth'#3 - +#150#0#9'OnEndDock'#13#8'TabOrder'#2#3#0#241#9'TTreeView'#12'FunctionList'#6 - +'Height'#3#252#0#5'Width'#3#150#0#8'OnChange'#7#18'FunctionListChange'#7'OnE' - +'nter'#7#17'FunctionListEnter'#6'OnExit'#7#16'FunctionListExit'#0#0#241#5'TE' - +'dit'#14'editSearchList'#3'Top'#3#16#1#5'Width'#3#150#0#6'OnExit'#7#18'editS' - +'earchListExit'#9'OnKeyDown'#7#21'editSearchListKeyDown'#10'OnKeyPress'#7#22 - +'editSearchListKeyPress'#0#0#241#6'TLabel'#17'FunctionListLabel'#5'Width'#3 - +#146#0#0#0#0#0#9'TMainMenu'#8'MainMenu'#4'left'#3#232#1#3'top'#3#144#0#0#9'T' - +'MenuItem'#8'MenuFile'#7'Caption'#6#5'&File'#13'SubMenuImages'#7#17'Mufasa_I' - +'mage_List'#0#9'TMenuItem'#11'MenuItemNew'#6'Action'#7#15'ActionNewScript'#11 - +'Bitmap.Data'#10':'#4#0#0'6'#4#0#0'BM6'#4#0#0#0#0#0#0'6'#0#0#0'('#0#0#0#16#0 - +#0#0#16#0#0#0#1#0' '#0#0#0#0#0#0#4#0#0'd'#0#0#0'd'#0#0#0#0#0#0#0#0#0#0#0#255 - +#255#255#0#187'j4k'#186'e0'#188#187'f1'#237#186'f0'#247#186'f0'#247#186'f0' - +#247#186'e0'#247#186'e/'#247#185'e.'#247#185'e.'#247#185'd.'#247#185'd.'#239 - +#183'b,'#189#183'b.c'#255#255#255#0#255#255#255#0#188'i3'#222#248#241#234#242 - +#247#236#223#253#246#235#222#255#246#234#222#255#246#234#220#255#246#234#220 - +#255#250#243#235#255#250#243#235#255#250#242#234#255#252#247#243#255#252#248 - +#244#253#254#254#253#240#183'`*'#213#255#255#255#0#255#255#255#0#191'q8'#245 - +#245#235#223#254#253#191'h'#255#252#189'g'#255#251#190'e'#255#252#190'd'#255 - +#252#190'd'#255#252#189'b'#255#251#189'c'#255#251#188'a'#255#252#190'`'#255 - +#252#188'b'#255#253#251#248#253#185'd-'#243#255#255#255#0#255#255#255#0#193 - +'x<'#247#247#237#227#255#253#194'n'#255#255#216#160#255#255#215#158#255#255 - +#214#155#255#255#215#152#255#255#214#150#255#255#214#149#255#255#213#148#255 - +#255#212#147#255#251#190'e'#255#251#247#244#255#187'g1'#247#255#255#255#0#255 - +#255#255#0#196'|@'#247#247#240#230#255#248#180'U'#255#247#180'V'#255#247#181 - +'T'#255#248#180'S'#255#248#178'S'#255#247#179'R'#255#247#179'R'#255#247#178 - +'Q'#255#247#178'O'#255#247#178'O'#255#252#249#245#255#191'o6'#247#255#255#255 - +#0#255#255#255#0#197#128'B'#247#248#241#232#255#254#229#213#255#253#229#211 - +#255#253#229#211#255#252#229#211#255#252#229#211#255#252#228#209#255#252#226 - +#206#255#252#226#204#255#251#224#201#255#251#225#200#255#253#250#247#255#193 - +'v;'#247#255#255#255#0#255#255#255#0#197#130'E'#247#248#242#235#255#254#231 - +#214#255#253#231#214#255#253#231#214#255#253#231#214#255#253#230#213#255#253 - +#229#211#255#252#228#209#255#252#226#205#255#251#225#203#255#251#225#201#255 - ,#251#247#242#255#197'|?'#247#255#255#255#0#255#255#255#0#198#132'G'#247#249 - +#243#236#255#254#232#214#255#254#232#215#255#253#231#214#255#253#231#214#255 - +#253#231#213#255#253#229#211#255#251#228#208#255#251#227#204#255#250#223#199 - +#255#250#223#198#255#250#242#234#255#198#128'B'#247#255#255#255#0#255#255#255 - +#0#198#136'I'#247#249#244#237#255#254#232#216#255#254#232#216#255#254#232#215 - +#255#254#231#214#255#253#229#211#255#252#228#209#255#251#225#204#255#250#224 - +#199#255#249#221#195#255#248#220#194#255#250#244#237#255#198#130'E'#247#255 - +#255#255#0#255#255#255#0#198#136'J'#247#249#244#239#255#254#231#215#255#253 - +#231#214#255#253#231#213#255#253#230#212#255#252#230#210#255#251#225#204#255 - +#250#223#199#255#248#220#194#255#246#218#189#255#246#216#187#255#250#244#239 - +#255#198#131'F'#247#255#255#255#0#255#255#255#0#198#137'K'#247#249#244#240 - +#255#252#230#211#255#252#230#212#255#253#231#211#255#252#228#209#255#251#227 - +#205#255#250#224#200#255#248#220#194#255#245#214#187#255#243#212#181#255#241 - +#210#179#255#248#244#240#255#196#130'F'#247#255#255#255#0#255#255#255#0#198 - +#137'K'#247#249#245#241#255#252#227#207#255#251#228#208#255#252#228#207#255 - +#252#227#205#255#250#225#202#255#249#221#196#255#246#217#188#255#244#233#223 - +#255#247#242#236#255#251#247#243#255#245#239#233#255#194'~E'#251#255#255#255 - +#0#255#255#255#0#198#137'L'#246#249#245#241#255#252#227#205#255#251#227#206 - +#255#251#227#205#255#251#226#203#255#249#224#200#255#248#220#194#255#245#214 - +#186#255#253#251#248#255#252#230#205#255#250#229#201#255#226#182#132#255#191 - +'yB'#166#255#255#255#0#255#255#255#0#197#136'K'#234#250#246#242#252#250#224 - +#199#255#251#225#201#255#251#226#201#255#251#224#200#255#249#223#197#255#248 - +#219#193#255#244#214#184#255#255#251#248#255#246#216#180#255#225#176'}'#255 - +#219#146'd'#246#180'k>'#7#255#255#255#0#255#255#255#0#196#133'I'#195#247#242 - +#236#236#248#244#238#252#248#244#237#255#248#243#237#255#248#243#237#255#248 - +#243#237#255#248#242#236#255#247#242#236#255#242#230#215#255#226#178'}'#255 - +#219#148'e'#245#179'h;'#7#255#255#255#0#255#255#255#0#255#255#255#0#193'}D`' - +#200#139'M'#187#200#140'O'#238#200#140'O'#246#200#140'O'#247#200#140'O'#247 - +#200#141'O'#247#201#140'O'#247#199#139'O'#247#197#137'K'#212#196'v;'#145#179 - +'h<'#6#255#255#255#0#255#255#255#0#255#255#255#0#13'SubMenuImages'#7#17'Mufa' - +'sa_Image_List'#7'OnClick'#7#16'ActionNewExecute'#0#0#9'TMenuItem'#15'MenuIt' - +'emDivider'#7'Caption'#6#1'-'#0#0#9'TMenuItem'#12'MenuItemOpen'#6'Action'#7 - +#16'ActionOpenScript'#11'Bitmap.Data'#10':'#4#0#0'6'#4#0#0'BM6'#4#0#0#0#0#0#0 - +'6'#0#0#0'('#0#0#0#16#0#0#0#16#0#0#0#1#0' '#0#0#0#0#0#0#4#0#0'd'#0#0#0'd'#0#0 - +#0#0#0#0#0#0#0#0#0','#134#216#209'-'#136#216#247'-'#135#216#247'-'#136#216 - +#247'-'#136#216#247'-'#136#216#247'-'#136#216#247'-'#136#216#247'-'#136#216 - +#247'-'#136#216#247'-'#136#216#247'-'#135#216#247'-'#136#216#247','#134#216 - +#209#255#255#255#0#255#255#255#0'3'#142#217#251#220#240#250#255#152#225#246 - +#255#149#224#246#255#146#223#246#255#142#222#245#255#137#220#245#255#133#218 - +#244#255#128#217#244#255'z'#215#243#255't'#213#243#255'p'#211#242#255#194#234 - +#248#255'5'#148#218#255#255#255#255#0#255#255#255#0'5'#148#218#247#239#250 - +#254#255#147#229#248#255#143#228#248#255#137#227#248#255#130#225#247#255'z' - +#223#247#255'q'#222#246#255'g'#219#245#255'['#216#244#255'M'#212#243#255'@' - +#209#242#255#202#242#251#255'5'#148#218#255#255#255#255#0#255#255#255#0'6' - +#154#218#248#242#250#253#255#148#230#248#255#146#229#248#255#144#229#248#255 - +#139#227#248#255#134#226#247#255#127#225#247#255'w'#222#246#255'l'#220#246 - +#255'^'#217#244#255'O'#213#243#255#204#242#251#255'5'#148#218#255#255#255#255 - +#0#255#255#255#0'6'#161#218#249#246#252#254#255#148#229#248#255#147#229#248 - +#255#147#229#248#255#145#229#248#255#147#219#233#255#147#215#227#255#147#210 - +#220#255#144#206#215#255#140#200#207#255#134#193#198#255#201#216#214#255'5' - +#148#218#255#197'tD'#232#202#127'S'#241'7'#166#218#250#254#255#255#255#248 - +#253#255#255#246#253#255#255#245#252#255#255#243#252#254#255#154#228#244#255 - +#154#230#247#255#155#230#246#255#157#229#245#255#158#229#245#255#159#229#244 - +#255#218#243#248#255'5'#148#218#255#253#244#238#255#202#128'T'#249'5'#171#218 - +#250#232#246#251#255'p'#188#231#255'U'#170#226#255'M'#165#224#255#145#201#235 - +#255#250#243#239#255#253#254#253#255#255#253#252#255#255#253#252#255#254#253 - +#252#255#254#252#251#255#254#254#253#255'5'#148#218#255#239#242#232#255#206 - +#129'V'#255'6'#170#218#242#241#250#253#255#148#222#245#255#147#220#244#255'd' - +#188#233#255'5'#148#218#255'5'#148#218#255'5'#148#218#255'5'#148#218#255'5' - +#148#218#255'5'#148#218#255'5'#148#218#255'5'#148#218#255'5'#148#218#255#251 - +#246#239#255#204#131'U'#254'5'#175#218#240#247#252#254#255#142#228#248#255 - +#145#222#245#255#159#224#245#255#172#225#246#255#202#132'R'#255#255#247#241 - +#255#255#233#217#255#255#234#219#255#255#233#217#255#255#231#215#255#255#229 - +#210#255#255#226#203#255#255#247#241#255#203#133'U'#254'6'#179#218#248#253 - ,#254#254#255#254#255#255#255#254#254#255#255#253#254#255#255#254#255#255#255 - +#228#186#145#255#255#247#240#255#255#231#213#255#253#231#214#255#253#230#212 - +#255#252#228#208#255#251#227#203#255#250#220#194#255#254#243#232#255#204#134 - +'V'#254'4'#180#217#208'^'#194#225#250'`'#195#226#250'`'#195#226#250'`'#195 - +#226#250'_'#195#226#250#228#187#145#255#255#247#242#255#254#231#213#255#254 - +#231#213#255#253#229#209#255#250#224#202#255#249#222#196#255#247#217#188#255 - +#253#242#231#255#204#135'W'#254#255#255#255#0#255#255#255#0#255#255#255#0#255 - +#255#255#0#255#255#255#0#255#255#255#0#228#187#146#255#254#247#241#255#252 - +#229#210#255#252#228#209#255#251#226#204#255#249#221#196#255#246#215#187#255 - +#243#209#175#255#250#239#228#255#204#135'X'#254#255#255#255#0#255#255#255#0 - +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#228#187#146#255#254 - +#246#240#255#252#226#205#255#252#227#205#255#250#223#200#255#247#217#188#255 - +#245#233#221#255#250#243#235#255#251#248#243#255#202#131'S'#254#255#255#255#0 - +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#228 - +#187#147#255#254#245#237#255#252#222#197#255#251#224#199#255#249#220#194#255 - +#245#211#180#255#254#249#243#255#250#226#196#255#236#193#147#255#195'}H'#147 - +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 - +#255#255#0#229#190#150#255#255#255#254#255#253#243#233#255#253#243#234#255 - +#252#242#232#255#250#239#227#255#250#242#231#255#234#187#136#255#207#133'U' - +#179#180'i='#12#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 - +#255#255#0#255#255#255#0#234#195#157#255#230#191#150#255#228#187#146#255#228 - +#187#146#255#209#160'l'#245#208#158'm'#246#204#150'_'#218#196'yB~'#178'g<'#9 - +#255#255#255#0#7'OnClick'#7#17'ActionOpenExecute'#0#0#9'TMenuItem'#18'MenuIt' - +'emOpenRecent'#7'Caption'#6#12'Open &Recent'#0#0#9'TMenuItem'#12'MenuItemSav' - +'e'#6'Action'#7#16'ActionSaveScript'#11'Bitmap.Data'#10':'#4#0#0'6'#4#0#0'BM' - +'6'#4#0#0#0#0#0#0'6'#0#0#0'('#0#0#0#16#0#0#0#16#0#0#0#1#0' '#0#0#0#0#0#0#4#0 - +#0'd'#0#0#0'd'#0#0#0#0#0#0#0#0#0#0#0#186'j6'#143#185'i5'#181#184'i5'#238#183 - +'h5'#255#181'h5'#255#180'g4'#255#178'f4'#255#176'e3'#255#174'd3'#255#172'c2' - +#255#170'b2'#255#169'a2'#255#168'`1'#255#167'`1'#254#166'`1'#241#168'a1'#196 - +#186'j5'#222#235#198#173#255#234#197#173#255#254#251#248#255#254#251#248#255 - +#254#251#248#255#254#251#248#255#254#251#248#255#254#251#248#255#254#251#248 - +#255#254#251#248#255#254#251#248#255#254#251#248#255#200#154'|'#255#199#152 - +'y'#255#167'`1'#237#186'k7'#254#237#202#179#255#224#162'z'#255#254#250#247 - +#255'b'#192#136#255'b'#192#136#255'b'#192#136#255'b'#192#136#255'b'#192#136 - +#255'b'#192#136#255'b'#192#136#255'b'#192#136#255#253#249#246#255#202#141'e' - +#255#201#155'|'#255#167'`1'#254#187'l8'#255#238#204#182#255#225#162'z'#255 - +#254#250#247#255#191#220#194#255#191#220#194#255#191#220#194#255#191#220#194 - +#255#191#220#194#255#191#220#194#255#191#220#194#255#191#220#194#255#253#249 - +#246#255#205#144'h'#255#204#158#129#255#168'a2'#255#187'k8'#255#239#206#184 - +#255#225#162'y'#255#254#250#247#255'b'#192#136#255'b'#192#136#255'b'#192#136 - +#255'b'#192#136#255'b'#192#136#255'b'#192#136#255'b'#192#136#255'b'#192#136 - +#255#253#249#246#255#207#147'j'#255#206#163#132#255#170'a2'#255#186'j6'#255 - +#239#208#187#255#226#162'z'#255#254#251#248#255#254#251#248#255#254#251#248 - +#255#254#251#248#255#254#251#248#255#254#251#248#255#254#251#248#255#254#251 - +#248#255#254#251#248#255#254#251#248#255#211#150'm'#255#210#167#138#255#171 - +'b2'#255#187'j6'#255#240#210#190#255#226#163'z'#255#226#163'z'#255#225#163'z' - +#255#226#163'{'#255#225#163'{'#255#224#161'x'#255#222#159'w'#255#221#159'v' - +#255#220#157't'#255#217#155'r'#255#216#153'q'#255#214#153'p'#255#213#171#142 - +#255#173'c3'#255#187'j6'#255#242#213#194#255#227#163'z'#255#227#163'z'#255 - +#226#163'{'#255#226#163'{'#255#226#164'{'#255#225#162'y'#255#224#161'x'#255 - +#222#160'w'#255#222#158'u'#255#220#157't'#255#218#155's'#255#217#155's'#255 - +#218#176#149#255#175'd3'#255#187'j6'#255#242#216#197#255#227#164'{'#255#227 - +#163'z'#255#227#164'z'#255#226#164'{'#255#226#163'{'#255#225#163'{'#255#225 - +#162'y'#255#223#160'w'#255#222#159'v'#255#221#158't'#255#219#156'r'#255#220 - +#157't'#255#221#181#154#255#177'e4'#255#187'k6'#255#244#217#199#255#230#166 - +'}'#255#200#140'd'#255#201#141'e'#255#201#142'g'#255#203#146'l'#255#203#146 - +'m'#255#202#144'i'#255#200#140'e'#255#200#140'd'#255#200#140'd'#255#200#140 - +'d'#255#218#156't'#255#225#186#159#255#179'f4'#255#187'k6'#254#244#220#201 - +#255#231#167'}'#255#249#236#225#255#249#236#225#255#249#237#227#255#252#244 - +#238#255#253#250#247#255#253#247#243#255#250#237#229#255#247#231#219#255#247 - +#229#217#255#246#229#216#255#222#160'w'#255#228#190#164#255#180'g4'#255#188 - +'k6'#250#245#221#204#255#231#168'~'#255#250#240#232#255#250#240#232#255#201 - +#141'f'#255#250#240#233#255#253#248#243#255#254#250#248#255#252#244#239#255 - +#249#233#223#255#247#231#219#255#247#229#217#255#224#162'x'#255#231#194#169 - ,#255#182'h5'#255#188'k6'#240#246#223#208#255#232#168'~'#255#252#246#241#255 - +#252#246#241#255#200#140'd'#255#250#241#233#255#251#244#238#255#253#250#247 - +#255#253#249#246#255#250#240#232#255#248#232#221#255#247#230#219#255#225#163 - +'z'#255#239#213#195#255#183'i5'#254#188'k6'#216#246#223#209#255#233#170#128 - +#255#254#250#246#255#253#250#246#255#200#140'd'#255#251#243#238#255#251#241 - +#234#255#252#246#242#255#254#251#248#255#252#246#241#255#249#236#226#255#248 - +#231#219#255#238#208#186#255#236#208#189#255#187'p>'#248#188'k6'#155#246#224 - +#209#255#247#224#209#255#254#251#248#255#254#251#247#255#253#249#246#255#252 - +#245#240#255#250#240#234#255#251#242#237#255#253#249#246#255#253#250#247#255 - +#251#241#235#255#248#233#223#254#236#208#189#251#201#137'^'#236#181'i5c'#188 - +'k6q'#188'k6'#144#188'k6'#204#188'k6'#238#188'k6'#250#187'k6'#254#187'k6'#255 - +#187'j6'#255#187'j6'#255#188'l9'#255#189'n;'#255#187'm:'#255#187'k8'#239#187 - +'p>'#203#182'i5T'#255#255#255#0#7'OnClick'#7#17'ActionSaveExecute'#0#0#9'TMe' - +'nuItem'#14'MenuItemSaveAs'#6'Action'#7#18'ActionSaveScriptAs'#7'Caption'#6 - +#10'Save as...'#7'OnClick'#7#19'ActionSaveAsExecute'#0#0#9'TMenuItem'#15'Men' - +'uItemSaveAll'#6'Action'#7#13'ActionSaveAll'#7'Enabled'#8#11'Bitmap.Data'#10 - +':'#4#0#0'6'#4#0#0'BM6'#4#0#0#0#0#0#0'6'#0#0#0'('#0#0#0#16#0#0#0#16#0#0#0#1#0 - +' '#0#0#0#0#0#0#4#0#0'd'#0#0#0'd'#0#0#0#0#0#0#0#0#0#0#0#255#255#255#0#255#255 - +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 - +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 - +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 - +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#186'h3'#197#195#132'X'#255 - +#211#139'h'#255#225#143'p'#255#220#141'l'#255#218#139'm'#255#215#138'n'#255 - +#205#139'l'#255#171'mD'#255#166'_.'#255#255#255#255#0#255#255#255#0#255#255 - +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#198#131'U'#255#239#206#186 - +#255#221#255#255#255#135#238#199#255#162#244#215#255#162#246#215#255#140#238 - +#199#255#224#255#255#255#221#162#133#255#171'j>'#255#255#255#255#0#255#255 - +#255#0#255#255#255#0#255#255#255#0#186'h3'#172#195#132'X'#222#195#127'Q'#255 - +#239#182#154#255#234#243#232#255'Q'#191#132#255'o'#201#152#255'q'#201#153#255 - +'T'#191#132#255#228#244#233#255#221#156'{'#255#170'i:'#255#255#255#255#0#255 - +#255#255#0#255#255#255#0#255#255#255#0#198#131'U'#222#239#206#186#222#196#129 - +'T'#255#234#182#151#255#243#243#234#255#237#241#230#255#239#241#230#255#239 - +#240#230#255#237#241#229#255#243#245#237#255#213#156'y'#255#176'pD'#255#255 - +#255#255#0#255#255#255#0#186'h3'#155#195#132'X'#201#197#128'S'#248#238#178 - +#150#248#201#139'a'#255#230#181#146#255#226#167#129#255#225#167#129#255#222 - +#163'}'#255#220#161'{'#255#219#159'y'#255#217#158'w'#255#212#154's'#255#187 - +'~W'#255#255#255#255#0#255#255#255#0#198#131'U'#201#239#206#186#201#199#142 - +'f'#248#224#188#156#248#202#141'e'#255#234#184#153#255#221#165'~'#255#221#166 - +#128#255#219#163'|'#255#217#160'z'#255#217#160'y'#255#216#159'x'#255#216#158 - +'x'#255#191#132']'#255#255#255#255#0#255#255#255#0#195#127'Q'#201#239#182#154 - +#201#204#150'o'#248#214#182#145#248#200#136']'#255#239#191#161#255#253#252 - +#250#255#254#252#251#255#254#253#253#255#254#253#252#255#253#251#250#255#253 - +#252#251#255#221#168#133#255#193#127'S'#255#255#255#255#0#255#255#255#0#196 - +#129'T'#201#234#182#151#201#206#152's'#248#234#190#161#248#199#134'['#255#239 - +#192#158#255#255#255#255#255#204#147'n'#255#255#255#255#255#255#255#255#255 - +#255#251#247#255#255#248#241#255#228#175#140#255#199#138'a'#255#255#255#255#0 - +#255#255#255#0#201#139'a'#201#230#181#146#201#203#139'a'#248#238#188#158#248 - +#204#141'e'#255#243#205#176#255#255#255#255#255#227#199#179#255#255#255#255 - +#255#255#255#255#255#255#255#255#255#255#255#255#255#234#191#161#255#201#137 - +'`'#255#255#255#255#0#255#255#255#0#202#141'e'#201#234#184#153#201#201#137'_' - +#248#237#189#155#248#212#151'n'#255#212#158'{'#255#208#152'q'#255#214#164#130 - +#255#205#142'h'#255#205#144'i'#255#208#154'u'#255#209#153's'#255#200#139'b' - +#255#173'Z 6'#255#255#255#0#255#255#255#0#200#136']'#201#239#191#161#201#209 - +#153'u'#248#244#210#184#248#255#255#255#248#230#205#187#248#255#255#254#248 - +#255#255#255#248#251#246#242#248#248#241#237#248#234#191#161#222#201#137'`' - +#222#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#199#134'['#201 - +#239#192#158#201#217#162'}'#248#211#157'z'#248#213#163#128#248#218#174#143 - +#248#210#154'w'#248#210#155'w'#248#210#156'w'#248#208#151'q'#248#200#139'b' - +#222#173'Z /'#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#204#141 - +'e'#201#243#205#176#201#255#255#255#201#227#199#179#201#255#255#255#201#255 - +#255#255#201#255#255#255#201#255#255#255#201#234#191#161#201#201#137'`'#201 - +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 - +#255#255#0#212#151'n'#201#212#158'{'#201#208#152'q'#201#214#164#130#201#205 - +#142'h'#201#205#144'i'#201#208#154'u'#201#209#153's'#201#200#139'b'#201#173 - ,'Z +'#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 - +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 - +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 - +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 - +#7'OnClick'#7#20'ActionSaveAllExecute'#0#0#9'TMenuItem'#16'MenuItemDivider2' - +#7'Caption'#6#1'-'#0#0#9'TMenuItem'#14'MenuItemNewTab'#6'Action'#7#12'Action' - +'NewTab'#11'Bitmap.Data'#10':'#4#0#0'6'#4#0#0'BM6'#4#0#0#0#0#0#0'6'#0#0#0'(' - +#0#0#0#16#0#0#0#16#0#0#0#1#0' '#0#0#0#0#0#0#4#0#0'd'#0#0#0'd'#0#0#0#0#0#0#0#0 - +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 - +#0#0#0#0#0#4'9'#0#0#6'm'#0#153#5'i'#0#204#6'm'#0#153#4'9'#0#0#0#0#0#0#0#0#0#9 - +#0#0#0#22#0#0#0#26#0#0#0#26#0#0#0#26#0#0#0#26#0#0#0#26#0#0#0#26#0#0#0#26#0#0 - +#0#26#0#0#0#26#11#128#0#209'+'#223#26#255#11#128#0#209#0#0#0#22#0#0#0#9#13#13 - +#13'g'#16#16#16#133#16#16#16#133#16#16#16#133#16#16#16#133#16#16#16#133#16#16 - +#16#133#16#16#16#133#16#16#16#133#14'b'#4#207#14'~'#2#231#14'~'#2#231'='#226 - +','#255#14'~'#2#231#14'~'#2#231#11'_'#2#176'''''''{'#235#235#235#255#231#231 - +#231#255#231#231#231#255#231#231#231#255#231#231#231#255#231#231#231#255#231 - +#231#231#255#231#231#231#255';'#165'/'#255'R'#231'A'#255'R'#231'A'#255'R'#231 - +'A'#255'R'#231'A'#255'R'#231'A'#255#18#137#5#229'222v'#234#234#234#255#226 - +#226#226#255#226#226#226#255#226#226#226#255#226#226#226#255#226#226#226#255 - +#226#226#226#255#226#226#226#255'f'#185'['#255'<'#171'-'#255'<'#171'-'#255'f' - +#235'U'#255'<'#171'-'#255'>'#173'/'#255#28'z'#17#200'888s'#237#237#237#255 - +#230#230#230#255#230#230#230#255#230#230#230#255#230#230#230#255#230#230#230 - +#255#230#230#230#255#230#230#230#255#230#230#230#255#230#230#230#255'>'#177 - +'.'#255'u'#238'd'#255'>'#177'.'#255#237#237#237#255'888s>>>q'#240#240#240#255 - +#235#235#235#255#235#235#235#255#235#235#235#255#235#235#235#255#235#235#235 - +#255#235#235#235#255#235#235#235#255#235#235#235#255#235#235#235#255'k'#196 - +'_'#255'@'#182'/'#255'k'#196'_'#255#240#240#240#255'>>>qDDDn'#243#243#243#255 - +#239#239#239#255#239#239#239#255#239#239#239#255#239#239#239#255#239#239#239 - +#255#239#239#239#255#239#239#239#255#239#239#239#255#239#239#239#255#239#239 - +#239#255#239#239#239#255#239#239#239#255#243#243#243#255'DDDnIIIl'#247#247 - +#247#255#244#244#244#255#244#244#244#255#244#244#244#255#244#244#244#255#244 - +#244#244#255#244#244#244#255#244#244#244#255#244#244#244#255#244#244#244#255 - +#244#244#244#255#244#244#244#255#244#244#244#255#247#247#247#255'IIIlMMMj' - +#250#250#250#255#248#248#248#255#248#248#248#255#248#248#248#255#248#248#248 - +#255#248#248#248#255#248#248#248#255#248#248#248#255#248#248#248#255#248#248 - +#248#255#248#248#248#255#248#248#248#255#248#248#248#255#250#250#250#255'MMM' - +'jQQQh'#253#253#253#255#252#252#252#255#252#252#252#255#252#252#252#255#252 - +#252#252#255#252#252#252#255#252#252#252#255#252#252#252#255#252#252#252#255 - +#252#252#252#255#252#252#252#255#252#252#252#255#252#252#252#255#253#253#253 - +#255'QQQhUUUg'#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 - +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 - +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 - +#255#255#255'UUUgPPPi'#187#187#187#255#186#186#186#255#184#184#184#255#182 - +#182#182#255#179#179#179#255#176#176#176#255#174#174#174#255#171#171#171#255 - +#168#168#168#255#166#166#166#255#163#163#163#255#160#160#160#255#158#158#158 - +#255#156#156#156#255#3#3#3'fRRR['#198#198#198#212#220#220#220#255#216#217#217 - +#255#213#213#213#255#208#209#209#255#204#204#204#255#200#200#200#255#198#198 - +#198#255#198#197#197#255#201#197#197#255#205#198#198#255#209#199#199#255#215 - +#203#203#255#196#184#184#212'RRR[UUU"UUUYUUUfUUUfUUUfUUUfUUUfUUUfUUUfUUUfUUU' - +'fUUUfUUUfUUUfUUUYUUU"'#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255 - +#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 - +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 - +#255#0#255#255#255#0#7'OnClick'#7#19'ActionNewTabExecute'#0#0#9'TMenuItem'#16 - +'MenuItemCloseTab'#6'Action'#7#14'ActionCloseTab'#11'Bitmap.Data'#10':'#4#0#0 - +'6'#4#0#0'BM6'#4#0#0#0#0#0#0'6'#0#0#0'('#0#0#0#16#0#0#0#16#0#0#0#1#0' '#0#0#0 - +#0#0#0#4#0#0'd'#0#0#0'd'#0#0#0#0#0#0#0#0#0#0#0#255#255#255#0#255#255#255#0 - +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 - +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 - +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#0#0#0#9#0#0#0#22#0#0#0#26#0 - +#0#0#26#0#0#0#26#0#0#0#26#0#0#0#26#0#0#0#26#0#0#0#26#0#0#0#26#0#0#0#26#0#0#0 - +#26#0#0#0#26#0#0#0#26#0#0#0#22#0#0#0#9#13#13#13'g'#16#16#16#133#16#16#16#133 - +#16#16#16#133#16#16#16#133#16#16#16#133#16#16#16#133#16#16#16#133#16#16#16 - +#133#4#4'['#207#2#2's'#231#2#2's'#231#2#2's'#231#2#2's'#231#2#2's'#231#2#2'X' - +#176'''''''{'#235#235#235#255#231#231#231#255#231#231#231#255#231#231#231#255 - ,#231#231#231#255#231#231#231#255#231#231#231#255#231#231#231#255'//'#167#255 - +'^^'#247#255'^^'#247#255'^^'#247#255'^^'#247#255'^^'#247#255#5#5#139#229'222' - +'v'#234#234#234#255#226#226#226#255#226#226#226#255#226#226#226#255#226#226 - +#226#255#226#226#226#255#226#226#226#255#226#226#226#255'[['#190#255'--'#179 - +#255'--'#179#255'--'#179#255'--'#179#255'//'#181#255#17#17#129#200'888s'#237 - +#237#237#255#230#230#230#255#230#230#230#255#230#230#230#255#230#230#230#255 - +#230#230#230#255#230#230#230#255#230#230#230#255#230#230#230#255#230#230#230 - +#255#230#230#230#255#230#230#230#255#230#230#230#255#237#237#237#255'888s>>>' - +'q'#240#240#240#255#235#235#235#255#235#235#235#255#235#235#235#255#235#235 - +#235#255#235#235#235#255#235#235#235#255#235#235#235#255#235#235#235#255#235 - +#235#235#255#235#235#235#255#235#235#235#255#235#235#235#255#240#240#240#255 - +'>>>qDDDn'#243#243#243#255#239#239#239#255#239#239#239#255#239#239#239#255 - +#239#239#239#255#239#239#239#255#239#239#239#255#239#239#239#255#239#239#239 - +#255#239#239#239#255#239#239#239#255#239#239#239#255#239#239#239#255#243#243 - +#243#255'DDDnIIIl'#247#247#247#255#244#244#244#255#244#244#244#255#244#244 - +#244#255#244#244#244#255#244#244#244#255#244#244#244#255#244#244#244#255#244 - +#244#244#255#244#244#244#255#244#244#244#255#244#244#244#255#244#244#244#255 - +#247#247#247#255'IIIlMMMj'#250#250#250#255#248#248#248#255#248#248#248#255 - +#248#248#248#255#248#248#248#255#248#248#248#255#248#248#248#255#248#248#248 - +#255#248#248#248#255#248#248#248#255#248#248#248#255#248#248#248#255#248#248 - +#248#255#250#250#250#255'MMMjQQQh'#253#253#253#255#252#252#252#255#252#252 - +#252#255#252#252#252#255#252#252#252#255#252#252#252#255#252#252#252#255#252 - +#252#252#255#252#252#252#255#252#252#252#255#252#252#252#255#252#252#252#255 - +#252#252#252#255#253#253#253#255'QQQhUUUg'#255#255#255#255#255#255#255#255 - +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 - +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 - +#255#255#255#255#255#255#255#255#255#255'UUUgPPPi'#187#187#187#255#186#186 - +#186#255#184#184#184#255#182#182#182#255#179#179#179#255#176#176#176#255#174 - +#174#174#255#171#171#171#255#168#168#168#255#166#166#166#255#163#163#163#255 - +#160#160#160#255#158#158#158#255#156#156#156#255#3#3#3'fRRR['#198#198#198#212 - +#220#220#220#255#216#217#217#255#213#213#213#255#208#209#209#255#204#204#204 - +#255#200#200#200#255#198#198#198#255#198#197#197#255#201#197#197#255#205#198 - +#198#255#209#199#199#255#215#203#203#255#196#184#184#212'RRR[UUU"UUUYUUUfUUU' - +'fUUUfUUUfUUUfUUUfUUUfUUUfUUUfUUUfUUUfUUUfUUUYUUU"'#255#255#255#0#255#255#255 - +#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 - +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 - +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#7'OnClick'#7#21'ActionClose' - +'TabExecute'#0#0#9'TMenuItem'#17'MenuItemCloseTabs'#7'Caption'#6#14'Close al' - +'l tabs'#11'Bitmap.Data'#10':'#4#0#0'6'#4#0#0'BM6'#4#0#0#0#0#0#0'6'#0#0#0'(' - +#0#0#0#16#0#0#0#16#0#0#0#1#0' '#0#0#0#0#0#0#4#0#0'd'#0#0#0'd'#0#0#0#0#0#0#0#0 - +#0#0#0#0#0#0#10#0#0#0#24#0#0#0#26#0#0#0#26#0#0#0#26#0#0#0#26#0#0#0#26#0#0#0 - +#26#0#0#0#26#0#0#0#26#0#0#0#26#0#0#0#25#0#0#0#11#0#0#0#0#0#0'w'#0#0#0#128#0 - +#17#17#17'e'#20#20#20#131#20#20#20#131#20#20#20#131#20#20#20#131#20#20#20#131 - +#20#20#20#131#20#20#20#131#20#20#20#131#20#20#20#131#20#20#20#131#20#20#20 - +#131#17#17#17'e'#0#0'Z'#0#0#0'w'#0#0#0#128#0'---x'#236#236#236#255#232#232 - +#232#255#232#232#232#255#232#232#232#255#232#232#232#255#232#232#232#255#232 - +#232#232#255#232#232#232#255'__'#173#255'//'#149#255'00'#150#255#5#5'w'#228#0 - +#0#128#204#0#0#128#204#0#0#132#153'666t'#235#235#235#255#228#228#228#255#228 - +#228#228#255#228#228#228#255#228#228#228#255#228#228#228#255#228#228#228#255 - +#228#228#228#255'..'#167#255'^^'#247#255'^^'#247#255'^^'#247#255'^^'#247#255 - +'^^'#247#255#0#0#152#204'===q'#239#239#239#255#234#234#234#255#234#234#234 - +#255#234#234#234#255#234#234#234#255#234#234#234#255#234#234#234#255#234#234 - +#234#255'^^'#194#255'//'#181#255'00'#182#255#6#6#154#230#0#0#163#209#0#0#164 - +#209#0#0'|'#158'EEEn'#244#244#244#255#240#240#240#255#240#240#240#255#240#240 - +#240#255#240#240#240#255#240#240#240#255#240#240#240#255#240#240#240#255#240 - +#240#240#255#240#240#240#255#244#244#244#255'111'#184#20#20#20#131#20#20#20 - +#131#17#17#17'eKKKk'#248#248#248#255#246#246#246#255#246#246#246#255#246#246 - +#246#255#246#246#246#255#246#246#246#255#246#246#246#255#246#246#246#255#246 - +#246#246#255#246#246#246#255#248#248#248#255#166#166#166#255#232#232#232#255 - +#236#236#236#255'---xPPPi'#252#252#252#255#251#251#251#255#251#251#251#255 - +#251#251#251#255#251#251#251#255#251#251#251#255#251#251#251#255#251#251#251 - +#255#251#251#251#255#251#251#251#255#252#252#252#255#168#168#168#255#228#228 - +#228#255#235#235#235#255'666tTTTg'#255#255#255#255#255#255#255#255#255#255 - +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 - ,#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#174#174#174#255 - +#234#234#234#255#239#239#239#255'===qPPPi'#187#187#187#255#185#185#185#255 - +#182#182#182#255#180#180#180#255#176#176#176#255#173#173#173#255#169#169#169 - +#255#166#166#166#255#162#162#162#255#160#160#160#255#157#157#157#255#145#145 - +#145#255#240#240#240#255#244#244#244#255'EEEnRRR['#198#198#198#212#219#219 - +#219#255#214#214#214#255#209#209#209#255#203#204#204#255#199#199#199#255#198 - +#196#196#255#200#197#197#255#206#198#198#255#212#201#201#255#208#197#197#255 - +#188#188#188#255#246#246#246#255#248#248#248#255'KKKkUUU"UUUYUUUfSSS'#165#185 - +#185#185#255#184#184#184#255#184#184#184#255#184#184#184#255#184#184#184#255 - +#184#184#184#255#184#184#184#255#193#193#193#255#229#229#229#255#251#251#251 - +#255#252#252#252#255'PPPiUUU'#0'UUU'#0'UUU'#0'TTTg'#255#255#255#255#255#255 - +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 - +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 - +'TTTgUUU'#0'TTT'#0'PPP'#0'PPPi'#187#187#187#255#185#185#185#255#182#182#182 - +#255#180#180#180#255#176#176#176#255#173#173#173#255#169#169#169#255#166#166 - +#166#255#162#162#162#255#160#160#160#255#157#157#157#255#3#3#3'fTTT'#0'RRR'#0 - +'RRR'#0'RRR['#198#198#198#212#219#219#219#255#214#214#214#255#209#209#209#255 - +#203#204#204#255#199#199#199#255#198#196#196#255#200#197#197#255#206#198#198 - +#255#212#201#201#255#196#183#183#212'RRR[TTT'#0'TTT'#0'TTT'#0'UUU"UUUYUUUfUU' - +'UfUUUfUUUfUUUfUUUfUUUfUUUfUUUfUUUYUUU"'#10'ImageIndex'#2#20#7'OnClick'#7#22 - +'MenuItemCloseTabsClick'#0#0#9'TMenuItem'#16'MenuItemDivider6'#7'Caption'#6#1 - +'-'#0#0#9'TMenuItem'#16'MenuItemMainExit'#6'Action'#7#10'ActionExit'#11'Bitm' - +'ap.Data'#10':'#4#0#0'6'#4#0#0'BM6'#4#0#0#0#0#0#0'6'#0#0#0'('#0#0#0#16#0#0#0 - +#16#0#0#0#1#0' '#0#0#0#0#0#0#4#0#0'd'#0#0#0'd'#0#0#0#0#0#0#0#0#0#0#0#255#255 - +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 - +#255#255#255#0#255#255#255#0#255#255#255#0#29'c'#155#22#25'`'#152'9'#20']' - +#149'b'#16'Z'#146#136#13'X'#144#164#19'\'#146#252#12'W'#143#237#153#153#153 - +#255'qqq'#255'TTT'#255'QQQ'#255'OOO'#255'LLL'#255'JJJ'#255'GGG'#255'EEE'#255 - +'%g'#157#255'2t'#168#255'=|'#175#255'G'#132#181#255'N'#138#186#255'>~'#173 - +#255#12'W'#143#234#255#255#255#0#255#255#255#0'XXX'#255#162#162#162#255#162 - +#162#162#255#163#163#163#255#164#164#164#255#164#164#164#255#165#165#165#255 - +'/o'#165#255'x'#171#210#255'x'#171#211#255's'#167#209#255'i'#160#205#255'@' - +#127#174#255#15'Y'#145#234#255#255#255#0#255#255#255#0'\\\'#255#161#161#161 - +#255''#255'4~;'#255'1y7'#255'.u4'#255'I'#145'P'#255 - +'F'#143'L'#255'9s='#255#161#161#161#255#162#162#162#255'E~'#180#255#136#183 - +#217#255'g'#163#207#255'a'#158#204#255'c'#159#204#255'E'#131#177#255#31'd' - +#156#234';'#135'B'#255#137#203#146#255#132#200#141#255#128#198#136#255'{'#195 - +#131#255'w'#193#127#255'G'#143'M'#255';t?'#255#161#161#161#255'L'#132#186#255 - +#141#187#219#255'n'#168#209#255'f'#166#209#255'_'#180#223#255'G'#133#177#255 - +'%i'#161#234'>'#139'F'#255#143#206#153#255'}'#198#135#255'x'#195#129#255's' - +#192'|'#255't'#192'|'#255'y'#194#129#255'I'#144'O'#255'T'#127'W'#255'T'#137 - +#191#255#148#191#221#255'u'#173#212#255'c'#184#225#255'K'#212#255#255'B'#139 - +#184#255',n'#166#234'A'#144'J'#255#148#210#159#255#145#208#154#255#141#205 - +#150#255#137#203#146#255#132#200#141#255'Q'#152'X'#255'A|F'#255#159#159#159 - +#255'Z'#142#196#255#152#195#224#255'|'#179#215#255't'#175#214#255'^'#196#237 - +#255'K'#136#179#255'4s'#171#234'D'#148'M'#255'B'#145'K'#255'?'#141'H'#255'=' - +#137'E'#255']'#164'e'#255'Z'#160'a'#255'E'#131'K'#255#158#158#158#255#158#158 - +#158#255'`'#146#201#255#158#199#226#255#131#184#218#255'}'#180#215#255'~'#179 - +#215#255'O'#137#180#255';y'#177#234#255#255#255#0#255#255#255#0'www'#255#154 - +#154#154#255'='#138'E'#255'I'#138'O'#255#156#156#156#255#157#157#157#255#157 - +#157#157#255'f'#150#204#255#162#203#227#255#137#189#220#255#131#185#218#255 - +#132#185#218#255'Q'#139#181#255'C~'#182#234#255#255#255#0#255#255#255#0'zzz' - +#255#153#153#153#255'R'#145'Y'#255#153#154#153#255#155#155#155#255#156#156 - +#156#255#156#156#156#255'l'#154#208#255#167#206#229#255#143#193#223#255#137 - +#189#220#255#139#189#220#255'S'#141#182#255'K'#132#188#234#255#255#255#0#255 - +#255#255#0'}}}'#255#153#153#153#255#153#153#153#255#154#154#154#255#154#154 - +#154#255#155#155#155#255#155#155#155#255'o'#157#211#255#170#209#231#255#171 - +#209#231#255#152#199#225#255#145#194#222#255'V'#143#183#255'R'#137#193#234 - +#255#255#255#0#255#255#255#0#128#128#128#255'~~~'#255'|||'#255'zzz'#255'www' - ,#255'uuu'#255'rrr'#255'q'#158#212#255'o'#158#214#255#135#178#220#255#171#211 - +#232#255#169#208#230#255'X'#144#184#255'Y'#142#198#234#255#255#255#0#255#255 - +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 - +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'p'#158#214#219'm' - +#156#212#255#133#177#218#255'Z'#145#185#255'`'#147#203#234#255#255#255#0#255 - +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 - +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 - +#255#255#255#0'm'#156#212#137'j'#154#210#251'f'#151#207#238#7'OnClick'#7#17 - +'ActionExitExecute'#0#0#0#9'TMenuItem'#8'MenuEdit'#7'Caption'#6#5'&Edit'#13 - +'SubMenuImages'#7#17'Mufasa_Image_List'#7'OnClick'#7#13'MenuEditClick'#0#9'T' - +'MenuItem'#12'MenuItemUndo'#6'Action'#7#10'ActionUndo'#11'Bitmap.Data'#10':' - +#4#0#0'6'#4#0#0'BM6'#4#0#0#0#0#0#0'6'#0#0#0'('#0#0#0#16#0#0#0#16#0#0#0#1#0' ' - +#0#0#0#0#0#0#4#0#0'd'#0#0#0'd'#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 - +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#24#166#195 - +'i'#26#167#196'i'#0#160#196#24#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 - +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#160#196']f'#219 - +#234#178#17#166#194#174#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 - +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#160#196'"C'#196#219#252 - +'C'#197#216#254'#'#166#192#127#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 - +#0#0#0#0#0#0#160#196#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#14#170#203 - +#254']'#218#233#254'#'#166#192#239#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 - +#0#0#0#0#160#196#255#0#160#196#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#158#193 - +#26#2#172#200#255#136#231#242#254#17#162#194#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0 - +#0#0#5'y}'#17#0#160#196#255'v'#237#251#255#0#160#196#255#0#0#0#0#0#0#0#0#0 - +#160#196'0'#0#153#185'P'#0#160#196#201'm'#230#245#255'v'#226#239#255#25#163 - +#193#255#0#0#0#0#0#0#0#0#0#0#0#0#5'y}'#17#0#160#196#255'v'#237#251#255'v'#237 - +#251#255#0#160#196#255#0#160#196#255#0#160#196#255#0#160#196#255#1#169#196 - +#255'n'#225#238#255#15#201#223#255'i'#228#242#255#26#164#192#248#0#0#0#0#0#0 - +#0#0#5'y}'#17#0#160#196#255'v'#237#251#255#4#195#218#255'v'#237#251#255'i' - +#234#249#255'i'#234#249#255'i'#234#249#255'i'#234#249#255#5#221#247#255#10 - +#200#223#255#7#194#216#255'o'#220#235#255#27#163#191#244#0#0#0#0#5'y~'#17#0 - +#160#196#255'y'#237#251#255'2'#226#248#255','#223#244#255#4#192#214#255#4#192 - +#214#255#4#192#214#255#29#210#232#255#29#210#232#255#29#210#232#255#11#200 - +#223#255'j'#229#243#255#27#171#197#248#21#160#188#203#0#0#0#0#0#160#196#255 - +#173#243#251#255'/'#224#246#255'2'#226#248#255'2'#226#247#255'2'#226#247#255 - +'/'#224#245#255')'#219#241#255#29#210#232#255#29#210#232#255#29#210#232#255 - +'6'#217#236#255'@'#205#225#255#22#161#189#202#5'y}'#10#0#0#0#0#5'y}'#10#0#160 - +#196#255#173#243#251#255'/'#224#246#255'2'#226#247#255')'#219#241#255'/'#224 - +#245#255')'#219#241#255#22#205#227#255'6'#217#236#255'i'#231#246#255'A'#206 - +#227#254#19#163#193#228#5'y}2'#0#0#0#0#0#0#0#0#0#0#0#0#5'y}'#17#0#160#196#255 - +#173#243#251#255'1'#225#246#255' '#227#250#255's'#236#250#255'o'#235#250#255 - +'n'#232#247#255'l'#232#247#248#20#161#188#212#20#163#193#213#5'y}'#28#0#0#0#0 - +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#5'y}'#17#0#160#196#255#173#243#251#255'%' - +#228#251#255#0#160#196#255#0#160#196#255#19#161#190#231#21#159#187#207#27#161 - +#187#164#6'z|'#11#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#5 - +'y}'#17#0#160#196#255#173#243#251#255#0#160#196#255#0#0#0#0#0#0#0#0#0#0#0#0#0 - +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 - +#0#0#157#191#20#0#160#196#255#0#160#196#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 - +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 - +#0#0#0#0#0#0#160#196#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 - +#0#0#0#0#0#0#0#0#0#0#7'OnClick'#7#17'ActionUndoExecute'#0#0#9'TMenuItem'#12 - +'MenuItemRedo'#6'Action'#7#10'ActionRedo'#11'Bitmap.Data'#10':'#4#0#0'6'#4#0 - +#0'BM6'#4#0#0#0#0#0#0'6'#0#0#0'('#0#0#0#16#0#0#0#16#0#0#0#1#0' '#0#0#0#0#0#0 - +#4#0#0'd'#0#0#0'd'#0#0#0#0#0#0#0#0#0#0#0#255#255#255#0#0#0#0#0#0#160#196#24 - +#26#167#196'i'#24#166#195'i'#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 - +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#255#255#255#0#0#0#0#0#17#166#194#174 - +'f'#219#234#178#0#160#196']'#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 - +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#255#255#255#0'#'#166#192#127'C'#197 - +#216#254'C'#196#219#252#0#160#196'"'#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 - +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#255#255#255#0'#'#166#192#239 - +']'#218#233#254#14#170#203#254#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#160 - +#196#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#255#255#255#0#17#162 - +#194#255#136#231#242#254#2#172#200#255#0#158#193#26#0#0#0#0#0#0#0#0#0#0#0#0#0 - +#0#0#0#0#160#196#255#0#160#196#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 - ,#255#255#255#0#25#163#193#255'v'#226#239#255'm'#230#245#255#0#160#196#201#0 - +#153#185'P'#0#160#196'0'#0#0#0#0#0#0#0#0#0#160#196#255'v'#237#251#255#0#160 - +#196#255#5'y}'#17#0#0#0#0#0#0#0#0#0#0#0#0#255#255#255#0#26#164#192#248'i'#228 - +#242#255#15#201#223#255'n'#225#238#255#1#169#196#255#0#160#196#255#0#160#196 - +#255#0#160#196#255#0#160#196#255'v'#237#251#255'v'#237#251#255#0#160#196#255 - +#5'y}'#17#0#0#0#0#0#0#0#0#255#255#255#0#27#163#191#244'o'#220#235#255#7#194 - +#216#255#10#200#223#255#5#221#247#255'i'#234#249#255'i'#234#249#255'i'#234 - +#249#255'i'#234#249#255'v'#237#251#255#4#195#218#255'v'#237#251#255#0#160#196 - +#255#5'y}'#17#0#0#0#0#255#255#255#0#21#160#188#203#27#171#197#248'j'#229#243 - +#255#11#200#223#255#29#210#232#255#29#210#232#255#29#210#232#255#4#192#214 - +#255#4#192#214#255#4#192#214#255','#223#244#255'2'#226#248#255'y'#237#251#255 - +#0#160#196#255#5'y~'#17#255#255#255#0#5'y}'#10#22#161#189#202'@'#205#225#255 - +'6'#217#236#255#29#210#232#255#29#210#232#255#29#210#232#255')'#219#241#255 - +'/'#224#245#255'2'#226#247#255'2'#226#247#255'2'#226#248#255'/'#224#246#255 - +#173#243#251#255#0#160#196#255#255#255#255#0#0#0#0#0#5'y}2'#19#163#193#228'A' - +#206#227#254'i'#231#246#255'6'#217#236#255#22#205#227#255')'#219#241#255'/' - +#224#245#255')'#219#241#255'2'#226#247#255'/'#224#246#255#173#243#251#255#0 - +#160#196#255#5'y}'#10#255#255#255#0#0#0#0#0#0#0#0#0#5'y}'#28#20#163#193#213 - +#20#161#188#212'l'#232#247#248'n'#232#247#255'o'#235#250#255's'#236#250#255 - +' '#227#250#255'1'#225#246#255#173#243#251#255#0#160#196#255#5'y}'#17#0#0#0#0 - +#255#255#255#0#0#0#0#0#0#0#0#0#0#0#0#0#6'z|'#11#27#161#187#164#21#159#187#207 - +#19#161#190#231#0#160#196#255#0#160#196#255'%'#228#251#255#173#243#251#255#0 - +#160#196#255#5'y}'#17#0#0#0#0#0#0#0#0#255#255#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0 - +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#160#196#255#173#243#251#255#0#160 - +#196#255#5'y}'#17#0#0#0#0#0#0#0#0#0#0#0#0#255#255#255#0#0#0#0#0#0#0#0#0#0#0#0 - +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#160#196#255#0#160#196#255#0#157 - +#191#20#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#255#255#255#0#0#0#0#0#0#0#0#0#0#0#0#0 - +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#160#196#255#0#0#0#0#0#0#0#0#0#0#0 - +#0#0#0#0#0#0#0#0#0#0#0#0#0#7'OnClick'#7#17'ActionRedoExecute'#0#0#9'TMenuIte' - +'m'#16'MenuItemDivider3'#7'Caption'#6#1'-'#0#0#9'TMenuItem'#11'MenuItemCut'#6 - +'Action'#7#9'ActionCut'#11'Bitmap.Data'#10':'#4#0#0'6'#4#0#0'BM6'#4#0#0#0#0#0 - +#0'6'#0#0#0'('#0#0#0#16#0#0#0#16#0#0#0#1#0' '#0#0#0#0#0#0#4#0#0'd'#0#0#0'd'#0 - +#0#0#0#0#0#0#0#0#0#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 - +#255#255#255#0#255#255#255#0#255#255#255#0#2#13#140#10#28''''#166#159'5?'#201 - +#247'"-'#175#185#3#13#140#28#255#255#255#0#255#255#255#0#255#255#255#0#255 - +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#5#15#141#31#6#16#142'&' - +#1#11#138#3#255#255#255#0#18#28#155'p@K'#217#255',5'#191#221'=G'#209#255#29 - +''''#169#164#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 - +#255#0#255#255#255#0#15#25#151'c2='#199#248'7A'#207#255#31')'#171#176#0#10 - +#134#24'#-'#180#175'5@'#204#253#0#9#133#24#28''''#168#149'4>'#197#248#4#14 - +#140#20#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 - +'/:'#189#222'5?'#201#229'%0'#179#194'?J'#221#255#31'*'#172#194'$0'#178#203'2' - +'<'#198#242#0#10#134#3#17#27#157'w7A'#200#255#8#18#142' '#255#255#255#0#255 - +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'2<'#195#236'#.'#173#175 - +#255#255#255#0#26'%'#168#153'BP'#210#255#203#163'u'#254'AO'#214#255#22'!'#163 - +#157'/9'#192#212'.8'#190#223#2#13#139#10#255#255#255#0#255#255#255#0#255#255 - +#255#0#255#255#255#0#255#255#255#0#29'('#169#156';F'#204#255#8#18#144':'#7#17 - +#144'S;H'#212#255#219#189#156#255#238#204#166#255'@L'#222#255':C'#209#255#15 - +#25#152'i'#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 - +#255#0#255#255#255#0#3#13#140#31',5'#185#215''#202#242'?L'#215 - +#255#216#188#154#255#246#234#225#255#187#146'Z'#191#148'b'#24';'#145'a'#26#1 - +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 - +#255#255#0#255#255#255#0#3#13#140#31#27'&'#167#153'*4'#186#204#17#28#157#137 - +#187#152'i'#204#240#224#208#255#183#145'_'#197#143']'#20#11#255#255#255#0#255 - +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 - +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#0#11#136#2#255#255#255#0#180 - +#142'Z'#144#246#234#221#255#225#205#180#255#177#141']'#191#255#255#255#0#255 - +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 - +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 - +#179#140'W'#137#241#226#212#255#206#178#142#244#245#235#224#255#166#127'J' - +#157#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 - +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 - +#255#255#0#177#137'S'#132#238#223#206#255#151'f e'#194#163'|'#218#233#216#197 - +#253#169#130'N{'#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 - ,#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 - +#255#0#175#135'P|'#231#213#193#255#149'e'#31'+'#143'\'#18#27#197#167#131#231 - +#213#188#157#225#181#147'db'#255#255#255#0#255#255#255#0#255#255#255#0#255 - +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 - +#255#0#172#131'Ku'#222#201#175#255#149'd'#29#31#255#255#255#0#146'`'#23'&' - +#195#164'|'#235#181#144'c'#203#255#255#255#0#255#255#255#0#255#255#255#0#255 - +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 - +#255#0#170#129'Go'#214#189#159#247#147'a'#25#16#255#255#255#0#255#255#255#0 - +#150'f ,'#169#128'K'#203#255#255#255#0#255#255#255#0#255#255#255#0#255#255 - +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 - +#168'}Bi'#204#176#139#224#145']'#20#9#255#255#255#0#255#255#255#0#255#255#255 - +#0#146'`'#23#6#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 - +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#154'k''1' - +#170'~C'#161#146'`'#24#5#255#255#255#0#255#255#255#0#255#255#255#0#255#255 - +#255#0#255#255#255#0#255#255#255#0#7'OnClick'#7#16'ActionCutExecute'#0#0#9'T' - +'MenuItem'#12'MenuItemCopy'#6'Action'#7#10'ActionCopy'#11'Bitmap.Data'#10':' - +#4#0#0'6'#4#0#0'BM6'#4#0#0#0#0#0#0'6'#0#0#0'('#0#0#0#16#0#0#0#16#0#0#0#1#0' ' - +#0#0#0#0#0#0#4#0#0'd'#0#0#0'd'#0#0#0#0#0#0#0#0#0#0#0#255#255#255#0#255#255 - +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#197'sB'#193 - +#198'uE'#230#200'uE'#254#199'uE'#243#200'uE'#243#199'uE'#243#199'uE'#243#200 - +'uF'#244#197'tD'#232#202#127'S'#241#255#255#255#0#255#255#255#0#255#255#255#0 - +#255#255#255#0#255#255#255#0#255#255#255#0#199'yI'#237#252#243#236#255#250 - +#241#232#255#250#240#231#255#251#241#233#255#251#242#234#255#251#242#234#255 - +#251#242#235#255#253#244#238#255#202#128'T'#249#255#255#255#0#255#255#255#0 - +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#207#130'S'#255#239 - +#241#231#255#255#233#217#255#255#234#219#255#255#233#217#255#255#231#215#255 - +#255#229#210#255#255#226#203#255#239#242#232#255#206#129'V'#255#255#255#255#0 - +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#204 - +#131'R'#251#251#245#238#255#255#233#217#255#255#234#219#255#255#233#217#255 - +#255#231#215#255#255#229#210#255#255#226#203#255#251#246#239#255#204#131'U' - +#254#199'yJ'#185#200'yK'#206#200'uE'#221#199'uE'#212#200'uE'#212#199'uE'#212 - +#202#132'R'#255#255#247#241#255#255#233#217#255#255#234#219#255#255#233#217 - +#255#255#231#215#255#255#229#210#255#255#226#203#255#255#247#241#255#203#133 - +'U'#254#200'|N'#211#252#243#236#222#250#241#232#222#250#240#231#222#251#241 - +#233#222#251#242#234#222#228#186#145#255#255#247#240#255#255#231#213#255#253 - +#231#214#255#253#230#212#255#252#228#208#255#251#227#203#255#250#220#194#255 - +#254#243#232#255#204#134'V'#254#207#130'S'#222#239#241#231#222#255#233#217 - +#222#255#234#219#222#255#233#217#222#255#231#215#222#228#187#145#255#255#247 - +#242#255#254#231#213#255#254#231#213#255#253#229#209#255#250#224#202#255#249 - +#222#196#255#247#217#188#255#253#242#231#255#204#135'W'#254#204#131'R'#219 - +#251#245#238#222#255#233#217#222#255#234#219#222#255#233#217#222#255#231#215 - +#222#228#187#146#255#254#247#241#255#252#229#210#255#252#228#209#255#251#226 - +#204#255#249#221#196#255#246#215#187#255#243#209#175#255#250#239#228#255#204 - +#135'X'#254#202#132'R'#219#255#247#241#222#255#233#217#222#255#234#219#222 - +#255#233#217#222#255#231#215#222#228#187#146#255#254#246#240#255#252#226#205 - +#255#252#227#205#255#250#223#200#255#247#217#188#255#245#233#221#255#250#243 - +#235#255#251#248#243#255#202#131'S'#254#203#133'S'#219#255#247#240#222#255 - +#231#213#222#253#231#214#222#253#230#212#222#252#228#208#222#228#187#147#255 - +#254#245#237#255#252#222#197#255#251#224#199#255#249#220#194#255#245#211#180 - +#255#254#249#243#255#250#226#196#255#236#193#147#255#195'}H'#147#203#134'T' - +#219#255#247#242#222#254#231#213#222#254#231#213#222#253#229#209#222#250#224 - +#202#222#229#190#150#255#255#255#254#255#253#243#233#255#253#243#234#255#252 - +#242#232#255#250#239#227#255#250#242#231#255#234#187#136#255#207#133'U'#179 - +#180'i='#12#203#134'U'#219#254#247#241#222#252#229#210#222#252#228#209#222 - +#251#226#204#222#249#221#196#222#234#195#157#255#230#191#150#255#228#187#146 - +#255#228#187#146#255#209#160'l'#245#208#158'm'#246#204#150'_'#218#196'yB~' - +#178'g<'#9#255#255#255#0#203#134'U'#219#254#246#240#222#252#226#205#222#252 - +#227#205#222#250#223#200#222#247#217#188#222#245#233#221#222#250#243#235#222 - +#251#248#243#222#205#149'e'#220#255#255#255#0#255#255#255#0#255#255#255#0#255 - +#255#255#0#255#255#255#0#255#255#255#0#203#134'V'#218#254#245#237#222#252#222 - +#197#222#251#224#199#222#249#220#194#222#245#211#180#222#254#249#243#222#250 - +#226#196#222#236#193#147#222#195'}H'#128#255#255#255#0#255#255#255#0#255#255 - +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#202#133'T'#208#255#255#255 - +#219#253#243#233#222#253#243#234#222#252#242#232#222#250#239#227#222#250#242 - ,#231#222#234#187#136#222#207#133'U'#156#180'i='#10#255#255#255#0#255#255#255 - +#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#199'yG'#170#204 - +#134'U'#206#204#136'W'#222#203#136'V'#219#204#136'V'#219#203#135'W'#219#202 - +#131'P'#208#196'yBn'#178'g<'#8#255#255#255#0#255#255#255#0#255#255#255#0#255 - +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#7'OnClick'#7#17'ActionC' - +'opyExecute'#0#0#9'TMenuItem'#13'MenuItemPaste'#6'Action'#7#11'ActionPaste' - +#11'Bitmap.Data'#10':'#4#0#0'6'#4#0#0'BM6'#4#0#0#0#0#0#0'6'#0#0#0'('#0#0#0#16 - +#0#0#0#16#0#0#0#1#0' '#0#0#0#0#0#0#4#0#0'd'#0#0#0'd'#0#0#0#0#0#0#0#0#0#0#0 - +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'^^^'#2 - +'[[[wXXX'#138'UUU'#138'RRR'#138'OOO'#138'LLL'#138'JJJ'#138'HHH'#138'FFF'#138 - +'DDDf c'#152'J c'#152#207' c'#152#255' c'#152#255' c'#152#255'$c'#149#255'Xs' - +#136#255#247#247#247#255#240#240#240#255#240#240#240#255#240#240#240#255#240 - +#240#240#255#240#240#240#255#240#240#240#255#243#243#243#250'FFF'#132' c'#152 - +#194'b'#165#215#255'e'#168#218#255'd'#166#217#255'b'#164#216#255'b'#159#209 - +#255'u'#142#164#255#239#239#239#255#231#231#231#255#231#231#231#255#231#231 - +#231#255#231#231#231#255#230#230#230#255#230#230#230#255#236#236#236#250'III' - +#132' c'#152#255'h'#171#220#255'H'#142#207#255'F'#139#206#255'C'#135#205#255 - +'D'#132#198#255'h'#133#161#255#240#240#240#255#180#180#180#255#180#180#180 - +#255#180#180#180#255#180#180#180#255#180#180#180#255#179#179#179#255#237#237 - +#237#250'LLL'#132' c'#152#255'i'#174#220#255'J'#147#209#255'H'#143#208#255'F' - +#139#206#255'G'#136#199#255'l'#136#163#255#240#240#240#255#232#232#232#255 - +#232#232#232#255#231#231#231#255#231#231#231#255#231#231#231#255#231#231#231 - +#255#237#237#237#250'OOO'#132' c'#152#255'k'#177#222#255'M'#151#211#255'K' - +#147#210#255'H'#143#208#255'J'#140#201#255'o'#139#165#255#241#241#241#255#182 - +#182#182#255#181#181#181#255#181#181#181#255#180#180#180#255#180#180#180#255 - +#180#180#180#255#237#237#237#250'SSS'#132' c'#152#255'm'#179#223#255'P'#156 - +#213#255'N'#152#211#255'K'#148#209#255'L'#145#203#255'p'#142#167#255#241#241 - +#241#255#233#233#233#255#233#233#233#255#232#232#232#255#232#232#232#255#232 - +#232#232#255#231#231#231#255#237#237#237#250'VVV'#132' c'#152#255'p'#181#224 - +#255'R'#159#215#255'P'#156#214#255'N'#152#212#255'O'#149#205#255's'#145#170 - +#255#241#241#241#255#183#183#183#255#182#182#182#255#182#182#182#255#182#182 - +#182#255#181#181#181#255#181#181#181#255#238#238#238#250'ZZZ'#132' c'#152#255 - +'s'#183#225#255'W'#163#215#255'S'#160#215#255'P'#157#213#255'R'#153#207#255 - +'u'#148#172#255#248#248#248#255#242#242#242#255#242#242#242#255#242#242#242 - +#255#242#242#242#255#242#242#242#255#241#241#241#255#244#244#244#250'^^^'#132 - +' c'#152#255'v'#185#226#255'\'#167#217#255'X'#164#216#255'S'#160#215#255'S' - +#158#213#255'a'#139#169#255'd'#136#161#255'd'#135#161#255'c'#134#160#255'i' - +#135#159#255'Jh'#129#255'jjj'#138'hhh'#138'eee'#138'bbbc c'#152#255'z'#187 - +#227#255'a'#170#219#255'Z'#165#217#255'S'#160#215#255'R'#159#215#255'R'#159 - +#215#255'R'#159#215#255'R'#159#215#255'R'#159#215#255'b'#163#216#255' c'#152 - +#255#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0' c'#152#255'|' - +#189#228#255'e'#174#221#255'b'#171#220#255'^'#168#218#255'\'#167#217#255'\' - +#167#217#255'\'#167#217#255'\'#167#217#255'R'#159#215#255'b'#163#216#255' c' - +#152#255#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0' c'#152#255 - +#127#191#228#255'i'#178#222#255'J'#155#218#255'D'#151#220#255'C'#150#220#255 - +'B'#150#220#255'B'#149#220#255'A'#149#219#255'Q'#158#214#255'l'#178#222#255 - +' c'#152#255#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0' c'#152 - +#224'q'#179#219#254'~'#191#228#255'N'#157#223#255#181#238#253#255'u'#212#240 - +#255'u'#212#240#255#181#238#253#255'K'#155#222#255'n'#180#224#255'm'#179#223 - +#249' c'#152#243#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0' c' - +#152'2 c'#152#178' c'#152#255'7u'#164#255#182#239#254#255#128#219#243#255#128 - +#219#243#255#182#239#254#255'.n'#161#255' c'#152#255' c'#152#165' c'#152'S' - +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 - +#255#255#0' c'#152'* c'#152#255' c'#152#255' c'#152#255' c'#152#255' c'#152 - +#255' c'#152#240#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 - +#255#255#0#255#255#255#0#255#255#255#0#7'OnClick'#7#18'ActionPasteExecute'#0 - +#0#9'TMenuItem'#14'MenuItemDelete'#6'Action'#7#12'ActionDelete'#11'Bitmap.Da' + +'('#1#3'Top'#2#0#5'Width'#2#5#11'OnCanResize'#7#29'SplitterFunctionListCanRe' + +'size'#7'Visible'#8#0#0#244#18'TFunctionListFrame'#15'frmFunctionList'#6'Hei' + +'ght'#3'('#1#5'Width'#3#150#0#12'ClientHeight'#3'('#1#11'ClientWidth'#3#150#0 + +#9'OnEndDock'#13#8'TabOrder'#2#3#0#241#9'TTreeView'#12'FunctionList'#6'Heigh' + +'t'#3#1#1#5'Width'#3#150#0#8'OnChange'#7#18'FunctionListChange'#7'OnEnter'#7 + +#17'FunctionListEnter'#6'OnExit'#7#16'FunctionListExit'#0#0#241#5'TEdit'#14 + +'editSearchList'#3'Top'#3#19#1#5'Width'#3#150#0#6'OnExit'#7#18'editSearchLis' + +'tExit'#9'OnKeyDown'#7#21'editSearchListKeyDown'#10'OnKeyPress'#7#22'editSea' + +'rchListKeyPress'#0#0#241#6'TLabel'#17'FunctionListLabel'#5'Width'#3#146#0#0 + +#0#0#0#9'TMainMenu'#8'MainMenu'#4'left'#3#232#1#3'top'#3#144#0#0#9'TMenuItem' + +#8'MenuFile'#7'Caption'#6#5'&File'#13'SubMenuImages'#7#17'Mufasa_Image_List' + +#0#9'TMenuItem'#11'MenuItemNew'#6'Action'#7#15'ActionNewScript'#11'Bitmap.Da' +'ta'#10':'#4#0#0'6'#4#0#0'BM6'#4#0#0#0#0#0#0'6'#0#0#0'('#0#0#0#16#0#0#0#16#0 +#0#0#1#0' '#0#0#0#0#0#0#4#0#0'd'#0#0#0'd'#0#0#0#0#0#0#0#0#0#0#0#255#255#255#0 - +#255#255#255#0#0#0#0#6#0#0#0#14#0#0#0#22#0#0#0#30#0#0#0'%'#0#0#0'*'#0#0#0'+' - +#0#0#0')'#0#0#0'$'#0#0#0#29#0#0#0#21#0#0#0#13#0#0#0#4#255#255#255#0#255#255 - +#255#0#255#255#255#0#0#0#255#1#0#0#211'F'#255#255#255#0#255#255#255#0#255#255 - +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 - +#0#0#211'F'#0#0#255#1#255#255#255#0#255#255#255#0#255#255#255#0#0#0#255#1#0#0 - ,#206#150#0#0#206#255#0#0#206'x'#255#255#255#0#255#255#255#0#255#255#255#0#255 - +#255#255#0#255#255#255#0#255#255#255#0#0#0#206'x'#0#0#207#255#0#0#207#150#0#0 - +#255#1#255#255#255#0#255#255#255#0#0#0#200'F'#0#0#200#255#0#0#200#255#0#0#201 - +#255#0#0#202'x'#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#0#0 - +#202'x'#0#0#201#255#0#0#201#255#0#0#201#255#0#0#200'F'#255#255#255#0#255#255 - +#255#0#255#255#255#0#0#0#193'x'#0#0#195#255#0#0#195#255#0#0#195#255#0#0#196 - +'x'#255#255#255#0#255#255#255#0#0#0#196'x'#0#0#195#255#0#0#195#255#0#0#195 - +#255#0#0#196'x'#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 - +#255#255#0#0#0#189'x'#0#0#189#255#0#0#189#255#0#0#189#255#0#0#189'x'#0#0#189 - +'x'#0#0#189#255#0#0#189#255#0#0#189#255#0#0#189'x'#255#255#255#0#255#255#255 - +#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#0#0 - +#183'x'#0#0#183#255#0#0#183#255#0#0#183#255#0#0#183#255#0#0#183#255#0#0#183 - +#255#0#0#183'x'#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 - +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#0#0#176'x' - +#0#0#177#255#0#0#177#255#0#0#177#255#0#0#177#255#0#0#179'x'#255#255#255#0#255 - +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 - +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#0#0#170'x'#0#0#171#255#0#0 - +#171#255#0#0#171#255#0#0#172#255#0#0#172'x'#255#255#255#0#255#255#255#0#255 - +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 - +#255#0#255#255#255#0#0#0#166'x'#0#0#165#255#0#0#165#255#0#0#165#255#0#0#166 - +#255#0#0#166#255#0#0#166#255#0#0#166'x'#255#255#255#0#255#255#255#0#255#255 - +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#0#0#159'x'#0#0 - +#159#255#0#0#159#255#0#0#159#255#0#0#159'x'#0#0#159'x'#0#0#160#255#0#0#160 - +#255#0#0#160#255#0#0#159'x'#255#255#255#0#255#255#255#0#255#255#255#0#255#255 - +#255#0#255#255#255#0#0#0#153'x'#0#0#153#255#0#0#153#255#0#0#153#255#0#0#153 - +'x'#255#255#255#0#255#255#255#0#0#0#153'x'#0#0#154#255#0#0#154#255#0#0#154 - +#255#0#0#153'x'#255#255#255#0#255#255#255#0#255#255#255#0#0#0#146'F'#0#0#147 - +#255#0#0#147#255#0#0#147#255#0#0#149'x'#255#255#255#0#255#255#255#0#255#255 - +#255#0#255#255#255#0#0#0#149'x'#0#0#148#255#0#0#148#255#0#0#148#255#0#0#149 - +'F'#255#255#255#0#255#255#255#0#0#0#255#1#0#0#141#150#0#0#141#255#0#0#142'x' + +#187'j4k'#186'e0'#188#187'f1'#237#186'f0'#247#186'f0'#247#186'f0'#247#186'e0' + +#247#186'e/'#247#185'e.'#247#185'e.'#247#185'd.'#247#185'd.'#239#183'b,'#189 + +#183'b.c'#255#255#255#0#255#255#255#0#188'i3'#222#248#241#234#242#247#236#223 + +#253#246#235#222#255#246#234#222#255#246#234#220#255#246#234#220#255#250#243 + +#235#255#250#243#235#255#250#242#234#255#252#247#243#255#252#248#244#253#254 + +#254#253#240#183'`*'#213#255#255#255#0#255#255#255#0#191'q8'#245#245#235#223 + +#254#253#191'h'#255#252#189'g'#255#251#190'e'#255#252#190'd'#255#252#190'd' + +#255#252#189'b'#255#251#189'c'#255#251#188'a'#255#252#190'`'#255#252#188'b' + +#255#253#251#248#253#185'd-'#243#255#255#255#0#255#255#255#0#193'x<'#247#247 + +#237#227#255#253#194'n'#255#255#216#160#255#255#215#158#255#255#214#155#255 + +#255#215#152#255#255#214#150#255#255#214#149#255#255#213#148#255#255#212#147 + +#255#251#190'e'#255#251#247#244#255#187'g1'#247#255#255#255#0#255#255#255#0 + +#196'|@'#247#247#240#230#255#248#180'U'#255#247#180'V'#255#247#181'T'#255#248 + +#180'S'#255#248#178'S'#255#247#179'R'#255#247#179'R'#255#247#178'Q'#255#247 + +#178'O'#255#247#178'O'#255#252#249#245#255#191'o6'#247#255#255#255#0#255#255 + +#255#0#197#128'B'#247#248#241#232#255#254#229#213#255#253#229#211#255#253#229 + +#211#255#252#229#211#255#252#229#211#255#252#228#209#255#252#226#206#255#252 + +#226#204#255#251#224#201#255#251#225#200#255#253#250#247#255#193'v;'#247#255 + +#255#255#0#255#255#255#0#197#130'E'#247#248#242#235#255#254#231#214#255#253 + +#231#214#255#253#231#214#255#253#231#214#255#253#230#213#255#253#229#211#255 + ,#252#228#209#255#252#226#205#255#251#225#203#255#251#225#201#255#251#247#242 + +#255#197'|?'#247#255#255#255#0#255#255#255#0#198#132'G'#247#249#243#236#255 + +#254#232#214#255#254#232#215#255#253#231#214#255#253#231#214#255#253#231#213 + +#255#253#229#211#255#251#228#208#255#251#227#204#255#250#223#199#255#250#223 + +#198#255#250#242#234#255#198#128'B'#247#255#255#255#0#255#255#255#0#198#136 + +'I'#247#249#244#237#255#254#232#216#255#254#232#216#255#254#232#215#255#254 + +#231#214#255#253#229#211#255#252#228#209#255#251#225#204#255#250#224#199#255 + +#249#221#195#255#248#220#194#255#250#244#237#255#198#130'E'#247#255#255#255#0 + +#255#255#255#0#198#136'J'#247#249#244#239#255#254#231#215#255#253#231#214#255 + +#253#231#213#255#253#230#212#255#252#230#210#255#251#225#204#255#250#223#199 + +#255#248#220#194#255#246#218#189#255#246#216#187#255#250#244#239#255#198#131 + +'F'#247#255#255#255#0#255#255#255#0#198#137'K'#247#249#244#240#255#252#230 + +#211#255#252#230#212#255#253#231#211#255#252#228#209#255#251#227#205#255#250 + +#224#200#255#248#220#194#255#245#214#187#255#243#212#181#255#241#210#179#255 + +#248#244#240#255#196#130'F'#247#255#255#255#0#255#255#255#0#198#137'K'#247 + +#249#245#241#255#252#227#207#255#251#228#208#255#252#228#207#255#252#227#205 + +#255#250#225#202#255#249#221#196#255#246#217#188#255#244#233#223#255#247#242 + +#236#255#251#247#243#255#245#239#233#255#194'~E'#251#255#255#255#0#255#255 + +#255#0#198#137'L'#246#249#245#241#255#252#227#205#255#251#227#206#255#251#227 + +#205#255#251#226#203#255#249#224#200#255#248#220#194#255#245#214#186#255#253 + +#251#248#255#252#230#205#255#250#229#201#255#226#182#132#255#191'yB'#166#255 + +#255#255#0#255#255#255#0#197#136'K'#234#250#246#242#252#250#224#199#255#251 + +#225#201#255#251#226#201#255#251#224#200#255#249#223#197#255#248#219#193#255 + +#244#214#184#255#255#251#248#255#246#216#180#255#225#176'}'#255#219#146'd' + +#246#180'k>'#7#255#255#255#0#255#255#255#0#196#133'I'#195#247#242#236#236#248 + +#244#238#252#248#244#237#255#248#243#237#255#248#243#237#255#248#243#237#255 + +#248#242#236#255#247#242#236#255#242#230#215#255#226#178'}'#255#219#148'e' + +#245#179'h;'#7#255#255#255#0#255#255#255#0#255#255#255#0#193'}D`'#200#139'M' + +#187#200#140'O'#238#200#140'O'#246#200#140'O'#247#200#140'O'#247#200#141'O' + +#247#201#140'O'#247#199#139'O'#247#197#137'K'#212#196'v;'#145#179'h<'#6#255 + +#255#255#0#255#255#255#0#255#255#255#0#13'SubMenuImages'#7#17'Mufasa_Image_L' + +'ist'#7'OnClick'#7#16'ActionNewExecute'#0#0#9'TMenuItem'#15'MenuItemDivider' + +#7'Caption'#6#1'-'#0#0#9'TMenuItem'#12'MenuItemOpen'#6'Action'#7#16'ActionOp' + +'enScript'#11'Bitmap.Data'#10':'#4#0#0'6'#4#0#0'BM6'#4#0#0#0#0#0#0'6'#0#0#0 + +'('#0#0#0#16#0#0#0#16#0#0#0#1#0' '#0#0#0#0#0#0#4#0#0'd'#0#0#0'd'#0#0#0#0#0#0 + +#0#0#0#0#0','#134#216#209'-'#136#216#247'-'#135#216#247'-'#136#216#247'-'#136 + +#216#247'-'#136#216#247'-'#136#216#247'-'#136#216#247'-'#136#216#247'-'#136 + +#216#247'-'#136#216#247'-'#135#216#247'-'#136#216#247','#134#216#209#255#255 + +#255#0#255#255#255#0'3'#142#217#251#220#240#250#255#152#225#246#255#149#224 + +#246#255#146#223#246#255#142#222#245#255#137#220#245#255#133#218#244#255#128 + +#217#244#255'z'#215#243#255't'#213#243#255'p'#211#242#255#194#234#248#255'5' + +#148#218#255#255#255#255#0#255#255#255#0'5'#148#218#247#239#250#254#255#147 + +#229#248#255#143#228#248#255#137#227#248#255#130#225#247#255'z'#223#247#255 + +'q'#222#246#255'g'#219#245#255'['#216#244#255'M'#212#243#255'@'#209#242#255 + +#202#242#251#255'5'#148#218#255#255#255#255#0#255#255#255#0'6'#154#218#248 + +#242#250#253#255#148#230#248#255#146#229#248#255#144#229#248#255#139#227#248 + +#255#134#226#247#255#127#225#247#255'w'#222#246#255'l'#220#246#255'^'#217#244 + +#255'O'#213#243#255#204#242#251#255'5'#148#218#255#255#255#255#0#255#255#255 + +#0'6'#161#218#249#246#252#254#255#148#229#248#255#147#229#248#255#147#229#248 + +#255#145#229#248#255#147#219#233#255#147#215#227#255#147#210#220#255#144#206 + +#215#255#140#200#207#255#134#193#198#255#201#216#214#255'5'#148#218#255#197 + +'tD'#232#202#127'S'#241'7'#166#218#250#254#255#255#255#248#253#255#255#246 + +#253#255#255#245#252#255#255#243#252#254#255#154#228#244#255#154#230#247#255 + +#155#230#246#255#157#229#245#255#158#229#245#255#159#229#244#255#218#243#248 + +#255'5'#148#218#255#253#244#238#255#202#128'T'#249'5'#171#218#250#232#246#251 + +#255'p'#188#231#255'U'#170#226#255'M'#165#224#255#145#201#235#255#250#243#239 + +#255#253#254#253#255#255#253#252#255#255#253#252#255#254#253#252#255#254#252 + +#251#255#254#254#253#255'5'#148#218#255#239#242#232#255#206#129'V'#255'6'#170 + +#218#242#241#250#253#255#148#222#245#255#147#220#244#255'd'#188#233#255'5' + +#148#218#255'5'#148#218#255'5'#148#218#255'5'#148#218#255'5'#148#218#255'5' + +#148#218#255'5'#148#218#255'5'#148#218#255'5'#148#218#255#251#246#239#255#204 + +#131'U'#254'5'#175#218#240#247#252#254#255#142#228#248#255#145#222#245#255 + +#159#224#245#255#172#225#246#255#202#132'R'#255#255#247#241#255#255#233#217 + +#255#255#234#219#255#255#233#217#255#255#231#215#255#255#229#210#255#255#226 + ,#203#255#255#247#241#255#203#133'U'#254'6'#179#218#248#253#254#254#255#254 + +#255#255#255#254#254#255#255#253#254#255#255#254#255#255#255#228#186#145#255 + +#255#247#240#255#255#231#213#255#253#231#214#255#253#230#212#255#252#228#208 + +#255#251#227#203#255#250#220#194#255#254#243#232#255#204#134'V'#254'4'#180 + +#217#208'^'#194#225#250'`'#195#226#250'`'#195#226#250'`'#195#226#250'_'#195 + +#226#250#228#187#145#255#255#247#242#255#254#231#213#255#254#231#213#255#253 + +#229#209#255#250#224#202#255#249#222#196#255#247#217#188#255#253#242#231#255 + +#204#135'W'#254#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 + +#255#255#0#255#255#255#0#228#187#146#255#254#247#241#255#252#229#210#255#252 + +#228#209#255#251#226#204#255#249#221#196#255#246#215#187#255#243#209#175#255 + +#250#239#228#255#204#135'X'#254#255#255#255#0#255#255#255#0#255#255#255#0#255 + +#255#255#0#255#255#255#0#255#255#255#0#228#187#146#255#254#246#240#255#252 + +#226#205#255#252#227#205#255#250#223#200#255#247#217#188#255#245#233#221#255 + +#250#243#235#255#251#248#243#255#202#131'S'#254#255#255#255#0#255#255#255#0 + +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#228#187#147#255#254 + +#245#237#255#252#222#197#255#251#224#199#255#249#220#194#255#245#211#180#255 + +#254#249#243#255#250#226#196#255#236#193#147#255#195'}H'#147#255#255#255#0 + +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#229 + +#190#150#255#255#255#254#255#253#243#233#255#253#243#234#255#252#242#232#255 + +#250#239#227#255#250#242#231#255#234#187#136#255#207#133'U'#179#180'i='#12 +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 - +#255#255#0#0#0#142'x'#0#0#142#255#0#0#143#150#0#0#255#1#255#255#255#0#255#255 - +#255#0#255#255#255#0#0#0#255#1#0#0#135'F'#255#255#255#0#255#255#255#0#255#255 - +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 - +#0#0#135'F'#0#0#255#1#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 - +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 - +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 - +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#7'OnClick'#7#19'ActionDelet' - +'eExecute'#0#0#9'TMenuItem'#16'MenuItemDivider4'#7'Caption'#6#1'-'#0#0#9'TMe' - +'nuItem'#17'MenuItemSelectAll'#6'Action'#7#15'ActionSelectAll'#7'OnClick'#7 - +#22'ActionSelectAllExecute'#0#0#9'TMenuItem'#16'MenuItemDivider5'#7'Caption' - +#6#1'-'#0#0#9'TMenuItem'#12'MenuItemFind'#6'Action'#7#15'ActionFindStart'#11 - +'Bitmap.Data'#10':'#4#0#0'6'#4#0#0'BM6'#4#0#0#0#0#0#0'6'#0#0#0'('#0#0#0#16#0 - +#0#0#16#0#0#0#1#0' '#0#0#0#0#0#0#4#0#0'd'#0#0#0'd'#0#0#0#0#0#0#0#0#0#0#0#0#0 - +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 - +#0#0#0#0#0#0#0#0#1#1#1' '#2#2#2#207#20#20#20#255'999'#207#0#0#0#0#0#0#0#0#0#0 - +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#1#1#1'0' - +#2#2#2#239#21#21#21#255':::'#255'```'#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 - +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#1#1#1'0'#2#2#2#239#21#21#21#255 - +';;;'#255'```'#255#128#128#128#207#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 - +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#1#1#1'0'#2#2#2#239#21#21#21#255';;;'#255'aaa' - +#255#129#129#129#207#140#140#140#16#0#0#0#0#0#0#0#0#0#0#0#0#140#140#140'P' - +#140#140#140#159#140#140#140#191#140#140#140#191#140#140#140#143'TTTP'#2#2#2 - +#239#22#22#22#255';;;'#255'aaa'#255#129#129#129#207#140#140#140#16#0#0#0#0#0 - +#0#0#0#140#140#140#16#140#140#140#191#140#140#140#255#162#159#154#255#190#182 - +#171#255#183#176#165#255#154#152#148#255#140#140#140#255'```'#255'<<<'#255'a' - +'aa'#255#129#129#129#207#140#140#140#16#0#0#0#0#0#0#0#0#140#140#140#16#140 - +#140#140#207#162#159#156#255#233#223#207#255#255#240#218#255#255#238#213#255 - +#255#236#208#255#255#235#204#255#219#204#181#255#147#146#144#255'|||'#255#129 - +#129#129#207#140#140#140#16#0#0#0#0#0#0#0#0#0#0#0#0#140#140#140#128#147#147 - +#146#255#241#232#220#255#255#244#227#255#255#242#222#255#255#240#217#255#255 - +#238#213#255#255#236#208#255#255#235#204#255#219#204#181#255#140#140#140#255 - +#140#140#140'P'#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#140#140#140#239#190#188#183 - +#255#255#247#236#255#255#245#231#255#255#244#226#255#255#242#222#255#255#240 - ,#217#255#255#238#213#255#255#236#208#255#255#235#203#255#162#158#151#255#140 - +#140#140#175#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#140#140#140#255#226#223#218#255 - +#255#249#240#255#255#247#235#255#255#245#231#255#255#244#226#255#255#242#221 - +#255#255#240#217#255#255#238#212#255#255#236#208#255#198#187#172#255#140#140 - +#140#207#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#140#140#140#255#226#224#221#255#255 - +#251#244#255#255#249#240#255#255#247#235#255#255#245#230#255#255#243#226#255 - +#255#242#221#255#255#240#217#255#255#238#212#255#198#188#174#255#140#140#140 - +#239#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#140#140#140#255#212#211#210#255#255#252 - +#249#255#255#251#244#255#255#249#239#255#255#247#235#255#255#245#230#255#255 - +#243#226#255#255#242#221#255#255#242#221#255#183#177#167#255#140#140#140#191 - +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#140#140#140#175#154#154#154#255#255#254#253 - +#255#255#252#248#255#255#251#244#255#255#249#239#255#255#247#234#255#255#246 - +#232#255#255#250#242#255#241#232#219#255#147#146#145#255#140#140#140'p'#0#0#0 - +#0#0#0#0#0#0#0#0#0#0#0#0#0#140#140#140'0'#140#140#140#255#183#183#183#255#255 - +#254#253#255#255#254#252#255#255#253#249#255#255#253#249#255#255#254#252#255 - +#248#242#232#255#162#159#156#255#140#140#140#223#140#140#140#16#0#0#0#0#0#0#0 - +#0#0#0#0#0#0#0#0#0#0#0#0#0#140#140#140'`'#140#140#140#255#154#154#154#255#212 - +#211#210#255#226#225#223#255#226#224#220#255#205#201#195#255#147#147#146#255 - +#140#140#140#239#140#140#140'0'#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 - +#0#0#0#0#0#140#140#140'0'#140#140#140#175#140#140#140#255#140#140#140#255#140 - +#140#140#255#140#140#140#239#140#140#140#159#140#140#140#16#0#0#0#0#0#0#0#0#0 - +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#7'OnClick'#7#22'ActionFindstartExecute'#0#0#9 - +'TMenuItem'#16'MenuItemFindNext'#6'Action'#7#14'ActionFindNext'#7'OnClick'#7 - +#21'ActionFindNextExecute'#0#0#9'TMenuItem'#15'MenuItemReplace'#6'Action'#7 - +#13'ActionReplace'#7'OnClick'#7#20'ActionReplaceExecute'#0#0#0#9'TMenuItem' - +#14'MenuItemScript'#7'Caption'#6#7'&Script'#13'SubMenuImages'#7#17'Mufasa_Im' - +'age_List'#0#9'TMenuItem'#11'MenuItemRun'#6'Action'#7#15'ActionRunScript'#11 - +'Bitmap.Data'#10':'#4#0#0'6'#4#0#0'BM6'#4#0#0#0#0#0#0'6'#0#0#0'('#0#0#0#16#0 - +#0#0#16#0#0#0#1#0' '#0#0#0#0#0#0#4#0#0'd'#0#0#0'd'#0#0#0#0#0#0#0#0#0#0#0#0#0 - +#0#0#0#0#0#0#4's:'#255'!'#130'O'#255'c'#130'r'#255#0#0#0#0#0#0#0#0#0#0#0#0#0 - +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 - +#0#4's:'#255'z'#207#164#255','#140'Z'#255'=vY'#255#174#174#174#255#0#0#0#0#0 - +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 - +#0#4's:'#255#130#216#172#255'v'#214#166#255'<'#157'j'#255'''tL'#255#172#174 - +#173#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 - +#0#0#0#0#0#0#9'w?'#255#131#219#174#255#31#198'q'#255'r'#222#167#255'K'#178 - +#127#255#23'tE'#255#168#173#170#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 - +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#4's:'#255#131#220#175#255#17#195'i'#255#26#204 - +'s'#255'i'#223#163#255'Z'#194#141#255#19'vC'#255#158#167#163#255#0#0#0#0#0#0 - +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#4's:'#255#169#220#193 - +#255#16#189'e'#255#17#193'g'#255#19#194'i'#255'Y'#211#149#255'g'#201#152#255 - +#22'|G'#255#136#156#146#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 - +#0#0#0#4's:'#255#169#220#193#255#13#179'^'#255#14#182'`'#255#14#182'`'#255#13 - +#180'_'#255'G'#196#132#255'p'#202#156#255#29#130'M'#255'g'#140'y'#255#0#0#0#0 - +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#4's:'#255#169#220#193#255#12#170'X' - +#255#18#174'^'#255#21#175'`'#255#22#173'a'#255#19#170']'#255':'#182'w'#255'u' - +#199#157#255'('#137'W'#255'N'#131'g'#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 - +#0#0#4's:'#255#169#220#193#255'.'#173'k'#255'+'#173'j'#255''''#171'h'#255'"' - +#169'd'#255#28#165'_'#255'A'#178'x'#255'x'#198#159#255')'#136'X'#255'g'#140 - +'y'#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#4's:'#255#169#220#193#255'6' - +#173'p'#255'2'#172'm'#255'-'#170'j'#255'('#168'f'#255'X'#188#137#255'x'#197 - +#157#255#31#128'N'#255#131#154#142#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 - +#0#0#0#0#0#4's:'#255#169#220#193#255'>'#177'v'#255':'#175's'#255'6'#174'p' - +#255'o'#197#152#255'q'#191#151#255#24'{I'#255#166#176#171#255#0#0#0#0#0#0#0#0 - +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#4's:'#255#169#220#193#255'E'#180'{' - +#255'G'#180'|'#255#130#204#166#255'g'#182#140#255#23'wE'#255#193#197#195#255 - +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#4's:'#255 - +#165#218#191#255'W'#187#135#255#144#210#176#255'['#171#130#255'#wL'#255#212 - +#213#212#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 - +#0#0#0#0#4's:'#255#169#220#193#255#155#213#183#255'L'#159's'#255'=}\'#255#0#0 - +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 - +#0#0#0#0#4's:'#255#164#217#190#255'='#147'f'#255'_'#136's'#255#0#0#0#0#0#0#0 - +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 - +#0#0#0#4's:'#255'-'#136'Y'#255#133#156#144#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 - ,#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#10'ImageIndex'#2#6 - +#7'OnClick'#7#16'ActionRunExecute'#0#0#9'TMenuItem'#15'MenuItemCompile'#6'Ac' - +'tion'#7#19'ActionCompileScript'#7'Caption'#6#7'Compile'#7'OnClick'#7#26'Act' - +'ionCompileScriptExecute'#0#0#9'TMenuItem'#13'MenuItemPause'#6'Action'#7#17 - +'ActionPauseScript'#11'Bitmap.Data'#10':'#4#0#0'6'#4#0#0'BM6'#4#0#0#0#0#0#0 + +#255#255#0#234#195#157#255#230#191#150#255#228#187#146#255#228#187#146#255 + +#209#160'l'#245#208#158'm'#246#204#150'_'#218#196'yB~'#178'g<'#9#255#255#255 + +#0#7'OnClick'#7#17'ActionOpenExecute'#0#0#9'TMenuItem'#18'MenuItemOpenRecent' + +#7'Caption'#6#12'Open &Recent'#0#0#9'TMenuItem'#12'MenuItemSave'#6'Action'#7 + +#16'ActionSaveScript'#11'Bitmap.Data'#10':'#4#0#0'6'#4#0#0'BM6'#4#0#0#0#0#0#0 +'6'#0#0#0'('#0#0#0#16#0#0#0#16#0#0#0#1#0' '#0#0#0#0#0#0#4#0#0'd'#0#0#0'd'#0#0 - +#0#0#0#0#0#0#0#0#0#238#238#238#0#238#238#238#0#238#238#238#0#152'pP'#255#164 - +'e4'#255#164'e4'#255#152'pP'#255#251#227#188#0#251#227#188#0#152'pP'#255#164 - +'e4'#255#164'e4'#255#152'pP'#255#0#0#0#0#0#0#0#0#0#0#0#0#152'pP'#0#152'pP'#0 - +#152'pP'#0#159'h>'#255#201#156'v'#255#205#165#133#255#159'h>'#255#152'pP'#0 - +#152'pP'#0#159'h>'#255#201#156'v'#255#205#165#133#255#159'h>'#255#0#0#0#0#0#0 - +#0#0#0#0#0#0#162'f8'#0#162'f8'#0#162'f8'#0#163'e5'#255#215#172#136#255#225 - +#197#173#255#163'e5'#255#162'f8'#0#162'f8'#0#163'e5'#255#215#172#136#255#225 - +#197#173#255#163'e5'#255#0#0#0#0#0#0#0#0#0#0#0#0#164'e4'#0#164'e4'#0#164'e4' - +#0#164'e4'#255#216#169#129#255#230#204#181#255#164'e4'#255#164'e4'#0#164'e4' - +#0#164'e4'#255#216#169#129#255#230#204#181#255#164'e4'#255#0#0#0#0#0#0#0#0#0 - +#0#0#0#164'e4'#0#164'e4'#0#164'e4'#0#164'e4'#255#215#167#127#255#230#204#181 - +#255#164'e4'#255#164'e4'#0#164'e4'#0#164'e4'#255#215#167#127#255#230#204#181 - +#255#164'e4'#255#0#0#0#0#0#0#0#0#0#0#0#0#164'e4'#0#164'e4'#0#164'e4'#0#164'e' - +'4'#255#215#169#129#255#230#205#182#255#164'e4'#255#164'e4'#0#164'e4'#0#164 - +'e4'#255#215#169#129#255#230#205#182#255#164'e4'#255#0#0#0#0#0#0#0#0#0#0#0#0 - +#164'e4'#0#164'e4'#0#164'e4'#0#164'e4'#255#216#171#132#255#230#206#183#255 - +#164'e4'#255#164'e4'#0#164'e4'#0#164'e4'#255#216#171#132#255#230#206#183#255 - +#164'e4'#255#0#0#0#0#0#0#0#0#0#0#0#0#164'e4'#0#164'e4'#0#164'e4'#0#164'e4' - +#255#217#174#137#255#230#206#183#255#164'e4'#255#164'e4'#0#164'e4'#0#164'e4' - +#255#217#174#137#255#230#206#183#255#164'e4'#255#0#0#0#0#0#0#0#0#0#0#0#0#164 - +'e4'#0#164'e4'#0#164'e4'#0#164'e4'#255#217#176#141#255#230#206#183#255#164'e' - +'4'#255#164'e4'#0#164'e4'#0#164'e4'#255#217#176#141#255#230#206#183#255#164 - +'e4'#255#0#0#0#0#0#0#0#0#0#0#0#0#164'e4'#0#164'e4'#0#164'e4'#0#164'e4'#255 - +#217#178#143#255#230#206#183#255#164'e4'#255#164'e4'#0#164'e4'#0#164'e4'#255 - +#217#178#143#255#230#206#183#255#164'e4'#255#0#0#0#0#0#0#0#0#0#0#0#0#164'e4' - +#0#164'e4'#0#164'e4'#0#164'e4'#255#218#179#145#255#230#206#183#255#164'e4' - +#255#164'e4'#0#164'e4'#0#164'e4'#255#218#179#145#255#230#206#183#255#164'e4' - +#255#0#0#0#0#0#0#0#0#0#0#0#0#164'e4'#0#164'e4'#0#164'e4'#0#164'e4'#255#218 - +#181#147#255#230#207#185#255#164'e4'#255#164'e4'#0#164'e4'#0#164'e4'#255#218 - +#181#147#255#230#207#185#255#164'e4'#255#0#0#0#0#0#0#0#0#0#0#0#0#164'e4'#0 - +#164'e4'#0#164'e4'#0#164'e4'#255#219#182#148#255#231#209#187#255#164'e4'#255 - +#164'e4'#0#164'e4'#0#164'e4'#255#219#182#148#255#231#209#187#255#164'e4'#255 - +#0#0#0#0#0#0#0#0#0#0#0#0#164'e4'#0#164'e4'#0#164'e4'#0#164'e4'#255#221#188 - +#157#255#231#209#188#255#164'e4'#255#164'e4'#0#164'e4'#0#164'e4'#255#221#188 - +#157#255#231#209#188#255#164'e4'#255#0#0#0#0#0#0#0#0#0#0#0#0#153'nL'#0#153'n' - +'L'#0#153'nL'#0#162'f7'#255#220#191#164#255#223#198#175#255#162'f7'#255#153 - +'nL'#0#153'nL'#0#162'f7'#255#220#191#164#255#223#198#175#255#162'f7'#255#0#0 - +#0#0#0#0#0#0#0#0#0#0#238#238#238#0#238#238#238#0#238#238#238#0#153'nL'#255 - +#171'qC'#255#172'rD'#255#153'nL'#255#251#227#188#0#251#227#188#0#153'nL'#255 - +#171'qC'#255#172'rD'#255#153'nL'#255#0#0#0#0#0#0#0#0#0#0#0#0#10'ImageIndex'#2 - +#5#7'OnClick'#7#18'ActionPauseExecute'#0#0#9'TMenuItem'#12'MenuItemStop'#6'A' - +'ction'#7#16'ActionStopScript'#11'Bitmap.Data'#10':'#4#0#0'6'#4#0#0'BM6'#4#0 + +#0#0#0#0#0#0#0#0#0#186'j6'#143#185'i5'#181#184'i5'#238#183'h5'#255#181'h5' + +#255#180'g4'#255#178'f4'#255#176'e3'#255#174'd3'#255#172'c2'#255#170'b2'#255 + +#169'a2'#255#168'`1'#255#167'`1'#254#166'`1'#241#168'a1'#196#186'j5'#222#235 + +#198#173#255#234#197#173#255#254#251#248#255#254#251#248#255#254#251#248#255 + +#254#251#248#255#254#251#248#255#254#251#248#255#254#251#248#255#254#251#248 + +#255#254#251#248#255#254#251#248#255#200#154'|'#255#199#152'y'#255#167'`1' + +#237#186'k7'#254#237#202#179#255#224#162'z'#255#254#250#247#255'b'#192#136 + +#255'b'#192#136#255'b'#192#136#255'b'#192#136#255'b'#192#136#255'b'#192#136 + +#255'b'#192#136#255'b'#192#136#255#253#249#246#255#202#141'e'#255#201#155'|' + +#255#167'`1'#254#187'l8'#255#238#204#182#255#225#162'z'#255#254#250#247#255 + +#191#220#194#255#191#220#194#255#191#220#194#255#191#220#194#255#191#220#194 + +#255#191#220#194#255#191#220#194#255#191#220#194#255#253#249#246#255#205#144 + +'h'#255#204#158#129#255#168'a2'#255#187'k8'#255#239#206#184#255#225#162'y' + +#255#254#250#247#255'b'#192#136#255'b'#192#136#255'b'#192#136#255'b'#192#136 + +#255'b'#192#136#255'b'#192#136#255'b'#192#136#255'b'#192#136#255#253#249#246 + +#255#207#147'j'#255#206#163#132#255#170'a2'#255#186'j6'#255#239#208#187#255 + +#226#162'z'#255#254#251#248#255#254#251#248#255#254#251#248#255#254#251#248 + +#255#254#251#248#255#254#251#248#255#254#251#248#255#254#251#248#255#254#251 + +#248#255#254#251#248#255#211#150'm'#255#210#167#138#255#171'b2'#255#187'j6' + +#255#240#210#190#255#226#163'z'#255#226#163'z'#255#225#163'z'#255#226#163'{' + +#255#225#163'{'#255#224#161'x'#255#222#159'w'#255#221#159'v'#255#220#157't' + +#255#217#155'r'#255#216#153'q'#255#214#153'p'#255#213#171#142#255#173'c3'#255 + +#187'j6'#255#242#213#194#255#227#163'z'#255#227#163'z'#255#226#163'{'#255#226 + +#163'{'#255#226#164'{'#255#225#162'y'#255#224#161'x'#255#222#160'w'#255#222 + +#158'u'#255#220#157't'#255#218#155's'#255#217#155's'#255#218#176#149#255#175 + +'d3'#255#187'j6'#255#242#216#197#255#227#164'{'#255#227#163'z'#255#227#164'z' + +#255#226#164'{'#255#226#163'{'#255#225#163'{'#255#225#162'y'#255#223#160'w' + +#255#222#159'v'#255#221#158't'#255#219#156'r'#255#220#157't'#255#221#181#154 + +#255#177'e4'#255#187'k6'#255#244#217#199#255#230#166'}'#255#200#140'd'#255 + +#201#141'e'#255#201#142'g'#255#203#146'l'#255#203#146'm'#255#202#144'i'#255 + +#200#140'e'#255#200#140'd'#255#200#140'd'#255#200#140'd'#255#218#156't'#255 + +#225#186#159#255#179'f4'#255#187'k6'#254#244#220#201#255#231#167'}'#255#249 + +#236#225#255#249#236#225#255#249#237#227#255#252#244#238#255#253#250#247#255 + +#253#247#243#255#250#237#229#255#247#231#219#255#247#229#217#255#246#229#216 + +#255#222#160'w'#255#228#190#164#255#180'g4'#255#188'k6'#250#245#221#204#255 + +#231#168'~'#255#250#240#232#255#250#240#232#255#201#141'f'#255#250#240#233 + +#255#253#248#243#255#254#250#248#255#252#244#239#255#249#233#223#255#247#231 + ,#219#255#247#229#217#255#224#162'x'#255#231#194#169#255#182'h5'#255#188'k6' + +#240#246#223#208#255#232#168'~'#255#252#246#241#255#252#246#241#255#200#140 + +'d'#255#250#241#233#255#251#244#238#255#253#250#247#255#253#249#246#255#250 + +#240#232#255#248#232#221#255#247#230#219#255#225#163'z'#255#239#213#195#255 + +#183'i5'#254#188'k6'#216#246#223#209#255#233#170#128#255#254#250#246#255#253 + +#250#246#255#200#140'd'#255#251#243#238#255#251#241#234#255#252#246#242#255 + +#254#251#248#255#252#246#241#255#249#236#226#255#248#231#219#255#238#208#186 + +#255#236#208#189#255#187'p>'#248#188'k6'#155#246#224#209#255#247#224#209#255 + +#254#251#248#255#254#251#247#255#253#249#246#255#252#245#240#255#250#240#234 + +#255#251#242#237#255#253#249#246#255#253#250#247#255#251#241#235#255#248#233 + +#223#254#236#208#189#251#201#137'^'#236#181'i5c'#188'k6q'#188'k6'#144#188'k6' + +#204#188'k6'#238#188'k6'#250#187'k6'#254#187'k6'#255#187'j6'#255#187'j6'#255 + +#188'l9'#255#189'n;'#255#187'm:'#255#187'k8'#239#187'p>'#203#182'i5T'#255#255 + +#255#0#7'OnClick'#7#17'ActionSaveExecute'#0#0#9'TMenuItem'#14'MenuItemSaveAs' + +#6'Action'#7#18'ActionSaveScriptAs'#7'Caption'#6#10'Save as...'#7'OnClick'#7 + +#19'ActionSaveAsExecute'#0#0#9'TMenuItem'#15'MenuItemSaveAll'#6'Action'#7#13 + +'ActionSaveAll'#7'Enabled'#8#11'Bitmap.Data'#10':'#4#0#0'6'#4#0#0'BM6'#4#0#0 + +#0#0#0#0'6'#0#0#0'('#0#0#0#16#0#0#0#16#0#0#0#1#0' '#0#0#0#0#0#0#4#0#0'd'#0#0 + +#0'd'#0#0#0#0#0#0#0#0#0#0#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 + +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 + +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 + +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 + +#255#0#255#255#255#0#186'h3'#197#195#132'X'#255#211#139'h'#255#225#143'p'#255 + +#220#141'l'#255#218#139'm'#255#215#138'n'#255#205#139'l'#255#171'mD'#255#166 + +'_.'#255#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255 + +#0#255#255#255#0#198#131'U'#255#239#206#186#255#221#255#255#255#135#238#199 + +#255#162#244#215#255#162#246#215#255#140#238#199#255#224#255#255#255#221#162 + +#133#255#171'j>'#255#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 + +#186'h3'#172#195#132'X'#222#195#127'Q'#255#239#182#154#255#234#243#232#255'Q' + +#191#132#255'o'#201#152#255'q'#201#153#255'T'#191#132#255#228#244#233#255#221 + +#156'{'#255#170'i:'#255#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255 + +#0#198#131'U'#222#239#206#186#222#196#129'T'#255#234#182#151#255#243#243#234 + +#255#237#241#230#255#239#241#230#255#239#240#230#255#237#241#229#255#243#245 + +#237#255#213#156'y'#255#176'pD'#255#255#255#255#0#255#255#255#0#186'h3'#155 + +#195#132'X'#201#197#128'S'#248#238#178#150#248#201#139'a'#255#230#181#146#255 + +#226#167#129#255#225#167#129#255#222#163'}'#255#220#161'{'#255#219#159'y'#255 + +#217#158'w'#255#212#154's'#255#187'~W'#255#255#255#255#0#255#255#255#0#198 + +#131'U'#201#239#206#186#201#199#142'f'#248#224#188#156#248#202#141'e'#255#234 + +#184#153#255#221#165'~'#255#221#166#128#255#219#163'|'#255#217#160'z'#255#217 + +#160'y'#255#216#159'x'#255#216#158'x'#255#191#132']'#255#255#255#255#0#255 + +#255#255#0#195#127'Q'#201#239#182#154#201#204#150'o'#248#214#182#145#248#200 + +#136']'#255#239#191#161#255#253#252#250#255#254#252#251#255#254#253#253#255 + +#254#253#252#255#253#251#250#255#253#252#251#255#221#168#133#255#193#127'S' + +#255#255#255#255#0#255#255#255#0#196#129'T'#201#234#182#151#201#206#152's' + +#248#234#190#161#248#199#134'['#255#239#192#158#255#255#255#255#255#204#147 + +'n'#255#255#255#255#255#255#255#255#255#255#251#247#255#255#248#241#255#228 + +#175#140#255#199#138'a'#255#255#255#255#0#255#255#255#0#201#139'a'#201#230 + +#181#146#201#203#139'a'#248#238#188#158#248#204#141'e'#255#243#205#176#255 + +#255#255#255#255#227#199#179#255#255#255#255#255#255#255#255#255#255#255#255 + +#255#255#255#255#255#234#191#161#255#201#137'`'#255#255#255#255#0#255#255#255 + +#0#202#141'e'#201#234#184#153#201#201#137'_'#248#237#189#155#248#212#151'n' + +#255#212#158'{'#255#208#152'q'#255#214#164#130#255#205#142'h'#255#205#144'i' + +#255#208#154'u'#255#209#153's'#255#200#139'b'#255#173'Z 6'#255#255#255#0#255 + +#255#255#0#200#136']'#201#239#191#161#201#209#153'u'#248#244#210#184#248#255 + +#255#255#248#230#205#187#248#255#255#254#248#255#255#255#248#251#246#242#248 + +#248#241#237#248#234#191#161#222#201#137'`'#222#255#255#255#0#255#255#255#0 + +#255#255#255#0#255#255#255#0#199#134'['#201#239#192#158#201#217#162'}'#248 + +#211#157'z'#248#213#163#128#248#218#174#143#248#210#154'w'#248#210#155'w'#248 + +#210#156'w'#248#208#151'q'#248#200#139'b'#222#173'Z /'#255#255#255#0#255#255 + +#255#0#255#255#255#0#255#255#255#0#204#141'e'#201#243#205#176#201#255#255#255 + +#201#227#199#179#201#255#255#255#201#255#255#255#201#255#255#255#201#255#255 + +#255#201#234#191#161#201#201#137'`'#201#255#255#255#0#255#255#255#0#255#255 + +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#212#151'n'#201#212#158'{' + +#201#208#152'q'#201#214#164#130#201#205#142'h'#201#205#144'i'#201#208#154'u' + ,#201#209#153's'#201#200#139'b'#201#173'Z +'#255#255#255#0#255#255#255#0#255 + +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 + +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 + +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 + +#255#255#0#255#255#255#0#255#255#255#0#7'OnClick'#7#20'ActionSaveAllExecute' + +#0#0#9'TMenuItem'#16'MenuItemDivider2'#7'Caption'#6#1'-'#0#0#9'TMenuItem'#14 + +'MenuItemNewTab'#6'Action'#7#12'ActionNewTab'#11'Bitmap.Data'#10':'#4#0#0'6' + +#4#0#0'BM6'#4#0#0#0#0#0#0'6'#0#0#0'('#0#0#0#16#0#0#0#16#0#0#0#1#0' '#0#0#0#0 + +#0#0#4#0#0'd'#0#0#0'd'#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#4'9'#0#0#6'm'#0#153#5'i'#0 + +#204#6'm'#0#153#4'9'#0#0#0#0#0#0#0#0#0#9#0#0#0#22#0#0#0#26#0#0#0#26#0#0#0#26 + +#0#0#0#26#0#0#0#26#0#0#0#26#0#0#0#26#0#0#0#26#0#0#0#26#11#128#0#209'+'#223#26 + +#255#11#128#0#209#0#0#0#22#0#0#0#9#13#13#13'g'#16#16#16#133#16#16#16#133#16 + +#16#16#133#16#16#16#133#16#16#16#133#16#16#16#133#16#16#16#133#16#16#16#133 + +#14'b'#4#207#14'~'#2#231#14'~'#2#231'='#226','#255#14'~'#2#231#14'~'#2#231#11 + +'_'#2#176'''''''{'#235#235#235#255#231#231#231#255#231#231#231#255#231#231 + +#231#255#231#231#231#255#231#231#231#255#231#231#231#255#231#231#231#255';' + +#165'/'#255'R'#231'A'#255'R'#231'A'#255'R'#231'A'#255'R'#231'A'#255'R'#231'A' + +#255#18#137#5#229'222v'#234#234#234#255#226#226#226#255#226#226#226#255#226 + +#226#226#255#226#226#226#255#226#226#226#255#226#226#226#255#226#226#226#255 + +'f'#185'['#255'<'#171'-'#255'<'#171'-'#255'f'#235'U'#255'<'#171'-'#255'>'#173 + +'/'#255#28'z'#17#200'888s'#237#237#237#255#230#230#230#255#230#230#230#255 + +#230#230#230#255#230#230#230#255#230#230#230#255#230#230#230#255#230#230#230 + +#255#230#230#230#255#230#230#230#255'>'#177'.'#255'u'#238'd'#255'>'#177'.' + +#255#237#237#237#255'888s>>>q'#240#240#240#255#235#235#235#255#235#235#235 + +#255#235#235#235#255#235#235#235#255#235#235#235#255#235#235#235#255#235#235 + +#235#255#235#235#235#255#235#235#235#255'k'#196'_'#255'@'#182'/'#255'k'#196 + +'_'#255#240#240#240#255'>>>qDDDn'#243#243#243#255#239#239#239#255#239#239#239 + +#255#239#239#239#255#239#239#239#255#239#239#239#255#239#239#239#255#239#239 + +#239#255#239#239#239#255#239#239#239#255#239#239#239#255#239#239#239#255#239 + +#239#239#255#243#243#243#255'DDDnIIIl'#247#247#247#255#244#244#244#255#244 + +#244#244#255#244#244#244#255#244#244#244#255#244#244#244#255#244#244#244#255 + +#244#244#244#255#244#244#244#255#244#244#244#255#244#244#244#255#244#244#244 + +#255#244#244#244#255#247#247#247#255'IIIlMMMj'#250#250#250#255#248#248#248 + +#255#248#248#248#255#248#248#248#255#248#248#248#255#248#248#248#255#248#248 + +#248#255#248#248#248#255#248#248#248#255#248#248#248#255#248#248#248#255#248 + +#248#248#255#248#248#248#255#250#250#250#255'MMMjQQQh'#253#253#253#255#252 + +#252#252#255#252#252#252#255#252#252#252#255#252#252#252#255#252#252#252#255 + +#252#252#252#255#252#252#252#255#252#252#252#255#252#252#252#255#252#252#252 + +#255#252#252#252#255#252#252#252#255#253#253#253#255'QQQhUUUg'#255#255#255 + +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 + +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 + +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255'UUUgPPPi'#187 + +#187#187#255#186#186#186#255#184#184#184#255#182#182#182#255#179#179#179#255 + +#176#176#176#255#174#174#174#255#171#171#171#255#168#168#168#255#166#166#166 + +#255#163#163#163#255#160#160#160#255#158#158#158#255#156#156#156#255#3#3#3'f' + +'RRR['#198#198#198#212#220#220#220#255#216#217#217#255#213#213#213#255#208 + +#209#209#255#204#204#204#255#200#200#200#255#198#198#198#255#198#197#197#255 + +#201#197#197#255#205#198#198#255#209#199#199#255#215#203#203#255#196#184#184 + +#212'RRR[UUU"UUUYUUUfUUUfUUUfUUUfUUUfUUUfUUUfUUUfUUUfUUUfUUUfUUUfUUUYUUU"' + +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 + +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 + +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 + +#7'OnClick'#7#19'ActionNewTabExecute'#0#0#9'TMenuItem'#16'MenuItemCloseTab'#6 + +'Action'#7#14'ActionCloseTab'#11'Bitmap.Data'#10':'#4#0#0'6'#4#0#0'BM6'#4#0#0 + +#0#0#0#0'6'#0#0#0'('#0#0#0#16#0#0#0#16#0#0#0#1#0' '#0#0#0#0#0#0#4#0#0'd'#0#0 + +#0'd'#0#0#0#0#0#0#0#0#0#0#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 + +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 + +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 + +#255#255#0#255#255#255#0#0#0#0#9#0#0#0#22#0#0#0#26#0#0#0#26#0#0#0#26#0#0#0#26 + +#0#0#0#26#0#0#0#26#0#0#0#26#0#0#0#26#0#0#0#26#0#0#0#26#0#0#0#26#0#0#0#26#0#0 + +#0#22#0#0#0#9#13#13#13'g'#16#16#16#133#16#16#16#133#16#16#16#133#16#16#16#133 + +#16#16#16#133#16#16#16#133#16#16#16#133#16#16#16#133#4#4'['#207#2#2's'#231#2 + +#2's'#231#2#2's'#231#2#2's'#231#2#2's'#231#2#2'X'#176'''''''{'#235#235#235 + ,#255#231#231#231#255#231#231#231#255#231#231#231#255#231#231#231#255#231#231 + +#231#255#231#231#231#255#231#231#231#255'//'#167#255'^^'#247#255'^^'#247#255 + +'^^'#247#255'^^'#247#255'^^'#247#255#5#5#139#229'222v'#234#234#234#255#226 + +#226#226#255#226#226#226#255#226#226#226#255#226#226#226#255#226#226#226#255 + +#226#226#226#255#226#226#226#255'[['#190#255'--'#179#255'--'#179#255'--'#179 + +#255'--'#179#255'//'#181#255#17#17#129#200'888s'#237#237#237#255#230#230#230 + +#255#230#230#230#255#230#230#230#255#230#230#230#255#230#230#230#255#230#230 + +#230#255#230#230#230#255#230#230#230#255#230#230#230#255#230#230#230#255#230 + +#230#230#255#230#230#230#255#237#237#237#255'888s>>>q'#240#240#240#255#235 + +#235#235#255#235#235#235#255#235#235#235#255#235#235#235#255#235#235#235#255 + +#235#235#235#255#235#235#235#255#235#235#235#255#235#235#235#255#235#235#235 + +#255#235#235#235#255#235#235#235#255#240#240#240#255'>>>qDDDn'#243#243#243 + +#255#239#239#239#255#239#239#239#255#239#239#239#255#239#239#239#255#239#239 + +#239#255#239#239#239#255#239#239#239#255#239#239#239#255#239#239#239#255#239 + +#239#239#255#239#239#239#255#239#239#239#255#243#243#243#255'DDDnIIIl'#247 + +#247#247#255#244#244#244#255#244#244#244#255#244#244#244#255#244#244#244#255 + +#244#244#244#255#244#244#244#255#244#244#244#255#244#244#244#255#244#244#244 + +#255#244#244#244#255#244#244#244#255#244#244#244#255#247#247#247#255'IIIlMMM' + +'j'#250#250#250#255#248#248#248#255#248#248#248#255#248#248#248#255#248#248 + +#248#255#248#248#248#255#248#248#248#255#248#248#248#255#248#248#248#255#248 + +#248#248#255#248#248#248#255#248#248#248#255#248#248#248#255#250#250#250#255 + +'MMMjQQQh'#253#253#253#255#252#252#252#255#252#252#252#255#252#252#252#255 + +#252#252#252#255#252#252#252#255#252#252#252#255#252#252#252#255#252#252#252 + +#255#252#252#252#255#252#252#252#255#252#252#252#255#252#252#252#255#253#253 + +#253#255'QQQhUUUg'#255#255#255#255#255#255#255#255#255#255#255#255#255#255 + +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 + +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 + +#255#255#255#255'UUUgPPPi'#187#187#187#255#186#186#186#255#184#184#184#255 + +#182#182#182#255#179#179#179#255#176#176#176#255#174#174#174#255#171#171#171 + +#255#168#168#168#255#166#166#166#255#163#163#163#255#160#160#160#255#158#158 + +#158#255#156#156#156#255#3#3#3'fRRR['#198#198#198#212#220#220#220#255#216#217 + +#217#255#213#213#213#255#208#209#209#255#204#204#204#255#200#200#200#255#198 + +#198#198#255#198#197#197#255#201#197#197#255#205#198#198#255#209#199#199#255 + +#215#203#203#255#196#184#184#212'RRR[UUU"UUUYUUUfUUUfUUUfUUUfUUUfUUUfUUUfUUU' + +'fUUUfUUUfUUUfUUUfUUUYUUU"'#255#255#255#0#255#255#255#0#255#255#255#0#255#255 + +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 + +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 + +#255#255#0#255#255#255#0#7'OnClick'#7#21'ActionCloseTabExecute'#0#0#9'TMenuI' + +'tem'#17'MenuItemCloseTabs'#7'Caption'#6#14'Close all tabs'#11'Bitmap.Data' + +#10':'#4#0#0'6'#4#0#0'BM6'#4#0#0#0#0#0#0'6'#0#0#0'('#0#0#0#16#0#0#0#16#0#0#0 + +#1#0' '#0#0#0#0#0#0#4#0#0'd'#0#0#0'd'#0#0#0#0#0#0#0#0#0#0#0#0#0#0#10#0#0#0#24 + +#0#0#0#26#0#0#0#26#0#0#0#26#0#0#0#26#0#0#0#26#0#0#0#26#0#0#0#26#0#0#0#26#0#0 + +#0#26#0#0#0#25#0#0#0#11#0#0#0#0#0#0'w'#0#0#0#128#0#17#17#17'e'#20#20#20#131 + +#20#20#20#131#20#20#20#131#20#20#20#131#20#20#20#131#20#20#20#131#20#20#20 + +#131#20#20#20#131#20#20#20#131#20#20#20#131#20#20#20#131#17#17#17'e'#0#0'Z'#0 + +#0#0'w'#0#0#0#128#0'---x'#236#236#236#255#232#232#232#255#232#232#232#255#232 + +#232#232#255#232#232#232#255#232#232#232#255#232#232#232#255#232#232#232#255 + +'__'#173#255'//'#149#255'00'#150#255#5#5'w'#228#0#0#128#204#0#0#128#204#0#0 + +#132#153'666t'#235#235#235#255#228#228#228#255#228#228#228#255#228#228#228 + +#255#228#228#228#255#228#228#228#255#228#228#228#255#228#228#228#255'..'#167 + +#255'^^'#247#255'^^'#247#255'^^'#247#255'^^'#247#255'^^'#247#255#0#0#152#204 + +'===q'#239#239#239#255#234#234#234#255#234#234#234#255#234#234#234#255#234 + +#234#234#255#234#234#234#255#234#234#234#255#234#234#234#255'^^'#194#255'//' + +#181#255'00'#182#255#6#6#154#230#0#0#163#209#0#0#164#209#0#0'|'#158'EEEn'#244 + +#244#244#255#240#240#240#255#240#240#240#255#240#240#240#255#240#240#240#255 + +#240#240#240#255#240#240#240#255#240#240#240#255#240#240#240#255#240#240#240 + +#255#244#244#244#255'111'#184#20#20#20#131#20#20#20#131#17#17#17'eKKKk'#248 + +#248#248#255#246#246#246#255#246#246#246#255#246#246#246#255#246#246#246#255 + +#246#246#246#255#246#246#246#255#246#246#246#255#246#246#246#255#246#246#246 + +#255#248#248#248#255#166#166#166#255#232#232#232#255#236#236#236#255'---xPPP' + +'i'#252#252#252#255#251#251#251#255#251#251#251#255#251#251#251#255#251#251 + +#251#255#251#251#251#255#251#251#251#255#251#251#251#255#251#251#251#255#251 + +#251#251#255#252#252#252#255#168#168#168#255#228#228#228#255#235#235#235#255 + +'666tTTTg'#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 + ,#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 + +#255#255#255#255#255#255#255#255#255#174#174#174#255#234#234#234#255#239#239 + +#239#255'===qPPPi'#187#187#187#255#185#185#185#255#182#182#182#255#180#180 + +#180#255#176#176#176#255#173#173#173#255#169#169#169#255#166#166#166#255#162 + +#162#162#255#160#160#160#255#157#157#157#255#145#145#145#255#240#240#240#255 + +#244#244#244#255'EEEnRRR['#198#198#198#212#219#219#219#255#214#214#214#255 + +#209#209#209#255#203#204#204#255#199#199#199#255#198#196#196#255#200#197#197 + +#255#206#198#198#255#212#201#201#255#208#197#197#255#188#188#188#255#246#246 + +#246#255#248#248#248#255'KKKkUUU"UUUYUUUfSSS'#165#185#185#185#255#184#184#184 + +#255#184#184#184#255#184#184#184#255#184#184#184#255#184#184#184#255#184#184 + +#184#255#193#193#193#255#229#229#229#255#251#251#251#255#252#252#252#255'PPP' + +'iUUU'#0'UUU'#0'UUU'#0'TTTg'#255#255#255#255#255#255#255#255#255#255#255#255 + +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 + +#255#255#255#255#255#255#255#255#255#255#255#255#255'TTTgUUU'#0'TTT'#0'PPP'#0 + +'PPPi'#187#187#187#255#185#185#185#255#182#182#182#255#180#180#180#255#176 + +#176#176#255#173#173#173#255#169#169#169#255#166#166#166#255#162#162#162#255 + +#160#160#160#255#157#157#157#255#3#3#3'fTTT'#0'RRR'#0'RRR'#0'RRR['#198#198 + +#198#212#219#219#219#255#214#214#214#255#209#209#209#255#203#204#204#255#199 + +#199#199#255#198#196#196#255#200#197#197#255#206#198#198#255#212#201#201#255 + +#196#183#183#212'RRR[TTT'#0'TTT'#0'TTT'#0'UUU"UUUYUUUfUUUfUUUfUUUfUUUfUUUfUU' + +'UfUUUfUUUfUUUYUUU"'#10'ImageIndex'#2#20#7'OnClick'#7#22'MenuItemCloseTabsCl' + +'ick'#0#0#9'TMenuItem'#16'MenuItemDivider6'#7'Caption'#6#1'-'#0#0#9'TMenuIte' + +'m'#16'MenuItemMainExit'#6'Action'#7#10'ActionExit'#11'Bitmap.Data'#10':'#4#0 + +#0'6'#4#0#0'BM6'#4#0#0#0#0#0#0'6'#0#0#0'('#0#0#0#16#0#0#0#16#0#0#0#1#0' '#0#0 + +#0#0#0#0#4#0#0'd'#0#0#0'd'#0#0#0#0#0#0#0#0#0#0#0#255#255#255#0#255#255#255#0 + +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 + +#255#255#0#255#255#255#0#29'c'#155#22#25'`'#152'9'#20']'#149'b'#16'Z'#146#136 + +#13'X'#144#164#19'\'#146#252#12'W'#143#237#153#153#153#255'qqq'#255'TTT'#255 + +'QQQ'#255'OOO'#255'LLL'#255'JJJ'#255'GGG'#255'EEE'#255'%g'#157#255'2t'#168 + +#255'=|'#175#255'G'#132#181#255'N'#138#186#255'>~'#173#255#12'W'#143#234#255 + +#255#255#0#255#255#255#0'XXX'#255#162#162#162#255#162#162#162#255#163#163#163 + +#255#164#164#164#255#164#164#164#255#165#165#165#255'/o'#165#255'x'#171#210 + +#255'x'#171#211#255's'#167#209#255'i'#160#205#255'@'#127#174#255#15'Y'#145 + +#234#255#255#255#0#255#255#255#0'\\\'#255#161#161#161#255''#255'4~;'#255'1y7'#255'.u4'#255'I'#145'P'#255'F'#143'L'#255'9s' + +'='#255#161#161#161#255#162#162#162#255'E~'#180#255#136#183#217#255'g'#163 + +#207#255'a'#158#204#255'c'#159#204#255'E'#131#177#255#31'd'#156#234';'#135'B' + +#255#137#203#146#255#132#200#141#255#128#198#136#255'{'#195#131#255'w'#193 + +#127#255'G'#143'M'#255';t?'#255#161#161#161#255'L'#132#186#255#141#187#219 + +#255'n'#168#209#255'f'#166#209#255'_'#180#223#255'G'#133#177#255'%i'#161#234 + +'>'#139'F'#255#143#206#153#255'}'#198#135#255'x'#195#129#255's'#192'|'#255't' + +#192'|'#255'y'#194#129#255'I'#144'O'#255'T'#127'W'#255'T'#137#191#255#148#191 + +#221#255'u'#173#212#255'c'#184#225#255'K'#212#255#255'B'#139#184#255',n'#166 + +#234'A'#144'J'#255#148#210#159#255#145#208#154#255#141#205#150#255#137#203 + +#146#255#132#200#141#255'Q'#152'X'#255'A|F'#255#159#159#159#255'Z'#142#196 + +#255#152#195#224#255'|'#179#215#255't'#175#214#255'^'#196#237#255'K'#136#179 + +#255'4s'#171#234'D'#148'M'#255'B'#145'K'#255'?'#141'H'#255'='#137'E'#255']' + +#164'e'#255'Z'#160'a'#255'E'#131'K'#255#158#158#158#255#158#158#158#255'`' + +#146#201#255#158#199#226#255#131#184#218#255'}'#180#215#255'~'#179#215#255'O' + +#137#180#255';y'#177#234#255#255#255#0#255#255#255#0'www'#255#154#154#154#255 + +'='#138'E'#255'I'#138'O'#255#156#156#156#255#157#157#157#255#157#157#157#255 + +'f'#150#204#255#162#203#227#255#137#189#220#255#131#185#218#255#132#185#218 + +#255'Q'#139#181#255'C~'#182#234#255#255#255#0#255#255#255#0'zzz'#255#153#153 + +#153#255'R'#145'Y'#255#153#154#153#255#155#155#155#255#156#156#156#255#156 + +#156#156#255'l'#154#208#255#167#206#229#255#143#193#223#255#137#189#220#255 + +#139#189#220#255'S'#141#182#255'K'#132#188#234#255#255#255#0#255#255#255#0'}' + +'}}'#255#153#153#153#255#153#153#153#255#154#154#154#255#154#154#154#255#155 + +#155#155#255#155#155#155#255'o'#157#211#255#170#209#231#255#171#209#231#255 + +#152#199#225#255#145#194#222#255'V'#143#183#255'R'#137#193#234#255#255#255#0 + ,#255#255#255#0#128#128#128#255'~~~'#255'|||'#255'zzz'#255'www'#255'uuu'#255 + +'rrr'#255'q'#158#212#255'o'#158#214#255#135#178#220#255#171#211#232#255#169 + +#208#230#255'X'#144#184#255'Y'#142#198#234#255#255#255#0#255#255#255#0#255 + +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 + +#255#0#255#255#255#0#255#255#255#0#255#255#255#0'p'#158#214#219'm'#156#212 + +#255#133#177#218#255'Z'#145#185#255'`'#147#203#234#255#255#255#0#255#255#255 + +#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 + +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 + +#255#0'm'#156#212#137'j'#154#210#251'f'#151#207#238#7'OnClick'#7#17'ActionEx' + +'itExecute'#0#0#0#9'TMenuItem'#8'MenuEdit'#7'Caption'#6#5'&Edit'#13'SubMenuI' + +'mages'#7#17'Mufasa_Image_List'#7'OnClick'#7#13'MenuEditClick'#0#9'TMenuItem' + +#12'MenuItemUndo'#6'Action'#7#10'ActionUndo'#11'Bitmap.Data'#10':'#4#0#0'6'#4 + +#0#0'BM6'#4#0#0#0#0#0#0'6'#0#0#0'('#0#0#0#16#0#0#0#16#0#0#0#1#0' '#0#0#0#0#0 + +#0#4#0#0'd'#0#0#0'd'#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#24#166#195'i'#26#167 + +#196'i'#0#160#196#24#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#160#196']f'#219#234#178#17 + +#166#194#174#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#160#196'"C'#196#219#252'C'#197#216 + +#254'#'#166#192#127#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#160#196#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#14#170#203#254']'#218 + +#233#254'#'#166#192#239#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#160 + +#196#255#0#160#196#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#158#193#26#2#172#200 + +#255#136#231#242#254#17#162#194#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#5'y}'#17 + +#0#160#196#255'v'#237#251#255#0#160#196#255#0#0#0#0#0#0#0#0#0#160#196'0'#0 + +#153#185'P'#0#160#196#201'm'#230#245#255'v'#226#239#255#25#163#193#255#0#0#0 + +#0#0#0#0#0#0#0#0#0#5'y}'#17#0#160#196#255'v'#237#251#255'v'#237#251#255#0#160 + +#196#255#0#160#196#255#0#160#196#255#0#160#196#255#1#169#196#255'n'#225#238 + +#255#15#201#223#255'i'#228#242#255#26#164#192#248#0#0#0#0#0#0#0#0#5'y}'#17#0 + +#160#196#255'v'#237#251#255#4#195#218#255'v'#237#251#255'i'#234#249#255'i' + +#234#249#255'i'#234#249#255'i'#234#249#255#5#221#247#255#10#200#223#255#7#194 + +#216#255'o'#220#235#255#27#163#191#244#0#0#0#0#5'y~'#17#0#160#196#255'y'#237 + +#251#255'2'#226#248#255','#223#244#255#4#192#214#255#4#192#214#255#4#192#214 + +#255#29#210#232#255#29#210#232#255#29#210#232#255#11#200#223#255'j'#229#243 + +#255#27#171#197#248#21#160#188#203#0#0#0#0#0#160#196#255#173#243#251#255'/' + +#224#246#255'2'#226#248#255'2'#226#247#255'2'#226#247#255'/'#224#245#255')' + +#219#241#255#29#210#232#255#29#210#232#255#29#210#232#255'6'#217#236#255'@' + +#205#225#255#22#161#189#202#5'y}'#10#0#0#0#0#5'y}'#10#0#160#196#255#173#243 + +#251#255'/'#224#246#255'2'#226#247#255')'#219#241#255'/'#224#245#255')'#219 + +#241#255#22#205#227#255'6'#217#236#255'i'#231#246#255'A'#206#227#254#19#163 + +#193#228#5'y}2'#0#0#0#0#0#0#0#0#0#0#0#0#5'y}'#17#0#160#196#255#173#243#251 + +#255'1'#225#246#255' '#227#250#255's'#236#250#255'o'#235#250#255'n'#232#247 + +#255'l'#232#247#248#20#161#188#212#20#163#193#213#5'y}'#28#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#5'y}'#17#0#160#196#255#173#243#251#255'%'#228#251#255 + +#0#160#196#255#0#160#196#255#19#161#190#231#21#159#187#207#27#161#187#164#6 + +'z|'#11#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#5'y}'#17#0 + +#160#196#255#173#243#251#255#0#160#196#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#157 + +#191#20#0#160#196#255#0#160#196#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#160#196#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#7'OnClick'#7#17'ActionUndoExecute'#0#0#9'TMenuItem'#12'MenuItem' + +'Redo'#6'Action'#7#10'ActionRedo'#11'Bitmap.Data'#10':'#4#0#0'6'#4#0#0'BM6'#4 + +#0#0#0#0#0#0'6'#0#0#0'('#0#0#0#16#0#0#0#16#0#0#0#1#0' '#0#0#0#0#0#0#4#0#0'd' + +#0#0#0'd'#0#0#0#0#0#0#0#0#0#0#0#255#255#255#0#0#0#0#0#0#160#196#24#26#167#196 + +'i'#24#166#195'i'#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#255#255#255#0#0#0#0#0#17#166#194#174'f'#219#234 + +#178#0#160#196']'#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#255#255#255#0'#'#166#192#127'C'#197#216#254'C' + +#196#219#252#0#160#196'"'#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#255#255#255#0'#'#166#192#239']'#218#233 + +#254#14#170#203#254#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#160#196#255#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#255#255#255#0#17#162#194#255#136 + +#231#242#254#2#172#200#255#0#158#193#26#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#160 + ,#196#255#0#160#196#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#255#255#255#0 + +#25#163#193#255'v'#226#239#255'm'#230#245#255#0#160#196#201#0#153#185'P'#0 + +#160#196'0'#0#0#0#0#0#0#0#0#0#160#196#255'v'#237#251#255#0#160#196#255#5'y}' + +#17#0#0#0#0#0#0#0#0#0#0#0#0#255#255#255#0#26#164#192#248'i'#228#242#255#15 + +#201#223#255'n'#225#238#255#1#169#196#255#0#160#196#255#0#160#196#255#0#160 + +#196#255#0#160#196#255'v'#237#251#255'v'#237#251#255#0#160#196#255#5'y}'#17#0 + +#0#0#0#0#0#0#0#255#255#255#0#27#163#191#244'o'#220#235#255#7#194#216#255#10 + +#200#223#255#5#221#247#255'i'#234#249#255'i'#234#249#255'i'#234#249#255'i' + +#234#249#255'v'#237#251#255#4#195#218#255'v'#237#251#255#0#160#196#255#5'y}' + +#17#0#0#0#0#255#255#255#0#21#160#188#203#27#171#197#248'j'#229#243#255#11#200 + +#223#255#29#210#232#255#29#210#232#255#29#210#232#255#4#192#214#255#4#192#214 + +#255#4#192#214#255','#223#244#255'2'#226#248#255'y'#237#251#255#0#160#196#255 + +#5'y~'#17#255#255#255#0#5'y}'#10#22#161#189#202'@'#205#225#255'6'#217#236#255 + +#29#210#232#255#29#210#232#255#29#210#232#255')'#219#241#255'/'#224#245#255 + +'2'#226#247#255'2'#226#247#255'2'#226#248#255'/'#224#246#255#173#243#251#255 + +#0#160#196#255#255#255#255#0#0#0#0#0#5'y}2'#19#163#193#228'A'#206#227#254'i' + +#231#246#255'6'#217#236#255#22#205#227#255')'#219#241#255'/'#224#245#255')' + +#219#241#255'2'#226#247#255'/'#224#246#255#173#243#251#255#0#160#196#255#5'y' + +'}'#10#255#255#255#0#0#0#0#0#0#0#0#0#5'y}'#28#20#163#193#213#20#161#188#212 + +'l'#232#247#248'n'#232#247#255'o'#235#250#255's'#236#250#255' '#227#250#255 + +'1'#225#246#255#173#243#251#255#0#160#196#255#5'y}'#17#0#0#0#0#255#255#255#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#6'z|'#11#27#161#187#164#21#159#187#207#19#161#190 + +#231#0#160#196#255#0#160#196#255'%'#228#251#255#173#243#251#255#0#160#196#255 + +#5'y}'#17#0#0#0#0#0#0#0#0#255#255#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#160#196#255#173#243#251#255#0#160#196#255#5'y}' + +#17#0#0#0#0#0#0#0#0#0#0#0#0#255#255#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#160#196#255#0#160#196#255#0#157#191#20#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#255#255#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#160#196#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#7'OnClick'#7#17'ActionRedoExecute'#0#0#9'TMenuItem'#16'MenuItem' + +'Divider3'#7'Caption'#6#1'-'#0#0#9'TMenuItem'#11'MenuItemCut'#6'Action'#7#9 + +'ActionCut'#11'Bitmap.Data'#10':'#4#0#0'6'#4#0#0'BM6'#4#0#0#0#0#0#0'6'#0#0#0 + +'('#0#0#0#16#0#0#0#16#0#0#0#1#0' '#0#0#0#0#0#0#4#0#0'd'#0#0#0'd'#0#0#0#0#0#0 + +#0#0#0#0#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 + +#255#0#255#255#255#0#255#255#255#0#2#13#140#10#28''''#166#159'5?'#201#247'"-' + +#175#185#3#13#140#28#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 + +#255#255#255#0#255#255#255#0#255#255#255#0#5#15#141#31#6#16#142'&'#1#11#138#3 + +#255#255#255#0#18#28#155'p@K'#217#255',5'#191#221'=G'#209#255#29''''#169#164 + +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 + +#255#255#0#15#25#151'c2='#199#248'7A'#207#255#31')'#171#176#0#10#134#24'#-' + +#180#175'5@'#204#253#0#9#133#24#28''''#168#149'4>'#197#248#4#14#140#20#255 + +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'/:'#189 + +#222'5?'#201#229'%0'#179#194'?J'#221#255#31'*'#172#194'$0'#178#203'2<'#198 + +#242#0#10#134#3#17#27#157'w7A'#200#255#8#18#142' '#255#255#255#0#255#255#255 + +#0#255#255#255#0#255#255#255#0#255#255#255#0'2<'#195#236'#.'#173#175#255#255 + +#255#0#26'%'#168#153'BP'#210#255#203#163'u'#254'AO'#214#255#22'!'#163#157'/9' + +#192#212'.8'#190#223#2#13#139#10#255#255#255#0#255#255#255#0#255#255#255#0 + +#255#255#255#0#255#255#255#0#29'('#169#156';F'#204#255#8#18#144':'#7#17#144 + +'S;H'#212#255#219#189#156#255#238#204#166#255'@L'#222#255':C'#209#255#15#25 + +#152'i'#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 + +#255#255#255#0#3#13#140#31',5'#185#215''#202#242'?L'#215#255 + +#216#188#154#255#246#234#225#255#187#146'Z'#191#148'b'#24';'#145'a'#26#1#255 + +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 + +#255#0#255#255#255#0#3#13#140#31#27'&'#167#153'*4'#186#204#17#28#157#137#187 + +#152'i'#204#240#224#208#255#183#145'_'#197#143']'#20#11#255#255#255#0#255#255 + +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 + +#255#255#255#0#255#255#255#0#255#255#255#0#0#11#136#2#255#255#255#0#180#142 + +'Z'#144#246#234#221#255#225#205#180#255#177#141']'#191#255#255#255#0#255#255 + +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 + +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#179 + +#140'W'#137#241#226#212#255#206#178#142#244#245#235#224#255#166#127'J'#157 + +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 + +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 + +#255#0#177#137'S'#132#238#223#206#255#151'f e'#194#163'|'#218#233#216#197#253 + ,#169#130'N{'#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 + +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 + +#175#135'P|'#231#213#193#255#149'e'#31'+'#143'\'#18#27#197#167#131#231#213 + +#188#157#225#181#147'db'#255#255#255#0#255#255#255#0#255#255#255#0#255#255 + +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 + +#172#131'Ku'#222#201#175#255#149'd'#29#31#255#255#255#0#146'`'#23'&'#195#164 + +'|'#235#181#144'c'#203#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255 + +#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#170 + +#129'Go'#214#189#159#247#147'a'#25#16#255#255#255#0#255#255#255#0#150'f ,' + +#169#128'K'#203#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 + +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#168'}Bi' + +#204#176#139#224#145']'#20#9#255#255#255#0#255#255#255#0#255#255#255#0#146'`' + +#23#6#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 + +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#154'k''1'#170'~C' + +#161#146'`'#24#5#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 + +#255#255#0#255#255#255#0#7'OnClick'#7#16'ActionCutExecute'#0#0#9'TMenuItem' + +#12'MenuItemCopy'#6'Action'#7#10'ActionCopy'#11'Bitmap.Data'#10':'#4#0#0'6'#4 + +#0#0'BM6'#4#0#0#0#0#0#0'6'#0#0#0'('#0#0#0#16#0#0#0#16#0#0#0#1#0' '#0#0#0#0#0 + +#0#4#0#0'd'#0#0#0'd'#0#0#0#0#0#0#0#0#0#0#0#255#255#255#0#255#255#255#0#255 + +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#197'sB'#193#198'uE'#230 + +#200'uE'#254#199'uE'#243#200'uE'#243#199'uE'#243#199'uE'#243#200'uF'#244#197 + +'tD'#232#202#127'S'#241#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255 + +#0#255#255#255#0#255#255#255#0#199'yI'#237#252#243#236#255#250#241#232#255 + +#250#240#231#255#251#241#233#255#251#242#234#255#251#242#234#255#251#242#235 + +#255#253#244#238#255#202#128'T'#249#255#255#255#0#255#255#255#0#255#255#255#0 + +#255#255#255#0#255#255#255#0#255#255#255#0#207#130'S'#255#239#241#231#255#255 + +#233#217#255#255#234#219#255#255#233#217#255#255#231#215#255#255#229#210#255 + +#255#226#203#255#239#242#232#255#206#129'V'#255#255#255#255#0#255#255#255#0 + +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#204#131'R'#251#251 + +#245#238#255#255#233#217#255#255#234#219#255#255#233#217#255#255#231#215#255 + +#255#229#210#255#255#226#203#255#251#246#239#255#204#131'U'#254#199'yJ'#185 + +#200'yK'#206#200'uE'#221#199'uE'#212#200'uE'#212#199'uE'#212#202#132'R'#255 + +#255#247#241#255#255#233#217#255#255#234#219#255#255#233#217#255#255#231#215 + +#255#255#229#210#255#255#226#203#255#255#247#241#255#203#133'U'#254#200'|N' + +#211#252#243#236#222#250#241#232#222#250#240#231#222#251#241#233#222#251#242 + +#234#222#228#186#145#255#255#247#240#255#255#231#213#255#253#231#214#255#253 + +#230#212#255#252#228#208#255#251#227#203#255#250#220#194#255#254#243#232#255 + +#204#134'V'#254#207#130'S'#222#239#241#231#222#255#233#217#222#255#234#219 + +#222#255#233#217#222#255#231#215#222#228#187#145#255#255#247#242#255#254#231 + +#213#255#254#231#213#255#253#229#209#255#250#224#202#255#249#222#196#255#247 + +#217#188#255#253#242#231#255#204#135'W'#254#204#131'R'#219#251#245#238#222 + +#255#233#217#222#255#234#219#222#255#233#217#222#255#231#215#222#228#187#146 + +#255#254#247#241#255#252#229#210#255#252#228#209#255#251#226#204#255#249#221 + +#196#255#246#215#187#255#243#209#175#255#250#239#228#255#204#135'X'#254#202 + +#132'R'#219#255#247#241#222#255#233#217#222#255#234#219#222#255#233#217#222 + +#255#231#215#222#228#187#146#255#254#246#240#255#252#226#205#255#252#227#205 + +#255#250#223#200#255#247#217#188#255#245#233#221#255#250#243#235#255#251#248 + +#243#255#202#131'S'#254#203#133'S'#219#255#247#240#222#255#231#213#222#253 + +#231#214#222#253#230#212#222#252#228#208#222#228#187#147#255#254#245#237#255 + +#252#222#197#255#251#224#199#255#249#220#194#255#245#211#180#255#254#249#243 + +#255#250#226#196#255#236#193#147#255#195'}H'#147#203#134'T'#219#255#247#242 + +#222#254#231#213#222#254#231#213#222#253#229#209#222#250#224#202#222#229#190 + +#150#255#255#255#254#255#253#243#233#255#253#243#234#255#252#242#232#255#250 + +#239#227#255#250#242#231#255#234#187#136#255#207#133'U'#179#180'i='#12#203 + +#134'U'#219#254#247#241#222#252#229#210#222#252#228#209#222#251#226#204#222 + +#249#221#196#222#234#195#157#255#230#191#150#255#228#187#146#255#228#187#146 + +#255#209#160'l'#245#208#158'm'#246#204#150'_'#218#196'yB~'#178'g<'#9#255#255 + +#255#0#203#134'U'#219#254#246#240#222#252#226#205#222#252#227#205#222#250#223 + +#200#222#247#217#188#222#245#233#221#222#250#243#235#222#251#248#243#222#205 + +#149'e'#220#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 + +#255#0#255#255#255#0#203#134'V'#218#254#245#237#222#252#222#197#222#251#224 + +#199#222#249#220#194#222#245#211#180#222#254#249#243#222#250#226#196#222#236 + +#193#147#222#195'}H'#128#255#255#255#0#255#255#255#0#255#255#255#0#255#255 + +#255#0#255#255#255#0#255#255#255#0#202#133'T'#208#255#255#255#219#253#243#233 + ,#222#253#243#234#222#252#242#232#222#250#239#227#222#250#242#231#222#234#187 + +#136#222#207#133'U'#156#180'i='#10#255#255#255#0#255#255#255#0#255#255#255#0 + +#255#255#255#0#255#255#255#0#255#255#255#0#199'yG'#170#204#134'U'#206#204#136 + +'W'#222#203#136'V'#219#204#136'V'#219#203#135'W'#219#202#131'P'#208#196'yBn' + +#178'g<'#8#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 + +#255#0#255#255#255#0#255#255#255#0#7'OnClick'#7#17'ActionCopyExecute'#0#0#9 + +'TMenuItem'#13'MenuItemPaste'#6'Action'#7#11'ActionPaste'#11'Bitmap.Data'#10 + +':'#4#0#0'6'#4#0#0'BM6'#4#0#0#0#0#0#0'6'#0#0#0'('#0#0#0#16#0#0#0#16#0#0#0#1#0 + +' '#0#0#0#0#0#0#4#0#0'd'#0#0#0'd'#0#0#0#0#0#0#0#0#0#0#0#255#255#255#0#255#255 + +#255#0#255#255#255#0#255#255#255#0#255#255#255#0'^^^'#2'[[[wXXX'#138'UUU'#138 + +'RRR'#138'OOO'#138'LLL'#138'JJJ'#138'HHH'#138'FFF'#138'DDDf c'#152'J c'#152 + +#207' c'#152#255' c'#152#255' c'#152#255'$c'#149#255'Xs'#136#255#247#247#247 + +#255#240#240#240#255#240#240#240#255#240#240#240#255#240#240#240#255#240#240 + +#240#255#240#240#240#255#243#243#243#250'FFF'#132' c'#152#194'b'#165#215#255 + +'e'#168#218#255'd'#166#217#255'b'#164#216#255'b'#159#209#255'u'#142#164#255 + +#239#239#239#255#231#231#231#255#231#231#231#255#231#231#231#255#231#231#231 + +#255#230#230#230#255#230#230#230#255#236#236#236#250'III'#132' c'#152#255'h' + +#171#220#255'H'#142#207#255'F'#139#206#255'C'#135#205#255'D'#132#198#255'h' + +#133#161#255#240#240#240#255#180#180#180#255#180#180#180#255#180#180#180#255 + +#180#180#180#255#180#180#180#255#179#179#179#255#237#237#237#250'LLL'#132' c' + +#152#255'i'#174#220#255'J'#147#209#255'H'#143#208#255'F'#139#206#255'G'#136 + +#199#255'l'#136#163#255#240#240#240#255#232#232#232#255#232#232#232#255#231 + +#231#231#255#231#231#231#255#231#231#231#255#231#231#231#255#237#237#237#250 + +'OOO'#132' c'#152#255'k'#177#222#255'M'#151#211#255'K'#147#210#255'H'#143#208 + +#255'J'#140#201#255'o'#139#165#255#241#241#241#255#182#182#182#255#181#181 + +#181#255#181#181#181#255#180#180#180#255#180#180#180#255#180#180#180#255#237 + +#237#237#250'SSS'#132' c'#152#255'm'#179#223#255'P'#156#213#255'N'#152#211 + +#255'K'#148#209#255'L'#145#203#255'p'#142#167#255#241#241#241#255#233#233#233 + +#255#233#233#233#255#232#232#232#255#232#232#232#255#232#232#232#255#231#231 + +#231#255#237#237#237#250'VVV'#132' c'#152#255'p'#181#224#255'R'#159#215#255 + +'P'#156#214#255'N'#152#212#255'O'#149#205#255's'#145#170#255#241#241#241#255 + +#183#183#183#255#182#182#182#255#182#182#182#255#182#182#182#255#181#181#181 + +#255#181#181#181#255#238#238#238#250'ZZZ'#132' c'#152#255's'#183#225#255'W' + +#163#215#255'S'#160#215#255'P'#157#213#255'R'#153#207#255'u'#148#172#255#248 + +#248#248#255#242#242#242#255#242#242#242#255#242#242#242#255#242#242#242#255 + +#242#242#242#255#241#241#241#255#244#244#244#250'^^^'#132' c'#152#255'v'#185 + +#226#255'\'#167#217#255'X'#164#216#255'S'#160#215#255'S'#158#213#255'a'#139 + +#169#255'd'#136#161#255'd'#135#161#255'c'#134#160#255'i'#135#159#255'Jh'#129 + +#255'jjj'#138'hhh'#138'eee'#138'bbbc c'#152#255'z'#187#227#255'a'#170#219#255 + +'Z'#165#217#255'S'#160#215#255'R'#159#215#255'R'#159#215#255'R'#159#215#255 + +'R'#159#215#255'R'#159#215#255'b'#163#216#255' c'#152#255#255#255#255#0#255 + +#255#255#0#255#255#255#0#255#255#255#0' c'#152#255'|'#189#228#255'e'#174#221 + +#255'b'#171#220#255'^'#168#218#255'\'#167#217#255'\'#167#217#255'\'#167#217 + +#255'\'#167#217#255'R'#159#215#255'b'#163#216#255' c'#152#255#255#255#255#0 + +#255#255#255#0#255#255#255#0#255#255#255#0' c'#152#255#127#191#228#255'i'#178 + +#222#255'J'#155#218#255'D'#151#220#255'C'#150#220#255'B'#150#220#255'B'#149 + +#220#255'A'#149#219#255'Q'#158#214#255'l'#178#222#255' c'#152#255#255#255#255 + +#0#255#255#255#0#255#255#255#0#255#255#255#0' c'#152#224'q'#179#219#254'~' + +#191#228#255'N'#157#223#255#181#238#253#255'u'#212#240#255'u'#212#240#255#181 + +#238#253#255'K'#155#222#255'n'#180#224#255'm'#179#223#249' c'#152#243#255#255 + +#255#0#255#255#255#0#255#255#255#0#255#255#255#0' c'#152'2 c'#152#178' c'#152 + +#255'7u'#164#255#182#239#254#255#128#219#243#255#128#219#243#255#182#239#254 + +#255'.n'#161#255' c'#152#255' c'#152#165' c'#152'S'#255#255#255#0#255#255#255 + +#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0' c'#152'* c'#152 + +#255' c'#152#255' c'#152#255' c'#152#255' c'#152#255' c'#152#240#255#255#255 + +#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 + +#255#255#0#7'OnClick'#7#18'ActionPasteExecute'#0#0#9'TMenuItem'#14'MenuItemD' + +'elete'#6'Action'#7#12'ActionDelete'#11'Bitmap.Data'#10':'#4#0#0'6'#4#0#0'BM' + +'6'#4#0#0#0#0#0#0'6'#0#0#0'('#0#0#0#16#0#0#0#16#0#0#0#1#0' '#0#0#0#0#0#0#4#0 + +#0'd'#0#0#0'd'#0#0#0#0#0#0#0#0#0#0#0#255#255#255#0#255#255#255#0#0#0#0#6#0#0 + +#0#14#0#0#0#22#0#0#0#30#0#0#0'%'#0#0#0'*'#0#0#0'+'#0#0#0')'#0#0#0'$'#0#0#0#29 + +#0#0#0#21#0#0#0#13#0#0#0#4#255#255#255#0#255#255#255#0#255#255#255#0#0#0#255 + +#1#0#0#211'F'#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 + +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#0#0#211'F'#0#0#255#1#255#255 + ,#255#0#255#255#255#0#255#255#255#0#0#0#255#1#0#0#206#150#0#0#206#255#0#0#206 + +'x'#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 + +#255#255#0#0#0#206'x'#0#0#207#255#0#0#207#150#0#0#255#1#255#255#255#0#255#255 + +#255#0#0#0#200'F'#0#0#200#255#0#0#200#255#0#0#201#255#0#0#202'x'#255#255#255 + +#0#255#255#255#0#255#255#255#0#255#255#255#0#0#0#202'x'#0#0#201#255#0#0#201 + +#255#0#0#201#255#0#0#200'F'#255#255#255#0#255#255#255#0#255#255#255#0#0#0#193 + +'x'#0#0#195#255#0#0#195#255#0#0#195#255#0#0#196'x'#255#255#255#0#255#255#255 + +#0#0#0#196'x'#0#0#195#255#0#0#195#255#0#0#195#255#0#0#196'x'#255#255#255#0 + +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#0#0#189'x'#0#0#189 + +#255#0#0#189#255#0#0#189#255#0#0#189'x'#0#0#189'x'#0#0#189#255#0#0#189#255#0 + +#0#189#255#0#0#189'x'#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 + +#255#255#255#0#255#255#255#0#255#255#255#0#0#0#183'x'#0#0#183#255#0#0#183#255 + +#0#0#183#255#0#0#183#255#0#0#183#255#0#0#183#255#0#0#183'x'#255#255#255#0#255 + +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 + +#255#0#255#255#255#0#255#255#255#0#0#0#176'x'#0#0#177#255#0#0#177#255#0#0#177 + +#255#0#0#177#255#0#0#179'x'#255#255#255#0#255#255#255#0#255#255#255#0#255#255 + +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 + +#255#255#255#0#0#0#170'x'#0#0#171#255#0#0#171#255#0#0#171#255#0#0#172#255#0#0 + +#172'x'#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 + +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#0#0#166'x'#0#0#165 + +#255#0#0#165#255#0#0#165#255#0#0#166#255#0#0#166#255#0#0#166#255#0#0#166'x' + +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 + +#255#255#0#255#255#255#0#0#0#159'x'#0#0#159#255#0#0#159#255#0#0#159#255#0#0 + +#159'x'#0#0#159'x'#0#0#160#255#0#0#160#255#0#0#160#255#0#0#159'x'#255#255#255 + +#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#0#0#153'x'#0#0#153 + +#255#0#0#153#255#0#0#153#255#0#0#153'x'#255#255#255#0#255#255#255#0#0#0#153 + +'x'#0#0#154#255#0#0#154#255#0#0#154#255#0#0#153'x'#255#255#255#0#255#255#255 + +#0#255#255#255#0#0#0#146'F'#0#0#147#255#0#0#147#255#0#0#147#255#0#0#149'x' + +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#0#0#149'x'#0#0#148 + +#255#0#0#148#255#0#0#148#255#0#0#149'F'#255#255#255#0#255#255#255#0#0#0#255#1 + +#0#0#141#150#0#0#141#255#0#0#142'x'#255#255#255#0#255#255#255#0#255#255#255#0 + +#255#255#255#0#255#255#255#0#255#255#255#0#0#0#142'x'#0#0#142#255#0#0#143#150 + +#0#0#255#1#255#255#255#0#255#255#255#0#255#255#255#0#0#0#255#1#0#0#135'F'#255 + +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 + +#255#0#255#255#255#0#255#255#255#0#0#0#135'F'#0#0#255#1#255#255#255#0#255#255 + +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 + +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 + +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 + +#255#0#7'OnClick'#7#19'ActionDeleteExecute'#0#0#9'TMenuItem'#16'MenuItemDivi' + +'der4'#7'Caption'#6#1'-'#0#0#9'TMenuItem'#17'MenuItemSelectAll'#6'Action'#7 + +#15'ActionSelectAll'#7'OnClick'#7#22'ActionSelectAllExecute'#0#0#9'TMenuItem' + +#16'MenuItemDivider5'#7'Caption'#6#1'-'#0#0#9'TMenuItem'#12'MenuItemFind'#6 + +'Action'#7#15'ActionFindStart'#11'Bitmap.Data'#10':'#4#0#0'6'#4#0#0'BM6'#4#0 +#0#0#0#0#0'6'#0#0#0'('#0#0#0#16#0#0#0#16#0#0#0#1#0' '#0#0#0#0#0#0#4#0#0'd'#0 - +#0#0'd'#0#0#0#0#0#0#0#0#0#0#0#255#255#255#0#255#255#255#0#255#255#255#0#255 - +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 - +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 - +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 - +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 - +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 - +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'EP'#191#230'99'#134 - +#230'99'#134#230'99'#134#230'99'#134#230'99'#134#230'99'#134#230'99'#134#230 - +'99'#134#230'99'#134#230'99'#134#230'99'#134#230#255#255#255#0#255#255#255#0 - +#255#255#255#0#255#255#255#0'EP'#191#230#135#150#246#255'|'#141#247#255'r' - +#132#248#255'h|'#248#255'^s'#250#255'Sj'#250#255'Jc'#250#255'B\'#251#255':U' - +#252#255'3O'#252#255'99'#134#230#255#255#255#0#255#255#255#0#255#255#255#0 - +#255#255#255#0'EP'#191#230#146#158#245#255#135#150#246#255'|'#141#247#255'r' - +#133#248#255'h|'#249#255'^s'#249#255'Tk'#250#255'Kc'#251#255'B\'#251#255'9U' - +#252#255'99'#134#230#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 - ,'EP'#191#230#155#167#245#255#146#159#245#255#135#150#247#255'|'#141#247#255 - +'r'#132#248#255'g|'#248#255'^s'#249#255'Tk'#250#255'Jc'#251#255'A\'#251#255 - +'99'#134#230#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'EP'#191 - +#230#166#175#244#255#156#167#245#255#145#159#245#255#135#150#246#255'}'#141 - +#247#255'q'#132#247#255'h|'#248#255']s'#249#255'Tj'#250#255'Jc'#251#255'99' - +#134#230#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'EP'#191#230 - +#174#183#243#255#165#175#245#255#156#167#245#255#145#159#245#255#135#150#247 - +#255'|'#141#247#255'r'#132#248#255'h{'#249#255']s'#249#255'Sk'#250#255'99' - +#134#230#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'EP'#191#230 - +#183#190#243#255#175#183#244#255#166#176#244#255#155#168#245#255#146#159#246 - +#255#135#150#246#255'|'#141#247#255'r'#132#248#255'g{'#248#255']s'#249#255'9' - +'9'#134#230#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'EP'#191 - +#230#191#197#242#255#183#190#243#255#175#183#244#255#165#175#244#255#156#167 - +#245#255#146#159#246#255#135#149#246#255'}'#141#247#255'r'#132#248#255'h|' - +#248#255'99'#134#230#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 - +'EP'#191#230#199#202#241#255#191#197#243#255#183#190#243#255#174#183#244#255 - +#166#175#244#255#155#167#245#255#146#159#246#255#135#150#246#255'|'#141#247 - +#255'r'#132#247#255'99'#134#230#255#255#255#0#255#255#255#0#255#255#255#0#255 - +#255#255#0'EP'#191#230#204#208#241#255#198#203#241#255#191#197#242#255#183 - +#191#243#255#175#183#244#255#166#175#245#255#155#168#245#255#145#159#246#255 - +#135#150#246#255'}'#141#247#255'99'#134#230#255#255#255#0#255#255#255#0#255 - +#255#255#0#255#255#255#0'EP'#191#230#209#212#241#255#204#208#242#255#198#203 - +#242#255#191#197#242#255#183#190#243#255#174#184#243#255#165#175#244#255#155 - +#168#244#255#145#159#245#255#135#149#246#255'99'#134#230#255#255#255#0#255 - +#255#255#0#255#255#255#0#255#255#255#0'EP'#191#230'EP'#191#230'EP'#191#230'E' - +'P'#191#230'EP'#191#230'EP'#191#230'EP'#191#230'EP'#191#230'EP'#191#230'EP' - +#191#230'EP'#191#230'EP'#191#230#255#255#255#0#255#255#255#0#255#255#255#0 - +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 - +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 - +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 - +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 - +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 - +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#10'ImageIndex' - +#2#7#7'OnClick'#7#17'ActionStopExecute'#0#0#0#9'TMenuItem'#8'MenuView'#7'Cap' - +'tion'#6#5'&View'#0#9'TMenuItem'#21'MenuItemColourHistory'#7'Caption'#6#15'&' - +'Colour History'#7'OnClick'#7#26'MenuItemColourHistoryClick'#0#0#9'TMenuItem' - +#18'MenuItemDebugImage'#7'Caption'#6#12'&Debug Image'#7'OnClick'#7#23'MenuIt' - +'emDebugImageClick'#0#0#9'TMenuItem'#20'MenuItemFunctionList'#7'Caption'#6#14 - +'&Function List'#7'OnClick'#7#25'MenuItemFunctionListClick'#0#0#9'TMenuItem' - +#18'MenuItemExtensions'#7'Caption'#6#11'&Extensions'#7'OnClick'#7#23'MenuIte' - +'mExtensionsClick'#0#0#0#9'TMenuItem'#9'MenuTools'#7'Caption'#6#6'&Tools'#0#9 - +'TMenuItem'#24'MenuitemFillFunctionList'#7'Caption'#6#19'&Fill Function List' + +#0#0'd'#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#1#1#1' '#2#2#2#207#20#20#20 + +#255'999'#207#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#1#1#1'0'#2#2#2#239#21#21#21#255':::'#255'```'#255#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#1#1#1'0'#2#2#2#239#21#21#21#255';;;'#255'```'#255#128#128#128#207#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#1#1#1'0'#2#2 + +#2#239#21#21#21#255';;;'#255'aaa'#255#129#129#129#207#140#140#140#16#0#0#0#0 + +#0#0#0#0#0#0#0#0#140#140#140'P'#140#140#140#159#140#140#140#191#140#140#140 + +#191#140#140#140#143'TTTP'#2#2#2#239#22#22#22#255';;;'#255'aaa'#255#129#129 + +#129#207#140#140#140#16#0#0#0#0#0#0#0#0#140#140#140#16#140#140#140#191#140 + +#140#140#255#162#159#154#255#190#182#171#255#183#176#165#255#154#152#148#255 + +#140#140#140#255'```'#255'<<<'#255'aaa'#255#129#129#129#207#140#140#140#16#0 + +#0#0#0#0#0#0#0#140#140#140#16#140#140#140#207#162#159#156#255#233#223#207#255 + +#255#240#218#255#255#238#213#255#255#236#208#255#255#235#204#255#219#204#181 + +#255#147#146#144#255'|||'#255#129#129#129#207#140#140#140#16#0#0#0#0#0#0#0#0 + +#0#0#0#0#140#140#140#128#147#147#146#255#241#232#220#255#255#244#227#255#255 + +#242#222#255#255#240#217#255#255#238#213#255#255#236#208#255#255#235#204#255 + +#219#204#181#255#140#140#140#255#140#140#140'P'#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#140#140#140#239#190#188#183#255#255#247#236#255#255#245#231#255#255#244 + ,#226#255#255#242#222#255#255#240#217#255#255#238#213#255#255#236#208#255#255 + +#235#203#255#162#158#151#255#140#140#140#175#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#140#140#140#255#226#223#218#255#255#249#240#255#255#247#235#255#255#245#231 + +#255#255#244#226#255#255#242#221#255#255#240#217#255#255#238#212#255#255#236 + +#208#255#198#187#172#255#140#140#140#207#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#140 + +#140#140#255#226#224#221#255#255#251#244#255#255#249#240#255#255#247#235#255 + +#255#245#230#255#255#243#226#255#255#242#221#255#255#240#217#255#255#238#212 + +#255#198#188#174#255#140#140#140#239#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#140#140 + +#140#255#212#211#210#255#255#252#249#255#255#251#244#255#255#249#239#255#255 + +#247#235#255#255#245#230#255#255#243#226#255#255#242#221#255#255#242#221#255 + +#183#177#167#255#140#140#140#191#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#140#140#140 + +#175#154#154#154#255#255#254#253#255#255#252#248#255#255#251#244#255#255#249 + +#239#255#255#247#234#255#255#246#232#255#255#250#242#255#241#232#219#255#147 + +#146#145#255#140#140#140'p'#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#140#140#140'0' + +#140#140#140#255#183#183#183#255#255#254#253#255#255#254#252#255#255#253#249 + +#255#255#253#249#255#255#254#252#255#248#242#232#255#162#159#156#255#140#140 + +#140#223#140#140#140#16#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#140#140#140 + +'`'#140#140#140#255#154#154#154#255#212#211#210#255#226#225#223#255#226#224 + +#220#255#205#201#195#255#147#147#146#255#140#140#140#239#140#140#140'0'#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#140#140#140'0'#140#140#140 + +#175#140#140#140#255#140#140#140#255#140#140#140#255#140#140#140#239#140#140 + +#140#159#140#140#140#16#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#7'On' + +'Click'#7#22'ActionFindstartExecute'#0#0#9'TMenuItem'#16'MenuItemFindNext'#6 + +'Action'#7#14'ActionFindNext'#7'OnClick'#7#21'ActionFindNextExecute'#0#0#9'T' + +'MenuItem'#15'MenuItemReplace'#6'Action'#7#13'ActionReplace'#7'OnClick'#7#20 + +'ActionReplaceExecute'#0#0#0#9'TMenuItem'#14'MenuItemScript'#7'Caption'#6#7 + +'&Script'#13'SubMenuImages'#7#17'Mufasa_Image_List'#0#9'TMenuItem'#11'MenuIt' + +'emRun'#6'Action'#7#15'ActionRunScript'#11'Bitmap.Data'#10':'#4#0#0'6'#4#0#0 + +'BM6'#4#0#0#0#0#0#0'6'#0#0#0'('#0#0#0#16#0#0#0#16#0#0#0#1#0' '#0#0#0#0#0#0#4 + +#0#0'd'#0#0#0'd'#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#4's:'#255'!'#130'O' + +#255'c'#130'r'#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#4's:'#255'z'#207#164#255',' + +#140'Z'#255'=vY'#255#174#174#174#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#4's:'#255#130#216#172#255'v' + +#214#166#255'<'#157'j'#255'''tL'#255#172#174#173#255#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#9'w?'#255#131#219 + +#174#255#31#198'q'#255'r'#222#167#255'K'#178#127#255#23'tE'#255#168#173#170 + +#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#4's:'#255#131#220#175#255#17#195'i'#255#26#204's'#255'i'#223#163#255'Z'#194 + +#141#255#19'vC'#255#158#167#163#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#4's:'#255#169#220#193#255#16#189'e'#255#17#193'g'#255 + +#19#194'i'#255'Y'#211#149#255'g'#201#152#255#22'|G'#255#136#156#146#255#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#4's:'#255#169#220#193#255 + +#13#179'^'#255#14#182'`'#255#14#182'`'#255#13#180'_'#255'G'#196#132#255'p' + +#202#156#255#29#130'M'#255'g'#140'y'#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#4's:'#255#169#220#193#255#12#170'X'#255#18#174'^'#255#21#175'`' + +#255#22#173'a'#255#19#170']'#255':'#182'w'#255'u'#199#157#255'('#137'W'#255 + +'N'#131'g'#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#4's:'#255#169#220#193 + +#255'.'#173'k'#255'+'#173'j'#255''''#171'h'#255'"'#169'd'#255#28#165'_'#255 + +'A'#178'x'#255'x'#198#159#255')'#136'X'#255'g'#140'y'#255#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#4's:'#255#169#220#193#255'6'#173'p'#255'2'#172'm'#255'-' + +#170'j'#255'('#168'f'#255'X'#188#137#255'x'#197#157#255#31#128'N'#255#131#154 + +#142#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#4's:'#255#169#220 + +#193#255'>'#177'v'#255':'#175's'#255'6'#174'p'#255'o'#197#152#255'q'#191#151 + +#255#24'{I'#255#166#176#171#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#4's:'#255#169#220#193#255'E'#180'{'#255'G'#180'|'#255#130#204#166 + +#255'g'#182#140#255#23'wE'#255#193#197#195#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#4's:'#255#165#218#191#255'W'#187#135#255 + +#144#210#176#255'['#171#130#255'#wL'#255#212#213#212#255#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#4's:'#255#169#220#193 + +#255#155#213#183#255'L'#159's'#255'=}\'#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#4's:'#255#164#217#190 + +#255'='#147'f'#255'_'#136's'#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#4's:'#255'-'#136'Y'#255 + ,#133#156#144#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#10'ImageIndex'#2#6#7'OnClick'#7#16'ActionRunExe' + +'cute'#0#0#9'TMenuItem'#15'MenuItemCompile'#6'Action'#7#19'ActionCompileScri' + +'pt'#7'Caption'#6#7'Compile'#7'OnClick'#7#26'ActionCompileScriptExecute'#0#0 + +#9'TMenuItem'#13'MenuItemPause'#6'Action'#7#17'ActionPauseScript'#11'Bitmap.' + +'Data'#10':'#4#0#0'6'#4#0#0'BM6'#4#0#0#0#0#0#0'6'#0#0#0'('#0#0#0#16#0#0#0#16 + +#0#0#0#1#0' '#0#0#0#0#0#0#4#0#0'd'#0#0#0'd'#0#0#0#0#0#0#0#0#0#0#0#238#238#238 + +#0#238#238#238#0#238#238#238#0#152'pP'#255#164'e4'#255#164'e4'#255#152'pP' + +#255#251#227#188#0#251#227#188#0#152'pP'#255#164'e4'#255#164'e4'#255#152'pP' + +#255#0#0#0#0#0#0#0#0#0#0#0#0#152'pP'#0#152'pP'#0#152'pP'#0#159'h>'#255#201 + +#156'v'#255#205#165#133#255#159'h>'#255#152'pP'#0#152'pP'#0#159'h>'#255#201 + +#156'v'#255#205#165#133#255#159'h>'#255#0#0#0#0#0#0#0#0#0#0#0#0#162'f8'#0#162 + +'f8'#0#162'f8'#0#163'e5'#255#215#172#136#255#225#197#173#255#163'e5'#255#162 + +'f8'#0#162'f8'#0#163'e5'#255#215#172#136#255#225#197#173#255#163'e5'#255#0#0 + +#0#0#0#0#0#0#0#0#0#0#164'e4'#0#164'e4'#0#164'e4'#0#164'e4'#255#216#169#129 + +#255#230#204#181#255#164'e4'#255#164'e4'#0#164'e4'#0#164'e4'#255#216#169#129 + +#255#230#204#181#255#164'e4'#255#0#0#0#0#0#0#0#0#0#0#0#0#164'e4'#0#164'e4'#0 + +#164'e4'#0#164'e4'#255#215#167#127#255#230#204#181#255#164'e4'#255#164'e4'#0 + +#164'e4'#0#164'e4'#255#215#167#127#255#230#204#181#255#164'e4'#255#0#0#0#0#0 + +#0#0#0#0#0#0#0#164'e4'#0#164'e4'#0#164'e4'#0#164'e4'#255#215#169#129#255#230 + +#205#182#255#164'e4'#255#164'e4'#0#164'e4'#0#164'e4'#255#215#169#129#255#230 + +#205#182#255#164'e4'#255#0#0#0#0#0#0#0#0#0#0#0#0#164'e4'#0#164'e4'#0#164'e4' + +#0#164'e4'#255#216#171#132#255#230#206#183#255#164'e4'#255#164'e4'#0#164'e4' + +#0#164'e4'#255#216#171#132#255#230#206#183#255#164'e4'#255#0#0#0#0#0#0#0#0#0 + +#0#0#0#164'e4'#0#164'e4'#0#164'e4'#0#164'e4'#255#217#174#137#255#230#206#183 + +#255#164'e4'#255#164'e4'#0#164'e4'#0#164'e4'#255#217#174#137#255#230#206#183 + +#255#164'e4'#255#0#0#0#0#0#0#0#0#0#0#0#0#164'e4'#0#164'e4'#0#164'e4'#0#164'e' + +'4'#255#217#176#141#255#230#206#183#255#164'e4'#255#164'e4'#0#164'e4'#0#164 + +'e4'#255#217#176#141#255#230#206#183#255#164'e4'#255#0#0#0#0#0#0#0#0#0#0#0#0 + +#164'e4'#0#164'e4'#0#164'e4'#0#164'e4'#255#217#178#143#255#230#206#183#255 + +#164'e4'#255#164'e4'#0#164'e4'#0#164'e4'#255#217#178#143#255#230#206#183#255 + +#164'e4'#255#0#0#0#0#0#0#0#0#0#0#0#0#164'e4'#0#164'e4'#0#164'e4'#0#164'e4' + +#255#218#179#145#255#230#206#183#255#164'e4'#255#164'e4'#0#164'e4'#0#164'e4' + +#255#218#179#145#255#230#206#183#255#164'e4'#255#0#0#0#0#0#0#0#0#0#0#0#0#164 + +'e4'#0#164'e4'#0#164'e4'#0#164'e4'#255#218#181#147#255#230#207#185#255#164'e' + +'4'#255#164'e4'#0#164'e4'#0#164'e4'#255#218#181#147#255#230#207#185#255#164 + +'e4'#255#0#0#0#0#0#0#0#0#0#0#0#0#164'e4'#0#164'e4'#0#164'e4'#0#164'e4'#255 + +#219#182#148#255#231#209#187#255#164'e4'#255#164'e4'#0#164'e4'#0#164'e4'#255 + +#219#182#148#255#231#209#187#255#164'e4'#255#0#0#0#0#0#0#0#0#0#0#0#0#164'e4' + +#0#164'e4'#0#164'e4'#0#164'e4'#255#221#188#157#255#231#209#188#255#164'e4' + +#255#164'e4'#0#164'e4'#0#164'e4'#255#221#188#157#255#231#209#188#255#164'e4' + +#255#0#0#0#0#0#0#0#0#0#0#0#0#153'nL'#0#153'nL'#0#153'nL'#0#162'f7'#255#220 + +#191#164#255#223#198#175#255#162'f7'#255#153'nL'#0#153'nL'#0#162'f7'#255#220 + +#191#164#255#223#198#175#255#162'f7'#255#0#0#0#0#0#0#0#0#0#0#0#0#238#238#238 + +#0#238#238#238#0#238#238#238#0#153'nL'#255#171'qC'#255#172'rD'#255#153'nL' + +#255#251#227#188#0#251#227#188#0#153'nL'#255#171'qC'#255#172'rD'#255#153'nL' + +#255#0#0#0#0#0#0#0#0#0#0#0#0#10'ImageIndex'#2#5#7'OnClick'#7#18'ActionPauseE' + +'xecute'#0#0#9'TMenuItem'#12'MenuItemStop'#6'Action'#7#16'ActionStopScript' +#11'Bitmap.Data'#10':'#4#0#0'6'#4#0#0'BM6'#4#0#0#0#0#0#0'6'#0#0#0'('#0#0#0#16 +#0#0#0#16#0#0#0#1#0' '#0#0#0#0#0#0#4#0#0'd'#0#0#0'd'#0#0#0#0#0#0#0#0#0#0#0 - +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'9'#134 - +'@'#3'4~:x'#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 - +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 - +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'A'#145'I'#156';'#136 - +'B'#210#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 - +#255#255#0#255#255#255#0#255#255#255#0'N'#163'W'#144'f'#176'n'#255'a'#170'h' - +#255'='#139'D'#255'7'#131'>'#255'2{7'#255',t2'#234'''m,'#183'#f''p'#31'a#'#29 - +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'['#180 - +'e'#132's'#189'|'#255#150#209#159#255#148#207#156#255#143#205#150#255#138#202 - +#145#255#133#199#139#255'z'#190#129#255'e'#173'l'#255'K'#146'Q'#255'$h)'#176 - +' c$9'#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'`'#188'l'#138 - +'y'#196#131#255#158#215#167#255#155#212#164#255#151#210#159#255#146#207#154 - +#255#141#204#149#255#136#202#144#255'z'#194#130#255'~'#196#133#255']'#164'c' - +#255'&k*'#176'"e%'#29#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 - +'b'#190'm'#147'{'#199#133#255'w'#194#129#255'T'#171'^'#255'N'#163'W'#255'I' - +#155'Q'#255'c'#172'k'#255#131#195#139#255#135#201#143#255#130#198#137#255'P' - +#151'V'#255'''m,p'#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 - +#255#255#255#0'c'#192'n'#159'_'#187'j'#210#255#255#255#0#255#255#255#0#255 - +#255#255#0'K'#158'S'#141'E'#150'M'#225#134#198#142#255#136#201#143#255'o'#179 - ,'v'#255'.v3'#183'E'#150'Ma?'#142'Fa9'#134'@a4~:a.v3ag'#198's'#3'd'#194'p{' - +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'M'#161'U'#131'G'#153 - +'O'#237'A'#145'I'#246';'#136'B'#248'5'#128'<'#232'M'#161'U'#232'G'#153'O'#248 - +'A'#145'I'#246';'#136'B'#237'5'#128'<'#131#255#255#255#0#255#255#255#0#255 - +#255#255#0#255#255#255#0#30'_!{'#27'['#30#3'T'#171'^aN'#163'WaI'#155'QaC'#147 - +'Ka='#139'DaT'#171'^'#183#128#195#137#255#141#204#149#255#131#196#138#255'=' + +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 + +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 + +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 + +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 + +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 + +#255#255#255#0#255#255#255#0'EP'#191#230'99'#134#230'99'#134#230'99'#134#230 + +'99'#134#230'99'#134#230'99'#134#230'99'#134#230'99'#134#230'99'#134#230'99' + +#134#230'99'#134#230#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 + +'EP'#191#230#135#150#246#255'|'#141#247#255'r'#132#248#255'h|'#248#255'^s' + +#250#255'Sj'#250#255'Jc'#250#255'B\'#251#255':U'#252#255'3O'#252#255'99'#134 + +#230#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'EP'#191#230#146 + +#158#245#255#135#150#246#255'|'#141#247#255'r'#133#248#255'h|'#249#255'^s' + +#249#255'Tk'#250#255'Kc'#251#255'B\'#251#255'9U'#252#255'99'#134#230#255#255 + ,#255#0#255#255#255#0#255#255#255#0#255#255#255#0'EP'#191#230#155#167#245#255 + +#146#159#245#255#135#150#247#255'|'#141#247#255'r'#132#248#255'g|'#248#255'^' + +'s'#249#255'Tk'#250#255'Jc'#251#255'A\'#251#255'99'#134#230#255#255#255#0#255 + +#255#255#0#255#255#255#0#255#255#255#0'EP'#191#230#166#175#244#255#156#167 + +#245#255#145#159#245#255#135#150#246#255'}'#141#247#255'q'#132#247#255'h|' + +#248#255']s'#249#255'Tj'#250#255'Jc'#251#255'99'#134#230#255#255#255#0#255 + +#255#255#0#255#255#255#0#255#255#255#0'EP'#191#230#174#183#243#255#165#175 + +#245#255#156#167#245#255#145#159#245#255#135#150#247#255'|'#141#247#255'r' + +#132#248#255'h{'#249#255']s'#249#255'Sk'#250#255'99'#134#230#255#255#255#0 + +#255#255#255#0#255#255#255#0#255#255#255#0'EP'#191#230#183#190#243#255#175 + +#183#244#255#166#176#244#255#155#168#245#255#146#159#246#255#135#150#246#255 + +'|'#141#247#255'r'#132#248#255'g{'#248#255']s'#249#255'99'#134#230#255#255 + +#255#0#255#255#255#0#255#255#255#0#255#255#255#0'EP'#191#230#191#197#242#255 + +#183#190#243#255#175#183#244#255#165#175#244#255#156#167#245#255#146#159#246 + +#255#135#149#246#255'}'#141#247#255'r'#132#248#255'h|'#248#255'99'#134#230 + +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'EP'#191#230#199#202 + +#241#255#191#197#243#255#183#190#243#255#174#183#244#255#166#175#244#255#155 + +#167#245#255#146#159#246#255#135#150#246#255'|'#141#247#255'r'#132#247#255'9' + +'9'#134#230#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'EP'#191 + +#230#204#208#241#255#198#203#241#255#191#197#242#255#183#191#243#255#175#183 + +#244#255#166#175#245#255#155#168#245#255#145#159#246#255#135#150#246#255'}' + +#141#247#255'99'#134#230#255#255#255#0#255#255#255#0#255#255#255#0#255#255 + +#255#0'EP'#191#230#209#212#241#255#204#208#242#255#198#203#242#255#191#197 + +#242#255#183#190#243#255#174#184#243#255#165#175#244#255#155#168#244#255#145 + +#159#245#255#135#149#246#255'99'#134#230#255#255#255#0#255#255#255#0#255#255 + +#255#0#255#255#255#0'EP'#191#230'EP'#191#230'EP'#191#230'EP'#191#230'EP'#191 + +#230'EP'#191#230'EP'#191#230'EP'#191#230'EP'#191#230'EP'#191#230'EP'#191#230 + +'EP'#191#230#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 + +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 + +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 + +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 + +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 + +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 + +#255#255#0#255#255#255#0#255#255#255#0#10'ImageIndex'#2#7#7'OnClick'#7#17'Ac' + +'tionStopExecute'#0#0#0#9'TMenuItem'#8'MenuView'#7'Caption'#6#5'&View'#0#9'T' + +'MenuItem'#21'MenuItemColourHistory'#7'Caption'#6#15'&Colour History'#7'OnCl' + +'ick'#7#26'MenuItemColourHistoryClick'#0#0#9'TMenuItem'#18'MenuItemDebugImag' + +'e'#7'Caption'#6#12'&Debug Image'#7'OnClick'#7#23'MenuItemDebugImageClick'#0 + +#0#9'TMenuItem'#20'MenuItemFunctionList'#7'Caption'#6#14'&Function List'#7'O' + +'nClick'#7#25'MenuItemFunctionListClick'#0#0#9'TMenuItem'#18'MenuItemExtensi' + +'ons'#7'Caption'#6#11'&Extensions'#7'OnClick'#7#23'MenuItemExtensionsClick'#0 + +#0#0#9'TMenuItem'#9'MenuTools'#7'Caption'#6#6'&Tools'#0#9'TMenuItem'#24'Menu' + +'itemFillFunctionList'#7'Caption'#6#19'&Fill Function List'#11'Bitmap.Data' + +#10':'#4#0#0'6'#4#0#0'BM6'#4#0#0#0#0#0#0'6'#0#0#0'('#0#0#0#16#0#0#0#16#0#0#0 + +#1#0' '#0#0#0#0#0#0#4#0#0'd'#0#0#0'd'#0#0#0#0#0#0#0#0#0#0#0#255#255#255#0#255 + +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'9'#134'@'#3'4~:x'#255 + +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 + +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 + +#255#255#255#0#255#255#255#0#255#255#255#0'A'#145'I'#156';'#136'B'#210#255 + +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 + +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 + +#255#255#255#0#255#255#255#0'N'#163'W'#144'f'#176'n'#255'a'#170'h'#255'='#139 + +'D'#255'7'#131'>'#255'2{7'#255',t2'#234'''m,'#183'#f''p'#31'a#'#29#255#255 + +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'['#180'e'#132 + +'s'#189'|'#255#150#209#159#255#148#207#156#255#143#205#150#255#138#202#145 + +#255#133#199#139#255'z'#190#129#255'e'#173'l'#255'K'#146'Q'#255'$h)'#176' c$' + +'9'#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'`'#188'l'#138'y' + +#196#131#255#158#215#167#255#155#212#164#255#151#210#159#255#146#207#154#255 + +#141#204#149#255#136#202#144#255'z'#194#130#255'~'#196#133#255']'#164'c'#255 + +'&k*'#176'"e%'#29#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'b' + +#190'm'#147'{'#199#133#255'w'#194#129#255'T'#171'^'#255'N'#163'W'#255'I'#155 + +'Q'#255'c'#172'k'#255#131#195#139#255#135#201#143#255#130#198#137#255'P'#151 + +'V'#255'''m,p'#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 + +#255#255#0'c'#192'n'#159'_'#187'j'#210#255#255#255#0#255#255#255#0#255#255 + ,#255#0'K'#158'S'#141'E'#150'M'#225#134#198#142#255#136#201#143#255'o'#179'v' + +#255'.v3'#183'E'#150'Ma?'#142'Fa9'#134'@a4~:a.v3ag'#198's'#3'd'#194'p{'#255 + +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'M'#161'U'#131'G'#153'O' + +#237'A'#145'I'#246';'#136'B'#248'5'#128'<'#232'M'#161'U'#232'G'#153'O'#248'A' + +#145'I'#246';'#136'B'#237'5'#128'<'#131#255#255#255#0#255#255#255#0#255#255 + +#255#0#255#255#255#0#30'_!{'#27'['#30#3'T'#171'^aN'#163'WaI'#155'QaC'#147'Ka' + +'='#139'DaT'#171'^'#183#128#195#137#255#141#204#149#255#131#196#138#255'=' +#139'D'#225'7'#131'>'#141#255#255#255#0#255#255#255#0#255#255#255#0'#f'''#210 +#31'a#'#159#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 +#255#0'['#180'epu'#191'~'#255#152#210#161#255#148#207#156#255#134#199#141#255 @@ -1152,8 +1153,8 @@ LazarusResources.Add('TForm1','FORMDATA',[ +#138#255#227#0#138#255#238#238#247#255#255'D'#169#255#255#0#138#255#232#232 +#244#255#255'D'#169#255#255#244#250#255#255#218#238#255#255#203#231#255#255 +#171#216#255#255#12#144#255#255'f'#185#255#255'f'#185#255#255#0#138#255#215 - +#215#237#255#255#24#149#255#255#0#138#255#133#0#138#255#238#0#138#255#133#0 - ,#138#255#127#0#138#255#232#0#138#255#139#0#138#255#244#0#138#255#218#0#138 + ,#215#237#255#255#24#149#255#255#0#138#255#133#0#138#255#238#0#138#255#133#0 + +#138#255#127#0#138#255#232#0#138#255#139#0#138#255#244#0#138#255#218#0#138 +#255#203#0#138#255#171#0#138#255'B'#0#138#255'f'#0#138#255'f'#0#138#255'n'#0 +#138#255#215#0#138#255'n'#255#255#255#0#255#255#255#0#255#255#255#0#255#255 +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 @@ -1216,8 +1217,8 @@ LazarusResources.Add('TForm1','FORMDATA',[ +#128#255#234#171#128#255#234#171#128#255#232#169'|'#255#230#164'w'#255#226 +#160'p'#255#226#155'k'#255#225#151'b'#255#221#144'Y'#255#217#139'R'#255#216 +#133'I'#255#214#128'>'#255#210'w5'#255#255#255#255#0#255#255#255#0#255#255 - +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 - ,#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 + ,#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 + +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 @@ -1280,8 +1281,8 @@ LazarusResources.Add('TForm1','FORMDATA',[ +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 +#255#255#255#0#255#255#255#0#7'OnClick'#7#18'MenuItemAboutClick'#0#0#9'TMenu' +'Item'#16'MenuItemHandbook'#7'Caption'#6#9'&Handbook'#7'OnClick'#7#21'MenuIt' - +'emHandbookClick'#0#0#9'TMenuItem'#17'MenuItemReportBug'#7'Caption'#6#13'&Re' - ,'port a Bug'#11'Bitmap.Data'#10':'#4#0#0'6'#4#0#0'BM6'#4#0#0#0#0#0#0'6'#0#0#0 + ,'emHandbookClick'#0#0#9'TMenuItem'#17'MenuItemReportBug'#7'Caption'#6#13'&Re' + +'port a Bug'#11'Bitmap.Data'#10':'#4#0#0'6'#4#0#0'BM6'#4#0#0#0#0#0#0'6'#0#0#0 +'('#0#0#0#16#0#0#0#16#0#0#0#1#0' '#0#0#0#0#0#0#4#0#0'd'#0#0#0'd'#0#0#0#0#0#0 +#0#0#0#0#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 +#255#0'2'#138#197#236'0'#135#196#246'/'#133#195#246'-'#131#194#246'*'#128#187 @@ -1344,8 +1345,8 @@ LazarusResources.Add('TForm1','FORMDATA',[ +#208'^B'#255#208'^B'#255#161'UB'#255#161'UB'#255#161'UB'#255'BBBcBBB'#0'BBB' +#0'BBB'#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'BBB'#11#161 +'UB'#255#255#218#208#255#161'UB'#255#208'^B'#255#161'UB'#255#161'UB'#255'BBB' - +'cBBBLBBB'#0'BBB'#0'BBB'#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 - ,#255#0#131#131#131#255#255#255#255#255#161'UB'#255#255#218#208#255#161'UB' + ,'cBBBLBBB'#0'BBB'#0'BBB'#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 + +#255#0#131#131#131#255#255#255#255#255#161'UB'#255#255#218#208#255#161'UB' +#255#161'UB'#255'BBBcBBBLBBB'#25'BBB'#0'BBB'#0'BBB'#0#255#255#255#0#255#255 +#255#0#255#255#255#0#131#131#131#255#255#255#255#255#229#229#229#255#161#161 +#161#255#161'UB'#255#255#218#208#255#161'UB'#255'BBBXBBB'#28'BBB'#3'BBB'#0'B' @@ -1408,8 +1409,8 @@ LazarusResources.Add('TForm1','FORMDATA',[ +#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'V'#167#128#24'V' +#167#128#195'l'#179#146#255#168#213#195#255#197#230#219#255'q'#183#151#255 +#198#230#220#255#169#214#196#255'o'#181#148#255'V'#167#128#198'V'#167#128#30 - +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'R'#162'}'#27'S'#163 - ,'~'#228#143#198#174#255#200#232#223#255#223#242#236#255#249#253#251#255'w' + ,#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'R'#162'}'#27'S'#163 + +'~'#228#143#198#174#255#200#232#223#255#223#242#236#255#249#253#251#255'w' +#184#153#255#248#252#251#255#220#241#235#255#199#231#222#255#147#200#178#255 +'U'#164#128#232'R'#162'}'#30#255#255#255#0#255#255#255#0#255#255#255#0'M'#157 +'x'#192#140#195#171#255#195#230#220#255#245#251#249#255#197#230#220#255#157 @@ -1472,8 +1473,8 @@ LazarusResources.Add('TForm1','FORMDATA',[ +#255#255#255#0#255#255#255#0#0#11#136#2#255#255#255#0#180#142'Z'#144#246#234 +#221#255#225#205#180#255#177#141']'#191#255#255#255#0#255#255#255#0#255#255 +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 - +#3#13#140#31#27'&'#167#153'*4'#186#204#17#28#157#137#187#152'i'#204#240#224 - ,#208#255#183#145'_'#197#143']'#20#11#255#255#255#0#255#255#255#0#255#255#255 + ,#3#13#140#31#27'&'#167#153'*4'#186#204#17#28#157#137#187#152'i'#204#240#224 + +#208#255#183#145'_'#197#143']'#20#11#255#255#255#0#255#255#255#0#255#255#255 +#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#3#13#140#31',5' +#185#215''#202#242'?L'#215#255#216#188#154#255#246#234#225#255 +#187#146'Z'#191#148'b'#24';'#145'a'#26#1#255#255#255#0#255#255#255#0#255#255 @@ -1536,8 +1537,8 @@ LazarusResources.Add('TForm1','FORMDATA',[ +#18#0#0#0#15#0#0#0#13#0#0#0#10#0#0#0#7#0#0#0#5#0#0#0#3#0#0#0#1#0#0#0#0#238 +#238#238#0#238#238#238#0#238#238#238#0#153'nL'#255#171'qC'#255#172'rD'#255 +#153'nL'#255#251#227#188#0#251#227#188#0#153'nL'#255#171'qC'#255#172'rD'#255 - +#153'nL'#255#0#0#0#0#0#0#0#0#0#0#0#0#153'nL'#0#153'nL'#0#153'nL'#0#162'f7' - ,#255#220#191#164#255#223#198#175#255#162'f7'#255#153'nL'#0#153'nL'#0#162'f7' + ,#153'nL'#255#0#0#0#0#0#0#0#0#0#0#0#0#153'nL'#0#153'nL'#0#153'nL'#0#162'f7' + +#255#220#191#164#255#223#198#175#255#162'f7'#255#153'nL'#0#153'nL'#0#162'f7' +#255#220#191#164#255#223#198#175#255#162'f7'#255#0#0#0#0#0#0#0#0#0#0#0#0#164 +'e4'#0#164'e4'#0#164'e4'#0#164'e4'#255#221#188#157#255#231#209#188#255#164'e' +'4'#255#164'e4'#0#164'e4'#0#164'e4'#255#221#188#157#255#231#209#188#255#164 @@ -1600,8 +1601,8 @@ LazarusResources.Add('TForm1','FORMDATA',[ +#255#16#189'e'#255#17#193'g'#255#19#194'i'#255'Y'#211#149#255'g'#201#152#255 +#22'|G'#255#136#156#146#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#4's:'#255#131#220#175#255#17#195'i'#255#26#204's'#255'i'#223#163#255 - +'Z'#194#141#255#19'vC'#255#158#167#163#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 - ,#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#9'w?'#255#131#219#174#255#31#198'q'#255'r'#222 + ,'Z'#194#141#255#19'vC'#255#158#167#163#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#9'w?'#255#131#219#174#255#31#198'q'#255'r'#222 +#167#255'K'#178#127#255#23'tE'#255#168#173#170#255#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#4's:'#255#130#216#172#255'v' +#214#166#255'<'#157'j'#255'''tL'#255#172#174#173#255#0#0#0#0#0#0#0#0#0#0#0#0 @@ -1664,8 +1665,8 @@ LazarusResources.Add('TForm1','FORMDATA',[ +#207#9'.'#142#253#1'5'#177#255#4'('#148#255#2'/'#159#254#1'2'#171#255#6'$|' +#135#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#15'6' +#157#188#1')'#154#255#3'0'#166#255#4'%'#145#254#5'('#137#255#1#23'u'#255#1'1' - +#171#254#1''''#145#255#7#30'j'#171#0#0#0#0#3#27'm'#0#0#0#0#0#0#0#0#0#127'rf' - ,#0#0#0#0#0#0#9#154#1#3'2'#172#226#15':'#133#241#11'v'#234#255#11'~'#240#255 + ,#171#254#1''''#145#255#7#30'j'#171#0#0#0#0#3#27'm'#0#0#0#0#0#0#0#0#0#127'rf' + +#0#0#0#0#0#0#9#154#1#3'2'#172#226#15':'#133#241#11'v'#234#255#11'~'#240#255 +#18'\'#171#255#9'q'#229#255#3'('#148#255#0','#162#254#0#25'm'#255#5#27'k'#221 +#19'&f"'#0#0#0#0#0#0#0#0'sf['#6'uli'#29'gkz!'#8'A'#183#239#19'~'#236#255#12 +#137#255#254#23'p'#207#255'*x'#200#255#10'{'#243#255#5'K'#186#255#0'+'#160 @@ -1728,8 +1729,8 @@ LazarusResources.Add('TForm1','FORMDATA',[ +#255#251#225#203#255#251#225#201#255#251#247#242#255#197'|?'#247#255#255#255 +#0#255#255#255#0#197#128'B'#247#248#241#232#255#254#229#213#255#253#229#211 +#255#253#229#211#255#252#229#211#255#252#229#211#255#252#228#209#255#252#226 - +#206#255#252#226#204#255#251#224#201#255#251#225#200#255#253#250#247#255#193 - ,'v;'#247#255#255#255#0#255#255#255#0#196'|@'#247#247#240#230#255#248#180'U' + ,#206#255#252#226#204#255#251#224#201#255#251#225#200#255#253#250#247#255#193 + +'v;'#247#255#255#255#0#255#255#255#0#196'|@'#247#247#240#230#255#248#180'U' +#255#247#180'V'#255#247#181'T'#255#248#180'S'#255#248#178'S'#255#247#179'R' +#255#247#179'R'#255#247#178'Q'#255#247#178'O'#255#247#178'O'#255#252#249#245 +#255#191'o6'#247#255#255#255#0#255#255#255#0#193'x<'#247#247#237#227#255#253 @@ -1792,8 +1793,8 @@ LazarusResources.Add('TForm1','FORMDATA',[ +#255'@'#209#242#255#202#242#251#255'5'#148#218#255#255#255#255#0#255#255#255 +#0'3'#142#217#251#220#240#250#255#152#225#246#255#149#224#246#255#146#223#246 +#255#142#222#245#255#137#220#245#255#133#218#244#255#128#217#244#255'z'#215 - +#243#255't'#213#243#255'p'#211#242#255#194#234#248#255'5'#148#218#255#255#255 - ,#255#0#255#255#255#0','#134#216#209'-'#136#216#247'-'#135#216#247'-'#136#216 + ,#243#255't'#213#243#255'p'#211#242#255#194#234#248#255'5'#148#218#255#255#255 + +#255#0#255#255#255#0','#134#216#209'-'#136#216#247'-'#135#216#247'-'#136#216 +#247'-'#136#216#247'-'#136#216#247'-'#136#216#247'-'#136#216#247'-'#136#216 +#247'-'#136#216#247'-'#136#216#247'-'#135#216#247'-'#136#216#247','#134#216 +#209#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0' c'#152'* c'#152 @@ -1856,8 +1857,8 @@ LazarusResources.Add('TForm1','FORMDATA',[ +#193#213#20#161#188#212'l'#232#247#248'n'#232#247#255'o'#235#250#255's'#236 +#250#255' '#227#250#255'1'#225#246#255#173#243#251#255#0#160#196#255#5'y}'#17 +#0#0#0#0#255#255#255#0#0#0#0#0#5'y}2'#19#163#193#228'A'#206#227#254'i'#231 - +#246#255'6'#217#236#255#22#205#227#255')'#219#241#255'/'#224#245#255')'#219 - ,#241#255'2'#226#247#255'/'#224#246#255#173#243#251#255#0#160#196#255#5'y}'#10 + ,#246#255'6'#217#236#255#22#205#227#255')'#219#241#255'/'#224#245#255')'#219 + +#241#255'2'#226#247#255'/'#224#246#255#173#243#251#255#0#160#196#255#5'y}'#10 +#255#255#255#0#5'y}'#10#22#161#189#202'@'#205#225#255'6'#217#236#255#29#210 +#232#255#29#210#232#255#29#210#232#255')'#219#241#255'/'#224#245#255'2'#226 +#247#255'2'#226#247#255'2'#226#248#255'/'#224#246#255#173#243#251#255#0#160 @@ -1920,8 +1921,8 @@ LazarusResources.Add('TForm1','FORMDATA',[ +';'#0#0#184#255#0#0#156#255#0#0#135#255#0#0#0#179#0#0#0#131#0#0#0';'#0#0#0#11 +#0#0#0#0#0#0#0#0#255#255#255#0#0#0#0#11#0#0#0'#'#0#0#0'#'#0#0#0#11#0#0#0#0#0 +#0#0#11#0#0#0';'#0#0#159#255#0#0#0#167#0#0#0#131#0#0#0';'#0#0#0#11#0#0#0#0#0 - +#0#0#0#0#0#0#0#188'k6q'#188'k6'#144#188'k6'#204#188'k6'#238#188'k6'#250#187 - ,'k6'#254#187'k6'#255#187'j6'#255#187'j6'#255#188'l9'#255#189'n;'#255#187'm:' + ,#0#0#0#0#0#0#0#188'k6q'#188'k6'#144#188'k6'#204#188'k6'#238#188'k6'#250#187 + +'k6'#254#187'k6'#255#187'j6'#255#187'j6'#255#188'l9'#255#189'n;'#255#187'm:' +#255#187'k8'#239#187'p>'#203#182'i5T'#255#255#255#0#188'k6'#155#246#224#209 +#255#247#224#209#255#254#251#248#255#254#251#247#255#253#249#246#255#252#245 +#240#255#250#240#234#255#251#242#237#255#253#249#246#255#253#250#247#255#251 @@ -1984,8 +1985,8 @@ LazarusResources.Add('TForm1','FORMDATA',[ +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255'UUUgQQQh'#253#253#253#255#252#252#252#255#252#252#252#255#252 - +#252#252#255#252#252#252#255#252#252#252#255#252#252#252#255#252#252#252#255 - ,#252#252#252#255#252#252#252#255#252#252#252#255#252#252#252#255#252#252#252 + ,#252#252#255#252#252#252#255#252#252#252#255#252#252#252#255#252#252#252#255 + +#252#252#252#255#252#252#252#255#252#252#252#255#252#252#252#255#252#252#252 +#255#253#253#253#255'QQQhMMMj'#250#250#250#255#248#248#248#255#248#248#248 +#255#248#248#248#255#248#248#248#255#248#248#248#255#248#248#248#255#248#248 +#248#255#248#248#248#255#248#248#248#255#248#248#248#255#248#248#248#255#248 @@ -2048,8 +2049,8 @@ LazarusResources.Add('TForm1','FORMDATA',[ +#230#230#230#255#230#230#230#255#230#230#230#255#230#230#230#255#237#237#237 +#255'888s222v'#234#234#234#255#226#226#226#255#226#226#226#255#226#226#226 +#255#226#226#226#255#226#226#226#255#226#226#226#255#226#226#226#255'[['#190 - +#255'--'#179#255'--'#179#255'--'#179#255'--'#179#255'//'#181#255#17#17#129 - ,#200'''''''{'#235#235#235#255#231#231#231#255#231#231#231#255#231#231#231#255 + ,#255'--'#179#255'--'#179#255'--'#179#255'--'#179#255'//'#181#255#17#17#129 + +#200'''''''{'#235#235#235#255#231#231#231#255#231#231#231#255#231#231#231#255 +#231#231#231#255#231#231#231#255#231#231#231#255#231#231#231#255'//'#167#255 +'^^'#247#255'^^'#247#255'^^'#247#255'^^'#247#255'^^'#247#255#5#5#139#229#13 +#13#13'g'#16#16#16#133#16#16#16#133#16#16#16#133#16#16#16#133#16#16#16#133#16 @@ -2112,8 +2113,8 @@ LazarusResources.Add('TForm1','FORMDATA',[ +#226#247#255'/'#224#245#255')'#219#241#255#29#210#232#255#29#210#232#255#29 +#210#232#255'6'#217#236#255'@'#205#225#255#22#161#189#202#5'y}'#10#0#0#0#0#5 +'y~'#17#0#160#196#255'y'#237#251#255'2'#226#248#255','#223#244#255#4#192#214 - +#255#4#192#214#255#4#192#214#255#29#210#232#255#29#210#232#255#29#210#232#255 - ,#11#200#223#255'j'#229#243#255#27#171#197#248#21#160#188#203#0#0#0#0#0#0#0#0 + ,#255#4#192#214#255#4#192#214#255#29#210#232#255#29#210#232#255#29#210#232#255 + +#11#200#223#255'j'#229#243#255#27#171#197#248#21#160#188#203#0#0#0#0#0#0#0#0 +#5'y}'#17#0#160#196#255'v'#237#251#255#4#195#218#255'v'#237#251#255'i'#234 +#249#255'i'#234#249#255'i'#234#249#255'i'#234#249#255#5#221#247#255#10#200 +#223#255#7#194#216#255'o'#220#235#255#27#163#191#244#0#0#0#0#0#0#0#0#0#0#0#0 @@ -2176,8 +2177,8 @@ LazarusResources.Add('TForm1','FORMDATA',[ +#255#0#0#0#0#2#0#0#0#12#0#0#0#22#0#0#0#26#0#0#0#26#0#0#0#26#0#0#0#26#0#0#0#26 +#0#0#0#26#0#0#0#26#0#0#0#26#0#0#0#23#0#0#0#12#0#0#0#2#255#255#255#0'TTT'#0'T' +'TT'#0'TTT'#0'UUU"UUUYUUUfUUUfUUUfUUUfUUUfUUUfUUUfUUUfUUUfUUUYUUU"TTT'#0'RRR' - +#0'RRR'#0'RRR['#198#198#198#212#219#219#219#255#214#214#214#255#209#209#209 - ,#255#203#204#204#255#199#199#199#255#198#196#196#255#200#197#197#255#206#198 + ,#0'RRR'#0'RRR['#198#198#198#212#219#219#219#255#214#214#214#255#209#209#209 + +#255#203#204#204#255#199#199#199#255#198#196#196#255#200#197#197#255#206#198 +#198#255#212#201#201#255#196#183#183#212'RRR[UUU'#0'TTT'#0'PPP'#0'PPPi'#187 +#187#187#255#185#185#185#255#182#182#182#255#180#180#180#255#176#176#176#255 +#173#173#173#255#169#169#169#255#166#166#166#255#162#162#162#255#160#160#160 @@ -2240,8 +2241,8 @@ LazarusResources.Add('TForm1','FORMDATA',[ +#255#255#0#201#139'a'#201#230#181#146#201#203#139'a'#248#238#188#158#248#204 +#141'e'#255#243#205#176#255#255#255#255#255#227#199#179#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#234#191#161#255#201#137'`' - +#255#255#255#255#0#255#255#255#0#196#129'T'#201#234#182#151#201#206#152's' - ,#248#234#190#161#248#199#134'['#255#239#192#158#255#255#255#255#255#204#147 + ,#255#255#255#255#0#255#255#255#0#196#129'T'#201#234#182#151#201#206#152's' + +#248#234#190#161#248#199#134'['#255#239#192#158#255#255#255#255#255#204#147 +'n'#255#255#255#255#255#255#255#255#255#255#251#247#255#255#248#241#255#228 +#175#140#255#199#138'a'#255#255#255#255#0#255#255#255#0#195#127'Q'#201#239 +#182#154#201#204#150'o'#248#214#182#145#248#200#136']'#255#239#191#161#255 @@ -2304,8 +2305,8 @@ LazarusResources.Add('TForm1','FORMDATA',[ +#222#250#241#232#222#250#240#231#222#251#241#233#222#251#242#234#222#228#186 +#145#255#255#247#240#255#255#231#213#255#253#231#214#255#253#230#212#255#252 +#228#208#255#251#227#203#255#250#220#194#255#254#243#232#255#204#134'V'#254 - +#199'yJ'#185#200'yK'#206#200'uE'#221#199'uE'#212#200'uE'#212#199'uE'#212#202 - ,#132'R'#255#255#247#241#255#255#233#217#255#255#234#219#255#255#233#217#255 + ,#199'yJ'#185#200'yK'#206#200'uE'#221#199'uE'#212#200'uE'#212#199'uE'#212#202 + +#132'R'#255#255#247#241#255#255#233#217#255#255#234#219#255#255#233#217#255 +#255#231#215#255#255#229#210#255#255#226#203#255#255#247#241#255#203#133'U' +#254#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 +#255#255#255#0#204#131'R'#251#251#245#238#255#255#233#217#255#255#234#219#255 @@ -2368,8 +2369,8 @@ LazarusResources.Add('TForm1','FORMDATA',[ +'ZZP'#139'F'#255#143#206#153#255'}'#198#135 - ,#255'x'#195#129#255's'#192'|'#255't'#192'|'#255'y'#194#129#255'I'#144'O'#255 + ,#237#255'K'#136#179#255'4s'#171#234'>'#139'F'#255#143#206#153#255'}'#198#135 + +#255'x'#195#129#255's'#192'|'#255't'#192'|'#255'y'#194#129#255'I'#144'O'#255 +'T'#127'W'#255'T'#137#191#255#148#191#221#255'u'#173#212#255'c'#184#225#255 +'K'#212#255#255'B'#139#184#255',n'#166#234';'#135'B'#255#137#203#146#255#132 +#200#141#255#128#198#136#255'{'#195#131#255'w'#193#127#255'G'#143'M'#255';t?' @@ -2496,8 +2497,8 @@ LazarusResources.Add('TForm1','FORMDATA',[ +#2#2#239#21#21#21#255';;;'#255'```'#255#128#128#128#207#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#1#1#1'0'#2 +#2#2#239#21#21#21#255':::'#255'```'#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 - +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#1#1#1' '#2#2#2#207 - ,#20#20#20#255'999'#207#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255 + ,#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#1#1#1' '#2#2#2#207 + +#20#20#20#255'999'#207#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255 +#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 +#255#0#255#255#255#0'UUU"UUUYUUUfUUUfUUUfUUUfUUUfUUUfUUUfUUUfUUUfUUUfUUUfUUU' @@ -2560,8 +2561,8 @@ LazarusResources.Add('TForm1','FORMDATA',[ +'Nkl'#0#0#0#0#239#204#192#0#0#0#0#0#0#0#0#0#253#210#166#0#254#211#167#0#252 +#212#151#0#0#0#0#0#0#0#0#0#5#20#147#255#6#21#146#255#7#22#147#255#6#19#151 +#255#6#18#154#255#6#18#151#255#3#18#144#255#2#22#141#255#1#23#135#255#0#17'|' - +#255#8#24'y'#255#3#15'f'#255#9#17'a'#255#15#21']'#255#27#28'T'#255'^Qh'#170#0 - ,#0#0#0#0#0#0#0#188#173#160#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#252#212#151#2 + ,#255#8#24'y'#255#3#15'f'#255#9#17'a'#255#15#21']'#255#27#28'T'#255'^Qh'#170#0 + +#0#0#0#0#0#0#0#188#173#160#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#252#212#151#2 +#251#211#150#0#6#21#148#255#5#21#145#255#5#21#146#255#6#18#151#255#5#17#152 +#255#4#17#150#255#5#20#145#255#4#26#138#255#14'+'#142#255#2#25'w'#255#1#20'k' +#255#2#17'a'#255#8#18'\'#255#14#23']'#255#21'!_'#255'33Q'#230#255#255#255#0#0 @@ -2624,8 +2625,8 @@ LazarusResources.Add('TForm1','FORMDATA',[ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#255#255#0#0'gJx'#159'& }'#255#16#28#142 +#255#14#27#148#255#13#22#140#255#15#23#142#254#12#24#146#255#27#30#140#255'4' +'(s'#227'bF]'#28#0#0#0#0#0#0#0#0#0#0#0#0't}~'#0#0#0#0#0#0#0#0#0#239#171'P'#1 - +#233#168'L'#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#158'ma'#0#0#0#255#0#0#0 - ,#0#0'?!S#-!o}''&s'#190'/''{'#221'2'#31'z'#231'/$t'#210'<6c'#141'{jW'#25#0#0#0 + ,#233#168'L'#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#158'ma'#0#0#0#255#0#0#0 + +#0#0'?!S#-!o}''&s'#190'/''{'#221'2'#31'z'#231'/$t'#210'<6c'#141'{jW'#25#0#0#0 +#0'jM_'#0#0#0#0#0#243#174'Q'#0#0#0#0#0#0#0#0#0#241#173'Q'#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#132'Za'#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#187'tV'#14#145'\Z'#29#255#243'L'#6#0#0#0#0#0#0#0#0#146'xp'#0#243 @@ -2688,8 +2689,8 @@ LazarusResources.Add('TForm1','FORMDATA',[ +#255#255#255#0'}}}'#255#153#153#153#255#153#153#153#255#154#154#154#255#154 +#154#154#255#155#155#155#255#155#155#155#255'o'#157#211#255#170#209#231#255 +#171#209#231#255#152#199#225#255#145#194#222#255'V'#143#183#255'R'#137#193 - +#234#255#255#255#0#255#255#255#0#128#128#128#255'~~~'#255'|||'#255'zzz'#255 - ,'www'#255'uuu'#255'rrr'#255'q'#158#212#255'o'#158#214#255#135#178#220#255#171 + ,#234#255#255#255#0#255#255#255#0#128#128#128#255'~~~'#255'|||'#255'zzz'#255 + +'www'#255'uuu'#255'rrr'#255'q'#158#212#255'o'#158#214#255#135#178#220#255#171 +#211#232#255#169#208#230#255'X'#144#184#255'Y'#142#198#234#255#255#255#0#255 +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'p'#158#214#219 @@ -2752,8 +2753,8 @@ LazarusResources.Add('TForm1','FORMDATA',[ +#0#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 - +#255#0#0#0#0#9#0#0#0#22#0#0#0#26#0#0#0#26#0#0#0#26#0#0#0#26#0#0#0#26#0#0#0#26 - ,#0#0#0#26#0#0#0#26#0#0#0#26#0#0#0#26#0#0#0#26#0#0#0#26#0#0#0#22#0#0#0#9#13#13 + ,#255#0#0#0#0#9#0#0#0#22#0#0#0#26#0#0#0#26#0#0#0#26#0#0#0#26#0#0#0#26#0#0#0#26 + +#0#0#0#26#0#0#0#26#0#0#0#26#0#0#0#26#0#0#0#26#0#0#0#26#0#0#0#22#0#0#0#9#13#13 +#13'g'#16#16#16#133#16#16#16#133#16#16#16#133#16#16#16#133#16#16#16#133#16#16 +#16#133#16#16#16#133#16#16#16#133#4#4'['#207#2#2's'#231#2#2's'#231#2#2's'#231 +#2#2's'#231#2#2's'#231#2#2'X'#176'''''''{'#235#235#235#255#231#231#231#255 @@ -2816,8 +2817,8 @@ LazarusResources.Add('TForm1','FORMDATA',[ +#8'ShortCut'#2'x'#0#0#7'TAction'#17'ActionPauseScript'#7'Caption'#6#6'&Pause' +#9'OnExecute'#7#18'ActionPauseExecute'#0#0#7'TAction'#16'ActionStopScript'#7 +'Caption'#6#5'&Stop'#9'OnExecute'#7#17'ActionStopExecute'#8'ShortCut'#2'q'#0 - +#0#7'TAction'#13'ActionSaveAll'#7'Caption'#6#8'Save All'#10'ImageIndex'#2#21 - ,#9'OnExecute'#7#20'ActionSaveAllExecute'#8'ShortCut'#3'S`'#0#0#7'TAction'#16 + ,#0#7'TAction'#13'ActionSaveAll'#7'Caption'#6#8'Save All'#10'ImageIndex'#2#21 + +#9'OnExecute'#7#20'ActionSaveAllExecute'#8'ShortCut'#3'S`'#0#0#7'TAction'#16 +'ActionClearDebug'#7'Caption'#6#5'Clear'#10'ImageIndex'#2#4#9'OnExecute'#7#23 +'ActionClearDebugExecute'#0#0#7'TAction'#15'ActionFindStart'#7'Caption'#6#9 +'&Find ...'#10'ImageIndex'#2#26#9'OnExecute'#7#22'ActionFindstartExecute'#8 @@ -2880,8 +2881,8 @@ LazarusResources.Add('TForm1','FORMDATA',[ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#5'y}'#17#0#160#196#255#173#243#251#255 +'%'#228#251#255#0#160#196#255#0#160#196#255#19#161#190#231#21#159#187#207#27 +#161#187#164#6'z|'#11#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 - +#5'y}'#17#0#160#196#255#173#243#251#255#0#160#196#255#0#0#0#0#0#0#0#0#0#0#0#0 - ,#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + ,#5'y}'#17#0#160#196#255#173#243#251#255#0#160#196#255#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#157#191#20#0#160#196#255#0#160#196#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#160#196#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 @@ -2944,8 +2945,8 @@ LazarusResources.Add('TForm1','FORMDATA',[ +'<'#198#242#0#10#134#3#17#27#157'w7A'#200#255#8#18#142' '#255#255#255#0#255 +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'2<'#195#236'#.'#173#175 +#255#255#255#0#26'%'#168#153'BP'#210#255#203#163'u'#254'AO'#214#255#22'!'#163 - +#157'/9'#192#212'.8'#190#223#2#13#139#10#255#255#255#0#255#255#255#0#255#255 - ,#255#0#255#255#255#0#255#255#255#0#29'('#169#156';F'#204#255#8#18#144':'#7#17 + ,#157'/9'#192#212'.8'#190#223#2#13#139#10#255#255#255#0#255#255#255#0#255#255 + +#255#0#255#255#255#0#255#255#255#0#29'('#169#156';F'#204#255#8#18#144':'#7#17 +#144'S;H'#212#255#219#189#156#255#238#204#166#255'@L'#222#255':C'#209#255#15 +#25#152'i'#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 +#255#0#255#255#255#0#3#13#140#31',5'#185#215''#202#242'?L'#215 @@ -3008,8 +3009,8 @@ LazarusResources.Add('TForm1','FORMDATA',[ +#204#255#249#221#196#255#246#215#187#255#243#209#175#255#250#239#228#255#204 +#135'X'#254#202#132'R'#219#255#247#241#222#255#233#217#222#255#234#219#222 +#255#233#217#222#255#231#215#222#228#187#146#255#254#246#240#255#252#226#205 - +#255#252#227#205#255#250#223#200#255#247#217#188#255#245#233#221#255#250#243 - ,#235#255#251#248#243#255#202#131'S'#254#203#133'S'#219#255#247#240#222#255 + ,#255#252#227#205#255#250#223#200#255#247#217#188#255#245#233#221#255#250#243 + +#235#255#251#248#243#255#202#131'S'#254#203#133'S'#219#255#247#240#222#255 +#231#213#222#253#231#214#222#253#230#212#222#252#228#208#222#228#187#147#255 +#254#245#237#255#252#222#197#255#251#224#199#255#249#220#194#255#245#211#180 +#255#254#249#243#255#250#226#196#255#236#193#147#255#195'}H'#147#203#134'T' @@ -3072,8 +3073,8 @@ LazarusResources.Add('TForm1','FORMDATA',[ +#167#217#255'\'#167#217#255'\'#167#217#255'R'#159#215#255'b'#163#216#255' c' +#152#255#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0' c'#152#255 +#127#191#228#255'i'#178#222#255'J'#155#218#255'D'#151#220#255'C'#150#220#255 - +'B'#150#220#255'B'#149#220#255'A'#149#219#255'Q'#158#214#255'l'#178#222#255 - ,' c'#152#255#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0' c'#152 + ,'B'#150#220#255'B'#149#220#255'A'#149#219#255'Q'#158#214#255'l'#178#222#255 + +' c'#152#255#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0' c'#152 +#224'q'#179#219#254'~'#191#228#255'N'#157#223#255#181#238#253#255'u'#212#240 +#255'u'#212#240#255#181#238#253#255'K'#155#222#255'n'#180#224#255'm'#179#223 +#249' c'#152#243#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0' c' @@ -3136,8 +3137,8 @@ LazarusResources.Add('TForm1','FORMDATA',[ +'OnClick'#7#21'ActionFindNextExecute'#0#0#9'TMenuItem'#16'PopupItemReplace'#6 +'Action'#7#13'ActionReplace'#7'Caption'#6#7'Replace'#7'OnClick'#7#20'ActionR' +'eplaceExecute'#0#0#0#14'TReplaceDialog'#10'dlgReplace'#7'Options'#11#6'frDo' - +'wn'#10'frFindNext'#12'frHideUpDown'#0#6'OnFind'#7#14'dlgReplaceFind'#9'OnRe' - ,'place'#7#17'dlgReplaceReplace'#4'left'#3'`'#2#3'top'#2'h'#0#0#6'TTimer'#11 + ,'wn'#10'frFindNext'#12'frHideUpDown'#0#6'OnFind'#7#14'dlgReplaceFind'#9'OnRe' + +'place'#7#17'dlgReplaceReplace'#4'left'#3'`'#2#3'top'#2'h'#0#0#6'TTimer'#11 +'UpdateTimer'#8'Interval'#3#16''''#4'left'#3'`'#2#3'top'#3#144#0#0#0#6'TTime' +'r'#10'MouseTimer'#8'Interval'#2'd'#7'OnTimer'#7#17'ChangeMouseStatus'#4'lef' +'t'#3#192#1#3'top'#3#200#0#0#0#6'TTimer'#9'NewsTimer'#8'Interval'#3#244#1#7 diff --git a/Projects/SAMufasaGUI/testunit.pas b/Projects/SAMufasaGUI/testunit.pas index 6bec6e5..1ae2009 100644 --- a/Projects/SAMufasaGUI/testunit.pas +++ b/Projects/SAMufasaGUI/testunit.pas @@ -335,10 +335,10 @@ type procedure SetIncludePath(const AValue: String); procedure SetShowHintAuto(const AValue: boolean); procedure SetScriptState(const State: TScriptState); - function LoadSettingDef(Key : string; Def : string) : string; - function CreateSetting(Key : string; Value : string) : string; - procedure SetSetting(key : string; Value : string; save : boolean = false); - function SettingExtists(key : string) : boolean; + function LoadSettingDef(const Key, Def : string) : string; + function CreateSetting(const Key, Value : string) : string; + procedure SetSetting(const key,Value : string; save : boolean = false); + function SettingExtists(const key : string) : boolean; procedure FontUpdate; public DebugStream: String; @@ -1289,15 +1289,15 @@ begin with CurrScript do begin ScriptFile:= SetDirSeparators(Filename); - ScriptName:= ExtractFileNameOnly(Filename); + ScriptName:= ExtractFileNameOnly(ScriptFile); mDebugLn('Script name will be: ' + ScriptName); - FormWritelnEx('Succesfully saved: ' + Filename); + FormWritelnEx('Succesfully saved: ' + ScriptFile); StartText:= SynEdit.Lines.Text; ScriptChanged := false; SynEdit.MarkTextAsSaved; Self.Caption:= Format(WindowTitle,[ScriptName]); CurrTab.TabSheet.Caption:= ScriptName; - Self.AddRecentFile(FileName); + Self.AddRecentFile(ScriptFile); StatusBar.Panels[Panel_ScriptName].Text:= ScriptName; StatusBar.Panels[Panel_ScriptPath].text:= ScriptFile; end; @@ -2381,17 +2381,17 @@ begin end; end; -function TForm1.LoadSettingDef(Key: string; Def: string): string; +function TForm1.LoadSettingDef(const Key,Def: string): string; begin result := SettingsForm.Settings.GetKeyValueDefLoad(Key,def,SimbaSettingsFile); end; -function TForm1.CreateSetting(Key: string; Value: string): string; +function TForm1.CreateSetting(const Key,Value: string): string; begin result := SettingsForm.Settings.GetKeyValueDef(Key,value); end; -procedure TForm1.SetSetting(key: string; Value: string; save : boolean); +procedure TForm1.SetSetting(const key,Value: string; save : boolean); begin //Creates the setting if needed SettingsForm.Settings.SetKeyValue(key,value); @@ -2399,7 +2399,7 @@ begin SettingsForm.Settings.SaveToXML(SimbaSettingsFile); end; -function TForm1.SettingExtists(key: string): boolean; +function TForm1.SettingExtists(const key: string): boolean; begin result :=SettingsForm.Settings.KeyExists(key); end; diff --git a/Units/MMLAddon/PSInc/Wrappers/dtm.inc b/Units/MMLAddon/PSInc/Wrappers/dtm.inc index 4dae7a1..9eed460 100644 --- a/Units/MMLAddon/PSInc/Wrappers/dtm.inc +++ b/Units/MMLAddon/PSInc/Wrappers/dtm.inc @@ -21,110 +21,57 @@ DTM.inc for the Mufasa Macro Library } -function ps_FindDTM(DTM: Integer; out x, y: Integer; x1, y1, x2, y2: Integer): Boolean; extdecl; -var - temp: pDTM; +function ps_FindDTM(DTM: Integer; out x, y: Integer; xs, ys, xe, ye: Integer): Boolean; extdecl; begin - if CurrThread.Client.MDTM.GetDTM(DTM, temp) then - Result := CurrThread.Client.MFinder.FindDTM(temp, x, y, x1, y1, x2, y2) - else - begin - x := 0; - y := 0; - Result := False; - end; + with CurrThread.Client do + result := MFinder.FindDTM(MDTM.GetDTM(DTM),x,y,xs,ys,xe,ye); end; -function ps_FindDTMs(DTM: Integer; out p: TPointArray; x1, y1, x2, y2: Integer): Boolean; extdecl; -var - temp: pDTM; +function ps_FindDTMs(DTM: Integer; out p: TPointArray; xs, ys, xe, ye: Integer): Boolean; extdecl; begin - if CurrThread.Client.MDTM.GetDTM(DTM, temp) then - Result := CurrThread.Client.MFinder.FindDTMs(temp, p, x1, y1, x2, y2, 0) - else - begin - setlength(p,0); - Result := False; - end; + with CurrThread.Client do + result := MFinder.FindDTMs(MDTM.GetDTM(DTM), p, xs, ys, xe, ye); end; -function ps_FindDTMRotatedAlternating(DTM: Integer; out x, y: Integer; x1, y1, x2, y2: +function ps_FindDTMRotatedAlternating(DTM: Integer; out x, y: Integer; xs, ys, xe, ye: Integer; sAngle, eAngle, aStep: Extended; out aFound: Extended): Boolean; extdecl; -var - temp: pDTM; begin - if CurrThread.Client.MDTM.GetDTM(DTM, temp) then - Result := CurrThread.Client.MFinder.FindDTMRotated(temp, x, y, x1, y1, x2, y2, sAngle, eAngle, aStep, aFound,true) - else - begin - x := 0; - y := 0; - Result := False; - end; + with CurrThread.Client do + result := MFinder.FindDTMRotated(MDTM.GetDTM(DTM), x,y, xs, ys, xe, ye, sAngle, eAngle, aStep, aFound,true); end; -function ps_FindDTMRotatedSE(DTM: Integer; out x, y: Integer; x1, y1, x2, y2: +function ps_FindDTMRotatedSE(DTM: Integer; out x, y: Integer; xs, ys, xe, ye: Integer; sAngle, eAngle, aStep: Extended; out aFound: Extended): Boolean; extdecl; -var - temp: pDTM; begin - if CurrThread.Client.MDTM.GetDTM(DTM, temp) then - Result := CurrThread.Client.MFinder.FindDTMRotated(temp, x, y, x1, y1, x2, y2, sAngle, eAngle, aStep, aFound,false) - else - begin - x := 0; - y := 0; - Result := False; - end; + with CurrThread.Client do + result := MFinder.FindDTMRotated(MDTM.GetDTM(DTM), x, y, xs, ys, xe, ye, sAngle, eAngle, aStep, aFound,false); end; -function ps_FindDTMsRotatedAlternating(DTM: Integer; out Points: TPointArray; x1, y1, x2, y2: Integer; sAngle, eAngle, aStep: Extended; out aFound: T2DExtendedArray): Boolean; extdecl; -var - temp: pDTM; +function ps_FindDTMsRotatedAlternating(DTM: Integer; out Points: TPointArray; xs, ys, xe, ye: Integer; sAngle, eAngle, aStep: Extended; out aFound: T2DExtendedArray): Boolean; extdecl; begin - if CurrThread.Client.MDTM.GetDTM(DTM, temp) then - Result := CurrThread.Client.MFinder.FindDTMsRotated(temp, Points, x1, y1, x2, y2, - sAngle, eAngle, aStep, aFound, 0,true) - else - Result := False; + with CurrThread.Client do + result := MFinder.FindDTMsRotated(MDTM.GetDTM(DTM), Points, xs, ys, xe, ye, + sAngle, eAngle, aStep, aFound, true); end; -function ps_FindDTMsRotatedSE(DTM: Integer; out Points: TPointArray; x1, y1, x2, y2: Integer; sAngle, eAngle, aStep: Extended; out aFound: T2DExtendedArray): Boolean; extdecl; -var - temp: pDTM; +function ps_FindDTMsRotatedSE(DTM: Integer; out Points: TPointArray; xs, ys, xe, ye: Integer; sAngle, eAngle, aStep: Extended; out aFound: T2DExtendedArray): Boolean; extdecl; begin - if CurrThread.Client.MDTM.GetDTM(DTM, temp) then - Result := CurrThread.Client.MFinder.FindDTMsRotated(temp, Points, x1, y1, x2, y2, - sAngle, eAngle, aStep, aFound, 0,false) - else - Result := False; + with CurrThread.Client do + result := MFinder.FindDTMsRotated(MDTM.GetDTM(DTM), Points, xs, ys, xe, ye, + sAngle, eAngle, aStep, aFound, false); end; -{function ps_FindDTMsRotated(DTM: Integer; out Points: TPointArray; x1, extdecl; - y1, x2, y2: Integer; sAngle, eAngle, - aStep: Extended; out aFound: T2DExtendedArray) - : Boolean; -begin - Result := CurrThread.Client.MDTM.FindDTMsRotated(DTM, Points, x1, y1, x2, y2, - sAngle, eAngle, aStep, aFound); -end; } - -procedure ps_SetDTMName(DTM : integer; name : string); +procedure ps_SetDTMName(DTM : integer;const name : string); begin CurrThread.Client.MDTM.SetDTMName(DTM,name); end; -function ps_DTMFromString(DTMString: String): Integer; extdecl; -var - dtm: pDTM; +function ps_DTMFromString(const DTMString: String): Integer; extdecl; begin With CurrThread.Client.MDTM do - begin - dtm := StringToDTM(DTMString); - Result := AddpDTM(dtm); - end; + Result := AddpDTM(StringToDTM(DTMString)); end; procedure ps_FreeDTM(DTM: Integer); extdecl; @@ -132,23 +79,32 @@ begin CurrThread.Client.MDTM.FreeDTM(DTM); end; -function ps_GetDTM(index: Integer; out dtm: pDTM): Boolean; extdecl; +function ps_GetDTM(index: Integer) : pDTM; extdecl; begin - Result := CurrThread.Client.MDTM.GetDTM(index, dtm); + CurrThread.Client.MDTM.GetDTM(index); end; -function ps_AddDTM(d: TDTM): Integer; extdecl; +function ps_AddDTM(const d: TDTM): Integer; extdecl; begin Result := CurrThread.Client.MDTM.AddDTM(d); end; -function ps_AddpDTM(d: pDTM): Integer; extdecl; +function ps_AddpDTM(const d: pDTM): Integer; extdecl; begin - Result := CurrThread.Client.MDTM.AddpDTM(d); + Result := CurrThread.Client.MDTM.AddpDTM(d); end; -Procedure ps_PrintpDTM(aDTM : pDTM);extdecl; +procedure ps_PrintpDTM(const aDTM : pDTM);extdecl; begin - PrintpDTM(aDTM); + PrintpDTM(aDTM); end; +function ps_pDTMToTDTM(Const DTM: pDTM): TDTM;extdecl; +begin + result := pDTMToTDTM(DTM); +end; + +function ps_tDTMTopDTM(Const DTM: TDTM): pDTM;extdecl; +begin + result := tDTMTopDTM(DTM); +end; diff --git a/Units/MMLAddon/PSInc/psexportedmethods.inc b/Units/MMLAddon/PSInc/psexportedmethods.inc index 7d61c25..443954a 100644 --- a/Units/MMLAddon/PSInc/psexportedmethods.inc +++ b/Units/MMLAddon/PSInc/psexportedmethods.inc @@ -26,22 +26,21 @@ AddFunction(@pswriteln,'procedure Writeln(x: string);'); //PS defines a special, { DTM } SetCurrSection('DTM'); -AddFunction(@ps_PrintpDTM, 'Procedure PrintpDTM(tDTM : pDTM);'); -AddFunction(@ps_GetDTM ,'function GetDTM(index: Integer; out dtm: pDTM): Boolean;'); -AddFunction(@pDTMToTDTM, 'Function pDTMToTDTM(DTM: pDTM): TDTM;'); -AddFunction(@tDTMTopDTM, 'Function tDTMTopDTM(DTM: TDTM): pDTM;'); -AddFunction(@ps_SetDTMName, 'procedure SetDTMName(DTM : integer; name : string);'); -AddFunction(@ps_DTMFromString, 'function DTMFromString(DTMString: String): Integer;'); +AddFunction(@ps_SetDTMName, 'procedure SetDTMName(DTM : integer;const name : string);'); +AddFunction(@ps_DTMFromString, 'function DTMFromString(const DTMString: String): Integer;'); AddFunction(@ps_FreeDTM, 'procedure FreeDTM(DTM: Integer);'); -AddFunction(@ps_FindDTM, 'function FindDTM(DTM: Integer; var x, y: Integer; x1, y1, x2, y2: Integer): Boolean;'); -AddFunction(@ps_FindDTMs, 'function FindDTMs(DTM: Integer; var p: TPointArray; x1, y1, x2, y2: Integer): Boolean;'); -AddFunction(@ps_FindDTMRotatedSE, 'function FindDTMRotatedSE(DTM: Integer; var x, y: Integer; x1, y1, x2, y2: Integer; sAngle, eAngle, aStep: Extended; out aFound: Extended): Boolean;'); -AddFunction(@ps_FindDTMRotatedAlternating, 'function FindDTMRotatedAlternating(DTM: Integer; var x, y: Integer; x1, y1, x2, y2: Integer; sAngle, eAngle, aStep: Extended; out aFound: Extended): Boolean;'); -AddFunction(@ps_FindDTMsRotatedSE, 'function FindDTMsRotatedSE(DTM: Integer; var Points: TPointArray; x1, y1, x2, y2: Integer; sAngle, eAngle, aStep: Extended; var aFound: T2DExtendedArray) : Boolean;'); -AddFunction(@ps_FindDTMsRotatedAlternating, 'function FindDTMsRotatedAlternating(DTM: Integer; var Points: TPointArray; x1, y1, x2, y2: Integer; sAngle, eAngle, aStep: Extended; var aFound: T2DExtendedArray) : Boolean;'); -AddFunction(@ps_addDTM, 'function AddDTM(d: TDTM): Integer;'); -AddFunction(@ps_addpDTM, 'function AddpDTM(d: pDTM): Integer;'); - +AddFunction(@ps_FindDTM, 'function FindDTM(DTM: Integer; var x, y: Integer; xs, ys, xe, ye: Integer): Boolean;'); +AddFunction(@ps_FindDTMs, 'function FindDTMs(DTM: Integer; var p: TPointArray; xs, ys, xe, ye: Integer): Boolean;'); +AddFunction(@ps_FindDTMRotatedSE, 'function FindDTMRotatedSE(DTM: Integer; var x, y: Integer; xs, ys, xe, ye: Integer; sAngle, eAngle, aStep: Extended; out aFound: Extended): Boolean;'); +AddFunction(@ps_FindDTMRotatedAlternating, 'function FindDTMRotatedAlternating(DTM: Integer; var x, y: Integer; xs, ys, xe, ye: Integer; sAngle, eAngle, aStep: Extended; out aFound: Extended): Boolean;'); +AddFunction(@ps_FindDTMsRotatedSE, 'function FindDTMsRotatedSE(DTM: Integer; var Points: TPointArray; xs, ys, xe, ye: Integer; sAngle, eAngle, aStep: Extended; var aFound: T2DExtendedArray) : Boolean;'); +AddFunction(@ps_FindDTMsRotatedAlternating, 'function FindDTMsRotatedAlternating(DTM: Integer; var Points: TPointArray; xs, ys, xe, ye: Integer; sAngle, eAngle, aStep: Extended; var aFound: T2DExtendedArray) : Boolean;'); +AddFunction(@ps_addDTM, 'function AddDTM(const d: TDTM): Integer;'); +AddFunction(@ps_addpDTM, 'function AddpDTM(const d: pDTM): Integer;'); +AddFunction(@ps_PrintpDTM, 'procedure PrintpDTM(const tDTM : pDTM);'); +AddFunction(@ps_GetDTM ,'function GetDTM(index: Integer) : pDTM'); +AddFunction(@ps_pDTMToTDTM, 'function pDTMToTDTM(const DTM: pDTM): TDTM;'); +AddFunction(@ps_tDTMTopDTM, 'function tDTMTopDTM(const DTM: TDTM): pDTM;'); {maths} SetCurrSection('Math'); @@ -55,13 +54,13 @@ AddFunction(@ps_minE,'function MinE(a, b: extended): Extended;'); AddFunction(@ps_maxE,'function MaxE(a, b: extended): Extended;'); AddFunction(@ps_iAbs,'function iAbs(a : integer) : integer;'); AddFunction(@ps_ArcTan2,'function ArcTan2(x,y : extended) : extended;'); -AddFunction(@IntToBox,'function IntToBox(x1,y1,x2,y2 : integer) : TBox;'); +AddFunction(@IntToBox,'function IntToBox(xs,ys,xe,ye : integer) : TBox;'); AddFunction(@IntInBox,'function IntInBox(x, y: Integer; Box: TBox): Boolean;'); AddFunction(@PointToBox,'function PointToBox(PT1,PT2 : TPoint): TBox;'); AddFunction(@PointInBox,'function PointInBox(PT : TPoint; Box: TBox): Boolean;'); AddFunction(@ps_sqr,'function Sqr(e : extended) : extended;'); AddFunction(@ps_point,'function Point(x,y:integer) : TPoint;'); -AddFunction(@ps_Distance,'function Distance(x1,y1,x2,y2 : integer) : integer;'); +AddFunction(@ps_Distance,'function Distance(xs,ys,xe,ye : integer) : integer;'); AddFunction(@ps_hypot,'function Hypot(X, Y: Extended): Extended;'); AddFunction(@ps_RandomRange,'function RandomRange(aFrom,aTo: Integer): Integer;'); AddFunction(@ps_incex,'procedure IncEx(var x : integer; increase : integer);'); @@ -99,7 +98,7 @@ AddFunction(@ps_EndOfFile, 'function EndOfFile(FileNum: Integer): Boolean;'); AddFunction(@ps_FileSize, 'function FileSize(FileNum: Integer): LongInt;'); AddFunction(@ps_ReadFileString, 'function ReadFileString(FileNum: Integer; var s: string; x: Integer): Boolean;'); AddFunction(@ps_WriteFileString, 'function WriteFileString(FileNum: Integer; s: string): Boolean;'); -AddFunction(@ps_SetFileCharPointer, 'Function SetFileCharPointer(FileNum, cChars, Origin: Integer): Integer;'); +AddFunction(@ps_SetFileCharPointer, 'function SetFileCharPointer(FileNum, cChars, Origin: Integer): Integer;'); AddFunction(@ps_FilePointerPos, 'function FilePointerPos(FileNum: Integer): Integer;'); AddFunction(@ps_DirectoryExists,'function DirectoryExists( const DirectoryName : string ) : Boolean;'); AddFunction(@ps_CreateDirectory,'function CreateDirectory( const DirectoryName : string) : boolean;'); @@ -129,7 +128,7 @@ AddFunction(@GetDebugBitmap,'function GetDebugBitmap: integer;'); AddFunction(@ps_Random,'function Random(Int: integer): integer;'); AddFunction(@ClearDebug,'procedure ClearDebug;'); AddFunction(@PlaySound,'procedure PlaySound( Sound : string);'); -AddFunction(@StopSound,'Procedure StopSound;'); +AddFunction(@StopSound,'procedure StopSound;'); AddFunction(@psSetScriptProp, 'function SetScriptProp(Prop : TSP_Property; Value: String): boolean;'); AddFunction(@psGetScriptProp, 'function GetScriptProp(Prop : TSP_Property;var Value: String): boolean;'); @@ -196,10 +195,10 @@ AddFunction(@GetToleranceSpeed2Modifiers, 'procedure GetToleranceSpeed2Modifiers AddFunction(@GetColor,'function GetColor(x, y: Integer): Integer;'); AddFunction(@GetColors,'function GetColors(Coords : TPointArray) : TIntegerArray;'); AddFunction(@GetColorsWrap,'procedure GetColorsWrap(Coords : TPointArray; var Colors :TIntegerArray);'); -AddFunction(@FindColor, 'function FindColor(var x, y: integer; color, x1, y1, x2, y2: integer): boolean;'); -AddFunction(@findcolortoleranceOptimised, 'function FindColorToleranceOptimised(var x, y: integer; color, x1, y1, x2, y2, tol: integer): boolean;'); -AddFunction(@FindColorTolerance, 'function FindColorTolerance(var x, y: integer; color, x1, y1, x2, y2, tol: integer): boolean;'); -AddFunction(@FindColors, 'function FindColors(var TPA: TPointArray; color, x1, y1, x2, y2: integer): boolean;'); +AddFunction(@FindColor, 'function FindColor(var x, y: integer; color, xs, ys, xe, ye: integer): boolean;'); +AddFunction(@findcolortoleranceOptimised, 'function FindColorToleranceOptimised(var x, y: integer; color, xs, ys, xe, ye, tol: integer): boolean;'); +AddFunction(@FindColorTolerance, 'function FindColorTolerance(var x, y: integer; color, xs, ys, xe, ye, tol: integer): boolean;'); +AddFunction(@FindColors, 'function FindColors(var TPA: TPointArray; color, xs, ys, xe, ye: integer): boolean;'); AddFunction(@SimilarColors,'function SimilarColors(Col1, Col2, Tolerance: integer): boolean'); AddFunction(@CountColor,'function CountColor(Color, xs, ys, xe, ye: Integer): Integer;'); AddFunction(@CountColorTolerance,'function CountColorTolerance(Color, xs, ys, xe, ye, Tolerance: Integer): Integer;'); @@ -323,7 +322,7 @@ AddFunction(@GetSamePointsATPA,'function GetSamePointsATPA( ATPA : T2DPointArray AddFunction(@FindTextTPAinTPA,'function FindTextTPAinTPA(Height : integer; SearchTPA, TotalTPA: TPointArray; var Matches: TPointArray): Boolean;'); AddFunction(@SortCircleWise,'procedure SortCircleWise(var tpa: TPointArray; const cx, cy, StartDegree: Integer; SortUp, ClockWise: Boolean);'); AddFunction(@LinearSort,'procedure LinearSort(var tpa: TPointArray; cx, cy, sd: Integer; SortUp: Boolean);'); -AddFunction(@RotatePoint,'Function RotatePoint(Const p: TPoint; angle, mx, my: Extended): TPoint;'); +AddFunction(@RotatePoint,'function RotatePoint(Const p: TPoint; angle, mx, my: Extended): TPoint;'); AddFunction(@FindGapsTPA,'function FindGapsTPA(TPA: TPointArray; MinPixels: Integer): T2DPointArray;'); AddFunction(@RemoveDistTPointArray,'function RemoveDistTPointArray(x, y, dist: Integer; ThePoints: TPointArray; RemoveHigher: Boolean): TPointArray;'); AddFunction(@CombineTPA,'function CombineTPA(Ar1, Ar2: TPointArray): TPointArray;'); @@ -332,16 +331,16 @@ AddFunction(@ReArrangeandShortenArray,'function ReArrangeandShortenArray(a: TPoi AddFunction(@TPAtoATPAEx,'function TPAtoATPAEx(TPA: TPointArray; w, h: Integer): T2DPointArray;'); AddFunction(@TPAtoATPA,'function TPAtoATPA(TPA: TPointArray; Dist: Integer): T2DPointArray;'); AddFunction(@CombineIntArray,'function CombineIntArray(Ar1, Ar2: TIntegerArray): TIntegerArray;'); -AddFunction(@MergeATPA,'Function MergeATPA(ATPA : T2DPointArray) : TPointArray;'); +AddFunction(@MergeATPA,'function MergeATPA(ATPA : T2DPointArray) : TPointArray;'); AddFunction(@TPAFromBox,'function TPAFromBox(const Box : TBox) : TPointArray;'); -AddFunction(@RotatePoints,'Function RotatePoints(Const P: TPointArray; A, cx, cy: Extended): TPointArray ;'); +AddFunction(@RotatePoints,'function RotatePoints(Const P: TPointArray; A, cx, cy: Extended): TPointArray ;'); AddFunction(@FindTPAEdges,'function FindTPAEdges(p: TPointArray): TPointArray;'); AddFunction(@ClearTPAFromTPA,'function ClearTPAFromTPA(arP, ClearPoints: TPointArray): TPointArray;'); -AddFunction(@ReturnPointsNotInTPA,'Function ReturnPointsNotInTPA(Const TotalTPA: TPointArray; const Box: TBox): TPointArray;'); +AddFunction(@ReturnPointsNotInTPA,'function ReturnPointsNotInTPA(Const TotalTPA: TPointArray; const Box: TBox): TPointArray;'); AddFunction(@PointInTPA,'function PointInTPA(p: TPoint; arP: TPointArray): Boolean;'); AddFunction(@ClearDoubleTPA,'procedure ClearDoubleTPA(var TPA: TPointArray);'); -AddFunction(@TPACountSort,'Procedure TPACountSort(Var TPA: TPointArray;const max: TPoint;Const SortOnX : Boolean);'); -AddFunction(@TPACountSortBase,'Procedure TPACountSortBase(Var TPA: TPointArray;const maxx, base: TPoint; const SortOnX : Boolean);'); +AddFunction(@TPACountSort,'procedure TPACountSort(Var TPA: TPointArray;const max: TPoint;Const SortOnX : Boolean);'); +AddFunction(@TPACountSortBase,'procedure TPACountSortBase(Var TPA: TPointArray;const maxx, base: TPoint; const SortOnX : Boolean);'); AddFunction(@InvertTIA,'procedure InvertTIA(var tI: TIntegerArray);'); AddFunction(@SumIntegerArray,'function SumIntegerArray(Ints : TIntegerArray): Integer;'); AddFunction(@AverageTIA,'function AverageTIA(tI: TIntegerArray): Integer;'); diff --git a/Units/MMLCore/dtm.pas b/Units/MMLCore/dtm.pas index 0c15f02..036feb3 100644 --- a/Units/MMLCore/dtm.pas +++ b/Units/MMLCore/dtm.pas @@ -31,18 +31,22 @@ uses Classes, SysUtils, MufasaTypes; type + + { TMDTM } + TMDTM = class(TObject) private Client: TObject; DTMList: Array Of pDTM; FreeSpots: Array Of Integer; + procedure CheckIndex(index : integer); public function AddDTM(const d: TDTM): Integer; function AddpDTM(const d: pDTM): Integer; - function GetDTM(index: Integer; out dtm: pDTM): Boolean; + function GetDTM(index: Integer) :pDTM; procedure FreeDTM(DTM: Integer); function StringToDTM(const S: String): pDTM; - function SetDTMName(DTM: Integer;const S: String): boolean; + procedure SetDTMName(DTM: Integer;const S: String); constructor Create(Owner: TObject); destructor Destroy; override; end; @@ -158,21 +162,15 @@ begin result.l := length(result.p); end; -function TMDTM.AddDTM(const d: TDTM): Integer; - +procedure TMDTM.CheckIndex(index: integer); begin - if Length(FreeSpots) > 0 then - begin - DTMList[FreeSpots[High(FreeSpots)]] := TDTMTopDTM(d); - Result := FreeSpots[High(FreeSpots)]; - SetLength(FreeSpots, High(FreeSpots)); - end - else - begin - SetLength(DTMList, Length(DTMList) + 1); - DTMList[High(DTMList)] := TDTMTopDTM(d); - Result := High(DTMList); - end; + if (index < 0) or (index >= Length(DTMList)) then + raise Exception.CreateFmt('The given DTM Index[%d] doesn''t exist',[index]); +end; + +function TMDTM.AddDTM(const d: TDTM): Integer; +begin + Result := AddpDTM(tDTMTopDTM(d)); end; {/\ @@ -180,7 +178,6 @@ end; /\} function TMDTM.AddpDTM(const d: pDTM): Integer; - begin if Length(FreeSpots) > 0 then begin @@ -188,12 +185,13 @@ begin Result := FreeSpots[High(FreeSpots)]; SetLength(FreeSpots, High(FreeSpots)); end - Else + else begin SetLength(DTMList, Length(DTMList) + 1); DTMList[High(DTMList)] := d; Result := High(DTMList); end; + NormalizeDTM(DTMList[result]); end; {/\ @@ -201,30 +199,16 @@ end; Returns true is succesfull, false if the dtm does not exist. /\} -function TMDTM.GetDTM(index: Integer; out dtm: pDTM): Boolean; +function TMDTM.GetDTM(index: Integer) :pDTM; begin - Result := True; - try - dtm := DTMList[index]; - except - begin - raise Exception.CreateFmt('The given DTM Index ([%d]) is invalid.', - [index]); - //WriteLn('DTM Index ' + IntToStr(index) + ' does not exist'); - Result := False; - end; - end + CheckIndex(index); + result := DTMList[index]; end; -function TMDTM.SetDTMName(DTM: Integer;const s: string): boolean; +procedure TMDTM.SetDTMName(DTM: Integer;const s: string); begin - try - DTMList[DTM].n:= s; - Exit(true); - except - raise Exception.CreateFMT('SetDTMName: The given DTM %d does not exist.', [DTM]); - end; - Exit(False); + CheckIndex(DTM); + DTMList[DTM].n := s; end; {/\ @@ -233,19 +217,17 @@ end; Will keep track of not used index, so it is very memory efficient. /\} -Procedure TMDTM.FreeDTM(DTM: Integer); +procedure TMDTM.FreeDTM(DTM: Integer); begin - try - SetLength(DTMList[DTM].p, 0); - SetLength(DTMList[DTM].c, 0); - SetLength(DTMList[DTM].t, 0); - SetLength(DTMList[DTM].asz, 0); - SetLength(DTMList[DTM].ash, 0); - DTMList[DTM].l := 0; - except - raise Exception.CreateFmt('Invalid DTM passed to FreeDTM', []); - //WriteLn('Invalid DTM'); - end; + CheckIndex(DTM); + SetLength(DTMList[DTM].p, 0); + SetLength(DTMList[DTM].c, 0); + SetLength(DTMList[DTM].t, 0); + SetLength(DTMList[DTM].asz, 0); + SetLength(DTMList[DTM].ash, 0); + SetLength(DTMList[DTM].bp,0); + DTMList[DTM].l := 0; + DTMList[DTM].n := ''; SetLength(FreeSpots, Length(FreeSpots) + 1); FreeSpots[High(FreeSpots)] := DTM; end; @@ -279,20 +261,20 @@ end; Returns all Angles in an Extended array. /\} -{Function TMDTM.FindDTMRotated(DTM: Integer; out x, y: Integer; x1, y1, x2, y2: Integer; sAngle, eAngle, aStep: Extended; out aFound: Extended): Boolean; +{function TMDTM.FindDTMRotated(DTM: Integer; out x, y: Integer; x1, y1, x2, y2: Integer; sAngle, eAngle, aStep: Extended; out aFound: Extended): Boolean; Var temp: pDTM; Begin If GetDTM(DTM, temp) Then Result := pFindDTMRotated(temp, x, y, x1, y1, x2, y2, sAngle, eAngle, aStep, aFound) - Else + else Begin x := 0; y := 0; aFound := 0.0; Result := False; - End; -End; } + end; +end; } {/\ Tries to find the given pDTM. If found will put the point the dtm has @@ -301,11 +283,11 @@ End; } Returns all Angles in an Extended array. /\} -{Function TMDTM.pFindDTMRotated(DTM: pDTM; out x, y: Integer; x1, y1, x2, y2: Integer; sAngle, eAngle, aStep: Extended; out aFound: Extended): Boolean; +{function TMDTM.pFindDTMRotated(DTM: pDTM; out x, y: Integer; x1, y1, x2, y2: Integer; sAngle, eAngle, aStep: Extended; out aFound: Extended): Boolean; Begin -End; } +end; } {/\ Tries to find the given DTM (index). Will return true if it has found one or more @@ -315,19 +297,19 @@ End; } Returns all Angles in a Two Dimensional Extended array. /\} -{Function TMDTM.FindDTMsRotated(DTM: Integer; out Points: TPointArray; x1, y1, x2, y2: Integer; sAngle, eAngle, aStep: Extended; out aFound: T2DExtendedArray): Boolean; +{function TMDTM.FindDTMsRotated(DTM: Integer; out Points: TPointArray; x1, y1, x2, y2: Integer; sAngle, eAngle, aStep: Extended; out aFound: T2DExtendedArray): Boolean; Var temp: pDTM; Begin If GetDTM(DTM, temp) Then Result := pFindDTMsRotated(temp, Points, x1, y1, x2, y2, sAngle, eAngle, aStep, aFound) - Else + else Begin SetLength(Points, 0); SetLength(aFound, 0); Result := False; - End; -End; } + end; +end; } {/\ Tries to find the given pDTM. Will return true if it has found one or more diff --git a/Units/MMLCore/dtmutil.pas b/Units/MMLCore/dtmutil.pas index 6e6b990..787256f 100644 --- a/Units/MMLCore/dtmutil.pas +++ b/Units/MMLCore/dtmutil.pas @@ -31,13 +31,13 @@ uses Classes, SysUtils, MufasaTypes; -Function pDTMToTDTM(Const DTM: pDTM): TDTM; -Function tDTMTopDTM(Const DTM: TDTM): pDTM; -Procedure PrintpDTM(const aDTM : pDTM); +function pDTMToTDTM(Const DTM: pDTM): TDTM; +function tDTMTopDTM(Const DTM: TDTM): pDTM; +procedure PrintpDTM(const aDTM : pDTM); procedure initdtm(out d: pdtm; len: integer); function ValidMainPointBox(var dtm: pDTM; const x1, y1, x2, y2: Integer): TBox; -Function ValidMainPointBoxRotated(var dtm: pDTM; const x1, y1, x2, y2: Integer;const +function ValidMainPointBoxRotated(var dtm: pDTM; const x1, y1, x2, y2: Integer;const sAngle, eAngle, aStep: Extended): TBox; function DTMConsistent(const dtm: pdtm): boolean; procedure NormalizeDTM(var dtm: pdtm); @@ -55,7 +55,6 @@ implementation uses math,MufasaBase; procedure RotatePoints_(Var P: TPointArray; A, cx, cy: Extended); - Var I, L: Integer; CosA,SinA : extended; @@ -99,7 +98,7 @@ begin d.bp[i] := False; end; -Procedure PrintpDTM(const aDTM : pDTM); +procedure PrintpDTM(const aDTM : pDTM); var i : integer; begin; @@ -111,7 +110,7 @@ begin; mDebugLn('SubPoint['+IntToStr(I) + '] ' + inttostr(aDTM.p[i].x) + ', ' + inttostr(aDTM.p[i].y) + ' col: ' + inttostr(aDTM.c[i]) + ', tol: ' + inttostr(aDTM.t[i]) + '; ashape ' + inttostr(aDTM.ash[i]) + ' asize ' + inttostr(aDTM.asz[i]) + ', Bad Point: ' + BoolToStr(aDTM.bp[i])); end; -Function pDTMToTDTM(Const DTM: pDTM): TDTM; +function pDTMToTDTM(Const DTM: pDTM): TDTM; Var Temp: TDTMPointDef; @@ -147,19 +146,17 @@ End; Converts a TDTM to a pDTM. /\} -Function tDTMTopDTM(Const DTM: TDTM): pDTM; - -Var - //Temp: TDTMPointDef; +function tDTMTopDTM(Const DTM: TDTM): pDTM; +var I: Integer; - -Begin - SetLength(Result.p, Length(DTM.SubPoints) + 1); - SetLength(Result.c, Length(DTM.SubPoints) + 1); - SetLength(Result.t, Length(DTM.SubPoints) + 1); - SetLength(Result.asz, Length(DTM.SubPoints) + 1); - SetLength(Result.ash, Length(DTM.SubPoints) + 1); - SetLength(Result.bp, Length(DTM.SubPoints) + 1); +begin + Result.l := Length(DTM.SubPoints) + 1; //The mainpoint is in a different structure + SetLength(Result.p, Result.l); + SetLength(Result.c, Result.l); + SetLength(Result.t, Result.l); + SetLength(Result.asz, Result.l); + SetLength(Result.ash, Result.l); + SetLength(Result.bp, Result.l); Result.p[0].x := DTM.MainPoint.x; Result.p[0].y := DTM.MainPoint.y; @@ -168,7 +165,7 @@ Begin Result.asz[0] := DTM.MainPoint.AreaSize; Result.ash[0] := DTM.MainPoint.AreaShape; - For I := 1 To Length(DTM.SubPoints) Do // High + 1 = Length + For I := 1 To Result.l - 1 Do // High + 1 = Length Begin Result.p[I].x := DTM.SubPoints[I - 1].x; Result.p[I].y := DTM.SubPoints[I - 1].y; @@ -178,11 +175,10 @@ Begin Result.ash[I] := DTM.SubPoints[I - 1].AreaShape; End; - Result.l := length(Result.p); setlength(result.bp, result.l); for i := 0 to result.l -1 do result.bp[i] := false; -End; +end; { TODO: Check if bounds are correct? } function DTMConsistent(const dtm: pdtm): boolean; @@ -229,7 +225,7 @@ begin dtm.p[0] := dtm.p[0] - dtm.p[0]; //Point(0,0); end; -Function ValidMainPointBox(var dtm: pDTM; const x1, y1, x2, y2: Integer): TBox; +function ValidMainPointBox(var dtm: pDTM; const x1, y1, x2, y2: Integer): TBox; var i: Integer; @@ -256,7 +252,7 @@ begin Result.y2 := y2 - b.y2; end; -Function ValidMainPointBoxRotated(var dtm: pDTM; const x1, y1, x2, y2: Integer; +function ValidMainPointBoxRotated(var dtm: pDTM; const x1, y1, x2, y2: Integer; const sAngle, eAngle, aStep: Extended): TBox; var diff --git a/Units/MMLCore/finder.pas b/Units/MMLCore/finder.pas index c0e5bdd..9f2bf77 100644 --- a/Units/MMLCore/finder.pas +++ b/Units/MMLCore/finder.pas @@ -85,9 +85,9 @@ type function FindDeformedBitmapToleranceIn(bitmap: TMufasaBitmap; out x, y: Integer; xs, ys, xe, ye: Integer; tolerance: Integer; Range: Integer; AllowPartialAccuracy: Boolean; out accuracy: Extended): Boolean; function FindDTM(const DTM: pDTM; out x, y: Integer; x1, y1, x2, y2: Integer): Boolean; - function FindDTMs(DTM: pDTM; out Points: TPointArray; x1, y1, x2, y2, maxToFind: Integer): Boolean; + function FindDTMs(DTM: pDTM; out Points: TPointArray; x1, y1, x2, y2 : integer; maxToFind: Integer = 0): Boolean; function FindDTMRotated(const DTM: pDTM; out x, y: Integer; x1, y1, x2, y2: Integer; sAngle, eAngle, aStep: Extended; out aFound: Extended; Alternating : boolean): Boolean; - function FindDTMsRotated(DTM: pDTM; out Points: TPointArray; x1, y1, x2, y2: Integer; sAngle, eAngle, aStep: Extended; out aFound: T2DExtendedArray; maxToFind: Integer; Alternating : boolean): Boolean; + function FindDTMsRotated(DTM: pDTM; out Points: TPointArray; x1, y1, x2, y2: Integer; sAngle, eAngle, aStep: Extended; out aFound: T2DExtendedArray;Alternating : boolean; maxToFind: Integer = 0): Boolean; //Donno function GetColors(const Coords: TPointArray): TIntegerArray; // tol speeds @@ -1923,6 +1923,7 @@ begin Exit(False); end; +//MaxToFind, if it's < 1 it won't stop looking function TMFinder.FindDTMs(DTM: pDTM; out Points: TPointArray; x1, y1, x2, y2, maxToFind: Integer): Boolean; var // Colours of DTMs @@ -1967,10 +1968,7 @@ begin // Is the area valid? DefaultOperations(x1, y1, x2, y2); if not DTMConsistent(dtm) then - begin - raise Exception.CreateFmt('FindDTMs: DTM is not consistent.', []); - Exit; - end; + raise Exception.CreateFmt('FindDTMs: DTM[%s] is not consistent.', [DTM.n]); // Get the area we should search in for the Main Point. MA := ValidMainPointBox(DTM, x1, y1, x2, y2); @@ -2087,7 +2085,7 @@ var P: TPointArray; F: T2DExtendedArray; begin - FindDTMsRotated(dtm, P, x1, y1, x2, y2, sAngle, eAngle, aStep, F, 1,Alternating); + FindDTMsRotated(dtm, P, x1, y1, x2, y2, sAngle, eAngle, aStep, F,Alternating,1); if Length(P) = 0 then exit(false); aFound := F[0][0]; @@ -2096,7 +2094,7 @@ begin Exit(True); end; -function TMFinder.FindDTMsRotated(DTM: pDTM; out Points: TPointArray; x1, y1, x2, y2: Integer; sAngle, eAngle, aStep: Extended; out aFound: T2DExtendedArray; maxToFind: Integer; Alternating : boolean): Boolean; +function TMFinder.FindDTMsRotated(DTM: pDTM; out Points: TPointArray; x1, y1, x2, y2: Integer; sAngle, eAngle, aStep: Extended; out aFound: T2DExtendedArray;Alternating : boolean; maxToFind: Integer): Boolean; var DTMRot: pDTM; // Colours of DTMs @@ -2146,11 +2144,8 @@ var begin // Is the area valid? DefaultOperations(x1, y1, x2, y2); - if not DTMConsistent(DTM) then - begin - raise Exception.CreateFmt('FindDTMsRotated: DTMRot is not consistent.', []); - Exit; - end; + if not DTMConsistent(dtm) then + raise Exception.CreateFmt('FindDTMs: DTM[%s] is not consistent.', [DTM.n]); NormalizeDTM(DTM); @@ -2185,6 +2180,10 @@ begin for i := 0 to DTM.l - 1 do ColorToHSL(DTM.c[i],hh[i],ss[i],ll[i]); + {We create a kinda 'fake' rotated DTM. This dtm only has points + len, no other crap. + Since this other 'crap' equals the original DTM, no need to copy that!} + DTMRot.l := DTM.l; + GetToleranceSpeed2Modifiers(hMod, sMod); ccts := CTS; @@ -2203,16 +2202,19 @@ begin s := sAngle; while s < eAngle do begin - DTMRot := RotateDTM(DTM, s); - //Rotate the DTMRot, the rest is just like FindDTMs +// DTMRot := RotateDTM(DTM, s); + DTMRot.p := RotatePoints(DTM.p,s,0,0); + //DTMRot now has the same points as the original DTM, just rotated! + //The other stuff in the structure doesn't matter, as it's the same as the original DTM.. + //So from now on if we want to see what 'point' we're at, use DTMRot.p, for the rest just use the original DTM MA := ValidMainPointBox(DTMRot, x1, y1, x2, y2); - //CD starts at 0,0.. We must adjust the MA, since this is still based on the xs,ys,xe,ye box. + //CD(ClientData) starts at 0,0.. We must adjust the MA, since this is still based on the xs,ys,xe,ye box. MA.x1 := MA.x1 - x1; MA.y1 := MA.y1 - y1; MA.x2 := MA.x2 - x1; MA.y2 := MA.y2 - y1; //MA is now fixed to the new (0,0) box... - for yy := MA.y1 to MA.y2 do //Coord of the mainpoint in the search area + for yy := MA.y1 to MA.y2 do //(xx,yy) is now the coord of the mainpoint in the search area for xx := MA.x1 to MA.x2 do begin //Mainpoint can have area size as well, so we must check that just like any subpoint. @@ -2220,10 +2222,10 @@ begin begin //change to use other areashapes too. Found := false; //With area it can go out of bounds, therefore this max/min check - StartX := max(0,xx - DTMRot.asz[i] + DTMRot.p[i].x); - StartY := max(0,yy - DTMRot.asz[i] + DTMRot.p[i].y); - EndX := Min(Ma.x2,xx + DTMRot.asz[i] + DTMRot.p[i].x); - EndY := Min(ma.y2,yy + DTMRot.asz[i] + DTMRot.p[i].y); + StartX := max(0,xx - DTM.asz[i] + DTMRot.p[i].x); + StartY := max(0,yy - DTM.asz[i] + DTMRot.p[i].y); + EndX := Min(Ma.x2,xx + DTM.asz[i] + DTMRot.p[i].x); + EndY := Min(ma.y2,yy + DTM.asz[i] + DTMRot.p[i].y); for xxx := StartX to EndX do //The search area for the subpoint begin for yyy := StartY to EndY do @@ -2234,7 +2236,7 @@ begin // Checking point i now. (Store that we matched it) ch[xxx][yyy]:= ch[xxx][yyy] or (1 shl i); - if ColorSame(ccts,DTMRot.t[i],clR[i],clG[i],clB[i],cd[yyy][xxx].R, cd[yyy][xxx].G, cd[yyy][xxx].B,hh[i],ss[i],ll[i],hmod,smod) then + if ColorSame(ccts,DTM.t[i],clR[i],clG[i],clB[i],cd[yyy][xxx].R, cd[yyy][xxx].G, cd[yyy][xxx].B,hh[i],ss[i],ll[i],hmod,smod) then b[xxx][yyy] := b[xxx][yyy] or (1 shl i); end; diff --git a/Units/MMLCore/mufasatypes.pas b/Units/MMLCore/mufasatypes.pas index baab09d..3c92634 100644 --- a/Units/MMLCore/mufasatypes.pas +++ b/Units/MMLCore/mufasatypes.pas @@ -100,7 +100,7 @@ type add seperate tpa or boolean array for every point that is to be matched ? } - pDTM = packed record + pDTM = record l: Integer; p: TPointArray; c, t, asz, ash: TIntegerArray; From c918d95b1c535e9f58bcce39c0717aa283d0ea4e Mon Sep 17 00:00:00 2001 From: Raymond Date: Sat, 3 Apr 2010 15:10:13 +0200 Subject: [PATCH 12/22] Exported the 'whole' TMufasaBitmap class to PascalScript. Changed rev to 605. --- Projects/SAMufasaGUI/extensionmanager.pas | 1 + Projects/SAMufasaGUI/testunit.pas | 6 +- Units/MMLAddon/PSInc/Wrappers/bitmap.inc | 4 +- Units/MMLAddon/PSInc/Wrappers/file.inc | 12 ++-- Units/MMLAddon/PSInc/psexportedmethods.inc | 20 +++--- Units/MMLAddon/mmisc.pas | 4 +- Units/MMLAddon/mmlpsthread.pas | 75 ++++++++++++++++++++-- Units/MMLCore/bitmaps.pas | 40 +++++++++--- Units/MMLCore/files.pas | 16 ++--- 9 files changed, 130 insertions(+), 48 deletions(-) diff --git a/Projects/SAMufasaGUI/extensionmanager.pas b/Projects/SAMufasaGUI/extensionmanager.pas index 6729c77..f63e311 100644 --- a/Projects/SAMufasaGUI/extensionmanager.pas +++ b/Projects/SAMufasaGUI/extensionmanager.pas @@ -149,6 +149,7 @@ begin if HookExists(HookName) then if ExecuteHook(HookName, Args, Result) <> 0 then begin + mDebugLn('Execute hook failed: Hookname: %s',[hookname]); // Not succesfull. end; end; diff --git a/Projects/SAMufasaGUI/testunit.pas b/Projects/SAMufasaGUI/testunit.pas index 1ae2009..58631b5 100644 --- a/Projects/SAMufasaGUI/testunit.pas +++ b/Projects/SAMufasaGUI/testunit.pas @@ -46,7 +46,7 @@ uses CastaliaSimplePasPar, v_AutoCompleteForm, PSDump; const - SimbaVersion = 602; + SimbaVersion = 605; type @@ -382,7 +382,7 @@ type procedure CreateDefaultEnvironment; procedure LoadFormSettings; procedure SaveFormSettings; - procedure AddRecentFile(filename : string); + procedure AddRecentFile(const filename : string); procedure InitalizeTMThread(var Thread : TMThread); procedure HandleParameters; procedure OnSaveScript(const Filename : string); @@ -1161,7 +1161,7 @@ begin end; end; -procedure TForm1.AddRecentFile(filename: string); +procedure TForm1.AddRecentFile(const filename: string); var MaxRecentFiles : integer; Len,i : integer; diff --git a/Units/MMLAddon/PSInc/Wrappers/bitmap.inc b/Units/MMLAddon/PSInc/Wrappers/bitmap.inc index 8440eb4..24983d1 100644 --- a/Units/MMLAddon/PSInc/Wrappers/bitmap.inc +++ b/Units/MMLAddon/PSInc/Wrappers/bitmap.inc @@ -82,7 +82,7 @@ end; procedure SetBitmapName(Bmp : integer; name : string); extdecl; begin; - CurrThread.Client.MBitmaps[Bmp].BmpName:= name; + CurrThread.Client.MBitmaps[Bmp].Name:= name; end; function CreateMirroredBitmap(Bmp : integer) : integer; extdecl; @@ -270,7 +270,7 @@ begin; result := CurrThread.Client.MBitmaps[Bitmap].CreateTMask; end; -function FindMaskTolerance(mask: TMask; out x, y: Integer; xs,ys, xe, ye: Integer; Tolerance, ContourTolerance: Integer): Boolean; extdecl; +function FindMaskTolerance(const mask: TMask; out x, y: Integer; xs,ys, xe, ye: Integer; Tolerance, ContourTolerance: Integer): Boolean; extdecl; begin; result := CurrThread.Client.MFinder.FindMaskTolerance(Mask,x,y,xs,ys,xe,ye,tolerance,contourtolerance); end; diff --git a/Units/MMLAddon/PSInc/Wrappers/file.inc b/Units/MMLAddon/PSInc/Wrappers/file.inc index aca323d..73a783e 100644 --- a/Units/MMLAddon/PSInc/Wrappers/file.inc +++ b/Units/MMLAddon/PSInc/Wrappers/file.inc @@ -21,17 +21,17 @@ File.inc for the Mufasa Macro Library } -function ps_CreateFile(Path: string): Integer; extdecl; +function ps_CreateFile(const Path: string): Integer; extdecl; begin Result := CurrThread.Client.MFiles.CreateFile(Path); end; -function ps_OpenFile(Path: string; Shared: Boolean): Integer; extdecl; +function ps_OpenFile(const Path: string; Shared: Boolean): Integer; extdecl; begin Result := CurrThread.Client.MFiles.OpenFile(Path, Shared); end; -function ps_RewriteFile(Path: string; Shared: Boolean): Integer; extdecl; +function ps_RewriteFile(const Path: string; Shared: Boolean): Integer; extdecl; begin Result := CurrThread.Client.MFiles.RewriteFile(Path, Shared); end; @@ -81,7 +81,7 @@ begin result := CreateDir(directoryName); end; -procedure ps_WriteINI(Section, KeyName, NewString, FileName: string);extdecl; +procedure ps_WriteINI(const Section, KeyName, NewString, FileName: string);extdecl; var tempini : TIniFile; begin; @@ -90,7 +90,7 @@ begin; tempini.free; end; -function ps_ReadINI(Section, KeyName, FileName: string): string;extdecl; +function ps_ReadINI(const Section, KeyName, FileName: string): string;extdecl; var tempini : TIniFile; begin; @@ -99,7 +99,7 @@ begin; tempini.free; end; -procedure ps_DeleteINI(Section, KeyName, FileName: string); extdecl; +procedure ps_DeleteINI(const Section, KeyName, FileName: string); extdecl; var tempini : TIniFile; begin; diff --git a/Units/MMLAddon/PSInc/psexportedmethods.inc b/Units/MMLAddon/PSInc/psexportedmethods.inc index 443954a..e8d5c16 100644 --- a/Units/MMLAddon/PSInc/psexportedmethods.inc +++ b/Units/MMLAddon/PSInc/psexportedmethods.inc @@ -90,9 +90,9 @@ AddFunction(@IsTargetValid, 'function IsTargetValid: boolean;'); {files} SetCurrSection('Files'); -AddFunction(@ps_CreateFile, 'function CreateFile(Path: string): Integer;'); -AddFunction(@ps_OpenFile, 'function OpenFile(Path: string; Shared: Boolean): Integer;'); -AddFunction(@ps_RewriteFile, 'function RewriteFile(Path: string; Shared: Boolean): Integer;'); +AddFunction(@ps_CreateFile, 'function CreateFile(const Path: string): Integer;'); +AddFunction(@ps_OpenFile, 'function OpenFile(const Path: string; Shared: Boolean): Integer;'); +AddFunction(@ps_RewriteFile, 'function RewriteFile(const Path: string; Shared: Boolean): Integer;'); AddFunction(@ps_CloseFile, 'procedure CloseFile(FileNum: Integer);'); AddFunction(@ps_EndOfFile, 'function EndOfFile(FileNum: Integer): Boolean;'); AddFunction(@ps_FileSize, 'function FileSize(FileNum: Integer): LongInt;'); @@ -100,12 +100,12 @@ AddFunction(@ps_ReadFileString, 'function ReadFileString(FileNum: Integer; var s AddFunction(@ps_WriteFileString, 'function WriteFileString(FileNum: Integer; s: string): Boolean;'); AddFunction(@ps_SetFileCharPointer, 'function SetFileCharPointer(FileNum, cChars, Origin: Integer): Integer;'); AddFunction(@ps_FilePointerPos, 'function FilePointerPos(FileNum: Integer): Integer;'); -AddFunction(@ps_DirectoryExists,'function DirectoryExists( const DirectoryName : string ) : Boolean;'); -AddFunction(@ps_CreateDirectory,'function CreateDirectory( const DirectoryName : string) : boolean;'); -AddFunction(@ps_FileExists,'function FileExists ( const FileName : string ) : Boolean;'); -AddFunction(@ps_WriteINI,'procedure WriteINI(Section, KeyName, NewString, FileName: string);'); -AddFunction(@ps_ReadINI,'function ReadINI(Section, KeyName, FileName: string): string;'); -AddFunction(@ps_DeleteINI,'procedure DeleteINI(Section, KeyName, FileName: string);'); +AddFunction(@ps_DirectoryExists,'function DirectoryExists(const DirectoryName : string ) : Boolean;'); +AddFunction(@ps_CreateDirectory,'function CreateDirectory(const DirectoryName : string) : boolean;'); +AddFunction(@ps_FileExists,'function FileExists (const FileName : string ) : Boolean;'); +AddFunction(@ps_WriteINI,'procedure WriteINI(const Section, KeyName, NewString, FileName: string);'); +AddFunction(@ps_ReadINI,'function ReadINI(const Section, KeyName, FileName: string): string;'); +AddFunction(@ps_DeleteINI,'procedure DeleteINI(const Section, KeyName, FileName: string);'); {other} SetCurrSection('Other'); @@ -279,7 +279,7 @@ AddFunction(@BrightnessBitmap,'function BrightnessBitmap(Bitmap,br : integer) : AddFunction(@ContrastBitmap,'function ContrastBitmap(bitmap : integer; co : extended) : integer;'); AddFunction(@PosterizeBitmap,'function PosterizeBitmap(Bitmap : integer; po : integer) : integer;'); AddFunction(@CreateMaskFromBitmap,'function CreateMaskFromBitmap(Bitmap : integer) : TMask;'); -AddFunction(@FindMaskTolerance,'function FindMaskTolerance(mask: TMask; var x, y: Integer; xs,ys, xe, ye: Integer; Tolerance, ContourTolerance: Integer): Boolean;'); +AddFunction(@FindMaskTolerance,'function FindMaskTolerance(const mask: TMask; var x, y: Integer; xs,ys, xe, ye: Integer; Tolerance, ContourTolerance: Integer): Boolean;'); AddFunction(@FindBitmapMaskTolerance,'function FindBitmapMaskTolerance(mask: Integer; var x, y: Integer; xs, ys, xe, ye: Integer; Tolerance, ContourTolerance: Integer): Boolean;'); AddFunction(@FindDeformedBitmapToleranceIn,'function FindDeformedBitmapToleranceIn(bitmap: integer; var x,y: Integer; xs, ys, xe, ye: Integer; tolerance: Integer; Range: Integer; AllowPartialAccuracy: Boolean; var accuracy: Extended): Boolean;'); AddFunction(@DrawTPABitmap,'procedure DrawTPABitmap(bitmap: integer; TPA: TPointArray; Color: integer);'); diff --git a/Units/MMLAddon/mmisc.pas b/Units/MMLAddon/mmisc.pas index 47c2014..ab0d13e 100644 --- a/Units/MMLAddon/mmisc.pas +++ b/Units/MMLAddon/mmisc.pas @@ -9,7 +9,7 @@ uses function DecompressBZip2(const input : TStream; const BlockSize : Cardinal = 4096) : TMemoryStream; function UnTar(const Input : TStream) : TStringArray;overload; -function UnTar(const Input : TStream; outputdir : string; overwrite : boolean): boolean;overload; +function UnTar(const Input : TStream;const outputdir : string; overwrite : boolean): boolean;overload; implementation @@ -63,7 +63,7 @@ begin; Tar.Free; end; -function UnTar(const Input: TStream; outputdir: string; overwrite: boolean): boolean; overload; +function UnTar(const Input: TStream; const outputdir: string; overwrite: boolean): boolean; overload; var Tar : TTarArchive; DirRec : TTarDirRec; diff --git a/Units/MMLAddon/mmlpsthread.pas b/Units/MMLAddon/mmlpsthread.pas index 0ce163a..c746345 100644 --- a/Units/MMLAddon/mmlpsthread.pas +++ b/Units/MMLAddon/mmlpsthread.pas @@ -600,14 +600,44 @@ begin end; procedure SIRegister_Mufasa(cl: TPSPascalCompiler); +var + PSClass : TPSCompileTimeClass; begin - with cl.AddClassN(cl.FindClass('TObject'),'TMufasaBitmap') do + PSClass :=cl.AddClassN(cl.FindClass('TObject'),'TMufasaBitmap'); + with PSClass do begin; + RegisterMethod('procedure SetSize(AWidth,AHeight : integer);'); + RegisterMethod('procedure StretchResize(AWidth,AHeight : integer);'); + RegisterMethod('procedure FastSetPixel(x,y : integer; Color : TColor);'); + RegisterMethod('procedure FastSetPixels(TPA : TPointArray; Colors : TIntegerArray);'); + RegisterMethod('procedure DrawATPA(ATPA : T2DPointArray; Colors : TIntegerArray);'); + RegisterMethod('procedure DrawTPA(TPA : TPointArray; Color : TColor);'); + RegisterMethod('function FastGetPixel(x,y : integer) : TColor;'); +// function FastGetPixels(TPA : TPointArray) : TIntegerArray; + RegisterMethod('procedure SetTransparentColor(Col : TColor);'); + RegisterMethod('function GetTransparentColor : TColor;'); + RegisterProperty('TransparentColorSet','Boolean',iptR); + RegisterMethod('procedure FastDrawClear(Color : TColor);'); + RegisterMethod('procedure FastDrawTransparent(x, y: Integer; TargetBitmap: TMufasaBitmap);'); + RegisterMethod('procedure FastReplaceColor(OldColor, NewColor: TColor);'); + RegisterMethod('procedure RotateBitmap(angle: Extended;TargetBitmap : TMufasaBitmap );'); + RegisterMethod('procedure Desaturate(TargetBitmap : TMufasaBitmap);'); + RegisterMethod('procedure GreyScale(TargetBitmap : TMufasaBitmap);'); + RegisterMethod('procedure Brightness(TargetBitmap : TMufasaBitmap; br : integer);'); + RegisterMethod('procedure Contrast(TargetBitmap : TMufasaBitmap; co : Extended);'); + RegisterMethod('procedure Invert(TargetBitmap : TMufasaBitmap);'); + RegisterMethod('procedure Posterize(TargetBitmap : TMufasaBitmap; Po : integer);'); + RegisterMethod('function Copy: TMufasaBitmap;'); + RegisterMethod('function ToString : string;'); + RegisterMethod('function CreateTMask : TMask;'); RegisterMethod('constructor create'); RegisterMethod('procedure Free'); RegisterMethod('function SaveToFile(const FileName : string) :boolean;'); RegisterMethod('procedure LoadFromFile(const FileName : string);'); + RegisterProperty('Width','Integer',iptR); + RegisterProperty('Height','Integer',iptR); RegisterProperty('Index','Integer',iptR); + RegisterProperty('Name','String',iptRW); end; end; @@ -622,20 +652,51 @@ begin; CurrThread.Client.MBitmaps.FreeBMP(Self.Index); end; -procedure MufasaBitmapIndex(self : TMufasaBitmap; var Index : integer); -begin; - Index := self.Index; -end; +procedure MBmp_Index_r(self : TMufasaBitmap; var Index : integer);begin; Index := self.Index; end; +procedure MBmp_Width_r(self : TMufasaBitmap; var Width : integer);begin; Width := self.Width; end; +procedure MBmp_Height_r(self : TMufasaBitmap; var Height : integer);begin; Height := self.Height; end; +procedure MBmp_Name_r(self : TMufasaBitmap; var Name : String);begin; Name := self.Name; end; +procedure MBmp_Name_w(self : TMufasaBitmap; const Name : String);begin; Self.name := name; end; +procedure MBmp_TransColorSet_r(Self : TMufasaBitmap; var IsSet : boolean); begin IsSet := self.TransparentColorSet; end; procedure RIRegister_Mufasa(cl: TPSRuntimeClassImporter); +var + PSClass : TPSRuntimeClass; begin; - with cl.Add(TMufasaBitmap) do + PSClass :=cl.Add(TMufasaBitmap); + with PSClass do begin + RegisterMethod(@TMufasaBitmap.SetSize,'SETSIZE'); + RegisterMethod(@TMufasaBitmap.StretchResize,'STRETCHRESIZE'); + RegisterMethod(@TMufasaBitmap.FastSetPixel,'FASTSETPIXEL'); + RegisterMethod(@TMufasaBitmap.FastSetPixels,'FASTSETPIXELS'); + RegisterMethod(@TMufasaBitmap.DrawATPA,'DRAWATPA'); + RegisterMethod(@TMufasaBitmap.DrawTPA,'DRAWTPA'); + RegisterMethod(@TMufasaBitmap.FastGetPixel,'FASTGETPIXEL'); + RegisterMethod(@TMufasaBitmap.SetTransparentColor,'SETTRANSPARENTCOLOR'); + RegisterMethod(@TMufasaBitmap.GetTransparentColor,'GETTRANSPARENTCOLOR'); + RegisterMethod(@TMufasaBitmap.FastDrawClear,'FASTDRAWCLEAR'); + RegisterMethod(@TMufasaBitmap.FastDrawTransparent,'FASTDRAWTRANSPARENT'); + RegisterMethod(@TMufasaBitmap.FastReplaceColor,'FASTREPLACECOLOR'); + RegisterMethod(@TMufasaBitmap.RotateBitmap,'ROTATEBITMAP'); + RegisterMethod(@TMufasaBitmap.Desaturate,'DESATURATE'); + RegisterMethod(@TMufasaBitmap.GreyScale,'GREYSCALE'); + RegisterMethod(@TMufasaBitmap.Brightness,'BRIGHTNESS'); + RegisterMethod(@TMufasaBitmap.Contrast,'CONTRAST'); + RegisterMethod(@TMufasaBitmap.Invert,'INVERT'); + RegisterMethod(@TMufasaBitmap.Posterize,'POSTERIZE'); + RegisterMethod(@TMufasaBitmap.Copy, 'COPY'); + RegisterMethod(@TMufasaBitmap.ToString,'TOSTRING'); + RegisterMethod(@TMufasaBitmap.CreateTMask,'CREATETMASK'); + RegisterPropertyHelper(@MBmp_TransColorSet_r,nil,'TRANSPARENTCOLORSET'); + RegisterPropertyHelper(@MBmp_Index_r,nil,'INDEX'); + RegisterPropertyHelper(@MBmp_Width_r,nil,'WIDTH'); + RegisterPropertyHelper(@MBmp_Height_r,nil,'HEIGHT'); + RegisterPropertyHelper(@MBmp_Name_r,@MBmp_Name_w,'NAME'); RegisterConstructor(@CreateMufasaBitmap,'CREATE'); RegisterMethod(@FreeMufasaBitmap,'FREE'); RegisterMethod(@TMufasaBitmap.SaveToFile, 'SAVETOFILE'); RegisterMethod(@TMufasaBitmap.LoadFromFile, 'LOADFROMFILE'); - RegisterPropertyHelper(@MufasaBitmapIndex,nil,'INDEX'); end; end; diff --git a/Units/MMLCore/bitmaps.pas b/Units/MMLCore/bitmaps.pas index 16e6147..ae98245 100644 --- a/Units/MMLCore/bitmaps.pas +++ b/Units/MMLCore/bitmaps.pas @@ -38,11 +38,12 @@ type TransparentColor : TRGB32; TransparentSet : boolean; FIndex : integer; + FName : string; public OnDestroy : procedure(Bitmap : TMufasaBitmap) of object; - FakeData : array of TRGB32; + //FakeData : array of TRGB32; FData : PRGB32; - BmpName : string; //Optional? + property Name : string read FName write FName; property Index : integer read FIndex write FIndex; procedure SetSize(AWidth,AHeight : integer); procedure StretchResize(AWidth,AHeight : integer); @@ -69,15 +70,16 @@ type procedure CopyClientToBitmap(MWindow : TObject;Resize : boolean; xs, ys, xe, ye: Integer);overload; procedure CopyClientToBitmap(MWindow : TObject;Resize : boolean;x,y : integer; xs, ys, xe, ye: Integer);overload; procedure RotateBitmap(angle: Extended;TargetBitmap : TMufasaBitmap ); - procedure Desaturate;overload; procedure Desaturate(TargetBitmap : TMufasaBitmap); overload; + procedure Desaturate;overload; procedure GreyScale(TargetBitmap : TMufasaBitmap);overload; procedure GreyScale; - procedure Brightness(br: integer);overload; procedure Brightness(TargetBitmap : TMufasaBitmap; br : integer); overload; - procedure Contrast(co: Extended);overload; + procedure Brightness(br: integer);overload; procedure Contrast(TargetBitmap : TMufasaBitmap; co : Extended);overload; - procedure Invert; + procedure Contrast(co: Extended);overload; + procedure Invert(TargetBitmap : TMufasaBitmap);overload; + procedure Invert;overload; procedure Posterize(TargetBitmap : TMufasaBitmap; Po : integer);overload; procedure Posterize(Po : integer);overload; function Copy: TMufasaBitmap; @@ -369,7 +371,7 @@ function TMBitmaps.CreateBMPFromString(BmpName: string; width, height: integer; Data: string): integer; begin Result := Self.CreateBMPFromString(width,height,data); - Bmp[Result].BmpName:= BmpName; + Bmp[Result].Name:= BmpName; end; @@ -1028,6 +1030,24 @@ begin end; end; +procedure TMufasaBitmap.Invert(TargetBitmap: TMufasaBitmap); +var + I : integer; + PtrOld,PtrNew : PRGB32; +begin + TargetBitmap.SetSize(w,h); + PtrOld := Self.FData; + PtrNew := TargetBitmap.FData; + for i := (h*w-1) downto 0 do + begin; + PtrNew^.r := not PtrOld^.r; + PtrNew^.g := not PtrOld^.g; + PtrNew^.b := not PtrOld^.b; + inc(ptrOld); + inc(PtrNew); + end; +end; + procedure TMufasaBitmap.Posterize(TargetBitmap: TMufasaBitmap; Po: integer); var I : integer; @@ -1127,10 +1147,10 @@ begin for i := 0 to BmpsCurr do if BmpArray[i] <> nil then begin; - if BmpArray[i].BmpName = '' then + if BmpArray[i].Name = '' then TClient(Client).Writeln(Format('BMP[%d] has not been freed in the script, freeing it now.',[i])) else - TClient(Client).Writeln(Format('BMP[%s] has not been freed in the script, freeing it now.',[BmpArray[i].BmpName])); + TClient(Client).Writeln(Format('BMP[%s] has not been freed in the script, freeing it now.',[BmpArray[i].Name])); FreeAndNil(BmpArray[i]); end; SetLength(BmpArray,0); @@ -1206,7 +1226,7 @@ end; constructor TMufasaBitmap.Create; begin inherited Create; - BmpName:= ''; + Name:= ''; TransparentSet:= False; setSize(0,0); {FData:= nil; diff --git a/Units/MMLCore/files.pas b/Units/MMLCore/files.pas index 759da26..6da7ea2 100644 --- a/Units/MMLCore/files.pas +++ b/Units/MMLCore/files.pas @@ -43,14 +43,14 @@ type constructor Create(Owner : TObject); destructor Destroy; override; public - function CreateFile(Path: string): Integer; - function OpenFile(Path: string; Shared: Boolean): Integer; - function RewriteFile(Path: string; Shared: Boolean): Integer; + function CreateFile(const Path: string): Integer; + function OpenFile(const Path: string; Shared: Boolean): Integer; + function RewriteFile(const Path: string; Shared: Boolean): Integer; procedure CloseFile(FileNum: Integer); function EndOfFile(FileNum: Integer): Boolean; function FileSizeMuf(FileNum: Integer): LongInt; function ReadFileString(FileNum: Integer; out s: string; x: Integer): Boolean; - function WriteFileString(FileNum: Integer; s: string): Boolean; + function WriteFileString(FileNum: Integer;const s: string): Boolean; Function SetFileCharPointer(FileNum, cChars, Origin: Integer): Integer; function FilePointerPos(FileNum: Integer): Integer; protected @@ -226,7 +226,7 @@ End; Returns -1 if unsuccesfull. /\} -function TMFiles.CreateFile(Path: string): Integer; +function TMFiles.CreateFile(const Path: string): Integer; Var FS: TFileStream; @@ -249,7 +249,7 @@ end; Returns -1 if unsuccesfull. /\} -function TMFiles.OpenFile(Path: string; Shared: Boolean): Integer; +function TMFiles.OpenFile(const Path: string; Shared: Boolean): Integer; Var FS: TFileStream; @@ -290,7 +290,7 @@ end; Returns -1 if unsuccesfull. /\} -function TMFiles.RewriteFile(Path: string; Shared: Boolean): Integer; +function TMFiles.RewriteFile(const Path: string; Shared: Boolean): Integer; Var FS: TFileStream; @@ -454,7 +454,7 @@ end; Writes s in the given File. /\} -function TMFiles.WriteFileString(FileNum: Integer; s: string): Boolean; +function TMFiles.WriteFileString(FileNum: Integer;const s: string): Boolean; begin If(FileNum < 0) or (FileNum >= Length(MFiles)) Then raise Exception.CreateFmt('Invalid FileNum passed: %d',[FileNum]); From 7007f2893975c80c35d2906daeab2b5b3ed81425 Mon Sep 17 00:00:00 2001 From: Merlijn Wajer Date: Sat, 3 Apr 2010 23:27:10 +0200 Subject: [PATCH 13/22] Rename Setting, Create Setting and Delete Setting. ** Untested due to Lazarus crashes with InputQuery & InputBox ** --- Projects/SAMufasaGUI/simbasettings.lfm | 31 +++++- Projects/SAMufasaGUI/simbasettings.lrs | 35 ++++--- Projects/SAMufasaGUI/simbasettings.pas | 127 ++++++++++++++++++++++++- Units/MMLAddon/settings.pas | 3 + 4 files changed, 181 insertions(+), 15 deletions(-) diff --git a/Projects/SAMufasaGUI/simbasettings.lfm b/Projects/SAMufasaGUI/simbasettings.lfm index f837176..ccd80be 100644 --- a/Projects/SAMufasaGUI/simbasettings.lfm +++ b/Projects/SAMufasaGUI/simbasettings.lfm @@ -9,6 +9,7 @@ object SettingsForm: TSettingsForm ClientWidth = 360 OnCreate = FormCreate OnDestroy = FormDestroy + OnMouseUp = MouseUp LCLVersion = '0.9.29' object SettingsTreeView: TTreeView Left = 16 @@ -16,11 +17,13 @@ object SettingsForm: TSettingsForm Top = 16 Width = 324 Anchors = [akTop, akLeft, akRight, akBottom] - DefaultItemHeight = 15 + DefaultItemHeight = 19 ReadOnly = True ScrollBars = ssAutoBoth TabOrder = 0 OnDblClick = SettingsTreeViewDblClick + OnKeyPress = OnKeyPress + OnMouseUp = MouseUp Options = [tvoAutoItemHeight, tvoHideSelection, tvoKeepCollapsedNodes, tvoReadOnly, tvoShowButtons, tvoShowLines, tvoShowRoot, tvoToolTips] end object SettingsFormButtonOK: TButton @@ -43,4 +46,30 @@ object SettingsForm: TSettingsForm OnClick = SettingsFormButtonCancelClick TabOrder = 2 end + object DeleteButton: TButton + Left = 120 + Height = 25 + Top = 511 + Width = 120 + Anchors = [akBottom] + Caption = 'Delete Selected' + OnClick = DeleteSelected + TabOrder = 3 + end + object SettingsPopup: TPopupMenu + left = 40 + top = 32 + object PopupRename: TMenuItem + Caption = 'Rename' + OnClick = PopupRenameClick + end + object PopupDelete: TMenuItem + Caption = 'Delete' + OnClick = PopupDeleteClick + end + object PopupCreate: TMenuItem + Caption = 'Create subkey' + OnClick = PopupCreateKey + end + end end diff --git a/Projects/SAMufasaGUI/simbasettings.lrs b/Projects/SAMufasaGUI/simbasettings.lrs index 815128f..2588990 100644 --- a/Projects/SAMufasaGUI/simbasettings.lrs +++ b/Projects/SAMufasaGUI/simbasettings.lrs @@ -4,17 +4,26 @@ LazarusResources.Add('TSettingsForm','FORMDATA',[ 'TPF0'#13'TSettingsForm'#12'SettingsForm'#4'Left'#3'3'#2#6'Height'#3'.'#2#3'T' +'op'#3#173#0#5'Width'#3'h'#1#13'ActiveControl'#7#16'SettingsTreeView'#7'Capt' +'ion'#6#14'Simba Settings'#12'ClientHeight'#3'.'#2#11'ClientWidth'#3'h'#1#8 - +'OnCreate'#7#10'FormCreate'#9'OnDestroy'#7#11'FormDestroy'#10'LCLVersion'#6#6 - +'0.9.29'#0#9'TTreeView'#16'SettingsTreeView'#4'Left'#2#16#6'Height'#3#217#1#3 - +'Top'#2#16#5'Width'#3'D'#1#7'Anchors'#11#5'akTop'#6'akLeft'#7'akRight'#8'akB' - +'ottom'#0#17'DefaultItemHeight'#2#15#8'ReadOnly'#9#10'ScrollBars'#7#10'ssAut' - +'oBoth'#8'TabOrder'#2#0#10'OnDblClick'#7#24'SettingsTreeViewDblClick'#7'Opti' - +'ons'#11#17'tvoAutoItemHeight'#16'tvoHideSelection'#21'tvoKeepCollapsedNodes' - +#11'tvoReadOnly'#14'tvoShowButtons'#12'tvoShowLines'#11'tvoShowRoot'#11'tvoT' - +'oolTips'#0#0#0#7'TButton'#20'SettingsFormButtonOK'#4'Left'#3#9#1#6'Height'#2 - +#25#3'Top'#3#255#1#5'Width'#2'K'#7'Anchors'#11#7'akRight'#8'akBottom'#0#7'Ca' - +'ption'#6#2'OK'#7'OnClick'#7#25'SettingsFormButtonOKClick'#8'TabOrder'#2#1#0 - +#0#7'TButton'#24'SettingsFormButtonCancel'#4'Left'#2#16#6'Height'#2#25#3'Top' - +#3#255#1#5'Width'#2'K'#7'Anchors'#11#6'akLeft'#8'akBottom'#0#7'Caption'#6#6 - +'Cancel'#7'OnClick'#7#29'SettingsFormButtonCancelClick'#8'TabOrder'#2#2#0#0#0 + +'OnCreate'#7#10'FormCreate'#9'OnDestroy'#7#11'FormDestroy'#9'OnMouseUp'#7#7 + +'MouseUp'#10'LCLVersion'#6#6'0.9.29'#0#9'TTreeView'#16'SettingsTreeView'#4'L' + +'eft'#2#16#6'Height'#3#217#1#3'Top'#2#16#5'Width'#3'D'#1#7'Anchors'#11#5'akT' + +'op'#6'akLeft'#7'akRight'#8'akBottom'#0#17'DefaultItemHeight'#2#19#8'ReadOnl' + +'y'#9#10'ScrollBars'#7#10'ssAutoBoth'#8'TabOrder'#2#0#10'OnDblClick'#7#24'Se' + +'ttingsTreeViewDblClick'#10'OnKeyPress'#7#10'OnKeyPress'#9'OnMouseUp'#7#7'Mo' + +'useUp'#7'Options'#11#17'tvoAutoItemHeight'#16'tvoHideSelection'#21'tvoKeepC' + +'ollapsedNodes'#11'tvoReadOnly'#14'tvoShowButtons'#12'tvoShowLines'#11'tvoSh' + +'owRoot'#11'tvoToolTips'#0#0#0#7'TButton'#20'SettingsFormButtonOK'#4'Left'#3 + +#9#1#6'Height'#2#25#3'Top'#3#255#1#5'Width'#2'K'#7'Anchors'#11#7'akRight'#8 + +'akBottom'#0#7'Caption'#6#2'OK'#7'OnClick'#7#25'SettingsFormButtonOKClick'#8 + +'TabOrder'#2#1#0#0#7'TButton'#24'SettingsFormButtonCancel'#4'Left'#2#16#6'He' + +'ight'#2#25#3'Top'#3#255#1#5'Width'#2'K'#7'Anchors'#11#6'akLeft'#8'akBottom' + +#0#7'Caption'#6#6'Cancel'#7'OnClick'#7#29'SettingsFormButtonCancelClick'#8'T' + +'abOrder'#2#2#0#0#7'TButton'#12'DeleteButton'#4'Left'#2'x'#6'Height'#2#25#3 + +'Top'#3#255#1#5'Width'#2'x'#7'Anchors'#11#8'akBottom'#0#7'Caption'#6#15'Dele' + +'te Selected'#7'OnClick'#7#14'DeleteSelected'#8'TabOrder'#2#3#0#0#10'TPopupM' + +'enu'#13'SettingsPopup'#4'left'#2'('#3'top'#2' '#0#9'TMenuItem'#11'PopupRena' + +'me'#7'Caption'#6#6'Rename'#7'OnClick'#7#16'PopupRenameClick'#0#0#9'TMenuIte' + +'m'#11'PopupDelete'#7'Caption'#6#6'Delete'#7'OnClick'#7#16'PopupDeleteClick' + +#0#0#9'TMenuItem'#11'PopupCreate'#7'Caption'#6#13'Create subkey'#7'OnClick'#7 + +#14'PopupCreateKey'#0#0#0#0 ]); diff --git a/Projects/SAMufasaGUI/simbasettings.pas b/Projects/SAMufasaGUI/simbasettings.pas index 2e20b0a..878eadd 100644 --- a/Projects/SAMufasaGUI/simbasettings.pas +++ b/Projects/SAMufasaGUI/simbasettings.pas @@ -6,19 +6,32 @@ interface uses Classes, SysUtils, FileUtil, LResources, Forms, Controls,MufasaBase, Graphics, Dialogs, - ComCtrls, StdCtrls, settings; + ComCtrls, StdCtrls, Menus, settings; type { TSettingsForm } TSettingsForm = class(TForm) + DeleteButton: TButton; + PopupCreate: TMenuItem; + PopupRename: TMenuItem; + PopupDelete: TMenuItem; + SettingsPopup: TPopupMenu; SettingsFormButtonCancel: TButton; SettingsFormButtonOK: TButton; SettingsTreeView: TTreeView; Settings: TMMLSettings; + procedure DeleteSelected(Sender: TObject); + procedure MouseUp(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: Integer); + procedure OnKeyPress(Sender: TObject; var Key: char); + procedure PopupCreateKey(Sender: TObject); + procedure PopupDeleteClick(Sender: TObject); + procedure PopupRenameClick(Sender: TObject); procedure SettingsFormButtonCancelClick(Sender: TObject); procedure SettingsFormButtonOKClick(Sender: TObject); + procedure DeleteANode(N: TTreeNode); procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure SettingsTreeViewDblClick(Sender: TObject); @@ -35,6 +48,8 @@ var implementation +uses LCLtype; + { TSettingsForm } procedure TSettingsForm.FormCreate(Sender: TObject); @@ -73,11 +88,121 @@ begin Self.ModalResult:=mrOK; end; +procedure TSettingsForm.MouseUp(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: Integer); +var + N: TTreeNode; +begin + if Button = mbRight then + begin + N := SettingsTreeView.GetNodeAt(X, Y); + if N = nil then + exit; + SettingsTreeView.Selected := N; + SettingsPopup.PopUp(); + end; +end; + +procedure TSettingsForm.OnKeyPress(Sender: TObject; var Key: char); +var + N: TTreeNode; +begin + if (Ord(Key) = VK_DELETE) or (Ord(Key) = VK_BACK) then + begin + N := SettingsTreeView.Selected; + if N = nil then + exit; + DeleteANode(N); + end; +end; + +procedure TSettingsForm.PopupCreateKey(Sender: TObject); +var + KeyName, P: String; + N, NN: TTreeNode; +begin + N := SettingsTreeView.Selected; + if N = nil then + exit; + + if N.Data <> nil then + exit; + + if N.GetFirstChild = nil then + exit; + + if N.GetFirstChild.Data <> nil then + exit; + + KeyName := InputBox('Create new Key', 'Please enter the key name', ''); + + if KeyName = '' then + exit; + P := Settings.GetNodePath(N); + + if Settings.CreateKey(P + '/' + NN.Text) then + begin + NN := TTreeNode.Create(SettingsTreeView.Items); + + NN.Text := KeyName; + + NN.MoveTo(N,naAddChild); + end; +end; + + procedure TSettingsForm.FormDestroy(Sender: TObject); begin Settings.Free; end; +procedure TSettingsForm.PopupDeleteClick(Sender: TObject); +begin + DeleteSelected(Sender); +end; + +procedure TSettingsForm.PopupRenameClick(Sender: TObject); +var + N: TTreeNode; + MBox, Path: String; +begin + N := SettingsTreeView.Selected; + if N = nil then + exit; + + MBox := InputBox('Rename', 'Please fill in the new name', ''); + if MBox = '' then + exit; + + if Settings.RenameKey(Path, MBox) then + N.Text := MBox; +end; + +procedure TSettingsForm.DeleteSelected(Sender: TObject); +var + N: TTreeNode; +begin + N := SettingsTreeView.Selected; + if N = nil then + exit; + DeleteANode(N); +end; + +procedure TSettingsForm.DeleteANode(N: TTreeNode); +var + Path: String; +begin + if N = nil then + exit; + if MessageDlg('Delete a setting', 'Are you sure you want to delete this setting?', mtWarning, [mbYes, mbNo], 0) = mrNo then + exit; + + Path := Settings.GetNodePath(N); + Settings.DeleteKey(Path); + N.DeleteChildren; + N.Delete; +end; + procedure TSettingsForm.SettingsTreeViewDblClick(Sender: TObject); var p, pp: TPoint; diff --git a/Units/MMLAddon/settings.pas b/Units/MMLAddon/settings.pas index b142b79..004823c 100644 --- a/Units/MMLAddon/settings.pas +++ b/Units/MMLAddon/settings.pas @@ -334,6 +334,9 @@ begin Exit(''); end; +{ + newKey is not the entire key path. +} function TMMLSettings.RenameKey(oldKey, newKey: string): boolean; var Node : TTreeNode; From 6fe68d12673707e899eaad9ec96ae8d3da0a841b Mon Sep 17 00:00:00 2001 From: Raymond Date: Sun, 4 Apr 2010 13:21:28 +0200 Subject: [PATCH 14/22] Added destructor for the paramhints. --- Units/Misc/v_autocompleteform.pas | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Units/Misc/v_autocompleteform.pas b/Units/Misc/v_autocompleteform.pas index 14b86b0..a4e49c6 100644 --- a/Units/Misc/v_autocompleteform.pas +++ b/Units/Misc/v_autocompleteform.pas @@ -99,6 +99,7 @@ type procedure DrawHints(var MaxWidth, MaxHeight: Integer; Draw: boolean); function PrepareParamString(out Str : string; out MustHide : boolean) : integer; public + destructor Destroy; override; constructor Create(TheOwner: TComponent); override; procedure CalculateBounds; procedure UpdateHint; @@ -706,6 +707,12 @@ begin Parser.Free; end; +destructor TParamHint.Destroy; +begin + Application.RemoveOnIdleHandler(@ApplicationIdle); + inherited Destroy; +end; + constructor TParamHint.Create(TheOwner: TComponent); begin From 72539efffdb21352040aa375f74b5855aaddeb57 Mon Sep 17 00:00:00 2001 From: Raymond Date: Mon, 5 Apr 2010 00:35:49 +0200 Subject: [PATCH 15/22] Added 'LoadSystemFont' which allows you to load a font based on one of your system fonts (just like LoadChars2 in scar). --- Projects/SAMufasaGUI/testunit.pas | 4 +- Tests/PS/loadsystemfont.simb | 14 ++ Units/MMLAddon/PSInc/Wrappers/ocr.inc | 21 +- Units/MMLAddon/PSInc/psexportedmethods.inc | 15 +- Units/MMLAddon/mmlpsthread.pas | 2 +- Units/MMLCore/bitmaps.pas | 4 +- Units/MMLCore/fontloader.pas | 126 +++++++---- Units/MMLCore/mufasatypes.pas | 1 + Units/MMLCore/ocr.pas | 108 +++++---- Units/MMLCore/ocrutil.pas | 242 ++++++++++----------- 10 files changed, 297 insertions(+), 240 deletions(-) create mode 100644 Tests/PS/loadsystemfont.simb diff --git a/Projects/SAMufasaGUI/testunit.pas b/Projects/SAMufasaGUI/testunit.pas index 58631b5..eef3fa6 100644 --- a/Projects/SAMufasaGUI/testunit.pas +++ b/Projects/SAMufasaGUI/testunit.pas @@ -1246,10 +1246,10 @@ begin begin Self.OCR_Fonts := TMOCR.Create(Thread.Client); OCR_Fonts.InitTOCR(fontPath); - Thread.Client.MOCR.SetFonts(OCR_Fonts.GetFonts); + Thread.Client.MOCR.Fonts := OCR_Fonts.Fonts end else if assigned(Self.OCR_Fonts) and loadFontsOnScriptStart then - Thread.Client.MOCR.SetFonts(OCR_Fonts.GetFonts); + Thread.Client.MOCR.Fonts := OCR_Fonts.Fonts; Se := TMMLSettingsSandbox.Create(SettingsForm.Settings); Se.Prefix := 'Scripts/'; diff --git a/Tests/PS/loadsystemfont.simb b/Tests/PS/loadsystemfont.simb new file mode 100644 index 0000000..828bfdd --- /dev/null +++ b/Tests/PS/loadsystemfont.simb @@ -0,0 +1,14 @@ +program new; +var + Font : TFont; +begin + Font := TFont.Create; + Font.Name := 'Courier New'; + Font.Size := 10; + Font.Style := []; + LoadSystemFont(Font,'test'); + DisplayDebugImgWindow(0,0); + DisplayDebugImgWindow(150,50); + DrawBitmapDebugImg(BitmapFromText('BMP[0] has not been freed','test')); + Font.free; +end. diff --git a/Units/MMLAddon/PSInc/Wrappers/ocr.inc b/Units/MMLAddon/PSInc/Wrappers/ocr.inc index af136df..fcc847b 100644 --- a/Units/MMLAddon/PSInc/Wrappers/ocr.inc +++ b/Units/MMLAddon/PSInc/Wrappers/ocr.inc @@ -1,14 +1,14 @@ -function rs_GetUpText: String; extdecl; +function ps_rs_GetUpText: String; extdecl; begin Result := CurrThread.Client.MOCR.GetUpTextAtEx(7, 7, true); end; -function rs_GetUpTextAt(x, y : integer): string; extdecl; +function ps_rs_GetUpTextAt(x, y : integer): string; extdecl; begin result := CurrThread.Client.MOCR.GetUpTextAtEx(x,y,true); end; -function BitmapFromText(text, font: String): integer; extdecl; +function ps_BitmapFromText(const text, font: String): integer; extdecl; var bmp: TMufasaBitmap; begin @@ -16,23 +16,28 @@ begin Result := CurrThread.Client.MBitmaps.AddBMP(bmp); end; -function MaskFromText(text, font: String): TMask; extdecl; +function ps_MaskFromText(const text, font: String): TMask; extdecl; begin Result := CurrThread.Client.MOCR.TextToMask(text,font); end; -procedure TPAFromTextWrap(text, font: String;out w,h : integer;out TPA : TPointArray); extdecl; +procedure ps_TPAFromTextWrap(const text, font: String;out w,h : integer;out TPA : TPointArray); extdecl; begin TPA := CurrThread.Client.MOCR.TextToFontTPA(text, font, w, h); end; -function TPAFromText(text, font: String;out w,h : integer): TPointArray; extdecl; +function ps_TPAFromText(const text, font: String;out w,h : integer): TPointArray; extdecl; begin Result := CurrThread.Client.MOCR.TextToFontTPA(text, font, w, h); end; -function GetTextAt(atX, atY, minvspacing, maxvspacing, hspacing, - color, tol, len: integer; font: string): string; extdecl; +function ps_GetTextAt(const atX, atY, minvspacing, maxvspacing, hspacing, + color, tol, len: integer;const font: string): string; extdecl; begin result := CurrThread.Client.MOCR.GetTextAt(atx,aty,minvspacing,maxvspacing,hspacing,color,tol,len,font); end; + +function ps_LoadSystemFont(const SysFont : TFont; const FontName : string) : boolean;extdecl; +begin + result := CurrThread.Client.MOCR.Fonts.LoadSystemFont(SysFont,FontName); +end; diff --git a/Units/MMLAddon/PSInc/psexportedmethods.inc b/Units/MMLAddon/PSInc/psexportedmethods.inc index e8d5c16..d836ffa 100644 --- a/Units/MMLAddon/PSInc/psexportedmethods.inc +++ b/Units/MMLAddon/PSInc/psexportedmethods.inc @@ -230,13 +230,14 @@ AddFunction(@GetKeyCode,'function GetKeyCode(c : char) : integer;'); { OCR} SetCurrSection('OCR'); -AddFunction(@rs_GetUpText, 'function rs_GetUpText: string;'); -AddFunction(@rs_GetUpTextAt, 'function rs_GetUpTextAt(x, y : integer): string;'); -AddFunction(@BitmapFromText, 'function BitmapFromText(text, font: String): integer;'); -AddFunction(@TPAFromText, 'function TPAFromText(text, font: String;var w,h : integer): TPointArray;'); -AddFunction(@TPAFromTextWrap,'procedure TPAFromTextWrap(text, font: String;var w,h : integer;var TPA : TPointArray);'); -AddFunction(@MaskFromText, 'function MaskFromText(text, font: String): TMask;'); -AddFunction(@GetTextAt,'function GetTextAt(atX, atY, minvspacing, maxvspacing, hspacing,color, tol, len: integer; font: string): string;'); +AddFunction(@ps_rs_GetUpText, 'function rs_GetUpText: string;'); +AddFunction(@ps_rs_GetUpTextAt, 'function rs_GetUpTextAt(x, y : integer): string;'); +AddFunction(@ps_BitmapFromText, 'function BitmapFromText(const text, font: String): integer;'); +AddFunction(@ps_TPAFromText, 'function TPAFromText(const text, font: String;var w,h : integer): TPointArray;'); +AddFunction(@ps_TPAFromTextWrap,'procedure TPAFromTextWrap(const text, font: String;var w,h : integer;var TPA : TPointArray);'); +AddFunction(@ps_MaskFromText, 'function MaskFromText(const text, font: String): TMask;'); +AddFunction(@ps_GetTextAt,'function GetTextAt(const atX, atY, minvspacing, maxvspacing, hspacing,color, tol, len: integer;const font: string): string;'); +AddFunction(@ps_LoadSystemFont,'function LoadSystemFont(const SysFont : TFont; const FontName : string) : boolean;'); {Bitmaps} SetCurrSection('Bitmaps'); diff --git a/Units/MMLAddon/mmlpsthread.pas b/Units/MMLAddon/mmlpsthread.pas index c746345..c0d7d03 100644 --- a/Units/MMLAddon/mmlpsthread.pas +++ b/Units/MMLAddon/mmlpsthread.pas @@ -572,7 +572,7 @@ var Fonts : TMFonts; begin {$I PSInc/pscompile.inc} - Fonts := Client.MOCR.GetFonts; + Fonts := Client.MOCR.Fonts; for i := fonts.count - 1 downto 0 do Sender.Comp.AddConstantN(Fonts[i].Name,'string').SetString(Fonts[i].Name); diff --git a/Units/MMLCore/bitmaps.pas b/Units/MMLCore/bitmaps.pas index ae98245..b41c8aa 100644 --- a/Units/MMLCore/bitmaps.pas +++ b/Units/MMLCore/bitmaps.pas @@ -580,9 +580,9 @@ end; procedure TMufasaBitmap.LoadFromTBitmap(bmp: TBitmap); begin - bmp.BeginUpdate(); +// bmp.BeginUpdate(); LoadFromRawImage(bmp.RawImage); - bmp.EndUpdate(); +// bmp.EndUpdate(); end; procedure TMufasaBitmap.FastSetPixel(x, y: integer; Color: TColor); diff --git a/Units/MMLCore/fontloader.pas b/Units/MMLCore/fontloader.pas index 5dd2d86..b1db0a4 100644 --- a/Units/MMLCore/fontloader.pas +++ b/Units/MMLCore/fontloader.pas @@ -28,7 +28,7 @@ unit fontloader; interface uses - Classes, SysUtils, + Classes, SysUtils,Graphics,bitmaps, ocrutil,lclintf; // contains the actual `loading' { @@ -36,42 +36,36 @@ uses } type - TMFont = class(TObject) - constructor Create; - destructor Destroy; override; + TMFont = class(TObject) + public + Name: String; + Data: TOcrData; + constructor Create; + destructor Destroy; override; + function Copy: TMFont; + end; + { TMFonts } - function Copy: TMFont; - public - Name: String; - Data: TOcrData; - end; - - -type - - { TMFonts } - - TMFonts = class(TObject) - private - function GetFontIndex(Name: String): Integer; - function GetFontByIndex(Index : integer): TMfont; - private - Fonts: TList; - Path: String; - Client : TObject; - public - constructor Create(Owner : TObject); - destructor Destroy; override; - - function GetFont(Name: String): TOcrData; - function FreeFont(Name: String): boolean; - function LoadFont(Name: String; Shadow: Boolean): boolean; - procedure SetPath(aPath: String); - function GetPath: String; - function Copy(Owner : TObject): TMFonts; - function Count : integer; - property Font[Index : integer]: TMfont read GetFontByIndex; default; - end; + TMFonts = class(TObject) + private + Fonts: TList; + Path: String; + Client : TObject; + function GetFontIndex(const Name: String): Integer; + function GetFontByIndex(Index : integer): TMfont; + public + constructor Create(Owner : TObject); + destructor Destroy; override; + function GetFont(const Name: String): TOcrData; + function FreeFont(const Name: String): Boolean; + function LoadFont(const Name: String; Shadow: Boolean): boolean; + function LoadSystemFont(const SysFont : TFont; const FontName : string) : boolean; + procedure SetPath(const aPath: String); + function GetPath: String; + function Copy(Owner : TObject): TMFonts; + function Count : integer; + property Font[Index : integer]: TMfont read GetFontByIndex; default; + end; implementation @@ -159,7 +153,7 @@ begin inherited; end; -procedure TMFonts.SetPath(aPath: String); +procedure TMFonts.SetPath(const aPath: String); begin Path := aPath; end; @@ -169,20 +163,20 @@ begin Exit(Path); end; -function TMFonts.GetFontIndex(Name: String): Integer; +function TMFonts.GetFontIndex(const Name: String): Integer; var i: integer; begin for i := 0 to Fonts.Count - 1 do begin - if Name = TMFont(Fonts.Items[i]).Name then + if lowercase(Name) = lowercase(TMFont(Fonts.Items[i]).Name) then Exit(i); end; raise Exception.Create('Font [' + Name + '] not found.'); Exit(-1); end; -function TMFonts.GetFont(Name: String): TOcrData; +function TMFonts.GetFont(const Name: String): TOcrData; var i: integer; begin @@ -190,7 +184,7 @@ begin Exit(TMFont(Fonts.Items[i]).Data); end; -function TMFonts.FreeFont(Name: String): boolean; +function TMFonts.FreeFont(const Name: String): boolean; var i: integer; begin @@ -203,7 +197,7 @@ begin end; end; -function TMFonts.LoadFont(Name: String; Shadow: Boolean): boolean; +function TMFonts.LoadFont(const Name: String; Shadow: Boolean): boolean; var f: TMFont; begin @@ -217,13 +211,59 @@ begin f.Name := Name; if Shadow then F.Name := F.Name + '_s'; - f.Data := InitOCR(Path + Name + DS, Shadow); + f.Data := InitOCR( LoadGlyphMasks(Path + Name + DS, Shadow)); Fonts.Add(f); {$IFDEF FONTDEBUG} TClient(Client).Writeln('Loaded Font ' + f.Name); {$ENDIF} end; +function TMFonts.LoadSystemFont(const SysFont: TFont; const FontName: string): boolean; +var + Masks : TocrGlyphMaskArray; + i,c : integer; + w,h : integer; + Bmp : TBitmap; + NewFont : TMFont; + MBmp : TMufasaBitmap; +begin + SetLength(Masks,255); + MBmp := TMufasaBitmap.Create; + Bmp := TBitmap.Create; + c := 0; + with Bmp.canvas do + begin + Font := SysFont; + Font.Color:= clWhite; + Font.Quality:= fqNonAntialiased; + Brush.Color:= clBlack; + Pen.Style:= psClear; + for i := 1 to 255 do + begin + GetTextSize(chr(i),w,h); + if (w<=0) or (h<=0) then + Continue; + Bmp.SetSize(w,h); + TextOut(0,0,chr(i)); + MBmp.LoadFromTBitmap(bmp); + Masks[c] := LoadGlyphMask(MBmp,false,chr(i)); + inc(c); + end; + end; + setlength(masks,c); + if c > 0 then + begin + NewFont := TMFont.Create; + NewFont.Name:= FontName; + NewFont.Data := InitOCR(masks); + Fonts.Add(NewFont); + result := true; + end; + bmp.free; + MBmp.free; + +end; + function TMFonts.Copy(Owner : TObject): TMFonts; var diff --git a/Units/MMLCore/mufasatypes.pas b/Units/MMLCore/mufasatypes.pas index 3c92634..5b1c65b 100644 --- a/Units/MMLCore/mufasatypes.pas +++ b/Units/MMLCore/mufasatypes.pas @@ -54,6 +54,7 @@ type B, G, R, A: Byte; end; PRGB32 = ^TRGB32; + TRGB32Array = array of TRGB32; TRetData = record Ptr : PRGB32; diff --git a/Units/MMLCore/ocr.pas b/Units/MMLCore/ocr.pas index 0b1ef32..fec2ef9 100644 --- a/Units/MMLCore/ocr.pas +++ b/Units/MMLCore/ocr.pas @@ -33,53 +33,51 @@ uses graphtype, intfgraphics,graphics; {End To-Remove unit} - type - { TMOCR } +type + { TMOCR } - TMOCR = class(TObject) - constructor Create(Owner: TObject); - destructor Destroy; override; - function InitTOCR(path: string): boolean; - function GetFonts:TMFonts; - procedure SetFonts(NewFonts: TMFonts); + TMOCR = class(TObject) + private + Client: TObject; + FFonts: TMFonts; + {$IFDEF OCRDEBUG} + debugbmp: TMufasaBitmap; + {$ENDIF} + function GetFonts:TMFonts; + procedure SetFonts(NewFonts: TMFonts); + public + constructor Create(Owner: TObject); + destructor Destroy; override; + function InitTOCR(const path: string): boolean; + function getTextPointsIn(sx, sy, w, h: Integer; shadow: boolean; + var _chars, _shadows: T2DPointArray): Boolean; + function GetUpTextAtEx(atX, atY: integer; shadow: boolean): string; + function GetUpTextAt(atX, atY: integer; shadow: boolean): string; - function getTextPointsIn(sx, sy, w, h: Integer; shadow: boolean; - var _chars, _shadows: T2DPointArray): Boolean; - function GetUpTextAtEx(atX, atY: integer; shadow: boolean): string; - function GetUpTextAt(atX, atY: integer; shadow: boolean): string; + procedure FilterUpTextByColour(bmp: TMufasaBitmap; w,h: integer); + procedure FilterUpTextByCharacteristics(bmp: TMufasaBitmap; w,h: integer); + procedure FilterShadowBitmap(bmp: TMufasaBitmap); + procedure FilterCharsBitmap(bmp: TMufasaBitmap); - procedure FilterUpTextByColour(bmp: TMufasaBitmap; w,h: integer); - procedure FilterUpTextByCharacteristics(bmp: TMufasaBitmap; w,h: integer); - procedure FilterShadowBitmap(bmp: TMufasaBitmap); - procedure FilterCharsBitmap(bmp: TMufasaBitmap); + function GetTextAt(atX, atY, minvspacing, maxvspacing, hspacing, + color, tol, len: integer; font: string): string; + function TextToFontTPA(Text, font: String; out w, h: integer): TPointArray; + function TextToFontBitmap(Text, font: String): TMufasaBitmap; + function TextToMask(Text, font: String): TMask; + property Fonts : TMFonts read GetFonts write SetFonts; + {$IFDEF OCRDEBUG} + procedure DebugToBmp(bmp: TMufasaBitmap; hmod,h: integer); + {$ENDIF} + end; - function GetTextAt(atX, atY, minvspacing, maxvspacing, hspacing, - color, tol, len: integer; font: string): string; - function TextToFontTPA(Text, font: String; out w, h: integer): TPointArray; - function TextToFontBitmap(Text, font: String): TMufasaBitmap; - function TextToMask(Text, font: String): TMask; - - - {$IFDEF OCRDEBUG} - procedure DebugToBmp(bmp: TMufasaBitmap; hmod,h: integer); - {$ENDIF} - private - Client: TObject; - Fonts: TMFonts; - {$IFDEF OCRDEBUG} - public - debugbmp: TMufasaBitmap; - {$ENDIF} - - end; - {$IFDEF OCRDEBUG} - {$IFDEF LINUX} - const OCRDebugPath = '/tmp/'; - {$ELSE} - const OCRDebugPath = ''; - {$ENDIF} - {$ENDIF} + {$IFDEF OCRDEBUG} + {$IFDEF LINUX} + const OCRDebugPath = '/tmp/'; + {$ELSE} + const OCRDebugPath = ''; + {$ENDIF} + {$ENDIF} implementation uses @@ -121,15 +119,13 @@ constructor TMOCR.Create(Owner: TObject); begin inherited Create; Self.Client := Owner; - Self.Fonts := TMFonts.Create(Owner); + Self.FFonts := TMFonts.Create(Owner); end; { Destructor } destructor TMOCR.Destroy; - begin - - Self.Fonts.Free; + Self.FFonts.Free; inherited Destroy; end; @@ -137,34 +133,34 @@ end; InitTOCR loads all fonts in path We don't do this in the constructor because we may not yet have the path. } -function TMOCR.InitTOCR(path: string): boolean; +function TMOCR.InitTOCR(const path: string): boolean; var dirs: array of string; i: longint; begin // We're going to load all fonts now - Fonts.SetPath(path); + FFonts.SetPath(path); dirs := GetDirectories(path); Result := false; for i := 0 to high(dirs) do begin - if Fonts.LoadFont(dirs[i], false) then + if FFonts.LoadFont(dirs[i], false) then result := true; end; If DirectoryExists(path + 'UpChars') then - Fonts.LoadFont('UpChars', true); // shadow + FFonts.LoadFont('UpChars', true); // shadow end; { Get the current pointer to our list of Fonts } function TMOCR.GetFonts:TMFonts; begin - Exit(Self.Fonts); + Exit(Self.FFonts); end; { Set new Fonts. We set it to a Copy of NewFonts } procedure TMOCR.SetFonts(NewFonts: TMFonts); begin - Self.Fonts := NewFonts.Copy(Self.Client); + Self.FFonts := NewFonts.Copy(Self.Client); end; { @@ -644,12 +640,12 @@ begin if shadow then begin - font := Fonts.GetFont('UpChars_s'); + font := FFonts.GetFont('UpChars_s'); thachars := shadows; end else begin - font := Fonts.GetFont('UpChars'); + font := FFonts.GetFont('UpChars'); thachars := chars; end; @@ -714,7 +710,7 @@ var STPA: T2DPointArray; begin - fD := Fonts.GetFont(font); + fD := FFonts.GetFont(font); {writeln(format('W, H: %d, %d', [fD.max_width, fd.max_height]));} TClient(Client).IOManager.GetDimensions(w, h); @@ -827,7 +823,7 @@ var an: integer; begin - fontD := Fonts.GetFont(font); + fontD := FFonts.GetFont(font); c := 0; off := 0; setlength(result, 0); diff --git a/Units/MMLCore/ocrutil.pas b/Units/MMLCore/ocrutil.pas index 0896777..2b72c02 100644 --- a/Units/MMLCore/ocrutil.pas +++ b/Units/MMLCore/ocrutil.pas @@ -5,7 +5,7 @@ unit ocrutil; interface uses - Classes, SysUtils, MufasaTypes; + Classes, SysUtils, MufasaTypes,bitmaps; type TNormArray = array of integer; @@ -34,17 +34,10 @@ type TocrDataArray = array of TocrData; - { We already have PRGB32 -> To be removed later } - type - tRGB = packed record - B, G, R, A: Byte; - end; - tRGBArray = array of tRGB; - {Begin To be removed} Tbmp = record - data: array of tRGB; - width,height: integer; + data: array of TRGB32; + width,height: integer; end; {End To be removed} @@ -54,11 +47,12 @@ type end; procedure findBounds(glyphs: TocrGlyphMaskArray; out width,height: integer); - function LoadGlyphMasks(path: string; shadow: boolean): TocrGlyphMaskArray; - function InitOCR(path: string; shadow: boolean): TocrData; + function LoadGlyphMask(const bmp : TMufasaBitmap; shadow: boolean; const ascii : char): TocrGlyphMask; + function LoadGlyphMasks(const path: string; shadow: boolean): TocrGlyphMaskArray; + function InitOCR(const Masks : TocrGlyphMaskArray): TocrData; function GuessGlyph(glyph: TNormArray; ocrdata: TocrData): char; function PointsToNorm(points: TpointArray; out w,h: integer): TNormArray; - function ImageToNorm(src: tRGBArray; w,h: integer): TNormArray; + function ImageToNorm(src: TRGB32Array; w,h: integer): TNormArray; function ocrDetect(txt: TNormArray; w,h: integer; var ocrdata: TocrData): string; function ExtractText(colors: PRGB32;{colors: tRGBArray;} w,h: integer): TNormArray; function MakeTPAString(str: string): TpointArray; @@ -85,7 +79,7 @@ begin Result.width := LazIntf.Width; Result.height := LazIntf.Height; SetLength(result.data,LazIntf.Width*LazIntf.Height); - Move(LazIntf.PixelData[0],result.data[0],LazIntf.Width*LazIntf.Height*sizeOf(tRGB)); + Move(LazIntf.PixelData[0],result.data[0],LazIntf.Width*LazIntf.Height*sizeOf(TRGB32)); LazIntf.Free; end; end; @@ -152,107 +146,113 @@ begin end; end; -{This Loads the actual data from the .bmp, but does not init all fields} -function LoadGlyphMasks(path: string; shadow: boolean): TocrGlyphMaskArray; +function LoadGlyphMask(const bmp: TMufasaBitmap; shadow: boolean; const ascii : char): TocrGlyphMask; var - strs: array of string; - bmp: array of Tbmp; {-> TMufasaBitmap, and why use an array? } - len,size,i,j: integer; - color: tRGB; - shadow_i: byte; + size,j: integer; + color: TRGB32; + shadow_i: byte; begin - strs:= GetFiles(path,'bmp'); - len:= length(strs); - SetLength(result,len); - SetLength(bmp,len); - if shadow then - shadow_i := 0 + if shadow then + shadow_i := 0 + else + shadow_i := 255; + size:= bmp.Width * bmp.Height; + SetLength(result.mask,size); + for j := 0 to size-1 do + begin + color := bmp.FData[j]; + { if (color.r = 255) and (color.g = 255 and not shadow_i) and + (color.b = 255 and not shadow_i) then} + if (color.r = 255) and (color.g = shadow_i) and (color.b = shadow_i) then + result.mask[j]:= 1 else - shadow_i := 255; - for i:= 0 to len-1 do - begin - bmp[i]:= ReadBmp(path + strs[i]); - size:= bmp[i].width*bmp[i].height; - SetLength(result[i].mask,size); - for j:= 0 to size-1 do - begin - color:= bmp[i].data[j]; - { if (color.r = 255) and (color.g = 255 and not shadow_i) and - (color.b = 255 and not shadow_i) then} - if (color.r = 255) and (color.g = shadow_i) and (color.b = shadow_i) then - result[i].mask[j]:= 1 - else - result[i].mask[j]:= 0; - end; - result[i].width:= bmp[i].width; - result[i].height:= bmp[i].height; - SetLength(strs[i],Length(strs[i])-4); - result[i].ascii:= chr(strtoint(strs[i])); - end; + result.mask[j]:= 0; + end; + result.width:= bmp.width; + result.height:= bmp.height; + result.ascii:= ascii; +end; + +{This Loads the actual data from the .bmp, but does not init all fields} +function LoadGlyphMasks(const path: string; shadow: boolean): TocrGlyphMaskArray; +var + strs: array of string; + bmp : TMufasaBitmap; + len,i: integer; +begin + strs:= GetFiles(path,'bmp'); + len:= length(strs); + SetLength(result,len); + bmp := TMufasaBitmap.Create; + for i:= 0 to len-1 do + begin + bmp.LoadFromFile(path + strs[i]); + SetLength(strs[i],Length(strs[i])-4); + Result[i] := LoadGlyphMask(bmp,shadow,chr(strtoint(strs[i]))); + end; + Bmp.free; end; {Fully initalizes a TocrData structure, this is LoadFont or whatever, call it first} -function InitOCR(path: string; shadow: boolean): TocrData; +function InitOCR(const masks : TocrGlyphMaskArray): TocrData; var - masks: TocrGlyphMaskArray; - t,b,l,r,w,h,mw: integer; - x,y: integer; - c,i,len,size: integer; - pos: integer; - ascii: char; + t,b,l,r,w,h,mw: integer; + x,y: integer; + c,i,len,size: integer; + pos: integer; + ascii: char; begin - masks:= LoadGlyphMasks(path, shadow); - w:= 0; - h:= 0; - findBounds(masks,w,h); - len:= Length(masks); - result.width:= w; - result.height:= h; - result.max_width:=0; - result.max_height:=0; - size:= w * h; - SetLength(result.pos,len,size); - SetLength(result.pos_adj,len); - SetLength(result.neg,len,size); - SetLength(result.neg_adj,len); - SetLength(result.map,len); - for i:= 0 to len - 1 do + w:= 0; + h:= 0; + findBounds(masks,w,h); + len:= Length(masks); + result.width:= w; + result.height:= h; + result.max_width:=0; + result.max_height:=0; + size:= w * h; + SetLength(result.pos,len,size); + SetLength(result.pos_adj,len); + SetLength(result.neg,len,size); + SetLength(result.neg_adj,len); + SetLength(result.map,len); + for i:= 0 to len - 1 do + begin + ascii:= masks[i].ascii; + pos:= 0; + l:= masks[i].l; + r:= masks[i].r; + b:= masks[i].b; + t:= masks[i].t; + mw:= masks[i].width; + for y:= t to b do begin - ascii:= masks[i].ascii; - pos:= 0; - l:= masks[i].l; - r:= masks[i].r; - b:= masks[i].b; - t:= masks[i].t; - mw:= masks[i].width; - for y:= t to b do + for x:= l to r do + begin + c:= (x-l) + (y-t)*w; + if masks[i].mask[x+y*mw] <> 0 then begin - for x:= l to r do - begin - c:= (x-l) + (y-t)*w; - if masks[i].mask[x+y*mw] <> 0 then - begin - result.pos[i][c]:= 1; - inc(pos); - end else - result.pos[i][c] := 0; - end; - end; - for c:= 0 to size-1 do - result.neg[i][c]:= 1 - result.pos[i][c]; - if pos = 0 then result.neg_adj[i]:= 1 else result.neg_adj[i]:= 1 / pos; - if pos = 0 then result.pos_adj[i]:= 0 else result.pos_adj[i]:= 1 / pos; - result.map[i]:= ascii; - result.ascii[ord(ascii)].index:= i; - result.ascii[ord(ascii)].xoff:= masks[i].l; - result.ascii[ord(ascii)].yoff:= masks[i].t; - result.ascii[ord(ascii)].width:= masks[i].width; - result.ascii[ord(ascii)].height:= masks[i].height; - result.max_width := max(result.max_width, masks[i].width); - result.max_height := max(result.max_height, masks[i].height); + result.pos[i][c]:= 1; + inc(pos); + end else + result.pos[i][c] := 0; + end; end; - result.inputs:= size; - result.outputs:= len; + for c:= 0 to size-1 do + result.neg[i][c]:= 1 - result.pos[i][c]; + if pos = 0 then result.neg_adj[i]:= 1 else result.neg_adj[i]:= 1 / pos; + if pos = 0 then result.pos_adj[i]:= 0 else result.pos_adj[i]:= 1 / pos; + result.map[i]:= ascii; + result.ascii[ord(ascii)].index:= i; + result.ascii[ord(ascii)].xoff:= masks[i].l; + result.ascii[ord(ascii)].yoff:= masks[i].t; + result.ascii[ord(ascii)].width:= masks[i].width; + result.ascii[ord(ascii)].height:= masks[i].height; + result.max_width := max(result.max_width, masks[i].width); + result.max_height := max(result.max_height, masks[i].height); + end; + result.inputs:= size; + result.outputs:= len; end; {guesses a glyph stored in glyph (which is an 1-0 image of the size specified by width and height in ocrdata} @@ -316,7 +316,7 @@ begin result:= norm; end; -function ImageToNorm(src: tRGBArray; w,h: integer): TNormArray; +function ImageToNorm(src: TRGB32Array; w,h: integer): TNormArray; var norm: TNormArray; i: integer; @@ -417,14 +417,14 @@ begin end; end; -function AvgColors(color1:tRGB; weight1: integer; color2: tRGB; weight2: integer): tRGB; +function AvgColors(color1:TRGB32; weight1: integer; color2: TRGB32; weight2: integer): TRGB32; begin result.r:= (color1.r * weight1 + color2.r * weight2) div (weight1 + weight2); result.g:= (color1.g * weight1 + color2.g * weight2) div (weight1 + weight2); result.b:= (color1.b * weight1 + color2.b * weight2) div (weight1 + weight2); end; -procedure RGBtoXYZ(color: tRGB; out X, Y, Z: real); inline; +procedure RGBtoXYZ(color: TRGB32; out X, Y, Z: real); inline; var nr,ng,nb: real; begin @@ -447,7 +447,7 @@ begin result:= 7.787037037*i + 0.137931034; end; -function ColortoLab(c: tRGB): tLab; inline; +function ColortoLab(c: TRGB32): tLab; inline; var X,Y,Z,sum,Xn,Yn,Zn: real; begin @@ -467,7 +467,7 @@ begin result.b:= 500.0*(labmod(y/yn)-labmod(z/zn)); end; -function colorDistSqr(a,b:tRGB): integer; inline; +function colorDistSqr(a,b:TRGB32): integer; inline; begin result:= (a.r-b.r)*(a.r-b.r)+(a.b-b.b)*(a.b-b.b)+(a.g-b.g)*(a.g-b.g); end; @@ -475,20 +475,20 @@ end; function ExtractText(colors: PRGB32;{colors: tRGBArray;} w,h: integer): TNormArray; const GradientMax = 2.0; - white: tRGB = ( b: $FF; g: $FF; r: $FF; a: $00 ); - cyan: tRGB = ( b: $FF; g: $FF; r: $00; a: $00 ); - yellow: tRGB = ( b: $00; g: $EF; r: $FF; a: $00 ); - red: tRGB = ( b: $00; g: $00; r: $FF; a: $00 ); - green: tRGB = ( b: $00; g: $FF; r: $00; a: $00 ); + white: TRGB32= ( b: $FF; g: $FF; r: $FF; a: $00 ); + cyan: TRGB32= ( b: $FF; g: $FF; r: $00; a: $00 ); + yellow: TRGB32= ( b: $00; g: $EF; r: $FF; a: $00 ); + red: TRGB32= ( b: $00; g: $00; r: $FF; a: $00 ); + green: TRGB32= ( b: $00; g: $FF; r: $00; a: $00 ); var up, left: boolean; len,numblobs,thisblob,lastblob,i,j,used: integer; blobbed,blobcount,stack: array of integer; labs: array of tLab; a,b: tLab; - blobcolor: tRGBArray; + blobcolor: TRGB32Array; newcolors: array of integer; - c: tRGB; + c: TRGB32; norm: TNormArray; begin len:= w*h; @@ -498,7 +498,7 @@ begin SetLength(stack,len); SetLength(labs,len); for i:= 0 to len-1 do - labs[i]:= ColorToLab(tRGB(colors[i])); + labs[i]:= ColorToLab( TRGB32(colors[i])); numblobs:= 0; for i:= 0 to len-1 do begin @@ -519,7 +519,7 @@ begin begin thisblob:= blobbed[i-w]; blobbed[i]:= thisblob; - blobcolor[thisblob]:= AvgColors(blobcolor[thisblob],blobcount[thisblob],tRGB(colors[i]),1); + blobcolor[thisblob]:= AvgColors(blobcolor[thisblob],blobcount[thisblob],tRGB32(colors[i]),1); blobcount[thisblob]:= blobcount[thisblob] + 1; lastblob:= blobbed[i-1]; if lastblob <> thisblob then @@ -547,19 +547,19 @@ begin begin thisblob:= blobbed[i-1]; blobbed[i]:= thisblob; - blobcolor[thisblob]:= AvgColors(blobcolor[thisblob],blobcount[thisblob],tRGB(colors[i]),1); + blobcolor[thisblob]:= AvgColors(blobcolor[thisblob],blobcount[thisblob],tRGB32(colors[i]),1); blobcount[thisblob]:= blobcount[thisblob] + 1; end else if up then begin thisblob:= blobbed[i-w]; blobbed[i]:= thisblob; - blobcolor[thisblob]:= AvgColors(blobcolor[thisblob],blobcount[thisblob],tRGB(colors[i]),1); + blobcolor[thisblob]:= AvgColors(blobcolor[thisblob],blobcount[thisblob],tRGB32(colors[i]),1); blobcount[thisblob]:= blobcount[thisblob] + 1; end else begin blobbed[i]:= numblobs; blobcount[numblobs]:= 1; - blobcolor[numblobs]:= tRGB(colors[i]); + blobcolor[numblobs]:= tRGB32(colors[i]); numblobs:= numblobs + 1; end; end; From 2141e1d01651e284c1857e28d0a984838d2235e2 Mon Sep 17 00:00:00 2001 From: Raymond Date: Mon, 5 Apr 2010 01:36:21 +0200 Subject: [PATCH 16/22] Minor changes + added todo list. --- Units/MMLCore/fontloader.pas | 19 +- Units/MMLCore/ocr.pas | 6 +- Units/MMLCore/ocrutil.pas | 552 ++++++++++++++++------------------- todo.txt | 10 + 4 files changed, 268 insertions(+), 319 deletions(-) create mode 100644 todo.txt diff --git a/Units/MMLCore/fontloader.pas b/Units/MMLCore/fontloader.pas index b1db0a4..f5970ba 100644 --- a/Units/MMLCore/fontloader.pas +++ b/Units/MMLCore/fontloader.pas @@ -49,10 +49,12 @@ type TMFonts = class(TObject) private Fonts: TList; - Path: String; + FPath: String; Client : TObject; function GetFontIndex(const Name: String): Integer; function GetFontByIndex(Index : integer): TMfont; + procedure SetPath(const aPath: String); + function GetPath: String; public constructor Create(Owner : TObject); destructor Destroy; override; @@ -60,10 +62,9 @@ type function FreeFont(const Name: String): Boolean; function LoadFont(const Name: String; Shadow: Boolean): boolean; function LoadSystemFont(const SysFont : TFont; const FontName : string) : boolean; - procedure SetPath(const aPath: String); - function GetPath: String; function Copy(Owner : TObject): TMFonts; function Count : integer; + property Path : string read GetPath write SetPath; property Font[Index : integer]: TMfont read GetFontByIndex; default; end; @@ -155,12 +156,12 @@ end; procedure TMFonts.SetPath(const aPath: String); begin - Path := aPath; + FPath := aPath; end; function TMFonts.GetPath: String; begin - Exit(Path); + Exit(FPath); end; function TMFonts.GetFontIndex(const Name: String): Integer; @@ -201,9 +202,9 @@ function TMFonts.LoadFont(const Name: String; Shadow: Boolean): boolean; var f: TMFont; begin - if not DirectoryExists(Path + Name) then + if not DirectoryExists(FPath + Name) then begin - raise Exception.Create('LoadFont: Directory ' + Path + Name + ' does not exists.'); + raise Exception.Create('LoadFont: Directory ' + FPath + Name + ' does not exists.'); Exit(False); end; @@ -211,7 +212,7 @@ begin f.Name := Name; if Shadow then F.Name := F.Name + '_s'; - f.Data := InitOCR( LoadGlyphMasks(Path + Name + DS, Shadow)); + f.Data := InitOCR( LoadGlyphMasks(FPath + Name + DS, Shadow)); Fonts.Add(f); {$IFDEF FONTDEBUG} TClient(Client).Writeln('Loaded Font ' + f.Name); @@ -270,7 +271,7 @@ var i:integer; begin Result := TMFonts.Create(Owner); - Result.Path := Self.GetPath(); + Result.Path := FPath; for i := 0 to Self.Fonts.Count -1 do Result.Fonts.Add(TMFont(Self.Fonts.Items[i]).Copy()); end; diff --git a/Units/MMLCore/ocr.pas b/Units/MMLCore/ocr.pas index fec2ef9..91e7475 100644 --- a/Units/MMLCore/ocr.pas +++ b/Units/MMLCore/ocr.pas @@ -45,7 +45,7 @@ type debugbmp: TMufasaBitmap; {$ENDIF} function GetFonts:TMFonts; - procedure SetFonts(NewFonts: TMFonts); + procedure SetFonts(const NewFonts: TMFonts); public constructor Create(Owner: TObject); destructor Destroy; override; @@ -139,7 +139,7 @@ var i: longint; begin // We're going to load all fonts now - FFonts.SetPath(path); + FFonts.Path := path; dirs := GetDirectories(path); Result := false; for i := 0 to high(dirs) do @@ -158,7 +158,7 @@ begin end; { Set new Fonts. We set it to a Copy of NewFonts } -procedure TMOCR.SetFonts(NewFonts: TMFonts); +procedure TMOCR.SetFonts(const NewFonts: TMFonts); begin Self.FFonts := NewFonts.Copy(Self.Client); end; diff --git a/Units/MMLCore/ocrutil.pas b/Units/MMLCore/ocrutil.pas index 2b72c02..3c702cd 100644 --- a/Units/MMLCore/ocrutil.pas +++ b/Units/MMLCore/ocrutil.pas @@ -8,54 +8,45 @@ uses Classes, SysUtils, MufasaTypes,bitmaps; type - TNormArray = array of integer; - TocrGlyphMask = record - ascii: char; - width,height: integer; - l,r,t,b: integer; - mask: TNormArray; - end; - TocrGlyphMaskArray = array of TocrGlyphMask; - TocrGlyphMetric = record - xoff,yoff: integer; - width,height: integer; - index: integer; //stores the internal TocrData index for this char - end; - TocrData = record - ascii: array[0..255] of TocrGlyphMetric; - pos: array of array of integer; - pos_adj: array of real; - neg: array of array of integer; - neg_adj: array of real; - map: array of char; - width,height, max_width, max_height: integer; - inputs,outputs: integer; - end; + TNormArray = array of integer; + TocrGlyphMask = record + ascii: char; + width,height: integer; + l,r,t,b: integer; + mask: TNormArray; + end; + TocrGlyphMaskArray = array of TocrGlyphMask; + TocrGlyphMetric = record + xoff,yoff: integer; + width,height: integer; + index: integer; //stores the internal TocrData index for this char + end; + TocrData = record + ascii: array[0..255] of TocrGlyphMetric; + pos: array of array of integer; + pos_adj: array of real; + neg: array of array of integer; + neg_adj: array of real; + map: array of char; + width,height, max_width, max_height: integer; + inputs,outputs: integer; + end; - TocrDataArray = array of TocrData; + TocrDataArray = array of TocrData; - {Begin To be removed} - Tbmp = record - data: array of TRGB32; - width,height: integer; - end; - {End To be removed} + tLab = record + L,a,b: real; + end; - - tLab = record - L,a,b: real; - end; - - procedure findBounds(glyphs: TocrGlyphMaskArray; out width,height: integer); - function LoadGlyphMask(const bmp : TMufasaBitmap; shadow: boolean; const ascii : char): TocrGlyphMask; - function LoadGlyphMasks(const path: string; shadow: boolean): TocrGlyphMaskArray; - function InitOCR(const Masks : TocrGlyphMaskArray): TocrData; - function GuessGlyph(glyph: TNormArray; ocrdata: TocrData): char; - function PointsToNorm(points: TpointArray; out w,h: integer): TNormArray; - function ImageToNorm(src: TRGB32Array; w,h: integer): TNormArray; - function ocrDetect(txt: TNormArray; w,h: integer; var ocrdata: TocrData): string; - function ExtractText(colors: PRGB32;{colors: tRGBArray;} w,h: integer): TNormArray; - function MakeTPAString(str: string): TpointArray; + procedure findBounds(glyphs: TocrGlyphMaskArray; out width,height: integer); + function LoadGlyphMask(const bmp : TMufasaBitmap; shadow: boolean; const ascii : char): TocrGlyphMask; + function LoadGlyphMasks(const path: string; shadow: boolean): TocrGlyphMaskArray; + function InitOCR(const Masks : TocrGlyphMaskArray): TocrData; + function GuessGlyph(glyph: TNormArray; ocrdata: TocrData): char; + function PointsToNorm(points: TpointArray; out w,h: integer): TNormArray; + function ImageToNorm(src: TRGB32Array; w,h: integer): TNormArray; + function ocrDetect(txt: TNormArray; w,h: integer; var ocrdata: TocrData): string; + function ExtractText(colors: PRGB32;{colors: tRGBArray;} w,h: integer): TNormArray; implementation uses @@ -64,86 +55,63 @@ uses graphtype, intfgraphics,graphics; {End To-Remove unit} - -function ReadBMP(path: string): Tbmp; -var - LazIntf : TLazIntfImage; - RawImageDesc : TRawImageDescription; -begin - if FileExists(path) then - begin; - LazIntf := TLazIntfImage.Create(0,0); - RawImageDesc.Init_BPP32_B8G8R8_BIO_TTB(LazIntf.Width,LazIntf.Height); - LazIntf.DataDescription := RawImageDesc; - LazIntf.LoadFromFile(path); - Result.width := LazIntf.Width; - Result.height := LazIntf.Height; - SetLength(result.data,LazIntf.Width*LazIntf.Height); - Move(LazIntf.PixelData[0],result.data[0],LazIntf.Width*LazIntf.Height*sizeOf(TRGB32)); - LazIntf.Free; - end; -end; - - - - {initalizes the remaining fields from a TocrGlyphMask and finds the global bounds} procedure findBounds(glyphs: TocrGlyphMaskArray; out width,height: integer); var - i,x,y,c,w,h: integer; - l,r,t,b: integer; - dat: TNormArray; + i,x,y,c,w,h: integer; + l,r,t,b: integer; + dat: TNormArray; begin - width:= 0; - height:= 0; - for c:= 0 to length(glyphs) - 1 do + width:= 0; + height:= 0; + for c:= 0 to length(glyphs) - 1 do + begin + dat:= glyphs[c].mask; + w:= glyphs[c].width; + h:= glyphs[c].height; + l:= w; + r:= 0; + t:= h; + b:= 0; + for i:= 0 to w*h-1 do begin - dat:= glyphs[c].mask; - w:= glyphs[c].width; - h:= glyphs[c].height; - l:= w; - r:= 0; - t:= h; - b:= 0; - for i:= 0 to w*h-1 do - begin - if dat[i] = 1 then - begin - x:= i mod w; - y:= i div w; - if x > r then r:= x; - if x < l then l:= x; - if y > b then b:= y; - if y < t then t:= y; - end; - end; - if l = w then l:= 0; - if t = h then t:= 0; - glyphs[c].r:= r; - glyphs[c].l:= l; - glyphs[c].b:= b; - glyphs[c].t:= t; - if (r - l + 1) > width then width:= r - l + 1; - if (b - t + 1) > height then height:= b - t + 1; + if dat[i] = 1 then + begin + x:= i mod w; + y:= i div w; + if x > r then r:= x; + if x < l then l:= x; + if y > b then b:= y; + if y < t then t:= y; + end; end; + if l = w then l:= 0; + if t = h then t:= 0; + glyphs[c].r:= r; + glyphs[c].l:= l; + glyphs[c].b:= b; + glyphs[c].t:= t; + if (r - l + 1) > width then width:= r - l + 1; + if (b - t + 1) > height then height:= b - t + 1; + end; end; {Use whatever you want if you don't like this} function GetFiles(Path, Ext: string): TstringArray; var - SearchRec : TSearchRec; - c : integer; + SearchRec : TSearchRec; + c : integer; begin - c := 0; - if FindFirst(Path + '*.' + ext, faAnyFile, SearchRec) = 0 then - begin - repeat - inc(c); - SetLength(Result,c); - Result[c-1] := SearchRec.Name; - until FindNext(SearchRec) <> 0; - SysUtils.FindClose(SearchRec); - end; + c := 0; + if FindFirst(Path + '*.' + ext, faAnyFile, SearchRec) = 0 then + begin + repeat + inc(c); + SetLength(Result,c); + Result[c-1] := SearchRec.Name; + until FindNext(SearchRec) <> 0; + SysUtils.FindClose(SearchRec); + end; end; function LoadGlyphMask(const bmp: TMufasaBitmap; shadow: boolean; const ascii : char): TocrGlyphMask; @@ -258,218 +226,215 @@ end; {guesses a glyph stored in glyph (which is an 1-0 image of the size specified by width and height in ocrdata} function GuessGlyph(glyph: TNormArray; ocrdata: TocrData): char; var - i,c,inputs,outputs,val: integer; - pos_weights: array of real; - neg_weights: array of real; - max, weight: real; + i,c,inputs,outputs,val: integer; + pos_weights: array of real; + neg_weights: array of real; + max, weight: real; begin - SetLength(pos_weights,ocrdata.outputs); - SetLength(neg_weights,ocrdata.outputs); - inputs:= ocrdata.inputs - 1; - outputs:= ocrdata.outputs - 1; - for i:= 0 to inputs do + SetLength(pos_weights,ocrdata.outputs); + SetLength(neg_weights,ocrdata.outputs); + inputs:= ocrdata.inputs - 1; + outputs:= ocrdata.outputs - 1; + for i:= 0 to inputs do + begin + val:= glyph[i]; + for c:= 0 to outputs do begin - val:= glyph[i]; - for c:= 0 to outputs do - begin - pos_weights[c]:= pos_weights[c] + ocrdata.pos[c][i] * val; - neg_weights[c]:= neg_weights[c] + ocrdata.neg[c][i] * val; - end - end; - max:= 0; - for i:= 0 to outputs do + pos_weights[c]:= pos_weights[c] + ocrdata.pos[c][i] * val; + neg_weights[c]:= neg_weights[c] + ocrdata.neg[c][i] * val; + end + end; + max:= 0; + for i:= 0 to outputs do + begin + weight:= pos_weights[i] * ocrdata.pos_adj[i] - neg_weights[i] * ocrdata.neg_adj[i]; + if (weight > max) then begin - weight:= pos_weights[i] * ocrdata.pos_adj[i] - neg_weights[i] * ocrdata.neg_adj[i]; - if (weight > max) then - begin - max:= weight; - result:= ocrdata.map[i]; - end; + max:= weight; + result:= ocrdata.map[i]; end; + end; end; {converts a TPA into a 1-0 image of the smallest possible size} function PointsToNorm(points: TpointArray; out w,h: integer): TNormArray; var - l,r,t,b: integer; - i,len,size: integer; - norm: TNormArray; + l,r,t,b: integer; + i,len,size: integer; + norm: TNormArray; begin - len:= length(points); - l:= points[0].x; - r:= points[0].x; - t:= points[0].y; - b:= points[0].y; - for i:= 1 to len-1 do - begin - if points[i].x < l then l:= points[i].x; - if points[i].x > r then r:= points[i].x; - if points[i].y < t then t:= points[i].y; - if points[i].y > b then b:= points[i].y; - end; - w:= r - l + 1; - h:= b - t + 1; - size:= w * h; - SetLength(norm,size); - for i:= 0 to len-1 do - norm[(points[i].x - l) + (points[i].y - t) * w]:= 1; - result:= norm; + len:= length(points); + l:= points[0].x; + r:= points[0].x; + t:= points[0].y; + b:= points[0].y; + for i:= 1 to len-1 do + begin + if points[i].x < l then l:= points[i].x; + if points[i].x > r then r:= points[i].x; + if points[i].y < t then t:= points[i].y; + if points[i].y > b then b:= points[i].y; + end; + w:= r - l + 1; + h:= b - t + 1; + size:= w * h; + SetLength(norm,size); + for i:= 0 to len-1 do + norm[(points[i].x - l) + (points[i].y - t) * w]:= 1; + result:= norm; end; function ImageToNorm(src: TRGB32Array; w,h: integer): TNormArray; var - norm: TNormArray; - i: integer; + norm: TNormArray; + i: integer; begin - SetLength(norm,w*h); - for i:= 0 to w*h-1 do - if (src[i].r = 255) and (src[i].g = 255) and (src[i].b = 255) then - norm[i]:= 1 else norm[i]:= 0; - result:= norm; + SetLength(norm,w*h); + for i:= 0 to w*h-1 do + if (src[i].r = 255) and (src[i].g = 255) and (src[i].b = 255) then + norm[i]:= 1 else norm[i]:= 0; + result:= norm; end; {takes a mask of only one line of text, a TocrData, and returns the string in it} function ocrDetect(txt: TNormArray; w,h: integer; var ocrdata: TocrData): string; var - l,r,t,b,x,y,xx,yy: integer; - upper,left,last,spaces: integer; - glyph: TNormArray; - empty: boolean; - ascii: char; + l,r,t,b,x,y,xx,yy: integer; + upper,left,last,spaces: integer; + glyph: TNormArray; + empty: boolean; + ascii: char; begin - result:= ''; - l:= -1; - r:= -1; - upper:= -9001; //large negative - left:= -9001; //large negative - x:= 0; - while x < w do + result:= ''; + l:= -1; + r:= -1; + upper:= -9001; //large negative + left:= -9001; //large negative + x:= 0; + while x < w do + begin + empty:= true; + for y:= 0 to h-1 do begin - empty:= true; - for y:= 0 to h-1 do - begin - if txt[x+y*w] = 1 then - begin - empty:= false; - break; - end; - end; - if (l = -1) and (not empty) then - begin - l:= x - end else if (l <> -1) then - begin - if empty then - r:= x - 1 - else if x = w-1 then - r:= x; - end; - if (r <> -1) and (l <> -1) then - begin - t:= -1; - b:= -1; - SetLength(glyph,0); - SetLength(glyph,ocrdata.width*ocrdata.height); - for yy:= 0 to h-1 do - begin - for xx:= l to r do - if txt[xx+yy*w] = 1 then begin t:= yy; break; end; - if t <> -1 then break; - end; - for yy:= h-1 downto 0 do - begin - for xx:= l to r do - if txt[xx+yy*w] = 1 then begin b:= yy; break; end; - if b <> -1 then break; - end; - if b - t + 1 > ocrdata.height then b:= b - (b-t+1-ocrdata.height); - if r - l + 1 > ocrdata.width then r:= r - (r-l+1-ocrdata.width); - for yy:= t to b do - for xx:= l to r do - glyph[(xx-l) + (yy-t)*ocrdata.width]:= txt[xx+yy*w]; - - ascii:= GuessGlyph(glyph,ocrdata); - if (upper = -9001) or (left = -9001) then - begin - upper:= t - ocrdata.ascii[ord(ascii)].yoff; - left:= l - ocrdata.ascii[ord(ascii)].xoff + ocrdata.ascii[ord(ascii)].width; - x:= left; - end else - begin - last:= left; - left:= l - ocrdata.ascii[ord(ascii)].xoff; - if last <> left then - begin - for spaces:= 1 to (left - last) div ocrdata.ascii[32].width do - result:= result + ' '; - end; - left:= left + ocrdata.ascii[ord(ascii)].width; - x:= left; - end; - - result:= result + ascii; - - l:= -1; - r:= -1; - - end; - inc(x); + if txt[x+y*w] = 1 then + begin + empty:= false; + break; + end; end; + if (l = -1) and (not empty) then + begin + l:= x + end else if (l <> -1) then + begin + if empty then + r:= x - 1 + else if x = w-1 then + r:= x; + end; + if (r <> -1) and (l <> -1) then + begin + t:= -1; + b:= -1; + SetLength(glyph,0); + SetLength(glyph,ocrdata.width*ocrdata.height); + for yy:= 0 to h-1 do + begin + for xx:= l to r do + if txt[xx+yy*w] = 1 then begin t:= yy; break; end; + if t <> -1 then break; + end; + for yy:= h-1 downto 0 do + begin + for xx:= l to r do + if txt[xx+yy*w] = 1 then begin b:= yy; break; end; + if b <> -1 then break; + end; + if b - t + 1 > ocrdata.height then b:= b - (b-t+1-ocrdata.height); + if r - l + 1 > ocrdata.width then r:= r - (r-l+1-ocrdata.width); + for yy:= t to b do + for xx:= l to r do + glyph[(xx-l) + (yy-t)*ocrdata.width]:= txt[xx+yy*w]; + + ascii:= GuessGlyph(glyph,ocrdata); + if (upper = -9001) or (left = -9001) then + begin + upper:= t - ocrdata.ascii[ord(ascii)].yoff; + left:= l - ocrdata.ascii[ord(ascii)].xoff + ocrdata.ascii[ord(ascii)].width; + x:= left; + end else + begin + last:= left; + left:= l - ocrdata.ascii[ord(ascii)].xoff; + if last <> left then + begin + for spaces:= 1 to (left - last) div ocrdata.ascii[32].width do + result:= result + ' '; + end; + left:= left + ocrdata.ascii[ord(ascii)].width; + x:= left; + end; + result:= result + ascii; + l:= -1; + r:= -1; + end; + inc(x); + end; end; function AvgColors(color1:TRGB32; weight1: integer; color2: TRGB32; weight2: integer): TRGB32; begin - result.r:= (color1.r * weight1 + color2.r * weight2) div (weight1 + weight2); - result.g:= (color1.g * weight1 + color2.g * weight2) div (weight1 + weight2); - result.b:= (color1.b * weight1 + color2.b * weight2) div (weight1 + weight2); + result.r:= (color1.r * weight1 + color2.r * weight2) div (weight1 + weight2); + result.g:= (color1.g * weight1 + color2.g * weight2) div (weight1 + weight2); + result.b:= (color1.b * weight1 + color2.b * weight2) div (weight1 + weight2); end; procedure RGBtoXYZ(color: TRGB32; out X, Y, Z: real); inline; var - nr,ng,nb: real; + nr,ng,nb: real; begin - nr:= color.r / 255.0; - ng:= color.g / 255.0; - nb:= color.b / 255.0; - if nr <= 0.04045 then nr:= nr / 12.92 else nr:= power((nr + 0.055)/1.055,2.4); - if ng <= 0.04045 then ng:= ng / 12.92 else ng:= power((ng + 0.055)/1.055,2.4); - if nb <= 0.04045 then nr:= nb / 12.92 else nb:= power((nb + 0.055)/1.055,2.4); - X:= 0.4124*nr + 0.3576*ng + 0.1805*nb; - Y:= 0.2126*nr + 0.7152*ng + 0.0722*nb; - Z:= 0.0193*nr + 0.1192*ng + 0.9505*nb; + nr:= color.r / 255.0; + ng:= color.g / 255.0; + nb:= color.b / 255.0; + if nr <= 0.04045 then nr:= nr / 12.92 else nr:= power((nr + 0.055)/1.055,2.4); + if ng <= 0.04045 then ng:= ng / 12.92 else ng:= power((ng + 0.055)/1.055,2.4); + if nb <= 0.04045 then nr:= nb / 12.92 else nb:= power((nb + 0.055)/1.055,2.4); + X:= 0.4124*nr + 0.3576*ng + 0.1805*nb; + Y:= 0.2126*nr + 0.7152*ng + 0.0722*nb; + Z:= 0.0193*nr + 0.1192*ng + 0.9505*nb; end; function labmod(i: real): real; inline; begin - if i > power(0.206896552,3) then - result:= power(i,0.333333333) - else - result:= 7.787037037*i + 0.137931034; + if i > power(0.206896552,3) then + result:= power(i,0.333333333) + else + result:= 7.787037037*i + 0.137931034; end; function ColortoLab(c: TRGB32): tLab; inline; var - X,Y,Z,sum,Xn,Yn,Zn: real; + X,Y,Z,sum,Xn,Yn,Zn: real; begin - RGBtoXYZ(c,X,Y,Z); - sum:= X + Y + Z; - if(sum = 0) then - begin - result.l := 0.0; - result.a := 0.0; - result.b := 0.0; - end; - Xn:= X / sum; - Yn:= Y / sum; - Zn:= Z / sum; - result.L:= 116.0*labmod(y/yn) - 16.0; - result.a:= 500.0*(labmod(x/xn)-labmod(y/yn)); - result.b:= 500.0*(labmod(y/yn)-labmod(z/zn)); + RGBtoXYZ(c,X,Y,Z); + sum:= X + Y + Z; + if(sum = 0) then + begin + result.l := 0.0; + result.a := 0.0; + result.b := 0.0; + end; + Xn:= X / sum; + Yn:= Y / sum; + Zn:= Z / sum; + result.L:= 116.0*labmod(y/yn) - 16.0; + result.a:= 500.0*(labmod(x/xn)-labmod(y/yn)); + result.b:= 500.0*(labmod(y/yn)-labmod(z/zn)); end; function colorDistSqr(a,b:TRGB32): integer; inline; begin - result:= (a.r-b.r)*(a.r-b.r)+(a.b-b.b)*(a.b-b.b)+(a.g-b.g)*(a.g-b.g); + result:= (a.r-b.r)*(a.r-b.r)+(a.b-b.b)*(a.b-b.b)+(a.g-b.g)*(a.g-b.g); end; function ExtractText(colors: PRGB32;{colors: tRGBArray;} w,h: integer): TNormArray; @@ -595,32 +560,5 @@ begin result:= norm; end; -function MakeTPAString(str: string): TpointArray; -var - i,j,c,off: integer; - bmp: array of Tbmp; -begin - raise Exception.Create('MakeTPAString sucks ass, don''t use it.'); - c:= 0; - off:= 0; - SetLength(bmp,length(str)); - for i:= 0 to length(str)-1 do - begin - bmp[i]:= ReadBmp('/home/merlijn/Programs/mufasa/Fonts/StatChars/' + inttostr(ord(str[i+1])) + '.bmp'); - SetLength(result,c+bmp[i].width*bmp[i].height); - for j:= 0 to bmp[i].width*bmp[i].height - 1 do - begin - if bmp[i].data[j].g = 255 then - begin - result[c].x:= j mod bmp[i].width + off; - result[c].y:= j div bmp[i].width; - inc(c); - end; - end; - off:= off + bmp[i].width; - SetLength(result,c); - end; -end; - end. diff --git a/todo.txt b/todo.txt new file mode 100644 index 0000000..3347b27 --- /dev/null +++ b/todo.txt @@ -0,0 +1,10 @@ +- DTM Editor +- BMP Editor +- DTM Features +- SRL Installer +- Extra GUI icons +- Installer +- Test scripts +- DWS +- OCR exceptions + proper implementation of len +- Documentation + wiki \ No newline at end of file From 0cd50991964fd7d905ad6c874defca755e826d2b Mon Sep 17 00:00:00 2001 From: Merlijn Wajer Date: Mon, 5 Apr 2010 11:00:53 +0200 Subject: [PATCH 17/22] Fixes for Settings form. Had some duplicated code. --- Projects/SAMufasaGUI/simbasettings.pas | 20 +++++++------------- Units/MMLAddon/settings.pas | 8 ++++++-- 2 files changed, 13 insertions(+), 15 deletions(-) diff --git a/Projects/SAMufasaGUI/simbasettings.pas b/Projects/SAMufasaGUI/simbasettings.pas index 878eadd..2bc1a09 100644 --- a/Projects/SAMufasaGUI/simbasettings.pas +++ b/Projects/SAMufasaGUI/simbasettings.pas @@ -128,11 +128,9 @@ begin if N.Data <> nil then exit; - if N.GetFirstChild = nil then - exit; - - if N.GetFirstChild.Data <> nil then - exit; + if N.GetFirstChild <> nil then + if N.GetFirstChild.Data <> nil then + exit; KeyName := InputBox('Create new Key', 'Please enter the key name', ''); @@ -140,14 +138,8 @@ begin exit; P := Settings.GetNodePath(N); - if Settings.CreateKey(P + '/' + NN.Text) then - begin - NN := TTreeNode.Create(SettingsTreeView.Items); - - NN.Text := KeyName; - - NN.MoveTo(N,naAddChild); - end; + if Settings.CreateKey(P + '/' + KeyName) then + writeln('Added key ' + KeyName); end; @@ -170,6 +162,8 @@ begin if N = nil then exit; + Path := Settings.GetNodePath(N); + MBox := InputBox('Rename', 'Please fill in the new name', ''); if MBox = '' then exit; diff --git a/Units/MMLAddon/settings.pas b/Units/MMLAddon/settings.pas index 004823c..6aa00d6 100644 --- a/Units/MMLAddon/settings.pas +++ b/Units/MMLAddon/settings.pas @@ -345,21 +345,25 @@ var i : integer; begin result := false; + writeln(oldkey); Path := KeyNameToKeys(OldKey); if length(path) = 1 then exit; + if pos('/',newKey) > 0 then exit; + if not KeyExists(oldkey) then exit; - for i := length(oldKey) downto 1 do + +{ for i := length(oldKey) downto 1 do if oldkey[i] = '/' then begin newstr:= Copy(oldkey,1,i) + NewKey; break; end; if KeyExists(NewKey) then - exit; + exit; } Node := WalkToNode(oldKey); Node.Text:= NewKey; result := true; From f9733bd3fb25b168282b787782702bf2d29f8666 Mon Sep 17 00:00:00 2001 From: Merlijn Wajer Date: Mon, 5 Apr 2010 11:01:18 +0200 Subject: [PATCH 18/22] Commented os_linux (a bit) --- Units/MMLCore/os_linux.pas | 52 ++++++++++++++++++++++++++++++-------- 1 file changed, 41 insertions(+), 11 deletions(-) diff --git a/Units/MMLCore/os_linux.pas b/Units/MMLCore/os_linux.pas index f107720..31bce13 100644 --- a/Units/MMLCore/os_linux.pas +++ b/Units/MMLCore/os_linux.pas @@ -69,13 +69,23 @@ interface function GetNativeWindow: TNativeWindow; private + { display is the connection to the X server } display: PDisplay; + + { screen-number and selected window } screennum: integer; window: x.TWindow; + + { Reference to the XImage } buffer: PXImage; + + { For memory-leak checks } dirty: Boolean; //true if image loaded + + { KeyInput class } keyinput: TKeyInput; + { X Error Handler } oldXHandler: TXErrorHandler; end; @@ -101,27 +111,32 @@ implementation uses GraphType, interfacebase, lcltype; { PROBLEM: .Create is called on the main thread. ErrorCS etc aren't - created on other threads. We will create them on the fly... } + created on other threads. We will create them on the fly... + More info below...} threadvar xerror: string; threadvar ErrorCS: syncobjs.TCriticalSection; + { + This is extremely hacky, but also very useful. + We have to install a X error handler, because otherwise X + will terminate out entire app on error. -//***implementation*** TKeyInput + Since we want the right thread to recieve the right error, we have to + fiddle a bit with threadvars, mutexes / semaphores. - procedure TKeyInput.Down(Key: Word); - begin - DoDown(Key); - end; + Another problem is that the script thread is initialised on the main thread. + This means that all (threadvar!) semaphores initialised on the mainthread + are NOT initialised on the script thread, which has yet to be started. + Therefore, we check if it hasn't been created yet. - procedure TKeyInput.Up(Key: Word); - begin - DoUp(Key); - end; + ** Horrible solution, but WFM ** -//***implementation*** TWindow + This is the Handler function. + + } function MufasaXErrorHandler(para1:PDisplay; para2:PXErrorEvent):cint; cdecl; @@ -158,6 +173,20 @@ implementation mDebugLn('Type: ' + inttostr(para2^._type)); end; + { TKeyInput } + + procedure TKeyInput.Down(Key: Word); + begin + DoDown(Key); + end; + + procedure TKeyInput.Up(Key: Word); + begin + DoUp(Key); + end; + + { TWindow } + function TWindow.GetError: String; begin exit(xerror); @@ -173,6 +202,7 @@ implementation xerror := ''; end; + { See if the semaphores / CS are initialised } constructor TWindow.Create(display: PDisplay; screennum: integer; window: x.TWindow); begin inherited Create; From d367a1f4eea984fc03dc95503c3ed9ff02304181 Mon Sep 17 00:00:00 2001 From: Merlijn Wajer Date: Mon, 5 Apr 2010 11:02:44 +0200 Subject: [PATCH 19/22] WriteLn -> MDebugLn... --- Projects/SAMufasaGUI/simbasettings.pas | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Projects/SAMufasaGUI/simbasettings.pas b/Projects/SAMufasaGUI/simbasettings.pas index 2bc1a09..e353272 100644 --- a/Projects/SAMufasaGUI/simbasettings.pas +++ b/Projects/SAMufasaGUI/simbasettings.pas @@ -139,7 +139,7 @@ begin P := Settings.GetNodePath(N); if Settings.CreateKey(P + '/' + KeyName) then - writeln('Added key ' + KeyName); + mDebugLn('Added key ' + KeyName); end; From f5c48a6b435505c72a0b8d7d15f83e5783717787 Mon Sep 17 00:00:00 2001 From: Merlijn Wajer Date: Mon, 5 Apr 2010 11:27:16 +0200 Subject: [PATCH 20/22] Small cleanup in mmlpsthread. Bugfix in OCR. --- Units/MMLAddon/mmlpsthread.pas | 17 ----------------- Units/MMLCore/ocr.pas | 2 +- 2 files changed, 1 insertion(+), 18 deletions(-) diff --git a/Units/MMLAddon/mmlpsthread.pas b/Units/MMLAddon/mmlpsthread.pas index c0d7d03..c9d18ee 100644 --- a/Units/MMLAddon/mmlpsthread.pas +++ b/Units/MMLAddon/mmlpsthread.pas @@ -476,23 +476,6 @@ end; {***implementation TPSThread***} -{ - Note to Raymond: For PascalScript, Create it on the .Create, - Execute it on the .Execute, and don't forget to Destroy it on .Destroy. - - Furthermore, all the wrappers can be in the unit "implementation" section. - Better still to create an .inc for it, otherwise this unit will become huge. - (You can even split up the .inc's in stuff like color, bitmap, etc. ) - - Also, don't add PS to this unit, but make a seperate unit for it. - Unit "MMLPSThread", perhaps? - - See the TestUnit for use of this thread, it's pretty straightforward. - - It may also be wise to turn the "Importing of wrappers" into an include as - well, it will really make the unit more straightforward to use and read. -} - constructor TPSThread.Create(CreateSuspended : boolean; TheSyncInfo : PSyncInfo; plugin_dir: string); var I : integer; diff --git a/Units/MMLCore/ocr.pas b/Units/MMLCore/ocr.pas index 91e7475..0401231 100644 --- a/Units/MMLCore/ocr.pas +++ b/Units/MMLCore/ocr.pas @@ -808,7 +808,7 @@ begin if (tpa[j].x) + ((tpa[j].y) * fD.width) <= high(n) then n[(tpa[j].x) + ((tpa[j].y) * fD.width)] := 1 else - raise Exception.Create('The automatically split characters are too wide. Try decreasing minspacing'); + mDebugLn('The automatically split characters are too wide. Try decreasing minspacing'); end; result := result + GuessGlyph(n, fD); end; From 5503164d91daac00287d074078e3112642e1bab5 Mon Sep 17 00:00:00 2001 From: Raymond Date: Mon, 5 Apr 2010 13:56:20 +0200 Subject: [PATCH 21/22] Added bzip decompression + untarring support for extensions + updated the test extension to be a font updater. --- Extensions/test.sex | 30 +- Projects/SAMufasaGUI/extensionmanager.pas | 4 +- Projects/SAMufasaGUI/framescript.lfm | 16 -- Projects/SAMufasaGUI/framescript.lrs | 271 +++++++++---------- Projects/SAMufasaGUI/framescript.pas | 5 +- Projects/SAMufasaGUI/psextension.pas | 14 +- Projects/SAMufasaGUI/testunit.lfm | 86 ++++-- Projects/SAMufasaGUI/testunit.lrs | 60 ++-- Projects/SAMufasaGUI/testunit.pas | 166 ++++++++---- Units/MMLAddon/PSInc/Wrappers/extensions.inc | 74 ++++- 10 files changed, 440 insertions(+), 286 deletions(-) diff --git a/Extensions/test.sex b/Extensions/test.sex index 3c4ae0e..ac088f2 100644 --- a/Extensions/test.sex +++ b/Extensions/test.sex @@ -10,10 +10,32 @@ begin Writeln('Free your extension here'); end; -procedure Attach; +function GetNumbers(const str : string) : string; +var + i : integer; begin; - Settings.SetKeyValue('TestSetting','1337'); - Writeln('Your extension has been enabled, do stuff here'); + for i := 1 to length(str) do + case str[i] of + '0'..'9': result := result + str[i]; + end; +end; +procedure Attach; +var + Fonts : string; + Contents : string; + newvers :integer; + Vers : integer; +begin; + Vers := StrToIntDef(Settings.GetKeyValueDef('FontVersion','-1'),-1); + newvers := strtointdef(GetNumbers(getpage('http://simba.villavu.com/bin/Fonts/Version')),-1); + if newVers > vers then + begin; + Writeln('Updating your fonts!'); + fonts := GetPage('http://simba.villavu.com/bin/Fonts/Fonts.tar.bz2'); + if DecompressBZip2(Fonts,Contents,4096) then + UnTarEx(Contents,FontPath,true); + Settings.SetKeyValue('FontVersion',inttostr(newvers)); + end; end; Procedure Detach; @@ -24,7 +46,7 @@ end; //Called to retrieve the name of your extension function GetName : string; begin; - result := 'Test Extension'; + result := 'Font updater example'; end; //Called to retrieve the version of your extension diff --git a/Projects/SAMufasaGUI/extensionmanager.pas b/Projects/SAMufasaGUI/extensionmanager.pas index f63e311..e9ca5c0 100644 --- a/Projects/SAMufasaGUI/extensionmanager.pas +++ b/Projects/SAMufasaGUI/extensionmanager.pas @@ -5,7 +5,7 @@ unit extensionmanager; interface uses - Classes, SysUtils,virtualextension,psextension,mufasabase,mufasatypes; + Classes, SysUtils,virtualextension,psextension,mufasabase; type TExtension = TVirtualSimbaExtension; @@ -38,7 +38,7 @@ var implementation uses - TestUnit, settingssandbox,simbasettings; + TestUnit, settingssandbox,simbasettings,MufasaTypes; procedure TExtensionManager.SetOnchange(const AValue: TNotifyEvent); var diff --git a/Projects/SAMufasaGUI/framescript.lfm b/Projects/SAMufasaGUI/framescript.lfm index cb8b4e4..f0ad4a6 100644 --- a/Projects/SAMufasaGUI/framescript.lfm +++ b/Projects/SAMufasaGUI/framescript.lfm @@ -52,7 +52,6 @@ object ScriptFrame: TScriptFrame Option = 0 Priority = 0 end> - Highlighter = SynFreePascalSyn1 Keystrokes = < item Command = ecUp @@ -710,19 +709,4 @@ object ScriptFrame: TScriptFrame end end end - object SynFreePascalSyn1: TSynFreePascalSyn - Enabled = False - CommentAttri.Foreground = clBlue - CommentAttri.Style = [fsBold] - IdentifierAttri.Foreground = clDefault - NumberAttri.Foreground = clNavy - StringAttri.Foreground = clBlue - SymbolAttri.Foreground = clRed - DirectiveAttri.Foreground = clRed - DirectiveAttri.Style = [fsBold] - CompilerMode = pcmObjFPC - NestedComments = True - left = 320 - top = 16 - end end diff --git a/Projects/SAMufasaGUI/framescript.lrs b/Projects/SAMufasaGUI/framescript.lrs index f103b62..4ade7fe 100644 --- a/Projects/SAMufasaGUI/framescript.lrs +++ b/Projects/SAMufasaGUI/framescript.lrs @@ -16,144 +16,137 @@ LazarusResources.Add('TScriptFrame','FORMDATA',[ +'mand'#2#13#9'MoveCaret'#8#6'Option'#2#0#8'Priority'#2#0#0#1#5'Shift'#11#0#9 +'ShiftMask'#11#0#6'Button'#7#7'mbRight'#10'ClickCount'#7#8'ccSingle'#8'Click' +'Dir'#7#4'cdUp'#7'Command'#2#12#9'MoveCaret'#8#6'Option'#2#0#8'Priority'#2#0 - +#0#0#11'Highlighter'#7#17'SynFreePascalSyn1'#10'Keystrokes'#14#1#7'Command'#7 - +#4'ecUp'#8'ShortCut'#2'&'#0#1#7'Command'#7#7'ecSelUp'#8'ShortCut'#3'& '#0#1#7 - +'Command'#7#10'ecScrollUp'#8'ShortCut'#3'&@'#0#1#7'Command'#7#6'ecDown'#8'Sh' - +'ortCut'#2'('#0#1#7'Command'#7#9'ecSelDown'#8'ShortCut'#3'( '#0#1#7'Command' - +#7#12'ecScrollDown'#8'ShortCut'#3'(@'#0#1#7'Command'#7#6'ecLeft'#8'ShortCut' - +#2'%'#0#1#7'Command'#7#9'ecSelLeft'#8'ShortCut'#3'% '#0#1#7'Command'#7#10'ec' - +'WordLeft'#8'ShortCut'#3'%@'#0#1#7'Command'#7#13'ecSelWordLeft'#8'ShortCut'#3 - +'%`'#0#1#7'Command'#7#7'ecRight'#8'ShortCut'#2''''#0#1#7'Command'#7#10'ecSel' - +'Right'#8'ShortCut'#3''' '#0#1#7'Command'#7#11'ecWordRight'#8'ShortCut'#3'''' - +'@'#0#1#7'Command'#7#14'ecSelWordRight'#8'ShortCut'#3'''`'#0#1#7'Command'#7 - +#10'ecPageDown'#8'ShortCut'#2'"'#0#1#7'Command'#7#13'ecSelPageDown'#8'ShortC' - +'ut'#3'" '#0#1#7'Command'#7#12'ecPageBottom'#8'ShortCut'#3'"@'#0#1#7'Command' - +#7#15'ecSelPageBottom'#8'ShortCut'#3'"`'#0#1#7'Command'#7#8'ecPageUp'#8'Shor' - +'tCut'#2'!'#0#1#7'Command'#7#11'ecSelPageUp'#8'ShortCut'#3'! '#0#1#7'Command' - +#7#9'ecPageTop'#8'ShortCut'#3'!@'#0#1#7'Command'#7#12'ecSelPageTop'#8'ShortC' - +'ut'#3'!`'#0#1#7'Command'#7#11'ecLineStart'#8'ShortCut'#2'$'#0#1#7'Command'#7 - +#14'ecSelLineStart'#8'ShortCut'#3'$ '#0#1#7'Command'#7#11'ecEditorTop'#8'Sho' - +'rtCut'#3'$@'#0#1#7'Command'#7#14'ecSelEditorTop'#8'ShortCut'#3'$`'#0#1#7'Co' - +'mmand'#7#9'ecLineEnd'#8'ShortCut'#2'#'#0#1#7'Command'#7#12'ecSelLineEnd'#8 - +'ShortCut'#3'# '#0#1#7'Command'#7#14'ecEditorBottom'#8'ShortCut'#3'#@'#0#1#7 - +'Command'#7#17'ecSelEditorBottom'#8'ShortCut'#3'#`'#0#1#7'Command'#7#12'ecTo' - +'ggleMode'#8'ShortCut'#2'-'#0#1#7'Command'#7#6'ecCopy'#8'ShortCut'#3'-@'#0#1 - +#7'Command'#7#7'ecPaste'#8'ShortCut'#3'- '#0#1#7'Command'#7#12'ecDeleteChar' - +#8'ShortCut'#2'.'#0#1#7'Command'#7#5'ecCut'#8'ShortCut'#3'. '#0#1#7'Command' - +#7#16'ecDeleteLastChar'#8'ShortCut'#2#8#0#1#7'Command'#7#16'ecDeleteLastChar' - +#8'ShortCut'#3#8' '#0#1#7'Command'#7#16'ecDeleteLastWord'#8'ShortCut'#3#8'@' - +#0#1#7'Command'#7#6'ecUndo'#8'ShortCut'#4#8#128#0#0#0#1#7'Command'#7#6'ecRed' - +'o'#8'ShortCut'#4#8#160#0#0#0#1#7'Command'#7#11'ecLineBreak'#8'ShortCut'#2#13 - +#0#1#7'Command'#7#11'ecSelectAll'#8'ShortCut'#3'A@'#0#1#7'Command'#7#6'ecCop' - +'y'#8'ShortCut'#3'C@'#0#1#7'Command'#7#13'ecBlockIndent'#8'ShortCut'#3'I@'#0 - +#1#7'Command'#7#11'ecLineBreak'#8'ShortCut'#3'M@'#0#1#7'Command'#7#15'ecBloc' - +'kUnindent'#8'ShortCut'#3'U@'#0#1#7'Command'#7#7'ecPaste'#8'ShortCut'#3'V@'#0 - +#1#7'Command'#7#5'ecCut'#8'ShortCut'#3'X@'#0#1#7'Command'#7#12'ecDeleteLine' - +#8'ShortCut'#3'Y@'#0#1#7'Command'#7#11'ecDeleteEOL'#8'ShortCut'#3'Y`'#0#1#7 - +'Command'#7#6'ecUndo'#8'ShortCut'#3'Z@'#0#1#7'Command'#7#6'ecRedo'#8'ShortCu' - +'t'#3'Z`'#0#1#7'Command'#7#13'ecGotoMarker0'#8'ShortCut'#3'0@'#0#1#7'Command' - +#7#13'ecGotoMarker1'#8'ShortCut'#3'1@'#0#1#7'Command'#7#13'ecGotoMarker2'#8 - +'ShortCut'#3'2@'#0#1#7'Command'#7#13'ecGotoMarker3'#8'ShortCut'#3'3@'#0#1#7 - +'Command'#7#13'ecGotoMarker4'#8'ShortCut'#3'4@'#0#1#7'Command'#7#13'ecGotoMa' - +'rker5'#8'ShortCut'#3'5@'#0#1#7'Command'#7#13'ecGotoMarker6'#8'ShortCut'#3'6' - +'@'#0#1#7'Command'#7#13'ecGotoMarker7'#8'ShortCut'#3'7@'#0#1#7'Command'#7#13 - +'ecGotoMarker8'#8'ShortCut'#3'8@'#0#1#7'Command'#7#13'ecGotoMarker9'#8'Short' - +'Cut'#3'9@'#0#1#7'Command'#7#12'ecSetMarker0'#8'ShortCut'#3'0`'#0#1#7'Comman' - +'d'#7#12'ecSetMarker1'#8'ShortCut'#3'1`'#0#1#7'Command'#7#12'ecSetMarker2'#8 - +'ShortCut'#3'2`'#0#1#7'Command'#7#12'ecSetMarker3'#8'ShortCut'#3'3`'#0#1#7'C' - +'ommand'#7#12'ecSetMarker4'#8'ShortCut'#3'4`'#0#1#7'Command'#7#12'ecSetMarke' - +'r5'#8'ShortCut'#3'5`'#0#1#7'Command'#7#12'ecSetMarker6'#8'ShortCut'#3'6`'#0 - +#1#7'Command'#7#12'ecSetMarker7'#8'ShortCut'#3'7`'#0#1#7'Command'#7#12'ecSet' - +'Marker8'#8'ShortCut'#3'8`'#0#1#7'Command'#7#12'ecSetMarker9'#8'ShortCut'#3 - ,'9`'#0#1#7'Command'#7#12'EcFoldLevel1'#8'ShortCut'#4'1'#160#0#0#0#1#7'Comman' - +'d'#7#12'EcFoldLevel2'#8'ShortCut'#4'2'#160#0#0#0#1#7'Command'#7#12'EcFoldLe' - +'vel1'#8'ShortCut'#4'3'#160#0#0#0#1#7'Command'#7#12'EcFoldLevel1'#8'ShortCut' - +#4'4'#160#0#0#0#1#7'Command'#7#12'EcFoldLevel1'#8'ShortCut'#4'5'#160#0#0#0#1 - +#7'Command'#7#12'EcFoldLevel6'#8'ShortCut'#4'6'#160#0#0#0#1#7'Command'#7#12 - +'EcFoldLevel7'#8'ShortCut'#4'7'#160#0#0#0#1#7'Command'#7#12'EcFoldLevel8'#8 - +'ShortCut'#4'8'#160#0#0#0#1#7'Command'#7#12'EcFoldLevel9'#8'ShortCut'#4'9' - +#160#0#0#0#1#7'Command'#7#12'EcFoldLevel0'#8'ShortCut'#4'0'#160#0#0#0#1#7'Co' - +'mmand'#7#13'EcFoldCurrent'#8'ShortCut'#4'-'#160#0#0#0#1#7'Command'#7#15'EcU' - +'nFoldCurrent'#8'ShortCut'#4'+'#160#0#0#0#1#7'Command'#7#18'EcToggleMarkupWo' - +'rd'#8'ShortCut'#4'M'#128#0#0#0#1#7'Command'#7#14'ecNormalSelect'#8'ShortCut' - +#3'N`'#0#1#7'Command'#7#14'ecColumnSelect'#8'ShortCut'#3'C`'#0#1#7'Command'#7 - +#12'ecLineSelect'#8'ShortCut'#3'L`'#0#1#7'Command'#7#5'ecTab'#8'ShortCut'#2#9 - +#0#1#7'Command'#7#10'ecShiftTab'#8'ShortCut'#3#9' '#0#1#7'Command'#7#14'ecMa' - +'tchBracket'#8'ShortCut'#3'B`'#0#1#7'Command'#7#10'ecColSelUp'#8'ShortCut'#4 - +'&'#160#0#0#0#1#7'Command'#7#12'ecColSelDown'#8'ShortCut'#4'('#160#0#0#0#1#7 - +'Command'#7#12'ecColSelLeft'#8'ShortCut'#4'%'#160#0#0#0#1#7'Command'#7#13'ec' - +'ColSelRight'#8'ShortCut'#4''''#160#0#0#0#1#7'Command'#7#16'ecColSelPageDown' - +#8'ShortCut'#4'"'#160#0#0#0#1#7'Command'#7#18'ecColSelPageBottom'#8'ShortCut' - +#4'"'#224#0#0#0#1#7'Command'#7#14'ecColSelPageUp'#8'ShortCut'#4'!'#160#0#0#0 - +#1#7'Command'#7#15'ecColSelPageTop'#8'ShortCut'#4'!'#224#0#0#0#1#7'Command'#7 - +#17'ecColSelLineStart'#8'ShortCut'#4'$'#160#0#0#0#1#7'Command'#7#15'ecColSel' - +'LineEnd'#8'ShortCut'#4'#'#160#0#0#0#1#7'Command'#7#17'ecColSelEditorTop'#8 - +'ShortCut'#4'$'#224#0#0#0#1#7'Command'#7#20'ecColSelEditorBottom'#8'ShortCut' - +#4'#'#224#0#0#0#0#12'MouseActions'#14#1#5'Shift'#11#0#9'ShiftMask'#11#7'ssSh' - +'ift'#5'ssAlt'#0#6'Button'#7#6'mbLeft'#10'ClickCount'#7#8'ccSingle'#8'ClickD' - +'ir'#7#6'cdDown'#7'Command'#2#1#9'MoveCaret'#9#6'Option'#2#0#8'Priority'#2#0 - +#0#1#5'Shift'#11#7'ssShift'#0#9'ShiftMask'#11#7'ssShift'#5'ssAlt'#0#6'Button' - +#7#6'mbLeft'#10'ClickCount'#7#8'ccSingle'#8'ClickDir'#7#6'cdDown'#7'Command' - +#2#1#9'MoveCaret'#9#6'Option'#2#1#8'Priority'#2#0#0#1#5'Shift'#11#5'ssAlt'#0 - +#9'ShiftMask'#11#7'ssShift'#5'ssAlt'#0#6'Button'#7#6'mbLeft'#10'ClickCount'#7 - +#8'ccSingle'#8'ClickDir'#7#6'cdDown'#7'Command'#2#3#9'MoveCaret'#9#6'Option' - +#2#0#8'Priority'#2#0#0#1#5'Shift'#11#7'ssShift'#5'ssAlt'#0#9'ShiftMask'#11#7 - +'ssShift'#5'ssAlt'#0#6'Button'#7#6'mbLeft'#10'ClickCount'#7#8'ccSingle'#8'Cl' - +'ickDir'#7#6'cdDown'#7'Command'#2#3#9'MoveCaret'#9#6'Option'#2#1#8'Priority' - +#2#0#0#1#5'Shift'#11#0#9'ShiftMask'#11#0#6'Button'#7#7'mbRight'#10'ClickCoun' - +'t'#7#8'ccSingle'#8'ClickDir'#7#4'cdUp'#7'Command'#2#12#9'MoveCaret'#8#6'Opt' - +'ion'#2#0#8'Priority'#2#0#0#1#5'Shift'#11#0#9'ShiftMask'#11#0#6'Button'#7#6 - +'mbLeft'#10'ClickCount'#7#8'ccDouble'#8'ClickDir'#7#6'cdDown'#7'Command'#2#6 - +#9'MoveCaret'#9#6'Option'#2#0#8'Priority'#2#0#0#1#5'Shift'#11#0#9'ShiftMask' - +#11#0#6'Button'#7#6'mbLeft'#10'ClickCount'#7#8'ccTriple'#8'ClickDir'#7#6'cdD' - +'own'#7'Command'#2#7#9'MoveCaret'#9#6'Option'#2#0#8'Priority'#2#0#0#1#5'Shif' - +'t'#11#0#9'ShiftMask'#11#0#6'Button'#7#6'mbLeft'#10'ClickCount'#7#6'ccQuad'#8 - +'ClickDir'#7#6'cdDown'#7'Command'#2#8#9'MoveCaret'#9#6'Option'#2#0#8'Priorit' - +'y'#2#0#0#1#5'Shift'#11#0#9'ShiftMask'#11#0#6'Button'#7#8'mbMiddle'#10'Click' - +'Count'#7#8'ccSingle'#8'ClickDir'#7#6'cdDown'#7'Command'#2#10#9'MoveCaret'#9 - +#6'Option'#2#0#8'Priority'#2#0#0#1#5'Shift'#11#6'ssCtrl'#0#9'ShiftMask'#11#7 - +'ssShift'#5'ssAlt'#6'ssCtrl'#0#6'Button'#7#6'mbLeft'#10'ClickCount'#7#8'ccSi' - +'ngle'#8'ClickDir'#7#4'cdUp'#7'Command'#2#11#9'MoveCaret'#8#6'Option'#2#0#8 - +'Priority'#2#0#0#0#15'MouseSelActions'#14#1#5'Shift'#11#0#9'ShiftMask'#11#0#6 + +#0#0#10'Keystrokes'#14#1#7'Command'#7#4'ecUp'#8'ShortCut'#2'&'#0#1#7'Command' + +#7#7'ecSelUp'#8'ShortCut'#3'& '#0#1#7'Command'#7#10'ecScrollUp'#8'ShortCut'#3 + +'&@'#0#1#7'Command'#7#6'ecDown'#8'ShortCut'#2'('#0#1#7'Command'#7#9'ecSelDow' + +'n'#8'ShortCut'#3'( '#0#1#7'Command'#7#12'ecScrollDown'#8'ShortCut'#3'(@'#0#1 + +#7'Command'#7#6'ecLeft'#8'ShortCut'#2'%'#0#1#7'Command'#7#9'ecSelLeft'#8'Sho' + +'rtCut'#3'% '#0#1#7'Command'#7#10'ecWordLeft'#8'ShortCut'#3'%@'#0#1#7'Comman' + +'d'#7#13'ecSelWordLeft'#8'ShortCut'#3'%`'#0#1#7'Command'#7#7'ecRight'#8'Shor' + +'tCut'#2''''#0#1#7'Command'#7#10'ecSelRight'#8'ShortCut'#3''' '#0#1#7'Comman' + +'d'#7#11'ecWordRight'#8'ShortCut'#3'''@'#0#1#7'Command'#7#14'ecSelWordRight' + +#8'ShortCut'#3'''`'#0#1#7'Command'#7#10'ecPageDown'#8'ShortCut'#2'"'#0#1#7'C' + +'ommand'#7#13'ecSelPageDown'#8'ShortCut'#3'" '#0#1#7'Command'#7#12'ecPageBot' + +'tom'#8'ShortCut'#3'"@'#0#1#7'Command'#7#15'ecSelPageBottom'#8'ShortCut'#3'"' + +'`'#0#1#7'Command'#7#8'ecPageUp'#8'ShortCut'#2'!'#0#1#7'Command'#7#11'ecSelP' + +'ageUp'#8'ShortCut'#3'! '#0#1#7'Command'#7#9'ecPageTop'#8'ShortCut'#3'!@'#0#1 + +#7'Command'#7#12'ecSelPageTop'#8'ShortCut'#3'!`'#0#1#7'Command'#7#11'ecLineS' + +'tart'#8'ShortCut'#2'$'#0#1#7'Command'#7#14'ecSelLineStart'#8'ShortCut'#3'$ ' + +#0#1#7'Command'#7#11'ecEditorTop'#8'ShortCut'#3'$@'#0#1#7'Command'#7#14'ecSe' + +'lEditorTop'#8'ShortCut'#3'$`'#0#1#7'Command'#7#9'ecLineEnd'#8'ShortCut'#2'#' + +#0#1#7'Command'#7#12'ecSelLineEnd'#8'ShortCut'#3'# '#0#1#7'Command'#7#14'ecE' + +'ditorBottom'#8'ShortCut'#3'#@'#0#1#7'Command'#7#17'ecSelEditorBottom'#8'Sho' + +'rtCut'#3'#`'#0#1#7'Command'#7#12'ecToggleMode'#8'ShortCut'#2'-'#0#1#7'Comma' + +'nd'#7#6'ecCopy'#8'ShortCut'#3'-@'#0#1#7'Command'#7#7'ecPaste'#8'ShortCut'#3 + +'- '#0#1#7'Command'#7#12'ecDeleteChar'#8'ShortCut'#2'.'#0#1#7'Command'#7#5'e' + +'cCut'#8'ShortCut'#3'. '#0#1#7'Command'#7#16'ecDeleteLastChar'#8'ShortCut'#2 + +#8#0#1#7'Command'#7#16'ecDeleteLastChar'#8'ShortCut'#3#8' '#0#1#7'Command'#7 + +#16'ecDeleteLastWord'#8'ShortCut'#3#8'@'#0#1#7'Command'#7#6'ecUndo'#8'ShortC' + +'ut'#4#8#128#0#0#0#1#7'Command'#7#6'ecRedo'#8'ShortCut'#4#8#160#0#0#0#1#7'Co' + +'mmand'#7#11'ecLineBreak'#8'ShortCut'#2#13#0#1#7'Command'#7#11'ecSelectAll'#8 + +'ShortCut'#3'A@'#0#1#7'Command'#7#6'ecCopy'#8'ShortCut'#3'C@'#0#1#7'Command' + +#7#13'ecBlockIndent'#8'ShortCut'#3'I@'#0#1#7'Command'#7#11'ecLineBreak'#8'Sh' + +'ortCut'#3'M@'#0#1#7'Command'#7#15'ecBlockUnindent'#8'ShortCut'#3'U@'#0#1#7 + +'Command'#7#7'ecPaste'#8'ShortCut'#3'V@'#0#1#7'Command'#7#5'ecCut'#8'ShortCu' + +'t'#3'X@'#0#1#7'Command'#7#12'ecDeleteLine'#8'ShortCut'#3'Y@'#0#1#7'Command' + +#7#11'ecDeleteEOL'#8'ShortCut'#3'Y`'#0#1#7'Command'#7#6'ecUndo'#8'ShortCut'#3 + +'Z@'#0#1#7'Command'#7#6'ecRedo'#8'ShortCut'#3'Z`'#0#1#7'Command'#7#13'ecGoto' + +'Marker0'#8'ShortCut'#3'0@'#0#1#7'Command'#7#13'ecGotoMarker1'#8'ShortCut'#3 + +'1@'#0#1#7'Command'#7#13'ecGotoMarker2'#8'ShortCut'#3'2@'#0#1#7'Command'#7#13 + +'ecGotoMarker3'#8'ShortCut'#3'3@'#0#1#7'Command'#7#13'ecGotoMarker4'#8'Short' + +'Cut'#3'4@'#0#1#7'Command'#7#13'ecGotoMarker5'#8'ShortCut'#3'5@'#0#1#7'Comma' + +'nd'#7#13'ecGotoMarker6'#8'ShortCut'#3'6@'#0#1#7'Command'#7#13'ecGotoMarker7' + +#8'ShortCut'#3'7@'#0#1#7'Command'#7#13'ecGotoMarker8'#8'ShortCut'#3'8@'#0#1#7 + +'Command'#7#13'ecGotoMarker9'#8'ShortCut'#3'9@'#0#1#7'Command'#7#12'ecSetMar' + +'ker0'#8'ShortCut'#3'0`'#0#1#7'Command'#7#12'ecSetMarker1'#8'ShortCut'#3'1`' + +#0#1#7'Command'#7#12'ecSetMarker2'#8'ShortCut'#3'2`'#0#1#7'Command'#7#12'ecS' + +'etMarker3'#8'ShortCut'#3'3`'#0#1#7'Command'#7#12'ecSetMarker4'#8'ShortCut'#3 + +'4`'#0#1#7'Command'#7#12'ecSetMarker5'#8'ShortCut'#3'5`'#0#1#7'Command'#7#12 + +'ecSetMarker6'#8'ShortCut'#3'6`'#0#1#7'Command'#7#12'ecSetMarker7'#8'ShortCu' + +'t'#3'7`'#0#1#7'Command'#7#12'ecSetMarker8'#8'ShortCut'#3'8`'#0#1#7'Command' + +#7#12'ecSetMarker9'#8'ShortCut'#3'9`'#0#1#7'Command'#7#12'EcFoldLevel1'#8'Sh' + ,'ortCut'#4'1'#160#0#0#0#1#7'Command'#7#12'EcFoldLevel2'#8'ShortCut'#4'2'#160 + +#0#0#0#1#7'Command'#7#12'EcFoldLevel1'#8'ShortCut'#4'3'#160#0#0#0#1#7'Comman' + +'d'#7#12'EcFoldLevel1'#8'ShortCut'#4'4'#160#0#0#0#1#7'Command'#7#12'EcFoldLe' + +'vel1'#8'ShortCut'#4'5'#160#0#0#0#1#7'Command'#7#12'EcFoldLevel6'#8'ShortCut' + +#4'6'#160#0#0#0#1#7'Command'#7#12'EcFoldLevel7'#8'ShortCut'#4'7'#160#0#0#0#1 + +#7'Command'#7#12'EcFoldLevel8'#8'ShortCut'#4'8'#160#0#0#0#1#7'Command'#7#12 + +'EcFoldLevel9'#8'ShortCut'#4'9'#160#0#0#0#1#7'Command'#7#12'EcFoldLevel0'#8 + +'ShortCut'#4'0'#160#0#0#0#1#7'Command'#7#13'EcFoldCurrent'#8'ShortCut'#4'-' + +#160#0#0#0#1#7'Command'#7#15'EcUnFoldCurrent'#8'ShortCut'#4'+'#160#0#0#0#1#7 + +'Command'#7#18'EcToggleMarkupWord'#8'ShortCut'#4'M'#128#0#0#0#1#7'Command'#7 + +#14'ecNormalSelect'#8'ShortCut'#3'N`'#0#1#7'Command'#7#14'ecColumnSelect'#8 + +'ShortCut'#3'C`'#0#1#7'Command'#7#12'ecLineSelect'#8'ShortCut'#3'L`'#0#1#7'C' + +'ommand'#7#5'ecTab'#8'ShortCut'#2#9#0#1#7'Command'#7#10'ecShiftTab'#8'ShortC' + +'ut'#3#9' '#0#1#7'Command'#7#14'ecMatchBracket'#8'ShortCut'#3'B`'#0#1#7'Comm' + +'and'#7#10'ecColSelUp'#8'ShortCut'#4'&'#160#0#0#0#1#7'Command'#7#12'ecColSel' + +'Down'#8'ShortCut'#4'('#160#0#0#0#1#7'Command'#7#12'ecColSelLeft'#8'ShortCut' + +#4'%'#160#0#0#0#1#7'Command'#7#13'ecColSelRight'#8'ShortCut'#4''''#160#0#0#0 + +#1#7'Command'#7#16'ecColSelPageDown'#8'ShortCut'#4'"'#160#0#0#0#1#7'Command' + +#7#18'ecColSelPageBottom'#8'ShortCut'#4'"'#224#0#0#0#1#7'Command'#7#14'ecCol' + +'SelPageUp'#8'ShortCut'#4'!'#160#0#0#0#1#7'Command'#7#15'ecColSelPageTop'#8 + +'ShortCut'#4'!'#224#0#0#0#1#7'Command'#7#17'ecColSelLineStart'#8'ShortCut'#4 + +'$'#160#0#0#0#1#7'Command'#7#15'ecColSelLineEnd'#8'ShortCut'#4'#'#160#0#0#0#1 + +#7'Command'#7#17'ecColSelEditorTop'#8'ShortCut'#4'$'#224#0#0#0#1#7'Command'#7 + +#20'ecColSelEditorBottom'#8'ShortCut'#4'#'#224#0#0#0#0#12'MouseActions'#14#1 + +#5'Shift'#11#0#9'ShiftMask'#11#7'ssShift'#5'ssAlt'#0#6'Button'#7#6'mbLeft'#10 + +'ClickCount'#7#8'ccSingle'#8'ClickDir'#7#6'cdDown'#7'Command'#2#1#9'MoveCare' + +'t'#9#6'Option'#2#0#8'Priority'#2#0#0#1#5'Shift'#11#7'ssShift'#0#9'ShiftMask' + +#11#7'ssShift'#5'ssAlt'#0#6'Button'#7#6'mbLeft'#10'ClickCount'#7#8'ccSingle' + +#8'ClickDir'#7#6'cdDown'#7'Command'#2#1#9'MoveCaret'#9#6'Option'#2#1#8'Prior' + +'ity'#2#0#0#1#5'Shift'#11#5'ssAlt'#0#9'ShiftMask'#11#7'ssShift'#5'ssAlt'#0#6 +'Button'#7#6'mbLeft'#10'ClickCount'#7#8'ccSingle'#8'ClickDir'#7#6'cdDown'#7 - +'Command'#2#9#9'MoveCaret'#8#6'Option'#2#0#8'Priority'#2#0#0#0#13'Lines.Stri' - +'ngs'#1#6#12'program new;'#6#5'begin'#6#4'end.'#0#7'Options'#11#12'eoAutoInd' - +'ent'#11'eoGroupUndo'#15'eoScrollPastEol'#11'eoSmartTabs'#11'eoTabIndent'#14 - +'eoTabsToSpaces'#20'eoTrimTrailingSpaces'#18'eoBracketHighlight'#0#21'Bracke' - +'tHighlightStyle'#7#8'sbhsBoth'#8'OnChange'#7#13'SynEditChange'#18'OnCommand' - +'Processed'#7#23'SynEditCommandProcessed'#16'OnProcessCommand'#7#21'SynEditP' - +'rocessCommand'#20'OnProcessUserCommand'#7#25'SynEditProcessUserCommand'#19 - +'OnSpecialLineColors'#7#24'SynEditSpecialLineColors'#14'OnStatusChange'#7#19 - +'SynEditStatusChange'#0#244#18'TSynGutterPartList'#0#0#15'TSynGutterMarks'#0 - +#5'Width'#2#23#0#0#20'TSynGutterLineNumber'#0#5'Width'#2#17#12'MouseActions' - +#14#0#21'MarkupInfo.Background'#7#9'clBtnFace'#21'MarkupInfo.Foreground'#7#6 - +'clNone'#10'DigitCount'#2#2#30'ShowOnlyLineNumbersMultiplesOf'#2#1#9'ZeroSta' - +'rt'#8#12'LeadingZeros'#8#0#0#17'TSynGutterChanges'#0#5'Width'#2#4#13'Modifi' - ,'edColor'#4#252#233#0#0#10'SavedColor'#7#7'clGreen'#0#0#19'TSynGutterSeparat' - +'or'#0#5'Width'#2#2#0#0#21'TSynGutterCodeFolding'#0#12'MouseActions'#14#1#5 - +'Shift'#11#0#9'ShiftMask'#11#0#6'Button'#7#7'mbRight'#10'ClickCount'#7#8'ccS' - +'ingle'#8'ClickDir'#7#4'cdUp'#7'Command'#2#16#9'MoveCaret'#8#6'Option'#2#0#8 - +'Priority'#2#0#0#1#5'Shift'#11#0#9'ShiftMask'#11#7'ssShift'#0#6'Button'#7#8 - +'mbMiddle'#10'ClickCount'#7#5'ccAny'#8'ClickDir'#7#6'cdDown'#7'Command'#2#14 - +#9'MoveCaret'#8#6'Option'#2#0#8'Priority'#2#0#0#1#5'Shift'#11#7'ssShift'#0#9 - +'ShiftMask'#11#7'ssShift'#0#6'Button'#7#8'mbMiddle'#10'ClickCount'#7#5'ccAny' - +#8'ClickDir'#7#6'cdDown'#7'Command'#2#14#9'MoveCaret'#8#6'Option'#2#1#8'Prio' - +'rity'#2#0#0#1#5'Shift'#11#0#9'ShiftMask'#11#0#6'Button'#7#6'mbLeft'#10'Clic' - +'kCount'#7#5'ccAny'#8'ClickDir'#7#6'cdDown'#7'Command'#2#0#9'MoveCaret'#8#6 - +'Option'#2#0#8'Priority'#2#0#0#0#21'MarkupInfo.Background'#7#6'clNone'#21'Ma' - +'rkupInfo.Foreground'#7#6'clGray'#20'MouseActionsExpanded'#14#1#5'Shift'#11#0 - +#9'ShiftMask'#11#0#6'Button'#7#6'mbLeft'#10'ClickCount'#7#5'ccAny'#8'ClickDi' - +'r'#7#6'cdDown'#7'Command'#2#14#9'MoveCaret'#8#6'Option'#2#0#8'Priority'#2#0 - +#0#0#21'MouseActionsCollapsed'#14#1#5'Shift'#11#6'ssCtrl'#0#9'ShiftMask'#11#6 - +'ssCtrl'#0#6'Button'#7#6'mbLeft'#10'ClickCount'#7#5'ccAny'#8'ClickDir'#7#6'c' - +'dDown'#7'Command'#2#15#9'MoveCaret'#8#6'Option'#2#0#8'Priority'#2#0#0#1#5'S' - +'hift'#11#0#9'ShiftMask'#11#6'ssCtrl'#0#6'Button'#7#6'mbLeft'#10'ClickCount' - +#7#5'ccAny'#8'ClickDir'#7#6'cdDown'#7'Command'#2#15#9'MoveCaret'#8#6'Option' - +#2#1#8'Priority'#2#0#0#0#0#0#0#0#17'TSynFreePascalSyn'#17'SynFreePascalSyn1' - +#7'Enabled'#8#23'CommentAttri.Foreground'#7#6'clBlue'#18'CommentAttri.Style' - +#11#6'fsBold'#0#26'IdentifierAttri.Foreground'#7#9'clDefault'#22'NumberAttri' - +'.Foreground'#7#6'clNavy'#22'StringAttri.Foreground'#7#6'clBlue'#22'SymbolAt' - +'tri.Foreground'#7#5'clRed'#25'DirectiveAttri.Foreground'#7#5'clRed'#20'Dire' - +'ctiveAttri.Style'#11#6'fsBold'#0#12'CompilerMode'#7#9'pcmObjFPC'#14'NestedC' - +'omments'#9#4'left'#3'@'#1#3'top'#2#16#0#0#0 + +'Command'#2#3#9'MoveCaret'#9#6'Option'#2#0#8'Priority'#2#0#0#1#5'Shift'#11#7 + +'ssShift'#5'ssAlt'#0#9'ShiftMask'#11#7'ssShift'#5'ssAlt'#0#6'Button'#7#6'mbL' + +'eft'#10'ClickCount'#7#8'ccSingle'#8'ClickDir'#7#6'cdDown'#7'Command'#2#3#9 + +'MoveCaret'#9#6'Option'#2#1#8'Priority'#2#0#0#1#5'Shift'#11#0#9'ShiftMask'#11 + +#0#6'Button'#7#7'mbRight'#10'ClickCount'#7#8'ccSingle'#8'ClickDir'#7#4'cdUp' + +#7'Command'#2#12#9'MoveCaret'#8#6'Option'#2#0#8'Priority'#2#0#0#1#5'Shift'#11 + +#0#9'ShiftMask'#11#0#6'Button'#7#6'mbLeft'#10'ClickCount'#7#8'ccDouble'#8'Cl' + +'ickDir'#7#6'cdDown'#7'Command'#2#6#9'MoveCaret'#9#6'Option'#2#0#8'Priority' + +#2#0#0#1#5'Shift'#11#0#9'ShiftMask'#11#0#6'Button'#7#6'mbLeft'#10'ClickCount' + +#7#8'ccTriple'#8'ClickDir'#7#6'cdDown'#7'Command'#2#7#9'MoveCaret'#9#6'Optio' + +'n'#2#0#8'Priority'#2#0#0#1#5'Shift'#11#0#9'ShiftMask'#11#0#6'Button'#7#6'mb' + +'Left'#10'ClickCount'#7#6'ccQuad'#8'ClickDir'#7#6'cdDown'#7'Command'#2#8#9'M' + +'oveCaret'#9#6'Option'#2#0#8'Priority'#2#0#0#1#5'Shift'#11#0#9'ShiftMask'#11 + +#0#6'Button'#7#8'mbMiddle'#10'ClickCount'#7#8'ccSingle'#8'ClickDir'#7#6'cdDo' + +'wn'#7'Command'#2#10#9'MoveCaret'#9#6'Option'#2#0#8'Priority'#2#0#0#1#5'Shif' + +'t'#11#6'ssCtrl'#0#9'ShiftMask'#11#7'ssShift'#5'ssAlt'#6'ssCtrl'#0#6'Button' + +#7#6'mbLeft'#10'ClickCount'#7#8'ccSingle'#8'ClickDir'#7#4'cdUp'#7'Command'#2 + +#11#9'MoveCaret'#8#6'Option'#2#0#8'Priority'#2#0#0#0#15'MouseSelActions'#14#1 + +#5'Shift'#11#0#9'ShiftMask'#11#0#6'Button'#7#6'mbLeft'#10'ClickCount'#7#8'cc' + +'Single'#8'ClickDir'#7#6'cdDown'#7'Command'#2#9#9'MoveCaret'#8#6'Option'#2#0 + +#8'Priority'#2#0#0#0#13'Lines.Strings'#1#6#12'program new;'#6#5'begin'#6#4'e' + +'nd.'#0#7'Options'#11#12'eoAutoIndent'#11'eoGroupUndo'#15'eoScrollPastEol'#11 + +'eoSmartTabs'#11'eoTabIndent'#14'eoTabsToSpaces'#20'eoTrimTrailingSpaces'#18 + +'eoBracketHighlight'#0#21'BracketHighlightStyle'#7#8'sbhsBoth'#8'OnChange'#7 + +#13'SynEditChange'#18'OnCommandProcessed'#7#23'SynEditCommandProcessed'#16'O' + +'nProcessCommand'#7#21'SynEditProcessCommand'#20'OnProcessUserCommand'#7#25 + +'SynEditProcessUserCommand'#19'OnSpecialLineColors'#7#24'SynEditSpecialLineC' + +'olors'#14'OnStatusChange'#7#19'SynEditStatusChange'#0#244#18'TSynGutterPart' + +'List'#0#0#15'TSynGutterMarks'#0#5'Width'#2#23#0#0#20'TSynGutterLineNumber'#0 + +#5'Width'#2#17#12'MouseActions'#14#0#21'MarkupInfo.Background'#7#9'clBtnFace' + +#21'MarkupInfo.Foreground'#7#6'clNone'#10'DigitCount'#2#2#30'ShowOnlyLineNum' + +'bersMultiplesOf'#2#1#9'ZeroStart'#8#12'LeadingZeros'#8#0#0#17'TSynGutterCha' + +'nges'#0#5'Width'#2#4#13'ModifiedColor'#4#252#233#0#0#10'SavedColor'#7#7'clG' + ,'reen'#0#0#19'TSynGutterSeparator'#0#5'Width'#2#2#0#0#21'TSynGutterCodeFoldi' + +'ng'#0#12'MouseActions'#14#1#5'Shift'#11#0#9'ShiftMask'#11#0#6'Button'#7#7'm' + +'bRight'#10'ClickCount'#7#8'ccSingle'#8'ClickDir'#7#4'cdUp'#7'Command'#2#16#9 + +'MoveCaret'#8#6'Option'#2#0#8'Priority'#2#0#0#1#5'Shift'#11#0#9'ShiftMask'#11 + +#7'ssShift'#0#6'Button'#7#8'mbMiddle'#10'ClickCount'#7#5'ccAny'#8'ClickDir'#7 + +#6'cdDown'#7'Command'#2#14#9'MoveCaret'#8#6'Option'#2#0#8'Priority'#2#0#0#1#5 + +'Shift'#11#7'ssShift'#0#9'ShiftMask'#11#7'ssShift'#0#6'Button'#7#8'mbMiddle' + +#10'ClickCount'#7#5'ccAny'#8'ClickDir'#7#6'cdDown'#7'Command'#2#14#9'MoveCar' + +'et'#8#6'Option'#2#1#8'Priority'#2#0#0#1#5'Shift'#11#0#9'ShiftMask'#11#0#6'B' + +'utton'#7#6'mbLeft'#10'ClickCount'#7#5'ccAny'#8'ClickDir'#7#6'cdDown'#7'Comm' + +'and'#2#0#9'MoveCaret'#8#6'Option'#2#0#8'Priority'#2#0#0#0#21'MarkupInfo.Bac' + +'kground'#7#6'clNone'#21'MarkupInfo.Foreground'#7#6'clGray'#20'MouseActionsE' + +'xpanded'#14#1#5'Shift'#11#0#9'ShiftMask'#11#0#6'Button'#7#6'mbLeft'#10'Clic' + +'kCount'#7#5'ccAny'#8'ClickDir'#7#6'cdDown'#7'Command'#2#14#9'MoveCaret'#8#6 + +'Option'#2#0#8'Priority'#2#0#0#0#21'MouseActionsCollapsed'#14#1#5'Shift'#11#6 + +'ssCtrl'#0#9'ShiftMask'#11#6'ssCtrl'#0#6'Button'#7#6'mbLeft'#10'ClickCount'#7 + +#5'ccAny'#8'ClickDir'#7#6'cdDown'#7'Command'#2#15#9'MoveCaret'#8#6'Option'#2 + +#0#8'Priority'#2#0#0#1#5'Shift'#11#0#9'ShiftMask'#11#6'ssCtrl'#0#6'Button'#7 + +#6'mbLeft'#10'ClickCount'#7#5'ccAny'#8'ClickDir'#7#6'cdDown'#7'Command'#2#15 + +#9'MoveCaret'#8#6'Option'#2#1#8'Priority'#2#0#0#0#0#0#0#0#0 ]); diff --git a/Projects/SAMufasaGUI/framescript.pas b/Projects/SAMufasaGUI/framescript.pas index 16abd9c..e1e7f48 100644 --- a/Projects/SAMufasaGUI/framescript.pas +++ b/Projects/SAMufasaGUI/framescript.pas @@ -46,7 +46,6 @@ type TScriptFrame = class(TFrame) SynEdit: TSynEdit; - SynFreePascalSyn1: TSynFreePascalSyn; procedure SynEditChange(Sender: TObject); procedure SynEditClickLink(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); @@ -608,8 +607,8 @@ begin FScriptState:= ss_None; ScriptErrorLine:= -1; OwnerSheet.Caption:= ScriptName; - SynEdit.Options:= SynEdit.Options + [eoTabIndent] - [{eoGroupUndo,} eoSmartTabs]; - //SynEdit.Options:= SynEdit.Options + [eoTabIndent]; + SynEdit.Highlighter := Form1.CurrHighlighter; + SynEdit.Options:= SynEdit.Options + [eoTabIndent] - [eoSmartTabs]; SynEdit.IncrementColor.Background := $30D070; SynEdit.HighlightAllColor.Background:= clYellow; SynEdit.HighlightAllColor.Foreground:= clDefault; diff --git a/Projects/SAMufasaGUI/psextension.pas b/Projects/SAMufasaGUI/psextension.pas index 14fd367..9f24c6f 100644 --- a/Projects/SAMufasaGUI/psextension.pas +++ b/Projects/SAMufasaGUI/psextension.pas @@ -49,7 +49,7 @@ uses uPSC_extctrls,uPSC_menus, //Compile libs uPSR_std, uPSR_controls,uPSR_classes,uPSR_graphics,uPSR_stdctrls,uPSR_forms, uPSR_extctrls,uPSR_menus, //Runtime-libs - testunit,updateform,settingssandbox,bitmaps//Writeln + testunit,updateform,settingssandbox,bitmaps,mmisc//Writeln ; function TSimbaPSExtension.HookExists(HookName: String): Boolean; @@ -116,8 +116,18 @@ end; procedure TSimbaPSExtension.RegisterMyMethods(Sender: TPSScript); begin + Sender.Comp.AddTypes('TStringArray','Array of String'); + Sender.Comp.AddConstantN('AppPath','string').SetString(MainDir + DirectorySeparator); + Sender.Comp.AddConstantN('IncludePath','string').SetString(Form1.IncludePath); + Sender.Comp.AddConstantN('PluginPath','string').SetString(Form1.PluginPath); + Sender.Comp.AddConstantN('FontPath','string').SetString(form1.FontPath); + Sender.Comp.AddConstantN('ExtPath','string').SetString(form1.ExtPath); Sender.AddFunction(@formWritelnEx,'procedure Writeln(s : string)'); - Sender.AddFunction(@ext_GetPage,'function GetPage(url : string) : string'); + Sender.AddFunction(@ext_GetPage,'function GetPage(const url : string) : string'); + Sender.AddFunction(@ext_DecompressBZip2,'function DecompressBZip2(const input: string;out output : string; const BlockSize: Cardinal): boolean;'); + Sender.AddFunction(@ext_UnTar,'function UnTar(const Input : string; out Content : TStringArray) : boolean;'); + Sender.AddFunction(@ext_UnTarEx,'function UnTarEx(const Input : string;const outputdir : string; overwrite : boolean): boolean;'); + Sender.AddRegisteredPTRVariable('Settings','TMMLSettingsSandbox'); Sender.AddRegisteredVariable('Simba','TForm'); Sender.AddRegisteredVariable('Simba_MainMenu','TMainMenu'); diff --git a/Projects/SAMufasaGUI/testunit.lfm b/Projects/SAMufasaGUI/testunit.lfm index 720d54e..e358802 100644 --- a/Projects/SAMufasaGUI/testunit.lfm +++ b/Projects/SAMufasaGUI/testunit.lfm @@ -28,14 +28,14 @@ object Form1: TForm1 ShowHint = True TabOrder = 0 object TB_Run: TToolButton - Left = 168 + Left = 170 Hint = 'Run' Top = 2 Action = ActionRunScript ImageIndex = 6 end object TB_Pause: TToolButton - Left = 191 + Left = 193 Hint = 'Pause' Top = 2 Action = ActionPauseScript @@ -43,7 +43,7 @@ object Form1: TForm1 ImageIndex = 5 end object TB_Stop: TToolButton - Left = 214 + Left = 216 Hint = 'Stop' Top = 2 Action = ActionStopScript @@ -51,39 +51,39 @@ object Form1: TForm1 ImageIndex = 7 end object ToolButton1: TToolButton - Left = 237 + Left = 239 Top = 2 - Width = 3 + Width = 4 Caption = 'ToolButton1' Style = tbsDivider end object TB_NewTab: TToolButton - Left = 240 + Left = 243 Hint = 'Add tab' Top = 2 Action = ActionNewTab end object TB_CloseTab: TToolButton - Left = 263 + Left = 266 Hint = 'Close tab' Top = 2 Action = ActionCloseTab end object ToolButton4: TToolButton - Left = 286 + Left = 289 Top = 2 - Width = 3 + Width = 4 Caption = 'ToolButton4' Style = tbsDivider end object TB_ClearDebug: TToolButton - Left = 289 + Left = 293 Hint = 'Clear debug box' Top = 2 Action = ActionClearDebug end object TB_PickColour: TToolButton - Left = 312 + Left = 316 Hint = 'Pick a color' Top = 2 Caption = 'TB_PickColour' @@ -91,7 +91,7 @@ object Form1: TForm1 OnClick = ButtonPickClick end object TB_SelectClient: TToolButton - Left = 335 + Left = 339 Hint = 'Select a client' Top = 2 Caption = 'TB_SelectClient' @@ -99,14 +99,14 @@ object Form1: TForm1 OnMouseDown = ButtonSelectorDown end object ToolButton8: TToolButton - Left = 358 + Left = 362 Top = 2 - Width = 3 + Width = 4 Caption = 'ToolButton8' Style = tbsDivider end object TB_ReloadPlugins: TToolButton - Left = 361 + Left = 366 Hint = 'Reload plugins' Top = 2 Caption = 'TB_ReloadPlugins' @@ -114,7 +114,7 @@ object Form1: TForm1 ImageIndex = 13 end object TB_Tray: TToolButton - Left = 384 + Left = 389 Hint = 'Minimize to tray' Top = 2 Caption = 'TB_Tray' @@ -132,7 +132,7 @@ object Form1: TForm1 object ToolButton2: TToolButton Left = 93 Top = 2 - Width = 3 + Width = 4 Caption = 'ToolButton2' Style = tbsDivider end @@ -158,14 +158,14 @@ object Form1: TForm1 Enabled = False end object ToolButton3: TToolButton - Left = 430 + Left = 435 Top = 2 - Width = 3 + Width = 4 Caption = 'ToolButton3' Style = tbsDivider end object TT_Update: TToolButton - Left = 433 + Left = 439 Hint = 'A new update is available' Top = 2 Caption = 'TT_Update' @@ -173,33 +173,33 @@ object Form1: TForm1 OnClick = TT_UpdateClick end object TT_Cut: TToolButton - Left = 96 + Left = 97 Top = 2 Caption = 'Cu&t' ImageIndex = 3 OnClick = ActionCutExecute end object TT_Copy: TToolButton - Left = 119 + Left = 120 Top = 2 Caption = '&Copy' ImageIndex = 22 OnClick = ActionCopyExecute end object TT_Paste: TToolButton - Left = 142 + Left = 143 Top = 2 Action = ActionPaste end object ToolButton9: TToolButton - Left = 165 + Left = 166 Top = 2 - Width = 3 + Width = 4 Caption = 'ToolButton9' Style = tbsDivider end object TT_Console: TToolButton - Left = 407 + Left = 412 Hint = 'Hide/Show Console' Top = 2 Action = ActionConsole @@ -396,10 +396,10 @@ object Form1: TForm1 EditLabel.AnchorSideTop.Side = asrCenter EditLabel.AnchorSideRight.Control = LabeledEditSearch EditLabel.AnchorSideBottom.Control = LabeledEditSearch - EditLabel.Left = 71 - EditLabel.Height = 16 - EditLabel.Top = 8 - EditLabel.Width = 30 + EditLabel.Left = 73 + EditLabel.Height = 14 + EditLabel.Top = 9 + EditLabel.Width = 28 EditLabel.Caption = 'Find: ' EditLabel.ParentColor = False LabelPosition = lpLeft @@ -3085,4 +3085,30 @@ object Form1: TForm1 left = 488 top = 200 end + object LazHighlighter: TSynFreePascalSyn + Enabled = False + CommentAttri.Foreground = clBlue + CommentAttri.Style = [fsBold] + IdentifierAttri.Foreground = clDefault + NumberAttri.Foreground = clNavy + StringAttri.Foreground = clBlue + SymbolAttri.Foreground = clRed + DirectiveAttri.Foreground = clRed + DirectiveAttri.Style = [fsBold] + CompilerMode = pcmObjFPC + NestedComments = True + left = 528 + top = 200 + end + object SCARHighlighter: TSynFreePascalSyn + Enabled = False + CommentAttri.Foreground = clGreen + CommentAttri.Style = [] + NumberAttri.Foreground = clHotLight + StringAttri.Foreground = clFuchsia + CompilerMode = pcmObjFPC + NestedComments = True + left = 568 + top = 200 + end end diff --git a/Projects/SAMufasaGUI/testunit.lrs b/Projects/SAMufasaGUI/testunit.lrs index e60271b..1e11cb5 100644 --- a/Projects/SAMufasaGUI/testunit.lrs +++ b/Projects/SAMufasaGUI/testunit.lrs @@ -10,50 +10,50 @@ LazarusResources.Add('TForm1','FORMDATA',[ +'Visible'#9#0#8'TToolBar'#8'ToolBar1'#4'Left'#2#0#6'Height'#2#24#3'Top'#2#0#5 +'Width'#3#154#2#7'Caption'#6#8'ToolBar1'#6'Images'#7#17'Mufasa_Image_List'#14 +'ParentShowHint'#8#8'ShowHint'#9#8'TabOrder'#2#0#0#11'TToolButton'#6'TB_Run' - +#4'Left'#3#168#0#4'Hint'#6#3'Run'#3'Top'#2#2#6'Action'#7#15'ActionRunScript' - +#10'ImageIndex'#2#6#0#0#11'TToolButton'#8'TB_Pause'#4'Left'#3#191#0#4'Hint'#6 + +#4'Left'#3#170#0#4'Hint'#6#3'Run'#3'Top'#2#2#6'Action'#7#15'ActionRunScript' + +#10'ImageIndex'#2#6#0#0#11'TToolButton'#8'TB_Pause'#4'Left'#3#193#0#4'Hint'#6 +#5'Pause'#3'Top'#2#2#6'Action'#7#17'ActionPauseScript'#7'Enabled'#8#10'Image' - +'Index'#2#5#0#0#11'TToolButton'#7'TB_Stop'#4'Left'#3#214#0#4'Hint'#6#4'Stop' + +'Index'#2#5#0#0#11'TToolButton'#7'TB_Stop'#4'Left'#3#216#0#4'Hint'#6#4'Stop' +#3'Top'#2#2#6'Action'#7#16'ActionStopScript'#7'Enabled'#8#10'ImageIndex'#2#7 - +#0#0#11'TToolButton'#11'ToolButton1'#4'Left'#3#237#0#3'Top'#2#2#5'Width'#2#3 + +#0#0#11'TToolButton'#11'ToolButton1'#4'Left'#3#239#0#3'Top'#2#2#5'Width'#2#4 +#7'Caption'#6#11'ToolButton1'#5'Style'#7#10'tbsDivider'#0#0#11'TToolButton'#9 - +'TB_NewTab'#4'Left'#3#240#0#4'Hint'#6#7'Add tab'#3'Top'#2#2#6'Action'#7#12'A' - +'ctionNewTab'#0#0#11'TToolButton'#11'TB_CloseTab'#4'Left'#3#7#1#4'Hint'#6#9 + +'TB_NewTab'#4'Left'#3#243#0#4'Hint'#6#7'Add tab'#3'Top'#2#2#6'Action'#7#12'A' + +'ctionNewTab'#0#0#11'TToolButton'#11'TB_CloseTab'#4'Left'#3#10#1#4'Hint'#6#9 +'Close tab'#3'Top'#2#2#6'Action'#7#14'ActionCloseTab'#0#0#11'TToolButton'#11 - +'ToolButton4'#4'Left'#3#30#1#3'Top'#2#2#5'Width'#2#3#7'Caption'#6#11'ToolBut' + +'ToolButton4'#4'Left'#3'!'#1#3'Top'#2#2#5'Width'#2#4#7'Caption'#6#11'ToolBut' +'ton4'#5'Style'#7#10'tbsDivider'#0#0#11'TToolButton'#13'TB_ClearDebug'#4'Lef' - +'t'#3'!'#1#4'Hint'#6#15'Clear debug box'#3'Top'#2#2#6'Action'#7#16'ActionCle' - +'arDebug'#0#0#11'TToolButton'#13'TB_PickColour'#4'Left'#3'8'#1#4'Hint'#6#12 + +'t'#3'%'#1#4'Hint'#6#15'Clear debug box'#3'Top'#2#2#6'Action'#7#16'ActionCle' + +'arDebug'#0#0#11'TToolButton'#13'TB_PickColour'#4'Left'#3'<'#1#4'Hint'#6#12 +'Pick a color'#3'Top'#2#2#7'Caption'#6#13'TB_PickColour'#10'ImageIndex'#2#0#7 +'OnClick'#7#15'ButtonPickClick'#0#0#11'TToolButton'#15'TB_SelectClient'#4'Le' - +'ft'#3'O'#1#4'Hint'#6#15'Select a client'#3'Top'#2#2#7'Caption'#6#15'TB_Sele' + +'ft'#3'S'#1#4'Hint'#6#15'Select a client'#3'Top'#2#2#7'Caption'#6#15'TB_Sele' +'ctClient'#10'ImageIndex'#2#2#11'OnMouseDown'#7#18'ButtonSelectorDown'#0#0#11 - +'TToolButton'#11'ToolButton8'#4'Left'#3'f'#1#3'Top'#2#2#5'Width'#2#3#7'Capti' + +'TToolButton'#11'ToolButton8'#4'Left'#3'j'#1#3'Top'#2#2#5'Width'#2#4#7'Capti' +'on'#6#11'ToolButton8'#5'Style'#7#10'tbsDivider'#0#0#11'TToolButton'#16'TB_R' - +'eloadPlugins'#4'Left'#3'i'#1#4'Hint'#6#14'Reload plugins'#3'Top'#2#2#7'Capt' + +'eloadPlugins'#4'Left'#3'n'#1#4'Hint'#6#14'Reload plugins'#3'Top'#2#2#7'Capt' +'ion'#6#16'TB_ReloadPlugins'#7'Enabled'#8#10'ImageIndex'#2#13#0#0#11'TToolBu' - +'tton'#7'TB_Tray'#4'Left'#3#128#1#4'Hint'#6#16'Minimize to tray'#3'Top'#2#2#7 + +'tton'#7'TB_Tray'#4'Left'#3#133#1#4'Hint'#6#16'Minimize to tray'#3'Top'#2#2#7 +'Caption'#6#7'TB_Tray'#10'ImageIndex'#2#17#7'OnClick'#7#15'ButtonTrayClick'#0 +#0#11'TToolButton'#6'TB_New'#4'Left'#2#1#4'Hint'#6#3'New'#3'Top'#2#2#6'Actio' +'n'#7#15'ActionNewScript'#14'ParentShowHint'#8#8'ShowHint'#9#0#0#11'TToolBut' - +'ton'#11'ToolButton2'#4'Left'#2']'#3'Top'#2#2#5'Width'#2#3#7'Caption'#6#11'T' + +'ton'#11'ToolButton2'#4'Left'#2']'#3'Top'#2#2#5'Width'#2#4#7'Caption'#6#11'T' +'oolButton2'#5'Style'#7#10'tbsDivider'#0#0#11'TToolButton'#7'TB_Open'#4'Left' +#2#24#4'Hint'#6#4'Open'#3'Top'#2#2#6'Action'#7#16'ActionOpenScript'#14'Paren' +'tShowHint'#8#8'ShowHint'#9#0#0#11'TToolButton'#7'TB_Save'#4'Left'#2'/'#4'Hi' +'nt'#6#4'Save'#3'Top'#2#2#6'Action'#7#16'ActionSaveScript'#0#0#11'TToolButto' +'n'#10'TB_SaveAll'#4'Left'#2'F'#4'Hint'#6#8'Save all'#3'Top'#2#2#6'Action'#7 +#13'ActionSaveAll'#7'Enabled'#8#0#0#11'TToolButton'#11'ToolButton3'#4'Left'#3 - +#174#1#3'Top'#2#2#5'Width'#2#3#7'Caption'#6#11'ToolButton3'#5'Style'#7#10'tb' - +'sDivider'#0#0#11'TToolButton'#9'TT_Update'#4'Left'#3#177#1#4'Hint'#6#25'A n' + +#179#1#3'Top'#2#2#5'Width'#2#4#7'Caption'#6#11'ToolButton3'#5'Style'#7#10'tb' + +'sDivider'#0#0#11'TToolButton'#9'TT_Update'#4'Left'#3#183#1#4'Hint'#6#25'A n' +'ew update is available'#3'Top'#2#2#7'Caption'#6#9'TT_Update'#10'ImageIndex' +#2#1#7'OnClick'#7#14'TT_UpdateClick'#0#0#11'TToolButton'#6'TT_Cut'#4'Left'#2 - +'`'#3'Top'#2#2#7'Caption'#6#4'Cu&t'#10'ImageIndex'#2#3#7'OnClick'#7#16'Actio' - +'nCutExecute'#0#0#11'TToolButton'#7'TT_Copy'#4'Left'#2'w'#3'Top'#2#2#7'Capti' + +'a'#3'Top'#2#2#7'Caption'#6#4'Cu&t'#10'ImageIndex'#2#3#7'OnClick'#7#16'Actio' + +'nCutExecute'#0#0#11'TToolButton'#7'TT_Copy'#4'Left'#2'x'#3'Top'#2#2#7'Capti' +'on'#6#5'&Copy'#10'ImageIndex'#2#22#7'OnClick'#7#17'ActionCopyExecute'#0#0#11 - +'TToolButton'#8'TT_Paste'#4'Left'#3#142#0#3'Top'#2#2#6'Action'#7#11'ActionPa' - +'ste'#0#0#11'TToolButton'#11'ToolButton9'#4'Left'#3#165#0#3'Top'#2#2#5'Width' - +#2#3#7'Caption'#6#11'ToolButton9'#5'Style'#7#10'tbsDivider'#0#0#11'TToolButt' - +'on'#10'TT_Console'#4'Left'#3#151#1#4'Hint'#6#17'Hide/Show Console'#3'Top'#2 + +'TToolButton'#8'TT_Paste'#4'Left'#3#143#0#3'Top'#2#2#6'Action'#7#11'ActionPa' + +'ste'#0#0#11'TToolButton'#11'ToolButton9'#4'Left'#3#166#0#3'Top'#2#2#5'Width' + +#2#4#7'Caption'#6#11'ToolButton9'#5'Style'#7#10'tbsDivider'#0#0#11'TToolButt' + +'on'#10'TT_Console'#4'Left'#3#156#1#4'Hint'#6#17'Hide/Show Console'#3'Top'#2 +#2#6'Action'#7#13'ActionConsole'#0#0#0#10'TStatusBar'#9'StatusBar'#4'Left'#2 +#0#6'Height'#2#23#3'Top'#3#2#2#5'Width'#3#154#2#6'Panels'#14#1#5'Width'#2'<' +#0#1#4'Text'#6#8'MouseBla'#5'Width'#2'd'#0#1#4'Text'#6#8'Untitled'#5'Width'#2 @@ -150,8 +150,8 @@ LazarusResources.Add('TForm1','FORMDATA',[ +#7#17'LabeledEditSearch'#31'EditLabel.AnchorSideTop.Control'#7#17'LabeledEdi' +'tSearch'#28'EditLabel.AnchorSideTop.Side'#7#9'asrCenter!EditLabel.AnchorSid' +'eRight.Control'#7#17'LabeledEditSearch"EditLabel.AnchorSideBottom.Control'#7 - +#17'LabeledEditSearch'#14'EditLabel.Left'#2'G'#16'EditLabel.Height'#2#16#13 - +'EditLabel.Top'#2#8#15'EditLabel.Width'#2#30#17'EditLabel.Caption'#6#6'Find:' + +#17'LabeledEditSearch'#14'EditLabel.Left'#2'I'#16'EditLabel.Height'#2#14#13 + +'EditLabel.Top'#2#9#15'EditLabel.Width'#2#28#17'EditLabel.Caption'#6#6'Find:' +' '#21'EditLabel.ParentColor'#8#13'LabelPosition'#7#6'lpLeft'#8'TabOrder'#2#0 +#8'OnChange'#7#16'EditSearchChange'#7'OnEnter'#7#22'LabeledEditSearchEnter'#6 +'OnExit'#7#21'LabeledEditSearchExit'#9'OnKeyDown'#7#24'LabeledEditSearchKeyD' @@ -3142,5 +3142,15 @@ LazarusResources.Add('TForm1','FORMDATA',[ +'UpdateTimer'#8'Interval'#3#16''''#4'left'#3'`'#2#3'top'#3#144#0#0#0#6'TTime' +'r'#10'MouseTimer'#8'Interval'#2'd'#7'OnTimer'#7#17'ChangeMouseStatus'#4'lef' +'t'#3#192#1#3'top'#3#200#0#0#0#6'TTimer'#9'NewsTimer'#8'Interval'#3#244#1#7 - +'OnTimer'#7#14'NewsTimerTimer'#4'left'#3#232#1#3'top'#3#200#0#0#0#0 + +'OnTimer'#7#14'NewsTimerTimer'#4'left'#3#232#1#3'top'#3#200#0#0#0#17'TSynFre' + +'ePascalSyn'#14'LazHighlighter'#7'Enabled'#8#23'CommentAttri.Foreground'#7#6 + +'clBlue'#18'CommentAttri.Style'#11#6'fsBold'#0#26'IdentifierAttri.Foreground' + +#7#9'clDefault'#22'NumberAttri.Foreground'#7#6'clNavy'#22'StringAttri.Foregr' + +'ound'#7#6'clBlue'#22'SymbolAttri.Foreground'#7#5'clRed'#25'DirectiveAttri.F' + +'oreground'#7#5'clRed'#20'DirectiveAttri.Style'#11#6'fsBold'#0#12'CompilerMo' + +'de'#7#9'pcmObjFPC'#14'NestedComments'#9#4'left'#3#16#2#3'top'#3#200#0#0#0#17 + +'TSynFreePascalSyn'#15'SCARHighlighter'#7'Enabled'#8#23'CommentAttri.Foregro' + +'und'#7#7'clGreen'#18'CommentAttri.Style'#11#0#22'NumberAttri.Foreground'#7 + +#10'clHotLight'#22'StringAttri.Foreground'#7#9'clFuchsia'#12'CompilerMode'#7 + +#9'pcmObjFPC'#14'NestedComments'#9#4'left'#3'8'#2#3'top'#3#200#0#0#0#0 ]); diff --git a/Projects/SAMufasaGUI/testunit.pas b/Projects/SAMufasaGUI/testunit.pas index eef3fa6..04ea1f7 100644 --- a/Projects/SAMufasaGUI/testunit.pas +++ b/Projects/SAMufasaGUI/testunit.pas @@ -96,6 +96,7 @@ type ActionTabNext: TAction; ActionList: TActionList; CheckBoxMatchCase: TCheckBox; + LazHighlighter: TSynFreePascalSyn; frmFunctionList: TFunctionListFrame; LabeledEditSearch: TLabeledEdit; MainMenu: TMainMenu; @@ -116,6 +117,7 @@ type MenuItemDivider9: TMenuItem; MouseTimer: TTimer; NewsTimer: TTimer; + SCARHighlighter: TSynFreePascalSyn; TT_Console: TToolButton; TT_Cut: TToolButton; TT_Copy: TToolButton; @@ -327,12 +329,18 @@ type SearchStart : TPoint; LastTab : integer; UpdatingFonts : boolean; + function GetExtPath: string; function GetFontPath: String; + function GetHighlighter: TSynCustomHighlighter; function GetIncludePath: String; + function GetPluginPath: string; function GetScriptState: TScriptState; function GetShowHintAuto: boolean; + function GetSimbaNews: String; + procedure SetExtPath(const AValue: string); procedure SetFontPath(const AValue: String); procedure SetIncludePath(const AValue: String); + procedure SetPluginPath(const AValue: string); procedure SetShowHintAuto(const AValue: boolean); procedure SetScriptState(const State: TScriptState); function LoadSettingDef(const Key, Def : string) : string; @@ -382,6 +390,7 @@ type procedure CreateDefaultEnvironment; procedure LoadFormSettings; procedure SaveFormSettings; + procedure LoadExtensions; procedure AddRecentFile(const filename : string); procedure InitalizeTMThread(var Thread : TMThread); procedure HandleParameters; @@ -389,6 +398,9 @@ type property ShowHintAuto : boolean read GetShowHintAuto write SetShowHintAuto; property IncludePath : String read GetIncludePath write SetIncludePath; property FontPath : String read GetFontPath write SetFontPath; + property PluginPath : string read GetPluginPath write SetPluginPath; + property ExtPath : string read GetExtPath write SetExtPath; + property CurrHighlighter : TSynCustomHighlighter read GetHighlighter; end; { TProcThread } @@ -996,12 +1008,16 @@ begin CreateSetting('Settings/MainForm/NormalSize','739:555'); CreateSetting('Settings/FunctionList/ShowOnStart','True'); CreateSetting('Settings/CodeHints/ShowAutomatically','True'); + CreateSetting('Settings/SourceEditor/LazColors','True'); + CreateSetting('Settings/Extensions/FileExtension','sex'); CreateSetting('Settings/Updater/RemoteLink',SimbaURL + 'Simba'{$IFDEF WINDOWS} +'.exe'{$ENDIF}); CreateSetting('Settings/Updater/RemoteVersionLink',SimbaURL + 'Version'); CreateSetting('Settings/Fonts/VersionLink', FontURL + 'Version'); CreateSetting('Settings/Fonts/UpdateLink', FontURL + 'Fonts.tar.bz2'); + CreateSetting('Settings/News/URL', 'http://simba.villavu.com/bin/news'); + {Creates the paths and returns the path} PluginsPath := CreateSetting('Settings/Plugins/Path', ExpandFileName(MainDir+ DS+ 'Plugins' + DS)); extensionsPath := CreateSetting('Settings/Extensions/Path',ExpandFileName(MainDir +DS + 'Extensions' + DS)); @@ -1027,41 +1043,6 @@ begin end; procedure TForm1.LoadFormSettings; -var - extCount : integer; - function LoadExtension(Number : integer) : boolean; - var - Path : string; - ExtPath : string; - ExtEnabled : boolean; - begin; - result := false; - if (number < 0) or (number >= extCount) then - exit; - path := 'Extensions/Extension' + inttostr(number); - if SettingExtists(Path) = false then - exit; - ExtPath := LoadSettingDef(Path + '/Path',''); - if ExtPath = '' then - exit; - ExtEnabled := StrToBoolDef(LoadSettingDef(Path + '/Enabled','false'),false); - if ExtManager.LoadPSExtension(ExtPath,ExtEnabled) = false then - exit; - Result := true; - end; - procedure DeleteExtension(number : integer); - var - i : integer; - path : string; - begin; - path := 'Extensions/Extension'; - SettingsForm.Settings.DeleteKey(path + inttostr(number)); - for i := number + 1 to extCount - 1 do - SettingsForm.Settings.RenameKey(path + inttostr(i),'Extension' + inttostr(i-1)); - SetSetting('Extensions/ExtensionCount',inttostr(extCount - 1),true); - dec(extCount); - end; - var str,str2 : string; Data : TStringArray; @@ -1105,14 +1086,6 @@ begin else ShowConsole(false); {$endif} - extCount := StrToIntDef(LoadSettingDef('Extensions/ExtensionCount/','0'),0); - for i := 0 to extCount - 1 do - while (i < extCount) and not LoadExtension(i) do - DeleteExtension(i); - SetSetting('Extensions/ExtensionCount',inttostr(extCount)); - str := LoadSettingDef('Settings/Extensions/Path',ExpandFileName(MainDir +DS + 'Extensions' + DS)); - str2 := LoadSettingDef('Settings/Extensions/FileExtension','sex'); - ExtManager.LoadPSExtensionsDir(str,str2); end; procedure TForm1.SaveFormSettings; @@ -1161,6 +1134,56 @@ begin end; end; +procedure TForm1.LoadExtensions; +var + extCount : integer; + function LoadExtension(Number : integer) : boolean; + var + Path : string; + ExtPath : string; + ExtEnabled : boolean; + begin; + result := false; + if (number < 0) or (number >= extCount) then + exit; + path := 'Extensions/Extension' + inttostr(number); + if SettingExtists(Path) = false then + exit; + ExtPath := LoadSettingDef(Path + '/Path',''); + if ExtPath = '' then + exit; + ExtEnabled := StrToBoolDef(LoadSettingDef(Path + '/Enabled','false'),false); + if ExtManager.LoadPSExtension(ExtPath,ExtEnabled) = false then + exit; + Result := true; + end; + procedure DeleteExtension(number : integer); + var + i : integer; + path : string; + begin; + path := 'Extensions/Extension'; + SettingsForm.Settings.DeleteKey(path + inttostr(number)); + for i := number + 1 to extCount - 1 do + SettingsForm.Settings.RenameKey(path + inttostr(i),'Extension' + inttostr(i-1)); + SetSetting('Extensions/ExtensionCount',inttostr(extCount - 1),true); + dec(extCount); + end; + +var + str,str2 : string; + i : integer; +begin + extCount := StrToIntDef(LoadSettingDef('Extensions/ExtensionCount/','0'),0); + for i := 0 to extCount - 1 do + while (i < extCount) and not LoadExtension(i) do + DeleteExtension(i); + SetSetting('Extensions/ExtensionCount',inttostr(extCount)); + str := LoadSettingDef('Settings/Extensions/Path',ExpandFileName(MainDir +DS + 'Extensions' + DS)); + str2 := LoadSettingDef('Settings/Extensions/FileExtension','sex'); + ExtManager.LoadPSExtensionsDir(str,str2); +end; + procedure TForm1.AddRecentFile(const filename: string); var MaxRecentFiles : integer; @@ -1189,22 +1212,20 @@ procedure TForm1.InitalizeTMThread(var Thread: TMThread); var DbgImgInfo : TDbgImgInfo; AppPath : string; - pluginspath: string; ScriptPath : string; UseCPascal: String; Se: TMMLSettingsSandbox; loadFontsOnScriptStart: boolean; begin AppPath:= MainDir + DS; - PluginsPath := IncludeTrailingPathDelimiter(LoadSettingDef('Settings/Plugins/Path', ExpandFileName(MainDir+ DS+ 'Plugins' + DS))); CurrScript.ScriptErrorLine:= -1; CurrentSyncInfo.SyncMethod:= @Self.SafeCallThread; UseCPascal := LoadSettingDef('Settings/Interpreter/UseCPascal', 'False'); try if lowercase(UseCPascal) = 'true' then - Thread := TCPThread.Create(True,@CurrentSyncInfo,PluginsPath) + Thread := TCPThread.Create(True,@CurrentSyncInfo,PluginPath) else - Thread := TPSThread.Create(True,@CurrentSyncInfo,PluginsPath); + Thread := TPSThread.Create(True,@CurrentSyncInfo,PluginPath); except mDebugLn('Failed to initialise the library!'); Exit; @@ -1227,15 +1248,15 @@ begin if CurrScript.ScriptFile <> '' then ScriptPath := IncludeTrailingPathDelimiter(ExtractFileDir(CurrScript.ScriptFile)); - if DirectoryExists(PluginsPath) then - PluginsGlob.AddPath(PluginsPath); + if DirectoryExists(PluginPath) then + PluginsGlob.AddPath(PluginPath); if not DirectoryExists(IncludePath) then if FirstRun then FormWritelnEx('Warning: The include directory specified in the Settings isn''t valid.'); if not DirectoryExists(fontPath) then if FirstRun then FormWritelnEx('Warning: The font directory specified in the Settings isn''t valid. Can''t load fonts now'); - Thread.SetPaths(ScriptPath,AppPath,Includepath,PluginsPath,fontPath); + Thread.SetPaths(ScriptPath,AppPath,Includepath,PluginPath,fontPath); if selector.haspicked then Thread.Client.IOManager.SetTarget(Selector.LastPick); @@ -1924,6 +1945,8 @@ begin //Fill the codeinsight buffer FillThread.Resume; + //Load the extensions + LoadExtensions; end; procedure TForm1.FormDestroy(Sender: TObject); @@ -2029,7 +2052,7 @@ var SynExporterHTML : TSynExporterHTML; begin; SynExporterHTML := TSynExporterHTML.Create(nil); - SynExporterHTML.Highlighter := CurrScript.SynFreePascalSyn1; + SynExporterHTML.Highlighter := CurrHighlighter; SynExporterHTML.ExportAsText:= True; with TSaveDialog.Create(nil) do try @@ -2175,12 +2198,12 @@ begin FunctionListShown(not MenuItemFunctionList.Checked); end; -function GetSimbaNews: String; +function TForm1.GetSimbaNews: String; var t: TDownloadThread; begin t := TDownloadThread.Create(true); - t.InputURL:='http://simba.villavu.com/bin/news'; + t.InputURL:=LoadSettingDef('Settings/News/URL', 'http://simba.villavu.com/bin/news'); t.Resume; while not t.done do begin @@ -2190,6 +2213,11 @@ begin Exit(t.ResultStr); end; +procedure TForm1.SetExtPath(const AValue: string); +begin + SetSetting('Settings/Extensions/Path',AValue,true); +end; + procedure TForm1.NewsTimerTimer(Sender: TObject); var s: String; @@ -2343,16 +2371,39 @@ begin Result := IncludeTrailingPathDelimiter(LoadSettingDef('Settings/Fonts/Path', ExpandFileName(MainDir+DS+'Fonts' + DS))); end; +function TForm1.GetExtPath: string; +begin + result :=IncludeTrailingPathDelimiter(LoadSettingDef('Settings/Extensions/Path', ExpandFileName(MainDir+DS+'Extensions' + DS))); +end; + +function TForm1.GetHighlighter: TSynCustomHighlighter; +begin + if lowercase(LoadSettingDef('Settings/SourceEditor/LazColors','True')) = 'true' then + result := LazHighlighter + else + result := SCARHighlighter; +end; + function TForm1.GetIncludePath: String; begin Result := IncludeTrailingPathDelimiter(LoadSettingDef('Settings/Includes/Path', ExpandFileName(MainDir+DS+'Includes' + DS))); end; +function TForm1.GetPluginPath: string; +begin + Result := IncludeTrailingPathDelimiter(LoadSettingDef('Settings/Plugins/Path', ExpandFileName(MainDir+DS+'Plugins' + DS))); +end; + procedure TForm1.SetIncludePath(const AValue: String); begin SetSetting('Settings/Includes/Path',AValue,true); end; +procedure TForm1.SetPluginPath(const AValue: string); +begin + SetSetting('Settings/Plugins/Path',AValue,true); +end; + procedure TForm1.SetScriptState(const State: TScriptState); begin CurrScript.FScriptState:= State; @@ -2545,7 +2596,8 @@ begin Exit; with TOpenDialog.Create(nil) do try - Filter:= 'Simba Files|*.simb;*.cogat;*.mufa;*.txt|Any files|*.*'; + Filter:= 'Simba Files|*.simba;*.simb;*.cogat;*.mufa;*.txt;*.' +LoadSettingDef('Settings/Extensions/FileExtension','sex')+ + '|Any files|*.*'; if Execute then if FileExists(filename) then result := LoadScriptFile(filename); @@ -2626,12 +2678,14 @@ begin Result := false; with TSaveDialog.Create(nil) do try - Filter:= 'Simba files|*.simb;*.cogat;*.mufa;*.pas;*.txt|Any Files|*.*'; + filter := 'Simba Files|*.simba;*.simb;*.cogat;*.mufa;*.txt;*.' + + LoadSettingDef('Settings/Extensions/FileExtension','sex')+ + '|Any files|*.*'; if Execute then begin; if ExtractFileExt(FileName) = '' then begin; - ScriptFile := FileName + '.simb'; + ScriptFile := FileName + '.simba'; end else ScriptFile := FileName; CurrScript.SynEdit.Lines.SaveToFile(ScriptFile); diff --git a/Units/MMLAddon/PSInc/Wrappers/extensions.inc b/Units/MMLAddon/PSInc/Wrappers/extensions.inc index cad4cfa..a38b9ef 100644 --- a/Units/MMLAddon/PSInc/Wrappers/extensions.inc +++ b/Units/MMLAddon/PSInc/Wrappers/extensions.inc @@ -21,18 +21,74 @@ extensions.inc for the Mufasa Macro Library } +type + TStringArray = array of string; +function ext_UnTar(const Input : string; out Content : TStringArray) : boolean; +var + Stream : TStringStream; +begin + result := false; + try + Stream := TStringStream.Create(Input); + content := UnTar(Stream); + result := (length(content) > 0); + finally + stream.free; + end; +end; -function ext_GetPage(url : string) : string; +function ext_UnTarEx(const Input : string;const outputdir : string; overwrite : boolean): boolean; +var + Stream : TStringStream; + MS : TMemoryStream; +begin + result := false; + try + Stream := TStringStream.Create(Input); + result := UnTar(stream,outputdir,overwrite); + finally + stream.free; + end; +end; +function ext_DecompressBZip2(const input: string;out output : string; const BlockSize: Cardinal): boolean; +var + Stream : TStringStream; + MS : TMemoryStream; +begin + result := false; + try + Stream := TStringStream.Create(Input); + ms := DecompressBZip2(Stream,blocksize); + if ms.size > 0 then + begin + ms.Position:= 0; + SetLength(output,ms.Size); + MS.Read(output[1],MS.size); + ms.free; + result := true; + end; + finally + stream.free; + end; +end; + +function ext_GetPage(const url : string) : string; var t: TDownloadThread; begin - t := TDownloadThread.Create(true); - t.InputURL:='url'; - t.Resume; - while not t.done do - begin - Application.ProcessMessages; - Sleep(25); + result := ''; + try + t := TDownloadThread.Create(true); + t.InputURL:=url; + t.Resume; + while not t.done do + begin + Application.ProcessMessages; + Sleep(25); + end; + Exit(t.ResultStr); + except + on e : exception do + mDebugLn('Exception in GetPage in Extensions: ' + e.message); end; - Exit(t.ResultStr); end; From d6ef12ef159c0531f1b61caccd980eed20f9eb17 Mon Sep 17 00:00:00 2001 From: Raymond Date: Mon, 5 Apr 2010 14:06:46 +0200 Subject: [PATCH 22/22] Updated rev number --- Projects/SAMufasaGUI/testunit.pas | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Projects/SAMufasaGUI/testunit.pas b/Projects/SAMufasaGUI/testunit.pas index 04ea1f7..5405090 100644 --- a/Projects/SAMufasaGUI/testunit.pas +++ b/Projects/SAMufasaGUI/testunit.pas @@ -46,7 +46,7 @@ uses CastaliaSimplePasPar, v_AutoCompleteForm, PSDump; const - SimbaVersion = 605; + SimbaVersion = 607; type