//# 12 errors, 2,183 messages
//#
/*
    //#ActionManager.java:1:1: class: com.dmdirc.actions.ActionManager$2
    //#ActionManager.java:1:1: method: com.dmdirc.actions.ActionManager$2.com.dmdirc.actions.ActionManager$2__static_init
    //#ActionManager.java:1:1: class: com.dmdirc.actions.ActionManager$1
    //#ActionManager.java:1:1: method: com.dmdirc.actions.ActionManager$1.com.dmdirc.actions.ActionManager$1__static_init
    //#ActionManager.java:1:1: class: com.dmdirc.actions.ActionManager
 * Copyright (c) 2006-2009 Chris Smith, Shane Mc Cormack, Gregory Holmes
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 */

package com.dmdirc.actions;

import com.dmdirc.Main;
import com.dmdirc.Precondition;
import com.dmdirc.actions.interfaces.ActionComparison;
import com.dmdirc.actions.interfaces.ActionComponent;
import com.dmdirc.actions.interfaces.ActionType;
import com.dmdirc.actions.wrappers.AliasWrapper;
import com.dmdirc.actions.wrappers.PerformWrapper;
import com.dmdirc.config.IdentityManager;
import com.dmdirc.interfaces.ActionListener;
import com.dmdirc.interfaces.ConfigChangeListener;
import com.dmdirc.logger.ErrorLevel;
import com.dmdirc.logger.Logger;
import com.dmdirc.updater.components.ActionGroupComponent;
import com.dmdirc.util.MapList;
import com.dmdirc.util.resourcemanager.ZipResourceManager;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Manages all actions for the client.
 *
 * @author chris
 */
public final class ActionManager {
    //#ActionManager.java:53: method: bool com.dmdirc.actions.ActionManager.access$002(bool)
    //#input(bool access$002(bool)): x0
    //#output(bool access$002(bool)): killSwitch
    //#output(bool access$002(bool)): return_value
    //#post(bool access$002(bool)): killSwitch == x0
    //#post(bool access$002(bool)): init'ed(killSwitch)
    //#post(bool access$002(bool)): return_value == killSwitch
    //#ActionManager.java:53: end of method: bool com.dmdirc.actions.ActionManager.access$002(bool)

    /** A list of registered action types. */
    private final static List<ActionType> actionTypes
    //#ActionManager.java:56: method: com.dmdirc.actions.ActionManager.com.dmdirc.actions.ActionManager__static_init
    //#output(com.dmdirc.actions.ActionManager__static_init): __Descendant_Table[com/dmdirc/actions/ActionManager]
    //#output(com.dmdirc.actions.ActionManager__static_init): actionComparisons
    //#output(com.dmdirc.actions.ActionManager__static_init): actionComponents
    //#output(com.dmdirc.actions.ActionManager__static_init): actionTypeGroups
    //#output(com.dmdirc.actions.ActionManager__static_init): actionTypes
    //#output(com.dmdirc.actions.ActionManager__static_init): actions
    //#output(com.dmdirc.actions.ActionManager__static_init): groups
    //#output(com.dmdirc.actions.ActionManager__static_init): killSwitch
    //#output(com.dmdirc.actions.ActionManager__static_init): listeners
    //#output(com.dmdirc.actions.ActionManager__static_init): new ArrayList(ActionManager__static_init#1) num objects
    //#output(com.dmdirc.actions.ActionManager__static_init): new ArrayList(ActionManager__static_init#2) num objects
    //#output(com.dmdirc.actions.ActionManager__static_init): new ArrayList(ActionManager__static_init#3) num objects
    //#output(com.dmdirc.actions.ActionManager__static_init): new HashMap(ActionManager__static_init#5) num objects
    //#output(com.dmdirc.actions.ActionManager__static_init): new MapList(ActionManager__static_init#4) num objects
    //#output(com.dmdirc.actions.ActionManager__static_init): new MapList(ActionManager__static_init#6) num objects
    //#output(com.dmdirc.actions.ActionManager__static_init): new MapList(ActionManager__static_init#7) num objects
    //#new obj(com.dmdirc.actions.ActionManager__static_init): new ArrayList(ActionManager__static_init#1)
    //#new obj(com.dmdirc.actions.ActionManager__static_init): new ArrayList(ActionManager__static_init#2)
    //#new obj(com.dmdirc.actions.ActionManager__static_init): new ArrayList(ActionManager__static_init#3)
    //#new obj(com.dmdirc.actions.ActionManager__static_init): new HashMap(ActionManager__static_init#5)
    //#new obj(com.dmdirc.actions.ActionManager__static_init): new MapList(ActionManager__static_init#4)
    //#new obj(com.dmdirc.actions.ActionManager__static_init): new MapList(ActionManager__static_init#6)
    //#new obj(com.dmdirc.actions.ActionManager__static_init): new MapList(ActionManager__static_init#7)
    //#presumption(com.dmdirc.actions.ActionManager__static_init): com.dmdirc.config.IdentityManager:getGlobalConfig(...)@84 != null
    //#post(com.dmdirc.actions.ActionManager__static_init): __Descendant_Table[com/dmdirc/actions/ActionManager] == &__Dispatch_Table
    //#post(com.dmdirc.actions.ActionManager__static_init): actionComparisons == &new ArrayList(ActionManager__static_init#3)
    //#post(com.dmdirc.actions.ActionManager__static_init): actionComponents == &new ArrayList(ActionManager__static_init#2)
    //#post(com.dmdirc.actions.ActionManager__static_init): actionTypeGroups == &new MapList(ActionManager__static_init#6)
    //#post(com.dmdirc.actions.ActionManager__static_init): actionTypes == &new ArrayList(ActionManager__static_init#1)
    //#post(com.dmdirc.actions.ActionManager__static_init): actions == &new MapList(ActionManager__static_init#4)
    //#post(com.dmdirc.actions.ActionManager__static_init): groups == &new HashMap(ActionManager__static_init#5)
    //#post(com.dmdirc.actions.ActionManager__static_init): init'ed(killSwitch)
    //#post(com.dmdirc.actions.ActionManager__static_init): listeners == &new MapList(ActionManager__static_init#7)
    //#post(com.dmdirc.actions.ActionManager__static_init): new ArrayList(ActionManager__static_init#1) num objects == 1
    //#post(com.dmdirc.actions.ActionManager__static_init): new ArrayList(ActionManager__static_init#2) num objects == 1
    //#post(com.dmdirc.actions.ActionManager__static_init): new ArrayList(ActionManager__static_init#3) num objects == 1
    //#post(com.dmdirc.actions.ActionManager__static_init): new HashMap(ActionManager__static_init#5) num objects == 1
    //#post(com.dmdirc.actions.ActionManager__static_init): new MapList(ActionManager__static_init#4) num objects == 1
    //#post(com.dmdirc.actions.ActionManager__static_init): new MapList(ActionManager__static_init#6) num objects == 1
    //#post(com.dmdirc.actions.ActionManager__static_init): new MapList(ActionManager__static_init#7) num objects == 1
            = new ArrayList<ActionType>();

    /** A list of registered action components. */
    private final static List<ActionComponent> actionComponents
            = new ArrayList<ActionComponent>();

    /** A list of registered action comparisons. */
    private final static List<ActionComparison> actionComparisons
            = new ArrayList<ActionComparison>();

    /** A map linking types and a list of actions that're registered for them. */
    private final static MapList<ActionType, Action> actions
    //#ActionManager.java:68: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.util.MapList()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.ActionManager
    //#    method: com.dmdirc.actions.ActionManager__static_init
    //#    unanalyzed callee: void com.dmdirc.util.MapList()
            = new MapList<ActionType, Action>();

    /** A map linking groups and a list of actions that're in them. */
    private final static Map<String, ActionGroup> groups
            = new HashMap<String, ActionGroup>();

    /** A map of the action type groups to the action types within. */
    private final static MapList<String, ActionType> actionTypeGroups
    //#ActionManager.java:76: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.util.MapList()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.ActionManager
    //#    method: com.dmdirc.actions.ActionManager__static_init
    //#    unanalyzed callee: void com.dmdirc.util.MapList()
            = new MapList<String, ActionType>();

    /** The listeners that we have registered. */
    private final static MapList<ActionType, ActionListener> listeners
    //#ActionManager.java:80: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.util.MapList()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.ActionManager
    //#    method: com.dmdirc.actions.ActionManager__static_init
    //#    unanalyzed callee: void com.dmdirc.util.MapList()
            = new MapList<ActionType, ActionListener>();

    /** Indicates whether or not user actions should be killed (not processed). */
    private static boolean killSwitch
    //#ActionManager.java:84: Warning: method not available - call not analyzed
    //#    call on ConfigManager com.dmdirc.config.IdentityManager:getGlobalConfig()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.ActionManager
    //#    method: com.dmdirc.actions.ActionManager__static_init
    //#    unanalyzed callee: ConfigManager com.dmdirc.config.IdentityManager:getGlobalConfig()
    //#ActionManager.java:84: Warning: method not available - call not analyzed
    //#    call on bool com.dmdirc.config.ConfigManager:getOptionBool(String, String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.ActionManager
    //#    method: com.dmdirc.actions.ActionManager__static_init
    //#    unanalyzed callee: bool com.dmdirc.config.ConfigManager:getOptionBool(String, String)
    //#ActionManager.java:84: end of method: com.dmdirc.actions.ActionManager.com.dmdirc.actions.ActionManager__static_init
            = IdentityManager.getGlobalConfig().getOptionBool("actions", "killswitch");

    /** Creates a new instance of ActionManager. */
    private ActionManager() {
    //#ActionManager.java:88: method: void com.dmdirc.actions.ActionManager.com.dmdirc.actions.ActionManager()
        // Shouldn't be instansiated
    }
    //#ActionManager.java:90: end of method: void com.dmdirc.actions.ActionManager.com.dmdirc.actions.ActionManager()

    /**
     * Initialises the action manager.
     */
    public static void init() {
        registerActionTypes(CoreActionType.values());
    //#ActionManager.java:96: method: void com.dmdirc.actions.ActionManager.init()
    //#ActionManager.java:96: ?precondition failure
    //#    com/dmdirc/actions/ActionManager.registerActionTypes: (soft) types[0..4_294_967_295] != null
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.actions.ActionManager
    //#    method: void init()
    //#    basic block: Entry_BB_1
    //#    assertion: (soft) values(...)[0..4_294_967_295] != null
    //#    callee: void com/dmdirc/actions/ActionManager.registerActionTypes(ActionType[])
    //#    callee assertion: (soft) types[0..4_294_967_295] != null
    //#    callee file: ActionManager.java
    //#    callee precondition index: [3]
    //#    callee srcpos: 162
    //#    VN: values(...)[0..4_294_967_295]
    //#    Expected: Inverse{null}
    //#    Bad: Addr_Set{null, Invalid}
    //#    Attribs:  Ptr  null in Bad  Soft
    //#ActionManager.java:96: Warning: suspicious precondition
    //#    The precondition for com.dmdirc.actions.CoreActionType__static_init.new CoreActionType[](CoreActionType__static_init#74)[0..73].__Tag is not a contiguous range of values
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.actions.ActionManager
    //#    method: void init()
    //#    suspicious precondition index: [4]
    //#    Attribs:  Soft
    //#ActionManager.java:96: Warning: suspicious precondition
    //#    The precondition for com.dmdirc.actions.CoreActionType__static_init.new CoreActionType[](CoreActionType__static_init#74)[0..73].type.__Tag is not a contiguous range of values
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.actions.ActionManager
    //#    method: void init()
    //#    suspicious precondition index: [7]
    //#    Attribs:  Soft
    //#ActionManager.java:96: Warning: suspicious precondition
    //#    The precondition for com.dmdirc.actions.CoreActionType__static_init.new CoreActionType[](CoreActionType__static_init#74)[0..73].type.__Tag is not a contiguous range of values
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.actions.ActionManager
    //#    method: void init()
    //#    suspicious precondition index: [8]
    //#    Attribs:  Soft
    //#ActionManager.java:96: Warning: suspicious precondition
    //#    The precondition for com/dmdirc/actions/wrappers/PerformWrapper.me.__Tag is not a contiguous range of values
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.actions.ActionManager
    //#    method: void init()
    //#    suspicious precondition index: [10]
    //#input(void init()): actionComparisons
    //#input(void init()): actionComponents
    //#input(void init()): actionTypeGroups
    //#input(void init()): actionTypes
    //#input(void init()): com.dmdirc.actions.CoreActionComparison__static_init.new CoreActionComparison[](CoreActionComparison__static_init#13).length
    //#input(void init()): com.dmdirc.actions.CoreActionComparison__static_init.new CoreActionComparison[](CoreActionComparison__static_init#13)[0..12]
    //#input(void init()): com.dmdirc.actions.CoreActionComponent__static_init.new CoreActionComponent[](CoreActionComponent__static_init#28).length
    //#input(void init()): com.dmdirc.actions.CoreActionComponent__static_init.new CoreActionComponent[](CoreActionComponent__static_init#28)[0..27]
    //#input(void init()): com.dmdirc.actions.CoreActionType__static_init.new CoreActionType[](CoreActionType__static_init#74).length
    //#input(void init()): com.dmdirc.actions.CoreActionType__static_init.new CoreActionType[](CoreActionType__static_init#74)[0..73]
    //#input(void init()): com.dmdirc.actions.CoreActionType__static_init.new CoreActionType[](CoreActionType__static_init#74)[0..73].__Tag
    //#input(void init()): com.dmdirc.actions.CoreActionType__static_init.new CoreActionType[](CoreActionType__static_init#74)[0..73].type
    //#input(void init()): com.dmdirc.actions.CoreActionType__static_init.new CoreActionType[](CoreActionType__static_init#74)[0..73].type.__Tag
    //#input(void init()): com/dmdirc/actions/ActionGroup.__Descendant_Table[com/dmdirc/actions/ActionGroup]
    //#input(void init()): com/dmdirc/actions/ActionGroup.__Descendant_Table[com/dmdirc/actions/wrappers/AliasWrapper]
    //#input(void init()): com/dmdirc/actions/ActionGroup.__Descendant_Table[com/dmdirc/actions/wrappers/PerformWrapper]
    //#input(void init()): com/dmdirc/actions/ActionGroup.__Descendant_Table[others]
    //#input(void init()): com/dmdirc/actions/ActionGroup.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(void init()): com/dmdirc/actions/CoreActionComparison.$VALUES
    //#input(void init()): com/dmdirc/actions/CoreActionComponent.$VALUES
    //#input(void init()): com/dmdirc/actions/CoreActionType.$VALUES
    //#input(void init()): com/dmdirc/actions/CoreActionType.CLIENT_CLOSED
    //#input(void init()): com/dmdirc/actions/CoreActionType.__Dispatch_Table.getType()Lcom/dmdirc/actions/interfaces/ActionMetaType;
    //#input(void init()): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/interfaces/ActionMetaType]
    //#input(void init()): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/ActionEvents]
    //#input(void init()): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/ChannelEvents]
    //#input(void init()): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/ClientEvents]
    //#input(void init()): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/PluginEvents]
    //#input(void init()): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/QueryEvents]
    //#input(void init()): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/ServerEvents]
    //#input(void init()): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/addons/dcc/actions/DCCEvents]
    //#input(void init()): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[others]
    //#input(void init()): com/dmdirc/actions/interfaces/ActionMetaType.__Dispatch_Table.getGroup()Ljava/lang/String;
    //#input(void init()): com/dmdirc/actions/interfaces/ActionType.__Descendant_Table[com/dmdirc/actions/CoreActionType]
    //#input(void init()): com/dmdirc/actions/interfaces/ActionType.__Descendant_Table[com/dmdirc/actions/interfaces/ActionType]
    //#input(void init()): com/dmdirc/actions/interfaces/ActionType.__Descendant_Table[com/dmdirc/addons/dcc/actions/DCCActions]
    //#input(void init()): com/dmdirc/actions/interfaces/ActionType.__Descendant_Table[others]
    //#input(void init()): com/dmdirc/actions/interfaces/ActionType.__Dispatch_Table.getType()Lcom/dmdirc/actions/interfaces/ActionMetaType;
    //#input(void init()): com/dmdirc/actions/metatypes/ActionEvents.__Dispatch_Table.getGroup()Ljava/lang/String;
    //#input(void init()): com/dmdirc/actions/metatypes/ChannelEvents.__Dispatch_Table.getGroup()Ljava/lang/String;
    //#input(void init()): com/dmdirc/actions/metatypes/ClientEvents.__Dispatch_Table.getGroup()Ljava/lang/String;
    //#input(void init()): com/dmdirc/actions/metatypes/PluginEvents.__Dispatch_Table.getGroup()Ljava/lang/String;
    //#input(void init()): com/dmdirc/actions/metatypes/QueryEvents.__Dispatch_Table.getGroup()Ljava/lang/String;
    //#input(void init()): com/dmdirc/actions/metatypes/ServerEvents.__Dispatch_Table.getGroup()Ljava/lang/String;
    //#input(void init()): com/dmdirc/actions/wrappers/AliasWrapper.__Class_Obj.__Lock
    //#input(void init()): com/dmdirc/actions/wrappers/AliasWrapper.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(void init()): com/dmdirc/actions/wrappers/AliasWrapper.me
    //#input(void init()): com/dmdirc/actions/wrappers/AliasWrapper.me.__Tag
    //#input(void init()): com/dmdirc/actions/wrappers/AliasWrapper.me.name
    //#input(void init()): com/dmdirc/actions/wrappers/PerformWrapper.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(void init()): com/dmdirc/actions/wrappers/PerformWrapper.me
    //#input(void init()): com/dmdirc/actions/wrappers/PerformWrapper.me.__Tag
    //#input(void init()): com/dmdirc/actions/wrappers/PerformWrapper.me.name
    //#input(void init()): com/dmdirc/addons/dcc/actions/DCCActions.__Dispatch_Table.getType()Lcom/dmdirc/actions/interfaces/ActionMetaType;
    //#input(void init()): com/dmdirc/addons/dcc/actions/DCCEvents.__Dispatch_Table.getGroup()Ljava/lang/String;
    //#input(void init()): groups
    //#input(void init()): listeners
    //#output(void init()): com/dmdirc/actions/wrappers/AliasWrapper.me
    //#output(void init()): new AliasWrapper(getAliasWrapper#1) num objects
    //#output(void init()): new AliasWrapper(getAliasWrapper#1).__Tag
    //#output(void init()): new AliasWrapper(getAliasWrapper#1).actions
    //#output(void init()): new AliasWrapper(getAliasWrapper#1).aliases
    //#output(void init()): new AliasWrapper(getAliasWrapper#1).author
    //#output(void init()): new AliasWrapper(getAliasWrapper#1).component
    //#output(void init()): new AliasWrapper(getAliasWrapper#1).description
    //#output(void init()): new AliasWrapper(getAliasWrapper#1).name
    //#output(void init()): new AliasWrapper(getAliasWrapper#1).settings
    //#output(void init()): new AliasWrapper(getAliasWrapper#1).version
    //#output(void init()): new ArrayList(ActionGroup#1) num objects
    //#output(void init()): new ArrayList(AliasWrapper#1) num objects
    //#output(void init()): new HashMap(ActionGroup#2) num objects
    //#new obj(void init()): new AliasWrapper(getAliasWrapper#1)
    //#new obj(void init()): new ArrayList(ActionGroup#1)
    //#new obj(void init()): new ArrayList(AliasWrapper#1)
    //#new obj(void init()): new HashMap(ActionGroup#2)
    //#pre[9] (void init()): com/dmdirc/actions/wrappers/PerformWrapper.me != null
    //#pre[10] (void init()): com/dmdirc/actions/wrappers/PerformWrapper.me.__Tag in {com/dmdirc/actions/ActionGroup, com/dmdirc/actions/wrappers/AliasWrapper, com/dmdirc/actions/wrappers/PerformWrapper}
    //#pre[12] (void init()): init'ed(com/dmdirc/actions/wrappers/AliasWrapper.me)
    //#pre[1] (void init()): (soft) init'ed(com.dmdirc.actions.CoreActionComparison__static_init.new CoreActionComparison[](CoreActionComparison__static_init#13)[0..12])
    //#pre[2] (void init()): (soft) init'ed(com.dmdirc.actions.CoreActionComponent__static_init.new CoreActionComponent[](CoreActionComponent__static_init#28)[0..27])
    //#pre[3] (void init()): (soft) com.dmdirc.actions.CoreActionType__static_init.new CoreActionType[](CoreActionType__static_init#74)[0..73] != null
    //#pre[4] (void init()): (soft) com.dmdirc.actions.CoreActionType__static_init.new CoreActionType[](CoreActionType__static_init#74)[0..73].__Tag in {com/dmdirc/actions/CoreActionType, com/dmdirc/actions/interfaces/ActionType, com/dmdirc/addons/dcc/actions/DCCActions}
    //#pre[5] (void init()): (soft) com.dmdirc.actions.CoreActionType__static_init.new CoreActionType[](CoreActionType__static_init#74)[0..73].type != null
    //#pre[6] (void init()): (soft) com.dmdirc.actions.CoreActionType__static_init.new CoreActionType[](CoreActionType__static_init#74)[0..73].type != null
    //#pre[7] (void init()): (soft) com.dmdirc.actions.CoreActionType__static_init.new CoreActionType[](CoreActionType__static_init#74)[0..73].type.__Tag in {com/dmdirc/actions/interfaces/ActionMetaType, com/dmdirc/actions/metatypes/ActionEvents, com/dmdirc/actions/metatypes/ChannelEvents, com/dmdirc/actions/metatypes/ClientEvents, com/dmdirc/actions/metatypes/PluginEvents, com/dmdirc/actions/metatypes/QueryEvents, com/dmdirc/actions/metatypes/ServerEvents, com/dmdirc/addons/dcc/actions/DCCEvents}
    //#pre[8] (void init()): (soft) com.dmdirc.actions.CoreActionType__static_init.new CoreActionType[](CoreActionType__static_init#74)[0..73].type.__Tag in {com/dmdirc/actions/interfaces/ActionMetaType, com/dmdirc/actions/metatypes/ActionEvents, com/dmdirc/actions/metatypes/ChannelEvents, com/dmdirc/actions/metatypes/ClientEvents, com/dmdirc/actions/metatypes/PluginEvents, com/dmdirc/actions/metatypes/QueryEvents, com/dmdirc/actions/metatypes/ServerEvents, com/dmdirc/addons/dcc/actions/DCCEvents}
    //#presumption(void init()): com.dmdirc.config.IdentityManager:getGlobalConfig(...)@114 != null
    //#presumption(void init()): getAliasWrapper(...).__Tag in {com/dmdirc/actions/ActionGroup, com/dmdirc/actions/wrappers/AliasWrapper, com/dmdirc/actions/wrappers/PerformWrapper}
    //#post(void init()): com/dmdirc/actions/wrappers/AliasWrapper.me == One-of{old com/dmdirc/actions/wrappers/AliasWrapper.me, &new AliasWrapper(getAliasWrapper#1)}
    //#post(void init()): com/dmdirc/actions/wrappers/AliasWrapper.me != null
    //#post(void init()): new AliasWrapper(getAliasWrapper#1) num objects <= 1
    //#post(void init()): new ArrayList(ActionGroup#1) num objects == new AliasWrapper(getAliasWrapper#1) num objects
    //#post(void init()): new ArrayList(AliasWrapper#1) num objects == new AliasWrapper(getAliasWrapper#1) num objects
    //#post(void init()): new HashMap(ActionGroup#2) num objects == new AliasWrapper(getAliasWrapper#1) num objects
    //#post(void init()): new AliasWrapper(getAliasWrapper#1).__Tag == com/dmdirc/actions/wrappers/AliasWrapper
    //#post(void init()): new AliasWrapper(getAliasWrapper#1).actions == &new ArrayList(ActionGroup#1)
    //#post(void init()): new AliasWrapper(getAliasWrapper#1).aliases == &new ArrayList(AliasWrapper#1)
    //#post(void init()): new AliasWrapper(getAliasWrapper#1).author == null
    //#post(void init()): new AliasWrapper(getAliasWrapper#1).description == null
    //#post(void init()): new AliasWrapper(getAliasWrapper#1).component == -1
    //#post(void init()): new AliasWrapper(getAliasWrapper#1).version == -1
    //#post(void init()): new AliasWrapper(getAliasWrapper#1).name == &"aliases"
    //#post(void init()): new AliasWrapper(getAliasWrapper#1).settings == &new HashMap(ActionGroup#2)
    //#unanalyzed(void init()): Effects-of-calling:com.dmdirc.logger.Logger:assertTrue
    //#unanalyzed(void init()): Effects-of-calling:java.util.List:contains
    //#unanalyzed(void init()): Effects-of-calling:java.util.List:add
    //#unanalyzed(void init()): Effects-of-calling:getType
    //#unanalyzed(void init()): Effects-of-calling:getGroup
    //#unanalyzed(void init()): Effects-of-calling:com.dmdirc.util.MapList:add
    //#unanalyzed(void init()): Effects-of-calling:java.util.Map:put
    //#unanalyzed(void init()): Effects-of-calling:com.dmdirc.actions.ActionGroup
    //#unanalyzed(void init()): Effects-of-calling:java.util.ArrayList
    //#unanalyzed(void init()): Effects-of-calling:java.util.HashMap
        registerActionComparisons(CoreActionComparison.values());
    //#ActionManager.java:97: ?precondition failure
    //#    com/dmdirc/actions/ActionManager.registerActionComparisons: (soft) init'ed(comps[0..4_294_967_295])
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.actions.ActionManager
    //#    method: void init()
    //#    basic block: Entry_BB_1
    //#    assertion: (soft) init'ed(values(...)[0..4_294_967_295])
    //#    callee: void com/dmdirc/actions/ActionManager.registerActionComparisons(ActionComparison[])
    //#    callee assertion: (soft) init'ed(comps[0..4_294_967_295])
    //#    callee file: ActionManager.java
    //#    callee precondition index: [3]
    //#    callee srcpos: 193
    //#    VN: values(...)[0..4_294_967_295]
    //#    Expected: Univ-VN-Set
    //#    Bad: {Invalid}
    //#    Attribs:  Ptr  Soft  Bad only invalid
        registerActionComponents(CoreActionComponent.values());
    //#ActionManager.java:98: ?precondition failure
    //#    com/dmdirc/actions/ActionManager.registerActionComponents: (soft) init'ed(comps[0..4_294_967_295])
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.actions.ActionManager
    //#    method: void init()
    //#    basic block: Entry_BB_1
    //#    assertion: (soft) init'ed(values(...)[0..4_294_967_295])
    //#    callee: void com/dmdirc/actions/ActionManager.registerActionComponents(ActionComponent[])
    //#    callee assertion: (soft) init'ed(comps[0..4_294_967_295])
    //#    callee file: ActionManager.java
    //#    callee precondition index: [3]
    //#    callee srcpos: 179
    //#    VN: values(...)[0..4_294_967_295]
    //#    Expected: Univ-VN-Set
    //#    Bad: {Invalid}
    //#    Attribs:  Ptr  Soft  Bad only invalid

        registerGroup(AliasWrapper.getAliasWrapper());
        registerGroup(PerformWrapper.getPerformWrapper());
       
        // Register a listener for the closing event, so we can save actions
        addListener(new ActionListener() {
    //#ActionManager.java:104: method: void com.dmdirc.actions.ActionManager$1.com.dmdirc.actions.ActionManager$1()
    //#ActionManager.java:104: end of method: void com.dmdirc.actions.ActionManager$1.com.dmdirc.actions.ActionManager$1()
    //#ActionManager.java:104: ?precondition failure
    //#    com/dmdirc/actions/ActionManager.addListener: (soft) init'ed(types[0..4_294_967_295])
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.actions.ActionManager
    //#    method: void init()
    //#    basic block: Entry_BB_1
    //#    assertion: (soft) init'ed(addListener.Param_1[0..4_294_967_295])
    //#    callee: void com/dmdirc/actions/ActionManager.addListener(ActionListener, ActionType[])
    //#    callee assertion: (soft) init'ed(types[0..4_294_967_295])
    //#    callee file: ActionManager.java
    //#    callee precondition index: [4]
    //#    callee srcpos: 676
    //#    VN: addListener.Param_1[0..4_294_967_295]
    //#    Expected: Univ-VN-Set
    //#    Bad: {Invalid}
    //#    Attribs:  Ptr  Soft  Bad only invalid
            /** {@inheritDoc} */
            @Override
            public void processEvent(final ActionType type, final StringBuffer format,
                    final Object... arguments) {
                saveActions();
    //#ActionManager.java:109: method: void com.dmdirc.actions.ActionManager$1.processEvent(ActionType, StringBuffer, Object[])
    //#input(void processEvent(ActionType, StringBuffer, Object[])): com/dmdirc/actions/Action.__Descendant_Table[com/dmdirc/actions/Action]
    //#input(void processEvent(ActionType, StringBuffer, Object[])): com/dmdirc/actions/Action.__Descendant_Table[others]
    //#input(void processEvent(ActionType, StringBuffer, Object[])): com/dmdirc/actions/Action.__Dispatch_Table.save()V
    //#input(void processEvent(ActionType, StringBuffer, Object[])): com/dmdirc/actions/ActionGroup.__Descendant_Table[com/dmdirc/actions/ActionGroup]
    //#input(void processEvent(ActionType, StringBuffer, Object[])): com/dmdirc/actions/ActionGroup.__Descendant_Table[com/dmdirc/actions/wrappers/AliasWrapper]
    //#input(void processEvent(ActionType, StringBuffer, Object[])): com/dmdirc/actions/ActionGroup.__Descendant_Table[com/dmdirc/actions/wrappers/PerformWrapper]
    //#input(void processEvent(ActionType, StringBuffer, Object[])): com/dmdirc/actions/ActionGroup.__Descendant_Table[others]
    //#input(void processEvent(ActionType, StringBuffer, Object[])): com/dmdirc/actions/ActionGroup.__Dispatch_Table.iterator()Ljava/util/Iterator;
    //#input(void processEvent(ActionType, StringBuffer, Object[])): com/dmdirc/actions/ActionManager.groups
    //#input(void processEvent(ActionType, StringBuffer, Object[])): com/dmdirc/actions/wrappers/AliasWrapper.__Dispatch_Table.iterator()Ljava/util/Iterator;
    //#input(void processEvent(ActionType, StringBuffer, Object[])): com/dmdirc/actions/wrappers/PerformWrapper.__Dispatch_Table.iterator()Ljava/util/Iterator;
    //#unanalyzed(void processEvent(ActionType, StringBuffer, Object[])): Effects-of-calling:java.util.Map:values
    //#unanalyzed(void processEvent(ActionType, StringBuffer, Object[])): Effects-of-calling:java.util.Collection:iterator
    //#unanalyzed(void processEvent(ActionType, StringBuffer, Object[])): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(void processEvent(ActionType, StringBuffer, Object[])): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(void processEvent(ActionType, StringBuffer, Object[])): Effects-of-calling:java.util.List:iterator
    //#unanalyzed(void processEvent(ActionType, StringBuffer, Object[])): Effects-of-calling:save
    //#unanalyzed(void processEvent(ActionType, StringBuffer, Object[])): Effects-of-calling:com.dmdirc.logger.Logger:assertTrue
    //#unanalyzed(void processEvent(ActionType, StringBuffer, Object[])): Effects-of-calling:getType
    //#unanalyzed(void processEvent(ActionType, StringBuffer, Object[])): Effects-of-calling:com.dmdirc.util.MapList:containsKey
    //#unanalyzed(void processEvent(ActionType, StringBuffer, Object[])): Effects-of-calling:com.dmdirc.util.MapList:get
    //#unanalyzed(void processEvent(ActionType, StringBuffer, Object[])): Effects-of-calling:java.util.ArrayList
    //#unanalyzed(void processEvent(ActionType, StringBuffer, Object[])): Effects-of-calling:java.util.ArrayList:iterator
    //#unanalyzed(void processEvent(ActionType, StringBuffer, Object[])): Effects-of-calling:trigger
    //#unanalyzed(void processEvent(ActionType, StringBuffer, Object[])): Effects-of-calling:getArity
    //#unanalyzed(void processEvent(ActionType, StringBuffer, Object[])): Effects-of-calling:com.dmdirc.interfaces.ActionListener:processEvent
    //#unanalyzed(void processEvent(ActionType, StringBuffer, Object[])): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void processEvent(ActionType, StringBuffer, Object[])): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void processEvent(ActionType, StringBuffer, Object[])): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void processEvent(ActionType, StringBuffer, Object[])): Effects-of-calling:com.dmdirc.logger.Logger:userError
    //#unanalyzed(void processEvent(ActionType, StringBuffer, Object[])): Effects-of-calling:com.dmdirc.util.ConfigFile
    //#unanalyzed(void processEvent(ActionType, StringBuffer, Object[])): Effects-of-calling:java.util.Arrays:toString
    //#unanalyzed(void processEvent(ActionType, StringBuffer, Object[])): Effects-of-calling:java.lang.IllegalArgumentException
    //#unanalyzed(void processEvent(ActionType, StringBuffer, Object[])): Effects-of-calling:com.dmdirc.logger.Logger:appError
    //#unanalyzed(void processEvent(ActionType, StringBuffer, Object[])): Effects-of-calling:java.lang.Object:toString
    //#unanalyzed(void processEvent(ActionType, StringBuffer, Object[])): Effects-of-calling:java.util.List:add
    //#unanalyzed(void processEvent(ActionType, StringBuffer, Object[])): Effects-of-calling:com.dmdirc.util.ConfigFile:addDomain
    //#unanalyzed(void processEvent(ActionType, StringBuffer, Object[])): Effects-of-calling:com.dmdirc.util.ConfigFile:getFlatDomain
    //#unanalyzed(void processEvent(ActionType, StringBuffer, Object[])): Effects-of-calling:com.dmdirc.actions.ConditionTree$OPERATION:ordinal
    //#unanalyzed(void processEvent(ActionType, StringBuffer, Object[])): Effects-of-calling:java.lang.String:valueOf
    //#unanalyzed(void processEvent(ActionType, StringBuffer, Object[])): Effects-of-calling:java.util.HashMap
    //#unanalyzed(void processEvent(ActionType, StringBuffer, Object[])): Effects-of-calling:java.util.Map:put
    //#unanalyzed(void processEvent(ActionType, StringBuffer, Object[])): Effects-of-calling:com.dmdirc.util.ConfigFile:isKeyDomain
    //#unanalyzed(void processEvent(ActionType, StringBuffer, Object[])): Effects-of-calling:com.dmdirc.util.ConfigFile:getKeyDomain
    //#unanalyzed(void processEvent(ActionType, StringBuffer, Object[])): Effects-of-calling:com.dmdirc.util.ConfigFile:write
    //#unanalyzed(void processEvent(ActionType, StringBuffer, Object[])): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(void processEvent(ActionType, StringBuffer, Object[])): Effects-of-calling:java.io.IOException:getMessage
            }
    //#ActionManager.java:110: end of method: void com.dmdirc.actions.ActionManager$1.processEvent(ActionType, StringBuffer, Object[])
        }, CoreActionType.CLIENT_CLOSED);

        // Make sure we listen for the killswitch
        IdentityManager.getGlobalConfig().addChangeListener("actions", "killswitch",
    //#ActionManager.java:114: Warning: method not available - call not analyzed
    //#    call on ConfigManager com.dmdirc.config.IdentityManager:getGlobalConfig()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.ActionManager
    //#    method: void init()
    //#    unanalyzed callee: ConfigManager com.dmdirc.config.IdentityManager:getGlobalConfig()
    //#ActionManager.java:114: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.config.ConfigManager:addChangeListener(String, String, ConfigChangeListener)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.ActionManager
    //#    method: void init()
    //#    unanalyzed callee: void com.dmdirc.config.ConfigManager:addChangeListener(String, String, ConfigChangeListener)
                new ConfigChangeListener() {
    //#ActionManager.java:115: method: void com.dmdirc.actions.ActionManager$2.com.dmdirc.actions.ActionManager$2()
    //#ActionManager.java:115: end of method: void com.dmdirc.actions.ActionManager$2.com.dmdirc.actions.ActionManager$2()
            /** {@inheritDoc} */
            @Override
            public void configChanged(final String domain, final String key) {
                killSwitch = IdentityManager.getGlobalConfig().getOptionBool(
    //#ActionManager.java:119: method: void com.dmdirc.actions.ActionManager$2.configChanged(String, String)
    //#ActionManager.java:119: Warning: method not available - call not analyzed
    //#    call on ConfigManager com.dmdirc.config.IdentityManager:getGlobalConfig()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.ActionManager$2
    //#    method: void configChanged(String, String)
    //#    unanalyzed callee: ConfigManager com.dmdirc.config.IdentityManager:getGlobalConfig()
    //#ActionManager.java:119: Warning: method not available - call not analyzed
    //#    call on bool com.dmdirc.config.ConfigManager:getOptionBool(String, String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.ActionManager$2
    //#    method: void configChanged(String, String)
    //#    unanalyzed callee: bool com.dmdirc.config.ConfigManager:getOptionBool(String, String)
    //#output(void configChanged(String, String)): com/dmdirc/actions/ActionManager.killSwitch
    //#presumption(void configChanged(String, String)): com.dmdirc.config.IdentityManager:getGlobalConfig(...)@119 != null
    //#post(void configChanged(String, String)): init'ed(com/dmdirc/actions/ActionManager.killSwitch)
                        "actions", "killswitch");
            }
    //#ActionManager.java:121: end of method: void com.dmdirc.actions.ActionManager$2.configChanged(String, String)
        });
    }
    //#ActionManager.java:123: end of method: void com.dmdirc.actions.ActionManager.init()
    
