/*
 * Master list of configuration options living in the Conf data
 * structure.
 *
 * Each CONF_OPTION directive defines a single CONF_foo primary key in
 * Conf, and can be equipped with the following properties:
 *
 *  - VALUE_TYPE: the type of data associated with that key
 *  - SUBKEY_TYPE: if the primary key goes with a subkey (that is, the
 *    primary key identifies some mapping from subkeys to values), the
 *    data type of the subkey
 *  - DEFAULT_INT, DEFAULT_STR, DEFAULT_BOOL: the default value for
 *    the key, if no save data is available. Must match VALUE_TYPE, if
 *    the key has no subkey. Otherwise, no default is permitted, and
 *    the default value of the mapping is assumed to be empty (and if
 *    not, then LOAD_CUSTOM code must override that).
 *  - SAVE_KEYWORD: the keyword used for the option in the Windows
 *    registry or ~/.putty/sessions save files.
 *  - STORAGE_ENUM: for int-typed settings with no subkeys, this
 *    identifies an enumeration in conf-enums.h which maps internal
 *    values of the setting in the Conf to values in the saved data.
 *  - LOAD_CUSTOM, SAVE_CUSTOM: suppress automated loading or saving
 *    (respectively) of this setting, in favour of manual code in
 *    settings.c load_open_settings() or save_open_settings()
 *    respectively.
 *  - NOT_SAVED: indicate that this setting is not part of saved
 *    session data at all.
 */

CONF_OPTION(host,
    VALUE_TYPE(STR),
    DEFAULT_STR(""),
    SAVE_KEYWORD("HostName"),
)
CONF_OPTION(port,
    VALUE_TYPE(INT),
    SAVE_KEYWORD("PortNumber"),
    LOAD_CUSTOM, /* default value depends on the value of CONF_protocol */
)
CONF_OPTION(protocol,
    VALUE_TYPE(INT), /* PROT_SSH, PROT_TELNET etc */
    LOAD_CUSTOM, SAVE_CUSTOM,
    /*
     * Notionally SAVE_KEYWORD("Protocol"), but saving/loading is handled by
     * custom code because the stored value is a string representation
     * of the protocol name.
     */
)
CONF_OPTION(addressfamily,
    VALUE_TYPE(INT),
    DEFAULT_INT(ADDRTYPE_UNSPEC),
    SAVE_KEYWORD("AddressFamily"),
    STORAGE_ENUM(addressfamily),
)
CONF_OPTION(close_on_exit,
    VALUE_TYPE(INT),
    DEFAULT_INT(AUTO),
    SAVE_KEYWORD("CloseOnExit"),
    STORAGE_ENUM(off_auto_on),
)
CONF_OPTION(warn_on_close,
    VALUE_TYPE(BOOL),
    DEFAULT_BOOL(true),
    SAVE_KEYWORD("WarnOnClose"),
)
CONF_OPTION(ping_interval,
    VALUE_TYPE(INT), /* in seconds */
    LOAD_CUSTOM, SAVE_CUSTOM,
    /*
     * Saving/loading is handled by custom code because for historical
     * reasons this value corresponds to two save keywords,
     * "PingInterval" (measured in minutes) and "PingIntervalSecs"
     * (measured in seconds), which are added together on loading.
     * Rationale: the value was once measured in minutes, and the
     * seconds field was added later.
     */
)
CONF_OPTION(tcp_nodelay,
    VALUE_TYPE(BOOL),
    DEFAULT_BOOL(true),
    SAVE_KEYWORD("TCPNoDelay"),
)
CONF_OPTION(tcp_keepalives,
    VALUE_TYPE(BOOL),
    DEFAULT_BOOL(false),
    SAVE_KEYWORD("TCPKeepalives"),
)
CONF_OPTION(loghost, /* logical host being contacted, for host key check */
    VALUE_TYPE(STR),
    DEFAULT_STR(""),
    SAVE_KEYWORD("LogHost"),
)

/* Proxy options */
CONF_OPTION(proxy_exclude_list,
    VALUE_TYPE(STR),
    DEFAULT_STR(""),
    SAVE_KEYWORD("ProxyExcludeList"),
)
CONF_OPTION(proxy_dns,
    VALUE_TYPE(INT),
    DEFAULT_INT(AUTO),
    SAVE_KEYWORD("ProxyDNS"),
    STORAGE_ENUM(off_auto_on),
)
CONF_OPTION(even_proxy_localhost,
    VALUE_TYPE(BOOL),
    DEFAULT_BOOL(false),
    SAVE_KEYWORD("ProxyLocalhost"),
)
CONF_OPTION(proxy_type,
    VALUE_TYPE(INT), /* PROXY_NONE, PROXY_SOCKS4, ... */
    STORAGE_ENUM(proxy_type),
    SAVE_KEYWORD("ProxyMethod"),
    LOAD_CUSTOM,
    /*
     * Custom load code: there was an earlier keyword "ProxyType"
     * using a different enumeration, in which SOCKS4 and SOCKS5
     * shared a value, and a second keyword "ProxySOCKSVersion"
     * disambiguated.
     */
)
CONF_OPTION(proxy_host,
    VALUE_TYPE(STR),
    DEFAULT_STR("proxy"),
    SAVE_KEYWORD("ProxyHost"),
)
CONF_OPTION(proxy_port,
    VALUE_TYPE(INT),
    DEFAULT_INT(80),
    SAVE_KEYWORD("ProxyPort"),
)
CONF_OPTION(proxy_username,
    VALUE_TYPE(STR),
    DEFAULT_STR(""),
    SAVE_KEYWORD("ProxyUsername"),
)
CONF_OPTION(proxy_password,
    VALUE_TYPE(STR),
    DEFAULT_STR(""),
    SAVE_KEYWORD("ProxyPassword"),
)
CONF_OPTION(proxy_telnet_command,
    VALUE_TYPE(STR),
    DEFAULT_STR("connect %host %port\\n"),
    SAVE_KEYWORD("ProxyTelnetCommand"),
)
CONF_OPTION(proxy_log_to_term,
    VALUE_TYPE(INT),
    DEFAULT_INT(FORCE_OFF),
    SAVE_KEYWORD("ProxyLogToTerm"),
    STORAGE_ENUM(on_off_auto),
)

