m      !"#$%&'()*+,-./0123456789:;< = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w xyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghi j k l  None %&<=DLRmnopqmnopqmnopq&Regular expression wrapper for marvin.(c) Justus Adam, 2016BSD3dev@justus.science experimentalPOSIXNone %&<=DLR$ A match to a %@. Index 0 is the full match, all other indexes are match groups.%@Abstract Wrapper for a reglar expression implementation. Has an r< implementation, so literal strings can be used to create a %. Alternatively use &# to create one with custom options.&Compile a regex with optionsNormally it is sufficient to just write the regex as a plain string and have it be converted automatically, but if you want certain match options you can use this function.'IMatch a regex against a string and return the first match found (if any).$%st&'()#"! $%&'%$&'#"! $%st&'()$Random numbers and utility functions(c) Justus Adam, 2016BSD3dev@justus.science experimentalPOSIXNone %&<=DLR*2Generate a random value. For more information see u+2Generate a random value frbounded by a range. See v for how the range works.,=Get a random value out of an integer indexed sequence, like (Vector , '[a]', Seq or Set) This uses the sequences w9 and therefore does not terminate for infinite sequences.(Uses the global random number generator.)Usable in all IO capable monads, such as  BotReacting and ScriptDefinition.*+,xyz{|}~uv*+,*+,*+,Mutable references for marvin.(c) Justus Adam, 2016BSD3dev@justus.science experimentalPOSIXNone %&<=DLR -:A value that can be shared on multiple concurrent Threads.QThis value works like a channel. It can either be empty or full. If it is empty 76 fills it, otherwise the write blocks. If it is full 53 empties, otherwise it blocks until it is filled. 3* does not empty it and also blocks if the - is empty.cShould you just use it as a thread safe mutable variable, mutations typically follow the pattern:  val <- takeSynchronized -- obtain the value and leave it empty to block concurrent reads let mod = modify val -- modify the value writeSynchronized val -- write back the result Another use for this type is as a message channel, where we have a producer and a consumer, the producer tries to write values into the - (7") and the consumer waits for the -" to be filled and takes the value 5 for procesing.It works generally best if any -A is only used for one of these two applications at the same time.This type is the same as e, only renamed for readability. If you want a more in depth documentation, see the documentation for ..'A mutable reference to a value of type vThis is like a pointer in c, the value behind which can be mutated by several functions. So long as they retain this reference they are able to retrieve the updated value./'Create a new mutable reference of type v from an initial value.01Retrieve the value behind by a mutable reference.1)Set the value inside a mutable reference.2,Change the value behind a mutable reference.3#Read the vaue, but don't empty the -. Blocks if it is empty.4Non blocking version of 3 . Returns  if it was empty.5Read the value and empty the -, blocks if already empty.6Non blocking version of 5 , returns  if it was empty.7Fills the empty -$ with a value, blocks if it is full.8Non blocking version of 7 . Returns  if it was full.9 Query if the - is empty or full. -./0123456789 -./0123456789 ./012-3456789 -./0123456789Working with json in marvin(c) Justus Adam, 2016BSD3dev@justus.science experimentalPOSIXNone %&<=DLR:;S:;:;:; +Performing http/https requests from scripts(c) Justus Adam, 2016BSD3dev@justus.science experimentalPOSIXNone %&<=DLR None%&9;<=?DILR >;Denotes a place from which we may access the configuration.RDuring script definition or when handling a request we can obtain the config with  getConfigVal or requireConfigVal.?INTERNAL USE WITH CARE"Obtain the entire config structureCaA type, basically a String, which identifies an adapter to the config and the logging facilities.F_A type, basically a String, which identifies a script to the config and the logging facilities.I3contents and meta information of a recieved messageX+Basic functionality required of any adapter[#Used for scoping config and logging\APost a message to a channel given the internal channel identifier]Initialize and run the bot^5Resolve a username given the internal user identifier_TResolve the human readable name for a channel given the internal channel identifier`FResolve to the internal channel identifier given a human readable named6Representation for the types of events which can occur6<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopq/<=>?@ABCDEFGHIJNLKMOPQRSTUVWXYZ^_`\[]abcdefghij6defghcbaXYZ[\]^_`UVWRSTOPQIJKLMNqpFGHCDEoniBjml@A>?<=k<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqCommon types in marvin.(c) Justus Adam, 2016BSD3dev@justus.science experimentalPOSIXNone %&<=DLR<=>FGHIJNLKMYZiIJKLMNFGHi<==> The adapter interface(c) Justus Adam, 2016BSD3dev@justus.science experimentalPOSIXNone%&9;<=DLRTwBCXYZ^_`\[]abcdefghwdefghacbBXYZ[\]^_`Cww@Adapter for communicating with Slack via its real time event API(c) Justus Adam, 2016BSD3dev@justus.science experimentalPOSIXNone#%&9;<=?DILRxQIdentifier for a channel (internal and not necessarily equal to the channel name)zJIdentifier for a user (internal and not necessarily equal to the username)Wxyz{|}~Lxyz{|}~^|}~z{xy4xyz{|}~ None%&9;<=?DLRT9   ! None%&9:;<=?DILORT$ FRead only data available to a handler when the bot reacts to an event.,An abstract type describing a marvin script.1This is basically a collection of event handlers.@Internal structure is exposed for people wanting to extend this.<Monad for reacting in the bot. Allows use of functions like <, @ and A as well as any arbitrary  action using .The type parameter dY is the accessible data provided by the trigger for this action and can be obtained with E or other custom functions like G and F8 which typically depend on a particular type of data in d. For message handlers like 3 and 4 this would be a regex $ and a I for instance.For completeness: a is the adapter type and r/ is the return type of the monadic computation.This is also a  instance, there you can inspect the entire state of this reaction. This is typically only used in internal or utility functions and not necessary for the user. To inspect particular pieces of this state refer to the *Lenses* section.)1Class which says that there is a way to get to a I from this type m.+SInitializer for a script. This gets run by the server during startup and creates a -!A monad for gradually defining a  using 4 and 3 as well as any  action.2*Get the config part for the currect script3FWhenever any message matches the provided regex this handler gets run.#Equivalent to "robot.hear" in hubot48Runs the handler only if the bot was directly addressed.&Equivalent to "robot.respond" in hubot5)This handler runs whenever a user enters  any channel! (which the bot is subscribed to)IThe payload contains the entering user and the channel which was entered.6(This handler runs whenever a user exits  any channel! (which the bot is subscribed to)GThe payload contains the exiting user and the channel which was exited.7)This handler runs whenever a user enters the specified channel.8The argument is the human readable name for the channel.'The payload contains the entering user.8(This handler runs whenever a user exits the specified channel<, provided the bot is subscribed to the channel in question.8The argument is the human readable name for the channel.%The payload contains the exting user.9$This handler runs when the topic in  any channel" the bot is subscribed to changes.GThe payload contains the new topic and the channel in which it was set.:$This handler runs when the topic in the specified channelG is changed, provided the bot is subscribed to the channel in question.0The argument is the human readable channel name.;Extension point for the user8Allows you to handle the raw event yourself. Returning e from the trigger function means you dont want to react to the event. The value returned inside the ) is available in the handler later using E.<?Send a message to the channel the triggering message came from.#Equivalent to "robot.send" in hubot=&Get the username of a registered user.?)Get the human readable name of a channel.@qSend a message to the channel the original message came from and address the user that sent the original message.$Equivalent to "robot.reply" in hubotA%Send a message to a Channel (by name)CDefine a new script for marvinYou need to provide a ScriptId (which can simple be written as a non-empty string). This id is used as the key for the section in the bot config belonging to this script and in logging output.0Roughly equivalent to "module.exports" in hubot.EObtain the event reaction data.KThe type of this data depends on the reaction function used. For instance 3 and 4 will contain MessageReactionDataW. The actual contents comes from the event itself and was put together by the trigger.F5Get the results from matching the regular expression.#Equivalent to "msg.match" in hubot.GGet the message that triggered this action Includes sender, target channel, as well as the full, untruncated text of the original messageHGet the the new topic.I3Get the stored channel in which something happened.J4Get the user whihc was part of the triggered action.K'Get a value out of the config, returns  if the value didn't exist.This config is the config for this script. Ergo all config vars registered under the config section for the ScriptId of this script.The >d Constraint means this function can be used both during script definition and when a handler is run.LWGet a value out of the config and fail with an error if the specified key is not found.This config is the config for this script. Ergo all config vars registered under the config section for the ScriptId of this script.The >d Constraint means this function can be used both during script definition and when a handler is run.INTERNAL, USE WITH CARE=Get the configuration for the bot (should be "bot" subconfig)MINTERNAL, USE WITH CARE;Get a value from the bot config (should be "bot" subconfig)NINTERNAL, USE WITH CARE;Get a value from the bot config (should be "bot" subconfig)O#Get the configured name of the bot.PTake a reaction and produce an IO action with the same effect. Useful for creating actions which can be scheduled to execute a certain time or asynchronous. The idea is that one can conveniently send messages from inside a schedulable action.QTake an action and produce an IO action with the same effect. Useful for creating actions which can be scheduled to execute a certain time or asynchronous. The idea is that one can conveniently send messages from inside a schedulable action.h      &'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`M ?FGH     &'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQMC349:5678;<@ABEJFGIHO?>=KLMN2?QPD -./+,FGH 01     &'()*P        &'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_` Running marvin.(c) Justus Adam, 2016BSD3dev@justus.science experimentalPOSIXNone#%&9:;<=?DLORT\"Create a wai compliant applicationl;Runs the marvin bot using whatever method the adapter uses.   i jk  lX+ijkll+Xjki   i jk  lMarvin the modular bot(c) Justus Adam, 2016BSD3dev@justus.science experimentalPOSIXNone %&<=DLR,FIJNLKMXZY+-3456789:;<=>?@ABCEFGHIJKLOPQ,C+F-XYZ3456789:;EGFHIJ=?><@ABKLOIJKLMNQP4A collection of all modules useful for using marvin.(c) Justus Adam, 2016BSD3dev@justus.science experimentalPOSIXNone %&<=DLR !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNxyz{|}~uv#"! $%&'*+,-./0123456789:;FIJNLKMXYZ+-3456789:;<=>?@ABCEFGHIJKLOPQ O !"#$%&'(&)*+,-+,.+,/+,0+,1+,2+,3+,4+,5+,6+,789:;<=>?@ABCDEFGHIJKLMNO P Q R S T U V W W X Y Y Z [ [ \ ] ^ _ ` ` a b b c d d e f g h i j k l m n o p q r s t u v w x y z { | } ~        !"#$%&'()*+,-./011223456789:;<=>?lnm@jABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefg h i j k l m n o pqr9stuvtuw xtuytuztu{tu|tu}tu~tututututututututu$$                                                     !  "  #  $  %  &  '  (  )  *  +  ,  -  .  /  0  1  2  3  4  5  6  7  8  9  :  ;  <  =  >  ?  ?  @  A  A  BCDECDECDFCDGCDHCDICDJK#marvin-0.0.6-FgUeLZ8V6tiHbs8x6Tty2pMarvin.Adapter.SlackMarvin.Adapter.TelegramMarvin.InternalMarvin.PreludeMarvin.Util.RegexMarvin.Util.RandomMarvin.Util.MutableMarvin.Util.JSONMarvin.Internal.TypesMarvin.Adapter Marvin.RunUtilMarvin.Util.HTTP Marvin.TypesMarvinLimitedChannelInfoUserInfo ChannelCache TelegramUser TelegramChatBotActionStateHandlersScriptbaseControl.Monad.IO.ClassliftIOMonadIO Control.MonadunlessData.Traversablefor Data.Foldablefor_ Data.Maybe fromMaybeGHC.Basewhen/marvin-interpolate-0.4.0-3kR5iA0guV3LhNII8Tp2oOMarvin.Interpolate.Text.LazyisLMarvin.Interpolate.TextisT'text-icu-0.7.0.1-IFmYf5LSfEX1gxaRkgfWq9Data.Text.ICU.Regex.Internal StackLimit WorkLimitErrorOnUnknownEscapes UnicodeWord HaskellLines MultilineLiteralDotAllCommentsCaseInsensitive MatchOptionMatchRegexrmatch$fIsStringRegex $fShowRegex randomValrandomValFromRange randomFrom SynchronizedMutable newMutable readMutable writeMutable modifyMutablereadSynchronizedtryReadSynchronizedtakeSynchronizedtryTakeSynchronizedwriteSynchronizedtryWriteSynchronizedisEmptySynchronizedreadJSON writeJSONIsScript getScriptIdHasConfigAccessgetConfigInternal HasScriptIdscriptIdRunnerM AdapterIdunwrapAdapterIdScriptIdunwrapScriptIdMessagesenderchannelcontent timestamp TimeStampunwrapTimeStampChannel'unwrapChannel'User' unwrapUser' IsAdapterUserChannel adapterIdmessageChannelrunWithAdapter getUsernamegetChannelNameresolveChannelRunWithAdapterInitEventHandler EventHandlerEvent MessageEventChannelJoinEventChannelLeaveEventTopicChangeEventapplicationScriptIdverifyIdString$fConfiguredLogLevel$fIsStringAdapterId$fIsStringScriptId$fShowTAdapterId$fShowTScriptId$fToJSONTimeStamp$fFromJSONTimeStamp$fShowTimeStamp$fShowScriptId $fEqScriptId$fShowAdapterId $fEqAdapterIdliftAdapterActionSlackChannelId SlackUserId APIResponse responseOkpayloadRTMDataokurl $fToJSONURI $fFromJSONURI$fIsStringSlackUserId$fEqSlackUserId$fHashableSlackUserId$fIsStringSlackChannelId$fEqSlackChannelId$fShowSlackChannelId$fHashableSlackChannelId$fFromJSONSlackUserId$fToJSONSlackUserId$fFromJSONSlackChannelId$fToJSONSlackChannelIdHasTopictopicHasNamename HasIdValueidValue $fHasTopicLimitedChannelInfoText$fHasNameLimitedChannelInfoText,$fHasIdValueLimitedChannelInfoSlackChannelId$fShowLimitedChannelInfo HasUsernameusername$fHasUsernameUserInfoText$fHasIdValueUserInfoSlackUserId InternalTypeError UnhandeledIgnoredChannelArchiveStatusChangeChannelCreatedChannelDeleted ChannelRename UserChangecodemsgHasNameResolver nameResolver HasInfoCache infoCache$$fHasNameResolverChannelCacheHashMap!$fHasInfoCacheChannelCacheHashMap EventsAPIRTMMkSlack mkAdapterId mkEventGetter SlackAdapter sendMessage userConfig midTracker channelChache userInfoCache messageParser eventParserrawBS helloParseruserInfoParserapiResponseParserrunConnectionLooprunHandlerLoopsendMessageImpl runnerImpl execAPIMethodnewMidmessageChannelImplgetUserInfoImplrefreshUserInfo lciParser lciListParserrefreshChannelsresolveChannelImplgetChannelNameImpl putChannel deleteChannel renameChannel$fIsAdapterSlackAdapter$fMkSlackEventsAPI $fMkSlackRTM$fFromJSONRTMData$fToJSONRTMDataChatType PrivateChat GroupChatSupergroupChat ChannelChatTelegramAdapter HasLastNamelastNameHasId_id_ HasFirstName firstName$fHasUsernameTelegramUserMaybe$fHasLastNameTelegramUserMaybe$fHasId_TelegramUserInteger$fHasFirstNameTelegramUserTextPushPollHasType_type_$fMkTelegramPush$fMkTelegramPoll$fIsAdapterTelegramAdapter$fFromJSONTelegramUpdate$fFromJSONTelegramChat$fFromJSONTelegramUser$fFromJSONChatType$fHasUsernameTelegramChatMaybe$fHasType_TelegramChatChatType$fHasLastNameTelegramChatMaybe$fHasId_TelegramChatInteger$fHasFirstNameTelegramChatMaybedefaultBotNameTopic#$fHasScriptIdBotActionStateScriptId$fHasPayloadBotActionStated$fHasConfigBotActionStateConfig$fHasAdapterBotActionStatea BotReacting runReactionHasTopicChangeIn topicChangeInHasTopicChange topicChange HasRespondsresponds HasLeavesFrom leavesFrom HasLeavesleaves HasJoinsInjoinsInHasJoinsjoinsHasHearshears HasCustomscustoms$fMonoidHandlers!$fHasTopicChangeInHandlersHashMap$fHasTopicChangeHandlersVector$fHasRespondsHandlersVector$fHasLeavesFromHandlersHashMap$fHasLeavesHandlersVector$fHasJoinsInHandlersHashMap$fHasJoinsHandlersVector$fHasHearsHandlersVector$fHasCustomsHandlersVector$fMonadBotReacting$fMonadIOBotReacting$fApplicativeBotReacting$fFunctorBotReacting$fMonadReaderBotReacting$fMonadLoggerBotReacting$fMonadLoggerIOBotReacting AccessAdapterAdapterT getAdapterGetgetLens ScriptInitScriptDefinition runScript HasActionsactions getConfighearrespondenterexitenterInexitFromtopicIn customTriggersendreplymessageChannel' defineScriptrunDefinitionsgetDatagetMatch getMessagegetTopic getChannelgetUser getConfigValrequireConfigValgetAppConfigValrequireAppConfigVal getBotNameextractReaction extractAction$fAccessAdapterBotReacting$fAccessAdapterScriptDefinition$fIsScriptBotReacting$fIsScriptScriptDefinition$fHasConfigAccessBotReacting!$fHasConfigAccessScriptDefinition $fGet(,)User'$fGet(,)User'0$fGetaa$fGet(,)Channel'$fGet(,)Channel'0 $fGet(,)Text $fGet(,)[]$fGet(,)Message$fHasScriptIdScriptScriptId$fHasConfigScriptConfig$fHasAdapterScripta$fHasActionsScriptHandlers$fMonadScriptDefinition$fMonadIOScriptDefinition$fApplicativeScriptDefinition$fFunctorScriptDefinition$fMonadLoggerScriptDefinitiondefaultConfigNamerequireFromAppConfiglookupFromAppConfig runMarvin LoggingFnnotImplemented addPrefixadaptLoggingSourceloggingAddSourcePrefix Data.StringIsString unwrapRegex!random-1.1-54KmMHXjttlERYcr1mvsAe System.RandomrandomrandomRlength getStdRandom newStdGen getStdGen setStdGenmkStdGen RandomGensplitnextgenRangeStdGenRandomrandomRsrandoms randomRIOrandomIOGHC.MVarMVarNothingghc-prim GHC.TypesFalse%aeson-0.11.2.1-1eeLSTWyHDJAIvlea47Q3E Data.Aeson.TH mkParseJSONderiveFromJSON mkToEncodingmkToJSON deriveToJSON deriveJSON Data.AesoneitherDecodeStrict' eitherDecode'eitherDecodeStrict eitherDecode decodeStrict'decode' decodeStrictdecodeData.Aeson.Types.Instances.!=.:!.:?.:fromJSONwithBoolwithScientific withNumber withArraywithText withObjectData.Aeson.Encode.FunctionspairsfoldableencodeData.Aeson.Types.ClassgenericParseJSONgenericToEncoding genericToJSONGToJSONgToJSON GToEncoding gToEncoding GFromJSON gParseJSONToJSONtoJSON toEncodingFromJSON parseJSONKeyValue.=Data.Aeson.Parser.Internaljson'jsonData.Aeson.Types.InternaldefaultTaggedObjectdefaultOptionsobjectResultSuccessObjectArrayValueBoolStringNumberNullEncoding fromEncodingSeries DotNetTimefromDotNetTimeOptionsfieldLabelModifierconstructorTagModifierallNullaryToStringTagomitNothingFields sumEncodingunwrapUnaryRecords SumEncoding TaggedObjectObjectWithSingleField TwoElemArray tagFieldNamecontentsFieldNameTelegramUpdateEv descriptionresult errorCodeerrDescription MkTelegram msgParsergetUsernameImplpollEventGetterpushEventGetter scriptIdImplIO mtl-2.2.1-6qsR1PHUy5lL47Hpoa4jCMControl.Monad.Reader.Class MonadReaderJust getAppConfig HasPayload HasConfigconfig HasAdapteradapteridLens getSubConfFor runBotAction prepareActiononScriptExcept alterHelper application CmdOptions configPathverbosedebugdefaultLoggingLevelmkAppsetLoggingLevelIn(fast-logger-2.4.7-JQtH8rgnB8g7QmG4MGRXbXSystem.Log.FastLogger.LogStrLogStrToLogStrtoLogStr+monad-logger-0.3.20.1-H5eMUz1Gph4m2puCgRiN7Control.Monad.Logger logOtherCS logErrorCS logWarnCS logInfoCS logDebugCS logOtherNS logErrorNS logWarnNS logInfoNS logDebugNS logOtherN logErrorNlogWarnNlogInfoN logDebugN filterLoggerwithChannelLoggerunChanLoggingTrunChanLoggingTrunStdoutLoggingTrunStderrLoggingT defaultLogStr logOtherS logErrorSlogWarnSlogInfoS logDebugSliftLoc logOtherSH logErrorSH logWarnSH logInfoSH logDebugSHlogOtherlogErrorlogWarnlogInfologDebugLogLevel LevelDebug LevelInfo LevelWarn LevelError LevelOther LogSource MonadLoggermonadLoggerLog MonadLoggerIO askLoggerIO NoLoggingT runNoLoggingTLoggingT runLoggingTtemplate-haskellLanguage.Haskell.TH.SyntaxLocloc_end loc_start loc_module loc_package loc_filename