    /**
     * Saves all actions.
     */
    public static void saveActions() {
        for (ActionGroup group : groups.values()) {
    //#ActionManager.java:129: method: void com.dmdirc.actions.ActionManager.saveActions()
    //#input(void saveActions()): com/dmdirc/actions/Action.__Descendant_Table[com/dmdirc/actions/Action]
    //#input(void saveActions()): com/dmdirc/actions/Action.__Descendant_Table[others]
    //#input(void saveActions()): com/dmdirc/actions/Action.__Dispatch_Table.save()V
    //#input(void saveActions()): com/dmdirc/actions/ActionGroup.__Descendant_Table[com/dmdirc/actions/ActionGroup]
    //#input(void saveActions()): com/dmdirc/actions/ActionGroup.__Descendant_Table[com/dmdirc/actions/wrappers/AliasWrapper]
    //#input(void saveActions()): com/dmdirc/actions/ActionGroup.__Descendant_Table[com/dmdirc/actions/wrappers/PerformWrapper]
    //#input(void saveActions()): com/dmdirc/actions/ActionGroup.__Descendant_Table[others]
    //#input(void saveActions()): com/dmdirc/actions/ActionGroup.__Dispatch_Table.iterator()Ljava/util/Iterator;
    //#input(void saveActions()): com/dmdirc/actions/wrappers/AliasWrapper.__Dispatch_Table.iterator()Ljava/util/Iterator;
    //#input(void saveActions()): com/dmdirc/actions/wrappers/PerformWrapper.__Dispatch_Table.iterator()Ljava/util/Iterator;
    //#input(void saveActions()): groups
    //#presumption(void saveActions()): group.actions@129 != null
    //#presumption(void saveActions()): java.util.Iterator:next(...).__Tag@129 in {com/dmdirc/actions/ActionGroup, com/dmdirc/actions/wrappers/AliasWrapper, com/dmdirc/actions/wrappers/PerformWrapper}
    //#presumption(void saveActions()): java.util.Iterator:next(...).__Tag@130 == com/dmdirc/actions/Action
    //#presumption(void saveActions()): java.util.Iterator:next(...)@129 != null
    //#presumption(void saveActions()): java.util.Iterator:next(...)@130 != null
    //#presumption(void saveActions()): java.util.Map:values(...)@129 != null
    //#unanalyzed(void saveActions()): Effects-of-calling:java.util.List:iterator
    //#test_vector(void saveActions()): java.util.Iterator:hasNext(...)@129: {0}, {1}
    //#test_vector(void saveActions()): java.util.Iterator:hasNext(...)@130: {0}, {1}
            for (Action action : group) {
                action.save();
    //#ActionManager.java:131: Warning: call too complex - analysis skipped
    //#    call on void save()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.ActionManager
    //#    method: void saveActions()
    //#    unanalyzed callee: void save()
            }
        }
    }
    //#ActionManager.java:134: end of method: void com.dmdirc.actions.ActionManager.saveActions()

    /**
     * Registers the specified default setting for actions.
     *
     * @param name The name of the setting to be registered
     * @param value The default value for the setting
     */
    public static void registerDefault(final String name, final String value) {
        IdentityManager.getAddonIdentity().setOption("actions", name, value);
    //#ActionManager.java:143: method: void com.dmdirc.actions.ActionManager.registerDefault(String, String)
    //#ActionManager.java:143: Warning: method not available - call not analyzed
    //#    call on Identity com.dmdirc.config.IdentityManager:getAddonIdentity()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.ActionManager
    //#    method: void registerDefault(String, String)
    //#    unanalyzed callee: Identity com.dmdirc.config.IdentityManager:getAddonIdentity()
    //#ActionManager.java:143: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.config.Identity:setOption(String, String, String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.ActionManager
    //#    method: void registerDefault(String, String)
    //#    unanalyzed callee: void com.dmdirc.config.Identity:setOption(String, String, String)
    //#input(void registerDefault(String, String)): name
    //#input(void registerDefault(String, String)): value
    //#presumption(void registerDefault(String, String)): com.dmdirc.config.IdentityManager:getAddonIdentity(...)@143 != null
    }
    //#ActionManager.java:144: end of method: void com.dmdirc.actions.ActionManager.registerDefault(String, String)

    /**
     * Registers the specified group of actions with the manager.
     *
     * @param group The group of actions to be registered
     */
    public static void registerGroup(final ActionGroup group) {
        groups.put(group.getName(), group);
    //#ActionManager.java:152: method: void com.dmdirc.actions.ActionManager.registerGroup(ActionGroup)
    //#ActionManager.java:152: Warning: suspicious precondition
    //#    The precondition for group.__Tag is not a contiguous range of values
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.actions.ActionManager
    //#    method: void registerGroup(ActionGroup)
    //#    suspicious precondition index: [2]
    //#input(void registerGroup(ActionGroup)): com/dmdirc/actions/ActionGroup.__Descendant_Table[com/dmdirc/actions/ActionGroup]
    //#input(void registerGroup(ActionGroup)): com/dmdirc/actions/ActionGroup.__Descendant_Table[com/dmdirc/actions/wrappers/AliasWrapper]
    //#input(void registerGroup(ActionGroup)): com/dmdirc/actions/ActionGroup.__Descendant_Table[com/dmdirc/actions/wrappers/PerformWrapper]
    //#input(void registerGroup(ActionGroup)): com/dmdirc/actions/ActionGroup.__Descendant_Table[others]
    //#input(void registerGroup(ActionGroup)): com/dmdirc/actions/ActionGroup.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(void registerGroup(ActionGroup)): com/dmdirc/actions/wrappers/AliasWrapper.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(void registerGroup(ActionGroup)): com/dmdirc/actions/wrappers/PerformWrapper.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(void registerGroup(ActionGroup)): group
    //#input(void registerGroup(ActionGroup)): group.__Tag
    //#input(void registerGroup(ActionGroup)): group.name
    //#input(void registerGroup(ActionGroup)): groups
    //#pre[1] (void registerGroup(ActionGroup)): group != null
    //#pre[2] (void registerGroup(ActionGroup)): group.__Tag in {com/dmdirc/actions/ActionGroup, com/dmdirc/actions/wrappers/AliasWrapper, com/dmdirc/actions/wrappers/PerformWrapper}
    }
    //#ActionManager.java:153: end of method: void com.dmdirc.actions.ActionManager.registerGroup(ActionGroup)

    /**
     * Registers a set of actiontypes with the manager.
     *
     * @param types An array of ActionTypes to be registered
     */
    @Precondition("None of the specified ActionTypes are null")
    public static void registerActionTypes(final ActionType[] types) {
        for (ActionType type : types) {
    //#ActionManager.java:162: method: void com.dmdirc.actions.ActionManager.registerActionTypes(ActionType[])
    //#ActionManager.java:162: Warning: suspicious precondition
    //#    The precondition for types[0..4_294_967_295].__Tag is not a contiguous range of values
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.actions.ActionManager
    //#    method: void registerActionTypes(ActionType[])
    //#    suspicious precondition index: [4]
    //#    Attribs:  Soft
    //#ActionManager.java:162: Warning: suspicious precondition
    //#    The precondition for types[0..4_294_967_295].type.__Tag is not a contiguous range of values
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.actions.ActionManager
    //#    method: void registerActionTypes(ActionType[])
    //#    suspicious precondition index: [7]
    //#    Attribs:  Soft
    //#ActionManager.java:162: Warning: suspicious precondition
    //#    The precondition for types[0..4_294_967_295].type.__Tag is not a contiguous range of values
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.actions.ActionManager
    //#    method: void registerActionTypes(ActionType[])
    //#    suspicious precondition index: [8]
    //#    Attribs:  Soft
    //#input(void registerActionTypes(ActionType[])): actionTypeGroups
    //#input(void registerActionTypes(ActionType[])): actionTypes
    //#input(void registerActionTypes(ActionType[])): com/dmdirc/actions/CoreActionType.__Dispatch_Table.getType()Lcom/dmdirc/actions/interfaces/ActionMetaType;
    //#input(void registerActionTypes(ActionType[])): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/interfaces/ActionMetaType]
    //#input(void registerActionTypes(ActionType[])): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/ActionEvents]
    //#input(void registerActionTypes(ActionType[])): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/ChannelEvents]
    //#input(void registerActionTypes(ActionType[])): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/ClientEvents]
    //#input(void registerActionTypes(ActionType[])): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/PluginEvents]
    //#input(void registerActionTypes(ActionType[])): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/QueryEvents]
    //#input(void registerActionTypes(ActionType[])): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/ServerEvents]
    //#input(void registerActionTypes(ActionType[])): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/addons/dcc/actions/DCCEvents]
    //#input(void registerActionTypes(ActionType[])): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[others]
    //#input(void registerActionTypes(ActionType[])): com/dmdirc/actions/interfaces/ActionMetaType.__Dispatch_Table.getGroup()Ljava/lang/String;
    //#input(void registerActionTypes(ActionType[])): com/dmdirc/actions/interfaces/ActionType.__Descendant_Table[com/dmdirc/actions/CoreActionType]
    //#input(void registerActionTypes(ActionType[])): com/dmdirc/actions/interfaces/ActionType.__Descendant_Table[com/dmdirc/actions/interfaces/ActionType]
    //#input(void registerActionTypes(ActionType[])): com/dmdirc/actions/interfaces/ActionType.__Descendant_Table[com/dmdirc/addons/dcc/actions/DCCActions]
    //#input(void registerActionTypes(ActionType[])): com/dmdirc/actions/interfaces/ActionType.__Descendant_Table[others]
    //#input(void registerActionTypes(ActionType[])): com/dmdirc/actions/interfaces/ActionType.__Dispatch_Table.getType()Lcom/dmdirc/actions/interfaces/ActionMetaType;
    //#input(void registerActionTypes(ActionType[])): com/dmdirc/actions/metatypes/ActionEvents.__Dispatch_Table.getGroup()Ljava/lang/String;
    //#input(void registerActionTypes(ActionType[])): com/dmdirc/actions/metatypes/ChannelEvents.__Dispatch_Table.getGroup()Ljava/lang/String;
    //#input(void registerActionTypes(ActionType[])): com/dmdirc/actions/metatypes/ClientEvents.__Dispatch_Table.getGroup()Ljava/lang/String;
    //#input(void registerActionTypes(ActionType[])): com/dmdirc/actions/metatypes/PluginEvents.__Dispatch_Table.getGroup()Ljava/lang/String;
    //#input(void registerActionTypes(ActionType[])): com/dmdirc/actions/metatypes/QueryEvents.__Dispatch_Table.getGroup()Ljava/lang/String;
    //#input(void registerActionTypes(ActionType[])): com/dmdirc/actions/metatypes/ServerEvents.__Dispatch_Table.getGroup()Ljava/lang/String;
    //#input(void registerActionTypes(ActionType[])): com/dmdirc/addons/dcc/actions/DCCActions.__Dispatch_Table.getType()Lcom/dmdirc/actions/interfaces/ActionMetaType;
    //#input(void registerActionTypes(ActionType[])): com/dmdirc/addons/dcc/actions/DCCEvents.__Dispatch_Table.getGroup()Ljava/lang/String;
    //#input(void registerActionTypes(ActionType[])): types
    //#input(void registerActionTypes(ActionType[])): types.length
    //#input(void registerActionTypes(ActionType[])): types[0..4_294_967_295]
    //#input(void registerActionTypes(ActionType[])): types[0..4_294_967_295].__Tag
    //#input(void registerActionTypes(ActionType[])): types[0..4_294_967_295].type
    //#input(void registerActionTypes(ActionType[])): types[0..4_294_967_295].type.__Tag
    //#pre[1] (void registerActionTypes(ActionType[])): types != null
    //#pre[2] (void registerActionTypes(ActionType[])): types.length <= 4_294_967_295
    //#pre[3] (void registerActionTypes(ActionType[])): (soft) types[0..4_294_967_295] != null
    //#pre[4] (void registerActionTypes(ActionType[])): (soft) types[0..4_294_967_295].__Tag in {com/dmdirc/actions/CoreActionType, com/dmdirc/actions/interfaces/ActionType, com/dmdirc/addons/dcc/actions/DCCActions}
    //#pre[5] (void registerActionTypes(ActionType[])): (soft) types[0..4_294_967_295].type != null
    //#pre[6] (void registerActionTypes(ActionType[])): (soft) types[0..4_294_967_295].type != null
    //#pre[7] (void registerActionTypes(ActionType[])): (soft) types[0..4_294_967_295].type.__Tag in {com/dmdirc/actions/interfaces/ActionMetaType, com/dmdirc/actions/metatypes/ActionEvents, com/dmdirc/actions/metatypes/ChannelEvents, com/dmdirc/actions/metatypes/ClientEvents, com/dmdirc/actions/metatypes/PluginEvents, com/dmdirc/actions/metatypes/QueryEvents, com/dmdirc/actions/metatypes/ServerEvents, com/dmdirc/addons/dcc/actions/DCCEvents}
    //#pre[8] (void registerActionTypes(ActionType[])): (soft) types[0..4_294_967_295].type.__Tag in {com/dmdirc/actions/interfaces/ActionMetaType, com/dmdirc/actions/metatypes/ActionEvents, com/dmdirc/actions/metatypes/ChannelEvents, com/dmdirc/actions/metatypes/ClientEvents, com/dmdirc/actions/metatypes/PluginEvents, com/dmdirc/actions/metatypes/QueryEvents, com/dmdirc/actions/metatypes/ServerEvents, com/dmdirc/addons/dcc/actions/DCCEvents}
    //#presumption(void registerActionTypes(ActionType[])): getType(...)@167 != getType(...)
    //#test_vector(void registerActionTypes(ActionType[])): java.util.List:contains(...)@165: {1}, {0}
            Logger.assertTrue(type != null);
    //#ActionManager.java:163: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.logger.Logger:assertTrue(bool)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.ActionManager
    //#    method: void registerActionTypes(ActionType[])
    //#    unanalyzed callee: void com.dmdirc.logger.Logger:assertTrue(bool)
            
            if(!actionTypes.contains(type)) {
                actionTypes.add(type);
                actionTypeGroups.add(type.getType().getGroup(), type);
    //#ActionManager.java:167: Warning: call too complex - analysis skipped
    //#    call on String getGroup()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.ActionManager
    //#    method: void registerActionTypes(ActionType[])
    //#    unanalyzed callee: String getGroup()
    //#ActionManager.java:167: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.util.MapList:add(Object, Object)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.ActionManager
    //#    method: void registerActionTypes(ActionType[])
    //#    unanalyzed callee: void com.dmdirc.util.MapList:add(Object, Object)
            }
        }
    }
    //#ActionManager.java:170: end of method: void com.dmdirc.actions.ActionManager.registerActionTypes(ActionType[])

    /**
     * Registers a set of action components with the manager.
     *
     * @param comps An array of ActionComponents to be registered
     */
    @Precondition("None of the specified ActionComponents are null")
    public static void registerActionComponents(final ActionComponent[] comps) {
        for (ActionComponent comp : comps) {
    //#ActionManager.java:179: method: void com.dmdirc.actions.ActionManager.registerActionComponents(ActionComponent[])
    //#input(void registerActionComponents(ActionComponent[])): actionComponents
    //#input(void registerActionComponents(ActionComponent[])): comps
    //#input(void registerActionComponents(ActionComponent[])): comps.length
    //#input(void registerActionComponents(ActionComponent[])): comps[0..4_294_967_295]
    //#pre[1] (void registerActionComponents(ActionComponent[])): comps != null
    //#pre[2] (void registerActionComponents(ActionComponent[])): comps.length <= 4_294_967_295
    //#pre[3] (void registerActionComponents(ActionComponent[])): (soft) init'ed(comps[0..4_294_967_295])
            Logger.assertTrue(comp != null);
    //#ActionManager.java:180: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.logger.Logger:assertTrue(bool)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.ActionManager
    //#    method: void registerActionComponents(ActionComponent[])
    //#    unanalyzed callee: void com.dmdirc.logger.Logger:assertTrue(bool)

            actionComponents.add(comp);
        }
    }
    //#ActionManager.java:184: end of method: void com.dmdirc.actions.ActionManager.registerActionComponents(ActionComponent[])

    /**
     * Registers a set of action comparisons with the manager.
     *
     * @param comps An array of ActionComparisons to be registered
     */
    @Precondition("None of the specified ActionComparisons are null")
    public static void registerActionComparisons(final ActionComparison[] comps) {
        for (ActionComparison comp : comps) {
    //#ActionManager.java:193: method: void com.dmdirc.actions.ActionManager.registerActionComparisons(ActionComparison[])
    //#input(void registerActionComparisons(ActionComparison[])): actionComparisons
    //#input(void registerActionComparisons(ActionComparison[])): comps
    //#input(void registerActionComparisons(ActionComparison[])): comps.length
    //#input(void registerActionComparisons(ActionComparison[])): comps[0..4_294_967_295]
    //#pre[1] (void registerActionComparisons(ActionComparison[])): comps != null
    //#pre[2] (void registerActionComparisons(ActionComparison[])): comps.length <= 4_294_967_295
    //#pre[3] (void registerActionComparisons(ActionComparison[])): (soft) init'ed(comps[0..4_294_967_295])
            Logger.assertTrue(comp != null);
    //#ActionManager.java:194: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.logger.Logger:assertTrue(bool)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.ActionManager
    //#    method: void registerActionComparisons(ActionComparison[])
    //#    unanalyzed callee: void com.dmdirc.logger.Logger:assertTrue(bool)

            actionComparisons.add(comp);
        }
    }
    //#ActionManager.java:198: end of method: void com.dmdirc.actions.ActionManager.registerActionComparisons(ActionComparison[])

    /**
     * Returns a map of groups to action lists.
     *
     * @return a map of groups to action lists
     */
    public static Map<String, ActionGroup> getGroups() {
        return groups;
    //#ActionManager.java:206: method: Map com.dmdirc.actions.ActionManager.getGroups()
    //#input(Map getGroups()): groups
    //#output(Map getGroups()): return_value
    //#post(Map getGroups()): return_value == &new HashMap(ActionManager__static_init#5)
    //#ActionManager.java:206: end of method: Map com.dmdirc.actions.ActionManager.getGroups()
    }

    /**
     * Returns a map of type groups to types.
     *
     * @return A map of type groups to types
     */
    public static MapList<String, ActionType> getTypeGroups() {
        return actionTypeGroups;
    //#ActionManager.java:215: method: MapList com.dmdirc.actions.ActionManager.getTypeGroups()
    //#input(MapList getTypeGroups()): actionTypeGroups
    //#output(MapList getTypeGroups()): return_value
    //#post(MapList getTypeGroups()): return_value == &new MapList(ActionManager__static_init#6)
    //#ActionManager.java:215: end of method: MapList com.dmdirc.actions.ActionManager.getTypeGroups()
    }

    /**
     * Loads actions from the user's directory.
     */
    public static void loadActions() {
        actions.clear();
    //#ActionManager.java:222: method: void com.dmdirc.actions.ActionManager.loadActions()
    //#ActionManager.java:222: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.util.MapList:clear()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.ActionManager
    //#    method: void loadActions()
    //#    unanalyzed callee: void com.dmdirc.util.MapList:clear()
    //#input(void loadActions()): "."._tainted
    //#input(void loadActions()): ".DMDirc"._tainted
    //#input(void loadActions()): ": "._tainted
    //#input(void loadActions()): "DMDirc"._tainted
    //#input(void loadActions()): "I.O error when creating actions directory: "._tainted
    //#input(void loadActions()): "I.O error when loading action: "._tainted
    //#input(void loadActions()): "Library"._tainted
    //#input(void loadActions()): "Preferences"._tainted
    //#input(void loadActions()): "Unable to parse action file: "._tainted
    //#input(void loadActions()): "actions"._tainted
    //#input(void loadActions()): actions
    //#input(void loadActions()): com.dmdirc.logger.ErrorLevel.HIGH
    //#input(void loadActions()): com.dmdirc.logger.ErrorLevel.MEDIUM
    //#input(void loadActions()): com/dmdirc/Main.configdir
    //#input(void loadActions()): com/dmdirc/Main.configdir._tainted
    //#input(void loadActions()): com/dmdirc/Server.__Descendant_Table[com/dmdirc/Server]
    //#input(void loadActions()): com/dmdirc/Server.__Descendant_Table[others]
    //#input(void loadActions()): com/dmdirc/Server.__Dispatch_Table.getTabCompleter()Lcom/dmdirc/ui/input/TabCompleter;
    //#input(void loadActions()): com/dmdirc/ServerManager.__Class_Obj.__Lock
    //#input(void loadActions()): com/dmdirc/ServerManager.me.servers
    //#input(void loadActions()): com/dmdirc/actions/Action.__Descendant_Table[com/dmdirc/actions/Action]
    //#input(void loadActions()): com/dmdirc/actions/Action.__Descendant_Table[others]
    //#input(void loadActions()): com/dmdirc/actions/Action.__Dispatch_Table.getConditions()Ljava/util/List;
    //#input(void loadActions()): com/dmdirc/actions/Action.__Dispatch_Table.getTriggers()[Lcom/dmdirc/actions/interfaces/ActionType;
    //#input(void loadActions()): com/dmdirc/actions/Action.__Dispatch_Table.loadActionFromConfig()V
    //#input(void loadActions()): com/dmdirc/actions/Action.com.dmdirc.logger.ErrorLevel.HIGH
    //#input(void loadActions()): com/dmdirc/actions/Action.com.dmdirc.logger.ErrorLevel.MEDIUM
    //#input(void loadActions()): com/dmdirc/actions/Action.java.io.File.separator
    //#input(void loadActions()): com/dmdirc/actions/Action.java.io.File.separator._tainted
    //#input(void loadActions()): com/dmdirc/actions/ActionCondition.__Descendant_Table[com/dmdirc/actions/ActionCondition]
    //#input(void loadActions()): com/dmdirc/actions/ActionCondition.__Descendant_Table[others]
    //#input(void loadActions()): com/dmdirc/actions/ActionCondition.__Dispatch_Table.getArg()I
    //#input(void loadActions()): com/dmdirc/actions/ActionCondition.__Dispatch_Table.getTarget()Ljava/lang/String;
    //#input(void loadActions()): com/dmdirc/actions/ActionGroup.__Descendant_Table[com/dmdirc/actions/ActionGroup]
    //#input(void loadActions()): com/dmdirc/actions/ActionGroup.__Descendant_Table[com/dmdirc/actions/wrappers/AliasWrapper]
    //#input(void loadActions()): com/dmdirc/actions/ActionGroup.__Descendant_Table[com/dmdirc/actions/wrappers/PerformWrapper]
    //#input(void loadActions()): com/dmdirc/actions/ActionGroup.__Descendant_Table[others]
    //#input(void loadActions()): com/dmdirc/actions/ActionGroup.__Dispatch_Table.clear()V
    //#input(void loadActions()): com/dmdirc/actions/ActionGroup.__Dispatch_Table.remove(Lcom/dmdirc/actions/Action;)V
    //#input(void loadActions()): com/dmdirc/actions/CoreActionType.UNKNOWN_COMMAND
    //#input(void loadActions()): com/dmdirc/actions/wrappers/AliasWrapper.__Dispatch_Table.clear()V
    //#input(void loadActions()): com/dmdirc/actions/wrappers/AliasWrapper.__Dispatch_Table.remove(Lcom/dmdirc/actions/Action;)V
    //#input(void loadActions()): com/dmdirc/actions/wrappers/AliasWrapper.com.dmdirc.ui.input.TabCompletionType.COMMAND
    //#input(void loadActions()): com/dmdirc/actions/wrappers/PerformWrapper.__Dispatch_Table.clear()V
    //#input(void loadActions()): com/dmdirc/actions/wrappers/PerformWrapper.__Dispatch_Table.remove(Lcom/dmdirc/actions/Action;)V
    //#input(void loadActions()): groups
    //#output(void loadActions()): com/dmdirc/Main.configdir
    //#output(void loadActions()): com/dmdirc/ServerManager.me
    //#output(void loadActions()): java.lang.StringBuilder:toString(...)._tainted
    //#output(void loadActions()): new ArrayList(ServerManager#1) num objects
    //#output(void loadActions()): new ServerManager(getServerManager#1) num objects
    //#output(void loadActions()): new ServerManager(getServerManager#1).__Tag
    //#output(void loadActions()): new ServerManager(getServerManager#1).servers
    //#new obj(void loadActions()): java.lang.StringBuilder:toString(...)
    //#new obj(void loadActions()): new ArrayList(ServerManager#1)
    //#new obj(void loadActions()): new ServerManager(getServerManager#1)
    //#pre[3] (void loadActions()): init'ed(com/dmdirc/Main.configdir)
    //#presumption(void loadActions()): arr$.length@243 <= 4_294_967_295
    //#presumption(void loadActions()): arr$[i$]@243 != null
    //#presumption(void loadActions()): arr$[i$]@243 != null
    //#presumption(void loadActions()): init'ed(com.dmdirc.logger.ErrorLevel.HIGH)
    //#presumption(void loadActions()): init'ed(com.dmdirc.logger.ErrorLevel.MEDIUM)
    //#presumption(void loadActions()): group.actions@224 != null
    //#presumption(void loadActions()): group.settings@224 != null
    //#presumption(void loadActions()): java.io.File:listFiles(...)@243 != null
    //#presumption(void loadActions()): java.util.Iterator:next(...).__Tag@224 in {com/dmdirc/actions/ActionGroup, com/dmdirc/actions/wrappers/AliasWrapper, com/dmdirc/actions/wrappers/PerformWrapper}
    //#presumption(void loadActions()): java.util.Iterator:next(...)@224 != null
    //#presumption(void loadActions()): java.util.Map:values(...)@224 != null
    //#post(void loadActions()): possibly_updated(com/dmdirc/Main.configdir)
    //#post(void loadActions()): possibly_updated(com/dmdirc/ServerManager.me)
    //#post(void loadActions()): java.lang.StringBuilder:toString(...)._tainted == 0
    //#post(void loadActions()): init'ed(new ArrayList(ServerManager#1) num objects)
    //#post(void loadActions()): init'ed(new ServerManager(getServerManager#1) num objects)
    //#post(void loadActions()): init'ed(new ServerManager(getServerManager#1).__Tag)
    //#post(void loadActions()): init'ed(new ServerManager(getServerManager#1).servers)
    //#unanalyzed(void loadActions()): Effects-of-calling:com.dmdirc.logger.Logger:assertTrue
    //#unanalyzed(void loadActions()): Effects-of-calling:java.util.Map:put
    //#unanalyzed(void loadActions()): Effects-of-calling:java.util.Map:values
    //#unanalyzed(void loadActions()): Effects-of-calling:java.util.Collection:iterator
    //#unanalyzed(void loadActions()): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(void loadActions()): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(void loadActions()): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void loadActions()): Effects-of-calling:getConfigDir
    //#unanalyzed(void loadActions()): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void loadActions()): Effects-of-calling:java.lang.System:getProperty
    //#unanalyzed(void loadActions()): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void loadActions()): Effects-of-calling:java.io.File:isDirectory
    //#unanalyzed(void loadActions()): Effects-of-calling:java.io.File:getName
    //#unanalyzed(void loadActions()): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(void loadActions()): Effects-of-calling:java.util.ArrayList
    //#unanalyzed(void loadActions()): Effects-of-calling:java.util.HashMap
    //#unanalyzed(void loadActions()): Effects-of-calling:java.io.File:listFiles
    //#unanalyzed(void loadActions()): Effects-of-calling:com.dmdirc.actions.Action
    //#unanalyzed(void loadActions()): Effects-of-calling:com.dmdirc.updater.components.ActionGroupComponent
    //#unanalyzed(void loadActions()): Effects-of-calling:java.util.List:remove
    //#unanalyzed(void loadActions()): Effects-of-calling:java.util.ArrayList:iterator
    //#unanalyzed(void loadActions()): Effects-of-calling:remove
    //#unanalyzed(void loadActions()): Effects-of-calling:getTriggers
    //#unanalyzed(void loadActions()): Effects-of-calling:java.lang.Object:equals
    //#unanalyzed(void loadActions()): Effects-of-calling:getCommandName
    //#unanalyzed(void loadActions()): Effects-of-calling:java.util.List:iterator
    //#unanalyzed(void loadActions()): Effects-of-calling:getTabCompleter
    //#unanalyzed(void loadActions()): Effects-of-calling:com.dmdirc.ui.input.TabCompleter:removeEntry
    //#unanalyzed(void loadActions()): Effects-of-calling:getConditions
    //#unanalyzed(void loadActions()): Effects-of-calling:com.dmdirc.commandparser.CommandManager:getCommandChar
    //#unanalyzed(void loadActions()): Effects-of-calling:java.util.Map:clear
    //#unanalyzed(void loadActions()): Effects-of-calling:com.dmdirc.logger.Logger:userError
    //#unanalyzed(void loadActions()): Effects-of-calling:com.dmdirc.util.ConfigFile
    //#unanalyzed(void loadActions()): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(void loadActions()): Effects-of-calling:java.io.IOException:getMessage
    //#unanalyzed(void loadActions()): Effects-of-calling:java.lang.String:startsWith
    //#unanalyzed(void loadActions()): Effects-of-calling:java.lang.System:getenv
    //#unanalyzed(void loadActions()): Effects-of-calling:com.dmdirc.util.ConfigFile:read
    //#unanalyzed(void loadActions()): Effects-of-calling:loadActionFromConfig
    //#unanalyzed(void loadActions()): Effects-of-calling:com.dmdirc.util.InvalidConfigFileException:getMessage
    //#test_vector(void loadActions()): java.io.File:exists(...)@230: {1}, {0}
    //#test_vector(void loadActions()): java.io.File:isDirectory(...)@244: {0}, {1}
    //#test_vector(void loadActions()): java.io.File:listFiles(...)@240: Inverse{null}, Addr_Set{null}
    //#test_vector(void loadActions()): java.util.Iterator:hasNext(...)@224: {0}, {1}

        for (ActionGroup group : groups.values()) {
            group.clear();
        }

        final File dir = new File(getDirectory());

        if (!dir.exists()) {
            try {
                dir.mkdirs();
                dir.createNewFile();
            } catch (IOException ex) {
                Logger.userError(ErrorLevel.HIGH, "I/O error when creating actions directory: "
    //#ActionManager.java:235: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.logger.Logger:userError(ErrorLevel, String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.ActionManager
    //#    method: void loadActions()
    //#    unanalyzed callee: void com.dmdirc.logger.Logger:userError(ErrorLevel, String)
                        + ex.getMessage());
            }
        }

        if (dir.listFiles() == null) {
            Logger.userError(ErrorLevel.MEDIUM, "Unable to load user action files");
    //#ActionManager.java:241: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.logger.Logger:userError(ErrorLevel, String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.ActionManager
    //#    method: void loadActions()
    //#    unanalyzed callee: void com.dmdirc.logger.Logger:userError(ErrorLevel, String)
        } else {
            for (File file : dir.listFiles()) {
                if (file.isDirectory()) {
                    loadActions(file);
    //#ActionManager.java:245: ?precondition failure
    //#    com/dmdirc/actions/ActionManager.loadActions: (soft) init'ed(com/dmdirc/Main.configdir)
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.actions.ActionManager
    //#    method: void loadActions()
    //#    basic block: bb_13
    //#    assertion: (soft) init'ed(com/dmdirc/Main.configdir)
    //#    callee: void com/dmdirc/actions/ActionManager.loadActions(File)
    //#    callee assertion: (soft) init'ed(com/dmdirc/Main.configdir)
    //#    callee file: ActionManager.java
    //#    callee precondition index: [3]
    //#    callee srcpos: 269
    //#    VN: com/dmdirc/Main.configdir
    //#    Expected: Univ-VN-Set
    //#    Bad: {Invalid}
    //#    Attribs:  Ptr  Soft  Bad only invalid
                }
            }
        }

        registerComponents();
    }
    //#ActionManager.java:251: end of method: void com.dmdirc.actions.ActionManager.loadActions()