/* SSH options */
CONF_OPTION(remote_cmd,
    VALUE_TYPE(STR),
    DEFAULT_STR(""),
    SAVE_KEYWORD("RemoteCommand"),
)
CONF_OPTION(remote_cmd2,
    /*
     * Fallback command to try to run if remote_cmd fails. Only set
     * internally by PSCP and PSFTP (so that they can try multiple
     * methods of running an SFTP server at the remote end); never set
     * by user configuration, or loaded or saved.
     */
    VALUE_TYPE(STR),
    DEFAULT_STR(""),
    NOT_SAVED,
)
CONF_OPTION(nopty,
    VALUE_TYPE(BOOL),
    DEFAULT_BOOL(false),
    SAVE_KEYWORD("NoPTY"),
)
CONF_OPTION(compression,
    VALUE_TYPE(BOOL),
    DEFAULT_BOOL(false),
    SAVE_KEYWORD("Compression"),
)
CONF_OPTION(ssh_kexlist,
    SUBKEY_TYPE(INT), /* indices in preference order: 0,...,KEX_MAX-1
                       * (lower is more preferred) */
    VALUE_TYPE(INT),  /* KEX_* enum values */
    LOAD_CUSTOM, SAVE_CUSTOM, /* necessary for preference lists */
)
CONF_OPTION(ssh_hklist,
    SUBKEY_TYPE(INT), /* indices in preference order: 0,...,HK_MAX-1
                       * (lower is more preferred) */
    VALUE_TYPE(INT),  /* HK_* enum values */
    LOAD_CUSTOM, SAVE_CUSTOM, /* necessary for preference lists */
)
CONF_OPTION(ssh_prefer_known_hostkeys,
    VALUE_TYPE(BOOL),
    DEFAULT_BOOL(true),
    SAVE_KEYWORD("PreferKnownHostKeys"),
)
CONF_OPTION(ssh_rekey_time,
    VALUE_TYPE(INT), /* in minutes */
    DEFAULT_INT(60),
    SAVE_KEYWORD("RekeyTime"),
)
CONF_OPTION(ssh_rekey_data,
    VALUE_TYPE(STR), /* string encoding e.g. "100K", "2M", "1G" */
    DEFAULT_STR("1G"),
    SAVE_KEYWORD("RekeyBytes"),
)
CONF_OPTION(tryagent,
    VALUE_TYPE(BOOL),
    DEFAULT_BOOL(true),
    SAVE_KEYWORD("TryAgent"),
)
CONF_OPTION(agentfwd,
    VALUE_TYPE(BOOL),
    DEFAULT_BOOL(false),
    SAVE_KEYWORD("AgentFwd"),
)
CONF_OPTION(change_username, /* allow username switching in SSH-2 */
    VALUE_TYPE(BOOL),
    DEFAULT_BOOL(false),
    SAVE_KEYWORD("ChangeUsername"),
)
CONF_OPTION(ssh_cipherlist,
    SUBKEY_TYPE(INT), /* indices in preference order: 0,...,CIPHER_MAX-1
                       * (lower is more preferred) */
    VALUE_TYPE(INT),  /* CIPHER_* enum values */
    LOAD_CUSTOM, SAVE_CUSTOM, /* necessary for preference lists */
)
CONF_OPTION(keyfile,
    VALUE_TYPE(FILENAME),
    SAVE_KEYWORD("PublicKeyFile"),
)
CONF_OPTION(detached_cert,
    VALUE_TYPE(FILENAME),
    SAVE_KEYWORD("DetachedCertificate"),
)
CONF_OPTION(auth_plugin,
    VALUE_TYPE(STR),
    DEFAULT_STR(""),
    SAVE_KEYWORD("AuthPlugin"),
)
CONF_OPTION(sshprot,
    /*
     * Which SSH protocol to use.
     *
     * For historical reasons, the current legal values for CONF_sshprot
     * are:
     *  0 = SSH-1 only
     *  3 = SSH-2 only
     *
     * We used to also support
     *  1 = SSH-1 with fallback to SSH-2
     *  2 = SSH-2 with fallback to SSH-1
     *
     * and we continue to use 0/3 in storage formats rather than the more
     * obvious 1/2 to avoid surprises if someone saves a session and later
     * downgrades PuTTY. So it's easier to use these numbers internally too.
     */
    VALUE_TYPE(INT),
    DEFAULT_INT(3),
    SAVE_KEYWORD("SshProt"),
    STORAGE_ENUM(ssh_protocol),
)
CONF_OPTION(ssh_simple,
    /*
     * This means that we promise never to open any channel other
     * than the main one, which means it can safely use a very large
     * window in SSH-2.
     *
     * Only ever set internally by file transfer tools; never set by
     * user configuration, or loaded or saved.
     */
    VALUE_TYPE(BOOL),
    DEFAULT_BOOL(false),
    NOT_SAVED,
)
CONF_OPTION(ssh_connection_sharing,
    VALUE_TYPE(BOOL),
    DEFAULT_BOOL(false),
    SAVE_KEYWORD("ConnectionSharing"),
)
CONF_OPTION(ssh_connection_sharing_upstream,
    VALUE_TYPE(BOOL),
    DEFAULT_BOOL(true),
    SAVE_KEYWORD("ConnectionSharingUpstream"),
)
CONF_OPTION(ssh_connection_sharing_downstream,
    VALUE_TYPE(BOOL),
    DEFAULT_BOOL(true),
    SAVE_KEYWORD("ConnectionSharingDownstream"),
)
CONF_OPTION(ssh_manual_hostkeys,
    /*
     * Manually configured host keys to accept regardless of the state
     * of the host key cache.
     *
     * This is conceptually a set rather than a dictionary: every
     * value in this map is the empty string, and the set of subkeys
     * that exist is the important data.
     */
    SUBKEY_TYPE(STR),
    VALUE_TYPE(STR),
    LOAD_CUSTOM, SAVE_CUSTOM, /* necessary for mappings */
)
CONF_OPTION(ssh2_des_cbc, /* "des-cbc" unrecommended SSH-2 cipher */
    VALUE_TYPE(BOOL),
    DEFAULT_BOOL(false),
    SAVE_KEYWORD("SSH2DES"),
)
CONF_OPTION(ssh_no_userauth, /* bypass "ssh-userauth" (SSH-2 only) */
    VALUE_TYPE(BOOL),
    DEFAULT_BOOL(false),
    SAVE_KEYWORD("SshNoAuth"),
)
CONF_OPTION(ssh_no_trivial_userauth, /* disable trivial types of auth */
    VALUE_TYPE(BOOL),
    DEFAULT_BOOL(false),
    SAVE_KEYWORD("SshNoTrivialAuth"),
)
CONF_OPTION(ssh_show_banner, /* show USERAUTH_BANNERs (SSH-2 only) */
    VALUE_TYPE(BOOL),
    DEFAULT_BOOL(true),
    SAVE_KEYWORD("SshBanner"),
)
CONF_OPTION(try_tis_auth,
    VALUE_TYPE(BOOL),
    DEFAULT_BOOL(false),
    SAVE_KEYWORD("AuthTIS"),
)
CONF_OPTION(try_ki_auth,
    VALUE_TYPE(BOOL),
    DEFAULT_BOOL(true),
    SAVE_KEYWORD("AuthKI"),
)
CONF_OPTION(try_gssapi_auth, /* attempt gssapi via ssh userauth */
    VALUE_TYPE(BOOL),
    LOAD_CUSTOM, SAVE_CUSTOM, /* under #ifndef NO_GSSAPI */
)
CONF_OPTION(try_gssapi_kex, /* attempt gssapi via ssh kex */
    VALUE_TYPE(BOOL),
    LOAD_CUSTOM, SAVE_CUSTOM, /* under #ifndef NO_GSSAPI */
)
CONF_OPTION(gssapifwd, /* forward tgt via gss */
    VALUE_TYPE(BOOL),
    LOAD_CUSTOM, SAVE_CUSTOM, /* under #ifndef NO_GSSAPI */
)
CONF_OPTION(gssapirekey, /* KEXGSS refresh interval (mins) */
    VALUE_TYPE(INT),
    LOAD_CUSTOM, SAVE_CUSTOM, /* under #ifndef NO_GSSAPI */
)
CONF_OPTION(ssh_gsslist,
    SUBKEY_TYPE(INT), /* indices in preference order: 0,...,ngsslibs
                       * (lower is more preferred; ngsslibs is a platform-
                       * dependent value) */
    VALUE_TYPE(INT),  /* indices of GSSAPI lib types (platform-dependent) */
    LOAD_CUSTOM, SAVE_CUSTOM, /* necessary for preference lists, also this
                               * setting is under #ifndef NO_GSSAPI */
)
CONF_OPTION(ssh_gss_custom,
    VALUE_TYPE(FILENAME),
    LOAD_CUSTOM, SAVE_CUSTOM, /* under #ifndef NO_GSSAPI */
)
CONF_OPTION(ssh_subsys, /* run a subsystem rather than a command */
    /*
     * Only set internally by PSCP and PSFTP; never set by user
     * configuration, or loaded or saved.
     */
    VALUE_TYPE(BOOL),
    DEFAULT_BOOL(false),
    NOT_SAVED,
)
CONF_OPTION(ssh_subsys2, /* fallback to go with remote_cmd2 */
    /*
     * Only set internally by PSCP and PSFTP; never set by user
     * configuration, or loaded or saved.
     */
    VALUE_TYPE(BOOL),
    DEFAULT_BOOL(false),
    NOT_SAVED,
)
CONF_OPTION(ssh_no_shell, /* avoid running a shell */
    VALUE_TYPE(BOOL),
    DEFAULT_BOOL(false),
    SAVE_KEYWORD("SshNoShell"),
)
CONF_OPTION(ssh_nc_host, /* host to connect to in `nc' mode */
    /*
     * Only set by the '-nc' command-line option and by the SSH proxy
     * code. There's no GUI config option for this, and therefore it's
     * also never loaded or saved.
     */
    VALUE_TYPE(STR),
    DEFAULT_STR(""),
    NOT_SAVED,
)
CONF_OPTION(ssh_nc_port, /* port to connect to in `nc' mode */
    /*
     * Only set by the '-nc' command-line option and by the SSH proxy
     * code. There's no GUI config option for this, and therefore it's
     * also never loaded or saved.
     */
    VALUE_TYPE(INT),
    DEFAULT_INT(0),
    NOT_SAVED,
)

