| Safe Haskell | None |
|---|---|
| Language | Haskell2010 |
Simplex.Chat.Protocol
Documentation
agentToChatVersion :: VersionSMPA -> VersionChat Source #
data ConnectionEntity Source #
Constructors
| RcvDirectMsgConnection | |
Fields
| |
| RcvGroupMsgConnection | |
Fields | |
| UserContactConnection | |
Fields | |
Instances
| FromJSON ConnectionEntity Source # | |
Defined in Simplex.Chat.Protocol Methods parseJSON :: Value -> Parser ConnectionEntity parseJSONList :: Value -> Parser [ConnectionEntity] omittedField :: Maybe ConnectionEntity | |
| ToJSON ConnectionEntity Source # | |
Defined in Simplex.Chat.Protocol Methods toJSON :: ConnectionEntity -> Value toEncoding :: ConnectionEntity -> Encoding toJSONList :: [ConnectionEntity] -> Value toEncodingList :: [ConnectionEntity] -> Encoding omitField :: ConnectionEntity -> Bool | |
| Show ConnectionEntity Source # | |
Defined in Simplex.Chat.Protocol Methods showsPrec :: Int -> ConnectionEntity -> ShowS show :: ConnectionEntity -> String showList :: [ConnectionEntity] -> ShowS | |
| Eq ConnectionEntity Source # | |
Defined in Simplex.Chat.Protocol Methods (==) :: ConnectionEntity -> ConnectionEntity -> Bool (/=) :: ConnectionEntity -> ConnectionEntity -> Bool | |
connEntityInfo :: ConnectionEntity -> String Source #
data MsgEncoding Source #
Instances
| TestEquality SMsgEncoding Source # | |
Defined in Simplex.Chat.Protocol Methods testEquality :: forall (a :: MsgEncoding) (b :: MsgEncoding). SMsgEncoding a -> SMsgEncoding b -> Maybe (a :~: b) | |
data SMsgEncoding (e :: MsgEncoding) where Source #
Constructors
| SBinary :: SMsgEncoding 'Binary | |
| SJson :: SMsgEncoding 'Json |
Instances
| TestEquality SMsgEncoding Source # | |
Defined in Simplex.Chat.Protocol Methods testEquality :: forall (a :: MsgEncoding) (b :: MsgEncoding). SMsgEncoding a -> SMsgEncoding b -> Maybe (a :~: b) | |
| Show (SMsgEncoding e) Source # | |
Defined in Simplex.Chat.Protocol Methods showsPrec :: Int -> SMsgEncoding e -> ShowS show :: SMsgEncoding e -> String showList :: [SMsgEncoding e] -> ShowS | |
class MsgEncodingI (e :: MsgEncoding) where Source #
Methods
encoding :: SMsgEncoding e Source #
Instances
| MsgEncodingI 'Binary Source # | |
Defined in Simplex.Chat.Protocol Methods | |
| MsgEncodingI 'Json Source # | |
Defined in Simplex.Chat.Protocol Methods encoding :: SMsgEncoding 'Json Source # | |
checkEncoding :: forall t (e :: MsgEncoding) (e' :: MsgEncoding). (MsgEncodingI e, MsgEncodingI e') => t e' -> Either String (t e) Source #
data AppMessage (e :: MsgEncoding) where Source #
Constructors
| AMJson :: AppMessageJson -> AppMessage 'Json | |
| AMBinary :: AppMessageBinary -> AppMessage 'Binary |
data AppMessageJson Source #
Constructors
| AppMessageJson | |
Fields
| |
Instances
| FromJSON AppMessageJson Source # | |
Defined in Simplex.Chat.Protocol Methods parseJSON :: Value -> Parser AppMessageJson parseJSONList :: Value -> Parser [AppMessageJson] omittedField :: Maybe AppMessageJson | |
| ToJSON AppMessageJson Source # | |
Defined in Simplex.Chat.Protocol Methods toJSON :: AppMessageJson -> Value toEncoding :: AppMessageJson -> Encoding toJSONList :: [AppMessageJson] -> Value toEncodingList :: [AppMessageJson] -> Encoding omitField :: AppMessageJson -> Bool | |
data AppMessageBinary Source #
Constructors
| AppMessageBinary | |
Fields
| |
Instances
| StrEncoding AppMessageBinary Source # | |
Defined in Simplex.Chat.Protocol Methods strEncode :: AppMessageBinary -> ByteString strDecode :: ByteString -> Either String AppMessageBinary strP :: Parser AppMessageBinary | |
Instances
| FromJSON MsgScope Source # | |
Defined in Simplex.Chat.Protocol Methods parseJSON :: Value -> Parser MsgScope parseJSONList :: Value -> Parser [MsgScope] omittedField :: Maybe MsgScope | |
| ToJSON MsgScope Source # | |
Defined in Simplex.Chat.Protocol Methods toEncoding :: MsgScope -> Encoding toJSONList :: [MsgScope] -> Value toEncodingList :: [MsgScope] -> Encoding | |
| Show MsgScope Source # | |
| Eq MsgScope Source # | |
Constructors
| MsgRef | |
Instances
| FromJSON MsgRef Source # | |
Defined in Simplex.Chat.Protocol Methods parseJSON :: Value -> Parser MsgRef parseJSONList :: Value -> Parser [MsgRef] omittedField :: Maybe MsgRef | |
| ToJSON MsgRef Source # | |
Defined in Simplex.Chat.Protocol Methods toEncoding :: MsgRef -> Encoding toJSONList :: [MsgRef] -> Value toEncodingList :: [MsgRef] -> Encoding | |
| Show MsgRef Source # | |
| Eq MsgRef Source # | |
data LinkPreview Source #
Constructors
| LinkPreview | |
Fields
| |
Instances
| FromJSON LinkPreview Source # | |
Defined in Simplex.Chat.Protocol Methods parseJSON :: Value -> Parser LinkPreview parseJSONList :: Value -> Parser [LinkPreview] omittedField :: Maybe LinkPreview | |
| ToJSON LinkPreview Source # | |
Defined in Simplex.Chat.Protocol Methods toJSON :: LinkPreview -> Value toEncoding :: LinkPreview -> Encoding toJSONList :: [LinkPreview] -> Value toEncodingList :: [LinkPreview] -> Encoding omitField :: LinkPreview -> Bool | |
| Show LinkPreview Source # | |
Defined in Simplex.Chat.Protocol Methods showsPrec :: Int -> LinkPreview -> ShowS show :: LinkPreview -> String showList :: [LinkPreview] -> ShowS | |
| Eq LinkPreview Source # | |
Defined in Simplex.Chat.Protocol | |
data LinkContent Source #
Instances
| FromJSON LinkContent Source # | |
Defined in Simplex.Chat.Protocol Methods parseJSON :: Value -> Parser LinkContent parseJSONList :: Value -> Parser [LinkContent] omittedField :: Maybe LinkContent | |
| ToJSON LinkContent Source # | |
Defined in Simplex.Chat.Protocol Methods toJSON :: LinkContent -> Value toEncoding :: LinkContent -> Encoding toJSONList :: [LinkContent] -> Value toEncodingList :: [LinkContent] -> Encoding omitField :: LinkContent -> Bool | |
| Show LinkContent Source # | |
Defined in Simplex.Chat.Protocol Methods showsPrec :: Int -> LinkContent -> ShowS show :: LinkContent -> String showList :: [LinkContent] -> ShowS | |
| Eq LinkContent Source # | |
Defined in Simplex.Chat.Protocol | |
data ReportReason Source #
Instances
| FromJSON ReportReason Source # | |
Defined in Simplex.Chat.Protocol Methods parseJSON :: Value -> Parser ReportReason parseJSONList :: Value -> Parser [ReportReason] omittedField :: Maybe ReportReason | |
| ToJSON ReportReason Source # | |
Defined in Simplex.Chat.Protocol Methods toJSON :: ReportReason -> Value toEncoding :: ReportReason -> Encoding toJSONList :: [ReportReason] -> Value toEncodingList :: [ReportReason] -> Encoding omitField :: ReportReason -> Bool | |
| Show ReportReason Source # | |
Defined in Simplex.Chat.Protocol Methods showsPrec :: Int -> ReportReason -> ShowS show :: ReportReason -> String showList :: [ReportReason] -> ShowS | |
| Eq ReportReason Source # | |
Defined in Simplex.Chat.Protocol | |
| StrEncoding ReportReason Source # | |
Defined in Simplex.Chat.Protocol Methods strEncode :: ReportReason -> ByteString strDecode :: ByteString -> Either String ReportReason strP :: Parser ReportReason | |
data ChatMessage (e :: MsgEncoding) Source #
Constructors
| ChatMessage | |
Fields
| |
Instances
| FromJSON (ChatMessage 'Json) Source # | |
Defined in Simplex.Chat.Protocol Methods parseJSON :: Value -> Parser (ChatMessage 'Json) parseJSONList :: Value -> Parser [ChatMessage 'Json] omittedField :: Maybe (ChatMessage 'Json) | |
| ToJSON (ChatMessage 'Json) Source # | |
Defined in Simplex.Chat.Protocol Methods toJSON :: ChatMessage 'Json -> Value toEncoding :: ChatMessage 'Json -> Encoding toJSONList :: [ChatMessage 'Json] -> Value toEncodingList :: [ChatMessage 'Json] -> Encoding omitField :: ChatMessage 'Json -> Bool | |
| Show (ChatMessage e) Source # | |
Defined in Simplex.Chat.Protocol Methods showsPrec :: Int -> ChatMessage e -> ShowS show :: ChatMessage e -> String showList :: [ChatMessage e] -> ShowS | |
| Eq (ChatMessage e) Source # | |
Defined in Simplex.Chat.Protocol | |
| FromField (ChatMessage 'Json) Source # | |
Defined in Simplex.Chat.Protocol Methods fromField :: FieldParser (ChatMessage 'Json) # | |
data AChatMessage Source #
Constructors
| MsgEncodingI e => ACMsg (SMsgEncoding e) (ChatMessage e) |
type MessageFromChannel = Bool Source #
data ChatMsgEvent (e :: MsgEncoding) where Source #
Constructors
Instances
| Show (ChatMsgEvent e) Source # | |
Defined in Simplex.Chat.Protocol Methods showsPrec :: Int -> ChatMsgEvent e -> ShowS show :: ChatMsgEvent e -> String showList :: [ChatMsgEvent e] -> ShowS | |
| Eq (ChatMsgEvent e) Source # | |
Defined in Simplex.Chat.Protocol Methods (==) :: ChatMsgEvent e -> ChatMsgEvent e -> Bool (/=) :: ChatMsgEvent e -> ChatMsgEvent e -> Bool | |
data AChatMsgEvent Source #
Constructors
| MsgEncodingI e => ACME (SMsgEncoding e) (ChatMsgEvent e) |
Instances
| Show AChatMsgEvent Source # | |
Defined in Simplex.Chat.Protocol Methods showsPrec :: Int -> AChatMsgEvent -> ShowS show :: AChatMsgEvent -> String showList :: [AChatMsgEvent] -> ShowS | |
isForwardedGroupMsg :: forall (e :: MsgEncoding). ChatMsgEvent e -> Bool Source #
data MsgReaction Source #
Instances
| FromJSON MsgReaction Source # | |
Defined in Simplex.Chat.Protocol Methods parseJSON :: Value -> Parser MsgReaction parseJSONList :: Value -> Parser [MsgReaction] omittedField :: Maybe MsgReaction | |
| ToJSON MsgReaction Source # | |
Defined in Simplex.Chat.Protocol Methods toJSON :: MsgReaction -> Value toEncoding :: MsgReaction -> Encoding toJSONList :: [MsgReaction] -> Value toEncodingList :: [MsgReaction] -> Encoding omitField :: MsgReaction -> Bool | |
| Show MsgReaction Source # | |
Defined in Simplex.Chat.Protocol Methods showsPrec :: Int -> MsgReaction -> ShowS show :: MsgReaction -> String showList :: [MsgReaction] -> ShowS | |
| Eq MsgReaction Source # | |
Defined in Simplex.Chat.Protocol | |
| FromField MsgReaction Source # | |
Defined in Simplex.Chat.Protocol Methods fromField :: FieldParser MsgReaction # | |
| ToField MsgReaction Source # | |
Defined in Simplex.Chat.Protocol Methods toField :: MsgReaction -> SQLData # | |
knownReaction :: MsgReaction -> Either String MsgReaction Source #
newtype MREmojiChar Source #
Constructors
| MREmojiChar Char |
Instances
| FromJSON MREmojiChar Source # | |
Defined in Simplex.Chat.Protocol Methods parseJSON :: Value -> Parser MREmojiChar parseJSONList :: Value -> Parser [MREmojiChar] omittedField :: Maybe MREmojiChar | |
| ToJSON MREmojiChar Source # | |
Defined in Simplex.Chat.Protocol Methods toJSON :: MREmojiChar -> Value toEncoding :: MREmojiChar -> Encoding toJSONList :: [MREmojiChar] -> Value toEncodingList :: [MREmojiChar] -> Encoding omitField :: MREmojiChar -> Bool | |
| Show MREmojiChar Source # | |
Defined in Simplex.Chat.Protocol Methods showsPrec :: Int -> MREmojiChar -> ShowS show :: MREmojiChar -> String showList :: [MREmojiChar] -> ShowS | |
| Eq MREmojiChar Source # | |
Defined in Simplex.Chat.Protocol | |
mrEmojiChar :: Char -> Either String MREmojiChar Source #
Constructors
| FileChunk | |
Fields
| |
| FileChunkCancel | |
newtype InlineFileChunk Source #
Instances
| Encoding InlineFileChunk Source # | |
Defined in Simplex.Chat.Protocol Methods smpEncode :: InlineFileChunk -> ByteString smpDecode :: ByteString -> Either String InlineFileChunk smpP :: Parser InlineFileChunk | |
Constructors
| QuotedMsg | |
Fields
| |
Instances
| FromJSON QuotedMsg Source # | |
Defined in Simplex.Chat.Protocol Methods parseJSON :: Value -> Parser QuotedMsg parseJSONList :: Value -> Parser [QuotedMsg] omittedField :: Maybe QuotedMsg | |
| ToJSON QuotedMsg Source # | |
Defined in Simplex.Chat.Protocol Methods toEncoding :: QuotedMsg -> Encoding toJSONList :: [QuotedMsg] -> Value toEncodingList :: [QuotedMsg] -> Encoding | |
| Show QuotedMsg Source # | |
| Eq QuotedMsg Source # | |
cmToQuotedMsg :: AChatMsgEvent -> Maybe QuotedMsg Source #
data MsgContentTag Source #
Instances
data MsgContainer Source #
Constructors
| MCSimple ExtMsgContent | |
| MCQuote QuotedMsg ExtMsgContent | |
| MCComment MsgRef ExtMsgContent | |
| MCForward ExtMsgContent |
Instances
| Show MsgContainer Source # | |
Defined in Simplex.Chat.Protocol Methods showsPrec :: Int -> MsgContainer -> ShowS show :: MsgContainer -> String showList :: [MsgContainer] -> ShowS | |
| Eq MsgContainer Source # | |
Defined in Simplex.Chat.Protocol | |
isMCForward :: MsgContainer -> Bool Source #
data MsgContent Source #
Constructors
| MCText | |
Fields
| |
| MCLink | |
Fields
| |
| MCImage | |
| MCVideo | |
| MCVoice | |
| MCFile | |
Fields
| |
| MCReport | |
Fields
| |
| MCChat | |
Fields
| |
| MCUnknown | |
Instances
| FromJSON MsgContent Source # | |
Defined in Simplex.Chat.Protocol Methods parseJSON :: Value -> Parser MsgContent parseJSONList :: Value -> Parser [MsgContent] omittedField :: Maybe MsgContent | |
| ToJSON MsgContent Source # | |
Defined in Simplex.Chat.Protocol Methods toJSON :: MsgContent -> Value toEncoding :: MsgContent -> Encoding toJSONList :: [MsgContent] -> Value toEncodingList :: [MsgContent] -> Encoding omitField :: MsgContent -> Bool | |
| Show MsgContent Source # | |
Defined in Simplex.Chat.Protocol Methods showsPrec :: Int -> MsgContent -> ShowS show :: MsgContent -> String showList :: [MsgContent] -> ShowS | |
| Eq MsgContent Source # | |
Defined in Simplex.Chat.Protocol | |
| FromField MsgContent Source # | |
Defined in Simplex.Chat.Protocol Methods fromField :: FieldParser MsgContent # | |
| ToField MsgContent Source # | |
Defined in Simplex.Chat.Protocol Methods toField :: MsgContent -> SQLData # | |
data MsgChatLink Source #
Constructors
| MCLContact | |
Fields
| |
| MCLInvitation | |
Fields | |
| MCLGroup | |
Fields | |
Instances
| FromJSON MsgChatLink Source # | |
Defined in Simplex.Chat.Protocol Methods parseJSON :: Value -> Parser MsgChatLink parseJSONList :: Value -> Parser [MsgChatLink] omittedField :: Maybe MsgChatLink | |
| ToJSON MsgChatLink Source # | |
Defined in Simplex.Chat.Protocol Methods toJSON :: MsgChatLink -> Value toEncoding :: MsgChatLink -> Encoding toJSONList :: [MsgChatLink] -> Value toEncodingList :: [MsgChatLink] -> Encoding omitField :: MsgChatLink -> Bool | |
| Show MsgChatLink Source # | |
Defined in Simplex.Chat.Protocol Methods showsPrec :: Int -> MsgChatLink -> ShowS show :: MsgChatLink -> String showList :: [MsgChatLink] -> ShowS | |
| Eq MsgChatLink Source # | |
Defined in Simplex.Chat.Protocol | |
msgContentText :: MsgContent -> Text Source #
durationText :: Int -> Text Source #
msgContentHasText :: MsgContent -> Bool Source #
isVoice :: MsgContent -> Bool Source #
isReport :: MsgContent -> Bool Source #
data ExtMsgContent Source #
Constructors
| ExtMsgContent | |
Fields
| |
Instances
| Show ExtMsgContent Source # | |
Defined in Simplex.Chat.Protocol Methods showsPrec :: Int -> ExtMsgContent -> ShowS show :: ExtMsgContent -> String showList :: [ExtMsgContent] -> ShowS | |
| Eq ExtMsgContent Source # | |
Defined in Simplex.Chat.Protocol | |
data MsgMention Source #
Constructors
| MsgMention | |
Instances
| FromJSON MsgMention Source # | |
Defined in Simplex.Chat.Protocol Methods parseJSON :: Value -> Parser MsgMention parseJSONList :: Value -> Parser [MsgMention] omittedField :: Maybe MsgMention | |
| ToJSON MsgMention Source # | |
Defined in Simplex.Chat.Protocol Methods toJSON :: MsgMention -> Value toEncoding :: MsgMention -> Encoding toJSONList :: [MsgMention] -> Value toEncodingList :: [MsgMention] -> Encoding omitField :: MsgMention -> Bool | |
| Show MsgMention Source # | |
Defined in Simplex.Chat.Protocol Methods showsPrec :: Int -> MsgMention -> ShowS show :: MsgMention -> String showList :: [MsgMention] -> ShowS | |
| Eq MsgMention Source # | |
Defined in Simplex.Chat.Protocol | |
maxEncodedMsgLength :: Int Source #
maxCompressedMsgLength :: Int Source #
maxEncodedInfoLength :: Int Source #
maxCompressedInfoLength :: Int Source #
data EncodedChatMessage Source #
Constructors
| ECMEncoded ByteString | |
| ECMLarge |
encodeChatMessage :: forall (e :: MsgEncoding). MsgEncodingI e => Int -> ChatMessage e -> EncodedChatMessage Source #
parseChatMessages :: ByteString -> [Either String AChatMessage] Source #
compressedBatchMsgBody_ :: MsgBody -> ByteString Source #
markCompressedBatch :: ByteString -> ByteString Source #
parseMsgContainer :: Object -> Parser MsgContainer Source #
extMsgContent :: MsgContent -> Maybe FileInvitation -> ExtMsgContent Source #
unknownMsgType :: Text Source #
msgContainerJSON :: MsgContainer -> Object Source #
nonEmptyMap :: Map k v -> Maybe (Map k v) Source #
data ACMEventTag Source #
Constructors
| MsgEncodingI e => ACMEventTag (SMsgEncoding e) (CMEventTag e) |
Instances
| StrEncoding ACMEventTag Source # | |
Defined in Simplex.Chat.Protocol Methods strEncode :: ACMEventTag -> ByteString strDecode :: ByteString -> Either String ACMEventTag strP :: Parser ACMEventTag | |
| TextEncoding ACMEventTag Source # | |
Defined in Simplex.Chat.Protocol | |
| FromField ACMEventTag Source # | |
Defined in Simplex.Chat.Protocol Methods fromField :: FieldParser ACMEventTag # | |
| ToField ACMEventTag Source # | |
Defined in Simplex.Chat.Protocol Methods toField :: ACMEventTag -> SQLData # | |
data CMEventTag (e :: MsgEncoding) where Source #
Constructors
Instances
| Show (CMEventTag e) Source # | |
Defined in Simplex.Chat.Protocol Methods showsPrec :: Int -> CMEventTag e -> ShowS show :: CMEventTag e -> String showList :: [CMEventTag e] -> ShowS | |
| Eq (CMEventTag e) Source # | |
Defined in Simplex.Chat.Protocol | |
| MsgEncodingI e => StrEncoding (CMEventTag e) Source # | |
Defined in Simplex.Chat.Protocol Methods strEncode :: CMEventTag e -> ByteString strDecode :: ByteString -> Either String (CMEventTag e) strP :: Parser (CMEventTag e) | |
| MsgEncodingI e => TextEncoding (CMEventTag e) Source # | |
Defined in Simplex.Chat.Protocol | |
| (MsgEncodingI e, Typeable e) => FromField (CMEventTag e) Source # | |
Defined in Simplex.Chat.Protocol Methods fromField :: FieldParser (CMEventTag e) # | |
| MsgEncodingI e => ToField (CMEventTag e) Source # | |
Defined in Simplex.Chat.Protocol Methods toField :: CMEventTag e -> SQLData # | |
toCMEventTag :: forall (e :: MsgEncoding). ChatMsgEvent e -> CMEventTag e Source #
hasNotification :: forall (e :: MsgEncoding). CMEventTag e -> Bool Source #
hasDeliveryReceipt :: forall (e :: MsgEncoding). CMEventTag e -> Bool Source #
appBinaryToCM :: AppMessageBinary -> Either String (ChatMessage 'Binary) Source #
appJsonToCM :: AppMessageJson -> Either String (ChatMessage 'Json) Source #
chatToAppMessage :: forall (e :: MsgEncoding). MsgEncodingI e => ChatMessage e -> AppMessage e Source #
chatMsgBinaryToBody :: ChatMessage 'Binary -> ByteString Source #
chatMsgToBody :: forall (e :: MsgEncoding). MsgEncodingI e => ChatMessage e -> ByteString Source #
data ContactShortLinkData Source #
Constructors
| ContactShortLinkData | |
Fields
| |
Instances
| FromJSON ContactShortLinkData Source # | |
Defined in Simplex.Chat.Protocol Methods parseJSON :: Value -> Parser ContactShortLinkData parseJSONList :: Value -> Parser [ContactShortLinkData] omittedField :: Maybe ContactShortLinkData | |
| ToJSON ContactShortLinkData Source # | |
Defined in Simplex.Chat.Protocol Methods toJSON :: ContactShortLinkData -> Value toEncoding :: ContactShortLinkData -> Encoding toJSONList :: [ContactShortLinkData] -> Value toEncodingList :: [ContactShortLinkData] -> Encoding omitField :: ContactShortLinkData -> Bool | |
| Show ContactShortLinkData Source # | |
Defined in Simplex.Chat.Protocol Methods showsPrec :: Int -> ContactShortLinkData -> ShowS show :: ContactShortLinkData -> String showList :: [ContactShortLinkData] -> ShowS | |
data GroupShortLinkData Source #
Constructors
| GroupShortLinkData | |
Fields | |
Instances
| FromJSON GroupShortLinkData Source # | |
Defined in Simplex.Chat.Protocol Methods parseJSON :: Value -> Parser GroupShortLinkData parseJSONList :: Value -> Parser [GroupShortLinkData] omittedField :: Maybe GroupShortLinkData | |
| ToJSON GroupShortLinkData Source # | |
Defined in Simplex.Chat.Protocol Methods toJSON :: GroupShortLinkData -> Value toEncoding :: GroupShortLinkData -> Encoding toJSONList :: [GroupShortLinkData] -> Value toEncodingList :: [GroupShortLinkData] -> Encoding omitField :: GroupShortLinkData -> Bool | |
| Show GroupShortLinkData Source # | |
Defined in Simplex.Chat.Protocol Methods showsPrec :: Int -> GroupShortLinkData -> ShowS show :: GroupShortLinkData -> String showList :: [GroupShortLinkData] -> ShowS | |