    /**
     * Creates new ActionGroupComponents for each action group.
     */
    private static void registerComponents() {
        for (ActionGroup group : groups.values()) {
    //#ActionManager.java:257: method: void com.dmdirc.actions.ActionManager.registerComponents()
    //#input(void registerComponents()): com/dmdirc/actions/ActionGroup.__Descendant_Table[com/dmdirc/actions/ActionGroup]
    //#input(void registerComponents()): com/dmdirc/actions/ActionGroup.__Descendant_Table[com/dmdirc/actions/wrappers/AliasWrapper]
    //#input(void registerComponents()): com/dmdirc/actions/ActionGroup.__Descendant_Table[com/dmdirc/actions/wrappers/PerformWrapper]
    //#input(void registerComponents()): com/dmdirc/actions/ActionGroup.__Descendant_Table[others]
    //#input(void registerComponents()): groups
    //#presumption(void registerComponents()): java.util.Iterator:next(...).__Tag@257 in {com/dmdirc/actions/ActionGroup, com/dmdirc/actions/wrappers/AliasWrapper, com/dmdirc/actions/wrappers/PerformWrapper}
    //#presumption(void registerComponents()): java.util.Map:values(...)@257 != null
    //#test_vector(void registerComponents()): java.util.Iterator:hasNext(...)@257: {0}, {1}
            new ActionGroupComponent(group);
    //#ActionManager.java:258: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.updater.components.ActionGroupComponent(ActionGroup)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.ActionManager
    //#    method: void registerComponents()
    //#    unanalyzed callee: void com.dmdirc.updater.components.ActionGroupComponent(ActionGroup)
        }
    }
    //#ActionManager.java:260: end of method: void com.dmdirc.actions.ActionManager.registerComponents()

    /**
     * Loads action files from a specified group directory.
     *
     * @param dir The directory to scan.
     */
    @Precondition("The specified File is not null and represents a directory")
    private static void loadActions(final File dir) {
        Logger.assertTrue(dir != null);
    //#ActionManager.java:269: method: void com.dmdirc.actions.ActionManager.loadActions(File)
    //#ActionManager.java:269: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.logger.Logger:assertTrue(bool)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.ActionManager
    //#    method: void loadActions(File)
    //#    unanalyzed callee: void com.dmdirc.logger.Logger:assertTrue(bool)
    //#input(void loadActions(File)): "."._tainted
    //#input(void loadActions(File)): ".DMDirc"._tainted
    //#input(void loadActions(File)): ": "._tainted
    //#input(void loadActions(File)): "DMDirc"._tainted
    //#input(void loadActions(File)): "I.O error when loading action: "._tainted
    //#input(void loadActions(File)): "Library"._tainted
    //#input(void loadActions(File)): "Preferences"._tainted
    //#input(void loadActions(File)): "Unable to parse action file: "._tainted
    //#input(void loadActions(File)): "actions"._tainted
    //#input(void loadActions(File)): com/dmdirc/Main.configdir
    //#input(void loadActions(File)): com/dmdirc/Main.configdir._tainted
    //#input(void loadActions(File)): com/dmdirc/actions/Action.__Descendant_Table[com/dmdirc/actions/Action]
    //#input(void loadActions(File)): com/dmdirc/actions/Action.__Descendant_Table[others]
    //#input(void loadActions(File)): com/dmdirc/actions/Action.__Dispatch_Table.loadActionFromConfig()V
    //#input(void loadActions(File)): com/dmdirc/actions/Action.com.dmdirc.logger.ErrorLevel.HIGH
    //#input(void loadActions(File)): com/dmdirc/actions/Action.com.dmdirc.logger.ErrorLevel.MEDIUM
    //#input(void loadActions(File)): com/dmdirc/actions/Action.java.io.File.separator
    //#input(void loadActions(File)): com/dmdirc/actions/Action.java.io.File.separator._tainted
    //#input(void loadActions(File)): dir
    //#input(void loadActions(File)): groups
    //#output(void loadActions(File)): com/dmdirc/Main.configdir
    //#output(void loadActions(File)): java.lang.StringBuilder:toString(...)._tainted
    //#new obj(void loadActions(File)): java.lang.StringBuilder:toString(...)
    //#pre[2] (void loadActions(File)): dir != null
    //#pre[3] (void loadActions(File)): (soft) init'ed(com/dmdirc/Main.configdir)
    //#presumption(void loadActions(File)): arr$.length@276 <= 4_294_967_295
    //#presumption(void loadActions(File)): arr$[i$]@276 != null
    //#presumption(void loadActions(File)): java.io.File:listFiles(...)@276 != null
    //#post(void loadActions(File)): init'ed(com/dmdirc/Main.configdir)
    //#post(void loadActions(File)): java.lang.StringBuilder:toString(...)._tainted == 0
    //#unanalyzed(void loadActions(File)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void loadActions(File)): Effects-of-calling:getConfigDir
    //#unanalyzed(void loadActions(File)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void loadActions(File)): Effects-of-calling:java.lang.System:getProperty
    //#unanalyzed(void loadActions(File)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void loadActions(File)): Effects-of-calling:java.util.ArrayList
    //#unanalyzed(void loadActions(File)): Effects-of-calling:java.util.HashMap
    //#unanalyzed(void loadActions(File)): Effects-of-calling:com.dmdirc.logger.Logger:userError
    //#unanalyzed(void loadActions(File)): Effects-of-calling:com.dmdirc.util.ConfigFile
    //#unanalyzed(void loadActions(File)): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(void loadActions(File)): Effects-of-calling:java.io.IOException:getMessage
    //#unanalyzed(void loadActions(File)): Effects-of-calling:java.lang.String:startsWith
    //#unanalyzed(void loadActions(File)): Effects-of-calling:java.lang.System:getenv
    //#unanalyzed(void loadActions(File)): Effects-of-calling:com.dmdirc.util.ConfigFile:read
    //#unanalyzed(void loadActions(File)): Effects-of-calling:loadActionFromConfig
    //#unanalyzed(void loadActions(File)): Effects-of-calling:com.dmdirc.util.InvalidConfigFileException:getMessage
    //#test_vector(void loadActions(File)): java.util.Map:containsKey(...)@272: {1}, {0}
        Logger.assertTrue(dir.isDirectory());
    //#ActionManager.java:270: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.logger.Logger:assertTrue(bool)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.ActionManager
    //#    method: void loadActions(File)
    //#    unanalyzed callee: void com.dmdirc.logger.Logger:assertTrue(bool)
        
        if (!groups.containsKey(dir.getName())) {
            groups.put(dir.getName(), new ActionGroup(dir.getName()));
        }

        for (File file : dir.listFiles()) {
            new Action(dir.getName(), file.getName());
        }
    }
    //#ActionManager.java:279: end of method: void com.dmdirc.actions.ActionManager.loadActions(File)

    /**
     * Registers an action with the manager.
     *
     * @param action The action to be registered
     */
    @Precondition("The specified action is not null")
    public static void registerAction(final Action action) {
        Logger.assertTrue(action != null);
    //#ActionManager.java:288: method: void com.dmdirc.actions.ActionManager.registerAction(Action)
    //#ActionManager.java:288: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.logger.Logger:assertTrue(bool)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.ActionManager
    //#    method: void registerAction(Action)
    //#    unanalyzed callee: void com.dmdirc.logger.Logger:assertTrue(bool)
    //#input(void registerAction(Action)): "Invalid alias action (no name): "._tainted
    //#input(void registerAction(Action)): "Invalid alias action (wrong trigger): "._tainted
    //#input(void registerAction(Action)): "Invalid perform action: "._tainted
    //#input(void registerAction(Action)): action
    //#input(void registerAction(Action)): action.__Tag
    //#input(void registerAction(Action)): action.group
    //#input(void registerAction(Action)): action.name._tainted
    //#input(void registerAction(Action)): action.triggers
    //#input(void registerAction(Action)): action.triggers.length
    //#input(void registerAction(Action)): action.triggers[0]
    //#input(void registerAction(Action)): action.triggers[1..+Inf]
    //#input(void registerAction(Action)): actions
    //#input(void registerAction(Action)): com/dmdirc/GlobalWindow.__Descendant_Table[com/dmdirc/GlobalWindow]
    //#input(void registerAction(Action)): com/dmdirc/GlobalWindow.__Descendant_Table[others]
    //#input(void registerAction(Action)): com/dmdirc/GlobalWindow.__Dispatch_Table.getTabCompleter()Lcom/dmdirc/ui/input/TabCompleter;
    //#input(void registerAction(Action)): com/dmdirc/GlobalWindow.globalWindow.__Tag
    //#input(void registerAction(Action)): com/dmdirc/GlobalWindow.globalWindow.tabCompleter
    //#input(void registerAction(Action)): com/dmdirc/Server.__Descendant_Table[com/dmdirc/Server]
    //#input(void registerAction(Action)): com/dmdirc/Server.__Descendant_Table[others]
    //#input(void registerAction(Action)): com/dmdirc/Server.__Dispatch_Table.getTabCompleter()Lcom/dmdirc/ui/input/TabCompleter;
    //#input(void registerAction(Action)): com/dmdirc/ServerManager.__Class_Obj.__Lock
    //#input(void registerAction(Action)): com/dmdirc/ServerManager.me
    //#input(void registerAction(Action)): com/dmdirc/ServerManager.me.servers
    //#input(void registerAction(Action)): com/dmdirc/actions/Action.__Descendant_Table[com/dmdirc/actions/Action]
    //#input(void registerAction(Action)): com/dmdirc/actions/Action.__Descendant_Table[others]
    //#input(void registerAction(Action)): com/dmdirc/actions/Action.__Dispatch_Table.getConditions()Ljava/util/List;
    //#input(void registerAction(Action)): com/dmdirc/actions/Action.__Dispatch_Table.getGroup()Ljava/lang/String;
    //#input(void registerAction(Action)): com/dmdirc/actions/Action.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(void registerAction(Action)): com/dmdirc/actions/Action.__Dispatch_Table.getTriggers()[Lcom/dmdirc/actions/interfaces/ActionType;
    //#input(void registerAction(Action)): com/dmdirc/actions/ActionCondition.__Descendant_Table[com/dmdirc/actions/ActionCondition]
    //#input(void registerAction(Action)): com/dmdirc/actions/ActionCondition.__Descendant_Table[others]
    //#input(void registerAction(Action)): com/dmdirc/actions/ActionCondition.__Dispatch_Table.getArg()I
    //#input(void registerAction(Action)): com/dmdirc/actions/ActionCondition.__Dispatch_Table.getComponent()Lcom/dmdirc/actions/interfaces/ActionComponent;
    //#input(void registerAction(Action)): com/dmdirc/actions/ActionCondition.__Dispatch_Table.getTarget()Ljava/lang/String;
    //#input(void registerAction(Action)): com/dmdirc/actions/ActionGroup.__Descendant_Table[com/dmdirc/actions/ActionGroup]
    //#input(void registerAction(Action)): com/dmdirc/actions/ActionGroup.__Descendant_Table[com/dmdirc/actions/wrappers/AliasWrapper]
    //#input(void registerAction(Action)): com/dmdirc/actions/ActionGroup.__Descendant_Table[com/dmdirc/actions/wrappers/PerformWrapper]
    //#input(void registerAction(Action)): com/dmdirc/actions/ActionGroup.__Descendant_Table[others]
    //#input(void registerAction(Action)): com/dmdirc/actions/ActionGroup.__Dispatch_Table.add(Lcom/dmdirc/actions/Action;)V
    //#input(void registerAction(Action)): com/dmdirc/actions/CoreActionComponent.SERVER_NAME
    //#input(void registerAction(Action)): com/dmdirc/actions/CoreActionComponent.SERVER_NETWORK
    //#input(void registerAction(Action)): com/dmdirc/actions/CoreActionType.SERVER_CONNECTED
    //#input(void registerAction(Action)): com/dmdirc/actions/CoreActionType.UNKNOWN_COMMAND
    //#input(void registerAction(Action)): com/dmdirc/actions/wrappers/AliasWrapper.__Dispatch_Table.add(Lcom/dmdirc/actions/Action;)V
    //#input(void registerAction(Action)): com/dmdirc/actions/wrappers/AliasWrapper.com.dmdirc.logger.ErrorLevel.MEDIUM
    //#input(void registerAction(Action)): com/dmdirc/actions/wrappers/AliasWrapper.com.dmdirc.ui.input.TabCompletionType.COMMAND
    //#input(void registerAction(Action)): com/dmdirc/actions/wrappers/PerformWrapper.__Dispatch_Table.add(Lcom/dmdirc/actions/Action;)V
    //#input(void registerAction(Action)): com/dmdirc/actions/wrappers/PerformWrapper.com.dmdirc.logger.ErrorLevel.MEDIUM
    //#input(void registerAction(Action)): groups
    //#output(void registerAction(Action)): com/dmdirc/ServerManager.me
    //#output(void registerAction(Action)): new ArrayList(ServerManager#1) num objects
    //#output(void registerAction(Action)): new ServerManager(getServerManager#1) num objects
    //#output(void registerAction(Action)): new ServerManager(getServerManager#1).__Tag
    //#output(void registerAction(Action)): new ServerManager(getServerManager#1).servers
    //#new obj(void registerAction(Action)): new ArrayList(ServerManager#1)
    //#new obj(void registerAction(Action)): new ServerManager(getServerManager#1)
    //#pre[1] (void registerAction(Action)): action != null
    //#pre[2] (void registerAction(Action)): action.__Tag == com/dmdirc/actions/Action
    //#pre[4] (void registerAction(Action)): init'ed(action.group)
    //#pre[7] (void registerAction(Action)): action.triggers != null
    //#pre[8] (void registerAction(Action)): action.triggers.length <= 4_294_967_295
    //#pre[9] (void registerAction(Action)): (soft) init'ed(action.triggers[0])
    //#pre[10] (void registerAction(Action)): (soft) init'ed(action.triggers[1..+Inf])
    //#pre[15] (void registerAction(Action)): (soft) init'ed(com/dmdirc/ServerManager.me)
    //#presumption(void registerAction(Action)): getGroup(...).actions != null
    //#presumption(void registerAction(Action)): java.util.Map:get(...)@309 != null
    //#presumption(void registerAction(Action)): java.util.Map:get(...)@309.__Tag in {com/dmdirc/actions/ActionGroup, com/dmdirc/actions/wrappers/AliasWrapper, com/dmdirc/actions/wrappers/PerformWrapper}
    //#post(void registerAction(Action)): init'ed(com/dmdirc/ServerManager.me)
    //#post(void registerAction(Action)): new ArrayList(ServerManager#1) num objects <= 1
    //#post(void registerAction(Action)): new ServerManager(getServerManager#1) num objects <= 1
    //#post(void registerAction(Action)): init'ed(new ServerManager(getServerManager#1).__Tag)
    //#post(void registerAction(Action)): init'ed(new ServerManager(getServerManager#1).servers)
    //#unanalyzed(void registerAction(Action)): Effects-of-calling:java.util.Map:put
    //#unanalyzed(void registerAction(Action)): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(void registerAction(Action)): Effects-of-calling:java.util.ArrayList
    //#unanalyzed(void registerAction(Action)): Effects-of-calling:java.util.HashMap
    //#unanalyzed(void registerAction(Action)): Effects-of-calling:getTriggers
    //#unanalyzed(void registerAction(Action)): Effects-of-calling:java.lang.Object:equals
    //#unanalyzed(void registerAction(Action)): Effects-of-calling:java.util.List:iterator
    //#unanalyzed(void registerAction(Action)): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(void registerAction(Action)): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(void registerAction(Action)): Effects-of-calling:getTabCompleter
    //#unanalyzed(void registerAction(Action)): Effects-of-calling:getConditions
    //#unanalyzed(void registerAction(Action)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void registerAction(Action)): Effects-of-calling:com.dmdirc.commandparser.CommandManager:getCommandChar
    //#unanalyzed(void registerAction(Action)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void registerAction(Action)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void registerAction(Action)): Effects-of-calling:java.util.Map:get
    //#unanalyzed(void registerAction(Action)): Effects-of-calling:java.util.List:get
    //#unanalyzed(void registerAction(Action)): Effects-of-calling:java.util.List:size
    //#unanalyzed(void registerAction(Action)): Effects-of-calling:add
    //#unanalyzed(void registerAction(Action)): Effects-of-calling:getName
    //#unanalyzed(void registerAction(Action)): Effects-of-calling:com.dmdirc.logger.Logger:userError
    //#unanalyzed(void registerAction(Action)): Effects-of-calling:java.util.List:add
    //#unanalyzed(void registerAction(Action)): Effects-of-calling:getGlobalWindow
    //#unanalyzed(void registerAction(Action)): Effects-of-calling:com.dmdirc.ui.input.TabCompleter:addEntry
 
        for (ActionType trigger : action.getTriggers()) {
    //#ActionManager.java:290: ?use of default init
    //#    init'ed(arr$.length)
    //#    severity: LOW
    //#    class: com.dmdirc.actions.ActionManager
    //#    method: void registerAction(Action)
    //#    basic block: bb_4
    //#    assertion: init'ed(arr$.length)
    //#    VN: arr$.length
    //#    Expected: {-Inf..+Inf}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Bad only invalid
    //#ActionManager.java:290: ?use of default init
    //#    init'ed(arr$[i$])
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.actions.ActionManager
    //#    method: void registerAction(Action)
    //#    basic block: bb_6
    //#    assertion: init'ed(arr$[i$])
    //#    VN: arr$[i$]
    //#    Expected: Univ-VN-Set
    //#    Bad: {Invalid}
    //#    Attribs:  Ptr  Bad only invalid
            actions.add(trigger, action);
    //#ActionManager.java:291: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.util.MapList:add(Object, Object)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.ActionManager
    //#    method: void registerAction(Action)
    //#    unanalyzed callee: void com.dmdirc.util.MapList:add(Object, Object)
        }

        getGroup(action.getGroup()).add(action);
    }
    //#ActionManager.java:295: end of method: void com.dmdirc.actions.ActionManager.registerAction(Action)

    /**
     * Retrieves the action group with the specified name. A new group is
     * created if it doesn't already exist.
     *
     * @param name The name of the group to retrieve
     * @return The corresponding ActionGroup
     */
    public static ActionGroup getGroup(final String name) {
        if (!groups.containsKey(name)) {
    //#ActionManager.java:305: method: ActionGroup com.dmdirc.actions.ActionManager.getGroup(String)
    //#input(ActionGroup getGroup(String)): com/dmdirc/actions/ActionGroup.__Descendant_Table[com/dmdirc/actions/ActionGroup]
    //#input(ActionGroup getGroup(String)): com/dmdirc/actions/ActionGroup.__Descendant_Table[com/dmdirc/actions/wrappers/AliasWrapper]
    //#input(ActionGroup getGroup(String)): com/dmdirc/actions/ActionGroup.__Descendant_Table[com/dmdirc/actions/wrappers/PerformWrapper]
    //#input(ActionGroup getGroup(String)): com/dmdirc/actions/ActionGroup.__Descendant_Table[others]
    //#input(ActionGroup getGroup(String)): groups
    //#input(ActionGroup getGroup(String)): name
    //#output(ActionGroup getGroup(String)): return_value
    //#presumption(ActionGroup getGroup(String)): java.util.Map:get(...).__Tag@309 in {com/dmdirc/actions/ActionGroup, com/dmdirc/actions/wrappers/AliasWrapper, com/dmdirc/actions/wrappers/PerformWrapper}
    //#post(ActionGroup getGroup(String)): init'ed(return_value)
    //#unanalyzed(ActionGroup getGroup(String)): Effects-of-calling:java.util.ArrayList
    //#unanalyzed(ActionGroup getGroup(String)): Effects-of-calling:java.util.HashMap
    //#test_vector(ActionGroup getGroup(String)): java.util.Map:containsKey(...)@305: {1}, {0}
            groups.put(name, new ActionGroup(name));
        }

        return groups.get(name);
    //#ActionManager.java:309: end of method: ActionGroup com.dmdirc.actions.ActionManager.getGroup(String)
    }

    /**
     * Unregisters an action with the manager.
     *
     * @param action The action to be unregistered
     */
    @Precondition("The specified action is not null")
    public static void unregisterAction(final Action action) {
        Logger.assertTrue(action != null);
    //#ActionManager.java:319: method: void com.dmdirc.actions.ActionManager.unregisterAction(Action)
    //#ActionManager.java:319: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.logger.Logger:assertTrue(bool)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.ActionManager
    //#    method: void unregisterAction(Action)
    //#    unanalyzed callee: void com.dmdirc.logger.Logger:assertTrue(bool)
    //#input(void unregisterAction(Action)): action
    //#input(void unregisterAction(Action)): action.__Tag
    //#input(void unregisterAction(Action)): action.group
    //#input(void unregisterAction(Action)): action.triggers.length
    //#input(void unregisterAction(Action)): actions
    //#input(void unregisterAction(Action)): com/dmdirc/Server.__Descendant_Table[com/dmdirc/Server]
    //#input(void unregisterAction(Action)): com/dmdirc/Server.__Descendant_Table[others]
    //#input(void unregisterAction(Action)): com/dmdirc/Server.__Dispatch_Table.getTabCompleter()Lcom/dmdirc/ui/input/TabCompleter;
    //#input(void unregisterAction(Action)): com/dmdirc/ServerManager.__Class_Obj.__Lock
    //#input(void unregisterAction(Action)): com/dmdirc/ServerManager.me
    //#input(void unregisterAction(Action)): com/dmdirc/ServerManager.me.servers
    //#input(void unregisterAction(Action)): com/dmdirc/actions/Action.__Descendant_Table[com/dmdirc/actions/Action]
    //#input(void unregisterAction(Action)): com/dmdirc/actions/Action.__Descendant_Table[others]
    //#input(void unregisterAction(Action)): com/dmdirc/actions/Action.__Dispatch_Table.getConditions()Ljava/util/List;
    //#input(void unregisterAction(Action)): com/dmdirc/actions/Action.__Dispatch_Table.getGroup()Ljava/lang/String;
    //#input(void unregisterAction(Action)): com/dmdirc/actions/Action.__Dispatch_Table.getTriggers()[Lcom/dmdirc/actions/interfaces/ActionType;
    //#input(void unregisterAction(Action)): com/dmdirc/actions/ActionCondition.__Descendant_Table[com/dmdirc/actions/ActionCondition]
    //#input(void unregisterAction(Action)): com/dmdirc/actions/ActionCondition.__Descendant_Table[others]
    //#input(void unregisterAction(Action)): com/dmdirc/actions/ActionCondition.__Dispatch_Table.getArg()I
    //#input(void unregisterAction(Action)): com/dmdirc/actions/ActionCondition.__Dispatch_Table.getTarget()Ljava/lang/String;
    //#input(void unregisterAction(Action)): com/dmdirc/actions/ActionGroup.__Descendant_Table[com/dmdirc/actions/ActionGroup]
    //#input(void unregisterAction(Action)): com/dmdirc/actions/ActionGroup.__Descendant_Table[com/dmdirc/actions/wrappers/AliasWrapper]
    //#input(void unregisterAction(Action)): com/dmdirc/actions/ActionGroup.__Descendant_Table[com/dmdirc/actions/wrappers/PerformWrapper]
    //#input(void unregisterAction(Action)): com/dmdirc/actions/ActionGroup.__Descendant_Table[others]
    //#input(void unregisterAction(Action)): com/dmdirc/actions/ActionGroup.__Dispatch_Table.remove(Lcom/dmdirc/actions/Action;)V
    //#input(void unregisterAction(Action)): com/dmdirc/actions/CoreActionType.UNKNOWN_COMMAND
    //#input(void unregisterAction(Action)): com/dmdirc/actions/wrappers/AliasWrapper.__Dispatch_Table.remove(Lcom/dmdirc/actions/Action;)V
    //#input(void unregisterAction(Action)): com/dmdirc/actions/wrappers/AliasWrapper.com.dmdirc.ui.input.TabCompletionType.COMMAND
    //#input(void unregisterAction(Action)): com/dmdirc/actions/wrappers/PerformWrapper.__Dispatch_Table.remove(Lcom/dmdirc/actions/Action;)V
    //#input(void unregisterAction(Action)): groups
    //#output(void unregisterAction(Action)): com/dmdirc/ServerManager.me
    //#output(void unregisterAction(Action)): new ArrayList(ServerManager#1) num objects
    //#output(void unregisterAction(Action)): new ServerManager(getServerManager#1) num objects
    //#output(void unregisterAction(Action)): new ServerManager(getServerManager#1).__Tag
    //#output(void unregisterAction(Action)): new ServerManager(getServerManager#1).servers
    //#new obj(void unregisterAction(Action)): new ArrayList(ServerManager#1)
    //#new obj(void unregisterAction(Action)): new ServerManager(getServerManager#1)
    //#pre[1] (void unregisterAction(Action)): action != null
    //#pre[2] (void unregisterAction(Action)): action.__Tag == com/dmdirc/actions/Action
    //#pre[4] (void unregisterAction(Action)): init'ed(action.group)
    //#pre[10] (void unregisterAction(Action)): (soft) init'ed(com/dmdirc/ServerManager.me)
    //#presumption(void unregisterAction(Action)): getGroup(...).actions != null
    //#presumption(void unregisterAction(Action)): java.util.Map:get(...)@309 != null
    //#presumption(void unregisterAction(Action)): java.util.Map:get(...)@309.__Tag in {com/dmdirc/actions/ActionGroup, com/dmdirc/actions/wrappers/AliasWrapper, com/dmdirc/actions/wrappers/PerformWrapper}
    //#post(void unregisterAction(Action)): init'ed(com/dmdirc/ServerManager.me)
    //#post(void unregisterAction(Action)): new ArrayList(ServerManager#1) num objects <= 1
    //#post(void unregisterAction(Action)): new ServerManager(getServerManager#1) num objects <= 1
    //#post(void unregisterAction(Action)): init'ed(new ServerManager(getServerManager#1).__Tag)
    //#post(void unregisterAction(Action)): init'ed(new ServerManager(getServerManager#1).servers)
    //#unanalyzed(void unregisterAction(Action)): Effects-of-calling:java.util.Map:put
    //#unanalyzed(void unregisterAction(Action)): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(void unregisterAction(Action)): Effects-of-calling:java.util.ArrayList
    //#unanalyzed(void unregisterAction(Action)): Effects-of-calling:java.util.HashMap
    //#unanalyzed(void unregisterAction(Action)): Effects-of-calling:java.util.List:remove
    //#unanalyzed(void unregisterAction(Action)): Effects-of-calling:remove
    //#unanalyzed(void unregisterAction(Action)): Effects-of-calling:getTriggers
    //#unanalyzed(void unregisterAction(Action)): Effects-of-calling:java.lang.Object:equals
    //#unanalyzed(void unregisterAction(Action)): Effects-of-calling:getCommandName
    //#unanalyzed(void unregisterAction(Action)): Effects-of-calling:java.util.List:iterator
    //#unanalyzed(void unregisterAction(Action)): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(void unregisterAction(Action)): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(void unregisterAction(Action)): Effects-of-calling:getTabCompleter
    //#unanalyzed(void unregisterAction(Action)): Effects-of-calling:com.dmdirc.ui.input.TabCompleter:removeEntry
    //#unanalyzed(void unregisterAction(Action)): Effects-of-calling:getConditions
    //#unanalyzed(void unregisterAction(Action)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void unregisterAction(Action)): Effects-of-calling:com.dmdirc.commandparser.CommandManager:getCommandChar
    //#unanalyzed(void unregisterAction(Action)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void unregisterAction(Action)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void unregisterAction(Action)): Effects-of-calling:java.util.Map:get

        actions.removeFromAll(action);
    //#ActionManager.java:321: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.util.MapList:removeFromAll(Object)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.ActionManager
    //#    method: void unregisterAction(Action)
    //#    unanalyzed callee: void com.dmdirc.util.MapList:removeFromAll(Object)
        getGroup(action.getGroup()).remove(action);
    }
    //#ActionManager.java:323: end of method: void com.dmdirc.actions.ActionManager.unregisterAction(Action)