/* Telnet options */
CONF_OPTION(termtype,
    VALUE_TYPE(STR),
    DEFAULT_STR("xterm"),
    SAVE_KEYWORD("TerminalType"),
)
CONF_OPTION(termspeed,
    VALUE_TYPE(STR),
    DEFAULT_STR("38400,38400"),
    SAVE_KEYWORD("TerminalSpeed"),
)
CONF_OPTION(ttymodes,
    /*
     * The full set of permitted subkeys is listed in
     * ssh/ttymode-list.h, as the first parameter of each TTYMODE_CHAR
     * or TTYMODE_FLAG macro.
     *
     * The permitted value strings are:
     *
     *  - "N" means do not include a record for this mode at all in
     *    the terminal mode data in the "pty-req" channel request.
     *    Corresponds to setting the mode to 'Nothing' in the GUI.
     *  - "A" means use PuTTY's automatic default, matching the
     *    settings for GUI PuTTY's terminal window or Unix Plink's
     *    controlling tty. Corresponds to setting 'Auto' in the GUI.
     *  - "V" followed by further string data means send a custom
     *    value to the SSH server. Values are as documented in the
     *    manual.
     */
    SUBKEY_TYPE(STR),
    VALUE_TYPE(STR),
    LOAD_CUSTOM, SAVE_CUSTOM, /* necessary for mappings */
)
CONF_OPTION(environmt,
    SUBKEY_TYPE(STR), /* environment variable name */
    VALUE_TYPE(STR),  /* environment variable value */
    LOAD_CUSTOM, SAVE_CUSTOM, /* necessary for mappings */
)
CONF_OPTION(username,
    VALUE_TYPE(STR),
    DEFAULT_STR(""),
    SAVE_KEYWORD("UserName"),
)
CONF_OPTION(username_from_env,
    VALUE_TYPE(BOOL),
    DEFAULT_BOOL(false),
    SAVE_KEYWORD("UserNameFromEnvironment"),
)
CONF_OPTION(localusername,
    VALUE_TYPE(STR),
    DEFAULT_STR(""),
    SAVE_KEYWORD("LocalUserName"),
)
CONF_OPTION(rfc_environ,
    VALUE_TYPE(BOOL),
    DEFAULT_BOOL(false),
    SAVE_KEYWORD("RFCEnviron"),
)
CONF_OPTION(passive_telnet,
    VALUE_TYPE(BOOL),
    DEFAULT_BOOL(false),
    SAVE_KEYWORD("PassiveTelnet"),
)

