//# 7 errors, 2,453 messages
//#
/*
    //#Identity.java:1:1: class: com.dmdirc.config.Identity
 * 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.config;

import com.dmdirc.Main;
import com.dmdirc.interfaces.ConfigChangeListener;
import com.dmdirc.logger.ErrorLevel;
import com.dmdirc.logger.Logger;
import com.dmdirc.util.ConfigFile;
import com.dmdirc.util.InvalidConfigFileException;
import com.dmdirc.util.WeakList;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.logging.Level;

/**
 * An identity is a group of settings that are applied to a connection, server,
 * network or channel. Identities may be automatically applied in certain
 * cases, or the user may manually apply them.
 * <p>
 * Note: this class has a natural ordering that is inconsistent with equals.
 *
 * @author chris
 */
public class Identity extends ConfigSource implements Serializable,
    //#Identity.java:56: method: int com.dmdirc.config.Identity.compareTo(Object)
    //#input(int compareTo(Object)): __Descendant_Table[com/dmdirc/config/Identity]
    //#input(int compareTo(Object)): __Descendant_Table[others]
    //#input(int compareTo(Object)): __Dispatch_Table.compareTo(Lcom/dmdirc/config/Identity;)I
    //#input(int compareTo(Object)): __Dispatch_Table.getTarget()Lcom/dmdirc/config/ConfigTarget;
    //#input(int compareTo(Object)): com/dmdirc/config/ConfigTarget.__Descendant_Table[com/dmdirc/config/ConfigTarget]
    //#input(int compareTo(Object)): com/dmdirc/config/ConfigTarget.__Descendant_Table[others]
    //#input(int compareTo(Object)): com/dmdirc/config/ConfigTarget.__Dispatch_Table.compareTo(Ljava/lang/Object;)I
    //#input(int compareTo(Object)): com/dmdirc/config/ConfigTarget.__Dispatch_Table.getOrder()I
    //#input(int compareTo(Object)): com/dmdirc/config/ConfigTarget.__Dispatch_Table.getType()Lcom/dmdirc/config/ConfigTarget$TYPE;
    //#input(int compareTo(Object)): this
    //#input(int compareTo(Object)): this.__Tag
    //#input(int compareTo(Object)): this.myTarget
    //#input(int compareTo(Object)): this.myTarget.__Tag
    //#input(int compareTo(Object)): this.myTarget.order
    //#input(int compareTo(Object)): this.myTarget.type
    //#input(int compareTo(Object)): x0
    //#input(int compareTo(Object)): x0.__Tag
    //#input(int compareTo(Object)): x0.myTarget
    //#input(int compareTo(Object)): x0.myTarget.__Tag
    //#input(int compareTo(Object)): x0.myTarget.order
    //#input(int compareTo(Object)): x0.myTarget.type
    //#output(int compareTo(Object)): return_value
    //#pre[2] (int compareTo(Object)): this.__Tag == com/dmdirc/config/Identity
    //#pre[3] (int compareTo(Object)): this.myTarget != null
    //#pre[4] (int compareTo(Object)): this.myTarget.__Tag == com/dmdirc/config/ConfigTarget
    //#pre[7] (int compareTo(Object)): init'ed(this.myTarget.type)
    //#pre[8] (int compareTo(Object)): x0 != null
    //#pre[9] (int compareTo(Object)): x0.__Tag == com/dmdirc/config/Identity
    //#pre[10] (int compareTo(Object)): x0.myTarget != null
    //#pre[11] (int compareTo(Object)): x0.myTarget.__Tag == com/dmdirc/config/ConfigTarget
    //#pre[13] (int compareTo(Object)): x0.myTarget.type != null
    //#pre[5] (int compareTo(Object)): (soft) init'ed(this.myTarget.order)
    //#pre[6] (int compareTo(Object)): (soft) this.myTarget.order - x0.myTarget.order in {-2_147_483_648..4_294_967_295}
    //#pre[12] (int compareTo(Object)): (soft) init'ed(x0.myTarget.order)
    //#post(int compareTo(Object)): init'ed(return_value)
    //#unanalyzed(int compareTo(Object)): Effects-of-calling:com.dmdirc.config.ConfigTarget$TYPE:equals
    //#unanalyzed(int compareTo(Object)): Effects-of-calling:com.dmdirc.config.ConfigTarget$TYPE:compareTo
    //#Identity.java:56: end of method: int com.dmdirc.config.Identity.compareTo(Object)
        Comparable<Identity> {

    /**
     * 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 used for identity settings. */
    private static final String DOMAIN = "identity".intern();
    //#Identity.java:67: method: com.dmdirc.config.Identity.com.dmdirc.config.Identity__static_init
    //#output(com.dmdirc.config.Identity__static_init): DOMAIN
    //#output(com.dmdirc.config.Identity__static_init): LOGGER
    //#output(com.dmdirc.config.Identity__static_init): PROFILE_DOMAIN
    //#output(com.dmdirc.config.Identity__static_init): __Descendant_Table[com/dmdirc/config/Identity]
    //#output(com.dmdirc.config.Identity__static_init): __Dispatch_Table.addListener(Lcom/dmdirc/interfaces/ConfigChangeListener;)V
    //#output(com.dmdirc.config.Identity__static_init): __Dispatch_Table.compareTo(Lcom/dmdirc/config/Identity;)I
    //#output(com.dmdirc.config.Identity__static_init): __Dispatch_Table.compareTo(Ljava/lang/Object;)I
    //#output(com.dmdirc.config.Identity__static_init): __Dispatch_Table.delete()V
    //#output(com.dmdirc.config.Identity__static_init): __Dispatch_Table.equals(Ljava/lang/Object;)Z
    //#output(com.dmdirc.config.Identity__static_init): __Dispatch_Table.fireSettingChange(Ljava/lang/String;Ljava/lang/String;)V
    //#output(com.dmdirc.config.Identity__static_init): __Dispatch_Table.getDomains()Ljava/util/Set;
    //#output(com.dmdirc.config.Identity__static_init): __Dispatch_Table.getFile()Lcom/dmdirc/util/ConfigFile;
    //#output(com.dmdirc.config.Identity__static_init): __Dispatch_Table.getName()Ljava/lang/String;
    //#output(com.dmdirc.config.Identity__static_init): __Dispatch_Table.getOption(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
    //#output(com.dmdirc.config.Identity__static_init): __Dispatch_Table.getOptionBool(Ljava/lang/String;Ljava/lang/String;)Z
    //#output(com.dmdirc.config.Identity__static_init): __Dispatch_Table.getOptionChar(Ljava/lang/String;Ljava/lang/String;)C
    //#output(com.dmdirc.config.Identity__static_init): __Dispatch_Table.getOptionColour(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;)Ljava/awt/Color;
    //#output(com.dmdirc.config.Identity__static_init): __Dispatch_Table.getOptionInt(Ljava/lang/String;Ljava/lang/String;)I
    //#output(com.dmdirc.config.Identity__static_init): __Dispatch_Table.getOptionList(Ljava/lang/String;Ljava/lang/String;)Ljava/util/List;
    //#output(com.dmdirc.config.Identity__static_init): __Dispatch_Table.getOptionList(Ljava/lang/String;Ljava/lang/String;Z)Ljava/util/List;
    //#output(com.dmdirc.config.Identity__static_init): __Dispatch_Table.getOptions(Ljava/lang/String;)Ljava/util/Map;
    //#output(com.dmdirc.config.Identity__static_init): __Dispatch_Table.getTarget()Lcom/dmdirc/config/ConfigTarget;
    //#output(com.dmdirc.config.Identity__static_init): __Dispatch_Table.getTarget(Z)Lcom/dmdirc/config/ConfigTarget;
    //#output(com.dmdirc.config.Identity__static_init): __Dispatch_Table.hasOption(Ljava/lang/String;Ljava/lang/String;)Z
    //#output(com.dmdirc.config.Identity__static_init): __Dispatch_Table.hasOptionChar(Ljava/lang/String;Ljava/lang/String;)Z
    //#output(com.dmdirc.config.Identity__static_init): __Dispatch_Table.hasOptionColour(Ljava/lang/String;Ljava/lang/String;)Z
    //#output(com.dmdirc.config.Identity__static_init): __Dispatch_Table.hasOptionInt(Ljava/lang/String;Ljava/lang/String;)Z
    //#output(com.dmdirc.config.Identity__static_init): __Dispatch_Table.hasOptionString(Ljava/lang/String;Ljava/lang/String;)Z
    //#output(com.dmdirc.config.Identity__static_init): __Dispatch_Table.hashCode()I
    //#output(com.dmdirc.config.Identity__static_init): __Dispatch_Table.initFile(ZLjava/io/InputStream;)V
    //#output(com.dmdirc.config.Identity__static_init): __Dispatch_Table.isProfile()Z
    //#output(com.dmdirc.config.Identity__static_init): __Dispatch_Table.migrateProfile()V
    //#output(com.dmdirc.config.Identity__static_init): __Dispatch_Table.reload()V
    //#output(com.dmdirc.config.Identity__static_init): __Dispatch_Table.removeListener(Lcom/dmdirc/interfaces/ConfigChangeListener;)V
    //#output(com.dmdirc.config.Identity__static_init): __Dispatch_Table.save()V
    //#output(com.dmdirc.config.Identity__static_init): __Dispatch_Table.setOption(Ljava/lang/String;Ljava/lang/String;I)V
    //#output(com.dmdirc.config.Identity__static_init): __Dispatch_Table.setOption(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
    //#output(com.dmdirc.config.Identity__static_init): __Dispatch_Table.setOption(Ljava/lang/String;Ljava/lang/String;Ljava/util/List;)V
    //#output(com.dmdirc.config.Identity__static_init): __Dispatch_Table.setOption(Ljava/lang/String;Ljava/lang/String;Z)V
    //#output(com.dmdirc.config.Identity__static_init): __Dispatch_Table.toString()Ljava/lang/String;
    //#output(com.dmdirc.config.Identity__static_init): __Dispatch_Table.unsetOption(Ljava/lang/String;Ljava/lang/String;)V
    //#output(com.dmdirc.config.Identity__static_init): com/dmdirc/config/ConfigSource.__Descendant_Table[com/dmdirc/config/Identity]
    //#post(com.dmdirc.config.Identity__static_init): DOMAIN != null
    //#post(com.dmdirc.config.Identity__static_init): init'ed(LOGGER)
    //#post(com.dmdirc.config.Identity__static_init): PROFILE_DOMAIN != null
    //#post(com.dmdirc.config.Identity__static_init): __Descendant_Table[com/dmdirc/config/Identity] == &__Dispatch_Table
    //#post(com.dmdirc.config.Identity__static_init): com/dmdirc/config/ConfigSource.__Descendant_Table[com/dmdirc/config/Identity] == &__Dispatch_Table
    //#post(com.dmdirc.config.Identity__static_init): __Dispatch_Table.addListener(Lcom/dmdirc/interfaces/ConfigChangeListener;)V == &addListener
    //#post(com.dmdirc.config.Identity__static_init): __Dispatch_Table.compareTo(Lcom/dmdirc/config/Identity;)I == &compareTo
    //#post(com.dmdirc.config.Identity__static_init): __Dispatch_Table.compareTo(Ljava/lang/Object;)I == &compareTo
    //#post(com.dmdirc.config.Identity__static_init): __Dispatch_Table.delete()V == &delete
    //#post(com.dmdirc.config.Identity__static_init): __Dispatch_Table.equals(Ljava/lang/Object;)Z == &equals
    //#post(com.dmdirc.config.Identity__static_init): __Dispatch_Table.fireSettingChange(Ljava/lang/String;Ljava/lang/String;)V == &fireSettingChange
    //#post(com.dmdirc.config.Identity__static_init): __Dispatch_Table.getDomains()Ljava/util/Set; == &getDomains
    //#post(com.dmdirc.config.Identity__static_init): __Dispatch_Table.getFile()Lcom/dmdirc/util/ConfigFile; == &getFile
    //#post(com.dmdirc.config.Identity__static_init): __Dispatch_Table.getName()Ljava/lang/String; == &getName
    //#post(com.dmdirc.config.Identity__static_init): __Dispatch_Table.getOption(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; == &getOption
    //#post(com.dmdirc.config.Identity__static_init): __Dispatch_Table.getOptionBool(Ljava/lang/String;Ljava/lang/String;)Z == &com/dmdirc/config/ConfigSource.getOptionBool
    //#post(com.dmdirc.config.Identity__static_init): __Dispatch_Table.getOptionChar(Ljava/lang/String;Ljava/lang/String;)C == &com/dmdirc/config/ConfigSource.getOptionChar
    //#post(com.dmdirc.config.Identity__static_init): __Dispatch_Table.getOptionColour(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;)Ljava/awt/Color; == &com/dmdirc/config/ConfigSource.getOptionColour
    //#post(com.dmdirc.config.Identity__static_init): __Dispatch_Table.getOptionInt(Ljava/lang/String;Ljava/lang/String;)I == &com/dmdirc/config/ConfigSource.getOptionInt
    //#post(com.dmdirc.config.Identity__static_init): __Dispatch_Table.getOptionList(Ljava/lang/String;Ljava/lang/String;)Ljava/util/List; == &com/dmdirc/config/ConfigSource.getOptionList
    //#post(com.dmdirc.config.Identity__static_init): __Dispatch_Table.getOptionList(Ljava/lang/String;Ljava/lang/String;Z)Ljava/util/List; == &com/dmdirc/config/ConfigSource.getOptionList
    //#post(com.dmdirc.config.Identity__static_init): __Dispatch_Table.getOptions(Ljava/lang/String;)Ljava/util/Map; == &getOptions
    //#post(com.dmdirc.config.Identity__static_init): __Dispatch_Table.getTarget()Lcom/dmdirc/config/ConfigTarget; == &getTarget
    //#post(com.dmdirc.config.Identity__static_init): __Dispatch_Table.getTarget(Z)Lcom/dmdirc/config/ConfigTarget; == &getTarget
    //#post(com.dmdirc.config.Identity__static_init): __Dispatch_Table.hasOption(Ljava/lang/String;Ljava/lang/String;)Z == &hasOption
    //#post(com.dmdirc.config.Identity__static_init): __Dispatch_Table.hasOptionChar(Ljava/lang/String;Ljava/lang/String;)Z == &com/dmdirc/config/ConfigSource.hasOptionChar
    //#post(com.dmdirc.config.Identity__static_init): __Dispatch_Table.hasOptionColour(Ljava/lang/String;Ljava/lang/String;)Z == &com/dmdirc/config/ConfigSource.hasOptionColour
    //#post(com.dmdirc.config.Identity__static_init): __Dispatch_Table.hasOptionInt(Ljava/lang/String;Ljava/lang/String;)Z == &com/dmdirc/config/ConfigSource.hasOptionInt
    //#post(com.dmdirc.config.Identity__static_init): __Dispatch_Table.hasOptionString(Ljava/lang/String;Ljava/lang/String;)Z == &com/dmdirc/config/ConfigSource.hasOptionString
    //#post(com.dmdirc.config.Identity__static_init): __Dispatch_Table.hashCode()I == &hashCode
    //#post(com.dmdirc.config.Identity__static_init): __Dispatch_Table.initFile(ZLjava/io/InputStream;)V == &initFile
    //#post(com.dmdirc.config.Identity__static_init): __Dispatch_Table.isProfile()Z == &isProfile
    //#post(com.dmdirc.config.Identity__static_init): __Dispatch_Table.migrateProfile()V == &migrateProfile
    //#post(com.dmdirc.config.Identity__static_init): __Dispatch_Table.reload()V == &reload
    //#post(com.dmdirc.config.Identity__static_init): __Dispatch_Table.removeListener(Lcom/dmdirc/interfaces/ConfigChangeListener;)V == &removeListener
    //#post(com.dmdirc.config.Identity__static_init): __Dispatch_Table.save()V == &save
    //#post(com.dmdirc.config.Identity__static_init): __Dispatch_Table.setOption(Ljava/lang/String;Ljava/lang/String;I)V == &setOption
    //#post(com.dmdirc.config.Identity__static_init): __Dispatch_Table.setOption(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V == &setOption
    //#post(com.dmdirc.config.Identity__static_init): __Dispatch_Table.setOption(Ljava/lang/String;Ljava/lang/String;Ljava/util/List;)V == &setOption
    //#post(com.dmdirc.config.Identity__static_init): __Dispatch_Table.setOption(Ljava/lang/String;Ljava/lang/String;Z)V == &setOption
    //#post(com.dmdirc.config.Identity__static_init): __Dispatch_Table.toString()Ljava/lang/String; == &toString
    //#post(com.dmdirc.config.Identity__static_init): __Dispatch_Table.unsetOption(Ljava/lang/String;Ljava/lang/String;)V == &unsetOption

    /** The domain used for profile settings. */
    private static final String PROFILE_DOMAIN = "profile".intern();

    /** A regular expression that will match all characters illegal in file names. */
    protected static final String ILLEGAL_CHARS = "[\\\\\"/:\\*\\?\"<>\\|]";

    /** A logger for this class. */
    private static final java.util.logging.Logger LOGGER = java.util.logging
    //#Identity.java:76: end of method: com.dmdirc.config.Identity.com.dmdirc.config.Identity__static_init
            .Logger.getLogger(Identity.class.getName());

    /** The target for this identity. */
    protected final ConfigTarget myTarget;

    /** The configuration details for this identity. */
    protected final ConfigFile file;

    /** The global config manager. */
    protected ConfigManager globalConfig;

    /** The config change listeners for this source. */
    protected final List<ConfigChangeListener> listeners
    //#Identity.java:89: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.util.WeakList()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.config.Identity
    //#    method: void com.dmdirc.config.Identity(File, bool)
    //#    unanalyzed callee: void com.dmdirc.util.WeakList()
    //#Identity.java:89: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.util.WeakList()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.config.Identity
    //#    method: void com.dmdirc.config.Identity(InputStream, bool)
    //#    unanalyzed callee: void com.dmdirc.util.WeakList()
    //#Identity.java:89: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.util.WeakList()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.config.Identity
    //#    method: void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)
    //#    unanalyzed callee: void com.dmdirc.util.WeakList()
            = new WeakList<ConfigChangeListener>();

    /** Whether this identity needs to be saved. */
    protected boolean needSave;

    /**
     * Creates a new instance of Identity.
     *
     * @param file The file to load this identity from
     * @param forceDefault Whether to force this identity to be loaded as default
     * identity or not
     * @throws InvalidIdentityFileException Missing required properties
     * @throws IOException Input/output exception
     */
    public Identity(final File file, final boolean forceDefault) throws IOException,
            InvalidIdentityFileException {
        super();
    //#Identity.java:106: method: void com.dmdirc.config.Identity.com.dmdirc.config.Identity(File, bool)
    //#input(void com.dmdirc.config.Identity(File, bool)): " to "._tainted
    //#input(void com.dmdirc.config.Identity(File, bool)): ""._tainted
    //#input(void com.dmdirc.config.Identity(File, bool)): "&#10;"._tainted
    //#input(void com.dmdirc.config.Identity(File, bool)): "."._tainted
    //#input(void com.dmdirc.config.Identity(File, bool)): ": setting "._tainted
    //#input(void com.dmdirc.config.Identity(File, bool)): "<Unknown>"._tainted
    //#input(void com.dmdirc.config.Identity(File, bool)): "@"._tainted
    //#input(void com.dmdirc.config.Identity(File, bool)): "Config option not found: "._tainted
    //#input(void com.dmdirc.config.Identity(File, bool)): "Unnamed"._tainted
    //#input(void com.dmdirc.config.Identity(File, bool)): "nicknames"._tainted
    //#input(void com.dmdirc.config.Identity(File, bool)): "order"._tainted
    //#input(void com.dmdirc.config.Identity(File, bool)): DOMAIN
    //#input(void com.dmdirc.config.Identity(File, bool)): LOGGER
    //#input(void com.dmdirc.config.Identity(File, bool)): PROFILE_DOMAIN
    //#input(void com.dmdirc.config.Identity(File, bool)): __Descendant_Table[com/dmdirc/config/Identity]
    //#input(void com.dmdirc.config.Identity(File, bool)): __Descendant_Table[others]
    //#input(void com.dmdirc.config.Identity(File, bool)): __Dispatch_Table.addListener(Lcom/dmdirc/interfaces/ConfigChangeListener;)V
    //#input(void com.dmdirc.config.Identity(File, bool)): __Dispatch_Table.equals(Ljava/lang/Object;)Z
    //#input(void com.dmdirc.config.Identity(File, bool)): __Dispatch_Table.getDomains()Ljava/util/Set;
    //#input(void com.dmdirc.config.Identity(File, bool)): __Dispatch_Table.getName()Ljava/lang/String;
    //#input(void com.dmdirc.config.Identity(File, bool)): __Dispatch_Table.getOption(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
    //#input(void com.dmdirc.config.Identity(File, bool)): __Dispatch_Table.getOptionInt(Ljava/lang/String;Ljava/lang/String;)I
    //#input(void com.dmdirc.config.Identity(File, bool)): __Dispatch_Table.getOptions(Ljava/lang/String;)Ljava/util/Map;
    //#input(void com.dmdirc.config.Identity(File, bool)): __Dispatch_Table.getTarget()Lcom/dmdirc/config/ConfigTarget;
    //#input(void com.dmdirc.config.Identity(File, bool)): __Dispatch_Table.hasOption(Ljava/lang/String;Ljava/lang/String;)Z
    //#input(void com.dmdirc.config.Identity(File, bool)): __Dispatch_Table.isProfile()Z
    //#input(void com.dmdirc.config.Identity(File, bool)): __Dispatch_Table.migrateProfile()V
    //#input(void com.dmdirc.config.Identity(File, bool)): __Dispatch_Table.removeListener(Lcom/dmdirc/interfaces/ConfigChangeListener;)V
    //#input(void com.dmdirc.config.Identity(File, bool)): __Dispatch_Table.setOption(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
    //#input(void com.dmdirc.config.Identity(File, bool)): __Dispatch_Table.unsetOption(Ljava/lang/String;Ljava/lang/String;)V
    //#input(void com.dmdirc.config.Identity(File, bool)): com.dmdirc.config.ConfigManager$1__static_init.new int[](ConfigManager$1__static_init#1).length
    //#input(void com.dmdirc.config.Identity(File, bool)): com/dmdirc/config/ConfigManager$1.$SwitchMap$com$dmdirc$config$ConfigTarget$TYPE
    //#input(void com.dmdirc.config.Identity(File, bool)): com/dmdirc/config/ConfigManager.__Descendant_Table[com/dmdirc/config/ConfigManager]
    //#input(void com.dmdirc.config.Identity(File, bool)): com/dmdirc/config/ConfigManager.__Descendant_Table[others]
    //#input(void com.dmdirc.config.Identity(File, bool)): com/dmdirc/config/ConfigManager.__Dispatch_Table.configChanged(Ljava/lang/String;Ljava/lang/String;)V
    //#input(void com.dmdirc.config.Identity(File, bool)): com/dmdirc/config/ConfigManager.__Dispatch_Table.getOption(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
    //#input(void com.dmdirc.config.Identity(File, bool)): com/dmdirc/config/ConfigManager.__Dispatch_Table.getScope(Ljava/lang/String;Ljava/lang/String;)Lcom/dmdirc/config/Identity;
    //#input(void com.dmdirc.config.Identity(File, bool)): com/dmdirc/config/ConfigManager.__Dispatch_Table.hasOption(Ljava/lang/String;Ljava/lang/String;)Z
    //#input(void com.dmdirc.config.Identity(File, bool)): com/dmdirc/config/ConfigManager.__Dispatch_Table.identityApplies(Lcom/dmdirc/config/Identity;)Z
    //#input(void com.dmdirc.config.Identity(File, bool)): com/dmdirc/config/ConfigManager.__Dispatch_Table.removeIdentity(Lcom/dmdirc/config/Identity;)V
    //#input(void com.dmdirc.config.Identity(File, bool)): com/dmdirc/config/ConfigManager.stats
    //#input(void com.dmdirc.config.Identity(File, bool)): com/dmdirc/config/ConfigSource.__Descendant_Table[com/dmdirc/config/ConfigManager]
    //#input(void com.dmdirc.config.Identity(File, bool)): com/dmdirc/config/ConfigSource.__Descendant_Table[com/dmdirc/config/ConfigSource]
    //#input(void com.dmdirc.config.Identity(File, bool)): com/dmdirc/config/ConfigSource.__Descendant_Table[com/dmdirc/config/Identity]
    //#input(void com.dmdirc.config.Identity(File, bool)): com/dmdirc/config/ConfigSource.__Descendant_Table[others]
    //#input(void com.dmdirc.config.Identity(File, bool)): com/dmdirc/config/ConfigSource.__Dispatch_Table.getOption(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
    //#input(void com.dmdirc.config.Identity(File, bool)): com/dmdirc/config/ConfigTarget$TYPE.CHANNEL
    //#input(void com.dmdirc.config.Identity(File, bool)): com/dmdirc/config/ConfigTarget$TYPE.GLOBAL
    //#input(void com.dmdirc.config.Identity(File, bool)): com/dmdirc/config/ConfigTarget$TYPE.GLOBALDEFAULT
    //#input(void com.dmdirc.config.Identity(File, bool)): com/dmdirc/config/ConfigTarget$TYPE.IRCD
    //#input(void com.dmdirc.config.Identity(File, bool)): com/dmdirc/config/ConfigTarget$TYPE.NETWORK
    //#input(void com.dmdirc.config.Identity(File, bool)): com/dmdirc/config/ConfigTarget$TYPE.PROFILE
    //#input(void com.dmdirc.config.Identity(File, bool)): com/dmdirc/config/ConfigTarget$TYPE.SERVER
    //#input(void com.dmdirc.config.Identity(File, bool)): com/dmdirc/config/ConfigTarget.__Descendant_Table[com/dmdirc/config/ConfigTarget]
    //#input(void com.dmdirc.config.Identity(File, bool)): com/dmdirc/config/ConfigTarget.__Descendant_Table[others]
    //#input(void com.dmdirc.config.Identity(File, bool)): com/dmdirc/config/ConfigTarget.__Dispatch_Table.getData()Ljava/lang/String;
    //#input(void com.dmdirc.config.Identity(File, bool)): com/dmdirc/config/ConfigTarget.__Dispatch_Table.getType()Lcom/dmdirc/config/ConfigTarget$TYPE;
    //#input(void com.dmdirc.config.Identity(File, bool)): com/dmdirc/config/ConfigTarget.__Dispatch_Table.setChannel(Ljava/lang/String;)V
    //#input(void com.dmdirc.config.Identity(File, bool)): com/dmdirc/config/ConfigTarget.__Dispatch_Table.setGlobal()V
    //#input(void com.dmdirc.config.Identity(File, bool)): com/dmdirc/config/ConfigTarget.__Dispatch_Table.setGlobalDefault()V
    //#input(void com.dmdirc.config.Identity(File, bool)): com/dmdirc/config/ConfigTarget.__Dispatch_Table.setIrcd(Ljava/lang/String;)V
    //#input(void com.dmdirc.config.Identity(File, bool)): com/dmdirc/config/ConfigTarget.__Dispatch_Table.setNetwork(Ljava/lang/String;)V
    //#input(void com.dmdirc.config.Identity(File, bool)): com/dmdirc/config/ConfigTarget.__Dispatch_Table.setOrder(I)V
    //#input(void com.dmdirc.config.Identity(File, bool)): com/dmdirc/config/ConfigTarget.__Dispatch_Table.setProfile()V
    //#input(void com.dmdirc.config.Identity(File, bool)): com/dmdirc/config/ConfigTarget.__Dispatch_Table.setServer(Ljava/lang/String;)V
    //#input(void com.dmdirc.config.Identity(File, bool)): com/dmdirc/config/IdentityManager.identities
    //#input(void com.dmdirc.config.Identity(File, bool)): com/dmdirc/config/IdentityManager.managers
    //#input(void com.dmdirc.config.Identity(File, bool)): file
    //#input(void com.dmdirc.config.Identity(File, bool)): forceDefault
    //#input(void com.dmdirc.config.Identity(File, bool)): this
    //#input(void com.dmdirc.config.Identity(File, bool)): this.__Tag
    //#output(void com.dmdirc.config.Identity(File, bool)): java.lang.StringBuilder:toString(...)._tainted
    //#output(void com.dmdirc.config.Identity(File, bool)): new ArrayList(getSources#1) num objects
    //#output(void com.dmdirc.config.Identity(File, bool)): new ArrayList(getSources#1).__Lock
    //#output(void com.dmdirc.config.Identity(File, bool)): new ConfigFile(Identity#2) num objects
    //#output(void com.dmdirc.config.Identity(File, bool)): new ConfigManager(setOption#2) num objects
    //#output(void com.dmdirc.config.Identity(File, bool)): new ConfigManager(setOption#2).__Tag
    //#output(void com.dmdirc.config.Identity(File, bool)): new ConfigManager(setOption#2).channel
    //#output(void com.dmdirc.config.Identity(File, bool)): new ConfigManager(setOption#2).ircd
    //#output(void com.dmdirc.config.Identity(File, bool)): new ConfigManager(setOption#2).listeners
    //#output(void com.dmdirc.config.Identity(File, bool)): new ConfigManager(setOption#2).network
    //#output(void com.dmdirc.config.Identity(File, bool)): new ConfigManager(setOption#2).server
    //#output(void com.dmdirc.config.Identity(File, bool)): new ConfigManager(setOption#2).sources
    //#output(void com.dmdirc.config.Identity(File, bool)): new ConfigTarget(getTarget#1) num objects
    //#output(void com.dmdirc.config.Identity(File, bool)): new ConfigTarget(getTarget#1).__Tag
    //#output(void com.dmdirc.config.Identity(File, bool)): new ConfigTarget(getTarget#1).data
    //#output(void com.dmdirc.config.Identity(File, bool)): new ConfigTarget(getTarget#1).order
    //#output(void com.dmdirc.config.Identity(File, bool)): new ConfigTarget(getTarget#1).type
    //#output(void com.dmdirc.config.Identity(File, bool)): new MapList(ConfigManager#1) num objects
    //#output(void com.dmdirc.config.Identity(File, bool)): new WeakList(Identity#1) num objects
    //#output(void com.dmdirc.config.Identity(File, bool)): this.__Lock
    //#output(void com.dmdirc.config.Identity(File, bool)): this.__Tag
    //#output(void com.dmdirc.config.Identity(File, bool)): this.file
    //#output(void com.dmdirc.config.Identity(File, bool)): this.globalConfig
    //#output(void com.dmdirc.config.Identity(File, bool)): this.listeners
    //#output(void com.dmdirc.config.Identity(File, bool)): this.myTarget
    //#output(void com.dmdirc.config.Identity(File, bool)): this.needSave
    //#output(void com.dmdirc.config.Identity(File, bool)): this.sources
    //#new obj(void com.dmdirc.config.Identity(File, bool)): java.lang.StringBuilder:toString(...)
    //#new obj(void com.dmdirc.config.Identity(File, bool)): new ArrayList(getSources#1)
    //#new obj(void com.dmdirc.config.Identity(File, bool)): new ConfigFile(Identity#2)
    //#new obj(void com.dmdirc.config.Identity(File, bool)): new ConfigManager(setOption#2)
    //#new obj(void com.dmdirc.config.Identity(File, bool)): new ConfigTarget(getTarget#1)
    //#new obj(void com.dmdirc.config.Identity(File, bool)): new MapList(ConfigManager#1)
    //#new obj(void com.dmdirc.config.Identity(File, bool)): new WeakList(Identity#1)
    //#pre[6] (void com.dmdirc.config.Identity(File, bool)): this.__Tag == com/dmdirc/config/Identity
    //#pre[5] (void com.dmdirc.config.Identity(File, bool)): (soft) forceDefault == 1
    //#post(void com.dmdirc.config.Identity(File, bool)): java.lang.StringBuilder:toString(...)._tainted == 0
    //#post(void com.dmdirc.config.Identity(File, bool)): init'ed(this.__Lock)
    //#post(void com.dmdirc.config.Identity(File, bool)): this.__Tag == com/dmdirc/config/Identity
    //#post(void com.dmdirc.config.Identity(File, bool)): this.file == &new ConfigFile(Identity#2)
    //#post(void com.dmdirc.config.Identity(File, bool)): init'ed(this.globalConfig)
    //#post(void com.dmdirc.config.Identity(File, bool)): this.listeners == &new WeakList(Identity#1)
    //#post(void com.dmdirc.config.Identity(File, bool)): this.myTarget == &new ConfigTarget(getTarget#1)
    //#post(void com.dmdirc.config.Identity(File, bool)): init'ed(this.needSave)
    //#post(void com.dmdirc.config.Identity(File, bool)): this.sources == undefined
    //#post(void com.dmdirc.config.Identity(File, bool)): this.sources == null
    //#post(void com.dmdirc.config.Identity(File, bool)): new ArrayList(getSources#1) num objects == 0
    //#post(void com.dmdirc.config.Identity(File, bool)): init'ed(new ArrayList(getSources#1).__Lock)
    //#post(void com.dmdirc.config.Identity(File, bool)): new ConfigFile(Identity#2) num objects == 1
    //#post(void com.dmdirc.config.Identity(File, bool)): new ConfigTarget(getTarget#1) num objects == 1
    //#post(void com.dmdirc.config.Identity(File, bool)): new WeakList(Identity#1) num objects == 1
    //#post(void com.dmdirc.config.Identity(File, bool)): new ConfigManager(setOption#2) num objects == 0
    //#post(void com.dmdirc.config.Identity(File, bool)): init'ed(new ConfigManager(setOption#2).__Tag)
    //#post(void com.dmdirc.config.Identity(File, bool)): init'ed(new ConfigManager(setOption#2).channel)
    //#post(void com.dmdirc.config.Identity(File, bool)): init'ed(new ConfigManager(setOption#2).ircd)
    //#post(void com.dmdirc.config.Identity(File, bool)): init'ed(new ConfigManager(setOption#2).listeners)
    //#post(void com.dmdirc.config.Identity(File, bool)): init'ed(new ConfigManager(setOption#2).network)
    //#post(void com.dmdirc.config.Identity(File, bool)): init'ed(new ConfigManager(setOption#2).server)
    //#post(void com.dmdirc.config.Identity(File, bool)): init'ed(new ConfigManager(setOption#2).sources)
    //#post(void com.dmdirc.config.Identity(File, bool)): new ConfigTarget(getTarget#1).__Tag == com/dmdirc/config/ConfigTarget
    //#post(void com.dmdirc.config.Identity(File, bool)): init'ed(new ConfigTarget(getTarget#1).data)
    //#post(void com.dmdirc.config.Identity(File, bool)): init'ed(new ConfigTarget(getTarget#1).order)
    //#post(void com.dmdirc.config.Identity(File, bool)): new ConfigTarget(getTarget#1).type == One-of{&com.dmdirc.config.ConfigTarget$TYPE__static_init.new ConfigTarget$TYPE(ConfigTarget$TYPE__static_init#5), &com.dmdirc.config.ConfigTarget$TYPE__static_init.new ConfigTarget$TYPE(ConfigTarget$TYPE__static_init#2), &com.dmdirc.config.ConfigTarget$TYP...
    //#post(void com.dmdirc.config.Identity(File, bool)): new ConfigTarget(getTarget#1).type in Addr_Set{&com.dmdirc.config.ConfigTarget$TYPE__static_init.new ConfigTarget$TYPE(ConfigTarget$TYPE__static_init#2),&com.dmdirc.config.ConfigTarget$TYPE__static_init.new ConfigTarget$TYPE(ConfigTarget$TYPE__static_init#5)}
    //#post(void com.dmdirc.config.Identity(File, bool)): new MapList(ConfigManager#1) num objects == 0
    //#unanalyzed(void com.dmdirc.config.Identity(File, bool)): Effects-of-calling:java.util.ArrayList
    //#unanalyzed(void com.dmdirc.config.Identity(File, bool)): Effects-of-calling:java.util.ArrayList:iterator
    //#unanalyzed(void com.dmdirc.config.Identity(File, bool)): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(void com.dmdirc.config.Identity(File, bool)): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(void com.dmdirc.config.Identity(File, bool)): Effects-of-calling:com.dmdirc.interfaces.ConfigChangeListener:configChanged
    //#unanalyzed(void com.dmdirc.config.Identity(File, bool)): Effects-of-calling:com.dmdirc.util.ConfigFile:getKeyDomains
    //#unanalyzed(void com.dmdirc.config.Identity(File, bool)): Effects-of-calling:com.dmdirc.util.ConfigFile:read
    //#unanalyzed(void com.dmdirc.config.Identity(File, bool)): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(void com.dmdirc.config.Identity(File, bool)): Effects-of-calling:java.util.List:add
    //#unanalyzed(void com.dmdirc.config.Identity(File, bool)): Effects-of-calling:java.util.Map:get
    //#unanalyzed(void com.dmdirc.config.Identity(File, bool)): Effects-of-calling:java.lang.String:equals
    //#unanalyzed(void com.dmdirc.config.Identity(File, bool)): Effects-of-calling:java.util.Map:remove
    //#unanalyzed(void com.dmdirc.config.Identity(File, bool)): Effects-of-calling:java.util.Map:keySet
    //#unanalyzed(void com.dmdirc.config.Identity(File, bool)): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(void com.dmdirc.config.Identity(File, bool)): Effects-of-calling:com.dmdirc.util.ConfigFile:getKeyDomain
    //#unanalyzed(void com.dmdirc.config.Identity(File, bool)): Effects-of-calling:java.util.HashMap
    //#unanalyzed(void com.dmdirc.config.Identity(File, bool)): Effects-of-calling:java.util.List:remove
    //#unanalyzed(void com.dmdirc.config.Identity(File, bool)): Effects-of-calling:com.dmdirc.util.ConfigFile:isKeyDomain
    //#unanalyzed(void com.dmdirc.config.Identity(File, bool)): Effects-of-calling:java.util.HashSet
    //#unanalyzed(void com.dmdirc.config.Identity(File, bool)): Effects-of-calling:hasOption
    //#unanalyzed(void com.dmdirc.config.Identity(File, bool)): Effects-of-calling:getOption
    //#unanalyzed(void com.dmdirc.config.Identity(File, bool)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void com.dmdirc.config.Identity(File, bool)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void com.dmdirc.config.Identity(File, bool)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void com.dmdirc.config.Identity(File, bool)): Effects-of-calling:java.util.logging.Logger:finer
    //#unanalyzed(void com.dmdirc.config.Identity(File, bool)): Effects-of-calling:java.util.List:iterator
    //#unanalyzed(void com.dmdirc.config.Identity(File, bool)): Effects-of-calling:getSources
    //#unanalyzed(void com.dmdirc.config.Identity(File, bool)): Effects-of-calling:addListener
    //#unanalyzed(void com.dmdirc.config.Identity(File, bool)): Effects-of-calling:com.dmdirc.config.ConfigSource
    //#unanalyzed(void com.dmdirc.config.Identity(File, bool)): Effects-of-calling:com.dmdirc.util.MapList
    //#unanalyzed(void com.dmdirc.config.Identity(File, bool)): Effects-of-calling:addConfigManager
    //#unanalyzed(void com.dmdirc.config.Identity(File, bool)): Effects-of-calling:com.dmdirc.util.MapList:containsKey
    //#unanalyzed(void com.dmdirc.config.Identity(File, bool)): Effects-of-calling:com.dmdirc.util.MapList:get
    //#unanalyzed(void com.dmdirc.config.Identity(File, bool)): Effects-of-calling:java.util.List:addAll
    //#unanalyzed(void com.dmdirc.config.Identity(File, bool)): Effects-of-calling:getDomains
    //#unanalyzed(void com.dmdirc.config.Identity(File, bool)): Effects-of-calling:java.util.List:contains
    //#unanalyzed(void com.dmdirc.config.Identity(File, bool)): Effects-of-calling:java.util.Set:iterator
    //#unanalyzed(void com.dmdirc.config.Identity(File, bool)): Effects-of-calling:getOptions
    //#unanalyzed(void com.dmdirc.config.Identity(File, bool)): Effects-of-calling:equals
    //#unanalyzed(void com.dmdirc.config.Identity(File, bool)): Effects-of-calling:removeListener
    //#unanalyzed(void com.dmdirc.config.Identity(File, bool)): Effects-of-calling:java.lang.Integer:intValue
    //#unanalyzed(void com.dmdirc.config.Identity(File, bool)): Effects-of-calling:java.lang.Integer:valueOf
    //#unanalyzed(void com.dmdirc.config.Identity(File, bool)): Effects-of-calling:java.util.Map:put
    //#unanalyzed(void com.dmdirc.config.Identity(File, bool)): Effects-of-calling:java.lang.IllegalArgumentException
    //#unanalyzed(void com.dmdirc.config.Identity(File, bool)): Effects-of-calling:java.lang.String:trim
    //#unanalyzed(void com.dmdirc.config.Identity(File, bool)): Effects-of-calling:java.lang.Integer:parseInt
    //#unanalyzed(void com.dmdirc.config.Identity(File, bool)): Effects-of-calling:java.lang.Exception
    //#unanalyzed(void com.dmdirc.config.Identity(File, bool)): Effects-of-calling:com.dmdirc.logger.Logger:assertTrue
    //#unanalyzed(void com.dmdirc.config.Identity(File, bool)): Effects-of-calling:getTarget
    //#unanalyzed(void com.dmdirc.config.Identity(File, bool)): Effects-of-calling:com.dmdirc.config.ConfigTarget$TYPE:ordinal
    //#unanalyzed(void com.dmdirc.config.Identity(File, bool)): Effects-of-calling:java.lang.String:equalsIgnoreCase
    //#unanalyzed(void com.dmdirc.config.Identity(File, bool)): Effects-of-calling:java.util.Collections:sort

        this.file = new ConfigFile(file);
    //#Identity.java:108: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.util.ConfigFile(File)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.config.Identity
    //#    method: void com.dmdirc.config.Identity(File, bool)
    //#    unanalyzed callee: void com.dmdirc.util.ConfigFile(File)
        this.file.setAutomake(true);
    //#Identity.java:109: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.util.ConfigFile:setAutomake(bool)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.config.Identity
    //#    method: void com.dmdirc.config.Identity(File, bool)
    //#    unanalyzed callee: void com.dmdirc.util.ConfigFile:setAutomake(bool)
        initFile(forceDefault, new FileInputStream(file));
        myTarget = getTarget(forceDefault);

        if (myTarget.getType() == ConfigTarget.TYPE.PROFILE) {
    //#Identity.java:113: Warning: test always goes same way
    //#    Test predetermined because true
    //#    severity: LOW
    //#    class: com.dmdirc.config.Identity
    //#    method: void com.dmdirc.config.Identity(File, bool)
    //#    from bb: Entry_BB_1
    //#    live edge: Entry_BB_1-->bb_3
    //#    tested vn: (forceDefault != 0 & __Temp_Initially_1 == 0 & __Temp_Initially_1 != 0) | (forceDefault == 0 & __Temp_Initially_1 == 0)
    //#    tested vn values: {0,1}
            migrateProfile();
    //#Identity.java:114: Warning: dead code
    //#    Dead code here because true
    //#    severity: LOW
    //#    class: com.dmdirc.config.Identity
    //#    method: void com.dmdirc.config.Identity(File, bool)
    //#    dead bb: bb_2
        }
    }
    //#Identity.java:116: end of method: void com.dmdirc.config.Identity.com.dmdirc.config.Identity(File, bool)

    /**
     * Creates a new read-only identity.
     *
     * @param stream The input stream to read the identity from
     * @param forceDefault Whether to force this identity to be loaded as default
     * identity or not
     * @throws InvalidIdentityFileException Missing required properties
     * @throws IOException Input/output exception
     */
    public Identity(final InputStream stream, final boolean forceDefault) throws IOException,
            InvalidIdentityFileException {
        super();
    //#Identity.java:129: method: void com.dmdirc.config.Identity.com.dmdirc.config.Identity(InputStream, bool)
    //#input(void com.dmdirc.config.Identity(InputStream, bool)): " to "._tainted
    //#input(void com.dmdirc.config.Identity(InputStream, bool)): ""._tainted
    //#input(void com.dmdirc.config.Identity(InputStream, bool)): "&#10;"._tainted
    //#input(void com.dmdirc.config.Identity(InputStream, bool)): "."._tainted
    //#input(void com.dmdirc.config.Identity(InputStream, bool)): ": setting "._tainted
    //#input(void com.dmdirc.config.Identity(InputStream, bool)): "<Unknown>"._tainted
    //#input(void com.dmdirc.config.Identity(InputStream, bool)): "@"._tainted
    //#input(void com.dmdirc.config.Identity(InputStream, bool)): "Config option not found: "._tainted
    //#input(void com.dmdirc.config.Identity(InputStream, bool)): "Unnamed"._tainted
    //#input(void com.dmdirc.config.Identity(InputStream, bool)): "nicknames"._tainted
    //#input(void com.dmdirc.config.Identity(InputStream, bool)): "order"._tainted
    //#input(void com.dmdirc.config.Identity(InputStream, bool)): DOMAIN
    //#input(void com.dmdirc.config.Identity(InputStream, bool)): LOGGER
    //#input(void com.dmdirc.config.Identity(InputStream, bool)): PROFILE_DOMAIN
    //#input(void com.dmdirc.config.Identity(InputStream, bool)): __Descendant_Table[com/dmdirc/config/Identity]
    //#input(void com.dmdirc.config.Identity(InputStream, bool)): __Descendant_Table[others]
    //#input(void com.dmdirc.config.Identity(InputStream, bool)): __Dispatch_Table.addListener(Lcom/dmdirc/interfaces/ConfigChangeListener;)V
    //#input(void com.dmdirc.config.Identity(InputStream, bool)): __Dispatch_Table.equals(Ljava/lang/Object;)Z
    //#input(void com.dmdirc.config.Identity(InputStream, bool)): __Dispatch_Table.getDomains()Ljava/util/Set;
    //#input(void com.dmdirc.config.Identity(InputStream, bool)): __Dispatch_Table.getName()Ljava/lang/String;
    //#input(void com.dmdirc.config.Identity(InputStream, bool)): __Dispatch_Table.getOption(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
    //#input(void com.dmdirc.config.Identity(InputStream, bool)): __Dispatch_Table.getOptionInt(Ljava/lang/String;Ljava/lang/String;)I
    //#input(void com.dmdirc.config.Identity(InputStream, bool)): __Dispatch_Table.getOptions(Ljava/lang/String;)Ljava/util/Map;
    //#input(void com.dmdirc.config.Identity(InputStream, bool)): __Dispatch_Table.getTarget()Lcom/dmdirc/config/ConfigTarget;
    //#input(void com.dmdirc.config.Identity(InputStream, bool)): __Dispatch_Table.hasOption(Ljava/lang/String;Ljava/lang/String;)Z
    //#input(void com.dmdirc.config.Identity(InputStream, bool)): __Dispatch_Table.isProfile()Z
    //#input(void com.dmdirc.config.Identity(InputStream, bool)): __Dispatch_Table.migrateProfile()V
    //#input(void com.dmdirc.config.Identity(InputStream, bool)): __Dispatch_Table.removeListener(Lcom/dmdirc/interfaces/ConfigChangeListener;)V
    //#input(void com.dmdirc.config.Identity(InputStream, bool)): __Dispatch_Table.setOption(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
    //#input(void com.dmdirc.config.Identity(InputStream, bool)): __Dispatch_Table.unsetOption(Ljava/lang/String;Ljava/lang/String;)V
    //#input(void com.dmdirc.config.Identity(InputStream, bool)): com.dmdirc.config.ConfigManager$1__static_init.new int[](ConfigManager$1__static_init#1).length
    //#input(void com.dmdirc.config.Identity(InputStream, bool)): com/dmdirc/config/ConfigManager$1.$SwitchMap$com$dmdirc$config$ConfigTarget$TYPE
    //#input(void com.dmdirc.config.Identity(InputStream, bool)): com/dmdirc/config/ConfigManager.__Descendant_Table[com/dmdirc/config/ConfigManager]
    //#input(void com.dmdirc.config.Identity(InputStream, bool)): com/dmdirc/config/ConfigManager.__Descendant_Table[others]
    //#input(void com.dmdirc.config.Identity(InputStream, bool)): com/dmdirc/config/ConfigManager.__Dispatch_Table.configChanged(Ljava/lang/String;Ljava/lang/String;)V
    //#input(void com.dmdirc.config.Identity(InputStream, bool)): com/dmdirc/config/ConfigManager.__Dispatch_Table.getOption(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
    //#input(void com.dmdirc.config.Identity(InputStream, bool)): com/dmdirc/config/ConfigManager.__Dispatch_Table.getScope(Ljava/lang/String;Ljava/lang/String;)Lcom/dmdirc/config/Identity;
    //#input(void com.dmdirc.config.Identity(InputStream, bool)): com/dmdirc/config/ConfigManager.__Dispatch_Table.hasOption(Ljava/lang/String;Ljava/lang/String;)Z
    //#input(void com.dmdirc.config.Identity(InputStream, bool)): com/dmdirc/config/ConfigManager.__Dispatch_Table.identityApplies(Lcom/dmdirc/config/Identity;)Z
    //#input(void com.dmdirc.config.Identity(InputStream, bool)): com/dmdirc/config/ConfigManager.__Dispatch_Table.removeIdentity(Lcom/dmdirc/config/Identity;)V
    //#input(void com.dmdirc.config.Identity(InputStream, bool)): com/dmdirc/config/ConfigManager.stats
    //#input(void com.dmdirc.config.Identity(InputStream, bool)): com/dmdirc/config/ConfigSource.__Descendant_Table[com/dmdirc/config/ConfigManager]
    //#input(void com.dmdirc.config.Identity(InputStream, bool)): com/dmdirc/config/ConfigSource.__Descendant_Table[com/dmdirc/config/ConfigSource]
    //#input(void com.dmdirc.config.Identity(InputStream, bool)): com/dmdirc/config/ConfigSource.__Descendant_Table[com/dmdirc/config/Identity]
    //#input(void com.dmdirc.config.Identity(InputStream, bool)): com/dmdirc/config/ConfigSource.__Descendant_Table[others]
    //#input(void com.dmdirc.config.Identity(InputStream, bool)): com/dmdirc/config/ConfigSource.__Dispatch_Table.getOption(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
    //#input(void com.dmdirc.config.Identity(InputStream, bool)): com/dmdirc/config/ConfigTarget$TYPE.CHANNEL
    //#input(void com.dmdirc.config.Identity(InputStream, bool)): com/dmdirc/config/ConfigTarget$TYPE.GLOBAL
    //#input(void com.dmdirc.config.Identity(InputStream, bool)): com/dmdirc/config/ConfigTarget$TYPE.GLOBALDEFAULT
    //#input(void com.dmdirc.config.Identity(InputStream, bool)): com/dmdirc/config/ConfigTarget$TYPE.IRCD
    //#input(void com.dmdirc.config.Identity(InputStream, bool)): com/dmdirc/config/ConfigTarget$TYPE.NETWORK
    //#input(void com.dmdirc.config.Identity(InputStream, bool)): com/dmdirc/config/ConfigTarget$TYPE.PROFILE
    //#input(void com.dmdirc.config.Identity(InputStream, bool)): com/dmdirc/config/ConfigTarget$TYPE.SERVER
    //#input(void com.dmdirc.config.Identity(InputStream, bool)): com/dmdirc/config/ConfigTarget.__Descendant_Table[com/dmdirc/config/ConfigTarget]
    //#input(void com.dmdirc.config.Identity(InputStream, bool)): com/dmdirc/config/ConfigTarget.__Descendant_Table[others]
    //#input(void com.dmdirc.config.Identity(InputStream, bool)): com/dmdirc/config/ConfigTarget.__Dispatch_Table.getData()Ljava/lang/String;
    //#input(void com.dmdirc.config.Identity(InputStream, bool)): com/dmdirc/config/ConfigTarget.__Dispatch_Table.getType()Lcom/dmdirc/config/ConfigTarget$TYPE;
    //#input(void com.dmdirc.config.Identity(InputStream, bool)): com/dmdirc/config/ConfigTarget.__Dispatch_Table.setChannel(Ljava/lang/String;)V
    //#input(void com.dmdirc.config.Identity(InputStream, bool)): com/dmdirc/config/ConfigTarget.__Dispatch_Table.setGlobal()V
    //#input(void com.dmdirc.config.Identity(InputStream, bool)): com/dmdirc/config/ConfigTarget.__Dispatch_Table.setGlobalDefault()V
    //#input(void com.dmdirc.config.Identity(InputStream, bool)): com/dmdirc/config/ConfigTarget.__Dispatch_Table.setIrcd(Ljava/lang/String;)V
    //#input(void com.dmdirc.config.Identity(InputStream, bool)): com/dmdirc/config/ConfigTarget.__Dispatch_Table.setNetwork(Ljava/lang/String;)V
    //#input(void com.dmdirc.config.Identity(InputStream, bool)): com/dmdirc/config/ConfigTarget.__Dispatch_Table.setOrder(I)V
    //#input(void com.dmdirc.config.Identity(InputStream, bool)): com/dmdirc/config/ConfigTarget.__Dispatch_Table.setProfile()V
    //#input(void com.dmdirc.config.Identity(InputStream, bool)): com/dmdirc/config/ConfigTarget.__Dispatch_Table.setServer(Ljava/lang/String;)V
    //#input(void com.dmdirc.config.Identity(InputStream, bool)): com/dmdirc/config/IdentityManager.identities
    //#input(void com.dmdirc.config.Identity(InputStream, bool)): com/dmdirc/config/IdentityManager.managers
    //#input(void com.dmdirc.config.Identity(InputStream, bool)): forceDefault
    //#input(void com.dmdirc.config.Identity(InputStream, bool)): stream
    //#input(void com.dmdirc.config.Identity(InputStream, bool)): this
    //#input(void com.dmdirc.config.Identity(InputStream, bool)): this.__Tag
    //#output(void com.dmdirc.config.Identity(InputStream, bool)): java.lang.StringBuilder:toString(...)._tainted
    //#output(void com.dmdirc.config.Identity(InputStream, bool)): new ArrayList(getSources#1) num objects
    //#output(void com.dmdirc.config.Identity(InputStream, bool)): new ArrayList(getSources#1).__Lock
    //#output(void com.dmdirc.config.Identity(InputStream, bool)): new ConfigFile(Identity#2) num objects
    //#output(void com.dmdirc.config.Identity(InputStream, bool)): new ConfigManager(setOption#2) num objects
    //#output(void com.dmdirc.config.Identity(InputStream, bool)): new ConfigManager(setOption#2).__Tag
    //#output(void com.dmdirc.config.Identity(InputStream, bool)): new ConfigManager(setOption#2).channel
    //#output(void com.dmdirc.config.Identity(InputStream, bool)): new ConfigManager(setOption#2).ircd
    //#output(void com.dmdirc.config.Identity(InputStream, bool)): new ConfigManager(setOption#2).listeners
    //#output(void com.dmdirc.config.Identity(InputStream, bool)): new ConfigManager(setOption#2).network
    //#output(void com.dmdirc.config.Identity(InputStream, bool)): new ConfigManager(setOption#2).server
    //#output(void com.dmdirc.config.Identity(InputStream, bool)): new ConfigManager(setOption#2).sources
    //#output(void com.dmdirc.config.Identity(InputStream, bool)): new ConfigTarget(getTarget#1) num objects
    //#output(void com.dmdirc.config.Identity(InputStream, bool)): new ConfigTarget(getTarget#1).__Tag
    //#output(void com.dmdirc.config.Identity(InputStream, bool)): new ConfigTarget(getTarget#1).data
    //#output(void com.dmdirc.config.Identity(InputStream, bool)): new ConfigTarget(getTarget#1).order
    //#output(void com.dmdirc.config.Identity(InputStream, bool)): new ConfigTarget(getTarget#1).type
    //#output(void com.dmdirc.config.Identity(InputStream, bool)): new MapList(ConfigManager#1) num objects
    //#output(void com.dmdirc.config.Identity(InputStream, bool)): new WeakList(Identity#1) num objects
    //#output(void com.dmdirc.config.Identity(InputStream, bool)): this.__Lock
    //#output(void com.dmdirc.config.Identity(InputStream, bool)): this.__Tag
    //#output(void com.dmdirc.config.Identity(InputStream, bool)): this.file
    //#output(void com.dmdirc.config.Identity(InputStream, bool)): this.globalConfig
    //#output(void com.dmdirc.config.Identity(InputStream, bool)): this.listeners
    //#output(void com.dmdirc.config.Identity(InputStream, bool)): this.myTarget
    //#output(void com.dmdirc.config.Identity(InputStream, bool)): this.needSave
    //#output(void com.dmdirc.config.Identity(InputStream, bool)): this.sources
    //#new obj(void com.dmdirc.config.Identity(InputStream, bool)): java.lang.StringBuilder:toString(...)
    //#new obj(void com.dmdirc.config.Identity(InputStream, bool)): new ArrayList(getSources#1)
    //#new obj(void com.dmdirc.config.Identity(InputStream, bool)): new ConfigFile(Identity#2)
    //#new obj(void com.dmdirc.config.Identity(InputStream, bool)): new ConfigManager(setOption#2)
    //#new obj(void com.dmdirc.config.Identity(InputStream, bool)): new ConfigTarget(getTarget#1)
    //#new obj(void com.dmdirc.config.Identity(InputStream, bool)): new MapList(ConfigManager#1)
    //#new obj(void com.dmdirc.config.Identity(InputStream, bool)): new WeakList(Identity#1)
    //#pre[5] (void com.dmdirc.config.Identity(InputStream, bool)): this.__Tag == com/dmdirc/config/Identity
    //#pre[4] (void com.dmdirc.config.Identity(InputStream, bool)): (soft) forceDefault == 1
    //#post(void com.dmdirc.config.Identity(InputStream, bool)): java.lang.StringBuilder:toString(...)._tainted == 0
    //#post(void com.dmdirc.config.Identity(InputStream, bool)): init'ed(this.__Lock)
    //#post(void com.dmdirc.config.Identity(InputStream, bool)): this.__Tag == com/dmdirc/config/Identity
    //#post(void com.dmdirc.config.Identity(InputStream, bool)): this.file == &new ConfigFile(Identity#2)
    //#post(void com.dmdirc.config.Identity(InputStream, bool)): init'ed(this.globalConfig)
    //#post(void com.dmdirc.config.Identity(InputStream, bool)): this.listeners == &new WeakList(Identity#1)
    //#post(void com.dmdirc.config.Identity(InputStream, bool)): this.myTarget == &new ConfigTarget(getTarget#1)
    //#post(void com.dmdirc.config.Identity(InputStream, bool)): init'ed(this.needSave)
    //#post(void com.dmdirc.config.Identity(InputStream, bool)): this.sources == undefined
    //#post(void com.dmdirc.config.Identity(InputStream, bool)): this.sources == null
    //#post(void com.dmdirc.config.Identity(InputStream, bool)): new ArrayList(getSources#1) num objects == 0
    //#post(void com.dmdirc.config.Identity(InputStream, bool)): init'ed(new ArrayList(getSources#1).__Lock)
    //#post(void com.dmdirc.config.Identity(InputStream, bool)): new ConfigFile(Identity#2) num objects == 1
    //#post(void com.dmdirc.config.Identity(InputStream, bool)): new ConfigTarget(getTarget#1) num objects == 1
    //#post(void com.dmdirc.config.Identity(InputStream, bool)): new WeakList(Identity#1) num objects == 1
    //#post(void com.dmdirc.config.Identity(InputStream, bool)): new ConfigManager(setOption#2) num objects == 0
    //#post(void com.dmdirc.config.Identity(InputStream, bool)): init'ed(new ConfigManager(setOption#2).__Tag)
    //#post(void com.dmdirc.config.Identity(InputStream, bool)): init'ed(new ConfigManager(setOption#2).channel)
    //#post(void com.dmdirc.config.Identity(InputStream, bool)): init'ed(new ConfigManager(setOption#2).ircd)
    //#post(void com.dmdirc.config.Identity(InputStream, bool)): init'ed(new ConfigManager(setOption#2).listeners)
    //#post(void com.dmdirc.config.Identity(InputStream, bool)): init'ed(new ConfigManager(setOption#2).network)
    //#post(void com.dmdirc.config.Identity(InputStream, bool)): init'ed(new ConfigManager(setOption#2).server)
    //#post(void com.dmdirc.config.Identity(InputStream, bool)): init'ed(new ConfigManager(setOption#2).sources)
    //#post(void com.dmdirc.config.Identity(InputStream, bool)): new ConfigTarget(getTarget#1).__Tag == com/dmdirc/config/ConfigTarget
    //#post(void com.dmdirc.config.Identity(InputStream, bool)): init'ed(new ConfigTarget(getTarget#1).data)
    //#post(void com.dmdirc.config.Identity(InputStream, bool)): init'ed(new ConfigTarget(getTarget#1).order)
    //#post(void com.dmdirc.config.Identity(InputStream, bool)): new ConfigTarget(getTarget#1).type == One-of{&com.dmdirc.config.ConfigTarget$TYPE__static_init.new ConfigTarget$TYPE(ConfigTarget$TYPE__static_init#5), &com.dmdirc.config.ConfigTarget$TYPE__static_init.new ConfigTarget$TYPE(ConfigTarget$TYPE__static_init#2), &com.dmdirc.config.ConfigTarget$TYP...
    //#post(void com.dmdirc.config.Identity(InputStream, bool)): new ConfigTarget(getTarget#1).type in Addr_Set{&com.dmdirc.config.ConfigTarget$TYPE__static_init.new ConfigTarget$TYPE(ConfigTarget$TYPE__static_init#2),&com.dmdirc.config.ConfigTarget$TYPE__static_init.new ConfigTarget$TYPE(ConfigTarget$TYPE__static_init#5)}
    //#post(void com.dmdirc.config.Identity(InputStream, bool)): new MapList(ConfigManager#1) num objects == 0
    //#unanalyzed(void com.dmdirc.config.Identity(InputStream, bool)): Effects-of-calling:java.util.ArrayList
    //#unanalyzed(void com.dmdirc.config.Identity(InputStream, bool)): Effects-of-calling:java.util.ArrayList:iterator
    //#unanalyzed(void com.dmdirc.config.Identity(InputStream, bool)): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(void com.dmdirc.config.Identity(InputStream, bool)): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(void com.dmdirc.config.Identity(InputStream, bool)): Effects-of-calling:com.dmdirc.interfaces.ConfigChangeListener:configChanged
    //#unanalyzed(void com.dmdirc.config.Identity(InputStream, bool)): Effects-of-calling:com.dmdirc.util.ConfigFile:getKeyDomains
    //#unanalyzed(void com.dmdirc.config.Identity(InputStream, bool)): Effects-of-calling:com.dmdirc.util.ConfigFile:read
    //#unanalyzed(void com.dmdirc.config.Identity(InputStream, bool)): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(void com.dmdirc.config.Identity(InputStream, bool)): Effects-of-calling:java.util.List:add
    //#unanalyzed(void com.dmdirc.config.Identity(InputStream, bool)): Effects-of-calling:java.util.Map:get
    //#unanalyzed(void com.dmdirc.config.Identity(InputStream, bool)): Effects-of-calling:java.lang.String:equals
    //#unanalyzed(void com.dmdirc.config.Identity(InputStream, bool)): Effects-of-calling:java.util.Map:remove
    //#unanalyzed(void com.dmdirc.config.Identity(InputStream, bool)): Effects-of-calling:java.util.Map:keySet
    //#unanalyzed(void com.dmdirc.config.Identity(InputStream, bool)): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(void com.dmdirc.config.Identity(InputStream, bool)): Effects-of-calling:com.dmdirc.util.ConfigFile:getKeyDomain
    //#unanalyzed(void com.dmdirc.config.Identity(InputStream, bool)): Effects-of-calling:java.util.HashMap
    //#unanalyzed(void com.dmdirc.config.Identity(InputStream, bool)): Effects-of-calling:java.util.List:remove
    //#unanalyzed(void com.dmdirc.config.Identity(InputStream, bool)): Effects-of-calling:com.dmdirc.util.ConfigFile:isKeyDomain
    //#unanalyzed(void com.dmdirc.config.Identity(InputStream, bool)): Effects-of-calling:java.util.HashSet
    //#unanalyzed(void com.dmdirc.config.Identity(InputStream, bool)): Effects-of-calling:hasOption
    //#unanalyzed(void com.dmdirc.config.Identity(InputStream, bool)): Effects-of-calling:getOption
    //#unanalyzed(void com.dmdirc.config.Identity(InputStream, bool)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void com.dmdirc.config.Identity(InputStream, bool)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void com.dmdirc.config.Identity(InputStream, bool)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void com.dmdirc.config.Identity(InputStream, bool)): Effects-of-calling:java.util.logging.Logger:finer
    //#unanalyzed(void com.dmdirc.config.Identity(InputStream, bool)): Effects-of-calling:java.util.List:iterator
    //#unanalyzed(void com.dmdirc.config.Identity(InputStream, bool)): Effects-of-calling:getSources
    //#unanalyzed(void com.dmdirc.config.Identity(InputStream, bool)): Effects-of-calling:addListener
    //#unanalyzed(void com.dmdirc.config.Identity(InputStream, bool)): Effects-of-calling:com.dmdirc.config.ConfigSource
    //#unanalyzed(void com.dmdirc.config.Identity(InputStream, bool)): Effects-of-calling:com.dmdirc.util.MapList
    //#unanalyzed(void com.dmdirc.config.Identity(InputStream, bool)): Effects-of-calling:addConfigManager
    //#unanalyzed(void com.dmdirc.config.Identity(InputStream, bool)): Effects-of-calling:com.dmdirc.util.MapList:containsKey
    //#unanalyzed(void com.dmdirc.config.Identity(InputStream, bool)): Effects-of-calling:com.dmdirc.util.MapList:get
    //#unanalyzed(void com.dmdirc.config.Identity(InputStream, bool)): Effects-of-calling:java.util.List:addAll
    //#unanalyzed(void com.dmdirc.config.Identity(InputStream, bool)): Effects-of-calling:getDomains
    //#unanalyzed(void com.dmdirc.config.Identity(InputStream, bool)): Effects-of-calling:java.util.List:contains
    //#unanalyzed(void com.dmdirc.config.Identity(InputStream, bool)): Effects-of-calling:java.util.Set:iterator
    //#unanalyzed(void com.dmdirc.config.Identity(InputStream, bool)): Effects-of-calling:getOptions
    //#unanalyzed(void com.dmdirc.config.Identity(InputStream, bool)): Effects-of-calling:equals
    //#unanalyzed(void com.dmdirc.config.Identity(InputStream, bool)): Effects-of-calling:removeListener
    //#unanalyzed(void com.dmdirc.config.Identity(InputStream, bool)): Effects-of-calling:java.lang.Integer:intValue
    //#unanalyzed(void com.dmdirc.config.Identity(InputStream, bool)): Effects-of-calling:java.lang.Integer:valueOf
    //#unanalyzed(void com.dmdirc.config.Identity(InputStream, bool)): Effects-of-calling:java.util.Map:put
    //#unanalyzed(void com.dmdirc.config.Identity(InputStream, bool)): Effects-of-calling:java.lang.IllegalArgumentException
    //#unanalyzed(void com.dmdirc.config.Identity(InputStream, bool)): Effects-of-calling:java.lang.String:trim
    //#unanalyzed(void com.dmdirc.config.Identity(InputStream, bool)): Effects-of-calling:java.lang.Integer:parseInt
    //#unanalyzed(void com.dmdirc.config.Identity(InputStream, bool)): Effects-of-calling:java.lang.Exception
    //#unanalyzed(void com.dmdirc.config.Identity(InputStream, bool)): Effects-of-calling:com.dmdirc.logger.Logger:assertTrue
    //#unanalyzed(void com.dmdirc.config.Identity(InputStream, bool)): Effects-of-calling:getTarget
    //#unanalyzed(void com.dmdirc.config.Identity(InputStream, bool)): Effects-of-calling:com.dmdirc.config.ConfigTarget$TYPE:ordinal
    //#unanalyzed(void com.dmdirc.config.Identity(InputStream, bool)): Effects-of-calling:java.lang.String:equalsIgnoreCase
    //#unanalyzed(void com.dmdirc.config.Identity(InputStream, bool)): Effects-of-calling:java.util.Collections:sort

        this.file = new ConfigFile(stream);
    //#Identity.java:131: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.util.ConfigFile(InputStream)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.config.Identity
    //#    method: void com.dmdirc.config.Identity(InputStream, bool)
    //#    unanalyzed callee: void com.dmdirc.util.ConfigFile(InputStream)
        this.file.setAutomake(true);
    //#Identity.java:132: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.util.ConfigFile:setAutomake(bool)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.config.Identity
    //#    method: void com.dmdirc.config.Identity(InputStream, bool)
    //#    unanalyzed callee: void com.dmdirc.util.ConfigFile:setAutomake(bool)
        initFile(forceDefault, stream);
        myTarget = getTarget(forceDefault);

        if (myTarget.getType() == ConfigTarget.TYPE.PROFILE) {
    //#Identity.java:136: Warning: test always goes same way
    //#    Test predetermined because true
    //#    severity: LOW
    //#    class: com.dmdirc.config.Identity
    //#    method: void com.dmdirc.config.Identity(InputStream, bool)
    //#    from bb: Entry_BB_1
    //#    live edge: Entry_BB_1-->bb_3
    //#    tested vn: (forceDefault != 0 & __Temp_Initially_1 == 0 & __Temp_Initially_1 != 0) | (forceDefault == 0 & __Temp_Initially_1 == 0)
    //#    tested vn values: {0,1}
            migrateProfile();
    //#Identity.java:137: Warning: dead code
    //#    Dead code here because true
    //#    severity: LOW
    //#    class: com.dmdirc.config.Identity
    //#    method: void com.dmdirc.config.Identity(InputStream, bool)
    //#    dead bb: bb_2
        }
    }
    //#Identity.java:139: end of method: void com.dmdirc.config.Identity.com.dmdirc.config.Identity(InputStream, bool)

    /**
     * Creates a new identity from the specified config file.
     *
     * @param configFile The config file to use
     * @param target The target of this identity
     */
    public Identity(final ConfigFile configFile, final ConfigTarget target) {
        super();
    //#Identity.java:148: method: void com.dmdirc.config.Identity.com.dmdirc.config.Identity(ConfigFile, ConfigTarget)
    //#input(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): " to "._tainted
    //#input(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): ""._tainted
    //#input(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): "&#10;"._tainted
    //#input(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): "."._tainted
    //#input(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): ": setting "._tainted
    //#input(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): "<Unknown>"._tainted
    //#input(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): "@"._tainted
    //#input(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): "Config option not found: "._tainted
    //#input(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): "Unnamed"._tainted
    //#input(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): "nicknames"._tainted
    //#input(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): DOMAIN
    //#input(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): LOGGER
    //#input(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): PROFILE_DOMAIN
    //#input(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): __Descendant_Table[com/dmdirc/config/Identity]
    //#input(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): __Descendant_Table[others]
    //#input(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): __Dispatch_Table.addListener(Lcom/dmdirc/interfaces/ConfigChangeListener;)V
    //#input(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): __Dispatch_Table.equals(Ljava/lang/Object;)Z
    //#input(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): __Dispatch_Table.getDomains()Ljava/util/Set;
    //#input(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): __Dispatch_Table.getName()Ljava/lang/String;
    //#input(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): __Dispatch_Table.getOption(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
    //#input(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): __Dispatch_Table.getOptions(Ljava/lang/String;)Ljava/util/Map;
    //#input(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): __Dispatch_Table.getTarget()Lcom/dmdirc/config/ConfigTarget;
    //#input(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): __Dispatch_Table.hasOption(Ljava/lang/String;Ljava/lang/String;)Z
    //#input(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): __Dispatch_Table.migrateProfile()V
    //#input(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): __Dispatch_Table.removeListener(Lcom/dmdirc/interfaces/ConfigChangeListener;)V
    //#input(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): __Dispatch_Table.setOption(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
    //#input(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): __Dispatch_Table.unsetOption(Ljava/lang/String;Ljava/lang/String;)V
    //#input(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): com.dmdirc.config.ConfigManager$1__static_init.new int[](ConfigManager$1__static_init#1).length
    //#input(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): com.dmdirc.config.ConfigManager$1__static_init.new int[](ConfigManager$1__static_init#1)[0..4_294_967_295]
    //#input(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): com/dmdirc/config/ConfigManager$1.$SwitchMap$com$dmdirc$config$ConfigTarget$TYPE
    //#input(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): com/dmdirc/config/ConfigManager.__Descendant_Table[com/dmdirc/config/ConfigManager]
    //#input(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): com/dmdirc/config/ConfigManager.__Descendant_Table[others]
    //#input(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): com/dmdirc/config/ConfigManager.__Dispatch_Table.configChanged(Ljava/lang/String;Ljava/lang/String;)V
    //#input(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): com/dmdirc/config/ConfigManager.__Dispatch_Table.getOption(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
    //#input(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): com/dmdirc/config/ConfigManager.__Dispatch_Table.getScope(Ljava/lang/String;Ljava/lang/String;)Lcom/dmdirc/config/Identity;
    //#input(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): com/dmdirc/config/ConfigManager.__Dispatch_Table.hasOption(Ljava/lang/String;Ljava/lang/String;)Z
    //#input(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): com/dmdirc/config/ConfigManager.__Dispatch_Table.identityApplies(Lcom/dmdirc/config/Identity;)Z
    //#input(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): com/dmdirc/config/ConfigManager.__Dispatch_Table.removeIdentity(Lcom/dmdirc/config/Identity;)V
    //#input(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): com/dmdirc/config/ConfigManager.stats
    //#input(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): com/dmdirc/config/ConfigTarget$TYPE.GLOBAL
    //#input(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): com/dmdirc/config/ConfigTarget$TYPE.PROFILE
    //#input(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): com/dmdirc/config/ConfigTarget.__Descendant_Table[com/dmdirc/config/ConfigTarget]
    //#input(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): com/dmdirc/config/ConfigTarget.__Descendant_Table[others]
    //#input(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): com/dmdirc/config/ConfigTarget.__Dispatch_Table.getData()Ljava/lang/String;
    //#input(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): com/dmdirc/config/ConfigTarget.__Dispatch_Table.getType()Lcom/dmdirc/config/ConfigTarget$TYPE;
    //#input(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): com/dmdirc/config/IdentityManager.identities
    //#input(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): com/dmdirc/config/IdentityManager.managers
    //#input(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): configFile
    //#input(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): target
    //#input(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): target.__Tag
    //#input(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): target.type
    //#input(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): this
    //#input(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): this.__Tag
    //#output(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): java.lang.StringBuilder:toString(...)._tainted
    //#output(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): new ArrayList(getSources#1) num objects
    //#output(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): new ArrayList(getSources#1).__Lock
    //#output(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): new ConfigManager(setOption#2) num objects
    //#output(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): new ConfigManager(setOption#2).__Tag
    //#output(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): new ConfigManager(setOption#2).channel
    //#output(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): new ConfigManager(setOption#2).ircd
    //#output(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): new ConfigManager(setOption#2).listeners
    //#output(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): new ConfigManager(setOption#2).network
    //#output(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): new ConfigManager(setOption#2).server
    //#output(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): new ConfigManager(setOption#2).sources
    //#output(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): new MapList(ConfigManager#1) num objects
    //#output(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): new WeakList(Identity#1) num objects
    //#output(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): this.__Lock
    //#output(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): this.file
    //#output(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): this.globalConfig
    //#output(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): this.listeners
    //#output(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): this.myTarget
    //#output(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): this.needSave
    //#new obj(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): java.lang.StringBuilder:toString(...)
    //#new obj(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): new ArrayList(getSources#1)
    //#new obj(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): new ConfigManager(setOption#2)
    //#new obj(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): new MapList(ConfigManager#1)
    //#new obj(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): new WeakList(Identity#1)
    //#pre[4] (void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): configFile != null
    //#pre[5] (void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): target != null
    //#pre[6] (void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): target.__Tag == com/dmdirc/config/ConfigTarget
    //#pre[7] (void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): init'ed(target.type)
    //#pre[1] (void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): (soft) init'ed(com.dmdirc.config.ConfigManager$1__static_init.new int[](ConfigManager$1__static_init#1)[0..4_294_967_295])
    //#pre[9] (void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): (soft) this.__Tag == com/dmdirc/config/Identity
    //#post(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): java.lang.StringBuilder:toString(...)._tainted == 0
    //#post(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): possibly_updated(this.__Lock)
    //#post(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): this.file == configFile
    //#post(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): this.file != null
    //#post(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): this.globalConfig in Addr_Set{null,&new ConfigManager(setOption#2)}
    //#post(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): this.listeners == &new WeakList(Identity#1)
    //#post(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): this.myTarget == target
    //#post(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): this.myTarget != null
    //#post(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): possibly_updated(this.needSave)
    //#post(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): new ArrayList(getSources#1) num objects <= 1
    //#post(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): init'ed(new ArrayList(getSources#1).__Lock)
    //#post(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): new ConfigManager(setOption#2) num objects <= 1
    //#post(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): init'ed(new ConfigManager(setOption#2).__Tag)
    //#post(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): init'ed(new ConfigManager(setOption#2).channel)
    //#post(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): init'ed(new ConfigManager(setOption#2).ircd)
    //#post(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): init'ed(new ConfigManager(setOption#2).listeners)
    //#post(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): init'ed(new ConfigManager(setOption#2).network)
    //#post(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): init'ed(new ConfigManager(setOption#2).server)
    //#post(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): init'ed(new ConfigManager(setOption#2).sources)
    //#post(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): new MapList(ConfigManager#1) num objects <= 1
    //#post(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): new WeakList(Identity#1) num objects == 1
    //#unanalyzed(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): Effects-of-calling:java.util.ArrayList
    //#unanalyzed(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): Effects-of-calling:java.util.ArrayList:iterator
    //#unanalyzed(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): Effects-of-calling:com.dmdirc.interfaces.ConfigChangeListener:configChanged
    //#unanalyzed(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): Effects-of-calling:com.dmdirc.util.ConfigFile:getKeyDomains
    //#unanalyzed(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): Effects-of-calling:java.util.List:add
    //#unanalyzed(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): Effects-of-calling:java.util.Map:get
    //#unanalyzed(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): Effects-of-calling:java.lang.String:equals
    //#unanalyzed(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): Effects-of-calling:java.util.Map:remove
    //#unanalyzed(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): Effects-of-calling:java.util.Map:keySet
    //#unanalyzed(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): Effects-of-calling:com.dmdirc.util.ConfigFile:getKeyDomain
    //#unanalyzed(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): Effects-of-calling:java.util.HashMap
    //#unanalyzed(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): Effects-of-calling:java.util.List:remove
    //#unanalyzed(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): Effects-of-calling:com.dmdirc.util.ConfigFile:isKeyDomain
    //#unanalyzed(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): Effects-of-calling:java.util.HashSet
    //#unanalyzed(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): Effects-of-calling:hasOption
    //#unanalyzed(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): Effects-of-calling:getOption
    //#unanalyzed(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): Effects-of-calling:java.util.logging.Logger:finer
    //#unanalyzed(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): Effects-of-calling:java.util.List:iterator
    //#unanalyzed(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): Effects-of-calling:getSources
    //#unanalyzed(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): Effects-of-calling:addListener
    //#unanalyzed(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): Effects-of-calling:com.dmdirc.config.ConfigSource
    //#unanalyzed(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): Effects-of-calling:com.dmdirc.util.MapList
    //#unanalyzed(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): Effects-of-calling:addConfigManager
    //#unanalyzed(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): Effects-of-calling:com.dmdirc.util.MapList:containsKey
    //#unanalyzed(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): Effects-of-calling:com.dmdirc.util.MapList:get
    //#unanalyzed(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): Effects-of-calling:java.util.List:addAll
    //#unanalyzed(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): Effects-of-calling:getDomains
    //#unanalyzed(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): Effects-of-calling:java.util.List:contains
    //#unanalyzed(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): Effects-of-calling:java.util.Set:iterator
    //#unanalyzed(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): Effects-of-calling:getOptions
    //#unanalyzed(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): Effects-of-calling:equals
    //#unanalyzed(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): Effects-of-calling:removeListener
    //#unanalyzed(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): Effects-of-calling:java.lang.Integer:intValue
    //#unanalyzed(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): Effects-of-calling:java.lang.Integer:valueOf
    //#unanalyzed(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): Effects-of-calling:java.util.Map:put
    //#unanalyzed(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): Effects-of-calling:java.lang.IllegalArgumentException
    //#unanalyzed(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): Effects-of-calling:com.dmdirc.logger.Logger:assertTrue
    //#unanalyzed(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): Effects-of-calling:getTarget
    //#unanalyzed(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): Effects-of-calling:com.dmdirc.config.ConfigTarget$TYPE:ordinal
    //#unanalyzed(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): Effects-of-calling:java.lang.String:equalsIgnoreCase
    //#unanalyzed(void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)): Effects-of-calling:java.util.Collections:sort

        this.file = configFile;
        this.file.setAutomake(true);
    //#Identity.java:151: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.util.ConfigFile:setAutomake(bool)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.config.Identity
    //#    method: void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)
    //#    unanalyzed callee: void com.dmdirc.util.ConfigFile:setAutomake(bool)
        this.myTarget = target;

        if (myTarget.getType() == ConfigTarget.TYPE.PROFILE) {
            migrateProfile();
    //#Identity.java:155: ?precondition failure
    //#    com/dmdirc/config/Identity.migrateProfile: (soft) init'ed(this.globalConfig)
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.config.Identity
    //#    method: void com.dmdirc.config.Identity(ConfigFile, ConfigTarget)
    //#    basic block: bb_2
    //#    assertion: (soft) init'ed(undefined)
    //#    callee: void com/dmdirc/config/Identity.migrateProfile()
    //#    callee assertion: (soft) init'ed(this.globalConfig)
    //#    callee file: Identity.java
    //#    callee precondition index: [4]
    //#    callee srcpos: 303
    //#    VN: undefined
    //#    Expected: Univ-VN-Set
    //#    Bad: {Invalid}
    //#    Attribs:  Ptr  Soft  Bad only invalid
        }
    }
    //#Identity.java:157: end of method: void com.dmdirc.config.Identity.com.dmdirc.config.Identity(ConfigFile, ConfigTarget)

    /**
     * Determines and returns the target for this identity from its contents.
     *
     * @param forceDefault Whether to force this to be a default identity
     * @return A ConfigTarget for this identity
     * @throws InvalidIdentityFileException If the identity isn't valid
     */
    private ConfigTarget getTarget(final boolean forceDefault)
            throws InvalidIdentityFileException {
        final ConfigTarget target = new ConfigTarget();
    //#Identity.java:168: method: ConfigTarget com.dmdirc.config.Identity.getTarget(bool)
    //#input(ConfigTarget getTarget(bool)): "."._tainted
    //#input(ConfigTarget getTarget(bool)): "Config option not found: "._tainted
    //#input(ConfigTarget getTarget(bool)): "order"._tainted
    //#input(ConfigTarget getTarget(bool)): DOMAIN
    //#input(ConfigTarget getTarget(bool)): PROFILE_DOMAIN
    //#input(ConfigTarget getTarget(bool)): __Descendant_Table[com/dmdirc/config/Identity]
    //#input(ConfigTarget getTarget(bool)): __Descendant_Table[others]
    //#input(ConfigTarget getTarget(bool)): __Dispatch_Table.getOption(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
    //#input(ConfigTarget getTarget(bool)): __Dispatch_Table.getOptionInt(Ljava/lang/String;Ljava/lang/String;)I
    //#input(ConfigTarget getTarget(bool)): __Dispatch_Table.hasOption(Ljava/lang/String;Ljava/lang/String;)Z
    //#input(ConfigTarget getTarget(bool)): __Dispatch_Table.isProfile()Z
    //#input(ConfigTarget getTarget(bool)): com/dmdirc/config/ConfigManager.__Dispatch_Table.getOption(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
    //#input(ConfigTarget getTarget(bool)): com/dmdirc/config/ConfigManager.stats
    //#input(ConfigTarget getTarget(bool)): com/dmdirc/config/ConfigSource.__Descendant_Table[com/dmdirc/config/ConfigManager]
    //#input(ConfigTarget getTarget(bool)): com/dmdirc/config/ConfigSource.__Descendant_Table[com/dmdirc/config/ConfigSource]
    //#input(ConfigTarget getTarget(bool)): com/dmdirc/config/ConfigSource.__Descendant_Table[com/dmdirc/config/Identity]
    //#input(ConfigTarget getTarget(bool)): com/dmdirc/config/ConfigSource.__Descendant_Table[others]
    //#input(ConfigTarget getTarget(bool)): com/dmdirc/config/ConfigSource.__Dispatch_Table.getOption(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
    //#input(ConfigTarget getTarget(bool)): com/dmdirc/config/ConfigTarget$TYPE.CHANNEL
    //#input(ConfigTarget getTarget(bool)): com/dmdirc/config/ConfigTarget$TYPE.GLOBAL
    //#input(ConfigTarget getTarget(bool)): com/dmdirc/config/ConfigTarget$TYPE.GLOBALDEFAULT
    //#input(ConfigTarget getTarget(bool)): com/dmdirc/config/ConfigTarget$TYPE.IRCD
    //#input(ConfigTarget getTarget(bool)): com/dmdirc/config/ConfigTarget$TYPE.NETWORK
    //#input(ConfigTarget getTarget(bool)): com/dmdirc/config/ConfigTarget$TYPE.PROFILE
    //#input(ConfigTarget getTarget(bool)): com/dmdirc/config/ConfigTarget$TYPE.SERVER
    //#input(ConfigTarget getTarget(bool)): com/dmdirc/config/ConfigTarget.__Descendant_Table[com/dmdirc/config/ConfigTarget]
    //#input(ConfigTarget getTarget(bool)): com/dmdirc/config/ConfigTarget.__Dispatch_Table.setChannel(Ljava/lang/String;)V
    //#input(ConfigTarget getTarget(bool)): com/dmdirc/config/ConfigTarget.__Dispatch_Table.setGlobal()V
    //#input(ConfigTarget getTarget(bool)): com/dmdirc/config/ConfigTarget.__Dispatch_Table.setGlobalDefault()V
    //#input(ConfigTarget getTarget(bool)): com/dmdirc/config/ConfigTarget.__Dispatch_Table.setIrcd(Ljava/lang/String;)V
    //#input(ConfigTarget getTarget(bool)): com/dmdirc/config/ConfigTarget.__Dispatch_Table.setNetwork(Ljava/lang/String;)V
    //#input(ConfigTarget getTarget(bool)): com/dmdirc/config/ConfigTarget.__Dispatch_Table.setOrder(I)V
    //#input(ConfigTarget getTarget(bool)): com/dmdirc/config/ConfigTarget.__Dispatch_Table.setProfile()V
    //#input(ConfigTarget getTarget(bool)): com/dmdirc/config/ConfigTarget.__Dispatch_Table.setServer(Ljava/lang/String;)V
    //#input(ConfigTarget getTarget(bool)): forceDefault
    //#input(ConfigTarget getTarget(bool)): this
    //#input(ConfigTarget getTarget(bool)): this.__Tag
    //#input(ConfigTarget getTarget(bool)): this.file
    //#input(ConfigTarget getTarget(bool)): this.sources
    //#output(ConfigTarget getTarget(bool)): new ConfigTarget(getTarget#1) num objects
    //#output(ConfigTarget getTarget(bool)): return_value.__Tag
    //#output(ConfigTarget getTarget(bool)): return_value.data
    //#output(ConfigTarget getTarget(bool)): return_value.order
    //#output(ConfigTarget getTarget(bool)): return_value.type
    //#output(ConfigTarget getTarget(bool)): return_value
    //#new obj(ConfigTarget getTarget(bool)): new ConfigTarget(getTarget#1)
    //#pre[4] (ConfigTarget getTarget(bool)): this.__Tag == com/dmdirc/config/Identity
    //#pre[5] (ConfigTarget getTarget(bool)): this.file != null
    //#presumption(ConfigTarget getTarget(bool)): com.dmdirc.util.ConfigFile:isKeyDomain(...)@330 == 1
    //#presumption(ConfigTarget getTarget(bool)): java.util.Map:containsKey(...)@330 == 1
    //#post(ConfigTarget getTarget(bool)): return_value == &new ConfigTarget(getTarget#1)
    //#post(ConfigTarget getTarget(bool)): new ConfigTarget(getTarget#1) num objects == 1
    //#post(ConfigTarget getTarget(bool)): return_value.__Tag == com/dmdirc/config/ConfigTarget
    //#post(ConfigTarget getTarget(bool)): init'ed(return_value.data)
    //#post(ConfigTarget getTarget(bool)): init'ed(return_value.order)
    //#post(ConfigTarget getTarget(bool)): return_value.type in Addr_Set{&com.dmdirc.config.ConfigTarget$TYPE__static_init.new ConfigTarget$TYPE(ConfigTarget$TYPE__static_init#2),&com.dmdirc.config.ConfigTarget$TYPE__static_init.new ConfigTarget$TYPE(ConfigTarget$TYPE__static_init#4),&com.dmdirc.config.ConfigTarget$TYPE__static_init.new ConfigTarget$TYPE(ConfigTarget$TYPE__static_init#1),&com.dmdirc.config.ConfigTarget$TYPE__static_init.new ConfigTarget$TYPE(ConfigTarget$TYPE__static_init#8),&com.dmdirc.config.ConfigTarget$TYPE__static_init.new ConfigTarget$TYPE(ConfigTarget$TYPE__static_init#7),&com.dmdirc.config.ConfigTarget$TYPE__static_init.new ConfigTarget$TYPE(ConfigTarget$TYPE__static_init#6),&com.dmdirc.config.ConfigTarget$TYPE__static_init.new ConfigTarget$TYPE(ConfigTarget$TYPE__static_init#5)}
    //#unanalyzed(ConfigTarget getTarget(bool)): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(ConfigTarget getTarget(bool)): Effects-of-calling:java.util.Map:get
    //#unanalyzed(ConfigTarget getTarget(bool)): Effects-of-calling:com.dmdirc.util.ConfigFile:getKeyDomain
    //#unanalyzed(ConfigTarget getTarget(bool)): Effects-of-calling:com.dmdirc.util.ConfigFile:isKeyDomain
    //#unanalyzed(ConfigTarget getTarget(bool)): Effects-of-calling:hasOption
    //#unanalyzed(ConfigTarget getTarget(bool)): Effects-of-calling:getOption
    //#unanalyzed(ConfigTarget getTarget(bool)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(ConfigTarget getTarget(bool)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(ConfigTarget getTarget(bool)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(ConfigTarget getTarget(bool)): Effects-of-calling:java.util.List:iterator
    //#unanalyzed(ConfigTarget getTarget(bool)): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(ConfigTarget getTarget(bool)): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(ConfigTarget getTarget(bool)): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(ConfigTarget getTarget(bool)): Effects-of-calling:java.lang.Integer:intValue
    //#unanalyzed(ConfigTarget getTarget(bool)): Effects-of-calling:java.lang.Integer:valueOf
    //#unanalyzed(ConfigTarget getTarget(bool)): Effects-of-calling:java.util.Map:put
    //#unanalyzed(ConfigTarget getTarget(bool)): Effects-of-calling:java.lang.IllegalArgumentException
    //#unanalyzed(ConfigTarget getTarget(bool)): Effects-of-calling:java.lang.String:trim
    //#unanalyzed(ConfigTarget getTarget(bool)): Effects-of-calling:java.lang.Integer:parseInt
    //#test_vector(ConfigTarget getTarget(bool)): forceDefault: {0}, {1}

        if (hasOption(DOMAIN, "ircd")) {
            target.setIrcd(getOption(DOMAIN, "ircd"));
        } else if (hasOption(DOMAIN, "network")) {
            target.setNetwork(getOption(DOMAIN, "network"));
        } else if (hasOption(DOMAIN, "server")) {
            target.setServer(getOption(DOMAIN, "server"));
        } else if (hasOption(DOMAIN, "channel")) {
            target.setChannel(getOption(DOMAIN, "channel"));
        } else if (hasOption(DOMAIN, "globaldefault")) {
            target.setGlobalDefault();
        } else if (hasOption(DOMAIN, "global") || (forceDefault && !isProfile())) {
            target.setGlobal();
        } else if (isProfile()) {
            target.setProfile();
        } else {
            throw new InvalidIdentityFileException("No target and no profile");
        }

        if (hasOption(DOMAIN, "order")) {
            target.setOrder(getOptionInt(DOMAIN, "order"));
        }

        return target;
    //#Identity.java:192: end of method: ConfigTarget com.dmdirc.config.Identity.getTarget(bool)
    }

    /**
     * Initialises this identity from a file.
     *
     * @param forceDefault Whether to force this to be a default identity
     * @param stream The stream to load properties from if needed (or null)
     * @param file The file to load this identity from (or null)
     * @throws InvalidIdentityFileException if the identity file is invalid
     * @throws IOException On I/O exception when reading the identity
     */
    private void initFile(final boolean forceDefault, final InputStream stream)
            throws InvalidIdentityFileException, IOException {
        try {
            this.file.read();
    //#Identity.java:207: method: void com.dmdirc.config.Identity.initFile(bool, InputStream)
    //#Identity.java:207: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.util.ConfigFile:read()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.config.Identity
    //#    method: void initFile(bool, InputStream)
    //#    unanalyzed callee: void com.dmdirc.util.ConfigFile:read()
    //#input(void initFile(bool, InputStream)): DOMAIN
    //#input(void initFile(bool, InputStream)): __Descendant_Table[com/dmdirc/config/Identity]
    //#input(void initFile(bool, InputStream)): __Descendant_Table[others]
    //#input(void initFile(bool, InputStream)): __Dispatch_Table.hasOption(Ljava/lang/String;Ljava/lang/String;)Z
    //#input(void initFile(bool, InputStream)): forceDefault
    //#input(void initFile(bool, InputStream)): this
    //#input(void initFile(bool, InputStream)): this.__Tag
    //#input(void initFile(bool, InputStream)): this.file
    //#pre[3] (void initFile(bool, InputStream)): this.__Tag == com/dmdirc/config/Identity
    //#pre[4] (void initFile(bool, InputStream)): this.file != null
    //#pre[1] (void initFile(bool, InputStream)): (soft) forceDefault == 1
    //#unanalyzed(void initFile(bool, InputStream)): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(void initFile(bool, InputStream)): Effects-of-calling:com.dmdirc.util.ConfigFile:getKeyDomain
    //#unanalyzed(void initFile(bool, InputStream)): Effects-of-calling:com.dmdirc.util.ConfigFile:isKeyDomain
    //#unanalyzed(void initFile(bool, InputStream)): Effects-of-calling:java.lang.Exception
        } catch (InvalidConfigFileException ex) {
            throw new InvalidIdentityFileException(ex);
        }

        if (!hasOption(DOMAIN, "name") && !forceDefault) {
            throw new InvalidIdentityFileException("No name specified");
        }
    }
    //#Identity.java:215: end of method: void com.dmdirc.config.Identity.initFile(bool, InputStream)

    /**
     * Attempts to reload this identity from disk. If this identity has been
     * modified (i.e., {@code needSave} is true), then this method silently
     * returns straight away. All relevant ConfigChangeListeners are fired for
     * new, altered and deleted properties. The target of the identity will not
     * be changed by this method, even if it has changed on disk.
     *
     * @throws java.io.IOException On I/O exception when reading the identity
     * @throws InvalidConfigFileException if the config file is no longer valid
     */
    public void reload() throws IOException, InvalidConfigFileException {
        if (needSave) {
    //#Identity.java:228: method: void com.dmdirc.config.Identity.reload()
    //#input(void reload()): this
    //#input(void reload()): this.__Lock
    //#input(void reload()): this.file
    //#input(void reload()): this.listeners
    //#input(void reload()): this.needSave
    //#pre[4] (void reload()): init'ed(this.needSave)
    //#pre[2] (void reload()): (soft) this.file != null
    //#presumption(void reload()): change.length@263 >= 2
    //#presumption(void reload()): com.dmdirc.util.ConfigFile:getKeyDomains(...)@235 != null
    //#presumption(void reload()): com.dmdirc.util.ConfigFile:getKeyDomains(...)@239 != null
    //#presumption(void reload()): java.util.Iterator:next(...)@239 != null
    //#presumption(void reload()): java.util.Iterator:next(...)@242 != null
    //#presumption(void reload()): java.util.Iterator:next(...)@263 != null
    //#presumption(void reload()): java.util.Map:entrySet(...)@239 != null
    //#presumption(void reload()): java.util.Map:entrySet(...)@242 != null
    //#presumption(void reload()): java.util.Map:get(...)@248 != null
    //#presumption(void reload()): java.util.Map:get(...)@248 != null
    //#presumption(void reload()): java.util.Map:get(...)@248 != null
    //#presumption(void reload()): java.util.Map:get(...)@251 != null
    //#presumption(void reload()): java.util.Map:get(...)@256 != null
    //#presumption(void reload()): java.util.Map:keySet(...)@256 != null
    //#presumption(void reload()): java.util.Map_Entry:getValue(...)@242 != null
    //#unanalyzed(void reload()): Effects-of-calling:java.util.ArrayList
    //#unanalyzed(void reload()): Effects-of-calling:java.util.ArrayList:iterator
    //#unanalyzed(void reload()): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(void reload()): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(void reload()): Effects-of-calling:com.dmdirc.interfaces.ConfigChangeListener:configChanged
    //#test_vector(void reload()): this.needSave: {0}, {1}
    //#test_vector(void reload()): java.lang.String:equals(...)@248: {1}, {0}
    //#test_vector(void reload()): java.util.Iterator:hasNext(...)@239: {1}, {0}
    //#test_vector(void reload()): java.util.Iterator:hasNext(...)@242: {0}, {1}
    //#test_vector(void reload()): java.util.Iterator:hasNext(...)@256: {0}, {1}
    //#test_vector(void reload()): java.util.Iterator:hasNext(...)@263: {0}, {1}
    //#test_vector(void reload()): java.util.Map:containsKey(...)@246: {1}, {0}
    //#test_vector(void reload()): java.util.Map:containsKey(...)@248: {0}, {1}
    //#test_vector(void reload()): java.util.Map:containsKey(...)@255: {0}, {1}
            return;
        }

        final List<String[]> changes = new LinkedList<String[]>();

        synchronized (this) {
            final Map<String, Map<String, String>> oldProps = file.getKeyDomains();
    //#Identity.java:235: Warning: method not available - call not analyzed
    //#    call on Map com.dmdirc.util.ConfigFile:getKeyDomains()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.config.Identity
    //#    method: void reload()
    //#    unanalyzed callee: Map com.dmdirc.util.ConfigFile:getKeyDomains()

            file.read();
    //#Identity.java:237: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.util.ConfigFile:read()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.config.Identity
    //#    method: void reload()
    //#    unanalyzed callee: void com.dmdirc.util.ConfigFile:read()

            for (Map.Entry<String, Map<String, String>> entry : file.getKeyDomains().entrySet()) {
    //#Identity.java:239: Warning: method not available - call not analyzed
    //#    call on Map com.dmdirc.util.ConfigFile:getKeyDomains()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.config.Identity
    //#    method: void reload()
    //#    unanalyzed callee: Map com.dmdirc.util.ConfigFile:getKeyDomains()
                final String domain = entry.getKey();

                for (Map.Entry<String, String> subentry : entry.getValue().entrySet()) {
                    final String key = subentry.getKey();
                    final String value = subentry.getValue();

                    if (!oldProps.containsKey(domain)) {
                        changes.add(new String[]{domain, key});
                    } else if (!oldProps.get(domain).containsKey(key)
                            || !oldProps.get(domain).get(key).equals(value)) {
                        changes.add(new String[]{domain, key});
                        oldProps.get(domain).remove(key);
                    }
                }

                if (oldProps.containsKey(domain)) {
                    for (String key : oldProps.get(domain).keySet()) {
                        changes.add(new String[]{domain, key});
                    }
                }
            }
        }

        for (String[] change : changes) {
            fireSettingChange(change[0], change[1]);
        }
    }
    //#Identity.java:266: end of method: void com.dmdirc.config.Identity.reload()

    /**
     * Fires the config changed listener for the specified option after this
     * identity is reloaded.
     *
     * @param domain The domain of the option that's changed
     * @param key The key of the option that's changed
     * @since 0.6.3m1
     */
    private void fireSettingChange(final String domain, final String key) {
        for (ConfigChangeListener listener : new ArrayList<ConfigChangeListener>(listeners)) {
    //#Identity.java:277: method: void com.dmdirc.config.Identity.fireSettingChange(String, String)
    //#input(void fireSettingChange(String, String)): domain
    //#input(void fireSettingChange(String, String)): key
    //#input(void fireSettingChange(String, String)): this
    //#input(void fireSettingChange(String, String)): this.listeners
    //#presumption(void fireSettingChange(String, String)): java.util.ArrayList:iterator(...)@277 != null
    //#presumption(void fireSettingChange(String, String)): java.util.Iterator:next(...)@277 != null
    //#test_vector(void fireSettingChange(String, String)): java.util.Iterator:hasNext(...)@277: {0}, {1}
            listener.configChanged(domain, key);
    //#Identity.java:278: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.interfaces.ConfigChangeListener:configChanged(String, String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.config.Identity
    //#    method: void fireSettingChange(String, String)
    //#    unanalyzed callee: void com.dmdirc.interfaces.ConfigChangeListener:configChanged(String, String)
        }
    }
    //#Identity.java:280: end of method: void com.dmdirc.config.Identity.fireSettingChange(String, String)

    /**
     * Returns the name of this identity.
     *
     * @return The name of this identity
     */
    public String getName() {
        if (hasOption(DOMAIN, "name")) {
    //#Identity.java:288: method: String com.dmdirc.config.Identity.getName()
    //#input(String getName()): DOMAIN
    //#input(String getName()): __Descendant_Table[com/dmdirc/config/Identity]
    //#input(String getName()): __Descendant_Table[others]
    //#input(String getName()): __Dispatch_Table.getOption(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
    //#input(String getName()): __Dispatch_Table.hasOption(Ljava/lang/String;Ljava/lang/String;)Z
    //#input(String getName()): this
    //#input(String getName()): this.__Tag
    //#input(String getName()): this.file
    //#output(String getName()): return_value
    //#pre[3] (String getName()): this.__Tag == com/dmdirc/config/Identity
    //#pre[4] (String getName()): this.file != null
    //#post(String getName()): init'ed(return_value)
    //#unanalyzed(String getName()): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(String getName()): Effects-of-calling:java.util.Map:get
    //#unanalyzed(String getName()): Effects-of-calling:com.dmdirc.util.ConfigFile:getKeyDomain
    //#unanalyzed(String getName()): Effects-of-calling:com.dmdirc.util.ConfigFile:isKeyDomain
            return getOption(DOMAIN, "name");
        } else {
            return "Unnamed";
    //#Identity.java:291: end of method: String com.dmdirc.config.Identity.getName()
        }
    }

    /**
     * Checks if this profile needs migrating from the old method of
     * storing nicknames (profile.nickname + profile.altnicks) to the new
     * method (profile.nicknames), and performs the migration if needed.
     *
     * @since 0.6.3m1
     */
    protected void migrateProfile() {
        if (hasOption(PROFILE_DOMAIN, "nickname")) {
    //#Identity.java:303: method: void com.dmdirc.config.Identity.migrateProfile()
    //#input(void migrateProfile()): " to "._tainted
    //#input(void migrateProfile()): ""._tainted
    //#input(void migrateProfile()): "&#10;"._tainted
    //#input(void migrateProfile()): "."._tainted
    //#input(void migrateProfile()): ": setting "._tainted
    //#input(void migrateProfile()): "<Unknown>"._tainted
    //#input(void migrateProfile()): "@"._tainted
    //#input(void migrateProfile()): "Config option not found: "._tainted
    //#input(void migrateProfile()): "Unnamed"._tainted
    //#input(void migrateProfile()): "nicknames"._tainted
    //#input(void migrateProfile()): DOMAIN
    //#input(void migrateProfile()): LOGGER
    //#input(void migrateProfile()): PROFILE_DOMAIN
    //#input(void migrateProfile()): __Descendant_Table[com/dmdirc/config/Identity]
    //#input(void migrateProfile()): __Descendant_Table[others]
    //#input(void migrateProfile()): __Dispatch_Table.addListener(Lcom/dmdirc/interfaces/ConfigChangeListener;)V
    //#input(void migrateProfile()): __Dispatch_Table.equals(Ljava/lang/Object;)Z
    //#input(void migrateProfile()): __Dispatch_Table.getDomains()Ljava/util/Set;
    //#input(void migrateProfile()): __Dispatch_Table.getName()Ljava/lang/String;
    //#input(void migrateProfile()): __Dispatch_Table.getOption(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
    //#input(void migrateProfile()): __Dispatch_Table.getOptions(Ljava/lang/String;)Ljava/util/Map;
    //#input(void migrateProfile()): __Dispatch_Table.getTarget()Lcom/dmdirc/config/ConfigTarget;
    //#input(void migrateProfile()): __Dispatch_Table.hasOption(Ljava/lang/String;Ljava/lang/String;)Z
    //#input(void migrateProfile()): __Dispatch_Table.removeListener(Lcom/dmdirc/interfaces/ConfigChangeListener;)V
    //#input(void migrateProfile()): __Dispatch_Table.setOption(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
    //#input(void migrateProfile()): __Dispatch_Table.unsetOption(Ljava/lang/String;Ljava/lang/String;)V
    //#input(void migrateProfile()): com.dmdirc.config.ConfigManager$1__static_init.new int[](ConfigManager$1__static_init#1).length
    //#input(void migrateProfile()): com.dmdirc.config.ConfigManager$1__static_init.new int[](ConfigManager$1__static_init#1)[0..4_294_967_295]
    //#input(void migrateProfile()): com/dmdirc/config/ConfigManager$1.$SwitchMap$com$dmdirc$config$ConfigTarget$TYPE
    //#input(void migrateProfile()): com/dmdirc/config/ConfigManager.__Descendant_Table[com/dmdirc/config/ConfigManager]
    //#input(void migrateProfile()): com/dmdirc/config/ConfigManager.__Descendant_Table[others]
    //#input(void migrateProfile()): com/dmdirc/config/ConfigManager.__Dispatch_Table.configChanged(Ljava/lang/String;Ljava/lang/String;)V
    //#input(void migrateProfile()): com/dmdirc/config/ConfigManager.__Dispatch_Table.getOption(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
    //#input(void migrateProfile()): com/dmdirc/config/ConfigManager.__Dispatch_Table.getScope(Ljava/lang/String;Ljava/lang/String;)Lcom/dmdirc/config/Identity;
    //#input(void migrateProfile()): com/dmdirc/config/ConfigManager.__Dispatch_Table.hasOption(Ljava/lang/String;Ljava/lang/String;)Z
    //#input(void migrateProfile()): com/dmdirc/config/ConfigManager.__Dispatch_Table.identityApplies(Lcom/dmdirc/config/Identity;)Z
    //#input(void migrateProfile()): com/dmdirc/config/ConfigManager.__Dispatch_Table.removeIdentity(Lcom/dmdirc/config/Identity;)V
    //#input(void migrateProfile()): com/dmdirc/config/ConfigManager.stats
    //#input(void migrateProfile()): com/dmdirc/config/ConfigTarget$TYPE.GLOBAL
    //#input(void migrateProfile()): com/dmdirc/config/ConfigTarget.__Descendant_Table[com/dmdirc/config/ConfigTarget]
    //#input(void migrateProfile()): com/dmdirc/config/ConfigTarget.__Descendant_Table[others]
    //#input(void migrateProfile()): com/dmdirc/config/ConfigTarget.__Dispatch_Table.getData()Ljava/lang/String;
    //#input(void migrateProfile()): com/dmdirc/config/ConfigTarget.__Dispatch_Table.getType()Lcom/dmdirc/config/ConfigTarget$TYPE;
    //#input(void migrateProfile()): com/dmdirc/config/IdentityManager.identities
    //#input(void migrateProfile()): com/dmdirc/config/IdentityManager.managers
    //#input(void migrateProfile()): this
    //#input(void migrateProfile()): this.__Tag
    //#input(void migrateProfile()): this.file
    //#input(void migrateProfile()): this.globalConfig
    //#input(void migrateProfile()): this.globalConfig.__Tag
    //#input(void migrateProfile()): this.globalConfig.listeners
    //#input(void migrateProfile()): this.globalConfig.sources
    //#input(void migrateProfile()): this.globalConfig.sources.__Lock
    //#input(void migrateProfile()): this.listeners
    //#input(void migrateProfile()): this.myTarget
    //#input(void migrateProfile()): this.myTarget.__Tag
    //#input(void migrateProfile()): this.myTarget.type
    //#output(void migrateProfile()): java.lang.StringBuilder:toString(...)._tainted
    //#output(void migrateProfile()): new ArrayList(getSources#1) num objects
    //#output(void migrateProfile()): new ArrayList(getSources#1).__Lock
    //#output(void migrateProfile()): new ConfigManager(setOption#2) num objects
    //#output(void migrateProfile()): new ConfigManager(setOption#2).__Tag
    //#output(void migrateProfile()): new ConfigManager(setOption#2).channel
    //#output(void migrateProfile()): new ConfigManager(setOption#2).ircd
    //#output(void migrateProfile()): new ConfigManager(setOption#2).listeners
    //#output(void migrateProfile()): new ConfigManager(setOption#2).network
    //#output(void migrateProfile()): new ConfigManager(setOption#2).server
    //#output(void migrateProfile()): new ConfigManager(setOption#2).sources
    //#output(void migrateProfile()): new MapList(ConfigManager#1) num objects
    //#output(void migrateProfile()): this.globalConfig
    //#output(void migrateProfile()): this.needSave
    //#new obj(void migrateProfile()): java.lang.StringBuilder:toString(...)
    //#new obj(void migrateProfile()): new ArrayList(getSources#1)
    //#new obj(void migrateProfile()): new ConfigManager(setOption#2)
    //#new obj(void migrateProfile()): new MapList(ConfigManager#1)
    //#pre[8] (void migrateProfile()): this.__Tag == com/dmdirc/config/Identity
    //#pre[9] (void migrateProfile()): this.file != null
    //#pre[1] (void migrateProfile()): (soft) init'ed(com.dmdirc.config.ConfigManager$1__static_init.new int[](ConfigManager$1__static_init#1)[0..4_294_967_295])
    //#pre[4] (void migrateProfile()): (soft) init'ed(this.globalConfig)
    //#pre[10] (void migrateProfile()): (soft) this.listeners != null
    //#pre[11] (void migrateProfile()): (soft) this.myTarget != null
    //#pre[12] (void migrateProfile()): (soft) this.myTarget.__Tag == com/dmdirc/config/ConfigTarget
    //#pre[13] (void migrateProfile()): (soft) init'ed(this.myTarget.type)
    //#post(void migrateProfile()): java.lang.StringBuilder:toString(...)._tainted == 0
    //#post(void migrateProfile()): this.globalConfig == One-of{old this.globalConfig, &new ConfigManager(setOption#2)}
    //#post(void migrateProfile()): init'ed(this.globalConfig)
    //#post(void migrateProfile()): possibly_updated(this.needSave)
    //#post(void migrateProfile()): new ArrayList(getSources#1) num objects <= 1
    //#post(void migrateProfile()): init'ed(new ArrayList(getSources#1).__Lock)
    //#post(void migrateProfile()): new ConfigManager(setOption#2) num objects <= 1
    //#post(void migrateProfile()): init'ed(new ConfigManager(setOption#2).__Tag)
    //#post(void migrateProfile()): init'ed(new ConfigManager(setOption#2).channel)
    //#post(void migrateProfile()): init'ed(new ConfigManager(setOption#2).ircd)
    //#post(void migrateProfile()): init'ed(new ConfigManager(setOption#2).listeners)
    //#post(void migrateProfile()): init'ed(new ConfigManager(setOption#2).network)
    //#post(void migrateProfile()): init'ed(new ConfigManager(setOption#2).server)
    //#post(void migrateProfile()): init'ed(new ConfigManager(setOption#2).sources)
    //#post(void migrateProfile()): new MapList(ConfigManager#1) num objects <= 1
    //#unanalyzed(void migrateProfile()): Effects-of-calling:java.util.ArrayList
    //#unanalyzed(void migrateProfile()): Effects-of-calling:java.util.ArrayList:iterator
    //#unanalyzed(void migrateProfile()): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(void migrateProfile()): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(void migrateProfile()): Effects-of-calling:com.dmdirc.interfaces.ConfigChangeListener:configChanged
    //#unanalyzed(void migrateProfile()): Effects-of-calling:com.dmdirc.util.ConfigFile:getKeyDomains
    //#unanalyzed(void migrateProfile()): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(void migrateProfile()): Effects-of-calling:java.util.List:add
    //#unanalyzed(void migrateProfile()): Effects-of-calling:java.util.Map:get
    //#unanalyzed(void migrateProfile()): Effects-of-calling:java.lang.String:equals
    //#unanalyzed(void migrateProfile()): Effects-of-calling:java.util.Map:remove
    //#unanalyzed(void migrateProfile()): Effects-of-calling:java.util.Map:keySet
    //#unanalyzed(void migrateProfile()): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(void migrateProfile()): Effects-of-calling:com.dmdirc.util.ConfigFile:getKeyDomain
    //#unanalyzed(void migrateProfile()): Effects-of-calling:java.util.HashMap
    //#unanalyzed(void migrateProfile()): Effects-of-calling:java.util.List:remove
    //#unanalyzed(void migrateProfile()): Effects-of-calling:com.dmdirc.util.ConfigFile:isKeyDomain
    //#unanalyzed(void migrateProfile()): Effects-of-calling:java.util.HashSet
    //#unanalyzed(void migrateProfile()): Effects-of-calling:hasOption
    //#unanalyzed(void migrateProfile()): Effects-of-calling:getOption
    //#unanalyzed(void migrateProfile()): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void migrateProfile()): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void migrateProfile()): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void migrateProfile()): Effects-of-calling:java.util.logging.Logger:finer
    //#unanalyzed(void migrateProfile()): Effects-of-calling:java.util.List:iterator
    //#unanalyzed(void migrateProfile()): Effects-of-calling:getSources
    //#unanalyzed(void migrateProfile()): Effects-of-calling:addListener
    //#unanalyzed(void migrateProfile()): Effects-of-calling:com.dmdirc.config.ConfigSource
    //#unanalyzed(void migrateProfile()): Effects-of-calling:com.dmdirc.util.MapList
    //#unanalyzed(void migrateProfile()): Effects-of-calling:addConfigManager
    //#unanalyzed(void migrateProfile()): Effects-of-calling:com.dmdirc.util.MapList:containsKey
    //#unanalyzed(void migrateProfile()): Effects-of-calling:com.dmdirc.util.MapList:get
    //#unanalyzed(void migrateProfile()): Effects-of-calling:java.util.List:addAll
    //#unanalyzed(void migrateProfile()): Effects-of-calling:getDomains
    //#unanalyzed(void migrateProfile()): Effects-of-calling:java.util.List:contains
    //#unanalyzed(void migrateProfile()): Effects-of-calling:java.util.Set:iterator
    //#unanalyzed(void migrateProfile()): Effects-of-calling:getOptions
    //#unanalyzed(void migrateProfile()): Effects-of-calling:equals
    //#unanalyzed(void migrateProfile()): Effects-of-calling:removeListener
    //#unanalyzed(void migrateProfile()): Effects-of-calling:java.lang.Integer:intValue
    //#unanalyzed(void migrateProfile()): Effects-of-calling:java.lang.Integer:valueOf
    //#unanalyzed(void migrateProfile()): Effects-of-calling:java.util.Map:put
    //#unanalyzed(void migrateProfile()): Effects-of-calling:java.lang.IllegalArgumentException
    //#unanalyzed(void migrateProfile()): Effects-of-calling:com.dmdirc.logger.Logger:assertTrue
    //#unanalyzed(void migrateProfile()): Effects-of-calling:getTarget
    //#unanalyzed(void migrateProfile()): Effects-of-calling:com.dmdirc.config.ConfigTarget$TYPE:ordinal
    //#unanalyzed(void migrateProfile()): Effects-of-calling:java.lang.String:equalsIgnoreCase
    //#unanalyzed(void migrateProfile()): Effects-of-calling:java.util.Collections:sort
            // Migrate

            setOption(PROFILE_DOMAIN, "nicknames", getOption(PROFILE_DOMAIN, "nickname")
                    + (hasOption(PROFILE_DOMAIN, "altnicks") ? "\n"
                    + getOption(PROFILE_DOMAIN, "altnicks") : ""));
            unsetOption(PROFILE_DOMAIN, "nickname");
            unsetOption(PROFILE_DOMAIN, "altnicks");
        }
    }
    //#Identity.java:312: end of method: void com.dmdirc.config.Identity.migrateProfile()

    /**
     * Determines whether this identity can be used as a profile when
     * connecting to a server. Profiles are identities that can supply
     * nick, ident, real name, etc.
     *
     * @return True iff this identity can be used as a profile
     */
    public boolean isProfile() {
        return (hasOption(PROFILE_DOMAIN, "nicknames")
    //#Identity.java:322: method: bool com.dmdirc.config.Identity.isProfile()
    //#input(bool isProfile()): PROFILE_DOMAIN
    //#input(bool isProfile()): __Descendant_Table[com/dmdirc/config/Identity]
    //#input(bool isProfile()): __Descendant_Table[others]
    //#input(bool isProfile()): __Dispatch_Table.hasOption(Ljava/lang/String;Ljava/lang/String;)Z
    //#input(bool isProfile()): this
    //#input(bool isProfile()): this.__Tag
    //#input(bool isProfile()): this.file
    //#output(bool isProfile()): return_value
    //#pre[2] (bool isProfile()): this.__Tag == com/dmdirc/config/Identity
    //#pre[3] (bool isProfile()): this.file != null
    //#post(bool isProfile()): init'ed(return_value)
    //#unanalyzed(bool isProfile()): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(bool isProfile()): Effects-of-calling:com.dmdirc.util.ConfigFile:getKeyDomain
    //#unanalyzed(bool isProfile()): Effects-of-calling:com.dmdirc.util.ConfigFile:isKeyDomain
    //#Identity.java:322: end of method: bool com.dmdirc.config.Identity.isProfile()
                || hasOption(PROFILE_DOMAIN, "nickname"))
                && hasOption(PROFILE_DOMAIN, "realname");
    }

    /** {@inheritDoc} */
    @Override
    protected boolean hasOption(final String domain, final String option) {
        return file.isKeyDomain(domain) && file.getKeyDomain(domain).containsKey(option);
    //#Identity.java:330: method: bool com.dmdirc.config.Identity.hasOption(String, String)
    //#Identity.java:330: Warning: method not available - call not analyzed
    //#    call on bool com.dmdirc.util.ConfigFile:isKeyDomain(String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.config.Identity
    //#    method: bool hasOption(String, String)
    //#    unanalyzed callee: bool com.dmdirc.util.ConfigFile:isKeyDomain(String)
    //#Identity.java:330: Warning: method not available - call not analyzed
    //#    call on Map com.dmdirc.util.ConfigFile:getKeyDomain(String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.config.Identity
    //#    method: bool hasOption(String, String)
    //#    unanalyzed callee: Map com.dmdirc.util.ConfigFile:getKeyDomain(String)
    //#input(bool hasOption(String, String)): domain
    //#input(bool hasOption(String, String)): option
    //#input(bool hasOption(String, String)): this
    //#input(bool hasOption(String, String)): this.file
    //#output(bool hasOption(String, String)): return_value
    //#pre[4] (bool hasOption(String, String)): this.file != null
    //#presumption(bool hasOption(String, String)): com.dmdirc.util.ConfigFile:getKeyDomain(...)@330 != null
    //#post(bool hasOption(String, String)): init'ed(return_value)
    //#Identity.java:330: end of method: bool com.dmdirc.config.Identity.hasOption(String, String)
    }

    /** {@inheritDoc} */
    @Override
    public synchronized String getOption(final String domain, final String option) {
        return file.getKeyDomain(domain).get(option);
    //#Identity.java:336: method: String com.dmdirc.config.Identity.getOption(String, String)
    //#Identity.java:336: Warning: method not available - call not analyzed
    //#    call on Map com.dmdirc.util.ConfigFile:getKeyDomain(String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.config.Identity
    //#    method: String getOption(String, String)
    //#    unanalyzed callee: Map com.dmdirc.util.ConfigFile:getKeyDomain(String)
    //#input(String getOption(String, String)): domain
    //#input(String getOption(String, String)): option
    //#input(String getOption(String, String)): this
    //#input(String getOption(String, String)): this.__Lock
    //#input(String getOption(String, String)): this.file
    //#output(String getOption(String, String)): return_value
    //#pre[4] (String getOption(String, String)): this.file != null
    //#presumption(String getOption(String, String)): com.dmdirc.util.ConfigFile:getKeyDomain(...)@336 != null
    //#post(String getOption(String, String)): init'ed(return_value)
    //#Identity.java:336: end of method: String com.dmdirc.config.Identity.getOption(String, String)
    }

    /**
     * Sets the specified option in this identity to the specified value.
     *
     * @param domain The domain of the option
     * @param option The name of the option
     * @param value The new value for the option
     */
    public void setOption(final String domain, final String option,
            final String value) {
        String oldValue;

        synchronized (this) {
    //#Identity.java:350: method: void com.dmdirc.config.Identity.setOption(String, String, String)
    //#input(void setOption(String, String, String)): " to "._tainted
    //#input(void setOption(String, String, String)): ""._tainted
    //#input(void setOption(String, String, String)): "."._tainted
    //#input(void setOption(String, String, String)): ": setting "._tainted
    //#input(void setOption(String, String, String)): "<Unknown>"._tainted
    //#input(void setOption(String, String, String)): "@"._tainted
    //#input(void setOption(String, String, String)): "Config option not found: "._tainted
    //#input(void setOption(String, String, String)): "Unnamed"._tainted
    //#input(void setOption(String, String, String)): DOMAIN
    //#input(void setOption(String, String, String)): LOGGER
    //#input(void setOption(String, String, String)): __Descendant_Table[com/dmdirc/config/Identity]
    //#input(void setOption(String, String, String)): __Descendant_Table[others]
    //#input(void setOption(String, String, String)): __Dispatch_Table.addListener(Lcom/dmdirc/interfaces/ConfigChangeListener;)V
    //#input(void setOption(String, String, String)): __Dispatch_Table.equals(Ljava/lang/Object;)Z
    //#input(void setOption(String, String, String)): __Dispatch_Table.getDomains()Ljava/util/Set;
    //#input(void setOption(String, String, String)): __Dispatch_Table.getName()Ljava/lang/String;
    //#input(void setOption(String, String, String)): __Dispatch_Table.getOption(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
    //#input(void setOption(String, String, String)): __Dispatch_Table.getOptions(Ljava/lang/String;)Ljava/util/Map;
    //#input(void setOption(String, String, String)): __Dispatch_Table.getTarget()Lcom/dmdirc/config/ConfigTarget;
    //#input(void setOption(String, String, String)): __Dispatch_Table.hasOption(Ljava/lang/String;Ljava/lang/String;)Z
    //#input(void setOption(String, String, String)): __Dispatch_Table.removeListener(Lcom/dmdirc/interfaces/ConfigChangeListener;)V
    //#input(void setOption(String, String, String)): __Dispatch_Table.unsetOption(Ljava/lang/String;Ljava/lang/String;)V
    //#input(void setOption(String, String, String)): com.dmdirc.config.ConfigManager$1__static_init.new int[](ConfigManager$1__static_init#1).length
    //#input(void setOption(String, String, String)): com.dmdirc.config.ConfigManager$1__static_init.new int[](ConfigManager$1__static_init#1)[0..4_294_967_295]
    //#input(void setOption(String, String, String)): com/dmdirc/config/ConfigManager$1.$SwitchMap$com$dmdirc$config$ConfigTarget$TYPE
    //#input(void setOption(String, String, String)): com/dmdirc/config/ConfigManager.__Descendant_Table[com/dmdirc/config/ConfigManager]
    //#input(void setOption(String, String, String)): com/dmdirc/config/ConfigManager.__Descendant_Table[others]
    //#input(void setOption(String, String, String)): com/dmdirc/config/ConfigManager.__Dispatch_Table.configChanged(Ljava/lang/String;Ljava/lang/String;)V
    //#input(void setOption(String, String, String)): com/dmdirc/config/ConfigManager.__Dispatch_Table.getOption(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
    //#input(void setOption(String, String, String)): com/dmdirc/config/ConfigManager.__Dispatch_Table.getScope(Ljava/lang/String;Ljava/lang/String;)Lcom/dmdirc/config/Identity;
    //#input(void setOption(String, String, String)): com/dmdirc/config/ConfigManager.__Dispatch_Table.hasOption(Ljava/lang/String;Ljava/lang/String;)Z
    //#input(void setOption(String, String, String)): com/dmdirc/config/ConfigManager.__Dispatch_Table.identityApplies(Lcom/dmdirc/config/Identity;)Z
    //#input(void setOption(String, String, String)): com/dmdirc/config/ConfigManager.__Dispatch_Table.removeIdentity(Lcom/dmdirc/config/Identity;)V
    //#input(void setOption(String, String, String)): com/dmdirc/config/ConfigManager.stats
    //#input(void setOption(String, String, String)): com/dmdirc/config/ConfigTarget$TYPE.GLOBAL
    //#input(void setOption(String, String, String)): com/dmdirc/config/ConfigTarget.__Descendant_Table[com/dmdirc/config/ConfigTarget]
    //#input(void setOption(String, String, String)): com/dmdirc/config/ConfigTarget.__Descendant_Table[others]
    //#input(void setOption(String, String, String)): com/dmdirc/config/ConfigTarget.__Dispatch_Table.getData()Ljava/lang/String;
    //#input(void setOption(String, String, String)): com/dmdirc/config/ConfigTarget.__Dispatch_Table.getType()Lcom/dmdirc/config/ConfigTarget$TYPE;
    //#input(void setOption(String, String, String)): com/dmdirc/config/IdentityManager.identities
    //#input(void setOption(String, String, String)): com/dmdirc/config/IdentityManager.managers
    //#input(void setOption(String, String, String)): domain
    //#input(void setOption(String, String, String)): domain._tainted
    //#input(void setOption(String, String, String)): option
    //#input(void setOption(String, String, String)): option._tainted
    //#input(void setOption(String, String, String)): this
    //#input(void setOption(String, String, String)): this.__Tag
    //#input(void setOption(String, String, String)): this.file
    //#input(void setOption(String, String, String)): this.globalConfig
    //#input(void setOption(String, String, String)): this.globalConfig.__Tag
    //#input(void setOption(String, String, String)): this.globalConfig.listeners
    //#input(void setOption(String, String, String)): this.globalConfig.sources
    //#input(void setOption(String, String, String)): this.globalConfig.sources.__Lock
    //#input(void setOption(String, String, String)): this.listeners
    //#input(void setOption(String, String, String)): this.myTarget
    //#input(void setOption(String, String, String)): this.myTarget.__Tag
    //#input(void setOption(String, String, String)): this.myTarget.type
    //#input(void setOption(String, String, String)): value
    //#input(void setOption(String, String, String)): value._tainted
    //#output(void setOption(String, String, String)): java.lang.StringBuilder:toString(...)._tainted
    //#output(void setOption(String, String, String)): new ArrayList(getSources#1) num objects
    //#output(void setOption(String, String, String)): new ArrayList(getSources#1).__Lock
    //#output(void setOption(String, String, String)): new ConfigManager(setOption#2) num objects
    //#output(void setOption(String, String, String)): new ConfigManager(setOption#2).__Tag
    //#output(void setOption(String, String, String)): new ConfigManager(setOption#2).channel
    //#output(void setOption(String, String, String)): new ConfigManager(setOption#2).ircd
    //#output(void setOption(String, String, String)): new ConfigManager(setOption#2).listeners
    //#output(void setOption(String, String, String)): new ConfigManager(setOption#2).network
    //#output(void setOption(String, String, String)): new ConfigManager(setOption#2).server
    //#output(void setOption(String, String, String)): new ConfigManager(setOption#2).sources
    //#output(void setOption(String, String, String)): new MapList(ConfigManager#1) num objects
    //#output(void setOption(String, String, String)): this.globalConfig
    //#output(void setOption(String, String, String)): this.needSave
    //#new obj(void setOption(String, String, String)): java.lang.StringBuilder:toString(...)
    //#new obj(void setOption(String, String, String)): new ArrayList(getSources#1)
    //#new obj(void setOption(String, String, String)): new ConfigManager(setOption#2)
    //#new obj(void setOption(String, String, String)): new MapList(ConfigManager#1)
    //#pre[12] (void setOption(String, String, String)): this.__Tag == com/dmdirc/config/Identity
    //#pre[13] (void setOption(String, String, String)): this.file != null
    //#pre[15] (void setOption(String, String, String)): this.myTarget != null
    //#pre[16] (void setOption(String, String, String)): this.myTarget.__Tag == com/dmdirc/config/ConfigTarget
    //#pre[17] (void setOption(String, String, String)): init'ed(this.myTarget.type)
    //#pre[1] (void setOption(String, String, String)): (soft) init'ed(com.dmdirc.config.ConfigManager$1__static_init.new int[](ConfigManager$1__static_init#1)[0..4_294_967_295])
    //#pre[6] (void setOption(String, String, String)): (soft) init'ed(this.globalConfig)
    //#pre[14] (void setOption(String, String, String)): (soft) this.listeners != null
    //#presumption(void setOption(String, String, String)): com.dmdirc.util.ConfigFile:getKeyDomain(...)@379 != null
    //#presumption(void setOption(String, String, String)): java.util.logging.Logger:getLogger(...)@76 != null
    //#presumption(void setOption(String, String, String)): this.globalConfig.__Tag@352 == com/dmdirc/config/ConfigManager
    //#presumption(void setOption(String, String, String)): this.globalConfig.listeners@352 != null
    //#presumption(void setOption(String, String, String)): this.globalConfig.sources@352 != null
    //#post(void setOption(String, String, String)): java.lang.StringBuilder:toString(...)._tainted == 0
    //#post(void setOption(String, String, String)): this.globalConfig == One-of{old this.globalConfig, &new ConfigManager(setOption#2)}
    //#post(void setOption(String, String, String)): init'ed(this.globalConfig)
    //#post(void setOption(String, String, String)): possibly_updated(this.needSave)
    //#post(void setOption(String, String, String)): new ArrayList(getSources#1) num objects <= 1
    //#post(void setOption(String, String, String)): init'ed(new ArrayList(getSources#1).__Lock)
    //#post(void setOption(String, String, String)): new ConfigManager(setOption#2) num objects <= 1
    //#post(void setOption(String, String, String)): init'ed(new ConfigManager(setOption#2).__Tag)
    //#post(void setOption(String, String, String)): init'ed(new ConfigManager(setOption#2).channel)
    //#post(void setOption(String, String, String)): init'ed(new ConfigManager(setOption#2).ircd)
    //#post(void setOption(String, String, String)): init'ed(new ConfigManager(setOption#2).listeners)
    //#post(void setOption(String, String, String)): init'ed(new ConfigManager(setOption#2).network)
    //#post(void setOption(String, String, String)): init'ed(new ConfigManager(setOption#2).server)
    //#post(void setOption(String, String, String)): init'ed(new ConfigManager(setOption#2).sources)
    //#post(void setOption(String, String, String)): new MapList(ConfigManager#1) num objects <= 1
    //#unanalyzed(void setOption(String, String, String)): Effects-of-calling:java.util.ArrayList
    //#unanalyzed(void setOption(String, String, String)): Effects-of-calling:java.util.ArrayList:iterator
    //#unanalyzed(void setOption(String, String, String)): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(void setOption(String, String, String)): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(void setOption(String, String, String)): Effects-of-calling:com.dmdirc.interfaces.ConfigChangeListener:configChanged
    //#unanalyzed(void setOption(String, String, String)): Effects-of-calling:com.dmdirc.util.ConfigFile:getKeyDomains
    //#unanalyzed(void setOption(String, String, String)): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(void setOption(String, String, String)): Effects-of-calling:java.util.List:add
    //#unanalyzed(void setOption(String, String, String)): Effects-of-calling:java.util.Map:get
    //#unanalyzed(void setOption(String, String, String)): Effects-of-calling:java.lang.String:equals
    //#unanalyzed(void setOption(String, String, String)): Effects-of-calling:java.util.Map:remove
    //#unanalyzed(void setOption(String, String, String)): Effects-of-calling:java.util.Map:keySet
    //#unanalyzed(void setOption(String, String, String)): Effects-of-calling:com.dmdirc.util.ConfigFile:getKeyDomain
    //#unanalyzed(void setOption(String, String, String)): Effects-of-calling:java.util.HashMap
    //#unanalyzed(void setOption(String, String, String)): Effects-of-calling:java.util.List:remove
    //#unanalyzed(void setOption(String, String, String)): Effects-of-calling:com.dmdirc.util.ConfigFile:isKeyDomain
    //#unanalyzed(void setOption(String, String, String)): Effects-of-calling:java.util.HashSet
    //#unanalyzed(void setOption(String, String, String)): Effects-of-calling:hasOption
    //#unanalyzed(void setOption(String, String, String)): Effects-of-calling:getOption
    //#unanalyzed(void setOption(String, String, String)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void setOption(String, String, String)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void setOption(String, String, String)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void setOption(String, String, String)): Effects-of-calling:java.util.List:iterator
    //#unanalyzed(void setOption(String, String, String)): Effects-of-calling:getSources
    //#unanalyzed(void setOption(String, String, String)): Effects-of-calling:addListener
    //#unanalyzed(void setOption(String, String, String)): Effects-of-calling:com.dmdirc.config.ConfigSource
    //#unanalyzed(void setOption(String, String, String)): Effects-of-calling:com.dmdirc.util.MapList
    //#unanalyzed(void setOption(String, String, String)): Effects-of-calling:addConfigManager
    //#unanalyzed(void setOption(String, String, String)): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(void setOption(String, String, String)): Effects-of-calling:com.dmdirc.util.MapList:containsKey
    //#unanalyzed(void setOption(String, String, String)): Effects-of-calling:com.dmdirc.util.MapList:get
    //#unanalyzed(void setOption(String, String, String)): Effects-of-calling:java.util.List:addAll
    //#unanalyzed(void setOption(String, String, String)): Effects-of-calling:getDomains
    //#unanalyzed(void setOption(String, String, String)): Effects-of-calling:java.util.List:contains
    //#unanalyzed(void setOption(String, String, String)): Effects-of-calling:java.util.Set:iterator
    //#unanalyzed(void setOption(String, String, String)): Effects-of-calling:getOptions
    //#unanalyzed(void setOption(String, String, String)): Effects-of-calling:equals
    //#unanalyzed(void setOption(String, String, String)): Effects-of-calling:removeListener
    //#unanalyzed(void setOption(String, String, String)): Effects-of-calling:java.lang.Integer:intValue
    //#unanalyzed(void setOption(String, String, String)): Effects-of-calling:java.lang.Integer:valueOf
    //#unanalyzed(void setOption(String, String, String)): Effects-of-calling:java.util.Map:put
    //#unanalyzed(void setOption(String, String, String)): Effects-of-calling:java.lang.IllegalArgumentException
    //#unanalyzed(void setOption(String, String, String)): Effects-of-calling:com.dmdirc.logger.Logger:assertTrue
    //#unanalyzed(void setOption(String, String, String)): Effects-of-calling:getTarget
    //#unanalyzed(void setOption(String, String, String)): Effects-of-calling:com.dmdirc.config.ConfigTarget$TYPE:ordinal
    //#unanalyzed(void setOption(String, String, String)): Effects-of-calling:java.lang.String:equalsIgnoreCase
    //#unanalyzed(void setOption(String, String, String)): Effects-of-calling:java.util.Collections:sort
    //#test_vector(void setOption(String, String, String)): this.globalConfig: Inverse{null}, Addr_Set{null}
    //#test_vector(void setOption(String, String, String)): value: Inverse{null}, Addr_Set{null}
    //#test_vector(void setOption(String, String, String)): java.lang.String:equals(...)@376: {1}, {0}
    //#test_vector(void setOption(String, String, String)): java.util.Map:get(...)@336: Addr_Set{null}, Inverse{null}
            oldValue = getOption(domain, option);
            LOGGER.finer(getName() + ": setting " + domain + "." + option + " to " + value);

            if (myTarget.getType() == ConfigTarget.TYPE.GLOBAL) {
                // If we're the global config, don't set useless settings that are
                // covered by global defaults.

                if (globalConfig == null) {
                    globalConfig = new ConfigManager("", "", "");
                }

                globalConfig.removeIdentity(this);

                if (globalConfig.hasOption(domain, option)
    //#Identity.java:364: ?null dereference
    //#    getOption(...) != null
    //#    severity: MEDIUM
    //#    class: com.dmdirc.config.Identity
    //#    method: void setOption(String, String, String)
    //#    basic block: bb_6
    //#    assertion: getOption(...) != null
    //#    VN: getOption(...)
    //#    Expected: Inverse{null} or Invalid
    //#    Bad: Addr_Set{null}
    //#    Attribs:  Ptr  null in Bad
                        && globalConfig.getOption(domain, option).equals(value)) {
                    if (oldValue == null) {
                        return;
                    } else {
                        unsetOption(domain, option);
                        return;
                    }
                }
            }
        }

        if ((oldValue == null && value != null)
                || (oldValue != null && !oldValue.equals(value))) {
            synchronized (this) {
                file.getKeyDomain(domain).put(option, value);
    //#Identity.java:379: Warning: method not available - call not analyzed
    //#    call on Map com.dmdirc.util.ConfigFile:getKeyDomain(String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.config.Identity
    //#    method: void setOption(String, String, String)
    //#    unanalyzed callee: Map com.dmdirc.util.ConfigFile:getKeyDomain(String)
                needSave = true;
            }

            fireSettingChange(domain, option);
        }
    }
    //#Identity.java:385: end of method: void com.dmdirc.config.Identity.setOption(String, String, String)

    /**
     * Sets the specified option in this identity to the specified value.
     *
     * @param domain The domain of the option
     * @param option The name of the option
     * @param value The new value for the option
     */
    public void setOption(final String domain, final String option,
            final int value) {
        setOption(domain, option, String.valueOf(value));
    //#Identity.java:396: method: void com.dmdirc.config.Identity.setOption(String, String, int)
    //#input(void setOption(String, String, int)): " to "._tainted
    //#input(void setOption(String, String, int)): ""._tainted
    //#input(void setOption(String, String, int)): "."._tainted
    //#input(void setOption(String, String, int)): ": setting "._tainted
    //#input(void setOption(String, String, int)): "<Unknown>"._tainted
    //#input(void setOption(String, String, int)): "@"._tainted
    //#input(void setOption(String, String, int)): "Config option not found: "._tainted
    //#input(void setOption(String, String, int)): "Unnamed"._tainted
    //#input(void setOption(String, String, int)): DOMAIN
    //#input(void setOption(String, String, int)): LOGGER
    //#input(void setOption(String, String, int)): __Descendant_Table[com/dmdirc/config/Identity]
    //#input(void setOption(String, String, int)): __Descendant_Table[others]
    //#input(void setOption(String, String, int)): __Dispatch_Table.addListener(Lcom/dmdirc/interfaces/ConfigChangeListener;)V
    //#input(void setOption(String, String, int)): __Dispatch_Table.equals(Ljava/lang/Object;)Z
    //#input(void setOption(String, String, int)): __Dispatch_Table.getDomains()Ljava/util/Set;
    //#input(void setOption(String, String, int)): __Dispatch_Table.getName()Ljava/lang/String;
    //#input(void setOption(String, String, int)): __Dispatch_Table.getOption(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
    //#input(void setOption(String, String, int)): __Dispatch_Table.getOptions(Ljava/lang/String;)Ljava/util/Map;
    //#input(void setOption(String, String, int)): __Dispatch_Table.getTarget()Lcom/dmdirc/config/ConfigTarget;
    //#input(void setOption(String, String, int)): __Dispatch_Table.hasOption(Ljava/lang/String;Ljava/lang/String;)Z
    //#input(void setOption(String, String, int)): __Dispatch_Table.removeListener(Lcom/dmdirc/interfaces/ConfigChangeListener;)V
    //#input(void setOption(String, String, int)): __Dispatch_Table.setOption(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
    //#input(void setOption(String, String, int)): __Dispatch_Table.unsetOption(Ljava/lang/String;Ljava/lang/String;)V
    //#input(void setOption(String, String, int)): com.dmdirc.config.ConfigManager$1__static_init.new int[](ConfigManager$1__static_init#1).length
    //#input(void setOption(String, String, int)): com.dmdirc.config.ConfigManager$1__static_init.new int[](ConfigManager$1__static_init#1)[0..4_294_967_295]
    //#input(void setOption(String, String, int)): com/dmdirc/config/ConfigManager$1.$SwitchMap$com$dmdirc$config$ConfigTarget$TYPE
    //#input(void setOption(String, String, int)): com/dmdirc/config/ConfigManager.__Descendant_Table[com/dmdirc/config/ConfigManager]
    //#input(void setOption(String, String, int)): com/dmdirc/config/ConfigManager.__Descendant_Table[others]
    //#input(void setOption(String, String, int)): com/dmdirc/config/ConfigManager.__Dispatch_Table.configChanged(Ljava/lang/String;Ljava/lang/String;)V
    //#input(void setOption(String, String, int)): com/dmdirc/config/ConfigManager.__Dispatch_Table.getOption(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
    //#input(void setOption(String, String, int)): com/dmdirc/config/ConfigManager.__Dispatch_Table.getScope(Ljava/lang/String;Ljava/lang/String;)Lcom/dmdirc/config/Identity;
    //#input(void setOption(String, String, int)): com/dmdirc/config/ConfigManager.__Dispatch_Table.hasOption(Ljava/lang/String;Ljava/lang/String;)Z
    //#input(void setOption(String, String, int)): com/dmdirc/config/ConfigManager.__Dispatch_Table.identityApplies(Lcom/dmdirc/config/Identity;)Z
    //#input(void setOption(String, String, int)): com/dmdirc/config/ConfigManager.__Dispatch_Table.removeIdentity(Lcom/dmdirc/config/Identity;)V
    //#input(void setOption(String, String, int)): com/dmdirc/config/ConfigManager.stats
    //#input(void setOption(String, String, int)): com/dmdirc/config/ConfigTarget$TYPE.GLOBAL
    //#input(void setOption(String, String, int)): com/dmdirc/config/ConfigTarget.__Descendant_Table[com/dmdirc/config/ConfigTarget]
    //#input(void setOption(String, String, int)): com/dmdirc/config/ConfigTarget.__Descendant_Table[others]
    //#input(void setOption(String, String, int)): com/dmdirc/config/ConfigTarget.__Dispatch_Table.getData()Ljava/lang/String;
    //#input(void setOption(String, String, int)): com/dmdirc/config/ConfigTarget.__Dispatch_Table.getType()Lcom/dmdirc/config/ConfigTarget$TYPE;
    //#input(void setOption(String, String, int)): com/dmdirc/config/IdentityManager.identities
    //#input(void setOption(String, String, int)): com/dmdirc/config/IdentityManager.managers
    //#input(void setOption(String, String, int)): domain
    //#input(void setOption(String, String, int)): domain._tainted
    //#input(void setOption(String, String, int)): option
    //#input(void setOption(String, String, int)): option._tainted
    //#input(void setOption(String, String, int)): this
    //#input(void setOption(String, String, int)): this.__Tag
    //#input(void setOption(String, String, int)): this.file
    //#input(void setOption(String, String, int)): this.globalConfig
    //#input(void setOption(String, String, int)): this.globalConfig.__Tag
    //#input(void setOption(String, String, int)): this.globalConfig.listeners
    //#input(void setOption(String, String, int)): this.globalConfig.sources
    //#input(void setOption(String, String, int)): this.listeners
    //#input(void setOption(String, String, int)): this.myTarget
    //#input(void setOption(String, String, int)): this.myTarget.__Tag
    //#input(void setOption(String, String, int)): this.myTarget.type
    //#input(void setOption(String, String, int)): value
    //#output(void setOption(String, String, int)): java.lang.StringBuilder:toString(...)._tainted
    //#output(void setOption(String, String, int)): new ArrayList(getSources#1) num objects
    //#output(void setOption(String, String, int)): new ArrayList(getSources#1).__Lock
    //#output(void setOption(String, String, int)): new ConfigManager(setOption#2*) num objects
    //#output(void setOption(String, String, int)): new ConfigManager(setOption#2*).__Tag
    //#output(void setOption(String, String, int)): new ConfigManager(setOption#2*).channel
    //#output(void setOption(String, String, int)): new ConfigManager(setOption#2*).ircd
    //#output(void setOption(String, String, int)): new ConfigManager(setOption#2*).listeners
    //#output(void setOption(String, String, int)): new ConfigManager(setOption#2*).network
    //#output(void setOption(String, String, int)): new ConfigManager(setOption#2*).server
    //#output(void setOption(String, String, int)): new ConfigManager(setOption#2*).sources
    //#output(void setOption(String, String, int)): new MapList(ConfigManager#1) num objects
    //#output(void setOption(String, String, int)): this.globalConfig
    //#output(void setOption(String, String, int)): this.needSave
    //#new obj(void setOption(String, String, int)): java.lang.StringBuilder:toString(...)
    //#new obj(void setOption(String, String, int)): new ArrayList(getSources#1)
    //#new obj(void setOption(String, String, int)): new ConfigManager(setOption#2*)
    //#new obj(void setOption(String, String, int)): new MapList(ConfigManager#1)
    //#pre[12] (void setOption(String, String, int)): this.__Tag == com/dmdirc/config/Identity
    //#pre[13] (void setOption(String, String, int)): this.file != null
    //#pre[19] (void setOption(String, String, int)): this.myTarget != null
    //#pre[20] (void setOption(String, String, int)): this.myTarget.__Tag == com/dmdirc/config/ConfigTarget
    //#pre[21] (void setOption(String, String, int)): init'ed(this.myTarget.type)
    //#pre[1] (void setOption(String, String, int)): (soft) init'ed(com.dmdirc.config.ConfigManager$1__static_init.new int[](ConfigManager$1__static_init#1)[0..4_294_967_295])
    //#pre[6] (void setOption(String, String, int)): (soft) init'ed(this.globalConfig)
    //#pre[18] (void setOption(String, String, int)): (soft) this.listeners != null
    //#post(void setOption(String, String, int)): java.lang.StringBuilder:toString(...)._tainted == 0
    //#post(void setOption(String, String, int)): this.globalConfig == One-of{old this.globalConfig, &new ConfigManager(setOption#2*)}
    //#post(void setOption(String, String, int)): init'ed(this.globalConfig)
    //#post(void setOption(String, String, int)): possibly_updated(this.needSave)
    //#post(void setOption(String, String, int)): new ArrayList(getSources#1) num objects <= 1
    //#post(void setOption(String, String, int)): new ConfigManager(setOption#2*) num objects == new ArrayList(getSources#1) num objects
    //#post(void setOption(String, String, int)): new MapList(ConfigManager#1) num objects == new ArrayList(getSources#1) num objects
    //#post(void setOption(String, String, int)): init'ed(new ArrayList(getSources#1).__Lock)
    //#post(void setOption(String, String, int)): init'ed(new ConfigManager(setOption#2*).__Tag)
    //#post(void setOption(String, String, int)): init'ed(new ConfigManager(setOption#2*).channel)
    //#post(void setOption(String, String, int)): init'ed(new ConfigManager(setOption#2*).ircd)
    //#post(void setOption(String, String, int)): init'ed(new ConfigManager(setOption#2*).listeners)
    //#post(void setOption(String, String, int)): init'ed(new ConfigManager(setOption#2*).network)
    //#post(void setOption(String, String, int)): init'ed(new ConfigManager(setOption#2*).server)
    //#post(void setOption(String, String, int)): init'ed(new ConfigManager(setOption#2*).sources)
    //#unanalyzed(void setOption(String, String, int)): Effects-of-calling:java.util.ArrayList
    //#unanalyzed(void setOption(String, String, int)): Effects-of-calling:java.util.ArrayList:iterator
    //#unanalyzed(void setOption(String, String, int)): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(void setOption(String, String, int)): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(void setOption(String, String, int)): Effects-of-calling:com.dmdirc.interfaces.ConfigChangeListener:configChanged
    //#unanalyzed(void setOption(String, String, int)): Effects-of-calling:com.dmdirc.util.ConfigFile:getKeyDomains
    //#unanalyzed(void setOption(String, String, int)): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(void setOption(String, String, int)): Effects-of-calling:java.util.List:add
    //#unanalyzed(void setOption(String, String, int)): Effects-of-calling:java.util.Map:get
    //#unanalyzed(void setOption(String, String, int)): Effects-of-calling:java.lang.String:equals
    //#unanalyzed(void setOption(String, String, int)): Effects-of-calling:java.util.Map:remove
    //#unanalyzed(void setOption(String, String, int)): Effects-of-calling:java.util.Map:keySet
    //#unanalyzed(void setOption(String, String, int)): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(void setOption(String, String, int)): Effects-of-calling:com.dmdirc.util.ConfigFile:getKeyDomain
    //#unanalyzed(void setOption(String, String, int)): Effects-of-calling:java.util.HashMap
    //#unanalyzed(void setOption(String, String, int)): Effects-of-calling:java.util.List:remove
    //#unanalyzed(void setOption(String, String, int)): Effects-of-calling:com.dmdirc.util.ConfigFile:isKeyDomain
    //#unanalyzed(void setOption(String, String, int)): Effects-of-calling:java.util.HashSet
    //#unanalyzed(void setOption(String, String, int)): Effects-of-calling:hasOption
    //#unanalyzed(void setOption(String, String, int)): Effects-of-calling:getOption
    //#unanalyzed(void setOption(String, String, int)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void setOption(String, String, int)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void setOption(String, String, int)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void setOption(String, String, int)): Effects-of-calling:java.util.logging.Logger:finer
    //#unanalyzed(void setOption(String, String, int)): Effects-of-calling:java.util.List:iterator
    //#unanalyzed(void setOption(String, String, int)): Effects-of-calling:getSources
    //#unanalyzed(void setOption(String, String, int)): Effects-of-calling:addListener
    //#unanalyzed(void setOption(String, String, int)): Effects-of-calling:com.dmdirc.config.ConfigSource
    //#unanalyzed(void setOption(String, String, int)): Effects-of-calling:com.dmdirc.util.MapList
    //#unanalyzed(void setOption(String, String, int)): Effects-of-calling:addConfigManager
    //#unanalyzed(void setOption(String, String, int)): Effects-of-calling:com.dmdirc.util.MapList:containsKey
    //#unanalyzed(void setOption(String, String, int)): Effects-of-calling:com.dmdirc.util.MapList:get
    //#unanalyzed(void setOption(String, String, int)): Effects-of-calling:java.util.List:addAll
    //#unanalyzed(void setOption(String, String, int)): Effects-of-calling:getDomains
    //#unanalyzed(void setOption(String, String, int)): Effects-of-calling:java.util.List:contains
    //#unanalyzed(void setOption(String, String, int)): Effects-of-calling:java.util.Set:iterator
    //#unanalyzed(void setOption(String, String, int)): Effects-of-calling:getOptions
    //#unanalyzed(void setOption(String, String, int)): Effects-of-calling:equals
    //#unanalyzed(void setOption(String, String, int)): Effects-of-calling:removeListener
    //#unanalyzed(void setOption(String, String, int)): Effects-of-calling:java.lang.Integer:intValue
    //#unanalyzed(void setOption(String, String, int)): Effects-of-calling:java.lang.Integer:valueOf
    //#unanalyzed(void setOption(String, String, int)): Effects-of-calling:java.util.Map:put
    //#unanalyzed(void setOption(String, String, int)): Effects-of-calling:java.lang.IllegalArgumentException
    //#unanalyzed(void setOption(String, String, int)): Effects-of-calling:com.dmdirc.logger.Logger:assertTrue
    //#unanalyzed(void setOption(String, String, int)): Effects-of-calling:getTarget
    //#unanalyzed(void setOption(String, String, int)): Effects-of-calling:com.dmdirc.config.ConfigTarget$TYPE:ordinal
    //#unanalyzed(void setOption(String, String, int)): Effects-of-calling:java.lang.String:equalsIgnoreCase
    //#unanalyzed(void setOption(String, String, int)): Effects-of-calling:java.util.Collections:sort
    }
    //#Identity.java:397: end of method: void com.dmdirc.config.Identity.setOption(String, String, int)

    /**
     * Sets the specified option in this identity to the specified value.
     *
     * @param domain The domain of the option
     * @param option The name of the option
     * @param value The new value for the option
     */
    public void setOption(final String domain, final String option,
            final boolean value) {
        setOption(domain, option, String.valueOf(value));
    //#Identity.java:408: method: void com.dmdirc.config.Identity.setOption(String, String, bool)
    //#input(void setOption(String, String, bool)): " to "._tainted
    //#input(void setOption(String, String, bool)): ""._tainted
    //#input(void setOption(String, String, bool)): "."._tainted
    //#input(void setOption(String, String, bool)): ": setting "._tainted
    //#input(void setOption(String, String, bool)): "<Unknown>"._tainted
    //#input(void setOption(String, String, bool)): "@"._tainted
    //#input(void setOption(String, String, bool)): "Config option not found: "._tainted
    //#input(void setOption(String, String, bool)): "Unnamed"._tainted
    //#input(void setOption(String, String, bool)): DOMAIN
    //#input(void setOption(String, String, bool)): LOGGER
    //#input(void setOption(String, String, bool)): __Descendant_Table[com/dmdirc/config/Identity]
    //#input(void setOption(String, String, bool)): __Descendant_Table[others]
    //#input(void setOption(String, String, bool)): __Dispatch_Table.addListener(Lcom/dmdirc/interfaces/ConfigChangeListener;)V
    //#input(void setOption(String, String, bool)): __Dispatch_Table.equals(Ljava/lang/Object;)Z
    //#input(void setOption(String, String, bool)): __Dispatch_Table.getDomains()Ljava/util/Set;
    //#input(void setOption(String, String, bool)): __Dispatch_Table.getName()Ljava/lang/String;
    //#input(void setOption(String, String, bool)): __Dispatch_Table.getOption(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
    //#input(void setOption(String, String, bool)): __Dispatch_Table.getOptions(Ljava/lang/String;)Ljava/util/Map;
    //#input(void setOption(String, String, bool)): __Dispatch_Table.getTarget()Lcom/dmdirc/config/ConfigTarget;
    //#input(void setOption(String, String, bool)): __Dispatch_Table.hasOption(Ljava/lang/String;Ljava/lang/String;)Z
    //#input(void setOption(String, String, bool)): __Dispatch_Table.removeListener(Lcom/dmdirc/interfaces/ConfigChangeListener;)V
    //#input(void setOption(String, String, bool)): __Dispatch_Table.setOption(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
    //#input(void setOption(String, String, bool)): __Dispatch_Table.unsetOption(Ljava/lang/String;Ljava/lang/String;)V
    //#input(void setOption(String, String, bool)): com.dmdirc.config.ConfigManager$1__static_init.new int[](ConfigManager$1__static_init#1).length
    //#input(void setOption(String, String, bool)): com.dmdirc.config.ConfigManager$1__static_init.new int[](ConfigManager$1__static_init#1)[0..4_294_967_295]
    //#input(void setOption(String, String, bool)): com/dmdirc/config/ConfigManager$1.$SwitchMap$com$dmdirc$config$ConfigTarget$TYPE
    //#input(void setOption(String, String, bool)): com/dmdirc/config/ConfigManager.__Descendant_Table[com/dmdirc/config/ConfigManager]
    //#input(void setOption(String, String, bool)): com/dmdirc/config/ConfigManager.__Descendant_Table[others]
    //#input(void setOption(String, String, bool)): com/dmdirc/config/ConfigManager.__Dispatch_Table.configChanged(Ljava/lang/String;Ljava/lang/String;)V
    //#input(void setOption(String, String, bool)): com/dmdirc/config/ConfigManager.__Dispatch_Table.getOption(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
    //#input(void setOption(String, String, bool)): com/dmdirc/config/ConfigManager.__Dispatch_Table.getScope(Ljava/lang/String;Ljava/lang/String;)Lcom/dmdirc/config/Identity;
    //#input(void setOption(String, String, bool)): com/dmdirc/config/ConfigManager.__Dispatch_Table.hasOption(Ljava/lang/String;Ljava/lang/String;)Z
    //#input(void setOption(String, String, bool)): com/dmdirc/config/ConfigManager.__Dispatch_Table.identityApplies(Lcom/dmdirc/config/Identity;)Z
    //#input(void setOption(String, String, bool)): com/dmdirc/config/ConfigManager.__Dispatch_Table.removeIdentity(Lcom/dmdirc/config/Identity;)V
    //#input(void setOption(String, String, bool)): com/dmdirc/config/ConfigManager.stats
    //#input(void setOption(String, String, bool)): com/dmdirc/config/ConfigTarget$TYPE.GLOBAL
    //#input(void setOption(String, String, bool)): com/dmdirc/config/ConfigTarget.__Descendant_Table[com/dmdirc/config/ConfigTarget]
    //#input(void setOption(String, String, bool)): com/dmdirc/config/ConfigTarget.__Descendant_Table[others]
    //#input(void setOption(String, String, bool)): com/dmdirc/config/ConfigTarget.__Dispatch_Table.getData()Ljava/lang/String;
    //#input(void setOption(String, String, bool)): com/dmdirc/config/ConfigTarget.__Dispatch_Table.getType()Lcom/dmdirc/config/ConfigTarget$TYPE;
    //#input(void setOption(String, String, bool)): com/dmdirc/config/IdentityManager.identities
    //#input(void setOption(String, String, bool)): com/dmdirc/config/IdentityManager.managers
    //#input(void setOption(String, String, bool)): domain
    //#input(void setOption(String, String, bool)): domain._tainted
    //#input(void setOption(String, String, bool)): option
    //#input(void setOption(String, String, bool)): option._tainted
    //#input(void setOption(String, String, bool)): this
    //#input(void setOption(String, String, bool)): this.__Tag
    //#input(void setOption(String, String, bool)): this.file
    //#input(void setOption(String, String, bool)): this.globalConfig
    //#input(void setOption(String, String, bool)): this.globalConfig.__Tag
    //#input(void setOption(String, String, bool)): this.globalConfig.listeners
    //#input(void setOption(String, String, bool)): this.globalConfig.sources
    //#input(void setOption(String, String, bool)): this.listeners
    //#input(void setOption(String, String, bool)): this.myTarget
    //#input(void setOption(String, String, bool)): this.myTarget.__Tag
    //#input(void setOption(String, String, bool)): this.myTarget.type
    //#input(void setOption(String, String, bool)): value
    //#output(void setOption(String, String, bool)): java.lang.StringBuilder:toString(...)._tainted
    //#output(void setOption(String, String, bool)): new ArrayList(getSources#1) num objects
    //#output(void setOption(String, String, bool)): new ArrayList(getSources#1).__Lock
    //#output(void setOption(String, String, bool)): new ConfigManager(setOption#2*) num objects
    //#output(void setOption(String, String, bool)): new ConfigManager(setOption#2*).__Tag
    //#output(void setOption(String, String, bool)): new ConfigManager(setOption#2*).channel
    //#output(void setOption(String, String, bool)): new ConfigManager(setOption#2*).ircd
    //#output(void setOption(String, String, bool)): new ConfigManager(setOption#2*).listeners
    //#output(void setOption(String, String, bool)): new ConfigManager(setOption#2*).network
    //#output(void setOption(String, String, bool)): new ConfigManager(setOption#2*).server
    //#output(void setOption(String, String, bool)): new ConfigManager(setOption#2*).sources
    //#output(void setOption(String, String, bool)): new MapList(ConfigManager#1) num objects
    //#output(void setOption(String, String, bool)): this.globalConfig
    //#output(void setOption(String, String, bool)): this.needSave
    //#new obj(void setOption(String, String, bool)): java.lang.StringBuilder:toString(...)
    //#new obj(void setOption(String, String, bool)): new ArrayList(getSources#1)
    //#new obj(void setOption(String, String, bool)): new ConfigManager(setOption#2*)
    //#new obj(void setOption(String, String, bool)): new MapList(ConfigManager#1)
    //#pre[12] (void setOption(String, String, bool)): this.__Tag == com/dmdirc/config/Identity
    //#pre[13] (void setOption(String, String, bool)): this.file != null
    //#pre[19] (void setOption(String, String, bool)): this.myTarget != null
    //#pre[20] (void setOption(String, String, bool)): this.myTarget.__Tag == com/dmdirc/config/ConfigTarget
    //#pre[21] (void setOption(String, String, bool)): init'ed(this.myTarget.type)
    //#pre[1] (void setOption(String, String, bool)): (soft) init'ed(com.dmdirc.config.ConfigManager$1__static_init.new int[](ConfigManager$1__static_init#1)[0..4_294_967_295])
    //#pre[6] (void setOption(String, String, bool)): (soft) init'ed(this.globalConfig)
    //#pre[18] (void setOption(String, String, bool)): (soft) this.listeners != null
    //#post(void setOption(String, String, bool)): java.lang.StringBuilder:toString(...)._tainted == 0
    //#post(void setOption(String, String, bool)): this.globalConfig == One-of{old this.globalConfig, &new ConfigManager(setOption#2*)}
    //#post(void setOption(String, String, bool)): init'ed(this.globalConfig)
    //#post(void setOption(String, String, bool)): possibly_updated(this.needSave)
    //#post(void setOption(String, String, bool)): new ArrayList(getSources#1) num objects <= 1
    //#post(void setOption(String, String, bool)): new ConfigManager(setOption#2*) num objects == new ArrayList(getSources#1) num objects
    //#post(void setOption(String, String, bool)): new MapList(ConfigManager#1) num objects == new ArrayList(getSources#1) num objects
    //#post(void setOption(String, String, bool)): init'ed(new ArrayList(getSources#1).__Lock)
    //#post(void setOption(String, String, bool)): init'ed(new ConfigManager(setOption#2*).__Tag)
    //#post(void setOption(String, String, bool)): init'ed(new ConfigManager(setOption#2*).channel)
    //#post(void setOption(String, String, bool)): init'ed(new ConfigManager(setOption#2*).ircd)
    //#post(void setOption(String, String, bool)): init'ed(new ConfigManager(setOption#2*).listeners)
    //#post(void setOption(String, String, bool)): init'ed(new ConfigManager(setOption#2*).network)
    //#post(void setOption(String, String, bool)): init'ed(new ConfigManager(setOption#2*).server)
    //#post(void setOption(String, String, bool)): init'ed(new ConfigManager(setOption#2*).sources)
    //#unanalyzed(void setOption(String, String, bool)): Effects-of-calling:java.util.ArrayList
    //#unanalyzed(void setOption(String, String, bool)): Effects-of-calling:java.util.ArrayList:iterator
    //#unanalyzed(void setOption(String, String, bool)): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(void setOption(String, String, bool)): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(void setOption(String, String, bool)): Effects-of-calling:com.dmdirc.interfaces.ConfigChangeListener:configChanged
    //#unanalyzed(void setOption(String, String, bool)): Effects-of-calling:com.dmdirc.util.ConfigFile:getKeyDomains
    //#unanalyzed(void setOption(String, String, bool)): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(void setOption(String, String, bool)): Effects-of-calling:java.util.List:add
    //#unanalyzed(void setOption(String, String, bool)): Effects-of-calling:java.util.Map:get
    //#unanalyzed(void setOption(String, String, bool)): Effects-of-calling:java.lang.String:equals
    //#unanalyzed(void setOption(String, String, bool)): Effects-of-calling:java.util.Map:remove
    //#unanalyzed(void setOption(String, String, bool)): Effects-of-calling:java.util.Map:keySet
    //#unanalyzed(void setOption(String, String, bool)): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(void setOption(String, String, bool)): Effects-of-calling:com.dmdirc.util.ConfigFile:getKeyDomain
    //#unanalyzed(void setOption(String, String, bool)): Effects-of-calling:java.util.HashMap
    //#unanalyzed(void setOption(String, String, bool)): Effects-of-calling:java.util.List:remove
    //#unanalyzed(void setOption(String, String, bool)): Effects-of-calling:com.dmdirc.util.ConfigFile:isKeyDomain
    //#unanalyzed(void setOption(String, String, bool)): Effects-of-calling:java.util.HashSet
    //#unanalyzed(void setOption(String, String, bool)): Effects-of-calling:hasOption
    //#unanalyzed(void setOption(String, String, bool)): Effects-of-calling:getOption
    //#unanalyzed(void setOption(String, String, bool)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void setOption(String, String, bool)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void setOption(String, String, bool)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void setOption(String, String, bool)): Effects-of-calling:java.util.logging.Logger:finer
    //#unanalyzed(void setOption(String, String, bool)): Effects-of-calling:java.util.List:iterator
    //#unanalyzed(void setOption(String, String, bool)): Effects-of-calling:getSources
    //#unanalyzed(void setOption(String, String, bool)): Effects-of-calling:addListener
    //#unanalyzed(void setOption(String, String, bool)): Effects-of-calling:com.dmdirc.config.ConfigSource
    //#unanalyzed(void setOption(String, String, bool)): Effects-of-calling:com.dmdirc.util.MapList
    //#unanalyzed(void setOption(String, String, bool)): Effects-of-calling:addConfigManager
    //#unanalyzed(void setOption(String, String, bool)): Effects-of-calling:com.dmdirc.util.MapList:containsKey
    //#unanalyzed(void setOption(String, String, bool)): Effects-of-calling:com.dmdirc.util.MapList:get
    //#unanalyzed(void setOption(String, String, bool)): Effects-of-calling:java.util.List:addAll
    //#unanalyzed(void setOption(String, String, bool)): Effects-of-calling:getDomains
    //#unanalyzed(void setOption(String, String, bool)): Effects-of-calling:java.util.List:contains
    //#unanalyzed(void setOption(String, String, bool)): Effects-of-calling:java.util.Set:iterator
    //#unanalyzed(void setOption(String, String, bool)): Effects-of-calling:getOptions
    //#unanalyzed(void setOption(String, String, bool)): Effects-of-calling:equals
    //#unanalyzed(void setOption(String, String, bool)): Effects-of-calling:removeListener
    //#unanalyzed(void setOption(String, String, bool)): Effects-of-calling:java.lang.Integer:intValue
    //#unanalyzed(void setOption(String, String, bool)): Effects-of-calling:java.lang.Integer:valueOf
    //#unanalyzed(void setOption(String, String, bool)): Effects-of-calling:java.util.Map:put
    //#unanalyzed(void setOption(String, String, bool)): Effects-of-calling:java.lang.IllegalArgumentException
    //#unanalyzed(void setOption(String, String, bool)): Effects-of-calling:com.dmdirc.logger.Logger:assertTrue
    //#unanalyzed(void setOption(String, String, bool)): Effects-of-calling:getTarget
    //#unanalyzed(void setOption(String, String, bool)): Effects-of-calling:com.dmdirc.config.ConfigTarget$TYPE:ordinal
    //#unanalyzed(void setOption(String, String, bool)): Effects-of-calling:java.lang.String:equalsIgnoreCase
    //#unanalyzed(void setOption(String, String, bool)): Effects-of-calling:java.util.Collections:sort
    }
    //#Identity.java:409: end of method: void com.dmdirc.config.Identity.setOption(String, String, bool)

    /**
     * Sets the specified option in this identity to the specified value.
     *
     * @param domain The domain of the option
     * @param option The name of the option
     * @param value The new value for the option
     */
    public void setOption(final String domain, final String option,
            final List<String> value) {
        final StringBuilder temp = new StringBuilder();
    //#Identity.java:420: method: void com.dmdirc.config.Identity.setOption(String, String, List)
    //#input(void setOption(String, String, List)): " to "._tainted
    //#input(void setOption(String, String, List)): ""._tainted
    //#input(void setOption(String, String, List)): "."._tainted
    //#input(void setOption(String, String, List)): ": setting "._tainted
    //#input(void setOption(String, String, List)): "<Unknown>"._tainted
    //#input(void setOption(String, String, List)): "@"._tainted
    //#input(void setOption(String, String, List)): "Config option not found: "._tainted
    //#input(void setOption(String, String, List)): "Unnamed"._tainted
    //#input(void setOption(String, String, List)): DOMAIN
    //#input(void setOption(String, String, List)): LOGGER
    //#input(void setOption(String, String, List)): __Descendant_Table[com/dmdirc/config/Identity]
    //#input(void setOption(String, String, List)): __Descendant_Table[others]
    //#input(void setOption(String, String, List)): __Dispatch_Table.addListener(Lcom/dmdirc/interfaces/ConfigChangeListener;)V
    //#input(void setOption(String, String, List)): __Dispatch_Table.equals(Ljava/lang/Object;)Z
    //#input(void setOption(String, String, List)): __Dispatch_Table.getDomains()Ljava/util/Set;
    //#input(void setOption(String, String, List)): __Dispatch_Table.getName()Ljava/lang/String;
    //#input(void setOption(String, String, List)): __Dispatch_Table.getOption(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
    //#input(void setOption(String, String, List)): __Dispatch_Table.getOptions(Ljava/lang/String;)Ljava/util/Map;
    //#input(void setOption(String, String, List)): __Dispatch_Table.getTarget()Lcom/dmdirc/config/ConfigTarget;
    //#input(void setOption(String, String, List)): __Dispatch_Table.hasOption(Ljava/lang/String;Ljava/lang/String;)Z
    //#input(void setOption(String, String, List)): __Dispatch_Table.removeListener(Lcom/dmdirc/interfaces/ConfigChangeListener;)V
    //#input(void setOption(String, String, List)): __Dispatch_Table.setOption(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
    //#input(void setOption(String, String, List)): __Dispatch_Table.unsetOption(Ljava/lang/String;Ljava/lang/String;)V
    //#input(void setOption(String, String, List)): com.dmdirc.config.ConfigManager$1__static_init.new int[](ConfigManager$1__static_init#1).length
    //#input(void setOption(String, String, List)): com.dmdirc.config.ConfigManager$1__static_init.new int[](ConfigManager$1__static_init#1)[0..4_294_967_295]
    //#input(void setOption(String, String, List)): com/dmdirc/config/ConfigManager$1.$SwitchMap$com$dmdirc$config$ConfigTarget$TYPE
    //#input(void setOption(String, String, List)): com/dmdirc/config/ConfigManager.__Descendant_Table[com/dmdirc/config/ConfigManager]
    //#input(void setOption(String, String, List)): com/dmdirc/config/ConfigManager.__Descendant_Table[others]
    //#input(void setOption(String, String, List)): com/dmdirc/config/ConfigManager.__Dispatch_Table.configChanged(Ljava/lang/String;Ljava/lang/String;)V
    //#input(void setOption(String, String, List)): com/dmdirc/config/ConfigManager.__Dispatch_Table.getOption(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
    //#input(void setOption(String, String, List)): com/dmdirc/config/ConfigManager.__Dispatch_Table.getScope(Ljava/lang/String;Ljava/lang/String;)Lcom/dmdirc/config/Identity;
    //#input(void setOption(String, String, List)): com/dmdirc/config/ConfigManager.__Dispatch_Table.hasOption(Ljava/lang/String;Ljava/lang/String;)Z
    //#input(void setOption(String, String, List)): com/dmdirc/config/ConfigManager.__Dispatch_Table.identityApplies(Lcom/dmdirc/config/Identity;)Z
    //#input(void setOption(String, String, List)): com/dmdirc/config/ConfigManager.__Dispatch_Table.removeIdentity(Lcom/dmdirc/config/Identity;)V
    //#input(void setOption(String, String, List)): com/dmdirc/config/ConfigManager.stats
    //#input(void setOption(String, String, List)): com/dmdirc/config/ConfigTarget$TYPE.GLOBAL
    //#input(void setOption(String, String, List)): com/dmdirc/config/ConfigTarget.__Descendant_Table[com/dmdirc/config/ConfigTarget]
    //#input(void setOption(String, String, List)): com/dmdirc/config/ConfigTarget.__Descendant_Table[others]
    //#input(void setOption(String, String, List)): com/dmdirc/config/ConfigTarget.__Dispatch_Table.getData()Ljava/lang/String;
    //#input(void setOption(String, String, List)): com/dmdirc/config/ConfigTarget.__Dispatch_Table.getType()Lcom/dmdirc/config/ConfigTarget$TYPE;
    //#input(void setOption(String, String, List)): com/dmdirc/config/IdentityManager.identities
    //#input(void setOption(String, String, List)): com/dmdirc/config/IdentityManager.managers
    //#input(void setOption(String, String, List)): domain
    //#input(void setOption(String, String, List)): domain._tainted
    //#input(void setOption(String, String, List)): option
    //#input(void setOption(String, String, List)): option._tainted
    //#input(void setOption(String, String, List)): this
    //#input(void setOption(String, String, List)): this.__Tag
    //#input(void setOption(String, String, List)): this.file
    //#input(void setOption(String, String, List)): this.globalConfig
    //#input(void setOption(String, String, List)): this.globalConfig.__Tag
    //#input(void setOption(String, String, List)): this.globalConfig.listeners
    //#input(void setOption(String, String, List)): this.globalConfig.sources
    //#input(void setOption(String, String, List)): this.listeners
    //#input(void setOption(String, String, List)): this.myTarget
    //#input(void setOption(String, String, List)): this.myTarget.__Tag
    //#input(void setOption(String, String, List)): this.myTarget.type
    //#input(void setOption(String, String, List)): value
    //#output(void setOption(String, String, List)): java.lang.StringBuilder:toString(...)._tainted
    //#output(void setOption(String, String, List)): new ArrayList(getSources#1) num objects
    //#output(void setOption(String, String, List)): new ArrayList(getSources#1).__Lock
    //#output(void setOption(String, String, List)): new ConfigManager(setOption#2*) num objects
    //#output(void setOption(String, String, List)): new ConfigManager(setOption#2*).__Tag
    //#output(void setOption(String, String, List)): new ConfigManager(setOption#2*).channel
    //#output(void setOption(String, String, List)): new ConfigManager(setOption#2*).ircd
    //#output(void setOption(String, String, List)): new ConfigManager(setOption#2*).listeners
    //#output(void setOption(String, String, List)): new ConfigManager(setOption#2*).network
    //#output(void setOption(String, String, List)): new ConfigManager(setOption#2*).server
    //#output(void setOption(String, String, List)): new ConfigManager(setOption#2*).sources
    //#output(void setOption(String, String, List)): new MapList(ConfigManager#1) num objects
    //#output(void setOption(String, String, List)): this.globalConfig
    //#output(void setOption(String, String, List)): this.needSave
    //#new obj(void setOption(String, String, List)): java.lang.StringBuilder:toString(...)
    //#new obj(void setOption(String, String, List)): new ArrayList(getSources#1)
    //#new obj(void setOption(String, String, List)): new ConfigManager(setOption#2*)
    //#new obj(void setOption(String, String, List)): new MapList(ConfigManager#1)
    //#pre[12] (void setOption(String, String, List)): this.__Tag == com/dmdirc/config/Identity
    //#pre[13] (void setOption(String, String, List)): this.file != null
    //#pre[19] (void setOption(String, String, List)): this.myTarget != null
    //#pre[20] (void setOption(String, String, List)): this.myTarget.__Tag == com/dmdirc/config/ConfigTarget
    //#pre[21] (void setOption(String, String, List)): init'ed(this.myTarget.type)
    //#pre[22] (void setOption(String, String, List)): value != null
    //#pre[1] (void setOption(String, String, List)): (soft) init'ed(com.dmdirc.config.ConfigManager$1__static_init.new int[](ConfigManager$1__static_init#1)[0..4_294_967_295])
    //#pre[6] (void setOption(String, String, List)): (soft) init'ed(this.globalConfig)
    //#pre[18] (void setOption(String, String, List)): (soft) this.listeners != null
    //#post(void setOption(String, String, List)): java.lang.StringBuilder:toString(...)._tainted == 0
    //#post(void setOption(String, String, List)): this.globalConfig == One-of{old this.globalConfig, &new ConfigManager(setOption#2*)}
    //#post(void setOption(String, String, List)): init'ed(this.globalConfig)
    //#post(void setOption(String, String, List)): possibly_updated(this.needSave)
    //#post(void setOption(String, String, List)): new ArrayList(getSources#1) num objects <= 1
    //#post(void setOption(String, String, List)): new ConfigManager(setOption#2*) num objects == new ArrayList(getSources#1) num objects
    //#post(void setOption(String, String, List)): new MapList(ConfigManager#1) num objects == new ArrayList(getSources#1) num objects
    //#post(void setOption(String, String, List)): init'ed(new ArrayList(getSources#1).__Lock)
    //#post(void setOption(String, String, List)): init'ed(new ConfigManager(setOption#2*).__Tag)
    //#post(void setOption(String, String, List)): init'ed(new ConfigManager(setOption#2*).channel)
    //#post(void setOption(String, String, List)): init'ed(new ConfigManager(setOption#2*).ircd)
    //#post(void setOption(String, String, List)): init'ed(new ConfigManager(setOption#2*).listeners)
    //#post(void setOption(String, String, List)): init'ed(new ConfigManager(setOption#2*).network)
    //#post(void setOption(String, String, List)): init'ed(new ConfigManager(setOption#2*).server)
    //#post(void setOption(String, String, List)): init'ed(new ConfigManager(setOption#2*).sources)
    //#unanalyzed(void setOption(String, String, List)): Effects-of-calling:java.util.ArrayList
    //#unanalyzed(void setOption(String, String, List)): Effects-of-calling:java.util.ArrayList:iterator
    //#unanalyzed(void setOption(String, String, List)): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(void setOption(String, String, List)): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(void setOption(String, String, List)): Effects-of-calling:com.dmdirc.interfaces.ConfigChangeListener:configChanged
    //#unanalyzed(void setOption(String, String, List)): Effects-of-calling:com.dmdirc.util.ConfigFile:getKeyDomains
    //#unanalyzed(void setOption(String, String, List)): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(void setOption(String, String, List)): Effects-of-calling:java.util.List:add
    //#unanalyzed(void setOption(String, String, List)): Effects-of-calling:java.util.Map:get
    //#unanalyzed(void setOption(String, String, List)): Effects-of-calling:java.lang.String:equals
    //#unanalyzed(void setOption(String, String, List)): Effects-of-calling:java.util.Map:remove
    //#unanalyzed(void setOption(String, String, List)): Effects-of-calling:java.util.Map:keySet
    //#unanalyzed(void setOption(String, String, List)): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(void setOption(String, String, List)): Effects-of-calling:com.dmdirc.util.ConfigFile:getKeyDomain
    //#unanalyzed(void setOption(String, String, List)): Effects-of-calling:java.util.HashMap
    //#unanalyzed(void setOption(String, String, List)): Effects-of-calling:java.util.List:remove
    //#unanalyzed(void setOption(String, String, List)): Effects-of-calling:com.dmdirc.util.ConfigFile:isKeyDomain
    //#unanalyzed(void setOption(String, String, List)): Effects-of-calling:java.util.HashSet
    //#unanalyzed(void setOption(String, String, List)): Effects-of-calling:hasOption
    //#unanalyzed(void setOption(String, String, List)): Effects-of-calling:getOption
    //#unanalyzed(void setOption(String, String, List)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void setOption(String, String, List)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void setOption(String, String, List)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void setOption(String, String, List)): Effects-of-calling:java.util.logging.Logger:finer
    //#unanalyzed(void setOption(String, String, List)): Effects-of-calling:java.util.List:iterator
    //#unanalyzed(void setOption(String, String, List)): Effects-of-calling:getSources
    //#unanalyzed(void setOption(String, String, List)): Effects-of-calling:addListener
    //#unanalyzed(void setOption(String, String, List)): Effects-of-calling:com.dmdirc.config.ConfigSource
    //#unanalyzed(void setOption(String, String, List)): Effects-of-calling:com.dmdirc.util.MapList
    //#unanalyzed(void setOption(String, String, List)): Effects-of-calling:addConfigManager
    //#unanalyzed(void setOption(String, String, List)): Effects-of-calling:com.dmdirc.util.MapList:containsKey
    //#unanalyzed(void setOption(String, String, List)): Effects-of-calling:com.dmdirc.util.MapList:get
    //#unanalyzed(void setOption(String, String, List)): Effects-of-calling:java.util.List:addAll
    //#unanalyzed(void setOption(String, String, List)): Effects-of-calling:getDomains
    //#unanalyzed(void setOption(String, String, List)): Effects-of-calling:java.util.List:contains
    //#unanalyzed(void setOption(String, String, List)): Effects-of-calling:java.util.Set:iterator
    //#unanalyzed(void setOption(String, String, List)): Effects-of-calling:getOptions
    //#unanalyzed(void setOption(String, String, List)): Effects-of-calling:equals
    //#unanalyzed(void setOption(String, String, List)): Effects-of-calling:removeListener
    //#unanalyzed(void setOption(String, String, List)): Effects-of-calling:java.lang.Integer:intValue
    //#unanalyzed(void setOption(String, String, List)): Effects-of-calling:java.lang.Integer:valueOf
    //#unanalyzed(void setOption(String, String, List)): Effects-of-calling:java.util.Map:put
    //#unanalyzed(void setOption(String, String, List)): Effects-of-calling:java.lang.IllegalArgumentException
    //#unanalyzed(void setOption(String, String, List)): Effects-of-calling:com.dmdirc.logger.Logger:assertTrue
    //#unanalyzed(void setOption(String, String, List)): Effects-of-calling:getTarget
    //#unanalyzed(void setOption(String, String, List)): Effects-of-calling:com.dmdirc.config.ConfigTarget$TYPE:ordinal
    //#unanalyzed(void setOption(String, String, List)): Effects-of-calling:java.lang.String:equalsIgnoreCase
    //#unanalyzed(void setOption(String, String, List)): Effects-of-calling:java.util.Collections:sort
    //#test_vector(void setOption(String, String, List)): java.lang.StringBuilder:length(...)@425: {-2_147_483_648..0}, {1..4_294_967_295}
    //#test_vector(void setOption(String, String, List)): java.util.Iterator:hasNext(...)@421: {0}, {1}
        for (String part : value) {
            temp.append('\n');
            temp.append(part);
        }
        setOption(domain, option, temp.length() > 0 ? temp.substring(1) : temp.toString());
    }
    //#Identity.java:426: end of method: void com.dmdirc.config.Identity.setOption(String, String, List)

    /**
     * Unsets a specified option.
     *
     * @param domain domain of the option
     * @param option name of the option
     */
    public synchronized void unsetOption(final String domain, final String option) {
        file.getKeyDomain(domain).remove(option);
    //#Identity.java:435: method: void com.dmdirc.config.Identity.unsetOption(String, String)
    //#Identity.java:435: Warning: method not available - call not analyzed
    //#    call on Map com.dmdirc.util.ConfigFile:getKeyDomain(String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.config.Identity
    //#    method: void unsetOption(String, String)
    //#    unanalyzed callee: Map com.dmdirc.util.ConfigFile:getKeyDomain(String)
    //#input(void unsetOption(String, String)): domain
    //#input(void unsetOption(String, String)): option
    //#input(void unsetOption(String, String)): this
    //#input(void unsetOption(String, String)): this.file
    //#input(void unsetOption(String, String)): this.listeners
    //#output(void unsetOption(String, String)): this.needSave
    //#pre[5] (void unsetOption(String, String)): this.file != null
    //#presumption(void unsetOption(String, String)): com.dmdirc.util.ConfigFile:getKeyDomain(...)@435 != null
    //#post(void unsetOption(String, String)): this.needSave == 1
    //#unanalyzed(void unsetOption(String, String)): Effects-of-calling:java.util.ArrayList
    //#unanalyzed(void unsetOption(String, String)): Effects-of-calling:java.util.ArrayList:iterator
    //#unanalyzed(void unsetOption(String, String)): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(void unsetOption(String, String)): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(void unsetOption(String, String)): Effects-of-calling:com.dmdirc.interfaces.ConfigChangeListener:configChanged
        needSave = true;

        fireSettingChange(domain, option);
    }
    //#Identity.java:439: end of method: void com.dmdirc.config.Identity.unsetOption(String, String)

    /**
     * Returns the set of domains available in this identity.
     *
     * @since 0.6
     * @return The set of domains used by this identity
     */
    public Set<String> getDomains() {
        return new HashSet<String>(file.getKeyDomains().keySet());
    //#Identity.java:448: method: Set com.dmdirc.config.Identity.getDomains()
    //#Identity.java:448: Warning: method not available - call not analyzed
    //#    call on Map com.dmdirc.util.ConfigFile:getKeyDomains()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.config.Identity
    //#    method: Set getDomains()
    //#    unanalyzed callee: Map com.dmdirc.util.ConfigFile:getKeyDomains()
    //#input(Set getDomains()): this
    //#input(Set getDomains()): this.file
    //#output(Set getDomains()): new HashSet(getDomains#1) num objects
    //#output(Set getDomains()): return_value
    //#new obj(Set getDomains()): new HashSet(getDomains#1)
    //#pre[2] (Set getDomains()): this.file != null
    //#presumption(Set getDomains()): com.dmdirc.util.ConfigFile:getKeyDomains(...)@448 != null
    //#post(Set getDomains()): return_value == &new HashSet(getDomains#1)
    //#post(Set getDomains()): new HashSet(getDomains#1) num objects == 1
    //#Identity.java:448: end of method: Set com.dmdirc.config.Identity.getDomains()
    }

    /**
     * Retrieves a map of all options within the specified domain in this
     * identity.
     *
     * @param domain The domain to retrieve
     * @since 0.6
     * @return A map of option names to values
     */
    public synchronized Map<String, String> getOptions(final String domain) {
        return new HashMap<String, String>(file.getKeyDomain(domain));
    //#Identity.java:460: method: Map com.dmdirc.config.Identity.getOptions(String)
    //#Identity.java:460: Warning: method not available - call not analyzed
    //#    call on Map com.dmdirc.util.ConfigFile:getKeyDomain(String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.config.Identity
    //#    method: Map getOptions(String)
    //#    unanalyzed callee: Map com.dmdirc.util.ConfigFile:getKeyDomain(String)
    //#input(Map getOptions(String)): domain
    //#input(Map getOptions(String)): this
    //#input(Map getOptions(String)): this.__Lock
    //#input(Map getOptions(String)): this.file
    //#output(Map getOptions(String)): new HashMap(getOptions#1) num objects
    //#output(Map getOptions(String)): return_value
    //#new obj(Map getOptions(String)): new HashMap(getOptions#1)
    //#pre[3] (Map getOptions(String)): this.file != null
    //#post(Map getOptions(String)): return_value == &new HashMap(getOptions#1)
    //#post(Map getOptions(String)): new HashMap(getOptions#1) num objects == 1
    //#Identity.java:460: end of method: Map com.dmdirc.config.Identity.getOptions(String)
    }

    /**
     * Saves this identity to disk if it has been updated.
     */
    public synchronized void save() {
        LOGGER.fine(getName() + ": save(); needsave = " + needSave);
    //#Identity.java:467: method: void com.dmdirc.config.Identity.save()
    //#input(void save()): " (= "._tainted
    //#input(void save()): ""._tainted
    //#input(void save()): ")"._tainted
    //#input(void save()): "."._tainted
    //#input(void save()): ": I'm a global config"._tainted
    //#input(void save()): ": found superfluous setting: "._tainted
    //#input(void save()): ": save(); needsave = "._tainted
    //#input(void save()): ": source: "._tainted
    //#input(void save()): "<Unknown>"._tainted
    //#input(void save()): "@"._tainted
    //#input(void save()): "Config option not found: "._tainted
    //#input(void save()): "Unable to save identity file: "._tainted
    //#input(void save()): "Unnamed"._tainted
    //#input(void save()): DOMAIN
    //#input(void save()): LOGGER
    //#input(void save()): __Descendant_Table[com/dmdirc/config/Identity]
    //#input(void save()): __Descendant_Table[others]
    //#input(void save()): __Dispatch_Table.addListener(Lcom/dmdirc/interfaces/ConfigChangeListener;)V
    //#input(void save()): __Dispatch_Table.equals(Ljava/lang/Object;)Z
    //#input(void save()): __Dispatch_Table.getDomains()Ljava/util/Set;
    //#input(void save()): __Dispatch_Table.getName()Ljava/lang/String;
    //#input(void save()): __Dispatch_Table.getOption(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
    //#input(void save()): __Dispatch_Table.getOptions(Ljava/lang/String;)Ljava/util/Map;
    //#input(void save()): __Dispatch_Table.getTarget()Lcom/dmdirc/config/ConfigTarget;
    //#input(void save()): __Dispatch_Table.hasOption(Ljava/lang/String;Ljava/lang/String;)Z
    //#input(void save()): __Dispatch_Table.removeListener(Lcom/dmdirc/interfaces/ConfigChangeListener;)V
    //#input(void save()): com.dmdirc.config.ConfigManager$1__static_init.new int[](ConfigManager$1__static_init#1).length
    //#input(void save()): com.dmdirc.config.ConfigManager$1__static_init.new int[](ConfigManager$1__static_init#1)[0..4_294_967_295]
    //#input(void save()): com.dmdirc.logger.ErrorLevel.MEDIUM
    //#input(void save()): com/dmdirc/config/ConfigManager$1.$SwitchMap$com$dmdirc$config$ConfigTarget$TYPE
    //#input(void save()): com/dmdirc/config/ConfigManager.__Descendant_Table[com/dmdirc/config/ConfigManager]
    //#input(void save()): com/dmdirc/config/ConfigManager.__Descendant_Table[others]
    //#input(void save()): com/dmdirc/config/ConfigManager.__Dispatch_Table.configChanged(Ljava/lang/String;Ljava/lang/String;)V
    //#input(void save()): com/dmdirc/config/ConfigManager.__Dispatch_Table.getOption(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
    //#input(void save()): com/dmdirc/config/ConfigManager.__Dispatch_Table.getScope(Ljava/lang/String;Ljava/lang/String;)Lcom/dmdirc/config/Identity;
    //#input(void save()): com/dmdirc/config/ConfigManager.__Dispatch_Table.getSources()Ljava/util/List;
    //#input(void save()): com/dmdirc/config/ConfigManager.__Dispatch_Table.hasOption(Ljava/lang/String;Ljava/lang/String;)Z
    //#input(void save()): com/dmdirc/config/ConfigManager.__Dispatch_Table.identityApplies(Lcom/dmdirc/config/Identity;)Z
    //#input(void save()): com/dmdirc/config/ConfigManager.__Dispatch_Table.removeIdentity(Lcom/dmdirc/config/Identity;)V
    //#input(void save()): com/dmdirc/config/ConfigManager.stats
    //#input(void save()): com/dmdirc/config/ConfigTarget$TYPE.GLOBAL
    //#input(void save()): com/dmdirc/config/ConfigTarget.__Descendant_Table[com/dmdirc/config/ConfigTarget]
    //#input(void save()): com/dmdirc/config/ConfigTarget.__Descendant_Table[others]
    //#input(void save()): com/dmdirc/config/ConfigTarget.__Dispatch_Table.getData()Ljava/lang/String;
    //#input(void save()): com/dmdirc/config/ConfigTarget.__Dispatch_Table.getType()Lcom/dmdirc/config/ConfigTarget$TYPE;
    //#input(void save()): com/dmdirc/config/IdentityManager.identities
    //#input(void save()): com/dmdirc/config/IdentityManager.managers
    //#input(void save()): java.util.logging.Level.FINEST
    //#input(void save()): this
    //#input(void save()): this.__Tag
    //#input(void save()): this.file
    //#input(void save()): this.globalConfig
    //#input(void save()): this.globalConfig.__Tag
    //#input(void save()): this.globalConfig.listeners
    //#input(void save()): this.globalConfig.sources
    //#input(void save()): this.globalConfig.sources.__Lock
    //#input(void save()): this.listeners
    //#input(void save()): this.myTarget
    //#input(void save()): this.myTarget.__Tag
    //#input(void save()): this.myTarget.type
    //#input(void save()): this.needSave
    //#output(void save()): java.lang.StringBuilder:toString(...)._tainted
    //#output(void save()): new ArrayList(getSources#1) num objects
    //#output(void save()): new ArrayList(getSources#1).__Lock
    //#output(void save()): new ConfigManager(save#3) num objects
    //#output(void save()): new ConfigManager(save#3).__Tag
    //#output(void save()): new ConfigManager(save#3).channel
    //#output(void save()): new ConfigManager(save#3).ircd
    //#output(void save()): new ConfigManager(save#3).listeners
    //#output(void save()): new ConfigManager(save#3).network
    //#output(void save()): new ConfigManager(save#3).server
    //#output(void save()): new ConfigManager(save#3).sources
    //#output(void save()): new MapList(ConfigManager#1) num objects
    //#output(void save()): this.globalConfig
    //#output(void save()): this.needSave
    //#new obj(void save()): java.lang.StringBuilder:toString(...)
    //#new obj(void save()): new ArrayList(getSources#1)
    //#new obj(void save()): new ConfigManager(save#3)
    //#new obj(void save()): new MapList(ConfigManager#1)
    //#pre[6] (void save()): init'ed(this.needSave)
    //#pre[9] (void save()): this.__Tag == com/dmdirc/config/Identity
    //#pre[10] (void save()): this.file != null
    //#pre[2] (void save()): (soft) init'ed(com.dmdirc.config.ConfigManager$1__static_init.new int[](ConfigManager$1__static_init#1)[0..4_294_967_295])
    //#pre[5] (void save()): (soft) init'ed(this.globalConfig)
    //#pre[12] (void save()): (soft) this.listeners != null
    //#pre[14] (void save()): (soft) this.myTarget.__Tag == com/dmdirc/config/ConfigTarget
    //#pre[15] (void save()): (soft) init'ed(this.myTarget.type)
    //#presumption(void save()): init'ed(com.dmdirc.logger.ErrorLevel.MEDIUM)
    //#presumption(void save()): com.dmdirc.util.ConfigFile:getKeyDomain(...)@500 != null
    //#presumption(void save()): com.dmdirc.util.ConfigFile:getKeyDomain(...)@507 != null
    //#presumption(void save()): com.dmdirc.util.ConfigFile:getKeyDomains(...)@488 != null
    //#presumption(void save()): java.util.Iterator:next(...).__Tag@482 == com/dmdirc/config/Identity
    //#presumption(void save()): java.util.Iterator:next(...)@482 != null
    //#presumption(void save()): java.util.Iterator:next(...)@488 != null
    //#presumption(void save()): java.util.Iterator:next(...)@492 != null
    //#presumption(void save()): java.util.Map:entrySet(...)@488 != null
    //#presumption(void save()): java.util.Map_Entry:getValue(...)@492 != null
    //#presumption(void save()): init'ed(java.util.logging.Level.FINEST)
    //#presumption(void save()): java.util.logging.Logger:getLogger(...)@76 != null
    //#presumption(void save()): source.__Tag@483 == com/dmdirc/config/Identity
    //#presumption(void save()): source.file@482 != null
    //#presumption(void save()): this.globalConfig.__Tag@471 == com/dmdirc/config/ConfigManager
    //#presumption(void save()): this.globalConfig.listeners@471 != null
    //#presumption(void save()): this.globalConfig.sources@471 != null
    //#post(void save()): java.lang.StringBuilder:toString(...)._tainted == 0
    //#post(void save()): this.globalConfig == One-of{old this.globalConfig, &new ConfigManager(save#3)}
    //#post(void save()): init'ed(this.globalConfig)
    //#post(void save()): init'ed(this.needSave)
    //#post(void save()): new ArrayList(getSources#1) num objects <= 1
    //#post(void save()): init'ed(new ArrayList(getSources#1).__Lock)
    //#post(void save()): new ConfigManager(save#3) num objects <= 1
    //#post(void save()): init'ed(new ConfigManager(save#3).__Tag)
    //#post(void save()): init'ed(new ConfigManager(save#3).channel)
    //#post(void save()): init'ed(new ConfigManager(save#3).ircd)
    //#post(void save()): init'ed(new ConfigManager(save#3).listeners)
    //#post(void save()): init'ed(new ConfigManager(save#3).network)
    //#post(void save()): init'ed(new ConfigManager(save#3).server)
    //#post(void save()): init'ed(new ConfigManager(save#3).sources)
    //#post(void save()): new MapList(ConfigManager#1) num objects <= 1
    //#unanalyzed(void save()): Effects-of-calling:com.dmdirc.util.ConfigFile:getKeyDomains
    //#unanalyzed(void save()): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(void save()): Effects-of-calling:java.util.List:add
    //#unanalyzed(void save()): Effects-of-calling:java.util.Map:get
    //#unanalyzed(void save()): Effects-of-calling:java.lang.String:equals
    //#unanalyzed(void save()): Effects-of-calling:java.util.Map:keySet
    //#unanalyzed(void save()): Effects-of-calling:com.dmdirc.util.ConfigFile:getKeyDomain
    //#unanalyzed(void save()): Effects-of-calling:java.util.HashMap
    //#unanalyzed(void save()): Effects-of-calling:java.util.List:remove
    //#unanalyzed(void save()): Effects-of-calling:com.dmdirc.util.ConfigFile:isKeyDomain
    //#unanalyzed(void save()): Effects-of-calling:java.util.HashSet
    //#unanalyzed(void save()): Effects-of-calling:hasOption
    //#unanalyzed(void save()): Effects-of-calling:getOption
    //#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:java.util.List:iterator
    //#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:getSources
    //#unanalyzed(void save()): Effects-of-calling:addListener
    //#unanalyzed(void save()): Effects-of-calling:com.dmdirc.config.ConfigSource
    //#unanalyzed(void save()): Effects-of-calling:com.dmdirc.util.MapList
    //#unanalyzed(void save()): Effects-of-calling:addConfigManager
    //#unanalyzed(void save()): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(void save()): Effects-of-calling:java.util.ArrayList
    //#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.List:addAll
    //#unanalyzed(void save()): Effects-of-calling:com.dmdirc.interfaces.ConfigChangeListener:configChanged
    //#unanalyzed(void save()): Effects-of-calling:getDomains
    //#unanalyzed(void save()): Effects-of-calling:java.util.List:contains
    //#unanalyzed(void save()): Effects-of-calling:java.util.Set:iterator
    //#unanalyzed(void save()): Effects-of-calling:getOptions
    //#unanalyzed(void save()): Effects-of-calling:equals
    //#unanalyzed(void save()): Effects-of-calling:removeListener
    //#unanalyzed(void save()): Effects-of-calling:java.lang.Integer:intValue
    //#unanalyzed(void save()): Effects-of-calling:java.lang.Integer:valueOf
    //#unanalyzed(void save()): Effects-of-calling:java.util.Map:put
    //#unanalyzed(void save()): Effects-of-calling:java.lang.IllegalArgumentException
    //#unanalyzed(void save()): Effects-of-calling:com.dmdirc.logger.Logger:assertTrue
    //#unanalyzed(void save()): Effects-of-calling:getTarget
    //#unanalyzed(void save()): Effects-of-calling:com.dmdirc.config.ConfigTarget$TYPE:ordinal
    //#unanalyzed(void save()): Effects-of-calling:java.lang.String:equalsIgnoreCase
    //#unanalyzed(void save()): Effects-of-calling:java.util.Collections:sort
    //#test_vector(void save()): this.globalConfig: Inverse{null}, Addr_Set{null}
    //#test_vector(void save()): this.needSave: {0}, {1}
    //#test_vector(void save()): this.myTarget: Addr_Set{null}, Inverse{null}
    //#test_vector(void save()): com.dmdirc.util.ConfigFile:isKeyDomain(...)@506: {0}, {1}
    //#test_vector(void save()): com.dmdirc.util.ConfigFile:isWritable(...)@469: {0}, {1}
    //#test_vector(void save()): java.lang.String:equals(...)@496: {0}, {1}
    //#test_vector(void save()): java.util.Iterator:hasNext(...)@482: {0}, {1}
    //#test_vector(void save()): java.util.Iterator:hasNext(...)@488: {0}, {1}
    //#test_vector(void save()): java.util.Iterator:hasNext(...)@492: {0}, {1}
    //#test_vector(void save()): java.util.logging.Logger:isLoggable(...)@481: {0}, {1}

        if (needSave && file != null && file.isWritable()) {
    //#Identity.java:469: Warning: test always goes same way
    //#    Test predetermined because this.file != null
    //#    severity: LOW
    //#    class: com.dmdirc.config.Identity
    //#    method: void save()
    //#    from bb: bb_2
    //#    live edge: bb_2-->bb_3
    //#    tested vn: this.file == null
    //#    tested vn values: {0}
    //#Identity.java:469: Warning: method not available - call not analyzed
    //#    call on bool com.dmdirc.util.ConfigFile:isWritable()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.config.Identity
    //#    method: void save()
    //#    unanalyzed callee: bool com.dmdirc.util.ConfigFile:isWritable()
            if (myTarget != null && myTarget.getType() == ConfigTarget.TYPE.GLOBAL) {
                LOGGER.finer(getName() + ": I'm a global config");
                // If we're the global config, unset useless settings that are
                // covered by global defaults.

                if (globalConfig == null) {
                    globalConfig = new ConfigManager("", "", "");
                }

                globalConfig.removeIdentity(this);

                if (LOGGER.isLoggable(Level.FINEST)) {
                    for (Identity source : globalConfig.getSources()) {
                        LOGGER.finest(getName() + ": source: " + source.getName());
                    }
                }

                for (Map.Entry<String, Map<String, String>> entry
                        : file.getKeyDomains().entrySet()) {
    //#Identity.java:488: Warning: method not available - call not analyzed
    //#    call on Map com.dmdirc.util.ConfigFile:getKeyDomains()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.config.Identity
    //#    method: void save()
    //#    unanalyzed callee: Map com.dmdirc.util.ConfigFile:getKeyDomains()
                    final String domain = entry.getKey();

                    for (Map.Entry<String, String> subentry : 
                        new HashSet<Map.Entry<String, String>>(entry.getValue().entrySet())) {
                        final String key = subentry.getKey();
                        final String value = subentry.getValue();

                        if (globalConfig.hasOption(domain, key) &&
    //#Identity.java:496: ?null dereference
    //#    getOption(...) != null
    //#    severity: MEDIUM
    //#    class: com.dmdirc.config.Identity
    //#    method: void save()
    //#    basic block: bb_17
    //#    assertion: getOption(...) != null
    //#    VN: getOption(...)
    //#    Expected: Inverse{null} or Invalid
    //#    Bad: Addr_Set{null}
    //#    Attribs:  Ptr  null in Bad
                                globalConfig.getOption(domain, key).equals(value)) {
                            LOGGER.finest(getName() + ": found superfluous setting: "
                                    + domain + "." + key + " (= " + value + ")");
                            file.getKeyDomain(domain).remove(key);
    //#Identity.java:500: Warning: method not available - call not analyzed
    //#    call on Map com.dmdirc.util.ConfigFile:getKeyDomain(String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.config.Identity
    //#    method: void save()
    //#    unanalyzed callee: Map com.dmdirc.util.ConfigFile:getKeyDomain(String)
                        }
                    }
                }
            }

            if (file.isKeyDomain("temp")) {
    //#Identity.java:506: Warning: method not available - call not analyzed
    //#    call on bool com.dmdirc.util.ConfigFile:isKeyDomain(String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.config.Identity
    //#    method: void save()
    //#    unanalyzed callee: bool com.dmdirc.util.ConfigFile:isKeyDomain(String)
                file.getKeyDomain("temp").clear();
    //#Identity.java:507: Warning: method not available - call not analyzed
    //#    call on Map com.dmdirc.util.ConfigFile:getKeyDomain(String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.config.Identity
    //#    method: void save()
    //#    unanalyzed callee: Map com.dmdirc.util.ConfigFile:getKeyDomain(String)
            }

            try {
                file.write();
    //#Identity.java:511: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.util.ConfigFile:write()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.config.Identity
    //#    method: void save()
    //#    unanalyzed callee: void com.dmdirc.util.ConfigFile:write()

                needSave = false;
            } catch (IOException ex) {
                Logger.userError(ErrorLevel.MEDIUM,
    //#Identity.java:515: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.logger.Logger:userError(ErrorLevel, String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.config.Identity
    //#    method: void save()
    //#    unanalyzed callee: void com.dmdirc.logger.Logger:userError(ErrorLevel, String)
                        "Unable to save identity file: " + ex.getMessage());
            }
        }
    }
    //#Identity.java:519: end of method: void com.dmdirc.config.Identity.save()

    /**
     * Deletes this identity from disk.
     */
    public synchronized void delete() {
        if (file != null) {
    //#Identity.java:525: method: void com.dmdirc.config.Identity.delete()
    //#Identity.java:525: Warning: test always goes same way
    //#    Test predetermined because this.file != null
    //#    severity: LOW
    //#    class: com.dmdirc.config.Identity
    //#    method: void delete()
    //#    from bb: Entry_BB_1
    //#    live edge: Entry_BB_1-->bb_2
    //#    tested vn: this.file == null
    //#    tested vn values: {0}
    //#input(void delete()): "."._tainted
    //#input(void delete()): DOMAIN
    //#input(void delete()): __Descendant_Table[com/dmdirc/config/Identity]
    //#input(void delete()): __Descendant_Table[others]
    //#input(void delete()): __Dispatch_Table.equals(Ljava/lang/Object;)Z
    //#input(void delete()): __Dispatch_Table.getDomains()Ljava/util/Set;
    //#input(void delete()): __Dispatch_Table.getName()Ljava/lang/String;
    //#input(void delete()): __Dispatch_Table.getOption(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
    //#input(void delete()): __Dispatch_Table.getOptions(Ljava/lang/String;)Ljava/util/Map;
    //#input(void delete()): __Dispatch_Table.getTarget()Lcom/dmdirc/config/ConfigTarget;
    //#input(void delete()): __Dispatch_Table.hasOption(Ljava/lang/String;Ljava/lang/String;)Z
    //#input(void delete()): __Dispatch_Table.removeListener(Lcom/dmdirc/interfaces/ConfigChangeListener;)V
    //#input(void delete()): com/dmdirc/config/ConfigManager.__Descendant_Table[com/dmdirc/config/ConfigManager]
    //#input(void delete()): com/dmdirc/config/ConfigManager.__Descendant_Table[others]
    //#input(void delete()): com/dmdirc/config/ConfigManager.__Dispatch_Table.configChanged(Ljava/lang/String;Ljava/lang/String;)V
    //#input(void delete()): com/dmdirc/config/ConfigManager.__Dispatch_Table.getScope(Ljava/lang/String;Ljava/lang/String;)Lcom/dmdirc/config/Identity;
    //#input(void delete()): com/dmdirc/config/ConfigManager.__Dispatch_Table.removeIdentity(Lcom/dmdirc/config/Identity;)V
    //#input(void delete()): com/dmdirc/config/IdentityManager.identities
    //#input(void delete()): com/dmdirc/config/IdentityManager.managers
    //#input(void delete()): this
    //#input(void delete()): this.__Tag
    //#input(void delete()): this.file
    //#input(void delete()): this.listeners
    //#input(void delete()): this.myTarget
    //#pre[5] (void delete()): (soft) this.__Tag == com/dmdirc/config/Identity
    //#pre[6] (void delete()): (soft) this.file != null
    //#pre[7] (void delete()): (soft) this.listeners != null
    //#unanalyzed(void delete()): Effects-of-calling:com.dmdirc.util.ConfigFile:getKeyDomains
    //#unanalyzed(void delete()): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(void delete()): Effects-of-calling:java.util.Map:get
    //#unanalyzed(void delete()): Effects-of-calling:java.lang.String:equals
    //#unanalyzed(void delete()): Effects-of-calling:java.util.Map:keySet
    //#unanalyzed(void delete()): Effects-of-calling:com.dmdirc.util.ConfigFile:getKeyDomain
    //#unanalyzed(void delete()): Effects-of-calling:java.util.HashMap
    //#unanalyzed(void delete()): Effects-of-calling:java.util.List:remove
    //#unanalyzed(void delete()): Effects-of-calling:com.dmdirc.util.ConfigFile:isKeyDomain
    //#unanalyzed(void delete()): Effects-of-calling:java.util.HashSet
    //#unanalyzed(void delete()): Effects-of-calling:hasOption
    //#unanalyzed(void delete()): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void delete()): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void delete()): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void delete()): Effects-of-calling:java.util.List:iterator
    //#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:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(void delete()): Effects-of-calling:java.util.ArrayList
    //#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.List:addAll
    //#unanalyzed(void delete()): Effects-of-calling:com.dmdirc.interfaces.ConfigChangeListener:configChanged
    //#unanalyzed(void delete()): Effects-of-calling:getDomains
    //#unanalyzed(void delete()): Effects-of-calling:java.util.List:contains
    //#unanalyzed(void delete()): Effects-of-calling:java.util.List:add
    //#unanalyzed(void delete()): Effects-of-calling:java.util.Set:iterator
    //#unanalyzed(void delete()): Effects-of-calling:getOptions
    //#unanalyzed(void delete()): Effects-of-calling:equals
    //#unanalyzed(void delete()): Effects-of-calling:removeListener
    //#unanalyzed(void delete()): Effects-of-calling:com.dmdirc.logger.Logger:assertTrue
            file.delete();
    //#Identity.java:526: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.util.ConfigFile:delete()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.config.Identity
    //#    method: void delete()
    //#    unanalyzed callee: void com.dmdirc.util.ConfigFile:delete()
        }

        IdentityManager.removeIdentity(this);
    }
    //#Identity.java:530: end of method: void com.dmdirc.config.Identity.delete()

    /**
     * Retrieves this identity's target.
     *
     * @return The target of this identity
     */
    public ConfigTarget getTarget() {
        return myTarget;
    //#Identity.java:538: method: ConfigTarget com.dmdirc.config.Identity.getTarget()
    //#input(ConfigTarget getTarget()): this
    //#input(ConfigTarget getTarget()): this.myTarget
    //#output(ConfigTarget getTarget()): return_value
    //#post(ConfigTarget getTarget()): return_value == this.myTarget
    //#post(ConfigTarget getTarget()): init'ed(return_value)
    //#Identity.java:538: end of method: ConfigTarget com.dmdirc.config.Identity.getTarget()
    }

    /**
     * Retrieve this identity's ConfigFile.
     *
     * @return The ConfigFile object used by this identity
     * @deprecated Direct access should be avoided to prevent synchronisation
     * issues
     */
    @Deprecated
    public ConfigFile getFile() {
        return file;
    //#Identity.java:550: method: ConfigFile com.dmdirc.config.Identity.getFile()
    //#input(ConfigFile getFile()): this
    //#input(ConfigFile getFile()): this.file
    //#output(ConfigFile getFile()): return_value
    //#post(ConfigFile getFile()): return_value == this.file
    //#post(ConfigFile getFile()): init'ed(return_value)
    //#Identity.java:550: end of method: ConfigFile com.dmdirc.config.Identity.getFile()
    }

    /**
     * Adds a new config change listener for this identity.
     *
     * @param listener The listener to be added
     */
    public void addListener(final ConfigChangeListener listener) {
        listeners.add(listener);
    //#Identity.java:559: method: void com.dmdirc.config.Identity.addListener(ConfigChangeListener)
    //#input(void addListener(ConfigChangeListener)): listener
    //#input(void addListener(ConfigChangeListener)): this
    //#input(void addListener(ConfigChangeListener)): this.listeners
    //#pre[3] (void addListener(ConfigChangeListener)): this.listeners != null
    }
    //#Identity.java:560: end of method: void com.dmdirc.config.Identity.addListener(ConfigChangeListener)

    /**
     * Removes the specific config change listener from this identity.
     *
     * @param listener The listener to be removed
     */
    public void removeListener(final ConfigChangeListener listener) {
        listeners.remove(listener);
    //#Identity.java:568: method: void com.dmdirc.config.Identity.removeListener(ConfigChangeListener)
    //#input(void removeListener(ConfigChangeListener)): listener
    //#input(void removeListener(ConfigChangeListener)): this
    //#input(void removeListener(ConfigChangeListener)): this.listeners
    //#pre[3] (void removeListener(ConfigChangeListener)): this.listeners != null
    }
    //#Identity.java:569: end of method: void com.dmdirc.config.Identity.removeListener(ConfigChangeListener)

    /**
     * Returns a string representation of this object (its name).
     *
     * @return A string representation of this object
     */
    @Override
    public String toString() {
        return getName();
    //#Identity.java:578: method: String com.dmdirc.config.Identity.toString()
    //#input(String toString()): DOMAIN
    //#input(String toString()): __Descendant_Table[com/dmdirc/config/Identity]
    //#input(String toString()): __Descendant_Table[others]
    //#input(String toString()): __Dispatch_Table.getName()Ljava/lang/String;
    //#input(String toString()): __Dispatch_Table.getOption(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
    //#input(String toString()): __Dispatch_Table.hasOption(Ljava/lang/String;Ljava/lang/String;)Z
    //#input(String toString()): this
    //#input(String toString()): this.__Tag
    //#input(String toString()): this.file
    //#output(String toString()): return_value
    //#pre[3] (String toString()): this.__Tag == com/dmdirc/config/Identity
    //#pre[4] (String toString()): this.file != null
    //#post(String toString()): init'ed(return_value)
    //#unanalyzed(String toString()): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(String toString()): Effects-of-calling:java.util.Map:get
    //#unanalyzed(String toString()): Effects-of-calling:com.dmdirc.util.ConfigFile:getKeyDomain
    //#unanalyzed(String toString()): Effects-of-calling:com.dmdirc.util.ConfigFile:isKeyDomain
    //#Identity.java:578: end of method: String com.dmdirc.config.Identity.toString()
    }

    /** {@inheritDoc} */
    @Override
    public int hashCode() {
        return getName().hashCode() + getTarget().hashCode();
    //#Identity.java:584: method: int com.dmdirc.config.Identity.hashCode()
    //#Identity.java:584: ?null dereference
    //#    getName(...) != null
    //#    severity: MEDIUM
    //#    class: com.dmdirc.config.Identity
    //#    method: int hashCode()
    //#    basic block: Entry_BB_1
    //#    assertion: getName(...) != null
    //#    VN: getName(...)
    //#    Expected: Inverse{null} or Invalid
    //#    Bad: Addr_Set{null}
    //#    Attribs:  Ptr  null in Bad
    //#input(int hashCode()): DOMAIN
    //#input(int hashCode()): __Descendant_Table[com/dmdirc/config/Identity]
    //#input(int hashCode()): __Descendant_Table[others]
    //#input(int hashCode()): __Dispatch_Table.getName()Ljava/lang/String;
    //#input(int hashCode()): __Dispatch_Table.getOption(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
    //#input(int hashCode()): __Dispatch_Table.getTarget()Lcom/dmdirc/config/ConfigTarget;
    //#input(int hashCode()): __Dispatch_Table.hasOption(Ljava/lang/String;Ljava/lang/String;)Z
    //#input(int hashCode()): com/dmdirc/config/ConfigTarget.__Descendant_Table[com/dmdirc/config/ConfigTarget]
    //#input(int hashCode()): com/dmdirc/config/ConfigTarget.__Descendant_Table[others]
    //#input(int hashCode()): com/dmdirc/config/ConfigTarget.__Dispatch_Table.hashCode()I
    //#input(int hashCode()): this
    //#input(int hashCode()): this.__Tag
    //#input(int hashCode()): this.file
    //#input(int hashCode()): this.myTarget
    //#input(int hashCode()): this.myTarget.__Tag
    //#input(int hashCode()): this.myTarget.data
    //#input(int hashCode()): this.myTarget.type
    //#output(int hashCode()): return_value
    //#pre[3] (int hashCode()): this.__Tag == com/dmdirc/config/Identity
    //#pre[4] (int hashCode()): this.file != null
    //#pre[5] (int hashCode()): this.myTarget != null
    //#pre[6] (int hashCode()): this.myTarget.__Tag == com/dmdirc/config/ConfigTarget
    //#pre[7] (int hashCode()): this.myTarget.data != null
    //#pre[8] (int hashCode()): this.myTarget.type != null
    //#presumption(int hashCode()): com.dmdirc.config.ConfigTarget_TYPE:ordinal(...)@206 + java.lang.String:hashCode(...)@206 + java.lang.String:hashCode(...)@584 in {-2_147_483_648..4_294_967_295}
    //#post(int hashCode()): init'ed(return_value)
    //#unanalyzed(int hashCode()): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(int hashCode()): Effects-of-calling:java.util.Map:get
    //#unanalyzed(int hashCode()): Effects-of-calling:com.dmdirc.util.ConfigFile:getKeyDomain
    //#unanalyzed(int hashCode()): Effects-of-calling:com.dmdirc.util.ConfigFile:isKeyDomain
    //#unanalyzed(int hashCode()): Effects-of-calling:com.dmdirc.config.ConfigTarget$TYPE:ordinal
    //#unanalyzed(int hashCode()): Effects-of-calling:java.lang.String:hashCode
    //#Identity.java:584: end of method: int com.dmdirc.config.Identity.hashCode()
    }

    /** {@inheritDoc} */
    @Override
    public boolean equals(final Object obj) {
        if (obj instanceof Identity
    //#Identity.java:590: method: bool com.dmdirc.config.Identity.equals(Object)
    //#Identity.java:590: ?null dereference
    //#    getName(...) != null
    //#    severity: MEDIUM
    //#    class: com.dmdirc.config.Identity
    //#    method: bool equals(Object)
    //#    basic block: bb_8
    //#    assertion: getName(...) != null
    //#    VN: getName(...)
    //#    Expected: Inverse{null} or Invalid
    //#    Bad: Addr_Set{null}
    //#    Attribs:  Ptr  null in Bad
    //#input(bool equals(Object)): DOMAIN
    //#input(bool equals(Object)): __Descendant_Table[com/dmdirc/config/Identity]
    //#input(bool equals(Object)): __Descendant_Table[others]
    //#input(bool equals(Object)): __Dispatch_Table.getName()Ljava/lang/String;
    //#input(bool equals(Object)): __Dispatch_Table.getOption(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
    //#input(bool equals(Object)): __Dispatch_Table.getTarget()Lcom/dmdirc/config/ConfigTarget;
    //#input(bool equals(Object)): __Dispatch_Table.hasOption(Ljava/lang/String;Ljava/lang/String;)Z
    //#input(bool equals(Object)): obj
    //#input(bool equals(Object)): obj.__Tag
    //#input(bool equals(Object)): obj.file
    //#input(bool equals(Object)): obj.myTarget
    //#input(bool equals(Object)): this
    //#input(bool equals(Object)): this.__Tag
    //#input(bool equals(Object)): this.file
    //#input(bool equals(Object)): this.myTarget
    //#output(bool equals(Object)): return_value
    //#pre[4] (bool equals(Object)): (soft) obj.file != null
    //#pre[8] (bool equals(Object)): (soft) this.__Tag == com/dmdirc/config/Identity
    //#pre[9] (bool equals(Object)): (soft) this.file != null
    //#post(bool equals(Object)): init'ed(return_value)
    //#unanalyzed(bool equals(Object)): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(bool equals(Object)): Effects-of-calling:java.util.Map:get
    //#unanalyzed(bool equals(Object)): Effects-of-calling:com.dmdirc.util.ConfigFile:getKeyDomain
    //#unanalyzed(bool equals(Object)): Effects-of-calling:com.dmdirc.util.ConfigFile:isKeyDomain
    //#test_vector(bool equals(Object)): this.myTarget == obj.myTarget: {0}, {1}
    //#test_vector(bool equals(Object)): java.lang.String:equals(...)@590: {0}, {1}
                && getName().equals(((Identity) obj).getName())
                && getTarget() == ((Identity) obj).getTarget()) {
            return true;
        }
        return false;
    //#Identity.java:595: end of method: bool com.dmdirc.config.Identity.equals(Object)
    }

    /**
     * Compares this identity to another config source to determine which
     * is more specific.
     *
     * @param target The Identity to compare to
     * @return -1 if this config source is less specific, 0 if they're equal,
     * +1 if this config is more specific.
     */
    @Override
    public int compareTo(final Identity target) {
        return target.getTarget().compareTo(myTarget);
    //#Identity.java:608: method: int com.dmdirc.config.Identity.compareTo(Identity)
    //#input(int compareTo(Identity)): __Descendant_Table[com/dmdirc/config/Identity]
    //#input(int compareTo(Identity)): __Descendant_Table[others]
    //#input(int compareTo(Identity)): __Dispatch_Table.getTarget()Lcom/dmdirc/config/ConfigTarget;
    //#input(int compareTo(Identity)): com/dmdirc/config/ConfigTarget.__Descendant_Table[com/dmdirc/config/ConfigTarget]
    //#input(int compareTo(Identity)): com/dmdirc/config/ConfigTarget.__Descendant_Table[others]
    //#input(int compareTo(Identity)): com/dmdirc/config/ConfigTarget.__Dispatch_Table.compareTo(Ljava/lang/Object;)I
    //#input(int compareTo(Identity)): com/dmdirc/config/ConfigTarget.__Dispatch_Table.getOrder()I
    //#input(int compareTo(Identity)): com/dmdirc/config/ConfigTarget.__Dispatch_Table.getType()Lcom/dmdirc/config/ConfigTarget$TYPE;
    //#input(int compareTo(Identity)): target
    //#input(int compareTo(Identity)): target.__Tag
    //#input(int compareTo(Identity)): target.myTarget
    //#input(int compareTo(Identity)): target.myTarget.__Tag
    //#input(int compareTo(Identity)): target.myTarget.order
    //#input(int compareTo(Identity)): target.myTarget.type
    //#input(int compareTo(Identity)): this
    //#input(int compareTo(Identity)): this.myTarget
    //#input(int compareTo(Identity)): this.myTarget.__Tag
    //#input(int compareTo(Identity)): this.myTarget.order
    //#input(int compareTo(Identity)): this.myTarget.type
    //#output(int compareTo(Identity)): return_value
    //#pre[1] (int compareTo(Identity)): target != null
    //#pre[2] (int compareTo(Identity)): target.__Tag == com/dmdirc/config/Identity
    //#pre[3] (int compareTo(Identity)): target.myTarget != null
    //#pre[4] (int compareTo(Identity)): target.myTarget.__Tag == com/dmdirc/config/ConfigTarget
    //#pre[6] (int compareTo(Identity)): target.myTarget.type != null
    //#pre[8] (int compareTo(Identity)): this.myTarget != null
    //#pre[9] (int compareTo(Identity)): this.myTarget.__Tag == com/dmdirc/config/ConfigTarget
    //#pre[12] (int compareTo(Identity)): init'ed(this.myTarget.type)
    //#pre[5] (int compareTo(Identity)): (soft) init'ed(target.myTarget.order)
    //#pre[10] (int compareTo(Identity)): (soft) init'ed(this.myTarget.order)
    //#pre[11] (int compareTo(Identity)): (soft) this.myTarget.order - target.myTarget.order in {-2_147_483_648..4_294_967_295}
    //#post(int compareTo(Identity)): init'ed(return_value)
    //#unanalyzed(int compareTo(Identity)): Effects-of-calling:com.dmdirc.config.ConfigTarget$TYPE:equals
    //#unanalyzed(int compareTo(Identity)): Effects-of-calling:com.dmdirc.config.ConfigTarget$TYPE:compareTo
    //#Identity.java:608: end of method: int com.dmdirc.config.Identity.compareTo(Identity)
    }

    /**
     * Creates a new identity containing the specified properties.
     *
     * @param settings The settings to populate the identity with
     * @return A new identity containing the specified properties
     * @throws IOException If the file cannot be created
     * @throws InvalidIdentityFileException If the settings are invalid
     * @since 0.6.3m1
     */
    protected static Identity createIdentity(final Map<String, Map<String, String>> settings)
            throws IOException, InvalidIdentityFileException {
        if (!settings.containsKey(DOMAIN) || !settings.get(DOMAIN).containsKey("name")
    //#Identity.java:622: method: Identity com.dmdirc.config.Identity.createIdentity(Map)
    //#input(Identity createIdentity(Map)): " to "._tainted
    //#input(Identity createIdentity(Map)): ""._tainted
    //#input(Identity createIdentity(Map)): "&#10;"._tainted
    //#input(Identity createIdentity(Map)): "-"._tainted
    //#input(Identity createIdentity(Map)): "."._tainted
    //#input(Identity createIdentity(Map)): ": setting "._tainted
    //#input(Identity createIdentity(Map)): "<Unknown>"._tainted
    //#input(Identity createIdentity(Map)): "@"._tainted
    //#input(Identity createIdentity(Map)): "Config option not found: "._tainted
    //#input(Identity createIdentity(Map)): "Unnamed"._tainted
    //#input(Identity createIdentity(Map)): "identities"._tainted
    //#input(Identity createIdentity(Map)): "nicknames"._tainted
    //#input(Identity createIdentity(Map)): "order"._tainted
    //#input(Identity createIdentity(Map)): DOMAIN
    //#input(Identity createIdentity(Map)): LOGGER
    //#input(Identity createIdentity(Map)): PROFILE_DOMAIN
    //#input(Identity createIdentity(Map)): __Descendant_Table[com/dmdirc/config/Identity]
    //#input(Identity createIdentity(Map)): __Descendant_Table[others]
    //#input(Identity createIdentity(Map)): __Dispatch_Table.addListener(Lcom/dmdirc/interfaces/ConfigChangeListener;)V
    //#input(Identity createIdentity(Map)): __Dispatch_Table.equals(Ljava/lang/Object;)Z
    //#input(Identity createIdentity(Map)): __Dispatch_Table.getDomains()Ljava/util/Set;
    //#input(Identity createIdentity(Map)): __Dispatch_Table.getName()Ljava/lang/String;
    //#input(Identity createIdentity(Map)): __Dispatch_Table.getOption(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
    //#input(Identity createIdentity(Map)): __Dispatch_Table.getOptionInt(Ljava/lang/String;Ljava/lang/String;)I
    //#input(Identity createIdentity(Map)): __Dispatch_Table.getOptions(Ljava/lang/String;)Ljava/util/Map;
    //#input(Identity createIdentity(Map)): __Dispatch_Table.getTarget()Lcom/dmdirc/config/ConfigTarget;
    //#input(Identity createIdentity(Map)): __Dispatch_Table.hasOption(Ljava/lang/String;Ljava/lang/String;)Z
    //#input(Identity createIdentity(Map)): __Dispatch_Table.isProfile()Z
    //#input(Identity createIdentity(Map)): __Dispatch_Table.migrateProfile()V
    //#input(Identity createIdentity(Map)): __Dispatch_Table.removeListener(Lcom/dmdirc/interfaces/ConfigChangeListener;)V
    //#input(Identity createIdentity(Map)): __Dispatch_Table.setOption(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
    //#input(Identity createIdentity(Map)): __Dispatch_Table.unsetOption(Ljava/lang/String;Ljava/lang/String;)V
    //#input(Identity createIdentity(Map)): com.dmdirc.config.ConfigManager$1__static_init.new int[](ConfigManager$1__static_init#1).length
    //#input(Identity createIdentity(Map)): com.dmdirc.config.ConfigManager$1__static_init.new int[](ConfigManager$1__static_init#1)[0..4_294_967_295]
    //#input(Identity createIdentity(Map)): com/dmdirc/config/ConfigManager$1.$SwitchMap$com$dmdirc$config$ConfigTarget$TYPE
    //#input(Identity createIdentity(Map)): com/dmdirc/config/ConfigManager.__Descendant_Table[com/dmdirc/config/ConfigManager]
    //#input(Identity createIdentity(Map)): com/dmdirc/config/ConfigManager.__Descendant_Table[others]
    //#input(Identity createIdentity(Map)): com/dmdirc/config/ConfigManager.__Dispatch_Table.checkIdentity(Lcom/dmdirc/config/Identity;)V
    //#input(Identity createIdentity(Map)): com/dmdirc/config/ConfigManager.__Dispatch_Table.configChanged(Ljava/lang/String;Ljava/lang/String;)V
    //#input(Identity createIdentity(Map)): com/dmdirc/config/ConfigManager.__Dispatch_Table.getOption(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
    //#input(Identity createIdentity(Map)): com/dmdirc/config/ConfigManager.__Dispatch_Table.getScope(Ljava/lang/String;Ljava/lang/String;)Lcom/dmdirc/config/Identity;
    //#input(Identity createIdentity(Map)): com/dmdirc/config/ConfigManager.__Dispatch_Table.hasOption(Ljava/lang/String;Ljava/lang/String;)Z
    //#input(Identity createIdentity(Map)): com/dmdirc/config/ConfigManager.__Dispatch_Table.identityApplies(Lcom/dmdirc/config/Identity;)Z
    //#input(Identity createIdentity(Map)): com/dmdirc/config/ConfigManager.__Dispatch_Table.removeIdentity(Lcom/dmdirc/config/Identity;)V
    //#input(Identity createIdentity(Map)): com/dmdirc/config/ConfigManager.stats
    //#input(Identity createIdentity(Map)): com/dmdirc/config/ConfigSource.__Descendant_Table[com/dmdirc/config/ConfigManager]
    //#input(Identity createIdentity(Map)): com/dmdirc/config/ConfigSource.__Descendant_Table[com/dmdirc/config/ConfigSource]
    //#input(Identity createIdentity(Map)): com/dmdirc/config/ConfigSource.__Descendant_Table[com/dmdirc/config/Identity]
    //#input(Identity createIdentity(Map)): com/dmdirc/config/ConfigSource.__Descendant_Table[others]
    //#input(Identity createIdentity(Map)): com/dmdirc/config/ConfigSource.__Dispatch_Table.getOption(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
    //#input(Identity createIdentity(Map)): com/dmdirc/config/ConfigTarget$TYPE.CHANNEL
    //#input(Identity createIdentity(Map)): com/dmdirc/config/ConfigTarget$TYPE.GLOBAL
    //#input(Identity createIdentity(Map)): com/dmdirc/config/ConfigTarget$TYPE.GLOBALDEFAULT
    //#input(Identity createIdentity(Map)): com/dmdirc/config/ConfigTarget$TYPE.IRCD
    //#input(Identity createIdentity(Map)): com/dmdirc/config/ConfigTarget$TYPE.NETWORK
    //#input(Identity createIdentity(Map)): com/dmdirc/config/ConfigTarget$TYPE.PROFILE
    //#input(Identity createIdentity(Map)): com/dmdirc/config/ConfigTarget$TYPE.SERVER
    //#input(Identity createIdentity(Map)): com/dmdirc/config/ConfigTarget.__Descendant_Table[com/dmdirc/config/ConfigTarget]
    //#input(Identity createIdentity(Map)): com/dmdirc/config/ConfigTarget.__Descendant_Table[others]
    //#input(Identity createIdentity(Map)): com/dmdirc/config/ConfigTarget.__Dispatch_Table.getData()Ljava/lang/String;
    //#input(Identity createIdentity(Map)): com/dmdirc/config/ConfigTarget.__Dispatch_Table.getType()Lcom/dmdirc/config/ConfigTarget$TYPE;
    //#input(Identity createIdentity(Map)): com/dmdirc/config/ConfigTarget.__Dispatch_Table.setChannel(Ljava/lang/String;)V
    //#input(Identity createIdentity(Map)): com/dmdirc/config/ConfigTarget.__Dispatch_Table.setGlobal()V
    //#input(Identity createIdentity(Map)): com/dmdirc/config/ConfigTarget.__Dispatch_Table.setGlobalDefault()V
    //#input(Identity createIdentity(Map)): com/dmdirc/config/ConfigTarget.__Dispatch_Table.setIrcd(Ljava/lang/String;)V
    //#input(Identity createIdentity(Map)): com/dmdirc/config/ConfigTarget.__Dispatch_Table.setNetwork(Ljava/lang/String;)V
    //#input(Identity createIdentity(Map)): com/dmdirc/config/ConfigTarget.__Dispatch_Table.setOrder(I)V
    //#input(Identity createIdentity(Map)): com/dmdirc/config/ConfigTarget.__Dispatch_Table.setProfile()V
    //#input(Identity createIdentity(Map)): com/dmdirc/config/ConfigTarget.__Dispatch_Table.setServer(Ljava/lang/String;)V
    //#input(Identity createIdentity(Map)): com/dmdirc/config/IdentityManager.identities
    //#input(Identity createIdentity(Map)): com/dmdirc/config/IdentityManager.managers
    //#input(Identity createIdentity(Map)): settings
    //#output(Identity createIdentity(Map)): java.lang.StringBuilder:toString(...)._tainted
    //#output(Identity createIdentity(Map)): new ArrayList(getSources#1) num objects
    //#output(Identity createIdentity(Map)): new ArrayList(getSources#1).__Lock
    //#output(Identity createIdentity(Map)): new ConfigFile(Identity#2) num objects
    //#output(Identity createIdentity(Map)): new ConfigManager(setOption#2) num objects
    //#output(Identity createIdentity(Map)): new ConfigManager(setOption#2).__Tag
    //#output(Identity createIdentity(Map)): new ConfigManager(setOption#2).channel
    //#output(Identity createIdentity(Map)): new ConfigManager(setOption#2).ircd
    //#output(Identity createIdentity(Map)): new ConfigManager(setOption#2).listeners
    //#output(Identity createIdentity(Map)): new ConfigManager(setOption#2).network
    //#output(Identity createIdentity(Map)): new ConfigManager(setOption#2).server
    //#output(Identity createIdentity(Map)): new ConfigManager(setOption#2).sources
    //#output(Identity createIdentity(Map)): new ConfigTarget(getTarget#1) num objects
    //#output(Identity createIdentity(Map)): new ConfigTarget(getTarget#1).__Tag
    //#output(Identity createIdentity(Map)): new ConfigTarget(getTarget#1).data
    //#output(Identity createIdentity(Map)): new ConfigTarget(getTarget#1).order
    //#output(Identity createIdentity(Map)): new ConfigTarget(getTarget#1).type
    //#output(Identity createIdentity(Map)): new Identity(createIdentity#7) num objects
    //#output(Identity createIdentity(Map)): return_value.__Lock
    //#output(Identity createIdentity(Map)): return_value.__Tag
    //#output(Identity createIdentity(Map)): return_value.file
    //#output(Identity createIdentity(Map)): return_value.globalConfig
    //#output(Identity createIdentity(Map)): return_value.listeners
    //#output(Identity createIdentity(Map)): return_value.myTarget
    //#output(Identity createIdentity(Map)): return_value.needSave
    //#output(Identity createIdentity(Map)): return_value.sources
    //#output(Identity createIdentity(Map)): new MapList(ConfigManager#1) num objects
    //#output(Identity createIdentity(Map)): new WeakList(Identity#1) num objects
    //#output(Identity createIdentity(Map)): return_value
    //#new obj(Identity createIdentity(Map)): java.lang.StringBuilder:toString(...)
    //#new obj(Identity createIdentity(Map)): new ArrayList(getSources#1)
    //#new obj(Identity createIdentity(Map)): new ConfigFile(Identity#2)
    //#new obj(Identity createIdentity(Map)): new ConfigManager(setOption#2)
    //#new obj(Identity createIdentity(Map)): new ConfigTarget(getTarget#1)
    //#new obj(Identity createIdentity(Map)): new Identity(createIdentity#7)
    //#new obj(Identity createIdentity(Map)): new MapList(ConfigManager#1)
    //#new obj(Identity createIdentity(Map)): new WeakList(Identity#1)
    //#pre[4] (Identity createIdentity(Map)): settings != null
    //#pre[1] (Identity createIdentity(Map)): (soft) init'ed(com.dmdirc.config.ConfigManager$1__static_init.new int[](ConfigManager$1__static_init#1)[0..4_294_967_295])
    //#presumption(Identity createIdentity(Map)): java.lang.String:isEmpty(...)@622 == 0
    //#presumption(Identity createIdentity(Map)): java.util.Iterator:next(...)@640 != null
    //#presumption(Identity createIdentity(Map)): java.util.Map:containsKey(...)@622 == 1
    //#presumption(Identity createIdentity(Map)): java.util.Map:containsKey(...)@622 == 1
    //#presumption(Identity createIdentity(Map)): java.util.Map:entrySet(...)@640 != null
    //#presumption(Identity createIdentity(Map)): java.util.Map:get(...)@622 != null
    //#presumption(Identity createIdentity(Map)): java.util.Map:get(...)@622 != null
    //#presumption(Identity createIdentity(Map)): java.util.Map:get(...)@622 != null
    //#presumption(Identity createIdentity(Map)): java.util.Map:get(...)@629 != null
    //#presumption(Identity createIdentity(Map)): java.util.Map:get(...)@629 != null
    //#post(Identity createIdentity(Map)): java.lang.StringBuilder:toString(...)._tainted == 0
    //#post(Identity createIdentity(Map)): new ArrayList(getSources#1) num objects == 0
    //#post(Identity createIdentity(Map)): new ConfigManager(setOption#2) num objects == 0
    //#post(Identity createIdentity(Map)): new MapList(ConfigManager#1) num objects == 0
    //#post(Identity createIdentity(Map)): return_value == &new Identity(createIdentity#7)
    //#post(Identity createIdentity(Map)): init'ed(new ArrayList(getSources#1).__Lock)
    //#post(Identity createIdentity(Map)): new ConfigFile(Identity#2) num objects == 1
    //#post(Identity createIdentity(Map)): new ConfigTarget(getTarget#1) num objects == 1
    //#post(Identity createIdentity(Map)): new Identity(createIdentity#7) num objects == 1
    //#post(Identity createIdentity(Map)): new WeakList(Identity#1) num objects == 1
    //#post(Identity createIdentity(Map)): init'ed(new ConfigManager(setOption#2).__Tag)
    //#post(Identity createIdentity(Map)): init'ed(new ConfigManager(setOption#2).channel)
    //#post(Identity createIdentity(Map)): init'ed(new ConfigManager(setOption#2).ircd)
    //#post(Identity createIdentity(Map)): init'ed(new ConfigManager(setOption#2).listeners)
    //#post(Identity createIdentity(Map)): init'ed(new ConfigManager(setOption#2).network)
    //#post(Identity createIdentity(Map)): init'ed(new ConfigManager(setOption#2).server)
    //#post(Identity createIdentity(Map)): init'ed(new ConfigManager(setOption#2).sources)
    //#post(Identity createIdentity(Map)): new ConfigTarget(getTarget#1).__Tag == com/dmdirc/config/ConfigTarget
    //#post(Identity createIdentity(Map)): init'ed(new ConfigTarget(getTarget#1).data)
    //#post(Identity createIdentity(Map)): init'ed(new ConfigTarget(getTarget#1).order)
    //#post(Identity createIdentity(Map)): new ConfigTarget(getTarget#1).type == &com.dmdirc.config.ConfigTarget$TYPE__static_init.new ConfigTarget$TYPE(ConfigTarget$TYPE__static_init#5)
    //#post(Identity createIdentity(Map)): init'ed(return_value.__Lock)
    //#post(Identity createIdentity(Map)): return_value.__Tag == com/dmdirc/config/Identity
    //#post(Identity createIdentity(Map)): return_value.file == &new ConfigFile(Identity#2)
    //#post(Identity createIdentity(Map)): init'ed(return_value.globalConfig)
    //#post(Identity createIdentity(Map)): return_value.listeners == &new WeakList(Identity#1)
    //#post(Identity createIdentity(Map)): return_value.myTarget == &new ConfigTarget(getTarget#1)
    //#post(Identity createIdentity(Map)): init'ed(return_value.needSave)
    //#post(Identity createIdentity(Map)): return_value.sources == undefined
    //#post(Identity createIdentity(Map)): return_value.sources == null
    //#unanalyzed(Identity createIdentity(Map)): Effects-of-calling:java.util.ArrayList
    //#unanalyzed(Identity createIdentity(Map)): Effects-of-calling:java.util.ArrayList:iterator
    //#unanalyzed(Identity createIdentity(Map)): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(Identity createIdentity(Map)): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(Identity createIdentity(Map)): Effects-of-calling:com.dmdirc.interfaces.ConfigChangeListener:configChanged
    //#unanalyzed(Identity createIdentity(Map)): Effects-of-calling:com.dmdirc.util.ConfigFile:getKeyDomains
    //#unanalyzed(Identity createIdentity(Map)): Effects-of-calling:com.dmdirc.util.ConfigFile:read
    //#unanalyzed(Identity createIdentity(Map)): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(Identity createIdentity(Map)): Effects-of-calling:java.util.List:add
    //#unanalyzed(Identity createIdentity(Map)): Effects-of-calling:java.util.Map:get
    //#unanalyzed(Identity createIdentity(Map)): Effects-of-calling:java.lang.String:equals
    //#unanalyzed(Identity createIdentity(Map)): Effects-of-calling:java.util.Map:remove
    //#unanalyzed(Identity createIdentity(Map)): Effects-of-calling:java.util.Map:keySet
    //#unanalyzed(Identity createIdentity(Map)): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(Identity createIdentity(Map)): Effects-of-calling:com.dmdirc.util.ConfigFile:getKeyDomain
    //#unanalyzed(Identity createIdentity(Map)): Effects-of-calling:java.util.HashMap
    //#unanalyzed(Identity createIdentity(Map)): Effects-of-calling:java.util.List:remove
    //#unanalyzed(Identity createIdentity(Map)): Effects-of-calling:com.dmdirc.util.ConfigFile:isKeyDomain
    //#unanalyzed(Identity createIdentity(Map)): Effects-of-calling:java.util.HashSet
    //#unanalyzed(Identity createIdentity(Map)): Effects-of-calling:hasOption
    //#unanalyzed(Identity createIdentity(Map)): Effects-of-calling:getOption
    //#unanalyzed(Identity createIdentity(Map)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(Identity createIdentity(Map)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(Identity createIdentity(Map)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(Identity createIdentity(Map)): Effects-of-calling:java.util.logging.Logger:finer
    //#unanalyzed(Identity createIdentity(Map)): Effects-of-calling:java.util.List:iterator
    //#unanalyzed(Identity createIdentity(Map)): Effects-of-calling:getSources
    //#unanalyzed(Identity createIdentity(Map)): Effects-of-calling:addListener
    //#unanalyzed(Identity createIdentity(Map)): Effects-of-calling:com.dmdirc.config.ConfigSource
    //#unanalyzed(Identity createIdentity(Map)): Effects-of-calling:com.dmdirc.util.MapList
    //#unanalyzed(Identity createIdentity(Map)): Effects-of-calling:addConfigManager
    //#unanalyzed(Identity createIdentity(Map)): Effects-of-calling:com.dmdirc.util.MapList:containsKey
    //#unanalyzed(Identity createIdentity(Map)): Effects-of-calling:com.dmdirc.util.MapList:get
    //#unanalyzed(Identity createIdentity(Map)): Effects-of-calling:java.util.List:addAll
    //#unanalyzed(Identity createIdentity(Map)): Effects-of-calling:getDomains
    //#unanalyzed(Identity createIdentity(Map)): Effects-of-calling:java.util.List:contains
    //#unanalyzed(Identity createIdentity(Map)): Effects-of-calling:java.util.Set:iterator
    //#unanalyzed(Identity createIdentity(Map)): Effects-of-calling:getOptions
    //#unanalyzed(Identity createIdentity(Map)): Effects-of-calling:equals
    //#unanalyzed(Identity createIdentity(Map)): Effects-of-calling:removeListener
    //#unanalyzed(Identity createIdentity(Map)): Effects-of-calling:java.lang.Integer:intValue
    //#unanalyzed(Identity createIdentity(Map)): Effects-of-calling:java.lang.Integer:valueOf
    //#unanalyzed(Identity createIdentity(Map)): Effects-of-calling:java.util.Map:put
    //#unanalyzed(Identity createIdentity(Map)): Effects-of-calling:java.lang.IllegalArgumentException
    //#unanalyzed(Identity createIdentity(Map)): Effects-of-calling:java.lang.String:trim
    //#unanalyzed(Identity createIdentity(Map)): Effects-of-calling:java.lang.Integer:parseInt
    //#unanalyzed(Identity createIdentity(Map)): Effects-of-calling:java.lang.Exception
    //#unanalyzed(Identity createIdentity(Map)): Effects-of-calling:com.dmdirc.util.WeakList
    //#unanalyzed(Identity createIdentity(Map)): Effects-of-calling:com.dmdirc.util.ConfigFile
    //#unanalyzed(Identity createIdentity(Map)): Effects-of-calling:com.dmdirc.util.ConfigFile:setAutomake
    //#unanalyzed(Identity createIdentity(Map)): Effects-of-calling:java.io.FileInputStream
    //#unanalyzed(Identity createIdentity(Map)): Effects-of-calling:com.dmdirc.logger.Logger:assertTrue
    //#unanalyzed(Identity createIdentity(Map)): Effects-of-calling:getTarget
    //#unanalyzed(Identity createIdentity(Map)): Effects-of-calling:com.dmdirc.config.ConfigTarget$TYPE:ordinal
    //#unanalyzed(Identity createIdentity(Map)): Effects-of-calling:java.lang.String:equalsIgnoreCase
    //#unanalyzed(Identity createIdentity(Map)): Effects-of-calling:java.util.Collections:sort
    //#test_vector(Identity createIdentity(Map)): java.io.File:exists(...)@634: {0}, {1}
    //#test_vector(Identity createIdentity(Map)): java.util.Iterator:hasNext(...)@640: {0}, {1}
                || settings.get(DOMAIN).get("name").isEmpty()) {
            throw new InvalidIdentityFileException("identity.name is not set");
        }

        final String fs = System.getProperty("file.separator");
        final String location = Main.getConfigDir() + "identities" + fs;
    //#Identity.java:628: Warning: method not available - call not analyzed
    //#    call on String com.dmdirc.Main:getConfigDir()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.config.Identity
    //#    method: Identity createIdentity(Map)
    //#    unanalyzed callee: String com.dmdirc.Main:getConfigDir()
        final String name = settings.get(DOMAIN).get("name").replaceAll(ILLEGAL_CHARS, "_");

        File file = new File(location + name);
        int attempt = 0;

        while (file.exists()) {
            file = new File(location + name + "-" + ++attempt);
    //#Identity.java:635: ?overflow
    //#    attempt in {-2_147_483_649..4_294_967_294}
    //#    severity: LOW
    //#    class: com.dmdirc.config.Identity
    //#    method: Identity createIdentity(Map)
    //#    basic block: bb_3
    //#    assertion: attempt in {-2_147_483_649..4_294_967_294}
    //#    VN: attempt + 1
    //#    Expected: {-2_147_483_648..4_294_967_295, Invalid}
    //#    Bad: {4_294_967_296}
    //#    Attribs:  Int  Bad singleton  Bad > Exp
        }

        final ConfigFile configFile = new ConfigFile(file);
    //#Identity.java:638: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.util.ConfigFile(File)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.config.Identity
    //#    method: Identity createIdentity(Map)
    //#    unanalyzed callee: void com.dmdirc.util.ConfigFile(File)

        for (Map.Entry<String, Map<String, String>> entry : settings.entrySet()) {
            configFile.addDomain(entry.getKey(), entry.getValue());
    //#Identity.java:641: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.util.ConfigFile:addDomain(String, Map)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.config.Identity
    //#    method: Identity createIdentity(Map)
    //#    unanalyzed callee: void com.dmdirc.util.ConfigFile:addDomain(String, Map)
        }

        configFile.write();
    //#Identity.java:644: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.util.ConfigFile:write()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.config.Identity
    //#    method: Identity createIdentity(Map)
    //#    unanalyzed callee: void com.dmdirc.util.ConfigFile:write()

        final Identity identity = new Identity(file, false);
    //#Identity.java:646: ?!precondition failure
    //#    com/dmdirc/config/Identity.com.dmdirc.config.Identity: (soft) forceDefault == 1
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.config.Identity
    //#    method: Identity createIdentity(Map)
    //#    basic block: bb_7
    //#    assertion: (soft) false
    //#    callee: void com/dmdirc/config/Identity.com.dmdirc.config.Identity(File, bool)
    //#    callee assertion: (soft) forceDefault == 1
    //#    callee file: Identity.java
    //#    callee precondition index: [5]
    //#    callee srcpos: 106
    //#    VN: 0
    //#    Expected: {1}
    //#    Bad: {0}
    //#    Attribs:  Int  Exp in +/-1000  Exp singleton  Bad singleton  Bad overlaps +/-1000  Soft  Bad < Exp
        IdentityManager.addIdentity(identity);

        return identity;
    //#Identity.java:649: end of method: Identity com.dmdirc.config.Identity.createIdentity(Map)
    }

    /**
     * Generates an empty identity for the specified target.
     *
     * @param target The target for the new identity
     * @return An empty identity for the specified target
     * @throws IOException if the file can't be written
     * @see #createIdentity(java.util.Map)
     */
    public static Identity buildIdentity(final ConfigTarget target)
            throws IOException {
        final Map<String, Map<String, String>> settings
    //#Identity.java:662: method: Identity com.dmdirc.config.Identity.buildIdentity(ConfigTarget)
    //#input(Identity buildIdentity(ConfigTarget)): DOMAIN
    //#input(Identity buildIdentity(ConfigTarget)): com.dmdirc.config.ConfigTarget$1__static_init.new int[](ConfigTarget$1__static_init#1).length
    //#input(Identity buildIdentity(ConfigTarget)): com.dmdirc.config.ConfigTarget$1__static_init.new int[](ConfigTarget$1__static_init#1)[0..4_294_967_295]
    //#input(Identity buildIdentity(ConfigTarget)): com.dmdirc.logger.ErrorLevel.MEDIUM
    //#input(Identity buildIdentity(ConfigTarget)): com/dmdirc/config/ConfigTarget$1.$SwitchMap$com$dmdirc$config$ConfigTarget$TYPE
    //#input(Identity buildIdentity(ConfigTarget)): com/dmdirc/config/ConfigTarget.__Descendant_Table[com/dmdirc/config/ConfigTarget]
    //#input(Identity buildIdentity(ConfigTarget)): com/dmdirc/config/ConfigTarget.__Descendant_Table[others]
    //#input(Identity buildIdentity(ConfigTarget)): com/dmdirc/config/ConfigTarget.__Dispatch_Table.getData()Ljava/lang/String;
    //#input(Identity buildIdentity(ConfigTarget)): com/dmdirc/config/ConfigTarget.__Dispatch_Table.getTypeName()Ljava/lang/String;
    //#input(Identity buildIdentity(ConfigTarget)): target
    //#input(Identity buildIdentity(ConfigTarget)): target.__Tag
    //#input(Identity buildIdentity(ConfigTarget)): target.data
    //#input(Identity buildIdentity(ConfigTarget)): target.type
    //#output(Identity buildIdentity(ConfigTarget)): java.lang.StringBuilder:toString(...)._tainted
    //#output(Identity buildIdentity(ConfigTarget)): new ConfigFile(Identity#2) num objects
    //#output(Identity buildIdentity(ConfigTarget)): new ConfigManager(setOption#2) num objects
    //#output(Identity buildIdentity(ConfigTarget)): new ConfigManager(setOption#2).__Tag
    //#output(Identity buildIdentity(ConfigTarget)): new ConfigManager(setOption#2).channel
    //#output(Identity buildIdentity(ConfigTarget)): new ConfigManager(setOption#2).ircd
    //#output(Identity buildIdentity(ConfigTarget)): new ConfigManager(setOption#2).listeners
    //#output(Identity buildIdentity(ConfigTarget)): new ConfigManager(setOption#2).network
    //#output(Identity buildIdentity(ConfigTarget)): new ConfigManager(setOption#2).server
    //#output(Identity buildIdentity(ConfigTarget)): new ConfigManager(setOption#2).sources
    //#output(Identity buildIdentity(ConfigTarget)): new ConfigTarget(getTarget#1) num objects
    //#output(Identity buildIdentity(ConfigTarget)): new ConfigTarget(getTarget#1).__Tag
    //#output(Identity buildIdentity(ConfigTarget)): new ConfigTarget(getTarget#1).data
    //#output(Identity buildIdentity(ConfigTarget)): new ConfigTarget(getTarget#1).order
    //#output(Identity buildIdentity(ConfigTarget)): new ConfigTarget(getTarget#1).type
    //#output(Identity buildIdentity(ConfigTarget)): new Identity(createIdentity#7) num objects
    //#output(Identity buildIdentity(ConfigTarget)): new Identity(createIdentity#7).__Lock
    //#output(Identity buildIdentity(ConfigTarget)): new Identity(createIdentity#7).__Tag
    //#output(Identity buildIdentity(ConfigTarget)): new Identity(createIdentity#7).file
    //#output(Identity buildIdentity(ConfigTarget)): new Identity(createIdentity#7).globalConfig
    //#output(Identity buildIdentity(ConfigTarget)): new Identity(createIdentity#7).listeners
    //#output(Identity buildIdentity(ConfigTarget)): new Identity(createIdentity#7).myTarget
    //#output(Identity buildIdentity(ConfigTarget)): new Identity(createIdentity#7).needSave
    //#output(Identity buildIdentity(ConfigTarget)): new Identity(createIdentity#7).sources
    //#output(Identity buildIdentity(ConfigTarget)): new MapList(ConfigManager#1) num objects
    //#output(Identity buildIdentity(ConfigTarget)): new WeakList(Identity#1) num objects
    //#output(Identity buildIdentity(ConfigTarget)): return_value
    //#new obj(Identity buildIdentity(ConfigTarget)): java.lang.StringBuilder:toString(...)
    //#new obj(Identity buildIdentity(ConfigTarget)): new ConfigFile(Identity#2)
    //#new obj(Identity buildIdentity(ConfigTarget)): new ConfigManager(setOption#2)
    //#new obj(Identity buildIdentity(ConfigTarget)): new ConfigTarget(getTarget#1)
    //#new obj(Identity buildIdentity(ConfigTarget)): new Identity(createIdentity#7)
    //#new obj(Identity buildIdentity(ConfigTarget)): new MapList(ConfigManager#1)
    //#new obj(Identity buildIdentity(ConfigTarget)): new WeakList(Identity#1)
    //#pre[2] (Identity buildIdentity(ConfigTarget)): target != null
    //#pre[3] (Identity buildIdentity(ConfigTarget)): target.__Tag == com/dmdirc/config/ConfigTarget
    //#pre[4] (Identity buildIdentity(ConfigTarget)): init'ed(target.data)
    //#pre[5] (Identity buildIdentity(ConfigTarget)): target.type != null
    //#pre[1] (Identity buildIdentity(ConfigTarget)): (soft) init'ed(com.dmdirc.config.ConfigTarget$1__static_init.new int[](ConfigTarget$1__static_init#1)[0..4_294_967_295])
    //#presumption(Identity buildIdentity(ConfigTarget)): init'ed(com.dmdirc.logger.ErrorLevel.MEDIUM)
    //#presumption(Identity buildIdentity(ConfigTarget)): java.util.Map:get(...)@665 != null
    //#presumption(Identity buildIdentity(ConfigTarget)): java.util.Map:get(...)@666 != null
    //#post(Identity buildIdentity(ConfigTarget)): java.lang.StringBuilder:toString(...)._tainted == 0
    //#post(Identity buildIdentity(ConfigTarget)): init'ed(return_value)
    //#post(Identity buildIdentity(ConfigTarget)): new ConfigFile(Identity#2) num objects == undefined
    //#post(Identity buildIdentity(ConfigTarget)): new ConfigFile(Identity#2) num objects == 0, if init'ed
    //#post(Identity buildIdentity(ConfigTarget)): new ConfigManager(setOption#2) num objects == new ConfigFile(Identity#2) num objects
    //#post(Identity buildIdentity(ConfigTarget)): new ConfigManager(setOption#2).__Tag == new ConfigFile(Identity#2) num objects
    //#post(Identity buildIdentity(ConfigTarget)): new ConfigTarget(getTarget#1) num objects == new ConfigFile(Identity#2) num objects
    //#post(Identity buildIdentity(ConfigTarget)): new ConfigTarget(getTarget#1).__Tag == new ConfigFile(Identity#2) num objects
    //#post(Identity buildIdentity(ConfigTarget)): new ConfigTarget(getTarget#1).order == new ConfigFile(Identity#2) num objects
    //#post(Identity buildIdentity(ConfigTarget)): new Identity(createIdentity#7) num objects == new ConfigFile(Identity#2) num objects
    //#post(Identity buildIdentity(ConfigTarget)): new Identity(createIdentity#7).__Lock == new ConfigFile(Identity#2) num objects
    //#post(Identity buildIdentity(ConfigTarget)): new Identity(createIdentity#7).__Tag == new ConfigFile(Identity#2) num objects
    //#post(Identity buildIdentity(ConfigTarget)): new Identity(createIdentity#7).needSave == new ConfigFile(Identity#2) num objects
    //#post(Identity buildIdentity(ConfigTarget)): new MapList(ConfigManager#1) num objects == new ConfigFile(Identity#2) num objects
    //#post(Identity buildIdentity(ConfigTarget)): new WeakList(Identity#1) num objects == new ConfigFile(Identity#2) num objects
    //#post(Identity buildIdentity(ConfigTarget)): new ConfigManager(setOption#2).channel == undefined
    //#post(Identity buildIdentity(ConfigTarget)): new ConfigManager(setOption#2).channel == null
    //#post(Identity buildIdentity(ConfigTarget)): new ConfigManager(setOption#2).ircd == new ConfigManager(setOption#2).channel
    //#post(Identity buildIdentity(ConfigTarget)): new ConfigManager(setOption#2).listeners == new ConfigManager(setOption#2).channel
    //#post(Identity buildIdentity(ConfigTarget)): new ConfigManager(setOption#2).network == new ConfigManager(setOption#2).channel
    //#post(Identity buildIdentity(ConfigTarget)): new ConfigManager(setOption#2).server == new ConfigManager(setOption#2).channel
    //#post(Identity buildIdentity(ConfigTarget)): new ConfigManager(setOption#2).sources == new ConfigManager(setOption#2).channel
    //#post(Identity buildIdentity(ConfigTarget)): new ConfigTarget(getTarget#1).data == new ConfigManager(setOption#2).channel
    //#post(Identity buildIdentity(ConfigTarget)): new ConfigTarget(getTarget#1).type == new ConfigManager(setOption#2).channel
    //#post(Identity buildIdentity(ConfigTarget)): new Identity(createIdentity#7).file == new ConfigManager(setOption#2).channel
    //#post(Identity buildIdentity(ConfigTarget)): new Identity(createIdentity#7).globalConfig == new ConfigManager(setOption#2).channel
    //#post(Identity buildIdentity(ConfigTarget)): new Identity(createIdentity#7).listeners == new ConfigManager(setOption#2).channel
    //#post(Identity buildIdentity(ConfigTarget)): new Identity(createIdentity#7).myTarget == new ConfigManager(setOption#2).channel
    //#post(Identity buildIdentity(ConfigTarget)): new Identity(createIdentity#7).sources == new ConfigManager(setOption#2).channel
    //#unanalyzed(Identity buildIdentity(ConfigTarget)): Effects-of-calling:com.dmdirc.config.ConfigTarget$TYPE:ordinal
                = new HashMap<String, Map<String, String>>();
        settings.put(DOMAIN, new HashMap<String, String>(2));
        settings.get(DOMAIN).put("name", target.getData());
        settings.get(DOMAIN).put(target.getTypeName(), target.getData());

        try {
            return createIdentity(settings);
    //#Identity.java:669: Warning: call too complex - analysis skipped
    //#    call on Identity createIdentity(Map)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.config.Identity
    //#    method: Identity buildIdentity(ConfigTarget)
    //#    unanalyzed callee: Identity createIdentity(Map)
        } catch (InvalidIdentityFileException ex) {
            Logger.appError(ErrorLevel.MEDIUM, "Unable to create identity", ex);
    //#Identity.java:671: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.logger.Logger:appError(ErrorLevel, String, Throwable)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.config.Identity
    //#    method: Identity buildIdentity(ConfigTarget)
    //#    unanalyzed callee: void com.dmdirc.logger.Logger:appError(ErrorLevel, String, Throwable)
            return null;
    //#Identity.java:672: end of method: Identity com.dmdirc.config.Identity.buildIdentity(ConfigTarget)
        }
    }

    /**
     * Generates an empty profile witht he specified name. Note the name is used
     * as a file name, so should be sanitised.
     *
     * @param name The name of the profile to create
     * @return A new profile with the specified name
     * @throws IOException If the file can't be written
     * @see #createIdentity(java.util.Map)
     */
    public static Identity buildProfile(final String name) throws IOException {
        final Map<String, Map<String, String>> settings
    //#Identity.java:686: method: Identity com.dmdirc.config.Identity.buildProfile(String)
    //#input(Identity buildProfile(String)): DOMAIN
    //#input(Identity buildProfile(String)): PROFILE_DOMAIN
    //#input(Identity buildProfile(String)): com.dmdirc.logger.ErrorLevel.MEDIUM
    //#input(Identity buildProfile(String)): name
    //#output(Identity buildProfile(String)): java.lang.StringBuilder:toString(...)._tainted
    //#output(Identity buildProfile(String)): new ConfigFile(Identity#2) num objects
    //#output(Identity buildProfile(String)): new ConfigManager(setOption#2) num objects
    //#output(Identity buildProfile(String)): new ConfigManager(setOption#2).__Tag
    //#output(Identity buildProfile(String)): new ConfigManager(setOption#2).channel
    //#output(Identity buildProfile(String)): new ConfigManager(setOption#2).ircd
    //#output(Identity buildProfile(String)): new ConfigManager(setOption#2).listeners
    //#output(Identity buildProfile(String)): new ConfigManager(setOption#2).network
    //#output(Identity buildProfile(String)): new ConfigManager(setOption#2).server
    //#output(Identity buildProfile(String)): new ConfigManager(setOption#2).sources
    //#output(Identity buildProfile(String)): new ConfigTarget(getTarget#1) num objects
    //#output(Identity buildProfile(String)): new ConfigTarget(getTarget#1).__Tag
    //#output(Identity buildProfile(String)): new ConfigTarget(getTarget#1).data
    //#output(Identity buildProfile(String)): new ConfigTarget(getTarget#1).order
    //#output(Identity buildProfile(String)): new ConfigTarget(getTarget#1).type
    //#output(Identity buildProfile(String)): new Identity(createIdentity#7) num objects
    //#output(Identity buildProfile(String)): new Identity(createIdentity#7).__Lock
    //#output(Identity buildProfile(String)): new Identity(createIdentity#7).__Tag
    //#output(Identity buildProfile(String)): new Identity(createIdentity#7).file
    //#output(Identity buildProfile(String)): new Identity(createIdentity#7).globalConfig
    //#output(Identity buildProfile(String)): new Identity(createIdentity#7).listeners
    //#output(Identity buildProfile(String)): new Identity(createIdentity#7).myTarget
    //#output(Identity buildProfile(String)): new Identity(createIdentity#7).needSave
    //#output(Identity buildProfile(String)): new Identity(createIdentity#7).sources
    //#output(Identity buildProfile(String)): new MapList(ConfigManager#1) num objects
    //#output(Identity buildProfile(String)): new WeakList(Identity#1) num objects
    //#output(Identity buildProfile(String)): return_value
    //#new obj(Identity buildProfile(String)): java.lang.StringBuilder:toString(...)
    //#new obj(Identity buildProfile(String)): new ConfigFile(Identity#2)
    //#new obj(Identity buildProfile(String)): new ConfigManager(setOption#2)
    //#new obj(Identity buildProfile(String)): new ConfigTarget(getTarget#1)
    //#new obj(Identity buildProfile(String)): new Identity(createIdentity#7)
    //#new obj(Identity buildProfile(String)): new MapList(ConfigManager#1)
    //#new obj(Identity buildProfile(String)): new WeakList(Identity#1)
    //#presumption(Identity buildProfile(String)): init'ed(com.dmdirc.logger.ErrorLevel.MEDIUM)
    //#presumption(Identity buildProfile(String)): java.lang.System:getProperty(...)@691 != null
    //#presumption(Identity buildProfile(String)): java.util.Map:get(...)@693 != null
    //#presumption(Identity buildProfile(String)): java.util.Map:get(...)@694 != null
    //#presumption(Identity buildProfile(String)): java.util.Map:get(...)@695 != null
    //#post(Identity buildProfile(String)): java.lang.StringBuilder:toString(...)._tainted == 0
    //#post(Identity buildProfile(String)): init'ed(return_value)
    //#post(Identity buildProfile(String)): new ConfigFile(Identity#2) num objects == undefined
    //#post(Identity buildProfile(String)): new ConfigFile(Identity#2) num objects == 0, if init'ed
    //#post(Identity buildProfile(String)): new ConfigManager(setOption#2) num objects == new ConfigFile(Identity#2) num objects
    //#post(Identity buildProfile(String)): new ConfigManager(setOption#2).__Tag == new ConfigFile(Identity#2) num objects
    //#post(Identity buildProfile(String)): new ConfigTarget(getTarget#1) num objects == new ConfigFile(Identity#2) num objects
    //#post(Identity buildProfile(String)): new ConfigTarget(getTarget#1).__Tag == new ConfigFile(Identity#2) num objects
    //#post(Identity buildProfile(String)): new ConfigTarget(getTarget#1).order == new ConfigFile(Identity#2) num objects
    //#post(Identity buildProfile(String)): new Identity(createIdentity#7) num objects == new ConfigFile(Identity#2) num objects
    //#post(Identity buildProfile(String)): new Identity(createIdentity#7).__Lock == new ConfigFile(Identity#2) num objects
    //#post(Identity buildProfile(String)): new Identity(createIdentity#7).__Tag == new ConfigFile(Identity#2) num objects
    //#post(Identity buildProfile(String)): new Identity(createIdentity#7).needSave == new ConfigFile(Identity#2) num objects
    //#post(Identity buildProfile(String)): new MapList(ConfigManager#1) num objects == new ConfigFile(Identity#2) num objects
    //#post(Identity buildProfile(String)): new WeakList(Identity#1) num objects == new ConfigFile(Identity#2) num objects
    //#post(Identity buildProfile(String)): new ConfigManager(setOption#2).channel == undefined
    //#post(Identity buildProfile(String)): new ConfigManager(setOption#2).channel == null
    //#post(Identity buildProfile(String)): new ConfigManager(setOption#2).ircd == new ConfigManager(setOption#2).channel
    //#post(Identity buildProfile(String)): new ConfigManager(setOption#2).listeners == new ConfigManager(setOption#2).channel
    //#post(Identity buildProfile(String)): new ConfigManager(setOption#2).network == new ConfigManager(setOption#2).channel
    //#post(Identity buildProfile(String)): new ConfigManager(setOption#2).server == new ConfigManager(setOption#2).channel
    //#post(Identity buildProfile(String)): new ConfigManager(setOption#2).sources == new ConfigManager(setOption#2).channel
    //#post(Identity buildProfile(String)): new ConfigTarget(getTarget#1).data == new ConfigManager(setOption#2).channel
    //#post(Identity buildProfile(String)): new ConfigTarget(getTarget#1).type == new ConfigManager(setOption#2).channel
    //#post(Identity buildProfile(String)): new Identity(createIdentity#7).file == new ConfigManager(setOption#2).channel
    //#post(Identity buildProfile(String)): new Identity(createIdentity#7).globalConfig == new ConfigManager(setOption#2).channel
    //#post(Identity buildProfile(String)): new Identity(createIdentity#7).listeners == new ConfigManager(setOption#2).channel
    //#post(Identity buildProfile(String)): new Identity(createIdentity#7).myTarget == new ConfigManager(setOption#2).channel
    //#post(Identity buildProfile(String)): new Identity(createIdentity#7).sources == new ConfigManager(setOption#2).channel
                = new HashMap<String, Map<String, String>>();
        settings.put(DOMAIN, new HashMap<String, String>(1));
        settings.put(PROFILE_DOMAIN, new HashMap<String, String>(2));

        final String nick = System.getProperty("user.name").replace(' ', '_');

        settings.get(DOMAIN).put("name", name);
        settings.get(PROFILE_DOMAIN).put("nicknames", nick);
        settings.get(PROFILE_DOMAIN).put("realname", nick);

        try {
            return createIdentity(settings);
    //#Identity.java:698: Warning: call too complex - analysis skipped
    //#    call on Identity createIdentity(Map)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.config.Identity
    //#    method: Identity buildProfile(String)
    //#    unanalyzed callee: Identity createIdentity(Map)
        } catch (InvalidIdentityFileException ex) {
            Logger.appError(ErrorLevel.MEDIUM, "Unable to create identity", ex);
    //#Identity.java:700: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.logger.Logger:appError(ErrorLevel, String, Throwable)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.config.Identity
    //#    method: Identity buildProfile(String)
    //#    unanalyzed callee: void com.dmdirc.logger.Logger:appError(ErrorLevel, String, Throwable)
            return null;
    //#Identity.java:701: end of method: Identity com.dmdirc.config.Identity.buildProfile(String)
        }
    }

}
    //#Identity.java:: end of class: com.dmdirc.config.Identity