    /**
     * Reregisters the specified action. Should be used when the action's
     * triggers change.
     *
     * @param action The action to be reregistered
     */
    public static void reregisterAction(final Action action) {
        unregisterAction(action);
    //#ActionManager.java:332: method: void com.dmdirc.actions.ActionManager.reregisterAction(Action)
    //#input(void reregisterAction(Action)): "Invalid alias action (no name): "._tainted
    //#input(void reregisterAction(Action)): "Invalid alias action (wrong trigger): "._tainted
    //#input(void reregisterAction(Action)): "Invalid perform action: "._tainted
    //#input(void reregisterAction(Action)): action
    //#input(void reregisterAction(Action)): action.__Tag
    //#input(void reregisterAction(Action)): action.group
    //#input(void reregisterAction(Action)): action.name._tainted
    //#input(void reregisterAction(Action)): action.triggers
    //#input(void reregisterAction(Action)): action.triggers.length
    //#input(void reregisterAction(Action)): action.triggers[0]
    //#input(void reregisterAction(Action)): action.triggers[1..+Inf]
    //#input(void reregisterAction(Action)): actions
    //#input(void reregisterAction(Action)): com/dmdirc/GlobalWindow.__Descendant_Table[com/dmdirc/GlobalWindow]
    //#input(void reregisterAction(Action)): com/dmdirc/GlobalWindow.__Descendant_Table[others]
    //#input(void reregisterAction(Action)): com/dmdirc/GlobalWindow.__Dispatch_Table.getTabCompleter()Lcom/dmdirc/ui/input/TabCompleter;
    //#input(void reregisterAction(Action)): com/dmdirc/GlobalWindow.globalWindow.__Tag
    //#input(void reregisterAction(Action)): com/dmdirc/GlobalWindow.globalWindow.tabCompleter
    //#input(void reregisterAction(Action)): com/dmdirc/Server.__Descendant_Table[com/dmdirc/Server]
    //#input(void reregisterAction(Action)): com/dmdirc/Server.__Descendant_Table[others]
    //#input(void reregisterAction(Action)): com/dmdirc/Server.__Dispatch_Table.getTabCompleter()Lcom/dmdirc/ui/input/TabCompleter;
    //#input(void reregisterAction(Action)): com/dmdirc/ServerManager.__Class_Obj.__Lock
    //#input(void reregisterAction(Action)): com/dmdirc/ServerManager.me
    //#input(void reregisterAction(Action)): com/dmdirc/ServerManager.me.servers
    //#input(void reregisterAction(Action)): com/dmdirc/actions/Action.__Descendant_Table[com/dmdirc/actions/Action]
    //#input(void reregisterAction(Action)): com/dmdirc/actions/Action.__Descendant_Table[others]
    //#input(void reregisterAction(Action)): com/dmdirc/actions/Action.__Dispatch_Table.getConditions()Ljava/util/List;
    //#input(void reregisterAction(Action)): com/dmdirc/actions/Action.__Dispatch_Table.getGroup()Ljava/lang/String;
    //#input(void reregisterAction(Action)): com/dmdirc/actions/Action.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(void reregisterAction(Action)): com/dmdirc/actions/Action.__Dispatch_Table.getTriggers()[Lcom/dmdirc/actions/interfaces/ActionType;
    //#input(void reregisterAction(Action)): com/dmdirc/actions/ActionCondition.__Descendant_Table[com/dmdirc/actions/ActionCondition]
    //#input(void reregisterAction(Action)): com/dmdirc/actions/ActionCondition.__Descendant_Table[others]
    //#input(void reregisterAction(Action)): com/dmdirc/actions/ActionCondition.__Dispatch_Table.getArg()I
    //#input(void reregisterAction(Action)): com/dmdirc/actions/ActionCondition.__Dispatch_Table.getComponent()Lcom/dmdirc/actions/interfaces/ActionComponent;
    //#input(void reregisterAction(Action)): com/dmdirc/actions/ActionCondition.__Dispatch_Table.getTarget()Ljava/lang/String;
    //#input(void reregisterAction(Action)): com/dmdirc/actions/ActionGroup.__Descendant_Table[com/dmdirc/actions/ActionGroup]
    //#input(void reregisterAction(Action)): com/dmdirc/actions/ActionGroup.__Descendant_Table[com/dmdirc/actions/wrappers/AliasWrapper]
    //#input(void reregisterAction(Action)): com/dmdirc/actions/ActionGroup.__Descendant_Table[com/dmdirc/actions/wrappers/PerformWrapper]
    //#input(void reregisterAction(Action)): com/dmdirc/actions/ActionGroup.__Descendant_Table[others]
    //#input(void reregisterAction(Action)): com/dmdirc/actions/ActionGroup.__Dispatch_Table.add(Lcom/dmdirc/actions/Action;)V
    //#input(void reregisterAction(Action)): com/dmdirc/actions/ActionGroup.__Dispatch_Table.remove(Lcom/dmdirc/actions/Action;)V
    //#input(void reregisterAction(Action)): com/dmdirc/actions/CoreActionComponent.SERVER_NAME
    //#input(void reregisterAction(Action)): com/dmdirc/actions/CoreActionComponent.SERVER_NETWORK
    //#input(void reregisterAction(Action)): com/dmdirc/actions/CoreActionType.SERVER_CONNECTED
    //#input(void reregisterAction(Action)): com/dmdirc/actions/CoreActionType.UNKNOWN_COMMAND
    //#input(void reregisterAction(Action)): com/dmdirc/actions/wrappers/AliasWrapper.__Dispatch_Table.add(Lcom/dmdirc/actions/Action;)V
    //#input(void reregisterAction(Action)): com/dmdirc/actions/wrappers/AliasWrapper.__Dispatch_Table.remove(Lcom/dmdirc/actions/Action;)V
    //#input(void reregisterAction(Action)): com/dmdirc/actions/wrappers/AliasWrapper.com.dmdirc.logger.ErrorLevel.MEDIUM
    //#input(void reregisterAction(Action)): com/dmdirc/actions/wrappers/AliasWrapper.com.dmdirc.ui.input.TabCompletionType.COMMAND
    //#input(void reregisterAction(Action)): com/dmdirc/actions/wrappers/PerformWrapper.__Dispatch_Table.add(Lcom/dmdirc/actions/Action;)V
    //#input(void reregisterAction(Action)): com/dmdirc/actions/wrappers/PerformWrapper.__Dispatch_Table.remove(Lcom/dmdirc/actions/Action;)V
    //#input(void reregisterAction(Action)): com/dmdirc/actions/wrappers/PerformWrapper.com.dmdirc.logger.ErrorLevel.MEDIUM
    //#input(void reregisterAction(Action)): groups
    //#output(void reregisterAction(Action)): com/dmdirc/ServerManager.me
    //#output(void reregisterAction(Action)): new ArrayList(ServerManager#1) num objects
    //#output(void reregisterAction(Action)): new ServerManager(getServerManager#1) num objects
    //#output(void reregisterAction(Action)): new ServerManager(getServerManager#1).__Tag
    //#output(void reregisterAction(Action)): new ServerManager(getServerManager#1).servers
    //#new obj(void reregisterAction(Action)): new ArrayList(ServerManager#1)
    //#new obj(void reregisterAction(Action)): new ServerManager(getServerManager#1)
    //#pre[1] (void reregisterAction(Action)): action != null
    //#pre[2] (void reregisterAction(Action)): action.__Tag == com/dmdirc/actions/Action
    //#pre[4] (void reregisterAction(Action)): init'ed(action.group)
    //#pre[7] (void reregisterAction(Action)): action.triggers != null
    //#pre[8] (void reregisterAction(Action)): action.triggers.length <= 4_294_967_295
    //#pre[9] (void reregisterAction(Action)): (soft) init'ed(action.triggers[0])
    //#pre[10] (void reregisterAction(Action)): (soft) init'ed(action.triggers[1..+Inf])
    //#pre[15] (void reregisterAction(Action)): (soft) init'ed(com/dmdirc/ServerManager.me)
    //#post(void reregisterAction(Action)): init'ed(com/dmdirc/ServerManager.me)
    //#post(void reregisterAction(Action)): new ArrayList(ServerManager#1) num objects <= 1
    //#post(void reregisterAction(Action)): new ServerManager(getServerManager#1) num objects <= 1
    //#post(void reregisterAction(Action)): init'ed(new ServerManager(getServerManager#1).__Tag)
    //#post(void reregisterAction(Action)): init'ed(new ServerManager(getServerManager#1).servers)
    //#unanalyzed(void reregisterAction(Action)): Effects-of-calling:com.dmdirc.logger.Logger:assertTrue
    //#unanalyzed(void reregisterAction(Action)): Effects-of-calling:com.dmdirc.util.MapList:add
    //#unanalyzed(void reregisterAction(Action)): Effects-of-calling:java.util.Map:put
    //#unanalyzed(void reregisterAction(Action)): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(void reregisterAction(Action)): Effects-of-calling:java.util.ArrayList
    //#unanalyzed(void reregisterAction(Action)): Effects-of-calling:java.util.HashMap
    //#unanalyzed(void reregisterAction(Action)): Effects-of-calling:java.util.List:remove
    //#unanalyzed(void reregisterAction(Action)): Effects-of-calling:remove
    //#unanalyzed(void reregisterAction(Action)): Effects-of-calling:getTriggers
    //#unanalyzed(void reregisterAction(Action)): Effects-of-calling:java.lang.Object:equals
    //#unanalyzed(void reregisterAction(Action)): Effects-of-calling:getCommandName
    //#unanalyzed(void reregisterAction(Action)): Effects-of-calling:java.util.List:iterator
    //#unanalyzed(void reregisterAction(Action)): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(void reregisterAction(Action)): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(void reregisterAction(Action)): Effects-of-calling:getTabCompleter
    //#unanalyzed(void reregisterAction(Action)): Effects-of-calling:com.dmdirc.ui.input.TabCompleter:removeEntry
    //#unanalyzed(void reregisterAction(Action)): Effects-of-calling:getConditions
    //#unanalyzed(void reregisterAction(Action)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void reregisterAction(Action)): Effects-of-calling:com.dmdirc.commandparser.CommandManager:getCommandChar
    //#unanalyzed(void reregisterAction(Action)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void reregisterAction(Action)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void reregisterAction(Action)): Effects-of-calling:java.util.Map:get
    //#unanalyzed(void reregisterAction(Action)): Effects-of-calling:getGroup
    //#unanalyzed(void reregisterAction(Action)): Effects-of-calling:java.util.List:get
    //#unanalyzed(void reregisterAction(Action)): Effects-of-calling:java.util.List:size
    //#unanalyzed(void reregisterAction(Action)): Effects-of-calling:add
    //#unanalyzed(void reregisterAction(Action)): Effects-of-calling:getName
    //#unanalyzed(void reregisterAction(Action)): Effects-of-calling:com.dmdirc.logger.Logger:userError
    //#unanalyzed(void reregisterAction(Action)): Effects-of-calling:java.util.List:add
    //#unanalyzed(void reregisterAction(Action)): Effects-of-calling:getGlobalWindow
    //#unanalyzed(void reregisterAction(Action)): Effects-of-calling:com.dmdirc.ui.input.TabCompleter:addEntry
    //#unanalyzed(void reregisterAction(Action)): Effects-of-calling:com.dmdirc.util.MapList:removeFromAll
        registerAction(action);
    }
    //#ActionManager.java:334: end of method: void com.dmdirc.actions.ActionManager.reregisterAction(Action)

    /**
     * Deletes the specified action.
     *
     * @param action The action to be deleted
     */
    @Precondition("The specified Action is not null")
    public static void deleteAction(final Action action) {
        Logger.assertTrue(action != null);
    //#ActionManager.java:343: method: void com.dmdirc.actions.ActionManager.deleteAction(Action)
    //#ActionManager.java:343: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.logger.Logger:assertTrue(bool)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.ActionManager
    //#    method: void deleteAction(Action)
    //#    unanalyzed callee: void com.dmdirc.logger.Logger:assertTrue(bool)
    //#input(void deleteAction(Action)): action
    //#input(void deleteAction(Action)): action.__Tag
    //#input(void deleteAction(Action)): action.group
    //#input(void deleteAction(Action)): action.location
    //#input(void deleteAction(Action)): action.name
    //#input(void deleteAction(Action)): action.triggers.length
    //#input(void deleteAction(Action)): actions
    //#input(void deleteAction(Action)): com.dmdirc.actions.CoreActionType__static_init.new CoreActionType(CoreActionType__static_init#73).__Tag
    //#input(void deleteAction(Action)): com.dmdirc.actions.CoreActionType__static_init.new CoreActionType(CoreActionType__static_init#73).type
    //#input(void deleteAction(Action)): com.dmdirc.actions.metatypes.ActionEvents__static_init.new ActionEvents(ActionEvents__static_init#4).__Tag
    //#input(void deleteAction(Action)): com/dmdirc/Server.__Descendant_Table[com/dmdirc/Server]
    //#input(void deleteAction(Action)): com/dmdirc/Server.__Descendant_Table[others]
    //#input(void deleteAction(Action)): com/dmdirc/Server.__Dispatch_Table.getTabCompleter()Lcom/dmdirc/ui/input/TabCompleter;
    //#input(void deleteAction(Action)): com/dmdirc/ServerManager.__Class_Obj.__Lock
    //#input(void deleteAction(Action)): com/dmdirc/ServerManager.me
    //#input(void deleteAction(Action)): com/dmdirc/ServerManager.me.servers
    //#input(void deleteAction(Action)): com/dmdirc/actions/Action.__Descendant_Table[com/dmdirc/actions/Action]
    //#input(void deleteAction(Action)): com/dmdirc/actions/Action.__Descendant_Table[others]
    //#input(void deleteAction(Action)): com/dmdirc/actions/Action.__Dispatch_Table.delete()V
    //#input(void deleteAction(Action)): com/dmdirc/actions/Action.__Dispatch_Table.getConditions()Ljava/util/List;
    //#input(void deleteAction(Action)): com/dmdirc/actions/Action.__Dispatch_Table.getGroup()Ljava/lang/String;
    //#input(void deleteAction(Action)): com/dmdirc/actions/Action.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(void deleteAction(Action)): com/dmdirc/actions/Action.__Dispatch_Table.getTriggers()[Lcom/dmdirc/actions/interfaces/ActionType;
    //#input(void deleteAction(Action)): com/dmdirc/actions/ActionCondition.__Descendant_Table[com/dmdirc/actions/ActionCondition]
    //#input(void deleteAction(Action)): com/dmdirc/actions/ActionCondition.__Descendant_Table[others]
    //#input(void deleteAction(Action)): com/dmdirc/actions/ActionCondition.__Dispatch_Table.getArg()I
    //#input(void deleteAction(Action)): com/dmdirc/actions/ActionCondition.__Dispatch_Table.getTarget()Ljava/lang/String;
    //#input(void deleteAction(Action)): com/dmdirc/actions/ActionGroup.__Descendant_Table[com/dmdirc/actions/ActionGroup]
    //#input(void deleteAction(Action)): com/dmdirc/actions/ActionGroup.__Descendant_Table[com/dmdirc/actions/wrappers/AliasWrapper]
    //#input(void deleteAction(Action)): com/dmdirc/actions/ActionGroup.__Descendant_Table[com/dmdirc/actions/wrappers/PerformWrapper]
    //#input(void deleteAction(Action)): com/dmdirc/actions/ActionGroup.__Descendant_Table[others]
    //#input(void deleteAction(Action)): com/dmdirc/actions/ActionGroup.__Dispatch_Table.remove(Lcom/dmdirc/actions/Action;)V
    //#input(void deleteAction(Action)): com/dmdirc/actions/CoreActionType.ACTION_DELETED
    //#input(void deleteAction(Action)): com/dmdirc/actions/CoreActionType.UNKNOWN_COMMAND
    //#input(void deleteAction(Action)): com/dmdirc/actions/CoreActionType.__Dispatch_Table.getType()Lcom/dmdirc/actions/interfaces/ActionMetaType;
    //#input(void deleteAction(Action)): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/interfaces/ActionMetaType]
    //#input(void deleteAction(Action)): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/ActionEvents]
    //#input(void deleteAction(Action)): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/ChannelEvents]
    //#input(void deleteAction(Action)): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/ClientEvents]
    //#input(void deleteAction(Action)): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/PluginEvents]
    //#input(void deleteAction(Action)): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/QueryEvents]
    //#input(void deleteAction(Action)): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/ServerEvents]
    //#input(void deleteAction(Action)): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/addons/dcc/actions/DCCEvents]
    //#input(void deleteAction(Action)): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[others]
    //#input(void deleteAction(Action)): com/dmdirc/actions/interfaces/ActionMetaType.__Dispatch_Table.getArity()I
    //#input(void deleteAction(Action)): com/dmdirc/actions/interfaces/ActionType.__Descendant_Table[com/dmdirc/actions/CoreActionType]
    //#input(void deleteAction(Action)): com/dmdirc/actions/interfaces/ActionType.__Descendant_Table[com/dmdirc/actions/interfaces/ActionType]
    //#input(void deleteAction(Action)): com/dmdirc/actions/interfaces/ActionType.__Descendant_Table[com/dmdirc/addons/dcc/actions/DCCActions]
    //#input(void deleteAction(Action)): com/dmdirc/actions/interfaces/ActionType.__Descendant_Table[others]
    //#input(void deleteAction(Action)): com/dmdirc/actions/interfaces/ActionType.__Dispatch_Table.getType()Lcom/dmdirc/actions/interfaces/ActionMetaType;
    //#input(void deleteAction(Action)): com/dmdirc/actions/metatypes/ActionEvents.__Dispatch_Table.getArity()I
    //#input(void deleteAction(Action)): com/dmdirc/actions/metatypes/ChannelEvents.__Dispatch_Table.getArity()I
    //#input(void deleteAction(Action)): com/dmdirc/actions/metatypes/ClientEvents.__Dispatch_Table.getArity()I
    //#input(void deleteAction(Action)): com/dmdirc/actions/metatypes/PluginEvents.__Dispatch_Table.getArity()I
    //#input(void deleteAction(Action)): com/dmdirc/actions/metatypes/QueryEvents.__Dispatch_Table.getArity()I
    //#input(void deleteAction(Action)): com/dmdirc/actions/metatypes/ServerEvents.__Dispatch_Table.getArity()I
    //#input(void deleteAction(Action)): com/dmdirc/actions/wrappers/AliasWrapper.__Dispatch_Table.remove(Lcom/dmdirc/actions/Action;)V
    //#input(void deleteAction(Action)): com/dmdirc/actions/wrappers/AliasWrapper.com.dmdirc.ui.input.TabCompletionType.COMMAND
    //#input(void deleteAction(Action)): com/dmdirc/actions/wrappers/PerformWrapper.__Dispatch_Table.remove(Lcom/dmdirc/actions/Action;)V
    //#input(void deleteAction(Action)): com/dmdirc/addons/dcc/actions/DCCActions.__Dispatch_Table.getType()Lcom/dmdirc/actions/interfaces/ActionMetaType;
    //#input(void deleteAction(Action)): com/dmdirc/addons/dcc/actions/DCCEvents.__Dispatch_Table.getArity()I
    //#input(void deleteAction(Action)): groups
    //#input(void deleteAction(Action)): killSwitch
    //#input(void deleteAction(Action)): listeners
    //#output(void deleteAction(Action)): com/dmdirc/ServerManager.me
    //#output(void deleteAction(Action)): new ArrayList(ServerManager#1) num objects
    //#output(void deleteAction(Action)): new ServerManager(getServerManager#1) num objects
    //#output(void deleteAction(Action)): new ServerManager(getServerManager#1).__Tag
    //#output(void deleteAction(Action)): new ServerManager(getServerManager#1).servers
    //#new obj(void deleteAction(Action)): new ArrayList(ServerManager#1)
    //#new obj(void deleteAction(Action)): new ServerManager(getServerManager#1)
    //#pre[1] (void deleteAction(Action)): action != null
    //#pre[2] (void deleteAction(Action)): action.__Tag == com/dmdirc/actions/Action
    //#pre[4] (void deleteAction(Action)): init'ed(action.group)
    //#pre[5] (void deleteAction(Action)): init'ed(action.location)
    //#pre[6] (void deleteAction(Action)): init'ed(action.name)
    //#pre[16] (void deleteAction(Action)): init'ed(killSwitch)
    //#pre[14] (void deleteAction(Action)): (soft) com.dmdirc.actions.CoreActionType__static_init.new CoreActionType(CoreActionType__static_init#73).type != null
    //#pre[17] (void deleteAction(Action)): (soft) init'ed(com/dmdirc/ServerManager.me)
    //#post(void deleteAction(Action)): init'ed(com/dmdirc/ServerManager.me)
    //#post(void deleteAction(Action)): new ArrayList(ServerManager#1) num objects <= 1
    //#post(void deleteAction(Action)): new ArrayList(ServerManager#1) num objects == undefined
    //#post(void deleteAction(Action)): new ArrayList(ServerManager#1) num objects == 0, if init'ed
    //#post(void deleteAction(Action)): new ServerManager(getServerManager#1) num objects == new ArrayList(ServerManager#1) num objects
    //#post(void deleteAction(Action)): new ServerManager(getServerManager#1).__Tag == new ArrayList(ServerManager#1) num objects
    //#post(void deleteAction(Action)): new ServerManager(getServerManager#1) num objects <= 1
    //#post(void deleteAction(Action)): init'ed(new ServerManager(getServerManager#1).__Tag)
    //#post(void deleteAction(Action)): init'ed(new ServerManager(getServerManager#1).servers)
    //#post(void deleteAction(Action)): new ServerManager(getServerManager#1).servers == undefined
    //#post(void deleteAction(Action)): new ServerManager(getServerManager#1).servers == null
    //#unanalyzed(void deleteAction(Action)): Effects-of-calling:com.dmdirc.logger.Logger:assertTrue
    //#unanalyzed(void deleteAction(Action)): Effects-of-calling:getType
    //#unanalyzed(void deleteAction(Action)): Effects-of-calling:java.util.Map:put
    //#unanalyzed(void deleteAction(Action)): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(void deleteAction(Action)): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(void deleteAction(Action)): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(void deleteAction(Action)): Effects-of-calling:java.util.ArrayList
    //#unanalyzed(void deleteAction(Action)): Effects-of-calling:java.util.HashMap
    //#unanalyzed(void deleteAction(Action)): Effects-of-calling:java.util.List:remove
    //#unanalyzed(void deleteAction(Action)): Effects-of-calling:remove
    //#unanalyzed(void deleteAction(Action)): Effects-of-calling:getTriggers
    //#unanalyzed(void deleteAction(Action)): Effects-of-calling:java.lang.Object:equals
    //#unanalyzed(void deleteAction(Action)): Effects-of-calling:getCommandName
    //#unanalyzed(void deleteAction(Action)): Effects-of-calling:java.util.List:iterator
    //#unanalyzed(void deleteAction(Action)): Effects-of-calling:getTabCompleter
    //#unanalyzed(void deleteAction(Action)): Effects-of-calling:com.dmdirc.ui.input.TabCompleter:removeEntry
    //#unanalyzed(void deleteAction(Action)): Effects-of-calling:getConditions
    //#unanalyzed(void deleteAction(Action)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void deleteAction(Action)): Effects-of-calling:com.dmdirc.commandparser.CommandManager:getCommandChar
    //#unanalyzed(void deleteAction(Action)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void deleteAction(Action)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void deleteAction(Action)): Effects-of-calling:java.util.Map:get
    //#unanalyzed(void deleteAction(Action)): Effects-of-calling:getGroup
    //#unanalyzed(void deleteAction(Action)): Effects-of-calling:com.dmdirc.util.MapList:removeFromAll
    //#unanalyzed(void deleteAction(Action)): Effects-of-calling:com.dmdirc.util.MapList:containsKey
    //#unanalyzed(void deleteAction(Action)): Effects-of-calling:com.dmdirc.util.MapList:get
    //#unanalyzed(void deleteAction(Action)): Effects-of-calling:java.util.ArrayList:iterator
    //#unanalyzed(void deleteAction(Action)): Effects-of-calling:trigger
    //#unanalyzed(void deleteAction(Action)): Effects-of-calling:getArity
    //#unanalyzed(void deleteAction(Action)): Effects-of-calling:com.dmdirc.interfaces.ActionListener:processEvent
    //#unanalyzed(void deleteAction(Action)): Effects-of-calling:triggerActions
    //#unanalyzed(void deleteAction(Action)): Effects-of-calling:com.dmdirc.actions.ConditionTree$OPERATION:ordinal
    //#unanalyzed(void deleteAction(Action)): Effects-of-calling:java.io.File
    //#unanalyzed(void deleteAction(Action)): Effects-of-calling:java.io.File:delete
    //#unanalyzed(void deleteAction(Action)): Effects-of-calling:java.util.List:size
    //#unanalyzed(void deleteAction(Action)): Effects-of-calling:java.util.Deque:pollFirst
    //#unanalyzed(void deleteAction(Action)): Effects-of-calling:java.lang.Character:instanceof
    //#unanalyzed(void deleteAction(Action)): Effects-of-calling:java.lang.Character:charValue
    //#unanalyzed(void deleteAction(Action)): Effects-of-calling:java.util.Deque:isEmpty
    //#unanalyzed(void deleteAction(Action)): Effects-of-calling:readTerm
    //#unanalyzed(void deleteAction(Action)): Effects-of-calling:java.util.ArrayDeque
    //#unanalyzed(void deleteAction(Action)): Effects-of-calling:java.util.Deque:pollLast
    //#unanalyzed(void deleteAction(Action)): Effects-of-calling:java.util.Deque:addFirst
    //#unanalyzed(void deleteAction(Action)): Effects-of-calling:parseStack
    //#unanalyzed(void deleteAction(Action)): Effects-of-calling:java.util.Deque:poll
    //#unanalyzed(void deleteAction(Action)): Effects-of-calling:java.util.Deque:add
    //#unanalyzed(void deleteAction(Action)): Effects-of-calling:java.util.Deque:size
    //#unanalyzed(void deleteAction(Action)): Effects-of-calling:java.lang.String:length
    //#unanalyzed(void deleteAction(Action)): Effects-of-calling:java.lang.String:charAt
    //#unanalyzed(void deleteAction(Action)): Effects-of-calling:java.lang.String:valueOf
    //#unanalyzed(void deleteAction(Action)): Effects-of-calling:java.lang.Integer:parseInt
    //#unanalyzed(void deleteAction(Action)): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(void deleteAction(Action)): Effects-of-calling:java.lang.Character:valueOf
    //#unanalyzed(void deleteAction(Action)): Effects-of-calling:java.lang.StringBuilder:length
    //#unanalyzed(void deleteAction(Action)): Effects-of-calling:com.dmdirc.config.IdentityManager:getGlobalConfig
    //#unanalyzed(void deleteAction(Action)): Effects-of-calling:com.dmdirc.config.ConfigManager:getOptions
    //#unanalyzed(void deleteAction(Action)): Effects-of-calling:java.lang.StringBuilder:indexOf
    //#unanalyzed(void deleteAction(Action)): Effects-of-calling:java.lang.StringBuilder:replace
    //#unanalyzed(void deleteAction(Action)): Effects-of-calling:java.util.Map:entrySet
    //#unanalyzed(void deleteAction(Action)): Effects-of-calling:java.util.Set:iterator
    //#unanalyzed(void deleteAction(Action)): Effects-of-calling:java.util.Map$Entry:getKey
    //#unanalyzed(void deleteAction(Action)): Effects-of-calling:java.util.Map$Entry:getValue
    //#unanalyzed(void deleteAction(Action)): Effects-of-calling:[Ljava.lang.String;:instanceof
    //#unanalyzed(void deleteAction(Action)): Effects-of-calling:java.lang.String:instanceof
    //#unanalyzed(void deleteAction(Action)): Effects-of-calling:java.lang.String:split
    //#unanalyzed(void deleteAction(Action)): Effects-of-calling:java.lang.StringBuffer
    //#unanalyzed(void deleteAction(Action)): Effects-of-calling:java.lang.StringBuffer:length
    //#unanalyzed(void deleteAction(Action)): Effects-of-calling:java.lang.StringBuffer:insert
    //#unanalyzed(void deleteAction(Action)): Effects-of-calling:java.lang.StringBuffer:toString
    //#unanalyzed(void deleteAction(Action)): Effects-of-calling:doServerSubstitutions
    //#unanalyzed(void deleteAction(Action)): Effects-of-calling:doComponentSubstitutions
    //#unanalyzed(void deleteAction(Action)): Effects-of-calling:getServer
    //#unanalyzed(void deleteAction(Action)): Effects-of-calling:getState
    //#unanalyzed(void deleteAction(Action)): Effects-of-calling:com.dmdirc.ServerState:equals
    //#unanalyzed(void deleteAction(Action)): Effects-of-calling:getCompatibleComponents
    //#unanalyzed(void deleteAction(Action)): Effects-of-calling:java.lang.Object:toString
    //#unanalyzed(void deleteAction(Action)): Effects-of-calling:get
    //#unanalyzed(void deleteAction(Action)): Effects-of-calling:getArgTypes
    //#unanalyzed(void deleteAction(Action)): Effects-of-calling:test
    //#unanalyzed(void deleteAction(Action)): Effects-of-calling:evaluate
    //#unanalyzed(void deleteAction(Action)): Effects-of-calling:getUI
    //#unanalyzed(void deleteAction(Action)): Effects-of-calling:com.dmdirc.ui.interfaces.UIController:getActiveWindow
    //#unanalyzed(void deleteAction(Action)): Effects-of-calling:getFrame
    //#unanalyzed(void deleteAction(Action)): Effects-of-calling:com.dmdirc.ui.interfaces.InputWindow:instanceof
    //#unanalyzed(void deleteAction(Action)): Effects-of-calling:java.util.List:get
    //#unanalyzed(void deleteAction(Action)): Effects-of-calling:com.dmdirc.commandparser.parsers.GlobalCommandParser:getGlobalCommandParser
    //#unanalyzed(void deleteAction(Action)): Effects-of-calling:com.dmdirc.ui.interfaces.InputWindow:getCommandParser
    //#unanalyzed(void deleteAction(Action)): Effects-of-calling:com.dmdirc.commandparser.parsers.CommandParser:parseCommand
    //#unanalyzed(void deleteAction(Action)): Effects-of-calling:java.lang.StringBuffer:setLength
    //#unanalyzed(void deleteAction(Action)): Effects-of-calling:java.lang.StringBuffer:append

        unregisterAction(action);
        
        action.delete();
    }
    //#ActionManager.java:348: end of method: void com.dmdirc.actions.ActionManager.deleteAction(Action)