/* Serial port options */
CONF_OPTION(serline,
    VALUE_TYPE(STR),
    DEFAULT_STR(""),
    SAVE_KEYWORD("SerialLine"),
)
CONF_OPTION(serspeed,
    VALUE_TYPE(INT),
    DEFAULT_INT(9600),
    SAVE_KEYWORD("SerialSpeed"),
)
CONF_OPTION(serdatabits,
    VALUE_TYPE(INT),
    DEFAULT_INT(8),
    SAVE_KEYWORD("SerialDataBits"),
)
CONF_OPTION(serstopbits,
    VALUE_TYPE(INT),
    DEFAULT_INT(2),
    SAVE_KEYWORD("SerialStopHalfbits"),
)
CONF_OPTION(serparity,
    VALUE_TYPE(INT),
    DEFAULT_INT(SER_PAR_NONE),
    SAVE_KEYWORD("SerialParity"),
    STORAGE_ENUM(serparity),
)
CONF_OPTION(serflow,
    VALUE_TYPE(INT),
    DEFAULT_INT(SER_FLOW_XONXOFF),
    SAVE_KEYWORD("SerialFlowControl"),
    STORAGE_ENUM(serflow),
)

/* SUPDUP options */
CONF_OPTION(supdup_location,
    VALUE_TYPE(STR),
    DEFAULT_STR("The Internet"),
    SAVE_KEYWORD("SUPDUPLocation"),
)
CONF_OPTION(supdup_ascii_set,
    VALUE_TYPE(INT),
    DEFAULT_INT(SUPDUP_CHARSET_ASCII),
    SAVE_KEYWORD("SUPDUPCharset"),
    STORAGE_ENUM(supdup_charset),
)
CONF_OPTION(supdup_more,
    VALUE_TYPE(BOOL),
    DEFAULT_BOOL(false),
    SAVE_KEYWORD("SUPDUPMoreProcessing"),
)
CONF_OPTION(supdup_scroll,
    VALUE_TYPE(BOOL),
    DEFAULT_BOOL(false),
    SAVE_KEYWORD("SUPDUPScrolling"),
)

