//# 24 errors, 2,039 messages
//#
/*
    //#Action.java:1:1: class: com.dmdirc.actions.Action
 * 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.actions.interfaces.ActionType;
import com.dmdirc.actions.interfaces.ActionComponent;
import com.dmdirc.actions.interfaces.ActionComparison;
import com.dmdirc.config.prefs.PreferencesSetting;
import com.dmdirc.config.prefs.PreferencesType;
import com.dmdirc.logger.ErrorLevel;
import com.dmdirc.logger.Logger;
import com.dmdirc.util.ConfigFile;
import com.dmdirc.util.InvalidConfigFileException;

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

/**
 * Describes a single action.
 *
 * @author chris
 */
public class Action extends ActionModel implements Serializable {

    /**
     * A version number for this class. It should be changed whenever the class
     * structure is changed (or anything else that would prevent serialized
     * objects being unserialized with the new class).
     */
    private static final long serialVersionUID = 1;

    /** The domain name for condition trees. */
    private static final String DOMAIN_CONDITIONTREE = "conditiontree".intern();
    //#Action.java:59: method: com.dmdirc.actions.Action.com.dmdirc.actions.Action__static_init
    //#output(com.dmdirc.actions.Action__static_init): DOMAIN_CONDITIONTREE
    //#output(com.dmdirc.actions.Action__static_init): DOMAIN_FORMAT
    //#output(com.dmdirc.actions.Action__static_init): DOMAIN_METADATA
    //#output(com.dmdirc.actions.Action__static_init): DOMAIN_RESPONSE
    //#output(com.dmdirc.actions.Action__static_init): DOMAIN_TRIGGERS
    //#output(com.dmdirc.actions.Action__static_init): __Descendant_Table[com/dmdirc/actions/Action]
    //#output(com.dmdirc.actions.Action__static_init): __Dispatch_Table.checkMetaData()V
    //#output(com.dmdirc.actions.Action__static_init): __Dispatch_Table.delete()V
    //#output(com.dmdirc.actions.Action__static_init): __Dispatch_Table.error(Ljava/lang/String;)V
    //#output(com.dmdirc.actions.Action__static_init): __Dispatch_Table.getConditionTree()Lcom/dmdirc/actions/ConditionTree;
    //#output(com.dmdirc.actions.Action__static_init): __Dispatch_Table.getConditions()Ljava/util/List;
    //#output(com.dmdirc.actions.Action__static_init): __Dispatch_Table.getGroup()Ljava/lang/String;
    //#output(com.dmdirc.actions.Action__static_init): __Dispatch_Table.getName()Ljava/lang/String;
    //#output(com.dmdirc.actions.Action__static_init): __Dispatch_Table.getNewFormat()Ljava/lang/String;
    //#output(com.dmdirc.actions.Action__static_init): __Dispatch_Table.getRealConditionTree()Lcom/dmdirc/actions/ConditionTree;
    //#output(com.dmdirc.actions.Action__static_init): __Dispatch_Table.getResponse()[Ljava/lang/String;
    //#output(com.dmdirc.actions.Action__static_init): __Dispatch_Table.getTriggers()[Lcom/dmdirc/actions/interfaces/ActionType;
    //#output(com.dmdirc.actions.Action__static_init): __Dispatch_Table.isModified()Z
    //#output(com.dmdirc.actions.Action__static_init): __Dispatch_Table.loadActionFromConfig()V
    //#output(com.dmdirc.actions.Action__static_init): __Dispatch_Table.loadTriggers(Ljava/util/List;)Z
    //#output(com.dmdirc.actions.Action__static_init): __Dispatch_Table.readComponent(Ljava/util/Map;I)Lcom/dmdirc/actions/interfaces/ActionComponent;
    //#output(com.dmdirc.actions.Action__static_init): __Dispatch_Table.readCondition(Ljava/util/Map;)Z
    //#output(com.dmdirc.actions.Action__static_init): __Dispatch_Table.resetModified()V
    //#output(com.dmdirc.actions.Action__static_init): __Dispatch_Table.save()V
    //#output(com.dmdirc.actions.Action__static_init): __Dispatch_Table.setConditionTree(Lcom/dmdirc/actions/ConditionTree;)V
    //#output(com.dmdirc.actions.Action__static_init): __Dispatch_Table.setConditions(Ljava/util/List;)V
    //#output(com.dmdirc.actions.Action__static_init): __Dispatch_Table.setGroup(Ljava/lang/String;)V
    //#output(com.dmdirc.actions.Action__static_init): __Dispatch_Table.setName(Ljava/lang/String;)V
    //#output(com.dmdirc.actions.Action__static_init): __Dispatch_Table.setNewFormat(Ljava/lang/String;)V
    //#output(com.dmdirc.actions.Action__static_init): __Dispatch_Table.setResponse([Ljava/lang/String;)V
    //#output(com.dmdirc.actions.Action__static_init): __Dispatch_Table.setTriggers([Lcom/dmdirc/actions/interfaces/ActionType;)V
    //#output(com.dmdirc.actions.Action__static_init): __Dispatch_Table.test(Lcom/dmdirc/actions/ActionSubstitutor;[Ljava/lang/Object;)Z
    //#output(com.dmdirc.actions.Action__static_init): __Dispatch_Table.toString()Ljava/lang/String;
    //#output(com.dmdirc.actions.Action__static_init): __Dispatch_Table.trigger(Ljava/lang/StringBuffer;[Ljava/lang/Object;)V
    //#output(com.dmdirc.actions.Action__static_init): com/dmdirc/actions/ActionModel.__Descendant_Table[com/dmdirc/actions/Action]
    //#post(com.dmdirc.actions.Action__static_init): DOMAIN_CONDITIONTREE != null
    //#post(com.dmdirc.actions.Action__static_init): DOMAIN_FORMAT != null
    //#post(com.dmdirc.actions.Action__static_init): DOMAIN_METADATA != null
    //#post(com.dmdirc.actions.Action__static_init): DOMAIN_RESPONSE != null
    //#post(com.dmdirc.actions.Action__static_init): DOMAIN_TRIGGERS != null
    //#post(com.dmdirc.actions.Action__static_init): __Descendant_Table[com/dmdirc/actions/Action] == &__Dispatch_Table
    //#post(com.dmdirc.actions.Action__static_init): com/dmdirc/actions/ActionModel.__Descendant_Table[com/dmdirc/actions/Action] == &__Dispatch_Table
    //#post(com.dmdirc.actions.Action__static_init): __Dispatch_Table.checkMetaData()V == &checkMetaData
    //#post(com.dmdirc.actions.Action__static_init): __Dispatch_Table.delete()V == &delete
    //#post(com.dmdirc.actions.Action__static_init): __Dispatch_Table.error(Ljava/lang/String;)V == &error
    //#post(com.dmdirc.actions.Action__static_init): __Dispatch_Table.getConditionTree()Lcom/dmdirc/actions/ConditionTree; == &com/dmdirc/actions/ActionModel.getConditionTree
    //#post(com.dmdirc.actions.Action__static_init): __Dispatch_Table.getConditions()Ljava/util/List; == &com/dmdirc/actions/ActionModel.getConditions
    //#post(com.dmdirc.actions.Action__static_init): __Dispatch_Table.getGroup()Ljava/lang/String; == &com/dmdirc/actions/ActionModel.getGroup
    //#post(com.dmdirc.actions.Action__static_init): __Dispatch_Table.getName()Ljava/lang/String; == &com/dmdirc/actions/ActionModel.getName
    //#post(com.dmdirc.actions.Action__static_init): __Dispatch_Table.getNewFormat()Ljava/lang/String; == &com/dmdirc/actions/ActionModel.getNewFormat
    //#post(com.dmdirc.actions.Action__static_init): __Dispatch_Table.getRealConditionTree()Lcom/dmdirc/actions/ConditionTree; == &com/dmdirc/actions/ActionModel.getRealConditionTree
    //#post(com.dmdirc.actions.Action__static_init): __Dispatch_Table.getResponse()[Ljava/lang/String; == &com/dmdirc/actions/ActionModel.getResponse
    //#post(com.dmdirc.actions.Action__static_init): __Dispatch_Table.getTriggers()[Lcom/dmdirc/actions/interfaces/ActionType; == &com/dmdirc/actions/ActionModel.getTriggers
    //#post(com.dmdirc.actions.Action__static_init): __Dispatch_Table.isModified()Z == &com/dmdirc/actions/ActionModel.isModified
    //#post(com.dmdirc.actions.Action__static_init): __Dispatch_Table.loadActionFromConfig()V == &loadActionFromConfig
    //#post(com.dmdirc.actions.Action__static_init): __Dispatch_Table.loadTriggers(Ljava/util/List;)Z == &loadTriggers
    //#post(com.dmdirc.actions.Action__static_init): __Dispatch_Table.readComponent(Ljava/util/Map;I)Lcom/dmdirc/actions/interfaces/ActionComponent; == &readComponent
    //#post(com.dmdirc.actions.Action__static_init): __Dispatch_Table.readCondition(Ljava/util/Map;)Z == &readCondition
    //#post(com.dmdirc.actions.Action__static_init): __Dispatch_Table.resetModified()V == &com/dmdirc/actions/ActionModel.resetModified
    //#post(com.dmdirc.actions.Action__static_init): __Dispatch_Table.save()V == &save
    //#post(com.dmdirc.actions.Action__static_init): __Dispatch_Table.setConditionTree(Lcom/dmdirc/actions/ConditionTree;)V == &com/dmdirc/actions/ActionModel.setConditionTree
    //#post(com.dmdirc.actions.Action__static_init): __Dispatch_Table.setConditions(Ljava/util/List;)V == &com/dmdirc/actions/ActionModel.setConditions
    //#post(com.dmdirc.actions.Action__static_init): __Dispatch_Table.setGroup(Ljava/lang/String;)V == &setGroup
    //#post(com.dmdirc.actions.Action__static_init): __Dispatch_Table.setName(Ljava/lang/String;)V == &setName
    //#post(com.dmdirc.actions.Action__static_init): __Dispatch_Table.setNewFormat(Ljava/lang/String;)V == &com/dmdirc/actions/ActionModel.setNewFormat
    //#post(com.dmdirc.actions.Action__static_init): __Dispatch_Table.setResponse([Ljava/lang/String;)V == &com/dmdirc/actions/ActionModel.setResponse
    //#post(com.dmdirc.actions.Action__static_init): __Dispatch_Table.setTriggers([Lcom/dmdirc/actions/interfaces/ActionType;)V == &com/dmdirc/actions/ActionModel.setTriggers
    //#post(com.dmdirc.actions.Action__static_init): __Dispatch_Table.test(Lcom/dmdirc/actions/ActionSubstitutor;[Ljava/lang/Object;)Z == &com/dmdirc/actions/ActionModel.test
    //#post(com.dmdirc.actions.Action__static_init): __Dispatch_Table.toString()Ljava/lang/String; == &toString
    //#post(com.dmdirc.actions.Action__static_init): __Dispatch_Table.trigger(Ljava/lang/StringBuffer;[Ljava/lang/Object;)V == &com/dmdirc/actions/ActionModel.trigger
    /** The domain name for format changes. */
    private static final String DOMAIN_FORMAT = "format".intern();
    /** The domain name for meta-data. */
    private static final String DOMAIN_METADATA = "metadata".intern();
    /** The domain name for response information. */
    private static final String DOMAIN_RESPONSE = "response".intern();
    /** The domain name for triggers. */
    private static final String DOMAIN_TRIGGERS = "triggers".intern();
    //#Action.java:67: end of method: com.dmdirc.actions.Action.com.dmdirc.actions.Action__static_init

    /** The location of the file we're reading/saving. */
    private String location;

    /** The config file we're using. */
    protected ConfigFile config;

    /**
     * Creates a new instance of Action. The group and name specified must
     * be the group and name of a valid action already saved to disk.
     *
     * @param group The group the action belongs to
     * @param name The name of the action
     */
    public Action(final String group, final String name) {
        super(group, name);
    //#Action.java:83: method: void com.dmdirc.actions.Action.com.dmdirc.actions.Action(String, String)
    //#input(void com.dmdirc.actions.Action(String, String)): "."._tainted
    //#input(void com.dmdirc.actions.Action(String, String)): ".DMDirc"._tainted
    //#input(void com.dmdirc.actions.Action(String, String)): ": "._tainted
    //#input(void com.dmdirc.actions.Action(String, String)): "DMDirc"._tainted
    //#input(void com.dmdirc.actions.Action(String, String)): "I.O error when loading action: "._tainted
    //#input(void com.dmdirc.actions.Action(String, String)): "Library"._tainted
    //#input(void com.dmdirc.actions.Action(String, String)): "Preferences"._tainted
    //#input(void com.dmdirc.actions.Action(String, String)): "Unable to parse action file: "._tainted
    //#input(void com.dmdirc.actions.Action(String, String)): "actions"._tainted
    //#input(void com.dmdirc.actions.Action(String, String)): __Descendant_Table[com/dmdirc/actions/Action]
    //#input(void com.dmdirc.actions.Action(String, String)): __Descendant_Table[others]
    //#input(void com.dmdirc.actions.Action(String, String)): __Dispatch_Table.loadActionFromConfig()V
    //#input(void com.dmdirc.actions.Action(String, String)): com.dmdirc.logger.ErrorLevel.HIGH
    //#input(void com.dmdirc.actions.Action(String, String)): com.dmdirc.logger.ErrorLevel.MEDIUM
    //#input(void com.dmdirc.actions.Action(String, String)): com/dmdirc/Main.configdir
    //#input(void com.dmdirc.actions.Action(String, String)): com/dmdirc/Main.configdir._tainted
    //#input(void com.dmdirc.actions.Action(String, String)): group
    //#input(void com.dmdirc.actions.Action(String, String)): group._tainted
    //#input(void com.dmdirc.actions.Action(String, String)): java.io.File.separator
    //#input(void com.dmdirc.actions.Action(String, String)): java.io.File.separator._tainted
    //#input(void com.dmdirc.actions.Action(String, String)): name
    //#input(void com.dmdirc.actions.Action(String, String)): name._tainted
    //#input(void com.dmdirc.actions.Action(String, String)): this
    //#input(void com.dmdirc.actions.Action(String, String)): this.__Tag
    //#output(void com.dmdirc.actions.Action(String, String)): com/dmdirc/Main.configdir
    //#output(void com.dmdirc.actions.Action(String, String)): java.lang.StringBuilder:toString(...)._tainted
    //#output(void com.dmdirc.actions.Action(String, String)): new ArrayList(ActionModel#1) num objects
    //#output(void com.dmdirc.actions.Action(String, String)): new ConfigFile(Action#2) num objects
    //#output(void com.dmdirc.actions.Action(String, String)): this.__Tag
    //#output(void com.dmdirc.actions.Action(String, String)): this.conditions
    //#output(void com.dmdirc.actions.Action(String, String)): this.config
    //#output(void com.dmdirc.actions.Action(String, String)): this.group
    //#output(void com.dmdirc.actions.Action(String, String)): this.location
    //#output(void com.dmdirc.actions.Action(String, String)): this.name
    //#new obj(void com.dmdirc.actions.Action(String, String)): java.lang.StringBuilder:toString(...)
    //#new obj(void com.dmdirc.actions.Action(String, String)): new ArrayList(ActionModel#1)
    //#new obj(void com.dmdirc.actions.Action(String, String)): new ConfigFile(Action#2)
    //#pre[7] (void com.dmdirc.actions.Action(String, String)): init'ed(com/dmdirc/Main.configdir)
    //#pre[8] (void com.dmdirc.actions.Action(String, String)): (soft) this.__Tag == com/dmdirc/actions/Action
    //#presumption(void com.dmdirc.actions.Action(String, String)): init'ed(com.dmdirc.logger.ErrorLevel.HIGH)
    //#presumption(void com.dmdirc.actions.Action(String, String)): init'ed(com.dmdirc.logger.ErrorLevel.MEDIUM)
    //#presumption(void com.dmdirc.actions.Action(String, String)): init'ed(java.io.File.separator)
    //#post(void com.dmdirc.actions.Action(String, String)): com/dmdirc/Main.configdir == One-of{old com/dmdirc/Main.configdir, &java.lang.StringBuilder:toString(...)}
    //#post(void com.dmdirc.actions.Action(String, String)): com/dmdirc/Main.configdir != null
    //#post(void com.dmdirc.actions.Action(String, String)): init'ed(java.lang.StringBuilder:toString(...)._tainted)
    //#post(void com.dmdirc.actions.Action(String, String)): java.lang.StringBuilder:toString(...)._tainted == 0
    //#post(void com.dmdirc.actions.Action(String, String)): this.__Tag == com/dmdirc/actions/Action
    //#post(void com.dmdirc.actions.Action(String, String)): this.conditions == &new ArrayList(ActionModel#1)
    //#post(void com.dmdirc.actions.Action(String, String)): init'ed(this.config)
    //#post(void com.dmdirc.actions.Action(String, String)): this.group == group
    //#post(void com.dmdirc.actions.Action(String, String)): init'ed(this.group)
    //#post(void com.dmdirc.actions.Action(String, String)): this.location == &java.lang.StringBuilder:toString(...)
    //#post(void com.dmdirc.actions.Action(String, String)): this.name == name
    //#post(void com.dmdirc.actions.Action(String, String)): init'ed(this.name)
    //#post(void com.dmdirc.actions.Action(String, String)): new ArrayList(ActionModel#1) num objects == 1
    //#post(void com.dmdirc.actions.Action(String, String)): new ConfigFile(Action#2) num objects <= 1
    //#unanalyzed(void com.dmdirc.actions.Action(String, String)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void com.dmdirc.actions.Action(String, String)): Effects-of-calling:getConfigDir
    //#unanalyzed(void com.dmdirc.actions.Action(String, String)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void com.dmdirc.actions.Action(String, String)): Effects-of-calling:java.lang.System:getProperty
    //#unanalyzed(void com.dmdirc.actions.Action(String, String)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void com.dmdirc.actions.Action(String, String)): Effects-of-calling:java.util.ArrayList
    //#unanalyzed(void com.dmdirc.actions.Action(String, String)): Effects-of-calling:java.lang.String:startsWith
    //#unanalyzed(void com.dmdirc.actions.Action(String, String)): Effects-of-calling:java.lang.System:getenv

        location = ActionManager.getDirectory() + group + File.separator + name;

        try {
            config = new ConfigFile(location);
    //#Action.java:88: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.util.ConfigFile(String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.Action
    //#    method: void com.dmdirc.actions.Action(String, String)
    //#    unanalyzed callee: void com.dmdirc.util.ConfigFile(String)
            config.read();
    //#Action.java:89: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.util.ConfigFile:read()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.Action
    //#    method: void com.dmdirc.actions.Action(String, String)
    //#    unanalyzed callee: void com.dmdirc.util.ConfigFile:read()
            loadActionFromConfig();
    //#Action.java:90: Warning: call too complex - analysis skipped
    //#    call on void loadActionFromConfig()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.Action
    //#    method: void com.dmdirc.actions.Action(String, String)
    //#    unanalyzed callee: void loadActionFromConfig()
        } catch (InvalidConfigFileException ex) {
            // This isn't a valid config file. Maybe it's a properties file?
            Logger.userError(ErrorLevel.MEDIUM, "Unable to parse action file: "
    //#Action.java:93: Warning: method not available - call not analyzed
    //#    call on String com.dmdirc.util.InvalidConfigFileException:getMessage()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.Action
    //#    method: void com.dmdirc.actions.Action(String, String)
    //#    unanalyzed callee: String com.dmdirc.util.InvalidConfigFileException:getMessage()
    //#Action.java:93: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.logger.Logger:userError(ErrorLevel, String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.Action
    //#    method: void com.dmdirc.actions.Action(String, String)
    //#    unanalyzed callee: void com.dmdirc.logger.Logger:userError(ErrorLevel, String)
                    + group + "/" + name + ": " + ex.getMessage());
        } catch (IOException ex) {
            Logger.userError(ErrorLevel.HIGH, "I/O error when loading action: "
    //#Action.java:96: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.logger.Logger:userError(ErrorLevel, String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.Action
    //#    method: void com.dmdirc.actions.Action(String, String)
    //#    unanalyzed callee: void com.dmdirc.logger.Logger:userError(ErrorLevel, String)
                    + group + "/" + name + ": " + ex.getMessage());
        }
    }
    //#Action.java:99: end of method: void com.dmdirc.actions.Action.com.dmdirc.actions.Action(String, String)