    /**
     * Processes an event of the specified type.
     *
     * @param type The type of the event to process
     * @param format The format of the message that's going to be displayed for
     * the event. Actions may change this format.
     * @param arguments The arguments for the event
     */
    @Precondition({
        "The specified ActionType is not null",
        "The specified ActionType has a valid ActionMetaType",
        "The length of the arguments array equals the arity of the ActionType's ActionMetaType"
    })
    public static void processEvent(final ActionType type,
            final StringBuffer format, final Object ... arguments) {
        Logger.assertTrue(type != null);
    //#ActionManager.java:365: method: void com.dmdirc.actions.ActionManager.processEvent(ActionType, StringBuffer, Object[])
    //#ActionManager.java:365: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.logger.Logger:assertTrue(bool)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.ActionManager
    //#    method: void processEvent(ActionType, StringBuffer, Object[])
    //#    unanalyzed callee: void com.dmdirc.logger.Logger:assertTrue(bool)
    //#ActionManager.java:365: Warning: suspicious precondition
    //#    The precondition for type.__Tag is not a contiguous range of values
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.actions.ActionManager
    //#    method: void processEvent(ActionType, StringBuffer, Object[])
    //#    suspicious precondition index: [25]
    //#ActionManager.java:365: Warning: suspicious precondition
    //#    The precondition for type.type.__Tag is not a contiguous range of values
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.actions.ActionManager
    //#    method: void processEvent(ActionType, StringBuffer, Object[])
    //#    suspicious precondition index: [28]
    //#    Attribs:  Soft
    //#ActionManager.java:365: Warning: suspicious precondition
    //#    The precondition for type.type.__Tag is not a contiguous range of values
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.actions.ActionManager
    //#    method: void processEvent(ActionType, StringBuffer, Object[])
    //#    suspicious precondition index: [29]
    //#    Attribs:  Soft
    //#input(void processEvent(ActionType, StringBuffer, Object[])): arguments
    //#input(void processEvent(ActionType, StringBuffer, Object[])): arguments.length
    //#input(void processEvent(ActionType, StringBuffer, Object[])): com/dmdirc/actions/CoreActionType.__Dispatch_Table.getType()Lcom/dmdirc/actions/interfaces/ActionMetaType;
    //#input(void processEvent(ActionType, StringBuffer, Object[])): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/interfaces/ActionMetaType]
    //#input(void processEvent(ActionType, StringBuffer, Object[])): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/ActionEvents]
    //#input(void processEvent(ActionType, StringBuffer, Object[])): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/ChannelEvents]
    //#input(void processEvent(ActionType, StringBuffer, Object[])): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/ClientEvents]
    //#input(void processEvent(ActionType, StringBuffer, Object[])): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/PluginEvents]
    //#input(void processEvent(ActionType, StringBuffer, Object[])): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/QueryEvents]
    //#input(void processEvent(ActionType, StringBuffer, Object[])): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/ServerEvents]
    //#input(void processEvent(ActionType, StringBuffer, Object[])): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/addons/dcc/actions/DCCEvents]
    //#input(void processEvent(ActionType, StringBuffer, Object[])): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[others]
    //#input(void processEvent(ActionType, StringBuffer, Object[])): com/dmdirc/actions/interfaces/ActionMetaType.__Dispatch_Table.getArity()I
    //#input(void processEvent(ActionType, StringBuffer, Object[])): com/dmdirc/actions/interfaces/ActionType.__Descendant_Table[com/dmdirc/actions/CoreActionType]
    //#input(void processEvent(ActionType, StringBuffer, Object[])): com/dmdirc/actions/interfaces/ActionType.__Descendant_Table[com/dmdirc/actions/interfaces/ActionType]
    //#input(void processEvent(ActionType, StringBuffer, Object[])): com/dmdirc/actions/interfaces/ActionType.__Descendant_Table[com/dmdirc/addons/dcc/actions/DCCActions]
    //#input(void processEvent(ActionType, StringBuffer, Object[])): com/dmdirc/actions/interfaces/ActionType.__Descendant_Table[others]
    //#input(void processEvent(ActionType, StringBuffer, Object[])): com/dmdirc/actions/interfaces/ActionType.__Dispatch_Table.getType()Lcom/dmdirc/actions/interfaces/ActionMetaType;
    //#input(void processEvent(ActionType, StringBuffer, Object[])): com/dmdirc/actions/metatypes/ActionEvents.__Dispatch_Table.getArity()I
    //#input(void processEvent(ActionType, StringBuffer, Object[])): com/dmdirc/actions/metatypes/ChannelEvents.__Dispatch_Table.getArity()I
    //#input(void processEvent(ActionType, StringBuffer, Object[])): com/dmdirc/actions/metatypes/ClientEvents.__Dispatch_Table.getArity()I
    //#input(void processEvent(ActionType, StringBuffer, Object[])): com/dmdirc/actions/metatypes/PluginEvents.__Dispatch_Table.getArity()I
    //#input(void processEvent(ActionType, StringBuffer, Object[])): com/dmdirc/actions/metatypes/QueryEvents.__Dispatch_Table.getArity()I
    //#input(void processEvent(ActionType, StringBuffer, Object[])): com/dmdirc/actions/metatypes/ServerEvents.__Dispatch_Table.getArity()I
    //#input(void processEvent(ActionType, StringBuffer, Object[])): com/dmdirc/addons/dcc/actions/DCCActions.__Dispatch_Table.getType()Lcom/dmdirc/actions/interfaces/ActionMetaType;
    //#input(void processEvent(ActionType, StringBuffer, Object[])): com/dmdirc/addons/dcc/actions/DCCEvents.__Dispatch_Table.getArity()I
    //#input(void processEvent(ActionType, StringBuffer, Object[])): format
    //#input(void processEvent(ActionType, StringBuffer, Object[])): format._tainted
    //#input(void processEvent(ActionType, StringBuffer, Object[])): killSwitch
    //#input(void processEvent(ActionType, StringBuffer, Object[])): listeners
    //#input(void processEvent(ActionType, StringBuffer, Object[])): type
    //#input(void processEvent(ActionType, StringBuffer, Object[])): type.__Tag
    //#input(void processEvent(ActionType, StringBuffer, Object[])): type.type
    //#input(void processEvent(ActionType, StringBuffer, Object[])): type.type.__Tag
    //#output(void processEvent(ActionType, StringBuffer, Object[])): com/dmdirc/ServerManager.me
    //#output(void processEvent(ActionType, StringBuffer, Object[])): format._tainted
    //#output(void processEvent(ActionType, StringBuffer, Object[])): new ArrayList(ServerManager#1) num objects
    //#output(void processEvent(ActionType, StringBuffer, Object[])): new ServerManager(getServerManager#1) num objects
    //#output(void processEvent(ActionType, StringBuffer, Object[])): new ServerManager(getServerManager#1).__Tag
    //#output(void processEvent(ActionType, StringBuffer, Object[])): new ServerManager(getServerManager#1).servers
    //#new obj(void processEvent(ActionType, StringBuffer, Object[])): new ArrayList(ServerManager#1)
    //#new obj(void processEvent(ActionType, StringBuffer, Object[])): new ServerManager(getServerManager#1)
    //#pre[1] (void processEvent(ActionType, StringBuffer, Object[])): arguments != null
    //#pre[21] (void processEvent(ActionType, StringBuffer, Object[])): init'ed(killSwitch)
    //#pre[24] (void processEvent(ActionType, StringBuffer, Object[])): type != null
    //#pre[25] (void processEvent(ActionType, StringBuffer, Object[])): type.__Tag in {com/dmdirc/actions/CoreActionType, com/dmdirc/actions/interfaces/ActionType, com/dmdirc/addons/dcc/actions/DCCActions}
    //#pre[22] (void processEvent(ActionType, StringBuffer, Object[])): (soft) init'ed(com/dmdirc/ServerManager.me)
    //#pre[26] (void processEvent(ActionType, StringBuffer, Object[])): (soft) type.type != null
    //#pre[27] (void processEvent(ActionType, StringBuffer, Object[])): (soft) type.type != null
    //#pre[28] (void processEvent(ActionType, StringBuffer, Object[])): (soft) type.type.__Tag in {com/dmdirc/actions/interfaces/ActionMetaType, com/dmdirc/actions/metatypes/ActionEvents, com/dmdirc/actions/metatypes/ChannelEvents, com/dmdirc/actions/metatypes/ClientEvents, com/dmdirc/actions/metatypes/PluginEvents, com/dmdirc/actions/metatypes/QueryEvents, com/dmdirc/actions/metatypes/ServerEvents, com/dmdirc/addons/dcc/actions/DCCEvents}
    //#pre[29] (void processEvent(ActionType, StringBuffer, Object[])): (soft) type.type.__Tag in {com/dmdirc/actions/interfaces/ActionMetaType, com/dmdirc/actions/metatypes/ActionEvents, com/dmdirc/actions/metatypes/ChannelEvents, com/dmdirc/actions/metatypes/ClientEvents, com/dmdirc/actions/metatypes/PluginEvents, com/dmdirc/actions/metatypes/QueryEvents, com/dmdirc/actions/metatypes/ServerEvents, com/dmdirc/addons/dcc/actions/DCCEvents}
    //#presumption(void processEvent(ActionType, StringBuffer, Object[])): java.util.ArrayList:iterator(...)@371 != null
    //#presumption(void processEvent(ActionType, StringBuffer, Object[])): java.util.Iterator:next(...)@371 != null
    //#post(void processEvent(ActionType, StringBuffer, Object[])): com/dmdirc/ServerManager.me == old com/dmdirc/ServerManager.me
    //#post(void processEvent(ActionType, StringBuffer, Object[])): format._tainted == old format._tainted
    //#post(void processEvent(ActionType, StringBuffer, Object[])): init'ed(format._tainted)
    //#post(void processEvent(ActionType, StringBuffer, Object[])): new ArrayList(ServerManager#1) num objects == undefined
    //#post(void processEvent(ActionType, StringBuffer, Object[])): new ArrayList(ServerManager#1) num objects == 0, if init'ed
    //#post(void processEvent(ActionType, StringBuffer, Object[])): new ServerManager(getServerManager#1) num objects == new ArrayList(ServerManager#1) num objects
    //#post(void processEvent(ActionType, StringBuffer, Object[])): new ServerManager(getServerManager#1).__Tag == new ArrayList(ServerManager#1) num objects
    //#post(void processEvent(ActionType, StringBuffer, Object[])): new ServerManager(getServerManager#1).servers == undefined
    //#post(void processEvent(ActionType, StringBuffer, Object[])): new ServerManager(getServerManager#1).servers == null
    //#test_vector(void processEvent(ActionType, StringBuffer, Object[])): killSwitch: {1}, {0}
    //#test_vector(void processEvent(ActionType, StringBuffer, Object[])): com.dmdirc.util.MapList:containsKey(...)@369: {0}, {1}
    //#test_vector(void processEvent(ActionType, StringBuffer, Object[])): java.util.Iterator:hasNext(...)@371: {0}, {1}
        Logger.assertTrue(type.getType() != null);
    //#ActionManager.java:366: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.logger.Logger:assertTrue(bool)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.ActionManager
    //#    method: void processEvent(ActionType, StringBuffer, Object[])
    //#    unanalyzed callee: void com.dmdirc.logger.Logger:assertTrue(bool)
        Logger.assertTrue(type.getType().getArity() == arguments.length);
    //#ActionManager.java:367: ?use of default init
    //#    init'ed(getType(...).__Tag)
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.actions.ActionManager
    //#    method: void processEvent(ActionType, StringBuffer, Object[])
    //#    basic block: bb_7
    //#    assertion: init'ed(getType(...).__Tag)
    //#    VN: getType(...).__Tag
    //#    Expected: {-Inf..+Inf}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Bad only invalid
    //#ActionManager.java:367: ?null dereference
    //#    com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[getType(...).__Tag] != null
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.actions.ActionManager
    //#    method: void processEvent(ActionType, StringBuffer, Object[])
    //#    basic block: bb_7
    //#    assertion: com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[getType(...).__Tag] != null
    //#    VN: com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[getType(...).__Tag]
    //#    Expected: Inverse{null}
    //#    Bad: Addr_Set{null}
    //#    Attribs:  Ptr  null in Bad
    //#ActionManager.java:367: Warning: call too complex - analysis skipped
    //#    call on int getArity()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.ActionManager
    //#    method: void processEvent(ActionType, StringBuffer, Object[])
    //#    unanalyzed callee: int getArity()
    //#ActionManager.java:367: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.logger.Logger:assertTrue(bool)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.ActionManager
    //#    method: void processEvent(ActionType, StringBuffer, Object[])
    //#    unanalyzed callee: void com.dmdirc.logger.Logger:assertTrue(bool)

        if (listeners.containsKey(type)) {
    //#ActionManager.java:369: Warning: method not available - call not analyzed
    //#    call on bool com.dmdirc.util.MapList:containsKey(Object)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.ActionManager
    //#    method: void processEvent(ActionType, StringBuffer, Object[])
    //#    unanalyzed callee: bool com.dmdirc.util.MapList:containsKey(Object)
            for (ActionListener listener :
                new ArrayList<ActionListener>(listeners.get(type))) {
    //#ActionManager.java:371: Warning: method not available - call not analyzed
    //#    call on List com.dmdirc.util.MapList:get(Object)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.ActionManager
    //#    method: void processEvent(ActionType, StringBuffer, Object[])
    //#    unanalyzed callee: List com.dmdirc.util.MapList:get(Object)
                listener.processEvent(type, format, arguments);
    //#ActionManager.java:372: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.interfaces.ActionListener:processEvent(ActionType, StringBuffer, Object[])
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.ActionManager
    //#    method: void processEvent(ActionType, StringBuffer, Object[])
    //#    unanalyzed callee: void com.dmdirc.interfaces.ActionListener:processEvent(ActionType, StringBuffer, Object[])
            }
        }

        if (!killSwitch) {
            triggerActions(type, format, arguments);
    //#ActionManager.java:377: Warning: call too complex - analysis skipped
    //#    call on void triggerActions(ActionType, StringBuffer, Object[])
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.ActionManager
    //#    method: void processEvent(ActionType, StringBuffer, Object[])
    //#    unanalyzed callee: void triggerActions(ActionType, StringBuffer, Object[])
        }
    }
    //#ActionManager.java:379: end of method: void com.dmdirc.actions.ActionManager.processEvent(ActionType, StringBuffer, Object[])

