Mark all module classes as final.

This commit is contained in:
Sadie Powell 2021-10-01 04:37:03 +01:00
parent e11c3c8095
commit e0dec0572a
138 changed files with 288 additions and 138 deletions

View File

@ -804,7 +804,8 @@ class MyManager : public Manager, public Timer, public EventHandler
}
};
class ModuleDNS : public Module
class ModuleDNS final
: public Module
{
MyManager manager;
std::string DNSServer;

View File

@ -151,7 +151,8 @@ class UserResolver : public DNS::Request
}
};
class ModuleHostnameLookup : public Module
class ModuleHostnameLookup final
: public Module
{
private:
BoolExtItem dnsLookup;

View File

@ -39,7 +39,8 @@ RouteDescriptor ServerTargetCommand::GetRouting(User* user, const Params& parame
return ROUTE_LOCALONLY;
}
class CoreModInfo : public Module
class CoreModInfo final
: public Module
{
CommandAdmin cmdadmin;
CommandCommands cmdcommands;

View File

@ -96,7 +96,8 @@ CmdResult CommandUnloadmodule::Handle(User* user, const Params& parameters)
return CmdResult::SUCCESS;
}
class CoreModLoadModule : public Module
class CoreModLoadModule final
: public Module
{
CommandLoadmodule cmdloadmod;
CommandUnloadmodule cmdunloadmod;

View File

@ -131,7 +131,8 @@ public:
}
};
class ModuleLusers : public Module
class ModuleLusers final
: public Module
{
UserModeReference invisiblemode;
LusersCounters counters;

View File

@ -384,7 +384,8 @@ class CommandSQuery final
}
};
class ModuleCoreMessage : public Module
class ModuleCoreMessage final
: public Module
{
private:
CommandMessage cmdprivmsg;

View File

@ -22,7 +22,8 @@
#include "inspircd.h"
#include "core_oper.h"
class CoreModOper : public Module
class CoreModOper final
: public Module
{
private:
CommandDie cmddie;

View File

@ -737,7 +737,8 @@ CmdResult CommandReloadmodule::Handle(User* user, const Params& parameters)
}
}
class CoreModReloadmodule : public Module
class CoreModReloadmodule final
: public Module
{
private:
CommandReloadmodule cmd;

View File

@ -224,7 +224,8 @@ ClientProtocol::SerializedMessage RFCSerializer::Serialize(const ClientProtocol:
return line;
}
class ModuleCoreRFCSerializer : public Module
class ModuleCoreRFCSerializer final
: public Module
{
RFCSerializer rfcserializer;

View File

@ -390,7 +390,8 @@ CmdResult CommandStats::Handle(User* user, const Params& parameters)
return CmdResult::SUCCESS;
}
class CoreModStats : public Module
class CoreModStats final
: public Module
{
private:
CommandStats cmd;

View File

@ -137,7 +137,8 @@ class CommandUsers
}
};
class CoreModStub : public Module
class CoreModStub final
: public Module
{
private:
CommandCapab cmdcapab;

View File

@ -124,7 +124,8 @@ void MessageWrapper::ReadConfig(const char* prefixname, const char* suffixname,
}
}
class CoreModUser : public Module
class CoreModUser final
: public Module
{
CommandAway cmdaway;
CommandNick cmdnick;

View File

@ -69,7 +69,8 @@ CmdResult CommandWallops::Handle(User* user, const Params& parameters)
return CmdResult::SUCCESS;
}
class CoreModWallops : public Module
class CoreModWallops final
: public Module
{
private:
CommandWallops cmd;

View File

@ -320,7 +320,8 @@ CmdResult CommandWhois::HandleLocal(LocalUser* user, const Params& parameters)
return CmdResult::SUCCESS;
}
class CoreModWhois : public Module
class CoreModWhois final
: public Module
{
private:
CommandWhois cmd;

View File

@ -394,7 +394,9 @@ WhoWas::Nick::~Nick()
stdalgo::delete_all(entries);
}
class ModuleWhoWas : public Module, public Stats::EventListener
class ModuleWhoWas final
: public Module
, public Stats::EventListener
{
CommandWhowas cmd;

View File

@ -54,7 +54,8 @@ bool InsaneBan::IPHostMatcher::Check(User* user, const std::string& mask) const
(InspIRCd::MatchCIDR(user->MakeHostIP(), mask, ascii_case_insensitive_map)));
}
class CoreModXLine : public Module
class CoreModXLine final
: public Module
{
CommandEline cmdeline;
CommandGline cmdgline;

View File

@ -143,7 +143,8 @@ class GeolocationAPIImpl : public Geolocation::APIBase
}
};
class ModuleGeoMaxMind : public Module
class ModuleGeoMaxMind final
: public Module
{
private:
GeolocationAPIImpl geoapi;

View File

@ -535,7 +535,8 @@ class LDAPService : public LDAPProvider, public SocketThread
}
};
class ModuleLDAP : public Module
class ModuleLDAP final
: public Module
{
typedef insp::flat_map<std::string, LDAPService*> ServiceMap;
ServiceMap LDAPServices;

View File

@ -130,7 +130,8 @@ typedef std::deque<ResultQueueItem> ResultQueue;
/** MySQL module
* */
class ModuleSQL : public Module
class ModuleSQL final
: public Module
{
public:
DispatcherThread* Dispatcher = nullptr;

View File

@ -521,7 +521,8 @@ restart:
}
};
class ModulePgSQL : public Module
class ModulePgSQL final
: public Module
{
public:
ConnMap connections;

View File

@ -68,7 +68,8 @@ class POSIXPattern final
}
};
class ModuleRegexPOSIX : public Module
class ModuleRegexPOSIX final
: public Module
{
private:
Regex::SimpleEngine<POSIXPattern> regex;

View File

@ -1089,7 +1089,8 @@ GnuTLS::Profile& GnuTLSIOHook::GetProfile()
return std::static_pointer_cast<GnuTLSIOHookProvider>(prov)->GetProfile();
}
class ModuleSSLGnuTLS : public Module
class ModuleSSLGnuTLS final
: public Module
{
typedef std::vector<std::shared_ptr<GnuTLSIOHookProvider>> ProfileList;

View File

@ -851,7 +851,8 @@ mbedTLS::Profile& mbedTLSIOHook::GetProfile()
return std::static_pointer_cast<mbedTLSIOHookProvider>(prov)->GetProfile();
}
class ModuleSSLmbedTLS : public Module
class ModuleSSLmbedTLS final
: public Module
{
private:
typedef std::vector<std::shared_ptr<mbedTLSIOHookProvider>> ProfileList;

View File

@ -914,7 +914,8 @@ OpenSSL::Profile& OpenSSLIOHook::GetProfile()
return std::static_pointer_cast<OpenSSLIOHookProvider>(prov)->GetProfile();
}
class ModuleSSLOpenSSL : public Module
class ModuleSSLOpenSSL final
: public Module
{
typedef std::vector<std::shared_ptr<OpenSSLIOHookProvider>> ProfileList;

View File

@ -22,7 +22,8 @@
static volatile sig_atomic_t signaled;
class ModuleSSLRehashSignal : public Module
class ModuleSSLRehashSignal final
: public Module
{
private:
static void SignalHandler(int)

View File

@ -29,7 +29,8 @@ enum
ERR_AMBIGUOUSCOMMAND = 420
};
class ModuleAbbreviation : public Module
class ModuleAbbreviation final
: public Module
{
public:
ModuleAbbreviation()

View File

@ -60,7 +60,8 @@ class Alias
bool StripColor;
};
class ModuleAlias : public Module
class ModuleAlias final
: public Module
{
std::string fprefix;

View File

@ -26,7 +26,8 @@
#include "inspircd.h"
#include "modules/extban.h"
class ModuleAllowInvite : public Module
class ModuleAllowInvite final
: public Module
{
private:
ExtBan::Acting extban;

View File

@ -52,7 +52,8 @@ class CommandAlltime : public Command
}
};
class Modulealltime : public Module
class Modulealltime final
: public Module
{
private:
CommandAlltime mycommand;

View File

@ -150,7 +150,8 @@ class AntiCapsMode : public ParamMode<AntiCapsMode, SimpleExtItem<AntiCapsSettin
}
};
class ModuleAntiCaps : public Module
class ModuleAntiCaps final
: public Module
{
private:
CheckExemption::EventProvider exemptionprov;

View File

@ -83,7 +83,8 @@ class AutoOpList : public ListModeBase
}
};
class ModuleAutoOp : public Module
class ModuleAutoOp final
: public Module
{
AutoOpList mh;

View File

@ -245,7 +245,8 @@ class BanRedirect : public ModeWatcher
}
};
class ModuleBanRedirect : public Module
class ModuleBanRedirect final
: public Module
{
private:
BanRedirect re;

View File

@ -72,7 +72,8 @@ class BCryptProvider : public HashProvider
}
};
class ModuleBCrypt : public Module
class ModuleBCrypt final
: public Module
{
private:
BCryptProvider bcrypt;

View File

@ -48,7 +48,8 @@ class BlockedMessage
}
};
class ModuleBlockAmsg : public Module
class ModuleBlockAmsg final
: public Module
{
unsigned long ForgetDelay;
BlockAction action;

View File

@ -31,7 +31,8 @@
#include "modules/exemption.h"
#include "modules/extban.h"
class ModuleBlockColor : public Module
class ModuleBlockColor final
: public Module
{
private:
ExtBan::Acting extban;

View File

@ -469,7 +469,8 @@ class PoisonCap : public Cap::Capability
}
};
class ModuleCap : public Module
class ModuleCap final
: public Module
{
private:
CommandCap cmd;

View File

@ -150,7 +150,9 @@ class CommandCBan : public Command
}
};
class ModuleCBan : public Module, public Stats::EventListener
class ModuleCBan final
: public Module
, public Stats::EventListener
{
CommandCBan mycommand;
CBanFactory f;

View File

@ -25,7 +25,8 @@
#include "inspircd.h"
class ModuleChanCreate : public Module
class ModuleChanCreate final
: public Module
{
public:
ModuleChanCreate()

View File

@ -58,7 +58,8 @@ class ChanFilter : public ListModeBase
}
};
class ModuleChanFilter : public Module
class ModuleChanFilter final
: public Module
{
CheckExemption::EventProvider exemptionprov;
ChanFilter cf;

View File

@ -27,7 +27,8 @@
#include "inspircd.h"
class ModuleChanLog : public Module
class ModuleChanLog final
: public Module
{
/*
* Multimap so people can redirect a snomask to multiple channels.

View File

@ -46,7 +46,8 @@ bool NewIsChannelHandler::Call(const std::string& channame)
return true;
}
class ModuleChannelNames : public Module
class ModuleChannelNames final
: public Module
{
std::function<bool(const std::string&)> rememberer;
bool badchan = false;

View File

@ -325,7 +325,8 @@ class CommandCheck : public Command
}
};
class ModuleCheck : public Module
class ModuleCheck final
: public Module
{
private:
CommandCheck cmd;

View File

@ -82,7 +82,8 @@ class CommandChghost : public Command
}
};
class ModuleChgHost : public Module
class ModuleChgHost final
: public Module
{
private:
CommandChghost cmd;

View File

@ -78,7 +78,8 @@ class CommandChgident : public Command
}
};
class ModuleChgIdent : public Module
class ModuleChgIdent final
: public Module
{
private:
CommandChgident cmd;

View File

@ -74,7 +74,8 @@ class CommandChgname : public Command
}
};
class ModuleChgName : public Module
class ModuleChgName final
: public Module
{
private:
CommandChgname cmd;

View File

@ -142,7 +142,8 @@ class CommandClearChan : public Command
}
};
class ModuleClearChan : public Module
class ModuleClearChan final
: public Module
{
private:
CommandClearChan cmd;

View File

@ -203,7 +203,8 @@ class CommandCloak : public Command
CmdResult Handle(User* user, const Params& parameters) override;
};
class ModuleCloaking : public Module
class ModuleCloaking final
: public Module
{
public:
CloakUser cu;

View File

@ -64,7 +64,8 @@ class JoinTimer : public Timer
}
};
class ModuleConnJoin : public Module
class ModuleConnJoin final
: public Module
{
private:
SimpleExtItem<JoinTimer> ext;

View File

@ -23,7 +23,8 @@
#include "inspircd.h"
class ModuleModesOnConnect : public Module
class ModuleModesOnConnect final
: public Module
{
public:
ModuleModesOnConnect()

View File

@ -26,7 +26,8 @@
#include "inspircd.h"
class ModuleWaitPong : public Module
class ModuleWaitPong final
: public Module
{
bool sendsnotice;
bool killonbadreply;

View File

@ -25,7 +25,8 @@
#include "inspircd.h"
class ModuleConnFlood : public Module
class ModuleConnFlood final
: public Module
{
private:
unsigned long seconds;

View File

@ -42,7 +42,8 @@ class CustomPrefixMode : public PrefixMode
}
};
class ModuleCustomPrefix : public Module
class ModuleCustomPrefix final
: public Module
{
private:
std::vector<CustomPrefixMode*> modes;

View File

@ -95,7 +95,9 @@ class CommandTitle : public Command
};
class ModuleCustomTitle : public Module, public Whois::LineEventListener
class ModuleCustomTitle final
: public Module
, public Whois::LineEventListener
{
private:
CommandTitle cmd;

View File

@ -78,7 +78,8 @@ class CommandCycle : public SplitCommand
}
};
class ModuleCycle : public Module
class ModuleCycle final
: public Module
{
private:
CommandCycle cmd;

View File

@ -370,7 +370,8 @@ class CommandDccallow : public Command
};
class ModuleDCCAllow : public Module
class ModuleDCCAllow final
: public Module
{
private:
DCCAllowExt ext;

View File

@ -97,7 +97,7 @@ class JoinHook : public ClientProtocol::EventHook
}
class ModuleDelayJoin
class ModuleDelayJoin final
: public Module
, public CTCTags::EventListener
, public Names::EventListener

View File

@ -52,7 +52,8 @@ struct BadChannel
typedef std::vector<BadChannel> BadChannels;
typedef std::vector<std::string> GoodChannels;
class ModuleDenyChannels : public Module
class ModuleDenyChannels final
: public Module
{
private:
BadChannels badchannels;

View File

@ -32,7 +32,8 @@ typedef std::vector<std::string> CommandList;
// Holds whether modes are disabled or not.
typedef std::bitset<64> ModeStatus;
class ModuleDisable : public Module
class ModuleDisable final
: public Module
{
private:
CommandList commands;

View File

@ -372,7 +372,9 @@ class DNSBLResolver : public DNS::Request
typedef std::vector<std::shared_ptr<DNSBLEntry>> DNSBLConfList;
class ModuleDNSBL : public Module, public Stats::EventListener
class ModuleDNSBL final
: public Module
, public Stats::EventListener
{
DNSBLConfList DNSBLConfEntries;
dynamic_reference<DNS::Manager> DNS;

View File

@ -152,7 +152,8 @@ class ExemptHandler : public CheckExemption::EventListener
}
};
class ModuleExemptChanOps : public Module
class ModuleExemptChanOps final
: public Module
{
private:
ExemptHandler eh;

View File

@ -157,7 +157,8 @@ class CommandGReloadModule : public Command
}
};
class ModuleGlobalLoad : public Module
class ModuleGlobalLoad final
: public Module
{
private:
CommandGLoadModule cmdgloadmodule;

View File

@ -50,7 +50,8 @@ class CommandGlobops : public Command
}
};
class ModuleGlobops : public Module
class ModuleGlobops final
: public Module
{
private:
CommandGlobops cmd;

View File

@ -425,7 +425,8 @@ void HAProxyHookProvider::OnAccept(StreamSocket* sock, irc::sockets::sockaddrs*
new HAProxyHook(shared_from_this(), sock, sslapi);
}
class ModuleHAProxy : public Module
class ModuleHAProxy final
: public Module
{
private:
std::shared_ptr<HAProxyHookProvider> hookprov;

View File

@ -38,7 +38,9 @@ class HideChans final
}
};
class ModuleHideChans : public Module, public Whois::LineEventListener
class ModuleHideChans final
: public Module
, public Whois::LineEventListener
{
private:
bool AffectsOpers;

View File

@ -53,7 +53,8 @@ class ListWatcher : public ModeWatcher
}
};
class ModuleHideList : public Module
class ModuleHideList final
: public Module
{
std::vector<ListWatcher*> watchers;

View File

@ -181,7 +181,8 @@ class ModeHook : public ClientProtocol::EventHook
};
}
class ModuleHideMode : public Module
class ModuleHideMode final
: public Module
{
private:
ModeHook modehook;

View File

@ -122,7 +122,8 @@ class HostRule
typedef std::vector<HostRule> HostRules;
class ModuleHostChange : public Module
class ModuleHostChange final
: public Module
{
private:
std::bitset<UCHAR_MAX + 1> hostmap;

View File

@ -21,7 +21,8 @@
#include "inspircd.h"
#include "modules/cap.h"
class ModuleHostCycle : public Module
class ModuleHostCycle final
: public Module
{
Cap::Reference chghostcap;
const std::string quitmsghost;

View File

@ -402,7 +402,8 @@ class HTTPdAPIImpl : public HTTPdAPIBase
}
};
class ModuleHttpServer : public Module
class ModuleHttpServer final
: public Module
{
private:
HTTPdAPIImpl APIImpl;

View File

@ -41,7 +41,9 @@ class HTTPACL
blacklist(set_blacklist) { }
};
class ModuleHTTPAccessList : public Module, public HTTPACLEventListener
class ModuleHTTPAccessList final
: public Module
, public HTTPACLEventListener
{
private:
std::vector<HTTPACL> acl_list;

View File

@ -25,7 +25,9 @@
#include "inspircd.h"
#include "modules/httpd.h"
class ModuleHttpConfig : public Module, public HTTPRequestEventListener
class ModuleHttpConfig final
: public Module
, public HTTPRequestEventListener
{
private:
HTTPdAPI API;

View File

@ -384,7 +384,9 @@ namespace Stats
}
}
class ModuleHttpStats : public Module, public HTTPRequestEventListener
class ModuleHttpStats final
: public Module
, public HTTPRequestEventListener
{
private:
HTTPdAPI API;

View File

@ -271,7 +271,8 @@ class IdentRequestSocket : public EventHandler
}
};
class ModuleIdent : public Module
class ModuleIdent final
: public Module
{
private:
unsigned long timeout;

View File

@ -44,7 +44,8 @@ class AccountTag : public IRCv3::CapTag<AccountTag>
}
};
class ModuleIRCv3AccountTag : public Module
class ModuleIRCv3AccountTag final
: public Module
{
private:
AccountTag tag;

View File

@ -178,7 +178,8 @@ class IRCv3::Batch::ManagerImpl : public Manager
}
};
class ModuleIRCv3Batch : public Module
class ModuleIRCv3Batch final
: public Module
{
private:
IRCv3::Batch::ManagerImpl manager;

View File

@ -80,7 +80,10 @@ class CapNotifyValueMessage : public Cap::MessageBase
}
};
class ModuleIRCv3CapNotify : public Module, public Cap::EventListener, public ReloadModule::EventListener
class ModuleIRCv3CapNotify final
: public Module
, public Cap::EventListener
, public ReloadModule::EventListener
{
CapNotify capnotify;
std::string reloadedmod;

View File

@ -22,7 +22,8 @@
#include "modules/cap.h"
#include "modules/ircv3.h"
class ModuleIRCv3ChgHost : public Module
class ModuleIRCv3ChgHost final
: public Module
{
Cap::Capability cap;
ClientProtocol::EventProvider protoevprov;

View File

@ -21,7 +21,8 @@
#include "inspircd.h"
#include "modules/cap.h"
class ModuleIRCv3InviteNotify : public Module
class ModuleIRCv3InviteNotify final
: public Module
{
Cap::Capability cap;

View File

@ -64,7 +64,8 @@ class LabeledResponseTag : public ClientProtocol::MessageTagProvider
}
};
class ModuleIRCv3LabeledResponse : public Module
class ModuleIRCv3LabeledResponse final
: public Module
{
private:
Cap::Capability cap;

View File

@ -71,7 +71,8 @@ class ServerTimeTag
};
class ModuleIRCv3ServerTime : public Module
class ModuleIRCv3ServerTime final
: public Module
{
private:
ServerTimeTag tag;

View File

@ -124,7 +124,8 @@ class STSCap : public Cap::Capability
}
};
class ModuleIRCv3STS : public Module
class ModuleIRCv3STS final
: public Module
{
private:
STSCap cap;

View File

@ -124,7 +124,8 @@ class KickRejoin : public ParamMode<KickRejoin, SimpleExtItem<KickRejoinData> >
}
};
class ModuleKickNoRejoin : public Module
class ModuleKickNoRejoin final
: public Module
{
KickRejoin kr;
Invite::API invapi;

View File

@ -124,7 +124,8 @@ class CommandKnock : public Command
}
};
class ModuleKnock : public Module
class ModuleKnock final
: public Module
{
SimpleChannelMode kn;
CommandKnock cmd;

View File

@ -296,7 +296,8 @@ class AdminBindInterface : public LDAPInterface
}
};
class ModuleLDAPAuth : public Module
class ModuleLDAPAuth final
: public Module
{
dynamic_reference<LDAPProvider> LDAP;
BoolExtItem ldapAuthed;

View File

@ -184,7 +184,8 @@ class AdminBindInterface : public LDAPInterface
}
};
class ModuleLDAPOper : public Module
class ModuleLDAPOper final
: public Module
{
dynamic_reference<LDAPProvider> LDAP;
std::string base;

View File

@ -24,7 +24,8 @@
#include "inspircd.h"
class ModuleMapHide : public Module
class ModuleMapHide final
: public Module
{
private:
std::string url;

View File

@ -28,7 +28,8 @@ enum
ERR_MLOCKRESTRICTED = 742
};
class ModuleMLock : public Module
class ModuleMLock final
: public Module
{
StringExtItem mlock;

View File

@ -123,7 +123,8 @@ class DummyZ : public ModeHandler
}
};
class ModuleNamedModes : public Module
class ModuleNamedModes final
: public Module
{
private:
CommandProp cmd;

View File

@ -218,7 +218,8 @@ bool lwbNickHandler::Call(const std::string& nick)
return (p < ServerInstance->Config->Limits.MaxNick);
}
class ModuleNationalChars : public Module
class ModuleNationalChars final
: public Module
{
std::string charset;
unsigned char m_additional[256], m_additionalUp[256], m_lower[256], m_upper[256];

View File

@ -122,7 +122,8 @@ class NickFlood : public ParamMode<NickFlood, SimpleExtItem<nickfloodsettings> >
}
};
class ModuleNickFlood : public Module
class ModuleNickFlood final
: public Module
{
private:
CheckExemption::EventProvider exemptionprov;

View File

@ -138,7 +138,8 @@ class CommandNickunlock : public Command
}
};
class ModuleNickLock : public Module
class ModuleNickLock final
: public Module
{
private:
BoolExtItem locked;

View File

@ -30,7 +30,8 @@
#include "modules/exemption.h"
#include "modules/extban.h"
class ModuleNoCTCP : public Module
class ModuleNoCTCP final
: public Module
{
private:
CheckExemption::EventProvider exemptionprov;

View File

@ -28,7 +28,8 @@
#include "inspircd.h"
#include "modules/extban.h"
class ModuleNoKicks : public Module
class ModuleNoKicks final
: public Module
{
private:
ExtBan::Acting extban;

View File

@ -29,7 +29,8 @@
#include "modules/exemption.h"
#include "modules/extban.h"
class ModuleNoNickChange : public Module
class ModuleNoNickChange final
: public Module
{
private:
CheckExemption::EventProvider exemptionprov;

View File

@ -29,7 +29,8 @@
#include "modules/exemption.h"
#include "modules/extban.h"
class ModuleNoNotice : public Module
class ModuleNoNotice final
: public Module
{
private:
ExtBan::Acting extban;

View File

@ -26,7 +26,8 @@
#include "inspircd.h"
#include "modules/extban.h"
class ModulePartMsgBan : public Module
class ModulePartMsgBan final
: public Module
{
private:
ExtBan::Acting extban;

View File

@ -103,7 +103,8 @@ class NetworkPrefix : public PrefixMode
}
};
class ModuleOjoin : public Module
class ModuleOjoin final
: public Module
{
private:
NetworkPrefix np;

View File

@ -27,7 +27,8 @@
#include "inspircd.h"
class ModuleOperjoin : public Module
class ModuleOperjoin final
: public Module
{
private:
std::vector<std::string> operChans;

View File

@ -27,7 +27,8 @@
#include "inspircd.h"
class ModuleOperLevels : public Module
class ModuleOperLevels final
: public Module
{
public:
ModuleOperLevels()

View File

@ -26,7 +26,8 @@
#include "inspircd.h"
class ModuleModesOnOper : public Module
class ModuleModesOnOper final
: public Module
{
public:
ModuleModesOnOper()

Some files were not shown because too many files have changed in this diff Show More