/* Keyboard options */
CONF_OPTION(bksp_is_delete,
    VALUE_TYPE(BOOL),
    DEFAULT_BOOL(true),
    SAVE_KEYWORD("BackspaceIsDelete"),
)
CONF_OPTION(rxvt_homeend,
    VALUE_TYPE(BOOL),
    DEFAULT_BOOL(false),
    SAVE_KEYWORD("RXVTHomeEnd"),
)
CONF_OPTION(funky_type,
    VALUE_TYPE(INT),
    DEFAULT_INT(FUNKY_TILDE),
    SAVE_KEYWORD("LinuxFunctionKeys"),
    STORAGE_ENUM(funky_type),
)
CONF_OPTION(sharrow_type,
    VALUE_TYPE(INT),
    DEFAULT_INT(SHARROW_APPLICATION),
    SAVE_KEYWORD("ShiftedArrowKeys"),
    STORAGE_ENUM(sharrow_type),
)
CONF_OPTION(no_applic_c, /* totally disable app cursor keys */
    VALUE_TYPE(BOOL),
    DEFAULT_BOOL(false),
    SAVE_KEYWORD("NoApplicationCursors"),
)
CONF_OPTION(no_applic_k, /* totally disable app keypad */
    VALUE_TYPE(BOOL),
    DEFAULT_BOOL(false),
    SAVE_KEYWORD("NoApplicationKeys"),
)
CONF_OPTION(no_mouse_rep, /* totally disable mouse reporting */
    VALUE_TYPE(BOOL),
    DEFAULT_BOOL(false),
    SAVE_KEYWORD("NoMouseReporting"),
)
CONF_OPTION(no_remote_resize, /* disable remote resizing */
    VALUE_TYPE(BOOL),
    DEFAULT_BOOL(false),
    SAVE_KEYWORD("NoRemoteResize"),
)
CONF_OPTION(no_alt_screen, /* disable alternate screen */
    VALUE_TYPE(BOOL),
    DEFAULT_BOOL(false),
    SAVE_KEYWORD("NoAltScreen"),
)
CONF_OPTION(no_remote_wintitle, /* disable remote retitling */
    VALUE_TYPE(BOOL),
    DEFAULT_BOOL(false),
    SAVE_KEYWORD("NoRemoteWinTitle"),
)
CONF_OPTION(no_remote_clearscroll, /* disable ESC[3J */
    VALUE_TYPE(BOOL),
    DEFAULT_BOOL(false),
    SAVE_KEYWORD("NoRemoteClearScroll"),
)
CONF_OPTION(no_dbackspace, /* disable destructive backspace */
    VALUE_TYPE(BOOL),
    DEFAULT_BOOL(false),
    SAVE_KEYWORD("NoDBackspace"),
)
CONF_OPTION(no_remote_charset, /* disable remote charset config */
    VALUE_TYPE(BOOL),
    DEFAULT_BOOL(false),
    SAVE_KEYWORD("NoRemoteCharset"),
)
CONF_OPTION(remote_qtitle_action, /* handling of remote window title queries */
    VALUE_TYPE(INT),
    STORAGE_ENUM(remote_qtitle_action),
    SAVE_KEYWORD("RemoteQTitleAction"),
    LOAD_CUSTOM, /* older versions had a boolean "NoRemoteQTitle"
                  * before we ended up with three options */
)
CONF_OPTION(app_cursor,
    VALUE_TYPE(BOOL),
    DEFAULT_BOOL(false),
    SAVE_KEYWORD("ApplicationCursorKeys"),
)
CONF_OPTION(app_keypad,
    VALUE_TYPE(BOOL),
    DEFAULT_BOOL(false),
    SAVE_KEYWORD("ApplicationKeypad"),
)
CONF_OPTION(nethack_keypad,
    VALUE_TYPE(BOOL),
    DEFAULT_BOOL(false),
    SAVE_KEYWORD("NetHackKeypad"),
)
CONF_OPTION(telnet_keyboard,
    VALUE_TYPE(BOOL),
    DEFAULT_BOOL(false),
    SAVE_KEYWORD("TelnetKey"),
)
CONF_OPTION(telnet_newline,
    VALUE_TYPE(BOOL),
    DEFAULT_BOOL(true),
    SAVE_KEYWORD("TelnetRet"),
)
CONF_OPTION(alt_f4, /* is it special? */
    VALUE_TYPE(BOOL),
    DEFAULT_BOOL(true),
    SAVE_KEYWORD("AltF4"),
)
CONF_OPTION(alt_space, /* is it special? */
    VALUE_TYPE(BOOL),
    DEFAULT_BOOL(false),
    SAVE_KEYWORD("AltSpace"),
)
CONF_OPTION(alt_only, /* is it special? */
    VALUE_TYPE(BOOL),
    DEFAULT_BOOL(false),
    SAVE_KEYWORD("AltOnly"),
)
CONF_OPTION(localecho,
    VALUE_TYPE(INT),
    DEFAULT_INT(AUTO),
    SAVE_KEYWORD("LocalEcho"),
    STORAGE_ENUM(on_off_auto),
)
CONF_OPTION(localedit,
    VALUE_TYPE(INT),
    DEFAULT_INT(AUTO),
    SAVE_KEYWORD("LocalEdit"),
    STORAGE_ENUM(on_off_auto),
)
CONF_OPTION(alwaysontop,
    VALUE_TYPE(BOOL),
    DEFAULT_BOOL(false),
    SAVE_KEYWORD("AlwaysOnTop"),
)
CONF_OPTION(fullscreenonaltenter,
    VALUE_TYPE(BOOL),
    DEFAULT_BOOL(false),
    SAVE_KEYWORD("FullScreenOnAltEnter"),
)
CONF_OPTION(scroll_on_key,
    VALUE_TYPE(BOOL),
    DEFAULT_BOOL(false),
    SAVE_KEYWORD("ScrollOnKey"),
)
CONF_OPTION(scroll_on_disp,
    VALUE_TYPE(BOOL),
    DEFAULT_BOOL(true),
    SAVE_KEYWORD("ScrollOnDisp"),
)
CONF_OPTION(erase_to_scrollback,
    VALUE_TYPE(BOOL),
    DEFAULT_BOOL(true),
    SAVE_KEYWORD("EraseToScrollback"),
)
CONF_OPTION(compose_key,
    VALUE_TYPE(BOOL),
    DEFAULT_BOOL(false),
    SAVE_KEYWORD("ComposeKey"),
)
CONF_OPTION(ctrlaltkeys,
    VALUE_TYPE(BOOL),
    DEFAULT_BOOL(true),
    SAVE_KEYWORD("CtrlAltKeys"),
)
CONF_OPTION(osx_option_meta,
    VALUE_TYPE(BOOL),
    LOAD_CUSTOM, SAVE_CUSTOM, /* under #ifdef OSX_META_KEY_CONFIG */
)
CONF_OPTION(osx_command_meta,
    VALUE_TYPE(BOOL),
    LOAD_CUSTOM, SAVE_CUSTOM, /* under #ifdef OSX_META_KEY_CONFIG */
)
CONF_OPTION(wintitle, /* initial window title */
    VALUE_TYPE(STR),
    DEFAULT_STR(""),
    SAVE_KEYWORD("WinTitle"),
)
/* Terminal options */
CONF_OPTION(savelines,
    VALUE_TYPE(INT),
    DEFAULT_INT(2000),
    SAVE_KEYWORD("ScrollbackLines"),
)
CONF_OPTION(dec_om,
    VALUE_TYPE(BOOL),
    DEFAULT_BOOL(false),
    SAVE_KEYWORD("DECOriginMode"),
)
CONF_OPTION(wrap_mode,
    VALUE_TYPE(BOOL),
    DEFAULT_BOOL(true),
    SAVE_KEYWORD("AutoWrapMode"),
)
CONF_OPTION(lfhascr,
    VALUE_TYPE(BOOL),
    DEFAULT_BOOL(false),
    SAVE_KEYWORD("LFImpliesCR"),
)
CONF_OPTION(cursor_type,
    VALUE_TYPE(INT),
    DEFAULT_INT(0),
    SAVE_KEYWORD("CurType"),
    STORAGE_ENUM(cursor_type),
)
CONF_OPTION(blink_cur,
    VALUE_TYPE(BOOL),
    DEFAULT_BOOL(false),
    SAVE_KEYWORD("BlinkCur"),
)
CONF_OPTION(beep,
    VALUE_TYPE(INT),
    DEFAULT_INT(BELL_DEFAULT),
    SAVE_KEYWORD("Beep"),
    STORAGE_ENUM(beep),
)
CONF_OPTION(beep_ind,
    VALUE_TYPE(INT),
    DEFAULT_INT(B_IND_DISABLED),
    SAVE_KEYWORD("BeepInd"),
    STORAGE_ENUM(beep_indication),
)
CONF_OPTION(bellovl, /* bell overload protection active? */
    VALUE_TYPE(BOOL),
    DEFAULT_BOOL(true),
    SAVE_KEYWORD("BellOverload"),
)
CONF_OPTION(bellovl_n, /* number of bells to cause overload */
    VALUE_TYPE(INT),
    DEFAULT_INT(5),
    SAVE_KEYWORD("BellOverloadN"),
)
CONF_OPTION(bellovl_t, /* time interval for overload (ticks) */
    VALUE_TYPE(INT),
    LOAD_CUSTOM, SAVE_CUSTOM,
    /*
     * Loading and saving is done in custom code because the format is
     * platform-dependent for historical reasons: on Unix, the stored
     * value is multiplied by 1000. (And since TICKSPERSEC=1000 on
     * that platform, it means the stored value is interpreted in
     * microseconds.)
     */
)
CONF_OPTION(bellovl_s, /* period of silence to re-enable bell (s) */
    VALUE_TYPE(INT),
    LOAD_CUSTOM, SAVE_CUSTOM,
    /*
     * Loading and saving is done in custom code because the format is
     * platform-dependent for historical reasons: on Unix, the stored
     * value is multiplied by 1000. (And since TICKSPERSEC=1000 on
     * that platform, it means the stored value is interpreted in
     * microseconds.)
     */
)
CONF_OPTION(bell_wavefile,
    VALUE_TYPE(FILENAME),
    SAVE_KEYWORD("BellWaveFile"),
)
CONF_OPTION(scrollbar,
    VALUE_TYPE(BOOL),
    DEFAULT_BOOL(true),
    SAVE_KEYWORD("ScrollBar"),
)
CONF_OPTION(scrollbar_in_fullscreen,
    VALUE_TYPE(BOOL),
    DEFAULT_BOOL(false),
    SAVE_KEYWORD("ScrollBarFullScreen"),
)
CONF_OPTION(resize_action,
    VALUE_TYPE(INT),
    DEFAULT_INT(RESIZE_TERM),
    SAVE_KEYWORD("LockSize"),
    STORAGE_ENUM(resize_effect),
)
CONF_OPTION(bce,
    VALUE_TYPE(BOOL),
    DEFAULT_BOOL(true),
    SAVE_KEYWORD("BCE"),
)
CONF_OPTION(blinktext,
    VALUE_TYPE(BOOL),
    DEFAULT_BOOL(false),
    SAVE_KEYWORD("BlinkText"),
)
CONF_OPTION(win_name_always,
    VALUE_TYPE(BOOL),
    DEFAULT_BOOL(true),
    SAVE_KEYWORD("WinNameAlways"),
)
CONF_OPTION(width,
    VALUE_TYPE(INT),
    DEFAULT_INT(80),
    SAVE_KEYWORD("TermWidth"),
)
CONF_OPTION(height,
    VALUE_TYPE(INT),
    DEFAULT_INT(24),
    SAVE_KEYWORD("TermHeight"),
)
CONF_OPTION(font,
    VALUE_TYPE(FONT),
    SAVE_KEYWORD("Font"),
)
CONF_OPTION(font_quality,
    VALUE_TYPE(INT),
    DEFAULT_INT(FQ_DEFAULT),
    SAVE_KEYWORD("FontQuality"),
    STORAGE_ENUM(font_quality),
)
CONF_OPTION(logfilename,
    VALUE_TYPE(FILENAME),
    SAVE_KEYWORD("LogFileName"),
)
CONF_OPTION(logtype,
    VALUE_TYPE(INT),
    DEFAULT_INT(LGTYP_NONE),
    SAVE_KEYWORD("LogType"),
    STORAGE_ENUM(log_type),
)
CONF_OPTION(logxfovr,
    VALUE_TYPE(INT),
    DEFAULT_INT(LGXF_ASK),
    SAVE_KEYWORD("LogFileClash"),
    STORAGE_ENUM(log_to_existing_file),
)
CONF_OPTION(logflush,
    VALUE_TYPE(BOOL),
    DEFAULT_BOOL(true),
    SAVE_KEYWORD("LogFlush"),
)
CONF_OPTION(logheader,
    VALUE_TYPE(BOOL),
    DEFAULT_BOOL(true),
    SAVE_KEYWORD("LogHeader"),
)
CONF_OPTION(logomitpass,
    VALUE_TYPE(BOOL),
    DEFAULT_BOOL(true),
    SAVE_KEYWORD("SSHLogOmitPasswords"),
)
CONF_OPTION(logomitdata,
    VALUE_TYPE(BOOL),
    DEFAULT_BOOL(false),
    SAVE_KEYWORD("SSHLogOmitData"),
)
CONF_OPTION(hide_mouseptr,
    VALUE_TYPE(BOOL),
    DEFAULT_BOOL(false),
    SAVE_KEYWORD("HideMousePtr"),
)
CONF_OPTION(sunken_edge,
    VALUE_TYPE(BOOL),
    DEFAULT_BOOL(false),
    SAVE_KEYWORD("SunkenEdge"),
)
CONF_OPTION(window_border,
    VALUE_TYPE(INT), /* in pixels */
    DEFAULT_INT(1),
    SAVE_KEYWORD("WindowBorder"),
)
CONF_OPTION(answerback,
    VALUE_TYPE(STR),
    DEFAULT_STR("PuTTY"),
    SAVE_KEYWORD("Answerback"),
)
CONF_OPTION(printer,
    VALUE_TYPE(STR),
    DEFAULT_STR(""),
    SAVE_KEYWORD("Printer"),
)
CONF_OPTION(no_arabicshaping,
    VALUE_TYPE(BOOL),
    DEFAULT_BOOL(false),
    SAVE_KEYWORD("DisableArabicShaping"),
)
CONF_OPTION(no_bidi,
    VALUE_TYPE(BOOL),
    DEFAULT_BOOL(false),
    SAVE_KEYWORD("DisableBidi"),
)
CONF_OPTION(no_bracketed_paste,
    VALUE_TYPE(BOOL),
    DEFAULT_BOOL(false),
    SAVE_KEYWORD("DisableBracketedPaste"),
)