    /**
     * Triggers actions that respond to the specified type.
     *
     * @param type The type of the event to process
     * @param format The format of the message that's going to be displayed for
     * the event. Actions may change this format.*
     * @param arguments The arguments for the event
     */
    @Precondition("The specified ActionType is not null")
    private static void triggerActions(final ActionType type,
            final StringBuffer format, final Object ... arguments) {
        Logger.assertTrue(type != null);
    //#ActionManager.java:392: method: void com.dmdirc.actions.ActionManager.triggerActions(ActionType, StringBuffer, Object[])
    //#ActionManager.java:392: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.logger.Logger:assertTrue(bool)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.ActionManager
    //#    method: void triggerActions(ActionType, StringBuffer, Object[])
    //#    unanalyzed callee: void com.dmdirc.logger.Logger:assertTrue(bool)
    //#ActionManager.java:392: Warning: suspicious precondition
    //#    The precondition for arguments[0].__Tag is not a contiguous range of values
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.actions.ActionManager
    //#    method: void triggerActions(ActionType, StringBuffer, Object[])
    //#    suspicious precondition index: [4]
    //#    Attribs:  Soft
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): "$"._tainted
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): "${"._tainted
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): "-"._tainted
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): "."._tainted
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): "}"._tainted
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): actionComponents
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): actions
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): arguments
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): arguments.length
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): arguments[0]
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): arguments[0].__Tag
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): arguments[1]
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): arguments[1]._tainted
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): arguments[1].length
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): arguments[2]
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): arguments[2]._tainted
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): arguments[2].length
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): arguments[3..4_294_967_295]
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): arguments[3..4_294_967_295].__Tag
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): arguments[3..4_294_967_295]._tainted
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): arguments[3..4_294_967_295].length
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com.dmdirc.actions.ConditionTree$1__static_init.new int[](ConditionTree$1__static_init#1).length
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com.dmdirc.actions.ConditionTree$1__static_init.new int[](ConditionTree$1__static_init#1)[0..4_294_967_295]
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/Channel.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/InputWindow;
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/Channel.__Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/CustomWindow.__Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/Channel]
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/CustomWindow]
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/FrameContainer]
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/GlobalWindow]
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/MessageTarget]
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/Query]
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/Raw]
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/Server]
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/WritableFrameContainer]
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/addons/dcc/DCCChatWindow]
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/addons/dcc/DCCFrame]
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/addons/dcc/DCCPlugin$3]
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/addons/dcc/DCCSendWindow]
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/FrameContainer.__Descendant_Table[others]
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/FrameContainer.__Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/GlobalWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/InputWindow;
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/GlobalWindow.__Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/Main.controller
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/MessageTarget.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/InputWindow;
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/MessageTarget.__Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/Query.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/InputWindow;
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/Query.__Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/Raw.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/InputWindow;
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/Raw.__Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/Server.__Descendant_Table[com/dmdirc/Server]
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/Server.__Descendant_Table[others]
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/Server.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/InputWindow;
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/Server.__Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/Server.__Dispatch_Table.getState()Lcom/dmdirc/ServerState;
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/ServerManager.__Class_Obj.__Lock
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/ServerManager.me
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/ServerManager.me.servers
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/ServerState.CONNECTED
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/ServerStatus.__Descendant_Table[com/dmdirc/ServerStatus]
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/ServerStatus.__Descendant_Table[others]
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/ServerStatus.__Dispatch_Table.getState()Lcom/dmdirc/ServerState;
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/WritableFrameContainer.__Descendant_Table[com/dmdirc/Channel]
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/WritableFrameContainer.__Descendant_Table[com/dmdirc/GlobalWindow]
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/WritableFrameContainer.__Descendant_Table[com/dmdirc/MessageTarget]
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/WritableFrameContainer.__Descendant_Table[com/dmdirc/Query]
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/WritableFrameContainer.__Descendant_Table[com/dmdirc/Raw]
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/WritableFrameContainer.__Descendant_Table[com/dmdirc/Server]
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/WritableFrameContainer.__Descendant_Table[com/dmdirc/WritableFrameContainer]
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/WritableFrameContainer.__Descendant_Table[com/dmdirc/addons/dcc/DCCChatWindow]
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/WritableFrameContainer.__Descendant_Table[com/dmdirc/addons/dcc/DCCFrame]
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/WritableFrameContainer.__Descendant_Table[com/dmdirc/addons/dcc/DCCPlugin$3]
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/WritableFrameContainer.__Descendant_Table[com/dmdirc/addons/dcc/DCCSendWindow]
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/WritableFrameContainer.__Descendant_Table[others]
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/WritableFrameContainer.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/InputWindow;
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/WritableFrameContainer.__Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/Action.__Descendant_Table[com/dmdirc/actions/Action]
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/Action.__Descendant_Table[others]
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/Action.__Dispatch_Table.getRealConditionTree()Lcom/dmdirc/actions/ConditionTree;
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/Action.__Dispatch_Table.test(Lcom/dmdirc/actions/ActionSubstitutor;[Ljava/lang/Object;)Z
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/Action.__Dispatch_Table.trigger(Ljava/lang/StringBuffer;[Ljava/lang/Object;)V
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/ActionComponentChain.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/ActionComponentChain.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/ActionCondition.__Descendant_Table[com/dmdirc/actions/ActionCondition]
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/ActionCondition.__Descendant_Table[others]
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/ActionCondition.__Dispatch_Table.getArg()I
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/ActionCondition.__Dispatch_Table.getComparison()Lcom/dmdirc/actions/interfaces/ActionComparison;
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/ActionCondition.__Dispatch_Table.getComponent()Lcom/dmdirc/actions/interfaces/ActionComponent;
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/ActionCondition.__Dispatch_Table.getTarget()Ljava/lang/String;
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/ActionCondition.__Dispatch_Table.test(Lcom/dmdirc/actions/ActionSubstitutor;[Ljava/lang/Object;)Z
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/ActionModel.__Descendant_Table[com/dmdirc/actions/ActionModel]
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/ActionModel.__Descendant_Table[com/dmdirc/actions/Action]
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/ActionModel.__Descendant_Table[others]
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/ActionModel.__Dispatch_Table.getRealConditionTree()Lcom/dmdirc/actions/ConditionTree;
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/ActionModel.__Dispatch_Table.test(Lcom/dmdirc/actions/ActionSubstitutor;[Ljava/lang/Object;)Z
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/ActionSubstitutor.__Descendant_Table[com/dmdirc/actions/ActionSubstitutor]
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/ActionSubstitutor.__Descendant_Table[others]
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/ActionSubstitutor.__Dispatch_Table.doSubstitution(Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/String;
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/ConditionTree$1.$SwitchMap$com$dmdirc$actions$ConditionTree$OPERATION
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/ConditionTree$OPERATION.AND
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/ConditionTree$OPERATION.NOOP
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/ConditionTree$OPERATION.NOT
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/ConditionTree$OPERATION.OR
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/ConditionTree$OPERATION.VAR
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/ConditionTree.__Descendant_Table[com/dmdirc/actions/ConditionTree]
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/ConditionTree.__Descendant_Table[others]
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/ConditionTree.__Dispatch_Table.evaluate([Z)Z
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/CoreActionComparison$1.__Dispatch_Table.test(Ljava/lang/Object;Ljava/lang/Object;)Z
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/CoreActionComparison$10.__Dispatch_Table.test(Ljava/lang/Object;Ljava/lang/Object;)Z
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/CoreActionComparison$11.__Dispatch_Table.test(Ljava/lang/Object;Ljava/lang/Object;)Z
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/CoreActionComparison$12.__Dispatch_Table.test(Ljava/lang/Object;Ljava/lang/Object;)Z
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/CoreActionComparison$2.__Dispatch_Table.test(Ljava/lang/Object;Ljava/lang/Object;)Z
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/CoreActionComparison$3.__Dispatch_Table.test(Ljava/lang/Object;Ljava/lang/Object;)Z
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/CoreActionComparison$4.__Dispatch_Table.test(Ljava/lang/Object;Ljava/lang/Object;)Z
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/CoreActionComparison$5.__Dispatch_Table.test(Ljava/lang/Object;Ljava/lang/Object;)Z
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/CoreActionComparison$6.__Dispatch_Table.test(Ljava/lang/Object;Ljava/lang/Object;)Z
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/CoreActionComparison$7.__Dispatch_Table.test(Ljava/lang/Object;Ljava/lang/Object;)Z
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/CoreActionComparison$8.__Dispatch_Table.test(Ljava/lang/Object;Ljava/lang/Object;)Z
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/CoreActionComparison$9.__Dispatch_Table.test(Ljava/lang/Object;Ljava/lang/Object;)Z
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/CoreActionComparison.__Dispatch_Table.test(Ljava/lang/Object;Ljava/lang/Object;)Z
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/CoreActionComponent$1.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/CoreActionComponent$1.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/CoreActionComponent$10.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/CoreActionComponent$10.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/CoreActionComponent$11.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/CoreActionComponent$11.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/CoreActionComponent$12.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/CoreActionComponent$12.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/CoreActionComponent$13.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/CoreActionComponent$13.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/CoreActionComponent$14.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/CoreActionComponent$14.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/CoreActionComponent$15.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/CoreActionComponent$15.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/CoreActionComponent$16.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/CoreActionComponent$16.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/CoreActionComponent$17.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/CoreActionComponent$17.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/CoreActionComponent$18.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/CoreActionComponent$18.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/CoreActionComponent$19.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/CoreActionComponent$19.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/CoreActionComponent$2.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/CoreActionComponent$2.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/CoreActionComponent$20.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/CoreActionComponent$20.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/CoreActionComponent$21.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/CoreActionComponent$21.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/CoreActionComponent$22.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/CoreActionComponent$22.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/CoreActionComponent$23.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/CoreActionComponent$23.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/CoreActionComponent$24.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/CoreActionComponent$24.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/CoreActionComponent$25.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/CoreActionComponent$25.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/CoreActionComponent$26.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/CoreActionComponent$26.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/CoreActionComponent$27.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/CoreActionComponent$27.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/CoreActionComponent$3.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/CoreActionComponent$3.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/CoreActionComponent$4.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/CoreActionComponent$4.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/CoreActionComponent$5.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/CoreActionComponent$5.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/CoreActionComponent$6.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/CoreActionComponent$6.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/CoreActionComponent$7.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/CoreActionComponent$7.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/CoreActionComponent$8.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/CoreActionComponent$8.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/CoreActionComponent$9.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/CoreActionComponent$9.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/CoreActionComponent.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/CoreActionComponent.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/CoreActionType.__Dispatch_Table.getType()Lcom/dmdirc/actions/interfaces/ActionMetaType;
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/interfaces/ActionComparison.__Descendant_Table[com/dmdirc/actions/CoreActionComparison$10]
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/interfaces/ActionComparison.__Descendant_Table[com/dmdirc/actions/CoreActionComparison$11]
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/interfaces/ActionComparison.__Descendant_Table[com/dmdirc/actions/CoreActionComparison$12]
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/interfaces/ActionComparison.__Descendant_Table[com/dmdirc/actions/CoreActionComparison$1]
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/interfaces/ActionComparison.__Descendant_Table[com/dmdirc/actions/CoreActionComparison$2]
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/interfaces/ActionComparison.__Descendant_Table[com/dmdirc/actions/CoreActionComparison$3]
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/interfaces/ActionComparison.__Descendant_Table[com/dmdirc/actions/CoreActionComparison$4]
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/interfaces/ActionComparison.__Descendant_Table[com/dmdirc/actions/CoreActionComparison$5]
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/interfaces/ActionComparison.__Descendant_Table[com/dmdirc/actions/CoreActionComparison$6]
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/interfaces/ActionComparison.__Descendant_Table[com/dmdirc/actions/CoreActionComparison$7]
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/interfaces/ActionComparison.__Descendant_Table[com/dmdirc/actions/CoreActionComparison$8]
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/interfaces/ActionComparison.__Descendant_Table[com/dmdirc/actions/CoreActionComparison$9]
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/interfaces/ActionComparison.__Descendant_Table[com/dmdirc/actions/CoreActionComparison]
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/interfaces/ActionComparison.__Descendant_Table[com/dmdirc/actions/interfaces/ActionComparison]
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/interfaces/ActionComparison.__Descendant_Table[others]
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/interfaces/ActionComparison.__Dispatch_Table.test(Ljava/lang/Object;Ljava/lang/Object;)Z
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/interfaces/ActionComponent.__Descendant_Table[others]
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/interfaces/ActionComponent.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/interfaces/ActionComponent.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/interfaces/ActionMetaType]
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/ActionEvents]
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/ChannelEvents]
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/ClientEvents]
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/PluginEvents]
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/QueryEvents]
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/ServerEvents]
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/addons/dcc/actions/DCCEvents]
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[others]
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/interfaces/ActionMetaType.__Dispatch_Table.getArgTypes()[Ljava/lang/Class;
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/interfaces/ActionType.__Descendant_Table[com/dmdirc/actions/CoreActionType]
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/interfaces/ActionType.__Descendant_Table[com/dmdirc/actions/interfaces/ActionType]
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/interfaces/ActionType.__Descendant_Table[com/dmdirc/addons/dcc/actions/DCCActions]
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/interfaces/ActionType.__Descendant_Table[others]
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/interfaces/ActionType.__Dispatch_Table.getType()Lcom/dmdirc/actions/interfaces/ActionMetaType;
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/metatypes/ActionEvents.__Dispatch_Table.getArgTypes()[Ljava/lang/Class;
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/metatypes/ChannelEvents.__Dispatch_Table.getArgTypes()[Ljava/lang/Class;
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/metatypes/ClientEvents.__Dispatch_Table.getArgTypes()[Ljava/lang/Class;
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/metatypes/PluginEvents.__Dispatch_Table.getArgTypes()[Ljava/lang/Class;
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/metatypes/QueryEvents.__Dispatch_Table.getArgTypes()[Ljava/lang/Class;
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/actions/metatypes/ServerEvents.__Dispatch_Table.getArgTypes()[Ljava/lang/Class;
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/addons/dcc/DCCChatWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/InputWindow;
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/addons/dcc/DCCChatWindow.__Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/addons/dcc/DCCFrame.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/InputWindow;
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/addons/dcc/DCCFrame.__Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/addons/dcc/DCCPlugin$3.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/InputWindow;
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/addons/dcc/DCCPlugin$3.__Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/addons/dcc/DCCSendWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/InputWindow;
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/addons/dcc/DCCSendWindow.__Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/addons/dcc/actions/DCCActions.__Dispatch_Table.getType()Lcom/dmdirc/actions/interfaces/ActionMetaType;
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/addons/dcc/actions/DCCEvents.__Dispatch_Table.getArgTypes()[Ljava/lang/Class;
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): format
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): format._tainted
    //#input(void triggerActions(ActionType, StringBuffer, Object[])): type
    //#output(void triggerActions(ActionType, StringBuffer, Object[])): com/dmdirc/ServerManager.me
    //#output(void triggerActions(ActionType, StringBuffer, Object[])): format._tainted
    //#output(void triggerActions(ActionType, StringBuffer, Object[])): new ArrayList(ServerManager#1) num objects
    //#output(void triggerActions(ActionType, StringBuffer, Object[])): new ServerManager(getServerManager#1) num objects
    //#output(void triggerActions(ActionType, StringBuffer, Object[])): new ServerManager(getServerManager#1).__Tag
    //#output(void triggerActions(ActionType, StringBuffer, Object[])): new ServerManager(getServerManager#1).servers
    //#new obj(void triggerActions(ActionType, StringBuffer, Object[])): new ArrayList(ServerManager#1)
    //#new obj(void triggerActions(ActionType, StringBuffer, Object[])): new ServerManager(getServerManager#1)
    //#pre[1] (void triggerActions(ActionType, StringBuffer, Object[])): (soft) arguments != null
    //#pre[3] (void triggerActions(ActionType, StringBuffer, Object[])): (soft) init'ed(arguments[0])
    //#pre[4] (void triggerActions(ActionType, StringBuffer, Object[])): (soft) arguments[0].__Tag in {com/dmdirc/Channel, com/dmdirc/CustomWindow, com/dmdirc/FrameContainer, com/dmdirc/GlobalWindow, com/dmdirc/MessageTarget, com/dmdirc/Query, com/dmdirc/Raw, com/dmdirc/Server, com/dmdirc/WritableFrameContainer, com/dmdirc/addons/dcc/DCCChatWindow, com/dmdirc/addons/dcc/DCCFrame, com/dmdirc/addons/dcc/DCCPlugin$3, com/dmdirc/addons/dcc/DCCSendWindow}
    //#pre[5] (void triggerActions(ActionType, StringBuffer, Object[])): (soft) init'ed(arguments[1])
    //#pre[7] (void triggerActions(ActionType, StringBuffer, Object[])): (soft) arguments[1].length in {1..4_294_967_295}
    //#pre[9] (void triggerActions(ActionType, StringBuffer, Object[])): (soft) init'ed(arguments[2])
    //#pre[11] (void triggerActions(ActionType, StringBuffer, Object[])): (soft) arguments[2].length in {1..4_294_967_295}
    //#pre[13] (void triggerActions(ActionType, StringBuffer, Object[])): (soft) init'ed(arguments[3..4_294_967_295])
    //#pre[18] (void triggerActions(ActionType, StringBuffer, Object[])): (soft) init'ed(com.dmdirc.actions.ConditionTree$1__static_init.new int[](ConditionTree$1__static_init#1)[0..4_294_967_295])
    //#pre[19] (void triggerActions(ActionType, StringBuffer, Object[])): (soft) com/dmdirc/Main.controller != null
    //#pre[22] (void triggerActions(ActionType, StringBuffer, Object[])): (soft) init'ed(com/dmdirc/ServerManager.me)
    //#presumption(void triggerActions(ActionType, StringBuffer, Object[])): action.conditions@395 != null
    //#presumption(void triggerActions(ActionType, StringBuffer, Object[])): action.response.length@395 <= 4_294_967_295
    //#presumption(void triggerActions(ActionType, StringBuffer, Object[])): action.response@395 != null
    //#presumption(void triggerActions(ActionType, StringBuffer, Object[])): action.triggers.length@395 >= 1
    //#presumption(void triggerActions(ActionType, StringBuffer, Object[])): action.triggers@395 != null
    //#presumption(void triggerActions(ActionType, StringBuffer, Object[])): action.triggers[0].__Tag@395 in {com/dmdirc/actions/CoreActionType, com/dmdirc/actions/interfaces/ActionType, com/dmdirc/addons/dcc/actions/DCCActions}
    //#presumption(void triggerActions(ActionType, StringBuffer, Object[])): action.triggers[0].type.__Tag@395 in {com/dmdirc/actions/interfaces/ActionMetaType, com/dmdirc/actions/metatypes/ActionEvents, com/dmdirc/actions/metatypes/ChannelEvents, com/dmdirc/actions/metatypes/ClientEvents, com/dmdirc/actions/metatypes/PluginEvents, com/dmdirc/actions/metatypes/QueryEvents, com/dmdirc/actions/metatypes/ServerEvents, com/dmdirc/addons/dcc/actions/DCCEvents}
    //#presumption(void triggerActions(ActionType, StringBuffer, Object[])): action.triggers[0].type.__Tag@395 in {com/dmdirc/actions/interfaces/ActionMetaType, com/dmdirc/actions/metatypes/ActionEvents, com/dmdirc/actions/metatypes/ChannelEvents, com/dmdirc/actions/metatypes/ClientEvents, com/dmdirc/actions/metatypes/PluginEvents, com/dmdirc/actions/metatypes/QueryEvents, com/dmdirc/actions/metatypes/ServerEvents, com/dmdirc/addons/dcc/actions/DCCEvents}
    //#presumption(void triggerActions(ActionType, StringBuffer, Object[])): action.triggers[0].type@395 != null
    //#presumption(void triggerActions(ActionType, StringBuffer, Object[])): action.triggers[0].type@395 != null
    //#presumption(void triggerActions(ActionType, StringBuffer, Object[])): action.triggers[0]@395 != null
    //#presumption(void triggerActions(ActionType, StringBuffer, Object[])): java.util.ArrayList:iterator(...)@395 != null
    //#presumption(void triggerActions(ActionType, StringBuffer, Object[])): java.util.Iterator:next(...).__Tag@395 == com/dmdirc/actions/Action
    //#presumption(void triggerActions(ActionType, StringBuffer, Object[])): java.util.Iterator:next(...)@395 != null
    //#post(void triggerActions(ActionType, StringBuffer, Object[])): init'ed(com/dmdirc/ServerManager.me)
    //#post(void triggerActions(ActionType, StringBuffer, Object[])): init'ed(format._tainted)
    //#post(void triggerActions(ActionType, StringBuffer, Object[])): new ArrayList(ServerManager#1) num objects == 0
    //#post(void triggerActions(ActionType, StringBuffer, Object[])): new ServerManager(getServerManager#1) num objects == 0
    //#post(void triggerActions(ActionType, StringBuffer, Object[])): init'ed(new ServerManager(getServerManager#1).__Tag)
    //#post(void triggerActions(ActionType, StringBuffer, Object[])): init'ed(new ServerManager(getServerManager#1).servers)
    //#unanalyzed(void triggerActions(ActionType, StringBuffer, Object[])): Effects-of-calling:java.util.ArrayList
    //#unanalyzed(void triggerActions(ActionType, StringBuffer, Object[])): Effects-of-calling:com.dmdirc.logger.Logger:assertTrue
    //#unanalyzed(void triggerActions(ActionType, StringBuffer, Object[])): Effects-of-calling:java.util.List:add
    //#unanalyzed(void triggerActions(ActionType, StringBuffer, Object[])): Effects-of-calling:getType
    //#unanalyzed(void triggerActions(ActionType, StringBuffer, Object[])): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(void triggerActions(ActionType, StringBuffer, Object[])): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(void triggerActions(ActionType, StringBuffer, Object[])): Effects-of-calling:java.util.List:iterator
    //#unanalyzed(void triggerActions(ActionType, StringBuffer, Object[])): Effects-of-calling:java.lang.Object:equals
    //#unanalyzed(void triggerActions(ActionType, StringBuffer, Object[])): Effects-of-calling:appliesTo
    //#unanalyzed(void triggerActions(ActionType, StringBuffer, Object[])): Effects-of-calling:com.dmdirc.actions.ConditionTree$OPERATION:ordinal
    //#unanalyzed(void triggerActions(ActionType, StringBuffer, Object[])): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void triggerActions(ActionType, StringBuffer, Object[])): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void triggerActions(ActionType, StringBuffer, Object[])): Effects-of-calling:java.util.List:size
    //#unanalyzed(void triggerActions(ActionType, StringBuffer, Object[])): Effects-of-calling:java.util.Deque:pollFirst
    //#unanalyzed(void triggerActions(ActionType, StringBuffer, Object[])): Effects-of-calling:java.lang.Character:instanceof
    //#unanalyzed(void triggerActions(ActionType, StringBuffer, Object[])): Effects-of-calling:java.lang.Character:charValue
    //#unanalyzed(void triggerActions(ActionType, StringBuffer, Object[])): Effects-of-calling:java.util.Deque:isEmpty
    //#unanalyzed(void triggerActions(ActionType, StringBuffer, Object[])): Effects-of-calling:readTerm
    //#unanalyzed(void triggerActions(ActionType, StringBuffer, Object[])): Effects-of-calling:java.util.ArrayDeque
    //#unanalyzed(void triggerActions(ActionType, StringBuffer, Object[])): Effects-of-calling:java.util.Deque:pollLast
    //#unanalyzed(void triggerActions(ActionType, StringBuffer, Object[])): Effects-of-calling:java.util.Deque:addFirst
    //#unanalyzed(void triggerActions(ActionType, StringBuffer, Object[])): Effects-of-calling:parseStack
    //#unanalyzed(void triggerActions(ActionType, StringBuffer, Object[])): Effects-of-calling:java.util.Deque:poll
    //#unanalyzed(void triggerActions(ActionType, StringBuffer, Object[])): Effects-of-calling:java.util.Deque:add
    //#unanalyzed(void triggerActions(ActionType, StringBuffer, Object[])): Effects-of-calling:java.util.Deque:size
    //#unanalyzed(void triggerActions(ActionType, StringBuffer, Object[])): Effects-of-calling:java.lang.String:length
    //#unanalyzed(void triggerActions(ActionType, StringBuffer, Object[])): Effects-of-calling:java.lang.String:charAt
    //#unanalyzed(void triggerActions(ActionType, StringBuffer, Object[])): Effects-of-calling:java.lang.String:valueOf
    //#unanalyzed(void triggerActions(ActionType, StringBuffer, Object[])): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void triggerActions(ActionType, StringBuffer, Object[])): Effects-of-calling:java.lang.Integer:parseInt
    //#unanalyzed(void triggerActions(ActionType, StringBuffer, Object[])): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(void triggerActions(ActionType, StringBuffer, Object[])): Effects-of-calling:java.lang.Character:valueOf
    //#unanalyzed(void triggerActions(ActionType, StringBuffer, Object[])): Effects-of-calling:java.lang.StringBuilder:length
    //#unanalyzed(void triggerActions(ActionType, StringBuffer, Object[])): Effects-of-calling:com.dmdirc.config.IdentityManager:getGlobalConfig
    //#unanalyzed(void triggerActions(ActionType, StringBuffer, Object[])): Effects-of-calling:com.dmdirc.config.ConfigManager:getOptions
    //#unanalyzed(void triggerActions(ActionType, StringBuffer, Object[])): Effects-of-calling:java.lang.StringBuilder:indexOf
    //#unanalyzed(void triggerActions(ActionType, StringBuffer, Object[])): Effects-of-calling:java.lang.StringBuilder:replace
    //#unanalyzed(void triggerActions(ActionType, StringBuffer, Object[])): Effects-of-calling:java.util.Map:entrySet
    //#unanalyzed(void triggerActions(ActionType, StringBuffer, Object[])): Effects-of-calling:java.util.Set:iterator
    //#unanalyzed(void triggerActions(ActionType, StringBuffer, Object[])): Effects-of-calling:java.util.Map$Entry:getKey
    //#unanalyzed(void triggerActions(ActionType, StringBuffer, Object[])): Effects-of-calling:java.util.Map$Entry:getValue
    //#unanalyzed(void triggerActions(ActionType, StringBuffer, Object[])): Effects-of-calling:[Ljava.lang.String;:instanceof
    //#unanalyzed(void triggerActions(ActionType, StringBuffer, Object[])): Effects-of-calling:java.lang.String:instanceof
    //#unanalyzed(void triggerActions(ActionType, StringBuffer, Object[])): Effects-of-calling:java.lang.String:split
    //#unanalyzed(void triggerActions(ActionType, StringBuffer, Object[])): Effects-of-calling:java.lang.StringBuffer
    //#unanalyzed(void triggerActions(ActionType, StringBuffer, Object[])): Effects-of-calling:java.lang.StringBuffer:length
    //#unanalyzed(void triggerActions(ActionType, StringBuffer, Object[])): Effects-of-calling:java.lang.StringBuffer:insert
    //#unanalyzed(void triggerActions(ActionType, StringBuffer, Object[])): Effects-of-calling:java.lang.StringBuffer:toString
    //#unanalyzed(void triggerActions(ActionType, StringBuffer, Object[])): Effects-of-calling:doServerSubstitutions
    //#unanalyzed(void triggerActions(ActionType, StringBuffer, Object[])): Effects-of-calling:doComponentSubstitutions
    //#unanalyzed(void triggerActions(ActionType, StringBuffer, Object[])): Effects-of-calling:getServer
    //#unanalyzed(void triggerActions(ActionType, StringBuffer, Object[])): Effects-of-calling:getState
    //#unanalyzed(void triggerActions(ActionType, StringBuffer, Object[])): Effects-of-calling:com.dmdirc.ServerState:equals
    //#unanalyzed(void triggerActions(ActionType, StringBuffer, Object[])): Effects-of-calling:getCompatibleComponents
    //#unanalyzed(void triggerActions(ActionType, StringBuffer, Object[])): Effects-of-calling:java.lang.Object:toString
    //#unanalyzed(void triggerActions(ActionType, StringBuffer, Object[])): Effects-of-calling:get
    //#unanalyzed(void triggerActions(ActionType, StringBuffer, Object[])): Effects-of-calling:getArgTypes
    //#unanalyzed(void triggerActions(ActionType, StringBuffer, Object[])): Effects-of-calling:test
    //#unanalyzed(void triggerActions(ActionType, StringBuffer, Object[])): Effects-of-calling:evaluate
    //#unanalyzed(void triggerActions(ActionType, StringBuffer, Object[])): Effects-of-calling:getUI
    //#unanalyzed(void triggerActions(ActionType, StringBuffer, Object[])): Effects-of-calling:com.dmdirc.ui.interfaces.UIController:getActiveWindow
    //#unanalyzed(void triggerActions(ActionType, StringBuffer, Object[])): Effects-of-calling:getFrame
    //#unanalyzed(void triggerActions(ActionType, StringBuffer, Object[])): Effects-of-calling:com.dmdirc.ui.interfaces.InputWindow:instanceof
    //#unanalyzed(void triggerActions(ActionType, StringBuffer, Object[])): Effects-of-calling:java.util.List:get
    //#unanalyzed(void triggerActions(ActionType, StringBuffer, Object[])): Effects-of-calling:com.dmdirc.commandparser.parsers.GlobalCommandParser:getGlobalCommandParser
    //#unanalyzed(void triggerActions(ActionType, StringBuffer, Object[])): Effects-of-calling:com.dmdirc.ui.interfaces.InputWindow:getCommandParser
    //#unanalyzed(void triggerActions(ActionType, StringBuffer, Object[])): Effects-of-calling:com.dmdirc.commandparser.parsers.CommandParser:parseCommand
    //#unanalyzed(void triggerActions(ActionType, StringBuffer, Object[])): Effects-of-calling:java.lang.StringBuffer:setLength
    //#unanalyzed(void triggerActions(ActionType, StringBuffer, Object[])): Effects-of-calling:java.lang.StringBuffer:append
    //#test_vector(void triggerActions(ActionType, StringBuffer, Object[])): com.dmdirc.util.MapList:containsKey(...)@394: {0}, {1}
    //#test_vector(void triggerActions(ActionType, StringBuffer, Object[])): java.util.Iterator:hasNext(...)@395: {0}, {1}

        if (actions.containsKey(type)) {
    //#ActionManager.java:394: Warning: method not available - call not analyzed
    //#    call on bool com.dmdirc.util.MapList:containsKey(Object)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.ActionManager
    //#    method: void triggerActions(ActionType, StringBuffer, Object[])
    //#    unanalyzed callee: bool com.dmdirc.util.MapList:containsKey(Object)
            for (Action action : new ArrayList<Action>(actions.get(type))) {
    //#ActionManager.java:395: Warning: method not available - call not analyzed
    //#    call on List com.dmdirc.util.MapList:get(Object)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.ActionManager
    //#    method: void triggerActions(ActionType, StringBuffer, Object[])
    //#    unanalyzed callee: List com.dmdirc.util.MapList:get(Object)
                action.trigger(format, arguments);
            }
        }
    }
    //#ActionManager.java:399: end of method: void com.dmdirc.actions.ActionManager.triggerActions(ActionType, StringBuffer, Object[])

    /**
     * Returns the directory that should be used to store actions.
     *
     * @return The directory that should be used to store actions
     */
    public static String getDirectory() {
        return Main.getConfigDir() + "actions" + System.getProperty("file.separator");
    //#ActionManager.java:407: method: String com.dmdirc.actions.ActionManager.getDirectory()
    //#input(String getDirectory()): ".DMDirc"._tainted
    //#input(String getDirectory()): "DMDirc"._tainted
    //#input(String getDirectory()): "Library"._tainted
    //#input(String getDirectory()): "Preferences"._tainted
    //#input(String getDirectory()): "actions"._tainted
    //#input(String getDirectory()): com/dmdirc/Main.configdir
    //#input(String getDirectory()): com/dmdirc/Main.configdir._tainted
    //#output(String getDirectory()): com/dmdirc/Main.configdir
    //#output(String getDirectory()): java.lang.StringBuilder:toString(...)._tainted
    //#output(String getDirectory()): return_value
    //#new obj(String getDirectory()): java.lang.StringBuilder:toString(...)
    //#pre[2] (String getDirectory()): init'ed(com/dmdirc/Main.configdir)
    //#post(String getDirectory()): com/dmdirc/Main.configdir == One-of{old com/dmdirc/Main.configdir, &java.lang.StringBuilder:toString(...)}
    //#post(String getDirectory()): com/dmdirc/Main.configdir != null
    //#post(String getDirectory()): init'ed(java.lang.StringBuilder:toString(...)._tainted)
    //#post(String getDirectory()): java.lang.StringBuilder:toString(...)._tainted == 0
    //#post(String getDirectory()): return_value == &java.lang.StringBuilder:toString(...)
    //#unanalyzed(String getDirectory()): Effects-of-calling:java.lang.System:getProperty
    //#unanalyzed(String getDirectory()): Effects-of-calling:java.lang.String:startsWith
    //#unanalyzed(String getDirectory()): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(String getDirectory()): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(String getDirectory()): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(String getDirectory()): Effects-of-calling:java.lang.System:getenv
    //#ActionManager.java:407: end of method: String com.dmdirc.actions.ActionManager.getDirectory()
    }

    /**
     * Creates a new group with the specified name.
     *
     * @param group The group to be created
     * 
     * @return The newly created group
     */
    @Precondition({
        "The specified group is non-null and not empty",
        "The specified group is not an existing group"
    })
    public static ActionGroup makeGroup(final String group) {
        Logger.assertTrue(group != null);
    //#ActionManager.java:422: method: ActionGroup com.dmdirc.actions.ActionManager.makeGroup(String)
    //#ActionManager.java:422: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.logger.Logger:assertTrue(bool)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.ActionManager
    //#    method: ActionGroup makeGroup(String)
    //#    unanalyzed callee: void com.dmdirc.logger.Logger:assertTrue(bool)
    //#input(ActionGroup makeGroup(String)): ".DMDirc"._tainted
    //#input(ActionGroup makeGroup(String)): "DMDirc"._tainted
    //#input(ActionGroup makeGroup(String)): "Library"._tainted
    //#input(ActionGroup makeGroup(String)): "Preferences"._tainted
    //#input(ActionGroup makeGroup(String)): "Unable to create action group directory&#10;&#10;Dir: "._tainted
    //#input(ActionGroup makeGroup(String)): "actions"._tainted
    //#input(ActionGroup makeGroup(String)): com/dmdirc/Main.configdir
    //#input(ActionGroup makeGroup(String)): com/dmdirc/Main.configdir._tainted
    //#input(ActionGroup makeGroup(String)): group
    //#input(ActionGroup makeGroup(String)): group._tainted
    //#input(ActionGroup makeGroup(String)): groups
    //#output(ActionGroup makeGroup(String)): com/dmdirc/Main.configdir
    //#output(ActionGroup makeGroup(String)): java.lang.StringBuilder:toString(...)._tainted
    //#output(ActionGroup makeGroup(String)): new ActionGroup(makeGroup#3) num objects
    //#output(ActionGroup makeGroup(String)): new ActionGroup(makeGroup#3).__Tag
    //#output(ActionGroup makeGroup(String)): new ActionGroup(makeGroup#3).actions
    //#output(ActionGroup makeGroup(String)): new ActionGroup(makeGroup#3).author
    //#output(ActionGroup makeGroup(String)): new ActionGroup(makeGroup#3).component
    //#output(ActionGroup makeGroup(String)): new ActionGroup(makeGroup#3).description
    //#output(ActionGroup makeGroup(String)): new ActionGroup(makeGroup#3).name
    //#output(ActionGroup makeGroup(String)): new ActionGroup(makeGroup#3).settings
    //#output(ActionGroup makeGroup(String)): new ActionGroup(makeGroup#3).version
    //#output(ActionGroup makeGroup(String)): new ArrayList(ActionGroup#1) num objects
    //#output(ActionGroup makeGroup(String)): new HashMap(ActionGroup#2) num objects
    //#output(ActionGroup makeGroup(String)): return_value
    //#new obj(ActionGroup makeGroup(String)): java.lang.StringBuilder:toString(...)
    //#new obj(ActionGroup makeGroup(String)): new ActionGroup(makeGroup#3)
    //#new obj(ActionGroup makeGroup(String)): new ArrayList(ActionGroup#1)
    //#new obj(ActionGroup makeGroup(String)): new HashMap(ActionGroup#2)
    //#pre[2] (ActionGroup makeGroup(String)): group != null
    //#pre[4] (ActionGroup makeGroup(String)): init'ed(com/dmdirc/Main.configdir)
    //#presumption(ActionGroup makeGroup(String)): java.io.File:mkdir(...)@427 == 1
    //#post(ActionGroup makeGroup(String)): com/dmdirc/Main.configdir == One-of{old com/dmdirc/Main.configdir, &java.lang.StringBuilder:toString(...)}
    //#post(ActionGroup makeGroup(String)): com/dmdirc/Main.configdir != null
    //#post(ActionGroup makeGroup(String)): java.lang.StringBuilder:toString(...)._tainted == 0
    //#post(ActionGroup makeGroup(String)): return_value == &new ActionGroup(makeGroup#3)
    //#post(ActionGroup makeGroup(String)): new ActionGroup(makeGroup#3) num objects == 1
    //#post(ActionGroup makeGroup(String)): new ActionGroup(makeGroup#3).__Tag == com/dmdirc/actions/ActionGroup
    //#post(ActionGroup makeGroup(String)): new ActionGroup(makeGroup#3).actions == &new ArrayList(ActionGroup#1)
    //#post(ActionGroup makeGroup(String)): init'ed(new ActionGroup(makeGroup#3).author)
    //#post(ActionGroup makeGroup(String)): init'ed(new ActionGroup(makeGroup#3).component)
    //#post(ActionGroup makeGroup(String)): init'ed(new ActionGroup(makeGroup#3).description)
    //#post(ActionGroup makeGroup(String)): new ActionGroup(makeGroup#3).name == group
    //#post(ActionGroup makeGroup(String)): new ActionGroup(makeGroup#3).name != null
    //#post(ActionGroup makeGroup(String)): new ActionGroup(makeGroup#3).settings == &new HashMap(ActionGroup#2)
    //#post(ActionGroup makeGroup(String)): init'ed(new ActionGroup(makeGroup#3).version)
    //#post(ActionGroup makeGroup(String)): new ArrayList(ActionGroup#1) num objects == 1
    //#post(ActionGroup makeGroup(String)): new HashMap(ActionGroup#2) num objects == 1
    //#unanalyzed(ActionGroup makeGroup(String)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(ActionGroup makeGroup(String)): Effects-of-calling:getConfigDir
    //#unanalyzed(ActionGroup makeGroup(String)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(ActionGroup makeGroup(String)): Effects-of-calling:java.lang.System:getProperty
    //#unanalyzed(ActionGroup makeGroup(String)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(ActionGroup makeGroup(String)): Effects-of-calling:java.util.ArrayList
    //#unanalyzed(ActionGroup makeGroup(String)): Effects-of-calling:java.util.HashMap
    //#unanalyzed(ActionGroup makeGroup(String)): Effects-of-calling:java.lang.String:startsWith
    //#unanalyzed(ActionGroup makeGroup(String)): Effects-of-calling:java.lang.System:getenv
    //#test_vector(ActionGroup makeGroup(String)): java.io.File:isDirectory(...)@427: {1}, {0}
        Logger.assertTrue(!group.isEmpty());
    //#ActionManager.java:423: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.logger.Logger:assertTrue(bool)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.ActionManager
    //#    method: ActionGroup makeGroup(String)
    //#    unanalyzed callee: void com.dmdirc.logger.Logger:assertTrue(bool)
        Logger.assertTrue(!groups.containsKey(group));
    //#ActionManager.java:424: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.logger.Logger:assertTrue(bool)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.ActionManager
    //#    method: ActionGroup makeGroup(String)
    //#    unanalyzed callee: void com.dmdirc.logger.Logger:assertTrue(bool)

        final File file = new File(getDirectory() + group);
        if (file.isDirectory() || file.mkdir()) {
            final ActionGroup actionGroup = new ActionGroup(group);
            groups.put(group, actionGroup);
            return actionGroup;
        } else {
            throw new IllegalArgumentException("Unable to create action group directory"
    //#ActionManager.java:432: end of method: ActionGroup com.dmdirc.actions.ActionManager.makeGroup(String)
                    + "\n\nDir: " + getDirectory() + group);
        }
    }

    /**
     * Removes the group with the specified name.
     *
     * @param group The group to be removed
     */
    @Precondition({
        "The specified group is non-null and not empty",
        "The specified group is an existing group"
    })
    public static void removeGroup(final String group) {
        Logger.assertTrue(group != null);
    //#ActionManager.java:447: method: void com.dmdirc.actions.ActionManager.removeGroup(String)
    //#ActionManager.java:447: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.logger.Logger:assertTrue(bool)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.ActionManager
    //#    method: void removeGroup(String)
    //#    unanalyzed callee: void com.dmdirc.logger.Logger:assertTrue(bool)
    //#input(void removeGroup(String)): ".DMDirc"._tainted
    //#input(void removeGroup(String)): "DMDirc"._tainted
    //#input(void removeGroup(String)): "Library"._tainted
    //#input(void removeGroup(String)): "Preferences"._tainted
    //#input(void removeGroup(String)): "Unable to remove directory: "._tainted
    //#input(void removeGroup(String)): "Unable to remove file: "._tainted
    //#input(void removeGroup(String)): "actions"._tainted
    //#input(void removeGroup(String)): actions
    //#input(void removeGroup(String)): com.dmdirc.logger.ErrorLevel.MEDIUM
    //#input(void removeGroup(String)): com/dmdirc/Main.configdir
    //#input(void removeGroup(String)): com/dmdirc/Main.configdir._tainted
    //#input(void removeGroup(String)): com/dmdirc/Server.__Descendant_Table[com/dmdirc/Server]
    //#input(void removeGroup(String)): com/dmdirc/Server.__Descendant_Table[others]
    //#input(void removeGroup(String)): com/dmdirc/Server.__Dispatch_Table.getTabCompleter()Lcom/dmdirc/ui/input/TabCompleter;
    //#input(void removeGroup(String)): com/dmdirc/ServerManager.__Class_Obj.__Lock
    //#input(void removeGroup(String)): com/dmdirc/ServerManager.me
    //#input(void removeGroup(String)): com/dmdirc/ServerManager.me.servers
    //#input(void removeGroup(String)): com/dmdirc/actions/Action.__Descendant_Table[com/dmdirc/actions/Action]
    //#input(void removeGroup(String)): com/dmdirc/actions/Action.__Descendant_Table[others]
    //#input(void removeGroup(String)): com/dmdirc/actions/Action.__Dispatch_Table.getConditions()Ljava/util/List;
    //#input(void removeGroup(String)): com/dmdirc/actions/Action.__Dispatch_Table.getGroup()Ljava/lang/String;
    //#input(void removeGroup(String)): com/dmdirc/actions/Action.__Dispatch_Table.getTriggers()[Lcom/dmdirc/actions/interfaces/ActionType;
    //#input(void removeGroup(String)): com/dmdirc/actions/ActionCondition.__Descendant_Table[com/dmdirc/actions/ActionCondition]
    //#input(void removeGroup(String)): com/dmdirc/actions/ActionCondition.__Descendant_Table[others]
    //#input(void removeGroup(String)): com/dmdirc/actions/ActionCondition.__Dispatch_Table.getArg()I
    //#input(void removeGroup(String)): com/dmdirc/actions/ActionCondition.__Dispatch_Table.getTarget()Ljava/lang/String;
    //#input(void removeGroup(String)): com/dmdirc/actions/ActionGroup.__Descendant_Table[com/dmdirc/actions/ActionGroup]
    //#input(void removeGroup(String)): com/dmdirc/actions/ActionGroup.__Descendant_Table[com/dmdirc/actions/wrappers/AliasWrapper]
    //#input(void removeGroup(String)): com/dmdirc/actions/ActionGroup.__Descendant_Table[com/dmdirc/actions/wrappers/PerformWrapper]
    //#input(void removeGroup(String)): com/dmdirc/actions/ActionGroup.__Descendant_Table[others]
    //#input(void removeGroup(String)): com/dmdirc/actions/ActionGroup.__Dispatch_Table.getActions()Ljava/util/List;
    //#input(void removeGroup(String)): com/dmdirc/actions/ActionGroup.__Dispatch_Table.remove(Lcom/dmdirc/actions/Action;)V
    //#input(void removeGroup(String)): com/dmdirc/actions/CoreActionType.UNKNOWN_COMMAND
    //#input(void removeGroup(String)): com/dmdirc/actions/wrappers/AliasWrapper.__Dispatch_Table.getActions()Ljava/util/List;
    //#input(void removeGroup(String)): com/dmdirc/actions/wrappers/AliasWrapper.__Dispatch_Table.remove(Lcom/dmdirc/actions/Action;)V
    //#input(void removeGroup(String)): com/dmdirc/actions/wrappers/AliasWrapper.com.dmdirc.ui.input.TabCompletionType.COMMAND
    //#input(void removeGroup(String)): com/dmdirc/actions/wrappers/PerformWrapper.__Dispatch_Table.getActions()Ljava/util/List;
    //#input(void removeGroup(String)): com/dmdirc/actions/wrappers/PerformWrapper.__Dispatch_Table.remove(Lcom/dmdirc/actions/Action;)V
    //#input(void removeGroup(String)): group
    //#input(void removeGroup(String)): group._tainted
    //#input(void removeGroup(String)): groups
    //#output(void removeGroup(String)): com/dmdirc/Main.configdir
    //#output(void removeGroup(String)): com/dmdirc/ServerManager.me
    //#output(void removeGroup(String)): java.lang.StringBuilder:toString(...)._tainted
    //#output(void removeGroup(String)): new ArrayList(ServerManager#1) num objects
    //#output(void removeGroup(String)): new ServerManager(getServerManager#1) num objects
    //#output(void removeGroup(String)): new ServerManager(getServerManager#1).__Tag
    //#output(void removeGroup(String)): new ServerManager(getServerManager#1).servers
    //#new obj(void removeGroup(String)): java.lang.StringBuilder:toString(...)
    //#new obj(void removeGroup(String)): new ArrayList(ServerManager#1)
    //#new obj(void removeGroup(String)): new ServerManager(getServerManager#1)
    //#pre[3] (void removeGroup(String)): group != null
    //#pre[5] (void removeGroup(String)): init'ed(com/dmdirc/Main.configdir)
    //#pre[6] (void removeGroup(String)): (soft) init'ed(com/dmdirc/ServerManager.me)
    //#presumption(void removeGroup(String)): arr$.length@458 <= 4_294_967_295
    //#presumption(void removeGroup(String)): arr$[i$]@458 != null
    //#presumption(void removeGroup(String)): init'ed(com.dmdirc.logger.ErrorLevel.MEDIUM)
    //#presumption(void removeGroup(String)): java.io.File:listFiles(...)@458 != null
    //#presumption(void removeGroup(String)): java.util.Iterator:next(...).__Tag@451 == com/dmdirc/actions/Action
    //#presumption(void removeGroup(String)): java.util.Iterator:next(...)@451 != null
    //#presumption(void removeGroup(String)): java.util.Map:get(...).__Tag@451 in {com/dmdirc/actions/ActionGroup, com/dmdirc/actions/wrappers/AliasWrapper, com/dmdirc/actions/wrappers/PerformWrapper}
    //#presumption(void removeGroup(String)): java.util.Map:get(...)@451 != null
    //#post(void removeGroup(String)): com/dmdirc/Main.configdir == One-of{old com/dmdirc/Main.configdir, &java.lang.StringBuilder:toString(...)}
    //#post(void removeGroup(String)): com/dmdirc/Main.configdir != null
    //#post(void removeGroup(String)): init'ed(com/dmdirc/ServerManager.me)
    //#post(void removeGroup(String)): java.lang.StringBuilder:toString(...)._tainted == 0
    //#post(void removeGroup(String)): init'ed(new ArrayList(ServerManager#1) num objects)
    //#post(void removeGroup(String)): init'ed(new ServerManager(getServerManager#1) num objects)
    //#post(void removeGroup(String)): init'ed(new ServerManager(getServerManager#1).__Tag)
    //#post(void removeGroup(String)): init'ed(new ServerManager(getServerManager#1).servers)
    //#unanalyzed(void removeGroup(String)): Effects-of-calling:com.dmdirc.logger.Logger:assertTrue
    //#unanalyzed(void removeGroup(String)): Effects-of-calling:java.util.Map:put
    //#unanalyzed(void removeGroup(String)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void removeGroup(String)): Effects-of-calling:getConfigDir
    //#unanalyzed(void removeGroup(String)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void removeGroup(String)): Effects-of-calling:java.lang.System:getProperty
    //#unanalyzed(void removeGroup(String)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void removeGroup(String)): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(void removeGroup(String)): Effects-of-calling:java.util.ArrayList
    //#unanalyzed(void removeGroup(String)): Effects-of-calling:java.util.HashMap
    //#unanalyzed(void removeGroup(String)): Effects-of-calling:java.util.List:remove
    //#unanalyzed(void removeGroup(String)): Effects-of-calling:remove
    //#unanalyzed(void removeGroup(String)): Effects-of-calling:getTriggers
    //#unanalyzed(void removeGroup(String)): Effects-of-calling:java.lang.Object:equals
    //#unanalyzed(void removeGroup(String)): Effects-of-calling:getCommandName
    //#unanalyzed(void removeGroup(String)): Effects-of-calling:java.util.List:iterator
    //#unanalyzed(void removeGroup(String)): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(void removeGroup(String)): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(void removeGroup(String)): Effects-of-calling:getTabCompleter
    //#unanalyzed(void removeGroup(String)): Effects-of-calling:com.dmdirc.ui.input.TabCompleter:removeEntry
    //#unanalyzed(void removeGroup(String)): Effects-of-calling:getConditions
    //#unanalyzed(void removeGroup(String)): Effects-of-calling:com.dmdirc.commandparser.CommandManager:getCommandChar
    //#unanalyzed(void removeGroup(String)): Effects-of-calling:java.util.Map:get
    //#unanalyzed(void removeGroup(String)): Effects-of-calling:getGroup
    //#unanalyzed(void removeGroup(String)): Effects-of-calling:com.dmdirc.util.MapList:removeFromAll
    //#unanalyzed(void removeGroup(String)): Effects-of-calling:java.lang.String:startsWith
    //#unanalyzed(void removeGroup(String)): Effects-of-calling:java.lang.System:getenv
    //#test_vector(void removeGroup(String)): java.io.File:delete(...)@459: {1}, {0}
    //#test_vector(void removeGroup(String)): java.io.File:delete(...)@467: {1}, {0}
    //#test_vector(void removeGroup(String)): java.io.File:isDirectory(...)@457: {0}, {1}
    //#test_vector(void removeGroup(String)): java.util.Iterator:hasNext(...)@451: {0}, {1}
        Logger.assertTrue(!group.isEmpty());
    //#ActionManager.java:448: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.logger.Logger:assertTrue(bool)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.ActionManager
    //#    method: void removeGroup(String)
    //#    unanalyzed callee: void com.dmdirc.logger.Logger:assertTrue(bool)
        Logger.assertTrue(groups.containsKey(group));
    //#ActionManager.java:449: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.logger.Logger:assertTrue(bool)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.ActionManager
    //#    method: void removeGroup(String)
    //#    unanalyzed callee: void com.dmdirc.logger.Logger:assertTrue(bool)

        for (Action action : groups.get(group).getActions()) {
            unregisterAction(action);
        }

        final File dir = new File(getDirectory() + group);

        if (dir.isDirectory()) {
            for (File file : dir.listFiles()) {
                if (!file.delete()) {
                    Logger.userError(ErrorLevel.MEDIUM, "Unable to remove file: "
    //#ActionManager.java:460: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.logger.Logger:userError(ErrorLevel, String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.ActionManager
    //#    method: void removeGroup(String)
    //#    unanalyzed callee: void com.dmdirc.logger.Logger:userError(ErrorLevel, String)
                            + file.getAbsolutePath());
                    return;
                }
            }
        }

        if (!dir.delete()) {
            Logger.userError(ErrorLevel.MEDIUM, "Unable to remove directory: "
    //#ActionManager.java:468: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.logger.Logger:userError(ErrorLevel, String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.ActionManager
    //#    method: void removeGroup(String)
    //#    unanalyzed callee: void com.dmdirc.logger.Logger:userError(ErrorLevel, String)
                    + dir.getAbsolutePath());
            return;
        }

        groups.remove(group);
    }
    //#ActionManager.java:474: end of method: void com.dmdirc.actions.ActionManager.removeGroup(String)

    /**
     * Renames the specified group.
     *
     * @param oldName The old name of the group
     * @param newName The new name of the group
     */
    @Precondition({
        "The old name is non-null and not empty",
        "The old name is an existing group",
        "The new name is non-null and not empty",
        "The new name is not an existing group",
        "The old name does not equal the new name"
    })
    public static void renameGroup(final String oldName, final String newName) {
        Logger.assertTrue(oldName != null);
    //#ActionManager.java:490: method: void com.dmdirc.actions.ActionManager.renameGroup(String, String)
    //#ActionManager.java:490: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.logger.Logger:assertTrue(bool)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.ActionManager
    //#    method: void renameGroup(String, String)
    //#    unanalyzed callee: void com.dmdirc.logger.Logger:assertTrue(bool)
    //#input(void renameGroup(String, String)): ".DMDirc"._tainted
    //#input(void renameGroup(String, String)): "DMDirc"._tainted
    //#input(void renameGroup(String, String)): "Invalid alias action (no name): "._tainted
    //#input(void renameGroup(String, String)): "Invalid alias action (wrong trigger): "._tainted
    //#input(void renameGroup(String, String)): "Invalid perform action: "._tainted
    //#input(void renameGroup(String, String)): "Library"._tainted
    //#input(void renameGroup(String, String)): "Preferences"._tainted
    //#input(void renameGroup(String, String)): "Unable to create action group directory&#10;&#10;Dir: "._tainted
    //#input(void renameGroup(String, String)): "Unable to remove directory: "._tainted
    //#input(void renameGroup(String, String)): "Unable to remove file: "._tainted
    //#input(void renameGroup(String, String)): "actions"._tainted
    //#input(void renameGroup(String, String)): actions
    //#input(void renameGroup(String, String)): com.dmdirc.logger.ErrorLevel.MEDIUM
    //#input(void renameGroup(String, String)): com/dmdirc/GlobalWindow.__Descendant_Table[com/dmdirc/GlobalWindow]
    //#input(void renameGroup(String, String)): com/dmdirc/GlobalWindow.__Descendant_Table[others]
    //#input(void renameGroup(String, String)): com/dmdirc/GlobalWindow.__Dispatch_Table.getTabCompleter()Lcom/dmdirc/ui/input/TabCompleter;
    //#input(void renameGroup(String, String)): com/dmdirc/GlobalWindow.globalWindow.__Tag
    //#input(void renameGroup(String, String)): com/dmdirc/GlobalWindow.globalWindow.tabCompleter
    //#input(void renameGroup(String, String)): com/dmdirc/Main.configdir
    //#input(void renameGroup(String, String)): com/dmdirc/Main.configdir._tainted
    //#input(void renameGroup(String, String)): com/dmdirc/Server.__Descendant_Table[com/dmdirc/Server]
    //#input(void renameGroup(String, String)): com/dmdirc/Server.__Descendant_Table[others]
    //#input(void renameGroup(String, String)): com/dmdirc/Server.__Dispatch_Table.getTabCompleter()Lcom/dmdirc/ui/input/TabCompleter;
    //#input(void renameGroup(String, String)): com/dmdirc/ServerManager.__Class_Obj.__Lock
    //#input(void renameGroup(String, String)): com/dmdirc/ServerManager.me
    //#input(void renameGroup(String, String)): com/dmdirc/ServerManager.me.servers
    //#input(void renameGroup(String, String)): com/dmdirc/actions/Action.__Descendant_Table[com/dmdirc/actions/Action]
    //#input(void renameGroup(String, String)): com/dmdirc/actions/Action.__Descendant_Table[others]
    //#input(void renameGroup(String, String)): com/dmdirc/actions/Action.__Dispatch_Table.getConditions()Ljava/util/List;
    //#input(void renameGroup(String, String)): com/dmdirc/actions/Action.__Dispatch_Table.getGroup()Ljava/lang/String;
    //#input(void renameGroup(String, String)): com/dmdirc/actions/Action.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(void renameGroup(String, String)): com/dmdirc/actions/Action.__Dispatch_Table.getTriggers()[Lcom/dmdirc/actions/interfaces/ActionType;
    //#input(void renameGroup(String, String)): com/dmdirc/actions/Action.__Dispatch_Table.save()V
    //#input(void renameGroup(String, String)): com/dmdirc/actions/Action.__Dispatch_Table.setGroup(Ljava/lang/String;)V
    //#input(void renameGroup(String, String)): com/dmdirc/actions/Action.java.io.File.separator
    //#input(void renameGroup(String, String)): com/dmdirc/actions/Action.java.io.File.separator._tainted
    //#input(void renameGroup(String, String)): com/dmdirc/actions/ActionCondition.__Descendant_Table[com/dmdirc/actions/ActionCondition]
    //#input(void renameGroup(String, String)): com/dmdirc/actions/ActionCondition.__Descendant_Table[others]
    //#input(void renameGroup(String, String)): com/dmdirc/actions/ActionCondition.__Dispatch_Table.getArg()I
    //#input(void renameGroup(String, String)): com/dmdirc/actions/ActionCondition.__Dispatch_Table.getComponent()Lcom/dmdirc/actions/interfaces/ActionComponent;
    //#input(void renameGroup(String, String)): com/dmdirc/actions/ActionCondition.__Dispatch_Table.getTarget()Ljava/lang/String;
    //#input(void renameGroup(String, String)): com/dmdirc/actions/ActionGroup.__Descendant_Table[com/dmdirc/actions/ActionGroup]
    //#input(void renameGroup(String, String)): com/dmdirc/actions/ActionGroup.__Descendant_Table[com/dmdirc/actions/wrappers/AliasWrapper]
    //#input(void renameGroup(String, String)): com/dmdirc/actions/ActionGroup.__Descendant_Table[com/dmdirc/actions/wrappers/PerformWrapper]
    //#input(void renameGroup(String, String)): com/dmdirc/actions/ActionGroup.__Descendant_Table[others]
    //#input(void renameGroup(String, String)): com/dmdirc/actions/ActionGroup.__Dispatch_Table.add(Lcom/dmdirc/actions/Action;)V
    //#input(void renameGroup(String, String)): com/dmdirc/actions/ActionGroup.__Dispatch_Table.getActions()Ljava/util/List;
    //#input(void renameGroup(String, String)): com/dmdirc/actions/ActionGroup.__Dispatch_Table.remove(Lcom/dmdirc/actions/Action;)V
    //#input(void renameGroup(String, String)): com/dmdirc/actions/CoreActionComponent.SERVER_NAME
    //#input(void renameGroup(String, String)): com/dmdirc/actions/CoreActionComponent.SERVER_NETWORK
    //#input(void renameGroup(String, String)): com/dmdirc/actions/CoreActionType.SERVER_CONNECTED
    //#input(void renameGroup(String, String)): com/dmdirc/actions/CoreActionType.UNKNOWN_COMMAND
    //#input(void renameGroup(String, String)): com/dmdirc/actions/wrappers/AliasWrapper.__Dispatch_Table.add(Lcom/dmdirc/actions/Action;)V
    //#input(void renameGroup(String, String)): com/dmdirc/actions/wrappers/AliasWrapper.__Dispatch_Table.getActions()Ljava/util/List;
    //#input(void renameGroup(String, String)): com/dmdirc/actions/wrappers/AliasWrapper.__Dispatch_Table.remove(Lcom/dmdirc/actions/Action;)V
    //#input(void renameGroup(String, String)): com/dmdirc/actions/wrappers/AliasWrapper.com.dmdirc.logger.ErrorLevel.MEDIUM
    //#input(void renameGroup(String, String)): com/dmdirc/actions/wrappers/AliasWrapper.com.dmdirc.ui.input.TabCompletionType.COMMAND
    //#input(void renameGroup(String, String)): com/dmdirc/actions/wrappers/PerformWrapper.__Dispatch_Table.add(Lcom/dmdirc/actions/Action;)V
    //#input(void renameGroup(String, String)): com/dmdirc/actions/wrappers/PerformWrapper.__Dispatch_Table.getActions()Ljava/util/List;
    //#input(void renameGroup(String, String)): com/dmdirc/actions/wrappers/PerformWrapper.__Dispatch_Table.remove(Lcom/dmdirc/actions/Action;)V
    //#input(void renameGroup(String, String)): com/dmdirc/actions/wrappers/PerformWrapper.com.dmdirc.logger.ErrorLevel.MEDIUM
    //#input(void renameGroup(String, String)): groups
    //#input(void renameGroup(String, String)): newName
    //#input(void renameGroup(String, String)): newName._tainted
    //#input(void renameGroup(String, String)): oldName
    //#input(void renameGroup(String, String)): oldName._tainted
    //#output(void renameGroup(String, String)): com/dmdirc/Main.configdir
    //#output(void renameGroup(String, String)): com/dmdirc/ServerManager.me
    //#output(void renameGroup(String, String)): java.lang.StringBuilder:toString(...)._tainted
    //#output(void renameGroup(String, String)): new ArrayList(ServerManager#1) num objects
    //#output(void renameGroup(String, String)): new ServerManager(getServerManager#1) num objects
    //#output(void renameGroup(String, String)): new ServerManager(getServerManager#1).__Tag
    //#output(void renameGroup(String, String)): new ServerManager(getServerManager#1).servers
    //#new obj(void renameGroup(String, String)): java.lang.StringBuilder:toString(...)
    //#new obj(void renameGroup(String, String)): new ArrayList(ServerManager#1)
    //#new obj(void renameGroup(String, String)): new ServerManager(getServerManager#1)
    //#pre[6] (void renameGroup(String, String)): newName != null
    //#pre[8] (void renameGroup(String, String)): init'ed(com/dmdirc/Main.configdir)
    //#pre[10] (void renameGroup(String, String)): oldName != null
    //#pre[9] (void renameGroup(String, String)): (soft) init'ed(com/dmdirc/ServerManager.me)
    //#presumption(void renameGroup(String, String)): getGroup(...).actions != null
    //#presumption(void renameGroup(String, String)): getGroup(...).actions != null
    //#presumption(void renameGroup(String, String)): java.util.Iterator:next(...).__Tag@500 == com/dmdirc/actions/Action
    //#presumption(void renameGroup(String, String)): java.util.Iterator:next(...)@500 != null
    //#presumption(void renameGroup(String, String)): java.util.Map:get(...).__Tag@500 in {com/dmdirc/actions/ActionGroup, com/dmdirc/actions/wrappers/AliasWrapper, com/dmdirc/actions/wrappers/PerformWrapper}
    //#presumption(void renameGroup(String, String)): java.util.Map:get(...)@309 != null
    //#presumption(void renameGroup(String, String)): java.util.Map:get(...)@309 != null
    //#presumption(void renameGroup(String, String)): java.util.Map:get(...)@309.__Tag in {com/dmdirc/actions/ActionGroup, com/dmdirc/actions/wrappers/AliasWrapper, com/dmdirc/actions/wrappers/PerformWrapper}
    //#presumption(void renameGroup(String, String)): java.util.Map:get(...)@309.__Tag in {com/dmdirc/actions/ActionGroup, com/dmdirc/actions/wrappers/AliasWrapper, com/dmdirc/actions/wrappers/PerformWrapper}
    //#presumption(void renameGroup(String, String)): java.util.Map:get(...)@500 != null
    //#post(void renameGroup(String, String)): com/dmdirc/Main.configdir != null
    //#post(void renameGroup(String, String)): init'ed(com/dmdirc/ServerManager.me)
    //#post(void renameGroup(String, String)): java.lang.StringBuilder:toString(...)._tainted == 0
    //#post(void renameGroup(String, String)): init'ed(java.lang.StringBuilder:toString(...)._tainted)
    //#post(void renameGroup(String, String)): init'ed(new ArrayList(ServerManager#1) num objects)
    //#post(void renameGroup(String, String)): init'ed(new ServerManager(getServerManager#1) num objects)
    //#post(void renameGroup(String, String)): init'ed(new ServerManager(getServerManager#1).__Tag)
    //#post(void renameGroup(String, String)): init'ed(new ServerManager(getServerManager#1).servers)
    //#unanalyzed(void renameGroup(String, String)): Effects-of-calling:com.dmdirc.logger.Logger:assertTrue
    //#unanalyzed(void renameGroup(String, String)): Effects-of-calling:getType
    //#unanalyzed(void renameGroup(String, String)): Effects-of-calling:java.util.Map:put
    //#unanalyzed(void renameGroup(String, String)): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(void renameGroup(String, String)): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(void renameGroup(String, String)): Effects-of-calling:save
    //#unanalyzed(void renameGroup(String, String)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void renameGroup(String, String)): Effects-of-calling:getConfigDir
    //#unanalyzed(void renameGroup(String, String)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void renameGroup(String, String)): Effects-of-calling:java.lang.System:getProperty
    //#unanalyzed(void renameGroup(String, String)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void renameGroup(String, String)): Effects-of-calling:java.io.File:isDirectory
    //#unanalyzed(void renameGroup(String, String)): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(void renameGroup(String, String)): Effects-of-calling:java.util.ArrayList
    //#unanalyzed(void renameGroup(String, String)): Effects-of-calling:java.util.HashMap
    //#unanalyzed(void renameGroup(String, String)): Effects-of-calling:java.io.File:listFiles
    //#unanalyzed(void renameGroup(String, String)): Effects-of-calling:java.util.List:remove
    //#unanalyzed(void renameGroup(String, String)): Effects-of-calling:remove
    //#unanalyzed(void renameGroup(String, String)): Effects-of-calling:getTriggers
    //#unanalyzed(void renameGroup(String, String)): Effects-of-calling:java.lang.Object:equals
    //#unanalyzed(void renameGroup(String, String)): Effects-of-calling:getCommandName
    //#unanalyzed(void renameGroup(String, String)): Effects-of-calling:java.util.List:iterator
    //#unanalyzed(void renameGroup(String, String)): Effects-of-calling:getTabCompleter
    //#unanalyzed(void renameGroup(String, String)): Effects-of-calling:com.dmdirc.ui.input.TabCompleter:removeEntry
    //#unanalyzed(void renameGroup(String, String)): Effects-of-calling:getConditions
    //#unanalyzed(void renameGroup(String, String)): Effects-of-calling:com.dmdirc.commandparser.CommandManager:getCommandChar
    //#unanalyzed(void renameGroup(String, String)): Effects-of-calling:java.io.File
    //#unanalyzed(void renameGroup(String, String)): Effects-of-calling:com.dmdirc.logger.Logger:userError
    //#unanalyzed(void renameGroup(String, String)): Effects-of-calling:java.util.Map:get
    //#unanalyzed(void renameGroup(String, String)): Effects-of-calling:getGroup
    //#unanalyzed(void renameGroup(String, String)): Effects-of-calling:java.util.List:get
    //#unanalyzed(void renameGroup(String, String)): Effects-of-calling:java.util.List:size
    //#unanalyzed(void renameGroup(String, String)): Effects-of-calling:add
    //#unanalyzed(void renameGroup(String, String)): Effects-of-calling:getName
    //#unanalyzed(void renameGroup(String, String)): Effects-of-calling:java.util.List:add
    //#unanalyzed(void renameGroup(String, String)): Effects-of-calling:getGlobalWindow
    //#unanalyzed(void renameGroup(String, String)): Effects-of-calling:com.dmdirc.ui.input.TabCompleter:addEntry
    //#unanalyzed(void renameGroup(String, String)): Effects-of-calling:com.dmdirc.util.MapList:removeFromAll
    //#unanalyzed(void renameGroup(String, String)): Effects-of-calling:com.dmdirc.util.MapList:containsKey
    //#unanalyzed(void renameGroup(String, String)): Effects-of-calling:com.dmdirc.util.MapList:get
    //#unanalyzed(void renameGroup(String, String)): Effects-of-calling:java.util.ArrayList:iterator
    //#unanalyzed(void renameGroup(String, String)): Effects-of-calling:trigger
    //#unanalyzed(void renameGroup(String, String)): Effects-of-calling:getArity
    //#unanalyzed(void renameGroup(String, String)): Effects-of-calling:com.dmdirc.interfaces.ActionListener:processEvent
    //#unanalyzed(void renameGroup(String, String)): Effects-of-calling:java.lang.String:isEmpty
    //#unanalyzed(void renameGroup(String, String)): Effects-of-calling:java.io.File:mkdir
    //#unanalyzed(void renameGroup(String, String)): Effects-of-calling:java.lang.IllegalArgumentException
    //#unanalyzed(void renameGroup(String, String)): Effects-of-calling:java.io.File:delete
    //#unanalyzed(void renameGroup(String, String)): Effects-of-calling:java.io.File:getAbsolutePath
    //#unanalyzed(void renameGroup(String, String)): Effects-of-calling:java.util.Map:remove
    //#unanalyzed(void renameGroup(String, String)): Effects-of-calling:com.dmdirc.util.ConfigFile
    //#unanalyzed(void renameGroup(String, String)): Effects-of-calling:java.util.Arrays:toString
    //#unanalyzed(void renameGroup(String, String)): Effects-of-calling:com.dmdirc.logger.Logger:appError
    //#unanalyzed(void renameGroup(String, String)): Effects-of-calling:java.lang.Object:toString
    //#unanalyzed(void renameGroup(String, String)): Effects-of-calling:com.dmdirc.util.ConfigFile:addDomain
    //#unanalyzed(void renameGroup(String, String)): Effects-of-calling:com.dmdirc.util.ConfigFile:getFlatDomain
    //#unanalyzed(void renameGroup(String, String)): Effects-of-calling:com.dmdirc.actions.ConditionTree$OPERATION:ordinal
    //#unanalyzed(void renameGroup(String, String)): Effects-of-calling:java.lang.String:valueOf
    //#unanalyzed(void renameGroup(String, String)): Effects-of-calling:com.dmdirc.util.ConfigFile:isKeyDomain
    //#unanalyzed(void renameGroup(String, String)): Effects-of-calling:com.dmdirc.util.ConfigFile:getKeyDomain
    //#unanalyzed(void renameGroup(String, String)): Effects-of-calling:com.dmdirc.util.ConfigFile:write
    //#unanalyzed(void renameGroup(String, String)): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(void renameGroup(String, String)): Effects-of-calling:java.io.IOException:getMessage
    //#unanalyzed(void renameGroup(String, String)): Effects-of-calling:java.lang.String:startsWith
    //#unanalyzed(void renameGroup(String, String)): Effects-of-calling:java.lang.System:getenv
    //#unanalyzed(void renameGroup(String, String)): Effects-of-calling:java.io.File:mkdirs
    //#test_vector(void renameGroup(String, String)): java.util.Iterator:hasNext(...)@500: {0}, {1}
        Logger.assertTrue(!oldName.isEmpty());
    //#ActionManager.java:491: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.logger.Logger:assertTrue(bool)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.ActionManager
    //#    method: void renameGroup(String, String)
    //#    unanalyzed callee: void com.dmdirc.logger.Logger:assertTrue(bool)
        Logger.assertTrue(newName != null);
    //#ActionManager.java:492: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.logger.Logger:assertTrue(bool)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.ActionManager
    //#    method: void renameGroup(String, String)
    //#    unanalyzed callee: void com.dmdirc.logger.Logger:assertTrue(bool)
        Logger.assertTrue(!newName.isEmpty());
    //#ActionManager.java:493: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.logger.Logger:assertTrue(bool)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.ActionManager
    //#    method: void renameGroup(String, String)
    //#    unanalyzed callee: void com.dmdirc.logger.Logger:assertTrue(bool)
        Logger.assertTrue(groups.containsKey(oldName));
    //#ActionManager.java:494: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.logger.Logger:assertTrue(bool)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.ActionManager
    //#    method: void renameGroup(String, String)
    //#    unanalyzed callee: void com.dmdirc.logger.Logger:assertTrue(bool)
        Logger.assertTrue(!groups.containsKey(newName));
    //#ActionManager.java:495: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.logger.Logger:assertTrue(bool)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.ActionManager
    //#    method: void renameGroup(String, String)
    //#    unanalyzed callee: void com.dmdirc.logger.Logger:assertTrue(bool)
        Logger.assertTrue(!newName.equals(oldName));
    //#ActionManager.java:496: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.logger.Logger:assertTrue(bool)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.ActionManager
    //#    method: void renameGroup(String, String)
    //#    unanalyzed callee: void com.dmdirc.logger.Logger:assertTrue(bool)

        makeGroup(newName);

        for (Action action : groups.get(oldName).getActions()) {
            action.setGroup(newName);
            getGroup(oldName).remove(action);
            getGroup(newName).add(action);
        }

        removeGroup(oldName);
    }
    //#ActionManager.java:507: end of method: void com.dmdirc.actions.ActionManager.renameGroup(String, String)

    /**
     * Returns the action comparison specified by the given string, or null if it
     * doesn't match a valid registered action comparison.
     *
     * @param type The name of the action comparison to try and find
     * @return The actioncomparison with the specified name, or null on failure
     */
    public static ActionType getActionType(final String type) {
        if (type == null || type.isEmpty()) {
    //#ActionManager.java:517: method: ActionType com.dmdirc.actions.ActionManager.getActionType(String)
    //#input(ActionType getActionType(String)): actionTypes
    //#input(ActionType getActionType(String)): com/dmdirc/actions/interfaces/ActionType.__Descendant_Table[com/dmdirc/actions/CoreActionType]
    //#input(ActionType getActionType(String)): com/dmdirc/actions/interfaces/ActionType.__Descendant_Table[com/dmdirc/actions/interfaces/ActionType]
    //#input(ActionType getActionType(String)): com/dmdirc/actions/interfaces/ActionType.__Descendant_Table[com/dmdirc/addons/dcc/actions/DCCActions]
    //#input(ActionType getActionType(String)): com/dmdirc/actions/interfaces/ActionType.__Descendant_Table[others]
    //#input(ActionType getActionType(String)): type
    //#output(ActionType getActionType(String)): return_value
    //#presumption(ActionType getActionType(String)): java.lang.Enum:name(...)@522 != null
    //#presumption(ActionType getActionType(String)): java.util.Iterator:next(...).__Tag@521 in {com/dmdirc/actions/CoreActionType, com/dmdirc/actions/interfaces/ActionType, com/dmdirc/addons/dcc/actions/DCCActions}
    //#presumption(ActionType getActionType(String)): java.util.Iterator:next(...)@521 != null
    //#post(ActionType getActionType(String)): init'ed(return_value)
    //#test_vector(ActionType getActionType(String)): type: Addr_Set{null}, Inverse{null}
    //#test_vector(ActionType getActionType(String)): java.lang.String:equals(...)@522: {0}, {1}
    //#test_vector(ActionType getActionType(String)): java.lang.String:isEmpty(...)@517: {0}, {1}
    //#test_vector(ActionType getActionType(String)): java.util.Iterator:hasNext(...)@521: {0}, {1}
            return null;
        }

        for (ActionType target : actionTypes) {
            if (((Enum) target).name().equals(type)) {
                return target;
            }
        }

        return null;
    //#ActionManager.java:527: end of method: ActionType com.dmdirc.actions.ActionManager.getActionType(String)
    }

    /**
     * Returns a list of action types that are compatible with the one
     * specified.
     *
     * @param type The type to be checked against
     * @return A list of compatible action types
     */
    @Precondition("The specified type is not null")
    public static List<ActionType> getCompatibleTypes(final ActionType type) {
        Logger.assertTrue(type != null);
    //#ActionManager.java:539: method: List com.dmdirc.actions.ActionManager.getCompatibleTypes(ActionType)
    //#ActionManager.java:539: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.logger.Logger:assertTrue(bool)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.ActionManager
    //#    method: List getCompatibleTypes(ActionType)
    //#    unanalyzed callee: void com.dmdirc.logger.Logger:assertTrue(bool)
    //#ActionManager.java:539: Warning: suspicious precondition
    //#    The precondition for type.__Tag is not a contiguous range of values
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.actions.ActionManager
    //#    method: List getCompatibleTypes(ActionType)
    //#    suspicious precondition index: [2]
    //#    Attribs:  Soft
    //#input(List getCompatibleTypes(ActionType)): actionTypes
    //#input(List getCompatibleTypes(ActionType)): com/dmdirc/actions/CoreActionType.__Dispatch_Table.getType()Lcom/dmdirc/actions/interfaces/ActionMetaType;
    //#input(List getCompatibleTypes(ActionType)): com/dmdirc/actions/interfaces/ActionType.__Descendant_Table[com/dmdirc/actions/CoreActionType]
    //#input(List getCompatibleTypes(ActionType)): com/dmdirc/actions/interfaces/ActionType.__Descendant_Table[com/dmdirc/actions/interfaces/ActionType]
    //#input(List getCompatibleTypes(ActionType)): com/dmdirc/actions/interfaces/ActionType.__Descendant_Table[com/dmdirc/addons/dcc/actions/DCCActions]
    //#input(List getCompatibleTypes(ActionType)): com/dmdirc/actions/interfaces/ActionType.__Descendant_Table[others]
    //#input(List getCompatibleTypes(ActionType)): com/dmdirc/actions/interfaces/ActionType.__Dispatch_Table.getType()Lcom/dmdirc/actions/interfaces/ActionMetaType;
    //#input(List getCompatibleTypes(ActionType)): com/dmdirc/addons/dcc/actions/DCCActions.__Dispatch_Table.getType()Lcom/dmdirc/actions/interfaces/ActionMetaType;
    //#input(List getCompatibleTypes(ActionType)): type
    //#input(List getCompatibleTypes(ActionType)): type.__Tag
    //#input(List getCompatibleTypes(ActionType)): type.type
    //#output(List getCompatibleTypes(ActionType)): new ArrayList(getCompatibleTypes#1) num objects
    //#output(List getCompatibleTypes(ActionType)): return_value
    //#new obj(List getCompatibleTypes(ActionType)): new ArrayList(getCompatibleTypes#1)
    //#pre[1] (List getCompatibleTypes(ActionType)): (soft) type != null
    //#pre[2] (List getCompatibleTypes(ActionType)): (soft) type.__Tag in {com/dmdirc/actions/CoreActionType, com/dmdirc/actions/interfaces/ActionType, com/dmdirc/addons/dcc/actions/DCCActions}
    //#presumption(List getCompatibleTypes(ActionType)): java.util.Iterator:next(...).__Tag@542 in {com/dmdirc/actions/CoreActionType, com/dmdirc/actions/interfaces/ActionType, com/dmdirc/addons/dcc/actions/DCCActions}
    //#presumption(List getCompatibleTypes(ActionType)): java.util.Iterator:next(...)@542 != null
    //#presumption(List getCompatibleTypes(ActionType)): target.type@542 != null
    //#presumption(List getCompatibleTypes(ActionType)): target.type@542 != null
    //#post(List getCompatibleTypes(ActionType)): return_value == &new ArrayList(getCompatibleTypes#1)
    //#post(List getCompatibleTypes(ActionType)): new ArrayList(getCompatibleTypes#1) num objects == 1
    //#test_vector(List getCompatibleTypes(ActionType)): java.lang.Object:equals(...)@543: {1}, {0}
    //#test_vector(List getCompatibleTypes(ActionType)): java.lang.Object:equals(...)@543: {0}, {1}
    //#test_vector(List getCompatibleTypes(ActionType)): java.util.Iterator:hasNext(...)@542: {0}, {1}

        final List<ActionType> res = new ArrayList<ActionType>();
        for (ActionType target : actionTypes) {
            if (!target.equals(type) && target.getType().equals(type.getType())) {
                res.add(target);
            }
        }

        return res;
    //#ActionManager.java:548: end of method: List com.dmdirc.actions.ActionManager.getCompatibleTypes(ActionType)
    }

    /**
     * Returns a list of action components that are compatible with the
     * specified class.
     *
     * @param target The class to be tested
     * @return A list of compatible action components
     */
    @Precondition("The specified target is not null")
    public static List<ActionComponent> getCompatibleComponents(final Class target) {
        Logger.assertTrue(target != null);
    //#ActionManager.java:560: method: List com.dmdirc.actions.ActionManager.getCompatibleComponents(Class)
    //#ActionManager.java:560: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.logger.Logger:assertTrue(bool)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.ActionManager
    //#    method: List getCompatibleComponents(Class)
    //#    unanalyzed callee: void com.dmdirc.logger.Logger:assertTrue(bool)
    //#input(List getCompatibleComponents(Class)): actionComponents
    //#input(List getCompatibleComponents(Class)): com/dmdirc/actions/ActionComponentChain.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(List getCompatibleComponents(Class)): com/dmdirc/actions/CoreActionComponent$1.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(List getCompatibleComponents(Class)): com/dmdirc/actions/CoreActionComponent$10.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(List getCompatibleComponents(Class)): com/dmdirc/actions/CoreActionComponent$11.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(List getCompatibleComponents(Class)): com/dmdirc/actions/CoreActionComponent$12.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(List getCompatibleComponents(Class)): com/dmdirc/actions/CoreActionComponent$13.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(List getCompatibleComponents(Class)): com/dmdirc/actions/CoreActionComponent$14.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(List getCompatibleComponents(Class)): com/dmdirc/actions/CoreActionComponent$15.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(List getCompatibleComponents(Class)): com/dmdirc/actions/CoreActionComponent$16.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(List getCompatibleComponents(Class)): com/dmdirc/actions/CoreActionComponent$17.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(List getCompatibleComponents(Class)): com/dmdirc/actions/CoreActionComponent$18.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(List getCompatibleComponents(Class)): com/dmdirc/actions/CoreActionComponent$19.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(List getCompatibleComponents(Class)): com/dmdirc/actions/CoreActionComponent$2.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(List getCompatibleComponents(Class)): com/dmdirc/actions/CoreActionComponent$20.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(List getCompatibleComponents(Class)): com/dmdirc/actions/CoreActionComponent$21.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(List getCompatibleComponents(Class)): com/dmdirc/actions/CoreActionComponent$22.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(List getCompatibleComponents(Class)): com/dmdirc/actions/CoreActionComponent$23.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(List getCompatibleComponents(Class)): com/dmdirc/actions/CoreActionComponent$24.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(List getCompatibleComponents(Class)): com/dmdirc/actions/CoreActionComponent$25.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(List getCompatibleComponents(Class)): com/dmdirc/actions/CoreActionComponent$26.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(List getCompatibleComponents(Class)): com/dmdirc/actions/CoreActionComponent$27.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(List getCompatibleComponents(Class)): com/dmdirc/actions/CoreActionComponent$3.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(List getCompatibleComponents(Class)): com/dmdirc/actions/CoreActionComponent$4.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(List getCompatibleComponents(Class)): com/dmdirc/actions/CoreActionComponent$5.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(List getCompatibleComponents(Class)): com/dmdirc/actions/CoreActionComponent$6.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(List getCompatibleComponents(Class)): com/dmdirc/actions/CoreActionComponent$7.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(List getCompatibleComponents(Class)): com/dmdirc/actions/CoreActionComponent$8.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(List getCompatibleComponents(Class)): com/dmdirc/actions/CoreActionComponent$9.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(List getCompatibleComponents(Class)): com/dmdirc/actions/CoreActionComponent.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(List getCompatibleComponents(Class)): com/dmdirc/actions/interfaces/ActionComponent.__Descendant_Table[others]
    //#input(List getCompatibleComponents(Class)): com/dmdirc/actions/interfaces/ActionComponent.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(List getCompatibleComponents(Class)): target
    //#output(List getCompatibleComponents(Class)): new ArrayList(getCompatibleComponents#1) num objects
    //#output(List getCompatibleComponents(Class)): return_value
    //#new obj(List getCompatibleComponents(Class)): new ArrayList(getCompatibleComponents#1)
    //#presumption(List getCompatibleComponents(Class)): appliesTo(...)@564 != null
    //#presumption(List getCompatibleComponents(Class)): java.util.Iterator:next(...)@563 != null
    //#post(List getCompatibleComponents(Class)): return_value == &new ArrayList(getCompatibleComponents#1)
    //#post(List getCompatibleComponents(Class)): new ArrayList(getCompatibleComponents#1) num objects == 1
    //#test_vector(List getCompatibleComponents(Class)): java.lang.Object:equals(...)@564: {0}, {1}
    //#test_vector(List getCompatibleComponents(Class)): java.util.Iterator:hasNext(...)@563: {0}, {1}

        final List<ActionComponent> res = new ArrayList<ActionComponent>();
        for (ActionComponent subject : actionComponents) {
    //#ActionManager.java:563: ?use of default init
    //#    init'ed(com/dmdirc/actions/interfaces/ActionComponent.__Descendant_Table[java/util/Iterator:next(...).__Tag])
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.actions.ActionManager
    //#    method: List getCompatibleComponents(Class)
    //#    basic block: bb_11
    //#    assertion: init'ed(com/dmdirc/actions/interfaces/ActionComponent.__Descendant_Table[java/util/Iterator:next(...).__Tag])
    //#    VN: com/dmdirc/actions/interfaces/ActionComponent.__Descendant_Table[java.util.Iterator:next(...).__Tag]
    //#    Expected: Univ-VN-Set
    //#    Bad: {Invalid}
    //#    Attribs:  Ptr  Bad only invalid
    //#ActionManager.java:563: ?ClassCastException check
    //#    com/dmdirc/actions/interfaces/ActionComponent.__Descendant_Table[java/util/Iterator:next(...).__Tag] != null
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.actions.ActionManager
    //#    method: List getCompatibleComponents(Class)
    //#    basic block: bb_11
    //#    assertion: com/dmdirc/actions/interfaces/ActionComponent.__Descendant_Table[java/util/Iterator:next(...).__Tag] != null
    //#    VN: !(com/dmdirc/actions/interfaces/ActionComponent.__Descendant_Table[java.util.Iterator:next(...).__Tag] == null)
    //#    Expected: {-Inf..-1, 1..+Inf}
    //#    Bad: {0}
    //#    Attribs:  Int  Bad singleton  Bad overlaps +/-1000  Bad > Exp
            if (subject.appliesTo().equals(target)) {
    //#ActionManager.java:564: Warning: call too complex - analysis skipped
    //#    call on Class appliesTo()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.ActionManager
    //#    method: List getCompatibleComponents(Class)
    //#    unanalyzed callee: Class appliesTo()
                res.add(subject);
            }
        }

        return res;
    //#ActionManager.java:569: end of method: List com.dmdirc.actions.ActionManager.getCompatibleComponents(Class)
    }

    /**
     * Returns a list of action comparisons that are compatible with the
     * specified class.
     *
     * @param target The class to be tested
     * @return A list of compatible action comparisons
     */
    @Precondition("The specified target is not null")
    public static List<ActionComparison> getCompatibleComparisons(final Class target) {
        Logger.assertTrue(target != null);
    //#ActionManager.java:581: method: List com.dmdirc.actions.ActionManager.getCompatibleComparisons(Class)
    //#ActionManager.java:581: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.logger.Logger:assertTrue(bool)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.ActionManager
    //#    method: List getCompatibleComparisons(Class)
    //#    unanalyzed callee: void com.dmdirc.logger.Logger:assertTrue(bool)
    //#input(List getCompatibleComparisons(Class)): actionComparisons
    //#input(List getCompatibleComparisons(Class)): com/dmdirc/actions/CoreActionComparison$1.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(List getCompatibleComparisons(Class)): com/dmdirc/actions/CoreActionComparison$10.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(List getCompatibleComparisons(Class)): com/dmdirc/actions/CoreActionComparison$11.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(List getCompatibleComparisons(Class)): com/dmdirc/actions/CoreActionComparison$12.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(List getCompatibleComparisons(Class)): com/dmdirc/actions/CoreActionComparison$2.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(List getCompatibleComparisons(Class)): com/dmdirc/actions/CoreActionComparison$3.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(List getCompatibleComparisons(Class)): com/dmdirc/actions/CoreActionComparison$4.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(List getCompatibleComparisons(Class)): com/dmdirc/actions/CoreActionComparison$5.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(List getCompatibleComparisons(Class)): com/dmdirc/actions/CoreActionComparison$6.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(List getCompatibleComparisons(Class)): com/dmdirc/actions/CoreActionComparison$7.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(List getCompatibleComparisons(Class)): com/dmdirc/actions/CoreActionComparison$8.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(List getCompatibleComparisons(Class)): com/dmdirc/actions/CoreActionComparison$9.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(List getCompatibleComparisons(Class)): com/dmdirc/actions/CoreActionComparison.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(List getCompatibleComparisons(Class)): com/dmdirc/actions/interfaces/ActionComparison.__Descendant_Table[com/dmdirc/actions/CoreActionComparison$10]
    //#input(List getCompatibleComparisons(Class)): com/dmdirc/actions/interfaces/ActionComparison.__Descendant_Table[com/dmdirc/actions/CoreActionComparison$11]
    //#input(List getCompatibleComparisons(Class)): com/dmdirc/actions/interfaces/ActionComparison.__Descendant_Table[com/dmdirc/actions/CoreActionComparison$12]
    //#input(List getCompatibleComparisons(Class)): com/dmdirc/actions/interfaces/ActionComparison.__Descendant_Table[com/dmdirc/actions/CoreActionComparison$1]
    //#input(List getCompatibleComparisons(Class)): com/dmdirc/actions/interfaces/ActionComparison.__Descendant_Table[com/dmdirc/actions/CoreActionComparison$2]
    //#input(List getCompatibleComparisons(Class)): com/dmdirc/actions/interfaces/ActionComparison.__Descendant_Table[com/dmdirc/actions/CoreActionComparison$3]
    //#input(List getCompatibleComparisons(Class)): com/dmdirc/actions/interfaces/ActionComparison.__Descendant_Table[com/dmdirc/actions/CoreActionComparison$4]
    //#input(List getCompatibleComparisons(Class)): com/dmdirc/actions/interfaces/ActionComparison.__Descendant_Table[com/dmdirc/actions/CoreActionComparison$5]
    //#input(List getCompatibleComparisons(Class)): com/dmdirc/actions/interfaces/ActionComparison.__Descendant_Table[com/dmdirc/actions/CoreActionComparison$6]
    //#input(List getCompatibleComparisons(Class)): com/dmdirc/actions/interfaces/ActionComparison.__Descendant_Table[com/dmdirc/actions/CoreActionComparison$7]
    //#input(List getCompatibleComparisons(Class)): com/dmdirc/actions/interfaces/ActionComparison.__Descendant_Table[com/dmdirc/actions/CoreActionComparison$8]
    //#input(List getCompatibleComparisons(Class)): com/dmdirc/actions/interfaces/ActionComparison.__Descendant_Table[com/dmdirc/actions/CoreActionComparison$9]
    //#input(List getCompatibleComparisons(Class)): com/dmdirc/actions/interfaces/ActionComparison.__Descendant_Table[com/dmdirc/actions/CoreActionComparison]
    //#input(List getCompatibleComparisons(Class)): com/dmdirc/actions/interfaces/ActionComparison.__Descendant_Table[com/dmdirc/actions/interfaces/ActionComparison]
    //#input(List getCompatibleComparisons(Class)): com/dmdirc/actions/interfaces/ActionComparison.__Descendant_Table[others]
    //#input(List getCompatibleComparisons(Class)): com/dmdirc/actions/interfaces/ActionComparison.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(List getCompatibleComparisons(Class)): target
    //#output(List getCompatibleComparisons(Class)): new ArrayList(getCompatibleComparisons#1) num objects
    //#output(List getCompatibleComparisons(Class)): return_value
    //#new obj(List getCompatibleComparisons(Class)): new ArrayList(getCompatibleComparisons#1)
    //#presumption(List getCompatibleComparisons(Class)): appliesTo(...)@585 != null
    //#presumption(List getCompatibleComparisons(Class)): java.util.Iterator:next(...).__Tag@584 in {com/dmdirc/actions/CoreActionComparison, com/dmdirc/actions/CoreActionComparison$1, com/dmdirc/actions/CoreActionComparison$10, com/dmdirc/actions/CoreActionComparison$11, com/dmdirc/actions/CoreActionComparison$12, com/dmdirc/actions/CoreActionComparison$2, com/dmdirc/actions/CoreActionComparison$3, com/dmdirc/actions/CoreActionComparison$4, com/dmdirc/actions/CoreActionComparison$5, com/dmdirc/actions/CoreActionComparison$6, com/dmdirc/actions/CoreActionComparison$7, com/dmdirc/actions/CoreActionComparison$8, com/dmdirc/actions/CoreActionComparison$9, com/dmdirc/actions/interfaces/ActionComparison}
    //#presumption(List getCompatibleComparisons(Class)): java.util.Iterator:next(...)@584 != null
    //#post(List getCompatibleComparisons(Class)): return_value == &new ArrayList(getCompatibleComparisons#1)
    //#post(List getCompatibleComparisons(Class)): new ArrayList(getCompatibleComparisons#1) num objects == 1
    //#test_vector(List getCompatibleComparisons(Class)): java.lang.Object:equals(...)@585: {0}, {1}
    //#test_vector(List getCompatibleComparisons(Class)): java.util.Iterator:hasNext(...)@584: {0}, {1}

        final List<ActionComparison> res = new ArrayList<ActionComparison>();
        for (ActionComparison subject : actionComparisons) {
            if (subject.appliesTo().equals(target)) {
    //#ActionManager.java:585: Warning: call too complex - analysis skipped
    //#    call on Class appliesTo()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.ActionManager
    //#    method: List getCompatibleComparisons(Class)
    //#    unanalyzed callee: Class appliesTo()
                res.add(subject);
            }
        }

        return res;
    //#ActionManager.java:590: end of method: List com.dmdirc.actions.ActionManager.getCompatibleComparisons(Class)
    }

    /**
     * Returns a list of all the action types registered by this manager.
     *
     * @return A list of registered action types
     */
    public static List<ActionType> getTypes() {
        return actionTypes;
    //#ActionManager.java:599: method: List com.dmdirc.actions.ActionManager.getTypes()
    //#input(List getTypes()): actionTypes
    //#output(List getTypes()): return_value
    //#post(List getTypes()): return_value == &new ArrayList(ActionManager__static_init#1)
    //#ActionManager.java:599: end of method: List com.dmdirc.actions.ActionManager.getTypes()
    }

    /**
     * Returns a list of all the action types registered by this manager.
     *
     * @return A list of registered action comparisons
     */
    public static List<ActionComparison> getComparisons() {
        return actionComparisons;
    //#ActionManager.java:608: method: List com.dmdirc.actions.ActionManager.getComparisons()
    //#input(List getComparisons()): actionComparisons
    //#output(List getComparisons()): return_value
    //#post(List getComparisons()): return_value == &new ArrayList(ActionManager__static_init#3)
    //#ActionManager.java:608: end of method: List com.dmdirc.actions.ActionManager.getComparisons()
    }

    /**
     * Returns the action component specified by the given string, or null if it
     * doesn't match a valid registered action component.
     *
     * @param type The name of the action component to try and find
     * @return The actioncomponent with the specified name, or null on failure
     */
    @Precondition("The specified type is non-null and not empty")
    public static ActionComponent getActionComponent(final String type) {
        Logger.assertTrue(type != null);
    //#ActionManager.java:620: method: ActionComponent com.dmdirc.actions.ActionManager.getActionComponent(String)
    //#ActionManager.java:620: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.logger.Logger:assertTrue(bool)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.ActionManager
    //#    method: ActionComponent getActionComponent(String)
    //#    unanalyzed callee: void com.dmdirc.logger.Logger:assertTrue(bool)
    //#input(ActionComponent getActionComponent(String)): actionComponents
    //#input(ActionComponent getActionComponent(String)): com/dmdirc/actions/interfaces/ActionComponent.__Descendant_Table[others]
    //#input(ActionComponent getActionComponent(String)): type
    //#output(ActionComponent getActionComponent(String)): return_value
    //#pre[1] (ActionComponent getActionComponent(String)): type != null
    //#presumption(ActionComponent getActionComponent(String)): java.lang.Enum:name(...)@624 != null
    //#presumption(ActionComponent getActionComponent(String)): java.util.Iterator:next(...)@623 != null
    //#post(ActionComponent getActionComponent(String)): init'ed(return_value)
    //#test_vector(ActionComponent getActionComponent(String)): java.lang.String:equals(...)@624: {0}, {1}
    //#test_vector(ActionComponent getActionComponent(String)): java.util.Iterator:hasNext(...)@623: {0}, {1}
        Logger.assertTrue(!type.isEmpty());
    //#ActionManager.java:621: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.logger.Logger:assertTrue(bool)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.ActionManager
    //#    method: ActionComponent getActionComponent(String)
    //#    unanalyzed callee: void com.dmdirc.logger.Logger:assertTrue(bool)

        for (ActionComponent target : actionComponents) {
    //#ActionManager.java:623: ?ClassCastException check
    //#    com/dmdirc/actions/interfaces/ActionComponent.__Descendant_Table[java/util/Iterator:next(...).__Tag] != null
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.actions.ActionManager
    //#    method: ActionComponent getActionComponent(String)
    //#    basic block: bb_14
    //#    assertion: com/dmdirc/actions/interfaces/ActionComponent.__Descendant_Table[java/util/Iterator:next(...).__Tag] != null
    //#    VN: !(com/dmdirc/actions/interfaces/ActionComponent.__Descendant_Table[java.util.Iterator:next(...).__Tag] == null)
    //#    Expected: {-Inf..-1, 1..+Inf}
    //#    Bad: {0}
    //#    Attribs:  Int  Bad singleton  Bad overlaps +/-1000  Bad > Exp
            if (((Enum) target).name().equals(type)) {
                return target;
            }
        }

        return null;
    //#ActionManager.java:629: end of method: ActionComponent com.dmdirc.actions.ActionManager.getActionComponent(String)
    }

    /**
     * Returns the action type specified by the given string, or null if it
     * doesn't match a valid registered action type.
     *
     * @param type The name of the action type to try and find
     * @return The actiontype with the specified name, or null on failure
     */
    @Precondition("The specified type is non-null and not empty")
    public static ActionComparison getActionComparison(final String type) {
        Logger.assertTrue(type != null);
    //#ActionManager.java:641: method: ActionComparison com.dmdirc.actions.ActionManager.getActionComparison(String)
    //#ActionManager.java:641: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.logger.Logger:assertTrue(bool)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.ActionManager
    //#    method: ActionComparison getActionComparison(String)
    //#    unanalyzed callee: void com.dmdirc.logger.Logger:assertTrue(bool)
    //#input(ActionComparison getActionComparison(String)): actionComparisons
    //#input(ActionComparison getActionComparison(String)): com/dmdirc/actions/interfaces/ActionComparison.__Descendant_Table[com/dmdirc/actions/CoreActionComparison$10]
    //#input(ActionComparison getActionComparison(String)): com/dmdirc/actions/interfaces/ActionComparison.__Descendant_Table[com/dmdirc/actions/CoreActionComparison$11]
    //#input(ActionComparison getActionComparison(String)): com/dmdirc/actions/interfaces/ActionComparison.__Descendant_Table[com/dmdirc/actions/CoreActionComparison$12]
    //#input(ActionComparison getActionComparison(String)): com/dmdirc/actions/interfaces/ActionComparison.__Descendant_Table[com/dmdirc/actions/CoreActionComparison$1]
    //#input(ActionComparison getActionComparison(String)): com/dmdirc/actions/interfaces/ActionComparison.__Descendant_Table[com/dmdirc/actions/CoreActionComparison$2]
    //#input(ActionComparison getActionComparison(String)): com/dmdirc/actions/interfaces/ActionComparison.__Descendant_Table[com/dmdirc/actions/CoreActionComparison$3]
    //#input(ActionComparison getActionComparison(String)): com/dmdirc/actions/interfaces/ActionComparison.__Descendant_Table[com/dmdirc/actions/CoreActionComparison$4]
    //#input(ActionComparison getActionComparison(String)): com/dmdirc/actions/interfaces/ActionComparison.__Descendant_Table[com/dmdirc/actions/CoreActionComparison$5]
    //#input(ActionComparison getActionComparison(String)): com/dmdirc/actions/interfaces/ActionComparison.__Descendant_Table[com/dmdirc/actions/CoreActionComparison$6]
    //#input(ActionComparison getActionComparison(String)): com/dmdirc/actions/interfaces/ActionComparison.__Descendant_Table[com/dmdirc/actions/CoreActionComparison$7]
    //#input(ActionComparison getActionComparison(String)): com/dmdirc/actions/interfaces/ActionComparison.__Descendant_Table[com/dmdirc/actions/CoreActionComparison$8]
    //#input(ActionComparison getActionComparison(String)): com/dmdirc/actions/interfaces/ActionComparison.__Descendant_Table[com/dmdirc/actions/CoreActionComparison$9]
    //#input(ActionComparison getActionComparison(String)): com/dmdirc/actions/interfaces/ActionComparison.__Descendant_Table[com/dmdirc/actions/CoreActionComparison]
    //#input(ActionComparison getActionComparison(String)): com/dmdirc/actions/interfaces/ActionComparison.__Descendant_Table[com/dmdirc/actions/interfaces/ActionComparison]
    //#input(ActionComparison getActionComparison(String)): com/dmdirc/actions/interfaces/ActionComparison.__Descendant_Table[others]
    //#input(ActionComparison getActionComparison(String)): type
    //#output(ActionComparison getActionComparison(String)): return_value
    //#pre[1] (ActionComparison getActionComparison(String)): type != null
    //#presumption(ActionComparison getActionComparison(String)): java.lang.Enum:name(...)@645 != null
    //#presumption(ActionComparison getActionComparison(String)): java.util.Iterator:next(...).__Tag@644 in {com/dmdirc/actions/CoreActionComparison, com/dmdirc/actions/CoreActionComparison$1, com/dmdirc/actions/CoreActionComparison$10, com/dmdirc/actions/CoreActionComparison$11, com/dmdirc/actions/CoreActionComparison$12, com/dmdirc/actions/CoreActionComparison$2, com/dmdirc/actions/CoreActionComparison$3, com/dmdirc/actions/CoreActionComparison$4, com/dmdirc/actions/CoreActionComparison$5, com/dmdirc/actions/CoreActionComparison$6, com/dmdirc/actions/CoreActionComparison$7, com/dmdirc/actions/CoreActionComparison$8, com/dmdirc/actions/CoreActionComparison$9, com/dmdirc/actions/interfaces/ActionComparison}
    //#presumption(ActionComparison getActionComparison(String)): java.util.Iterator:next(...)@644 != null
    //#post(ActionComparison getActionComparison(String)): init'ed(return_value)
    //#test_vector(ActionComparison getActionComparison(String)): java.lang.String:equals(...)@645: {0}, {1}
    //#test_vector(ActionComparison getActionComparison(String)): java.util.Iterator:hasNext(...)@644: {0}, {1}
        Logger.assertTrue(!type.isEmpty());
    //#ActionManager.java:642: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.logger.Logger:assertTrue(bool)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.ActionManager
    //#    method: ActionComparison getActionComparison(String)
    //#    unanalyzed callee: void com.dmdirc.logger.Logger:assertTrue(bool)

        for (ActionComparison target : actionComparisons) {
            if (((Enum) target).name().equals(type)) {
                return target;
            }
        }

        return null;
    //#ActionManager.java:650: end of method: ActionComparison com.dmdirc.actions.ActionManager.getActionComparison(String)
    }

    /**
     * Installs an action pack located at the specified path.
     *
     * @param path The full path of the action pack .zip.
     * @throws IOException If the zip cannot be extracted
     */
    public static void installActionPack(final String path) throws IOException {
        final ZipResourceManager ziprm = ZipResourceManager.getInstance(path);
    //#ActionManager.java:660: method: void com.dmdirc.actions.ActionManager.installActionPack(String)
    //#ActionManager.java:660: Warning: method not available - call not analyzed
    //#    call on ZipResourceManager com.dmdirc.util.resourcemanager.ZipResourceManager:getInstance(String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.ActionManager
    //#    method: void installActionPack(String)
    //#    unanalyzed callee: ZipResourceManager com.dmdirc.util.resourcemanager.ZipResourceManager:getInstance(String)
    //#input(void installActionPack(String)): "."._tainted
    //#input(void installActionPack(String)): ".DMDirc"._tainted
    //#input(void installActionPack(String)): ": "._tainted
    //#input(void installActionPack(String)): "DMDirc"._tainted
    //#input(void installActionPack(String)): "I.O error when creating actions directory: "._tainted
    //#input(void installActionPack(String)): "I.O error when loading action: "._tainted
    //#input(void installActionPack(String)): "Library"._tainted
    //#input(void installActionPack(String)): "Preferences"._tainted
    //#input(void installActionPack(String)): "Unable to parse action file: "._tainted
    //#input(void installActionPack(String)): "actions"._tainted
    //#input(void installActionPack(String)): actions
    //#input(void installActionPack(String)): com.dmdirc.logger.ErrorLevel.HIGH
    //#input(void installActionPack(String)): com.dmdirc.logger.ErrorLevel.MEDIUM
    //#input(void installActionPack(String)): com/dmdirc/Main.configdir
    //#input(void installActionPack(String)): com/dmdirc/Main.configdir._tainted
    //#input(void installActionPack(String)): com/dmdirc/Server.__Descendant_Table[com/dmdirc/Server]
    //#input(void installActionPack(String)): com/dmdirc/Server.__Descendant_Table[others]
    //#input(void installActionPack(String)): com/dmdirc/Server.__Dispatch_Table.getTabCompleter()Lcom/dmdirc/ui/input/TabCompleter;
    //#input(void installActionPack(String)): com/dmdirc/ServerManager.__Class_Obj.__Lock
    //#input(void installActionPack(String)): com/dmdirc/ServerManager.me.servers
    //#input(void installActionPack(String)): com/dmdirc/actions/Action.__Descendant_Table[com/dmdirc/actions/Action]
    //#input(void installActionPack(String)): com/dmdirc/actions/Action.__Descendant_Table[others]
    //#input(void installActionPack(String)): com/dmdirc/actions/Action.__Dispatch_Table.getConditions()Ljava/util/List;
    //#input(void installActionPack(String)): com/dmdirc/actions/Action.__Dispatch_Table.getTriggers()[Lcom/dmdirc/actions/interfaces/ActionType;
    //#input(void installActionPack(String)): com/dmdirc/actions/Action.__Dispatch_Table.loadActionFromConfig()V
    //#input(void installActionPack(String)): com/dmdirc/actions/Action.com.dmdirc.logger.ErrorLevel.HIGH
    //#input(void installActionPack(String)): com/dmdirc/actions/Action.com.dmdirc.logger.ErrorLevel.MEDIUM
    //#input(void installActionPack(String)): com/dmdirc/actions/Action.java.io.File.separator
    //#input(void installActionPack(String)): com/dmdirc/actions/Action.java.io.File.separator._tainted
    //#input(void installActionPack(String)): com/dmdirc/actions/ActionCondition.__Descendant_Table[com/dmdirc/actions/ActionCondition]
    //#input(void installActionPack(String)): com/dmdirc/actions/ActionCondition.__Descendant_Table[others]
    //#input(void installActionPack(String)): com/dmdirc/actions/ActionCondition.__Dispatch_Table.getArg()I
    //#input(void installActionPack(String)): com/dmdirc/actions/ActionCondition.__Dispatch_Table.getTarget()Ljava/lang/String;
    //#input(void installActionPack(String)): com/dmdirc/actions/ActionGroup.__Descendant_Table[com/dmdirc/actions/ActionGroup]
    //#input(void installActionPack(String)): com/dmdirc/actions/ActionGroup.__Descendant_Table[com/dmdirc/actions/wrappers/AliasWrapper]
    //#input(void installActionPack(String)): com/dmdirc/actions/ActionGroup.__Descendant_Table[com/dmdirc/actions/wrappers/PerformWrapper]
    //#input(void installActionPack(String)): com/dmdirc/actions/ActionGroup.__Descendant_Table[others]
    //#input(void installActionPack(String)): com/dmdirc/actions/ActionGroup.__Dispatch_Table.clear()V
    //#input(void installActionPack(String)): com/dmdirc/actions/ActionGroup.__Dispatch_Table.remove(Lcom/dmdirc/actions/Action;)V
    //#input(void installActionPack(String)): com/dmdirc/actions/CoreActionType.UNKNOWN_COMMAND
    //#input(void installActionPack(String)): com/dmdirc/actions/wrappers/AliasWrapper.__Dispatch_Table.clear()V
    //#input(void installActionPack(String)): com/dmdirc/actions/wrappers/AliasWrapper.__Dispatch_Table.remove(Lcom/dmdirc/actions/Action;)V
    //#input(void installActionPack(String)): com/dmdirc/actions/wrappers/AliasWrapper.com.dmdirc.ui.input.TabCompletionType.COMMAND
    //#input(void installActionPack(String)): com/dmdirc/actions/wrappers/PerformWrapper.__Dispatch_Table.clear()V
    //#input(void installActionPack(String)): com/dmdirc/actions/wrappers/PerformWrapper.__Dispatch_Table.remove(Lcom/dmdirc/actions/Action;)V
    //#input(void installActionPack(String)): groups
    //#input(void installActionPack(String)): path
    //#output(void installActionPack(String)): com/dmdirc/Main.configdir
    //#output(void installActionPack(String)): com/dmdirc/ServerManager.me
    //#output(void installActionPack(String)): java.lang.StringBuilder:toString(...)._tainted
    //#output(void installActionPack(String)): new ArrayList(ServerManager#1) num objects
    //#output(void installActionPack(String)): new ServerManager(getServerManager#1) num objects
    //#output(void installActionPack(String)): new ServerManager(getServerManager#1).__Tag
    //#output(void installActionPack(String)): new ServerManager(getServerManager#1).servers
    //#new obj(void installActionPack(String)): java.lang.StringBuilder:toString(...)
    //#new obj(void installActionPack(String)): new ArrayList(ServerManager#1)
    //#new obj(void installActionPack(String)): new ServerManager(getServerManager#1)
    //#pre[3] (void installActionPack(String)): init'ed(com/dmdirc/Main.configdir)
    //#presumption(void installActionPack(String)): com.dmdirc.util.resourcemanager.ZipResourceManager:getInstance(...)@660 != null
    //#post(void installActionPack(String)): init'ed(com/dmdirc/Main.configdir)
    //#post(void installActionPack(String)): possibly_updated(com/dmdirc/ServerManager.me)
    //#post(void installActionPack(String)): java.lang.StringBuilder:toString(...)._tainted == 0
    //#post(void installActionPack(String)): init'ed(new ArrayList(ServerManager#1) num objects)
    //#post(void installActionPack(String)): init'ed(new ServerManager(getServerManager#1) num objects)
    //#post(void installActionPack(String)): init'ed(new ServerManager(getServerManager#1).__Tag)
    //#post(void installActionPack(String)): init'ed(new ServerManager(getServerManager#1).servers)
    //#unanalyzed(void installActionPack(String)): Effects-of-calling:com.dmdirc.logger.Logger:assertTrue
    //#unanalyzed(void installActionPack(String)): Effects-of-calling:java.util.Map:put
    //#unanalyzed(void installActionPack(String)): Effects-of-calling:java.util.Map:values
    //#unanalyzed(void installActionPack(String)): Effects-of-calling:java.util.Collection:iterator
    //#unanalyzed(void installActionPack(String)): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(void installActionPack(String)): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(void installActionPack(String)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void installActionPack(String)): Effects-of-calling:getConfigDir
    //#unanalyzed(void installActionPack(String)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void installActionPack(String)): Effects-of-calling:java.lang.System:getProperty
    //#unanalyzed(void installActionPack(String)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void installActionPack(String)): Effects-of-calling:java.io.File:isDirectory
    //#unanalyzed(void installActionPack(String)): Effects-of-calling:java.io.File:getName
    //#unanalyzed(void installActionPack(String)): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(void installActionPack(String)): Effects-of-calling:java.util.ArrayList
    //#unanalyzed(void installActionPack(String)): Effects-of-calling:java.util.HashMap
    //#unanalyzed(void installActionPack(String)): Effects-of-calling:java.io.File:listFiles
    //#unanalyzed(void installActionPack(String)): Effects-of-calling:com.dmdirc.actions.Action
    //#unanalyzed(void installActionPack(String)): Effects-of-calling:com.dmdirc.updater.components.ActionGroupComponent
    //#unanalyzed(void installActionPack(String)): Effects-of-calling:com.dmdirc.util.MapList:clear
    //#unanalyzed(void installActionPack(String)): Effects-of-calling:java.util.List:remove
    //#unanalyzed(void installActionPack(String)): Effects-of-calling:java.util.ArrayList:iterator
    //#unanalyzed(void installActionPack(String)): Effects-of-calling:remove
    //#unanalyzed(void installActionPack(String)): Effects-of-calling:getTriggers
    //#unanalyzed(void installActionPack(String)): Effects-of-calling:java.lang.Object:equals
    //#unanalyzed(void installActionPack(String)): Effects-of-calling:getCommandName
    //#unanalyzed(void installActionPack(String)): Effects-of-calling:java.util.List:iterator
    //#unanalyzed(void installActionPack(String)): Effects-of-calling:getTabCompleter
    //#unanalyzed(void installActionPack(String)): Effects-of-calling:com.dmdirc.ui.input.TabCompleter:removeEntry
    //#unanalyzed(void installActionPack(String)): Effects-of-calling:getConditions
    //#unanalyzed(void installActionPack(String)): Effects-of-calling:com.dmdirc.commandparser.CommandManager:getCommandChar
    //#unanalyzed(void installActionPack(String)): Effects-of-calling:java.util.Map:clear
    //#unanalyzed(void installActionPack(String)): Effects-of-calling:java.io.File
    //#unanalyzed(void installActionPack(String)): Effects-of-calling:java.io.File:exists
    //#unanalyzed(void installActionPack(String)): Effects-of-calling:java.io.File:mkdirs
    //#unanalyzed(void installActionPack(String)): Effects-of-calling:java.io.File:createNewFile
    //#unanalyzed(void installActionPack(String)): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(void installActionPack(String)): Effects-of-calling:java.io.IOException:getMessage
    //#unanalyzed(void installActionPack(String)): Effects-of-calling:com.dmdirc.logger.Logger:userError
    //#unanalyzed(void installActionPack(String)): Effects-of-calling:com.dmdirc.util.ConfigFile
    //#unanalyzed(void installActionPack(String)): Effects-of-calling:java.lang.String:startsWith
    //#unanalyzed(void installActionPack(String)): Effects-of-calling:java.lang.System:getenv
    //#unanalyzed(void installActionPack(String)): Effects-of-calling:com.dmdirc.util.ConfigFile:read
    //#unanalyzed(void installActionPack(String)): Effects-of-calling:loadActionFromConfig
    //#unanalyzed(void installActionPack(String)): Effects-of-calling:com.dmdirc.util.InvalidConfigFileException:getMessage

        ziprm.extractResources("", getDirectory());
    //#ActionManager.java:662: Warning: unused assignment in callee
    //#    Unused assignment to (java.lang.StringBuilder:toString(...)._tainted) in getDirectory
    //#    severity: LOW
    //#    class: com.dmdirc.actions.ActionManager
    //#    method: void installActionPack(String)
    //#ActionManager.java:662: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.util.resourcemanager.ZipResourceManager:extractResources(String, String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.ActionManager
    //#    method: void installActionPack(String)
    //#    unanalyzed callee: void com.dmdirc.util.resourcemanager.ZipResourceManager:extractResources(String, String)

        loadActions();

        new File(path).delete();
    }
    //#ActionManager.java:667: end of method: void com.dmdirc.actions.ActionManager.installActionPack(String)

    /**
     * Adds a new listener for the specified action type.
     *
     * @param types The action types that are to be listened for
     * @param listener The listener to be added
     */
    public static void addListener(final ActionListener listener, final ActionType ... types) {
        for (ActionType type : types) {
    //#ActionManager.java:676: method: void com.dmdirc.actions.ActionManager.addListener(ActionListener, ActionType[])
    //#input(void addListener(ActionListener, ActionType[])): listener
    //#input(void addListener(ActionListener, ActionType[])): listeners
    //#input(void addListener(ActionListener, ActionType[])): types
    //#input(void addListener(ActionListener, ActionType[])): types.length
    //#input(void addListener(ActionListener, ActionType[])): types[0..4_294_967_295]
    //#pre[2] (void addListener(ActionListener, ActionType[])): types != null
    //#pre[3] (void addListener(ActionListener, ActionType[])): types.length <= 4_294_967_295
    //#pre[4] (void addListener(ActionListener, ActionType[])): (soft) init'ed(types[0..4_294_967_295])
            listeners.add(type, listener);
    //#ActionManager.java:677: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.util.MapList:add(Object, Object)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.ActionManager
    //#    method: void addListener(ActionListener, ActionType[])
    //#    unanalyzed callee: void com.dmdirc.util.MapList:add(Object, Object)
        }
    }
    //#ActionManager.java:679: end of method: void com.dmdirc.actions.ActionManager.addListener(ActionListener, ActionType[])

    /**
     * Removes a listener for the specified action type.
     *
     * @param types The action types that were being listened for
     * @param listener The listener to be removed
     */
    public static void removeListener(final ActionListener listener, final ActionType ... types) {
        for (ActionType type : types) {
    //#ActionManager.java:688: method: void com.dmdirc.actions.ActionManager.removeListener(ActionListener, ActionType[])
    //#input(void removeListener(ActionListener, ActionType[])): listener
    //#input(void removeListener(ActionListener, ActionType[])): listeners
    //#input(void removeListener(ActionListener, ActionType[])): types
    //#input(void removeListener(ActionListener, ActionType[])): types.length
    //#input(void removeListener(ActionListener, ActionType[])): types[0..4_294_967_295]
    //#pre[2] (void removeListener(ActionListener, ActionType[])): types != null
    //#pre[3] (void removeListener(ActionListener, ActionType[])): types.length <= 4_294_967_295
    //#pre[4] (void removeListener(ActionListener, ActionType[])): (soft) init'ed(types[0..4_294_967_295])
            listeners.remove(type, listener);
    //#ActionManager.java:689: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.util.MapList:remove(Object, Object)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.ActionManager
    //#    method: void removeListener(ActionListener, ActionType[])
    //#    unanalyzed callee: void com.dmdirc.util.MapList:remove(Object, Object)
        }
    }
    //#ActionManager.java:691: end of method: void com.dmdirc.actions.ActionManager.removeListener(ActionListener, ActionType[])

    /**
     * Removes a listener for all action types.
     *
     * @param listener The listener to be removed
     */
    public static void removeListener(final ActionListener listener) {
        listeners.removeFromAll(listener);
    //#ActionManager.java:699: method: void com.dmdirc.actions.ActionManager.removeListener(ActionListener)
    //#ActionManager.java:699: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.util.MapList:removeFromAll(Object)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.ActionManager
    //#    method: void removeListener(ActionListener)
    //#    unanalyzed callee: void com.dmdirc.util.MapList:removeFromAll(Object)
    //#input(void removeListener(ActionListener)): listener
    //#input(void removeListener(ActionListener)): listeners
    }
    //#ActionManager.java:700: end of method: void com.dmdirc.actions.ActionManager.removeListener(ActionListener)
}
    //#output(com.dmdirc.actions.ActionManager$2__static_init): __Descendant_Table[com/dmdirc/actions/ActionManager$2]
    //#output(com.dmdirc.actions.ActionManager$2__static_init): __Dispatch_Table.configChanged(Ljava/lang/String;Ljava/lang/String;)V
    //#post(com.dmdirc.actions.ActionManager$2__static_init): __Descendant_Table[com/dmdirc/actions/ActionManager$2] == &__Dispatch_Table
    //#post(com.dmdirc.actions.ActionManager$2__static_init): __Dispatch_Table.configChanged(Ljava/lang/String;Ljava/lang/String;)V == &configChanged
    //#ActionManager.java:: end of method: com.dmdirc.actions.ActionManager$2.com.dmdirc.actions.ActionManager$2__static_init
    //#ActionManager.java:: end of class: com.dmdirc.actions.ActionManager$2
    //#output(com.dmdirc.actions.ActionManager$1__static_init): __Descendant_Table[com/dmdirc/actions/ActionManager$1]
    //#output(com.dmdirc.actions.ActionManager$1__static_init): __Dispatch_Table.processEvent(Lcom/dmdirc/actions/interfaces/ActionType;Ljava/lang/StringBuffer;[Ljava/lang/Object;)V
    //#post(com.dmdirc.actions.ActionManager$1__static_init): __Descendant_Table[com/dmdirc/actions/ActionManager$1] == &__Dispatch_Table
    //#post(com.dmdirc.actions.ActionManager$1__static_init): __Dispatch_Table.processEvent(Lcom/dmdirc/actions/interfaces/ActionType;Ljava/lang/StringBuffer;[Ljava/lang/Object;)V == &processEvent
    //#ActionManager.java:: end of method: com.dmdirc.actions.ActionManager$1.com.dmdirc.actions.ActionManager$1__static_init
    //#ActionManager.java:: end of class: com.dmdirc.actions.ActionManager$1
    //#ActionManager.java:: end of class: com.dmdirc.actions.ActionManager