    /**
     * Creates a new instance of Action with the specified properties and saves
     * it to disk.
     *
     * @param group The group the action belongs to
     * @param name The name of the action
     * @param triggers The triggers to use
     * @param response The response to use
     * @param conditions The conditions to use
     * @param newFormat The new formatter to use
     */
    public Action(final String group, final String name,
            final ActionType[] triggers, final String[] response,
            final List<ActionCondition> conditions, final String newFormat) {
        this(group, name, triggers, response, conditions,
    //#Action.java:115: method: void com.dmdirc.actions.Action.com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)
    //#Action.java:115: Warning: call too complex - analysis skipped
    //#    call on void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.Action
    //#    method: void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)
    //#    unanalyzed callee: void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)
    //#input(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): com/dmdirc/actions/ConditionTree$OPERATION.AND
    //#input(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): com/dmdirc/actions/ConditionTree$OPERATION.NOOP
    //#input(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): com/dmdirc/actions/ConditionTree$OPERATION.NOT
    //#input(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): com/dmdirc/actions/ConditionTree$OPERATION.OR
    //#input(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): com/dmdirc/actions/ConditionTree$OPERATION.VAR
    //#input(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): com/dmdirc/actions/ConditionTree.__Descendant_Table[com/dmdirc/actions/ConditionTree]
    //#input(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): com/dmdirc/actions/ConditionTree.__Descendant_Table[others]
    //#input(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): conditions
    //#input(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): group
    //#input(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): name
    //#input(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): newFormat
    //#input(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): response
    //#input(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): this
    //#input(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): this.__Tag
    //#input(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): triggers
    //#output(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): com/dmdirc/ServerManager.me
    //#output(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): java.lang.StringBuilder:toString(...)._tainted
    //#output(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): new ActionType[](ActionModel#2) num objects
    //#output(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): new ActionType[](ActionModel#2).length
    //#output(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): new ActionType[](ActionModel#2)[0..+Inf]
    //#output(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): new ArrayList(ActionModel#1) num objects
    //#output(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): new ArrayList(ServerManager#1) num objects
    //#output(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): new ConditionTree(parseStack#3) num objects
    //#output(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): new ConditionTree(parseStack#3).__Tag
    //#output(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): new ConditionTree(parseStack#3).argument
    //#output(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): new ConditionTree(parseStack#3).leftArg
    //#output(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): new ConditionTree(parseStack#3).op
    //#output(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): new ConditionTree(parseStack#3).rightArg
    //#output(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): new ConditionTree(readTerm#1) num objects
    //#output(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): new ConditionTree(readTerm#1).__Tag
    //#output(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): new ConditionTree(readTerm#1)._tainted
    //#output(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): new ConditionTree(readTerm#1).argument
    //#output(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): new ConditionTree(readTerm#1).leftArg
    //#output(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): new ConditionTree(readTerm#1).op
    //#output(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): new ConditionTree(readTerm#1).rightArg
    //#output(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): new ServerManager(getServerManager#1) num objects
    //#output(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): new ServerManager(getServerManager#1).__Tag
    //#output(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): new ServerManager(getServerManager#1).servers
    //#output(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): new String[](ActionModel#3) num objects
    //#output(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): new String[](ActionModel#3).length
    //#output(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): new String[](ActionModel#3)[0..+Inf]
    //#output(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): this.__Tag
    //#output(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): this.conditionTree
    //#output(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): this.conditions
    //#output(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): this.config
    //#output(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): this.group
    //#output(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): this.location
    //#output(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): this.modified
    //#output(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): this.name
    //#output(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): this.newFormat
    //#output(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): this.response
    //#output(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): this.triggers
    //#new obj(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): java.lang.StringBuilder:toString(...)
    //#new obj(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): new ActionType[](ActionModel#2)
    //#new obj(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): new ArrayList(ActionModel#1)
    //#new obj(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): new ArrayList(ServerManager#1)
    //#new obj(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): new ConditionTree(parseStack#3)
    //#new obj(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): new ConditionTree(readTerm#1)
    //#new obj(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): new ServerManager(getServerManager#1)
    //#new obj(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): new String[](ActionModel#3)
    //#pre[4] (void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): conditions != null
    //#pre[10] (void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): (soft) init'ed(com/dmdirc/ServerManager.me)
    //#post(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): com/dmdirc/ServerManager.me == old com/dmdirc/ServerManager.me
    //#post(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): java.lang.StringBuilder:toString(...)._tainted == 0
    //#post(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): new ConditionTree(readTerm#1)._tainted == 0
    //#post(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): this.__Tag == old this.__Tag
    //#post(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): init'ed(this.__Tag)
    //#post(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): init'ed(this.conditionTree)
    //#post(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): init'ed(this.conditions)
    //#post(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): init'ed(this.config)
    //#post(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): init'ed(this.group)
    //#post(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): init'ed(this.location)
    //#post(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): init'ed(this.modified)
    //#post(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): init'ed(this.name)
    //#post(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): init'ed(this.newFormat)
    //#post(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): init'ed(this.response)
    //#post(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): init'ed(this.triggers)
    //#post(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): new ActionType[](ActionModel#2) num objects == undefined
    //#post(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): new ActionType[](ActionModel#2) num objects == 0, if init'ed
    //#post(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): new ActionType[](ActionModel#2).length == new ActionType[](ActionModel#2) num objects
    //#post(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): new ArrayList(ActionModel#1) num objects == new ActionType[](ActionModel#2) num objects
    //#post(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): new ArrayList(ServerManager#1) num objects == new ActionType[](ActionModel#2) num objects
    //#post(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): new ServerManager(getServerManager#1) num objects == new ActionType[](ActionModel#2) num objects
    //#post(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): new ServerManager(getServerManager#1).__Tag == new ActionType[](ActionModel#2) num objects
    //#post(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): new String[](ActionModel#3) num objects == new ActionType[](ActionModel#2) num objects
    //#post(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): new String[](ActionModel#3).length == new ActionType[](ActionModel#2) num objects
    //#post(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): new ActionType[](ActionModel#2)[0..+Inf] == undefined
    //#post(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): new ActionType[](ActionModel#2)[0..+Inf] == null
    //#post(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): new ServerManager(getServerManager#1).servers == new ActionType[](ActionModel#2)[0..+Inf]
    //#post(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): new String[](ActionModel#3)[0..+Inf] == new ActionType[](ActionModel#2)[0..+Inf]
    //#post(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): new ConditionTree(parseStack#3) num objects <= 1
    //#post(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): new ConditionTree(parseStack#3).__Tag == com/dmdirc/actions/ConditionTree
    //#post(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): new ConditionTree(parseStack#3).argument == -1
    //#post(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): new ConditionTree(parseStack#3).leftArg == null
    //#post(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): new ConditionTree(parseStack#3).op == &com.dmdirc.actions.ConditionTree$OPERATION__static_init.new ConditionTree$OPERATION(ConditionTree$OPERATION__static_init#5)
    //#post(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): new ConditionTree(parseStack#3).rightArg == null
    //#post(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): init'ed(new ConditionTree(readTerm#1) num objects)
    //#post(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): new ConditionTree(readTerm#1).__Tag not init'ed, if init'ed
    //#post(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): new ConditionTree(readTerm#1).argument == 0, if init'ed
    //#post(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): new ConditionTree(readTerm#1).leftArg == null
    //#post(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): new ConditionTree(readTerm#1).op == null
    //#post(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): new ConditionTree(readTerm#1).rightArg == null
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): Effects-of-calling:java.util.Deque:pollFirst
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): Effects-of-calling:java.lang.Character:instanceof
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): Effects-of-calling:java.lang.Character:charValue
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): Effects-of-calling:java.util.Deque:isEmpty
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): Effects-of-calling:readTerm
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): Effects-of-calling:java.util.ArrayDeque
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): Effects-of-calling:java.util.Deque:pollLast
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): Effects-of-calling:java.util.Deque:addFirst
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): Effects-of-calling:parseStack
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): Effects-of-calling:java.util.Deque:poll
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): Effects-of-calling:java.util.Deque:add
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): Effects-of-calling:java.util.Deque:size
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): Effects-of-calling:java.lang.String:length
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): Effects-of-calling:java.lang.String:charAt
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): Effects-of-calling:java.lang.String:valueOf
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): Effects-of-calling:java.lang.Integer:parseInt
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): Effects-of-calling:java.lang.Character:valueOf
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)): Effects-of-calling:java.lang.StringBuilder:length
                ConditionTree.createConjunction(conditions.size()), newFormat);
    }
    //#Action.java:117: end of method: void com.dmdirc.actions.Action.com.dmdirc.actions.Action(String, String, ActionType[], String[], List, String)

    /**
     * Creates a new instance of Action with the specified properties and saves
     * it to disk.
     *
     * @param group The group the action belongs to
     * @param name The name of the action
     * @param triggers The triggers to use
     * @param response The response to use
     * @param conditions The conditions to use
     * @param conditionTree The condition tree to use
     * @param newFormat The new formatter to use
     */
    public Action(final String group, final String name,
            final ActionType[] triggers, final String[] response,
            final List<ActionCondition> conditions,
            final ConditionTree conditionTree, final String newFormat) {
        super(group, name, triggers, response, conditions, conditionTree, newFormat);
    //#Action.java:135: method: void com.dmdirc.actions.Action.com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)
    //#input(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): ".DMDirc"._tainted
    //#input(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): "DMDirc"._tainted
    //#input(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): "Invalid alias action (no name): "._tainted
    //#input(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): "Invalid alias action (wrong trigger): "._tainted
    //#input(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): "Invalid perform action: "._tainted
    //#input(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): "Library"._tainted
    //#input(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): "Preferences"._tainted
    //#input(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): "actions"._tainted
    //#input(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): __Descendant_Table[com/dmdirc/actions/Action]
    //#input(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): __Descendant_Table[others]
    //#input(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): __Dispatch_Table.getConditions()Ljava/util/List;
    //#input(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): __Dispatch_Table.getGroup()Ljava/lang/String;
    //#input(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): __Dispatch_Table.getName()Ljava/lang/String;
    //#input(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): __Dispatch_Table.getTriggers()[Lcom/dmdirc/actions/interfaces/ActionType;
    //#input(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): __Dispatch_Table.save()V
    //#input(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): com.dmdirc.actions.CoreActionType__static_init.new CoreActionType(CoreActionType__static_init#71).__Tag
    //#input(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): com.dmdirc.actions.CoreActionType__static_init.new CoreActionType(CoreActionType__static_init#71).type
    //#input(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): com.dmdirc.actions.metatypes.ActionEvents__static_init.new ActionEvents(ActionEvents__static_init#1).__Tag
    //#input(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): com/dmdirc/GlobalWindow.__Descendant_Table[com/dmdirc/GlobalWindow]
    //#input(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): com/dmdirc/GlobalWindow.__Descendant_Table[others]
    //#input(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): com/dmdirc/GlobalWindow.__Dispatch_Table.getTabCompleter()Lcom/dmdirc/ui/input/TabCompleter;
    //#input(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): com/dmdirc/GlobalWindow.globalWindow.__Tag
    //#input(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): com/dmdirc/GlobalWindow.globalWindow.tabCompleter
    //#input(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): com/dmdirc/Main.configdir
    //#input(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): com/dmdirc/Main.configdir._tainted
    //#input(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): com/dmdirc/Server.__Descendant_Table[com/dmdirc/Server]
    //#input(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): com/dmdirc/Server.__Descendant_Table[others]
    //#input(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): com/dmdirc/Server.__Dispatch_Table.getTabCompleter()Lcom/dmdirc/ui/input/TabCompleter;
    //#input(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): com/dmdirc/ServerManager.__Class_Obj.__Lock
    //#input(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): com/dmdirc/ServerManager.me
    //#input(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): com/dmdirc/ServerManager.me.servers
    //#input(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): com/dmdirc/actions/ActionCondition.__Descendant_Table[com/dmdirc/actions/ActionCondition]
    //#input(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): com/dmdirc/actions/ActionCondition.__Descendant_Table[others]
    //#input(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): com/dmdirc/actions/ActionCondition.__Dispatch_Table.getArg()I
    //#input(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): com/dmdirc/actions/ActionCondition.__Dispatch_Table.getComponent()Lcom/dmdirc/actions/interfaces/ActionComponent;
    //#input(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): com/dmdirc/actions/ActionCondition.__Dispatch_Table.getTarget()Ljava/lang/String;
    //#input(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): com/dmdirc/actions/ActionGroup.__Descendant_Table[com/dmdirc/actions/ActionGroup]
    //#input(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): com/dmdirc/actions/ActionGroup.__Descendant_Table[com/dmdirc/actions/wrappers/AliasWrapper]
    //#input(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): com/dmdirc/actions/ActionGroup.__Descendant_Table[com/dmdirc/actions/wrappers/PerformWrapper]
    //#input(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): com/dmdirc/actions/ActionGroup.__Descendant_Table[others]
    //#input(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): com/dmdirc/actions/ActionGroup.__Dispatch_Table.add(Lcom/dmdirc/actions/Action;)V
    //#input(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): com/dmdirc/actions/ActionManager.actions
    //#input(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): com/dmdirc/actions/ActionManager.groups
    //#input(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): com/dmdirc/actions/ActionManager.killSwitch
    //#input(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): com/dmdirc/actions/ActionManager.listeners
    //#input(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): com/dmdirc/actions/CoreActionComponent.SERVER_NAME
    //#input(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): com/dmdirc/actions/CoreActionComponent.SERVER_NETWORK
    //#input(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): com/dmdirc/actions/CoreActionType.ACTION_CREATED
    //#input(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): com/dmdirc/actions/CoreActionType.SERVER_CONNECTED
    //#input(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): com/dmdirc/actions/CoreActionType.UNKNOWN_COMMAND
    //#input(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): com/dmdirc/actions/CoreActionType.__Dispatch_Table.getType()Lcom/dmdirc/actions/interfaces/ActionMetaType;
    //#input(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/interfaces/ActionMetaType]
    //#input(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/ActionEvents]
    //#input(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/ChannelEvents]
    //#input(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/ClientEvents]
    //#input(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/PluginEvents]
    //#input(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/QueryEvents]
    //#input(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/ServerEvents]
    //#input(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/addons/dcc/actions/DCCEvents]
    //#input(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[others]
    //#input(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): com/dmdirc/actions/interfaces/ActionMetaType.__Dispatch_Table.getArity()I
    //#input(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): com/dmdirc/actions/interfaces/ActionType.__Descendant_Table[com/dmdirc/actions/CoreActionType]
    //#input(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): com/dmdirc/actions/interfaces/ActionType.__Descendant_Table[com/dmdirc/actions/interfaces/ActionType]
    //#input(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): com/dmdirc/actions/interfaces/ActionType.__Descendant_Table[com/dmdirc/addons/dcc/actions/DCCActions]
    //#input(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): com/dmdirc/actions/interfaces/ActionType.__Descendant_Table[others]
    //#input(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): com/dmdirc/actions/interfaces/ActionType.__Dispatch_Table.getType()Lcom/dmdirc/actions/interfaces/ActionMetaType;
    //#input(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): com/dmdirc/actions/metatypes/ActionEvents.__Dispatch_Table.getArity()I
    //#input(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): com/dmdirc/actions/metatypes/ChannelEvents.__Dispatch_Table.getArity()I
    //#input(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): com/dmdirc/actions/metatypes/ClientEvents.__Dispatch_Table.getArity()I
    //#input(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): com/dmdirc/actions/metatypes/PluginEvents.__Dispatch_Table.getArity()I
    //#input(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): com/dmdirc/actions/metatypes/QueryEvents.__Dispatch_Table.getArity()I
    //#input(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): com/dmdirc/actions/metatypes/ServerEvents.__Dispatch_Table.getArity()I
    //#input(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): com/dmdirc/actions/wrappers/AliasWrapper.__Dispatch_Table.add(Lcom/dmdirc/actions/Action;)V
    //#input(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): com/dmdirc/actions/wrappers/AliasWrapper.com.dmdirc.logger.ErrorLevel.MEDIUM
    //#input(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): com/dmdirc/actions/wrappers/AliasWrapper.com.dmdirc.ui.input.TabCompletionType.COMMAND
    //#input(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): com/dmdirc/actions/wrappers/PerformWrapper.__Dispatch_Table.add(Lcom/dmdirc/actions/Action;)V
    //#input(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): com/dmdirc/actions/wrappers/PerformWrapper.com.dmdirc.logger.ErrorLevel.MEDIUM
    //#input(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): com/dmdirc/addons/dcc/actions/DCCActions.__Dispatch_Table.getType()Lcom/dmdirc/actions/interfaces/ActionMetaType;
    //#input(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): com/dmdirc/addons/dcc/actions/DCCEvents.__Dispatch_Table.getArity()I
    //#input(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): conditionTree
    //#input(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): conditions
    //#input(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): group
    //#input(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): group._tainted
    //#input(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): java.io.File.separator
    //#input(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): java.io.File.separator._tainted
    //#input(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): name
    //#input(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): name._tainted
    //#input(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): newFormat
    //#input(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): response
    //#input(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): response.length
    //#input(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): response[0..+Inf]
    //#input(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): this
    //#input(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): this.__Tag
    //#input(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): triggers
    //#input(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): triggers.length
    //#input(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): triggers[0..+Inf]
    //#output(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): com/dmdirc/Main.configdir
    //#output(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): com/dmdirc/ServerManager.me
    //#output(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): java.lang.StringBuilder:toString(...)._tainted
    //#output(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): new ActionType[](ActionModel#2) num objects
    //#output(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): new ActionType[](ActionModel#2).length
    //#output(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): new ActionType[](ActionModel#2)[0]
    //#output(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): new ActionType[](ActionModel#2)[1..+Inf]
    //#output(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): new ArrayList(ActionModel#1) num objects
    //#output(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): new ArrayList(ServerManager#1) num objects
    //#output(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): new ServerManager(getServerManager#1) num objects
    //#output(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): new ServerManager(getServerManager#1).__Tag
    //#output(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): new ServerManager(getServerManager#1).servers
    //#output(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): new String[](ActionModel#3) num objects
    //#output(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): new String[](ActionModel#3).length
    //#output(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): new String[](ActionModel#3)[0..+Inf]
    //#output(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): this.__Tag
    //#output(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): this.conditionTree
    //#output(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): this.conditions
    //#output(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): this.config
    //#output(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): this.group
    //#output(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): this.location
    //#output(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): this.modified
    //#output(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): this.name
    //#output(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): this.newFormat
    //#output(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): this.response
    //#output(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): this.triggers
    //#new obj(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): java.lang.StringBuilder:toString(...)
    //#new obj(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): new ActionType[](ActionModel#2)
    //#new obj(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): new ArrayList(ActionModel#1)
    //#new obj(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): new ArrayList(ServerManager#1)
    //#new obj(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): new ServerManager(getServerManager#1)
    //#new obj(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): new String[](ActionModel#3)
    //#pre[7] (void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): init'ed(com/dmdirc/actions/ActionManager.killSwitch)
    //#pre[21] (void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): init'ed(com/dmdirc/Main.configdir)
    //#pre[23] (void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): this.__Tag == com/dmdirc/actions/Action
    //#pre[24] (void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): response != null
    //#pre[28] (void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): triggers != null
    //#pre[1] (void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): (soft) com.dmdirc.actions.CoreActionType__static_init.new CoreActionType(CoreActionType__static_init#71).type != null
    //#pre[15] (void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): (soft) conditions init'ed
    //#pre[22] (void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): (soft) init'ed(com/dmdirc/ServerManager.me)
    //#pre[26] (void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): (soft) init'ed(response[0..+Inf])
    //#pre[29] (void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): (soft) triggers.length <= 4_294_967_295
    //#pre[30] (void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): (soft) init'ed(triggers[0..+Inf])
    //#presumption(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): init'ed(java.io.File.separator)
    //#post(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): com/dmdirc/Main.configdir == One-of{old com/dmdirc/Main.configdir, &java.lang.StringBuilder:toString(...)}
    //#post(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): com/dmdirc/Main.configdir != null
    //#post(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): init'ed(com/dmdirc/ServerManager.me)
    //#post(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): init'ed(java.lang.StringBuilder:toString(...)._tainted)
    //#post(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): java.lang.StringBuilder:toString(...)._tainted == 0
    //#post(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): this.__Tag == com/dmdirc/actions/Action
    //#post(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): this.conditionTree == conditionTree
    //#post(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): init'ed(this.conditionTree)
    //#post(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): this.conditions == conditions
    //#post(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): init'ed(this.conditions)
    //#post(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): init'ed(this.config)
    //#post(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): this.group == group
    //#post(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): init'ed(this.group)
    //#post(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): this.location == &java.lang.StringBuilder:toString(...)
    //#post(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): this.modified == 1
    //#post(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): new ActionType[](ActionModel#2) num objects == 1
    //#post(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): new ArrayList(ActionModel#1) num objects == 1
    //#post(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): new String[](ActionModel#3) num objects == 1
    //#post(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): this.name == name
    //#post(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): init'ed(this.name)
    //#post(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): this.newFormat == newFormat
    //#post(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): init'ed(this.newFormat)
    //#post(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): this.response == &new String[](ActionModel#3)
    //#post(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): this.triggers == &new ActionType[](ActionModel#2)
    //#post(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): new ActionType[](ActionModel#2).length == triggers.length
    //#post(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): new ActionType[](ActionModel#2).length <= 4_294_967_295
    //#post(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): new ActionType[](ActionModel#2)[0] == One-of{triggers[0..+Inf], undefined}
    //#post(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): init'ed(new ActionType[](ActionModel#2)[0])
    //#post(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): new ActionType[](ActionModel#2)[1..+Inf] == One-of{triggers[0..+Inf], undefined}
    //#post(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): new ArrayList(ServerManager#1) num objects <= 1
    //#post(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): new ArrayList(ServerManager#1) num objects == undefined
    //#post(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): new ArrayList(ServerManager#1) num objects == 0, if init'ed
    //#post(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): new ServerManager(getServerManager#1) num objects == new ArrayList(ServerManager#1) num objects
    //#post(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): new ServerManager(getServerManager#1).__Tag == new ArrayList(ServerManager#1) num objects
    //#post(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): new ServerManager(getServerManager#1) num objects <= 1
    //#post(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): init'ed(new ServerManager(getServerManager#1).__Tag)
    //#post(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): init'ed(new ServerManager(getServerManager#1).servers)
    //#post(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): new ServerManager(getServerManager#1).servers == undefined
    //#post(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): new ServerManager(getServerManager#1).servers == null
    //#post(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): new String[](ActionModel#3).length == response.length
    //#post(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): init'ed(new String[](ActionModel#3).length)
    //#post(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): new String[](ActionModel#3)[0..+Inf] == One-of{response[0..+Inf], undefined}
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): Effects-of-calling:com.dmdirc.actions.ConditionTree$OPERATION:ordinal
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): Effects-of-calling:com.dmdirc.logger.Logger:assertTrue
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): Effects-of-calling:getType
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): Effects-of-calling:com.dmdirc.util.MapList:containsKey
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): Effects-of-calling:com.dmdirc.util.MapList:get
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): Effects-of-calling:java.util.ArrayList
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): Effects-of-calling:java.util.ArrayList:iterator
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): Effects-of-calling:trigger
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): Effects-of-calling:getArity
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): Effects-of-calling:com.dmdirc.interfaces.ActionListener:processEvent
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): Effects-of-calling:triggerActions
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): Effects-of-calling:getConfigDir
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): Effects-of-calling:java.lang.System:getProperty
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): Effects-of-calling:java.util.Map:put
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): Effects-of-calling:java.util.HashMap
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): Effects-of-calling:java.util.Map:get
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): Effects-of-calling:getArgTypes
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): Effects-of-calling:java.util.Deque:pollFirst
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): Effects-of-calling:java.lang.Character:instanceof
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): Effects-of-calling:java.lang.Character:charValue
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): Effects-of-calling:java.util.Deque:isEmpty
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): Effects-of-calling:readTerm
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): Effects-of-calling:java.util.ArrayDeque
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): Effects-of-calling:java.util.Deque:pollLast
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): Effects-of-calling:java.util.Deque:addFirst
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): Effects-of-calling:parseStack
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): Effects-of-calling:java.util.Deque:poll
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): Effects-of-calling:java.util.Deque:add
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): Effects-of-calling:java.util.Deque:size
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): Effects-of-calling:java.lang.String:length
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): Effects-of-calling:java.lang.String:charAt
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): Effects-of-calling:java.lang.String:valueOf
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): Effects-of-calling:java.lang.Integer:parseInt
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): Effects-of-calling:java.lang.Character:valueOf
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): Effects-of-calling:com.dmdirc.util.MapList:add
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): Effects-of-calling:getTriggers
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): Effects-of-calling:java.lang.Object:equals
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): Effects-of-calling:java.util.List:iterator
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): Effects-of-calling:getTabCompleter
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): Effects-of-calling:getConditions
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): Effects-of-calling:com.dmdirc.commandparser.CommandManager:getCommandChar
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): Effects-of-calling:getGroup
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): Effects-of-calling:java.util.List:get
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): Effects-of-calling:java.util.List:size
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): Effects-of-calling:add
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): Effects-of-calling:getName
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): Effects-of-calling:com.dmdirc.logger.Logger:userError
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): Effects-of-calling:java.util.List:add
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): Effects-of-calling:getGlobalWindow
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): Effects-of-calling:com.dmdirc.ui.input.TabCompleter:addEntry
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): Effects-of-calling:java.lang.StringBuilder:length
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): Effects-of-calling:com.dmdirc.config.IdentityManager:getGlobalConfig
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): Effects-of-calling:com.dmdirc.config.ConfigManager:getOptions
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): Effects-of-calling:java.lang.StringBuilder:indexOf
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): Effects-of-calling:java.lang.StringBuilder:replace
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): Effects-of-calling:java.util.Map:entrySet
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): Effects-of-calling:java.util.Set:iterator
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): Effects-of-calling:java.util.Map$Entry:getKey
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): Effects-of-calling:java.util.Map$Entry:getValue
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): Effects-of-calling:[Ljava.lang.String;:instanceof
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): Effects-of-calling:java.lang.String:instanceof
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): Effects-of-calling:java.lang.String:split
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): Effects-of-calling:java.lang.StringBuffer
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): Effects-of-calling:java.lang.StringBuffer:length
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): Effects-of-calling:java.lang.StringBuffer:insert
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): Effects-of-calling:java.lang.StringBuffer:toString
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): Effects-of-calling:doServerSubstitutions
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): Effects-of-calling:doComponentSubstitutions
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): Effects-of-calling:getServer
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): Effects-of-calling:getState
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): Effects-of-calling:com.dmdirc.ServerState:equals
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): Effects-of-calling:getCompatibleComponents
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): Effects-of-calling:java.lang.Object:toString
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): Effects-of-calling:get
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): Effects-of-calling:test
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): Effects-of-calling:evaluate
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): Effects-of-calling:getUI
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): Effects-of-calling:com.dmdirc.ui.interfaces.UIController:getActiveWindow
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): Effects-of-calling:getFrame
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): Effects-of-calling:com.dmdirc.ui.interfaces.InputWindow:instanceof
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): Effects-of-calling:com.dmdirc.commandparser.parsers.GlobalCommandParser:getGlobalCommandParser
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): Effects-of-calling:com.dmdirc.ui.interfaces.InputWindow:getCommandParser
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): Effects-of-calling:com.dmdirc.commandparser.parsers.CommandParser:parseCommand
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): Effects-of-calling:java.lang.StringBuffer:setLength
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): Effects-of-calling:java.lang.StringBuffer:append
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): Effects-of-calling:java.lang.String:startsWith
    //#unanalyzed(void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)): Effects-of-calling:java.lang.System:getenv

        final String dir = ActionManager.getDirectory() + group + File.separator;
        location = dir + name;

        new File(dir).mkdirs();
        
        ActionManager.processEvent(CoreActionType.ACTION_CREATED, null, this);
    //#Action.java:142: ?!precondition failure
    //#    com/dmdirc/actions/ActionManager.processEvent: (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}
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.actions.Action
    //#    method: void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)
    //#    basic block: Entry_BB_1
    //#    assertion: (soft) undefined in {340_736, 341_760, 342_528, 343_040, 343_552, 344_064, 344_576, 362_496}
    //#    callee: void com/dmdirc/actions/ActionManager.processEvent(ActionType, StringBuffer, Object[])
    //#    callee assertion: (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}
    //#    callee file: ActionManager.java
    //#    callee precondition index: [29]
    //#    callee srcpos: 365
    //#    VN: undefined
    //#    Expected: {340_736, 341_760, 342_528, 343_040, 343_552, 344_064, 344_576, 362_496}
    //#    Bad: {0, Invalid}
    //#    Attribs:  Int  Bad singleton  Bad overlaps +/-1000  Soft  Bad < Exp

        save();
    //#Action.java:144: Warning: call too complex - analysis skipped
    //#    call on void save()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.Action
    //#    method: void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)
    //#    unanalyzed callee: void save()
        
        ActionManager.registerAction(this);
    //#Action.java:146: ?precondition failure
    //#    com/dmdirc/actions/ActionManager.registerAction: (soft) init'ed(action.triggers[0])
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.actions.Action
    //#    method: void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)
    //#    basic block: Entry_BB_1
    //#    assertion: (soft) init'ed(new ActionType[](ActionModel#2)[0])
    //#    callee: void com/dmdirc/actions/ActionManager.registerAction(Action)
    //#    callee assertion: (soft) init'ed(action.triggers[0])
    //#    callee file: ActionManager.java
    //#    callee precondition index: [9]
    //#    callee srcpos: 288
    //#    VN: new ActionType[](ActionModel#2)[0]
    //#    Expected: Univ-VN-Set
    //#    Bad: {Invalid}
    //#    Attribs:  Ptr  Soft  Bad only invalid
    //#Action.java:146: ?precondition failure
    //#    com/dmdirc/actions/ActionManager.registerAction: (soft) init'ed(action.triggers[1..+Inf])
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.actions.Action
    //#    method: void com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)
    //#    basic block: Entry_BB_1
    //#    assertion: (soft) init'ed(this.triggers[1..+Inf])
    //#    callee: void com/dmdirc/actions/ActionManager.registerAction(Action)
    //#    callee assertion: (soft) init'ed(action.triggers[1..+Inf])
    //#    callee file: ActionManager.java
    //#    callee precondition index: [10]
    //#    callee srcpos: 288
    //#    VN: this.triggers[1..+Inf]
    //#    Expected: Univ-VN-Set
    //#    Bad: {Invalid}
    //#    Attribs:  Ptr  Soft  Bad only invalid
    }
    //#Action.java:147: end of method: void com.dmdirc.actions.Action.com.dmdirc.actions.Action(String, String, ActionType[], String[], List, ConditionTree, String)

    /**
     * Loads this action from the config instance.
     */
    protected void loadActionFromConfig() {
        if (config.isFlatDomain(DOMAIN_TRIGGERS)) {
    //#Action.java:153: method: void com.dmdirc.actions.Action.loadActionFromConfig()
    //#Action.java:153: Warning: method not available - call not analyzed
    //#    call on bool com.dmdirc.util.ConfigFile:isFlatDomain(String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.Action
    //#    method: void loadActionFromConfig()
    //#    unanalyzed callee: bool com.dmdirc.util.ConfigFile:isFlatDomain(String)
    //#input(void loadActionFromConfig()): " but there are"._tainted
    //#input(void loadActionFromConfig()): " cannot be applied to "._tainted
    //#input(void loadActionFromConfig()): " conditions"._tainted
    //#input(void loadActionFromConfig()): " not found"._tainted
    //#input(void loadActionFromConfig()): " only "._tainted
    //#input(void loadActionFromConfig()): "."._tainted
    //#input(void loadActionFromConfig()): ": "._tainted
    //#input(void loadActionFromConfig()): "Comparison cannot be applied to specified component: "._tainted
    //#input(void loadActionFromConfig()): "Component "._tainted
    //#input(void loadActionFromConfig()): "Component cannot be applied to specified arg in condition: "._tainted
    //#input(void loadActionFromConfig()): "Condition tree references condition "._tainted
    //#input(void loadActionFromConfig()): "Error when parsing action: "._tainted
    //#input(void loadActionFromConfig()): "Invalid alias action (no name): "._tainted
    //#input(void loadActionFromConfig()): "Invalid alias action (wrong trigger): "._tainted
    //#input(void loadActionFromConfig()): "Invalid argument number specified: "._tainted
    //#input(void loadActionFromConfig()): "Invalid comparison specified: "._tainted
    //#input(void loadActionFromConfig()): "Invalid perform action: "._tainted
    //#input(void loadActionFromConfig()): "Invalid trigger specified: "._tainted
    //#input(void loadActionFromConfig()): "No response specified"._tainted
    //#input(void loadActionFromConfig()): "No starget specified"._tainted
    //#input(void loadActionFromConfig()): "No target specified for condition"._tainted
    //#input(void loadActionFromConfig()): "No trigger specified"._tainted
    //#input(void loadActionFromConfig()): "Triggers are not compatible"._tainted
    //#input(void loadActionFromConfig()): "Unable to parse condition tree"._tainted
    //#input(void loadActionFromConfig()): "Unknown component: "._tainted
    //#input(void loadActionFromConfig()): "condition "._tainted
    //#input(void loadActionFromConfig()): "setting "._tainted
    //#input(void loadActionFromConfig()): DOMAIN_CONDITIONTREE
    //#input(void loadActionFromConfig()): DOMAIN_FORMAT
    //#input(void loadActionFromConfig()): DOMAIN_METADATA
    //#input(void loadActionFromConfig()): DOMAIN_RESPONSE
    //#input(void loadActionFromConfig()): DOMAIN_TRIGGERS
    //#input(void loadActionFromConfig()): __Descendant_Table[com/dmdirc/actions/Action]
    //#input(void loadActionFromConfig()): __Descendant_Table[others]
    //#input(void loadActionFromConfig()): __Dispatch_Table.getConditions()Ljava/util/List;
    //#input(void loadActionFromConfig()): __Dispatch_Table.getGroup()Ljava/lang/String;
    //#input(void loadActionFromConfig()): __Dispatch_Table.getName()Ljava/lang/String;
    //#input(void loadActionFromConfig()): __Dispatch_Table.getTriggers()[Lcom/dmdirc/actions/interfaces/ActionType;
    //#input(void loadActionFromConfig()): com.dmdirc.logger.ErrorLevel.LOW
    //#input(void loadActionFromConfig()): com/dmdirc/GlobalWindow.__Descendant_Table[com/dmdirc/GlobalWindow]
    //#input(void loadActionFromConfig()): com/dmdirc/GlobalWindow.__Descendant_Table[others]
    //#input(void loadActionFromConfig()): com/dmdirc/GlobalWindow.__Dispatch_Table.getTabCompleter()Lcom/dmdirc/ui/input/TabCompleter;
    //#input(void loadActionFromConfig()): com/dmdirc/GlobalWindow.globalWindow.__Tag
    //#input(void loadActionFromConfig()): com/dmdirc/GlobalWindow.globalWindow.tabCompleter
    //#input(void loadActionFromConfig()): com/dmdirc/Server.__Descendant_Table[com/dmdirc/Server]
    //#input(void loadActionFromConfig()): com/dmdirc/Server.__Descendant_Table[others]
    //#input(void loadActionFromConfig()): com/dmdirc/Server.__Dispatch_Table.getTabCompleter()Lcom/dmdirc/ui/input/TabCompleter;
    //#input(void loadActionFromConfig()): com/dmdirc/ServerManager.__Class_Obj.__Lock
    //#input(void loadActionFromConfig()): com/dmdirc/ServerManager.me
    //#input(void loadActionFromConfig()): com/dmdirc/ServerManager.me.servers
    //#input(void loadActionFromConfig()): com/dmdirc/actions/ActionComponentChain.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void loadActionFromConfig()): com/dmdirc/actions/ActionComponentChain.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(void loadActionFromConfig()): com/dmdirc/actions/ActionCondition.__Descendant_Table[com/dmdirc/actions/ActionCondition]
    //#input(void loadActionFromConfig()): com/dmdirc/actions/ActionCondition.__Descendant_Table[others]
    //#input(void loadActionFromConfig()): com/dmdirc/actions/ActionCondition.__Dispatch_Table.getArg()I
    //#input(void loadActionFromConfig()): com/dmdirc/actions/ActionCondition.__Dispatch_Table.getComponent()Lcom/dmdirc/actions/interfaces/ActionComponent;
    //#input(void loadActionFromConfig()): com/dmdirc/actions/ActionCondition.__Dispatch_Table.getTarget()Ljava/lang/String;
    //#input(void loadActionFromConfig()): com/dmdirc/actions/ActionGroup.__Descendant_Table[com/dmdirc/actions/ActionGroup]
    //#input(void loadActionFromConfig()): com/dmdirc/actions/ActionGroup.__Descendant_Table[com/dmdirc/actions/wrappers/AliasWrapper]
    //#input(void loadActionFromConfig()): com/dmdirc/actions/ActionGroup.__Descendant_Table[com/dmdirc/actions/wrappers/PerformWrapper]
    //#input(void loadActionFromConfig()): com/dmdirc/actions/ActionGroup.__Descendant_Table[others]
    //#input(void loadActionFromConfig()): com/dmdirc/actions/ActionGroup.__Dispatch_Table.add(Lcom/dmdirc/actions/Action;)V
    //#input(void loadActionFromConfig()): com/dmdirc/actions/ActionGroup.__Dispatch_Table.getSettings()Ljava/util/Map;
    //#input(void loadActionFromConfig()): com/dmdirc/actions/ActionGroup.__Dispatch_Table.setAuthor(Ljava/lang/String;)V
    //#input(void loadActionFromConfig()): com/dmdirc/actions/ActionGroup.__Dispatch_Table.setComponent(I)V
    //#input(void loadActionFromConfig()): com/dmdirc/actions/ActionGroup.__Dispatch_Table.setDescription(Ljava/lang/String;)V
    //#input(void loadActionFromConfig()): com/dmdirc/actions/ActionGroup.__Dispatch_Table.setVersion(I)V
    //#input(void loadActionFromConfig()): com/dmdirc/actions/ActionManager.actionComparisons
    //#input(void loadActionFromConfig()): com/dmdirc/actions/ActionManager.actionComponents
    //#input(void loadActionFromConfig()): com/dmdirc/actions/ActionManager.actionTypes
    //#input(void loadActionFromConfig()): com/dmdirc/actions/ActionManager.actions
    //#input(void loadActionFromConfig()): com/dmdirc/actions/ActionManager.groups
    //#input(void loadActionFromConfig()): com/dmdirc/actions/ConditionTree$OPERATION.AND
    //#input(void loadActionFromConfig()): com/dmdirc/actions/ConditionTree$OPERATION.NOOP
    //#input(void loadActionFromConfig()): com/dmdirc/actions/ConditionTree$OPERATION.NOT
    //#input(void loadActionFromConfig()): com/dmdirc/actions/ConditionTree$OPERATION.OR
    //#input(void loadActionFromConfig()): com/dmdirc/actions/ConditionTree$OPERATION.VAR
    //#input(void loadActionFromConfig()): com/dmdirc/actions/ConditionTree.__Descendant_Table[com/dmdirc/actions/ConditionTree]
    //#input(void loadActionFromConfig()): com/dmdirc/actions/ConditionTree.__Descendant_Table[others]
    //#input(void loadActionFromConfig()): com/dmdirc/actions/ConditionTree.__Dispatch_Table.getMaximumArgument()I
    //#input(void loadActionFromConfig()): com/dmdirc/actions/CoreActionComparison$1.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void loadActionFromConfig()): com/dmdirc/actions/CoreActionComparison$10.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void loadActionFromConfig()): com/dmdirc/actions/CoreActionComparison$11.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void loadActionFromConfig()): com/dmdirc/actions/CoreActionComparison$12.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void loadActionFromConfig()): com/dmdirc/actions/CoreActionComparison$2.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void loadActionFromConfig()): com/dmdirc/actions/CoreActionComparison$3.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void loadActionFromConfig()): com/dmdirc/actions/CoreActionComparison$4.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void loadActionFromConfig()): com/dmdirc/actions/CoreActionComparison$5.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void loadActionFromConfig()): com/dmdirc/actions/CoreActionComparison$6.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void loadActionFromConfig()): com/dmdirc/actions/CoreActionComparison$7.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void loadActionFromConfig()): com/dmdirc/actions/CoreActionComparison$8.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void loadActionFromConfig()): com/dmdirc/actions/CoreActionComparison$9.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void loadActionFromConfig()): com/dmdirc/actions/CoreActionComparison.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void loadActionFromConfig()): com/dmdirc/actions/CoreActionComponent$1.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void loadActionFromConfig()): com/dmdirc/actions/CoreActionComponent$1.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(void loadActionFromConfig()): com/dmdirc/actions/CoreActionComponent$10.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void loadActionFromConfig()): com/dmdirc/actions/CoreActionComponent$10.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(void loadActionFromConfig()): com/dmdirc/actions/CoreActionComponent$11.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void loadActionFromConfig()): com/dmdirc/actions/CoreActionComponent$11.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(void loadActionFromConfig()): com/dmdirc/actions/CoreActionComponent$12.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void loadActionFromConfig()): com/dmdirc/actions/CoreActionComponent$12.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(void loadActionFromConfig()): com/dmdirc/actions/CoreActionComponent$13.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void loadActionFromConfig()): com/dmdirc/actions/CoreActionComponent$13.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(void loadActionFromConfig()): com/dmdirc/actions/CoreActionComponent$14.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void loadActionFromConfig()): com/dmdirc/actions/CoreActionComponent$14.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(void loadActionFromConfig()): com/dmdirc/actions/CoreActionComponent$15.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void loadActionFromConfig()): com/dmdirc/actions/CoreActionComponent$15.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(void loadActionFromConfig()): com/dmdirc/actions/CoreActionComponent$16.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void loadActionFromConfig()): com/dmdirc/actions/CoreActionComponent$16.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(void loadActionFromConfig()): com/dmdirc/actions/CoreActionComponent$17.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void loadActionFromConfig()): com/dmdirc/actions/CoreActionComponent$17.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(void loadActionFromConfig()): com/dmdirc/actions/CoreActionComponent$18.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void loadActionFromConfig()): com/dmdirc/actions/CoreActionComponent$18.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(void loadActionFromConfig()): com/dmdirc/actions/CoreActionComponent$19.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void loadActionFromConfig()): com/dmdirc/actions/CoreActionComponent$19.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(void loadActionFromConfig()): com/dmdirc/actions/CoreActionComponent$2.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void loadActionFromConfig()): com/dmdirc/actions/CoreActionComponent$2.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(void loadActionFromConfig()): com/dmdirc/actions/CoreActionComponent$20.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void loadActionFromConfig()): com/dmdirc/actions/CoreActionComponent$20.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(void loadActionFromConfig()): com/dmdirc/actions/CoreActionComponent$21.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void loadActionFromConfig()): com/dmdirc/actions/CoreActionComponent$21.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(void loadActionFromConfig()): com/dmdirc/actions/CoreActionComponent$22.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void loadActionFromConfig()): com/dmdirc/actions/CoreActionComponent$22.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(void loadActionFromConfig()): com/dmdirc/actions/CoreActionComponent$23.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void loadActionFromConfig()): com/dmdirc/actions/CoreActionComponent$23.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(void loadActionFromConfig()): com/dmdirc/actions/CoreActionComponent$24.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void loadActionFromConfig()): com/dmdirc/actions/CoreActionComponent$24.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(void loadActionFromConfig()): com/dmdirc/actions/CoreActionComponent$25.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void loadActionFromConfig()): com/dmdirc/actions/CoreActionComponent$25.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(void loadActionFromConfig()): com/dmdirc/actions/CoreActionComponent$26.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void loadActionFromConfig()): com/dmdirc/actions/CoreActionComponent$26.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(void loadActionFromConfig()): com/dmdirc/actions/CoreActionComponent$27.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void loadActionFromConfig()): com/dmdirc/actions/CoreActionComponent$27.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(void loadActionFromConfig()): com/dmdirc/actions/CoreActionComponent$3.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void loadActionFromConfig()): com/dmdirc/actions/CoreActionComponent$3.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(void loadActionFromConfig()): com/dmdirc/actions/CoreActionComponent$4.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void loadActionFromConfig()): com/dmdirc/actions/CoreActionComponent$4.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(void loadActionFromConfig()): com/dmdirc/actions/CoreActionComponent$5.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void loadActionFromConfig()): com/dmdirc/actions/CoreActionComponent$5.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(void loadActionFromConfig()): com/dmdirc/actions/CoreActionComponent$6.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void loadActionFromConfig()): com/dmdirc/actions/CoreActionComponent$6.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(void loadActionFromConfig()): com/dmdirc/actions/CoreActionComponent$7.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void loadActionFromConfig()): com/dmdirc/actions/CoreActionComponent$7.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(void loadActionFromConfig()): com/dmdirc/actions/CoreActionComponent$8.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void loadActionFromConfig()): com/dmdirc/actions/CoreActionComponent$8.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(void loadActionFromConfig()): com/dmdirc/actions/CoreActionComponent$9.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void loadActionFromConfig()): com/dmdirc/actions/CoreActionComponent$9.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(void loadActionFromConfig()): com/dmdirc/actions/CoreActionComponent.SERVER_NAME
    //#input(void loadActionFromConfig()): com/dmdirc/actions/CoreActionComponent.SERVER_NETWORK
    //#input(void loadActionFromConfig()): com/dmdirc/actions/CoreActionComponent.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void loadActionFromConfig()): com/dmdirc/actions/CoreActionComponent.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(void loadActionFromConfig()): com/dmdirc/actions/CoreActionType.SERVER_CONNECTED
    //#input(void loadActionFromConfig()): com/dmdirc/actions/CoreActionType.UNKNOWN_COMMAND
    //#input(void loadActionFromConfig()): com/dmdirc/actions/CoreActionType.__Dispatch_Table.getType()Lcom/dmdirc/actions/interfaces/ActionMetaType;
    //#input(void loadActionFromConfig()): com/dmdirc/actions/interfaces/ActionComparison.__Descendant_Table[com/dmdirc/actions/CoreActionComparison$10]
    //#input(void loadActionFromConfig()): com/dmdirc/actions/interfaces/ActionComparison.__Descendant_Table[com/dmdirc/actions/CoreActionComparison$11]
    //#input(void loadActionFromConfig()): com/dmdirc/actions/interfaces/ActionComparison.__Descendant_Table[com/dmdirc/actions/CoreActionComparison$12]
    //#input(void loadActionFromConfig()): com/dmdirc/actions/interfaces/ActionComparison.__Descendant_Table[com/dmdirc/actions/CoreActionComparison$1]
    //#input(void loadActionFromConfig()): com/dmdirc/actions/interfaces/ActionComparison.__Descendant_Table[com/dmdirc/actions/CoreActionComparison$2]
    //#input(void loadActionFromConfig()): com/dmdirc/actions/interfaces/ActionComparison.__Descendant_Table[com/dmdirc/actions/CoreActionComparison$3]
    //#input(void loadActionFromConfig()): com/dmdirc/actions/interfaces/ActionComparison.__Descendant_Table[com/dmdirc/actions/CoreActionComparison$4]
    //#input(void loadActionFromConfig()): com/dmdirc/actions/interfaces/ActionComparison.__Descendant_Table[com/dmdirc/actions/CoreActionComparison$5]
    //#input(void loadActionFromConfig()): com/dmdirc/actions/interfaces/ActionComparison.__Descendant_Table[com/dmdirc/actions/CoreActionComparison$6]
    //#input(void loadActionFromConfig()): com/dmdirc/actions/interfaces/ActionComparison.__Descendant_Table[com/dmdirc/actions/CoreActionComparison$7]
    //#input(void loadActionFromConfig()): com/dmdirc/actions/interfaces/ActionComparison.__Descendant_Table[com/dmdirc/actions/CoreActionComparison$8]
    //#input(void loadActionFromConfig()): com/dmdirc/actions/interfaces/ActionComparison.__Descendant_Table[com/dmdirc/actions/CoreActionComparison$9]
    //#input(void loadActionFromConfig()): com/dmdirc/actions/interfaces/ActionComparison.__Descendant_Table[com/dmdirc/actions/CoreActionComparison]
    //#input(void loadActionFromConfig()): com/dmdirc/actions/interfaces/ActionComparison.__Descendant_Table[com/dmdirc/actions/interfaces/ActionComparison]
    //#input(void loadActionFromConfig()): com/dmdirc/actions/interfaces/ActionComparison.__Descendant_Table[others]
    //#input(void loadActionFromConfig()): com/dmdirc/actions/interfaces/ActionComparison.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void loadActionFromConfig()): com/dmdirc/actions/interfaces/ActionComponent.__Descendant_Table[others]
    //#input(void loadActionFromConfig()): com/dmdirc/actions/interfaces/ActionComponent.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void loadActionFromConfig()): com/dmdirc/actions/interfaces/ActionComponent.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(void loadActionFromConfig()): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/interfaces/ActionMetaType]
    //#input(void loadActionFromConfig()): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/ActionEvents]
    //#input(void loadActionFromConfig()): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/ChannelEvents]
    //#input(void loadActionFromConfig()): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/ClientEvents]
    //#input(void loadActionFromConfig()): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/PluginEvents]
    //#input(void loadActionFromConfig()): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/QueryEvents]
    //#input(void loadActionFromConfig()): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/ServerEvents]
    //#input(void loadActionFromConfig()): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/addons/dcc/actions/DCCEvents]
    //#input(void loadActionFromConfig()): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[others]
    //#input(void loadActionFromConfig()): com/dmdirc/actions/interfaces/ActionMetaType.__Dispatch_Table.getArgTypes()[Ljava/lang/Class;
    //#input(void loadActionFromConfig()): com/dmdirc/actions/interfaces/ActionMetaType.__Dispatch_Table.getArity()I
    //#input(void loadActionFromConfig()): com/dmdirc/actions/interfaces/ActionType.__Descendant_Table[com/dmdirc/actions/CoreActionType]
    //#input(void loadActionFromConfig()): com/dmdirc/actions/interfaces/ActionType.__Descendant_Table[com/dmdirc/actions/interfaces/ActionType]
    //#input(void loadActionFromConfig()): com/dmdirc/actions/interfaces/ActionType.__Descendant_Table[com/dmdirc/addons/dcc/actions/DCCActions]
    //#input(void loadActionFromConfig()): com/dmdirc/actions/interfaces/ActionType.__Descendant_Table[others]
    //#input(void loadActionFromConfig()): com/dmdirc/actions/interfaces/ActionType.__Dispatch_Table.getType()Lcom/dmdirc/actions/interfaces/ActionMetaType;
    //#input(void loadActionFromConfig()): com/dmdirc/actions/metatypes/ActionEvents.__Dispatch_Table.getArgTypes()[Ljava/lang/Class;
    //#input(void loadActionFromConfig()): com/dmdirc/actions/metatypes/ActionEvents.__Dispatch_Table.getArity()I
    //#input(void loadActionFromConfig()): com/dmdirc/actions/metatypes/ChannelEvents.__Dispatch_Table.getArgTypes()[Ljava/lang/Class;
    //#input(void loadActionFromConfig()): com/dmdirc/actions/metatypes/ChannelEvents.__Dispatch_Table.getArity()I
    //#input(void loadActionFromConfig()): com/dmdirc/actions/metatypes/ClientEvents.__Dispatch_Table.getArgTypes()[Ljava/lang/Class;
    //#input(void loadActionFromConfig()): com/dmdirc/actions/metatypes/ClientEvents.__Dispatch_Table.getArity()I
    //#input(void loadActionFromConfig()): com/dmdirc/actions/metatypes/PluginEvents.__Dispatch_Table.getArgTypes()[Ljava/lang/Class;
    //#input(void loadActionFromConfig()): com/dmdirc/actions/metatypes/PluginEvents.__Dispatch_Table.getArity()I
    //#input(void loadActionFromConfig()): com/dmdirc/actions/metatypes/QueryEvents.__Dispatch_Table.getArgTypes()[Ljava/lang/Class;
    //#input(void loadActionFromConfig()): com/dmdirc/actions/metatypes/QueryEvents.__Dispatch_Table.getArity()I
    //#input(void loadActionFromConfig()): com/dmdirc/actions/metatypes/ServerEvents.__Dispatch_Table.getArgTypes()[Ljava/lang/Class;
    //#input(void loadActionFromConfig()): com/dmdirc/actions/metatypes/ServerEvents.__Dispatch_Table.getArity()I
    //#input(void loadActionFromConfig()): com/dmdirc/actions/wrappers/AliasWrapper.__Dispatch_Table.add(Lcom/dmdirc/actions/Action;)V
    //#input(void loadActionFromConfig()): com/dmdirc/actions/wrappers/AliasWrapper.__Dispatch_Table.getSettings()Ljava/util/Map;
    //#input(void loadActionFromConfig()): com/dmdirc/actions/wrappers/AliasWrapper.__Dispatch_Table.setAuthor(Ljava/lang/String;)V
    //#input(void loadActionFromConfig()): com/dmdirc/actions/wrappers/AliasWrapper.__Dispatch_Table.setComponent(I)V
    //#input(void loadActionFromConfig()): com/dmdirc/actions/wrappers/AliasWrapper.__Dispatch_Table.setDescription(Ljava/lang/String;)V
    //#input(void loadActionFromConfig()): com/dmdirc/actions/wrappers/AliasWrapper.__Dispatch_Table.setVersion(I)V
    //#input(void loadActionFromConfig()): com/dmdirc/actions/wrappers/AliasWrapper.com.dmdirc.logger.ErrorLevel.MEDIUM
    //#input(void loadActionFromConfig()): com/dmdirc/actions/wrappers/AliasWrapper.com.dmdirc.ui.input.TabCompletionType.COMMAND
    //#input(void loadActionFromConfig()): com/dmdirc/actions/wrappers/PerformWrapper.__Dispatch_Table.add(Lcom/dmdirc/actions/Action;)V
    //#input(void loadActionFromConfig()): com/dmdirc/actions/wrappers/PerformWrapper.__Dispatch_Table.getSettings()Ljava/util/Map;
    //#input(void loadActionFromConfig()): com/dmdirc/actions/wrappers/PerformWrapper.__Dispatch_Table.setAuthor(Ljava/lang/String;)V
    //#input(void loadActionFromConfig()): com/dmdirc/actions/wrappers/PerformWrapper.__Dispatch_Table.setComponent(I)V
    //#input(void loadActionFromConfig()): com/dmdirc/actions/wrappers/PerformWrapper.__Dispatch_Table.setDescription(Ljava/lang/String;)V
    //#input(void loadActionFromConfig()): com/dmdirc/actions/wrappers/PerformWrapper.__Dispatch_Table.setVersion(I)V
    //#input(void loadActionFromConfig()): com/dmdirc/actions/wrappers/PerformWrapper.com.dmdirc.logger.ErrorLevel.MEDIUM
    //#input(void loadActionFromConfig()): com/dmdirc/addons/dcc/actions/DCCActions.__Dispatch_Table.getType()Lcom/dmdirc/actions/interfaces/ActionMetaType;
    //#input(void loadActionFromConfig()): com/dmdirc/addons/dcc/actions/DCCEvents.__Dispatch_Table.getArgTypes()[Ljava/lang/Class;
    //#input(void loadActionFromConfig()): com/dmdirc/addons/dcc/actions/DCCEvents.__Dispatch_Table.getArity()I
    //#input(void loadActionFromConfig()): this
    //#input(void loadActionFromConfig()): this.__Tag
    //#input(void loadActionFromConfig()): this.conditionTree...__Tag
    //#input(void loadActionFromConfig()): this.conditionTree...argument
    //#input(void loadActionFromConfig()): this.conditionTree...leftArg
    //#input(void loadActionFromConfig()): this.conditionTree...op
    //#input(void loadActionFromConfig()): this.conditionTree...rightArg
    //#input(void loadActionFromConfig()): this.conditionTree.__Tag
    //#input(void loadActionFromConfig()): this.conditionTree.argument
    //#input(void loadActionFromConfig()): this.conditionTree.leftArg
    //#input(void loadActionFromConfig()): this.conditionTree.op
    //#input(void loadActionFromConfig()): this.conditionTree.rightArg
    //#input(void loadActionFromConfig()): this.conditions
    //#input(void loadActionFromConfig()): this.config
    //#input(void loadActionFromConfig()): this.group
    //#input(void loadActionFromConfig()): this.group._tainted
    //#input(void loadActionFromConfig()): this.name
    //#input(void loadActionFromConfig()): this.name._tainted
    //#input(void loadActionFromConfig()): this.response.length
    //#input(void loadActionFromConfig()): this.triggers.length
    //#input(void loadActionFromConfig()): this.triggers[0]
    //#input(void loadActionFromConfig()): this.triggers[0].__Tag
    //#input(void loadActionFromConfig()): this.triggers[0].type
    //#input(void loadActionFromConfig()): this.triggers[0].type.__Tag
    //#input(void loadActionFromConfig()): this.triggers[1..+Inf]
    //#input(void loadActionFromConfig()): this.triggers[1..+Inf].__Tag
    //#input(void loadActionFromConfig()): this.triggers[1..+Inf].type
    //#input(void loadActionFromConfig()): this.triggers[1..+Inf].type.__Tag
    //#output(void loadActionFromConfig()): com/dmdirc/ServerManager.me
    //#output(void loadActionFromConfig()): new ActionType[](loadTriggers#1) num objects
    //#output(void loadActionFromConfig()): new ActionType[](loadTriggers#1).length
    //#output(void loadActionFromConfig()): new ActionType[](loadTriggers#1)[0]
    //#output(void loadActionFromConfig()): new ActionType[](loadTriggers#1)[1..+Inf]
    //#output(void loadActionFromConfig()): new ArrayList(ServerManager#1) num objects
    //#output(void loadActionFromConfig()): new ConditionTree(parseStack#3) num objects
    //#output(void loadActionFromConfig()): new ConditionTree(parseStack#3).__Tag
    //#output(void loadActionFromConfig()): new ConditionTree(parseStack#3).argument
    //#output(void loadActionFromConfig()): new ConditionTree(parseStack#3).leftArg
    //#output(void loadActionFromConfig()): new ConditionTree(parseStack#3).op
    //#output(void loadActionFromConfig()): new ConditionTree(parseStack#3).rightArg
    //#output(void loadActionFromConfig()): new ConditionTree(readTerm#1) num objects
    //#output(void loadActionFromConfig()): new ConditionTree(readTerm#1).__Tag
    //#output(void loadActionFromConfig()): new ConditionTree(readTerm#1).argument
    //#output(void loadActionFromConfig()): new ConditionTree(readTerm#1).leftArg
    //#output(void loadActionFromConfig()): new ConditionTree(readTerm#1).op
    //#output(void loadActionFromConfig()): new ConditionTree(readTerm#1).rightArg
    //#output(void loadActionFromConfig()): new ServerManager(getServerManager#1) num objects
    //#output(void loadActionFromConfig()): new ServerManager(getServerManager#1).__Tag
    //#output(void loadActionFromConfig()): new ServerManager(getServerManager#1).servers
    //#output(void loadActionFromConfig()): new String[](loadActionFromConfig#1) num objects
    //#output(void loadActionFromConfig()): new String[](loadActionFromConfig#1).length
    //#output(void loadActionFromConfig()): new String[](loadActionFromConfig#1)[0..4_294_967_295]
    //#output(void loadActionFromConfig()): this.conditionTree
    //#output(void loadActionFromConfig()): this.newFormat
    //#output(void loadActionFromConfig()): this.response
    //#output(void loadActionFromConfig()): this.response[0..4_294_967_295]
    //#output(void loadActionFromConfig()): this.triggers
    //#output(void loadActionFromConfig()): this.triggers[0]
    //#output(void loadActionFromConfig()): this.triggers[1..+Inf]
    //#new obj(void loadActionFromConfig()): new ActionType[](loadTriggers#1)
    //#new obj(void loadActionFromConfig()): new ArrayList(ServerManager#1)
    //#new obj(void loadActionFromConfig()): new ConditionTree(parseStack#3)
    //#new obj(void loadActionFromConfig()): new ConditionTree(readTerm#1)
    //#new obj(void loadActionFromConfig()): new ServerManager(getServerManager#1)
    //#new obj(void loadActionFromConfig()): new String[](loadActionFromConfig#1)
    //#pre[17] (void loadActionFromConfig()): this.config != null
    //#pre[5] (void loadActionFromConfig()): (soft) init'ed(com/dmdirc/ServerManager.me)
    //#pre[11] (void loadActionFromConfig()): (soft) init'ed(this.triggers[0])
    //#pre[12] (void loadActionFromConfig()): (soft) init'ed(this.triggers[1..+Inf])
    //#pre[15] (void loadActionFromConfig()): (soft) this.__Tag == com/dmdirc/actions/Action
    //#pre[16] (void loadActionFromConfig()): (soft) this.conditions != null
    //#pre[18] (void loadActionFromConfig()): (soft) init'ed(this.group)
    //#pre[20] (void loadActionFromConfig()): (soft) init'ed(this.name)
    //#presumption(void loadActionFromConfig()): com.dmdirc.util.ConfigFile:getFlatDomain(...)@154 != null
    //#presumption(void loadActionFromConfig()): com.dmdirc.util.ConfigFile:getFlatDomain(...)@163 != null
    //#presumption(void loadActionFromConfig()): com.dmdirc.util.ConfigFile:getFlatDomain(...)@166 != null
    //#presumption(void loadActionFromConfig()): com.dmdirc.util.ConfigFile:getFlatDomain(...)@175 != null
    //#presumption(void loadActionFromConfig()): com.dmdirc.util.ConfigFile:getFlatDomain(...)@175 != null
    //#presumption(void loadActionFromConfig()): com.dmdirc.util.ConfigFile:getFlatDomain(...)@185 != null
    //#presumption(void loadActionFromConfig()): com.dmdirc.util.ConfigFile:getFlatDomain(...)@187 != null
    //#presumption(void loadActionFromConfig()): com.dmdirc.util.ConfigFile:getKeyDomain(...)@180 != null
    //#presumption(void loadActionFromConfig()): java.util.List:get(...)@187 != null
    //#presumption(void loadActionFromConfig()): java.util.List:size(...)@163 >= 1
    //#presumption(void loadActionFromConfig()): java.util.List:size(...)@264 != 0
    //#presumption(void loadActionFromConfig()): this.conditionTree...__Tag == com/dmdirc/actions/ConditionTree
    //#presumption(void loadActionFromConfig()): this.conditionTree...__Tag@195 == com/dmdirc/actions/ConditionTree
    //#presumption(void loadActionFromConfig()): this.conditionTree...leftArg != null
    //#presumption(void loadActionFromConfig()): this.conditionTree...leftArg@195 != null
    //#presumption(void loadActionFromConfig()): this.conditionTree...rightArg != null
    //#presumption(void loadActionFromConfig()): this.conditionTree...rightArg@195 != null
    //#presumption(void loadActionFromConfig()): this.conditionTree.__Tag == com/dmdirc/actions/ConditionTree
    //#presumption(void loadActionFromConfig()): this.conditionTree.__Tag@195 == com/dmdirc/actions/ConditionTree
    //#presumption(void loadActionFromConfig()): this.conditionTree.leftArg != null
    //#presumption(void loadActionFromConfig()): this.conditionTree.leftArg@195 != null
    //#presumption(void loadActionFromConfig()): this.conditionTree.rightArg != null
    //#presumption(void loadActionFromConfig()): this.conditionTree.rightArg@195 != null
    //#presumption(void loadActionFromConfig()): this.triggers[0].__Tag in {com/dmdirc/actions/CoreActionType, com/dmdirc/actions/interfaces/ActionType, com/dmdirc/addons/dcc/actions/DCCActions}
    //#presumption(void loadActionFromConfig()): this.triggers[0].type != null
    //#presumption(void loadActionFromConfig()): this.triggers[0].type != null
    //#presumption(void loadActionFromConfig()): this.triggers[0].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 loadActionFromConfig()): this.triggers[0].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}
    //#post(void loadActionFromConfig()): init'ed(com/dmdirc/ServerManager.me)
    //#post(void loadActionFromConfig()): possibly_updated(this.conditionTree)
    //#post(void loadActionFromConfig()): possibly_updated(this.newFormat)
    //#post(void loadActionFromConfig()): this.response == One-of{old this.response, &new String[](loadActionFromConfig#1)}
    //#post(void loadActionFromConfig()): init'ed(this.response[0..4_294_967_295])
    //#post(void loadActionFromConfig()): this.triggers == One-of{&new ActionType[](loadTriggers#1), old this.triggers}
    //#post(void loadActionFromConfig()): init'ed(this.triggers[0])
    //#post(void loadActionFromConfig()): init'ed(this.triggers[1..+Inf])
    //#post(void loadActionFromConfig()): new ActionType[](loadTriggers#1) num objects <= 1
    //#post(void loadActionFromConfig()): init'ed(new ActionType[](loadTriggers#1).length)
    //#post(void loadActionFromConfig()): init'ed(new ActionType[](loadTriggers#1)[0])
    //#post(void loadActionFromConfig()): possibly_updated(new ActionType[](loadTriggers#1)[1..+Inf])
    //#post(void loadActionFromConfig()): new ArrayList(ServerManager#1) num objects <= 1
    //#post(void loadActionFromConfig()): new ConditionTree(parseStack#3) num objects <= 1
    //#post(void loadActionFromConfig()): init'ed(new ConditionTree(parseStack#3).__Tag)
    //#post(void loadActionFromConfig()): init'ed(new ConditionTree(parseStack#3).argument)
    //#post(void loadActionFromConfig()): init'ed(new ConditionTree(parseStack#3).leftArg)
    //#post(void loadActionFromConfig()): init'ed(new ConditionTree(parseStack#3).op)
    //#post(void loadActionFromConfig()): init'ed(new ConditionTree(parseStack#3).rightArg)
    //#post(void loadActionFromConfig()): init'ed(new ConditionTree(readTerm#1) num objects)
    //#post(void loadActionFromConfig()): possibly_updated(new ConditionTree(readTerm#1).__Tag)
    //#post(void loadActionFromConfig()): possibly_updated(new ConditionTree(readTerm#1).argument)
    //#post(void loadActionFromConfig()): possibly_updated(new ConditionTree(readTerm#1).leftArg)
    //#post(void loadActionFromConfig()): possibly_updated(new ConditionTree(readTerm#1).op)
    //#post(void loadActionFromConfig()): possibly_updated(new ConditionTree(readTerm#1).rightArg)
    //#post(void loadActionFromConfig()): new ServerManager(getServerManager#1) num objects <= 1
    //#post(void loadActionFromConfig()): init'ed(new ServerManager(getServerManager#1).__Tag)
    //#post(void loadActionFromConfig()): init'ed(new ServerManager(getServerManager#1).servers)
    //#post(void loadActionFromConfig()): new String[](loadActionFromConfig#1) num objects <= 1
    //#post(void loadActionFromConfig()): init'ed(new String[](loadActionFromConfig#1).length)
    //#post(void loadActionFromConfig()): init'ed(new String[](loadActionFromConfig#1)[0..4_294_967_295])
    //#unanalyzed(void loadActionFromConfig()): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void loadActionFromConfig()): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void loadActionFromConfig()): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void loadActionFromConfig()): Effects-of-calling:com.dmdirc.logger.Logger:userError
    //#unanalyzed(void loadActionFromConfig()): Effects-of-calling:java.util.List:add
    //#unanalyzed(void loadActionFromConfig()): Effects-of-calling:java.util.Map:put
    //#unanalyzed(void loadActionFromConfig()): Effects-of-calling:com.dmdirc.util.ConfigFile:isKeyDomain
    //#unanalyzed(void loadActionFromConfig()): Effects-of-calling:com.dmdirc.util.ConfigFile:getKeyDomain
    //#unanalyzed(void loadActionFromConfig()): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(void loadActionFromConfig()): Effects-of-calling:com.dmdirc.logger.Logger:assertTrue
    //#unanalyzed(void loadActionFromConfig()): Effects-of-calling:getType
    //#unanalyzed(void loadActionFromConfig()): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(void loadActionFromConfig()): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(void loadActionFromConfig()): Effects-of-calling:getArity
    //#unanalyzed(void loadActionFromConfig()): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(void loadActionFromConfig()): Effects-of-calling:java.util.ArrayList
    //#unanalyzed(void loadActionFromConfig()): Effects-of-calling:java.util.HashMap
    //#unanalyzed(void loadActionFromConfig()): Effects-of-calling:java.util.Map:get
    //#unanalyzed(void loadActionFromConfig()): Effects-of-calling:java.lang.Integer:parseInt
    //#unanalyzed(void loadActionFromConfig()): Effects-of-calling:com.dmdirc.config.IdentityManager:getAddonIdentity
    //#unanalyzed(void loadActionFromConfig()): Effects-of-calling:com.dmdirc.config.Identity:setOption
    //#unanalyzed(void loadActionFromConfig()): Effects-of-calling:com.dmdirc.config.prefs.PreferencesType:valueOf
    //#unanalyzed(void loadActionFromConfig()): Effects-of-calling:com.dmdirc.config.prefs.PreferencesSetting
    //#unanalyzed(void loadActionFromConfig()): Effects-of-calling:java.lang.String:indexOf
    //#unanalyzed(void loadActionFromConfig()): Effects-of-calling:java.lang.String:isEmpty
    //#unanalyzed(void loadActionFromConfig()): Effects-of-calling:java.util.List:iterator
    //#unanalyzed(void loadActionFromConfig()): Effects-of-calling:java.lang.String:equals
    //#unanalyzed(void loadActionFromConfig()): Effects-of-calling:java.lang.Enum:name
    //#unanalyzed(void loadActionFromConfig()): Effects-of-calling:getActionComponent
    //#unanalyzed(void loadActionFromConfig()): Effects-of-calling:getArgTypes
    //#unanalyzed(void loadActionFromConfig()): Effects-of-calling:appliesTo
    //#unanalyzed(void loadActionFromConfig()): Effects-of-calling:java.lang.String:split
    //#unanalyzed(void loadActionFromConfig()): Effects-of-calling:java.lang.Class:getName
    //#unanalyzed(void loadActionFromConfig()): Effects-of-calling:java.lang.IllegalArgumentException
    //#unanalyzed(void loadActionFromConfig()): Effects-of-calling:java.lang.Object:equals
    //#unanalyzed(void loadActionFromConfig()): Effects-of-calling:java.lang.IllegalArgumentException:getMessage
    //#unanalyzed(void loadActionFromConfig()): Effects-of-calling:java.util.List:size
    //#unanalyzed(void loadActionFromConfig()): Effects-of-calling:java.util.List:get
    //#unanalyzed(void loadActionFromConfig()): Effects-of-calling:java.util.Deque:pollFirst
    //#unanalyzed(void loadActionFromConfig()): Effects-of-calling:java.lang.Character:instanceof
    //#unanalyzed(void loadActionFromConfig()): Effects-of-calling:java.lang.Character:charValue
    //#unanalyzed(void loadActionFromConfig()): Effects-of-calling:java.util.Deque:isEmpty
    //#unanalyzed(void loadActionFromConfig()): Effects-of-calling:readTerm
    //#unanalyzed(void loadActionFromConfig()): Effects-of-calling:java.util.ArrayDeque
    //#unanalyzed(void loadActionFromConfig()): Effects-of-calling:java.util.Deque:pollLast
    //#unanalyzed(void loadActionFromConfig()): Effects-of-calling:java.util.Deque:addFirst
    //#unanalyzed(void loadActionFromConfig()): Effects-of-calling:parseStack
    //#unanalyzed(void loadActionFromConfig()): Effects-of-calling:java.util.Deque:poll
    //#unanalyzed(void loadActionFromConfig()): Effects-of-calling:java.util.Deque:add
    //#unanalyzed(void loadActionFromConfig()): Effects-of-calling:java.util.Deque:size
    //#unanalyzed(void loadActionFromConfig()): Effects-of-calling:java.lang.String:length
    //#unanalyzed(void loadActionFromConfig()): Effects-of-calling:java.lang.String:charAt
    //#unanalyzed(void loadActionFromConfig()): Effects-of-calling:java.lang.String:valueOf
    //#unanalyzed(void loadActionFromConfig()): Effects-of-calling:java.lang.Character:valueOf
    //#unanalyzed(void loadActionFromConfig()): Effects-of-calling:getMaximumArgument
    //#unanalyzed(void loadActionFromConfig()): Effects-of-calling:java.lang.Math:max
    //#unanalyzed(void loadActionFromConfig()): Effects-of-calling:com.dmdirc.util.MapList:add
    //#unanalyzed(void loadActionFromConfig()): Effects-of-calling:getTriggers
    //#unanalyzed(void loadActionFromConfig()): Effects-of-calling:getTabCompleter
    //#unanalyzed(void loadActionFromConfig()): Effects-of-calling:getConditions
    //#unanalyzed(void loadActionFromConfig()): Effects-of-calling:com.dmdirc.commandparser.CommandManager:getCommandChar
    //#unanalyzed(void loadActionFromConfig()): Effects-of-calling:getGroup
    //#unanalyzed(void loadActionFromConfig()): Effects-of-calling:add
    //#unanalyzed(void loadActionFromConfig()): Effects-of-calling:getName
    //#unanalyzed(void loadActionFromConfig()): Effects-of-calling:getGlobalWindow
    //#unanalyzed(void loadActionFromConfig()): Effects-of-calling:com.dmdirc.ui.input.TabCompleter:addEntry
    //#test_vector(void loadActionFromConfig()): com.dmdirc.util.ConfigFile:isFlatDomain(...)@153: {0}, {1}
    //#test_vector(void loadActionFromConfig()): com.dmdirc.util.ConfigFile:isFlatDomain(...)@162: {0}, {1}
    //#test_vector(void loadActionFromConfig()): com.dmdirc.util.ConfigFile:isFlatDomain(...)@174: {0}, {1}
    //#test_vector(void loadActionFromConfig()): com.dmdirc.util.ConfigFile:isFlatDomain(...)@185: {0}, {1}
    //#test_vector(void loadActionFromConfig()): com.dmdirc.util.ConfigFile:isKeyDomain(...)@179: {0}, {1}
    //#test_vector(void loadActionFromConfig()): java.util.Iterator:hasNext(...)@166: {0}, {1}
    //#test_vector(void loadActionFromConfig()): java.util.List:size(...)@185: {-2_147_483_648..0}, {1..4_294_967_295}
            if (!loadTriggers(config.getFlatDomain(DOMAIN_TRIGGERS))) {
    //#Action.java:154: Warning: method not available - call not analyzed
    //#    call on List com.dmdirc.util.ConfigFile:getFlatDomain(String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.Action
    //#    method: void loadActionFromConfig()
    //#    unanalyzed callee: List com.dmdirc.util.ConfigFile:getFlatDomain(String)
                return;
            }
        } else {
            error("No trigger specified");
            return;
        }

        if (config.isFlatDomain(DOMAIN_RESPONSE)) {
    //#Action.java:162: Warning: method not available - call not analyzed
    //#    call on bool com.dmdirc.util.ConfigFile:isFlatDomain(String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.Action
    //#    method: void loadActionFromConfig()
    //#    unanalyzed callee: bool com.dmdirc.util.ConfigFile:isFlatDomain(String)
            response = new String[config.getFlatDomain(DOMAIN_RESPONSE).size()];
    //#Action.java:163: Warning: method not available - call not analyzed
    //#    call on List com.dmdirc.util.ConfigFile:getFlatDomain(String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.Action
    //#    method: void loadActionFromConfig()
    //#    unanalyzed callee: List com.dmdirc.util.ConfigFile:getFlatDomain(String)

            int i = 0;
            for (String line: config.getFlatDomain(DOMAIN_RESPONSE)) {
    //#Action.java:166: Warning: method not available - call not analyzed
    //#    call on List com.dmdirc.util.ConfigFile:getFlatDomain(String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.Action
    //#    method: void loadActionFromConfig()
    //#    unanalyzed callee: List com.dmdirc.util.ConfigFile:getFlatDomain(String)
                response[i++] = line;
    //#Action.java:167: ?overflow
    //#    i in {-2_147_483_649..4_294_967_294}
    //#    severity: LOW
    //#    class: com.dmdirc.actions.Action
    //#    method: void loadActionFromConfig()
    //#    basic block: bb_8
    //#    assertion: i in {-2_147_483_649..4_294_967_294}
    //#    VN: i + 1
    //#    Expected: {-2_147_483_648..4_294_967_295, Invalid}
    //#    Bad: {4_294_967_296}
    //#    Attribs:  Int  Bad singleton  Bad > Exp
    //#Action.java:167: ?array index out of bounds
    //#    i < this.response.length
    //#    severity: MEDIUM
    //#    class: com.dmdirc.actions.Action
    //#    method: void loadActionFromConfig()
    //#    basic block: bb_8
    //#    assertion: i < this.response.length
    //#    VN: -(i - java.util.List:size(...)@163)
    //#    Expected: {1..+Inf}
    //#    Bad: {0}
    //#    Attribs:  Int  Bad singleton  Bad overlaps +/-1000  Bad < Exp
            }
        } else {
            error("No response specified");
            return;
        }

        if (config.isFlatDomain(DOMAIN_FORMAT)) {
    //#Action.java:174: Warning: method not available - call not analyzed
    //#    call on bool com.dmdirc.util.ConfigFile:isFlatDomain(String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.Action
    //#    method: void loadActionFromConfig()
    //#    unanalyzed callee: bool com.dmdirc.util.ConfigFile:isFlatDomain(String)
            newFormat = config.getFlatDomain(DOMAIN_FORMAT).size() == 0 ? "" :
    //#Action.java:175: Warning: method not available - call not analyzed
    //#    call on List com.dmdirc.util.ConfigFile:getFlatDomain(String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.Action
    //#    method: void loadActionFromConfig()
    //#    unanalyzed callee: List com.dmdirc.util.ConfigFile:getFlatDomain(String)
                config.getFlatDomain(DOMAIN_FORMAT).get(0);
        }

        for (int cond = 0; config.isKeyDomain("condition " + cond); cond++) {
    //#Action.java:179: Warning: method not available - call not analyzed
    //#    call on bool com.dmdirc.util.ConfigFile:isKeyDomain(String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.Action
    //#    method: void loadActionFromConfig()
    //#    unanalyzed callee: bool com.dmdirc.util.ConfigFile:isKeyDomain(String)
    //#Action.java:179: ?overflow
    //#    cond in {-2_147_483_649..4_294_967_294}
    //#    severity: LOW
    //#    class: com.dmdirc.actions.Action
    //#    method: void loadActionFromConfig()
    //#    basic block: bb_20
    //#    assertion: cond in {-2_147_483_649..4_294_967_294}
    //#    VN: cond + 1
    //#    Expected: {-2_147_483_648..4_294_967_295, Invalid}
    //#    Bad: {4_294_967_296}
    //#    Attribs:  Int  Bad singleton  Bad > Exp
            if (!readCondition(config.getKeyDomain("condition " + cond))) {
    //#Action.java:180: Warning: method not available - call not analyzed
    //#    call on Map com.dmdirc.util.ConfigFile:getKeyDomain(String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.Action
    //#    method: void loadActionFromConfig()
    //#    unanalyzed callee: Map com.dmdirc.util.ConfigFile:getKeyDomain(String)
    //#Action.java:180: ?precondition failure
    //#    com/dmdirc/actions/Action.readCondition: (soft) this.triggers[0] != null
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.actions.Action
    //#    method: void loadActionFromConfig()
    //#    basic block: bb_18
    //#    assertion: (soft) this.triggers[0] != null
    //#    callee: bool com/dmdirc/actions/Action.readCondition(Map)
    //#    callee assertion: (soft) this.triggers[0] != null
    //#    callee file: Action.java
    //#    callee precondition index: [10]
    //#    callee srcpos: 370
    //#    VN: this.triggers[0]
    //#    Expected: Inverse{null}
    //#    Bad: Addr_Set{null}
    //#    Attribs:  Ptr  null in Bad  Soft
                return;
            }
        }

        if (config.isFlatDomain(DOMAIN_CONDITIONTREE)
    //#Action.java:185: Warning: method not available - call not analyzed
    //#    call on bool com.dmdirc.util.ConfigFile:isFlatDomain(String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.Action
    //#    method: void loadActionFromConfig()
    //#    unanalyzed callee: bool com.dmdirc.util.ConfigFile:isFlatDomain(String)
    //#Action.java:185: Warning: method not available - call not analyzed
    //#    call on List com.dmdirc.util.ConfigFile:getFlatDomain(String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.Action
    //#    method: void loadActionFromConfig()
    //#    unanalyzed callee: List com.dmdirc.util.ConfigFile:getFlatDomain(String)
                && config.getFlatDomain(DOMAIN_CONDITIONTREE).size() > 0) {
            conditionTree = ConditionTree.parseString(
    //#Action.java:187: Warning: method not available - call not analyzed
    //#    call on List com.dmdirc.util.ConfigFile:getFlatDomain(String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.Action
    //#    method: void loadActionFromConfig()
    //#    unanalyzed callee: List com.dmdirc.util.ConfigFile:getFlatDomain(String)
                    config.getFlatDomain(DOMAIN_CONDITIONTREE).get(0));

            if (conditionTree == null) {
                error("Unable to parse condition tree");
                return;
            }

            if (conditionTree.getMaximumArgument() >= conditions.size()) {
    //#Action.java:195: ?use of default init
    //#    init'ed(this.conditionTree.__Tag)
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.actions.Action
    //#    method: void loadActionFromConfig()
    //#    basic block: bb_25
    //#    assertion: init'ed(this.conditionTree.__Tag)
    //#    VN: this.conditionTree.__Tag
    //#    Expected: {-Inf..+Inf}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Bad only invalid
    //#Action.java:195: ?null dereference
    //#    com/dmdirc/actions/ConditionTree.__Descendant_Table[this.conditionTree.__Tag] != null
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.actions.Action
    //#    method: void loadActionFromConfig()
    //#    basic block: bb_25
    //#    assertion: com/dmdirc/actions/ConditionTree.__Descendant_Table[this.conditionTree.__Tag] != null
    //#    VN: com/dmdirc/actions/ConditionTree.__Descendant_Table[this.conditionTree.__Tag]
    //#    Expected: Inverse{null}
    //#    Bad: Addr_Set{null}
    //#    Attribs:  Ptr  null in Bad
                error("Condition tree references condition "
                        + conditionTree.getMaximumArgument() + " but there are"
                        + " only " + conditions.size() + " conditions");
                return;
            }
        }

        ActionManager.registerAction(this);

        checkMetaData();
    }
    //#Action.java:206: end of method: void com.dmdirc.actions.Action.loadActionFromConfig()

    /**
     * Checks to see if this action contains group meta-data, and adds it to
     * the group as appropriate.
     */
    private void checkMetaData() {
        if (config.isKeyDomain(DOMAIN_METADATA)) {
    //#Action.java:213: method: void com.dmdirc.actions.Action.checkMetaData()
    //#Action.java:213: Warning: method not available - call not analyzed
    //#    call on bool com.dmdirc.util.ConfigFile:isKeyDomain(String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.Action
    //#    method: void checkMetaData()
    //#    unanalyzed callee: bool com.dmdirc.util.ConfigFile:isKeyDomain(String)
    //#input(void checkMetaData()): "setting "._tainted
    //#input(void checkMetaData()): DOMAIN_METADATA
    //#input(void checkMetaData()): com/dmdirc/actions/ActionGroup.__Descendant_Table[com/dmdirc/actions/ActionGroup]
    //#input(void checkMetaData()): com/dmdirc/actions/ActionGroup.__Descendant_Table[com/dmdirc/actions/wrappers/AliasWrapper]
    //#input(void checkMetaData()): com/dmdirc/actions/ActionGroup.__Descendant_Table[com/dmdirc/actions/wrappers/PerformWrapper]
    //#input(void checkMetaData()): com/dmdirc/actions/ActionGroup.__Descendant_Table[others]
    //#input(void checkMetaData()): com/dmdirc/actions/ActionGroup.__Dispatch_Table.getSettings()Ljava/util/Map;
    //#input(void checkMetaData()): com/dmdirc/actions/ActionGroup.__Dispatch_Table.setAuthor(Ljava/lang/String;)V
    //#input(void checkMetaData()): com/dmdirc/actions/ActionGroup.__Dispatch_Table.setComponent(I)V
    //#input(void checkMetaData()): com/dmdirc/actions/ActionGroup.__Dispatch_Table.setDescription(Ljava/lang/String;)V
    //#input(void checkMetaData()): com/dmdirc/actions/ActionGroup.__Dispatch_Table.setVersion(I)V
    //#input(void checkMetaData()): com/dmdirc/actions/ActionManager.groups
    //#input(void checkMetaData()): com/dmdirc/actions/wrappers/AliasWrapper.__Dispatch_Table.getSettings()Ljava/util/Map;
    //#input(void checkMetaData()): com/dmdirc/actions/wrappers/AliasWrapper.__Dispatch_Table.setAuthor(Ljava/lang/String;)V
    //#input(void checkMetaData()): com/dmdirc/actions/wrappers/AliasWrapper.__Dispatch_Table.setComponent(I)V
    //#input(void checkMetaData()): com/dmdirc/actions/wrappers/AliasWrapper.__Dispatch_Table.setDescription(Ljava/lang/String;)V
    //#input(void checkMetaData()): com/dmdirc/actions/wrappers/AliasWrapper.__Dispatch_Table.setVersion(I)V
    //#input(void checkMetaData()): com/dmdirc/actions/wrappers/PerformWrapper.__Dispatch_Table.getSettings()Ljava/util/Map;
    //#input(void checkMetaData()): com/dmdirc/actions/wrappers/PerformWrapper.__Dispatch_Table.setAuthor(Ljava/lang/String;)V
    //#input(void checkMetaData()): com/dmdirc/actions/wrappers/PerformWrapper.__Dispatch_Table.setComponent(I)V
    //#input(void checkMetaData()): com/dmdirc/actions/wrappers/PerformWrapper.__Dispatch_Table.setDescription(Ljava/lang/String;)V
    //#input(void checkMetaData()): com/dmdirc/actions/wrappers/PerformWrapper.__Dispatch_Table.setVersion(I)V
    //#input(void checkMetaData()): this
    //#input(void checkMetaData()): this.config
    //#input(void checkMetaData()): this.group
    //#pre[2] (void checkMetaData()): this.config != null
    //#pre[3] (void checkMetaData()): (soft) init'ed(this.group)
    //#presumption(void checkMetaData()): com.dmdirc.util.ConfigFile:getKeyDomain(...)@215 != null
    //#presumption(void checkMetaData()): com.dmdirc.util.ConfigFile:getKeyDomain(...)@244 != null
    //#presumption(void checkMetaData()): java.util.Map:get(...)@309 != null
    //#presumption(void checkMetaData()): java.util.Map:get(...)@309 != null
    //#presumption(void checkMetaData()): java.util.Map:get(...)@309.__Tag in {com/dmdirc/actions/ActionGroup, com/dmdirc/actions/wrappers/AliasWrapper, com/dmdirc/actions/wrappers/PerformWrapper}
    //#presumption(void checkMetaData()): java.util.Map:get(...)@309.__Tag in {com/dmdirc/actions/ActionGroup, com/dmdirc/actions/wrappers/AliasWrapper, com/dmdirc/actions/wrappers/PerformWrapper}
    //#presumption(void checkMetaData()): myGroup.settings != null
    //#unanalyzed(void checkMetaData()): Effects-of-calling:java.util.Map:put
    //#unanalyzed(void checkMetaData()): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(void checkMetaData()): Effects-of-calling:java.util.ArrayList
    //#unanalyzed(void checkMetaData()): Effects-of-calling:java.util.HashMap
    //#unanalyzed(void checkMetaData()): Effects-of-calling:java.util.Map:get
    //#unanalyzed(void checkMetaData()): Effects-of-calling:com.dmdirc.config.IdentityManager:getAddonIdentity
    //#unanalyzed(void checkMetaData()): Effects-of-calling:com.dmdirc.config.Identity:setOption
    //#test_vector(void checkMetaData()): com.dmdirc.util.ConfigFile:isKeyDomain(...)@213: {0}, {1}
    //#test_vector(void checkMetaData()): com.dmdirc.util.ConfigFile:isKeyDomain(...)@242: {0}, {1}
    //#test_vector(void checkMetaData()): java.util.Map:containsKey(...)@217: {0}, {1}
    //#test_vector(void checkMetaData()): java.util.Map:containsKey(...)@221: {0}, {1}
    //#test_vector(void checkMetaData()): java.util.Map:containsKey(...)@225: {0}, {1}
    //#test_vector(void checkMetaData()): java.util.Map:containsKey(...)@233: {0}, {1}
    //#test_vector(void checkMetaData()): java.util.Map:containsKey(...)@246: {0}, {1}
            final ActionGroup myGroup = ActionManager.getGroup(group);
            final Map<String, String> data = config.getKeyDomain(DOMAIN_METADATA);
    //#Action.java:215: Warning: method not available - call not analyzed
    //#    call on Map com.dmdirc.util.ConfigFile:getKeyDomain(String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.Action
    //#    method: void checkMetaData()
    //#    unanalyzed callee: Map com.dmdirc.util.ConfigFile:getKeyDomain(String)

            if (data.containsKey("description")) {
                myGroup.setDescription(data.get("description"));
            }

            if (data.containsKey("author")) {
                myGroup.setAuthor(data.get("author"));
            }
            
            if (data.containsKey("version")) {
                try {
                    myGroup.setVersion(Integer.parseInt(data.get("version")));
                } catch (NumberFormatException ex) {
                    // Do nothing
                }
            }
            
            if (data.containsKey("component")) {
                try {
                    myGroup.setComponent(Integer.parseInt(data.get("component")));
                } catch (NumberFormatException ex) {
                    // Do nothing
                }
            }
        }

        for (int i = 0; config.isKeyDomain("setting " + i); i++) {
    //#Action.java:242: Warning: method not available - call not analyzed
    //#    call on bool com.dmdirc.util.ConfigFile:isKeyDomain(String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.Action
    //#    method: void checkMetaData()
    //#    unanalyzed callee: bool com.dmdirc.util.ConfigFile:isKeyDomain(String)
    //#Action.java:242: ?overflow
    //#    i in {-2_147_483_649..4_294_967_294}
    //#    severity: LOW
    //#    class: com.dmdirc.actions.Action
    //#    method: void checkMetaData()
    //#    basic block: bb_22
    //#    assertion: i in {-2_147_483_649..4_294_967_294}
    //#    VN: i + 1
    //#    Expected: {-2_147_483_648..4_294_967_295, Invalid}
    //#    Bad: {4_294_967_296}
    //#    Attribs:  Int  Bad singleton  Bad > Exp
            final ActionGroup myGroup = ActionManager.getGroup(group);
            final Map<String, String> data = config.getKeyDomain("setting " + i);
    //#Action.java:244: Warning: method not available - call not analyzed
    //#    call on Map com.dmdirc.util.ConfigFile:getKeyDomain(String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.Action
    //#    method: void checkMetaData()
    //#    unanalyzed callee: Map com.dmdirc.util.ConfigFile:getKeyDomain(String)
            
            if (data.containsKey("type") && data.containsKey("setting")
                    && data.containsKey("title") && data.containsKey("default")
                    && data.containsKey("tooltip")) {
                ActionManager.registerDefault(data.get("setting"), data.get("default"));
                myGroup.getSettings().put(data.get("setting"), new PreferencesSetting(
    //#Action.java:250: Warning: method not available - call not analyzed
    //#    call on PreferencesType com.dmdirc.config.prefs.PreferencesType:valueOf(String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.Action
    //#    method: void checkMetaData()
    //#    unanalyzed callee: PreferencesType com.dmdirc.config.prefs.PreferencesType:valueOf(String)
    //#Action.java:250: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.config.prefs.PreferencesSetting(PreferencesType, String, String, String, String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.Action
    //#    method: void checkMetaData()
    //#    unanalyzed callee: void com.dmdirc.config.prefs.PreferencesSetting(PreferencesType, String, String, String, String)
                        PreferencesType.valueOf(data.get("type")), "actions",
                        data.get("setting"), data.get("title"), data.get("tooltip")));
            }
        }
    }
    //#Action.java:255: end of method: void com.dmdirc.actions.Action.checkMetaData()

    /**
     * Loads a list of triggers with the specified names.
     * 
     * @param newTriggers A list of trigger names
     * @return True if all triggers are valid and compatible, false otherwise.
     */
    private boolean loadTriggers(final List<String> newTriggers) {
        triggers = new ActionType[newTriggers.size()];
    //#Action.java:264: method: bool com.dmdirc.actions.Action.loadTriggers(List)
    //#input(bool loadTriggers(List)): "."._tainted
    //#input(bool loadTriggers(List)): ": "._tainted
    //#input(bool loadTriggers(List)): "Error when parsing action: "._tainted
    //#input(bool loadTriggers(List)): "Invalid trigger specified: "._tainted
    //#input(bool loadTriggers(List)): "Triggers are not compatible"._tainted
    //#input(bool loadTriggers(List)): com.dmdirc.logger.ErrorLevel.LOW
    //#input(bool loadTriggers(List)): com/dmdirc/actions/ActionManager.actionTypes
    //#input(bool loadTriggers(List)): com/dmdirc/actions/CoreActionType.__Dispatch_Table.getType()Lcom/dmdirc/actions/interfaces/ActionMetaType;
    //#input(bool loadTriggers(List)): com/dmdirc/actions/interfaces/ActionType.__Descendant_Table[com/dmdirc/actions/CoreActionType]
    //#input(bool loadTriggers(List)): com/dmdirc/actions/interfaces/ActionType.__Descendant_Table[com/dmdirc/actions/interfaces/ActionType]
    //#input(bool loadTriggers(List)): com/dmdirc/actions/interfaces/ActionType.__Descendant_Table[com/dmdirc/addons/dcc/actions/DCCActions]
    //#input(bool loadTriggers(List)): com/dmdirc/actions/interfaces/ActionType.__Descendant_Table[others]
    //#input(bool loadTriggers(List)): com/dmdirc/actions/interfaces/ActionType.__Dispatch_Table.getType()Lcom/dmdirc/actions/interfaces/ActionMetaType;
    //#input(bool loadTriggers(List)): com/dmdirc/addons/dcc/actions/DCCActions.__Dispatch_Table.getType()Lcom/dmdirc/actions/interfaces/ActionMetaType;
    //#input(bool loadTriggers(List)): newTriggers
    //#input(bool loadTriggers(List)): this
    //#input(bool loadTriggers(List)): this.group
    //#input(bool loadTriggers(List)): this.group._tainted
    //#input(bool loadTriggers(List)): this.name
    //#input(bool loadTriggers(List)): this.name._tainted
    //#input(bool loadTriggers(List)): this.triggers.length
    //#input(bool loadTriggers(List)): this.triggers[0].__Tag
    //#input(bool loadTriggers(List)): this.triggers[0].type
    //#input(bool loadTriggers(List)): this.triggers[1..4_294_967_295].__Tag
    //#input(bool loadTriggers(List)): this.triggers[1..4_294_967_295].type
    //#output(bool loadTriggers(List)): new ActionType[](loadTriggers#1) num objects
    //#output(bool loadTriggers(List)): this.triggers.length
    //#output(bool loadTriggers(List)): this.triggers[0]
    //#output(bool loadTriggers(List)): this.triggers[1..4_294_967_295]
    //#output(bool loadTriggers(List)): return_value
    //#output(bool loadTriggers(List)): this.triggers
    //#new obj(bool loadTriggers(List)): new ActionType[](loadTriggers#1)
    //#pre[1] (bool loadTriggers(List)): newTriggers != null
    //#pre[5] (bool loadTriggers(List)): (soft) init'ed(this.group)
    //#pre[7] (bool loadTriggers(List)): (soft) init'ed(this.name)
    //#presumption(bool loadTriggers(List)): java.util.List:size(...)@264 >= 0
    //#presumption(bool loadTriggers(List)): this.triggers[0].__Tag in {com/dmdirc/actions/CoreActionType, com/dmdirc/actions/interfaces/ActionType, com/dmdirc/addons/dcc/actions/DCCActions}
    //#presumption(bool loadTriggers(List)): this.triggers[i].__Tag in {com/dmdirc/actions/CoreActionType, com/dmdirc/actions/interfaces/ActionType, com/dmdirc/addons/dcc/actions/DCCActions}
    //#presumption(bool loadTriggers(List)): this.triggers[i].type != null
    //#presumption(bool loadTriggers(List)): this.triggers[i].type != null
    //#post(bool loadTriggers(List)): init'ed(return_value)
    //#post(bool loadTriggers(List)): this.triggers == &new ActionType[](loadTriggers#1)
    //#post(bool loadTriggers(List)): possibly_updated(this.triggers[0])
    //#post(bool loadTriggers(List)): possibly_updated(this.triggers[1..4_294_967_295])
    //#post(bool loadTriggers(List)): new ActionType[](loadTriggers#1) num objects == 1
    //#post(bool loadTriggers(List)): this.triggers.length <= 4_294_967_295
    //#post(bool loadTriggers(List)): init'ed(this.triggers[0])
    //#unanalyzed(bool loadTriggers(List)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(bool loadTriggers(List)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(bool loadTriggers(List)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(bool loadTriggers(List)): Effects-of-calling:com.dmdirc.logger.Logger:userError
    //#unanalyzed(bool loadTriggers(List)): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(bool loadTriggers(List)): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(bool loadTriggers(List)): Effects-of-calling:java.lang.String:isEmpty
    //#unanalyzed(bool loadTriggers(List)): Effects-of-calling:java.util.List:iterator
    //#unanalyzed(bool loadTriggers(List)): Effects-of-calling:java.lang.String:equals
    //#unanalyzed(bool loadTriggers(List)): Effects-of-calling:java.lang.Enum:name
    //#test_vector(bool loadTriggers(List)): java.lang.Object:equals(...)@272: {1}, {0}

        for (int i = 0; i < triggers.length; i++) {
            triggers[i] = ActionManager.getActionType(newTriggers.get(i));

            if (triggers[i] == null) {
                error("Invalid trigger specified: " + newTriggers.get(i));
                return false;
            } else if (i != 0 && !triggers[i].getType().equals(triggers[0].getType())) {
    //#Action.java:272: ?use of default init
    //#    init'ed(this.triggers[i].__Tag)
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.actions.Action
    //#    method: bool loadTriggers(List)
    //#    basic block: bb_6
    //#    assertion: init'ed(this.triggers[i].__Tag)
    //#    VN: this.triggers[i].__Tag
    //#    Expected: {-Inf..+Inf}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Bad only invalid
    //#Action.java:272: ?null dereference
    //#    com/dmdirc/actions/interfaces/ActionType.__Descendant_Table[this.triggers[i].__Tag] != null
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.actions.Action
    //#    method: bool loadTriggers(List)
    //#    basic block: bb_6
    //#    assertion: com/dmdirc/actions/interfaces/ActionType.__Descendant_Table[this.triggers[i].__Tag] != null
    //#    VN: com/dmdirc/actions/interfaces/ActionType.__Descendant_Table[this.triggers[i].__Tag]
    //#    Expected: Inverse{null}
    //#    Bad: Addr_Set{null}
    //#    Attribs:  Ptr  null in Bad
    //#Action.java:272: ?null dereference
    //#    com/dmdirc/actions/interfaces/ActionType.__Descendant_Table[this.triggers[0].__Tag] != null
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.actions.Action
    //#    method: bool loadTriggers(List)
    //#    basic block: bb_6
    //#    assertion: com/dmdirc/actions/interfaces/ActionType.__Descendant_Table[this.triggers[0].__Tag] != null
    //#    VN: com/dmdirc/actions/interfaces/ActionType.__Descendant_Table[this.triggers[0].__Tag]
    //#    Expected: Inverse{null}
    //#    Bad: Addr_Set{null}
    //#    Attribs:  Ptr  null in Bad
                error("Triggers are not compatible");
                return false;
            }
        }

        return true;
    //#Action.java:278: end of method: bool com.dmdirc.actions.Action.loadTriggers(List)
    }

    /**
     * Called to save the action.
     */
    public void save() {
        if (!isModified()) {
    //#Action.java:285: method: void com.dmdirc.actions.Action.save()
    //#input(void save()): "!"._tainted
    //#input(void save()): "&amp;"._tainted
    //#input(void save()): "("._tainted
    //#input(void save()): ")"._tainted
    //#input(void save()): "."._tainted
    //#input(void save()): ": "._tainted
    //#input(void save()): "I.O error when saving action: "._tainted
    //#input(void save()): "Triggers: "._tainted
    //#input(void save()): "condition "._tainted
    //#input(void save()): "setting "._tainted
    //#input(void save()): "|"._tainted
    //#input(void save()): DOMAIN_CONDITIONTREE
    //#input(void save()): DOMAIN_FORMAT
    //#input(void save()): DOMAIN_METADATA
    //#input(void save()): DOMAIN_RESPONSE
    //#input(void save()): DOMAIN_TRIGGERS
    //#input(void save()): __Descendant_Table[com/dmdirc/actions/Action]
    //#input(void save()): __Descendant_Table[others]
    //#input(void save()): __Dispatch_Table.isModified()Z
    //#input(void save()): __Dispatch_Table.resetModified()V
    //#input(void save()): com.dmdirc.actions.ConditionTree$1__static_init.new int[](ConditionTree$1__static_init#1).length
    //#input(void save()): com.dmdirc.actions.ConditionTree$1__static_init.new int[](ConditionTree$1__static_init#1)[0..4_294_967_295]
    //#input(void save()): com.dmdirc.actions.CoreActionType__static_init.new CoreActionType(CoreActionType__static_init#72).__Tag
    //#input(void save()): com.dmdirc.actions.CoreActionType__static_init.new CoreActionType(CoreActionType__static_init#72).type
    //#input(void save()): com.dmdirc.actions.metatypes.ActionEvents__static_init.new ActionEvents(ActionEvents__static_init#1).__Tag
    //#input(void save()): com.dmdirc.logger.ErrorLevel.HIGH
    //#input(void save()): com.dmdirc.logger.ErrorLevel.LOW
    //#input(void save()): com/dmdirc/actions/ActionCondition.__Descendant_Table[com/dmdirc/actions/ActionCondition]
    //#input(void save()): com/dmdirc/actions/ActionCondition.__Descendant_Table[others]
    //#input(void save()): com/dmdirc/actions/ActionCondition.__Dispatch_Table.getArg()I
    //#input(void save()): com/dmdirc/actions/ActionCondition.__Dispatch_Table.getComparison()Lcom/dmdirc/actions/interfaces/ActionComparison;
    //#input(void save()): com/dmdirc/actions/ActionCondition.__Dispatch_Table.getComponent()Lcom/dmdirc/actions/interfaces/ActionComponent;
    //#input(void save()): com/dmdirc/actions/ActionCondition.__Dispatch_Table.getStarget()Ljava/lang/String;
    //#input(void save()): com/dmdirc/actions/ActionCondition.__Dispatch_Table.getTarget()Ljava/lang/String;
    //#input(void save()): com/dmdirc/actions/ActionManager.killSwitch
    //#input(void save()): com/dmdirc/actions/ActionManager.listeners
    //#input(void save()): com/dmdirc/actions/ConditionTree$1.$SwitchMap$com$dmdirc$actions$ConditionTree$OPERATION
    //#input(void save()): com/dmdirc/actions/ConditionTree.__Descendant_Table[com/dmdirc/actions/ConditionTree]
    //#input(void save()): com/dmdirc/actions/ConditionTree.__Descendant_Table[others]
    //#input(void save()): com/dmdirc/actions/ConditionTree.__Dispatch_Table.toString()Ljava/lang/String;
    //#input(void save()): com/dmdirc/actions/CoreActionType.ACTION_UPDATED
    //#input(void save()): com/dmdirc/actions/CoreActionType.__Dispatch_Table.getType()Lcom/dmdirc/actions/interfaces/ActionMetaType;
    //#input(void save()): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/interfaces/ActionMetaType]
    //#input(void save()): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/ActionEvents]
    //#input(void save()): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/ChannelEvents]
    //#input(void save()): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/ClientEvents]
    //#input(void save()): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/PluginEvents]
    //#input(void save()): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/QueryEvents]
    //#input(void save()): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/ServerEvents]
    //#input(void save()): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/addons/dcc/actions/DCCEvents]
    //#input(void save()): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[others]
    //#input(void save()): com/dmdirc/actions/interfaces/ActionMetaType.__Dispatch_Table.getArity()I
    //#input(void save()): com/dmdirc/actions/interfaces/ActionType.__Descendant_Table[com/dmdirc/actions/CoreActionType]
    //#input(void save()): com/dmdirc/actions/interfaces/ActionType.__Descendant_Table[com/dmdirc/actions/interfaces/ActionType]
    //#input(void save()): com/dmdirc/actions/interfaces/ActionType.__Descendant_Table[com/dmdirc/addons/dcc/actions/DCCActions]
    //#input(void save()): com/dmdirc/actions/interfaces/ActionType.__Descendant_Table[others]
    //#input(void save()): com/dmdirc/actions/interfaces/ActionType.__Dispatch_Table.getType()Lcom/dmdirc/actions/interfaces/ActionMetaType;
    //#input(void save()): com/dmdirc/actions/metatypes/ActionEvents.__Dispatch_Table.getArity()I
    //#input(void save()): com/dmdirc/actions/metatypes/ChannelEvents.__Dispatch_Table.getArity()I
    //#input(void save()): com/dmdirc/actions/metatypes/ClientEvents.__Dispatch_Table.getArity()I
    //#input(void save()): com/dmdirc/actions/metatypes/PluginEvents.__Dispatch_Table.getArity()I
    //#input(void save()): com/dmdirc/actions/metatypes/QueryEvents.__Dispatch_Table.getArity()I
    //#input(void save()): com/dmdirc/actions/metatypes/ServerEvents.__Dispatch_Table.getArity()I
    //#input(void save()): com/dmdirc/addons/dcc/actions/DCCActions.__Dispatch_Table.getType()Lcom/dmdirc/actions/interfaces/ActionMetaType;
    //#input(void save()): com/dmdirc/addons/dcc/actions/DCCEvents.__Dispatch_Table.getArity()I
    //#input(void save()): this
    //#input(void save()): this.__Tag
    //#input(void save()): this.conditionTree
    //#input(void save()): this.conditionTree..._tainted
    //#input(void save()): this.conditionTree.__Tag
    //#input(void save()): this.conditionTree.argument
    //#input(void save()): this.conditionTree.leftArg
    //#input(void save()): this.conditionTree.op
    //#input(void save()): this.conditionTree.rightArg
    //#input(void save()): this.conditions
    //#input(void save()): this.config
    //#input(void save()): this.group
    //#input(void save()): this.group._tainted
    //#input(void save()): this.location
    //#input(void save()): this.modified
    //#input(void save()): this.name
    //#input(void save()): this.name._tainted
    //#input(void save()): this.newFormat
    //#input(void save()): this.response
    //#input(void save()): this.response.length
    //#input(void save()): this.response[0..4_294_967_295]
    //#input(void save()): this.triggers
    //#input(void save()): this.triggers.length
    //#input(void save()): this.triggers[0..4_294_967_295]
    //#input(void save()): this.triggers[0..4_294_967_295]._tainted
    //#output(void save()): com/dmdirc/ServerManager.me
    //#output(void save()): new ArrayList(ServerManager#1) num objects
    //#output(void save()): new ServerManager(getServerManager#1) num objects
    //#output(void save()): new ServerManager(getServerManager#1).__Tag
    //#output(void save()): new ServerManager(getServerManager#1).servers
    //#output(void save()): this.modified
    //#new obj(void save()): new ArrayList(ServerManager#1)
    //#new obj(void save()): new ServerManager(getServerManager#1)
    //#pre[6] (void save()): init'ed(this.modified)
    //#pre[8] (void save()): this.__Tag == com/dmdirc/actions/Action
    //#pre[1] (void save()): (soft) init'ed(com.dmdirc.actions.ConditionTree$1__static_init.new int[](ConditionTree$1__static_init#1)[0..4_294_967_295])
    //#pre[2] (void save()): (soft) com.dmdirc.actions.CoreActionType__static_init.new CoreActionType(CoreActionType__static_init#72).type != null
    //#pre[4] (void save()): (soft) init'ed(com/dmdirc/actions/ActionManager.killSwitch)
    //#pre[5] (void save()): (soft) init'ed(com/dmdirc/ServerManager.me)
    //#pre[9] (void save()): (soft) init'ed(this.conditionTree)
    //#pre[11] (void save()): (soft) this.conditionTree.__Tag == com/dmdirc/actions/ConditionTree
    //#pre[12] (void save()): (soft) init'ed(this.conditionTree.argument)
    //#pre[13] (void save()): (soft) init'ed(this.conditionTree.leftArg)
    //#pre[14] (void save()): (soft) this.conditionTree.op != null
    //#pre[15] (void save()): (soft) init'ed(this.conditionTree.rightArg)
    //#pre[16] (void save()): (soft) this.conditions != null
    //#pre[17] (void save()): (soft) init'ed(this.config)
    //#pre[18] (void save()): (soft) init'ed(this.group)
    //#pre[20] (void save()): (soft) init'ed(this.location)
    //#pre[21] (void save()): (soft) init'ed(this.name)
    //#pre[23] (void save()): (soft) init'ed(this.newFormat)
    //#pre[24] (void save()): (soft) this.response != null
    //#pre[25] (void save()): (soft) this.response.length <= 4_294_967_295
    //#pre[26] (void save()): (soft) init'ed(this.response[0..4_294_967_295])
    //#pre[27] (void save()): (soft) this.triggers != null
    //#pre[28] (void save()): (soft) this.triggers.length <= 4_294_967_295
    //#pre[29] (void save()): (soft) init'ed(this.triggers[0..4_294_967_295])
    //#presumption(void save()): init'ed(com.dmdirc.logger.ErrorLevel.HIGH)
    //#presumption(void save()): init'ed(com.dmdirc.logger.ErrorLevel.LOW)
    //#presumption(void save()): com.dmdirc.util.ConfigFile:getFlatDomain(...)@314 != null
    //#presumption(void save()): com.dmdirc.util.ConfigFile:getFlatDomain(...)@319 != null
    //#presumption(void save()): condition.comparison@323 != null
    //#presumption(void save()): condition.component@323 != null
    //#presumption(void save()): java.util.Iterator:next(...).__Tag@323 == com/dmdirc/actions/ActionCondition
    //#presumption(void save()): java.util.Iterator:next(...)@323 != null
    //#post(void save()): com/dmdirc/ServerManager.me == old com/dmdirc/ServerManager.me
    //#post(void save()): init'ed(this.modified)
    //#post(void save()): new ArrayList(ServerManager#1) num objects == 0, if init'ed
    //#post(void save()): new ServerManager(getServerManager#1) num objects == 0, if init'ed
    //#post(void save()): new ServerManager(getServerManager#1).__Tag not init'ed, if init'ed
    //#post(void save()): new ServerManager(getServerManager#1).servers == null
    //#unanalyzed(void save()): Effects-of-calling:com.dmdirc.actions.ConditionTree$OPERATION:ordinal
    //#unanalyzed(void save()): Effects-of-calling:java.lang.String:valueOf
    //#unanalyzed(void save()): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void save()): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void save()): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void save()): Effects-of-calling:com.dmdirc.logger.Logger:assertTrue
    //#unanalyzed(void save()): Effects-of-calling:getType
    //#unanalyzed(void save()): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(void save()): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(void save()): Effects-of-calling:com.dmdirc.util.MapList:containsKey
    //#unanalyzed(void save()): Effects-of-calling:com.dmdirc.util.MapList:get
    //#unanalyzed(void save()): Effects-of-calling:java.util.ArrayList
    //#unanalyzed(void save()): Effects-of-calling:java.util.ArrayList:iterator
    //#unanalyzed(void save()): Effects-of-calling:trigger
    //#unanalyzed(void save()): Effects-of-calling:getArity
    //#unanalyzed(void save()): Effects-of-calling:com.dmdirc.interfaces.ActionListener:processEvent
    //#unanalyzed(void save()): Effects-of-calling:triggerActions
    //#unanalyzed(void save()): Effects-of-calling:getArgTypes
    //#unanalyzed(void save()): Effects-of-calling:java.util.Deque:pollFirst
    //#unanalyzed(void save()): Effects-of-calling:java.lang.Character:instanceof
    //#unanalyzed(void save()): Effects-of-calling:java.lang.Character:charValue
    //#unanalyzed(void save()): Effects-of-calling:java.util.Deque:isEmpty
    //#unanalyzed(void save()): Effects-of-calling:readTerm
    //#unanalyzed(void save()): Effects-of-calling:java.util.ArrayDeque
    //#unanalyzed(void save()): Effects-of-calling:java.util.Deque:pollLast
    //#unanalyzed(void save()): Effects-of-calling:java.util.Deque:addFirst
    //#unanalyzed(void save()): Effects-of-calling:parseStack
    //#unanalyzed(void save()): Effects-of-calling:java.util.Deque:poll
    //#unanalyzed(void save()): Effects-of-calling:java.util.Deque:add
    //#unanalyzed(void save()): Effects-of-calling:java.util.Deque:size
    //#unanalyzed(void save()): Effects-of-calling:java.lang.String:length
    //#unanalyzed(void save()): Effects-of-calling:java.lang.String:charAt
    //#unanalyzed(void save()): Effects-of-calling:java.lang.Integer:parseInt
    //#unanalyzed(void save()): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(void save()): Effects-of-calling:java.lang.Character:valueOf
    //#unanalyzed(void save()): Effects-of-calling:java.lang.StringBuilder:length
    //#unanalyzed(void save()): Effects-of-calling:java.util.List:size
    //#unanalyzed(void save()): Effects-of-calling:java.util.List:iterator
    //#unanalyzed(void save()): Effects-of-calling:com.dmdirc.config.IdentityManager:getGlobalConfig
    //#unanalyzed(void save()): Effects-of-calling:com.dmdirc.config.ConfigManager:getOptions
    //#unanalyzed(void save()): Effects-of-calling:java.lang.StringBuilder:indexOf
    //#unanalyzed(void save()): Effects-of-calling:java.lang.StringBuilder:replace
    //#unanalyzed(void save()): Effects-of-calling:java.util.Map:entrySet
    //#unanalyzed(void save()): Effects-of-calling:java.util.Set:iterator
    //#unanalyzed(void save()): Effects-of-calling:java.util.Map$Entry:getKey
    //#unanalyzed(void save()): Effects-of-calling:java.util.Map$Entry:getValue
    //#unanalyzed(void save()): Effects-of-calling:[Ljava.lang.String;:instanceof
    //#unanalyzed(void save()): Effects-of-calling:java.lang.String:instanceof
    //#unanalyzed(void save()): Effects-of-calling:java.lang.String:split
    //#unanalyzed(void save()): Effects-of-calling:java.lang.StringBuffer
    //#unanalyzed(void save()): Effects-of-calling:java.lang.StringBuffer:length
    //#unanalyzed(void save()): Effects-of-calling:java.lang.StringBuffer:insert
    //#unanalyzed(void save()): Effects-of-calling:java.lang.StringBuffer:toString
    //#unanalyzed(void save()): Effects-of-calling:doServerSubstitutions
    //#unanalyzed(void save()): Effects-of-calling:doComponentSubstitutions
    //#unanalyzed(void save()): Effects-of-calling:getServer
    //#unanalyzed(void save()): Effects-of-calling:getState
    //#unanalyzed(void save()): Effects-of-calling:com.dmdirc.ServerState:equals
    //#unanalyzed(void save()): Effects-of-calling:getCompatibleComponents
    //#unanalyzed(void save()): Effects-of-calling:java.lang.Object:toString
    //#unanalyzed(void save()): Effects-of-calling:get
    //#unanalyzed(void save()): Effects-of-calling:test
    //#unanalyzed(void save()): Effects-of-calling:evaluate
    //#unanalyzed(void save()): Effects-of-calling:getUI
    //#unanalyzed(void save()): Effects-of-calling:com.dmdirc.ui.interfaces.UIController:getActiveWindow
    //#unanalyzed(void save()): Effects-of-calling:getFrame
    //#unanalyzed(void save()): Effects-of-calling:com.dmdirc.ui.interfaces.InputWindow:instanceof
    //#unanalyzed(void save()): Effects-of-calling:java.util.List:get
    //#unanalyzed(void save()): Effects-of-calling:com.dmdirc.commandparser.parsers.GlobalCommandParser:getGlobalCommandParser
    //#unanalyzed(void save()): Effects-of-calling:com.dmdirc.ui.interfaces.InputWindow:getCommandParser
    //#unanalyzed(void save()): Effects-of-calling:com.dmdirc.commandparser.parsers.CommandParser:parseCommand
    //#unanalyzed(void save()): Effects-of-calling:java.lang.StringBuffer:setLength
    //#unanalyzed(void save()): Effects-of-calling:java.lang.StringBuffer:append
    //#test_vector(void save()): this.modified: {1}, {0}
    //#test_vector(void save()): this.conditionTree: Addr_Set{null}, Inverse{null}
    //#test_vector(void save()): this.config: Addr_Set{null}, Inverse{null}
    //#test_vector(void save()): this.newFormat: Addr_Set{null}, Inverse{null}
    //#test_vector(void save()): this.triggers[0..4_294_967_295]: Inverse{null}, Addr_Set{null}
    //#test_vector(void save()): com.dmdirc.util.ConfigFile:isKeyDomain(...)@343: {0}, {1}
    //#test_vector(void save()): com.dmdirc.util.ConfigFile:isKeyDomain(...)@347: {0}, {1}
    //#test_vector(void save()): condition.arg@323: {-2_147_483_648..-2, 0..4_294_967_295}, {-1}
    //#test_vector(void save()): java.util.Iterator:hasNext(...)@323: {0}, {1}
            return;
        }
        
        final ConfigFile newConfig = new ConfigFile(location);
    //#Action.java:289: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.util.ConfigFile(String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.Action
    //#    method: void save()
    //#    unanalyzed callee: void com.dmdirc.util.ConfigFile(String)

        final List<String> triggerNames = new ArrayList<String>();
        final List<String> responseLines = new ArrayList<String>();

        for (ActionType trigger : triggers) {
            if (trigger == null) {
                Logger.appError(ErrorLevel.LOW, "ActionType was null",
    //#Action.java:296: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.logger.Logger:appError(ErrorLevel, String, Throwable)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.Action
    //#    method: void save()
    //#    unanalyzed callee: void com.dmdirc.logger.Logger:appError(ErrorLevel, String, Throwable)
                        new IllegalArgumentException("Triggers: "
                        + Arrays.toString(triggers)));
                continue;
            }

            triggerNames.add(trigger.toString());
        }

        for (String line : response) {
            responseLines.add(line);
        }

        newConfig.addDomain(DOMAIN_TRIGGERS, triggerNames);
    //#Action.java:309: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.util.ConfigFile:addDomain(String, List)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.Action
    //#    method: void save()
    //#    unanalyzed callee: void com.dmdirc.util.ConfigFile:addDomain(String, List)
        newConfig.addDomain(DOMAIN_RESPONSE, responseLines);
    //#Action.java:310: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.util.ConfigFile:addDomain(String, List)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.Action
    //#    method: void save()
    //#    unanalyzed callee: void com.dmdirc.util.ConfigFile:addDomain(String, List)

        if (conditionTree != null) {
            newConfig.addDomain(DOMAIN_CONDITIONTREE, new ArrayList<String>());
    //#Action.java:313: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.util.ConfigFile:addDomain(String, List)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.Action
    //#    method: void save()
    //#    unanalyzed callee: void com.dmdirc.util.ConfigFile:addDomain(String, List)
            newConfig.getFlatDomain(DOMAIN_CONDITIONTREE).add(conditionTree.toString());
    //#Action.java:314: Warning: unused assignment in callee
    //#    Unused assignment to (java.lang.String:valueOf(...)._tainted, java.lang.StringBuilder:toString(...)._tainted, java.lang.StringBuilder:toString(...)._tainted, java.lang.StringBuilder:toString(...)._tainted) in toString
    //#    severity: LOW
    //#    class: com.dmdirc.actions.Action
    //#    method: void save()
    //#Action.java:314: Warning: method not available - call not analyzed
    //#    call on List com.dmdirc.util.ConfigFile:getFlatDomain(String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.Action
    //#    method: void save()
    //#    unanalyzed callee: List com.dmdirc.util.ConfigFile:getFlatDomain(String)
        }

        if (newFormat != null) {
            newConfig.addDomain(DOMAIN_FORMAT, new ArrayList<String>());
    //#Action.java:318: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.util.ConfigFile:addDomain(String, List)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.Action
    //#    method: void save()
    //#    unanalyzed callee: void com.dmdirc.util.ConfigFile:addDomain(String, List)
            newConfig.getFlatDomain(DOMAIN_FORMAT).add(newFormat);
    //#Action.java:319: Warning: method not available - call not analyzed
    //#    call on List com.dmdirc.util.ConfigFile:getFlatDomain(String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.Action
    //#    method: void save()
    //#    unanalyzed callee: List com.dmdirc.util.ConfigFile:getFlatDomain(String)
        }

        int i = 0;
        for (ActionCondition condition : conditions) {
            final Map<String, String> data = new HashMap<String, String>();

            data.put("argument", String.valueOf(condition.getArg()));
            
            if (condition.getArg() == -1) {
                data.put("starget", condition.getStarget());
            } else {
                data.put("component", condition.getComponent().toString());
            }
            
            data.put("comparison", condition.getComparison().toString());
            data.put("target", condition.getTarget());

            newConfig.addDomain("condition " + i, data);
    //#Action.java:337: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.util.ConfigFile:addDomain(String, Map)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.Action
    //#    method: void save()
    //#    unanalyzed callee: void com.dmdirc.util.ConfigFile:addDomain(String, Map)
            i++;
    //#Action.java:338: ?overflow
    //#    i in {-2_147_483_649..4_294_967_294}
    //#    severity: LOW
    //#    class: com.dmdirc.actions.Action
    //#    method: void save()
    //#    basic block: bb_21
    //#    assertion: i in {-2_147_483_649..4_294_967_294}
    //#    VN: i + 1
    //#    Expected: {-2_147_483_648..4_294_967_295, Invalid}
    //#    Bad: {4_294_967_296}
    //#    Attribs:  Int  Bad singleton  Bad > Exp
        }

        if (config != null) {
            // Preserve any meta-data
            if (config.isKeyDomain(DOMAIN_METADATA)) {
    //#Action.java:343: Warning: method not available - call not analyzed
    //#    call on bool com.dmdirc.util.ConfigFile:isKeyDomain(String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.Action
    //#    method: void save()
    //#    unanalyzed callee: bool com.dmdirc.util.ConfigFile:isKeyDomain(String)
                newConfig.addDomain(DOMAIN_METADATA, config.getKeyDomain(DOMAIN_METADATA));
    //#Action.java:344: Warning: method not available - call not analyzed
    //#    call on Map com.dmdirc.util.ConfigFile:getKeyDomain(String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.Action
    //#    method: void save()
    //#    unanalyzed callee: Map com.dmdirc.util.ConfigFile:getKeyDomain(String)
    //#Action.java:344: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.util.ConfigFile:addDomain(String, Map)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.Action
    //#    method: void save()
    //#    unanalyzed callee: void com.dmdirc.util.ConfigFile:addDomain(String, Map)
            }

            for (i = 0; config.isKeyDomain("setting " + i); i++) {
    //#Action.java:347: Warning: method not available - call not analyzed
    //#    call on bool com.dmdirc.util.ConfigFile:isKeyDomain(String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.Action
    //#    method: void save()
    //#    unanalyzed callee: bool com.dmdirc.util.ConfigFile:isKeyDomain(String)
    //#Action.java:347: ?overflow
    //#    i in {-2_147_483_649..4_294_967_294}
    //#    severity: LOW
    //#    class: com.dmdirc.actions.Action
    //#    method: void save()
    //#    basic block: bb_27
    //#    assertion: i in {-2_147_483_649..4_294_967_294}
    //#    VN: i + 1
    //#    Expected: {-2_147_483_648..4_294_967_295, Invalid}
    //#    Bad: {4_294_967_296}
    //#    Attribs:  Int  Bad singleton  Bad > Exp
                newConfig.addDomain("setting " + i, config.getKeyDomain("setting " + i));
    //#Action.java:348: Warning: method not available - call not analyzed
    //#    call on Map com.dmdirc.util.ConfigFile:getKeyDomain(String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.Action
    //#    method: void save()
    //#    unanalyzed callee: Map com.dmdirc.util.ConfigFile:getKeyDomain(String)
    //#Action.java:348: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.util.ConfigFile:addDomain(String, Map)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.Action
    //#    method: void save()
    //#    unanalyzed callee: void com.dmdirc.util.ConfigFile:addDomain(String, Map)
            }
        }

        try {
            newConfig.write();
    //#Action.java:353: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.util.ConfigFile:write()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.Action
    //#    method: void save()
    //#    unanalyzed callee: void com.dmdirc.util.ConfigFile:write()

            resetModified();
        } catch (IOException ex) {
            Logger.userError(ErrorLevel.HIGH, "I/O error when saving action: "
    //#Action.java:357: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.logger.Logger:userError(ErrorLevel, String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.Action
    //#    method: void save()
    //#    unanalyzed callee: void com.dmdirc.logger.Logger:userError(ErrorLevel, String)
                    + group + "/" + name + ": " + ex.getMessage());
        }
        ActionManager.processEvent(CoreActionType.ACTION_UPDATED, null, this);
    //#Action.java:360: ?!precondition failure
    //#    com/dmdirc/actions/ActionManager.processEvent: (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}
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.actions.Action
    //#    method: void save()
    //#    basic block: bb_31
    //#    assertion: (soft) undefined in {340_736, 341_760, 342_528, 343_040, 343_552, 344_064, 344_576, 362_496}
    //#    callee: void com/dmdirc/actions/ActionManager.processEvent(ActionType, StringBuffer, Object[])
    //#    callee assertion: (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}
    //#    callee file: ActionManager.java
    //#    callee precondition index: [29]
    //#    callee srcpos: 365
    //#    VN: undefined
    //#    Expected: {340_736, 341_760, 342_528, 343_040, 343_552, 344_064, 344_576, 362_496}
    //#    Bad: {0, Invalid}
    //#    Attribs:  Int  Bad singleton  Bad overlaps +/-1000  Soft  Bad < Exp
    }
    //#Action.java:361: end of method: void com.dmdirc.actions.Action.save()

    /**
     * Reads a condition from the specified configuration section.
     * 
     * @param data The relevant section of the action configuration
     * @return True if the condition is valid, false otherwise
     */
    private boolean readCondition(final Map<String,String> data) {
        int arg = 0;
    //#Action.java:370: method: bool com.dmdirc.actions.Action.readCondition(Map)
    //#Action.java:370: Warning: unused assignment
    //#    Unused assignment into arg
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.actions.Action
    //#    method: bool readCondition(Map)
    //#    Attribs:  Uncertain
    //#Action.java:370: Warning: suspicious precondition
    //#    The precondition for this.triggers[0].__Tag is not a contiguous range of values
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.actions.Action
    //#    method: bool readCondition(Map)
    //#    suspicious precondition index: [11]
    //#    Attribs:  Soft
    //#Action.java:370: Warning: suspicious precondition
    //#    The precondition for this.triggers[0].type.__Tag is not a contiguous range of values
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.actions.Action
    //#    method: bool readCondition(Map)
    //#    suspicious precondition index: [14]
    //#    Attribs:  Soft
    //#Action.java:370: Warning: suspicious precondition
    //#    The precondition for this.triggers[0].type.__Tag is not a contiguous range of values
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.actions.Action
    //#    method: bool readCondition(Map)
    //#    suspicious precondition index: [15]
    //#    Attribs:  Soft
    //#input(bool readCondition(Map)): " cannot be applied to "._tainted
    //#input(bool readCondition(Map)): " not found"._tainted
    //#input(bool readCondition(Map)): "."._tainted
    //#input(bool readCondition(Map)): ": "._tainted
    //#input(bool readCondition(Map)): "Comparison cannot be applied to specified component: "._tainted
    //#input(bool readCondition(Map)): "Component "._tainted
    //#input(bool readCondition(Map)): "Component cannot be applied to specified arg in condition: "._tainted
    //#input(bool readCondition(Map)): "Error when parsing action: "._tainted
    //#input(bool readCondition(Map)): "Invalid argument number specified: "._tainted
    //#input(bool readCondition(Map)): "Invalid comparison specified: "._tainted
    //#input(bool readCondition(Map)): "No starget specified"._tainted
    //#input(bool readCondition(Map)): "No target specified for condition"._tainted
    //#input(bool readCondition(Map)): "Unknown component: "._tainted
    //#input(bool readCondition(Map)): com.dmdirc.logger.ErrorLevel.LOW
    //#input(bool readCondition(Map)): com/dmdirc/actions/ActionComponentChain.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(bool readCondition(Map)): com/dmdirc/actions/ActionComponentChain.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(bool readCondition(Map)): com/dmdirc/actions/ActionManager.actionComparisons
    //#input(bool readCondition(Map)): com/dmdirc/actions/ActionManager.actionComponents
    //#input(bool readCondition(Map)): com/dmdirc/actions/CoreActionComparison$1.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(bool readCondition(Map)): com/dmdirc/actions/CoreActionComparison$10.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(bool readCondition(Map)): com/dmdirc/actions/CoreActionComparison$11.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(bool readCondition(Map)): com/dmdirc/actions/CoreActionComparison$12.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(bool readCondition(Map)): com/dmdirc/actions/CoreActionComparison$2.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(bool readCondition(Map)): com/dmdirc/actions/CoreActionComparison$3.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(bool readCondition(Map)): com/dmdirc/actions/CoreActionComparison$4.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(bool readCondition(Map)): com/dmdirc/actions/CoreActionComparison$5.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(bool readCondition(Map)): com/dmdirc/actions/CoreActionComparison$6.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(bool readCondition(Map)): com/dmdirc/actions/CoreActionComparison$7.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(bool readCondition(Map)): com/dmdirc/actions/CoreActionComparison$8.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(bool readCondition(Map)): com/dmdirc/actions/CoreActionComparison$9.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(bool readCondition(Map)): com/dmdirc/actions/CoreActionComparison.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(bool readCondition(Map)): com/dmdirc/actions/CoreActionComponent$1.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(bool readCondition(Map)): com/dmdirc/actions/CoreActionComponent$1.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(bool readCondition(Map)): com/dmdirc/actions/CoreActionComponent$10.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(bool readCondition(Map)): com/dmdirc/actions/CoreActionComponent$10.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(bool readCondition(Map)): com/dmdirc/actions/CoreActionComponent$11.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(bool readCondition(Map)): com/dmdirc/actions/CoreActionComponent$11.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(bool readCondition(Map)): com/dmdirc/actions/CoreActionComponent$12.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(bool readCondition(Map)): com/dmdirc/actions/CoreActionComponent$12.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(bool readCondition(Map)): com/dmdirc/actions/CoreActionComponent$13.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(bool readCondition(Map)): com/dmdirc/actions/CoreActionComponent$13.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(bool readCondition(Map)): com/dmdirc/actions/CoreActionComponent$14.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(bool readCondition(Map)): com/dmdirc/actions/CoreActionComponent$14.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(bool readCondition(Map)): com/dmdirc/actions/CoreActionComponent$15.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(bool readCondition(Map)): com/dmdirc/actions/CoreActionComponent$15.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(bool readCondition(Map)): com/dmdirc/actions/CoreActionComponent$16.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(bool readCondition(Map)): com/dmdirc/actions/CoreActionComponent$16.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(bool readCondition(Map)): com/dmdirc/actions/CoreActionComponent$17.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(bool readCondition(Map)): com/dmdirc/actions/CoreActionComponent$17.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(bool readCondition(Map)): com/dmdirc/actions/CoreActionComponent$18.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(bool readCondition(Map)): com/dmdirc/actions/CoreActionComponent$18.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(bool readCondition(Map)): com/dmdirc/actions/CoreActionComponent$19.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(bool readCondition(Map)): com/dmdirc/actions/CoreActionComponent$19.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(bool readCondition(Map)): com/dmdirc/actions/CoreActionComponent$2.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(bool readCondition(Map)): com/dmdirc/actions/CoreActionComponent$2.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(bool readCondition(Map)): com/dmdirc/actions/CoreActionComponent$20.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(bool readCondition(Map)): com/dmdirc/actions/CoreActionComponent$20.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(bool readCondition(Map)): com/dmdirc/actions/CoreActionComponent$21.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(bool readCondition(Map)): com/dmdirc/actions/CoreActionComponent$21.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(bool readCondition(Map)): com/dmdirc/actions/CoreActionComponent$22.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(bool readCondition(Map)): com/dmdirc/actions/CoreActionComponent$22.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(bool readCondition(Map)): com/dmdirc/actions/CoreActionComponent$23.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(bool readCondition(Map)): com/dmdirc/actions/CoreActionComponent$23.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(bool readCondition(Map)): com/dmdirc/actions/CoreActionComponent$24.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(bool readCondition(Map)): com/dmdirc/actions/CoreActionComponent$24.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(bool readCondition(Map)): com/dmdirc/actions/CoreActionComponent$25.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(bool readCondition(Map)): com/dmdirc/actions/CoreActionComponent$25.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(bool readCondition(Map)): com/dmdirc/actions/CoreActionComponent$26.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(bool readCondition(Map)): com/dmdirc/actions/CoreActionComponent$26.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(bool readCondition(Map)): com/dmdirc/actions/CoreActionComponent$27.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(bool readCondition(Map)): com/dmdirc/actions/CoreActionComponent$27.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(bool readCondition(Map)): com/dmdirc/actions/CoreActionComponent$3.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(bool readCondition(Map)): com/dmdirc/actions/CoreActionComponent$3.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(bool readCondition(Map)): com/dmdirc/actions/CoreActionComponent$4.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(bool readCondition(Map)): com/dmdirc/actions/CoreActionComponent$4.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(bool readCondition(Map)): com/dmdirc/actions/CoreActionComponent$5.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(bool readCondition(Map)): com/dmdirc/actions/CoreActionComponent$5.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(bool readCondition(Map)): com/dmdirc/actions/CoreActionComponent$6.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(bool readCondition(Map)): com/dmdirc/actions/CoreActionComponent$6.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(bool readCondition(Map)): com/dmdirc/actions/CoreActionComponent$7.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(bool readCondition(Map)): com/dmdirc/actions/CoreActionComponent$7.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(bool readCondition(Map)): com/dmdirc/actions/CoreActionComponent$8.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(bool readCondition(Map)): com/dmdirc/actions/CoreActionComponent$8.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(bool readCondition(Map)): com/dmdirc/actions/CoreActionComponent$9.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(bool readCondition(Map)): com/dmdirc/actions/CoreActionComponent$9.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(bool readCondition(Map)): com/dmdirc/actions/CoreActionComponent.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(bool readCondition(Map)): com/dmdirc/actions/CoreActionComponent.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(bool readCondition(Map)): com/dmdirc/actions/CoreActionType.__Dispatch_Table.getType()Lcom/dmdirc/actions/interfaces/ActionMetaType;
    //#input(bool readCondition(Map)): com/dmdirc/actions/interfaces/ActionComparison.__Descendant_Table[com/dmdirc/actions/CoreActionComparison$10]
    //#input(bool readCondition(Map)): com/dmdirc/actions/interfaces/ActionComparison.__Descendant_Table[com/dmdirc/actions/CoreActionComparison$11]
    //#input(bool readCondition(Map)): com/dmdirc/actions/interfaces/ActionComparison.__Descendant_Table[com/dmdirc/actions/CoreActionComparison$12]
    //#input(bool readCondition(Map)): com/dmdirc/actions/interfaces/ActionComparison.__Descendant_Table[com/dmdirc/actions/CoreActionComparison$1]
    //#input(bool readCondition(Map)): com/dmdirc/actions/interfaces/ActionComparison.__Descendant_Table[com/dmdirc/actions/CoreActionComparison$2]
    //#input(bool readCondition(Map)): com/dmdirc/actions/interfaces/ActionComparison.__Descendant_Table[com/dmdirc/actions/CoreActionComparison$3]
    //#input(bool readCondition(Map)): com/dmdirc/actions/interfaces/ActionComparison.__Descendant_Table[com/dmdirc/actions/CoreActionComparison$4]
    //#input(bool readCondition(Map)): com/dmdirc/actions/interfaces/ActionComparison.__Descendant_Table[com/dmdirc/actions/CoreActionComparison$5]
    //#input(bool readCondition(Map)): com/dmdirc/actions/interfaces/ActionComparison.__Descendant_Table[com/dmdirc/actions/CoreActionComparison$6]
    //#input(bool readCondition(Map)): com/dmdirc/actions/interfaces/ActionComparison.__Descendant_Table[com/dmdirc/actions/CoreActionComparison$7]
    //#input(bool readCondition(Map)): com/dmdirc/actions/interfaces/ActionComparison.__Descendant_Table[com/dmdirc/actions/CoreActionComparison$8]
    //#input(bool readCondition(Map)): com/dmdirc/actions/interfaces/ActionComparison.__Descendant_Table[com/dmdirc/actions/CoreActionComparison$9]
    //#input(bool readCondition(Map)): com/dmdirc/actions/interfaces/ActionComparison.__Descendant_Table[com/dmdirc/actions/CoreActionComparison]
    //#input(bool readCondition(Map)): com/dmdirc/actions/interfaces/ActionComparison.__Descendant_Table[com/dmdirc/actions/interfaces/ActionComparison]
    //#input(bool readCondition(Map)): com/dmdirc/actions/interfaces/ActionComparison.__Descendant_Table[others]
    //#input(bool readCondition(Map)): com/dmdirc/actions/interfaces/ActionComparison.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(bool readCondition(Map)): com/dmdirc/actions/interfaces/ActionComponent.__Descendant_Table[others]
    //#input(bool readCondition(Map)): com/dmdirc/actions/interfaces/ActionComponent.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(bool readCondition(Map)): com/dmdirc/actions/interfaces/ActionComponent.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(bool readCondition(Map)): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/interfaces/ActionMetaType]
    //#input(bool readCondition(Map)): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/ActionEvents]
    //#input(bool readCondition(Map)): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/ChannelEvents]
    //#input(bool readCondition(Map)): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/ClientEvents]
    //#input(bool readCondition(Map)): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/PluginEvents]
    //#input(bool readCondition(Map)): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/QueryEvents]
    //#input(bool readCondition(Map)): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/ServerEvents]
    //#input(bool readCondition(Map)): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/addons/dcc/actions/DCCEvents]
    //#input(bool readCondition(Map)): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[others]
    //#input(bool readCondition(Map)): com/dmdirc/actions/interfaces/ActionMetaType.__Dispatch_Table.getArgTypes()[Ljava/lang/Class;
    //#input(bool readCondition(Map)): com/dmdirc/actions/interfaces/ActionMetaType.__Dispatch_Table.getArity()I
    //#input(bool readCondition(Map)): com/dmdirc/actions/interfaces/ActionType.__Descendant_Table[com/dmdirc/actions/CoreActionType]
    //#input(bool readCondition(Map)): com/dmdirc/actions/interfaces/ActionType.__Descendant_Table[com/dmdirc/actions/interfaces/ActionType]
    //#input(bool readCondition(Map)): com/dmdirc/actions/interfaces/ActionType.__Descendant_Table[com/dmdirc/addons/dcc/actions/DCCActions]
    //#input(bool readCondition(Map)): com/dmdirc/actions/interfaces/ActionType.__Descendant_Table[others]
    //#input(bool readCondition(Map)): com/dmdirc/actions/interfaces/ActionType.__Dispatch_Table.getType()Lcom/dmdirc/actions/interfaces/ActionMetaType;
    //#input(bool readCondition(Map)): com/dmdirc/actions/metatypes/ActionEvents.__Dispatch_Table.getArgTypes()[Ljava/lang/Class;
    //#input(bool readCondition(Map)): com/dmdirc/actions/metatypes/ActionEvents.__Dispatch_Table.getArity()I
    //#input(bool readCondition(Map)): com/dmdirc/actions/metatypes/ChannelEvents.__Dispatch_Table.getArgTypes()[Ljava/lang/Class;
    //#input(bool readCondition(Map)): com/dmdirc/actions/metatypes/ChannelEvents.__Dispatch_Table.getArity()I
    //#input(bool readCondition(Map)): com/dmdirc/actions/metatypes/ClientEvents.__Dispatch_Table.getArgTypes()[Ljava/lang/Class;
    //#input(bool readCondition(Map)): com/dmdirc/actions/metatypes/ClientEvents.__Dispatch_Table.getArity()I
    //#input(bool readCondition(Map)): com/dmdirc/actions/metatypes/PluginEvents.__Dispatch_Table.getArgTypes()[Ljava/lang/Class;
    //#input(bool readCondition(Map)): com/dmdirc/actions/metatypes/PluginEvents.__Dispatch_Table.getArity()I
    //#input(bool readCondition(Map)): com/dmdirc/actions/metatypes/QueryEvents.__Dispatch_Table.getArgTypes()[Ljava/lang/Class;
    //#input(bool readCondition(Map)): com/dmdirc/actions/metatypes/QueryEvents.__Dispatch_Table.getArity()I
    //#input(bool readCondition(Map)): com/dmdirc/actions/metatypes/ServerEvents.__Dispatch_Table.getArgTypes()[Ljava/lang/Class;
    //#input(bool readCondition(Map)): com/dmdirc/actions/metatypes/ServerEvents.__Dispatch_Table.getArity()I
    //#input(bool readCondition(Map)): com/dmdirc/addons/dcc/actions/DCCActions.__Dispatch_Table.getType()Lcom/dmdirc/actions/interfaces/ActionMetaType;
    //#input(bool readCondition(Map)): com/dmdirc/addons/dcc/actions/DCCEvents.__Dispatch_Table.getArgTypes()[Ljava/lang/Class;
    //#input(bool readCondition(Map)): com/dmdirc/addons/dcc/actions/DCCEvents.__Dispatch_Table.getArity()I
    //#input(bool readCondition(Map)): data
    //#input(bool readCondition(Map)): this
    //#input(bool readCondition(Map)): this.conditions
    //#input(bool readCondition(Map)): this.group
    //#input(bool readCondition(Map)): this.group._tainted
    //#input(bool readCondition(Map)): this.name
    //#input(bool readCondition(Map)): this.name._tainted
    //#input(bool readCondition(Map)): this.triggers
    //#input(bool readCondition(Map)): this.triggers.length
    //#input(bool readCondition(Map)): this.triggers[0]
    //#input(bool readCondition(Map)): this.triggers[0].__Tag
    //#input(bool readCondition(Map)): this.triggers[0].type
    //#input(bool readCondition(Map)): this.triggers[0].type.__Tag
    //#output(bool readCondition(Map)): return_value
    //#pre[1] (bool readCondition(Map)): data != null
    //#pre[3] (bool readCondition(Map)): (soft) this.conditions != null
    //#pre[4] (bool readCondition(Map)): (soft) init'ed(this.group)
    //#pre[6] (bool readCondition(Map)): (soft) init'ed(this.name)
    //#pre[8] (bool readCondition(Map)): (soft) this.triggers != null
    //#pre[9] (bool readCondition(Map)): (soft) this.triggers.length >= 1
    //#pre[10] (bool readCondition(Map)): (soft) this.triggers[0] != null
    //#pre[11] (bool readCondition(Map)): (soft) this.triggers[0].__Tag in {com/dmdirc/actions/CoreActionType, com/dmdirc/actions/interfaces/ActionType, com/dmdirc/addons/dcc/actions/DCCActions}
    //#pre[12] (bool readCondition(Map)): (soft) this.triggers[0].type != null
    //#pre[13] (bool readCondition(Map)): (soft) this.triggers[0].type != null
    //#pre[14] (bool readCondition(Map)): (soft) this.triggers[0].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[15] (bool readCondition(Map)): (soft) this.triggers[0].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(bool readCondition(Map)): appliesTo(...)@414 != null
    //#presumption(bool readCondition(Map)): appliesTo(...)@414 != null
    //#presumption(bool readCondition(Map)): getType(...)@385 != getType(...)
    //#presumption(bool readCondition(Map)): java.util.Map:get(...)@408 != null
    //#post(bool readCondition(Map)): init'ed(return_value)
    //#unanalyzed(bool readCondition(Map)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(bool readCondition(Map)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(bool readCondition(Map)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(bool readCondition(Map)): Effects-of-calling:com.dmdirc.logger.Logger:userError
    //#unanalyzed(bool readCondition(Map)): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(bool readCondition(Map)): Effects-of-calling:com.dmdirc.logger.Logger:assertTrue
    //#unanalyzed(bool readCondition(Map)): Effects-of-calling:getType
    //#unanalyzed(bool readCondition(Map)): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(bool readCondition(Map)): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(bool readCondition(Map)): Effects-of-calling:java.util.Map:get
    //#unanalyzed(bool readCondition(Map)): Effects-of-calling:java.lang.String:indexOf
    //#unanalyzed(bool readCondition(Map)): Effects-of-calling:java.lang.String:isEmpty
    //#unanalyzed(bool readCondition(Map)): Effects-of-calling:java.util.List:iterator
    //#unanalyzed(bool readCondition(Map)): Effects-of-calling:java.lang.String:equals
    //#unanalyzed(bool readCondition(Map)): Effects-of-calling:java.lang.Enum:name
    //#unanalyzed(bool readCondition(Map)): Effects-of-calling:getActionComponent
    //#unanalyzed(bool readCondition(Map)): Effects-of-calling:getArgTypes
    //#unanalyzed(bool readCondition(Map)): Effects-of-calling:appliesTo
    //#unanalyzed(bool readCondition(Map)): Effects-of-calling:java.util.ArrayList
    //#unanalyzed(bool readCondition(Map)): Effects-of-calling:java.lang.String:split
    //#unanalyzed(bool readCondition(Map)): Effects-of-calling:java.util.List:add
    //#unanalyzed(bool readCondition(Map)): Effects-of-calling:java.lang.Class:getName
    //#unanalyzed(bool readCondition(Map)): Effects-of-calling:java.lang.IllegalArgumentException
    //#unanalyzed(bool readCondition(Map)): Effects-of-calling:java.lang.Object:equals
    //#unanalyzed(bool readCondition(Map)): Effects-of-calling:java.lang.IllegalArgumentException:getMessage
    //#test_vector(bool readCondition(Map)): java.lang.Integer:parseInt(...)@379: {-2_147_483_648..-2}, {0..4_294_967_294}, {-1}
    //#test_vector(bool readCondition(Map)): java.lang.Object:equals(...)@414: {0}, {1}
    //#test_vector(bool readCondition(Map)): java.lang.Object:equals(...)@414: {1}, {0}
    //#test_vector(bool readCondition(Map)): java.util.Map:get(...)@393: Inverse{null}, Addr_Set{null}
    //#test_vector(bool readCondition(Map)): java.util.Map:get(...)@422: Inverse{null}, Addr_Set{null}
        ActionComponent component = null;
        ActionComparison comparison = null;
    //#Action.java:372: Warning: unused assignment
    //#    Unused assignment into comparison
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.actions.Action
    //#    method: bool readCondition(Map)
    //#    Attribs:  Uncertain
        String target = "";
    //#Action.java:373: Warning: unused assignment
    //#    Unused assignment into target
    //#    severity: LOW
    //#    class: com.dmdirc.actions.Action
    //#    method: bool readCondition(Map)
        String starget = null;

        // ------ Read the argument

        try {
            arg = Integer.parseInt(data.get("argument"));
        } catch (NumberFormatException ex) {
            error("Invalid argument number specified: " + data.get("argument"));
            return false;
        }

        if (arg < -1 || arg >= triggers[0].getType().getArity()) {
    //#Action.java:385: Warning: call too complex - analysis skipped
    //#    call on int getArity()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.Action
    //#    method: bool readCondition(Map)
    //#    unanalyzed callee: int getArity()
            error("Invalid argument number specified: " + arg);
            return false;
        }

        // ------ Read the component or the source

        if (arg == -1) {
            starget = data.get("starget");
            
            if (starget == null) {
                error("No starget specified");
                return false;
            }
        } else {
            component = readComponent(data, arg);
            if (component == null) {
                return false;
            }            
        }

        // ------ Read the comparison

        comparison = ActionManager.getActionComparison(data.get("comparison"));
        if (comparison == null) {
            error("Invalid comparison specified: " + data.get("comparison"));
            return false;
        }

        if ((arg != -1 && !comparison.appliesTo().equals(component.getType())) 
    //#Action.java:414: ?use of default init
    //#    init'ed(comparison.__Tag)
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.actions.Action
    //#    method: bool readCondition(Map)
    //#    basic block: bb_15
    //#    assertion: init'ed(comparison.__Tag)
    //#    VN: comparison.__Tag
    //#    Expected: {-Inf..+Inf}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Bad only invalid
    //#Action.java:414: ?null dereference
    //#    com/dmdirc/actions/interfaces/ActionComparison.__Descendant_Table[comparison.__Tag] != null
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.actions.Action
    //#    method: bool readCondition(Map)
    //#    basic block: bb_15
    //#    assertion: com/dmdirc/actions/interfaces/ActionComparison.__Descendant_Table[comparison.__Tag] != null
    //#    VN: com/dmdirc/actions/interfaces/ActionComparison.__Descendant_Table[comparison.__Tag]
    //#    Expected: Inverse{null}
    //#    Bad: Addr_Set{null}
    //#    Attribs:  Ptr  null in Bad
    //#Action.java:414: Warning: call too complex - analysis skipped
    //#    call on Class appliesTo()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.Action
    //#    method: bool readCondition(Map)
    //#    unanalyzed callee: Class appliesTo()
    //#Action.java:414: ?null dereference
    //#    com/dmdirc/actions/interfaces/ActionComponent.__Descendant_Table[component.__Tag] != null
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.actions.Action
    //#    method: bool readCondition(Map)
    //#    basic block: bb_15
    //#    assertion: com/dmdirc/actions/interfaces/ActionComponent.__Descendant_Table[component.__Tag] != null
    //#    VN: com/dmdirc/actions/interfaces/ActionComponent.__Descendant_Table[component.__Tag]
    //#    Expected: Inverse{null}
    //#    Bad: Addr_Set{null, Invalid}
    //#    Attribs:  Ptr  null in Bad
    //#Action.java:414: Warning: call too complex - analysis skipped
    //#    call on Class getType()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.Action
    //#    method: bool readCondition(Map)
    //#    unanalyzed callee: Class getType()
    //#Action.java:414: ?use of default init
    //#    init'ed(comparison.__Tag)
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.actions.Action
    //#    method: bool readCondition(Map)
    //#    basic block: bb_17
    //#    assertion: init'ed(comparison.__Tag)
    //#    VN: comparison.__Tag
    //#    Expected: {-Inf..+Inf}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Bad only invalid
    //#Action.java:414: ?null dereference
    //#    com/dmdirc/actions/interfaces/ActionComparison.__Descendant_Table[comparison.__Tag] != null
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.actions.Action
    //#    method: bool readCondition(Map)
    //#    basic block: bb_17
    //#    assertion: com/dmdirc/actions/interfaces/ActionComparison.__Descendant_Table[comparison.__Tag] != null
    //#    VN: com/dmdirc/actions/interfaces/ActionComparison.__Descendant_Table[comparison.__Tag]
    //#    Expected: Inverse{null}
    //#    Bad: Addr_Set{null}
    //#    Attribs:  Ptr  null in Bad
            || (arg == -1 && !comparison.appliesTo().equals(String.class))) {
            error("Comparison cannot be applied to specified component: " + data.get("comparison"));
            return false;
        }

        // ------ Read the target

        target = data.get("target");

        if (target == null) {
            error("No target specified for condition");
            return false;
        }

        if (arg == -1) {
            conditions.add(new ActionCondition(starget, comparison, target));
        } else {
            conditions.add(new ActionCondition(arg, component, comparison, target));
        }
        
        return true;
    //#Action.java:435: end of method: bool com.dmdirc.actions.Action.readCondition(Map)
    }

    /**
     * Reads a component from the specified data section for the specified argument.
     * 
     * @param data The relevant section of the action configuration
     * @param arg The argument number that the component should apply to
     * @return The corresponding ActionComponent, or null if the specified
     * component is invalid.
     */
    private ActionComponent readComponent(final Map<String, String> data, final int arg) {
        final String componentName = data.get("component");
    //#Action.java:447: method: ActionComponent com.dmdirc.actions.Action.readComponent(Map, int)
    //#Action.java:447: Warning: suspicious precondition
    //#    The precondition for this.triggers[0].__Tag is not a contiguous range of values
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.actions.Action
    //#    method: ActionComponent readComponent(Map, int)
    //#    suspicious precondition index: [11]
    //#    Attribs:  Soft
    //#Action.java:447: Warning: suspicious precondition
    //#    The precondition for this.triggers[0].type.__Tag is not a contiguous range of values
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.actions.Action
    //#    method: ActionComponent readComponent(Map, int)
    //#    suspicious precondition index: [14]
    //#    Attribs:  Soft
    //#Action.java:447: Warning: suspicious precondition
    //#    The precondition for this.triggers[0].type.__Tag is not a contiguous range of values
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.actions.Action
    //#    method: ActionComponent readComponent(Map, int)
    //#    suspicious precondition index: [15]
    //#    Attribs:  Soft
    //#input(ActionComponent readComponent(Map, int)): " cannot be applied to "._tainted
    //#input(ActionComponent readComponent(Map, int)): " not found"._tainted
    //#input(ActionComponent readComponent(Map, int)): "."._tainted
    //#input(ActionComponent readComponent(Map, int)): ": "._tainted
    //#input(ActionComponent readComponent(Map, int)): "Component "._tainted
    //#input(ActionComponent readComponent(Map, int)): "Component cannot be applied to specified arg in condition: "._tainted
    //#input(ActionComponent readComponent(Map, int)): "Error when parsing action: "._tainted
    //#input(ActionComponent readComponent(Map, int)): "Unknown component: "._tainted
    //#input(ActionComponent readComponent(Map, int)): arg
    //#input(ActionComponent readComponent(Map, int)): com.dmdirc.logger.ErrorLevel.LOW
    //#input(ActionComponent readComponent(Map, int)): com/dmdirc/actions/ActionComponentChain.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(ActionComponent readComponent(Map, int)): com/dmdirc/actions/ActionComponentChain.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(ActionComponent readComponent(Map, int)): com/dmdirc/actions/ActionManager.actionComponents
    //#input(ActionComponent readComponent(Map, int)): com/dmdirc/actions/CoreActionComponent$1.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(ActionComponent readComponent(Map, int)): com/dmdirc/actions/CoreActionComponent$1.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(ActionComponent readComponent(Map, int)): com/dmdirc/actions/CoreActionComponent$10.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(ActionComponent readComponent(Map, int)): com/dmdirc/actions/CoreActionComponent$10.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(ActionComponent readComponent(Map, int)): com/dmdirc/actions/CoreActionComponent$11.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(ActionComponent readComponent(Map, int)): com/dmdirc/actions/CoreActionComponent$11.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(ActionComponent readComponent(Map, int)): com/dmdirc/actions/CoreActionComponent$12.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(ActionComponent readComponent(Map, int)): com/dmdirc/actions/CoreActionComponent$12.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(ActionComponent readComponent(Map, int)): com/dmdirc/actions/CoreActionComponent$13.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(ActionComponent readComponent(Map, int)): com/dmdirc/actions/CoreActionComponent$13.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(ActionComponent readComponent(Map, int)): com/dmdirc/actions/CoreActionComponent$14.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(ActionComponent readComponent(Map, int)): com/dmdirc/actions/CoreActionComponent$14.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(ActionComponent readComponent(Map, int)): com/dmdirc/actions/CoreActionComponent$15.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(ActionComponent readComponent(Map, int)): com/dmdirc/actions/CoreActionComponent$15.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(ActionComponent readComponent(Map, int)): com/dmdirc/actions/CoreActionComponent$16.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(ActionComponent readComponent(Map, int)): com/dmdirc/actions/CoreActionComponent$16.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(ActionComponent readComponent(Map, int)): com/dmdirc/actions/CoreActionComponent$17.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(ActionComponent readComponent(Map, int)): com/dmdirc/actions/CoreActionComponent$17.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(ActionComponent readComponent(Map, int)): com/dmdirc/actions/CoreActionComponent$18.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(ActionComponent readComponent(Map, int)): com/dmdirc/actions/CoreActionComponent$18.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(ActionComponent readComponent(Map, int)): com/dmdirc/actions/CoreActionComponent$19.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(ActionComponent readComponent(Map, int)): com/dmdirc/actions/CoreActionComponent$19.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(ActionComponent readComponent(Map, int)): com/dmdirc/actions/CoreActionComponent$2.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(ActionComponent readComponent(Map, int)): com/dmdirc/actions/CoreActionComponent$2.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(ActionComponent readComponent(Map, int)): com/dmdirc/actions/CoreActionComponent$20.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(ActionComponent readComponent(Map, int)): com/dmdirc/actions/CoreActionComponent$20.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(ActionComponent readComponent(Map, int)): com/dmdirc/actions/CoreActionComponent$21.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(ActionComponent readComponent(Map, int)): com/dmdirc/actions/CoreActionComponent$21.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(ActionComponent readComponent(Map, int)): com/dmdirc/actions/CoreActionComponent$22.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(ActionComponent readComponent(Map, int)): com/dmdirc/actions/CoreActionComponent$22.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(ActionComponent readComponent(Map, int)): com/dmdirc/actions/CoreActionComponent$23.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(ActionComponent readComponent(Map, int)): com/dmdirc/actions/CoreActionComponent$23.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(ActionComponent readComponent(Map, int)): com/dmdirc/actions/CoreActionComponent$24.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(ActionComponent readComponent(Map, int)): com/dmdirc/actions/CoreActionComponent$24.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(ActionComponent readComponent(Map, int)): com/dmdirc/actions/CoreActionComponent$25.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(ActionComponent readComponent(Map, int)): com/dmdirc/actions/CoreActionComponent$25.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(ActionComponent readComponent(Map, int)): com/dmdirc/actions/CoreActionComponent$26.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(ActionComponent readComponent(Map, int)): com/dmdirc/actions/CoreActionComponent$26.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(ActionComponent readComponent(Map, int)): com/dmdirc/actions/CoreActionComponent$27.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(ActionComponent readComponent(Map, int)): com/dmdirc/actions/CoreActionComponent$27.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(ActionComponent readComponent(Map, int)): com/dmdirc/actions/CoreActionComponent$3.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(ActionComponent readComponent(Map, int)): com/dmdirc/actions/CoreActionComponent$3.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(ActionComponent readComponent(Map, int)): com/dmdirc/actions/CoreActionComponent$4.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(ActionComponent readComponent(Map, int)): com/dmdirc/actions/CoreActionComponent$4.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(ActionComponent readComponent(Map, int)): com/dmdirc/actions/CoreActionComponent$5.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(ActionComponent readComponent(Map, int)): com/dmdirc/actions/CoreActionComponent$5.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(ActionComponent readComponent(Map, int)): com/dmdirc/actions/CoreActionComponent$6.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(ActionComponent readComponent(Map, int)): com/dmdirc/actions/CoreActionComponent$6.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(ActionComponent readComponent(Map, int)): com/dmdirc/actions/CoreActionComponent$7.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(ActionComponent readComponent(Map, int)): com/dmdirc/actions/CoreActionComponent$7.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(ActionComponent readComponent(Map, int)): com/dmdirc/actions/CoreActionComponent$8.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(ActionComponent readComponent(Map, int)): com/dmdirc/actions/CoreActionComponent$8.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(ActionComponent readComponent(Map, int)): com/dmdirc/actions/CoreActionComponent$9.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(ActionComponent readComponent(Map, int)): com/dmdirc/actions/CoreActionComponent$9.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(ActionComponent readComponent(Map, int)): com/dmdirc/actions/CoreActionComponent.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(ActionComponent readComponent(Map, int)): com/dmdirc/actions/CoreActionComponent.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(ActionComponent readComponent(Map, int)): com/dmdirc/actions/CoreActionType.__Dispatch_Table.getType()Lcom/dmdirc/actions/interfaces/ActionMetaType;
    //#input(ActionComponent readComponent(Map, int)): com/dmdirc/actions/interfaces/ActionComponent.__Descendant_Table[others]
    //#input(ActionComponent readComponent(Map, int)): com/dmdirc/actions/interfaces/ActionComponent.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(ActionComponent readComponent(Map, int)): com/dmdirc/actions/interfaces/ActionComponent.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(ActionComponent readComponent(Map, int)): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/interfaces/ActionMetaType]
    //#input(ActionComponent readComponent(Map, int)): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/ActionEvents]
    //#input(ActionComponent readComponent(Map, int)): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/ChannelEvents]
    //#input(ActionComponent readComponent(Map, int)): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/ClientEvents]
    //#input(ActionComponent readComponent(Map, int)): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/PluginEvents]
    //#input(ActionComponent readComponent(Map, int)): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/QueryEvents]
    //#input(ActionComponent readComponent(Map, int)): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/ServerEvents]
    //#input(ActionComponent readComponent(Map, int)): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/addons/dcc/actions/DCCEvents]
    //#input(ActionComponent readComponent(Map, int)): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[others]
    //#input(ActionComponent readComponent(Map, int)): com/dmdirc/actions/interfaces/ActionMetaType.__Dispatch_Table.getArgTypes()[Ljava/lang/Class;
    //#input(ActionComponent readComponent(Map, int)): com/dmdirc/actions/interfaces/ActionType.__Descendant_Table[com/dmdirc/actions/CoreActionType]
    //#input(ActionComponent readComponent(Map, int)): com/dmdirc/actions/interfaces/ActionType.__Descendant_Table[com/dmdirc/actions/interfaces/ActionType]
    //#input(ActionComponent readComponent(Map, int)): com/dmdirc/actions/interfaces/ActionType.__Descendant_Table[com/dmdirc/addons/dcc/actions/DCCActions]
    //#input(ActionComponent readComponent(Map, int)): com/dmdirc/actions/interfaces/ActionType.__Descendant_Table[others]
    //#input(ActionComponent readComponent(Map, int)): com/dmdirc/actions/interfaces/ActionType.__Dispatch_Table.getType()Lcom/dmdirc/actions/interfaces/ActionMetaType;
    //#input(ActionComponent readComponent(Map, int)): com/dmdirc/actions/metatypes/ActionEvents.__Dispatch_Table.getArgTypes()[Ljava/lang/Class;
    //#input(ActionComponent readComponent(Map, int)): com/dmdirc/actions/metatypes/ChannelEvents.__Dispatch_Table.getArgTypes()[Ljava/lang/Class;
    //#input(ActionComponent readComponent(Map, int)): com/dmdirc/actions/metatypes/ClientEvents.__Dispatch_Table.getArgTypes()[Ljava/lang/Class;
    //#input(ActionComponent readComponent(Map, int)): com/dmdirc/actions/metatypes/PluginEvents.__Dispatch_Table.getArgTypes()[Ljava/lang/Class;
    //#input(ActionComponent readComponent(Map, int)): com/dmdirc/actions/metatypes/QueryEvents.__Dispatch_Table.getArgTypes()[Ljava/lang/Class;
    //#input(ActionComponent readComponent(Map, int)): com/dmdirc/actions/metatypes/ServerEvents.__Dispatch_Table.getArgTypes()[Ljava/lang/Class;
    //#input(ActionComponent readComponent(Map, int)): com/dmdirc/addons/dcc/actions/DCCActions.__Dispatch_Table.getType()Lcom/dmdirc/actions/interfaces/ActionMetaType;
    //#input(ActionComponent readComponent(Map, int)): com/dmdirc/addons/dcc/actions/DCCEvents.__Dispatch_Table.getArgTypes()[Ljava/lang/Class;
    //#input(ActionComponent readComponent(Map, int)): data
    //#input(ActionComponent readComponent(Map, int)): this
    //#input(ActionComponent readComponent(Map, int)): this.group
    //#input(ActionComponent readComponent(Map, int)): this.group._tainted
    //#input(ActionComponent readComponent(Map, int)): this.name
    //#input(ActionComponent readComponent(Map, int)): this.name._tainted
    //#input(ActionComponent readComponent(Map, int)): this.triggers
    //#input(ActionComponent readComponent(Map, int)): this.triggers.length
    //#input(ActionComponent readComponent(Map, int)): this.triggers[0]
    //#input(ActionComponent readComponent(Map, int)): this.triggers[0].__Tag
    //#input(ActionComponent readComponent(Map, int)): this.triggers[0].type
    //#input(ActionComponent readComponent(Map, int)): this.triggers[0].type.__Tag
    //#output(ActionComponent readComponent(Map, int)): new ActionComponentChain(readComponent#1) num objects
    //#output(ActionComponent readComponent(Map, int)): new ActionComponentChain(readComponent#1).__Tag
    //#output(ActionComponent readComponent(Map, int)): new ActionComponentChain(readComponent#1).components
    //#output(ActionComponent readComponent(Map, int)): new ArrayList(ActionComponentChain#1) num objects
    //#output(ActionComponent readComponent(Map, int)): return_value
    //#new obj(ActionComponent readComponent(Map, int)): new ActionComponentChain(readComponent#1)
    //#new obj(ActionComponent readComponent(Map, int)): new ArrayList(ActionComponentChain#1)
    //#pre[2] (ActionComponent readComponent(Map, int)): data != null
    //#pre[1] (ActionComponent readComponent(Map, int)): (soft) arg >= 0
    //#pre[4] (ActionComponent readComponent(Map, int)): (soft) init'ed(this.group)
    //#pre[6] (ActionComponent readComponent(Map, int)): (soft) init'ed(this.name)
    //#pre[8] (ActionComponent readComponent(Map, int)): (soft) this.triggers != null
    //#pre[9] (ActionComponent readComponent(Map, int)): (soft) this.triggers.length >= 1
    //#pre[10] (ActionComponent readComponent(Map, int)): (soft) this.triggers[0] != null
    //#pre[11] (ActionComponent readComponent(Map, int)): (soft) this.triggers[0].__Tag in {com/dmdirc/actions/CoreActionType, com/dmdirc/actions/interfaces/ActionType, com/dmdirc/addons/dcc/actions/DCCActions}
    //#pre[12] (ActionComponent readComponent(Map, int)): (soft) this.triggers[0].type != null
    //#pre[13] (ActionComponent readComponent(Map, int)): (soft) this.triggers[0].type != null
    //#pre[14] (ActionComponent readComponent(Map, int)): (soft) this.triggers[0].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[15] (ActionComponent readComponent(Map, int)): (soft) this.triggers[0].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(ActionComponent readComponent(Map, int)): appliesTo(...)@467 != null
    //#presumption(ActionComponent readComponent(Map, int)): getArgTypes(...).length@454 >= 1
    //#presumption(ActionComponent readComponent(Map, int)): arg < getArgTypes(...).length@454
    //#presumption(ActionComponent readComponent(Map, int)): getArgTypes(...).length@467 >= 1
    //#presumption(ActionComponent readComponent(Map, int)): arg < getArgTypes(...).length@467
    //#presumption(ActionComponent readComponent(Map, int)): getArgTypes(...)@454 != null
    //#presumption(ActionComponent readComponent(Map, int)): getArgTypes(...)@467 != null
    //#presumption(ActionComponent readComponent(Map, int)): getType(...)@454 != getType(...)
    //#presumption(ActionComponent readComponent(Map, int)): getType(...)@467 != getType(...)
    //#presumption(ActionComponent readComponent(Map, int)): java.util.Map:get(...)@447 != null
    //#post(ActionComponent readComponent(Map, int)): init'ed(return_value)
    //#post(ActionComponent readComponent(Map, int)): new ActionComponentChain(readComponent#1) num objects <= 1
    //#post(ActionComponent readComponent(Map, int)): possibly_updated(new ActionComponentChain(readComponent#1).__Tag)
    //#post(ActionComponent readComponent(Map, int)): possibly_updated(new ActionComponentChain(readComponent#1).components)
    //#post(ActionComponent readComponent(Map, int)): new ArrayList(ActionComponentChain#1) num objects <= 1
    //#unanalyzed(ActionComponent readComponent(Map, int)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(ActionComponent readComponent(Map, int)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(ActionComponent readComponent(Map, int)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(ActionComponent readComponent(Map, int)): Effects-of-calling:com.dmdirc.logger.Logger:userError
    //#unanalyzed(ActionComponent readComponent(Map, int)): Effects-of-calling:com.dmdirc.logger.Logger:assertTrue
    //#unanalyzed(ActionComponent readComponent(Map, int)): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(ActionComponent readComponent(Map, int)): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(ActionComponent readComponent(Map, int)): Effects-of-calling:java.lang.String:isEmpty
    //#unanalyzed(ActionComponent readComponent(Map, int)): Effects-of-calling:java.util.List:iterator
    //#unanalyzed(ActionComponent readComponent(Map, int)): Effects-of-calling:java.lang.String:equals
    //#unanalyzed(ActionComponent readComponent(Map, int)): Effects-of-calling:java.lang.Enum:name
    //#unanalyzed(ActionComponent readComponent(Map, int)): Effects-of-calling:getActionComponent
    //#unanalyzed(ActionComponent readComponent(Map, int)): Effects-of-calling:appliesTo
    //#unanalyzed(ActionComponent readComponent(Map, int)): Effects-of-calling:getType
    //#unanalyzed(ActionComponent readComponent(Map, int)): Effects-of-calling:java.util.ArrayList
    //#unanalyzed(ActionComponent readComponent(Map, int)): Effects-of-calling:java.lang.String:split
    //#unanalyzed(ActionComponent readComponent(Map, int)): Effects-of-calling:java.util.List:add
    //#unanalyzed(ActionComponent readComponent(Map, int)): Effects-of-calling:java.lang.Class:getName
    //#unanalyzed(ActionComponent readComponent(Map, int)): Effects-of-calling:java.lang.IllegalArgumentException
    //#test_vector(ActionComponent readComponent(Map, int)): java.lang.Object:equals(...)@467: {1}, {0}
    //#test_vector(ActionComponent readComponent(Map, int)): java.lang.String:indexOf(...)@450: {-2_147_483_648..-2, 0..4_294_967_295}, {-1}
        ActionComponent component;

        if (componentName.indexOf('.') == -1) {
            component = ActionManager.getActionComponent(componentName);
        } else {
            try {
                component = new ActionComponentChain(triggers[0].getType().getArgTypes()[arg],
    //#Action.java:454: Warning: call too complex - analysis skipped
    //#    call on Class[] getArgTypes()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.Action
    //#    method: ActionComponent readComponent(Map, int)
    //#    unanalyzed callee: Class[] getArgTypes()
                        componentName);
            } catch (IllegalArgumentException iae) {
                error(iae.getMessage());
                return null;
            }
        }

        if (component == null) {
            error("Unknown component: " + componentName);
            return null;
        }

        if (!component.appliesTo().equals(triggers[0].getType().getArgTypes()[arg])) {
    //#Action.java:467: ?use of default init
    //#    init'ed(component.__Tag)
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.actions.Action
    //#    method: ActionComponent readComponent(Map, int)
    //#    basic block: bb_8
    //#    assertion: init'ed(component.__Tag)
    //#    VN: component.__Tag
    //#    Expected: {-Inf..+Inf}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Bad only invalid
    //#Action.java:467: ?null dereference
    //#    com/dmdirc/actions/interfaces/ActionComponent.__Descendant_Table[component.__Tag] != null
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.actions.Action
    //#    method: ActionComponent readComponent(Map, int)
    //#    basic block: bb_8
    //#    assertion: com/dmdirc/actions/interfaces/ActionComponent.__Descendant_Table[component.__Tag] != null
    //#    VN: com/dmdirc/actions/interfaces/ActionComponent.__Descendant_Table[component.__Tag]
    //#    Expected: Inverse{null}
    //#    Bad: Addr_Set{null, Invalid}
    //#    Attribs:  Ptr  null in Bad
    //#Action.java:467: Warning: call too complex - analysis skipped
    //#    call on Class appliesTo()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.Action
    //#    method: ActionComponent readComponent(Map, int)
    //#    unanalyzed callee: Class appliesTo()
    //#Action.java:467: Warning: call too complex - analysis skipped
    //#    call on Class[] getArgTypes()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.Action
    //#    method: ActionComponent readComponent(Map, int)
    //#    unanalyzed callee: Class[] getArgTypes()
            error("Component cannot be applied to specified arg in condition: " + componentName);
            return null;
        }

        return component;
    //#Action.java:472: end of method: ActionComponent com.dmdirc.actions.Action.readComponent(Map, int)
    }

    /**
     * Raises a trivial error, informing the user of the problem.
     *
     * @param message The message to be raised
     */
    private void error(final String message) {
        Logger.userError(ErrorLevel.LOW, "Error when parsing action: "
    //#Action.java:481: method: void com.dmdirc.actions.Action.error(String)
    //#Action.java:481: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.logger.Logger:userError(ErrorLevel, String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.Action
    //#    method: void error(String)
    //#    unanalyzed callee: void com.dmdirc.logger.Logger:userError(ErrorLevel, String)
    //#input(void error(String)): "."._tainted
    //#input(void error(String)): ": "._tainted
    //#input(void error(String)): "Error when parsing action: "._tainted
    //#input(void error(String)): com.dmdirc.logger.ErrorLevel.LOW
    //#input(void error(String)): message
    //#input(void error(String)): message._tainted
    //#input(void error(String)): this
    //#input(void error(String)): this.group
    //#input(void error(String)): this.group._tainted
    //#input(void error(String)): this.name
    //#input(void error(String)): this.name._tainted
    //#pre[5] (void error(String)): init'ed(this.group)
    //#pre[8] (void error(String)): init'ed(this.name)
    //#presumption(void error(String)): init'ed(com.dmdirc.logger.ErrorLevel.LOW)
                + group + "/" + name + ": " + message);
    }
    //#Action.java:483: end of method: void com.dmdirc.actions.Action.error(String)

    /** {@inheritDoc} */
    @Override
    public void setName(final String newName) {
        super.setName(newName);
    //#Action.java:488: method: void com.dmdirc.actions.Action.setName(String)
    //#input(void setName(String)): ".DMDirc"._tainted
    //#input(void setName(String)): "DMDirc"._tainted
    //#input(void setName(String)): "Library"._tainted
    //#input(void setName(String)): "Preferences"._tainted
    //#input(void setName(String)): "actions"._tainted
    //#input(void setName(String)): __Descendant_Table[com/dmdirc/actions/Action]
    //#input(void setName(String)): __Descendant_Table[others]
    //#input(void setName(String)): __Dispatch_Table.save()V
    //#input(void setName(String)): com/dmdirc/Main.configdir
    //#input(void setName(String)): com/dmdirc/Main.configdir._tainted
    //#input(void setName(String)): java.io.File.separator
    //#input(void setName(String)): java.io.File.separator._tainted
    //#input(void setName(String)): newName
    //#input(void setName(String)): newName._tainted
    //#input(void setName(String)): this
    //#input(void setName(String)): this.__Tag
    //#input(void setName(String)): this.group
    //#input(void setName(String)): this.group._tainted
    //#input(void setName(String)): this.location
    //#output(void setName(String)): com/dmdirc/Main.configdir
    //#output(void setName(String)): java.lang.StringBuilder:toString(...)._tainted
    //#output(void setName(String)): this.location
    //#output(void setName(String)): this.modified
    //#output(void setName(String)): this.name
    //#new obj(void setName(String)): java.lang.StringBuilder:toString(...)
    //#pre[6] (void setName(String)): init'ed(com/dmdirc/Main.configdir)
    //#pre[7] (void setName(String)): init'ed(this.location)
    //#pre[9] (void setName(String)): this.__Tag == com/dmdirc/actions/Action
    //#pre[19] (void setName(String)): init'ed(this.group)
    //#presumption(void setName(String)): init'ed(java.io.File.separator)
    //#post(void setName(String)): com/dmdirc/Main.configdir == One-of{old com/dmdirc/Main.configdir, &java.lang.StringBuilder:toString(...)}
    //#post(void setName(String)): com/dmdirc/Main.configdir != null
    //#post(void setName(String)): init'ed(java.lang.StringBuilder:toString(...)._tainted)
    //#post(void setName(String)): java.lang.StringBuilder:toString(...)._tainted == 0
    //#post(void setName(String)): this.location == &java.lang.StringBuilder:toString(...)
    //#post(void setName(String)): this.modified == 1
    //#post(void setName(String)): this.name == newName
    //#post(void setName(String)): init'ed(this.name)
    //#unanalyzed(void setName(String)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void setName(String)): Effects-of-calling:getConfigDir
    //#unanalyzed(void setName(String)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void setName(String)): Effects-of-calling:java.lang.System:getProperty
    //#unanalyzed(void setName(String)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void setName(String)): Effects-of-calling:java.lang.String:startsWith
    //#unanalyzed(void setName(String)): Effects-of-calling:java.lang.System:getenv

        new File(location).delete();        
        location = ActionManager.getDirectory() + group + File.separator + newName;

        save();
    //#Action.java:493: Warning: call too complex - analysis skipped
    //#    call on void save()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.Action
    //#    method: void setName(String)
    //#    unanalyzed callee: void save()
    }
    //#Action.java:494: end of method: void com.dmdirc.actions.Action.setName(String)

    /** {@inheritDoc} */
    @Override
    public void setGroup(final String newGroup) {
        super.setGroup(newGroup);
    //#Action.java:499: method: void com.dmdirc.actions.Action.setGroup(String)
    //#input(void setGroup(String)): ".DMDirc"._tainted
    //#input(void setGroup(String)): "DMDirc"._tainted
    //#input(void setGroup(String)): "Library"._tainted
    //#input(void setGroup(String)): "Preferences"._tainted
    //#input(void setGroup(String)): "actions"._tainted
    //#input(void setGroup(String)): __Descendant_Table[com/dmdirc/actions/Action]
    //#input(void setGroup(String)): __Descendant_Table[others]
    //#input(void setGroup(String)): __Dispatch_Table.save()V
    //#input(void setGroup(String)): com/dmdirc/Main.configdir
    //#input(void setGroup(String)): com/dmdirc/Main.configdir._tainted
    //#input(void setGroup(String)): java.io.File.separator
    //#input(void setGroup(String)): java.io.File.separator._tainted
    //#input(void setGroup(String)): newGroup
    //#input(void setGroup(String)): newGroup._tainted
    //#input(void setGroup(String)): this
    //#input(void setGroup(String)): this.__Tag
    //#input(void setGroup(String)): this.group._tainted
    //#input(void setGroup(String)): this.location
    //#input(void setGroup(String)): this.name
    //#input(void setGroup(String)): this.name._tainted
    //#output(void setGroup(String)): com/dmdirc/Main.configdir
    //#output(void setGroup(String)): java.lang.StringBuilder:toString(...)._tainted
    //#output(void setGroup(String)): this.group
    //#output(void setGroup(String)): this.location
    //#output(void setGroup(String)): this.modified
    //#new obj(void setGroup(String)): java.lang.StringBuilder:toString(...)
    //#pre[6] (void setGroup(String)): init'ed(com/dmdirc/Main.configdir)
    //#pre[7] (void setGroup(String)): init'ed(this.location)
    //#pre[9] (void setGroup(String)): this.__Tag == com/dmdirc/actions/Action
    //#pre[20] (void setGroup(String)): init'ed(this.name)
    //#presumption(void setGroup(String)): init'ed(java.io.File.separator)
    //#post(void setGroup(String)): com/dmdirc/Main.configdir == One-of{old com/dmdirc/Main.configdir, &java.lang.StringBuilder:toString(...)}
    //#post(void setGroup(String)): com/dmdirc/Main.configdir != null
    //#post(void setGroup(String)): init'ed(java.lang.StringBuilder:toString(...)._tainted)
    //#post(void setGroup(String)): java.lang.StringBuilder:toString(...)._tainted == 0
    //#post(void setGroup(String)): this.group == newGroup
    //#post(void setGroup(String)): init'ed(this.group)
    //#post(void setGroup(String)): this.location == &java.lang.StringBuilder:toString(...)
    //#post(void setGroup(String)): this.modified == 1
    //#unanalyzed(void setGroup(String)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void setGroup(String)): Effects-of-calling:getConfigDir
    //#unanalyzed(void setGroup(String)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void setGroup(String)): Effects-of-calling:java.lang.System:getProperty
    //#unanalyzed(void setGroup(String)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void setGroup(String)): Effects-of-calling:java.lang.String:startsWith
    //#unanalyzed(void setGroup(String)): Effects-of-calling:java.lang.System:getenv

        new File(location).delete();

        final String dir = ActionManager.getDirectory() + group + File.separator;
        location = dir + name;

        new File(dir).mkdirs();        

        save();
    //#Action.java:508: Warning: call too complex - analysis skipped
    //#    call on void save()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.Action
    //#    method: void setGroup(String)
    //#    unanalyzed callee: void save()
    }
    //#Action.java:509: end of method: void com.dmdirc.actions.Action.setGroup(String)

    /**
     * Deletes this action.
     */
    public void delete() {
        ActionManager.processEvent(CoreActionType.ACTION_DELETED, null, getGroup(), getName());
    //#Action.java:515: method: void com.dmdirc.actions.Action.delete()
    //#Action.java:515: ?!precondition failure
    //#    com/dmdirc/actions/ActionManager.processEvent: (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}
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.actions.Action
    //#    method: void delete()
    //#    basic block: Entry_BB_1
    //#    assertion: (soft) undefined in {340_736, 341_760, 342_528, 343_040, 343_552, 344_064, 344_576, 362_496}
    //#    callee: void com/dmdirc/actions/ActionManager.processEvent(ActionType, StringBuffer, Object[])
    //#    callee assertion: (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}
    //#    callee file: ActionManager.java
    //#    callee precondition index: [29]
    //#    callee srcpos: 365
    //#    VN: undefined
    //#    Expected: {340_736, 341_760, 342_528, 343_040, 343_552, 344_064, 344_576, 362_496}
    //#    Bad: {0, Invalid}
    //#    Attribs:  Int  Bad singleton  Bad overlaps +/-1000  Soft  Bad < Exp
    //#input(void delete()): __Descendant_Table[com/dmdirc/actions/Action]
    //#input(void delete()): __Descendant_Table[others]
    //#input(void delete()): __Dispatch_Table.getGroup()Ljava/lang/String;
    //#input(void delete()): __Dispatch_Table.getName()Ljava/lang/String;
    //#input(void delete()): com.dmdirc.actions.CoreActionType__static_init.new CoreActionType(CoreActionType__static_init#73).__Tag
    //#input(void delete()): com.dmdirc.actions.CoreActionType__static_init.new CoreActionType(CoreActionType__static_init#73).type
    //#input(void delete()): com.dmdirc.actions.metatypes.ActionEvents__static_init.new ActionEvents(ActionEvents__static_init#4).__Tag
    //#input(void delete()): com/dmdirc/actions/ActionManager.killSwitch
    //#input(void delete()): com/dmdirc/actions/ActionManager.listeners
    //#input(void delete()): com/dmdirc/actions/CoreActionType.ACTION_DELETED
    //#input(void delete()): com/dmdirc/actions/CoreActionType.__Dispatch_Table.getType()Lcom/dmdirc/actions/interfaces/ActionMetaType;
    //#input(void delete()): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/interfaces/ActionMetaType]
    //#input(void delete()): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/ActionEvents]
    //#input(void delete()): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/ChannelEvents]
    //#input(void delete()): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/ClientEvents]
    //#input(void delete()): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/PluginEvents]
    //#input(void delete()): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/QueryEvents]
    //#input(void delete()): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/ServerEvents]
    //#input(void delete()): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/addons/dcc/actions/DCCEvents]
    //#input(void delete()): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[others]
    //#input(void delete()): com/dmdirc/actions/interfaces/ActionMetaType.__Dispatch_Table.getArity()I
    //#input(void delete()): com/dmdirc/actions/interfaces/ActionType.__Descendant_Table[com/dmdirc/actions/CoreActionType]
    //#input(void delete()): com/dmdirc/actions/interfaces/ActionType.__Descendant_Table[com/dmdirc/actions/interfaces/ActionType]
    //#input(void delete()): com/dmdirc/actions/interfaces/ActionType.__Descendant_Table[com/dmdirc/addons/dcc/actions/DCCActions]
    //#input(void delete()): com/dmdirc/actions/interfaces/ActionType.__Descendant_Table[others]
    //#input(void delete()): com/dmdirc/actions/interfaces/ActionType.__Dispatch_Table.getType()Lcom/dmdirc/actions/interfaces/ActionMetaType;
    //#input(void delete()): com/dmdirc/actions/metatypes/ActionEvents.__Dispatch_Table.getArity()I
    //#input(void delete()): com/dmdirc/actions/metatypes/ChannelEvents.__Dispatch_Table.getArity()I
    //#input(void delete()): com/dmdirc/actions/metatypes/ClientEvents.__Dispatch_Table.getArity()I
    //#input(void delete()): com/dmdirc/actions/metatypes/PluginEvents.__Dispatch_Table.getArity()I
    //#input(void delete()): com/dmdirc/actions/metatypes/QueryEvents.__Dispatch_Table.getArity()I
    //#input(void delete()): com/dmdirc/actions/metatypes/ServerEvents.__Dispatch_Table.getArity()I
    //#input(void delete()): com/dmdirc/addons/dcc/actions/DCCActions.__Dispatch_Table.getType()Lcom/dmdirc/actions/interfaces/ActionMetaType;
    //#input(void delete()): com/dmdirc/addons/dcc/actions/DCCEvents.__Dispatch_Table.getArity()I
    //#input(void delete()): this
    //#input(void delete()): this.__Tag
    //#input(void delete()): this.group
    //#input(void delete()): this.location
    //#input(void delete()): this.name
    //#output(void delete()): com/dmdirc/ServerManager.me
    //#output(void delete()): new ArrayList(ServerManager#1) num objects
    //#output(void delete()): new ServerManager(getServerManager#1) num objects
    //#output(void delete()): new ServerManager(getServerManager#1).__Tag
    //#output(void delete()): new ServerManager(getServerManager#1).servers
    //#new obj(void delete()): new ArrayList(ServerManager#1)
    //#new obj(void delete()): new ServerManager(getServerManager#1)
    //#pre[3] (void delete()): init'ed(com/dmdirc/actions/ActionManager.killSwitch)
    //#pre[6] (void delete()): this.__Tag == com/dmdirc/actions/Action
    //#pre[7] (void delete()): init'ed(this.group)
    //#pre[9] (void delete()): init'ed(this.location)
    //#pre[10] (void delete()): init'ed(this.name)
    //#pre[1] (void delete()): (soft) com.dmdirc.actions.CoreActionType__static_init.new CoreActionType(CoreActionType__static_init#73).type != null
    //#pre[4] (void delete()): (soft) init'ed(com/dmdirc/ServerManager.me)
    //#post(void delete()): com/dmdirc/ServerManager.me == old com/dmdirc/ServerManager.me
    //#post(void delete()): new ArrayList(ServerManager#1) num objects == undefined
    //#post(void delete()): new ArrayList(ServerManager#1) num objects == 0, if init'ed
    //#post(void delete()): new ServerManager(getServerManager#1) num objects == new ArrayList(ServerManager#1) num objects
    //#post(void delete()): new ServerManager(getServerManager#1).__Tag == new ArrayList(ServerManager#1) num objects
    //#post(void delete()): new ServerManager(getServerManager#1).servers == undefined
    //#post(void delete()): new ServerManager(getServerManager#1).servers == null
    //#unanalyzed(void delete()): Effects-of-calling:com.dmdirc.actions.ConditionTree$OPERATION:ordinal
    //#unanalyzed(void delete()): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void delete()): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void delete()): Effects-of-calling:com.dmdirc.logger.Logger:assertTrue
    //#unanalyzed(void delete()): Effects-of-calling:getType
    //#unanalyzed(void delete()): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(void delete()): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(void delete()): Effects-of-calling:com.dmdirc.util.MapList:containsKey
    //#unanalyzed(void delete()): Effects-of-calling:com.dmdirc.util.MapList:get
    //#unanalyzed(void delete()): Effects-of-calling:java.util.ArrayList
    //#unanalyzed(void delete()): Effects-of-calling:java.util.ArrayList:iterator
    //#unanalyzed(void delete()): Effects-of-calling:trigger
    //#unanalyzed(void delete()): Effects-of-calling:getArity
    //#unanalyzed(void delete()): Effects-of-calling:com.dmdirc.interfaces.ActionListener:processEvent
    //#unanalyzed(void delete()): Effects-of-calling:triggerActions
    //#unanalyzed(void delete()): Effects-of-calling:getArgTypes
    //#unanalyzed(void delete()): Effects-of-calling:java.util.Deque:pollFirst
    //#unanalyzed(void delete()): Effects-of-calling:java.lang.Character:instanceof
    //#unanalyzed(void delete()): Effects-of-calling:java.lang.Character:charValue
    //#unanalyzed(void delete()): Effects-of-calling:java.util.Deque:isEmpty
    //#unanalyzed(void delete()): Effects-of-calling:readTerm
    //#unanalyzed(void delete()): Effects-of-calling:java.util.ArrayDeque
    //#unanalyzed(void delete()): Effects-of-calling:java.util.Deque:pollLast
    //#unanalyzed(void delete()): Effects-of-calling:java.util.Deque:addFirst
    //#unanalyzed(void delete()): Effects-of-calling:parseStack
    //#unanalyzed(void delete()): Effects-of-calling:java.util.Deque:poll
    //#unanalyzed(void delete()): Effects-of-calling:java.util.Deque:add
    //#unanalyzed(void delete()): Effects-of-calling:java.util.Deque:size
    //#unanalyzed(void delete()): Effects-of-calling:java.lang.String:length
    //#unanalyzed(void delete()): Effects-of-calling:java.lang.String:charAt
    //#unanalyzed(void delete()): Effects-of-calling:java.lang.String:valueOf
    //#unanalyzed(void delete()): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void delete()): Effects-of-calling:java.lang.Integer:parseInt
    //#unanalyzed(void delete()): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(void delete()): Effects-of-calling:java.lang.Character:valueOf
    //#unanalyzed(void delete()): Effects-of-calling:java.lang.StringBuilder:length
    //#unanalyzed(void delete()): Effects-of-calling:java.util.List:size
    //#unanalyzed(void delete()): Effects-of-calling:java.util.List:iterator
    //#unanalyzed(void delete()): Effects-of-calling:com.dmdirc.config.IdentityManager:getGlobalConfig
    //#unanalyzed(void delete()): Effects-of-calling:com.dmdirc.config.ConfigManager:getOptions
    //#unanalyzed(void delete()): Effects-of-calling:java.lang.StringBuilder:indexOf
    //#unanalyzed(void delete()): Effects-of-calling:java.lang.StringBuilder:replace
    //#unanalyzed(void delete()): Effects-of-calling:java.util.Map:entrySet
    //#unanalyzed(void delete()): Effects-of-calling:java.util.Set:iterator
    //#unanalyzed(void delete()): Effects-of-calling:java.util.Map$Entry:getKey
    //#unanalyzed(void delete()): Effects-of-calling:java.util.Map$Entry:getValue
    //#unanalyzed(void delete()): Effects-of-calling:[Ljava.lang.String;:instanceof
    //#unanalyzed(void delete()): Effects-of-calling:java.lang.String:instanceof
    //#unanalyzed(void delete()): Effects-of-calling:java.lang.String:split
    //#unanalyzed(void delete()): Effects-of-calling:java.lang.StringBuffer
    //#unanalyzed(void delete()): Effects-of-calling:java.lang.StringBuffer:length
    //#unanalyzed(void delete()): Effects-of-calling:java.lang.StringBuffer:insert
    //#unanalyzed(void delete()): Effects-of-calling:java.lang.StringBuffer:toString
    //#unanalyzed(void delete()): Effects-of-calling:doServerSubstitutions
    //#unanalyzed(void delete()): Effects-of-calling:doComponentSubstitutions
    //#unanalyzed(void delete()): Effects-of-calling:getServer
    //#unanalyzed(void delete()): Effects-of-calling:getState
    //#unanalyzed(void delete()): Effects-of-calling:com.dmdirc.ServerState:equals
    //#unanalyzed(void delete()): Effects-of-calling:getCompatibleComponents
    //#unanalyzed(void delete()): Effects-of-calling:java.lang.Object:toString
    //#unanalyzed(void delete()): Effects-of-calling:get
    //#unanalyzed(void delete()): Effects-of-calling:test
    //#unanalyzed(void delete()): Effects-of-calling:evaluate
    //#unanalyzed(void delete()): Effects-of-calling:getUI
    //#unanalyzed(void delete()): Effects-of-calling:com.dmdirc.ui.interfaces.UIController:getActiveWindow
    //#unanalyzed(void delete()): Effects-of-calling:getFrame
    //#unanalyzed(void delete()): Effects-of-calling:com.dmdirc.ui.interfaces.InputWindow:instanceof
    //#unanalyzed(void delete()): Effects-of-calling:java.util.List:get
    //#unanalyzed(void delete()): Effects-of-calling:com.dmdirc.commandparser.parsers.GlobalCommandParser:getGlobalCommandParser
    //#unanalyzed(void delete()): Effects-of-calling:com.dmdirc.ui.interfaces.InputWindow:getCommandParser
    //#unanalyzed(void delete()): Effects-of-calling:com.dmdirc.commandparser.parsers.CommandParser:parseCommand
    //#unanalyzed(void delete()): Effects-of-calling:java.lang.StringBuffer:setLength
    //#unanalyzed(void delete()): Effects-of-calling:java.lang.StringBuffer:append
        new File(location).delete();
    }
    //#Action.java:517: end of method: void com.dmdirc.actions.Action.delete()

    /** {@inheritDoc} */
    @Override
    public String toString() {
        final String parent = super.toString();
    //#Action.java:522: method: String com.dmdirc.actions.Action.toString()
    //#input(String toString()): "']"._tainted
    //#input(String toString()): ", "._tainted
    //#input(String toString()): ", format='"._tainted
    //#input(String toString()): ", response="._tainted
    //#input(String toString()): ", triggers="._tainted
    //#input(String toString()): ",location="._tainted
    //#input(String toString()): "."._tainted
    //#input(String toString()): "[name="._tainted
    //#input(String toString()): "]"._tainted
    //#input(String toString()): this
    //#input(String toString()): this.conditions
    //#input(String toString()): this.conditions._tainted
    //#input(String toString()): this.group
    //#input(String toString()): this.group._tainted
    //#input(String toString()): this.location
    //#input(String toString()): this.location._tainted
    //#input(String toString()): this.name
    //#input(String toString()): this.name._tainted
    //#input(String toString()): this.newFormat
    //#input(String toString()): this.newFormat._tainted
    //#input(String toString()): this.response
    //#input(String toString()): this.triggers
    //#output(String toString()): java.lang.StringBuilder:toString(...)._tainted
    //#output(String toString()): return_value
    //#new obj(String toString()): java.lang.StringBuilder:toString(...)
    //#pre[2] (String toString()): init'ed(this.conditions)
    //#pre[5] (String toString()): init'ed(this.group)
    //#pre[8] (String toString()): init'ed(this.location)
    //#pre[10] (String toString()): init'ed(this.name)
    //#pre[12] (String toString()): init'ed(this.newFormat)
    //#pre[14] (String toString()): init'ed(this.response)
    //#pre[15] (String toString()): init'ed(this.triggers)
    //#post(String toString()): java.lang.StringBuilder:toString(...)._tainted == this.location._tainted | this.conditions._tainted | this.group._tainted | this.name._tainted | One-of{this.conditions._tainted | this.group._tainted | this.name._tainted, this.newFormat._tainted}
    //#post(String toString()): init'ed(java.lang.StringBuilder:toString(...)._tainted)
    //#post(String toString()): return_value == &java.lang.StringBuilder:toString(...)
    //#unanalyzed(String toString()): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(String toString()): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(String toString()): Effects-of-calling:java.util.Arrays:toString
    //#unanalyzed(String toString()): Effects-of-calling:java.lang.StringBuilder:toString

        return parent.substring(0, parent.length() - 1)
    //#Action.java:524: end of method: String com.dmdirc.actions.Action.toString()
                + ",location=" + location + "]";
    }

}
    //#Action.java:: end of class: com.dmdirc.actions.Action