/* Colour options */
CONF_OPTION(ansi_colour,
    VALUE_TYPE(BOOL),
    DEFAULT_BOOL(true),
    SAVE_KEYWORD("ANSIColour"),
)
CONF_OPTION(xterm_256_colour,
    VALUE_TYPE(BOOL),
    DEFAULT_BOOL(true),
    SAVE_KEYWORD("Xterm256Colour"),
)
CONF_OPTION(true_colour,
    VALUE_TYPE(BOOL),
    DEFAULT_BOOL(true),
    SAVE_KEYWORD("TrueColour"),
)
CONF_OPTION(system_colour,
    VALUE_TYPE(BOOL),
    DEFAULT_BOOL(false),
    SAVE_KEYWORD("UseSystemColours"),
)
CONF_OPTION(try_palette,
    VALUE_TYPE(BOOL),
    DEFAULT_BOOL(false),
    SAVE_KEYWORD("TryPalette"),
)
CONF_OPTION(bold_style,
    VALUE_TYPE(INT),
    DEFAULT_INT(2),
    SAVE_KEYWORD("BoldAsColour"),
    STORAGE_ENUM(bold_style),
)
CONF_OPTION(colours,
    /*
     * Subkeys in this setting are indexed based on the CONF_COLOUR_*
     * enum values in putty.h. But each subkey identifies just one
     * component of the RGB value. Subkey 3*a+b identifies colour #a,
     * channel #b, where channels 0,1,2 mean R,G,B respectively.
     *
     * Values are 8-bit integers.
     */
    SUBKEY_TYPE(INT),
    VALUE_TYPE(INT),
    LOAD_CUSTOM, SAVE_CUSTOM, /* necessary for mappings */
)

