Lua: problem med nil
Jeg er ved at ændre lidt i et af mine addon (wow), der skal beregn hvor mange kills jeg mangler før jeg stiger.. det jo nemt nok. ja. men jeg har videre udviklet min, så kan også tag højde for rest. men det giver mig fejl når jeg har dræbt et mob, og kører musen henover. for at se om meget jeg mangler...Og jeg kan ikke lige pingpoint hvor fejlen skulle ligge. men håber nogle af jer kan.
Date: 2009-11-18 14:17:59
ID: 1
Error occured in: Global
Count: 1
Message: ..\AddOns\TitanXP\TitanXP.lua line 308:
attempt to concatenate a nil value
Debug:
(tail call): ?
[C]: ?
TitanXP\TitanXP.lua:308: tooltipTextFunc()
Titan\TitanPanelTemplate.lua:422: TitanPanelButton_SetTooltip()
Titan\TitanPanelTemplate.lua:208: TitanPanelButton_OnEnter()
[string "*:OnEnter"]:1:
[string "*:OnEnter"]:1
[titenxp.lua]
-- **************************************************************************
-- * TitanXP.lua
-- *
-- * By: TitanMod, Dark Imakuni, Adsertor and the Titan Development Team
-- * (HonorGoG, jaketodd422, joejanko, Lothayer, Tristanian)
-- **************************************************************************
-- ******************************** Constants *******************************
local TITAN_XP_ID = "XP";
local _G = getfenv(0);
local TITAN_XP_FREQUENCY = 1;
local updateTable = {TITAN_XP_ID, TITAN_PANEL_UPDATE_ALL};
-- ******************************** Variables *******************************
local TitanPanelXPButton_ButtonAdded = nil;
local found = nil;
local lastMobXP, lastXP, XPGain = 0, 0, 0
local L = LibStub("AceLocale-3.0"):GetLocale("Titan", true)
-- ******************************** Functions *******************************
-- **************************************************************************
-- NAME : TitanPanelXP_OnLoad()
-- DESC : Registers the plugin upon it loading
-- **************************************************************************
function TitanPanelXPButton_OnLoad(self)
self.registry = {
id = TITAN_XP_ID,
builtIn = 1,
version = TITAN_VERSION,
menuText = L["TITAN_XP_MENU_TEXT"],
buttonTextFunction = "TitanPanelXPButton_GetButtonText",
tooltipTitle = L["TITAN_XP_TOOLTIP"],
tooltipTextFunction = "TitanPanelXPButton_GetTooltipText",
iconWidth = 16,
savedVariables = {
DisplayType = "ShowXPPerHourSession",
ShowIcon = 1,
ShowLabelText = 1,
ShowSimpleRested = false,
ShowSimpleToLevel = false,
ShowSimpleNumOfKills = false,
ShowSimpleNumOfGains = false,
}
};
self:RegisterEvent("PLAYER_ENTERING_WORLD");
self:RegisterEvent("TIME_PLAYED_MSG");
self:RegisterEvent("PLAYER_XP_UPDATE");
self:RegisterEvent("PLAYER_LEVEL_UP");
self:RegisterEvent("CHAT_MSG_COMBAT_XP_GAIN");
end
-- **************************************************************************
-- NAME : TitanPanelXPButton_OnShow()
-- DESC : Display the icon in the bar
-- NOTE : For a lack of better check at the moment TitanPanel_ButtonAdded
-- is a global variable set to true only when a button has just been
-- added to the panel
-- **************************************************************************
function TitanPanelXPButton_OnShow()
TitanPanelXPButton_SetIcon();
found = nil;
if not TitanPanelXPButton_ButtonAdded then
RequestTimePlayed();
TitanPanelXPButton_ButtonAdded = true;
end
end
function TitanPanelXPButton_OnHide()
if (TitanPanelSettings) then
for i = 1, table.getn(TitanPanelSettings.Buttons) do
if(TitanPanelSettings.Buttons[i] == TITAN_XP_ID) then
found = true;
end
end
if not found then
TitanPanelXPButton_ButtonAdded = nil
end
end
end
-- **************************************************************************
-- NAME : TitanPanelXPButton_OnEvent(arg1, arg2)
-- DESC : Parse events registered to addon and act on them
-- VARS : arg1 = <research> , arg2 = <research>
-- **************************************************************************
function TitanPanelXPButton_OnEvent(self, event, a1, a2, ...)
if (event == "PLAYER_ENTERING_WORLD") then
if (not self.sessionTime) then
self.sessionTime = time();
end
if (not self.initXP) then
self.initXP = UnitXP("player");
self.accumXP = 0;
self.sessionXP = 0;
self.startSessionTime = time();
lastXP = self.initXP;
end
elseif (event == "TIME_PLAYED_MSG") then
-- Remember play time
self.totalTime = a1;
self.levelTime = a2;
elseif (event == "PLAYER_XP_UPDATE") then
if (not self.initXP) then
self.initXP = UnitXP("player");
self.accumXP = 0;
self.sessionXP = 0;
self.startSessionTime = time();
end
XPGain = UnitXP("player") - lastXP;
lastXP = UnitXP("player");
if XPGain < 0 then XPGain = 0 end
self.sessionXP = UnitXP("player") - self.initXP + self.accumXP;
elseif (event == "PLAYER_LEVEL_UP") then
self.levelTime = 0;
self.accumXP = self.accumXP + UnitXPMax("player") - self.initXP;
self.initXP = 0;
elseif (event == "CHAT_MSG_COMBAT_XP_GAIN") then
local _,_,_,killXP = string.find(a1, "^"..L["TITAN_XP_GAIN_PATTERN"])
if killXP then lastMobXP = tonumber(killXP) end
if lastMobXP < 0 then lastMobXP = 0 end
end
end
-- **************************************************************************
-- NAME : TitanPanelXPButton_OnUpdate(elapsed)
-- DESC : Update button data
-- VARS : elapsed = <research>
-- **************************************************************************
function TitanPanelXPButton_OnUpdate(self, elapsed)
TITAN_XP_FREQUENCY = TITAN_XP_FREQUENCY - elapsed;
if (TITAN_XP_FREQUENCY <=0) then
TITAN_XP_FREQUENCY = 1;
TitanPanelPluginHandle_OnUpdate(updateTable)
end
if (self.totalTime) then
self.totalTime = self.totalTime + elapsed;
self.levelTime = self.levelTime + elapsed;
end
end
-- **************************************************************************
-- NAME : TitanPanelXPButton_GetButtonText(id)
-- DESC : Calculate time based logic for button text
-- VARS : id = button ID
-- NOTE : Because the panel gets loaded before XP we need to check whether
-- the variables have been initialized and take action if they haven't
-- **************************************************************************
function TitanPanelXPButton_GetButtonText(id)
if (TitanPanelXPButton.startSessionTime == nil) then
return;
end
local button, id = TitanUtils_GetButton(id, true);
local totalXP = UnitXPMax("player");
local currentXP = UnitXP("player");
local toLevelXP = totalXP - currentXP;
local sessionXP = button.sessionXP;
local xpPerHour, xpPerHourText, timeToLevel, timeToLevelText;
local sessionTime = time() - TitanPanelXPButton.startSessionTime;
local levelTime = TitanPanelXPButton.levelTime;
local numofkills, numofgains;
if lastMobXP ~= 0 then numofkills = math.ceil(toLevelXP / lastMobXP) else numofkills = _G["UNKNOWN"] end
if XPGain ~= 0 then numofgains = math.ceil(toLevelXP / XPGain) else numofgains = _G["UNKNOWN"] end
if (levelTime) then
if (TitanGetVar(TITAN_XP_ID, "DisplayType") == "ShowXPPerHourSession") then
xpPerHour = sessionXP / sessionTime * 3600;
timeToLevel = TitanUtils_Ternary((sessionXP == 0), -1, toLevelXP / sessionXP * sessionTime);
xpPerHourText = format(L["TITAN_XP_FORMAT"], xpPerHour);
timeToLevelText = TitanUtils_GetEstTimeText(timeToLevel)
return L["TITAN_XP_BUTTON_LABEL_XPHR_SESSION"], TitanUtils_GetHighlightText(xpPerHourText),
L["TITAN_XP_BUTTON_LABEL_TOLEVEL_TIME_LEVEL"], TitanUtils_GetHighlightText(timeToLevelText);
elseif (TitanGetVar(TITAN_XP_ID,"DisplayType") == "ShowXPPerHourLevel") then
xpPerHour = currentXP / levelTime * 3600;
timeToLevel = TitanUtils_Ternary((currentXP == 0), -1, toLevelXP / currentXP * levelTime);
xpPerHourText = format(L["TITAN_XP_FORMAT"], xpPerHour);
timeToLevelText = TitanUtils_GetEstTimeText(timeToLevel);
return L["TITAN_XP_BUTTON_LABEL_XPHR_LEVEL"], TitanUtils_GetHighlightText(xpPerHourText),
L["TITAN_XP_BUTTON_LABEL_TOLEVEL_TIME_LEVEL"], TitanUtils_GetHighlightText(timeToLevelText);
elseif (TitanGetVar(TITAN_XP_ID,"DisplayType") == "ShowSessionTime") then
return L["TITAN_XP_BUTTON_LABEL_SESSION_TIME"], TitanUtils_GetHighlightText(TitanUtils_GetAbbrTimeText(sessionTime));
elseif (TitanGetVar(TITAN_XP_ID,"DisplayType") == "ShowXPSimple") then
local toLevelXPText = "";
local rest = "";
local labelrested = "";
local labeltolevel = "";
local labelnumofkills = "";
local labelnumofgains = "";
local percent = floor(10000*(currentXP/totalXP)+0.5)/100;
--currentXPText = format(TITAN_XP_FORMAT, currentXP);
--totalXPText = format(TITAN_XP_FORMAT, totalXP);
if TitanGetVar(TITAN_XP_ID,"ShowSimpleToLevel") then
toLevelXPText = TitanUtils_GetColoredText(format(L["TITAN_XP_FORMAT"], toLevelXP), _G["GREEN_FONT_COLOR"]);
labeltolevel = L["TITAN_XP_XPTOLEVELUP"];
end
if TitanGetVar(TITAN_XP_ID,"ShowSimpleRested") then
rest = TitanUtils_GetColoredText(GetXPExhaustion()==nil and "0" or GetXPExhaustion(),{r=0.44, g=0.69, b=0.94});
labelrested = L["TITAN_XP_TOTAL_RESTED"];
end
if TitanGetVar(TITAN_XP_ID,"ShowSimpleNumOfKills") then
numofkills = TitanUtils_GetColoredText(numofkills, {r=0.24, g=0.7, b=0.44})
labelnumofkills = L["TITAN_XP_KILLS_LABEL_SHORT"];
else
numofkills = ""
end
if TitanGetVar(TITAN_XP_ID,"ShowSimpleNumOfGains") then
numofgains = TitanUtils_GetColoredText(numofgains, {r=1, g=0.49, b=0.04})
labelnumofgains = L["TITAN_XP_XPGAINS_LABEL_SHORT"];
else
numofgains = ""
end
if TitanGetVar(TITAN_XP_ID,"ShowSimpleNumOfGains") then
return L["TITAN_XP_LEVEL_COMPLETE"], TitanUtils_GetHighlightText(percent .. "%"), labelrested, rest , labeltolevel, toLevelXPText, labelnumofgains, numofgains
else
return L["TITAN_XP_LEVEL_COMPLETE"], TitanUtils_GetHighlightText(percent .. "%"), labelrested, rest , labeltolevel, toLevelXPText, labelnumofkills, numofkills
end
end
else
return "("..L["TITAN_XP_UPDATE_PENDING"]..")";
end
end
-- **************************************************************************
-- NAME : TitanPanelXPButton_GetTooltipText()
-- DESC : Display tooltip text
-- **************************************************************************
function TitanPanelXPButton_GetTooltipText()
local totalTime = TitanPanelXPButton.totalTime;
local sessionTime = time() - TitanPanelXPButton.startSessionTime;
local levelTime = TitanPanelXPButton.levelTime;
-- failsafe to ensure that an error wont be returned
if not levelTime then return end
local totalXP = UnitXPMax("player");
local currentXP = UnitXP("player");
local toLevelXP = totalXP - currentXP;
local currentXPPercent = currentXP / totalXP * 100;
local toLevelXPPercent = toLevelXP / totalXP * 100;
local xpPerHourThisLevel = currentXP / levelTime * 3600;
local xpPerHourThisSession = TitanPanelXPButton.sessionXP / sessionTime * 3600;
local estTimeToLevelThisLevel = TitanUtils_Ternary((currentXP == 0), -1, toLevelXP / currentXP * levelTime);
local estTimeToLevelThisSession = TitanUtils_Ternary((TitanPanelXPButton.sessionXP == 0), -1, toLevelXP / TitanPanelXPButton.sessionXP * sessionTime);
local numofkills, numofgains, numofrest, numofrealkills, calcrest, calckills, noca, nocb, nocc;
local aRestXp = GetXPExhaustion();
local debug = 1;
if aRestXp==nil then
aRestXp = "0";
end
calcrest = math.ceil(aRestXp / lastMobXP);
calckills = math.ceil(toLevelXP / lastMobXP);
if lastMobXP ~= 0 then
if calcrest > calckills then
numofrealkills = calcrest;
else
if calcrest ~= 0 then
noca = math.ceil(calcrest * lastMobXP);
nocb = math.ceil(calckills - calcrest);
nocc = math.ceil((noca * lastMobXP) + (nocb * 2));
if nocc < toLevelXP then
numofrealkills = math.ceil(nocb);
else
numofrealkills = math.ceil(noca);
end
else
numofrealkills = calckill;
end
end
else
numofrealkills = _G["UNKNOWN"];
end
if lastMobXP ~= 0 then numofrest = calcrest else numofrest = _G["UNKNOWN"] end
if lastMobXP ~= 0 then numofkills = calckills else numofkills = _G["UNKNOWN"] end
if XPGain ~= 0 then numofgains = math.ceil(toLevelXP / XPGain) else numofgains = _G["UNKNOWN"] end
return ""..
L["TITAN_XP_TOOLTIP_TOTAL_TIME"].."\t"..TitanUtils_GetHighlightText(TitanUtils_GetAbbrTimeText(totalTime)).."\n"..
L["TITAN_XP_TOOLTIP_LEVEL_TIME"].."\t"..TitanUtils_GetHighlightText(TitanUtils_GetAbbrTimeText(levelTime)).."\n"..
L["TITAN_XP_TOOLTIP_SESSION_TIME"].."\t"..TitanUtils_GetHighlightText(TitanUtils_GetAbbrTimeText(sessionTime)).."\n"..
"\n"..
L["TITAN_XP_TOOLTIP_TOTAL_XP"].."\t"..TitanUtils_GetHighlightText(totalXP).."\n"..
L["TITAN_XP_TOTAL_RESTED"].."\t"..TitanUtils_GetHighlightText(GetXPExhaustion()==nil and "0" or GetXPExhaustion()).."\n"..
L["TITAN_XP_TOOLTIP_LEVEL_XP"].."\t"..TitanUtils_GetHighlightText(format(L["TITAN_XP_PERCENT_FORMAT"], currentXP, currentXPPercent)).."\n"..
L["TITAN_XP_TOOLTIP_TOLEVEL_XP"].."\t"..TitanUtils_GetHighlightText(format(L["TITAN_XP_PERCENT_FORMAT"], toLevelXP, toLevelXPPercent)).."\n"..
L["TITAN_XP_TOOLTIP_SESSION_XP"].."\t"..TitanUtils_GetHighlightText(TitanPanelXPButton.sessionXP).."\n"..
format(L["TITAN_XP_KILLS_LABEL"], lastMobXP).."\t"..TitanUtils_GetHighlightText(numofkills).."\n"..
format(L["TITAN_XP_XPGAINS_LABEL"], XPGain).."\t"..TitanUtils_GetHighlightText(numofgains).."\n"..
format(L["TITAN_XP_RESTLEFT_LABEL"], lastMobXP).."\t"..TitanUtils_GetHighlightText(numofrest).."\n"..
format(L["TITAN_XP_REALKILL_LABEL"], lastMobXP).."\t"..TitanUtils_GetHighlightText(numofrealkills).."\n"..
"\n"..
L["TITAN_XP_TOOLTIP_XPHR_LEVEL"].."\t"..TitanUtils_GetHighlightText(format(L["TITAN_XP_FORMAT"], xpPerHourThisLevel)).."\n"..
L["TITAN_XP_TOOLTIP_XPHR_SESSION"].."\t"..TitanUtils_GetHighlightText(format(L["TITAN_XP_FORMAT"], xpPerHourThisSession)).."\n"..
L["TITAN_XP_TOOLTIP_TOLEVEL_LEVEL"].."\t"..TitanUtils_GetHighlightText(TitanUtils_GetAbbrTimeText(estTimeToLevelThisLevel)).."\n"..
L["TITAN_XP_TOOLTIP_TOLEVEL_SESSION"].."\t"..TitanUtils_GetHighlightText(TitanUtils_GetAbbrTimeText(estTimeToLevelThisSession));
end
-- **************************************************************************
-- NAME : TitanPanelXPButton_SetIcon()
-- DESC : Define icon based on faction
-- **************************************************************************
function TitanPanelXPButton_SetIcon()
local icon = TitanPanelXPButtonIcon;
local factionGroup, factionName = UnitFactionGroup("player");
if (factionGroup == "Alliance") then
icon:SetTexture("Interface\\TargetingFrame\\UI-PVP-Alliance");
icon:SetTexCoord(0.046875, 0.609375, 0.03125, 0.59375);
elseif (factionGroup == "Horde") then
icon:SetTexture("Interface\\TargetingFrame\\UI-PVP-Horde");
icon:SetTexCoord(0.046875, 0.609375, 0.015625, 0.578125);
else
icon:SetTexture("Interface\\TargetingFrame\\UI-PVP-FFA");
icon:SetTexCoord(0.046875, 0.609375, 0.03125, 0.59375);
end
end
-- **************************************************************************
-- NAME : TitanPanelRightClickMenu_PrepareXPMenu()
-- DESC : Display rightclick menu options
-- **************************************************************************
function TitanPanelRightClickMenu_PrepareXPMenu()
local info = {};
if UIDROPDOWNMENU_MENU_LEVEL == 2 then
TitanPanelRightClickMenu_AddTitle(L["TITAN_XP_MENU_SIMPLE_BUTTON_TITLE"], 2);
info = {};
info.text = L["TITAN_XP_MENU_SIMPLE_BUTTON_RESTED"];
info.func = function() TitanPanelRightClickMenu_ToggleVar({TITAN_XP_ID, "ShowSimpleRested"}) end
info.checked = TitanUtils_Ternary(TitanGetVar(TITAN_XP_ID, "ShowSimpleRested"), 1, nil);
info.keepShownOnClick = 1;
UIDropDownMenu_AddButton(info, 2);
info = {};
info.text = L["TITAN_XP_MENU_SIMPLE_BUTTON_TOLEVELUP"];
info.func = function() TitanPanelRightClickMenu_ToggleVar({TITAN_XP_ID, "ShowSimpleToLevel"}) end
info.checked = TitanUtils_Ternary(TitanGetVar(TITAN_XP_ID, "ShowSimpleToLevel"), 1, nil);
info.keepShownOnClick = 1;
UIDropDownMenu_AddButton(info, 2);
info = {};
info.text = L["TITAN_XP_MENU_SIMPLE_BUTTON_KILLS"];
info.func = function() TitanSetVar(TITAN_XP_ID, "ShowSimpleNumOfKills", 1) TitanSetVar(TITAN_XP_ID, "ShowSimpleNumOfGains", false) end
info.checked = TitanUtils_Ternary(TitanGetVar(TITAN_XP_ID, "ShowSimpleNumOfKills"), 1, nil);
UIDropDownMenu_AddButton(info, 2);
info = {};
info.text = L["TITAN_XP_MENU_SIMPLE_BUTTON_XPGAIN"];
info.func = function() TitanSetVar(TITAN_XP_ID, "ShowSimpleNumOfGains", 1) TitanSetVar(TITAN_XP_ID, "ShowSimpleNumOfKills", false) end
info.checked = TitanUtils_Ternary(TitanGetVar(TITAN_XP_ID, "ShowSimpleNumOfGains"), 1, nil);
UIDropDownMenu_AddButton(info, 2);
else
TitanPanelRightClickMenu_AddTitle(TitanPlugins[TITAN_XP_ID].menuText);
info = {};
info.text = L["TITAN_XP_MENU_SHOW_XPHR_THIS_SESSION"];
info.func = TitanPanelXPButton_ShowXPPerHourSession;
info.checked = TitanUtils_Ternary("ShowXPPerHourSession" == TitanGetVar(TITAN_XP_ID, "DisplayType"), 1, nil);
UIDropDownMenu_AddButton(info);
info = {};
info.text = L["TITAN_XP_MENU_SHOW_XPHR_THIS_LEVEL"];
info.func = TitanPanelXPButton_ShowXPPerHourLevel;
info.checked = TitanUtils_Ternary("ShowXPPerHourLevel" == TitanGetVar(TITAN_XP_ID, "DisplayType"), 1, nil);
UIDropDownMenu_AddButton(info);
info = {};
info.text = L["TITAN_XP_MENU_SHOW_SESSION_TIME"];
info.func = TitanPanelXPButton_ShowSessionTime;
info.checked = TitanUtils_Ternary("ShowSessionTime" == TitanGetVar(TITAN_XP_ID, "DisplayType"), 1, nil);
UIDropDownMenu_AddButton(info);
info = {};
info.text = L["TITAN_XP_MENU_SHOW_RESTED_TOLEVELUP"];
info.func = TitanPanelXPButton_ShowXPSimple;
info.hasArrow = 1;
info.checked = TitanUtils_Ternary("ShowXPSimple" == TitanGetVar(TITAN_XP_ID, "DisplayType"), 1, nil);
UIDropDownMenu_AddButton(info);
TitanPanelRightClickMenu_AddSpacer();
TitanPanelRightClickMenu_AddCommand(L["TITAN_XP_MENU_RESET_SESSION"], TITAN_XP_ID, "TitanPanelXPButton_ResetSession");
TitanPanelRightClickMenu_AddCommand(L["TITAN_XP_MENU_REFRESH_PLAYED"], TITAN_XP_ID, "TitanPanelXPButton_RefreshPlayed");
TitanPanelRightClickMenu_AddSpacer();
TitanPanelRightClickMenu_AddToggleIcon(TITAN_XP_ID);
TitanPanelRightClickMenu_AddToggleLabelText(TITAN_XP_ID);
TitanPanelRightClickMenu_AddSpacer();
TitanPanelRightClickMenu_AddCommand(L["TITAN_PANEL_MENU_HIDE"], TITAN_XP_ID, TITAN_PANEL_MENU_FUNC_HIDE);
end
end
function TitanPanelXPButton_ShowSessionTime()
TitanSetVar(TITAN_XP_ID, "DisplayType", "ShowSessionTime");
TitanPanelButton_UpdateButton(TITAN_XP_ID);
end
-- **************************************************************************
-- NAME : TitanPanelXPButton_ShowXPPerHourSession()
-- DESC : Display per hour in session data in bar if set
-- **************************************************************************
function TitanPanelXPButton_ShowXPPerHourSession()
TitanSetVar(TITAN_XP_ID, "DisplayType", "ShowXPPerHourSession");
TitanPanelButton_UpdateButton(TITAN_XP_ID);
end
-- **************************************************************************
-- NAME : TitanPanelXPButton_ShowXPPerHourLevel()
-- DESC : Display per hour to level data in bar if set
-- **************************************************************************
function TitanPanelXPButton_ShowXPPerHourLevel()
TitanSetVar(TITAN_XP_ID, "DisplayType", "ShowXPPerHourLevel");
TitanPanelButton_UpdateButton(TITAN_XP_ID);
end
-- **************************************************************************
-- NAME : TitanPanelXPButton_ShowXPSimple()
-- DESC : Display simple XP data (% level, rest, xp to level) in bar if set
-- **************************************************************************
function TitanPanelXPButton_ShowXPSimple()
TitanSetVar(TITAN_XP_ID, "DisplayType", "ShowXPSimple");
TitanPanelButton_UpdateButton(TITAN_XP_ID);
end
-- **************************************************************************
-- NAME : TitanPanelXPButton_ResetSession()
-- DESC : Reset session and accumulated variables
-- **************************************************************************
function TitanPanelXPButton_ResetSession()
TitanPanelXPButton.initXP = UnitXP("player");
TitanPanelXPButton.accumXP = 0;
TitanPanelXPButton.sessionXP = 0;
TitanPanelXPButton.startSessionTime = time();
lastXP = TitanPanelXPButton.initXP;
end
-- **************************************************************************
-- NAME : TitanPanelXPButton_RefreshPlayed()
-- DESC : Get total time played
-- **************************************************************************
function TitanPanelXPButton_RefreshPlayed()
RequestTimePlayed();
end
[end of titanxp.lua]