/* Selection options */
CONF_OPTION(mouse_is_xterm,
    VALUE_TYPE(INT),
    DEFAULT_INT(0),
    SAVE_KEYWORD("MouseIsXterm"),
    STORAGE_ENUM(mouse_buttons),
)
CONF_OPTION(rect_select,
    VALUE_TYPE(BOOL),
    DEFAULT_BOOL(false),
    SAVE_KEYWORD("RectSelect"),
)
CONF_OPTION(paste_controls,
    VALUE_TYPE(BOOL),
    DEFAULT_BOOL(false),
    SAVE_KEYWORD("PasteControls"),
)
CONF_OPTION(rawcnp,
    VALUE_TYPE(BOOL),
    DEFAULT_BOOL(false),
    SAVE_KEYWORD("RawCNP"),
)
CONF_OPTION(utf8linedraw,
    VALUE_TYPE(BOOL),
    DEFAULT_BOOL(false),
    SAVE_KEYWORD("UTF8linedraw"),
)
CONF_OPTION(rtf_paste,
    VALUE_TYPE(BOOL),
    DEFAULT_BOOL(false),
    SAVE_KEYWORD("PasteRTF"),
)
CONF_OPTION(mouse_override,
    VALUE_TYPE(BOOL),
    DEFAULT_BOOL(true),
    SAVE_KEYWORD("MouseOverride"),
)
CONF_OPTION(wordness,
    SUBKEY_TYPE(INT), /* ASCII character codes (literally, just 00-7F) */
    VALUE_TYPE(INT),  /* arbitrary equivalence-class value for that char */
    LOAD_CUSTOM, SAVE_CUSTOM, /* necessary for mappings */
)
CONF_OPTION(mouseautocopy,
    /*
     * What clipboard (if any) to copy text to as soon as it's
     * selected with the mouse.
     */
    VALUE_TYPE(BOOL),
    DEFAULT_BOOL(CLIPUI_DEFAULT_AUTOCOPY), /* platform-dependent bool-valued
                                            * macro */
    SAVE_KEYWORD("MouseAutocopy"),
)
CONF_OPTION(mousepaste, /* clipboard used by one-mouse-click paste actions */
    VALUE_TYPE(INT),
    LOAD_CUSTOM, SAVE_CUSTOM,
    /*
     * SAVE_KEYWORD("MousePaste"), but loading and saving is done by
     * custom code, because the saved value is a string, and also sets
     * CONF_mousepaste_custom
     */
)
CONF_OPTION(ctrlshiftins, /* clipboard used by Ctrl+Ins and Shift+Ins */
    VALUE_TYPE(INT),
    LOAD_CUSTOM, SAVE_CUSTOM,
    /*
     * SAVE_KEYWORD("CtrlShiftIns"), but loading and saving is done by
     * custom code, because the saved value is a string, and also sets
     * CONF_ctrlshiftins_custom
     */
)
CONF_OPTION(ctrlshiftcv, /* clipboard used by Ctrl+Shift+C and Ctrl+Shift+V */
    VALUE_TYPE(INT),
    LOAD_CUSTOM, SAVE_CUSTOM,
    /*
     * SAVE_KEYWORD("CtrlShiftCV"), but loading and saving is done by
     * custom code, because the saved value is a string, and also sets
     * CONF_ctrlshiftcv_custom
     */
)
CONF_OPTION(mousepaste_custom,
    /* Custom clipboard name if CONF_mousepaste is set to CLIPUI_CUSTOM */
    VALUE_TYPE(STR),
    LOAD_CUSTOM, SAVE_CUSTOM,
    /*
     * Loading and saving is handled by custom code in conjunction
     * with CONF_mousepaste
     */
)
CONF_OPTION(ctrlshiftins_custom,
    /* Custom clipboard name if CONF_ctrlshiftins is set to CLIPUI_CUSTOM */
    VALUE_TYPE(STR),
    LOAD_CUSTOM, SAVE_CUSTOM,
    /*
     * Loading and saving is handled by custom code in conjunction
     * with CONF_ctrlshiftins
     */
)
CONF_OPTION(ctrlshiftcv_custom,
    /* Custom clipboard name if CONF_ctrlshiftcv is set to CLIPUI_CUSTOM */
    VALUE_TYPE(STR),
    LOAD_CUSTOM, SAVE_CUSTOM,
    /*
     * Loading and saving is handled by custom code in conjunction
     * with CONF_ctrlshiftcv
     */
)

/* Character-set translation */
CONF_OPTION(vtmode,
    VALUE_TYPE(INT),
    DEFAULT_INT(VT_UNICODE),
    SAVE_KEYWORD("FontVTMode"),
    STORAGE_ENUM(line_drawing),
)
CONF_OPTION(line_codepage,
    VALUE_TYPE(STR),
    DEFAULT_STR(""),
    SAVE_KEYWORD("LineCodePage"),
)
CONF_OPTION(cjk_ambig_wide,
    VALUE_TYPE(BOOL),
    DEFAULT_BOOL(false),
    SAVE_KEYWORD("CJKAmbigWide"),
)
CONF_OPTION(utf8_override,
    VALUE_TYPE(BOOL),
    DEFAULT_BOOL(true),
    SAVE_KEYWORD("UTF8Override"),
)
CONF_OPTION(xlat_capslockcyr,
    VALUE_TYPE(BOOL),
    DEFAULT_BOOL(false),
    SAVE_KEYWORD("CapsLockCyr"),
)

/* X11 forwarding */
CONF_OPTION(x11_forward,
    VALUE_TYPE(BOOL),
    DEFAULT_BOOL(false),
    SAVE_KEYWORD("X11Forward"),
)
CONF_OPTION(x11_display,
    VALUE_TYPE(STR),
    DEFAULT_STR(""),
    SAVE_KEYWORD("X11Display"),
)
CONF_OPTION(x11_auth,
    VALUE_TYPE(INT),
    DEFAULT_INT(X11_MIT),
    SAVE_KEYWORD("X11AuthType"),
    STORAGE_ENUM(x11_auth),
)
CONF_OPTION(xauthfile,
    VALUE_TYPE(FILENAME),
    SAVE_KEYWORD("X11AuthFile"),
)

/* Port forwarding */
CONF_OPTION(lport_acceptall, /* accept conns from hosts other than localhost */
    VALUE_TYPE(BOOL),
    DEFAULT_BOOL(false),
    SAVE_KEYWORD("LocalPortAcceptAll"),
)
CONF_OPTION(rport_acceptall, /* same for remote forwarded ports */
    VALUE_TYPE(BOOL),
    DEFAULT_BOOL(false),
    SAVE_KEYWORD("RemotePortAcceptAll"),
)
CONF_OPTION(portfwd,
    /*
     * Subkeys for 'portfwd' can have the following forms:
     *
     *   [LR]localport
     *   [LR]localaddr:localport
     *
     * Dynamic forwardings are indicated by an 'L' key, and the
     * special value "D". For all other forwardings, the value should
     * be of the form 'host:port'.
     */
    SUBKEY_TYPE(STR),
    VALUE_TYPE(STR),
    LOAD_CUSTOM, SAVE_CUSTOM, /* necessary for mappings */
)

/* SSH bug compatibility modes. All FORCE_ON/FORCE_OFF/AUTO */
CONF_OPTION(sshbug_ignore1,
    VALUE_TYPE(INT),
    DEFAULT_INT(AUTO),
    SAVE_KEYWORD("BugIgnore1"),
    STORAGE_ENUM(auto_off_on),
)
CONF_OPTION(sshbug_plainpw1,
    VALUE_TYPE(INT),
    DEFAULT_INT(AUTO),
    SAVE_KEYWORD("BugPlainPW1"),
    STORAGE_ENUM(auto_off_on),
)
CONF_OPTION(sshbug_rsa1,
    VALUE_TYPE(INT),
    DEFAULT_INT(AUTO),
    SAVE_KEYWORD("BugRSA1"),
    STORAGE_ENUM(auto_off_on),
)
CONF_OPTION(sshbug_ignore2,
    VALUE_TYPE(INT),
    DEFAULT_INT(AUTO),
    SAVE_KEYWORD("BugIgnore2"),
    STORAGE_ENUM(auto_off_on),
)
CONF_OPTION(sshbug_derivekey2,
    VALUE_TYPE(INT),
    DEFAULT_INT(AUTO),
    SAVE_KEYWORD("BugDeriveKey2"),
    STORAGE_ENUM(auto_off_on),
)
CONF_OPTION(sshbug_rsapad2,
    VALUE_TYPE(INT),
    DEFAULT_INT(AUTO),
    SAVE_KEYWORD("BugRSAPad2"),
    STORAGE_ENUM(auto_off_on),
)
CONF_OPTION(sshbug_pksessid2,
    VALUE_TYPE(INT),
    DEFAULT_INT(AUTO),
    SAVE_KEYWORD("BugPKSessID2"),
    STORAGE_ENUM(auto_off_on),
)
CONF_OPTION(sshbug_rekey2,
    VALUE_TYPE(INT),
    DEFAULT_INT(AUTO),
    SAVE_KEYWORD("BugRekey2"),
    STORAGE_ENUM(auto_off_on),
)
CONF_OPTION(sshbug_maxpkt2,
    VALUE_TYPE(INT),
    DEFAULT_INT(AUTO),
    SAVE_KEYWORD("BugMaxPkt2"),
    STORAGE_ENUM(auto_off_on),
)
CONF_OPTION(sshbug_oldgex2,
    VALUE_TYPE(INT),
    DEFAULT_INT(AUTO),
    SAVE_KEYWORD("BugOldGex2"),
    STORAGE_ENUM(auto_off_on),
)
CONF_OPTION(sshbug_winadj,
    VALUE_TYPE(INT),
    DEFAULT_INT(AUTO),
    SAVE_KEYWORD("BugWinadj"),
    STORAGE_ENUM(auto_off_on),
)
CONF_OPTION(sshbug_chanreq,
    VALUE_TYPE(INT),
    DEFAULT_INT(AUTO),
    SAVE_KEYWORD("BugChanReq"),
    STORAGE_ENUM(auto_off_on),
)
CONF_OPTION(sshbug_dropstart,
    VALUE_TYPE(INT),
    DEFAULT_INT(FORCE_OFF),
    SAVE_KEYWORD("BugDropStart"),
    STORAGE_ENUM(off1_on2),
)
CONF_OPTION(sshbug_filter_kexinit,
    VALUE_TYPE(INT),
    DEFAULT_INT(FORCE_OFF),
    SAVE_KEYWORD("BugFilterKexinit"),
    STORAGE_ENUM(off1_on2),
)
CONF_OPTION(sshbug_rsa_sha2_cert_userauth,
    VALUE_TYPE(INT),
    DEFAULT_INT(AUTO),
    SAVE_KEYWORD("BugRSASHA2CertUserauth"),
    STORAGE_ENUM(auto_off_on),
)
CONF_OPTION(sshbug_hmac2,
    VALUE_TYPE(INT),
    DEFAULT_INT(AUTO),
    SAVE_KEYWORD("BugHMAC2"),
    STORAGE_ENUM(auto_off_on),
    LOAD_CUSTOM, /* there was an earlier keyword called "BuggyMAC" */
)

/* Options for Unix. Should split out into platform-dependent part. */
CONF_OPTION(stamp_utmp, /* used by Unix pterm */
    VALUE_TYPE(BOOL),
    DEFAULT_BOOL(true),
    SAVE_KEYWORD("StampUtmp"),
)
CONF_OPTION(login_shell, /* used by Unix pterm */
    VALUE_TYPE(BOOL),
    DEFAULT_BOOL(true),
    SAVE_KEYWORD("LoginShell"),
)
CONF_OPTION(scrollbar_on_left,
    VALUE_TYPE(BOOL),
    DEFAULT_BOOL(false),
    SAVE_KEYWORD("ScrollbarOnLeft"),
)
CONF_OPTION(shadowbold,
    VALUE_TYPE(BOOL),
    DEFAULT_BOOL(false),
    SAVE_KEYWORD("ShadowBold"),
)
CONF_OPTION(boldfont,
    VALUE_TYPE(FONT),
    SAVE_KEYWORD("BoldFont"),
)
CONF_OPTION(widefont,
    VALUE_TYPE(FONT),
    SAVE_KEYWORD("WideFont"),
)
CONF_OPTION(wideboldfont,
    VALUE_TYPE(FONT),
    SAVE_KEYWORD("WideBoldFont"),
)
CONF_OPTION(shadowboldoffset,
    VALUE_TYPE(INT), /* in pixels */
    DEFAULT_INT(1),
    SAVE_KEYWORD("ShadowBoldOffset"),
)
CONF_OPTION(crhaslf,
    VALUE_TYPE(BOOL),
    DEFAULT_BOOL(false),
    SAVE_KEYWORD("CRImpliesLF"),
)
CONF_OPTION(winclass,
    VALUE_TYPE(STR),
    DEFAULT_STR(""),
    SAVE_KEYWORD("WindowClass"),
)
