<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE docs SYSTEM "appdocsxml.dtd">
<?xml-stylesheet type="text/xsl" href="appdocsxml.xslt"?>
<docs xmlns:xi="http://www.w3.org/2001/XInclude">
<module language="en_US" name="chan_audiosocket">
	<depend>res_audiosocket</depend>
	<support_level>extended</support_level>
</module>
<module language="en_US" name="chan_bridge_media">
	<support_level>core</support_level>
</module>
<module language="en_US" name="chan_console">
	<depend>portaudio</depend>
	<support_level>extended</support_level>
</module>
<module language="en_US" name="chan_dahdi">
	<depend>dahdi</depend>
	<depend>tonezone</depend>
	<use type="module">res_smdi</use>
	<use type="external">pri</use>
	<use type="external">ss7</use>
	<use type="external">openr2</use>
	<support_level>core</support_level>
</module>
	<application name="DAHDISendKeypadFacility" language="en_US" module="chan_dahdi">
		<since>
			<version>1.4.22</version>
		</since>
		<synopsis>
			Send digits out of band over a PRI.
		</synopsis>
		<syntax>
			<parameter name="digits" required="true" />
		</syntax>
		<description>
			<para>This application will send the given string of digits in a Keypad
			Facility IE over the current channel.</para>
		</description>
	</application>
	<application name="DAHDISendCallreroutingFacility" language="en_US" module="chan_dahdi">
		<since>
			<version>1.6.2.0</version>
		</since>
		<synopsis>
			Send an ISDN call rerouting/deflection facility message.
		</synopsis>
		<syntax argsep=",">
			<parameter name="destination" required="true">
				<para>Destination number.</para>
			</parameter>
			<parameter name="original">
				<para>Original called number.</para>
			</parameter>
			<parameter name="reason">
				<para>Diversion reason, if not specified defaults to <literal>unknown</literal></para>
			</parameter>
		</syntax>
		<description>
			<para>This application will send an ISDN switch specific call
			rerouting/deflection facility message over the current channel.
			Supported switches depend upon the version of libpri in use.</para>
		</description>
	</application>
	<application name="DAHDIAcceptR2Call" language="en_US" module="chan_dahdi">
		<since>
			<version>1.6.1.0</version>
		</since>
		<synopsis>
			Accept an R2 call if its not already accepted (you still need to answer it)
		</synopsis>
		<syntax>
			<parameter name="charge" required="true">
				<para>Yes or No.</para>
				<para>Whether you want to accept the call with charge or without charge.</para>
			</parameter>
		</syntax>
		<description>
			<para>This application will Accept the R2 call either with charge or no charge.</para>
		</description>
	</application>
	<function name="POLARITY" language="en_US" module="chan_dahdi">
		<since>
			<version>16.28.0</version>
			<version>18.14.0</version>
			<version>19.6.0</version>
		</since>
		<synopsis>
			Set or get the polarity of a DAHDI channel.
		</synopsis>
		<syntax />
		<description>
			<para>The POLARITY function can be used to set the polarity of a DAHDI channel.</para>
			<para>Applies only to FXS channels (using FXO signalling) with supporting hardware.</para>
			<para>The polarity can be set to the following numeric or named values:</para>
			<enumlist>
				<enum name="0" />
				<enum name="idle" />
				<enum name="1" />
				<enum name="reverse" />
			</enumlist>
			<para>However, when read, the function will always return 0 or 1.</para>
			<example title="Set idle polarity">
			same => n,Set(POLARITY()=0)
			</example>
			<example title="Set reverse polarity">
			same => n,NoOp(Current Polarity: ${POLARITY()})
			same => n,Set(POLARITY()=reverse)
			same => n,NoOp(New Polarity: ${POLARITY()})
			</example>
			<example title="Reverse the polarity from whatever it is currently">
			same => n,Set(POLARITY()=${IF($[ "${POLARITY()}" = "1" ]?0:1)})
			</example>
		</description>
	</function>
	<function name="DAHDI_CHANNEL" language="en_US" module="chan_dahdi">
		<synopsis>
			Set or get a property of a DAHDI channel.
		</synopsis>
		<syntax>
			<parameter name="property" required="true">
				<para>The property to set or get.</para>
				<enumlist>
					<enum name="owner">
						<para>R/O The name of the active channel on this DAHDI device.</para>
					</enum>
					<enum name="callwait">
						<para>R/O The name of the call waiting channel on this DAHDI device.</para>
					</enum>
					<enum name="threeway">
						<para>R/O The name of the three-way channel on this DAHDI device.</para>
					</enum>
					<enum name="polarity">
						<para>R/W The polarity of the channel (0 or 1, idle or reverse can also be used for setting).</para>
						<para>Only valid on FXO-signalled channels.</para>
					</enum>
					<enum name="dnd">
						<para>R/W Whether Do Not Disturb is active.</para>
						<para>Only valid on FXO-signalled channels.</para>
					</enum>
					<enum name="callforward">
						<para>R/W The call forwarding target number.</para>
						<para>Only valid on FXO-signalled channels.</para>
					</enum>
					<enum name="lastexten">
						<para>R/W The last number dialed.</para>
						<para>Only valid on FXO-signalled channels.</para>
					</enum>
				</enumlist>
			</parameter>
			<parameter name="channel" required="false">
				<para>The DAHDI channel number.</para>
				<para>If not specified, the DAHDI channel number of the current channel
				will be used (in which case it must be a DAHDI channel).</para>
			</parameter>
		</syntax>
		<description>
			<para>The DAHDI_CHANNEL function can be used to set or get properties of DAHDI channels
			that are not specific to Asterisk channels.</para>
			<para>This function may also be called from non-DAHDI channels.</para>
			<example title="Set reverse polarity on current DAHDI channel">
			same => n,Set(DAHDI_CHANNEL(polarity)=1)
			same => n,NoOp(${DAHDI_CHANNEL(polarity)})
			</example>
			<example title="Set call forwarding target for channel 1">
			same => n,Set(DAHDI_CHANNEL(callforwardnumber,1)=5552368)
			same => n,NoOp(Calls now forwarding to ${DAHDI_CHANNEL(callforwardnumber,1)})
			</example>
		</description>
	</function>
	<info name="CHANNEL" language="en_US" tech="DAHDI" module="chan_dahdi">
		<enumlist>
			<enum name="dahdi_channel">
				<para>R/O DAHDI channel related to this channel.</para>
			</enum>
			<enum name="dahdi_span">
				<para>R/O DAHDI span related to this channel.</para>
			</enum>
			<enum name="dahdi_group">
				<para>R/O DAHDI logical group related to this channel.</para>
			</enum>
			<enum name="dahdi_type">
				<para>R/O DAHDI channel type, one of:</para>
				<enumlist>
					<enum name="analog" />
					<enum name="mfc/r2" />
					<enum name="pri" />
					<enum name="pseudo" />
					<enum name="ss7" />
				</enumlist>
			</enum>
			<enum name="keypad_digits">
				<para>R/O PRI Keypad digits that came in with the SETUP message.</para>
			</enum>
			<enum name="reversecharge">
				<para>R/O PRI Reverse Charging Indication, one of:</para>
				<enumlist>
					<enum name="-1"> <para>None</para></enum>
					<enum name=" 1"> <para>Reverse Charging Requested</para></enum>
				</enumlist>
			</enum>
			<enum name="no_media_path">
				<para>R/O PRI Nonzero if the channel has no B channel.
				The channel is either on hold or a call waiting call.</para>
			</enum>
			<enum name="buffers">
				<para>W/O Change the channel's buffer policy (for the current call only)</para>
				<para>This option takes two arguments:</para>
				<para>	Number of buffers,</para>
				<para>	Buffer policy being one of:</para>
				<para>	    <literal>full</literal></para>
				<para>	    <literal>immediate</literal></para>
				<para>	    <literal>half</literal></para>
			</enum>
			<enum name="echocan_mode">
				<para>W/O Change the configuration of the active echo
				canceller on the channel (if any), for the current call
				only.</para>
				<para>Possible values are:</para>
				<para>	<literal>on</literal>	Normal mode (the echo canceller is actually reinitialized)</para>
				<para>	<literal>off</literal>	Disabled</para>
				<para>	<literal>fax</literal>	FAX/data mode (NLP disabled if possible, otherwise
					completely disabled)</para>
				<para>	<literal>voice</literal>	Voice mode (returns from FAX mode, reverting the changes that were made)</para>
			</enum>
			<enum name="dialmode">
				<para>R/W Pulse and tone dialing mode of the channel.</para>
				<para>Disabling tone dialing using this option will not automatically disable the DSP used for DTMF detection.
				To do that, also set the <literal>digitdetect</literal> option. If digit detection is disabled,
				DTMF will not be detected, regardless of the <literal>dialmode</literal> setting.
				The <literal>digitdetect</literal> setting has no impact on pulse dialing detection.</para>
				<para>If set, overrides the setting in <literal>chan_dahdi.conf</literal> for that channel.</para>
				<para>The <literal>dialmode</literal> setting applies to the DAHDI channel as a whole, but is reset for each call,
				so modifications made using the <literal>CHANNEL</literal> function apply temporarily per-call.
				The <literal>digitdetect</literal> setting applies to the entire DAHDI channel,
				so any changes made to this setting will affect all calls concurrently on the same DAHDI channel.
				<literal>digitdetect</literal> is reset once all calls on the line have cleared.</para>
				<enumlist>
					<enum name="both" />
					<enum name="pulse" />
					<enum name="dtmf" />
					<enum name="tone" />
					<enum name="none" />
				</enumlist>
			</enum>
			<enum name="waitfordialtone">
				<para>W/O Duration in ms for which to wait for dial tone on the current call.</para>
				<para>This setting is will temporarily override the <literal>waitfordialtone</literal>
				setting in <literal>chan_dahdi.conf</literal> (typically if that setting is disabled).
				You must call this in a pre-dial handler when making a call on an analog trunk
				(e.g. FXS-signalled interface).</para>
				<para>This allows, for example, being able to barge in on an in-use trunk,
				if dialed specifically, but allows skipping the trunk when routing calls
				if dial tone is not present on a channel.</para>
				<para>This setting will only apply to the current (next) call made on the
				DAHDI channel, and will not persist for future calls.</para>
				<para>Please keep in mind that due to the way that chan_dahdi implements dial tone detection,
				DTMF digits on an in-use channel will temporarily relay to any other channels attempting to use the channel for a call.
				However, voice transmission will not leak.</para>
			</enum>
		</enumlist>
	</info>
	<info name="Dial_Resource" language="en_US" tech="DAHDI" module="chan_dahdi">
		<para>DAHDI allows several modifiers to be specified as part of the resource.</para>
		<para>The general syntax is :</para>
		<para><literal>Dial(DAHDI/pseudo[/extension])</literal></para>
		<para><literal>Dial(DAHDI/&lt;channel#&gt;[c|r&lt;cadence#&gt;|d][/extension])</literal></para>
		<para><literal>Dial(DAHDI/(g|G|r|R)&lt;group#(0-63)&gt;[c|r&lt;cadence#&gt;|d][/extension])</literal></para>
		<para>The following modifiers may be used before the channel number:</para>
		<enumlist>
		<enum name="g">
			<para>Search forward, dialing on first available channel in group (lowest to highest).</para>
		</enum>
		<enum name="G">
			<para>Search backward, dialing on first available channel in group (highest to lowest).</para>
		</enum>
		<enum name="r">
			<para>Round robin search forward, picking up from where last left off (lowest to highest).</para>
		</enum>
		<enum name="R">
			<para>Round robin search backward, picking up from where last left off (highest to lowest).</para>
		</enum>
		</enumlist>
		<para>The following modifiers may be used after the channel number:</para>
		<enumlist>
		<enum name="c">
			<para>Wait for DTMF digit <literal>#</literal> before providing answer supervision.</para>
			<para>This can be useful on outbound calls via FXO ports, as otherwise
			they would indicate answer immediately.</para>
		</enum>
		<enum name="d">
			<para>Force bearer capability for ISDN/SS7 call to digital.</para>
		</enum>
		<enum name="i">
			<para>ISDN span channel restriction.</para>
			<para>Used by CC to ensure that the CC recall goes out the same span.
			Also to make ISDN channel names dialable when the sequence number
			is stripped off.  (Used by DTMF attended transfer feature.)</para>
		</enum>
		<enum name="r">
			<para>Specifies the distinctive ring cadence number to use immediately after
			specifying this option. There are 4 default built-in cadences, and up to 24
			total cadences may be configured.</para>
		</enum>
		</enumlist>
		<example title="Dial 555-1212 on first available channel in group 1, searching from highest to lowest">
		same => n,Dial(DAHDI/g1/5551212)
		</example>
		<example title="Ringing FXS channel 4 with ring cadence 2">
		same => n,Dial(DAHDI/4r2)
		</example>
		<example title="Dial 555-1212 on channel 3 and require answer confirmation">
		same => n,Dial(DAHDI/3c/5551212)
		</example>
	</info>
	<manager name="DAHDITransfer" language="en_US" module="chan_dahdi">
		<since>
			<version>1.4.22</version>
		</since>
		<synopsis>
			Transfer DAHDI Channel.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="DAHDIChannel" required="true">
				<para>DAHDI channel number to transfer.</para>
			</parameter>
		</syntax>
		<description>
			<para>Simulate a flash hook event by the user connected to the channel.</para>
			<note><para>Valid only for analog channels.</para></note>
		</description>
	</manager>
	<manager name="DAHDIHangup" language="en_US" module="chan_dahdi">
		<since>
			<version>1.4.22</version>
		</since>
		<synopsis>
			Hangup DAHDI Channel.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="DAHDIChannel" required="true">
				<para>DAHDI channel number to hangup.</para>
			</parameter>
		</syntax>
		<description>
			<para>Simulate an on-hook event by the user connected to the channel.</para>
			<note><para>Valid only for analog channels.</para></note>
		</description>
	</manager>
	<manager name="DAHDIDialOffhook" language="en_US" module="chan_dahdi">
		<since>
			<version>1.4.22</version>
		</since>
		<synopsis>
			Dial over DAHDI channel while offhook.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="DAHDIChannel" required="true">
				<para>DAHDI channel number to dial digits.</para>
			</parameter>
			<parameter name="Number" required="true">
				<para>Digits to dial.</para>
			</parameter>
		</syntax>
		<description>
			<para>Generate DTMF control frames to the bridged peer.</para>
		</description>
	</manager>
	<manager name="DAHDIDNDon" language="en_US" module="chan_dahdi">
		<since>
			<version>1.4.22</version>
		</since>
		<synopsis>
			Toggle DAHDI channel Do Not Disturb status ON.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="DAHDIChannel" required="true">
				<para>DAHDI channel number to set DND on.</para>
			</parameter>
		</syntax>
		<description>
			<para>Equivalent to the CLI command "dahdi set dnd <variable>channel</variable> on".</para>
			<note><para>Feature only supported by analog channels.</para></note>
		</description>
	</manager>
	<manager name="DAHDIDNDoff" language="en_US" module="chan_dahdi">
		<since>
			<version>1.4.22</version>
		</since>
		<synopsis>
			Toggle DAHDI channel Do Not Disturb status OFF.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="DAHDIChannel" required="true">
				<para>DAHDI channel number to set DND off.</para>
			</parameter>
		</syntax>
		<description>
			<para>Equivalent to the CLI command "dahdi set dnd <variable>channel</variable> off".</para>
			<note><para>Feature only supported by analog channels.</para></note>
		</description>
	</manager>
	<manager name="DAHDIShowChannels" language="en_US" module="chan_dahdi">
		<since>
			<version>1.4.22</version>
		</since>
		<synopsis>
			Show status of DAHDI channels.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="DAHDIChannel">
				<para>Specify the specific channel number to show.  Show all channels if zero or not present.</para>
			</parameter>
		</syntax>
		<description>
			<para>Similar to the CLI command "dahdi show channels".</para>
		</description>
	</manager>
	<manager name="DAHDIShowStatus" language="en_US" module="chan_dahdi">
		<since>
			<version>21.3.0</version>
			<version>20.8.0</version>
			<version>18.23.0</version>
		</since>
		<synopsis>
			Show status of DAHDI spans.
		</synopsis>
		<syntax/>
		<description>
			<para>Similar to the CLI command "dahdi show status".</para>
		</description>
	</manager>
	<manager name="DAHDIRestart" language="en_US" module="chan_dahdi">
		<since>
			<version>1.4.22</version>
		</since>
		<synopsis>
			Fully Restart DAHDI channels (terminates calls).
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
		</syntax>
		<description>
			<para>Equivalent to the CLI command "dahdi restart".</para>
		</description>
	</manager>
	<manager name="PRIShowSpans" language="en_US" module="chan_dahdi">
		<since>
			<version>10.0.0</version>
		</since>
		<synopsis>
			Show status of PRI spans.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="Span">
				<para>Specify the specific span to show.  Show all spans if zero or not present.</para>
			</parameter>
		</syntax>
		<description>
			<para>Similar to the CLI command "pri show spans".</para>
		</description>
	</manager>
	<manager name="PRIDebugSet" language="en_US" module="chan_dahdi">
		<since>
			<version>13.0.0</version>
		</since>
		<synopsis>
			Set PRI debug levels for a span
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="Span" required="true">
				<para>Which span to affect.</para>
			</parameter>
			<parameter name="Level" required="true">
				<para>What debug level to set. May be a numerical value or a text value from the list below</para>
				<enumlist>
					<enum name="off" />
					<enum name="on" />
					<enum name="hex" />
					<enum name="intense" />
				</enumlist>
			</parameter>
		</syntax>
		<description>
			<para>Equivalent to the CLI command "pri set debug &lt;level&gt; span &lt;span&gt;".</para>
		</description>
	</manager>
	<manager name="PRIDebugFileSet" language="en_US" module="chan_dahdi">
		<since>
			<version>13.0.0</version>
		</since>
		<synopsis>
			Set the file used for PRI debug message output
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="File" required="true">
				<para>Path of file to write debug output.</para>
			</parameter>
		</syntax>
		<description>
			<para>Equivalent to the CLI command "pri set debug file &lt;output-file&gt;"</para>
		</description>
	</manager>
	<manager name="PRIDebugFileUnset" language="en_US" module="chan_dahdi">
		<since>
			<version>13.0.0</version>
		</since>
		<synopsis>
			Disables file output for PRI debug messages
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
		</syntax>
	</manager>
	<managerEvent language="en_US" name="AlarmClear" module="chan_dahdi">
		<managerEventInstance class="EVENT_FLAG_SYSTEM" module="chan_dahdi">
			<since>
				<version>12.0.0</version>
			</since>
			<synopsis>Raised when an alarm is cleared on a DAHDI channel.</synopsis>
			<syntax>
				<parameter name="DAHDIChannel">
					<para>The DAHDI channel on which the alarm was cleared.</para>
					<note><para>This is not an Asterisk channel identifier.</para></note>
				</parameter>
			</syntax>
		</managerEventInstance>
	</managerEvent>
	<managerEvent language="en_US" name="SpanAlarmClear" module="chan_dahdi">
		<managerEventInstance class="EVENT_FLAG_SYSTEM" module="chan_dahdi">
			<since>
				<version>12.0.0</version>
			</since>
			<synopsis>Raised when an alarm is cleared on a DAHDI span.</synopsis>
			<syntax>
				<parameter name="Span">
					<para>The span on which the alarm was cleared.</para>
				</parameter>
			</syntax>
		</managerEventInstance>
	</managerEvent>
	<managerEvent language="en_US" name="DNDState" module="chan_dahdi">
		<managerEventInstance class="EVENT_FLAG_SYSTEM" module="chan_dahdi">
			<since>
				<version>12.0.0</version>
			</since>
			<synopsis>Raised when the Do Not Disturb state is changed on a DAHDI channel.</synopsis>
			<syntax>
				<parameter name="DAHDIChannel">
					<para>The DAHDI channel on which DND status changed.</para>
					<note><para>This is not an Asterisk channel identifier.</para></note>
				</parameter>
				<parameter name="Status">
					<enumlist>
						<enum name="enabled"/>
						<enum name="disabled"/>
					</enumlist>
				</parameter>
			</syntax>
		</managerEventInstance>
	</managerEvent>
	<managerEvent language="en_US" name="Alarm" module="chan_dahdi">
		<managerEventInstance class="EVENT_FLAG_SYSTEM" module="chan_dahdi">
			<since>
				<version>12.0.0</version>
			</since>
			<synopsis>Raised when an alarm is set on a DAHDI channel.</synopsis>
			<syntax>
				<parameter name="DAHDIChannel">
					<para>The channel on which the alarm occurred.</para>
					<note><para>This is not an Asterisk channel identifier.</para></note>
				</parameter>
				<parameter name="Alarm">
					<para>A textual description of the alarm that occurred.</para>
				</parameter>
			</syntax>
		</managerEventInstance>
	</managerEvent>
	<managerEvent language="en_US" name="SpanAlarm" module="chan_dahdi">
		<managerEventInstance class="EVENT_FLAG_SYSTEM" module="chan_dahdi">
			<since>
				<version>12.0.0</version>
			</since>
			<synopsis>Raised when an alarm is set on a DAHDI span.</synopsis>
			<syntax>
				<parameter name="Span">
					<para>The span on which the alarm occurred.</para>
				</parameter>
				<parameter name="Alarm">
					<para>A textual description of the alarm that occurred.</para>
				</parameter>
			</syntax>
		</managerEventInstance>
	</managerEvent>
	<managerEvent language="en_US" name="DAHDIChannel" module="chan_dahdi">
		<managerEventInstance class="EVENT_FLAG_CALL" module="chan_dahdi">
			<since>
				<version>12.0.0</version>
			</since>
			<synopsis>Raised when a DAHDI channel is created or an underlying technology is associated with a DAHDI channel.</synopsis>
			<syntax>
				<channel_snapshot/>
				<parameter name="DAHDIGroup">
					<para>The DAHDI logical group associated with this channel.</para>
				</parameter>
				<parameter name="DAHDISpan">
					<para>The DAHDI span associated with this channel.</para>
				</parameter>
				<parameter name="DAHDIChannel">
					<para>The DAHDI channel associated with this channel.</para>
				</parameter>
			</syntax>
		</managerEventInstance>
	</managerEvent>
<module language="en_US" name="chan_iax2">
	<use type="module">res_crypto</use>
	<use type="external">crypto</use>
	<support_level>core</support_level>
</module>
	<application name="IAX2Provision" language="en_US" module="chan_iax2">
		<since>
			<version>1.6.1.0</version>
		</since>
		<synopsis>
			Provision a calling IAXy with a given template.
		</synopsis>
		<syntax>
			<parameter name="template">
				<para>If not specified, defaults to <literal>default</literal>.</para>
			</parameter>
		</syntax>
		<description>
			<para>Provisions the calling IAXy (assuming the calling entity is in fact an IAXy) with the
			given <replaceable>template</replaceable>. Returns <literal>-1</literal> on error
			or <literal>0</literal> on success.</para>
		</description>
	</application>
	<function name="IAXPEER" language="en_US" module="chan_iax2">
		<since>
			<version>1.2.0</version>
		</since>
		<synopsis>
			Gets IAX peer information.
		</synopsis>
		<syntax>
			<parameter name="peername" required="true">
				<enumlist>
					<enum name="CURRENTCHANNEL">
						<para>If <replaceable>peername</replaceable> is specified to this value, return the IP address of the
						endpoint of the current channel</para>
					</enum>
				</enumlist>
			</parameter>
			<parameter name="item">
				<para>If <replaceable>peername</replaceable> is specified, valid items are:</para>
				<enumlist>
					<enum name="ip">
						<para>(default) The IP address.</para>
					</enum>
					<enum name="status">
						<para>The peer's status (if <literal>qualify=yes</literal>)</para>
					</enum>
					<enum name="mailbox">
						<para>The configured mailbox.</para>
					</enum>
					<enum name="context">
						<para>The configured context.</para>
					</enum>
					<enum name="expire">
						<para>The epoch time of the next expire.</para>
					</enum>
					<enum name="dynamic">
						<para>Is it dynamic? (yes/no).</para>
					</enum>
					<enum name="callerid_name">
						<para>The configured Caller ID name.</para>
					</enum>
					<enum name="callerid_num">
						<para>The configured Caller ID number.</para>
					</enum>
					<enum name="codecs">
						<para>The configured codecs.</para>
					</enum>
					<enum name="codec[x]">
						<para>Preferred codec index number <replaceable>x</replaceable> (beginning
						with <literal>0</literal>)</para>
					</enum>
				</enumlist>
			</parameter>
		</syntax>
		<description>
			<para>Gets information associated with the specified IAX2 peer.</para>
		</description>
	</function>
	<function name="IAXVAR" language="en_US" module="chan_iax2">
		<since>
			<version>1.6.0</version>
		</since>
		<synopsis>
			Sets or retrieves a remote variable.
		</synopsis>
		<syntax>
			<parameter name="varname" required="true" />
		</syntax>
		<description>
			<para>Gets or sets a variable that is sent to a remote IAX2 peer during call setup.</para>
		</description>
	</function>
	<info name="CHANNEL" language="en_US" tech="IAX" module="chan_iax2">
		<enumlist>
			<enum name="osptoken">
				<para>R/O Get the peer's osptoken.</para>
			</enum>
			<enum name="peerip">
				<para>R/O Get the peer's ip address.</para>
			</enum>
			<enum name="peername">
				<para>R/O Get the peer's username.</para>
			</enum>
			<enum name="auth_method">
				<para>R/O Get the authentication method used for the call.</para>
				<enumlist>
					<enum name="none"/>
					<enum name="plaintext"/>
					<enum name="MD5"/>
					<enum name="RSA"/>
				</enumlist>
			</enum>
			<enum name="secure_signaling">
				<para>R/O Get if the IAX channel is secured (encryption used for the call).</para>
				<para>Because IAX encryption applies to both signaling and media, this setting
				provides the same value as <literal>secure_media</literal>.</para>
			</enum>
			<enum name="secure_media">
				<para>R/O Get if the IAX channel is secured (encryption used for the call).</para>
				<para>Because IAX encryption applies to both signaling and media, this setting
				provides the same value as <literal>secure_signaling</literal>.</para>
			</enum>
		</enumlist>
	</info>
	<info name="Dial_Resource" language="en_US" tech="IAX2" module="chan_iax2">
		<para>The general syntax is:</para>
		<para><literal>Dial(IAX2/[username[:password[:pubkey]]@]peer[:port][/exten[@context]][/options]</literal></para>
		<para>The IAX username is optionally followed by either the secret or name of the keypair to use for RSA
		authentication (within square brakcets). If both need to be provided (such as for encrypted calls that
		are RSA authenticated), both may be specified in either order.</para>
		<para>IAX2 optionally allows modifiers to be specified after the extension.</para>
		<enumlist>
			<enum name="a">
				<para>Request auto answer (supporting equipment/configuration required)</para>
			</enum>
		</enumlist>
	</info>
	<manager name="IAXpeers" language="en_US" module="chan_iax2">
		<since>
			<version>0.3.0</version>
		</since>
		<synopsis>
			List IAX peers.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
		</syntax>
		<description>
		</description>
	</manager>
	<manager name="IAXpeerlist" language="en_US" module="chan_iax2">
		<since>
			<version>1.6.0</version>
		</since>
		<synopsis>
			List IAX Peers.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
		</syntax>
		<description>
			<para>List all the IAX peers.</para>
		</description>
	</manager>
	<manager name="IAXnetstats" language="en_US" module="chan_iax2">
		<since>
			<version>1.2.0</version>
		</since>
		<synopsis>
			Show IAX Netstats.
		</synopsis>
		<syntax />
		<description>
			<para>Show IAX channels network statistics.</para>
		</description>
	</manager>
	<manager name="IAXregistry" language="en_US" module="chan_iax2">
		<since>
			<version>1.6.2.0</version>
		</since>
		<synopsis>
			Show IAX registrations.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
		</syntax>
		<description>
			<para>Show IAX registrations.</para>
		</description>
	</manager>
<module language="en_US" name="chan_motif">
	<depend>iksemel</depend>
	<depend>res_xmpp</depend>
	<use type="external">openssl</use>
	<support_level>core</support_level>
</module>
	<configInfo name="chan_motif" language="en_US">
		<synopsis>Jingle Channel Driver</synopsis>
		<description>
			<para><emphasis>Transports</emphasis></para>
			<para>There are three different transports and protocol derivatives
			supported by <literal>chan_motif</literal>. They are in order of
			preference: Jingle using ICE-UDP, Google Jingle, and Google-V1.</para>
			<para>Jingle as defined in XEP-0166 supports the widest range of
			features. It is referred to as <literal>ice-udp</literal>. This is
			the specification that Jingle clients implement.</para>
			<para>Google Jingle follows the Jingle specification for signaling
			but uses a custom transport for media. It is supported by the
			Google Talk Plug-in in Gmail and by some other Jingle clients. It
			is referred to as <literal>google</literal> in this file.</para>
			<para>Google-V1 is the original Google Talk signaling protocol
			which uses an initial preliminary version of Jingle. It also uses
			the same custom transport as Google Jingle for media. It is
			supported by Google Voice, some other Jingle clients, and the
			Windows Google Talk client. It is referred to as <literal>google-v1</literal>
			in this file.</para>
			<para>Incoming sessions will automatically switch to the correct
			transport once it has been determined.</para>
			<para>Outgoing sessions are capable of determining if the target
			is capable of Jingle or a Google transport if the target is in the
			roster. Unfortunately it is not possible to differentiate between
			a Google Jingle or Google-V1 capable resource until a session
			initiate attempt occurs. If a resource is determined to use a
			Google transport it will initially use Google Jingle but will fall
			back to Google-V1 if required.</para>
			<para>If an outgoing session attempt fails due to failure to
			support the given transport <literal>chan_motif</literal> will
			fall back in preference order listed previously until all
			transports have been exhausted.</para>
			<para><emphasis>Dialing and Resource Selection Strategy</emphasis></para>
			<para>Placing a call through an endpoint can be accomplished using the
			following dial string:</para>
			<para><literal>Motif/[endpoint name]/[target]</literal></para>
			<para>When placing an outgoing call through an endpoint the requested
			target is searched for in the roster list. If present the first Jingle
			or Google Jingle capable resource is specifically targeted. Since the
			capabilities of the resource are known the outgoing session initiation
			will disregard the configured transport and use the determined one.</para>
			<para>If the target is not found in the roster the target will be used
			as-is and a session will be initiated using the transport specified
			in this configuration file. If no transport has been specified the
			endpoint defaults to <literal>ice-udp</literal>.</para>
			<para><emphasis>Video Support</emphasis></para>
			<para>Support for video does not need to be explicitly enabled.
			Configuring any video codec on your endpoint will automatically enable
			it.</para>
			<para><emphasis>DTMF</emphasis></para>
			<para>The only supported method for DTMF is RFC2833. This is always
			enabled on audio streams and negotiated if possible.</para>
			<para><emphasis>Incoming Calls</emphasis></para>
			<para>Incoming calls will first look for the extension matching the
			name of the endpoint in the configured context. If no such extension
			exists the call will automatically fall back to the <literal>s</literal> extension.</para>
			<para><emphasis>CallerID</emphasis></para>
			<para>The incoming caller id number is populated with the username of
			the caller and the name is populated with the full identity of the
			caller. If you would like to perform authentication or filtering
			of incoming calls it is recommended that you use these fields to do so.</para>
			<para>Outgoing caller id can <emphasis>not</emphasis> be set.</para>
			<warning>
				<para>Multiple endpoints using the
				same connection is <emphasis>NOT</emphasis> supported. Doing so
				may result in broken calls.</para>
			</warning>
		</description>
		<configFile name="motif.conf">
			<configObject name="endpoint">
				<since>
					<version>12.0.0</version>
				</since>
				<synopsis>The configuration for an endpoint.</synopsis>
				<configOption name="context">
					<since>
						<version>11.0.0</version>
					</since>
					<synopsis>Default dialplan context that incoming sessions will be routed to</synopsis>
				</configOption>
				<configOption name="callgroup">
					<since>
						<version>11.0.0</version>
					</since>
					<synopsis>A callgroup to assign to this endpoint.</synopsis>
				</configOption>
				<configOption name="pickupgroup">
					<since>
						<version>11.0.0</version>
					</since>
					<synopsis>A pickup group to assign to this endpoint.</synopsis>
				</configOption>
				<configOption name="language">
					<since>
						<version>11.0.0</version>
					</since>
					<synopsis>The default language for this endpoint.</synopsis>
				</configOption>
				<configOption name="musicclass">
					<since>
						<version>11.0.0</version>
					</since>
					<synopsis>Default music on hold class for this endpoint.</synopsis>
				</configOption>
				<configOption name="parkinglot">
					<since>
						<version>11.0.0</version>
					</since>
					<synopsis>Default parking lot for this endpoint.</synopsis>
				</configOption>
				<configOption name="accountcode">
					<since>
						<version>11.0.0</version>
					</since>
					<synopsis>Account code for CDR purposes</synopsis>
				</configOption>
				<configOption name="allow">
					<since>
						<version>13.0.0</version>
					</since>
					<synopsis>Codecs to allow</synopsis>
				</configOption>
				<configOption name="disallow">
					<since>
						<version>13.0.0</version>
					</since>
					<synopsis>Codecs to disallow</synopsis>
				</configOption>
				<configOption name="connection">
					<since>
						<version>11.0.0</version>
					</since>
					<synopsis>Connection to accept traffic on and on which to send traffic out</synopsis>
				</configOption>
				<configOption name="transport">
					<since>
						<version>11.0.0</version>
					</since>
					<synopsis>The transport to use for the endpoint.</synopsis>
					<description>
						<para>The default outbound transport for this endpoint. Inbound
						messages are inferred. Allowed transports are <literal>ice-udp</literal>,
						<literal>google</literal>, or <literal>google-v1</literal>. Note
						that <literal>chan_motif</literal> will fall back to transport
						preference order if the transport value chosen here fails.</para>
						<enumlist>
							<enum name="ice-udp">
								<para>The Jingle protocol, as defined in XEP 0166.</para>
							</enum>
							<enum name="google">
								<para>The Google Jingle protocol, which follows the Jingle
								specification for signaling but uses a custom transport for
								media.</para>
							</enum>
							<enum name="google-v1">
								<para>Google-V1 is the original Google Talk signaling
								protocol which uses an initial preliminary version of Jingle.
								It also uses the same custom transport as <literal>google</literal> for media.</para>
							</enum>
						</enumlist>
					</description>
				</configOption>
				<configOption name="maxicecandidates">
					<since>
						<version>11.0.0</version>
					</since>
					<synopsis>Maximum number of ICE candidates to offer</synopsis>
				</configOption>
				<configOption name="maxpayloads">
					<since>
						<version>11.0.0</version>
					</since>
					<synopsis>Maximum number of payloads to offer</synopsis>
				</configOption>
			</configObject>
		</configFile>
	</configInfo>
<module language="en_US" name="chan_pjsip">
	<depend>pjproject</depend>
	<depend>res_pjsip</depend>
	<depend>res_pjsip_pubsub</depend>
	<depend>res_pjsip_session</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="chan_rtp">
	<depend>res_rtp_multicast</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="chan_unistim">
	<support_level>extended</support_level>
</module>
<module language="en_US" name="chan_websocket">
	<depend>res_http_websocket</depend>
	<depend>res_websocket_client</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="console_board">
	<support_level>extended</support_level>
</module>
<module language="en_US" name="console_gui">
	<support_level>extended</support_level>
</module>
<module language="en_US" name="console_video">
	<support_level>extended</support_level>
</module>
<module language="en_US" name="bridge_native_dahdi">
	<support_level>core</support_level>
</module>
<module language="en_US" name="codec_pref">
	<support_level>core</support_level>
</module>
<module language="en_US" name="firmware">
	<support_level>core</support_level>
</module>
<module language="en_US" name="format_compatibility">
	<support_level>core</support_level>
</module>
<module language="en_US" name="netsock">
	<support_level>core</support_level>
</module>
<module language="en_US" name="parser">
	<support_level>core</support_level>
</module>
<module language="en_US" name="provision">
	<support_level>core</support_level>
</module>
<module language="en_US" name="dialplan_functions">
	<support_level>core</support_level>
</module>
<module language="en_US" name="sig_analog">
	<support_level>core</support_level>
</module>
<module language="en_US" name="sig_pri">
	<support_level>core</support_level>
</module>
	<managerEvent language="en_US" name="MCID" module="sig_pri">
		<managerEventInstance class="EVENT_FLAG_CALL" module="sig_pri">
			<since>
				<version>12.0.0</version>
			</since>
			<synopsis>Published when a malicious call ID request arrives.</synopsis>
			<syntax>
				<channel_snapshot/>
				<parameter name="MCallerIDNumValid">
				</parameter>
				<parameter name="MCallerIDNum">
				</parameter>
				<parameter name="MCallerIDton">
				</parameter>
				<parameter name="MCallerIDNumPlan">
				</parameter>
				<parameter name="MCallerIDNumPres">
				</parameter>
				<parameter name="MCallerIDNameValid">
				</parameter>
				<parameter name="MCallerIDName">
				</parameter>
				<parameter name="MCallerIDNameCharSet">
				</parameter>
				<parameter name="MCallerIDNamePres">
				</parameter>
				<parameter name="MCallerIDSubaddr">
				</parameter>
				<parameter name="MCallerIDSubaddrType">
				</parameter>
				<parameter name="MCallerIDSubaddrOdd">
				</parameter>
				<parameter name="MCallerIDPres">
				</parameter>
				<parameter name="MConnectedIDNumValid">
				</parameter>
				<parameter name="MConnectedIDNum">
				</parameter>
				<parameter name="MConnectedIDton">
				</parameter>
				<parameter name="MConnectedIDNumPlan">
				</parameter>
				<parameter name="MConnectedIDNumPres">
				</parameter>
				<parameter name="MConnectedIDNameValid">
				</parameter>
				<parameter name="MConnectedIDName">
				</parameter>
				<parameter name="MConnectedIDNameCharSet">
				</parameter>
				<parameter name="MConnectedIDNamePres">
				</parameter>
				<parameter name="MConnectedIDSubaddr">
				</parameter>
				<parameter name="MConnectedIDSubaddrType">
				</parameter>
				<parameter name="MConnectedIDSubaddrOdd">
				</parameter>
				<parameter name="MConnectedIDPres">
				</parameter>
			</syntax>
		</managerEventInstance>
	</managerEvent>
<module language="en_US" name="sig_ss7">
	<support_level>core</support_level>
</module>
<module language="en_US" name="vcodecs">
	<support_level>extended</support_level>
</module>
<module language="en_US" name="vgrabbers">
	<support_level>extended</support_level>
</module>
	<configInfo name="chan_websocket" language="en_US">
		<synopsis>Configuration for chan_websocket</synopsis>
		<description><para>
			<emphasis>WebSocket Channel Driver</emphasis>
			</para>
		</description>
		<configFile name="chan_websocket.conf">
			<configObject name="global">
				<since>
					<version>20.18.0</version>
					<version>22.8.0</version>
					<version>23.2.0</version>
				</since>
				<synopsis>Global settings for chan_websocket</synopsis>
				<configOption name="control_message_format" default="plain-text">
					<since>
						<version>20.18.0</version>
						<version>22.8.0</version>
						<version>23.2.0</version>
					</since>
					<synopsis>Determines the format used for sending and receiving
					control mesages on the websocket.
					</synopsis>
					<description>
						<enumlist>
							<enum name="plain-text">
							<para>The legacy plain text single-line message format.</para>
							</enum>
							<enum name="json">
							<para>The new JSON format.</para>
							</enum>
						</enumlist>
					</description>
				</configOption>
			</configObject>
		</configFile>
	</configInfo>

	<info name="Dial_Resource" language="en_US" tech="WebSocket" module="chan_websocket">
		<para>WebSocket Dial Strings:</para>
		<para><literal>Dial(WebSocket/connectionid[/websocket_options])</literal></para>
		<para>WebSocket Parameters:</para>
		<enumlist>
			<enum name="connectionid">
				<para>For outgoing WebSockets, this is the ID of the connection
				in websocket_client.conf to use for the call.  To accept incoming
				WebSocket connections use the literal <literal>INCOMING</literal></para>
			</enum>
			<enum name="websocket_options">
				<para>Options to control how the WebSocket channel behaves.</para>
				<enumlist>
					<enum name="c(codec) - Specify the codec to use in the channel">
						<para></para>
						<para> If not specified, the first codec from the caller's channel will be used.
						</para>
					</enum>
					<enum name="d(media_direction) - Set the media direction for this call">
						<para>Sets the media direction for the call. It is important to
						note that this is from the perspective of the application, NOT
						Asterisk.</para>
						<enumlist>
						<enum name="both">
						<para>
						The default behavior. Media flows both ways like normal.
						</para>
						</enum>
						<enum name="in">
						<para>
						Asterisk will send media to the application but drop any media
						it receives.
						</para>
						</enum>
						<enum name="out">
						<para>
						Asterisk will only receive media from the application, but will
						not send any media.
						</para>
						</enum>
						</enumlist>
					</enum>
					<enum name="f(format) - Control message format for this call">
						<para>
						format:
						</para>
						<xi:include xpointer="xpointer(/docs/configInfo[@name='chan_websocket']/configFile[@name='chan_websocket.conf']/configObject[@name='global']/configOption[@name='control_message_format']/description/enumlist)"/>
					</enum>
					<enum name="n - Don't auto answer">
						<para>Normally, the WebSocket channel will be answered when
						connection is established with the remote app.  If this
						option is specified however, the channel will not be
						answered until the <literal>ANSWER</literal> command is
						received from the remote app or the remote app calls the
						/channels/answer ARI endpoint.
						</para>
					</enum>
					<enum name="p - Passthrough mode">
						<para>In passthrough mode, the channel driver won't attempt
						to re-frame or re-time media coming in over the websocket from
						the remote app.  This can be used for any codec but MUST be used
						for codecs that use packet headers or whose data stream can't be
						broken up on arbitrary byte boundaries. In this case, the remote
						app is fully responsible for correctly framing and timing media
						sent to Asterisk and the MEDIA text commands that could be sent
						over the websocket are disabled.  Currently, passthrough mode is
						automatically set for the opus, speex and g729 codecs.
						</para>
					</enum>
					<enum name="v(uri_parameters) - Add parameters to the outbound URI">
						<para>This option allows you to add additional parameters to the
						outbound URI.  The format is:
						<literal>v(param1=value1,param2=value2...)</literal>
						</para>
						<para>You must ensure that no parameter name or value contains
						characters not valid in a URL.  The easiest way to do this is to
						use the URIENCODE() dialplan function to encode them.  Be aware
						though that each name and value must be encoded separately.  You
						can't simply encode the whole string.</para>
					</enum>
				</enumlist>
			</enum>
		</enumlist>
		<para>Examples:
		</para>
		<example title="Make an outbound WebSocket connection using connection 'connection1' and the 'sln16' codec.">
		same => n,Dial(WebSocket/connection1/c(sln16))
		</example>
		<example title="Make an outbound WebSocket connection using connection 'connection1' and the 'opus' codec. Passthrough mode will automatically be set.">
		same => n,Dial(WebSocket/connection1/c(opus))
		</example>
		<example title="Listen for an incoming WebSocket connection and don't auto-answer it.">
		same => n,Dial(WebSocket/INCOMING/n)
		</example>
		<example title="Add URI parameters.">
		same => n,Dial(WebSocket/connection1/v(${URIENCODE(vari able)}=${URIENCODE(${CHANNEL})},variable2=$(URIENCODE(${EXTEN})}))
		</example>
		<example title="Use the JSON control message format for this call.">
		same => n,Dial(WebSocket/connection1/f(json))
		</example>
	</info>
	<application name="PJSIPHangup" language="en_US" module="chan_pjsip">
		<since>
			<version>18.21.0</version>
			<version>20.6.0</version>
			<version>21.1.0</version>
		</since>
		<synopsis>
			Hangup an incoming PJSIP channel with a SIP response code
		</synopsis>
		<syntax>
			<parameter name="Cause" required="true">
				<para>May be one of...</para>
				<enumlist>
				<enum name="Response code"><para>A numeric response code in the range 400 ->699</para></enum>
				<enum name="Response code name"><para>A response code name from
				<literal>third-party/pjproject/source/pjsip/include/pjsip/sip_msg.h</literal>
				such as <literal>USE_IDENTITY_HEADER</literal> or 
				<literal>PJSIP_SC_USE_IDENTITY_HEADER</literal></para></enum>
				</enumlist>
			</parameter>
		</syntax>
		<description>
			<para>
			Hangs up an incoming PJSIP channel and returns the
			specified SIP response code in the final response to the caller.
			</para>
			<para>
			</para>
			<warning><para>
			This function must be called BEFORE anything that
			might cause any other final (non 1XX) response to be sent.
			For example calling <literal>Answer()</literal> or
			<literal>Playback</literal> without the
			<literal>noanswer</literal> option will cause the call
			to be answered and a final 200 response to be sent.
			</para></warning>
			<para>
			</para>
			<para>As with the <literal>Hangup</literal> application, 
			the dialplan will terminate after calling this function.</para>
			<para>
			</para>
			<para>The cause code set on the channel will be translated to
			a standard ISDN cause code using the table defined in
			ast_sip_hangup_sip2cause() in res_pjsip.c</para>
			<para>
			</para>
			<example title="Terminate call with 437 response code">
			same = n,PJSIPHangup(437)
			</example>
			<example title="Terminate call with 437 response code using the response code name">
			same = n,PJSIPHangup(UNSUPPORTED_CERTIFICATE)
			</example>
			<example title="Terminate call with 437 response code based on condition">
			same = n,ExecIf($[${SOMEVALUE} = ${SOME_BAD_VALUE}]?PJSIPHangup(437))
			</example>
		</description>
	</application>

	<application name="PJSIPNotify" language="en_US" module="chan_pjsip">
		<since>
			<version>18.25.0</version>
			<version>20.10.0</version>
			<version>21.5.0</version>
		</since>
		<synopsis>
			Send a NOTIFY to either an arbitrary URI, or inside a SIP dialog.
		</synopsis>
		<syntax>
			<parameter name="to" required="false">
				<para>Arbitrary URI to which to send the NOTIFY.  If none is specified, send inside
				the SIP dialog for the current channel.</para>
			</parameter>
			<parameter name="content" required="true">
				<para>Either an option pre-configured in pjsip_notify.conf or a list of headers and body content to send in the NOTIFY.</para>
			</parameter>
		</syntax>
		<description>
			<para>
			Sends a NOTIFY to a specified URI, or if none provided, within the current SIP dialog for the
			current channel.  The content can either be set to either an entry configured in pjsip_notify.conf
			or specified as a list of key value pairs.
			</para>
			<warning><para>
			To send a NOTIFY to a specified URI, a default_outbound_endpoint must be configured.  This
			endpoint determines the message contact.
			</para></warning>
			<para>
			</para>
			<example title="Send a NOTIFY with Event and X-Data headers in current dialog">
			same = n,PJSIPNotify(,&amp;Event=Test&amp;X-Data=Fun)
			</example>
			<example title="Send a preconfigured NOTIFY force-answer defined in pjsip_notify.conf in current dialog">
			same = n,PJSIPNotify(,force-answer)
			</example>
			<example title="Send a NOTIFY to &lt;sip:bob@127.0.0.1:5260&gt; with Test Event and X-Data headers">
			same = n,PJSIPNotify(&lt;sip:bob@127.0.0.1:5260&gt;,&amp;Event=Test&amp;X-Data=Fun)
			</example>
			<example title="Send a NOTIFY to &lt;sip:bob@127.0.0.1:5260&gt; with Custom Event and message body">
			same = n,PJSIPNotify(&lt;sip:bob@127.0.0.1:5260&gt;,&amp;Event=Custom&amp;Content-type=application&#47;voicemail&amp;Content=check-messages&amp;Content=)
			</example>
		</description>
	</application>

	<manager name="PJSIPHangup" language="en_US" module="chan_pjsip">
		<since>
			<version>21.1.0</version>
			<version>20.6.0</version>
			<version>18.21.0</version>
		</since>
		<synopsis>
			Hangup an incoming PJSIP channel with a SIP response code
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<xi:include xpointer="xpointer(/docs/manager[@name='Hangup']/syntax/parameter[@name='Channel'])" />
			<xi:include xpointer="xpointer(/docs/application[@name='PJSIPHangup']/syntax/parameter[@name='Cause'])" />
		</syntax>
		<description>
			<para>
			Hangs up an incoming PJSIP channel and returns the
			specified SIP response code in the final response to the caller.
			</para>
			<para>
			</para>
			<warning><para>
			This function must be called BEFORE anything that
			might cause any other final (non 1XX) response to be sent.
			For example calling <literal>Answer()</literal> or
			<literal>Playback</literal> without the
			<literal>noanswer</literal> option will cause the call
			to be answered and a final 200 response to be sent.
			</para></warning>
			<para>
			</para>
			<para>The cause code set on the channel will be translated to
			a standard ISDN cause code using the table defined in
			ast_sip_hangup_sip2cause() in res_pjsip.c</para>
			<para>
			</para>
			<example title="Terminate call with 437 response code">
			Action: PJSIPHangup
			ActionID: 12345678
			Channel: PJSIP/alice-00000002
			Cause: 437
			</example>
			<example title="Terminate call with 437 response code using the response code name">
			Action: PJSIPHangup
			ActionID: 12345678
			Channel: PJSIP/alice-00000002
			Cause: UNSUPPORTED_CERTIFICATE
			</example>
		</description>
	</manager>

	<function name="PJSIP_DIAL_CONTACTS" language="en_US" module="chan_pjsip">
		<since>
			<version>12.0.0</version>
		</since>
		<synopsis>
			Return a dial string for dialing all contacts on an AOR.
		</synopsis>
		<syntax>
			<parameter name="endpoint" required="true">
				<para>Name of the endpoint</para>
			</parameter>
			<parameter name="aor" required="false">
				<para>Name of an AOR to use, if not specified the configured AORs on the endpoint are used</para>
			</parameter>
			<parameter name="request_user" required="false">
				<para>Optional request user to use in the request URI</para>
			</parameter>
		</syntax>
		<description>
			<para>Returns a properly formatted dial string for dialing all contacts on an AOR.</para>
		</description>
	</function>
	<function name="PJSIP_MEDIA_OFFER" language="en_US" module="chan_pjsip">
		<since>
			<version>12.0.0</version>
		</since>
		<synopsis>
			Media and codec offerings to be set on an outbound SIP channel prior to dialing.
		</synopsis>
		<syntax>
			<parameter name="media" required="true">
				<para>The type of media offered</para>
				<enumlist>
					<enum name="audio">
						<para>Audio codecs to offer</para>
					</enum>
					<enum name="video">
						<para>Video codecs to offer</para>
					</enum>
				</enumlist>
			</parameter>
		</syntax>
		<description>
			<para>When read, returns the codecs offered based upon the media choice.</para>
			<para>When written, sets the codecs to offer when an outbound dial attempt is made,
			or when a session refresh is sent using <replaceable>PJSIP_SEND_SESSION_REFRESH</replaceable>.
			</para>
		</description>
		<see-also>
			<ref type="function">PJSIP_SEND_SESSION_REFRESH</ref>
		</see-also>
	</function>
	<function name="PJSIP_DTMF_MODE" language="en_US" module="chan_pjsip">
		<since>
			<version>13.18.0</version>
			<version>14.7.0</version>
			<version>15.1.0</version>
		</since>
		<synopsis>
			Get or change the DTMF mode for a SIP call.
		</synopsis>
		<syntax>
		</syntax>
		<description>
			<para>When read, returns the current DTMF mode</para>
			<para>When written, sets the current DTMF mode</para>
			<para>This function uses the same DTMF mode naming as the dtmf_mode configuration option</para>
		</description>
	</function>
	<function name="PJSIP_MOH_PASSTHROUGH" language="en_US" module="chan_pjsip">
		<since>
			<version>13.30.0</version>
			<version>16.7.0</version>
			<version>17.1.0</version>
		</since>
		<synopsis>
			Get or change the on-hold behavior for a SIP call.
		</synopsis>
		<syntax>
		</syntax>
		<description>
			<para>When read, returns the current moh passthrough mode</para>
			<para>When written, sets the current moh passthrough mode</para>
			<para>If <replaceable>yes</replaceable>, on-hold re-INVITEs are sent. If <replaceable>no</replaceable>, music on hold is generated.</para>
			<para>This function can be used to override the moh_passthrough configuration option</para>
		</description>
	</function>
	<function name="PJSIP_SEND_SESSION_REFRESH" language="en_US" module="chan_pjsip">
		<since>
			<version>13.12.0</version>
			<version>14.1.0</version>
		</since>
		<synopsis>
			W/O: Initiate a session refresh via an UPDATE or re-INVITE on an established media session
		</synopsis>
		<syntax>
			<parameter name="update_type" required="false">
				<para>The type of update to send. Default is <literal>invite</literal>.</para>
				<enumlist>
					<enum name="invite">
						<para>Send the session refresh as a re-INVITE.</para>
					</enum>
					<enum name="update">
						<para>Send the session refresh as an UPDATE.</para>
					</enum>
				</enumlist>
			</parameter>
		</syntax>
		<description>
			<para>This function will cause the PJSIP stack to immediately refresh
			the media session for the channel. This will be done using either a
			re-INVITE (default) or an UPDATE request.
			</para>
			<para>This is most useful when combined with the <replaceable>PJSIP_MEDIA_OFFER</replaceable>
			dialplan function, as it allows the formats in use on a channel to be
			re-negotiated after call setup.</para>
			<warning>
				<para>The formats the endpoint supports are <emphasis>not</emphasis>
				checked or enforced by this function. Using this function to offer
				formats not supported by the endpoint <emphasis>may</emphasis> result
				in a loss of media.</para>
			</warning>
			<example title="Re-negotiate format to g722">
			 ; Within some existing extension on an answered channel
			 same => n,Set(PJSIP_MEDIA_OFFER(audio)=!all,g722)
			 same => n,Set(PJSIP_SEND_SESSION_REFRESH()=invite)
			</example>
		</description>
		<see-also>
			<ref type="function">PJSIP_MEDIA_OFFER</ref>
		</see-also>
	</function>
	<function name="PJSIP_PARSE_URI" language="en_US" module="chan_pjsip">
		<since>
			<version>13.24.0</version>
			<version>16.1.0</version>
		</since>
		<synopsis>
			Parse a URI and return a type part of the URI.
		</synopsis>
		<syntax>
			<parameter name="uri" required="true">
				<para>URI to parse</para>
			</parameter>
			<parameter name="type" required="true">
				<para>The <literal>type</literal> parameter specifies which URI part to read</para>
				<enumlist>
					<enum name="display">
						<para>Display name.</para>
					</enum>
					<enum name="scheme">
						<para>URI scheme.</para>
					</enum>
					<enum name="user">
						<para>User part.</para>
					</enum>
					<enum name="passwd">
						<para>Password part.</para>
					</enum>
					<enum name="host">
						<para>Host part.</para>
					</enum>
					<enum name="port">
						<para>Port number, or zero.</para>
					</enum>
					<enum name="user_param">
						<para>User parameter.</para>
					</enum>
					<enum name="method_param">
						<para>Method parameter.</para>
					</enum>
					<enum name="transport_param">
						<para>Transport parameter.</para>
					</enum>
					<enum name="ttl_param">
						<para>TTL param, or -1.</para>
					</enum>
					<enum name="lr_param">
						<para>Loose routing param, or zero.</para>
					</enum>
					<enum name="maddr_param">
						<para>Maddr param.</para>
					</enum>
				</enumlist>
			</parameter>
		</syntax>
		<description>
			<para>Parse a URI and return a specified part of the URI.</para>
		</description>
	</function>
	<function name="PJSIP_PARSE_URI_FROM" language="en_US" module="chan_pjsip">
		<since>
			<version>18.24.0</version>
			<version>20.9.0</version>
			<version>21.4.0</version>
		</since>
		<synopsis>
			Parse the contents of a variable as a URI and return a type part of the URI.
		</synopsis>
		<syntax>
			<parameter name="uri" required="true">
				<para>Name of a variable that contains a URI to parse</para>
			</parameter>
			<parameter name="type" required="true">
				<para>The <literal>type</literal> parameter specifies which URI part to read</para>
				<enumlist>
					<enum name="display">
						<para>Display name.</para>
					</enum>
					<enum name="scheme">
						<para>URI scheme.</para>
					</enum>
					<enum name="user">
						<para>User part.</para>
					</enum>
					<enum name="passwd">
						<para>Password part.</para>
					</enum>
					<enum name="host">
						<para>Host part.</para>
					</enum>
					<enum name="port">
						<para>Port number, or zero.</para>
					</enum>
					<enum name="user_param">
						<para>User parameter.</para>
					</enum>
					<enum name="method_param">
						<para>Method parameter.</para>
					</enum>
					<enum name="transport_param">
						<para>Transport parameter.</para>
					</enum>
					<enum name="ttl_param">
						<para>TTL param, or -1.</para>
					</enum>
					<enum name="lr_param">
						<para>Loose routing param, or zero.</para>
					</enum>
					<enum name="maddr_param">
						<para>Maddr param.</para>
					</enum>
				</enumlist>
			</parameter>
		</syntax>
		<description>
			<para>Parse the contents of the provided variable as a URI and return a specified part of the URI.</para>
		</description>
	</function>
	<function name="PJSIP_TRANSFER_HANDLING" language="en_US" module="chan_pjsip">
		<since>
			<version>22.3.0</version>
			<version>21.8.0</version>
			<version>20.13.0</version>
		</since>
		<synopsis>
			Set how transfers are handled for a PJSIP channel.
		</synopsis>
		<syntax>
			<parameter name="mode" required="false">
				<para>How transfers are handled for a PJSIP channel. Default is <literal>core</literal>.</para>
				<enumlist>
					<enum name="core">
						<para>Asterisk will handle attended and blind transfers.</para>
					</enum>
					<enum name="ari-only">
						<para>Asterisk will generate ARI events on incoming SIP REFER.</para>
					</enum>
				</enumlist>
			</parameter>
		</syntax>
		<description>
			<para>When written, sets the transferhandling behavior</para>
		</description>
	</function>

	<info name="CHANNEL" language="en_US" tech="PJSIP" module="chan_pjsip">
		<enumlist>
			<enum name="rtp">
				<para>R/O Retrieve media related information.</para>
				<parameter name="type" required="true">
					<para>When <replaceable>rtp</replaceable> is specified, the
					<literal>type</literal> parameter must be provided. It specifies
					which RTP parameter to read.</para>
					<enumlist>
						<enum name="src">
							<para>Retrieve the local address for RTP.</para>
						</enum>
						<enum name="dest">
							<para>Retrieve the remote address for RTP.</para>
						</enum>
						<enum name="direct">
							<para>If direct media is enabled, this address is the remote address
							used for RTP.</para>
						</enum>
						<enum name="secure">
							<para>Whether or not the media stream is encrypted.</para>
							<enumlist>
								<enum name="0">
									<para>The media stream is not encrypted.</para>
								</enum>
								<enum name="1">
									<para>The media stream is encrypted.</para>
								</enum>
							</enumlist>
						</enum>
						<enum name="hold">
							<para>Whether or not the media stream is currently restricted
							due to a call hold.</para>
							<enumlist>
								<enum name="0">
									<para>The media stream is not held.</para>
								</enum>
								<enum name="1">
									<para>The media stream is held.</para>
								</enum>
							</enumlist>
						</enum>
					</enumlist>
				</parameter>
				<parameter name="media_type" required="false">
					<para>When <replaceable>rtp</replaceable> is specified, the
					<literal>media_type</literal> parameter may be provided. It specifies
					which media stream the chosen RTP parameter should be retrieved
					from.</para>
					<enumlist>
						<enum name="audio">
							<para>Retrieve information from the audio media stream.</para>
							<note><para>If not specified, <literal>audio</literal> is used
							by default.</para></note>
						</enum>
						<enum name="video">
							<para>Retrieve information from the video media stream.</para>
						</enum>
					</enumlist>
				</parameter>
			</enum>
			<enum name="rtcp">
				<para>R/O Retrieve RTCP statistics.</para>
				<parameter name="statistic" required="true">
					<para>When <replaceable>rtcp</replaceable> is specified, the
					<literal>statistic</literal> parameter must be provided. It specifies
					which RTCP statistic parameter to read.</para>
					<enumlist>
						<enum name="all">
							<para>Retrieve a summary of all RTCP statistics.</para>
							<para>The following data items are returned in a semi-colon
							delineated list:</para>
							<enumlist>
								<enum name="ssrc">
									<para>Our Synchronization Source identifier</para>
								</enum>
								<enum name="themssrc">
									<para>Their Synchronization Source identifier</para>
								</enum>
								<enum name="lp">
									<para>Our lost packet count</para>
								</enum>
								<enum name="rxjitter">
									<para>Received packet jitter</para>
								</enum>
								<enum name="rxcount">
									<para>Received packet count</para>
								</enum>
								<enum name="txjitter">
									<para>Transmitted packet jitter</para>
								</enum>
								<enum name="txcount">
									<para>Transmitted packet count</para>
								</enum>
								<enum name="rlp">
									<para>Remote lost packet count</para>
								</enum>
								<enum name="rtt">
									<para>Round trip time</para>
								</enum>
								<enum name="txmes">
									<para>Transmitted Media Experience Score</para>
								</enum>
								<enum name="rxmes">
									<para>Received Media Experience Score</para>
								</enum>
							</enumlist>
						</enum>
						<enum name="all_jitter">
							<para>Retrieve a summary of all RTCP Jitter statistics.</para>
							<para>The following data items are returned in a semi-colon
							delineated list:</para>
							<enumlist>
								<enum name="minrxjitter">
									<para>Our minimum jitter</para>
								</enum>
								<enum name="maxrxjitter">
									<para>Our max jitter</para>
								</enum>
								<enum name="avgrxjitter">
									<para>Our average jitter</para>
								</enum>
								<enum name="stdevrxjitter">
									<para>Our jitter standard deviation</para>
								</enum>
								<enum name="reported_minjitter">
									<para>Their minimum jitter</para>
								</enum>
								<enum name="reported_maxjitter">
									<para>Their max jitter</para>
								</enum>
								<enum name="reported_avgjitter">
									<para>Their average jitter</para>
								</enum>
								<enum name="reported_stdevjitter">
									<para>Their jitter standard deviation</para>
								</enum>
							</enumlist>
						</enum>
						<enum name="all_loss">
							<para>Retrieve a summary of all RTCP packet loss statistics.</para>
							<para>The following data items are returned in a semi-colon
							delineated list:</para>
							<enumlist>
								<enum name="minrxlost">
									<para>Our minimum lost packets</para>
								</enum>
								<enum name="maxrxlost">
									<para>Our max lost packets</para>
								</enum>
								<enum name="avgrxlost">
									<para>Our average lost packets</para>
								</enum>
								<enum name="stdevrxlost">
									<para>Our lost packets standard deviation</para>
								</enum>
								<enum name="reported_minlost">
									<para>Their minimum lost packets</para>
								</enum>
								<enum name="reported_maxlost">
									<para>Their max lost packets</para>
								</enum>
								<enum name="reported_avglost">
									<para>Their average lost packets</para>
								</enum>
								<enum name="reported_stdevlost">
									<para>Their lost packets standard deviation</para>
								</enum>
							</enumlist>
						</enum>
						<enum name="all_rtt">
							<para>Retrieve a summary of all RTCP round trip time information.</para>
							<para>The following data items are returned in a semi-colon
							delineated list:</para>
							<enumlist>
								<enum name="minrtt">
									<para>Minimum round trip time</para>
								</enum>
								<enum name="maxrtt">
									<para>Maximum round trip time</para>
								</enum>
								<enum name="avgrtt">
									<para>Average round trip time</para>
								</enum>
								<enum name="stdevrtt">
									<para>Standard deviation round trip time</para>
								</enum>
							</enumlist>
						</enum>
						<enum name="all_mes">
							<para>Retrieve a summary of all RTCP Media Experience Score information.</para>
							<para>The following data items are returned in a semi-colon
							delineated list:</para>
							<enumlist>
								<enum name="minmes">
									<para>Minimum MES based on us analysing received packets.</para>
								</enum>
								<enum name="maxmes">
									<para>Maximum MES based on us analysing received packets.</para>
								</enum>
								<enum name="avgmes">
									<para>Average MES based on us analysing received packets.</para>
								</enum>
								<enum name="stdevmes">
									<para>Standard deviation MES based on us analysing received packets.</para>
								</enum>
								<enum name="reported_minmes">
									<para>Minimum MES based on data we get in Sender and Receiver Reports sent by the remote end</para>
								</enum>
								<enum name="reported_maxmes">
									<para>Maximum MES based on data we get in Sender and Receiver Reports sent by the remote end</para>
								</enum>
								<enum name="reported_avgmes">
									<para>Average MES based on data we get in Sender and Receiver Reports sent by the remote end</para>
								</enum>
								<enum name="reported_stdevmes">
									<para>Standard deviation MES based on data we get in Sender and Receiver Reports sent by the remote end</para>
								</enum>
							</enumlist>
						</enum>
						<enum name="txcount"><para>Transmitted packet count</para></enum>
						<enum name="rxcount"><para>Received packet count</para></enum>
						<enum name="txjitter"><para>Transmitted packet jitter</para></enum>
						<enum name="rxjitter"><para>Received packet jitter</para></enum>
						<enum name="remote_maxjitter"><para>Their max jitter</para></enum>
						<enum name="remote_minjitter"><para>Their minimum jitter</para></enum>
						<enum name="remote_normdevjitter"><para>Their average jitter</para></enum>
						<enum name="remote_stdevjitter"><para>Their jitter standard deviation</para></enum>
						<enum name="local_maxjitter"><para>Our max jitter</para></enum>
						<enum name="local_minjitter"><para>Our minimum jitter</para></enum>
						<enum name="local_normdevjitter"><para>Our average jitter</para></enum>
						<enum name="local_stdevjitter"><para>Our jitter standard deviation</para></enum>
						<enum name="txploss"><para>Transmitted packet loss</para></enum>
						<enum name="rxploss"><para>Received packet loss</para></enum>
						<enum name="remote_maxrxploss"><para>Their max lost packets</para></enum>
						<enum name="remote_minrxploss"><para>Their minimum lost packets</para></enum>
						<enum name="remote_normdevrxploss"><para>Their average lost packets</para></enum>
						<enum name="remote_stdevrxploss"><para>Their lost packets standard deviation</para></enum>
						<enum name="local_maxrxploss"><para>Our max lost packets</para></enum>
						<enum name="local_minrxploss"><para>Our minimum lost packets</para></enum>
						<enum name="local_normdevrxploss"><para>Our average lost packets</para></enum>
						<enum name="local_stdevrxploss"><para>Our lost packets standard deviation</para></enum>
						<enum name="rtt"><para>Round trip time</para></enum>
						<enum name="maxrtt"><para>Maximum round trip time</para></enum>
						<enum name="minrtt"><para>Minimum round trip time</para></enum>
						<enum name="normdevrtt"><para>Average round trip time</para></enum>
						<enum name="stdevrtt"><para>Standard deviation round trip time</para></enum>
						<enum name="local_ssrc"><para>Our Synchronization Source identifier</para></enum>
						<enum name="remote_ssrc"><para>Their Synchronization Source identifier</para></enum>
						<enum name="txmes"><para>
						Current MES based on us analyzing rtt, jitter and loss
						in the actual received RTP stream received from the remote end.
						I.E.  This is the MES for the incoming audio stream.
						</para></enum>
						<enum name="rxmes"><para>
						Current MES based on rtt and the jitter and loss values in
						RTCP sender and receiver reports we receive from the
						remote end. I.E.  This is the MES for the outgoing audio stream.
						</para></enum>
						<enum name="remote_maxmes"><para>Max MES based on data we get in Sender and Receiver Reports sent by the remote end</para></enum>
						<enum name="remote_minmes"><para>Min MES based on data we get in Sender and Receiver Reports sent by the remote end</para></enum>
						<enum name="remote_normdevmes"><para>Average MES based on data we get in Sender and Receiver Reports sent by the remote end</para></enum>
						<enum name="remote_stdevmes"><para>Standard deviation MES based on data we get in Sender and Receiver Reports sent by the remote end</para></enum>
						<enum name="local_maxmes"><para>Max MES based on us analyzing the received RTP stream</para></enum>
						<enum name="local_minmes"><para>Min MES based on us analyzing the received RTP stream</para></enum>
						<enum name="local_normdevmes"><para>Average MES based on us analyzing the received RTP stream</para></enum>
						<enum name="local_stdevmes"><para>Standard deviation MES based on us analyzing the received RTP stream</para></enum>
					</enumlist>
				</parameter>
				<parameter name="media_type" required="false">
					<para>When <replaceable>rtcp</replaceable> is specified, the
					<literal>media_type</literal> parameter may be provided. It specifies
					which media stream the chosen RTCP parameter should be retrieved
					from.</para>
					<enumlist>
						<enum name="audio">
							<para>Retrieve information from the audio media stream.</para>
							<note><para>If not specified, <literal>audio</literal> is used
							by default.</para></note>
						</enum>
						<enum name="video">
							<para>Retrieve information from the video media stream.</para>
						</enum>
					</enumlist>
				</parameter>
			</enum>
			<enum name="endpoint">
				<para>R/O The name of the endpoint associated with this channel.
				Use the <replaceable>PJSIP_ENDPOINT</replaceable> function to obtain
				further endpoint related information.</para>
			</enum>
			<enum name="contact">
				<para>R/O The name of the contact associated with this channel.
				Use the <replaceable>PJSIP_CONTACT</replaceable> function to obtain
				further contact related information. Note this may not be present and if so
				is only available on outgoing legs.</para>
			</enum>
			<enum name="aor">
				<para>R/O The name of the AOR associated with this channel.
				Use the <replaceable>PJSIP_AOR</replaceable> function to obtain
				further AOR related information. Note this may not be present and if so
				is only available on outgoing legs.</para>
			</enum>
			<enum name="pjsip">
				<para>R/O Obtain information about the current PJSIP channel and its
				session.</para>
				<parameter name="type" required="true">
					<para>When <replaceable>pjsip</replaceable> is specified, the
					<literal>type</literal> parameter must be provided. It specifies
					which signalling parameter to read.</para>
					<enumlist>
						<enum name="call-id">
							<para>The SIP call-id.</para>
						</enum>
						<enum name="secure">
							<para>Whether or not the signalling uses a secure transport.</para>
							<enumlist>
								<enum name="0"><para>The signalling uses a non-secure transport.</para></enum>
								<enum name="1"><para>The signalling uses a secure transport.</para></enum>
							</enumlist>
						</enum>
						<enum name="target_uri">
							<para>The contact URI where requests are sent.</para>
						</enum>
						<enum name="local_uri">
							<para>The local URI.</para>
						</enum>
						<enum name="local_tag">
							<para>Tag in From header</para>
						</enum>
						<enum name="remote_uri">
							<para>The remote URI.</para>
						</enum>
						<enum name="remote_tag">
							<para>Tag in To header</para>
						</enum>
						<enum name="request_uri">
							<para>The request URI of the incoming <literal>INVITE</literal>
							associated with the creation of this channel.</para>
						</enum>
						<enum name="t38state">
							<para>The current state of any T.38 fax on this channel.</para>
							<enumlist>
								<enum name="DISABLED"><para>T.38 faxing is disabled on this channel.</para></enum>
								<enum name="LOCAL_REINVITE"><para>Asterisk has sent a <literal>re-INVITE</literal> to the remote end to initiate a T.38 fax.</para></enum>
								<enum name="REMOTE_REINVITE"><para>The remote end has sent a <literal>re-INVITE</literal> to Asterisk to initiate a T.38 fax.</para></enum>
								<enum name="ENABLED"><para>A T.38 fax session has been enabled.</para></enum>
								<enum name="REJECTED"><para>A T.38 fax session was attempted but was rejected.</para></enum>
							</enumlist>
						</enum>
						<enum name="local_addr">
							<para>On inbound calls, the full IP address and port number that
							the <literal>INVITE</literal> request was received on. On outbound
							calls, the full IP address and port number that the <literal>INVITE</literal>
							request was transmitted from.</para>
						</enum>
						<enum name="remote_addr">
							<para>On inbound calls, the full IP address and port number that
							the <literal>INVITE</literal> request was received from. On outbound
							calls, the full IP address and port number that the <literal>INVITE</literal>
							request was transmitted to.</para>
						</enum>
					</enumlist>
				</parameter>
			</enum>
		</enumlist>
	</info>
	<info name="CHANNEL_EXAMPLES" language="en_US" tech="PJSIP" module="chan_pjsip">
		<example title="PJSIP specific CHANNEL examples">
			; Log the current Call-ID
			same => n,Log(NOTICE, ${CHANNEL(pjsip,call-id)})
	
			; Log the destination address of the audio stream
			same => n,Log(NOTICE, ${CHANNEL(rtp,dest)})
	
			; Store the round-trip time associated with a
			; video stream in the CDR field video-rtt
			same => n,Set(CDR(video-rtt)=${CHANNEL(rtcp,rtt,video)})
		</example>
	</info>
<module language="en_US" name="dundi-parser">
	<support_level>extended</support_level>
</module>
<module language="en_US" name="pbx_ael">
	<depend>res_ael_share</depend>
	<support_level>extended</support_level>
</module>
	<application name="AELSub" language="en_US" module="pbx_ael">
		<since>
			<version>10.0.0</version>
		</since>
		<synopsis>
			Launch subroutine built with AEL
		</synopsis>
		<syntax>
			<parameter name="routine" required="true">
				<para>Named subroutine to execute.</para>
			</parameter>
			<parameter name="args" required="false" />
		</syntax>
		<description>
			<para>Execute the named subroutine, defined in AEL, from another dialplan
			language, such as extensions.conf, Realtime extensions, or Lua.</para>
			<para>The purpose of this application is to provide a sane entry point into
			AEL subroutines, the implementation of which may change from time to time.</para>
		</description>
	</application>
<module language="en_US" name="pbx_config">
	<support_level>core</support_level>
</module>
	<manager name="DialplanExtensionAdd" language="en_US" module="pbx_config">
		<since>
			<version>13.0.0</version>
		</since>
		<synopsis>
			Add an extension to the dialplan
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="Context" required="true">
				<para>Context where the extension will be created. The context will
				be created if it does not already exist.</para>
			</parameter>
			<parameter name="Extension" required="true">
				<para>Name of the extension that will be created (may include callerid match by separating
				with '/')</para>
			</parameter>
			<parameter name="Priority" required="true">
				<para>Priority being added to this extension. Must be either <literal>hint</literal> or a
				numerical value.</para>
			</parameter>
			<parameter name="Application" required="true">
				<para>The application to use for this extension at the requested priority</para>
			</parameter>
			<parameter name="ApplicationData" required="false">
				<para>Arguments to the application.</para>
			</parameter>
			<parameter name="Replace" required="false">
				<para>If set to 'yes', '1', 'true' or any of the other values we evaluate as true, then
				if an extension already exists at the requested context, extension, and priority it will
				be overwritten. Otherwise, the existing extension will remain and the action will fail.
				</para>
			</parameter>
		</syntax>
	</manager>
	<manager name="DialplanExtensionRemove" language="en_US" module="pbx_config">
		<since>
			<version>13.0.0</version>
		</since>
		<synopsis>
			Remove an extension from the dialplan
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="Context" required="true">
				<para>Context of the extension being removed</para>
			</parameter>
			<parameter name="Extension" required="true">
				<para>Name of the extension being removed (may include callerid match by separating with '/')</para>
			</parameter>
			<parameter name="Priority" required="false">
				<para>If provided, only remove this priority from the extension instead of all
				priorities in the extension.</para>
			</parameter>
		</syntax>
	</manager>
<module language="en_US" name="pbx_dundi">
	<depend>zlib</depend>
	<use type="module">res_crypto</use>
	<use type="external">crypto</use>
	<support_level>extended</support_level>
</module>
	<function name="DUNDILOOKUP" language="en_US" module="pbx_dundi">
		<since>
			<version>1.8.0</version>
		</since>
		<synopsis>
			Do a DUNDi lookup of a phone number.
		</synopsis>
		<syntax>
			<parameter name="number" required="true"/>
			<parameter name="context">
				<para>If not specified the default will be <literal>e164</literal>.</para>
			</parameter>
			<parameter name="options">
				<optionlist>
					<option name="b">
						<para>Bypass the internal DUNDi cache</para>
					</option>
				</optionlist>
			</parameter>
		</syntax>
		<description>
			<para>This will do a DUNDi lookup of the given phone number.</para>
			<para>This function will return the Technology/Resource found in the first result
			in the DUNDi lookup. If no results were found, the result will be blank.</para>
		</description>
	</function>


	<function name="DUNDIQUERY" language="en_US" module="pbx_dundi">
		<since>
			<version>1.8.0</version>
		</since>
		<synopsis>
			Initiate a DUNDi query.
		</synopsis>
		<syntax>
			<parameter name="number" required="true"/>
			<parameter name="context">
				<para>If not specified the default will be <literal>e164</literal>.</para>
			</parameter>
			<parameter name="options">
				<optionlist>
					<option name="b">
						<para>Bypass the internal DUNDi cache</para>
					</option>
				</optionlist>
			</parameter>
		</syntax>
		<description>
			<para>This will do a DUNDi lookup of the given phone number.</para>
			<para>The result of this function will be a numeric ID that can be used to retrieve
			the results with the <literal>DUNDIRESULT</literal> function.</para>
		</description>
	</function>

	<function name="DUNDIRESULT" language="en_US" module="pbx_dundi">
		<since>
			<version>1.8.0</version>
		</since>
		<synopsis>
			Retrieve results from a DUNDIQUERY.
		</synopsis>
		<syntax>
			<parameter name="id" required="true">
				<para>The identifier returned by the <literal>DUNDIQUERY</literal> function.</para>
			</parameter>
			<parameter name="resultnum">
				<optionlist>
					<option name="number">
						<para>The number of the result that you want to retrieve, this starts at <literal>1</literal></para>
					</option>
					<option name="getnum">
						<para>The total number of results that are available.</para>
					</option>
				</optionlist>
			</parameter>
		</syntax>
		<description>
			<para>This function will retrieve results from a previous use\n"
			of the <literal>DUNDIQUERY</literal> function.</para>
		</description>
	</function>
<module language="en_US" name="pbx_loopback">
	<support_level>core</support_level>
</module>
<module language="en_US" name="pbx_lua">
	<depend>lua</depend>
	<support_level>extended</support_level>
</module>
<module language="en_US" name="pbx_realtime">
	<support_level>extended</support_level>
</module>
<module language="en_US" name="pbx_spool">
	<support_level>core</support_level>
</module>
<module language="en_US" name="app_adsiprog">
	<depend>res_adsi</depend>
	<support_level>deprecated</support_level>
</module>
	<application name="ADSIProg" language="en_US" module="app_adsiprog">
		<since>
			<version>0.1.12</version>
		</since>
		<synopsis>
			Load Asterisk ADSI Scripts into phone
		</synopsis>
		<syntax>
			<parameter name="script" required="false">
				<para>adsi script to use. If not given uses the default script <filename>asterisk.adsi</filename></para>
			</parameter>
		</syntax>
		<description>
			<para>This application programs an ADSI Phone with the given script</para>
		</description>
		<see-also>
			<ref type="application">GetCPEID</ref>
			<ref type="filename">adsi.conf</ref>
		</see-also>
	</application>
<module language="en_US" name="app_agent_pool">
	<support_level>core</support_level>
</module>
	<application name="AgentLogin" language="en_US" module="app_agent_pool">
		<since>
			<version>12.0.0</version>
		</since>
		<synopsis>
			Login an agent.
		</synopsis>
		<syntax argsep=",">
			<parameter name="AgentId" required="true" />
			<parameter name="options">
				<optionlist>
					<option name="s">
						<para>silent login - do not announce the login ok segment after
						agent logged on.</para>
					</option>
				</optionlist>
			</parameter>
		</syntax>
		<description>
			<para>Login an agent to the system.  Any agent authentication is assumed to
			already be done by dialplan.  While logged in, the agent can receive calls
			and will hear the sound file specified by the config option custom_beep
			when a new call comes in for the agent.  Login failures will continue in
			the dialplan with <variable>AGENT_STATUS</variable> set.</para>
			<para>Before logging in, you can setup on the real agent channel the
			CHANNEL(dtmf_features) an agent will have when talking to a caller
			and you can setup on the channel running this application the
			CONNECTEDLINE() information the agent will see while waiting for a
			caller.</para>
			<para><variable>AGENT_STATUS</variable> enumeration values:</para>
			<enumlist>
				<enum name = "INVALID"><para>The specified agent is invalid.</para></enum>
				<enum name = "ALREADY_LOGGED_IN"><para>The agent is already logged in.</para></enum>
			</enumlist>
			<note><para>The Agent:<replaceable>AgentId</replaceable> device state is
			available to monitor the status of the agent.</para></note>
		</description>
		<see-also>
			<ref type="application">Authenticate</ref>
			<ref type="application">Queue</ref>
			<ref type="application">AddQueueMember</ref>
			<ref type="application">RemoveQueueMember</ref>
			<ref type="application">PauseQueueMember</ref>
			<ref type="application">UnpauseQueueMember</ref>
			<ref type="function">AGENT</ref>
			<ref type="function">CHANNEL</ref>
			<ref type="function">CONNECTEDLINE</ref>
			<ref type="filename">agents.conf</ref>
			<ref type="filename">queues.conf</ref>
		</see-also>
	</application>
	<application name="AgentRequest" language="en_US" module="app_agent_pool">
		<since>
			<version>12.0.0</version>
		</since>
		<synopsis>
			Request an agent to connect with the channel.
		</synopsis>
		<syntax argsep=",">
			<parameter name="AgentId" required="true" />
		</syntax>
		<description>
			<para>Request an agent to connect with the channel.  Failure to find,
			alert the agent, or acknowledge the call will continue in the dialplan
			with <variable>AGENT_STATUS</variable> set.</para>
			<para><variable>AGENT_STATUS</variable> enumeration values:</para>
			<enumlist>
				<enum name = "INVALID"><para>The specified agent is invalid.</para></enum>
				<enum name = "NOT_LOGGED_IN"><para>The agent is not available.</para></enum>
				<enum name = "BUSY"><para>The agent is on another call.</para></enum>
				<enum name = "NOT_CONNECTED"><para>The agent did not connect with the
				call.  The agent most likely did not acknowledge the call.</para></enum>
				<enum name = "ERROR"><para>Alerting the agent failed.</para></enum>
			</enumlist>
		</description>
		<see-also>
			<ref type="application">AgentLogin</ref>
		</see-also>
	</application>
	<function name="AGENT" language="en_US" module="app_agent_pool">
		<since>
			<version>12.0.0</version>
		</since>
		<synopsis>
			Gets information about an Agent
		</synopsis>
		<syntax argsep=":">
			<parameter name="AgentId" required="true" />
			<parameter name="item">
				<para>The valid items to retrieve are:</para>
				<enumlist>
					<enum name="status">
						<para>(default) The status of the agent (LOGGEDIN | LOGGEDOUT)</para>
					</enum>
					<enum name="name">
						<para>The name of the agent</para>
					</enum>
					<enum name="mohclass">
						<para>MusicOnHold class</para>
					</enum>
					<enum name="channel">
						<para>The name of the active channel for the Agent (AgentLogin)</para>
					</enum>
					<enum name="fullchannel">
						<para>The untruncated name of the active channel for the Agent (AgentLogin)</para>
					</enum>
				</enumlist>
			</parameter>
		</syntax>
		<description></description>
	</function>
	<manager name="Agents" language="en_US" module="app_agent_pool">
		<since>
			<version>1.2.0</version>
		</since>
		<synopsis>
			Lists agents and their status.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
		</syntax>
		<description>
			<para>Will list info about all defined agents.</para>
		</description>
		<see-also>
			<ref type="managerEvent">Agents</ref>
			<ref type="managerEvent">AgentsComplete</ref>
		</see-also>
	</manager>
	<managerEvent language="en_US" name="Agents" module="app_agent_pool">
		<managerEventInstance class="EVENT_FLAG_AGENT" module="app_agent_pool">
			<since>
				<version>12.0.0</version>
			</since>
			<synopsis>
				Response event in a series to the Agents AMI action containing
				information about a defined agent.
			</synopsis>
			<syntax>
				<parameter name="Agent">
					<para>Agent ID of the agent.</para>
				</parameter>
				<parameter name="Name">
					<para>User friendly name of the agent.</para>
				</parameter>
				<parameter name="Status">
					<para>Current status of the agent.</para>
					<para>The valid values are:</para>
					<enumlist>
						<enum name="AGENT_LOGGEDOFF" />
						<enum name="AGENT_IDLE" />
						<enum name="AGENT_ONCALL" />
					</enumlist>
				</parameter>
				<parameter name="TalkingToChan">
					<para><variable>BRIDGEPEER</variable> value on agent channel.</para>
					<para>Present if Status value is <literal>AGENT_ONCALL</literal>.</para>
				</parameter>
				<parameter name="CallStarted">
					<para>Epoch time when the agent started talking with the caller.</para>
					<para>Present if Status value is <literal>AGENT_ONCALL</literal>.</para>
				</parameter>
				<parameter name="LoggedInTime">
					<para>Epoch time when the agent logged in.</para>
					<para>Present if Status value is <literal>AGENT_IDLE</literal> or <literal>AGENT_ONCALL</literal>.</para>
				</parameter>
				<channel_snapshot/>
				<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			</syntax>
			<description>
				<para>The channel snapshot is present if the Status value is <literal>AGENT_IDLE</literal> or <literal>AGENT_ONCALL</literal>.</para>
			</description>
			<see-also>
				<ref type="manager">Agents</ref>
			</see-also>
		</managerEventInstance>
	</managerEvent>
	<managerEvent language="en_US" name="AgentsComplete" module="app_agent_pool">
		<managerEventInstance class="EVENT_FLAG_AGENT" module="app_agent_pool">
			<since>
				<version>12.0.0</version>
			</since>
			<synopsis>
				Final response event in a series of events to the Agents AMI action.
			</synopsis>
			<syntax>
				<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			</syntax>
			<see-also>
				<ref type="manager">Agents</ref>
			</see-also>
		</managerEventInstance>
	</managerEvent>
	<manager name="AgentLogoff" language="en_US" module="app_agent_pool">
		<since>
			<version>1.2.0</version>
		</since>
		<synopsis>
			Sets an agent as no longer logged in.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="Agent" required="true">
				<para>Agent ID of the agent to log off.</para>
			</parameter>
			<parameter name="Soft">
				<para>Set to <literal>true</literal> to not hangup existing calls.</para>
			</parameter>
		</syntax>
		<description>
			<para>Sets an agent as no longer logged in.</para>
		</description>
	</manager>
	<configInfo name="app_agent_pool" language="en_US">
		<synopsis>Agent pool applications</synopsis>
		<description>
			<note><para>Option changes take effect on agent login or after an agent
			disconnects from a call.</para></note>
		</description>
		<configFile name="agents.conf">
			<configObject name="global">
				<synopsis>Unused, but reserved.</synopsis>
			</configObject>
			<configObject name="agent-id">
				<since>
					<version>12.0.0</version>
				</since>
				<synopsis>Configure an agent for the pool.</synopsis>
				<description>
					<xi:include xpointer="xpointer(/docs/configInfo[@name='app_agent_pool']/description/note)" />
				</description>
				<configOption name="ackcall">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Enable to require the agent to acknowledge a call.</synopsis>
					<description>
						<para>Enable to require the agent to give a DTMF acknowledgement
						when the agent receives a call.</para>
						<note><para>The option is overridden by <variable>AGENTACKCALL</variable> on agent login.</para></note>
						<xi:include xpointer="xpointer(/docs/configInfo[@name='app_agent_pool']/description/note)" />
					</description>
				</configOption>
				<configOption name="acceptdtmf">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>DTMF key sequence the agent uses to acknowledge a call.</synopsis>
					<description>
						<note><para>The option is overridden by <variable>AGENTACCEPTDTMF</variable> on agent login.</para></note>
						<note><para>The option is ignored unless the ackcall option is enabled.</para></note>
						<xi:include xpointer="xpointer(/docs/configInfo[@name='app_agent_pool']/description/note)" />
					</description>
				</configOption>
				<configOption name="autologoff">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Time the agent has to acknowledge a call before being logged off.</synopsis>
					<description>
						<para>Set how many seconds a call for the agent has to wait for the
						agent to acknowledge the call before the agent is automatically
						logged off.  If set to zero then the call will wait forever for
						the agent to acknowledge.</para>
						<note><para>The option is overridden by <variable>AGENTAUTOLOGOFF</variable> on agent login.</para></note>
						<note><para>The option is ignored unless the ackcall option is enabled.</para></note>
						<xi:include xpointer="xpointer(/docs/configInfo[@name='app_agent_pool']/description/note)" />
					</description>
				</configOption>
				<configOption name="wrapuptime">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Minimum time the agent has between calls.</synopsis>
					<description>
						<para>Set the minimum amount of time in milliseconds after
						disconnecting a call before the agent can receive a new call.</para>
						<note><para>The option is overridden by <variable>AGENTWRAPUPTIME</variable> on agent login.</para></note>
						<xi:include xpointer="xpointer(/docs/configInfo[@name='app_agent_pool']/description/note)" />
					</description>
				</configOption>
				<configOption name="musiconhold">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Music on hold class the agent listens to between calls.</synopsis>
					<description>
						<xi:include xpointer="xpointer(/docs/configInfo[@name='app_agent_pool']/description/note)" />
					</description>
				</configOption>
				<configOption name="recordagentcalls">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Enable to automatically record calls the agent takes.</synopsis>
					<description>
						<para>Enable recording calls the agent takes automatically by
						invoking the automixmon DTMF feature when the agent connects
						to a caller.  See <filename>features.conf.sample</filename> for information about
						the automixmon feature.</para>
						<xi:include xpointer="xpointer(/docs/configInfo[@name='app_agent_pool']/description/note)" />
					</description>
				</configOption>
				<configOption name="custom_beep">
					<since>
						<version>12.4.0</version>
					</since>
					<synopsis>Sound file played to alert the agent when a call is present.</synopsis>
					<description>
						<xi:include xpointer="xpointer(/docs/configInfo[@name='app_agent_pool']/description/note)" />
					</description>
				</configOption>
				<configOption name="fullname">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>A friendly name for the agent used in log messages.</synopsis>
					<description>
						<xi:include xpointer="xpointer(/docs/configInfo[@name='app_agent_pool']/description/note)" />
					</description>
				</configOption>
			</configObject>
		</configFile>
	</configInfo>
<module language="en_US" name="app_alarmreceiver">
	<support_level>extended</support_level>
</module>
	<application name="AlarmReceiver" language="en_US" module="app_alarmreceiver">
		<since>
			<version>1.0.0</version>
		</since>
		<synopsis>
			Provide support for receiving alarm reports from a burglar or fire alarm panel.
		</synopsis>
		<syntax />
		<description>
			<para>This application should be called whenever there is an alarm panel calling in to dump its events.
			The application will handshake with the alarm panel, and receive events, validate them, handshake them,
			and store them until the panel hangs up. Once the panel hangs up, the application will run the system
			command specified by the eventcmd setting in <filename>alarmreceiver.conf</filename> and pipe the
			events to the standard input of the application.
			The configuration file also contains settings for DTMF timing, and for the loudness of the
			acknowledgement tones.</para>
			<note><para>Few Ademco DTMF signalling formats are detected automatically: Contact ID, Express 4+1,
			Express 4+2, High Speed and Super Fast.</para></note>
			<para>The application is affected by the following variables:</para>
			<variablelist>
				<variable name="ALARMRECEIVER_CALL_LIMIT">
					<para>Maximum call time, in milliseconds.</para>
					<para>If set, this variable causes application to exit after the specified time.</para>
				</variable>
				<variable name="ALARMRECEIVER_RETRIES_LIMIT">
					<para>Maximum number of retries per call.</para>
					<para>If set, this variable causes application to exit after the specified number of messages.</para>
				</variable>
			</variablelist>
		</description>
		<see-also>
			<ref type="filename">alarmreceiver.conf</ref>
		</see-also>
	</application>
<module language="en_US" name="app_amd">
	<support_level>extended</support_level>
</module>
	<application name="AMD" language="en_US" module="app_amd">
		<since>
			<version>1.4.0</version>
		</since>
		<synopsis>
			Attempt to detect answering machines.
		</synopsis>
		<syntax>
			<parameter name="initialSilence" required="false">
				<para>Is maximum initial silence duration before greeting.</para>
				<para>If this is exceeded, the result is detection as a MACHINE</para>
			</parameter>
			<parameter name="greeting" required="false">
				<para>is the maximum length of a greeting.</para>
				<para>If this is exceeded, the result is detection as a MACHINE</para>
			</parameter>
			<parameter name="afterGreetingSilence" required="false">
				<para>Is the silence after detecting a greeting.</para>
				<para>If this is exceeded, the result is detection as a HUMAN</para>
			</parameter>
			<parameter name="totalAnalysisTime" required="false">
				<para>Is the maximum time allowed for the algorithm</para>
				<para>to decide on whether the audio represents a HUMAN, or a MACHINE</para>
			</parameter>
			<parameter name="miniumWordLength" required="false">
				<para>Is the minimum duration of Voice considered to be a word</para>
			</parameter>
			<parameter name="betweenWordSilence" required="false">
				<para>Is the minimum duration of silence after a word to
				consider the audio that follows to be a new word</para>
			</parameter>
			<parameter name="maximumNumberOfWords" required="false">
				<para>Is the maximum number of words in a greeting</para>
				<para>If this is exceeded, then the result is detection as a MACHINE</para>
			</parameter>
			<parameter name="silenceThreshold" required="false">
				<para>What is the average level of noise from 0 to 32767 which if not exceeded, should be considered silence?</para>
			</parameter>
			<parameter name="maximumWordLength" required="false">
				<para>Is the maximum duration of a word to accept.</para>
				<para>If exceeded, then the result is detection as a MACHINE</para>
			</parameter>
			<parameter name="audioFile" required="false">
				<para>Is an audio file to play to the caller while AMD is in progress.</para>
				<para>By default, no audio file is played.</para>
				<para>If an audio file is configured in amd.conf, then that file will be used
				if one is not specified here. That file may be overridden by this argument.</para>
			</parameter>
		</syntax>
		<description>
			<para>This application attempts to detect answering machines at the beginning
			of outbound calls. Simply call this application after the call
			has been answered (outbound only, of course).</para>
			<para>When loaded, AMD reads amd.conf and uses the parameters specified as
			default values. Those default values get overwritten when the calling AMD
			with parameters.</para>
			<para>This application sets the following channel variables:</para>
			<variablelist>
				<variable name="AMDSTATUS">
					<para>This is the status of the answering machine detection</para>
					<value name="MACHINE" />
					<value name="HUMAN" />
					<value name="NOTSURE" />
					<value name="HANGUP" />
				</variable>
				<variable name="AMDCAUSE">
					<para>Indicates the cause that led to the conclusion</para>
					<value name="TOOLONG">
						Total Time.
					</value>
					<value name="INITIALSILENCE">
						Silence Duration - Initial Silence.
					</value>
					<value name="HUMAN">
						Silence Duration - afterGreetingSilence.
					</value>
					<value name="LONGGREETING">
						Voice Duration - Greeting.
					</value>
					<value name="MAXWORDLENGTH">
						Word Length - max length of a single word.
					</value>
					<value name="MAXWORDS">
						Word Count - maximum number of words.
					</value>
				</variable>
			</variablelist>
		</description>
		<see-also>
			<ref type="application">WaitForSilence</ref>
			<ref type="application">WaitForNoise</ref>
		</see-also>
	</application>

<module language="en_US" name="app_attended_transfer">
	<support_level>extended</support_level>
</module>
	<application name="AttendedTransfer" language="en_US" module="app_attended_transfer">
		<since>
			<version>13.28.0</version>
			<version>16.5.0</version>
		</since>
		<synopsis>
			Attended transfer to the extension provided and TRANSFER_CONTEXT
		</synopsis>
		<syntax>
			<parameter name="exten" required="true">
				<para>Specify extension.</para>
			</parameter>
		</syntax>
		<description>
			<para>Queue up attended transfer to the specified extension in the <literal>TRANSFER_CONTEXT</literal>.</para>
			<para>Note that the attended transfer only work when two channels have answered and are bridged together.</para>
			<para>Make sure to set Attended Transfer DTMF feature <literal>atxfer</literal>
			and attended transfer is permitted.</para>
			<para>The result of the application will be reported in the <variable>ATTENDEDTRANSFERSTATUS</variable>
			channel variable:</para>
			<variablelist>
				<variable name="ATTENDEDTRANSFERSTATUS">
					<value name="SUCCESS">
						Transfer successfully queued.
					</value>
					<value name="FAILURE">
						Transfer failed.
					</value>
					<value name="NOTPERMITTED">
						Transfer not permitted.
					</value>
				</variable>
			</variablelist>
		</description>
	</application>
<module language="en_US" name="app_audiosocket">
	<depend>res_audiosocket</depend>
	<support_level>extended</support_level>
</module>
	<application name="AudioSocket" language="en_US" module="app_audiosocket">
		<since>
			<version>18.0.0</version>
		</since>
		<synopsis>
			Transmit and receive PCM audio between a channel and a TCP socket server.
		</synopsis>
		<syntax>
			<parameter name="uuid" required="true">
				<para>UUID is the universally-unique identifier of the call for the audio socket service.  This ID must conform to the string form of a standard UUID.</para>
			</parameter>
			<parameter name="service" required="true">
				<para>Service is the name or IP address and port number of the audio socket service to which this call should be connected.  This should be in the form host:port, such as myserver:9019. IPv6 addresses can be specified in square brackets, like [::1]:9019</para>
			</parameter>
		</syntax>
		<description>
			<para>Connects to the given TCP server, then transmits channel audio as 16-bit, 8KHz mono PCM over that socket (other codecs available via the channel driver interface). In turn, PCM audio is received from the socket and sent to the channel.  Only audio frames and DTMF frames will be transmitted.</para>
			<para>Protocol is specified at https://docs.asterisk.org/Configuration/Channel-Drivers/AudioSocket/</para>
			<para>This application does not automatically answer and should generally be preceded by an application such as Answer() or Progress().</para>
		</description>
	</application>
<module language="en_US" name="app_authenticate">
	<support_level>core</support_level>
</module>
	<application name="Authenticate" language="en_US" module="app_authenticate">
		<since>
			<version>0.4.0</version>
		</since>
		<synopsis>
			Authenticate a user
		</synopsis>
		<syntax>
			<parameter name="password" required="true">
				<para>Password the user should know</para>
			</parameter>
			<parameter name="options" required="false">
				<optionlist>
					<option name="a">
						<para>Set the channels' account code to the password that is entered</para>
					</option>
					<option name="d">
						<para>Interpret the given path as database key, not a literal file.</para>
						<note>
							<para>The value is not used at all in the authentication when using this option.
							If the family/key is set to <literal>/pin/100</literal> (value does not matter)
							then the password field needs to be set to <literal>/pin</literal> and the pin entered
							by the user would be authenticated against <literal>100</literal>.</para>
						</note>
					</option>
					<option name="m">
						<para>Interpret the given path as a file which contains a list of account
						codes and password hashes delimited with <literal>:</literal>, listed one per line in
						the file. When one of the passwords is matched, the channel will have
						its account code set to the corresponding account code in the file.</para>
					</option>
					<option name="r">
						<para>Remove the database key upon successful entry (valid with <literal>d</literal> only)</para>
					</option>
				</optionlist>
			</parameter>
			<parameter name="maxdigits" required="false">
				<para>maximum acceptable number of digits. Stops reading after
				maxdigits have been entered (without requiring the user to press the <literal>#</literal> key).
				Defaults to 0 - no limit - wait for the user press the <literal>#</literal> key.</para>
			</parameter>
			<parameter name="prompt" required="false" argsep="&amp;">
				<para>Override the &quot;agent-pass&quot; sound file. Can be
				an ampersand separated list of filenames. If the filename
				is a relative filename (it does not begin with a slash), it
				will be searched for in the Asterisk sounds directory. If the
				filename is able to be parsed as a URL, Asterisk will
				download the file and then begin playback on it. To include a
				literal <literal>&amp;</literal> in the URL you can enclose
				the URL in single quotes.</para>
				<argument name="prompt" required="true" />
				<argument name="prompt2" multiple="true" />
			</parameter>
		</syntax>
		<description>
			<para>This application asks the caller to enter a given password in order to continue dialplan execution.</para>
			<para>If the password begins with the <literal>/</literal> character,
			it is interpreted as a file which contains a list of valid passwords, listed 1 password per line in the file.</para>
			<para>When using a database key, the value associated with the key can be anything.</para>
			<para>Users have three attempts to authenticate before the channel is hung up.</para>
		</description>
		<see-also>
			<ref type="application">VMAuthenticate</ref>
			<ref type="application">DISA</ref>
		</see-also>
	</application>
<module language="en_US" name="app_blind_transfer">
	<support_level>extended</support_level>
</module>
	<application name="BlindTransfer" language="en_US" module="app_blind_transfer">
		<since>
			<version>13.28.0</version>
			<version>16.5.0</version>
		</since>
		<synopsis>
			Blind transfer channel(s) to the extension and context provided
		</synopsis>
		<syntax>
			<parameter name="exten" required="true">
				<para>Specify extension.</para>
			</parameter>
			<parameter name="context">
				<para>Optionally specify a context.
				By default, Asterisk will use the caller channel context.</para>
			</parameter>
		</syntax>
		<description>
			<para>Redirect all channels currently bridged to the caller channel to the
			specified destination.</para>
			<para>The result of the application will be reported in the <variable>BLINDTRANSFERSTATUS</variable>
			channel variable:</para>
			<variablelist>
				<variable name="BLINDTRANSFERSTATUS">
					<value name="SUCCESS">
						Transfer succeeded.
					</value>
					<value name="FAILURE">
						Transfer failed.
					</value>
					<value name="INVALID">
						Transfer invalid.
					</value>
					<value name="NOTPERMITTED">
						Transfer not permitted.
					</value>
				</variable>
			</variablelist>
		</description>
	</application>
<module language="en_US" name="app_bridgeaddchan">
	<support_level>core</support_level>
</module>
	<application name="BridgeAdd" language="en_US" module="app_bridgeaddchan">
		<since>
			<version>14.0.0</version>
		</since>
		<synopsis>
			Join a bridge that contains the specified channel.
		</synopsis>
		<syntax>
			<parameter name="channel" required="true">
				<para>The current channel joins the bridge containing the channel
				identified by the channel name, channel name prefix, or channel
				uniqueid.</para>
			</parameter>
		</syntax>
		<description>
			<para>This application places the incoming channel into
			the bridge containing the specified channel. The specified
			channel only needs to be the prefix of a full channel name
			IE. 'PJSIP/cisco0001'.
			</para>
			<para>This application sets the following channel variable upon completion:</para>
			<variablelist>
				<variable name="BRIDGERESULT">
					<para>The result of the bridge attempt as a text string.</para>
					<value name="SUCCESS" />
					<value name="FAILURE" />
					<value name="LOOP" />
					<value name="NONEXISTENT" />
				</variable>
			</variablelist>
		</description>
	</application>
<module language="en_US" name="app_bridgewait">
	<depend>bridge_holding</depend>
	<support_level>core</support_level>
</module>
	<application name="BridgeWait" language="en_US" module="app_bridgewait">
		<since>
			<version>12.0.0</version>
		</since>
		<synopsis>
			Put a call into the holding bridge.
		</synopsis>
		<syntax>
			<parameter name="name">
				<para>Name of the holding bridge to join. This is a handle for <literal>BridgeWait</literal>
				only and does not affect the actual bridges that are created. If not provided,
				the reserved name <literal>default</literal> will be used.
				</para>
			</parameter>
			<parameter name="role" required="false">
				<para>Defines the channel's purpose for entering the holding bridge. Values are case sensitive.
				</para>
				<enumlist>
					<enum name="participant">
						<para>The channel will enter the holding bridge to be placed on hold
						until it is removed from the bridge for some reason. (default)</para>
					</enum>
					<enum name="announcer">
						<para>The channel will enter the holding bridge to make announcements
						to channels that are currently in the holding bridge. While an
						announcer is present, holding for the participants will be
						suspended.</para>
					</enum>
				</enumlist>
			</parameter>
			<parameter name="options">
				<optionlist>
					<option name="m">
						<argument name="class" required="true" />
						<para>The specified MOH class will be used/suggested for
						music on hold operations. This option will only be useful for
						entertainment modes that use it (m and h).</para>
					</option>
					<option name="e">
						<para>Which entertainment mechanism should be used while on hold
						in the holding bridge. Only the first letter is read.</para>
						<enumlist>
							<enum name="m"><para>Play music on hold (default)</para></enum>
							<enum name="r"><para>Ring without pause</para></enum>
							<enum name="s"><para>Generate silent audio</para></enum>
							<enum name="h"><para>Put the channel on hold</para></enum>
							<enum name="n"><para>No entertainment</para></enum>
						</enumlist>
					</option>
					<option name="S">
						<argument name="duration" required="true" />
						<para>Automatically exit the bridge and return to the PBX after
						<emphasis>duration</emphasis> seconds.</para>
					</option>
					<option name="n">
						<para>Do not automatically answer the channel.</para>
					</option>
				</optionlist>
			</parameter>
		</syntax>
		<description>
			<para>This application places the incoming channel into a holding bridge.
			The channel will then wait in the holding bridge until some event occurs
			which removes it from the holding bridge.</para>
			<note><para>This application will answer calls which haven't already
			been answered, unless the n option is provided.</para></note>
		</description>
	</application>
<module language="en_US" name="app_broadcast">
	<support_level>extended</support_level>
</module>
	<application name="Broadcast" language="en_US" module="app_broadcast">
		<since>
			<version>18.17.0</version>
			<version>20.2.0</version>
		</since>
		<synopsis>
			Transmit or receive audio to or from multiple channels simultaneously
		</synopsis>
		<syntax>
			<parameter name="options">
				<optionlist>
					<option name="b">
						<para>In addition to broadcasting to target channels, also
						broadcast to any channels to which target channels are bridged.</para>
					</option>
					<option name="l">
						<para>Allow usage of a long queue to store audio frames.</para>
						<note><para>This may introduce some delay in the received audio feed, but will improve the audio quality.</para></note>
					</option>
					<option name="o">
						<para>Do not mix streams when combining audio from target channels (only applies with s option).</para>
					</option>
					<option name="r">
						<para>Feed frames to barge channels in "reverse" by injecting them into the primary channel's read queue instead.</para>
						<para>This option is required for barge to work in a n-party bridge (but not for 2-party bridges). Alternately, you
						can add an intermediate channel by using a non-optimized Local channel, so that the target channel is bridged with
						a single channel that is connected to the bridge, but it is recommended this option be used instead.</para>
						<para>Note that this option will always feed injected audio to the other party, regardless of whether the target
						channel is bridged or not.</para>
					</option>
					<option name="s">
						<para>Rather than broadcast audio to a bunch of channels, receive the combined audio from the target channels.</para>
					</option>
					<option name="w">
						<para>Broadcast audio received on this channel to other channels.</para>
					</option>
				</optionlist>
			</parameter>
			<parameter name="channels" required="true" argsep=",">
				<para>List of channels for broadcast targets.</para>
				<para>Channel names must be the full channel names, not merely device names.</para>
				<para>Broadcasting will continue until the broadcasting channel hangs up or all target channels have hung up.</para>
			</parameter>
		</syntax>
		<description>
			<para>This application can be used to broadcast audio to multiple channels at once.
			Any audio received on this channel will be transmitted to all of the specified channels and, optionally, their bridged peers.</para>
			<para>It can also be used to aggregate audio from multiple channels at once.
			Any audio on any of the specified channels, and optionally their bridged peers, will be transmitted to this channel.</para>
			<para>Execution of the application continues until either the broadcasting channel hangs up
			or all specified channels have hung up.</para>
			<para>This application is used for one-to-many and many-to-one audio applications where
			bridge mixing cannot be done synchronously on all the involved channels.
			This is primarily useful for injecting the same audio stream into multiple channels at once,
			or doing the reverse, combining the audio from multiple channels into a single stream.
			This contrasts with using a separate injection channel for each target channel and/or
			using a conference bridge.</para>
			<para>The channel running the Broadcast application must do so synchronously. The specified channels,
			however, may be doing other things.</para>
			<example title="Broadcast received audio to three channels and their bridged peers">
			same => n,Broadcast(wb,DAHDI/1,DAHDI/3,PJSIP/doorphone)
			</example>
			<example title="Broadcast received audio to three channels, only">
			same => n,Broadcast(w,DAHDI/1,DAHDI/3,PJSIP/doorphone)
			</example>
			<example title="Combine audio from three channels and their bridged peers to us">
			same => n,Broadcast(s,DAHDI/1,DAHDI/3,PJSIP/doorphone)
			</example>
			<example title="Combine audio from three channels to us">
			same => n,Broadcast(so,DAHDI/1,DAHDI/3,PJSIP/doorphone)
			</example>
			<example title="Two-way audio with a bunch of channels">
			same => n,Broadcast(wbso,DAHDI/1,DAHDI/3,PJSIP/doorphone)
			</example>
			<para>Note that in the last example above, this is NOT the same as a conference bridge.
			The specified channels are not audible to each other, only to the channel running the
			Broadcast application. The two-way audio is only between the broadcasting channel and
			each of the specified channels, individually.</para>
		</description>
		<see-also>
			<ref type="application">ChanSpy</ref>
		</see-also>
	</application>
<module language="en_US" name="app_cdr">
	<support_level>core</support_level>
</module>
	<application name="ResetCDR" language="en_US" module="app_cdr">
		<since>
			<version>12.0.0</version>
		</since>
		<synopsis>
			Resets the Call Data Record.
		</synopsis>
		<syntax>
			<parameter name="options">
				<optionlist>
					<option name="v">
						<para>Save the CDR variables during the reset.</para>
					</option>
				</optionlist>
			</parameter>
		</syntax>
		<description>
			<para>This application causes the Call Data Record to be reset.
			Depending on the flags passed in, this can have several effects.
			With no options, a reset does the following:</para>
			<para>1. The <literal>start</literal> time is set to the current time.</para>
			<para>2. If the channel is answered, the <literal>answer</literal> time is set to the
			current time.</para>
			<para>3. All variables are wiped from the CDR. Note that this step
			can be prevented with the <literal>v</literal> option.</para>
		</description>
		<see-also>
			<ref type="application">ForkCDR</ref>
			<ref type="function">CDR_PROP</ref>
		</see-also>
	</application>
<module language="en_US" name="app_celgenuserevent">
	<support_level>core</support_level>
</module>
	<application name="CELGenUserEvent" language="en_US" module="app_celgenuserevent">
		<since>
			<version>1.8.0</version>
		</since>
		<synopsis>
			Generates a CEL User Defined Event.
		</synopsis>
		<syntax>
			<parameter name="event-name" required="true">
				<argument name="event-name" required="true">
				</argument>
				<argument name="extra" required="false">
					<para>Extra text to be included with the event.</para>
				</argument>
			</parameter>
		</syntax>
		<description>
			<para>A CEL event will be immediately generated by this channel, with the supplied name for a type.</para>
		</description>
	</application>
<module language="en_US" name="app_chanisavail">
	<support_level>extended</support_level>
</module>
	<application name="ChanIsAvail" language="en_US" module="app_chanisavail">
		<since>
			<version>0.4.0</version>
		</since>
		<synopsis>
			Check channel availability
		</synopsis>
		<syntax>
			<parameter name="Technology/Resource" required="false" argsep="&amp;">
				<argument name="Technology/Resource" required="true">
					<para>Specification of the device(s) to check.  These must be in the format of
					<literal>Technology/Resource</literal>, where <replaceable>Technology</replaceable>
					represents a particular channel driver, and <replaceable>Resource</replaceable>
					represents a resource available to that particular channel driver.</para>
				</argument>
				<argument name="Technology2/Resource2" multiple="true">
					<para>Optional extra devices to check</para>
					<para>If you need more than one enter them as
					Technology2/Resource2&amp;Technology3/Resource3&amp;.....</para>
				</argument>
			</parameter>
			<parameter name="options" required="false">
				<optionlist>
					<option name="a">
						<para>Check for all available channels, not only the first one</para>
					</option>
					<option name="s">
						<para>Consider the channel unavailable if the channel is in use at all</para>
					</option>
					<option name="t" implies="s">
						<para>Simply checks if specified channels exist in the channel list</para>
					</option>
				</optionlist>
			</parameter>
		</syntax>
		<description>
			<para>This application will check to see if any of the specified channels are available.</para>
			<para>This application sets the following channel variables:</para>
			<variablelist>
				<variable name="AVAILCHAN">
					<para>The name of the available channel, if one exists</para>
				</variable>
				<variable name="AVAILORIGCHAN">
					<para>The canonical channel name that was used to create the channel</para>
				</variable>
				<variable name="AVAILSTATUS">
					<para>The device state for the device</para>
				</variable>
				<variable name="AVAILCAUSECODE">
				        <para>The cause code returned when requesting the channel</para>
				</variable>
			</variablelist>
		</description>
	</application>
<module language="en_US" name="app_channelredirect">
	<support_level>core</support_level>
</module>
	<application name="ChannelRedirect" language="en_US" module="app_channelredirect">
		<since>
			<version>1.4.0</version>
		</since>
		<synopsis>
			Redirects given channel to a dialplan target
		</synopsis>
		<syntax>
			<parameter name="channel" required="true" />
			<parameter name="context" required="false" />
			<parameter name="extension" required="false" />
			<parameter name="priority" required="true" />
		</syntax>
		<description>
			<para>Sends the specified channel to the specified extension priority</para>

			<para>This application sets the following channel variables upon completion</para>
			<variablelist>
				<variable name="CHANNELREDIRECT_STATUS">
					<value name="NOCHANNEL" />
					<value name="SUCCESS" />
					<para>Are set to the result of the redirection</para>
				</variable>
			</variablelist>
		</description>
	</application>
<module language="en_US" name="app_chanspy">
	<support_level>core</support_level>
</module>
	<application name="ChanSpy" language="en_US" module="app_chanspy">
		<since>
			<version>1.2.0</version>
		</since>
		<synopsis>
			Listen to a channel, and optionally whisper into it.
		</synopsis>
		<syntax>
			<parameter name="chanprefix" />
			<parameter name="options">
				<optionlist>
					<option name="b">
						<para>Only spy on channels involved in a bridged call.</para>
					</option>
					<option name="B">
						<para>Instead of whispering on a single channel barge in on both
						channels involved in the call.</para>
					</option>
					<option name="c">
						<argument name="digit" required="true">
							<para>Specify a DTMF digit that can be used to spy on the next available channel.</para>
						</argument>
					</option>
					<option name="d">
						<para>Override the typical numeric DTMF functionality and instead
						use DTMF to switch between spy modes.</para>
						<enumlist>
							<enum name="4">
								<para>spy mode</para>
							</enum>
							<enum name="5">
								<para>whisper mode</para>
							</enum>
							<enum name="6">
								<para>barge mode</para>
							</enum>
						</enumlist>
					</option>
					<option name="e">
						<argument name="ext" required="true" />
						<para>Enable <emphasis>enforced</emphasis> mode, so the spying channel can
						only monitor extensions whose name is in the <replaceable>ext</replaceable> : delimited
						list.</para>
					</option>
					<option name="E">
						<para>Exit when the spied-on channel hangs up.</para>
					</option>
					<option name="g">
						<argument name="grp" required="true">
							<para>Only spy on channels in which one or more of the groups
							listed in <replaceable>grp</replaceable> matches one or more groups from the
							<variable>SPYGROUP</variable> variable set on the channel to be spied upon.</para>
						</argument>
						<note><para>both <replaceable>grp</replaceable> and <variable>SPYGROUP</variable> can contain
						either a single group or a colon-delimited list of groups, such
						as <literal>sales:support:accounting</literal>.</para></note>
					</option>
					<option name="l">
						<para>Allow usage of a long queue to store audio frames.</para>
						<note><para>This may introduce some delay in the received audio feed, but will improve the audio quality.</para></note>
					</option>
					<option name="n" argsep="@">
						<para>Say the name of the person being spied on if that person has recorded
						his/her name. If a context is specified, then that voicemail context will
						be searched when retrieving the name, otherwise the <literal>default</literal> context
						be used when searching for the name (i.e. if SIP/1000 is the channel being
						spied on and no mailbox is specified, then <literal>1000</literal> will be used when searching
						for the name).</para>
						<argument name="mailbox" />
						<argument name="context" />
					</option>
					<option name="N">
						<para>Do not answer the channel automatically.</para>
					</option>
					<option name="o">
						<para>Only listen to audio coming from this channel.</para>
					</option>
					<option name="q">
						<para>Don't play a beep when beginning to spy on a channel, or speak the
						selected channel name.</para>
					</option>
					<option name="r">
						<para>Record the session to the monitor spool directory. An optional base for the filename
						may be specified. The default is <literal>chanspy</literal>.</para>
						<argument name="basename" />
					</option>
					<option name="s">
						<para>Skip the playback of the channel type (i.e. SIP, IAX, etc) when
						speaking the selected channel name.</para>
					</option>
					<option name="S">
						<para>Stop when no more channels are left to spy on.</para>
					</option>
					<option name="u">
						<para>The <literal>chanprefix</literal> parameter is a channel uniqueid
						or fully specified channel name.</para>
					</option>
					<option name="v">
						<argument name="value" />
						<para>Adjust the initial volume in the range from <literal>-4</literal>
						to <literal>4</literal>. A negative value refers to a quieter setting.</para>
					</option>
					<option name="w">
						<para>Enable <literal>whisper</literal> mode, so the spying channel can talk to
						the spied-on channel.</para>
					</option>
					<option name="W">
						<para>Enable <literal>private whisper</literal> mode, so the spying channel can
						talk to the spied-on channel but cannot listen to that channel.</para>
					</option>
					<option name="x">
						<argument name="digit" required="true">
							<para>Specify a DTMF digit that can be used to exit the application while actively
							spying on a channel. If there is no channel being spied on, the DTMF digit will be
							ignored.</para>
						</argument>
					</option>
					<option name="X">
						<para>Allow the user to exit ChanSpy to a valid single digit
						numeric extension in the current context or the context
						specified by the <variable>SPY_EXIT_CONTEXT</variable> channel variable. The
						name of the last channel that was spied on will be stored
						in the <variable>SPY_CHANNEL</variable> variable.</para>
					</option>
				</optionlist>
			</parameter>
		</syntax>
		<description>
			<para>This application is used to listen to the audio from an Asterisk channel. This includes the audio
			coming in and out of the channel being spied on. If the <literal>chanprefix</literal> parameter is specified,
			only channels beginning with this string will be spied upon.</para>
			<para>While spying, the following actions may be performed:</para>
			<para> - Dialing <literal>#</literal> cycles the volume level.</para>
			<para> - Dialing <literal>*</literal> will stop spying and look for another channel to spy on.</para>
			<para> - Dialing a series of digits followed by <literal>#</literal> builds a channel name to append
			to <literal>chanprefix</literal>. For example, executing ChanSpy(Agent) and then dialing the digits '1234#'
			while spying will begin spying on the channel 'Agent/1234'. Note that this feature will be overridden
			if the 'd' or 'u' options are used.</para>
			<note><para>The <replaceable>X</replaceable> option supersedes the three features above in that if a valid
			single digit extension exists in the correct context ChanSpy will exit to it.
			This also disables choosing a channel based on <literal>chanprefix</literal> and a digit sequence.</para></note>
		</description>
		<see-also>
			<ref type="application">ExtenSpy</ref>
			<ref type="managerEvent">ChanSpyStart</ref>
			<ref type="managerEvent">ChanSpyStop</ref>
		</see-also>
	</application>
	<application name="ExtenSpy" language="en_US" module="app_chanspy">
		<since>
			<version>1.4.0</version>
		</since>
		<synopsis>
			Listen to a channel, and optionally whisper into it.
		</synopsis>
		<syntax>
			<parameter name="exten" required="true" argsep="@">
				<argument name="exten" required="true">
					<para>Specify extension.</para>
				</argument>
				<argument name="context">
					<para>Optionally specify a context, defaults to <literal>default</literal>.</para>
				</argument>
			</parameter>
			<parameter name="options">
				<optionlist>
					<option name="b">
						<para>Only spy on channels involved in a bridged call.</para>
					</option>
					<option name="B">
						<para>Instead of whispering on a single channel barge in on both
						channels involved in the call.</para>
					</option>
					<option name="c">
						<argument name="digit" required="true">
							<para>Specify a DTMF digit that can be used to spy on the next available channel.</para>
						</argument>
					</option>
					<option name="d">
						<para>Override the typical numeric DTMF functionality and instead
						use DTMF to switch between spy modes.</para>
						<enumlist>
							<enum name="4">
								<para>spy mode</para>
							</enum>
							<enum name="5">
								<para>whisper mode</para>
							</enum>
							<enum name="6">
								<para>barge mode</para>
							</enum>
						</enumlist>
					</option>
					<option name="D">
						<para>Interleave the audio coming from the channel and the audio coming to the channel in
						the output audio as a dual channel stream, rather than mix it. Does nothing if 'o'
						is also set.</para>
					</option>
					<option name="e">
						<argument name="ext" required="true" />
						<para>Enable <emphasis>enforced</emphasis> mode, so the spying channel can
						only monitor extensions whose name is in the <replaceable>ext</replaceable> : delimited
						list.</para>
					</option>
					<option name="E">
						<para>Exit when the spied-on channel hangs up.</para>
					</option>
					<option name="g">
						<argument name="grp" required="true">
							<para>Only spy on channels in which one or more of the groups
							listed in <replaceable>grp</replaceable> matches one or more groups from the
							<variable>SPYGROUP</variable> variable set on the channel to be spied upon.</para>
						</argument>
						<note><para>both <replaceable>grp</replaceable> and <variable>SPYGROUP</variable> can contain
						either a single group or a colon-delimited list of groups, such
						as <literal>sales:support:accounting</literal>.</para></note>
					</option>
					<option name="l">
						<para>Allow usage of a long queue to store audio frames.</para>
						<note><para>This may introduce some delay in the received audio feed, but will improve the audio quality.</para></note>
					</option>
					<option name="n" argsep="@">
						<para>Say the name of the person being spied on if that person has recorded
						his/her name. If a context is specified, then that voicemail context will
						be searched when retrieving the name, otherwise the <literal>default</literal> context
						be used when searching for the name (i.e. if SIP/1000 is the channel being
						spied on and no mailbox is specified, then <literal>1000</literal> will be used when searching
						for the name).</para>
						<argument name="mailbox" />
						<argument name="context" />
					</option>
					<option name="N">
						<para>Do not answer the channel automatically.</para>
					</option>
					<option name="o">
						<para>Only listen to audio coming from this channel.</para>
					</option>
					<option name="q">
						<para>Don't play a beep when beginning to spy on a channel, or speak the
						selected channel name.</para>
					</option>
					<option name="r">
						<para>Record the session to the monitor spool directory. An optional base for the filename
						may be specified. The default is <literal>chanspy</literal>.</para>
						<argument name="basename" />
					</option>
					<option name="s">
						<para>Skip the playback of the channel type (i.e. SIP, IAX, etc) when
						speaking the selected channel name.</para>
					</option>
					<option name="S">
						<para>Stop when there are no more extensions left to spy on.</para>
					</option>
					<option name="v">
						<argument name="value" />
						<para>Adjust the initial volume in the range from <literal>-4</literal>
						to <literal>4</literal>. A negative value refers to a quieter setting.</para>
					</option>
					<option name="w">
						<para>Enable <literal>whisper</literal> mode, so the spying channel can talk to
						the spied-on channel.</para>
					</option>
					<option name="W">
						<para>Enable <literal>private whisper</literal> mode, so the spying channel can
						talk to the spied-on channel but cannot listen to that channel.</para>
					</option>
					<option name="x">
						<argument name="digit" required="true">
							<para>Specify a DTMF digit that can be used to exit the application while actively
							spying on a channel. If there is no channel being spied on, the DTMF digit will be
							ignored.</para>
						</argument>
					</option>
					<option name="X">
						<para>Allow the user to exit ChanSpy to a valid single digit
						numeric extension in the current context or the context
						specified by the <variable>SPY_EXIT_CONTEXT</variable> channel variable. The
						name of the last channel that was spied on will be stored
						in the <variable>SPY_CHANNEL</variable> variable.</para>
					</option>
				</optionlist>
			</parameter>
		</syntax>
		<description>
			<para>This application is used to listen to the audio from an Asterisk channel. This includes
			the audio coming in and out of the channel being spied on. Only channels created by outgoing calls for the
			specified extension will be selected for spying. If the optional context is not supplied,
			the current channel's context will be used.</para>
			<para>While spying, the following actions may be performed:</para>
			<para> - Dialing <literal>#</literal> cycles the volume level.</para>
                        <para> - Dialing <literal>*</literal> will stop spying and look for another channel to spy on.</para>
			<note><para>The <replaceable>X</replaceable> option supersedes the three features above in that if a valid
			single digit extension exists in the correct context ChanSpy will exit to it.
			This also disables choosing a channel based on <literal>chanprefix</literal> and a digit sequence.</para></note>
		</description>
		<see-also>
			<ref type="application">ChanSpy</ref>
			<ref type="managerEvent">ChanSpyStart</ref>
			<ref type="managerEvent">ChanSpyStop</ref>
		</see-also>
	</application>
	<application name="DAHDIScan" language="en_US" module="app_chanspy">
		<since>
			<version>1.4.22</version>
		</since>
		<synopsis>
			Scan DAHDI channels to monitor calls.
		</synopsis>
		<syntax>
			<parameter name="group">
				<para>Limit scanning to a channel <replaceable>group</replaceable> by setting this option.</para>
			</parameter>
		</syntax>
		<description>
			<para>Allows a call center manager to monitor DAHDI channels in a
			convenient way.  Use <literal>#</literal> to select the next channel and use <literal>*</literal> to exit.</para>
		</description>
		<see-also>
			<ref type="managerEvent">ChanSpyStart</ref>
			<ref type="managerEvent">ChanSpyStop</ref>
		</see-also>
	</application>
<module language="en_US" name="app_confbridge">
	<support_level>core</support_level>
</module>
	<application name="ConfBridge" language="en_US" module="app_confbridge">
		<since>
			<version>12.0.0</version>
		</since>
		<synopsis>
			Conference bridge application.
		</synopsis>
		<syntax>
			<parameter name="conference" required="true">
				<para>Name of the conference bridge.  You are not limited to just
				numbers.</para>
			</parameter>
			<parameter name="bridge_profile">
				<para>The bridge profile name from confbridge.conf.  When left blank,
				a dynamically built bridge profile created by the CONFBRIDGE dialplan
				function is searched for on the channel and used.  If no dynamic
				profile is present, the 'default_bridge' profile found in
				confbridge.conf is used. </para>
				<para>It is important to note that while user profiles may be unique
				for each participant, mixing bridge profiles on a single conference
				is _NOT_ recommended and will produce undefined results.</para>
			</parameter>
			<parameter name="user_profile">
				<para>The user profile name from confbridge.conf.  When left blank,
				a dynamically built user profile created by the CONFBRIDGE dialplan
				function is searched for on the channel and used.  If no dynamic
				profile is present, the 'default_user' profile found in
				confbridge.conf is used.</para>
			</parameter>
			<parameter name="menu">
				<para>The name of the DTMF menu in confbridge.conf to be applied to
				this channel.  When left blank, a dynamically built menu profile
				created by the CONFBRIDGE dialplan function is searched for on
				the channel and used. If no dynamic profile is present, the
				'default_menu' profile found in confbridge.conf is used.</para>
			</parameter>
		</syntax>
		<description>
			<para>Enters the user into a specified conference bridge.  The user can
			exit the conference by hangup or DTMF menu option.</para>
			<para>This application sets the following channel variable upon completion:</para>
			<variablelist>
				<variable name="CONFBRIDGE_RESULT">
					<value name="FAILED">The channel encountered an error and could not enter the conference.</value>
					<value name="HANGUP">The channel exited the conference by hanging up.</value>
					<value name="KICKED">The channel was kicked from the conference.</value>
					<value name="ENDMARKED">The channel left the conference as a result of the last marked user leaving.</value>
					<value name="DTMF">The channel pressed a DTMF sequence to exit the conference.</value>
					<value name="TIMEOUT">The channel reached its configured timeout.</value>
				</variable>
			</variablelist>
		</description>
		<see-also>
			<ref type="application">ConfKick</ref>
			<ref type="function">CONFBRIDGE</ref>
			<ref type="function">CONFBRIDGE_INFO</ref>
			<ref type="function">CONFBRIDGE_CHANNELS</ref>
		</see-also>
	</application>
	<application name="ConfKick" language="en_US" module="app_confbridge">
		<since>
			<version>16.19.0</version>
			<version>18.5.0</version>
		</since>
		<synopsis>
			Kicks channel(s) from the requested ConfBridge.
		</synopsis>
		<syntax>
			<parameter name="conference" required="true" />
			<parameter name="channel">
				<para>The channel to kick, <literal>all</literal>
				to kick all users, or <literal>participants</literal>
				to kick all non-admin participants. Default is all.</para>
			</parameter>
		</syntax>
		<description>
			<para>Kicks the requested channel(s) from a conference bridge.</para>
			<variablelist>
				<variable name="CONFKICKSTATUS">
					<value name="FAILURE">
						Could not kick any users with the provided arguments.
					</value>
					<value name="SUCCESS">
						Successfully kicked users from specified conference bridge.
					</value>
				</variable>
			</variablelist>
		</description>
		<see-also>
			<ref type="application">ConfBridge</ref>
			<ref type="function">CONFBRIDGE</ref>
			<ref type="function">CONFBRIDGE_INFO</ref>
			<ref type="function">CONFBRIDGE_CHANNELS</ref>
		</see-also>
	</application>
	<function name="CONFBRIDGE" language="en_US" module="app_confbridge">
		<since>
			<version>10.0.0</version>
		</since>
		<synopsis>
			Set a custom dynamic bridge, user, or menu profile on a channel for the
			ConfBridge application using the same options available in confbridge.conf.
		</synopsis>
		<syntax>
			<parameter name="type" required="true">
				<para>To what type of conference profile the option applies.</para>
				<enumlist>
					<enum name="bridge"></enum>
					<enum name="menu"></enum>
					<enum name="user"></enum>
				</enumlist>
			</parameter>
			<parameter name="option" required="true">
				<para>Option refers to a <filename>confbridge.conf</filename> option
				that is being set dynamically on this channel, or <literal>clear</literal>
				to remove already applied profile options from the channel.</para>
			</parameter>
		</syntax>
		<description>
			<para>A custom profile uses the default profile type settings defined in
			<filename>confbridge.conf</filename> as defaults if the profile template
			is not explicitly specified first.</para>
			<para>For <literal>bridge</literal> profiles the default template is <literal>default_bridge</literal>.</para>
			<para>For <literal>menu</literal> profiles the default template is <literal>default_menu</literal>.</para>
			<para>For <literal>user</literal> profiles the default template is <literal>default_user</literal>.</para>
			<para>---- Example 1 ----</para>
			<para>In this example the custom user profile set on the channel will
			automatically be used by the ConfBridge application.</para>
			<example title="Example 1">
			exten => 1,1,Answer()
			</example>
			<para>; In this example the effect of the following line is</para>
			<para>; implied:</para>
			<example title="Example 1b">
			same => n,Set(CONFBRIDGE(user,template)=default_user)
			same => n,Set(CONFBRIDGE(user,announce_join_leave)=yes)
			same => n,Set(CONFBRIDGE(user,startmuted)=yes)
			same => n,ConfBridge(1)
			</example>
			<para>---- Example 2 ----</para>
			<para>This example shows how to use a predefined user profile in
			<filename>confbridge.conf</filename> as a template for a dynamic profile.
			Here we make an admin/marked user out of the <literal>my_user</literal>
			profile that you define in <filename>confbridge.conf</filename>.</para>
			<example title="Example 2">
			exten => 1,1,Answer()
			same => n,Set(CONFBRIDGE(user,template)=my_user)
			same => n,Set(CONFBRIDGE(user,admin)=yes)
			same => n,Set(CONFBRIDGE(user,marked)=yes)
			same => n,ConfBridge(1)
			</example>
		</description>
	</function>
	<function name="CONFBRIDGE_INFO" language="en_US" module="app_confbridge">
		<since>
			<version>10.0.0</version>
		</since>
		<synopsis>
			Get information about a ConfBridge conference.
		</synopsis>
		<syntax>
			<parameter name="type" required="true">
				<para>What conference information is requested.</para>
				<enumlist>
					<enum name="admins">
						<para>Get the number of admin users in the conference.</para>
					</enum>
					<enum name="locked">
						<para>Determine if the conference is locked. (0 or 1)</para>
					</enum>
					<enum name="marked">
						<para>Get the number of marked users in the conference.</para>
					</enum>
					<enum name="muted">
						<para>Determine if the conference is muted. (0 or 1)</para>
					</enum>
					<enum name="parties">
						<para>Get the number of users in the conference.</para>
					</enum>
				</enumlist>
			</parameter>
			<parameter name="conf" required="true">
				<para>The name of the conference being referenced.</para>
			</parameter>
		</syntax>
		<description>
			<para>This function returns a non-negative integer for valid conference
			names and an empty string for invalid conference names.</para>
		</description>
		<see-also>
			<ref type="function">CONFBRIDGE_CHANNELS</ref>
		</see-also>
	</function>
	<function name="CONFBRIDGE_CHANNELS" language="en_US" module="app_confbridge">
		<since>
			<version>16.27.0</version>
			<version>18.13.0</version>
			<version>19.5.0</version>
		</since>
		<synopsis>
			Get a list of channels in a ConfBridge conference.
		</synopsis>
		<syntax>
			<parameter name="type" required="true">
				<para>What conference information is requested.</para>
				<enumlist>
					<enum name="admins">
						<para>Get the number of admin users in the conference.</para>
					</enum>
					<enum name="marked">
						<para>Get the number of marked users in the conference.</para>
					</enum>
					<enum name="parties">
						<para>Get the number of total users in the conference.</para>
					</enum>
					<enum name="active">
						<para>Get the number of active users in the conference.</para>
					</enum>
					<enum name="waiting">
						<para>Get the number of waiting users in the conference.</para>
					</enum>
				</enumlist>
			</parameter>
			<parameter name="conf" required="true">
				<para>The name of the conference being referenced.</para>
			</parameter>
		</syntax>
		<description>
			<para>This function returns a comma-separated list of channels in a ConfBridge conference, optionally filtered by a type of participant.</para>
		</description>
		<see-also>
			<ref type="function">CONFBRIDGE_INFO</ref>
		</see-also>
	</function>
	<manager name="ConfbridgeList" language="en_US" module="app_confbridge">
		<since>
			<version>10.0.0</version>
		</since>
		<synopsis>
			List participants in a conference.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="Conference" required="true">
				<para>Conference number.</para>
			</parameter>
		</syntax>
		<description>
			<para>Lists all users in a particular ConfBridge conference.
			ConfbridgeList will follow as separate events, followed by a final event called
			ConfbridgeListComplete.</para>
		</description>
	</manager>
	<managerEvent language="en_US" name="ConfbridgeList" module="app_confbridge">
		<managerEventInstance class="EVENT_FLAG_REPORTING" module="app_confbridge">
			<since>
				<version>13.20.0</version>
				<version>15.3.0</version>
			</since>
			<synopsis>Raised as part of the ConfbridgeList action response list.</synopsis>
			<syntax>
				<parameter name="Conference">
					<para>The name of the Confbridge conference.</para>
				</parameter>
				<parameter name="Admin">
					<para>Identifies this user as an admin user.</para>
					<enumlist>
						<enum name="Yes"/>
						<enum name="No"/>
					</enumlist>
				</parameter>
				<parameter name="MarkedUser">
					<para>Identifies this user as a marked user.</para>
					<enumlist>
						<enum name="Yes"/>
						<enum name="No"/>
					</enumlist>
				</parameter>
				<parameter name="WaitMarked">
					<para>Must this user wait for a marked user to join?</para>
					<enumlist>
						<enum name="Yes"/>
						<enum name="No"/>
					</enumlist>
				</parameter>
				<parameter name="EndMarked">
					<para>Does this user get kicked after the last marked user leaves?</para>
					<enumlist>
						<enum name="Yes"/>
						<enum name="No"/>
					</enumlist>
				</parameter>
				<parameter name="Waiting">
					<para>Is this user waiting for a marked user to join?</para>
					<enumlist>
						<enum name="Yes"/>
						<enum name="No"/>
					</enumlist>
				</parameter>
				<parameter name="Muted">
					<para>The current mute status.</para>
					<enumlist>
						<enum name="Yes"/>
						<enum name="No"/>
					</enumlist>
				</parameter>
				<parameter name="Talking">
					<para>Is this user talking?</para>
					<enumlist>
						<enum name="Yes"/>
						<enum name="No"/>
					</enumlist>
				</parameter>
				<parameter name="AnsweredTime">
					<para>The number of seconds the channel has been up.</para>
				</parameter>
				<channel_snapshot/>
			</syntax>
		</managerEventInstance>
	</managerEvent>
	<manager name="ConfbridgeListRooms" language="en_US" module="app_confbridge">
		<since>
			<version>10.0.0</version>
		</since>
		<synopsis>
			List active conferences.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
		</syntax>
		<description>
			<para>Lists data about all active conferences.
				ConfbridgeListRooms will follow as separate events, followed by a final event called
				ConfbridgeListRoomsComplete.</para>
		</description>
	</manager>
	<managerEvent language="en_US" name="ConfbridgeListRooms" module="app_confbridge">
		<managerEventInstance class="EVENT_FLAG_REPORTING" module="app_confbridge">
			<since>
				<version>16.29.0</version>
				<version>18.15.0</version>
				<version>19.7.0</version>
			</since>
			<synopsis>Raised as part of the ConfbridgeListRooms action response list.</synopsis>
			<syntax>
				<parameter name="Conference">
					<para>The name of the Confbridge conference.</para>
				</parameter>
				<parameter name="Parties">
					<para>Number of users in the conference.</para>
					<para>This includes both active and waiting users.</para>
				</parameter>
				<parameter name="Marked">
					<para>Number of marked users in the conference.</para>
				</parameter>
				<parameter name="Locked">
					<para>Is the conference locked?</para>
					<enumlist>
						<enum name="Yes"/>
						<enum name="No"/>
					</enumlist>
				</parameter>
				<parameter name="Muted">
					<para>Is the conference muted?</para>
					<enumlist>
						<enum name="Yes"/>
						<enum name="No"/>
					</enumlist>
				</parameter>
			</syntax>
		</managerEventInstance>
	</managerEvent>
	<manager name="ConfbridgeMute" language="en_US" module="app_confbridge">
		<since>
			<version>10.0.0</version>
		</since>
		<synopsis>
			Mute a Confbridge user.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="Conference" required="true" />
			<parameter name="Channel" required="true">
				<para>If this parameter is not a complete channel name, the first channel with this prefix will be used.</para>
				<para>If this parameter is "all", all channels will be muted.</para>
				<para>If this parameter is "participants", all non-admin channels will be muted.</para>
			</parameter>
		</syntax>
		<description>
		</description>
	</manager>
	<manager name="ConfbridgeUnmute" language="en_US" module="app_confbridge">
		<since>
			<version>10.0.0</version>
		</since>
		<synopsis>
			Unmute a Confbridge user.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="Conference" required="true" />
			<parameter name="Channel" required="true">
				<para>If this parameter is not a complete channel name, the first channel with this prefix will be used.</para>
				<para>If this parameter is "all", all channels will be unmuted.</para>
				<para>If this parameter is "participants", all non-admin channels will be unmuted.</para>
			</parameter>
		</syntax>
		<description>
		</description>
	</manager>
	<manager name="ConfbridgeKick" language="en_US" module="app_confbridge">
		<since>
			<version>10.0.0</version>
		</since>
		<synopsis>
			Kick a Confbridge user.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="Conference" required="true" />
			<parameter name="Channel" required="true" >
				<para>If this parameter is "all", all channels will be kicked from the conference.</para>
				<para>If this parameter is "participants", all non-admin channels will be kicked from the conference.</para>
			</parameter>
		</syntax>
		<description>
		</description>
	</manager>
	<manager name="ConfbridgeLock" language="en_US" module="app_confbridge">
		<since>
			<version>10.0.0</version>
		</since>
		<synopsis>
			Lock a Confbridge conference.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="Conference" required="true" />
		</syntax>
		<description>
		</description>
	</manager>
	<manager name="ConfbridgeUnlock" language="en_US" module="app_confbridge">
		<since>
			<version>10.0.0</version>
		</since>
		<synopsis>
			Unlock a Confbridge conference.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="Conference" required="true" />
		</syntax>
		<description>
		</description>
	</manager>
	<manager name="ConfbridgeStartRecord" language="en_US" module="app_confbridge">
		<since>
			<version>10.0.0</version>
		</since>
		<synopsis>
			Start recording a Confbridge conference.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="Conference" required="true" />
			<parameter name="RecordFile" required="false" />
		</syntax>
		<description>
			<para>Start recording a conference. If recording is already present an error will be returned. If RecordFile is not provided, the default record file specified in the conference's bridge profile will be used, if that is not present either a file will automatically be generated in the monitor directory.</para>
		</description>
	</manager>
	<manager name="ConfbridgeStopRecord" language="en_US" module="app_confbridge">
		<since>
			<version>10.0.0</version>
		</since>
		<synopsis>
			Stop recording a Confbridge conference.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="Conference" required="true" />
		</syntax>
		<description>
		</description>
	</manager>
	<manager name="ConfbridgeSetSingleVideoSrc" language="en_US" module="app_confbridge">
		<since>
			<version>10.0.0</version>
		</since>
		<synopsis>
			Set a conference user as the single video source distributed to all other participants.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="Conference" required="true" />
			<parameter name="Channel" required="true">
				<para>If this parameter is not a complete channel name, the first channel with this prefix will be used.</para>
			</parameter>
		</syntax>
		<description>
		</description>
	</manager>

<module language="en_US" name="app_controlplayback">
	<support_level>core</support_level>
</module>
	<application name="ControlPlayback" language="en_US" module="app_controlplayback">
		<since>
			<version>1.0.0</version>
		</since>
		<synopsis>
			Play a file with fast forward and rewind.
		</synopsis>
		<syntax>
			<parameter name="filename" required="true" />
			<parameter name="skipms">
				<para>This is number of milliseconds to skip when rewinding or
				fast-forwarding.</para>
			</parameter>
			<parameter name="ff">
				<para>Fast-forward when this DTMF digit is received. (defaults to <literal>#</literal>)</para>
			</parameter>
			<parameter name="rew">
				<para>Rewind when this DTMF digit is received. (defaults to <literal>*</literal>)</para>
			</parameter>
			<parameter name="stop">
				<para>Stop playback when this DTMF digit is received.</para>
			</parameter>
			<parameter name="pause">
				<para>Pause playback when this DTMF digit is received.</para>
			</parameter>
			<parameter name="restart">
				<para>Restart playback when this DTMF digit is received.</para>
			</parameter>
			<parameter name="options">
				<optionlist>
					<option name="o">
						<argument name="time" required="true">
							<para>Start at <replaceable>time</replaceable> ms from the
							beginning of the file.</para>
						</argument>
					</option>
				</optionlist>
			</parameter>
		</syntax>
		<description>
			<para>This application will play back the given <replaceable>filename</replaceable>.</para>
			<para>It sets the following channel variables upon completion:</para>
			<variablelist>
				<variable name="CPLAYBACKSTATUS">
					<para>Contains the status of the attempt as a text string</para>
					<value name="SUCCESS" />
					<value name="USERSTOPPED" />
					<value name="REMOTESTOPPED" />
					<value name="ERROR" />
				</variable>
				<variable name="CPLAYBACKOFFSET">
					<para>Contains the offset in ms into the file where playback
					was at when it stopped. <literal>-1</literal> is end of file.</para>
				</variable>
				<variable name="CPLAYBACKSTOPKEY">
					<para>If the playback is stopped by the user this variable contains
					the key that was pressed.</para>
				</variable>
			</variablelist>
		</description>
	</application>
	<manager name="ControlPlayback" language="en_US" module="app_controlplayback">
		<since>
			<version>12.0.0</version>
		</since>
		<synopsis>
			Control the playback of a file being played to a channel.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="Channel" required="true">
				<para>The name of the channel that currently has a file being played back to it.</para>
			</parameter>
			<parameter name="Control" required="true">
				<enumlist>
					<enum  name="stop">
						<para>Stop the playback operation.</para>
					</enum>
					<enum name="forward">
						<para>Move the current position in the media forward. The amount
						of time that the stream moves forward is determined by the
						<replaceable>skipms</replaceable> value passed to the application
						that initiated the playback.</para>
						<note>
							<para>The default skipms value is <literal>3000</literal> ms.</para>
						</note>
					</enum>
					<enum name="reverse">
						<para>Move the current position in the media backward. The amount
						of time that the stream moves backward is determined by the
						<replaceable>skipms</replaceable> value passed to the application
						that initiated the playback.</para>
						<note>
							<para>The default skipms value is <literal>3000</literal> ms.</para>
						</note>
					</enum>
					<enum name="pause">
						<para>Pause/unpause the playback operation, if supported.
						If not supported, stop the playback.</para>
					</enum>
					<enum name="restart">
						<para>Restart the playback operation, if supported.
						If not supported, stop the playback.</para>
					</enum>
				</enumlist>
			</parameter>
		</syntax>
		<description>
			<para>Control the operation of a media file being played back to a channel.
			Note that this AMI action does not initiate playback of media to channel, but
			rather controls the operation of a media operation that was already initiated
			on the channel.</para>
			<note>
				<para>The <literal>pause</literal> and <literal>restart</literal>
				<replaceable>Control</replaceable> options will stop a playback
				operation if that operation was not initiated from the
				<replaceable>ControlPlayback</replaceable> application or the
				<replaceable>control stream file</replaceable> AGI command.</para>
			</note>
		</description>
		<see-also>
			<ref type="application">Playback</ref>
			<ref type="application">ControlPlayback</ref>
			<ref type="agi">stream file</ref>
			<ref type="agi">control stream file</ref>
		</see-also>
	</manager>
<module language="en_US" name="app_db">
	<support_level>core</support_level>
</module>
	<application name="DBdeltree" language="en_US" module="app_db">
		<since>
			<version>0.4.0</version>
		</since>
		<synopsis>
			Delete a family or keytree from the asterisk database.
		</synopsis>
		<syntax argsep="/">
			<parameter name="family" required="true" />
			<parameter name="keytree" />
		</syntax>
		<description>
			<para>This application will delete a <replaceable>family</replaceable> or <replaceable>keytree</replaceable>
			from the Asterisk database.</para>
		</description>
		<see-also>
			<ref type="function">DB_DELETE</ref>
			<ref type="function">DB</ref>
		</see-also>
	</application>
<module language="en_US" name="app_dial">
	<support_level>core</support_level>
</module>
	<application name="Dial" language="en_US" module="app_dial">
		<since>
			<version>0.1.0</version>
		</since>
		<synopsis>
			Attempt to connect to another device or endpoint and bridge the call.
		</synopsis>
		<syntax>
			<parameter name="Technology/Resource" required="false" argsep="&amp;">
				<argument name="Technology/Resource" required="true">
					<para>Specification of the device(s) to dial.  These must be in the format of
					<literal>Technology/Resource</literal>, where <replaceable>Technology</replaceable>
					represents a particular channel driver, and <replaceable>Resource</replaceable>
					represents a resource available to that particular channel driver.</para>
				</argument>
				<argument name="Technology2/Resource2" required="false" multiple="true">
					<para>Optional extra devices to dial in parallel</para>
					<para>If you need more than one enter them as
					Technology2/Resource2&amp;Technology3/Resource3&amp;.....</para>
				</argument>
				<xi:include xpointer="xpointer(/docs/info[@name='Dial_Resource'])" />
			</parameter>
			<parameter name="timeout" required="false" argsep="^">
				<para>Specifies the number of seconds we attempt to dial the specified devices.</para>
				<para>If not specified, this defaults to 136 years.</para>
				<para>If a second argument is specified, this controls the number of seconds we attempt to dial the specified devices
				without receiving early media or ringing. If neither progress, ringing, nor voice frames have been received when this
				timeout expires, the call will be treated as a CHANUNAVAIL. This can be used to skip destinations that may not be responsive.</para>
				<para>The timeouts need not be whole numbers; both arguments accept fractional seconds.</para>
			</parameter>
			<parameter name="options" required="false">
				<optionlist>
				<option name="A" argsep=":">
					<argument name="x">
						<para>The file to play to the called party</para>
					</argument>
					<argument name="y">
						<para>The file to play to the calling party</para>
					</argument>
					<para>Play an announcement to the called and/or calling parties, where <replaceable>x</replaceable>
					is the prompt to be played to the called party and <replaceable>y</replaceable> is the prompt
					to be played to the caller. The files may be different and will be played to each party
					simultaneously.</para>
				</option>
				<option name="a">
					<para>Immediately answer the calling channel when the called channel answers in
					all cases. Normally, the calling channel is answered when the called channel
					answers, but when options such as <literal>A()</literal> and
					<literal>M()</literal> are used, the calling channel is
					not answered until all actions on the called channel (such as playing an
					announcement) are completed.  This option can be used to answer the calling
					channel before doing anything on the called channel. You will rarely need to use
					this option, the default behavior is adequate in most cases.</para>
				</option>
				<option name="b" argsep="^">
					<para>Before initiating an outgoing call, <literal>Gosub</literal> to the specified
					location using the newly created channel.  The <literal>Gosub</literal> will be
					executed for each destination channel.</para>
					<argument name="context" required="false" />
					<argument name="exten" required="false" />
					<argument name="priority" required="true" hasparams="optional" argsep="^">
						<argument name="arg1" multiple="true" required="true" />
						<argument name="argN" />
					</argument>
				</option>
				<option name="B" argsep="^">
					<para>Before initiating the outgoing call(s), <literal>Gosub</literal> to the
					specified location using the current channel.</para>
					<argument name="context" required="false" />
					<argument name="exten" required="false" />
					<argument name="priority" required="true" hasparams="optional" argsep="^">
						<argument name="arg1" multiple="true" required="true" />
						<argument name="argN" />
					</argument>
				</option>
				<option name="C">
					<para>Reset the call detail record (CDR) for this call.</para>
				</option>
				<option name="c">
					<para>If the Dial() application cancels this call, always set
					<variable>HANGUPCAUSE</variable> to 'answered elsewhere'</para>
				</option>
				<option name="d">
					<para>Allow the calling user to dial a 1 digit extension while waiting for
					a call to be answered. Exit to that extension if it exists in the
					current context, or the context defined in the <variable>EXITCONTEXT</variable> variable,
					if it exists.</para>
					<para>NOTE: Many SIP and ISDN phones cannot send DTMF digits until the call is
					connected.  If you wish to use this option with these phones, you
					can use the <literal>Answer</literal> application before dialing.</para>
				</option>
				<option name="D" argsep=":">
					<argument name="called" />
					<argument name="calling" />
					<argument name="progress" />
					<argument name="mfprogress" />
					<argument name="mfwink" />
					<argument name="sfprogress" />
					<argument name="sfwink" />
					<para>Send the specified DTMF strings <emphasis>after</emphasis> the called
					party has answered, but before the call gets bridged.  The
					<replaceable>called</replaceable> DTMF string is sent to the called party, and the
					<replaceable>calling</replaceable> DTMF string is sent to the calling party.  Both arguments
					can be used alone.  If <replaceable>progress</replaceable> is specified, its DTMF is sent
					to the called party immediately after receiving a <literal>PROGRESS</literal> message.</para>
					<para>See <literal>SendDTMF</literal> for valid digits.</para>
					<para>If <replaceable>mfprogress</replaceable> is specified, its MF is sent
					to the called party immediately after receiving a <literal>PROGRESS</literal> message.
					If <replaceable>mfwink</replaceable> is specified, its MF is sent
					to the called party immediately after receiving a <literal>WINK</literal> message.</para>
					<para>See <literal>SendMF</literal> for valid digits.</para>
					<para>If <replaceable>sfprogress</replaceable> is specified, its SF is sent
					to the called party immediately after receiving a <literal>PROGRESS</literal> message.
					If <replaceable>sfwink</replaceable> is specified, its SF is sent
					to the called party immediately after receiving a <literal>WINK</literal> message.</para>
					<para>See <literal>SendSF</literal> for valid digits.</para>
				</option>
				<option name="E">
					<para>Enable echoing of sent MF or SF digits back to caller (e.g. "hearpulsing").
					Used in conjunction with the D option.</para>
				</option>
				<option name="e">
					<para>Execute the <literal>h</literal> extension for peer after the call ends</para>
				</option>
				<option name="f">
					<argument name="x" required="false" />
					<para>If <replaceable>x</replaceable> is not provided, force the CallerID sent on a call-forward or
					deflection to the dialplan extension of this <literal>Dial()</literal> using a dialplan <literal>hint</literal>.
					For example, some PSTNs do not allow CallerID to be set to anything
					other than the numbers assigned to you.
					If <replaceable>x</replaceable> is provided, force the CallerID sent to <replaceable>x</replaceable>.</para>
				</option>
				<option name="F" argsep="^">
					<argument name="context" required="false" />
					<argument name="exten" required="false" />
					<argument name="priority" required="true" />
					<para>When the caller hangs up, transfer the <emphasis>called</emphasis> party
					to the specified destination and <emphasis>start</emphasis> execution at that location.</para>
					<para>NOTE: Any channel variables you want the called channel to inherit from the caller channel must be
					prefixed with one or two underbars ('_').</para>
				</option>
				<option name="F">
					<para>When the caller hangs up, transfer the <emphasis>called</emphasis> party to the next priority of the current extension
					and <emphasis>start</emphasis> execution at that location.</para>
					<para>NOTE: Any channel variables you want the called channel to inherit from the caller channel must be
					prefixed with one or two underbars ('_').</para>
					<para>NOTE: Using this option from a Gosub() might not make sense as there would be no return points.</para>
				</option>
				<option name="g">
					<para>Proceed with dialplan execution at the next priority in the current extension if the
					destination channel hangs up.</para>
				</option>
				<option name="G" argsep="^">
					<argument name="context" required="false" />
					<argument name="exten" required="false" />
					<argument name="priority" required="true" />
					<para>If the call is answered, transfer the calling party to
					the specified <replaceable>priority</replaceable> and the called party to the specified
					<replaceable>priority</replaceable> plus one.</para>
					<para>NOTE: You cannot use any additional action post answer options in conjunction with this option.</para>
				</option>
				<option name="h">
					<para>Allow the called party to hang up by sending the DTMF sequence
					defined for disconnect in <filename>features.conf</filename>.</para>
				</option>
				<option name="H">
					<para>Allow the calling party to hang up by sending the DTMF sequence
					defined for disconnect in <filename>features.conf</filename>.</para>
					<para>NOTE: Many SIP and ISDN phones cannot send DTMF digits until the call is
					connected.  If you wish to allow DTMF disconnect before the dialed
					party answers with these phones, you can use the <literal>Answer</literal>
					application before dialing.</para>
				</option>
				<option name="i">
					<para>Asterisk will ignore any forwarding requests it may receive on this dial attempt.</para>
				</option>
				<option name="I">
					<para>Asterisk will ignore any connected line update requests or any redirecting party
					update requests it may receive on this dial attempt.</para>
				</option>
				<option name="j">
					<para>Use the initial stream topology of the caller for outgoing channels, even if the caller topology has changed.</para>
					<para>NOTE: For this option to work, it has to be present in all invocations of Dial that the caller channel goes through.</para>
				</option>
				<option name="k">
					<para>Allow the called party to enable parking of the call by sending
					the DTMF sequence defined for call parking in <filename>features.conf</filename>.</para>
				</option>
				<option name="K">
					<para>Allow the calling party to enable parking of the call by sending
					the DTMF sequence defined for call parking in <filename>features.conf</filename>.</para>
				</option>
				<option name="L" argsep=":">
					<argument name="x" required="true">
						<para>Maximum call time, in milliseconds</para>
					</argument>
					<argument name="y">
						<para>Warning time, in milliseconds</para>
					</argument>
					<argument name="z">
						<para>Repeat time, in milliseconds</para>
					</argument>
					<para>Limit the call to <replaceable>x</replaceable> milliseconds. Play a warning when <replaceable>y</replaceable> milliseconds are
					left. Repeat the warning every <replaceable>z</replaceable> milliseconds until time expires.</para>
					<para>This option is affected by the following variables:</para>
					<variablelist>
						<variable name="LIMIT_PLAYAUDIO_CALLER">
							<value name="yes" default="true" />
							<value name="no" />
							<para>If set, this variable causes Asterisk to play the prompts to the caller.</para>
						</variable>
						<variable name="LIMIT_PLAYAUDIO_CALLEE">
							<value name="yes" />
							<value name="no" default="true"/>
							<para>If set, this variable causes Asterisk to play the prompts to the callee.</para>
						</variable>
						<variable name="LIMIT_TIMEOUT_FILE">
							<value name="filename"/>
							<para>If specified, <replaceable>filename</replaceable> specifies the sound prompt to play when the timeout is reached.
							If not set, the time remaining will be announced.</para>
						</variable>
						<variable name="LIMIT_CONNECT_FILE">
							<value name="filename"/>
							<para>If specified, <replaceable>filename</replaceable> specifies the sound prompt to play when the call begins.
							If not set, the time remaining will be announced.</para>
						</variable>
						<variable name="LIMIT_WARNING_FILE">
							<value name="filename"/>
							<para>If specified, <replaceable>filename</replaceable> specifies the sound prompt to play as
							a warning when time <replaceable>x</replaceable> is reached. If not set, the time remaining will be announced.</para>
						</variable>
					</variablelist>
				</option>
				<option name="m">
					<argument name="class" required="false"/>
					<para>Provide hold music to the calling party until a requested
					channel answers. A specific music on hold <replaceable>class</replaceable>
					(as defined in <filename>musiconhold.conf</filename>) can be specified.</para>
				</option>
				<option name="n">
					<argument name="delete">
						<para>With <replaceable>delete</replaceable> either not specified or set to <literal>0</literal>,
						the recorded introduction will not be deleted if the caller hangs up while the remote party has not
						yet answered.</para>
						<para>With <replaceable>delete</replaceable> set to <literal>1</literal>, the introduction will
						always be deleted.</para>
					</argument>
					<para>This option is a modifier for the call screening/privacy mode. (See the
					<literal>p</literal> and <literal>P</literal> options.) It specifies
					that no introductions are to be saved in the <directory>priv-callerintros</directory>
					directory.</para>
				</option>
				<option name="N">
					<para>This option is a modifier for the call screening/privacy mode. It specifies
					that if CallerID is present, do not screen the call.</para>
				</option>
				<option name="o">
					<argument name="x" required="false" />
					<para>If <replaceable>x</replaceable> is not provided, specify that the CallerID that was present on the
					<emphasis>calling</emphasis> channel be stored as the CallerID on the <emphasis>called</emphasis> channel.
					This was the behavior of Asterisk 1.0 and earlier.
					If <replaceable>x</replaceable> is provided, specify the CallerID stored on the <emphasis>called</emphasis> channel.
					Note that <literal>o(${CALLERID(all)})</literal> is similar to option <literal>o</literal> without the parameter.</para>
				</option>
				<option name="O">
					<argument name="mode">
						<para>With <replaceable>mode</replaceable> either not specified or set to <literal>1</literal>,
						the originator hanging up will cause the phone to ring back immediately.</para>
						<para>With <replaceable>mode</replaceable> set to <literal>2</literal>, when the operator
						flashes the trunk, it will ring their phone back.</para>
					</argument>
					<para>Enables <emphasis>operator services</emphasis> mode.  This option only
					works when bridging a DAHDI channel to another DAHDI channel
					only. If specified on non-DAHDI interfaces, it will be ignored.
					When the destination answers (presumably an operator services
					station), the originator no longer has control of their line.
					They may hang up, but the switch will not release their line
					until the destination party (the operator) hangs up.</para>
				</option>
				<option name="p">
					<para>This option enables screening mode. This is basically Privacy mode
					without memory.</para>
				</option>
				<option name="P">
					<argument name="x" />
					<para>Enable privacy mode. Use <replaceable>x</replaceable> as the family/key in the AstDB database if
					it is provided. The current extension is used if a database family/key is not specified.</para>
				</option>
				<option name="Q">
					<argument name="cause" required="true"/>
					<para>Specify the Q.850/Q.931 <replaceable>cause</replaceable> to send on
					unanswered channels when another channel answers the call.
					As with <literal>Hangup()</literal>, <replaceable>cause</replaceable>
					can be a numeric cause code or a name such as
						<literal>NO_ANSWER</literal>,
						<literal>USER_BUSY</literal>,
						<literal>CALL_REJECTED</literal> or
						<literal>ANSWERED_ELSEWHERE</literal> (the default if Q isn't specified).
						You can also specify <literal>0</literal> or <literal>NONE</literal>
						to send no cause.  See the <filename>causes.h</filename> file for the
						full list of valid causes and names.
						</para>
				</option>
				<option name="r">
					<para>Default: Indicate ringing to the calling party, even if the called party isn't actually ringing. Pass no audio to the calling
					party until the called channel has answered.</para>
					<argument name="tone" required="false">
						<para>Indicate progress to calling party. Send audio 'tone' from the <filename>indications.conf</filename> tonezone currently in use.</para>
					</argument>
				</option>
				<option name="R">
					<para>Default: Indicate ringing to the calling party, even if the called party isn't actually ringing.
					Allow interruption of the ringback if early media is received on the channel.</para>
				</option>
				<option name="S">
					<argument name="x" required="true" />
					<para>Hang up the call <replaceable>x</replaceable> seconds <emphasis>after</emphasis> the called party has
					answered the call.</para>
				</option>
				<option name="s">
					<argument name="x" required="true" />
					<para>Force the outgoing CallerID tag parameter to be set to the string <replaceable>x</replaceable>.</para>
					<para>Works with the <literal>f</literal> option.</para>
				</option>
				<option name="t">
					<para>Allow the called party to transfer the calling party by sending the
					DTMF sequence defined in <filename>features.conf</filename>. This setting does not perform policy enforcement on
					transfers initiated by other methods.</para>
				</option>
				<option name="T">
					<para>Allow the calling party to transfer the called party by sending the
					DTMF sequence defined in <filename>features.conf</filename>. This setting does not perform policy enforcement on
					transfers initiated by other methods.</para>
				</option>
				<option name="U" argsep="^">
					<argument name="x" required="true">
						<para>Name of the subroutine context to execute via <literal>Gosub</literal>.
						The subroutine execution starts in the named context at the s exten and priority 1.</para>
					</argument>
					<argument name="arg" multiple="true" required="false">
						<para>Arguments for the <literal>Gosub</literal> routine</para>
					</argument>
					<para>Execute via <literal>Gosub</literal> the routine <replaceable>x</replaceable> for the <emphasis>called</emphasis> channel before connecting
					to the calling channel. Arguments can be specified to the <literal>Gosub</literal>
					using <literal>^</literal> as a delimiter. The <literal>Gosub</literal> routine can set the variable
					<variable>GOSUB_RESULT</variable> to specify the following actions after the <literal>Gosub</literal> returns.</para>
					<variablelist>
						<variable name="GOSUB_RESULT">
							<value name="ABORT">
								Hangup both legs of the call.
							</value>
							<value name="CONGESTION">
								Behave as if line congestion was encountered.
							</value>
							<value name="BUSY">
								Behave as if a busy signal was encountered.
							</value>
							<value name="CONTINUE">
								Hangup the called party and allow the calling party
								to continue dialplan execution at the next priority.
							</value>
							<value name="GOTO:[[&lt;context&gt;^]&lt;exten&gt;^]&lt;priority&gt;">
								Transfer the call to the specified destination.
							</value>
						</variable>
					</variablelist>
					<para>NOTE: You cannot use any additional action post answer options in conjunction
					with this option. Also, pbx services are run on the <emphasis>called</emphasis> channel,
					so you will not be able to set timeouts via the <literal>TIMEOUT()</literal> function in this routine.</para>
				</option>
				<option name="u">
					<argument name = "x" required="true">
						<para>Force the outgoing callerid presentation indicator parameter to be set
						to one of the values passed in <replaceable>x</replaceable>:
						<literal>allowed_not_screened</literal>
						<literal>allowed_passed_screen</literal>
						<literal>allowed_failed_screen</literal>
						<literal>allowed</literal>
						<literal>prohib_not_screened</literal>
						<literal>prohib_passed_screen</literal>
						<literal>prohib_failed_screen</literal>
						<literal>prohib</literal>
						<literal>unavailable</literal></para>
					</argument>
					<para>Works with the <literal>f</literal> option.</para>
				</option>
				<option name="w">
					<para>Allow the called party to enable recording of the call by sending
					the DTMF sequence defined for one-touch recording in <filename>features.conf</filename>.</para>
				</option>
				<option name="W">
					<para>Allow the calling party to enable recording of the call by sending
					the DTMF sequence defined for one-touch recording in <filename>features.conf</filename>.</para>
				</option>
				<option name="x">
					<para>Allow the called party to enable recording of the call by sending
					the DTMF sequence defined for one-touch automixmonitor in <filename>features.conf</filename>.</para>
				</option>
				<option name="X">
					<para>Allow the calling party to enable recording of the call by sending
					the DTMF sequence defined for one-touch automixmonitor in <filename>features.conf</filename>.</para>
				</option>
				<option name="z">
					<para>On a call forward, cancel any dial timeout which has been set for this call.</para>
				</option>
				</optionlist>
			</parameter>
			<parameter name="URL">
				<para>The optional URL will be sent to the called party if the channel driver supports it.</para>
			</parameter>
		</syntax>
		<description>
			<para>This application will place calls to one or more specified channels. As soon
			as one of the requested channels answers, the originating channel will be
			answered, if it has not already been answered. These two channels will then
			be active in a bridged call. All other channels that were requested will then
			be hung up.</para>
			<para>Unless there is a timeout specified, the Dial application will wait
			indefinitely until one of the called channels answers, the user hangs up, or
			if all of the called channels are busy or unavailable. Dialplan execution will
			continue if no requested channels can be called, or if the timeout expires.
			This application will report normal termination if the originating channel
			hangs up, or if the call is bridged and either of the parties in the bridge
			ends the call.</para>
			<para>If the <variable>OUTBOUND_GROUP</variable> variable is set, all peer channels created by this
			application will be put into that group (as in <literal>Set(GROUP()=...</literal>).
			If the <variable>OUTBOUND_GROUP_ONCE</variable> variable is set, all peer channels created by this
			application will be put into that group (as in <literal>Set(GROUP()=...</literal>). Unlike <variable>OUTBOUND_GROUP</variable>,
			however, the variable will be unset after use.</para>
			<example title="Dial with 30 second timeout">
			 same => n,Dial(PJSIP/alice,30)
			</example>
			<example title="Parallel dial with 45 second timeout">
			 same => n,Dial(PJSIP/alice&amp;PJIP/bob,45)
			</example>
			<example title="Dial with 'g' continuation option">
			 same => n,Dial(PJSIP/alice,,g)
			 same => n,Log(NOTICE, Alice call result: ${DIALSTATUS})
			</example>
			<example title="Dial with transfer/recording features for calling party">
			 same => n,Dial(PJSIP/alice,,TX)
			</example>
			<example title="Dial with call length limit">
			 same => n,Dial(PJSIP/alice,,L(60000:30000:10000))
			</example>
			<example title="Dial alice and bob and send NO_ANSWER to bob instead of ANSWERED_ELSEWHERE when alice answers">
			 same => n,Dial(PJSIP/alice&amp;PJSIP/bob,,Q(NO_ANSWER))
			</example>
			<example title="Dial with pre-dial subroutines">
			[default]
			exten => callee_channel,1,NoOp(ARG1=${ARG1} ARG2=${ARG2})
			 same => n,Log(NOTICE, I'm called on channel ${CHANNEL} prior to it starting the dial attempt)
			 same => n,Return()
			exten => called_channel,1,NoOp(ARG1=${ARG1} ARG2=${ARG2})
			 same => n,Log(NOTICE, I'm called on outbound channel ${CHANNEL} prior to it being used to dial someone)
			 same => n,Return()
			exten => _X.,1,NoOp()
			 same => n,Dial(PJSIP/alice,,b(default^called_channel^1(my_gosub_arg1^my_gosub_arg2))B(default^callee_channel^1(my_gosub_arg1^my_gosub_arg2)))
			 same => n,Hangup()
			</example>
			<example title="Dial with post-answer subroutine executed on outbound channel">
			[my_gosub_routine]
			exten => s,1,NoOp(ARG1=${ARG1} ARG2=${ARG2})
			 same => n,Playback(hello)
			 same => n,Return()
			[default]
			exten => _X.,1,NoOp()
			 same => n,Dial(PJSIP/alice,,U(my_gosub_routine^my_gosub_arg1^my_gosub_arg2))
			 same => n,Hangup()
			</example>
			<example title="Dial into ConfBridge using 'G' option">
			 same => n,Dial(PJSIP/alice,,G(jump_to_here))
			 same => n(jump_to_here),Goto(confbridge)
			 same => n,Goto(confbridge)
			 same => n(confbridge),ConfBridge(${EXTEN})
			</example>
			<para>This application sets the following channel variables:</para>
			<variablelist>
				<variable name="DIALEDTIME">
					<para>This is the time from dialing a channel until when it is disconnected.</para>
				</variable>
				<variable name="DIALEDTIME_MS">
					<para>This is the milliseconds version of the DIALEDTIME variable.</para>
				</variable>
				<variable name="ANSWEREDTIME">
					<para>This is the amount of time for actual call.</para>
				</variable>
				<variable name="ANSWEREDTIME_MS">
					<para>This is the milliseconds version of the ANSWEREDTIME variable.</para>
				</variable>
				<variable name="RINGTIME">
					<para>This is the time from creating the channel to the first RINGING event received. Empty if there was no ring.</para>
				</variable>
				<variable name="RINGTIME_MS">
					<para>This is the milliseconds version of the RINGTIME variable.</para>
				</variable>
				<variable name="PROGRESSTIME">
					<para>This is the time from creating the channel to the first PROGRESS event received. Empty if there was no such event.</para>
				</variable>
				<variable name="PROGRESSTIME_MS">
					<para>This is the milliseconds version of the PROGRESSTIME variable.</para>
				</variable>
				<variable name="DIALEDPEERNAME">
					<para>The name of the outbound channel that answered the call.</para>
				</variable>
				<variable name="DIALEDPEERNUMBER">
					<para>The number that was dialed for the answered outbound channel.</para>
				</variable>
				<variable name="FORWARDERNAME">
					<para>If a call forward occurred, the name of the forwarded channel.</para>
				</variable>
				<variable name="DIALSTATUS">
					<para>This is the status of the call</para>
					<value name="CHANUNAVAIL">
						Either the dialed peer exists but is not currently reachable, e.g.
						endpoint is not registered, or an attempt was made to call a
						nonexistent location, e.g. nonexistent DNS hostname.
					</value>
					<value name="CONGESTION">
						Channel or switching congestion occurred when routing the call.
						This can occur if there is a slow or no response from the remote end.
					</value>
					<value name="NOANSWER">
						Called party did not answer.
					</value>
					<value name="BUSY">
						The called party was busy or indicated a busy status.
						Note that some SIP devices will respond with 486 Busy if their Do Not Disturb
						modes are active. In this case, you can use DEVICE_STATUS to check if the
						endpoint is actually in use, if needed.
					</value>
					<value name="ANSWER">
						The call was answered.
						Any other result implicitly indicates the call was not answered.
					</value>
					<value name="CANCEL">
						Dial was cancelled before call was answered or reached some other terminating event.
					</value>
					<value name="DONTCALL">
						For the Privacy and Screening Modes.
						Will be set if the called party chooses to send the calling party to the 'Go Away' script.
					</value>
					<value name="TORTURE">
						For the Privacy and Screening Modes.
						Will be set if the called party chooses to send the calling party to the 'torture' script.
					</value>
					<value name="INVALIDARGS">
						Dial failed due to invalid syntax.
					</value>
				</variable>
			</variablelist>
		</description>
		<see-also>
			<ref type="application">RetryDial</ref>
			<ref type="application">SendDTMF</ref>
			<ref type="application">Gosub</ref>
		</see-also>
	</application>
	<application name="RetryDial" language="en_US" module="app_dial">
		<since>
			<version>1.2.0</version>
		</since>
		<synopsis>
			Place a call, retrying on failure allowing an optional exit extension.
		</synopsis>
		<syntax>
			<parameter name="announce" required="true">
				<para>Filename of sound that will be played when no channel can be reached</para>
			</parameter>
			<parameter name="sleep" required="true">
				<para>Number of seconds to wait after a dial attempt failed before a new attempt is made</para>
			</parameter>
			<parameter name="retries" required="true">
				<para>Number of retries</para>
				<para>When this is reached flow will continue at the next priority in the dialplan</para>
			</parameter>
			<parameter name="dialargs" required="true">
				<para>Same format as arguments provided to the Dial application</para>
			</parameter>
		</syntax>
		<description>
			<para>This application will attempt to place a call using the normal Dial application.
			If no channel can be reached, the <replaceable>announce</replaceable> file will be played.
			Then, it will wait <replaceable>sleep</replaceable> number of seconds before retrying the call.
			After <replaceable>retries</replaceable> number of attempts, the calling channel will continue at the next priority in the dialplan.
			If the <replaceable>retries</replaceable> setting is set to 0, this application will retry endlessly.
			While waiting to retry a call, a 1 digit extension may be dialed. If that
			extension exists in either the context defined in <variable>EXITCONTEXT</variable> or the current
			one, The call will jump to that extension immediately.
			The <replaceable>dialargs</replaceable> are specified in the same format that arguments are provided
			to the Dial application.</para>
		</description>
		<see-also>
			<ref type="application">Dial</ref>
		</see-also>
	</application>
<module language="en_US" name="app_dictate">
	<support_level>extended</support_level>
</module>
	<application name="Dictate" language="en_US" module="app_dictate">
		<since>
			<version>1.2.0</version>
		</since>
		<synopsis>
			Virtual Dictation Machine.
		</synopsis>
		<syntax>
			<parameter name="base_dir" />
			<parameter name="filename" />
		</syntax>
		<description>
			<para>Start dictation machine using optional <replaceable>base_dir</replaceable> for files.</para>
		</description>
	</application>
<module language="en_US" name="app_directed_pickup">
	<support_level>core</support_level>
</module>
	<application name="Pickup" language="en_US" module="app_directed_pickup">
		<since>
			<version>1.2.0</version>
		</since>
		<synopsis>
			Directed extension call pickup.
		</synopsis>
		<syntax>
			<parameter name="targets" argsep="&amp;">
				<argument name="extension" argsep="@" required="true">
					<para>Specification of the pickup target.</para>
					<argument name="extension" required="true"/>
					<argument name="context" />
				</argument>
				<argument name="extension2" argsep="@" multiple="true">
					<para>Additional specifications of pickup targets.</para>
					<argument name="extension2" required="true"/>
					<argument name="context2"/>
				</argument>
			</parameter>
		</syntax>
		<description>
			<para>This application can pickup a specified ringing channel.  The channel
			to pickup can be specified in the following ways.</para>
			<para>1) If no <replaceable>extension</replaceable> targets are specified,
			the application will pickup a channel matching the pickup group of the
			requesting channel.</para>
			<para>2) If the <replaceable>extension</replaceable> is specified with a
			<replaceable>context</replaceable> of the special string
			<literal>PICKUPMARK</literal> (for example 10@PICKUPMARK), the application
			will pickup a channel which has defined the channel variable
			<variable>PICKUPMARK</variable> with the same value as
			<replaceable>extension</replaceable> (in this example,
			<literal>10</literal>).</para>
			<para>3) If the <replaceable>extension</replaceable> is specified
			with or without a <replaceable>context</replaceable>, the channel with a
			matching <replaceable>extension</replaceable> and <replaceable>context</replaceable>
			will be picked up.  If no <replaceable>context</replaceable> is specified,
			the current context will be used.</para>
			<note><para>The <replaceable>extension</replaceable> is typically set on
			matching channels by the dial application that created the channel.  The
			<replaceable>context</replaceable> is set on matching channels by the
			channel driver for the device.</para></note>
		</description>
	</application>
	<application name="PickupChan" language="en_US" module="app_directed_pickup">
		<since>
			<version>1.6.0</version>
		</since>
		<synopsis>
			Pickup a ringing channel.
		</synopsis>
		<syntax >
			<parameter name="channel" argsep="&amp;" required="true">
				<argument name="channel" required="true" />
				<argument name="channel2" required="false" multiple="true" />
				<para>List of channel names or channel uniqueids to pickup if ringing.
					For example, a channel name could be <literal>SIP/bob</literal> or
					<literal>SIP/bob-00000000</literal> to find
					<literal>SIP/bob-00000000</literal>.
				</para>
			</parameter>
			<parameter name="options" required="false">
				<optionlist>
					<option name="p">
						<para>Supplied channel names are prefixes.  For example,
							<literal>SIP/bob</literal> will match
							<literal>SIP/bob-00000000</literal> and
							<literal>SIP/bobby-00000000</literal>.
						</para>
					</option>
				</optionlist>
			</parameter>
		</syntax>
		<description>
			<para>Pickup a specified <replaceable>channel</replaceable> if ringing.</para>
		</description>
	</application>
<module language="en_US" name="app_directory">
	<support_level>core</support_level>
</module>
	<application name="Directory" language="en_US" module="app_directory">
		<since>
			<version>0.1.0</version>
		</since>
		<synopsis>
			Provide directory of voicemail extensions.
		</synopsis>
		<syntax>
			<parameter name="vm-context">
				<para>This is the context within voicemail.conf to use for the Directory. If not
				specified and <literal>searchcontexts=no</literal> in
				<filename>voicemail.conf</filename>, then <literal>default</literal>
				will be assumed.</para>
			</parameter>
			<parameter name="dial-context" required="false">
				<para>This is the dialplan context to use when looking for an
				extension that the user has selected, or when jumping to the
				<literal>o</literal> or <literal>a</literal> extension. If not
				specified, the current context will be used.</para>
			</parameter>
			<parameter name="options" required="false">
				<optionlist>
					<option name="e">
						<para>In addition to the name, also read the extension number to the
						caller before presenting dialing options.</para>
					</option>
					<option name="f">
						<para>Allow the caller to enter the first name of a user in the
						directory instead of using the last name.  If specified, the
						optional number argument will be used for the number of
						characters the user should enter.</para>
						<argument name="n" required="true" />
					</option>
					<option name="l">
						<para>Allow the caller to enter the last name of a user in the
						directory.  This is the default.  If specified, the
						optional number argument will be used for the number of
						characters the user should enter.</para>
						<argument name="n" required="true" />
					</option>
					<option name="b">
						<para> Allow the caller to enter either the first or the last name
						of a user in the directory.  If specified, the optional number
						argument will be used for the number of characters the user should enter.</para>
						<argument name="n" required="true" />
					</option>
					<option name="a">
						<para>Allow the caller to additionally enter an alias for a user in the
						directory.  This option must be specified in addition to the
						<literal>f</literal>, <literal>l</literal>, or <literal>b</literal>
						option.</para>
					</option>
					<option name="m">
						<para>Instead of reading each name sequentially and asking for
						confirmation, create a menu of up to 8 names.</para>
					</option>
					<option name="n">
						<para>Read digits even if the channel is not answered.</para>
					</option>
					<option name="p">
						<para>Pause for n milliseconds after the digits are typed.  This is
						helpful for people with cellphones, who are not holding the
						receiver to their ear while entering DTMF.</para>
						<argument name="n" required="true" />
					</option>
					<option name="c">
						<para>Load the specified config file instead of voicemail.conf</para>
						<argument name="filename" required="true" />
					</option>
					<option name="s">
						<para>Skip calling the extension, instead set it in the <variable>DIRECTORY_EXTEN</variable>
						channel variable.</para>
					</option>
					<option name="d">
						<para>Enable ADSI support for screen phone searching and retrieval
						of directory results.</para>
						<para>Additionally, the channel must be ADSI-enabled and you must
						have an ADSI-compatible (Type III) CPE for this to work.</para>
					</option>
				</optionlist>
				<note><para>Only one of the <replaceable>f</replaceable>, <replaceable>l</replaceable>, or <replaceable>b</replaceable>
				options may be specified. <emphasis>If more than one is specified</emphasis>, then Directory will act as
				if <replaceable>b</replaceable> was specified.  The number
				of characters for the user to type defaults to <literal>3</literal>.</para></note>
			</parameter>
		</syntax>
		<description>
			<para>This application will present the calling channel with a directory of extensions from which they can search
			by name. The list of names and corresponding extensions is retrieved from the
			voicemail configuration file, <filename>voicemail.conf</filename>, or from the specified filename.</para>
			<para>This application will immediately exit if one of the following DTMF digits are
			received and the extension to jump to exists:</para>
			<para><literal>0</literal> - Jump to the 'o' extension, if it exists.</para>
			<para><literal>*</literal> - Jump to the 'a' extension, if it exists.</para>
			<para>This application will set the following channel variables before completion:</para>
			<variablelist>
				<variable name="DIRECTORY_RESULT">
					<para>Reason Directory application exited.</para>
					<value name="OPERATOR">User requested operator</value>
					<value name="ASSISTANT">User requested assistant</value>
					<value name="TIMEOUT">User allowed DTMF wait duration to pass without sending DTMF</value>
					<value name="HANGUP">The channel hung up before the application finished</value>
					<value name="SELECTED">User selected a user to call from the directory</value>
					<value name="USEREXIT">User exited with '#' during selection</value>
					<value name="FAILED">The application failed</value>
				</variable>
				<variable name="DIRECTORY_EXTEN">
					<para>If the skip calling option is set this will be set to the selected extension
					provided one is selected.</para>
				</variable>
			</variablelist>
		</description>
	</application>

<module language="en_US" name="app_disa">
	<use type="module">app_cdr</use>
	<support_level>core</support_level>
</module>
	<application name="DISA" language="en_US" module="app_disa">
		<since>
			<version>0.1.9</version>
		</since>
		<synopsis>
			Direct Inward System Access.
		</synopsis>
		<syntax>
			<parameter name="passcode|filename" required="true">
				<para>If you need to present a DISA dialtone without entering a password,
				simply set <replaceable>passcode</replaceable> to <literal>no-password</literal></para>
				<para>You may specified a <replaceable>filename</replaceable> instead of a
				<replaceable>passcode</replaceable>, this filename must contain individual passcodes</para>
			</parameter>
			<parameter name="context">
				<para>Specifies the dialplan context in which the user-entered extension
				will be matched. If no context is specified, the DISA application defaults
				to the <literal>disa</literal> context. Presumably a normal system will have a special
				context set up for DISA use with some or a lot of restrictions.</para>
			</parameter>
			<parameter name="cid">
				<para>Specifies a new (different) callerid to be used for this call.</para>
			</parameter>
			<parameter name="mailbox" argsep="@">
				<para>Will cause a stutter-dialtone (indication <emphasis>dialrecall</emphasis>)
				to be used, if the specified mailbox contains any new messages.</para>
				<argument name="mailbox" required="true" />
				<argument name="context" required="false" />
			</parameter>
			<parameter name="options">
				<optionlist>
					<option name="n">
						<para>The DISA application will not answer initially.</para>
					</option>
					<option name="p">
						<para>The extension entered will be considered complete when a <literal>#</literal>
						is entered.</para>
					</option>
				</optionlist>
			</parameter>
		</syntax>
		<description>
			<para>The DISA, Direct Inward System Access, application allows someone from
			outside the telephone switch (PBX) to obtain an <emphasis>internal</emphasis> system
			dialtone and to place calls from it as if they were placing a call from
			within the switch.
			DISA plays a dialtone. The user enters their numeric passcode, followed by
			the pound sign <literal>#</literal>. If the passcode is correct, the user is then given
			system dialtone within <replaceable>context</replaceable> on which a call may be placed.
			If the user enters an invalid extension and extension <literal>i</literal> exists in the specified
			<replaceable>context</replaceable>, it will be used.
			</para>
			<para>Be aware that using this may compromise the security of your PBX.</para>
			<para>The arguments to this application (in <filename>extensions.conf</filename>) allow either
			specification of a single global <replaceable>passcode</replaceable> (that everyone uses), or
			individual passcodes contained in a file (<replaceable>filename</replaceable>).</para>
			<para>The file that contains the passcodes (if used) allows a complete
			specification of all of the same arguments available on the command
			line, with the sole exception of the options. The file may contain blank
			lines, or comments starting with <literal>#</literal> or <literal>;</literal>.</para>
		</description>
		<see-also>
			<ref type="application">Authenticate</ref>
			<ref type="application">VMAuthenticate</ref>
		</see-also>
	</application>
<module language="en_US" name="app_dtmfstore">
	<support_level>extended</support_level>
</module>
	<application name="StoreDTMF" language="en_US" module="app_dtmfstore">
		<since>
			<version>16.20.0</version>
			<version>18.6.0</version>
		</since>
		<synopsis>
			Stores DTMF digits transmitted or received on a channel.
		</synopsis>
		<syntax>
			<parameter name="direction" required="true">
				<para>Must be <literal>TX</literal> or <literal>RX</literal> to
				store digits, or <literal>remove</literal> to disable.</para>
			</parameter>
		</syntax>
		<description>
			<para>The StoreDTMF function can be used to obtain digits sent in the
			<literal>TX</literal> or <literal>RX</literal> direction of any channel.</para>
			<para>The arguments are:</para>
			<para><replaceable>var_name</replaceable>: Name of variable to which to append
			digits.</para>
			<para><replaceable>max_digits</replaceable>: The maximum number of digits to
			store in the variable. Defaults to 0 (no maximum). After reading <literal>
			maximum</literal> digits, no more digits will be stored.</para>
			<example title="Store digits in CDR variable">
			same => n,StoreDTMF(TX,CDR(digits))
			</example>
			<example title="Store up to 24 digits">
			same => n,StoreDTMF(RX,testvar,24)
			</example>
			<example title="Disable digit collection">
			same => n,StoreDTMF(remove)
			</example>
		</description>
	</application>
<module language="en_US" name="app_dumpchan">
	<support_level>core</support_level>
</module>
	<application name="DumpChan" language="en_US" module="app_dumpchan">
		<since>
			<version>1.2.0</version>
		</since>
		<synopsis>
			Dump Info About The Calling Channel.
		</synopsis>
		<syntax>
			<parameter name="level">
				<para>Minimum verbose level</para>
			</parameter>
		</syntax>
		<description>
			<para>Displays information on channel and listing of all channel
			variables. If <replaceable>level</replaceable> is specified, output is only
			displayed when the verbose level is currently set to that number
			or greater.</para>
		</description>
		<see-also>
			<ref type="application">NoOp</ref>
			<ref type="application">Verbose</ref>
		</see-also>
	</application>
<module language="en_US" name="app_echo">
	<support_level>core</support_level>
</module>
	<application name="Echo" language="en_US" module="app_echo">
		<since>
			<version>0.1.2</version>
		</since>
		<synopsis>
			Echo media, DTMF back to the calling party
		</synopsis>
		<syntax />
		<description>
			<para>Echos back any media or DTMF frames read from the calling
			channel back to itself. This will not echo CONTROL, MODEM, or NULL
			frames. Note: If '#' detected application exits.</para>
			<para>This application does not automatically answer and should be
			preceded by an application such as Answer() or Progress().</para>
		</description>
	</application>
<module language="en_US" name="app_exec">
	<support_level>core</support_level>
</module>
	<application name="Exec" language="en_US" module="app_exec">
		<since>
			<version>1.0.0</version>
		</since>
		<synopsis>
			Executes dialplan application.
		</synopsis>
		<syntax>
			<parameter name="appname" required="true" hasparams="true">
				<para>Application name and arguments of the dialplan application to execute.</para>
				<argument name="arguments" required="true" />
			</parameter>
		</syntax>
		<description>
			<para>Allows an arbitrary application to be invoked even when not
			hard coded into the dialplan.  If the underlying application
			terminates the dialplan, or if the application cannot be found,
			Exec will terminate the dialplan.</para>
			<para>To invoke external applications, see the application System.
			If you would like to catch any error instead, see TryExec.</para>
		</description>
	</application>
	<application name="TryExec" language="en_US" module="app_exec">
		<since>
			<version>1.4.0</version>
		</since>
		<synopsis>
			Executes dialplan application, always returning.
		</synopsis>
		<syntax>
			<parameter name="appname" required="true" hasparams="true">
				<argument name="arguments" required="true" />
			</parameter>
		</syntax>
		<description>
			<para>Allows an arbitrary application to be invoked even when not
			hard coded into the dialplan. To invoke external applications
			see the application System.  Always returns to the dialplan.
			The channel variable TRYSTATUS will be set to one of:
			</para>
			<variablelist>
				<variable name="TRYSTATUS">
					<value name="SUCCESS">
						If the application returned zero.
					</value>
					<value name="FAILED">
						If the application returned non-zero.
					</value>
					<value name="NOAPP">
						If the application was not found or was not specified.
					</value>
				</variable>
			</variablelist>
		</description>
	</application>
	<application name="ExecIf" language="en_US" module="app_exec">
		<since>
			<version>1.2.0</version>
		</since>
		<synopsis>
			Executes dialplan application, conditionally.
		</synopsis>
		<syntax argsep="?">
			<parameter name="expression" required="true" />
			<parameter name="execapp" required="true" argsep=":">
				<argument name="appiftrue" required="true" hasparams="true">
					<argument name="args" required="true" />
				</argument>
				<argument name="appiffalse" required="false" hasparams="true">
					<argument name="args" required="true" />
				</argument>
			</parameter>
		</syntax>
		<description>
			<para>If <replaceable>expr</replaceable> is true, execute and return the
			result of <replaceable>appiftrue(args)</replaceable>.</para>
			<para>If <replaceable>expr</replaceable> is true, but <replaceable>appiftrue</replaceable> is not found,
			then the application will return a non-zero value.</para>
		</description>
	</application>
<module language="en_US" name="app_externalivr">
	<support_level>extended</support_level>
</module>
	<application name="ExternalIVR" language="en_US" module="app_externalivr">
		<since>
			<version>1.2.0</version>
		</since>
		<synopsis>
			Interfaces with an external IVR application.
		</synopsis>
		<syntax>
			<parameter name="command|ivr://host" required="true" hasparams="true">
				<argument name="arg1" />
				<argument name="arg2" multiple="yes" />
			</parameter>
			<parameter name="options">
				<optionlist>
					<option name="n">
						<para>Tells ExternalIVR() not to answer the channel.</para>
					</option>
					<option name="i">
						<para>Tells ExternalIVR() not to send a hangup and exit when the
						channel receives a hangup, instead it sends an <literal>I</literal>
						informative message meaning that the external application MUST hang
						up the call with an <literal>H</literal> command.</para>
					</option>
					<option name="d">
						<para>Tells ExternalIVR() to run on a channel that has been hung up
						and will not look for hangups. The external application must exit with
						an <literal>E</literal> command.</para>
					</option>
				</optionlist>
			</parameter>
		</syntax>
		<description>
			<para>Either forks a process to run given command or makes a socket to connect
			to given host and starts a generator on the channel. The generator's play list
			is controlled by the external application, which can add and clear entries via
			simple commands issued over its stdout. The external application will receive
			all DTMF events received on the channel, and notification if the channel is
			hung up. The received on the channel, and notification if the channel is hung
			up. The application will not be forcibly terminated when the channel is hung up.
			For more information see <filename>doc/AST.pdf</filename>.</para>
		</description>
	</application>
<module language="en_US" name="app_festival">
	<support_level>extended</support_level>
</module>
	<application name="Festival" language="en_US" module="app_festival">
		<since>
			<version>0.2.0</version>
		</since>
		<synopsis>
			Say text to the user.
		</synopsis>
		<syntax>
			<parameter name="text" required="true" />
			<parameter name="intkeys" />
		</syntax>
		<description>
			<para>Connect to Festival, send the argument, get back the waveform, play it to the user,
			allowing any given interrupt keys to immediately terminate and return the value, or
			<literal>any</literal> to allow any number back (useful in dialplan).</para>
		</description>
	</application>
<module language="en_US" name="app_flash">
	<depend>dahdi</depend>
	<support_level>core</support_level>
</module>
	<application name="Flash" language="en_US" module="app_flash">
		<since>
			<version>1.6.1.0</version>
		</since>
		<synopsis>
			Flashes a DAHDI Trunk.
		</synopsis>
		<syntax />
		<description>
			<para>Performs a flash on a DAHDI trunk. This can be used to access features
			provided on an incoming analogue circuit such as conference and call waiting.
			Use with SendDTMF() to perform external transfers.</para>
		</description>
		<see-also>
			<ref type="application">SendDTMF</ref>
		</see-also>
	</application>
<module language="en_US" name="app_followme">
	<support_level>core</support_level>
</module>
	<application name="FollowMe" language="en_US" module="app_followme">
		<since>
			<version>1.6.1.0</version>
		</since>
		<synopsis>
			Find-Me/Follow-Me application.
		</synopsis>
		<syntax>
			<parameter name="followmeid" required="true" />
			<parameter name="options">
				<optionlist>
					<option name="a">
						<para>Record the caller's name so it can be announced to the
						callee on each step.</para>
					</option>
					<option name="B" argsep="^">
						<para>Before initiating the outgoing call(s), Gosub to the specified
						location using the current channel.</para>
						<argument name="context" required="false" />
						<argument name="exten" required="false" />
						<argument name="priority" required="true" hasparams="optional" argsep="^">
							<argument name="arg1" multiple="true" required="true" />
							<argument name="argN" />
						</argument>
					</option>
					<option name="b" argsep="^">
						<para>Before initiating an outgoing call, Gosub to the specified
						location using the newly created channel.  The Gosub will be
						executed for each destination channel.</para>
						<argument name="context" required="false" />
						<argument name="exten" required="false" />
						<argument name="priority" required="true" hasparams="optional" argsep="^">
							<argument name="arg1" multiple="true" required="true" />
							<argument name="argN" />
						</argument>
					</option>
					<option name="d">
						<para>Disable the 'Please hold while we try to connect your call' announcement.</para>
					</option>
					<option name="I">
						<para>Asterisk will ignore any connected line update requests
						it may receive on this dial attempt.</para>
					</option>
					<option name="l">
						<para>Disable local call optimization so that applications with
						audio hooks between the local bridge don't get dropped when the
						calls get joined directly.</para>
					</option>
					<option name="N">
						<para>Don't answer the incoming call until we're ready to
						connect the caller or give up.</para>
						<note>
	 						<para>This option is ignored if the call is already answered.</para>
 						</note>
						<note>
							<para>If the call is not already answered, the 'a' and 's'
							options are ignored while the 'd' option is implicitly enabled.</para>
 						</note>
					</option>
					<option name="n">
						<para>Playback the unreachable status message if we've run out
						of steps or the callee has elected not to be reachable.</para>
					</option>
					<option name="s">
						<para>Playback the incoming status message prior to starting
						the follow-me step(s)</para>
					</option>
				</optionlist>
			</parameter>
		</syntax>
		<description>
			<para>This application performs Find-Me/Follow-Me functionality for the caller
			as defined in the profile matching the <replaceable>followmeid</replaceable> parameter in
			<filename>followme.conf</filename>. If the specified <replaceable>followmeid</replaceable>
			profile doesn't exist in <filename>followme.conf</filename>, execution will be returned
			to the dialplan and call execution will continue at the next priority.</para>
			<para>Returns -1 on hangup.</para>
		</description>
	</application>
<module language="en_US" name="app_forkcdr">
	<support_level>core</support_level>
</module>
	<application name="ForkCDR" language="en_US" module="app_forkcdr">
		<since>
			<version>1.6.1.0</version>
		</since>
		<synopsis>
			Forks the current Call Data Record for this channel.
		</synopsis>
		<syntax>
			<parameter name="options">
				<optionlist>
					<option name="a">
						<para>If the channel is answered, set the answer time on
						the forked CDR to the current time. If this option is
						not used, the answer time on the forked CDR will be the
						answer time on the original CDR. If the channel is not
						answered, this option has no effect.</para>
						<para>Note that this option is implicitly assumed if the
						<literal>r</literal> option is used.</para>
					</option>
					<option name="e">
						<para>End (finalize) the original CDR.</para>
					</option>
					<option name="r">
						<para>Reset the start and answer times on the forked CDR.
						This will set the start and answer times (if the channel
						is answered) to be set to the current time.</para>
						<para>Note that this option implicitly assumes the
						<literal>a</literal> option.</para>
					</option>
					<option name="v">
						<para>Do not copy CDR variables and attributes from the
						original CDR to the forked CDR.</para>
						<warning><para>This option has changed. Previously, the
						variables were removed from the original CDR. This no
						longer occurs - this option now controls whether or not
						a forked CDR inherits the variables from the original
						CDR.</para></warning>
					</option>
				</optionlist>
			</parameter>
		</syntax>
		<description>
			<para>Causes the Call Data Record engine to fork a new CDR starting
			from the time the application is executed. The forked CDR will be
			linked to the end of the CDRs associated with the channel.</para>
		</description>
		<see-also>
			<ref type="function">CDR</ref>
			<ref type="function">CDR_PROP</ref>
			<ref type="application">ResetCDR</ref>
		</see-also>
	</application>
<module language="en_US" name="app_getcpeid">
	<depend>res_adsi</depend>
	<support_level>deprecated</support_level>
</module>
	<application name="GetCPEID" language="en_US" module="app_getcpeid">
		<since>
			<version>0.1.12</version>
		</since>
		<synopsis>
			Get ADSI CPE ID.
		</synopsis>
		<syntax />
		<description>
			<para>Obtains and displays ADSI CPE ID and other information in order
			to properly setup <filename>dahdi.conf</filename> for on-hook operations.</para>
		</description>
	</application>
<module language="en_US" name="app_if">
	<support_level>extended</support_level>
</module>
	<application name="If" language="en_US" module="app_if">
		<since>
			<version>18.16.0</version>
			<version>20.1.0</version>
		</since>
		<synopsis>
			Start an if branch.
		</synopsis>
		<syntax>
			<parameter name="expr" required="true" />
		</syntax>
		<description>
			<para>Start an If branch.  Execution will continue inside the branch
			if expr is true.</para>
			<note><para>This application (and related applications) set variables
			internally during execution.</para></note>
		</description>
		<see-also>
			<ref type="application">ElseIf</ref>
			<ref type="application">Else</ref>
			<ref type="application">EndIf</ref>
			<ref type="application">ExitIf</ref>
		</see-also>
	</application>
	<application name="ElseIf" language="en_US" module="app_if">
		<since>
			<version>18.16.0</version>
			<version>20.1.0</version>
		</since>
		<synopsis>
			Start an else if branch.
		</synopsis>
		<syntax>
			<parameter name="expr" required="true" />
		</syntax>
		<description>
			<para>Start an optional ElseIf branch. Execution will continue inside the branch
			if expr is true and if previous If and ElseIf branches evaluated to false.</para>
			<para>Please note that execution inside a true If branch will fallthrough into
			ElseIf unless the If segment is terminated with an ExitIf call. This is only
			necessary with ElseIf but not with Else.</para>
		</description>
		<see-also>
			<ref type="application">If</ref>
			<ref type="application">Else</ref>
			<ref type="application">EndIf</ref>
			<ref type="application">ExitIf</ref>
		</see-also>
	</application>
	<application name="Else" language="en_US" module="app_if">
		<since>
			<version>18.16.0</version>
			<version>20.1.0</version>
		</since>
		<synopsis>
			Define an optional else branch.
		</synopsis>
		<syntax>
			<parameter name="expr" required="true" />
		</syntax>
		<description>
			<para>Start an Else branch. Execution will jump here if all previous
			If and ElseIf branches evaluated to false.</para>
		</description>
		<see-also>
			<ref type="application">If</ref>
			<ref type="application">ElseIf</ref>
			<ref type="application">EndIf</ref>
			<ref type="application">ExitIf</ref>
		</see-also>
	</application>
	<application name="EndIf" language="en_US" module="app_if">
		<since>
			<version>18.16.0</version>
			<version>20.1.0</version>
		</since>
		<synopsis>
			End an if branch.
		</synopsis>
		<syntax />
		<description>
			<para>Ends the branch begun by the preceding <literal>If()</literal> application.</para>
		</description>
		<see-also>
			<ref type="application">If</ref>
			<ref type="application">ElseIf</ref>
			<ref type="application">Else</ref>
			<ref type="application">ExitIf</ref>
		</see-also>
	</application>
	<application name="ExitIf" language="en_US" module="app_if">
		<since>
			<version>18.16.0</version>
			<version>20.1.0</version>
		</since>
		<synopsis>
			End an If branch.
		</synopsis>
		<syntax />
		<description>
			<para>Exits an <literal>If()</literal> branch, whether or not it has completed.</para>
		</description>
		<see-also>
			<ref type="application">If</ref>
			<ref type="application">ElseIf</ref>
			<ref type="application">Else</ref>
			<ref type="application">EndIf</ref>
		</see-also>
	</application>
<module language="en_US" name="app_ivrdemo">
	<defaultenabled>no</defaultenabled>
	<support_level>extended</support_level>
</module>
	<application name="IVRDemo" language="en_US" module="app_ivrdemo">
		<since>
			<version>1.2.0</version>
		</since>
		<synopsis>
			IVR Demo Application.
		</synopsis>
		<syntax>
			<parameter name="filename" required="true" />
		</syntax>
		<description>
			<para>This is a skeleton application that shows you the basic structure to create your
			own asterisk applications and demonstrates the IVR demo.</para>
		</description>
	</application>
<module language="en_US" name="app_jack">
	<depend>jack</depend>
	<depend>resample</depend>
	<support_level>extended</support_level>
</module>
	<application name="JACK" language="en_US" module="app_jack">
		<since>
			<version>1.6.0</version>
		</since>
		<synopsis>
			Jack Audio Connection Kit
		</synopsis>
		<syntax>
			<parameter name="options" required="false">
				<optionlist>
					<option name="s">
						<argument name="name" required="true">
							<para>Connect to the specified jack server name</para>
						</argument>
					</option>
					<option name="i">
						<argument name="name" required="true">
							<para>Connect the output port that gets created to the specified jack input port</para>
						</argument>
					</option>
					<option name="o">
						<argument name="name" required="true">
							<para>Connect the input port that gets created to the specified jack output port</para>
						</argument>
					</option>
					<option name="c">
						<argument name="name" required="true">
							<para>By default, Asterisk will use the channel name for the jack client name.</para>
							<para>Use this option to specify a custom client name.</para>
						</argument>
					</option>
				</optionlist>
			</parameter>
		</syntax>
		<description>
			<para>When executing this application, two jack ports will be created;
			one input and one output. Other applications can be hooked up to
			these ports to access audio coming from, or being send to the channel.</para>
		</description>
	</application>
<module language="en_US" name="app_meetme">
	<depend>dahdi</depend>
	<defaultenabled>no</defaultenabled>
	<support_level>deprecated</support_level>
	<replacement>app_confbridge</replacement>
	<deprecated_in>19</deprecated_in>
</module>
	<application name="MeetMe" language="en_US" module="app_meetme">
		<since>
			<version>0.1.12</version>
		</since>
		<synopsis>
			MeetMe conference bridge.
		</synopsis>
		<syntax>
			<parameter name="confno">
				<para>The conference number</para>
			</parameter>
			<parameter name="options">
				<optionlist>
					<option name="a">
						<para>Set admin mode.</para>
					</option>
					<option name="A">
						<para>Set marked mode.</para>
					</option>
					<option name="b">
						<para>Run AGI script specified in <variable>MEETME_AGI_BACKGROUND</variable>
						Default: <literal>conf-background.agi</literal>.</para>
						<note><para>This does not work with non-DAHDI channels in the same
						conference).</para></note>
					</option>
					<option name="c">
						<para>Announce user(s) count on joining a conference.</para>
					</option>
					<option name="C">
						<para>Continue in dialplan when kicked out of conference.</para>
					</option>
					<option name="d">
						<para>Dynamically add conference.</para>
					</option>
					<option name="D">
						<para>Dynamically add conference, prompting for a PIN.</para>
					</option>
					<option name="e">
						<para>Select an empty conference.</para>
					</option>
					<option name="E">
						<para>Select an empty pinless conference.</para>
					</option>
					<option name="F">
						<para>Pass DTMF through the conference.</para>
					</option>
					<option name="G">
						<argument name="x" required="true">
							<para>The file to playback</para>
						</argument>
						<para>Play an intro announcement in conference.</para>
					</option>
					<option name="i">
						<para>Announce user join/leave with review.</para>
					</option>
					<option name="I">
						<para>Announce user join/leave without review.</para>
					</option>
					<option name="k">
						<para>Close the conference if there's only one active participant left at exit.</para>
					</option>
					<option name="l">
						<para>Set listen only mode (Listen only, no talking).</para>
					</option>
					<option name="m">
						<para>Set initially muted.</para>
					</option>
					<option name="M" hasparams="optional">
						<para>Enable music on hold when the conference has a single caller. Optionally,
						specify a musiconhold class to use. If one is not provided, it will use the
						channel's currently set music class, or <literal>default</literal>.</para>
						<argument name="class" required="true" />
					</option>
					<option name="n">
						<para>Disable the denoiser. By default, if <literal>func_speex</literal> is loaded, Asterisk
						will apply a denoiser to channels in the MeetMe conference. However, channel
						drivers that present audio with a varying rate will experience degraded
						performance with a denoiser attached. This parameter allows a channel joining
						the conference to choose not to have a denoiser attached without having to
						unload <literal>func_speex</literal>.</para>
					</option>
					<option name="o">
						<para>Set talker optimization - treats talkers who aren't speaking as
						being muted, meaning (a) No encode is done on transmission and (b)
						Received audio that is not registered as talking is omitted causing no
						buildup in background noise.</para>
					</option>
					<option name="p" hasparams="optional">
						<para>Allow user to exit the conference by pressing <literal>#</literal> (default)
						or any of the defined keys. Dial plan execution will continue at the next
						priority following MeetMe. The key used is set to channel variable
						<variable>MEETME_EXIT_KEY</variable>.</para>
						<argument name="keys" required="true" />
						<note>
							<para>Option <literal>s</literal> has priority for <literal>*</literal>
							since it cannot change its activation code.</para>
						</note>
					</option>
					<option name="P">
						<para>Always prompt for the pin even if it is specified.</para>
					</option>
					<option name="q">
						<para>Quiet mode (don't play enter/leave sounds).</para>
					</option>
					<option name="r">
						<para>Record conference (records as <variable>MEETME_RECORDINGFILE</variable>
						using format <variable>MEETME_RECORDINGFORMAT</variable>. Default filename is
						<literal>meetme-conf-rec-${CONFNO}-${UNIQUEID}</literal> and the default format is
						wav.</para>
					</option>
					<option name="s">
						<para>Present menu (user or admin) when <literal>*</literal> is received
						(send to menu).</para>
					</option>
					<option name="t">
						<para>Set talk only mode. (Talk only, no listening).</para>
					</option>
					<option name="T">
						<para>Set talker detection (sent to manager interface and meetme list).</para>
					</option>
					<option name="v" hasparams="optional">
						<para>Announce when a user is joining or leaving the conference.  Use the voicemail greeting as the announcement.
						 If the i or I options are set, the application will fall back to them if no voicemail greeting can be found.</para>
						<argument name="mailbox@[context]" required="true">
							<para>The mailbox and voicemail context to play from.  If no context provided, assumed context is default.</para>
						</argument>
					</option>
					<option name="w" hasparams="optional">
						<para>Wait until the marked user enters the conference.</para>
						<argument name="secs" required="true" />
					</option>
					<option name="x">
						<para>Leave the conference when the last marked user leaves.</para>
					</option>
					<option name="X">
						<para>Allow user to exit the conference by entering a valid single digit
						extension <variable>MEETME_EXIT_CONTEXT</variable> or the current context
						if that variable is not defined.</para>
						<note>
							<para>Option <literal>s</literal> has priority for <literal>*</literal>
							since it cannot change its activation code.</para>
						</note>
					</option>
					<option name="1">
						<para>Do not play message when first person enters</para>
					</option>
					<option name="S">
						<para>Kick the user <replaceable>x</replaceable> seconds <emphasis>after</emphasis> he entered into
						the conference.</para>
						<argument name="x" required="true" />
					</option>
					<option name="L" argsep=":">
						<para>Limit the conference to <replaceable>x</replaceable> ms. Play a warning when
						<replaceable>y</replaceable> ms are left. Repeat the warning every <replaceable>z</replaceable> ms.
						The following special variables can be used with this option:</para>
						<variablelist>
							<variable name="CONF_LIMIT_TIMEOUT_FILE">
								<para>File to play when time is up.</para>
							</variable>
							<variable name="CONF_LIMIT_WARNING_FILE">
								<para>File to play as warning if <replaceable>y</replaceable> is defined. The
								default is to say the time remaining.</para>
							</variable>
						</variablelist>
						<argument name="x" />
						<argument name="y" />
						<argument name="z" />
					</option>
				</optionlist>
			</parameter>
			<parameter name="pin" />
		</syntax>
		<description>
			<para>Enters the user into a specified MeetMe conference.  If the <replaceable>confno</replaceable>
			is omitted, the user will be prompted to enter one.  User can exit the conference by hangup, or
			if the <literal>p</literal> option is specified, by pressing <literal>#</literal>.</para>
			<note><para>The DAHDI kernel modules and a functional DAHDI timing source (see dahdi_test)
			must be present for conferencing to operate properly. In addition, the chan_dahdi channel driver
			must be loaded for the <literal>i</literal> and <literal>r</literal> options to operate at
			all.</para></note>
		</description>
		<see-also>
			<ref type="application">MeetMeCount</ref>
			<ref type="application">MeetMeAdmin</ref>
			<ref type="application">MeetMeChannelAdmin</ref>
		</see-also>
	</application>
	<application name="MeetMeCount" language="en_US" module="app_meetme">
		<since>
			<version>0.1.12</version>
		</since>
		<synopsis>
			MeetMe participant count.
		</synopsis>
		<syntax>
			<parameter name="confno" required="true">
				<para>Conference number.</para>
			</parameter>
			<parameter name="var" />
		</syntax>
		<description>
			<para>Plays back the number of users in the specified MeetMe conference.
			If <replaceable>var</replaceable> is specified, playback will be skipped and the value
			will be returned in the variable. Upon application completion, MeetMeCount will hangup
			the channel, unless priority <literal>n+1</literal> exists, in which case priority progress will
			continue.</para>
		</description>
		<see-also>
			<ref type="application">MeetMe</ref>
		</see-also>
	</application>
	<application name="MeetMeAdmin" language="en_US" module="app_meetme">
		<since>
			<version>1.0.0</version>
		</since>
		<synopsis>
			MeetMe conference administration.
		</synopsis>
		<syntax>
			<parameter name="confno" required="true" />
			<parameter name="command" required="true">
				<optionlist>
					<option name="e">
						<para>Eject last user that joined.</para>
					</option>
					<option name="E">
						<para>Extend conference end time, if scheduled.</para>
					</option>
					<option name="k">
						<para>Kick one user out of conference.</para>
					</option>
					<option name="K">
						<para>Kick all users out of conference.</para>
					</option>
					<option name="l">
						<para>Unlock conference.</para>
					</option>
					<option name="L">
						<para>Lock conference.</para>
					</option>
					<option name="m">
						<para>Unmute one user.</para>
					</option>
					<option name="M">
						<para>Mute one user.</para>
					</option>
					<option name="n">
						<para>Unmute all users in the conference.</para>
					</option>
					<option name="N">
						<para>Mute all non-admin users in the conference.</para>
					</option>
					<option name="r">
						<para>Reset one user's volume settings.</para>
					</option>
					<option name="R">
						<para>Reset all users volume settings.</para>
					</option>
					<option name="s">
						<para>Lower entire conference speaking volume.</para>
					</option>
					<option name="S">
						<para>Raise entire conference speaking volume.</para>
					</option>
					<option name="t">
						<para>Lower one user's talk volume.</para>
					</option>
					<option name="T">
						<para>Raise one user's talk volume.</para>
					</option>
					<option name="u">
						<para>Lower one user's listen volume.</para>
					</option>
					<option name="U">
						<para>Raise one user's listen volume.</para>
					</option>
					<option name="v">
						<para>Lower entire conference listening volume.</para>
					</option>
					<option name="V">
						<para>Raise entire conference listening volume.</para>
					</option>
				</optionlist>
			</parameter>
			<parameter name="user" />
		</syntax>
		<description>
			<para>Run admin <replaceable>command</replaceable> for conference <replaceable>confno</replaceable>.</para>
			<para>Will additionally set the variable <variable>MEETMEADMINSTATUS</variable> with one of
			the following values:</para>
			<variablelist>
				<variable name="MEETMEADMINSTATUS">
					<value name="NOPARSE">
						Invalid arguments.
					</value>
					<value name="NOTFOUND">
						User specified was not found.
					</value>
					<value name="FAILED">
						Another failure occurred.
					</value>
					<value name="OK">
						The operation was completed successfully.
					</value>
				</variable>
			</variablelist>
		</description>
		<see-also>
			<ref type="application">MeetMe</ref>
		</see-also>
	</application>
	<application name="MeetMeChannelAdmin" language="en_US" module="app_meetme">
		<since>
			<version>1.6.0</version>
		</since>
		<synopsis>
			MeetMe conference Administration (channel specific).
		</synopsis>
		<syntax>
			<parameter name="channel" required="true" />
			<parameter name="command" required="true">
				<optionlist>
					<option name="k">
						<para>Kick the specified user out of the conference he is in.</para>
					</option>
					<option name="m">
						<para>Unmute the specified user.</para>
					</option>
					<option name="M">
						<para>Mute the specified user.</para>
					</option>
				</optionlist>
			</parameter>
		</syntax>
		<description>
			<para>Run admin <replaceable>command</replaceable> for a specific
			<replaceable>channel</replaceable> in any conference.</para>
		</description>
	</application>
	<function name="MEETME_INFO" language="en_US" module="app_meetme">
		<since>
			<version>1.6.1.0</version>
		</since>
		<synopsis>
			Query a given conference of various properties.
		</synopsis>
		<syntax>
			<parameter name="keyword" required="true">
				<para>Options:</para>
				<enumlist>
					<enum name="lock">
						<para>Boolean of whether the corresponding conference is locked.</para>
					</enum>
					<enum name="parties">
						<para>Number of parties in a given conference</para>
					</enum>
					<enum name="activity">
						<para>Duration of conference in seconds.</para>
					</enum>
					<enum name="dynamic">
						<para>Boolean of whether the corresponding conference is dynamic.</para>
					</enum>
				</enumlist>
			</parameter>
			<parameter name="confno" required="true">
				<para>Conference number to retrieve information from.</para>
			</parameter>
		</syntax>
		<description />
		<see-also>
			<ref type="application">MeetMe</ref>
			<ref type="application">MeetMeCount</ref>
			<ref type="application">MeetMeAdmin</ref>
			<ref type="application">MeetMeChannelAdmin</ref>
		</see-also>
	</function>
	<manager name="MeetmeMute" language="en_US" module="app_meetme">
		<since>
			<version>1.4.0</version>
		</since>
		<synopsis>
			Mute a Meetme user.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="Meetme" required="true" />
			<parameter name="Usernum" required="true" />
		</syntax>
		<description>
		</description>
	</manager>
	<manager name="MeetmeUnmute" language="en_US" module="app_meetme">
		<since>
			<version>1.4.0</version>
		</since>
		<synopsis>
			Unmute a Meetme user.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="Meetme" required="true" />
			<parameter name="Usernum" required="true" />
		</syntax>
		<description>
		</description>
	</manager>
	<manager name="MeetmeList" language="en_US" module="app_meetme">
		<since>
			<version>1.6.0</version>
		</since>
		<synopsis>
			List participants in a conference.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="Conference" required="false">
				<para>Conference number.</para>
			</parameter>
		</syntax>
		<description>
			<para>Lists all users in a particular MeetMe conference.
			MeetmeList will follow as separate events, followed by a final event called
			MeetmeListComplete.</para>
		</description>
	</manager>
	<manager name="MeetmeListRooms" language="en_US" module="app_meetme">
		<since>
			<version>10.0.0</version>
		</since>
		<synopsis>
			List active conferences.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
		</syntax>
		<description>
			<para>Lists data about all active conferences.
				MeetmeListRooms will follow as separate events, followed by a final event called
				MeetmeListRoomsComplete.</para>
		</description>
	</manager>
	<managerEvent language="en_US" name="MeetmeJoin" module="app_meetme">
		<managerEventInstance class="EVENT_FLAG_CALL" module="app_meetme">
			<since>
				<version>12.0.0</version>
			</since>
			<synopsis>Raised when a user joins a MeetMe conference.</synopsis>
			<syntax>
				<parameter name="Meetme">
					<para>The identifier for the MeetMe conference.</para>
				</parameter>
				<parameter name="User">
					<para>The identifier of the MeetMe user who joined.</para>
				</parameter>
				<channel_snapshot/>
			</syntax>
			<see-also>
				<ref type="managerEvent">MeetmeLeave</ref>
				<ref type="application">MeetMe</ref>
			</see-also>
		</managerEventInstance>
	</managerEvent>
	<managerEvent language="en_US" name="MeetmeLeave" module="app_meetme">
		<managerEventInstance class="EVENT_FLAG_CALL" module="app_meetme">
			<since>
				<version>12.0.0</version>
			</since>
			<synopsis>Raised when a user leaves a MeetMe conference.</synopsis>
			<syntax>
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='MeetmeJoin']/managerEventInstance/syntax/parameter)" />
				<channel_snapshot/>
				<parameter name="Duration">
					<para>The length of time in seconds that the Meetme user was in the conference.</para>
				</parameter>
			</syntax>
			<see-also>
				<ref type="managerEvent">MeetmeJoin</ref>
			</see-also>
		</managerEventInstance>
	</managerEvent>
	<managerEvent language="en_US" name="MeetmeEnd" module="app_meetme">
		<managerEventInstance class="EVENT_FLAG_CALL" module="app_meetme">
			<since>
				<version>12.0.0</version>
			</since>
			<synopsis>Raised when a MeetMe conference ends.</synopsis>
			<syntax>
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='MeetmeJoin']/managerEventInstance/syntax/parameter[@name='Meetme'])" />
			</syntax>
			<see-also>
				<ref type="managerEvent">MeetmeJoin</ref>
			</see-also>
		</managerEventInstance>
	</managerEvent>
	<managerEvent language="en_US" name="MeetmeTalkRequest" module="app_meetme">
		<managerEventInstance class="EVENT_FLAG_CALL" module="app_meetme">
			<since>
				<version>12.0.0</version>
			</since>
			<synopsis>Raised when a MeetMe user has started talking.</synopsis>
			<syntax>
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='MeetmeJoin']/managerEventInstance/syntax/parameter)" />
				<channel_snapshot/>
				<parameter name="Duration">
					<para>The length of time in seconds that the Meetme user has been in the conference at the time of this event.</para>
				</parameter>
				<parameter name="Status">
					<enumlist>
						<enum name="on"/>
						<enum name="off"/>
					</enumlist>
				</parameter>
			</syntax>
		</managerEventInstance>
	</managerEvent>
	<managerEvent language="en_US" name="MeetmeTalking" module="app_meetme">
		<managerEventInstance class="EVENT_FLAG_CALL" module="app_meetme">
			<since>
				<version>12.0.0</version>
			</since>
			<synopsis>Raised when a MeetMe user begins or ends talking.</synopsis>
			<syntax>
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='MeetmeJoin']/managerEventInstance/syntax/parameter)" />
				<channel_snapshot/>
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='MeetmeTalkRequest']/managerEventInstance/syntax/parameter)" />
			</syntax>
		</managerEventInstance>
	</managerEvent>
	<managerEvent language="en_US" name="MeetmeMute" module="app_meetme">
		<managerEventInstance class="EVENT_FLAG_CALL" module="app_meetme">
			<since>
				<version>12.0.0</version>
			</since>
			<synopsis>Raised when a MeetMe user is muted or unmuted.</synopsis>
			<syntax>
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='MeetmeJoin']/managerEventInstance/syntax/parameter)" />
				<channel_snapshot/>
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='MeetmeTalkRequest']/managerEventInstance/syntax/parameter)" />
			</syntax>
		</managerEventInstance>
	</managerEvent>
	<managerEvent language="en_US" name="MeetmeList" module="app_meetme">
		<managerEventInstance class="EVENT_FLAG_CALL" module="app_meetme">
			<since>
				<version>16.29.0</version>
				<version>18.15.0</version>
				<version>19.7.0</version>
			</since>
			<synopsis>Raised in response to a MeetmeList command.</synopsis>
			<syntax>
				<parameter name="Conference">
					<para>Conference ID.</para>
				</parameter>
				<parameter name="UserNumber">
					<para>User ID.</para>
				</parameter>
				<parameter name="CallerIDNum">
					<para>Caller ID number.</para>
				</parameter>
				<parameter name="CallerIDName">
					<para>Caller ID name.</para>
				</parameter>
				<parameter name="ConnectedLineNum">
					<para>Connected Line number.</para>
				</parameter>
				<parameter name="ConnectedLineName">
					<para>Connected Line name.</para>
				</parameter>
				<parameter name="Channel">
					<para>Channel name</para>
				</parameter>
				<parameter name="Admin">
					<para>Whether or not the user is an admin.</para>
				</parameter>
				<parameter name="Role">
					<para>User role. Can be "Listen only", "Talk only", or "Talk and listen".</para>
				</parameter>
				<parameter name="MarkedUser">
					<para>Whether or not the user is a marked user.</para>
				</parameter>
				<parameter name="Muted">
					<para>Whether or not the user is currently muted.</para>
				</parameter>
				<parameter name="Talking">
					<para>Whether or not the user is currently talking.</para>
				</parameter>
			</syntax>
			<see-also>
				<ref type="manager">MeetmeList</ref>
				<ref type="application">MeetMe</ref>
			</see-also>
		</managerEventInstance>
	</managerEvent>
	<managerEvent language="en_US" name="MeetmeListRooms" module="app_meetme">
		<managerEventInstance class="EVENT_FLAG_CALL" module="app_meetme">
			<since>
				<version>16.29.0</version>
				<version>18.15.0</version>
				<version>19.7.0</version>
			</since>
			<synopsis>Raised in response to a MeetmeListRooms command.</synopsis>
			<syntax>
				<parameter name="Conference">
					<para>Conference ID.</para>
				</parameter>
				<parameter name="Parties">
					<para>Number of parties in the conference.</para>
				</parameter>
				<parameter name="Marked">
					<para>Number of marked users in the conference.</para>
				</parameter>
				<parameter name="Activity">
					<para>Total duration of conference in HH:MM:SS format.</para>
				</parameter>
				<parameter name="Creation">
					<para>How the conference was created: "Dynamic" or "Static".</para>
				</parameter>
				<parameter name="Locked">
					<para>Whether or not the conference is locked.</para>
				</parameter>
			</syntax>
			<see-also>
				<ref type="manager">MeetmeListRooms</ref>
				<ref type="application">MeetMe</ref>
			</see-also>
		</managerEventInstance>
	</managerEvent>
<module language="en_US" name="app_mf">
	<support_level>extended</support_level>
</module>
	<application name="ReceiveMF" language="en_US" module="app_mf">
		<since>
			<version>16.24.0</version>
			<version>18.10.0</version>
		</since>
		<synopsis>
			Detects MF digits on a channel and saves them to a variable.
		</synopsis>
		<syntax>
			<parameter name="variable" required="true">
				<para>The input digits will be stored in the given
				<replaceable>variable</replaceable> name.</para>
			</parameter>
			<parameter name="timeout">
				<para>The number of seconds to wait for all digits, if greater
				than <literal>0</literal>. Can be floating point. Default
				is no timeout.</para>
			</parameter>
			<parameter name="options">
				<optionlist>
					<option name="d">
						<para>Delay audio by a frame to try to extra quelch.</para>
					</option>
					<option name="l">
						<para>Receive digits even if a key pulse (KP) has not yet
						been received. By default, this application will ignore
						all other digits until a KP has been received.</para>
					</option>
					<option name="k">
						<para>Do not return a character for the KP digit.</para>
					</option>
					<option name="m">
						<para>Mute conference.</para>
					</option>
					<option name="n">
						<para>Maximum number of digits, regardless of the sequence.</para>
					</option>
					<option name="o">
						<para>Enable override. Repeated KPs will clear all previous digits.</para>
					</option>
					<option name="q">
						<para>Quelch MF from in-band.</para>
					</option>
					<option name="r">
						<para>"Radio" mode (relaxed MF).</para>
					</option>
					<option name="s">
						<para>Do not return a character for ST digits.</para>
					</option>
				</optionlist>
			</parameter>
		</syntax>
		<description>
			<para>Reads a ST, STP, ST2P, or ST3P-terminated string of MF digits from
			the user in to the given <replaceable>variable</replaceable>.</para>
			<para>This application does not automatically answer the channel and
			should be preceded with <literal>Answer</literal> or
			<literal>Progress</literal> as needed.</para>
			<variablelist>
				<variable name="RECEIVEMFSTATUS">
					<para>This is the status of the read operation.</para>
					<value name="START" />
					<value name="ERROR" />
					<value name="HANGUP" />
					<value name="MAXDIGITS" />
					<value name="TIMEOUT" />
				</variable>
			</variablelist>
		</description>
		<see-also>
			<ref type="application">Read</ref>
			<ref type="application">SendMF</ref>
			<ref type="application">ReceiveSF</ref>
		</see-also>
	</application>
	<application name="SendMF" language="en_US" module="app_mf">
		<since>
			<version>16.21.0</version>
			<version>18.7.0</version>
		</since>
		<synopsis>
			Sends arbitrary MF digits on the current or specified channel.
		</synopsis>
		<syntax>
			<parameter name="digits" required="true">
				<para>List of digits 0-9,*#ABC to send; w for a half-second pause,
				also f or F for a flash-hook if the channel supports flash-hook,
				h or H for 250 ms of 2600 Hz,
				and W for a wink if the channel supports wink.</para>
				<para>Key pulse and start digits are not included automatically.
				* is used for KP, # for ST, A for STP, B for ST2P, and C for ST3P.</para>
			</parameter>
			<parameter name="timeout_ms" required="false">
				<para>Amount of time to wait in ms between tones. (defaults to 50ms).</para>
			</parameter>
			<parameter name="duration_ms" required="false">
				<para>Duration of each numeric digit (defaults to 55ms).</para>
			</parameter>
			<parameter name="duration_ms_kp" required="false">
				<para>Duration of KP digits (defaults to 120ms).</para>
			</parameter>
			<parameter name="duration_ms_st" required="false">
				<para>Duration of ST, STP, ST2P, and ST3P digits (defaults to 65ms).</para>
			</parameter>
			<parameter name="channel" required="false">
				<para>Channel where digits will be played</para>
			</parameter>
		</syntax>
		<description>
			<para>It will send all digits or terminate if it encounters an error.</para>
		</description>
		<see-also>
			<ref type="application">ReceiveMF</ref>
			<ref type="application">SendSF</ref>
			<ref type="application">SendDTMF</ref>
		</see-also>
	</application>
	<manager name="PlayMF" language="en_US" module="app_mf">
		<since>
			<version>16.21.0</version>
			<version>18.7.0</version>
			<version>19.0.0</version>
		</since>
		<synopsis>
			Play MF digit on a specific channel.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="Channel" required="true">
				<para>Channel name to send digit to.</para>
			</parameter>
			<parameter name="Digit" required="true">
				<para>The MF digit to play.</para>
			</parameter>
			<parameter name="Duration" required="false">
				<para>The duration, in milliseconds, of the digit to be played.</para>
			</parameter>
		</syntax>
		<description>
			<para>Plays an MF digit on the specified channel.</para>
		</description>
	</manager>
<module language="en_US" name="app_milliwatt">
	<support_level>core</support_level>
</module>
	<application name="Milliwatt" language="en_US" module="app_milliwatt">
		<since>
			<version>0.1.12</version>
		</since>
		<synopsis>
			Generates a 1004 Hz test tone at 0dbm (mu-law).
		</synopsis>
		<syntax>
			<parameter name="options">
				<optionlist>
					<option name="m">
						<para>Generate a 1004 Hz Milliwatt test tone at 0dbm, with a
						1 second silent interval. This option must be specified
						if you are using this for a milliwatt test line.</para>
					</option>
					<option name="o">
						<para>Generate a constant tone at 1000 Hz like previous version.</para>
					</option>
				</optionlist>
			</parameter>
		</syntax>
		<description>
			<para>Generates a 1004 Hz test tone.</para>
			<para>By default, this application does not provide a Milliwatt test tone. It simply
			plays a 1004 Hz tone, which is not suitable for performing a milliwatt test.
			The <literal>m</literal> option should be used so that a real Milliwatt test tone
			is provided. This will include a 1 second silent interval every 10 seconds.</para>
			<para>Previous versions of this application generated a constant tone at 1000 Hz. If for
			some reason you would prefer that behavior, supply the <literal>o</literal> option to get the
			old behavior.</para>
		</description>
	</application>
<module language="en_US" name="app_minivm">
	<support_level>extended</support_level>
</module>
<application name="MinivmRecord" language="en_US" module="app_minivm">
    <since>
    	<version>1.6.1.0</version>
    </since>
	<synopsis>
		Receive Mini-Voicemail and forward via e-mail.
	</synopsis>
	<syntax>
		<parameter name="mailbox" required="true" argsep="@">
			<argument name="username" required="true">
				<para>Voicemail username</para>
			</argument>
			<argument name="domain" required="true">
				<para>Voicemail domain</para>
			</argument>
		</parameter>
		<parameter name="options" required="false">
			<optionlist>
				<option name="0">
					<para>Jump to the <literal>o</literal> extension in the current dialplan context.</para>
				</option>
				<option name="*">
					<para>Jump to the <literal>a</literal> extension in the current dialplan context.</para>
				</option>
				<option name="g">
					<argument name="gain">
						<para>Amount of gain to use</para>
					</argument>
					<para>Use the specified amount of gain when recording the voicemail message.
					The units are whole-number decibels (dB).</para>
				</option>
			</optionlist>
		</parameter>
	</syntax>
	<description>
		<para>This application is part of the Mini-Voicemail system, configured in <filename>minivm.conf</filename></para>
		<para>MiniVM records audio file in configured format and forwards message to e-mail and pager.</para>
		<para>If there's no user account for that address, a temporary account will be used with default options.</para>
		<para>The recorded file name and path will be stored in <variable>MVM_FILENAME</variable> and the duration
		of the message will be stored in <variable>MVM_DURATION</variable></para>
		<note><para>If the caller hangs up after the recording, the only way to send the message and clean up is to
		execute in the <literal>h</literal> extension. The application will exit if any of the following DTMF digits
		are received and the requested extension exist in the current context.</para></note>
		<variablelist>
			<variable name="MVM_RECORD_STATUS">
				<para>This is the status of the record operation</para>
				<value name="SUCCESS" />
				<value name="USEREXIT" />
				<value name="FAILED" />
			</variable>
		</variablelist>
	</description>
</application>
<application name="MinivmGreet" language="en_US" module="app_minivm">
    <since>
    	<version>1.6.1.0</version>
    </since>
	<synopsis>
		Play Mini-Voicemail prompts.
	</synopsis>
	<syntax>
		<parameter name="mailbox" required="true" argsep="@">
			<argument name="username" required="true">
				<para>Voicemail username</para>
			</argument>
			<argument name="domain" required="true">
				<para>Voicemail domain</para>
			</argument>
		</parameter>
		<parameter name="options" required="false">
			<optionlist>
				<option name="b">
					<para>Play the <literal>busy</literal> greeting to the calling party.</para>
				</option>
				<option name="s">
					<para>Skip the playback of instructions for leaving a message to the calling party.</para>
				</option>
				<option name="u">
					<para>Play the <literal>unavailable</literal> greeting.</para>
				</option>
			</optionlist>
		</parameter>
	</syntax>
	<description>
		<para>This application is part of the Mini-Voicemail system, configured in minivm.conf.</para>
		<para>MinivmGreet() plays default prompts or user specific prompts for an account.</para>
		<para>Busy and unavailable messages can be chosen, but will be overridden if a temporary
		message exists for the account.</para>
		<variablelist>
			<variable name="MVM_GREET_STATUS">
				<para>This is the status of the greeting playback.</para>
				<value name="SUCCESS" />
				<value name="USEREXIT" />
				<value name="FAILED" />
			</variable>
		</variablelist>
	</description>
</application>
<application name="MinivmNotify" language="en_US" module="app_minivm">
    <since>
    	<version>1.6.1.0</version>
    </since>
	<synopsis>
		Notify voicemail owner about new messages.
	</synopsis>
	<syntax>
		<parameter name="mailbox" required="true" argsep="@">
			<argument name="username" required="true">
				<para>Voicemail username</para>
			</argument>
			<argument name="domain" required="true">
				<para>Voicemail domain</para>
			</argument>
		</parameter>
		<parameter name="options" required="false">
			<optionlist>
				<option name="template">
					<para>E-mail template to use for voicemail notification</para>
				</option>
			</optionlist>
		</parameter>
	</syntax>
	<description>
		<para>This application is part of the Mini-Voicemail system, configured in minivm.conf.</para>
		<para>MiniVMnotify forwards messages about new voicemail to e-mail and pager. If there's no user
		account for that address, a temporary account will be used with default options (set in
		<filename>minivm.conf</filename>).</para>
		<para>If the channel variable <variable>MVM_COUNTER</variable> is set, this will be used in the message
		file name and available in the template for the message.</para>
		<para>If no template is given, the default email template will be used to send email and default pager
		template to send paging message (if the user account is configured with a paging address.</para>
		<variablelist>
			<variable name="MVM_NOTIFY_STATUS">
				<para>This is the status of the notification attempt</para>
				<value name="SUCCESS" />
				<value name="FAILED" />
			</variable>
		</variablelist>
	</description>
</application>
<application name="MinivmDelete" language="en_US" module="app_minivm">
    <since>
    	<version>1.6.1.0</version>
    </since>
	<synopsis>
		Delete Mini-Voicemail voicemail messages.
	</synopsis>
	<syntax>
		<parameter name="filename" required="true">
			<para>File to delete</para>
		</parameter>
	</syntax>
	<description>
		<para>This application is part of the Mini-Voicemail system, configured in <filename>minivm.conf</filename>.</para>
		<para>It deletes voicemail file set in MVM_FILENAME or given filename.</para>
		<variablelist>
			<variable name="MVM_DELETE_STATUS">
				<para>This is the status of the delete operation.</para>
				<value name="SUCCESS" />
				<value name="FAILED" />
			</variable>
		</variablelist>
	</description>
</application>

<application name="MinivmAccMess" language="en_US" module="app_minivm">
    <since>
    	<version>1.6.1.0</version>
    </since>
	<synopsis>
		Record account specific messages.
	</synopsis>
	<syntax>
		<parameter name="mailbox" required="true" argsep="@">
			<argument name="username" required="true">
				<para>Voicemail username</para>
			</argument>
			<argument name="domain" required="true">
				<para>Voicemail domain</para>
			</argument>
		</parameter>
		<parameter name="options" required="false">
			<optionlist>
				<option name="u">
					<para>Record the <literal>unavailable</literal> greeting.</para>
				</option>
				<option name="b">
					<para>Record the <literal>busy</literal> greeting.</para>
				</option>
				<option name="t">
					<para>Record the temporary greeting.</para>
				</option>
				<option name="n">
					<para>Account name.</para>
				</option>
			</optionlist>
		</parameter>
	</syntax>
	<description>
		<para>This application is part of the Mini-Voicemail system, configured in <filename>minivm.conf</filename>.</para>
		<para>Use this application to record account specific audio/video messages for busy, unavailable
		and temporary messages.</para>
		<para>Account specific directories will be created if they do not exist.</para>
		<variablelist>
			<variable name="MVM_ACCMESS_STATUS">
				<para>This is the result of the attempt to record the specified greeting.</para>
				<para><literal>FAILED</literal> is set if the file can't be created.</para>
				<value name="SUCCESS" />
				<value name="FAILED" />
			</variable>
		</variablelist>
	</description>
</application>
<application name="MinivmMWI" language="en_US" module="app_minivm">
    <since>
    	<version>1.6.1.0</version>
    </since>
	<synopsis>
		Send Message Waiting Notification to subscriber(s) of mailbox.
	</synopsis>
	<syntax>
		<parameter name="mailbox" required="true" argsep="@">
			<argument name="username" required="true">
				<para>Voicemail username</para>
			</argument>
			<argument name="domain" required="true">
				<para>Voicemail domain</para>
			</argument>
		</parameter>
		<parameter name="urgent" required="true">
			<para>Number of urgent messages in mailbox.</para>
		</parameter>
		<parameter name="new" required="true">
			<para>Number of new messages in mailbox.</para>
		</parameter>
		<parameter name="old" required="true">
			<para>Number of old messages in mailbox.</para>
		</parameter>
	</syntax>
	<description>
		<para>This application is part of the Mini-Voicemail system, configured in <filename>minivm.conf</filename>.</para>
		<para>MinivmMWI is used to send message waiting indication to any devices whose channels have
		subscribed to the mailbox passed in the first parameter.</para>
	</description>
</application>
<function name="MINIVMCOUNTER" language="en_US" module="app_minivm">
    <since>
    	<version>1.6.0</version>
    </since>
	<synopsis>
		Reads or sets counters for MiniVoicemail message.
	</synopsis>
	<syntax argsep=":">
		<parameter name="account" required="true">
			<para>If account is given and it exists, the counter is specific for the account.</para>
			<para>If account is a domain and the domain directory exists, counters are specific for a domain.</para>
		</parameter>
		<parameter name="name" required="true">
			<para>The name of the counter is a string, up to 10 characters.</para>
		</parameter>
		<parameter name="operand">
			<para>The counters never goes below zero. Valid operands for changing the value of a counter when assigning a value are:</para>
			<enumlist>
				<enum name="i"><para>Increment by value.</para></enum>
				<enum name="d"><para>Decrement by value.</para></enum>
				<enum name="s"><para>Set to value.</para></enum>
			</enumlist>
		</parameter>
	</syntax>
	<description>
		<para>The operation is atomic and the counter is locked while changing the value. The counters are stored as text files in the minivm account directories. It might be better to use realtime functions if you are using a database to operate your Asterisk.</para>
	</description>
	<see-also>
		<ref type="application">MinivmRecord</ref>
		<ref type="application">MinivmGreet</ref>
		<ref type="application">MinivmNotify</ref>
		<ref type="application">MinivmDelete</ref>
		<ref type="application">MinivmAccMess</ref>
		<ref type="application">MinivmMWI</ref>
		<ref type="function">MINIVMACCOUNT</ref>
	</see-also>
</function>
<function name="MINIVMACCOUNT" language="en_US" module="app_minivm">
    <since>
    	<version>1.6.0</version>
    </since>
	<synopsis>
		Gets MiniVoicemail account information.
	</synopsis>
	<syntax argsep=":">
		<parameter name="account" required="true" />
		<parameter name="item" required="true">
			<para>Valid items are:</para>
			<enumlist>
				<enum name="path">
					<para>Path to account mailbox (if account exists, otherwise temporary mailbox).</para>
				</enum>
				<enum name="hasaccount">
					<para>1 is static Minivm account exists, 0 otherwise.</para>
				</enum>
				<enum name="fullname">
					<para>Full name of account owner.</para>
				</enum>
				<enum name="email">
					<para>Email address used for account.</para>
				</enum>
				<enum name="etemplate">
					<para>Email template for account (default template if none is configured).</para>
				</enum>
				<enum name="ptemplate">
					<para>Pager template for account (default template if none is configured).</para>
				</enum>
				<enum name="accountcode">
					<para>Account code for the voicemail account.</para>
				</enum>
				<enum name="pincode">
					<para>Pin code for voicemail account.</para>
				</enum>
				<enum name="timezone">
					<para>Time zone for voicemail account.</para>
				</enum>
				<enum name="language">
					<para>Language for voicemail account.</para>
				</enum>
				<enum name="&lt;channel variable name&gt;">
					<para>Channel variable value (set in configuration for account).</para>
				</enum>
			</enumlist>
		</parameter>
	</syntax>
	<description>
		<para />
	</description>
	<see-also>
		<ref type="application">MinivmRecord</ref>
		<ref type="application">MinivmGreet</ref>
		<ref type="application">MinivmNotify</ref>
		<ref type="application">MinivmDelete</ref>
		<ref type="application">MinivmAccMess</ref>
		<ref type="application">MinivmMWI</ref>
		<ref type="function">MINIVMCOUNTER</ref>
	</see-also>
</function>
	<managerEvent language="en_US" name="MiniVoiceMail" module="app_minivm">
		<managerEventInstance class="EVENT_FLAG_CALL" module="app_minivm">
			<since>
				<version>12.0.0</version>
			</since>
			<synopsis>Raised when a notification is sent out by a MiniVoiceMail application</synopsis>
			<syntax>
				<channel_snapshot/>
				<parameter name="Action">
					<para>What action was taken. Currently, this will always be <literal>SentNotification</literal></para>
				</parameter>
				<parameter name="Mailbox">
					<para>The mailbox that the notification was about, specified as <literal>mailbox</literal>@<literal>context</literal></para>
				</parameter>
				<parameter name="Counter">
					<para>A message counter derived from the <literal>MVM_COUNTER</literal> channel variable.</para>
				</parameter>
			</syntax>
		</managerEventInstance>
	</managerEvent>
<module language="en_US" name="app_mixmonitor">
	<use type="module">func_periodic_hook</use>
	<support_level>core</support_level>
</module>
	<application name="MixMonitor" language="en_US" module="app_mixmonitor">
		<since>
			<version>1.2.0</version>
		</since>
		<synopsis>
			Record a call and mix the audio during the recording.  Use of StopMixMonitor is required
			to guarantee the audio file is available for processing during dialplan execution.
		</synopsis>
		<syntax>
			<parameter name="file" required="true" argsep=".">
				<argument name="filename" required="true">
					<para>If <replaceable>filename</replaceable> is an absolute path, uses that path, otherwise
					creates the file in the configured monitoring directory from <filename>asterisk.conf.</filename></para>
				</argument>
				<argument name="extension" required="true" />
			</parameter>
			<parameter name="options">
				<optionlist>
					<option name="a">
						<para>Append to the file instead of overwriting it.</para>
					</option>
					<option name="b">
						<para>Only save audio to the file while the channel is bridged.</para>
						<note><para>If you utilize this option inside a Local channel, you must make sure the Local
						channel is not optimized away. To do this, be sure to call your Local channel with the
						<literal>/n</literal> option. For example: Dial(Local/start@mycontext/n)</para></note>
					</option>
					<option name="B">
						<para>Play a periodic beep while this call is being recorded.</para>
						<argument name="interval"><para>Interval, in seconds. Default is 15.</para></argument>
					</option>
					<option name="c">
						<para>Use the real Caller ID from the channel for the voicemail Caller ID.</para>
						<para>By default, the Connected Line is used. If you want the channel caller's
						real number, you may need to specify this option.</para>
					</option>
					<option name="d">
						<para>Delete the recording file as soon as MixMonitor is done with it.</para>
						<para>For example, if you use the m option to dispatch the recording to a voicemail box,
						you can specify this option to delete the original copy of it afterwards.</para>
					</option>
					<option name="v">
						<para>Adjust the <emphasis>heard</emphasis> volume by a factor of <replaceable>x</replaceable>
						(range <literal>-4</literal> to <literal>4</literal>)</para>
						<argument name="x" required="true" />
					</option>
					<option name="V">
						<para>Adjust the <emphasis>spoken</emphasis> volume by a factor
						of <replaceable>x</replaceable> (range <literal>-4</literal> to <literal>4</literal>)</para>
						<argument name="x" required="true" />
					</option>
					<option name="W">
						<para>Adjust both, <emphasis>heard and spoken</emphasis> volumes by a factor
						of <replaceable>x</replaceable> (range <literal>-4</literal> to <literal>4</literal>)</para>
						<argument name="x" required="true" />
					</option>
					<option name="r">
						<argument name="file" required="true" />
						<para>Use the specified file to record the <emphasis>receive</emphasis> audio feed.
						Like with the basic filename argument, if an absolute path isn't given, it will create
						the file in the configured monitoring directory.</para>
					</option>
					<option name="t">
						<argument name="file" required="true" />
						<para>Use the specified file to record the <emphasis>transmit</emphasis> audio feed.
						Like with the basic filename argument, if an absolute path isn't given, it will create
						the file in the configured monitoring directory.</para>
					</option>
					<option name="D">
						<para>Interleave the audio coming from the channel and the audio
						going to the channel and output it as a 2 channel (stereo)
						raw stream rather than mixing it. You must use the
						<literal>.raw</literal> file extension. Any other extension
						will produce a corrupted file.</para>
					</option>
					<option name="n">
						<para>When the <replaceable>r</replaceable> or <replaceable>t</replaceable> option is
						used, MixMonitor will insert silence into the specified files to maintain
						synchronization between them. Use this option to disable that behavior.</para>
					</option>
					<option name="i">
						<argument name="chanvar" required="true" />
						<para>Stores the MixMonitor's ID on this channel variable.</para>
					</option>
					<option name="p">
						<para>Play a beep on the channel that starts the recording.</para>
					</option>
					<option name="P">
						<para>Play a beep on the channel that stops the recording.</para>
					</option>
					<option name="m">
						<argument name="mailbox" required="true" />
						<para>Create a copy of the recording as a voicemail in the indicated <emphasis>mailbox</emphasis>(es)
						separated by commas eg. m(1111@default,2222@default,...).  Folders can be optionally specified using
						the syntax: mailbox@context/folder</para>
					</option>
					<option name="s">
						<argument name="seconds" required="true" />
						<para>Don't record until <replaceable>seconds</replaceable> (can be fractional) have elapsed since MixMonitor was invoked.
						No audio is written to the recording file during this time. If the call ends before this period,
						no audio will be saved. This can be useful to avoid recording announcements,
						ringback tones, or other non-essential early audio.</para>
					</option>
				</optionlist>
			</parameter>
			<parameter name="command">
				<para>Will be executed when the recording is over.</para>
				<para>Any strings matching <literal>^{X}</literal> will be unescaped to <variable>X</variable>.</para>
				<para>All variables will be evaluated at the time MixMonitor is called.</para>
				<warning><para>Do not use untrusted strings such as <variable>CALLERID(num)</variable>
				or <variable>CALLERID(name)</variable> as part of the command parameters.  You
				risk a command injection attack executing arbitrary commands if the untrusted
				strings aren't filtered to remove dangerous characters.  See function
				<variable>FILTER()</variable>.</para></warning>
			</parameter>
		</syntax>
		<description>
			<para>Records the audio on the current channel to the specified file.</para>
			<para>This application does not automatically answer and should be preceded by
			an application such as Answer or Progress().</para>
			<note><para>MixMonitor runs as an audiohook.</para></note>
			<note><para>If a filename passed to MixMonitor ends with
			<literal>.wav49</literal>, Asterisk will silently convert the extension to
			<literal>.WAV</literal> for legacy reasons. <variable>MIXMONITOR_FILENAME</variable>
			will contain the actual filename that Asterisk is writing to, not necessarily the
			value that was passed in.</para></note>
			<variablelist>
				<variable name="MIXMONITOR_FILENAME">
					<para>Will contain the filename used to record.</para>
				</variable>
			</variablelist>
			<warning><para>Do not use untrusted strings such as <variable>CALLERID(num)</variable>
			or <variable>CALLERID(name)</variable> as part of ANY of the application's
			parameters.  You risk a command injection attack executing arbitrary commands
			if the untrusted strings aren't filtered to remove dangerous characters.  See
			function <variable>FILTER()</variable>.</para></warning>
			<warning><para>When using the <literal>D</literal> option to save
			interleaved audio, you MUST use <literal>.raw</literal> as the
			file extension.  Any other extension will produce a corrupted file.</para></warning>
		</description>
		<see-also>
			<ref type="application">StopMixMonitor</ref>
		</see-also>
	</application>
	<application name="StopMixMonitor" language="en_US" module="app_mixmonitor">
		<since>
			<version>1.4.0</version>
		</since>
		<synopsis>
			Stop recording a call through MixMonitor, and free the recording's file handle.
		</synopsis>
		<syntax>
			<parameter name="MixMonitorID" required="false">
				<para>If a valid ID is provided, then this command will stop only that specific
				MixMonitor.</para>
			</parameter>
		</syntax>
		<description>
			<para>Stops the audio recording that was started with a call to <literal>MixMonitor()</literal>
			on the current channel.</para>
		</description>
		<see-also>
			<ref type="application">MixMonitor</ref>
		</see-also>
	</application>
	<manager name="MixMonitorMute" language="en_US" module="app_mixmonitor">
		<since>
			<version>1.8.0</version>
		</since>
		<synopsis>
			Mute / unMute a Mixmonitor recording.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="Channel" required="true">
				<para>Used to specify the channel to mute.</para>
			</parameter>
			<parameter name="Direction">
				<para>Which part of the recording to mute:  read, write or both (from channel, to channel or both channels).</para>
			</parameter>
			<parameter name="State">
				<para>Turn mute on or off : 1 to turn on, 0 to turn off.</para>
			</parameter>
		</syntax>
		<description>
			<para>This action may be used to mute a MixMonitor recording.</para>
		</description>
	</manager>
	<manager name="MixMonitor" language="en_US" module="app_mixmonitor">
		<since>
			<version>11.0.0</version>
		</since>
		<synopsis>
			Record a call and mix the audio during the recording.  Use of StopMixMonitor is required
			to guarantee the audio file is available for processing during dialplan execution.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="Channel" required="true">
				<para>Used to specify the channel to record.</para>
			</parameter>
			<parameter name="File">
				<para>Is the name of the file created in the monitor spool directory.
				Defaults to the same name as the channel (with slashes replaced with dashes).
				This argument is optional if you specify to record unidirectional audio with
				either the r(filename) or t(filename) options in the options field. If
				neither MIXMONITOR_FILENAME or this parameter is set, the mixed stream won't
				be recorded.</para>
			</parameter>
			<parameter name="Options">
				<para>Options that apply to the MixMonitor in the same way as they
				would apply if invoked from the MixMonitor application. For a list of
				available options, see the documentation for the mixmonitor application. </para>
			</parameter>
			<parameter name="Command">
				<para>Will be executed when the recording is over.
				Any strings matching <literal>^{X}</literal> will be unescaped to <variable>X</variable>.
				All variables will be evaluated at the time MixMonitor is called.</para>
				<warning><para>Do not use untrusted strings such as <variable>CALLERID(num)</variable>
				or <variable>CALLERID(name)</variable> as part of the command parameters.  You
				risk a command injection attack executing arbitrary commands if the untrusted
				strings aren't filtered to remove dangerous characters.  See function
				<variable>FILTER()</variable>.</para></warning>
			</parameter>
		</syntax>
		<description>
			<para>This action records the audio on the current channel to the specified file.</para>
			<variablelist>
				<variable name="MIXMONITOR_FILENAME">
					<para>Will contain the filename used to record the mixed stream.</para>
				</variable>
			</variablelist>
		</description>
	</manager>
	<manager name="StopMixMonitor" language="en_US" module="app_mixmonitor">
		<since>
			<version>11.0.0</version>
		</since>
		<synopsis>
			Stop recording a call through MixMonitor, and free the recording's file handle.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="Channel" required="true">
				<para>The name of the channel monitored.</para>
			</parameter>
			<parameter name="MixMonitorID" required="false">
				<para>If a valid ID is provided, then this command will stop only that specific
				MixMonitor.</para>
			</parameter>
		</syntax>
		<description>
			<para>This action stops the audio recording that was started with the <literal>MixMonitor</literal>
			action on the current channel.</para>
		</description>
	</manager>
	<function name="MIXMONITOR" language="en_US" module="app_mixmonitor">
		<since>
			<version>13.0.0</version>
		</since>
		<synopsis>
			Retrieve data pertaining to specific instances of MixMonitor on a channel.
		</synopsis>
		<syntax>
			<parameter name="id" required="true">
				<para>The unique ID of the MixMonitor instance. The unique ID can be retrieved through the channel
				variable used as an argument to the <replaceable>i</replaceable> option to MixMonitor.</para>
			</parameter>
			<parameter name="key" required="true">
				<para>The piece of data to retrieve from the MixMonitor.</para>
				<enumlist>
					<enum name="filename" />
				</enumlist>
			</parameter>
		</syntax>
	</function>
	<managerEvent language="en_US" name="MixMonitorStart" module="app_mixmonitor">
		<managerEventInstance class="EVENT_FLAG_CALL" module="app_mixmonitor">
			<since>
				<version>16.17.0</version>
				<version>18.3.0</version>
			</since>
			<synopsis>Raised when monitoring has started on a channel.</synopsis>
			<syntax>
				<channel_snapshot/>
			</syntax>
			<see-also>
				<ref type="managerEvent">MixMonitorStop</ref>
				<ref type="application">MixMonitor</ref>
				<ref type="manager">MixMonitor</ref>
			</see-also>
		</managerEventInstance>
	</managerEvent>
	<managerEvent language="en_US" name="MixMonitorStop" module="app_mixmonitor">
		<managerEventInstance class="EVENT_FLAG_CALL" module="app_mixmonitor">
			<since>
				<version>16.17.0</version>
				<version>18.3.0</version>
			</since>
		<synopsis>Raised when monitoring has stopped on a channel.</synopsis>
		<syntax>
			<channel_snapshot/>
		</syntax>
		<see-also>
			<ref type="managerEvent">MixMonitorStart</ref>
			<ref type="application">StopMixMonitor</ref>
			<ref type="manager">StopMixMonitor</ref>
		</see-also>
		</managerEventInstance>
	</managerEvent>
	<managerEvent language="en_US" name="MixMonitorMute" module="app_mixmonitor">
		<managerEventInstance class="EVENT_FLAG_CALL" module="app_mixmonitor">
			<since>
				<version>16.17.0</version>
				<version>18.3.0</version>
			</since>
		<synopsis>Raised when monitoring is muted or unmuted on a channel.</synopsis>
		<syntax>
			<channel_snapshot/>
			<parameter name="Direction">
				<para>Which part of the recording was muted or unmuted: read, write or both
				(from channel, to channel or both directions).</para>
			</parameter>
			<parameter name="State">
				<para>If the monitoring was muted or unmuted: 1 when muted, 0 when unmuted.</para>
			</parameter>
		</syntax>
		<see-also>
			<ref type="manager">MixMonitorMute</ref>
		</see-also>
		</managerEventInstance>
	</managerEvent>


<module language="en_US" name="app_morsecode">
	<support_level>extended</support_level>
</module>
	<application name="Morsecode" language="en_US" module="app_morsecode">
		<since>
			<version>1.4.0</version>
		</since>
		<synopsis>
			Plays morse code.
		</synopsis>
		<syntax>
			<parameter name="string" required="true">
				<para>String to playback as morse code to channel</para>
			</parameter>
		</syntax>
		<description>
			<para>Plays the Morse code equivalent of the passed string.</para>
			<para>This application does not automatically answer and should be preceded by
			an application such as Answer() or Progress().</para>
			<para>This application uses the following variables:</para>
			<variablelist>
				<variable name="MORSEDITLEN">
					<para>Use this value in (ms) for length of dit</para>
				</variable>
				<variable name="MORSETONE">
					<para>The pitch of the tone in (Hz), default is 800</para>
				</variable>
				<variable name="MORSESPACETONE">
					<para>The pitch of the spaces in (Hz), default is 0</para>
				</variable>
				<variable name="MORSETYPE">
					<para>The code type to use (AMERICAN for standard American Morse
					or INTERNATIONAL for international code.
					Default is INTERNATIONAL).</para>
				</variable>
			</variablelist>
		</description>
		<see-also>
			<ref type="application">SayAlpha</ref>
			<ref type="application">SayPhonetic</ref>
		</see-also>
	</application>
<module language="en_US" name="app_mp3">
	<support_level>extended</support_level>
</module>
	<application name="MP3Player" language="en_US" module="app_mp3">
		<since>
			<version>0.1.0</version>
		</since>
		<synopsis>
			Play an MP3 file or M3U playlist file or stream.
		</synopsis>
		<syntax>
			<parameter name="Location" required="true">
				<para>Location of the file to be played.
				(argument passed to mpg123)</para>
			</parameter>
		</syntax>
		<description>
			<para>Executes mpg123 to play the given location, which typically would be a mp3 filename
			or m3u playlist filename or a URL. Please read https://en.wikipedia.org/wiki/M3U
			to see what the M3U playlist file format is like.</para>
			<para>Note that mpg123 does not support HTTPS, so use HTTP for web streams.</para>
			<para>User can exit by pressing any key on the dialpad, or by hanging up.</para>
			<example title="Play an MP3 playlist">
			exten => 1234,1,MP3Player(/var/lib/asterisk/playlist.m3u)
			</example>
			<para>This application does not automatically answer and should be preceded by an
			application such as Answer() or Progress().</para>
		</description>
	</application>

<module language="en_US" name="app_originate">
	<support_level>core</support_level>
</module>
	<application name="Originate" language="en_US" module="app_originate">
		<since>
			<version>1.6.1.0</version>
		</since>
		<synopsis>
			Originate a call.
		</synopsis>
		<syntax>
			<parameter name="tech_data" required="true">
				<para>Channel technology and data for creating the outbound channel.
                      For example, SIP/1234.</para>
			</parameter>
			<parameter name="type" required="true">
				<para>This should be <literal>app</literal> or <literal>exten</literal>, depending on whether the outbound channel should be connected to an application or extension.</para>
			</parameter>
			<parameter name="arg1" required="true">
				<para>If the type is <literal>app</literal>, then this is the application name.  If the type is <literal>exten</literal>, then this is the context that the channel will be sent to.</para>
			</parameter>
			<parameter name="arg2" required="false">
				<para>If the type is <literal>app</literal>, then this is the data passed as arguments to the application.  If the type is <literal>exten</literal>, then this is the extension that the channel will be sent to.</para>
			</parameter>
			<parameter name="arg3" required="false">
				<para>If the type is <literal>exten</literal>, then this is the priority that the channel is sent to.  If the type is <literal>app</literal>, then this parameter is ignored.</para>
			</parameter>
			<parameter name="timeout" required="false">
				<para>Timeout in seconds. Default is 30 seconds.</para>
			</parameter>
			<parameter name="options" required="false">
				<optionlist>
				<option name="a">
					<para>Originate asynchronously.  In other words, continue in the dialplan
					without waiting for the originated channel to answer.</para>
				</option>
				<option name="b" argsep="^">
					<para>Before originating the outgoing call, Gosub to the specified
					location using the newly created channel.</para>
					<argument name="context" required="false" />
					<argument name="exten" required="false" />
					<argument name="priority" required="true" hasparams="optional" argsep="^">
						<argument name="arg1" multiple="true" required="true" />
						<argument name="argN" />
					</argument>
				</option>
				<option name="B" argsep="^">
					<para>Before originating the outgoing call, Gosub to the specified
					location using the current channel.</para>
					<argument name="context" required="false" />
					<argument name="exten" required="false" />
					<argument name="priority" required="true" hasparams="optional" argsep="^">
						<argument name="arg1" multiple="true" required="true" />
						<argument name="argN" />
					</argument>
				</option>
				<option name="C">
					<para>Comma-separated list of codecs to use for this call.
					Default is <literal>slin</literal>.</para>
				</option>
				<option name="c">
					<para>The caller ID number to use for the called channel. Default is
					the current channel's Caller ID number.</para>
				</option>
				<option name="n">
					<para>The caller ID name to use for the called channel. Default is
					the current channel's Caller ID name.</para>
				</option>
				<option name="v" argsep="^">
					<para>A series of channel variables to set on the destination channel.</para>
					<argument name="var1" multiple="true" argsep="=">
						<argument name="name" required="true" />
						<argument name="value" required="true" />
					</argument>
				</option>
				</optionlist>
			</parameter>
		</syntax>
		<description>
		<para>This application originates an outbound call and connects it to a specified extension or application.  This application will block until the outgoing call fails or gets answered, unless the async option is used.  At that point, this application will exit with the status variable set and dialplan processing will continue.</para>
		<para>This application sets the following channel variable before exiting:</para>
		<variablelist>
			<variable name="ORIGINATE_STATUS">
				<para>This indicates the result of the call origination.</para>
				<value name="FAILED"/>
				<value name="SUCCESS"/>
				<value name="BUSY"/>
				<value name="CONGESTION"/>
				<value name="HANGUP"/>
				<value name="RINGING"/>
				<value name="UNKNOWN">
				In practice, you should never see this value.  Please report it to the issue tracker if you ever see it.
				</value>
			</variable>
		</variablelist>
		</description>
	</application>
<module language="en_US" name="app_page">
	<depend>app_confbridge</depend>
	<support_level>core</support_level>
</module>
	<application name="Page" language="en_US" module="app_page">
		<since>
			<version>1.2.0</version>
		</since>
		<synopsis>
			Page series of phones
		</synopsis>
		<syntax>
			<parameter name="Technology/Resource" required="false" argsep="&amp;">
				<argument name="Technology/Resource" required="true">
					<para>Specification of the device(s) to dial. These must be in the format of
					<literal>Technology/Resource</literal>, where <replaceable>Technology</replaceable>
					represents a particular channel driver, and <replaceable>Resource</replaceable> represents a resource
					available to that particular channel driver.</para>
				</argument>
				<argument name="Technology2/Resource2" multiple="true">
					<para>Optional extra devices to dial in parallel</para>
					<para>If you need more than one, enter them as Technology2/Resource2&amp;
					Technology3/Resource3&amp;.....</para>
				</argument>
			</parameter>
			<parameter name="options">
				<optionlist>
				<option name="b" argsep="^">
					<para>Before initiating an outgoing call, Gosub to the specified
					location using the newly created channel.  The Gosub will be
					executed for each destination channel.</para>
					<argument name="context" required="false" />
					<argument name="exten" required="false" />
					<argument name="priority" required="true" hasparams="optional" argsep="^">
						<argument name="arg1" multiple="true" required="true" />
						<argument name="argN" />
					</argument>
				</option>
				<option name="B" argsep="^">
					<para>Before initiating the outgoing call(s), Gosub to the specified
					location using the current channel.</para>
					<argument name="context" required="false" />
					<argument name="exten" required="false" />
					<argument name="priority" required="true" hasparams="optional" argsep="^">
						<argument name="arg1" multiple="true" required="true" />
						<argument name="argN" />
					</argument>
				</option>
					<option name="d">
						<para>Full duplex audio</para>
					</option>
					<option name="i">
						<para>Ignore attempts to forward the call</para>
					</option>
					<option name="q">
						<para>Quiet, do not play beep to caller</para>
					</option>
					<option name="r">
						<para>Record the page into a file (<literal>CONFBRIDGE(bridge,record_conference)</literal>)</para>
					</option>
					<option name="s">
						<para>Only dial a channel if its device state says that it is <literal>NOT_INUSE</literal></para>
					</option>
					<option name="A">
						<argument name="x" required="true">
							<para>The announcement to playback to all devices</para>
						</argument>
						<para>Play an announcement to all paged participants</para>
					</option>
					<option name="n">
						<para>Do not play announcement to caller (alters <literal>A(x)</literal> behavior)</para>
					</option>
				</optionlist>
			</parameter>
			<parameter name="timeout">
				<para>Specify the length of time that the system will attempt to connect a call.
				After this duration, any page calls that have not been answered will be hung up by the
				system.</para>
			</parameter>
		</syntax>
		<description>
			<para>Places outbound calls to the given <replaceable>technology</replaceable>/<replaceable>resource</replaceable>
			and dumps them into a conference bridge as muted participants. The original
			caller is dumped into the conference as a speaker and the room is
			destroyed when the original caller leaves.</para>
		</description>
		<see-also>
			<ref type="application">ConfBridge</ref>
		</see-also>
	</application>
<module language="en_US" name="app_playback">
	<support_level>core</support_level>
</module>
	<application name="Playback" language="en_US" module="app_playback">
		<since>
			<version>0.1.0</version>
		</since>
		<synopsis>
			Play a file.
		</synopsis>
		<syntax>
			<parameter name="filenames" required="true" argsep="&amp;">
				<para>Ampersand separated list of filenames. If the filename
				is a relative filename (it does not begin with a slash), it
				will be searched for in the Asterisk sounds directory. If the
				filename is able to be parsed as a URL, Asterisk will
				download the file and then begin playback on it. To include a
				literal <literal>&amp;</literal> in the URL you can enclose
				the URL in single quotes.</para>
				<argument name="filename" required="true" />
				<argument name="filename2" multiple="true" />
			</parameter>
			<parameter name="options">
				<para>Comma separated list of options</para>
				<optionlist>
					<option name="skip">
						<para>Do not play if not answered</para>
					</option>
					<option name="noanswer">
						<para>Playback without answering, otherwise the channel will
						be answered before the sound is played.</para>
						<note><para>Not all channel types support playing messages while still on hook.</para></note>
					</option>
					<option name="say">
						<para>Play using the say.conf file.</para>
					</option>
					<option name="mix">
						<para>Play using a mix of filename and the say.conf file.</para>
					</option>
				</optionlist>
			</parameter>
		</syntax>
		<description>
			<para>Plays back given filenames (do not put extension of wav/alaw etc).
			The Playback application answers the channel if no options are specified.
			If the file is non-existent it will fail.</para>
			<para>This application sets the following channel variable upon completion:</para>
			<variablelist>
				<variable name="PLAYBACKSTATUS">
					<para>The status of the playback attempt as a text string.</para>
					<value name="SUCCESS"/>
					<value name="FAILED"/>
				</variable>
			</variablelist>
			<para>See Also: Background (application) -- for playing sound files that are interruptible</para>
			<para>WaitExten (application) -- wait for digits from caller, optionally play music on hold</para>
		</description>
		<see-also>
			<ref type="application">BackGround</ref>
			<ref type="application">WaitExten</ref>
			<ref type="application">ControlPlayback</ref>
			<ref type="agi">stream file</ref>
			<ref type="agi">control stream file</ref>
			<ref type="manager">ControlPlayback</ref>
		</see-also>
	</application>
<module language="en_US" name="app_playtones">
	<support_level>core</support_level>
</module>
	<application name="PlayTones" language="en_US" module="app_playtones">
		<since>
			<version>1.6.1.0</version>
		</since>
		<synopsis>
			Play a tone list.
		</synopsis>
		<syntax>
			<parameter name="arg" required="true">
				<para>Arg is either the tone name defined in the <filename>indications.conf</filename>
				configuration file, or a directly specified list of frequencies and durations.</para>
			</parameter>
		</syntax>
		<description>
			<para>Plays a tone list. Execution will continue with the next step in the dialplan
			immediately while the tones continue to play.</para>
			<para>See the sample <filename>indications.conf</filename> for a description of the
			specification of a tonelist.</para>
		</description>
		<see-also>
			<ref type="application">StopPlayTones</ref>
		</see-also>
	</application>
	<application name="StopPlayTones" language="en_US" module="app_playtones">
		<since>
			<version>1.6.1.0</version>
		</since>
		<synopsis>
			Stop playing a tone list.
		</synopsis>
		<syntax />
		<description>
			<para>Stop playing a tone list, initiated by PlayTones().</para>
		</description>
		<see-also>
			<ref type="application">PlayTones</ref>
		</see-also>
	</application>
<module language="en_US" name="app_privacy">
	<support_level>core</support_level>
</module>
	<application name="PrivacyManager" language="en_US" module="app_privacy">
		<since>
			<version>0.4.0</version>
		</since>
		<synopsis>
			Require phone number to be entered, if no CallerID sent
		</synopsis>
		<syntax>
			<parameter name="maxretries">
				<para>Total tries caller is allowed to input a callerid. Defaults to <literal>3</literal>.</para>
			</parameter>
			<parameter name="minlength">
				<para>Minimum allowable digits in the input callerid number. Defaults to <literal>10</literal>.</para>
			</parameter>
			<parameter name="options">
				<para>Position reserved for options.</para>
			</parameter>
			<parameter name="context">
				<para>Context to check the given callerid against patterns.</para>
			</parameter>
		</syntax>
		<description>
			<para>If no Caller*ID is sent, PrivacyManager answers the channel and asks
			the caller to enter their phone number. The caller is given
			<replaceable>maxretries</replaceable> attempts to do so. The application does
			<emphasis>nothing</emphasis> if Caller*ID was received on the channel.</para>
			<para>The application sets the following channel variable upon completion:</para>
			<variablelist>
				<variable name="PRIVACYMGRSTATUS">
					<para>The status of the privacy manager's attempt to collect a phone number from the user.</para>
					<value name="SUCCESS"/>
					<value name="FAILED"/>
				</variable>
			</variablelist>
		</description>
		<see-also>
			<ref type="application">Zapateller</ref>
		</see-also>
	</application>
<module language="en_US" name="app_queue">
	<support_level>core</support_level>
</module>
	<application name="Queue" language="en_US" module="app_queue">
		<since>
			<version>0.2.0</version>
		</since>
		<synopsis>
			Queue a call for a call queue.
		</synopsis>
		<syntax>
			<parameter name="queuename" required="true" />
			<parameter name="options">
				<optionlist>
					<option name="b" argsep="^">
						<para>Before initiating an outgoing call, <literal>Gosub</literal> to the specified
						location using the newly created channel.  The <literal>Gosub</literal> will be
						executed for each destination channel.</para>
						<argument name="context" required="false" />
						<argument name="exten" required="false" />
						<argument name="priority" required="true" hasparams="optional" argsep="^">
							<argument name="arg1" multiple="true" required="true" />
							<argument name="argN" />
						</argument>
					</option>
					<option name="B" argsep="^">
						<para>Before initiating the outgoing call(s), <literal>Gosub</literal> to the
						specified location using the current channel.</para>
						<argument name="context" required="false" />
						<argument name="exten" required="false" />
						<argument name="priority" required="true" hasparams="optional" argsep="^">
							<argument name="arg1" multiple="true" required="true" />
							<argument name="argN" />
						</argument>
					</option>
					<option name="C">
						<para>Mark all calls as "answered elsewhere" when cancelled.</para>
					</option>
					<option name="c">
						<para>Continue in the dialplan if the callee hangs up.</para>
					</option>
					<option name="d">
						<para>Data-quality (modem) call (minimum delay).</para>
						<para>This option only applies to DAHDI channels. By default,
						DTMF is verified by muting audio TX/RX to verify the tone
						is still present. This option disables that behavior.</para>
					</option>
					<option name="F" argsep="^">
						<argument name="context" required="false" />
						<argument name="exten" required="false" />
						<argument name="priority" required="true" />
						<para>When the caller hangs up, transfer the <emphasis>called member</emphasis>
						to the specified destination and <emphasis>start</emphasis> execution at that location.</para>
						<para>NOTE: Any channel variables you want the called channel to inherit from the caller channel must be
						prefixed with one or two underbars ('_').</para>
						<para>NOTE: Using this option from a Gosub() might not make sense as there would be no return points.</para>
					</option>
					<option name="h">
						<para>Allow <emphasis>callee</emphasis> to hang up by pressing <literal>*</literal>.</para>
					</option>
					<option name="H">
						<para>Allow <emphasis>caller</emphasis> to hang up by pressing <literal>*</literal>.</para>
					</option>
					<option name="i">
						<para>Ignore call forward requests from queue members and do nothing
						when they are requested.</para>
					</option>
					<option name="I">
						<para>Asterisk will ignore any connected line update requests or any redirecting party
						update requests it may receive on this dial attempt.</para>
					</option>
					<option name="k">
						<para>Allow the <emphasis>called</emphasis> party to enable parking of the call by sending
						the DTMF sequence defined for call parking in <filename>features.conf</filename>.</para>
					</option>
					<option name="K">
						<para>Allow the <emphasis>calling</emphasis> party to enable parking of the call by sending
						the DTMF sequence defined for call parking in <filename>features.conf</filename>.</para>
					</option>
					<option name="m">
						<para>Custom music on hold class to use, which will override the music on hold class configured
						in <filename>queues.conf</filename>, if specified.</para>
						<para>Note that CHANNEL(musicclass), if set, will still override this option.</para>
					</option>
					<option name="n">
						<para>No retries on the timeout; will exit this application and
						go to the next step.</para>
					</option>
					<option name="r">
						<para>Ring instead of playing MOH. Periodic Announcements are still made, if applicable.</para>
					</option>
					<option name="R">
						<para>Ring instead of playing MOH when a member channel is actually ringing.</para>
					</option>
					<option name="t">
						<para>Allow the <emphasis>called</emphasis> user to transfer the calling user.</para>
					</option>
					<option name="T">
						<para>Allow the <emphasis>calling</emphasis> user to transfer the call.</para>
					</option>
					<option name="x">
						<para>Allow the <emphasis>called</emphasis> user to write the conversation
						to disk via MixMonitor.</para>
					</option>
					<option name="X">
						<para>Allow the <emphasis>calling</emphasis> user to write the conversation to
						disk via MixMonitor.</para>
					</option>
				</optionlist>
			</parameter>
			<parameter name="URL">
				<para><replaceable>URL</replaceable> will be sent to the called party if the channel supports it.</para>
			</parameter>
			<parameter name="announceoverride" argsep="&amp;">
				<para>Announcement file(s) to play to agent before bridging
				call, overriding the announcement(s) configured in
				<filename>queues.conf</filename>, if any.</para>
				<para>Ampersand separated list of filenames. If the filename
				is a relative filename (it does not begin with a slash), it
				will be searched for in the Asterisk sounds directory. If the
				filename is able to be parsed as a URL, Asterisk will
				download the file and then begin playback on it. To include a
				literal <literal>&amp;</literal> in the URL you can enclose
				the URL in single quotes.</para>
				<argument name="announceoverride" required="true" />
				<argument name="announceoverride2" multiple="true" />
			</parameter>
			<parameter name="timeout">
				<para>Will cause the queue to fail out after a specified number of
				seconds, checked between each <filename>queues.conf</filename> <replaceable>timeout</replaceable> and
				<replaceable>retry</replaceable> cycle.</para>
			</parameter>
			<parameter name="AGI">
				<para>Will setup an AGI script to be executed on the calling party's channel once they are
				connected to a queue member.</para>
			</parameter>
			<parameter name="gosub">
				<para>Will run a gosub on the called party's channel (the queue member)
				once the parties are connected.  The subroutine execution starts in the
				named context at the s exten and priority 1.</para>
				<note><para>Macro was removed in Asterisk 21 which resulted in an
				argument ordering change. The upgrade notice was missed for this,
				so a note is being made here to provide a record of the change
				for users who have not upgraded yet.</para></note>
			</parameter>
			<parameter name="rule">
				<para>Will cause the queue's defaultrule to be overridden by the rule specified.</para>
			</parameter>
			<parameter name="position">
				<para>Attempt to enter the caller into the queue at the numerical position specified. <literal>1</literal>
				would attempt to enter the caller at the head of the queue, and <literal>3</literal> would attempt to place
				the caller third in the queue.</para>
			</parameter>
		</syntax>
		<description>
			<para>In addition to transferring the call, a call may be parked and then picked
			up by another user.</para>
			<para>This application will return to the dialplan if the queue does not exist, or
			any of the join options cause the caller to not enter the queue.</para>
			<para>This application does not automatically answer and should be preceded
			by an application such as Answer(), Progress(), or Ringing().</para>
			<para>This application sets the following channel variables upon completion:</para>
			<variablelist>
				<variable name="QUEUESTATUS">
					<para>The status of the call as a text string.</para>
					<value name="TIMEOUT" />
					<value name="FULL" />
					<value name="JOINEMPTY" />
					<value name="LEAVEEMPTY" />
					<value name="JOINUNAVAIL" />
					<value name="LEAVEUNAVAIL" />
					<value name="CONTINUE" />
					<value name="WITHDRAW" />
				</variable>
				<variable name="ABANDONED">
					<para>If the call was not answered by an agent this variable will be TRUE.</para>
					<value name="TRUE" />
				</variable>
				<variable name="DIALEDPEERNUMBER">
					<para>Resource of the agent that was dialed set on the outbound channel.</para>
				</variable>
				<variable name="QUEUE_WITHDRAW_INFO">
					<para>If the call was successfully withdrawn from the queue, and the withdraw request was provided with optional withdraw info, the withdraw info will be stored in this variable.</para>
				</variable>
				<variable name="QUEUEWAIT">
					<para>The total amount of time, in seconds, that the caller spent waiting in the queue before being connected to an agent.</para>
				</variable>
				<variable name="QUEUEWAIT_MS">
					<para>The total amount of time, in milliseconds, that the caller spent waiting in the queue before being connected to an agent.</para>
				</variable>
				<variable name="ANSWEREDTIME">
					<para>The amount of time, in seconds, that the caller spent connected to an agent. If the call was never answered, this will be set to 0.</para>
				</variable>
				<variable name="ANSWEREDTIME_MS">
					<para>The amount of time, in milliseconds, that the caller spent connected to an agent.</para>
				</variable>
				<variable name="DIALEDTIME">
					<para>The total amount of time, in seconds, from the start of the call until it ends. This matches the behavior of Dial().</para>
				</variable>
				<variable name="DIALEDTIME_MS">
					<para>The total amount of time, in milliseconds, from the start of the call until it ends.</para>
				</variable>
			</variablelist>
		</description>
		<see-also>
			<ref type="application">Queue</ref>
			<ref type="application">QueueLog</ref>
			<ref type="application">AddQueueMember</ref>
			<ref type="application">RemoveQueueMember</ref>
			<ref type="application">PauseQueueMember</ref>
			<ref type="application">UnpauseQueueMember</ref>
			<ref type="function">QUEUE_VARIABLES</ref>
			<ref type="function">QUEUE_MEMBER</ref>
			<ref type="function">QUEUE_EXISTS</ref>
			<ref type="function">QUEUE_GET_CHANNEL</ref>
			<ref type="function">QUEUE_WAITING_COUNT</ref>
			<ref type="function">QUEUE_MEMBER_LIST</ref>
			<ref type="function">QUEUE_MEMBER_PENALTY</ref>
		</see-also>
	</application>
	<application name="AddQueueMember" language="en_US" module="app_queue">
		<since>
			<version>0.5.0</version>
		</since>
		<synopsis>
			Dynamically adds queue members.
		</synopsis>
		<syntax>
			<parameter name="queuename" required="true" />
			<parameter name="interface" />
			<parameter name="penalty" />
			<parameter name="options">
				<optionlist>
					<option name="p">
						<para>Add queue member in paused state.</para>
					</option>
					<option name="r">
						<argument name="reason" required="true" />
						<para>Specify a reason why the member is in paused state.</para>
					</option>
				</optionlist>
			</parameter>
			<parameter name="membername" />
			<parameter name="stateinterface" />
			<parameter name="wrapuptime" />
		</syntax>
		<description>
			<para>Dynamically adds interface to an existing queue. If the interface is
			already in the queue it will return an error.</para>
			<para>This application sets the following channel variable upon completion:</para>
			<variablelist>
				<variable name="AQMSTATUS">
					<para>The status of the attempt to add a queue member as a text string.</para>
					<value name="ADDED" />
					<value name="MEMBERALREADY" />
					<value name="NOSUCHQUEUE" />
				</variable>
			</variablelist>
		</description>
		<see-also>
			<ref type="application">Queue</ref>
			<ref type="application">QueueLog</ref>
			<ref type="application">AddQueueMember</ref>
			<ref type="application">RemoveQueueMember</ref>
			<ref type="application">PauseQueueMember</ref>
			<ref type="application">UnpauseQueueMember</ref>
			<ref type="function">QUEUE_VARIABLES</ref>
			<ref type="function">QUEUE_MEMBER</ref>
			<ref type="function">QUEUE_EXISTS</ref>
			<ref type="function">QUEUE_GET_CHANNEL</ref>
			<ref type="function">QUEUE_WAITING_COUNT</ref>
			<ref type="function">QUEUE_MEMBER_LIST</ref>
			<ref type="function">QUEUE_MEMBER_PENALTY</ref>
		</see-also>
	</application>
	<application name="RemoveQueueMember" language="en_US" module="app_queue">
		<since>
			<version>0.5.0</version>
		</since>
		<synopsis>
			Dynamically removes queue members.
		</synopsis>
		<syntax>
			<parameter name="queuename" required="true" />
			<parameter name="interface" />
		</syntax>
		<description>
			<para>If the interface is <emphasis>NOT</emphasis> in the queue it will return an error.</para>
			<para>This application sets the following channel variable upon completion:</para>
			<variablelist>
				<variable name="RQMSTATUS">
					<value name="REMOVED" />
					<value name="NOTINQUEUE" />
					<value name="NOSUCHQUEUE" />
					<value name="NOTDYNAMIC" />
				</variable>
			</variablelist>
			<example title="Remove queue member">
			same => n,RemoveQueueMember(techsupport,SIP/3000)
			</example>
		</description>
		<see-also>
			<ref type="application">Queue</ref>
			<ref type="application">QueueLog</ref>
			<ref type="application">AddQueueMember</ref>
			<ref type="application">RemoveQueueMember</ref>
			<ref type="application">PauseQueueMember</ref>
			<ref type="application">UnpauseQueueMember</ref>
			<ref type="function">QUEUE_VARIABLES</ref>
			<ref type="function">QUEUE_MEMBER</ref>
			<ref type="function">QUEUE_EXISTS</ref>
			<ref type="function">QUEUE_GET_CHANNEL</ref>
			<ref type="function">QUEUE_WAITING_COUNT</ref>
			<ref type="function">QUEUE_MEMBER_LIST</ref>
			<ref type="function">QUEUE_MEMBER_PENALTY</ref>
		</see-also>
	</application>
	<application name="PauseQueueMember" language="en_US" module="app_queue">
		<since>
			<version>1.2.0</version>
		</since>
		<synopsis>
			Pauses a queue member.
		</synopsis>
		<syntax>
			<parameter name="queuename" />
			<parameter name="interface" required="true" />
			<parameter name="options" />
			<parameter name="reason">
				<para>Is used to add extra information to the appropriate queue_log entries and manager events.</para>
			</parameter>
		</syntax>
		<description>
			<para>Pauses (blocks calls for) a queue member. The given interface will be paused in the given queue.
			This prevents any calls from being sent from the queue to the interface until it is
			unpaused with UnpauseQueueMember or the manager interface.  If no queuename is given,
			the interface is paused in every queue it is a member of. The application will fail if the
			interface is not found.</para>
			<para>This application sets the following channel variable upon completion:</para>
			<variablelist>
				<variable name="PQMSTATUS">
					<para>The status of the attempt to pause a queue member as a text string.</para>
					<value name="PAUSED" />
					<value name="NOTFOUND" />
				</variable>
			</variablelist>
			<example title="Pause queue member">
			same => n,PauseQueueMember(,SIP/3000)
			</example>
		</description>
		<see-also>
			<ref type="application">Queue</ref>
			<ref type="application">QueueLog</ref>
			<ref type="application">AddQueueMember</ref>
			<ref type="application">RemoveQueueMember</ref>
			<ref type="application">PauseQueueMember</ref>
			<ref type="application">UnpauseQueueMember</ref>
			<ref type="function">QUEUE_VARIABLES</ref>
			<ref type="function">QUEUE_MEMBER</ref>
			<ref type="function">QUEUE_EXISTS</ref>
			<ref type="function">QUEUE_GET_CHANNEL</ref>
			<ref type="function">QUEUE_WAITING_COUNT</ref>
			<ref type="function">QUEUE_MEMBER_LIST</ref>
			<ref type="function">QUEUE_MEMBER_PENALTY</ref>
		</see-also>
	</application>
	<application name="UnpauseQueueMember" language="en_US" module="app_queue">
		<since>
			<version>1.2.0</version>
		</since>
		<synopsis>
			Unpauses a queue member.
		</synopsis>
		<syntax>
			<parameter name="queuename" />
			<parameter name="interface" required="true" />
			<parameter name="options" />
			<parameter name="reason">
				<para>Is used to add extra information to the appropriate queue_log entries and manager events.</para>
			</parameter>
		</syntax>
		<description>
			<para>Unpauses (resumes calls to) a queue member. This is the counterpart to <literal>PauseQueueMember()</literal>
			and operates exactly the same way, except it unpauses instead of pausing the given interface.</para>
			<para>This application sets the following channel variable upon completion:</para>
			<variablelist>
				<variable name="UPQMSTATUS">
					<para>The status of the attempt to unpause a queue member as a text string.</para>
					<value name="UNPAUSED" />
					<value name="NOTFOUND" />
				</variable>
			</variablelist>
			<example title="Unpause queue member">
			same => n,UnpauseQueueMember(,SIP/3000)
			</example>
		</description>
		<see-also>
			<ref type="application">Queue</ref>
			<ref type="application">QueueLog</ref>
			<ref type="application">AddQueueMember</ref>
			<ref type="application">RemoveQueueMember</ref>
			<ref type="application">PauseQueueMember</ref>
			<ref type="application">UnpauseQueueMember</ref>
			<ref type="function">QUEUE_VARIABLES</ref>
			<ref type="function">QUEUE_MEMBER</ref>
			<ref type="function">QUEUE_EXISTS</ref>
			<ref type="function">QUEUE_GET_CHANNEL</ref>
			<ref type="function">QUEUE_WAITING_COUNT</ref>
			<ref type="function">QUEUE_MEMBER_LIST</ref>
			<ref type="function">QUEUE_MEMBER_PENALTY</ref>
		</see-also>
	</application>
	<application name="QueueLog" language="en_US" module="app_queue">
		<since>
			<version>1.4.0</version>
		</since>
		<synopsis>
			Writes to the queue_log file.
		</synopsis>
		<syntax>
			<parameter name="queuename" required="true" />
			<parameter name="uniqueid" required="true" />
			<parameter name="agent" required="true" />
			<parameter name="event" required="true" />
			<parameter name="additionalinfo" />
		</syntax>
		<description>
			<para>Allows you to write your own events into the queue log.</para>
			<example title="Log custom queue event">
			same => n,QueueLog(101,${UNIQUEID},${AGENT},WENTONBREAK,600)
			</example>
		</description>
		<see-also>
			<ref type="application">Queue</ref>
			<ref type="application">QueueLog</ref>
			<ref type="application">AddQueueMember</ref>
			<ref type="application">RemoveQueueMember</ref>
			<ref type="application">PauseQueueMember</ref>
			<ref type="application">UnpauseQueueMember</ref>
			<ref type="function">QUEUE_VARIABLES</ref>
			<ref type="function">QUEUE_MEMBER</ref>
			<ref type="function">QUEUE_EXISTS</ref>
			<ref type="function">QUEUE_GET_CHANNEL</ref>
			<ref type="function">QUEUE_WAITING_COUNT</ref>
			<ref type="function">QUEUE_MEMBER_LIST</ref>
			<ref type="function">QUEUE_MEMBER_PENALTY</ref>
		</see-also>
	</application>
	<application name="QueueUpdate" language="en_US" module="app_queue">
		<since>
			<version>15.0.0</version>
		</since>
		<synopsis>
			Writes to the queue_log file for outbound calls and updates Realtime Data.
			Is used at h extension to be able to have all the parameters.
		</synopsis>
		<syntax>
			<parameter name="queuename" required="true" />
			<parameter name="uniqueid" required="true" />
			<parameter name="agent" required="true" />
			<parameter name="status" required="true" />
			<parameter name="talktime" required="true" />
			<parameter name="params" required="false" />
		</syntax>
		<description>
			<para>Allows you to write Outbound events into the queue log.</para>
			<example title="Write outbound event into queue log">
			exten => h,1,QueueUpdate(${QUEUE}, ${UNIQUEID}, ${AGENT}, ${DIALSTATUS}, ${ANSWEREDTIME}, ${DIALEDTIME} | ${DIALEDNUMBER})
			</example>
		</description>
	</application>
	<function name="QUEUE_VARIABLES" language="en_US" module="app_queue">
		<since>
			<version>1.6.0</version>
		</since>
		<synopsis>
			Return Queue information in variables.
		</synopsis>
		<syntax>
			<parameter name="queuename" required="true">
				<enumlist>
					<enum name="QUEUEMAX">
						<para>Maximum number of calls allowed.</para>
					</enum>
					<enum name="QUEUESTRATEGY">
						<para>The strategy of the queue.</para>
					</enum>
					<enum name="QUEUECALLS">
						<para>Number of calls currently in the queue.</para>
					</enum>
					<enum name="QUEUEHOLDTIME">
						<para>Current average hold time.</para>
					</enum>
					<enum name="QUEUECOMPLETED">
						<para>Number of completed calls for the queue.</para>
					</enum>
					<enum name="QUEUEABANDONED">
						<para>Number of abandoned calls.</para>
					</enum>
					<enum name="QUEUESRVLEVEL">
						<para>Queue service level.</para>
					</enum>
					<enum name="QUEUESRVLEVELPERF">
						<para>Current service level performance.</para>
					</enum>
				</enumlist>
			</parameter>
		</syntax>
		<description>
			<para>Makes the following queue variables available.</para>
			<para>Returns <literal>0</literal> if queue is found and setqueuevar is defined, <literal>-1</literal> otherwise.</para>
		</description>
		<see-also>
			<ref type="application">Queue</ref>
			<ref type="application">QueueLog</ref>
			<ref type="application">AddQueueMember</ref>
			<ref type="application">RemoveQueueMember</ref>
			<ref type="application">PauseQueueMember</ref>
			<ref type="application">UnpauseQueueMember</ref>
			<ref type="function">QUEUE_VARIABLES</ref>
			<ref type="function">QUEUE_MEMBER</ref>
			<ref type="function">QUEUE_EXISTS</ref>
			<ref type="function">QUEUE_GET_CHANNEL</ref>
			<ref type="function">QUEUE_WAITING_COUNT</ref>
			<ref type="function">QUEUE_MEMBER_LIST</ref>
			<ref type="function">QUEUE_MEMBER_PENALTY</ref>
		</see-also>
	</function>
	<function name="QUEUE_MEMBER" language="en_US" module="app_queue">
		<since>
			<version>1.6.0</version>
		</since>
		<synopsis>
			Provides a count of queue members based on the provided criteria, or updates a
			queue member's settings.
		</synopsis>
		<syntax>
			<parameter name="queuename" required="false" />
			<parameter name="option" required="true">
				<enumlist>
					<enum name="logged">
						<para>Returns the number of logged-in members for the specified queue.</para>
					</enum>
					<enum name="free">
						<para>Returns the number of logged-in members for the specified queue that either can take calls or are currently wrapping up after a previous call.</para>
					</enum>
					<enum name="ready">
						<para>Returns the number of logged-in members for the specified queue that are immediately available to answer a call.</para>
					</enum>
					<enum name="count">
						<para>Returns the total number of members for the specified queue.</para>
					</enum>
					<enum name="penalty">
						<para>Gets or sets queue member penalty.  If
						<replaceable>queuename</replaceable> is not specified
						when setting the penalty then the penalty is set in all queues
						the interface is a member.</para>
					</enum>
					<enum name="paused">
						<para>Gets or sets queue member paused status.  If
						<replaceable>queuename</replaceable> is not specified
						when setting the paused status then the paused status is set
						in all queues the interface is a member.</para>
					</enum>
					<enum name="ringinuse">
						<para>Gets or sets queue member ringinuse.  If
						<replaceable>queuename</replaceable> is not specified
						when setting ringinuse then ringinuse is set
						in all queues the interface is a member.</para>
					</enum>
				</enumlist>
			</parameter>
			<parameter name="interface" required="false" />
		</syntax>
		<description>
			<para>Allows access to queue counts [R] and member information [R/W].</para>
			<para><replaceable>queuename</replaceable> is required for all read operations.</para>
			<para><replaceable>interface</replaceable> is required for all member operations.</para>
		</description>
		<see-also>
			<ref type="application">Queue</ref>
			<ref type="application">QueueLog</ref>
			<ref type="application">AddQueueMember</ref>
			<ref type="application">RemoveQueueMember</ref>
			<ref type="application">PauseQueueMember</ref>
			<ref type="application">UnpauseQueueMember</ref>
			<ref type="function">QUEUE_VARIABLES</ref>
			<ref type="function">QUEUE_MEMBER</ref>
			<ref type="function">QUEUE_EXISTS</ref>
			<ref type="function">QUEUE_GET_CHANNEL</ref>
			<ref type="function">QUEUE_WAITING_COUNT</ref>
			<ref type="function">QUEUE_MEMBER_LIST</ref>
			<ref type="function">QUEUE_MEMBER_PENALTY</ref>
		</see-also>
	</function>
	<function name="QUEUE_EXISTS" language="en_US" module="app_queue">
		<since>
			<version>1.8.0</version>
		</since>
		<synopsis>
			Check if a named queue exists on this server
		</synopsis>
		<syntax>
			<parameter name="queuename" />
		</syntax>
		<description>
			<para>Returns 1 if the specified queue exists, 0 if it does not</para>
		</description>
		<see-also>
			<ref type="application">Queue</ref>
			<ref type="application">QueueLog</ref>
			<ref type="application">AddQueueMember</ref>
			<ref type="application">RemoveQueueMember</ref>
			<ref type="application">PauseQueueMember</ref>
			<ref type="application">UnpauseQueueMember</ref>
			<ref type="function">QUEUE_VARIABLES</ref>
			<ref type="function">QUEUE_MEMBER</ref>
			<ref type="function">QUEUE_EXISTS</ref>
			<ref type="function">QUEUE_GET_CHANNEL</ref>
			<ref type="function">QUEUE_WAITING_COUNT</ref>
			<ref type="function">QUEUE_MEMBER_LIST</ref>
			<ref type="function">QUEUE_MEMBER_PENALTY</ref>
		</see-also>
	</function>
	<function name="QUEUE_GET_CHANNEL" language="en_US" module="app_queue">
		<since>
			<version>14.0.0</version>
		</since>
		<synopsis>
			Return caller at the specified position in a queue.
		</synopsis>
		<syntax>
			<parameter name="queuename" required="true" />
			<parameter name="position" />
		</syntax>
		<description>
			<para>Returns the caller channel at <replaceable>position</replaceable> in the specified <replaceable>queuename</replaceable>.</para>
			<para>If <replaceable>position</replaceable> is unspecified the first channel is returned.</para>
		</description>
		<see-also>
			<ref type="application">Queue</ref>
			<ref type="application">QueueLog</ref>
			<ref type="application">AddQueueMember</ref>
			<ref type="application">RemoveQueueMember</ref>
			<ref type="application">PauseQueueMember</ref>
			<ref type="application">UnpauseQueueMember</ref>
			<ref type="function">QUEUE_VARIABLES</ref>
			<ref type="function">QUEUE_MEMBER</ref>
			<ref type="function">QUEUE_EXISTS</ref>
			<ref type="function">QUEUE_WAITING_COUNT</ref>
			<ref type="function">QUEUE_MEMBER_LIST</ref>
			<ref type="function">QUEUE_MEMBER_PENALTY</ref>
		</see-also>
	</function>
	<function name="QUEUE_WAITING_COUNT" language="en_US" module="app_queue">
		<since>
			<version>1.4.0</version>
		</since>
		<synopsis>
			Count number of calls currently waiting in a queue.
		</synopsis>
		<syntax>
			<parameter name="queuename" />
		</syntax>
		<description>
			<para>Returns the number of callers currently waiting in the specified <replaceable>queuename</replaceable>.</para>
		</description>
		<see-also>
			<ref type="application">Queue</ref>
			<ref type="application">QueueLog</ref>
			<ref type="application">AddQueueMember</ref>
			<ref type="application">RemoveQueueMember</ref>
			<ref type="application">PauseQueueMember</ref>
			<ref type="application">UnpauseQueueMember</ref>
			<ref type="function">QUEUE_VARIABLES</ref>
			<ref type="function">QUEUE_MEMBER</ref>
			<ref type="function">QUEUE_EXISTS</ref>
			<ref type="function">QUEUE_GET_CHANNEL</ref>
			<ref type="function">QUEUE_WAITING_COUNT</ref>
			<ref type="function">QUEUE_MEMBER_LIST</ref>
			<ref type="function">QUEUE_MEMBER_PENALTY</ref>
		</see-also>
	</function>
	<function name="QUEUE_MEMBER_LIST" language="en_US" module="app_queue">
		<since>
			<version>1.4.0</version>
		</since>
		<synopsis>
			Returns a list of interfaces on a queue.
		</synopsis>
		<syntax>
			<parameter name="queuename" required="true" />
		</syntax>
		<description>
			<para>Returns a comma-separated list of members associated with the specified <replaceable>queuename</replaceable>.</para>
		</description>
		<see-also>
			<ref type="application">Queue</ref>
			<ref type="application">QueueLog</ref>
			<ref type="application">AddQueueMember</ref>
			<ref type="application">RemoveQueueMember</ref>
			<ref type="application">PauseQueueMember</ref>
			<ref type="application">UnpauseQueueMember</ref>
			<ref type="function">QUEUE_VARIABLES</ref>
			<ref type="function">QUEUE_MEMBER</ref>
			<ref type="function">QUEUE_EXISTS</ref>
			<ref type="function">QUEUE_GET_CHANNEL</ref>
			<ref type="function">QUEUE_WAITING_COUNT</ref>
			<ref type="function">QUEUE_MEMBER_LIST</ref>
			<ref type="function">QUEUE_MEMBER_PENALTY</ref>
		</see-also>
	</function>
	<function name="QUEUE_MEMBER_PENALTY" language="en_US" module="app_queue">
		<since>
			<version>1.6.0</version>
		</since>
		<synopsis>
			Gets or sets queue members penalty.
		</synopsis>
		<syntax>
			<parameter name="queuename" required="true" />
			<parameter name="interface" required="true" />
		</syntax>
		<description>
			<para>Gets or sets queue members penalty.</para>
			<warning><para>This function has been deprecated in favor of the <literal>QUEUE_MEMBER()</literal> function</para></warning>
		</description>
		<see-also>
			<ref type="application">Queue</ref>
			<ref type="application">QueueLog</ref>
			<ref type="application">AddQueueMember</ref>
			<ref type="application">RemoveQueueMember</ref>
			<ref type="application">PauseQueueMember</ref>
			<ref type="application">UnpauseQueueMember</ref>
			<ref type="function">QUEUE_VARIABLES</ref>
			<ref type="function">QUEUE_MEMBER</ref>
			<ref type="function">QUEUE_EXISTS</ref>
			<ref type="function">QUEUE_GET_CHANNEL</ref>
			<ref type="function">QUEUE_WAITING_COUNT</ref>
			<ref type="function">QUEUE_MEMBER_LIST</ref>
			<ref type="function">QUEUE_MEMBER_PENALTY</ref>
		</see-also>
	</function>
	<manager name="QueueStatus" language="en_US" module="app_queue">
		<since>
			<version>0.5.0</version>
		</since>
		<synopsis>
			Show queue status.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="Queue">
				<para>Limit the response to the status of the specified queue.</para>
			</parameter>
			<parameter name="Member">
				<para>Limit the response to the status of the specified member.</para>
			</parameter>
		</syntax>
		<description>
			<para>Check the status of one or more queues.</para>
		</description>
	</manager>
	<manager name="QueueSummary" language="en_US" module="app_queue">
		<since>
			<version>1.6.0</version>
		</since>
		<synopsis>
			Show queue summary.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="Queue">
				<para>Queue for which the summary is requested.</para>
			</parameter>
		</syntax>
		<description>
			<para>Request the manager to send a QueueSummary event.</para>
		</description>
	</manager>
	<manager name="QueueAdd" language="en_US" module="app_queue">
		<since>
			<version>1.0.0</version>
		</since>
		<synopsis>
			Add interface to queue.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="Queue" required="true">
				<para>Queue's name.</para>
			</parameter>
			<parameter name="Interface" required="true">
				<para>The name of the interface (tech/name) to add to the queue.</para>
			</parameter>
			<parameter name="Penalty">
				<para>A penalty (number) to apply to this member. Asterisk will distribute calls to members with higher penalties only after attempting to distribute calls to those with lower penalty.</para>
			</parameter>
			<parameter name="Paused">
				<para>To pause or not the member initially (true/false or 1/0).</para>
			</parameter>
			<parameter name="Reason" required="false">
				<para>Text description why the member is paused.</para>
			</parameter>
			<parameter name="MemberName">
				<para>Text alias for the interface.</para>
			</parameter>
			<parameter name="StateInterface" />
		</syntax>
		<description>
		</description>
	</manager>
	<manager name="QueueRemove" language="en_US" module="app_queue">
		<since>
			<version>1.0.0</version>
		</since>
		<synopsis>
			Remove interface from queue.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="Queue" required="true">
				<para>The name of the queue to take action on.</para>
			</parameter>
			<parameter name="Interface" required="true">
				<para>The interface (tech/name) to remove from queue.</para>
			</parameter>
		</syntax>
		<description>
		</description>
	</manager>
	<manager name="QueuePause" language="en_US" module="app_queue">
		<since>
			<version>1.2.0</version>
		</since>
		<synopsis>
			Makes a queue member temporarily unavailable.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="Interface" required="true">
				<para>The name of the interface (tech/name) to pause or unpause.</para>
			</parameter>
			<parameter name="Paused" required="true">
				<para>Pause or unpause the interface. Set to 'true' to pause the member or 'false' to unpause.</para>
			</parameter>
			<parameter name="Queue" required="false">
				<para>The name of the queue in which to pause or unpause this member. If not specified, the member will be paused or unpaused in all the queues it is a member of.</para>
			</parameter>
			<parameter name="Reason" required="false">
				<para>Text description, returned in the event QueueMemberPause.</para>
			</parameter>
		</syntax>
		<description>
			<para>Pause or unpause a member in a queue.</para>
		</description>
	</manager>
	<manager name="QueueLog" language="en_US" module="app_queue">
		<since>
			<version>1.6.0</version>
		</since>
		<synopsis>
			Adds custom entry in queue_log.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="Queue" required="true" />
			<parameter name="Event" required="true" />
			<parameter name="Uniqueid" />
			<parameter name="Interface" />
			<parameter name="Message" />
		</syntax>
		<description>
		</description>
	</manager>
	<manager name="QueuePenalty" language="en_US" module="app_queue">
		<since>
			<version>1.6.0</version>
		</since>
		<synopsis>
			Set the penalty for a queue member.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="Interface" required="true">
				<para>The interface (tech/name) of the member whose penalty to change.</para>
			</parameter>
			<parameter name="Penalty" required="true">
				<para>The new penalty (number) for the member. Must be nonnegative.</para>
			</parameter>
			<parameter name="Queue">
				<para>If specified, only set the penalty for the member of this queue. Otherwise, set the penalty for the member in all queues to which the member belongs.</para>
			</parameter>
		</syntax>
		<description>
			<para>Change the penalty of a queue member</para>
		</description>
	</manager>
	<manager name="QueueMemberRingInUse" language="en_US" module="app_queue">
		<since>
			<version>11.0.0</version>
		</since>
		<synopsis>
			Set the ringinuse value for a queue member.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="Interface" required="true" />
			<parameter name="RingInUse" required="true" />
			<parameter name="Queue" />
		</syntax>
		<description>
		</description>
	</manager>
	<manager name="QueueRule" language="en_US" module="app_queue">
		<since>
			<version>1.6.0</version>
		</since>
		<synopsis>
			Queue Rules.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="Rule">
				<para>The name of the rule in queuerules.conf whose contents to list.</para>
			</parameter>
		</syntax>
		<description>
			<para>List queue rules defined in queuerules.conf</para>
		</description>
	</manager>
	<manager name="QueueReload" language="en_US" module="app_queue">
		<since>
			<version>1.6.2.0</version>
		</since>
		<synopsis>
			Reload a queue, queues, or any sub-section of a queue or queues.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="Queue">
				<para>The name of the queue to take action on. If no queue name is specified, then all queues are affected.</para>
			</parameter>
			<parameter name="Members">
				<para>Whether to reload the queue's members.</para>
				<enumlist>
					<enum name="yes" />
					<enum name="no" />
				</enumlist>
			</parameter>
			<parameter name="Rules">
				<para>Whether to reload queuerules.conf</para>
				<enumlist>
					<enum name="yes" />
					<enum name="no" />
				</enumlist>
			</parameter>
			<parameter name="Parameters">
				<para>Whether to reload the other queue options.</para>
				<enumlist>
					<enum name="yes" />
					<enum name="no" />
				</enumlist>
			</parameter>
		</syntax>
		<description>
		</description>
	</manager>
	<manager name="QueueReset" language="en_US" module="app_queue">
		<since>
			<version>1.6.2.0</version>
		</since>
		<synopsis>
			Reset queue statistics.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="Queue">
				<para>The name of the queue on which to reset statistics.</para>
			</parameter>
		</syntax>
		<description>
			<para>Reset the statistics for a queue.</para>
		</description>
	</manager>
	<manager name="QueueChangePriorityCaller" language="en_US" module="app_queue">
		<since>
			<version>15.0.0</version>
		</since>
		<synopsis>
			Change priority of a caller on queue.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="Queue" required="true">
				<para>The name of the queue to take action on.</para>
			</parameter>
			<parameter name="Caller" required="true">
				<para>The caller (channel) to change priority on queue.</para>
			</parameter>

			<parameter name="Priority" required="true">
				<para>Priority value for change for caller on queue.</para>
			</parameter>
			<parameter name="Immediate">
				<para>When set to yes will cause the priority change to be reflected immediately, causing the channel to change position within the queue.</para>
			</parameter>
		</syntax>
		<description>
		</description>
	</manager>
	<manager name="QueueWithdrawCaller" language="en_US" module="app_queue">
		<since>
			<version>19.3.0</version>
			<version>18.11.0</version>
			<version>16.25.0</version>
		</since>
		<synopsis>
			Request to withdraw a caller from the queue back to the dialplan.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="Queue" required="true">
				<para>The name of the queue to take action on.</para>
			</parameter>
			<parameter name="Caller" required="true">
				<para>The caller (channel) to withdraw from the queue.</para>
			</parameter>
			<parameter name="WithdrawInfo" required="false">
				<para>Optional info to store. If the call is successfully withdrawn from the queue, this information will be available in the QUEUE_WITHDRAW_INFO variable.</para>
			</parameter>
		</syntax>
		<description>
		</description>
	</manager>

	<managerEvent language="en_US" name="QueueParams" module="app_queue">
		<managerEventInstance class="EVENT_FLAG_AGENT" module="app_queue">
			<since>
				<version>16.24.0</version>
				<version>18.10.0</version>
				<version>19.2.0</version>
			</since>
			<synopsis>Raised in response to the QueueStatus action.</synopsis>
			<syntax>
				<parameter name="Max">
					<para>The name of the queue.</para>
				</parameter>
				<parameter name="Strategy">
					<para>The strategy of the queue.</para>
				</parameter>
				<parameter name="Calls">
					<para>The queue member's channel technology or location.</para>
				</parameter>
				<parameter name="Holdtime">
					<para>The queue's hold time.</para>
				</parameter>
				<parameter name="TalkTime">
					<para>The queue's talk time.</para>
				</parameter>
				<parameter name="Completed">
					<para>The queue's completion time.</para>
				</parameter>
				<parameter name="Abandoned">
					<para>The queue's call abandonment metric.</para>
				</parameter>
				<parameter name="ServiceLevelPerf">
					<para>Primary service level performance metric.</para>
				</parameter>
				<parameter name="ServiceLevelPerf2">
					<para>Secondary service level performance metric.</para>
				</parameter>
			</syntax>
			<see-also>
				<ref type="managerEvent">QueueMember</ref>
				<ref type="managerEvent">QueueEntry</ref>
			</see-also>
		</managerEventInstance>
	</managerEvent>
	<managerEvent language="en_US" name="QueueEntry" module="app_queue">
		<managerEventInstance class="EVENT_FLAG_AGENT" module="app_queue">
			<since>
				<version>16.24.0</version>
				<version>18.10.0</version>
				<version>19.2.0</version>
			</since>
			<synopsis>Raised in response to the QueueStatus action.</synopsis>
			<syntax>
				<parameter name="Queue">
					<para>The name of the queue.</para>
				</parameter>
				<parameter name="Position">
					<para>The caller's position within the queue.</para>
				</parameter>
				<parameter name="Channel">
					<para>The name of the caller's channel.</para>
				</parameter>
				<parameter name="Uniqueid">
					<para>The unique ID of the channel.</para>
				</parameter>
				<parameter name="CallerIDNum">
					<para>The Caller ID number.</para>
				</parameter>
				<parameter name="CallerIDName">
					<para>The Caller ID name.</para>
				</parameter>
				<parameter name="ConnectedLineNum">
					<para>The bridged party's number.</para>
				</parameter>
				<parameter name="ConnectedLineName">
					<para>The bridged party's name.</para>
				</parameter>
				<parameter name="Wait">
					<para>The caller's wait time.</para>
				</parameter>
				<parameter name="Priority">
					<para>The caller's priority within the queue.</para>
				</parameter>
			</syntax>
			<see-also>
				<ref type="managerEvent">QueueParams</ref>
				<ref type="managerEvent">QueueMember</ref>
			</see-also>
		</managerEventInstance>
	</managerEvent>
	<managerEvent language="en_US" name="QueueMemberStatus" module="app_queue">
		<managerEventInstance class="EVENT_FLAG_AGENT" module="app_queue">
			<since>
				<version>12.0.0</version>
			</since>
			<synopsis>Raised when a Queue member's status has changed.</synopsis>
			<syntax>
				<parameter name="Queue">
					<para>The name of the queue.</para>
				</parameter>
				<parameter name="MemberName">
					<para>The name of the queue member.</para>
				</parameter>
				<parameter name="Interface">
					<para>The queue member's channel technology or location.</para>
				</parameter>
				<parameter name="StateInterface">
					<para>Channel technology or location from which to read device state changes.</para>
				</parameter>
				<parameter name="Membership">
					<enumlist>
						<enum name="dynamic"/>
						<enum name="realtime"/>
						<enum name="static"/>
					</enumlist>
				</parameter>
				<parameter name="Penalty">
					<para>The penalty associated with the queue member.</para>
				</parameter>
				<parameter name="CallsTaken">
					<para>The number of calls this queue member has serviced.</para>
				</parameter>
				<parameter name="LastCall">
					<para>The time this member last took a call, expressed in seconds since 00:00, Jan 1, 1970 UTC.</para>
				</parameter>
				<parameter name="LastPause">
					<para>The time when started last paused the queue member.</para>
				</parameter>
				<parameter name="LoginTime">
					<para>The time this member logged in to the queue, expressed in seconds since 00:00, Jan 1, 1970 UTC.</para>
				</parameter>
				<parameter name="InCall">
					<para>Set to 1 if member is in call. Set to 0 after LastCall time is updated.</para>
					<enumlist>
						<enum name="0"/>
						<enum name="1"/>
					</enumlist>
				</parameter>
				<parameter name="Status">
					<para>The numeric device state status of the queue member.</para>
					<enumlist>
						<enum name="0"><para>AST_DEVICE_UNKNOWN</para></enum>
						<enum name="1"><para>AST_DEVICE_NOT_INUSE</para></enum>
						<enum name="2"><para>AST_DEVICE_INUSE</para></enum>
						<enum name="3"><para>AST_DEVICE_BUSY</para></enum>
						<enum name="4"><para>AST_DEVICE_INVALID</para></enum>
						<enum name="5"><para>AST_DEVICE_UNAVAILABLE</para></enum>
						<enum name="6"><para>AST_DEVICE_RINGING</para></enum>
						<enum name="7"><para>AST_DEVICE_RINGINUSE</para></enum>
						<enum name="8"><para>AST_DEVICE_ONHOLD</para></enum>
					</enumlist>
				</parameter>
				<parameter name="Paused">
					<enumlist>
						<enum name="0"/>
						<enum name="1"/>
					</enumlist>
				</parameter>
				<parameter name="PausedReason">
					<para>If set when paused, the reason the queue member was paused.</para>
				</parameter>
				<parameter name="Ringinuse">
					<enumlist>
						<enum name="0"/>
						<enum name="1"/>
					</enumlist>
				</parameter>
				<parameter name="Wrapuptime">
					<para>The Wrapup Time of the queue member. If this value is set will override the wrapup time of queue.</para>
				</parameter>
			</syntax>
		</managerEventInstance>
	</managerEvent>
	<managerEvent language="en_US" name="QueueMemberAdded" module="app_queue">
		<managerEventInstance class="EVENT_FLAG_AGENT" module="app_queue">
			<since>
				<version>12.0.0</version>
			</since>
			<synopsis>Raised when a member is added to the queue.</synopsis>
			<syntax>
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='QueueMemberStatus']/managerEventInstance/syntax/parameter)" />
			</syntax>
			<see-also>
				<ref type="managerEvent">QueueMemberRemoved</ref>
				<ref type="application">AddQueueMember</ref>
			</see-also>
		</managerEventInstance>
	</managerEvent>
	<managerEvent language="en_US" name="QueueMemberRemoved" module="app_queue">
		<managerEventInstance class="EVENT_FLAG_AGENT" module="app_queue">
			<since>
				<version>12.0.0</version>
			</since>
			<synopsis>Raised when a member is removed from the queue.</synopsis>
			<syntax>
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='QueueMemberStatus']/managerEventInstance/syntax/parameter)" />
			</syntax>
			<see-also>
				<ref type="managerEvent">QueueMemberAdded</ref>
				<ref type="application">RemoveQueueMember</ref>
			</see-also>
		</managerEventInstance>
	</managerEvent>
	<managerEvent language="en_US" name="QueueMemberPause" module="app_queue">
		<managerEventInstance class="EVENT_FLAG_AGENT" module="app_queue">
			<since>
				<version>12.2.0</version>
			</since>
			<synopsis>Raised when a member is paused/unpaused in the queue.</synopsis>
			<syntax>
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='QueueMemberStatus']/managerEventInstance/syntax/parameter)" />
			</syntax>
			<see-also>
				<ref type="application">PauseQueueMember</ref>
				<ref type="application">UnpauseQueueMember</ref>
			</see-also>
		</managerEventInstance>
	</managerEvent>
	<managerEvent language="en_US" name="QueueMemberPenalty" module="app_queue">
		<managerEventInstance class="EVENT_FLAG_AGENT" module="app_queue">
			<since>
				<version>12.0.0</version>
			</since>
			<synopsis>Raised when a member's penalty is changed.</synopsis>
			<syntax>
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='QueueMemberStatus']/managerEventInstance/syntax/parameter)" />
			</syntax>
			<see-also>
				<ref type="function">QUEUE_MEMBER</ref>
			</see-also>
		</managerEventInstance>
	</managerEvent>
	<managerEvent language="en_US" name="QueueMemberRinginuse" module="app_queue">
		<managerEventInstance class="EVENT_FLAG_AGENT" module="app_queue">
			<since>
				<version>12.0.0</version>
			</since>
			<synopsis>Raised when a member's ringinuse setting is changed.</synopsis>
			<syntax>
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='QueueMemberStatus']/managerEventInstance/syntax/parameter)" />
			</syntax>
			<see-also>
				<ref type="function">QUEUE_MEMBER</ref>
			</see-also>
		</managerEventInstance>
	</managerEvent>
	<managerEvent language="en_US" name="QueueCallerJoin" module="app_queue">
		<managerEventInstance class="EVENT_FLAG_AGENT" module="app_queue">
			<since>
				<version>12.0.0</version>
			</since>
			<synopsis>Raised when a caller joins a Queue.</synopsis>
			<syntax>
				<channel_snapshot/>
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='QueueMemberStatus']/managerEventInstance/syntax/parameter[@name='Queue'])" />
				<parameter name="Position">
					<para>This channel's current position in the queue.</para>
				</parameter>
				<parameter name="Count">
					<para>The total number of channels in the queue.</para>
				</parameter>
			</syntax>
			<see-also>
				<ref type="managerEvent">QueueCallerLeave</ref>
				<ref type="application">Queue</ref>
			</see-also>
		</managerEventInstance>
	</managerEvent>
	<managerEvent language="en_US" name="QueueCallerLeave" module="app_queue">
		<managerEventInstance class="EVENT_FLAG_AGENT" module="app_queue">
			<since>
				<version>12.0.0</version>
			</since>
			<synopsis>Raised when a caller leaves a Queue.</synopsis>
			<syntax>
				<channel_snapshot/>
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='QueueMemberStatus']/managerEventInstance/syntax/parameter[@name='Queue'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='QueueCallerJoin']/managerEventInstance/syntax/parameter[@name='Count'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='QueueCallerJoin']/managerEventInstance/syntax/parameter[@name='Position'])" />
			</syntax>
			<see-also>
				<ref type="managerEvent">QueueCallerJoin</ref>
			</see-also>
		</managerEventInstance>
	</managerEvent>
	<managerEvent language="en_US" name="QueueCallerAbandon" module="app_queue">
		<managerEventInstance class="EVENT_FLAG_AGENT" module="app_queue">
			<since>
				<version>12.0.0</version>
			</since>
			<synopsis>Raised when a caller abandons the queue.</synopsis>
			<syntax>
				<channel_snapshot/>
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='QueueMemberStatus']/managerEventInstance/syntax/parameter[@name='Queue'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='QueueCallerJoin']/managerEventInstance/syntax/parameter[@name='Position'])" />
				<parameter name="OriginalPosition">
					<para>The channel's original position in the queue.</para>
				</parameter>
				<parameter name="HoldTime">
					<para>The time the channel was in the queue, expressed in seconds since 00:00, Jan 1, 1970 UTC.</para>
				</parameter>
			</syntax>
		</managerEventInstance>
	</managerEvent>
	<managerEvent language="en_US" name="AgentCalled" module="app_queue">
		<managerEventInstance class="EVENT_FLAG_AGENT" module="app_queue">
			<since>
				<version>12.0.0</version>
			</since>
			<synopsis>Raised when an queue member is notified of a caller in the queue.</synopsis>
			<syntax>
				<channel_snapshot/>
				<channel_snapshot prefix="Dest"/>
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='QueueMemberStatus']/managerEventInstance/syntax/parameter[@name='Queue'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='QueueMemberStatus']/managerEventInstance/syntax/parameter[@name='MemberName'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='QueueMemberStatus']/managerEventInstance/syntax/parameter[@name='Interface'])" />
			</syntax>
			<see-also>
				<ref type="managerEvent">AgentRingNoAnswer</ref>
				<ref type="managerEvent">AgentComplete</ref>
				<ref type="managerEvent">AgentConnect</ref>
			</see-also>
		</managerEventInstance>
	</managerEvent>
	<managerEvent language="en_US" name="AgentRingNoAnswer" module="app_queue">
		<managerEventInstance class="EVENT_FLAG_AGENT" module="app_queue">
			<since>
				<version>12.0.0</version>
			</since>
			<synopsis>Raised when a queue member is notified of a caller in the queue and fails to answer.</synopsis>
			<syntax>
				<channel_snapshot/>
				<channel_snapshot prefix="Dest"/>
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='QueueMemberStatus']/managerEventInstance/syntax/parameter[@name='Queue'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='QueueMemberStatus']/managerEventInstance/syntax/parameter[@name='MemberName'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='QueueMemberStatus']/managerEventInstance/syntax/parameter[@name='Interface'])" />
				<parameter name="RingTime">
					<para>The time the queue member was rung, expressed in seconds since 00:00, Jan 1, 1970 UTC.</para>
				</parameter>
			</syntax>
			<see-also>
				<ref type="managerEvent">AgentCalled</ref>
			</see-also>
		</managerEventInstance>
	</managerEvent>
	<managerEvent language="en_US" name="AgentComplete" module="app_queue">
		<managerEventInstance class="EVENT_FLAG_AGENT" module="app_queue">
			<since>
				<version>12.0.0</version>
			</since>
			<synopsis>Raised when a queue member has finished servicing a caller in the queue.</synopsis>
			<syntax>
				<channel_snapshot/>
				<channel_snapshot prefix="Dest"/>
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='QueueMemberStatus']/managerEventInstance/syntax/parameter[@name='Queue'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='QueueMemberStatus']/managerEventInstance/syntax/parameter[@name='MemberName'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='QueueMemberStatus']/managerEventInstance/syntax/parameter[@name='Interface'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='QueueCallerAbandon']/managerEventInstance/syntax/parameter[@name='HoldTime'])" />
				<parameter name="TalkTime">
					<para>The time the queue member talked with the caller in the queue, expressed in seconds since 00:00, Jan 1, 1970 UTC.</para>
				</parameter>
				<parameter name="Reason">
					<enumlist>
						<enum name="caller"/>
						<enum name="agent"/>
						<enum name="transfer"/>
					</enumlist>
				</parameter>
			</syntax>
			<see-also>
				<ref type="managerEvent">AgentCalled</ref>
				<ref type="managerEvent">AgentConnect</ref>
			</see-also>
		</managerEventInstance>
	</managerEvent>
	<managerEvent language="en_US" name="AgentDump" module="app_queue">
		<managerEventInstance class="EVENT_FLAG_AGENT" module="app_queue">
			<since>
				<version>12.0.0</version>
			</since>
			<synopsis>Raised when a queue member hangs up on a caller in the queue.</synopsis>
			<syntax>
				<channel_snapshot/>
				<channel_snapshot prefix="Dest"/>
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='QueueMemberStatus']/managerEventInstance/syntax/parameter[@name='Queue'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='QueueMemberStatus']/managerEventInstance/syntax/parameter[@name='MemberName'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='QueueMemberStatus']/managerEventInstance/syntax/parameter[@name='Interface'])" />
			</syntax>
			<see-also>
				<ref type="managerEvent">AgentCalled</ref>
				<ref type="managerEvent">AgentConnect</ref>
			</see-also>
		</managerEventInstance>
	</managerEvent>
	<managerEvent language="en_US" name="AgentConnect" module="app_queue">
		<managerEventInstance class="EVENT_FLAG_AGENT" module="app_queue">
			<since>
				<version>12.0.0</version>
			</since>
			<synopsis>Raised when a queue member answers and is bridged to a caller in the queue.</synopsis>
			<syntax>
				<channel_snapshot/>
				<channel_snapshot prefix="Dest"/>
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='QueueMemberStatus']/managerEventInstance/syntax/parameter[@name='Queue'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='QueueMemberStatus']/managerEventInstance/syntax/parameter[@name='MemberName'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='QueueMemberStatus']/managerEventInstance/syntax/parameter[@name='Interface'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='AgentRingNoAnswer']/managerEventInstance/syntax/parameter[@name='RingTime'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='QueueCallerAbandon']/managerEventInstance/syntax/parameter[@name='HoldTime'])" />
			</syntax>
			<see-also>
				<ref type="managerEvent">AgentCalled</ref>
				<ref type="managerEvent">AgentComplete</ref>
				<ref type="managerEvent">AgentDump</ref>
			</see-also>
		</managerEventInstance>
	</managerEvent>
<module language="en_US" name="app_read">
	<support_level>core</support_level>
</module>
	<application name="Read" language="en_US" module="app_read">
		<since>
			<version>1.6.1.0</version>
		</since>
		<synopsis>
			Read a variable.
		</synopsis>
		<syntax>
			<parameter name="variable" required="true">
				<para>The input digits will be stored in the given <replaceable>variable</replaceable>
				name.</para>
			</parameter>
			<parameter name="filenames" argsep="&amp;">
				<para>Ampersand separated list of filenames to play before
				reading digits or tone with option <literal>i</literal>. If
				the filename is a relative filename (it does not begin with a
				slash), it will be searched for in the Asterisk sounds
				directory. If the filename is able to be parsed as a URL,
				Asterisk will download the file and then begin playback on
				it. To include a literal <literal>&amp;</literal> in the URL
				you can enclose	the URL in single quotes.</para>
				<argument name="filename" required="true" />
				<argument name="filename2" multiple="true" />
			</parameter>
			<parameter name="maxdigits">
				<para>Maximum acceptable number of digits. Stops reading after
				<replaceable>maxdigits</replaceable> have been entered (without
				requiring the user to press the <literal>#</literal> key).</para>
				<para>Defaults to <literal>0</literal> - no limit - wait for the
				user press the <literal>#</literal> key. Any value below
				<literal>0</literal> means the same. Max accepted value is
				<literal>255</literal>.</para>
			</parameter>
			<parameter name="options">
				<optionlist>
					<option name="s">
						<para>to return immediately if the line is not up.</para>
					</option>
					<option name="i">
						<para>to play  filename as an indication tone from your
						<filename>indications.conf</filename>.</para>
					</option>
					<option name="n">
						<para>to read digits even if the line is not up.</para>
					</option>
					<option name="t">
						<para>Terminator digit(s) to use for ending input.
						Default is <literal>#</literal>. If you need to read
						the digit <literal>#</literal> literally, you should
						remove or change the terminator character. Multiple
						terminator characters may be specified. If no terminator
						digit is present, input cannot be ended using digits
						and you will need to rely on duration and max digits
						for ending input.</para>
					</option>
					<option name="e">
						<para>to read the terminator as the digit string if the
						only digit read is the terminator. This is for cases
						where the terminator is a valid digit, but only by itself.
						ie; <literal>1234</literal> and <literal>#</literal> are
						valid, but <literal>1234#</literal> is not.</para>
					</option>
				</optionlist>
			</parameter>
			<parameter name="attempts">
				<para>If greater than <literal>1</literal>, that many
				<replaceable>attempts</replaceable> will be made in the
				event no data is entered.</para>
			</parameter>
			<parameter name="timeout">
				<para>The number of seconds to wait for a digit response. If greater
				than <literal>0</literal>, that value will override the default timeout.
				Can be floating point.</para>
			</parameter>
		</syntax>
		<description>
			<para>Reads a #-terminated string of digits a certain number of times from the
			user in to the given <replaceable>variable</replaceable>.</para>
			<para>This application sets the following channel variable upon completion:</para>
			<variablelist>
				<variable name="READSTATUS">
					<para>This is the status of the read operation.</para>
					<value name="OK" />
					<value name="ERROR" />
					<value name="HANGUP" />
					<value name="INTERRUPTED" />
					<value name="SKIPPED" />
					<value name="TIMEOUT" />
				</variable>
			</variablelist>
		</description>
		<see-also>
			<ref type="application">SendDTMF</ref>
		</see-also>
	</application>
<module language="en_US" name="app_readexten">
	<support_level>core</support_level>
</module>
	<application name="ReadExten" language="en_US" module="app_readexten">
		<since>
			<version>1.6.0</version>
		</since>
		<synopsis>
			Read an extension into a variable.
		</synopsis>
		<syntax>
			<parameter name="variable" required="true" />
			<parameter name="filename">
				<para>File to play before reading digits or tone with option <literal>i</literal></para>
			</parameter>
			<parameter name="context">
				<para>Context in which to match extensions.</para>
			</parameter>
			<parameter name="option">
				<optionlist>
					<option name="s">
						<para>Return immediately if the channel is not answered.</para>
					</option>
					<option name="i">
						<para>Play <replaceable>filename</replaceable> as an indication tone from your
						<filename>indications.conf</filename> or a directly specified list of
						frequencies and durations.</para>
					</option>
					<option name="n">
						<para>Read digits even if the channel is not answered.</para>
					</option>
					<option name="p">
						<para>The extension entered will be considered complete when a <literal>#</literal>
						is entered.</para>
					</option>
				</optionlist>
			</parameter>
			<parameter name="timeout">
				<para>An integer number of seconds to wait for a digit response. If
				greater than <literal>0</literal>, that value will override the default timeout.</para>
			</parameter>
		</syntax>
		<description>
			<para>Reads a <literal>#</literal> terminated string of digits from the user into the given variable.</para>
			<para>Will set READEXTENSTATUS on exit with one of the following statuses:</para>
			<variablelist>
				<variable name="READEXTENSTATUS">
					<value name="OK">
						A valid extension exists in ${variable}.
					</value>
					<value name="TIMEOUT">
						No extension was entered in the specified time.  Also sets ${variable} to "t".
					</value>
					<value name="INVALID">
						An invalid extension, ${INVALID_EXTEN}, was entered.  Also sets ${variable} to "i".
					</value>
					<value name="SKIP">
						Line was not up and the option 's' was specified.
					</value>
					<value name="ERROR">
						Invalid arguments were passed.
					</value>
				</variable>
			</variablelist>
		</description>
	</application>
<module language="en_US" name="app_record">
	<support_level>core</support_level>
</module>
	<application name="Record" language="en_US" module="app_record">
		<since>
			<version>0.1.8</version>
		</since>
		<synopsis>
			Record to a file.
		</synopsis>
		<syntax>
			<parameter name="filename" required="true" argsep=".">
				<argument name="filename" required="true" />
				<argument name="format" required="true">
					<para>Is the format of the file type to be recorded (wav, gsm, etc).</para>
				</argument>
			</parameter>
			<parameter name="silence">
				<para>Is the number of seconds of silence to allow before returning.</para>
			</parameter>
			<parameter name="maxduration">
				<para>Is the maximum recording duration in seconds. If missing
				or 0 there is no maximum.</para>
			</parameter>
			<parameter name="options">
				<optionlist>
					<option name="a">
						<para>Append to existing recording rather than replacing.</para>
					</option>
					<option name="n">
						<para>Do not answer, but record anyway if line not yet answered.</para>
					</option>
					<option name="o">
						<para>Exit when 0 is pressed, setting the variable <variable>RECORD_STATUS</variable>
						to <literal>OPERATOR</literal> instead of <literal>DTMF</literal></para>
					</option>
					<option name="q">
						<para>quiet (do not play a beep tone).</para>
					</option>
					<option name="s">
						<para>skip recording if the line is not yet answered.</para>
					</option>
					<option name="t">
						<para>use alternate '*' terminator key (DTMF) instead of default '#'</para>
					</option>
					<option name="u">
						<para>Don't truncate recorded silence.</para>
					</option>
					<option name="x">
						<para>Ignore all terminator keys (DTMF) and keep recording until hangup.</para>
					</option>
					<option name="k">
					        <para>Keep recorded file upon hangup.</para>
					</option>
					<option name="y">
					        <para>Terminate recording if *any* DTMF digit is received.</para>
					</option>
				</optionlist>
			</parameter>
		</syntax>
		<description>
			<para>If filename contains <literal>%d</literal>, these characters will be replaced with a number
			incremented by one each time the file is recorded.
			Use <astcli>core show file formats</astcli> to see the available formats on your system
			User can press <literal>#</literal> to terminate the recording and continue to the next priority.
			If the user hangs up during a recording, all data will be lost and the application will terminate.</para>
			<variablelist>
				<variable name="RECORDED_FILE">
					<para>Will be set to the final filename of the recording, without an extension.</para>
				</variable>
				<variable name="RECORD_STATUS">
					<para>This is the final status of the command</para>
					<value name="DTMF">A terminating DTMF was received ('#' or '*', depending upon option 't')</value>
					<value name="SILENCE">The maximum silence occurred in the recording.</value>
					<value name="SKIP">The line was not yet answered and the 's' option was specified.</value>
					<value name="TIMEOUT">The maximum length was reached.</value>
					<value name="HANGUP">The channel was hung up.</value>
					<value name="ERROR">An unrecoverable error occurred, which resulted in a WARNING to the logs.</value>
				</variable>
			</variablelist>
		</description>
		<see-also>
			<ref type="function">RECORDING_INFO</ref>
		</see-also>
	</application>
	<function name="RECORDING_INFO" language="en_US" module="app_record">
		<synopsis>
			Retrieve information about a recording previously created using the Record application
		</synopsis>
		<syntax>
			<parameter name="property" required="true">
				<para>The property about the recording to retrieve.</para>
				<enumlist>
					<enum name="duration">
						<para>The duration, in milliseconds, of the recording.</para>
					</enum>
				</enumlist>
			</parameter>
		</syntax>
		<description>
			<para>Returns information about the previous recording created by <literal>Record</literal>.
			This function cannot be used if no recordings have yet been completed.</para>
		</description>
		<see-also>
			<ref type="application">Record</ref>
		</see-also>
	</function>
<module language="en_US" name="app_reload">
	<support_level>extended</support_level>
</module>
	<application name="Reload" language="en_US" module="app_reload">
		<since>
			<version>16.20.0</version>
			<version>18.6.0</version>
		</since>
		<synopsis>
			Reloads an Asterisk module, blocking the channel until the reload has completed.
		</synopsis>
		<syntax>
			<parameter name="module" required="false">
				<para>The full name(s) of the target module(s) or resource(s) to reload.
				If omitted, everything will be reloaded.</para>
				<para>The full names MUST be specified (e.g. <literal>chan_iax2</literal>
				to reload IAX2 or <literal>pbx_config</literal> to reload the dialplan.</para>
			</parameter>
		</syntax>
		<description>
			<para>Reloads the specified (or all) Asterisk modules and reports success or failure.
			Success is determined by each individual module, and if all reloads are successful,
			that is considered an aggregate success. If multiple modules are specified and any
			module fails, then FAILURE will be returned. It is still possible that other modules
			did successfully reload, however.</para>
			<para>Sets <variable>RELOADSTATUS</variable> to one of the following values:</para>
			<variablelist>
				<variable name="RELOADSTATUS">
					<value name="SUCCESS">
						Specified module(s) reloaded successfully.
					</value>
					<value name="FAILURE">
						Some or all of the specified modules failed to reload.
					</value>
				</variable>
			</variablelist>
		</description>
	</application>
<module language="en_US" name="app_saycounted">
	<defaultenabled>no</defaultenabled>
	<support_level>extended</support_level>
</module>
	<application name="SayCountedNoun" language="en_US" module="app_saycounted">
		<since>
			<version>1.8.0</version>
		</since>
		<synopsis>
			Say a noun in declined form in order to count things
		</synopsis>
		<syntax>
			<parameter name="number" required="true">
				<para>The number of things</para>
			</parameter>
			<parameter name="filename" required="true">
				<para>File name stem for the noun that is the name of the things</para>
			</parameter>
		</syntax>
		<description>
			<para>Selects and plays the proper singular or plural form of a noun
			when saying things such as "five calls".  English has simple rules
			for deciding when to say "call" and when to say "calls", but other
			languages have complicated rules which would be extremely difficult
			to implement in the Asterisk dialplan language.</para>
			<para>The correct sound file is selected by examining the
			<replaceable>number</replaceable> and adding the appropriate suffix
			to <replaceable>filename</replaceable>. If the channel language is
			English, then the suffix will be either empty or "s". If the channel
			language is Russian or some other Slavic language, then the suffix
			will be empty for nominative, "x1" for genative singular, and "x2"
			for genative plural.</para>
			<para>Note that combining <replaceable>filename</replaceable> with
			a suffix will not necessarily produce a correctly spelled plural
			form. For example, SayCountedNoun(2,man) will play the sound file
			"mans" rather than "men". This behavior is intentional. Since the
			file name is never seen by the end user, there is no need to
			implement complicated spelling rules.  We simply record the word
			"men" in the sound file named "mans".</para>
			<para>This application does not automatically answer and should be
			preceded by an application such as Answer() or Progress.</para>
		</description>
		<see-also>
			<ref type="application">SayCountedAdj</ref>
			<ref type="application">SayNumber</ref>
		</see-also>
	</application>
	<application name="SayCountedAdj" language="en_US" module="app_saycounted">
		<since>
			<version>1.8.0</version>
		</since>
		<synopsis>
			Say a adjective in declined form in order to count things
		</synopsis>
		<syntax>
			<parameter name="number" required="true">
				<para>The number of things</para>
			</parameter>
			<parameter name="filename" required="true">
				<para>File name stem for the adjective</para>
			</parameter>
			<parameter name="gender">
				<para>The gender of the noun modified, one of 'm', 'f', 'n', or 'c'</para>
			</parameter>
		</syntax>
		<description>
			<para>Selects and plays the proper form of an adjective according to
			the gender and of the noun which it modifies and the number of
			objects named by the noun-verb combination which have been counted.
			Used when saying things such as "5 new messages".  The various
			singular and plural forms of the adjective are selected by adding
			suffixes to <replaceable>filename</replaceable>.</para>
			<para>If the channel language is English, then no suffix will ever
			be added (since, in English, adjectives are not declined). If the
			channel language is Russian or some other slavic language, then the
			suffix will the specified <replaceable>gender</replaceable> for
			nominative, and "x" for genative plural. (The genative singular is
			not used when counting things.) For example, SayCountedAdj(1,new,f)
			will play sound file "newa" (containing the word "novaya"), but
			SayCountedAdj(5,new,f) will play sound file "newx" (containing the
			word "novikh").</para>
			<para>This application does not automatically answer and should be
			preceded by an application such as Answer(), Progress(), or
			Proceeding().</para>
		</description>
		<see-also>
			<ref type="application">SayCountedNoun</ref>
			<ref type="application">SayNumber</ref>
		</see-also>
	</application>
<module language="en_US" name="app_sayunixtime">
	<support_level>core</support_level>
</module>
	<application name="SayUnixTime" language="en_US" module="app_sayunixtime">
		<since>
			<version>0.7.0</version>
		</since>
		<synopsis>
			Says a specified time in a custom format.
		</synopsis>
		<syntax>
			<parameter name="unixtime" required="false">
				<para>time, in seconds since Jan 1, 1970.  May be negative. Defaults to now.</para>
			</parameter>
			<parameter name="timezone" required="false" >
				<para>timezone, see <directory>/usr/share/zoneinfo</directory> for a list. Defaults to machine default.</para>
			</parameter>
			<parameter name="format" required="false" >
				<para>a format the time is to be said in.  See <filename>voicemail.conf</filename>.
				Defaults to <literal>ABdY "digits/at" IMp</literal></para>
			</parameter>
			<parameter name="options" required="false">
				 <optionlist>
					<option name="j">
						<para>Allow the calling user to dial digits to jump to that extension.
						This option is automatically enabled if
						<variable>SAY_DTMF_INTERRUPT</variable> is present on the channel and
						set to 'true' (case insensitive)</para>
					</option>
				</optionlist>
			</parameter>
		</syntax>
		<description>
			<para>Uses some of the sound files stored in <directory>/var/lib/asterisk/sounds</directory> to construct a phrase
			saying the specified date and/or time in the specified format. </para>
		</description>
		<see-also>
			<ref type="function">STRFTIME</ref>
			<ref type="function">STRPTIME</ref>
			<ref type="function">IFTIME</ref>
		</see-also>
	</application>
	<application name="DateTime" language="en_US" module="app_sayunixtime">
		<since>
			<version>0.2.0</version>
		</since>
		<synopsis>
			Says a specified time in a custom format.
		</synopsis>
		<syntax>
			<parameter name="unixtime">
				<para>time, in seconds since Jan 1, 1970.  May be negative. Defaults to now.</para>
			</parameter>
			<parameter name="timezone">
				<para>timezone, see <filename>/usr/share/zoneinfo</filename> for a list. Defaults to machine default.</para>
			</parameter>
			<parameter name="format">
				<para>a format the time is to be said in.  See <filename>voicemail.conf</filename>.
				Defaults to <literal>ABdY "digits/at" IMp</literal></para>
			</parameter>
		</syntax>
		<description>
			<para>Say the date and time in a specified format.</para>
		</description>
	</application>

<module language="en_US" name="app_senddtmf">
	<support_level>core</support_level>
</module>
	<application name="SendDTMF" language="en_US" module="app_senddtmf">
		<since>
			<version>0.3.0</version>
		</since>
		<synopsis>
			Sends arbitrary DTMF digits
		</synopsis>
		<syntax>
			<parameter name="digits" required="true">
				<para>List of digits 0-9,*#,a-d,A-D to send also w for a half second pause,
				W for a one second pause, and f or F for a flash-hook if the channel supports
				flash-hook.</para>
			</parameter>
			<parameter name="timeout_ms" required="false">
				<para>Amount of time to wait in ms between tones. (defaults to .25s)</para>
			</parameter>
			<parameter name="duration_ms" required="false">
				<para>Duration of each digit</para>
			</parameter>
			<parameter name="channel" required="false">
				<para>Channel where digits will be played</para>
			</parameter>
			<parameter name="options">
				<optionlist>
					<option name="a">
						<para>Answer the channel specified by the <literal>channel</literal>
						parameter if it is not already up. If no <literal>channel</literal>
						parameter is provided, the current channel will be answered.</para>
					</option>
				</optionlist>
			</parameter>
		</syntax>
		<description>
			<para>It will send all digits or terminate if it encounters an error.</para>
		</description>
		<see-also>
			<ref type="application">Read</ref>
		</see-also>
	</application>
	<manager name="PlayDTMF" language="en_US" module="app_senddtmf">
		<since>
			<version>1.4.0</version>
		</since>
		<synopsis>
			Play DTMF signal on a specific channel.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="Channel" required="true">
				<para>Channel name to send digit to.</para>
			</parameter>
			<parameter name="Digit" required="true">
				<para>The DTMF digit to play.</para>
			</parameter>
			<parameter name="Duration" required="false">
				<para>The duration, in milliseconds, of the digit to be played.</para>
			</parameter>
			<parameter name="Receive" required="false">
				<para>Emulate receiving DTMF on this channel instead of sending it out.</para>
			</parameter>
		</syntax>
		<description>
			<para>Plays a dtmf digit on the specified channel.</para>
		</description>
	</manager>
	<manager name="SendFlash" language="en_US" module="app_senddtmf">
		<since>
			<version>20.3.0</version>
			<version>18.18.0</version>
		</since>
		<synopsis>
			Send a hook flash on a specific channel.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="Channel" required="true">
				<para>Channel name to send hook flash to.</para>
			</parameter>
			<parameter name="Receive" required="false">
				<para>Emulate receiving a hook flash on this channel instead of sending it out.</para>
			</parameter>
		</syntax>
		<description>
			<para>Sends a hook flash on the specified channel.</para>
		</description>
	</manager>
<module language="en_US" name="app_sendtext">
	<support_level>core</support_level>
</module>
	<application name="SendText" language="en_US" module="app_sendtext">
		<since>
			<version>1.0.0</version>
		</since>
		<synopsis>
			Send a Text Message on a channel.
		</synopsis>
		<syntax>
			<parameter name="text" required="false" />
		</syntax>
		<description>
			<para>Sends <replaceable>text</replaceable> to the current channel.</para>
			<note><para><literal>current channel</literal> could be the caller or callee depending
			on the context in which this application is called.</para></note>
			<para>
			</para>
			<para>The following variables can be set:</para>
			<variablelist>
				<variable name="SENDTEXT_FROM_DISPLAYNAME">
					<para>If set and this channel supports enhanced messaging, this value will be
					used as the <literal>From</literal> display name.</para>
				</variable>
				<variable name="SENDTEXT_TO_DISPLAYNAME">
					<para>If set and this channel supports enhanced messaging, this value will be
					used as the <literal>To</literal> display name.</para>
				</variable>
				<variable name="SENDTEXT_CONTENT_TYPE">
					<para>If set and this channel supports enhanced messaging, this value will be
					used as the message <literal>Content-Type</literal>.  If not specified, the
					default of <literal>text/plain</literal> will be used.</para>
					<para><emphasis>Warning:</emphasis> Messages of types other than
					<literal>text/&#42;</literal> cannot be sent via channel drivers that do not
					support Enhanced Messaging. An attempt to do so will be ignored and will result
					in the <literal>SENDTEXTSTATUS</literal> variable being set to
					<literal>UNSUPPORTED</literal>.</para>
				</variable>
				<variable name="SENDTEXT_BODY">
					<para>If set this value will be used as the message body and any text supplied
					as a function parameter will be ignored.
					</para>
				</variable>
			</variablelist>
			<para>
			</para>
			<para>Result of transmission will be stored in the following variables:</para>
			<variablelist>
				<variable name="SENDTEXTTYPE">
					<value name="NONE">
						No message sent.
					</value>
					<value name="BASIC">
						Message body sent without attributes because the channel driver
						doesn't support enhanced messaging.
					</value>
					<value name="ENHANCED">
						The message was sent using enhanced messaging.
					</value>
				</variable>
				<variable name="SENDTEXTSTATUS">
					<value name="SUCCESS">
						Transmission succeeded.
					</value>
					<value name="FAILURE">
						Transmission failed.
					</value>
					<value name="UNSUPPORTED">
						Text transmission not supported by channel.
					</value>
				</variable>
			</variablelist>
			<para>
			</para>
			<note><para>The text encoding and transmission method is completely at the
			discretion of the channel driver.  chan_pjsip will use in-dialog SIP MESSAGE
			messages always.</para></note>
			<para>
			</para>
			<para>Examples:
			</para>
			<example title="Send a simple message">
			 same => n,SendText(Your Text Here)
			</example>
			<para>If the channel driver supports enhanced messaging (currently only chan_pjsip),
			you can set additional variables:</para>
			<example title="Alter the From display name">
			 same => n,Set(SENDTEXT_FROM_DISPLAYNAME=Really From Bob)
			 same => n,SendText(Your Text Here)
			</example>
			<example title="Send a JSON String">
			 same => n,Set(SENDTEXT_CONTENT_TYPE=text/json)
			 same => n,SendText({"foo":a, "bar":23})
			</example>
			<example title="Send a JSON String (alternate)">
			 same => n,Set(SENDTEXT_CONTENT_TYPE=text/json)
			 same => n,Set(SENDTEXT_BODY={"foo":a, "bar":23})
			 same => n,SendText()
			</example>
		</description>
		<see-also>
			<ref type="application">ReceiveText</ref>
		</see-also>
	</application>
	<application name="ReceiveText" language="en_US" module="app_sendtext">
		<since>
			<version>16.24.0</version>
			<version>18.10.0</version>
			<version>19.2.0</version>
		</since>
		<synopsis>
			Receive a Text Message on a channel.
		</synopsis>
		<syntax>
			<parameter name="timeout" required="false">
				<para>Time in seconds to wait for text. Default is 0 (forever).</para>
			</parameter>
		</syntax>
		<description>
			<para>Waits for <replaceable>timeout</replaceable> seconds on the current channel
			to receive text.</para>
			<para>Result of transmission will be stored in the following variables:</para>
			<variablelist>
				<variable name="RECEIVETEXTMESSAGE">
					<para>The received text message.</para>
				</variable>
				<variable name="RECEIVETEXTSTATUS">
					<value name="SUCCESS">
						Transmission succeeded.
					</value>
					<value name="FAILURE">
						Transmission failed or timed out.
					</value>
				</variable>
			</variablelist>
			<example title="Receive message on channel">
			 same => n,ReceiveText()
			 same => n,NoOp(${RECEIVETEXTMESSAGE})
			</example>
		</description>
		<see-also>
			<ref type="application">SendText</ref>
		</see-also>
	</application>
<module language="en_US" name="app_sf">
	<support_level>extended</support_level>
</module>
	<application name="ReceiveSF" language="en_US" module="app_sf">
		<since>
			<version>16.24.0</version>
			<version>18.10.0</version>
			<version>19.2.0</version>
		</since>
		<synopsis>
			Detects SF digits on a channel and saves them to a variable.
		</synopsis>
		<syntax>
			<parameter name="variable" required="true">
				<para>The input digits will be stored in the given
				<replaceable>variable</replaceable> name.</para>
			</parameter>
			<parameter name="digits" required="false">
				<para>Maximum number of digits to read. Default is unlimited.</para>
			</parameter>
			<parameter name="timeout">
				<para>The number of seconds to wait for all digits, if greater
				than <literal>0</literal>. Can be floating point. Default
				is no timeout.</para>
			</parameter>
			<parameter name="frequency">
				<para>The frequency for which to detect pulsed digits.
				Default is 2600 Hz.</para>
			</parameter>
			<parameter name="options">
				<optionlist>
					<option name="d">
						<para>Delay audio by a frame to try to extra quelch.</para>
					</option>
					<option name="e">
						<para>Allow receiving extra pulses 11 through 16.</para>
					</option>
					<option name="m">
						<para>Mute conference.</para>
					</option>
					<option name="t">
						<para>Post-digit timeout, in seconds. If more than this amount of time
						elapses after a digit, the number will be deemed finalized and
						the application will return This is useful when reading a variable
						number of digits that is unknown in advance.</para>
						<para>This can be almost any positive decimal number of seconds, but must
						be no less than 0.6 seconds, since this is the SF inter-digit timeout.
						The default is 0.8, which should be compatible with <literal>SendSF</literal>.
						Values lower than 0.75 will generally produce unreliable results.</para>
						<para>Note this timer only kicks in after at least one digit has been received,
						to account for sender/receiver synchronization.</para>
						<para>Note that <literal>RECEIVESFSTATUS</literal> will still be
						set to <literal>TIMEOUT</literal> if the post-digit timer expires.</para>
					</option>
					<option name="q">
						<para>Quelch SF from in-band.</para>
					</option>
					<option name="r">
						<para>"Radio" mode (relaxed SF).</para>
					</option>
				</optionlist>
			</parameter>
		</syntax>
		<description>
			<para>Reads SF digits from the user in to the given
			<replaceable>variable</replaceable>.</para>
			<para>This application does not automatically answer the channel and
			should be preceded with <literal>Answer</literal> or
			<literal>Progress</literal> as needed.</para>
			<variablelist>
				<variable name="RECEIVESFSTATUS">
					<para>This is the status of the read operation.</para>
					<value name="START" />
					<value name="ERROR" />
					<value name="HANGUP" />
					<value name="MAXDIGITS" />
					<value name="TIMEOUT" />
				</variable>
			</variablelist>
		</description>
		<see-also>
			<ref type="application">ReceiveMF</ref>
			<ref type="application">SendMF</ref>
			<ref type="application">SendSF</ref>
			<ref type="application">Read</ref>
		</see-also>
	</application>
	<application name="SendSF" language="en_US" module="app_sf">
		<since>
			<version>16.24.0</version>
			<version>18.10.0</version>
			<version>19.2.0</version>
		</since>
		<synopsis>
			Sends arbitrary SF digits on the current or specified channel.
		</synopsis>
		<syntax>
			<parameter name="digits" required="true">
				<para>List of digits 0-9 to send; w for a half-second pause,
				also f or F for a flash-hook if the channel supports flash-hook,
				h or H for 250 ms of 2600 Hz, and W for a wink if the channel
				supports wink.</para>
			</parameter>
			<parameter name="frequency" required="false">
				<para>Frequency to use. (defaults to 2600 Hz).</para>
			</parameter>
			<parameter name="channel" required="false">
				<para>Channel where digits will be played</para>
			</parameter>
		</syntax>
		<description>
			<para>It will send all digits or terminate if it encounters an error.</para>
		</description>
		<see-also>
			<ref type="application">SendDTMF</ref>
			<ref type="application">SendMF</ref>
			<ref type="application">ReceiveMF</ref>
			<ref type="application">ReceiveSF</ref>
		</see-also>
	</application>
<module language="en_US" name="app_signal">
	<support_level>extended</support_level>
</module>
	<application name="Signal" language="en_US" module="app_signal">
		<since>
			<version>18.17.0</version>
			<version>20.2.0</version>
		</since>
		<synopsis>
			Sends a signal to any waiting channels.
		</synopsis>
		<syntax>
			<parameter name="signalname" required="true">
				<para>Name of signal to send.</para>
			</parameter>
			<parameter name="payload" required="false">
				<para>Payload data to deliver.</para>
			</parameter>
		</syntax>
		<description>
			<para>Sends a named signal to any channels that may be
			waiting for one. Acts as a producer in a simple
			message queue.</para>
			<variablelist>
				<variable name="SIGNALSTATUS">
					<value name="SUCCESS">
						Signal was successfully sent to at least
						one listener for processing.
					</value>
					<value name="FAILURE">
						Signal could not be sent or nobody
						was listening for this signal.
					</value>
				</variable>
			</variablelist>
			<example title="Send a signal named workdone">
			same => n,Signal(workdone,Work has completed)
			</example>
		</description>
		<see-also>
			<ref type="application">WaitForSignal</ref>
		</see-also>
	</application>
	<application name="WaitForSignal" language="en_US" module="app_signal">
		<since>
			<version>18.17.0</version>
			<version>20.2.0</version>
		</since>
		<synopsis>
			Waits for a named signal on a channel.
		</synopsis>
		<syntax>
			<parameter name="signalname" required="true">
				<para>Name of signal to send.</para>
			</parameter>
			<parameter name="signaltimeout" required="false">
				<para>Maximum time, in seconds, to wait for signal.</para>
			</parameter>
		</syntax>
		<description>
			<para>Waits for <replaceable>signaltimeout</replaceable> seconds on the current
			channel to receive a signal with name <replaceable>signalname</replaceable>.
			Acts as a consumer in a simple message queue.</para>
			<para>Result of signal wait will be stored in the following variables:</para>
			<variablelist>
				<variable name="WAITFORSIGNALSTATUS">
					<value name="SIGNALED">
						Signal was received.
					</value>
					<value name="TIMEOUT">
						Timed out waiting for signal.
					</value>
					<value name="HANGUP">
						Channel hung up before signal was received.
					</value>
				</variable>
				<variable name="WAITFORSIGNALPAYLOAD">
					<para>Data payload attached to signal, if it exists</para>
				</variable>
			</variablelist>
			<example title="Wait for the workdone signal, indefinitely, and print out payload">
			same => n,WaitForSignal(workdone)
			same => n,NoOp(Received: ${WAITFORSIGNALPAYLOAD})
			</example>
		</description>
		<see-also>
			<ref type="application">Signal</ref>
		</see-also>
	</application>
<module language="en_US" name="app_skel">
	<defaultenabled>no</defaultenabled>
	<support_level>core</support_level>
</module>
	<application name="SkelGuessNumber" language="en_US" module="app_skel">
		<since>
			<version>11.0.0</version>
		</since>
		<synopsis>
			An example number guessing game
		</synopsis>
		<syntax>
			<parameter name="level" required="true"/>
			<parameter name="options">
				<optionlist>
					<option name="c">
						<para>The computer should cheat</para>
					</option>
					<option name="n">
						<para>How many games to play before hanging up</para>
					</option>
				</optionlist>
			</parameter>
		</syntax>
		<description>
		<para>This simple number guessing application is a template to build other applications
		from. It shows you the basic structure to create your own Asterisk applications.</para>
		</description>
	</application>

	<configInfo name="app_skel" language="en_US">
		<configFile name="app_skel.conf">
			<configObject name="globals">
				<since>
					<version>12.0.0</version>
				</since>
				<synopsis>Options that apply globally to app_skel</synopsis>
				<configOption name="games">
					<since>
						<version>11.0.0</version>
					</since>
					<synopsis>The number of games a single execution of SkelGuessNumber will play</synopsis>
				</configOption>
				<configOption name="cheat">
					<since>
						<version>11.0.0</version>
					</since>
					<synopsis>Should the computer cheat?</synopsis>
					<description><para>If enabled, the computer will ignore winning guesses.</para></description>
				</configOption>
			</configObject>
			<configObject name="sounds">
				<since>
					<version>12.0.0</version>
				</since>
				<synopsis>Prompts for SkelGuessNumber to play</synopsis>
				<configOption name="prompt" default="please-enter-your&amp;number&amp;queue-less-than">
					<since>
						<version>11.0.0</version>
					</since>
					<synopsis>A prompt directing the user to enter a number less than the max number</synopsis>
				</configOption>
				<configOption name="wrong_guess" default="vm-pls-try-again">
					<since>
						<version>11.0.0</version>
					</since>
					<synopsis>The sound file to play when a wrong guess is made</synopsis>
				</configOption>
				<configOption name="right_guess" default="auth-thankyou">
					<since>
						<version>11.0.0</version>
					</since>
					<synopsis>The sound file to play when a correct guess is made</synopsis>
				</configOption>
				<configOption name="too_low">
					<since>
						<version>11.0.0</version>
					</since>
					<synopsis>The sound file to play when a guess is too low</synopsis>
				</configOption>
				<configOption name="too_high">
					<since>
						<version>11.0.0</version>
					</since>
					<synopsis>The sound file to play when a guess is too high</synopsis>
				</configOption>
				<configOption name="lose" default="vm-goodbye">
					<since>
						<version>11.0.0</version>
					</since>
					<synopsis>The sound file to play when a player loses</synopsis>
				</configOption>
			</configObject>
			<configObject name="level">
				<since>
					<version>12.0.0</version>
				</since>
				<synopsis>Defined levels for the SkelGuessNumber game</synopsis>
				<configOption name="max_number">
					<since>
						<version>11.0.0</version>
					</since>
					<synopsis>The maximum in the range of numbers to guess (1 is the implied minimum)</synopsis>
				</configOption>
				<configOption name="max_guesses">
					<since>
						<version>11.22.0</version>
						<version>13.9.0</version>
					</since>
					<synopsis>The maximum number of guesses before a game is considered lost</synopsis>
				</configOption>
			</configObject>
		</configFile>
	</configInfo>
<module language="en_US" name="app_sla">
	<depend>app_confbridge</depend>
	<support_level>extended</support_level>
</module>
	<application name="SLAStation" language="en_US" module="app_sla">
		<since>
			<version>21.0.0</version>
		</since>
		<synopsis>
			Shared Line Appearance Station.
		</synopsis>
		<syntax>
			<parameter name="station" required="true">
				<para>Station name</para>
			</parameter>
		</syntax>
		<description>
			<para>This application should be executed by an SLA station. The argument depends
			on how the call was initiated. If the phone was just taken off hook, then the argument
			<replaceable>station</replaceable> should be just the station name. If the call was
			initiated by pressing a line key, then the station name should be preceded by an underscore
			and the trunk name associated with that line button.</para>
			<para>For example: <literal>station1_line1</literal></para>
			<para>On exit, this application will set the variable <variable>SLASTATION_STATUS</variable> to
			one of the following values:</para>
			<variablelist>
				<variable name="SLASTATION_STATUS">
					<value name="FAILURE" />
					<value name="CONGESTION" />
					<value name="SUCCESS" />
				</variable>
			</variablelist>
		</description>
	</application>
	<application name="SLATrunk" language="en_US" module="app_sla">
		<since>
			<version>21.0.0</version>
		</since>
		<synopsis>
			Shared Line Appearance Trunk.
		</synopsis>
		<syntax>
			<parameter name="trunk" required="true">
				<para>Trunk name</para>
			</parameter>
			<parameter name="options">
				<optionlist>
					<option name="M" hasparams="optional">
						<para>Play back the specified MOH <replaceable>class</replaceable>
						instead of ringing</para>
						<argument name="class" required="true" />
					</option>
				</optionlist>
			</parameter>
		</syntax>
		<description>
			<para>This application should be executed by an SLA trunk on an inbound call. The channel calling
			this application should correspond to the SLA trunk with the name <replaceable>trunk</replaceable>
			that is being passed as an argument.</para>
			<para>On exit, this application will set the variable <variable>SLATRUNK_STATUS</variable> to
			one of the following values:</para>
			<variablelist>
				<variable name="SLATRUNK_STATUS">
					<value name="FAILURE" />
					<value name="SUCCESS" />
					<value name="UNANSWERED" />
					<value name="RINGTIMEOUT" />
				</variable>
			</variablelist>
		</description>
	</application>
<module language="en_US" name="app_sms">
	<support_level>extended</support_level>
</module>
	<application name="SMS" language="en_US" module="app_sms">
		<since>
			<version>1.6.1.0</version>
		</since>
		<synopsis>
			Communicates with SMS service centres and SMS capable analogue phones.
		</synopsis>
		<syntax>
			<parameter name="name" required="true">
				<para>The name of the queue used in <filename>/var/spool/asterisk/sms</filename></para>
			</parameter>
			<parameter name="options">
				<optionlist>
					<option name="a">
						<para>Answer, i.e. send initial FSK packet.</para>
					</option>
					<option name="s">
						<para>Act as service centre talking to a phone.</para>
					</option>
					<option name="t">
						<para>Use protocol 2 (default used is protocol 1).</para>
					</option>
					<option name="p">
						<para>Set the initial delay to N ms (default is <literal>300</literal>).
						addr and body are a deprecated format to send messages out.</para>
					</option>
					<option name="r">
						<para>Set the Status Report Request (SRR) bit.</para>
					</option>
					<option name="o">
						<para>The body should be coded as octets not 7-bit symbols.</para>
					</option>
					<option name="n">
						<para>Do not log any SMS content to log file (privacy).</para>
					</option>
				</optionlist>
			</parameter>
			<parameter name="addr" />
			<parameter name="body" />
		</syntax>
		<description>
			<para>SMS handles exchange of SMS data with a call to/from SMS capable phone or SMS PSTN service center.
			Can send and/or receive SMS messages. Works to ETSI ES 201 912; compatible with BT SMS PSTN service in
			UK and Telecom Italia in Italy. It has also been tested to work with DOMO phones from Telefónica Spain.</para>
			<para>Typical usage is to use to handle calls from the SMS service centre CLI, or to set up a call using
			<literal>outgoing</literal> or manager interface to connect service centre to SMS().</para>
			<para>"Messages are processed as per text file message queues. smsq (a separate software) is a command to
			generate message queues and send messages.</para>
			<note><para>The protocol has tight delay bounds. Please use short frames and disable/keep short the
			jitter buffer on the ATA to make sure that responses (ACK etc.) are received in time.</para>
			<para>It is also important to adjust the gain dB of the ATA. Some Telefónica DOMO Mensajes phones may require
			the gain to be set to +3dB, and others even up to +6dB, in order to work.</para></note>
		</description>
	</application>
<module language="en_US" name="app_softhangup">
	<support_level>core</support_level>
</module>
	<application name="SoftHangup" language="en_US" module="app_softhangup">
		<since>
			<version>0.4.0</version>
		</since>
		<synopsis>
			Hangs up the requested channel.
		</synopsis>
		<syntax>
			<parameter name="Technology/Resource" required="true" />
			<parameter name="options">
				<optionlist>
					<option name="a">
						<para>Hang up all channels on a specified device instead of a single resource</para>
					</option>
				</optionlist>
			</parameter>
		</syntax>
		<description>
			<para>Hangs up the requested channel.  If there are no channels to
			hangup, the application will report it.</para>
		</description>
	</application>

<module language="en_US" name="app_speech_utils">
	<depend>res_speech</depend>
	<support_level>core</support_level>
</module>
	<application name="SpeechCreate" language="en_US" module="app_speech_utils">
		<since>
			<version>1.6.1.0</version>
		</since>
		<synopsis>
			Create a Speech Structure.
		</synopsis>
		<syntax>
			<parameter name="engine_name" required="true" />
		</syntax>
		<description>
			<para>This application creates information to be used by all the other applications.
			It must be called before doing any speech recognition activities such as activating a grammar.
			It takes the engine name to use as the argument, if not specified the default engine will be used.</para>
			<para>Sets the ERROR channel variable to 1 if the engine cannot be used.</para>
		</description>
	</application>
	<application name="SpeechActivateGrammar" language="en_US" module="app_speech_utils">
		<since>
			<version>1.6.1.0</version>
		</since>
		<synopsis>
			Activate a grammar.
		</synopsis>
		<syntax>
			<parameter name="grammar_name" required="true" />
		</syntax>
		<description>
			<para>This activates the specified grammar to be recognized by the engine.
			A grammar tells the speech recognition engine what to recognize, and how to portray it back to you
			in the dialplan. The grammar name is the only argument to this application.</para>
			<para>Hangs up the channel on failure. If this is not desired, use TryExec.</para>
		</description>
	</application>
	<application name="SpeechStart" language="en_US" module="app_speech_utils">
		<since>
			<version>1.6.1.0</version>
		</since>
		<synopsis>
			Start recognizing voice in the audio stream.
		</synopsis>
		<syntax />
		<description>
			<para>Tell the speech recognition engine that it should start trying to get results from audio being
			fed to it.</para>
			<para>Hangs up the channel on failure. If this is not desired, use TryExec.</para>
		</description>
	</application>
	<application name="SpeechBackground" language="en_US" module="app_speech_utils">
		<since>
			<version>1.6.1.0</version>
		</since>
		<synopsis>
			Play a sound file and wait for speech to be recognized.
		</synopsis>
		<syntax>
			<parameter name="sound_file" required="true" argsep="&amp;">
				<para>Ampersand separated list of filenames. If the filename
				is a relative filename (it does not begin with a slash), it
				will be searched for in the Asterisk sounds directory. If the
				filename is able to be parsed as a URL, Asterisk will
				download the file and then begin playback on it. To include a
				literal <literal>&amp;</literal> in the URL you can enclose
				the URL in single quotes.</para>
				<argument name="sound_file" required="true" />
				<argument name="sound_file2" multiple="true" />
			</parameter>
			<parameter name="timeout">
				<para>Timeout integer in seconds. Note the timeout will only start
				once the sound file has stopped playing.</para>
			</parameter>
			<parameter name="options">
				<optionlist>
					<option name="n">
						<para>Don't answer the channel if it has not already been answered.</para>
					</option>
					<option name="p">
						<para>Return partial results when backend is terminated by timeout.</para>
					</option>
				</optionlist>
			</parameter>
		</syntax>
		<description>
			<para>This application plays a sound file and waits for the person to speak. Once they start speaking playback
			of the file stops, and silence is heard. Once they stop talking the processing sound is played to indicate
			the speech recognition engine is working. Once results are available the application returns and results
			(score and text) are available using dialplan functions.</para>
			<para>The first text and score are ${SPEECH_TEXT(0)} AND ${SPEECH_SCORE(0)} while the second are ${SPEECH_TEXT(1)}
			and ${SPEECH_SCORE(1)}.</para>
			<para>The first argument is the sound file and the second is the timeout integer in seconds.</para>
			<para>Hangs up the channel on failure. If this is not desired, use TryExec.</para>

		</description>
	</application>
	<application name="SpeechDeactivateGrammar" language="en_US" module="app_speech_utils">
		<since>
			<version>1.6.1.0</version>
		</since>
		<synopsis>
			Deactivate a grammar.
		</synopsis>
		<syntax>
			<parameter name="grammar_name" required="true">
				<para>The grammar name to deactivate</para>
			</parameter>
		</syntax>
		<description>
			<para>This deactivates the specified grammar so that it is no longer recognized.</para>
			<para>Hangs up the channel on failure. If this is not desired, use TryExec.</para>
		</description>
	</application>
	<application name="SpeechProcessingSound" language="en_US" module="app_speech_utils">
		<since>
			<version>1.6.1.0</version>
		</since>
		<synopsis>
			Change background processing sound.
		</synopsis>
		<syntax>
			<parameter name="sound_file" required="true" />
		</syntax>
		<description>
			<para>This changes the processing sound that SpeechBackground plays back when the speech recognition engine is
			processing and working to get results.</para>
			<para>Hangs up the channel on failure. If this is not desired, use TryExec.</para>
		</description>
	</application>
	<application name="SpeechDestroy" language="en_US" module="app_speech_utils">
		<since>
			<version>1.6.1.0</version>
		</since>
		<synopsis>
			End speech recognition.
		</synopsis>
		<syntax />
		<description>
			<para>This destroys the information used by all the other speech recognition applications.
			If you call this application but end up wanting to recognize more speech, you must call SpeechCreate()
			again before calling any other application.</para>
			<para>Hangs up the channel on failure. If this is not desired, use TryExec.</para>
		</description>
	</application>
	<application name="SpeechLoadGrammar" language="en_US" module="app_speech_utils">
		<since>
			<version>1.6.1.0</version>
		</since>
		<synopsis>
			Load a grammar.
		</synopsis>
		<syntax>
			<parameter name="grammar_name" required="true" />
			<parameter name="path" required="true" />
		</syntax>
		<description>
			<para>Load a grammar only on the channel, not globally.</para>
			<para>Hangs up the channel on failure. If this is not desired, use TryExec.</para>
		</description>
	</application>
	<application name="SpeechUnloadGrammar" language="en_US" module="app_speech_utils">
		<since>
			<version>1.6.1.0</version>
		</since>
		<synopsis>
			Unload a grammar.
		</synopsis>
		<syntax>
			<parameter name="grammar_name" required="true" />
		</syntax>
		<description>
			<para>Unload a grammar.</para>
			<para>Hangs up the channel on failure. If this is not desired, use TryExec.</para>
		</description>
	</application>
	<function name="SPEECH_SCORE" language="en_US" module="app_speech_utils">
		<since>
			<version>1.6.1.0</version>
		</since>
		<synopsis>
			Gets the confidence score of a result.
		</synopsis>
		<syntax argsep="/">
			<parameter name="nbest_number" />
			<parameter name="result_number" required="true" />
		</syntax>
		<description>
			<para>Gets the confidence score of a result.</para>
		</description>
	</function>
	<function name="SPEECH_TEXT" language="en_US" module="app_speech_utils">
		<since>
			<version>1.6.1.0</version>
		</since>
		<synopsis>
			Gets the recognized text of a result.
		</synopsis>
		<syntax argsep="/">
			<parameter name="nbest_number" />
			<parameter name="result_number" required="true" />
		</syntax>
		<description>
			<para>Gets the recognized text of a result.</para>
		</description>
	</function>
	<function name="SPEECH_GRAMMAR" language="en_US" module="app_speech_utils">
		<since>
			<version>1.6.1.0</version>
		</since>
		<synopsis>
			Gets the matched grammar of a result if available.
		</synopsis>
		<syntax argsep="/">
			<parameter name="nbest_number" />
			<parameter name="result_number" required="true" />
		</syntax>
		<description>
			<para>Gets the matched grammar of a result if available.</para>
		</description>
	</function>
	<function name="SPEECH_ENGINE" language="en_US" module="app_speech_utils">
		<since>
			<version>1.6.1.0</version>
		</since>
		<synopsis>
			Get or change a speech engine specific attribute.
		</synopsis>
		<syntax>
			<parameter name="name" required="true" />
		</syntax>
		<description>
			<para>Changes a speech engine specific attribute.</para>
		</description>
	</function>
	<function name="SPEECH_RESULTS_TYPE" language="en_US" module="app_speech_utils">
		<since>
			<version>1.6.1.0</version>
		</since>
		<synopsis>
			Sets the type of results that will be returned.
		</synopsis>
		<syntax />
		<description>
			<para>Sets the type of results that will be returned. Valid options are normal or nbest.</para>
		</description>
	</function>
	<function name="SPEECH" language="en_US" module="app_speech_utils">
		<since>
			<version>1.6.1.0</version>
		</since>
		<synopsis>
			Gets information about speech recognition results.
		</synopsis>
		<syntax>
			<parameter name="argument" required="true">
				<enumlist>
					<enum name="status">
						<para>Returns <literal>1</literal> upon speech object existing,
						or <literal>0</literal> if not</para>
					</enum>
					<enum name="spoke">
						<para>Returns <literal>1</literal> if spoker spoke,
						or <literal>0</literal> if not</para>
					</enum>
					<enum name="results">
						<para>Returns number of results that were recognized.</para>
					</enum>
				</enumlist>
			</parameter>
		</syntax>
		<description>
			<para>Gets information about speech recognition results.</para>
		</description>
	</function>
<module language="en_US" name="app_stack">
	<use type="module">res_agi</use>
	<support_level>core</support_level>
</module>
	<application name="Gosub" language="en_US" module="app_stack">
		<since>
			<version>1.2.0</version>
		</since>
		<synopsis>
			Jump to label, saving return address.
		</synopsis>
		<syntax>
			<parameter name="context" documentationtype="dialplan_context" />
			<parameter name="extension" documentationtype="dialplan_extension" />
			<parameter name="priority" documentationtype="dialplan_priority" required="true" hasparams="optional">
				<argument name="arg1" multiple="true" required="true" />
				<argument name="argN" />
			</parameter>
		</syntax>
		<description>
			<para>Jumps to the label specified, saving the return address.</para>
		</description>
		<see-also>
			<ref type="application">GosubIf</ref>
			<ref type="application">Goto</ref>
			<ref type="application">Return</ref>
			<ref type="application">StackPop</ref>
		</see-also>
	</application>
	<application name="GosubIf" language="en_US" module="app_stack">
		<since>
			<version>1.2.0</version>
		</since>
		<synopsis>
			Conditionally jump to label, saving return address.
		</synopsis>
		<syntax argsep="?">
			<parameter name="condition" required="true" />
			<parameter name="destination" required="true" argsep=":">
				<argument name="labeliftrue" hasparams="optional">
					<para>Continue at <replaceable>labeliftrue</replaceable> if the condition is true.
					Takes the form similar to Goto() of [[context,]extension,]priority.</para>
					<argument name="arg1" required="true" multiple="true" />
					<argument name="argN" />
				</argument>
				<argument name="labeliffalse" hasparams="optional">
					<para>Continue at <replaceable>labeliffalse</replaceable> if the condition is false.
					Takes the form similar to Goto() of [[context,]extension,]priority.</para>
					<argument name="arg1" required="true" multiple="true" />
					<argument name="argN" />
				</argument>
			</parameter>
		</syntax>
		<description>
			<para>If the condition is true, then jump to labeliftrue.  If false, jumps to
			labeliffalse, if specified.  In either case, a jump saves the return point
			in the dialplan, to be returned to with a Return.</para>
		</description>
		<see-also>
			<ref type="application">Gosub</ref>
			<ref type="application">Return</ref>
			<ref type="function">IF</ref>
			<ref type="application">GotoIf</ref>
			<ref type="application">Goto</ref>
		</see-also>
	</application>
	<application name="Return" language="en_US" module="app_stack">
		<since>
			<version>1.2.0</version>
		</since>
		<synopsis>
			Return from gosub routine.
		</synopsis>
		<syntax>
			<parameter name="value">
				<para>Return value.</para>
			</parameter>
		</syntax>
		<description>
			<para>Jumps to the last label on the stack, removing it. The return <replaceable>value</replaceable>, if
			any, is saved in the channel variable <variable>GOSUB_RETVAL</variable>.</para>
		</description>
		<see-also>
			<ref type="application">Gosub</ref>
			<ref type="application">StackPop</ref>
		</see-also>
	</application>
	<application name="StackPop" language="en_US" module="app_stack">
		<since>
			<version>1.2.0</version>
		</since>
		<synopsis>
			Remove one address from gosub stack.
		</synopsis>
		<syntax />
		<description>
			<para>Removes last label on the stack, discarding it.</para>
		</description>
		<see-also>
			<ref type="application">Return</ref>
			<ref type="application">Gosub</ref>
		</see-also>
	</application>
	<function name="LOCAL" language="en_US" module="app_stack">
		<since>
			<version>1.6.1.0</version>
		</since>
		<synopsis>
			Manage variables local to the gosub stack frame.
		</synopsis>
		<syntax>
			<parameter name="varname" required="true" />
		</syntax>
		<description>
			<para>Read and write a variable local to the gosub stack frame, once we Return() it will be lost
			(or it will go back to whatever value it had before the Gosub()).</para>
		</description>
		<see-also>
			<ref type="application">Gosub</ref>
			<ref type="application">GosubIf</ref>
			<ref type="application">Return</ref>
		</see-also>
	</function>
	<function name="LOCAL_PEEK" language="en_US" module="app_stack">
		<since>
			<version>1.6.1.0</version>
		</since>
		<synopsis>
			Retrieve variables hidden by the local gosub stack frame.
		</synopsis>
		<syntax>
			<parameter name="n" required="true" />
			<parameter name="varname" required="true" />
		</syntax>
		<description>
			<para>Read a variable <replaceable>varname</replaceable> hidden by
			<replaceable>n</replaceable> levels of gosub stack frames.  Note that ${LOCAL_PEEK(0,foo)}
			is the same as <variable>foo</variable>, since the value of <replaceable>n</replaceable>
			peeks under 0 levels of stack frames; in other words, 0 is the current level.  If
			<replaceable>n</replaceable> exceeds the available number of stack frames, then an empty
			string is returned.</para>
		</description>
		<see-also>
			<ref type="application">Gosub</ref>
			<ref type="application">GosubIf</ref>
			<ref type="application">Return</ref>
		</see-also>
	</function>
	<function name="STACK_PEEK" language="en_US" module="app_stack">
		<since>
			<version>1.8.11.0</version>
			<version>10.3.0</version>
		</since>
		<synopsis>
			View info about the location which called Gosub
		</synopsis>
		<syntax>
			<parameter name="n" required="true" />
			<parameter name="which" required="true" />
			<parameter name="suppress" required="false" />
		</syntax>
		<description>
			<para>Read the calling <literal>c</literal>ontext, <literal>e</literal>xtension,
			<literal>p</literal>riority, or <literal>l</literal>abel, as specified by
			<replaceable>which</replaceable>, by going up <replaceable>n</replaceable> frames
			in the Gosub stack.  If <replaceable>suppress</replaceable> is true, then if the
			number of available stack frames is exceeded, then no error message will be
			printed.</para>
		</description>
	</function>
	<agi name="gosub" language="en_US">
		<synopsis>
			Cause the channel to execute the specified dialplan subroutine.
		</synopsis>
		<syntax>
			<parameter name="context" required="true" />
			<parameter name="extension" required="true" />
			<parameter name="priority" required="true" />
			<parameter name="optional-argument" />
		</syntax>
		<description>
			<para>Cause the channel to execute the specified dialplan subroutine,
			returning to the dialplan with execution of a Return().</para>
		</description>
		<see-also>
			<ref type="application">Gosub</ref>
		</see-also>
	</agi>
	<managerEvent language="en_US" name="VarSet" module="app_stack">
		<managerEventInstance class="EVENT_FLAG_DIALPLAN" module="app_stack">
			<since>
				<version>12.0.0</version>
			</since>
			<synopsis>Raised when a variable local to the gosub stack frame is set due to a subroutine call.</synopsis>
			<syntax>
				<channel_snapshot/>
				<parameter name="Variable">
					<para>The LOCAL variable being set.</para>
					<note><para>The variable name will always be enclosed with
					<literal>LOCAL()</literal></para></note>
				</parameter>
				<parameter name="Value">
					<para>The new value of the variable.</para>
				</parameter>
			</syntax>
			<see-also>
				<ref type="application">Gosub</ref>
				<ref type="agi">gosub</ref>
				<ref type="function">LOCAL</ref>
				<ref type="function">LOCAL_PEEK</ref>
			</see-also>
		</managerEventInstance>
	</managerEvent>
<module language="en_US" name="app_stasis">
	<depend>res_stasis</depend>
	<depend>res_ari</depend>
	<support_level>core</support_level>
</module>
	<application name="Stasis" language="en_US" module="app_stasis">
		<since>
			<version>12.0.0</version>
		</since>
		<synopsis>Invoke an external Stasis application.</synopsis>
		<syntax>
			<parameter name="app_name" required="true">
				<para>Name of the application to invoke.</para>
			</parameter>
			<parameter name="args">
				<para>Optional comma-delimited arguments for the
				application invocation.</para>
			</parameter>
		</syntax>
		<description>
			<para>Invoke a Stasis application.</para>
			<para>This application will set the following channel variable upon
			completion:</para>
			<variablelist>
				<variable name="STASISSTATUS">
					<para>This indicates the status of the execution of the
					Stasis application.</para>
					<value name="SUCCESS">
						The channel has exited Stasis without any failures in
						Stasis.
					</value>
					<value name="FAILED">
						A failure occurred when executing the Stasis
						The app registry is not instantiated; The app
						application. Some (not all) possible reasons for this:
						requested is not registered; The app requested is not
						active; Stasis couldn't send a start message.
					</value>
				</variable>
			</variablelist>
		</description>
	</application>
<module language="en_US" name="app_stasis_broadcast">
	<depend type="module">res_stasis</depend>
	<depend type="module">res_stasis_broadcast</depend>
	<support_level>extended</support_level>
</module>
	<application name="StasisBroadcast" language="en_US" module="app_stasis_broadcast">
		<since>
			<version>20.17.0</version>
			<version>22.7.0</version>
			<version>23.1.0</version>
		</since>
		<synopsis>Broadcast a channel to multiple ARI applications for claiming,
		then hand control to the winning application.</synopsis>
		<syntax>
			<parameter name="timeout">
				<para>Timeout in milliseconds to wait for a claim.</para>
				<para>Valid range: 0 to 60000ms</para>
				<para>Default: 500ms</para>
			</parameter>
			<parameter name="app_filter">
				<para>Regular expression to filter which ARI applications
				receive the broadcast. Only applications with names matching
				the regex will be notified.</para>
				<para>Because arguments are comma-delimited, commas cannot
				appear in the regex pattern. Use character classes
				(e.g. <literal>[,]</literal>) if a literal comma is
				needed, or omit the filter and handle selection in the
				ARI application.</para>
				<para>Default: all connected applications</para>
			</parameter>
			<parameter name="args">
				<para>Optional colon-delimited arguments passed to the winning
				application via the <literal>StasisStart</literal> event. These
				are equivalent to the extra arguments in <literal>Stasis()</literal>.</para>
				<para>Example: <literal>sales:priority-high</literal></para>
			</parameter>
			<parameter name="notify_claimed">
				<para>Whether to send a <literal>CallClaimed</literal> event to
				ARI applications when a channel is claimed.</para>
				<para>When enabled, the <literal>CallClaimed</literal> event is
				sent only to applications that matched the
				<replaceable>app_filter</replaceable> (or all applications if no
				filter was set).</para>
				<para>Disabled by default to minimise WebSocket traffic under
				high load. Losing claimants already receive a
				<literal>409</literal> HTTP response.</para>
				<para>Default: no</para>
			</parameter>
		</syntax>
		<description>
			<para>Broadcasts the incoming channel to all connected ARI applications
			(or a filtered subset) via a <literal>CallBroadcast</literal> event.
			ARI applications can respond with a claim request. The first application
			to claim the channel wins, and subsequent claims are rejected.</para>
			<para>If an application claims the channel within the timeout, the channel
			is automatically placed under Stasis control with the winning application,
			exactly as if <literal>Stasis(winner_app)</literal> had been called.
			The winning application receives a <literal>StasisStart</literal> event
			and has full channel control until it calls <literal>continue</literal>
			or the channel hangs up.</para>
			<para>If no application claims the channel within the timeout, control
			returns to the dialplan immediately, allowing fallback handling.</para>
			<para>This application will set the following channel variables:</para>
			<variablelist>
				<variable name="STASISSTATUS">
					<value name="SUCCESS">
						An application claimed the channel and the Stasis
						session completed without failures.
					</value>
					<value name="FAILED">
						An application claimed the channel but a failure
						occurred when executing the Stasis application.
					</value>
					<value name="TIMEOUT">
						No application claimed the channel within the
						timeout period.
					</value>
				</variable>
			</variablelist>
			<example>
			; Broadcast with default timeout (500ms) to all apps
			; Channel automatically enters Stasis with the winner
			exten => _X.,1,StasisBroadcast()
			 same => n,GotoIf($["${STASISSTATUS}"="TIMEOUT"]?no_route)
			 same => n,Hangup()
			 same => n(no_route),Playback(sorry-no-agent)
			 same => n,Hangup()
			</example>
			<example>
			; Broadcast with custom timeout, app filter, and args for the winner
			exten => _X.,1,StasisBroadcast(2000,^ivr-.*,sales:priority-high)
			 same => n,GotoIf($["${STASISSTATUS}"="TIMEOUT"]?no_route)
			 same => n,Hangup()
			 same => n(no_route),Playback(sorry-no-agent)
			 same => n,Hangup()
			</example>
		</description>
	</application>
<module language="en_US" name="app_statsd">
	<depend>res_statsd</depend>
	<defaultenabled>no</defaultenabled>
	<support_level>extended</support_level>
</module>
	<application name="StatsD" language="en_US" module="app_statsd">
		<since>
			<version>13.20.0</version>
			<version>15.3.0</version>
		</since>
		<synopsis>
			Allow statistics to be passed to the StatsD server from the dialplan.
		</synopsis>
		<syntax>
			<parameter name="metric_type" required="true">
				<para>The metric type to be sent to StatsD. Valid metric types
				are 'g' for gauge, 'c' for counter, 'ms' for timer, and 's' for
				sets.</para>
			</parameter>
			<parameter name="statistic_name" required="true">
				<para>The name of the variable to be sent to StatsD. Statistic
				names cannot contain the pipe (|) character.</para>
			</parameter>
			<parameter name="value" required="true">
				<para>The value of the variable to be sent to StatsD. Values
				must be numeric. Values for gauge and counter metrics can be
				sent with a '+' or '-' to update a value after the value has
				been initialized. Only counters can be initialized as negative.
				Sets can send a string as the value parameter, but the string
				cannot contain the pipe character.</para>
			</parameter>
			<parameter name="sample_rate">
				<para>The value of the sample rate to be sent to StatsD. Sample
				rates less than or equal to 0 will never be sent and sample rates
				greater than or equal to 1 will always be sent. Any rate
				between 1 and 0 will be compared to a randomly generated value,
				and if it is greater than the random value, it will be sent.</para>
			</parameter>
		</syntax>
		<description>
			<para>This dialplan application sends statistics to the StatsD
			server specified inside of <literal>statsd.conf</literal>.</para>
		</description>
	</application>
<module language="en_US" name="app_stream_echo">
	<support_level>core</support_level>
</module>
	<application name="StreamEcho" language="en_US" module="app_stream_echo">
		<since>
			<version>15.0.0</version>
		</since>
		<synopsis>
			Echo media, up to 'N' streams of a type, and DTMF back to the calling party
		</synopsis>
		<syntax>
		<parameter name="num" required="false">
			<para>The number of streams of a type to echo back. If '0' is specified then
			all streams of a type are removed.</para>
		</parameter>
		<parameter name="type" required="false">
			<para>The media type of the stream(s) to add or remove (in the case of "num"
			being '0'). This can be set to either "audio" or "video" (default). If "num"
			is empty (i.e. not specified) then this parameter is ignored.</para>
		</parameter>
		</syntax>
		<description>
			<para>If a "num" (the number of streams) is not given then this simply echos
			back any media or DTMF frames (note, however if '#' is detected then the
			application exits) read from the calling channel back to itself. This means
			for any relevant frame read from a particular stream it is written back out
			to the associated write stream in a one to one fashion.
			</para>
			<para>However if a "num" is specified, and if the calling channel allows it
			(a new offer is made requesting the allowance of additional streams) then any
			any media received, like before, is echoed back onto each stream. However, in
			this case a relevant frame received on a stream of the given "type" is also
			echoed back out to the other streams of that same type. It should be noted that
			when operating in this mode only the first stream found of the given "type" is
			allowed from the original offer. And this first stream found is also the only
			stream of that "type" granted read (send/receive) capabilities in the new offer
			whereas the additional ones are set to receive only.</para>
			<note><para>This does not echo CONTROL, MODEM, or NULL frames.</para></note>
		</description>
	</application>
<module language="en_US" name="app_system">
	<support_level>core</support_level>
</module>
	<application name="System" language="en_US" module="app_system">
		<since>
			<version>0.1.2</version>
		</since>
		<synopsis>
			Execute a system command.
		</synopsis>
		<syntax>
			<parameter name="command" required="true">
				<para>Command to execute</para>
				<warning><para>Do not use untrusted strings such as <variable>CALLERID(num)</variable>
				or <variable>CALLERID(name)</variable> as part of the command parameters.  You
				risk a command injection attack executing arbitrary commands if the untrusted
				strings aren't filtered to remove dangerous characters.  See function
				<variable>FILTER()</variable>.</para></warning>
			</parameter>
		</syntax>
		<description>
			<para>Executes a command  by  using  system(). If the command
			fails, the console should report a fallthrough.</para>
			<para>Result of execution is returned in the <variable>SYSTEMSTATUS</variable> channel variable:</para>
			<variablelist>
				<variable name="SYSTEMSTATUS">
					<value name="FAILURE">
						Could not execute the specified command.
					</value>
					<value name="SUCCESS">
						Specified command successfully executed.
					</value>
				</variable>
			</variablelist>
		</description>
	</application>
	<application name="TrySystem" language="en_US" module="app_system">
		<since>
			<version>1.0.0</version>
		</since>
		<synopsis>
			Try executing a system command.
		</synopsis>
		<syntax>
			<parameter name="command" required="true">
				<para>Command to execute</para>
				<warning><para>Do not use untrusted strings such as <variable>CALLERID(num)</variable>
				or <variable>CALLERID(name)</variable> as part of the command parameters.  You
				risk a command injection attack executing arbitrary commands if the untrusted
				strings aren't filtered to remove dangerous characters.  See function
				<variable>FILTER()</variable>.</para></warning>
			</parameter>
		</syntax>
		<description>
			<para>Executes a command  by  using  system().</para>
			<para>Result of execution is returned in the <variable>SYSTEMSTATUS</variable> channel variable:</para>
			<variablelist>
				<variable name="SYSTEMSTATUS">
					<value name="FAILURE">
						Could not execute the specified command.
					</value>
					<value name="SUCCESS">
						Specified command successfully executed.
					</value>
					<value name="APPERROR">
						Specified command successfully executed, but returned error code.
					</value>
				</variable>
			</variablelist>
		</description>
	</application>

<module language="en_US" name="app_talkdetect">
	<support_level>core</support_level>
</module>
	<application name="BackgroundDetect" language="en_US" module="app_talkdetect">
		<since>
			<version>1.6.1.0</version>
		</since>
		<synopsis>
			Background a file with talk detect.
		</synopsis>
		<syntax>
			<parameter name="filename" required="true" />
			<parameter name="sil">
				<para>If not specified, defaults to <literal>1000</literal>.</para>
			</parameter>
			<parameter name="min">
				<para>If not specified, defaults to <literal>100</literal>.</para>
			</parameter>
			<parameter name="max">
				<para>If not specified, defaults to <literal>infinity</literal>.</para>
			</parameter>
			<parameter name="analysistime">
				<para>If not specified, defaults to <literal>infinity</literal>.</para>
			</parameter>
		</syntax>
		<description>
			<para>Plays back <replaceable>filename</replaceable>, waiting for interruption from a given digit (the digit
			must start the beginning of a valid extension, or it will be ignored). During
			the playback of the file, audio is monitored in the receive direction, and if
			a period of non-silence which is greater than <replaceable>min</replaceable> ms yet less than
			<replaceable>max</replaceable> ms is followed by silence for at least <replaceable>sil</replaceable> ms,
			which occurs during the first <replaceable>analysistime</replaceable> ms, then the audio playback is
			aborted and processing jumps to the <replaceable>talk</replaceable> extension, if available.</para>
		</description>
	</application>
<module language="en_US" name="app_test">
	<support_level>extended</support_level>
</module>
	<application name="TestServer" language="en_US" module="app_test">
		<since>
			<version>1.0.0</version>
		</since>
		<synopsis>
			Execute Interface Test Server.
		</synopsis>
		<syntax />
		<description>
			<para>Perform test server function and write call report. Results stored in
			<filename>/var/log/asterisk/testreports/&lt;testid&gt;-server.txt</filename></para>
		</description>
		<see-also>
			<ref type="application">TestClient</ref>
		</see-also>
	</application>
	<application name="TestClient" language="en_US" module="app_test">
		<since>
			<version>1.0.0</version>
		</since>
		<synopsis>
			Execute Interface Test Client.
		</synopsis>
		<syntax>
			<parameter name="testid" required="true">
				<para>An ID to identify this test.</para>
			</parameter>
		</syntax>
		<description>
			<para>Executes test client with given <replaceable>testid</replaceable>. Results stored in
			<filename>/var/log/asterisk/testreports/&lt;testid&gt;-client.txt</filename></para>
		</description>
		<see-also>
			<ref type="application">TestServer</ref>
		</see-also>
	</application>
<module language="en_US" name="app_transfer">
	<support_level>core</support_level>
</module>
	<application name="Transfer" language="en_US" module="app_transfer">
		<since>
			<version>0.5.0</version>
		</since>
		<synopsis>
			Transfer caller to remote extension.
		</synopsis>
		<syntax>
			<parameter name="dest" required="true" argsep="">
				<argument name="Tech/" />
				<argument name="destination" required="true" />
			</parameter>
		</syntax>
		<description>
			<para>Requests the remote caller be transferred
			to a given destination. If TECH (SIP, IAX2, etc) is used, only
			an incoming call with the same channel technology will be transferred.
			Note that for SIP, if you transfer before call is setup, a 302 redirect
			SIP message will be returned to the caller.</para>
			<para>The result of the application will be reported in the <variable>TRANSFERSTATUS</variable>
			channel variable:</para>
			<variablelist>
				<variable name="TRANSFERSTATUS">
					<value name="SUCCESS">
						Transfer succeeded.
					</value>
					<value name="FAILURE">
						Transfer failed.
					</value>
					<value name="UNSUPPORTED">
						Transfer unsupported by channel driver.
					</value>
				</variable>
				<variable name="TRANSFERSTATUSPROTOCOL">
					<value name="0">
						No error.
					</value>
					<value name="3xx-6xx">
						SIP example - Error result code.
					</value>
				</variable>
			</variablelist>
		</description>
	</application>
<module language="en_US" name="app_userevent">
	<support_level>core</support_level>
</module>
	<application name="UserEvent" language="en_US" module="app_userevent">
		<since>
			<version>1.0.0</version>
		</since>
		<synopsis>
			Send an arbitrary user-defined event to parties interested in a channel (AMI users and relevant res_stasis applications).
		</synopsis>
		<syntax>
			<parameter name="eventname" required="true" />
			<parameter name="body" />
		</syntax>
		<description>
			<para>Sends an arbitrary event to interested parties, with an optional
			<replaceable>body</replaceable> representing additional arguments. The
			<replaceable>body</replaceable> may be specified as
			a <literal>,</literal> delimited list of key:value pairs.</para>
			<para>For AMI, each additional argument will be placed on a new line in
			the event and the format of the event will be:</para>
			<para>    Event: UserEvent</para>
			<para>    UserEvent: &lt;specified event name&gt;</para>
			<para>    [body]</para>
			<para>If no <replaceable>body</replaceable> is specified, only Event and
			UserEvent headers will be present.</para>
			<para>For res_stasis applications, the event will be provided as a JSON
			blob with additional arguments appearing as keys in the object and the
			<replaceable>eventname</replaceable> under the
			<literal>eventname</literal> key.</para>
		</description>
		<see-also>
			<ref type="manager">UserEvent</ref>
			<ref type="managerEvent">UserEvent</ref>
		</see-also>
	</application>
<module language="en_US" name="app_verbose">
	<support_level>core</support_level>
</module>
	<application name="Verbose" language="en_US" module="app_verbose">
		<since>
			<version>1.0.0</version>
		</since>
 		<synopsis>
			Send arbitrary text to verbose output.
		</synopsis>
		<syntax>
			<parameter name="level">
				<para>Must be an integer value.  If not specified, defaults to 0.</para>
			</parameter>
			<parameter name="message" required="true">
				<para>Output text message.</para>
			</parameter>
		</syntax>
		<description>
			<para>Sends an arbitrary text message to verbose output.</para>
		</description>
	</application>
	<application name="Log" language="en_US" module="app_verbose">
		<since>
			<version>1.4.0</version>
		</since>
		<synopsis>
			Send arbitrary text to a selected log level.
		</synopsis>
		<syntax>
			<parameter name="level" required="true">
				<para>Level must be one of <literal>ERROR</literal>, <literal>WARNING</literal>, <literal>NOTICE</literal>,
				<literal>DEBUG</literal>, <literal>VERBOSE</literal>, <literal>DTMF</literal>, or
				the name of a custom dynamic logging level.</para>
			</parameter>
			<parameter name="message" required="true">
				<para>Output text message.</para>
			</parameter>
		</syntax>
		<description>
			<para>Sends an arbitrary text message to a selected log level.</para>
		</description>
	</application>
	<application name="VoiceMail" language="en_US" module="app_voicemail">
		<since>
			<version>0.1.0</version>
		</since>
		<synopsis>
			Leave a Voicemail message.
		</synopsis>
		<syntax>
			<parameter name="mailboxs" argsep="&amp;" required="true">
				<argument name="mailbox1" argsep="@" required="true">
					<argument name="mailbox" required="true" />
					<argument name="context" />
				</argument>
				<argument name="mailbox2" argsep="@" multiple="true">
					<argument name="mailbox" required="true" />
					<argument name="context" />
				</argument>
			</parameter>
			<parameter name="options">
				<optionlist>
					<option name="b">
						<para>Play the <literal>busy</literal> greeting to the calling party.</para>
					</option>
					<option name="d">
						<argument name="c" />
						<para>Accept digits for a new extension in context <replaceable>c</replaceable>,
						if played during the greeting. Context defaults to the current context.</para>
					</option>
					<option name="e">
						<para>Play greetings as early media -- only answer the channel just
						before accepting the voice message.</para>
					</option>
					<option name="g">
						<argument name="#" required="true" />
						<para>Use the specified amount of gain when recording the voicemail
						message. The units are whole-number decibels (dB). Only works on supported
						technologies, which is DAHDI only.</para>
					</option>
					<option name="s">
						<para>Skip the playback of instructions for leaving a message to the
						calling party.</para>
					</option>
					<option name="S">
						<para>Skip the playback of instructions for leaving a message to the
						calling party, but only if a greeting has been recorded by the
						mailbox user.</para>
					</option>
					<option name="t">
						<argument name="x" required="false" />
						<para>Play a custom beep tone to the caller instead of the default one.
						If this option is used but no file is specified, the beep is suppressed.</para>
					</option>
					<option name="u">
						<para>Play the <literal>unavailable</literal> greeting.</para>
					</option>
					<option name="U">
						<para>Mark message as <literal>URGENT</literal>.</para>
					</option>
					<option name="P">
						<para>Mark message as <literal>PRIORITY</literal>.</para>
					</option>
				</optionlist>
			</parameter>
		</syntax>
		<description>
			<para>This application allows the calling party to leave a message for the specified
			list of mailboxes. When multiple mailboxes are specified, the greeting will be taken from
			the first mailbox specified. Dialplan execution will stop if the specified mailbox does not
			exist.</para>
			<para>The Voicemail application will exit if any of the following DTMF digits are received:</para>
			<enumlist>
				<enum name="0">
					<para>Jump to the <literal>o</literal> extension in the current dialplan context.</para>
				</enum>
				<enum name="*">
					<para>Jump to the <literal>a</literal> extension in the current dialplan context.</para>
				</enum>
			</enumlist>
			<para>This application will set the following channel variable upon completion:</para>
			<variablelist>
				<variable name="VMSTATUS">
					<para>This indicates the status of the execution of the VoiceMail application.</para>
					<value name="SUCCESS" />
					<value name="USEREXIT" />
					<value name="FAILED" />
				</variable>
			</variablelist>
		</description>
		<see-also>
			<ref type="application">VoiceMailMain</ref>
		</see-also>
	</application>
	<application name="VoiceMailMain" language="en_US" module="app_voicemail">
		<since>
			<version>0.1.0</version>
		</since>
		<synopsis>
			Check Voicemail messages.
		</synopsis>
		<syntax>
			<parameter name="mailbox" required="true" argsep="@">
				<argument name="mailbox" />
				<argument name="context" />
			</parameter>
			<parameter name="options">
				<optionlist>
					<option name="p">
						<para>Consider the <replaceable>mailbox</replaceable> parameter as a prefix to
						the mailbox that is entered by the caller.</para>
					</option>
					<option name="g">
						<argument name="#" required="true" />
						<para>Use the specified amount of gain when recording a voicemail message.
						The units are whole-number decibels (dB).</para>
					</option>
					<option name="r">
						<para>"Read only". Prevent user from deleting any messages.</para>
						<para>This applies only to specific executions of VoiceMailMain, NOT the mailbox itself.</para>
					</option>
					<option name="s">
						<para>Skip checking the passcode for the mailbox.</para>
					</option>
					<option name="a">
						<argument name="folder" required="true" />
						<para>Skip folder prompt and go directly to <replaceable>folder</replaceable> specified.
						Defaults to <literal>INBOX</literal> (or <literal>0</literal>).</para>
						<enumlist>
							<enum name="0"><para>INBOX</para></enum>
							<enum name="1"><para>Old</para></enum>
							<enum name="2"><para>Work</para></enum>
							<enum name="3"><para>Family</para></enum>
							<enum name="4"><para>Friends</para></enum>
							<enum name="5"><para>Cust1</para></enum>
							<enum name="6"><para>Cust2</para></enum>
							<enum name="7"><para>Cust3</para></enum>
							<enum name="8"><para>Cust4</para></enum>
							<enum name="9"><para>Cust5</para></enum>
						</enumlist>
					</option>
				</optionlist>
			</parameter>
		</syntax>
		<description>
			<para>This application allows the calling party to check voicemail messages. A specific
			<replaceable>mailbox</replaceable>, and optional corresponding <replaceable>context</replaceable>,
			may be specified. If a <replaceable>mailbox</replaceable> is not provided, the calling party will
			be prompted to enter one. If a <replaceable>context</replaceable> is not specified, the
			<literal>default</literal> context will be used.</para>
			<para>The VoiceMailMain application will exit if the following DTMF digit is entered as Mailbox
			or Password, and the extension exists:</para>
			<enumlist>
				<enum name="*">
					<para>Jump to the <literal>a</literal> extension in the current dialplan context.</para>
				</enum>
			</enumlist>
		</description>
		<see-also>
			<ref type="application">VoiceMail</ref>
		</see-also>
	</application>
	<application name="VMAuthenticate" language="en_US" module="app_voicemail">
		<since>
			<version>1.2.0</version>
		</since>
		<synopsis>
			Authenticate with Voicemail passwords.
		</synopsis>
		<syntax>
			<parameter name="mailbox" required="true" argsep="@">
				<argument name="mailbox" />
				<argument name="context" />
			</parameter>
			<parameter name="options">
				<optionlist>
					<option name="s">
						<para>Skip playing the initial prompts.</para>
					</option>
				</optionlist>
			</parameter>
		</syntax>
		<description>
			<para>This application behaves the same way as the Authenticate application, but the passwords
			are taken from <filename>voicemail.conf</filename>. If the <replaceable>mailbox</replaceable> is
			specified, only that mailbox's password will be considered valid. If the <replaceable>mailbox</replaceable>
			is not specified, the channel variable <variable>AUTH_MAILBOX</variable> will be set with the authenticated
			mailbox.</para>
			<para>The VMAuthenticate application will exit if the following DTMF digit is entered as Mailbox
			or Password, and the extension exists:</para>
			<enumlist>
				<enum name="*">
					<para>Jump to the <literal>a</literal> extension in the current dialplan context.</para>
				</enum>
			</enumlist>
		</description>
	</application>
	<application name="VoiceMailPlayMsg" language="en_US" module="app_voicemail">
		<since>
			<version>11.0.0</version>
		</since>
		<synopsis>
			Play a single voice mail msg from a mailbox by msg id.
		</synopsis>
		<syntax>
			<parameter name="mailbox" required="true" argsep="@">
				<argument name="mailbox" />
				<argument name="context" />
			</parameter>
			<parameter name="msg_id" required="true">
				<para>The msg id of the msg to play back. </para>
			</parameter>
		</syntax>
		<description>
			<para>This application sets the following channel variable upon completion:</para>
			<variablelist>
				<variable name="VOICEMAIL_PLAYBACKSTATUS">
					<para>The status of the playback attempt as a text string.</para>
					<value name="SUCCESS"/>
					<value name="FAILED"/>
				</variable>
			</variablelist>
		</description>
	</application>
	<application name="VMSayName" language="en_US" module="app_voicemail">
		<since>
			<version>1.8.0</version>
		</since>
		<synopsis>
			Play the name of a voicemail user
		</synopsis>
		<syntax>
			<parameter name="mailbox" required="true" argsep="@">
				<argument name="mailbox" />
				<argument name="context" />
			</parameter>
		</syntax>
		<description>
			<para>This application will say the recorded name of the voicemail user specified as the
			argument to this application. If no context is provided, <literal>default</literal> is assumed.</para>
			<para>Similar to the Background() application, playback of the recorded
			name can be interrupted by entering an extension, which will be searched
			for in the current context.</para>
		</description>
	</application>
	<function name="VM_INFO" language="en_US" module="app_voicemail">
		<since>
			<version>11.0.0</version>
		</since>
		<synopsis>
			Returns the selected attribute from a mailbox.
		</synopsis>
		<syntax argsep=",">
			<parameter name="mailbox" argsep="@" required="true">
				<argument name="mailbox" required="true" />
				<argument name="context" />
			</parameter>
			<parameter name="attribute" required="true">
				<optionlist>
					<option name="count">
						<para>Count of messages in specified <replaceable>folder</replaceable>.
						If <replaceable>folder</replaceable> is not specified, defaults to <literal>INBOX</literal>.</para>
					</option>
					<option name="email">
						<para>E-mail address associated with the mailbox.</para>
					</option>
					<option name="exists">
						<para>Returns a boolean of whether the corresponding <replaceable>mailbox</replaceable> exists.</para>
					</option>
					<option name="fullname">
						<para>Full name associated with the mailbox.</para>
					</option>
					<option name="language">
						<para>Mailbox language if overridden, otherwise the language of the channel.</para>
					</option>
					<option name="locale">
						<para>Mailbox locale if overridden, otherwise global locale.</para>
					</option>
					<option name="pager">
						<para>Pager e-mail address associated with the mailbox.</para>
					</option>
					<option name="password">
						<para>Mailbox access password.</para>
					</option>
					<option name="tz">
						<para>Mailbox timezone if overridden, otherwise global timezone</para>
					</option>
				</optionlist>
			</parameter>
			<parameter name="folder" required="false">
				<para>If not specified, <literal>INBOX</literal> is assumed.</para>
			</parameter>
		</syntax>
		<description>
			<para>Returns the selected attribute from the specified <replaceable>mailbox</replaceable>.
			If <replaceable>context</replaceable> is not specified, defaults to the <literal>default</literal>
			context. Where the <replaceable>folder</replaceable> can be specified, common folders
			include <literal>INBOX</literal>, <literal>Old</literal>, <literal>Work</literal>,
			<literal>Family</literal> and <literal>Friends</literal>.</para>
		</description>
	</function>
	<manager name="VoicemailUsersList" language="en_US" module="app_voicemail">
		<since>
			<version>1.6.0</version>
		</since>
		<synopsis>
			List All Voicemail User Information.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
		</syntax>
		<description>
		</description>
	</manager>
	<manager name="VoicemailUserStatus" language="en_US" module="app_voicemail">
		<since>
			<version>16.0.0</version>
		</since>
		<synopsis>
			Show the status of given voicemail user's info.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="Context" required="true">
				<para>The context you want to check.</para>
			</parameter>
			<parameter name="Mailbox" required="true">
				<para>The mailbox you want to check.</para>
			</parameter>
		</syntax>
		<description>
			<para>Retrieves the status of the given voicemail user.</para>
		</description>
	</manager>
	<manager name="VoicemailRefresh" language="en_US" module="app_voicemail">
		<since>
			<version>12.0.0</version>
		</since>
		<synopsis>
			Tell Asterisk to poll mailboxes for a change
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="Context" />
			<parameter name="Mailbox" />
		</syntax>
		<description>
			<para>Normally, MWI indicators are only sent when Asterisk itself
			changes a mailbox.  With external programs that modify the content
			of a mailbox from outside the application, an option exists called
			<literal>pollmailboxes</literal> that will cause voicemail to
			continually scan all mailboxes on a system for changes.  This can
			cause a large amount of load on a system.  This command allows
			external applications to signal when a particular mailbox has
			changed, thus permitting external applications to modify mailboxes
			and MWI to work without introducing considerable CPU load.</para>
			<para>If <replaceable>Context</replaceable> is not specified, all
			mailboxes on the system will be polled for changes.  If
			<replaceable>Context</replaceable> is specified, but
			<replaceable>Mailbox</replaceable> is omitted, then all mailboxes
			within <replaceable>Context</replaceable> will be polled.
			Otherwise, only a single mailbox will be polled for changes.</para>
		</description>
	</manager>
	<manager name="VoicemailBoxSummary" language="en_US" module="app_voicemail">
		<since>
			<version>20.5.0</version>
			<version>18.20.0</version>
		</since>
		<synopsis>
			Show the mailbox contents of given voicemail user.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="Context" required="true">
				<para>The context you want to check.</para>
			</parameter>
			<parameter name="Mailbox" required="true">
				<para>The mailbox you want to check.</para>
			</parameter>
		</syntax>
		<description>
			<para>Retrieves the contents of the given voicemail user's mailbox.</para>
		</description>
	</manager>
	<manager name="VoicemailMove" language="en_US" module="app_voicemail">
		<since>
			<version>20.5.0</version>
			<version>18.20.0</version>
		</since>
		<synopsis>
			Move Voicemail between mailbox folders of given user.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="Context" required="true">
				<para>The context of the Voicemail you want to move.</para>
			</parameter>
			<parameter name="Mailbox" required="true">
				<para>The mailbox of the Voicemail you want to move.</para>
			</parameter>
			<parameter name="Folder" required="true">
				<para>The Folder containing the Voicemail you want to move.</para>
			</parameter>
			<parameter name="ID" required="true">
				<para>The ID of the Voicemail you want to move.</para>
			</parameter>
			<parameter name="ToFolder" required="true">
				<para>The Folder you want to move the Voicemail to.</para>
			</parameter>
		</syntax>
		<description>
			<para>Move a given Voicemail between Folders within a user's Mailbox.</para>
		</description>
	</manager>
	<manager name="VoicemailRemove" language="en_US" module="app_voicemail">
		<since>
			<version>20.5.0</version>
			<version>18.20.0</version>
		</since>
		<synopsis>
			Remove Voicemail from mailbox folder.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="Context" required="true">
				<para>The context of the Voicemail you want to remove.</para>
			</parameter>
			<parameter name="Mailbox" required="true">
				<para>The mailbox of the Voicemail you want to remove.</para>
			</parameter>
			<parameter name="Folder" required="true">
				<para>The Folder containing the Voicemail you want to remove.</para>
			</parameter>
			<parameter name="ID" required="true">
				<para>The ID of the Voicemail you want to remove.</para>
			</parameter>
		</syntax>
		<description>
			<para>Remove a given Voicemail from a user's Mailbox Folder.</para>
		</description>
	</manager>
	<manager name="VoicemailForward" language="en_US" module="app_voicemail">
		<since>
			<version>20.5.0</version>
			<version>18.20.0</version>
		</since>
		<synopsis>
			Forward Voicemail from one mailbox folder to another between given users.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="Context" required="true">
				<para>The context of the Voicemail you want to move.</para>
			</parameter>
			<parameter name="Mailbox" required="true">
				<para>The mailbox of the Voicemail you want to move.</para>
			</parameter>
			<parameter name="Folder" required="true">
				<para>The Folder containing the Voicemail you want to move.</para>
			</parameter>
			<parameter name="ID" required="true">
				<para>The ID of the Voicemail you want to move.</para>
			</parameter>
			<parameter name="ToContext" required="true">
				<para>The context you want to move the Voicemail to.</para>
			</parameter>
			<parameter name="ToMailbox" required="true">
				<para>The mailbox you want to move the Voicemail to.</para>
			</parameter>
			<parameter name="ToFolder" required="true">
				<para>The Folder you want to move the Voicemail to.</para>
			</parameter>
		</syntax>
		<description>
			<para>Forward a given Voicemail from a user's Mailbox Folder to
			another user's Mailbox Folder. Can be used to copy between
			Folders within a mailbox by specifying the to context and user
			as the same as the from.</para>
		</description>
	</manager>
	<managerEvent language="en_US" name="VoicemailPasswordChange" module="app_voicemail">
		<managerEventInstance class="EVENT_FLAG_USER" module="app_voicemail">
			<since>
				<version>18.21.0</version>
				<version>20.6.0</version>
				<version>21.1.0</version>
			</since>
			<synopsis>Raised in response to a mailbox password change.</synopsis>
			<syntax>
				<parameter name="Context">
					<para>Mailbox context.</para>
				</parameter>
				<parameter name="Mailbox">
					<para>Mailbox name.</para>
				</parameter>
				<parameter name="NewPassword">
					<para>New password for mailbox.</para>
				</parameter>
			</syntax>
		</managerEventInstance>
	</managerEvent>
	<application name="VoiceMail" language="en_US" module="app_voicemail_imap">
		<since>
			<version>0.1.0</version>
		</since>
		<synopsis>
			Leave a Voicemail message.
		</synopsis>
		<syntax>
			<parameter name="mailboxs" argsep="&amp;" required="true">
				<argument name="mailbox1" argsep="@" required="true">
					<argument name="mailbox" required="true" />
					<argument name="context" />
				</argument>
				<argument name="mailbox2" argsep="@" multiple="true">
					<argument name="mailbox" required="true" />
					<argument name="context" />
				</argument>
			</parameter>
			<parameter name="options">
				<optionlist>
					<option name="b">
						<para>Play the <literal>busy</literal> greeting to the calling party.</para>
					</option>
					<option name="d">
						<argument name="c" />
						<para>Accept digits for a new extension in context <replaceable>c</replaceable>,
						if played during the greeting. Context defaults to the current context.</para>
					</option>
					<option name="e">
						<para>Play greetings as early media -- only answer the channel just
						before accepting the voice message.</para>
					</option>
					<option name="g">
						<argument name="#" required="true" />
						<para>Use the specified amount of gain when recording the voicemail
						message. The units are whole-number decibels (dB). Only works on supported
						technologies, which is DAHDI only.</para>
					</option>
					<option name="s">
						<para>Skip the playback of instructions for leaving a message to the
						calling party.</para>
					</option>
					<option name="S">
						<para>Skip the playback of instructions for leaving a message to the
						calling party, but only if a greeting has been recorded by the
						mailbox user.</para>
					</option>
					<option name="t">
						<argument name="x" required="false" />
						<para>Play a custom beep tone to the caller instead of the default one.
						If this option is used but no file is specified, the beep is suppressed.</para>
					</option>
					<option name="u">
						<para>Play the <literal>unavailable</literal> greeting.</para>
					</option>
					<option name="U">
						<para>Mark message as <literal>URGENT</literal>.</para>
					</option>
					<option name="P">
						<para>Mark message as <literal>PRIORITY</literal>.</para>
					</option>
				</optionlist>
			</parameter>
		</syntax>
		<description>
			<para>This application allows the calling party to leave a message for the specified
			list of mailboxes. When multiple mailboxes are specified, the greeting will be taken from
			the first mailbox specified. Dialplan execution will stop if the specified mailbox does not
			exist.</para>
			<para>The Voicemail application will exit if any of the following DTMF digits are received:</para>
			<enumlist>
				<enum name="0">
					<para>Jump to the <literal>o</literal> extension in the current dialplan context.</para>
				</enum>
				<enum name="*">
					<para>Jump to the <literal>a</literal> extension in the current dialplan context.</para>
				</enum>
			</enumlist>
			<para>This application will set the following channel variable upon completion:</para>
			<variablelist>
				<variable name="VMSTATUS">
					<para>This indicates the status of the execution of the VoiceMail application.</para>
					<value name="SUCCESS" />
					<value name="USEREXIT" />
					<value name="FAILED" />
				</variable>
			</variablelist>
		</description>
		<see-also>
			<ref type="application">VoiceMailMain</ref>
		</see-also>
	</application>
	<application name="VoiceMailMain" language="en_US" module="app_voicemail_imap">
		<since>
			<version>0.1.0</version>
		</since>
		<synopsis>
			Check Voicemail messages.
		</synopsis>
		<syntax>
			<parameter name="mailbox" required="true" argsep="@">
				<argument name="mailbox" />
				<argument name="context" />
			</parameter>
			<parameter name="options">
				<optionlist>
					<option name="p">
						<para>Consider the <replaceable>mailbox</replaceable> parameter as a prefix to
						the mailbox that is entered by the caller.</para>
					</option>
					<option name="g">
						<argument name="#" required="true" />
						<para>Use the specified amount of gain when recording a voicemail message.
						The units are whole-number decibels (dB).</para>
					</option>
					<option name="r">
						<para>"Read only". Prevent user from deleting any messages.</para>
						<para>This applies only to specific executions of VoiceMailMain, NOT the mailbox itself.</para>
					</option>
					<option name="s">
						<para>Skip checking the passcode for the mailbox.</para>
					</option>
					<option name="a">
						<argument name="folder" required="true" />
						<para>Skip folder prompt and go directly to <replaceable>folder</replaceable> specified.
						Defaults to <literal>INBOX</literal> (or <literal>0</literal>).</para>
						<enumlist>
							<enum name="0"><para>INBOX</para></enum>
							<enum name="1"><para>Old</para></enum>
							<enum name="2"><para>Work</para></enum>
							<enum name="3"><para>Family</para></enum>
							<enum name="4"><para>Friends</para></enum>
							<enum name="5"><para>Cust1</para></enum>
							<enum name="6"><para>Cust2</para></enum>
							<enum name="7"><para>Cust3</para></enum>
							<enum name="8"><para>Cust4</para></enum>
							<enum name="9"><para>Cust5</para></enum>
						</enumlist>
					</option>
				</optionlist>
			</parameter>
		</syntax>
		<description>
			<para>This application allows the calling party to check voicemail messages. A specific
			<replaceable>mailbox</replaceable>, and optional corresponding <replaceable>context</replaceable>,
			may be specified. If a <replaceable>mailbox</replaceable> is not provided, the calling party will
			be prompted to enter one. If a <replaceable>context</replaceable> is not specified, the
			<literal>default</literal> context will be used.</para>
			<para>The VoiceMailMain application will exit if the following DTMF digit is entered as Mailbox
			or Password, and the extension exists:</para>
			<enumlist>
				<enum name="*">
					<para>Jump to the <literal>a</literal> extension in the current dialplan context.</para>
				</enum>
			</enumlist>
		</description>
		<see-also>
			<ref type="application">VoiceMail</ref>
		</see-also>
	</application>
	<application name="VMAuthenticate" language="en_US" module="app_voicemail_imap">
		<since>
			<version>1.2.0</version>
		</since>
		<synopsis>
			Authenticate with Voicemail passwords.
		</synopsis>
		<syntax>
			<parameter name="mailbox" required="true" argsep="@">
				<argument name="mailbox" />
				<argument name="context" />
			</parameter>
			<parameter name="options">
				<optionlist>
					<option name="s">
						<para>Skip playing the initial prompts.</para>
					</option>
				</optionlist>
			</parameter>
		</syntax>
		<description>
			<para>This application behaves the same way as the Authenticate application, but the passwords
			are taken from <filename>voicemail.conf</filename>. If the <replaceable>mailbox</replaceable> is
			specified, only that mailbox's password will be considered valid. If the <replaceable>mailbox</replaceable>
			is not specified, the channel variable <variable>AUTH_MAILBOX</variable> will be set with the authenticated
			mailbox.</para>
			<para>The VMAuthenticate application will exit if the following DTMF digit is entered as Mailbox
			or Password, and the extension exists:</para>
			<enumlist>
				<enum name="*">
					<para>Jump to the <literal>a</literal> extension in the current dialplan context.</para>
				</enum>
			</enumlist>
		</description>
	</application>
	<application name="VoiceMailPlayMsg" language="en_US" module="app_voicemail_imap">
		<since>
			<version>11.0.0</version>
		</since>
		<synopsis>
			Play a single voice mail msg from a mailbox by msg id.
		</synopsis>
		<syntax>
			<parameter name="mailbox" required="true" argsep="@">
				<argument name="mailbox" />
				<argument name="context" />
			</parameter>
			<parameter name="msg_id" required="true">
				<para>The msg id of the msg to play back. </para>
			</parameter>
		</syntax>
		<description>
			<para>This application sets the following channel variable upon completion:</para>
			<variablelist>
				<variable name="VOICEMAIL_PLAYBACKSTATUS">
					<para>The status of the playback attempt as a text string.</para>
					<value name="SUCCESS"/>
					<value name="FAILED"/>
				</variable>
			</variablelist>
		</description>
	</application>
	<application name="VMSayName" language="en_US" module="app_voicemail_imap">
		<since>
			<version>1.8.0</version>
		</since>
		<synopsis>
			Play the name of a voicemail user
		</synopsis>
		<syntax>
			<parameter name="mailbox" required="true" argsep="@">
				<argument name="mailbox" />
				<argument name="context" />
			</parameter>
		</syntax>
		<description>
			<para>This application will say the recorded name of the voicemail user specified as the
			argument to this application. If no context is provided, <literal>default</literal> is assumed.</para>
			<para>Similar to the Background() application, playback of the recorded
			name can be interrupted by entering an extension, which will be searched
			for in the current context.</para>
		</description>
	</application>
	<function name="VM_INFO" language="en_US" module="app_voicemail_imap">
		<since>
			<version>11.0.0</version>
		</since>
		<synopsis>
			Returns the selected attribute from a mailbox.
		</synopsis>
		<syntax argsep=",">
			<parameter name="mailbox" argsep="@" required="true">
				<argument name="mailbox" required="true" />
				<argument name="context" />
			</parameter>
			<parameter name="attribute" required="true">
				<optionlist>
					<option name="count">
						<para>Count of messages in specified <replaceable>folder</replaceable>.
						If <replaceable>folder</replaceable> is not specified, defaults to <literal>INBOX</literal>.</para>
					</option>
					<option name="email">
						<para>E-mail address associated with the mailbox.</para>
					</option>
					<option name="exists">
						<para>Returns a boolean of whether the corresponding <replaceable>mailbox</replaceable> exists.</para>
					</option>
					<option name="fullname">
						<para>Full name associated with the mailbox.</para>
					</option>
					<option name="language">
						<para>Mailbox language if overridden, otherwise the language of the channel.</para>
					</option>
					<option name="locale">
						<para>Mailbox locale if overridden, otherwise global locale.</para>
					</option>
					<option name="pager">
						<para>Pager e-mail address associated with the mailbox.</para>
					</option>
					<option name="password">
						<para>Mailbox access password.</para>
					</option>
					<option name="tz">
						<para>Mailbox timezone if overridden, otherwise global timezone</para>
					</option>
				</optionlist>
			</parameter>
			<parameter name="folder" required="false">
				<para>If not specified, <literal>INBOX</literal> is assumed.</para>
			</parameter>
		</syntax>
		<description>
			<para>Returns the selected attribute from the specified <replaceable>mailbox</replaceable>.
			If <replaceable>context</replaceable> is not specified, defaults to the <literal>default</literal>
			context. Where the <replaceable>folder</replaceable> can be specified, common folders
			include <literal>INBOX</literal>, <literal>Old</literal>, <literal>Work</literal>,
			<literal>Family</literal> and <literal>Friends</literal>.</para>
		</description>
	</function>
	<manager name="VoicemailUsersList" language="en_US" module="app_voicemail_imap">
		<since>
			<version>1.6.0</version>
		</since>
		<synopsis>
			List All Voicemail User Information.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
		</syntax>
		<description>
		</description>
	</manager>
	<manager name="VoicemailUserStatus" language="en_US" module="app_voicemail_imap">
		<since>
			<version>16.0.0</version>
		</since>
		<synopsis>
			Show the status of given voicemail user's info.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="Context" required="true">
				<para>The context you want to check.</para>
			</parameter>
			<parameter name="Mailbox" required="true">
				<para>The mailbox you want to check.</para>
			</parameter>
		</syntax>
		<description>
			<para>Retrieves the status of the given voicemail user.</para>
		</description>
	</manager>
	<manager name="VoicemailRefresh" language="en_US" module="app_voicemail_imap">
		<since>
			<version>12.0.0</version>
		</since>
		<synopsis>
			Tell Asterisk to poll mailboxes for a change
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="Context" />
			<parameter name="Mailbox" />
		</syntax>
		<description>
			<para>Normally, MWI indicators are only sent when Asterisk itself
			changes a mailbox.  With external programs that modify the content
			of a mailbox from outside the application, an option exists called
			<literal>pollmailboxes</literal> that will cause voicemail to
			continually scan all mailboxes on a system for changes.  This can
			cause a large amount of load on a system.  This command allows
			external applications to signal when a particular mailbox has
			changed, thus permitting external applications to modify mailboxes
			and MWI to work without introducing considerable CPU load.</para>
			<para>If <replaceable>Context</replaceable> is not specified, all
			mailboxes on the system will be polled for changes.  If
			<replaceable>Context</replaceable> is specified, but
			<replaceable>Mailbox</replaceable> is omitted, then all mailboxes
			within <replaceable>Context</replaceable> will be polled.
			Otherwise, only a single mailbox will be polled for changes.</para>
		</description>
	</manager>
	<manager name="VoicemailBoxSummary" language="en_US" module="app_voicemail_imap">
		<since>
			<version>20.5.0</version>
			<version>18.20.0</version>
		</since>
		<synopsis>
			Show the mailbox contents of given voicemail user.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="Context" required="true">
				<para>The context you want to check.</para>
			</parameter>
			<parameter name="Mailbox" required="true">
				<para>The mailbox you want to check.</para>
			</parameter>
		</syntax>
		<description>
			<para>Retrieves the contents of the given voicemail user's mailbox.</para>
		</description>
	</manager>
	<manager name="VoicemailMove" language="en_US" module="app_voicemail_imap">
		<since>
			<version>20.5.0</version>
			<version>18.20.0</version>
		</since>
		<synopsis>
			Move Voicemail between mailbox folders of given user.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="Context" required="true">
				<para>The context of the Voicemail you want to move.</para>
			</parameter>
			<parameter name="Mailbox" required="true">
				<para>The mailbox of the Voicemail you want to move.</para>
			</parameter>
			<parameter name="Folder" required="true">
				<para>The Folder containing the Voicemail you want to move.</para>
			</parameter>
			<parameter name="ID" required="true">
				<para>The ID of the Voicemail you want to move.</para>
			</parameter>
			<parameter name="ToFolder" required="true">
				<para>The Folder you want to move the Voicemail to.</para>
			</parameter>
		</syntax>
		<description>
			<para>Move a given Voicemail between Folders within a user's Mailbox.</para>
		</description>
	</manager>
	<manager name="VoicemailRemove" language="en_US" module="app_voicemail_imap">
		<since>
			<version>20.5.0</version>
			<version>18.20.0</version>
		</since>
		<synopsis>
			Remove Voicemail from mailbox folder.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="Context" required="true">
				<para>The context of the Voicemail you want to remove.</para>
			</parameter>
			<parameter name="Mailbox" required="true">
				<para>The mailbox of the Voicemail you want to remove.</para>
			</parameter>
			<parameter name="Folder" required="true">
				<para>The Folder containing the Voicemail you want to remove.</para>
			</parameter>
			<parameter name="ID" required="true">
				<para>The ID of the Voicemail you want to remove.</para>
			</parameter>
		</syntax>
		<description>
			<para>Remove a given Voicemail from a user's Mailbox Folder.</para>
		</description>
	</manager>
	<manager name="VoicemailForward" language="en_US" module="app_voicemail_imap">
		<since>
			<version>20.5.0</version>
			<version>18.20.0</version>
		</since>
		<synopsis>
			Forward Voicemail from one mailbox folder to another between given users.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="Context" required="true">
				<para>The context of the Voicemail you want to move.</para>
			</parameter>
			<parameter name="Mailbox" required="true">
				<para>The mailbox of the Voicemail you want to move.</para>
			</parameter>
			<parameter name="Folder" required="true">
				<para>The Folder containing the Voicemail you want to move.</para>
			</parameter>
			<parameter name="ID" required="true">
				<para>The ID of the Voicemail you want to move.</para>
			</parameter>
			<parameter name="ToContext" required="true">
				<para>The context you want to move the Voicemail to.</para>
			</parameter>
			<parameter name="ToMailbox" required="true">
				<para>The mailbox you want to move the Voicemail to.</para>
			</parameter>
			<parameter name="ToFolder" required="true">
				<para>The Folder you want to move the Voicemail to.</para>
			</parameter>
		</syntax>
		<description>
			<para>Forward a given Voicemail from a user's Mailbox Folder to
			another user's Mailbox Folder. Can be used to copy between
			Folders within a mailbox by specifying the to context and user
			as the same as the from.</para>
		</description>
	</manager>
	<managerEvent language="en_US" name="VoicemailPasswordChange" module="app_voicemail_imap">
		<managerEventInstance class="EVENT_FLAG_USER" module="app_voicemail_imap">
			<since>
				<version>18.21.0</version>
				<version>20.6.0</version>
				<version>21.1.0</version>
			</since>
			<synopsis>Raised in response to a mailbox password change.</synopsis>
			<syntax>
				<parameter name="Context">
					<para>Mailbox context.</para>
				</parameter>
				<parameter name="Mailbox">
					<para>Mailbox name.</para>
				</parameter>
				<parameter name="NewPassword">
					<para>New password for mailbox.</para>
				</parameter>
			</syntax>
		</managerEventInstance>
	</managerEvent>
	<application name="VoiceMail" language="en_US" module="app_voicemail_odbc">
		<since>
			<version>0.1.0</version>
		</since>
		<synopsis>
			Leave a Voicemail message.
		</synopsis>
		<syntax>
			<parameter name="mailboxs" argsep="&amp;" required="true">
				<argument name="mailbox1" argsep="@" required="true">
					<argument name="mailbox" required="true" />
					<argument name="context" />
				</argument>
				<argument name="mailbox2" argsep="@" multiple="true">
					<argument name="mailbox" required="true" />
					<argument name="context" />
				</argument>
			</parameter>
			<parameter name="options">
				<optionlist>
					<option name="b">
						<para>Play the <literal>busy</literal> greeting to the calling party.</para>
					</option>
					<option name="d">
						<argument name="c" />
						<para>Accept digits for a new extension in context <replaceable>c</replaceable>,
						if played during the greeting. Context defaults to the current context.</para>
					</option>
					<option name="e">
						<para>Play greetings as early media -- only answer the channel just
						before accepting the voice message.</para>
					</option>
					<option name="g">
						<argument name="#" required="true" />
						<para>Use the specified amount of gain when recording the voicemail
						message. The units are whole-number decibels (dB). Only works on supported
						technologies, which is DAHDI only.</para>
					</option>
					<option name="s">
						<para>Skip the playback of instructions for leaving a message to the
						calling party.</para>
					</option>
					<option name="S">
						<para>Skip the playback of instructions for leaving a message to the
						calling party, but only if a greeting has been recorded by the
						mailbox user.</para>
					</option>
					<option name="t">
						<argument name="x" required="false" />
						<para>Play a custom beep tone to the caller instead of the default one.
						If this option is used but no file is specified, the beep is suppressed.</para>
					</option>
					<option name="u">
						<para>Play the <literal>unavailable</literal> greeting.</para>
					</option>
					<option name="U">
						<para>Mark message as <literal>URGENT</literal>.</para>
					</option>
					<option name="P">
						<para>Mark message as <literal>PRIORITY</literal>.</para>
					</option>
				</optionlist>
			</parameter>
		</syntax>
		<description>
			<para>This application allows the calling party to leave a message for the specified
			list of mailboxes. When multiple mailboxes are specified, the greeting will be taken from
			the first mailbox specified. Dialplan execution will stop if the specified mailbox does not
			exist.</para>
			<para>The Voicemail application will exit if any of the following DTMF digits are received:</para>
			<enumlist>
				<enum name="0">
					<para>Jump to the <literal>o</literal> extension in the current dialplan context.</para>
				</enum>
				<enum name="*">
					<para>Jump to the <literal>a</literal> extension in the current dialplan context.</para>
				</enum>
			</enumlist>
			<para>This application will set the following channel variable upon completion:</para>
			<variablelist>
				<variable name="VMSTATUS">
					<para>This indicates the status of the execution of the VoiceMail application.</para>
					<value name="SUCCESS" />
					<value name="USEREXIT" />
					<value name="FAILED" />
				</variable>
			</variablelist>
		</description>
		<see-also>
			<ref type="application">VoiceMailMain</ref>
		</see-also>
	</application>
	<application name="VoiceMailMain" language="en_US" module="app_voicemail_odbc">
		<since>
			<version>0.1.0</version>
		</since>
		<synopsis>
			Check Voicemail messages.
		</synopsis>
		<syntax>
			<parameter name="mailbox" required="true" argsep="@">
				<argument name="mailbox" />
				<argument name="context" />
			</parameter>
			<parameter name="options">
				<optionlist>
					<option name="p">
						<para>Consider the <replaceable>mailbox</replaceable> parameter as a prefix to
						the mailbox that is entered by the caller.</para>
					</option>
					<option name="g">
						<argument name="#" required="true" />
						<para>Use the specified amount of gain when recording a voicemail message.
						The units are whole-number decibels (dB).</para>
					</option>
					<option name="r">
						<para>"Read only". Prevent user from deleting any messages.</para>
						<para>This applies only to specific executions of VoiceMailMain, NOT the mailbox itself.</para>
					</option>
					<option name="s">
						<para>Skip checking the passcode for the mailbox.</para>
					</option>
					<option name="a">
						<argument name="folder" required="true" />
						<para>Skip folder prompt and go directly to <replaceable>folder</replaceable> specified.
						Defaults to <literal>INBOX</literal> (or <literal>0</literal>).</para>
						<enumlist>
							<enum name="0"><para>INBOX</para></enum>
							<enum name="1"><para>Old</para></enum>
							<enum name="2"><para>Work</para></enum>
							<enum name="3"><para>Family</para></enum>
							<enum name="4"><para>Friends</para></enum>
							<enum name="5"><para>Cust1</para></enum>
							<enum name="6"><para>Cust2</para></enum>
							<enum name="7"><para>Cust3</para></enum>
							<enum name="8"><para>Cust4</para></enum>
							<enum name="9"><para>Cust5</para></enum>
						</enumlist>
					</option>
				</optionlist>
			</parameter>
		</syntax>
		<description>
			<para>This application allows the calling party to check voicemail messages. A specific
			<replaceable>mailbox</replaceable>, and optional corresponding <replaceable>context</replaceable>,
			may be specified. If a <replaceable>mailbox</replaceable> is not provided, the calling party will
			be prompted to enter one. If a <replaceable>context</replaceable> is not specified, the
			<literal>default</literal> context will be used.</para>
			<para>The VoiceMailMain application will exit if the following DTMF digit is entered as Mailbox
			or Password, and the extension exists:</para>
			<enumlist>
				<enum name="*">
					<para>Jump to the <literal>a</literal> extension in the current dialplan context.</para>
				</enum>
			</enumlist>
		</description>
		<see-also>
			<ref type="application">VoiceMail</ref>
		</see-also>
	</application>
	<application name="VMAuthenticate" language="en_US" module="app_voicemail_odbc">
		<since>
			<version>1.2.0</version>
		</since>
		<synopsis>
			Authenticate with Voicemail passwords.
		</synopsis>
		<syntax>
			<parameter name="mailbox" required="true" argsep="@">
				<argument name="mailbox" />
				<argument name="context" />
			</parameter>
			<parameter name="options">
				<optionlist>
					<option name="s">
						<para>Skip playing the initial prompts.</para>
					</option>
				</optionlist>
			</parameter>
		</syntax>
		<description>
			<para>This application behaves the same way as the Authenticate application, but the passwords
			are taken from <filename>voicemail.conf</filename>. If the <replaceable>mailbox</replaceable> is
			specified, only that mailbox's password will be considered valid. If the <replaceable>mailbox</replaceable>
			is not specified, the channel variable <variable>AUTH_MAILBOX</variable> will be set with the authenticated
			mailbox.</para>
			<para>The VMAuthenticate application will exit if the following DTMF digit is entered as Mailbox
			or Password, and the extension exists:</para>
			<enumlist>
				<enum name="*">
					<para>Jump to the <literal>a</literal> extension in the current dialplan context.</para>
				</enum>
			</enumlist>
		</description>
	</application>
	<application name="VoiceMailPlayMsg" language="en_US" module="app_voicemail_odbc">
		<since>
			<version>11.0.0</version>
		</since>
		<synopsis>
			Play a single voice mail msg from a mailbox by msg id.
		</synopsis>
		<syntax>
			<parameter name="mailbox" required="true" argsep="@">
				<argument name="mailbox" />
				<argument name="context" />
			</parameter>
			<parameter name="msg_id" required="true">
				<para>The msg id of the msg to play back. </para>
			</parameter>
		</syntax>
		<description>
			<para>This application sets the following channel variable upon completion:</para>
			<variablelist>
				<variable name="VOICEMAIL_PLAYBACKSTATUS">
					<para>The status of the playback attempt as a text string.</para>
					<value name="SUCCESS"/>
					<value name="FAILED"/>
				</variable>
			</variablelist>
		</description>
	</application>
	<application name="VMSayName" language="en_US" module="app_voicemail_odbc">
		<since>
			<version>1.8.0</version>
		</since>
		<synopsis>
			Play the name of a voicemail user
		</synopsis>
		<syntax>
			<parameter name="mailbox" required="true" argsep="@">
				<argument name="mailbox" />
				<argument name="context" />
			</parameter>
		</syntax>
		<description>
			<para>This application will say the recorded name of the voicemail user specified as the
			argument to this application. If no context is provided, <literal>default</literal> is assumed.</para>
			<para>Similar to the Background() application, playback of the recorded
			name can be interrupted by entering an extension, which will be searched
			for in the current context.</para>
		</description>
	</application>
	<function name="VM_INFO" language="en_US" module="app_voicemail_odbc">
		<since>
			<version>11.0.0</version>
		</since>
		<synopsis>
			Returns the selected attribute from a mailbox.
		</synopsis>
		<syntax argsep=",">
			<parameter name="mailbox" argsep="@" required="true">
				<argument name="mailbox" required="true" />
				<argument name="context" />
			</parameter>
			<parameter name="attribute" required="true">
				<optionlist>
					<option name="count">
						<para>Count of messages in specified <replaceable>folder</replaceable>.
						If <replaceable>folder</replaceable> is not specified, defaults to <literal>INBOX</literal>.</para>
					</option>
					<option name="email">
						<para>E-mail address associated with the mailbox.</para>
					</option>
					<option name="exists">
						<para>Returns a boolean of whether the corresponding <replaceable>mailbox</replaceable> exists.</para>
					</option>
					<option name="fullname">
						<para>Full name associated with the mailbox.</para>
					</option>
					<option name="language">
						<para>Mailbox language if overridden, otherwise the language of the channel.</para>
					</option>
					<option name="locale">
						<para>Mailbox locale if overridden, otherwise global locale.</para>
					</option>
					<option name="pager">
						<para>Pager e-mail address associated with the mailbox.</para>
					</option>
					<option name="password">
						<para>Mailbox access password.</para>
					</option>
					<option name="tz">
						<para>Mailbox timezone if overridden, otherwise global timezone</para>
					</option>
				</optionlist>
			</parameter>
			<parameter name="folder" required="false">
				<para>If not specified, <literal>INBOX</literal> is assumed.</para>
			</parameter>
		</syntax>
		<description>
			<para>Returns the selected attribute from the specified <replaceable>mailbox</replaceable>.
			If <replaceable>context</replaceable> is not specified, defaults to the <literal>default</literal>
			context. Where the <replaceable>folder</replaceable> can be specified, common folders
			include <literal>INBOX</literal>, <literal>Old</literal>, <literal>Work</literal>,
			<literal>Family</literal> and <literal>Friends</literal>.</para>
		</description>
	</function>
	<manager name="VoicemailUsersList" language="en_US" module="app_voicemail_odbc">
		<since>
			<version>1.6.0</version>
		</since>
		<synopsis>
			List All Voicemail User Information.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
		</syntax>
		<description>
		</description>
	</manager>
	<manager name="VoicemailUserStatus" language="en_US" module="app_voicemail_odbc">
		<since>
			<version>16.0.0</version>
		</since>
		<synopsis>
			Show the status of given voicemail user's info.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="Context" required="true">
				<para>The context you want to check.</para>
			</parameter>
			<parameter name="Mailbox" required="true">
				<para>The mailbox you want to check.</para>
			</parameter>
		</syntax>
		<description>
			<para>Retrieves the status of the given voicemail user.</para>
		</description>
	</manager>
	<manager name="VoicemailRefresh" language="en_US" module="app_voicemail_odbc">
		<since>
			<version>12.0.0</version>
		</since>
		<synopsis>
			Tell Asterisk to poll mailboxes for a change
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="Context" />
			<parameter name="Mailbox" />
		</syntax>
		<description>
			<para>Normally, MWI indicators are only sent when Asterisk itself
			changes a mailbox.  With external programs that modify the content
			of a mailbox from outside the application, an option exists called
			<literal>pollmailboxes</literal> that will cause voicemail to
			continually scan all mailboxes on a system for changes.  This can
			cause a large amount of load on a system.  This command allows
			external applications to signal when a particular mailbox has
			changed, thus permitting external applications to modify mailboxes
			and MWI to work without introducing considerable CPU load.</para>
			<para>If <replaceable>Context</replaceable> is not specified, all
			mailboxes on the system will be polled for changes.  If
			<replaceable>Context</replaceable> is specified, but
			<replaceable>Mailbox</replaceable> is omitted, then all mailboxes
			within <replaceable>Context</replaceable> will be polled.
			Otherwise, only a single mailbox will be polled for changes.</para>
		</description>
	</manager>
	<manager name="VoicemailBoxSummary" language="en_US" module="app_voicemail_odbc">
		<since>
			<version>20.5.0</version>
			<version>18.20.0</version>
		</since>
		<synopsis>
			Show the mailbox contents of given voicemail user.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="Context" required="true">
				<para>The context you want to check.</para>
			</parameter>
			<parameter name="Mailbox" required="true">
				<para>The mailbox you want to check.</para>
			</parameter>
		</syntax>
		<description>
			<para>Retrieves the contents of the given voicemail user's mailbox.</para>
		</description>
	</manager>
	<manager name="VoicemailMove" language="en_US" module="app_voicemail_odbc">
		<since>
			<version>20.5.0</version>
			<version>18.20.0</version>
		</since>
		<synopsis>
			Move Voicemail between mailbox folders of given user.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="Context" required="true">
				<para>The context of the Voicemail you want to move.</para>
			</parameter>
			<parameter name="Mailbox" required="true">
				<para>The mailbox of the Voicemail you want to move.</para>
			</parameter>
			<parameter name="Folder" required="true">
				<para>The Folder containing the Voicemail you want to move.</para>
			</parameter>
			<parameter name="ID" required="true">
				<para>The ID of the Voicemail you want to move.</para>
			</parameter>
			<parameter name="ToFolder" required="true">
				<para>The Folder you want to move the Voicemail to.</para>
			</parameter>
		</syntax>
		<description>
			<para>Move a given Voicemail between Folders within a user's Mailbox.</para>
		</description>
	</manager>
	<manager name="VoicemailRemove" language="en_US" module="app_voicemail_odbc">
		<since>
			<version>20.5.0</version>
			<version>18.20.0</version>
		</since>
		<synopsis>
			Remove Voicemail from mailbox folder.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="Context" required="true">
				<para>The context of the Voicemail you want to remove.</para>
			</parameter>
			<parameter name="Mailbox" required="true">
				<para>The mailbox of the Voicemail you want to remove.</para>
			</parameter>
			<parameter name="Folder" required="true">
				<para>The Folder containing the Voicemail you want to remove.</para>
			</parameter>
			<parameter name="ID" required="true">
				<para>The ID of the Voicemail you want to remove.</para>
			</parameter>
		</syntax>
		<description>
			<para>Remove a given Voicemail from a user's Mailbox Folder.</para>
		</description>
	</manager>
	<manager name="VoicemailForward" language="en_US" module="app_voicemail_odbc">
		<since>
			<version>20.5.0</version>
			<version>18.20.0</version>
		</since>
		<synopsis>
			Forward Voicemail from one mailbox folder to another between given users.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="Context" required="true">
				<para>The context of the Voicemail you want to move.</para>
			</parameter>
			<parameter name="Mailbox" required="true">
				<para>The mailbox of the Voicemail you want to move.</para>
			</parameter>
			<parameter name="Folder" required="true">
				<para>The Folder containing the Voicemail you want to move.</para>
			</parameter>
			<parameter name="ID" required="true">
				<para>The ID of the Voicemail you want to move.</para>
			</parameter>
			<parameter name="ToContext" required="true">
				<para>The context you want to move the Voicemail to.</para>
			</parameter>
			<parameter name="ToMailbox" required="true">
				<para>The mailbox you want to move the Voicemail to.</para>
			</parameter>
			<parameter name="ToFolder" required="true">
				<para>The Folder you want to move the Voicemail to.</para>
			</parameter>
		</syntax>
		<description>
			<para>Forward a given Voicemail from a user's Mailbox Folder to
			another user's Mailbox Folder. Can be used to copy between
			Folders within a mailbox by specifying the to context and user
			as the same as the from.</para>
		</description>
	</manager>
	<managerEvent language="en_US" name="VoicemailPasswordChange" module="app_voicemail_odbc">
		<managerEventInstance class="EVENT_FLAG_USER" module="app_voicemail_odbc">
			<since>
				<version>18.21.0</version>
				<version>20.6.0</version>
				<version>21.1.0</version>
			</since>
			<synopsis>Raised in response to a mailbox password change.</synopsis>
			<syntax>
				<parameter name="Context">
					<para>Mailbox context.</para>
				</parameter>
				<parameter name="Mailbox">
					<para>Mailbox name.</para>
				</parameter>
				<parameter name="NewPassword">
					<para>New password for mailbox.</para>
				</parameter>
			</syntax>
		</managerEventInstance>
	</managerEvent>
<module language="en_US" name="app_waitforcond">
	<support_level>extended</support_level>
</module>
	<application name="WaitForCondition" language="en_US" module="app_waitforcond">
		<since>
			<version>16.20.0</version>
			<version>18.6.0</version>
		</since>
		<synopsis>
			Wait (sleep) until the given condition is true.
		</synopsis>
		<syntax>
			<parameter name="replacementchar" required="true">
				<para>Specifies the character in the expression used to replace the <literal>$</literal>
				character. This character should not be used anywhere in the expression itself.</para>
			</parameter>
			<parameter name="expression" required="true">
				<para>A modified logical expression with the <literal>$</literal> characters replaced by
				<replaceable>replacementchar</replaceable>. This is necessary to pass the expression itself
				into the application, rather than its initial evaluation.</para>
			</parameter>
			<parameter name="timeout">
				<para>The maximum amount of time, in seconds, this application should wait for a condition
				to become true before dialplan execution continues automatically to the next priority.
				By default, there is no timeout.</para>
			</parameter>
			<parameter name="interval">
				<para>The frequency, in seconds, of polling the condition, which can be adjusted depending
				on how time-sensitive execution needs to be. By default, this is 0.05.</para>
			</parameter>
		</syntax>
		<description>
			<para>Waits until <replaceable>expression</replaceable> evaluates to true, checking every
			<replaceable>interval</replaceable> seconds for up to <replaceable>timeout</replaceable>. Default
			is evaluate <replaceable>expression</replaceable> every 50 milliseconds with no timeout.</para>
			<example title="Wait for condition dialplan variable/function to become 1 for up to 40 seconds, checking every 500ms">
			 same => n,WaitForCondition(#,#["#{condition}"="1"],40,0.5)
			</example>
			<para>Sets <variable>WAITFORCONDITIONSTATUS</variable> to one of the following values:</para>
			<variablelist>
				<variable name="WAITFORCONDITIONSTATUS">
					<value name="TRUE">
						Condition evaluated to true before timeout expired.
					</value>
					<value name="FAILURE">
						Invalid argument.
					</value>
					<value name="TIMEOUT">
						Timeout elapsed without condition evaluating to true.
					</value>
					<value name="HANGUP">
						Channel hung up before condition became true.
					</value>
				</variable>
			</variablelist>
		</description>
	</application>
<module language="en_US" name="app_waitforring">
	<support_level>extended</support_level>
</module>
	<application name="WaitForRing" language="en_US" module="app_waitforring">
		<since>
			<version>0.4.0</version>
		</since>
		<synopsis>
			Wait for Ring Application.
		</synopsis>
		<syntax>
			<parameter name="timeout" required="true" />
		</syntax>
		<description>
			<para>Returns <literal>0</literal> after waiting at least <replaceable>timeout</replaceable> seconds,
			and only after the next ring has completed. Returns <literal>0</literal> on success or
			<literal>-1</literal> on hangup.</para>
		</description>
	</application>
<module language="en_US" name="app_waitforsilence">
	<support_level>extended</support_level>
</module>
	<application name="WaitForSilence" language="en_US" module="app_waitforsilence">
		<since>
			<version>1.2.0</version>
		</since>
		<synopsis>
			Waits for a specified amount of silence.
		</synopsis>
		<syntax>
			<parameter name="silencerequired">
				<para>If not specified, defaults to <literal>1000</literal> milliseconds.</para>
			</parameter>
			<parameter name="iterations">
				<para>If not specified, defaults to <literal>1</literal>.</para>
			</parameter>
			<parameter name="timeout">
				<para>Is specified only to avoid an infinite loop in cases where silence is never achieved.</para>
			</parameter>
		</syntax>
		<description>
			<para>Waits for up to <replaceable>silencerequired</replaceable> milliseconds of silence,
			<replaceable>iterations</replaceable> times. An optional <replaceable>timeout</replaceable>
			specified the number of seconds to return after, even if we do not receive the specified amount of silence.
			Use <replaceable>timeout</replaceable> with caution, as it may defeat the purpose of this application, which
			is to wait indefinitely until silence is detected on the line. This is particularly useful for reverse-911-type
			call broadcast applications where you need to wait for an answering machine to complete its spiel before
			playing a message.</para>
			<para>Typically you will want to include two or more calls to WaitForSilence when dealing with an answering
			machine; first waiting for the spiel to finish, then waiting for the beep, etc.</para>
			<example title="Wait for half a second of silence, twice">
			same => n,WaitForSilence(500,2)
			</example>
			<example title="Wait for one second of silence, once">
			same => n,WaitForSilence(1000)
			</example>
			<example title="Wait for 300 ms of silence, 3 times, and returns after 10 seconds, even if no silence detected">
			same => n,WaitForSilence(300,3,10)
			</example>
			<para>Sets the channel variable <variable>WAITSTATUS</variable> to one of these values:</para>
			<variablelist>
				<variable name="WAITSTATUS">
					<value name="SILENCE">
						if exited with silence detected.
					</value>
					<value name="TIMEOUT">
						if exited without silence detected after timeout.
					</value>
				</variable>
			</variablelist>
		</description>
		<see-also>
			<ref type="application">WaitForNoise</ref>
		</see-also>
	</application>
	<application name="WaitForNoise" language="en_US" module="app_waitforsilence">
		<since>
			<version>1.6.1.0</version>
		</since>
		<synopsis>
			Waits for a specified amount of noise.
		</synopsis>
		<syntax>
			<parameter name="noiserequired">
				<para>If not specified, defaults to <literal>1000</literal> milliseconds.</para>
			</parameter>
			<parameter name="iterations">
				<para>If not specified, defaults to <literal>1</literal>.</para>
			</parameter>
			<parameter name="timeout">
				<para>Is specified only to avoid an infinite loop in cases where silence is never achieved.</para>
			</parameter>
		</syntax>
		<description>
			<para>Waits for up to <replaceable>noiserequired</replaceable> milliseconds of noise,
			<replaceable>iterations</replaceable> times. An optional <replaceable>timeout</replaceable>
			specified the number of seconds to return after, even if we do not receive the specified amount of noise.
			Use <replaceable>timeout</replaceable> with caution, as it may defeat the purpose of this application, which
			is to wait indefinitely until noise is detected on the line.</para>
		</description>
		<see-also>
			<ref type="application">WaitForSilence</ref>
		</see-also>
	</application>
<module language="en_US" name="app_waituntil">
	<support_level>core</support_level>
</module>
	<application name="WaitUntil" language="en_US" module="app_waituntil">
		<since>
			<version>1.6.0</version>
		</since>
		<synopsis>
			Wait (sleep) until the current time is the given epoch.
		</synopsis>
		<syntax>
			<parameter name="epoch" required="true" />
		</syntax>
		<description>
			<para>Waits until the given <replaceable>epoch</replaceable>.</para>
			<para>Sets <variable>WAITUNTILSTATUS</variable> to one of the following values:</para>
			<variablelist>
				<variable name="WAITUNTILSTATUS">
					<value name="OK">
						Wait succeeded.
					</value>
					<value name="FAILURE">
						Invalid argument.
					</value>
					<value name="HANGUP">
						Channel hungup before time elapsed.
					</value>
					<value name="PAST">
						Time specified had already past.
					</value>
				</variable>
			</variablelist>
		</description>
	</application>
<module language="en_US" name="app_while">
	<support_level>core</support_level>
</module>
	<application name="While" language="en_US" module="app_while">
		<since>
			<version>1.2.0</version>
		</since>
		<synopsis>
			Start a while loop.
		</synopsis>
		<syntax>
			<parameter name="expr" required="true" />
		</syntax>
		<description>
			<para>Start a While Loop.  Execution will return to this point when
			<literal>EndWhile()</literal> is called until expr is no longer true.</para>
		</description>
		<see-also>
			<ref type="application">EndWhile</ref>
			<ref type="application">ExitWhile</ref>
			<ref type="application">ContinueWhile</ref>
		</see-also>
	</application>
	<application name="EndWhile" language="en_US" module="app_while">
		<since>
			<version>1.2.0</version>
		</since>
		<synopsis>
			End a while loop.
		</synopsis>
		<syntax />
		<description>
			<para>Return to the previous called <literal>While()</literal>.</para>
		</description>
		<see-also>
			<ref type="application">While</ref>
			<ref type="application">ExitWhile</ref>
			<ref type="application">ContinueWhile</ref>
		</see-also>
	</application>
	<application name="ExitWhile" language="en_US" module="app_while">
		<since>
			<version>1.4.0</version>
		</since>
		<synopsis>
			End a While loop.
		</synopsis>
		<syntax />
		<description>
			<para>Exits a <literal>While()</literal> loop, whether or not the conditional has been satisfied.</para>
		</description>
		<see-also>
			<ref type="application">While</ref>
			<ref type="application">EndWhile</ref>
			<ref type="application">ContinueWhile</ref>
		</see-also>
	</application>
	<application name="ContinueWhile" language="en_US" module="app_while">
		<since>
			<version>1.4.0</version>
		</since>
		<synopsis>
			Restart a While loop.
		</synopsis>
		<syntax />
		<description>
			<para>Returns to the top of the while loop and re-evaluates the conditional.</para>
		</description>
		<see-also>
			<ref type="application">While</ref>
			<ref type="application">EndWhile</ref>
			<ref type="application">ExitWhile</ref>
		</see-also>
	</application>
<module language="en_US" name="app_zapateller">
	<support_level>extended</support_level>
</module>
	<application name="Zapateller" language="en_US" module="app_zapateller">
		<since>
			<version>0.1.12</version>
		</since>
		<synopsis>
			Block telemarketers with SIT.
		</synopsis>
		<syntax>
			<parameter name="options" required="true">
				<para>Comma delimited list of options.</para>
				<optionlist>
					<option name="answer">
						<para>Causes the line to be answered before playing the tone.</para>
					</option>
					<option name="nocallerid">
						<para>Causes Zapateller to only play the tone if there is no
						callerid information available.</para>
					</option>
				</optionlist>
			</parameter>
		</syntax>
		<description>
			<para>Generates special information tone to block telemarketers from calling you.</para>
			<para>This application will set the following channel variable upon completion:</para>
			<variablelist>
				<variable name="ZAPATELLERSTATUS">
					<para>This will contain the last action accomplished by the
					Zapateller application. Possible values include:</para>
					<value name="NOTHING" />
					<value name="ANSWERED" />
					<value name="ZAPPED" />
				</variable>
			</variablelist>
		</description>
	</application>
<module language="en_US" name="conf_config_parser">
	<support_level>core</support_level>
</module>
	<configInfo name="app_confbridge" language="en_US">
		<synopsis>Conference Bridge Application</synopsis>
		<configFile name="confbridge.conf">
			<configObject name="global">
				<synopsis>Unused, but reserved.</synopsis>
			</configObject>
			<configObject name="user_profile">
				<since>
					<version>12.0.0</version>
				</since>
				<synopsis>A named profile to apply to specific callers.</synopsis>
				<description><para>Callers in a ConfBridge have a profile associated with them
				that determine their options. A configuration section is determined to be a
				user_profile when the <literal>type</literal> parameter has a value
				of <literal>user</literal>.
				</para></description>
				<configOption name="type">
					<since>
						<version>11.0.0</version>
					</since>
					<synopsis>Define this configuration category as a user profile.</synopsis>
					<description><para>The type parameter determines how a context in the
					configuration file is interpreted.</para>
					<enumlist>
						<enum name="user"><para>Configure the context as a <replaceable>user_profile</replaceable></para></enum>
						<enum name="bridge"><para>Configure the context as a <replaceable>bridge_profile</replaceable></para></enum>
						<enum name="menu"><para>Configure the context as a <replaceable>menu</replaceable></para></enum>
					</enumlist>
					</description>
				</configOption>
				<configOption name="admin">
					<since>
						<version>11.0.0</version>
					</since>
					<synopsis>Sets if the user is an admin or not</synopsis>
				</configOption>
				<configOption name="send_events" default="no">
					<since>
						<version>15.5.0</version>
					</since>
					<synopsis>Sets if events are send to the user</synopsis>
					<description><para>If events are enabled for this bridge and this option is
					set, users will receive events like join, leave, talking, etc. via text
					messages.  For users accessing the bridge via chan_pjsip, this means
					in-dialog MESSAGE messages.  This is most useful for WebRTC participants
					where the browser application can use the messages to alter the user
					interface.</para></description>
				</configOption>
				<configOption name="echo_events" default="yes">
					<since>
						<version>15.5.0</version>
					</since>
					<synopsis>Sets if events are echoed back to the user that
					triggered them</synopsis>
					<description><para>If events are enabled for this user and this option
					is set, the user will receive events they trigger, talking, mute, etc.
					If not set, they will not receive their own events.
					</para></description>
				</configOption>
				<configOption name="marked">
					<since>
						<version>11.0.0</version>
					</since>
					<synopsis>Sets if this is a marked user or not</synopsis>
				</configOption>
				<configOption name="startmuted">
					<since>
						<version>11.0.0</version>
					</since>
					<synopsis>Sets if all users should start out muted</synopsis>
				</configOption>
				<configOption name="music_on_hold_when_empty">
					<since>
						<version>11.0.0</version>
					</since>
					<synopsis>Play MOH when user is alone or waiting on a marked user</synopsis>
				</configOption>
				<configOption name="quiet">
					<since>
						<version>11.0.0</version>
					</since>
					<synopsis>Silence enter/leave prompts and user intros for this user</synopsis>
				</configOption>
				<configOption name="hear_own_join_sound">
					<since>
						<version>16.26.0</version>
						<version>18.12.0</version>
						<version>19.4.0</version>
					</since>
					<synopsis>Determines if the user also hears the join sound when they enter a conference</synopsis>
				</configOption>
				<configOption name="announce_user_count">
					<since>
						<version>11.0.0</version>
					</since>
					<synopsis>Sets if the number of users should be announced to the user</synopsis>
				</configOption>
				<configOption name="announce_user_count_all">
					<since>
						<version>11.0.0</version>
					</since>
					<synopsis>Announce user count to all the other users when this user joins</synopsis>
					<description><para>Sets if the number of users should be announced to all the other users
					in the conference when this user joins. This option can be either set to 'yes' or
					a number. When set to a number, the announcement will only occur once the user
					count is above the specified number.
					</para></description>
				</configOption>
				<configOption name="announce_only_user">
					<since>
						<version>11.0.0</version>
					</since>
					<synopsis>Announce to a user when they join an empty conference</synopsis>
				</configOption>
				<configOption name="wait_marked">
					<since>
						<version>11.0.0</version>
					</since>
					<synopsis>Sets if the user must wait for a marked user to enter before joining a conference</synopsis>
				</configOption>
				<configOption name="end_marked">
					<since>
						<version>11.0.0</version>
					</since>
					<synopsis>Kick the user from the conference when the last marked user leaves</synopsis>
				</configOption>
				<configOption name="end_marked_any">
					<since>
						<version>16.29.0</version>
						<version>18.15.0</version>
						<version>19.7.0</version>
					</since>
					<synopsis>Kick the user from the conference when any marked user leaves</synopsis>
				</configOption>
				<configOption name="talk_detection_events">
					<since>
						<version>11.0.0</version>
					</since>
					<synopsis>Set whether or not notifications of when a user begins and ends talking should be sent out as events over AMI</synopsis>
				</configOption>
				<configOption name="dtmf_passthrough">
					<since>
						<version>11.0.0</version>
					</since>
					<synopsis>Sets whether or not DTMF should pass through the conference</synopsis>
				</configOption>
				<configOption name="announce_join_leave">
					<since>
						<version>11.0.0</version>
					</since>
					<synopsis>Prompt user for their name when joining a conference and play it to the conference when they enter</synopsis>
				</configOption>
				<configOption name="announce_join_leave_review">
					<since>
						<version>13.0.0</version>
					</since>
					<synopsis>Prompt user for their name when joining a conference and play it to the conference when they enter.
					The user will be asked to review the recording of their name before entering the conference.</synopsis>
				</configOption>
				<configOption name="pin">
					<since>
						<version>11.0.0</version>
					</since>
					<synopsis>Sets a PIN the user must enter before joining the conference</synopsis>
				</configOption>
				<configOption name="music_on_hold_class">
					<since>
						<version>11.0.0</version>
					</since>
					<synopsis>The MOH class to use for this user</synopsis>
				</configOption>
				<configOption name="announcement">
					<since>
						<version>11.0.0</version>
					</since>
					<synopsis>Sound file to play to the user when they join a conference</synopsis>
				</configOption>
				<configOption name="denoise">
					<since>
						<version>11.0.0</version>
					</since>
					<synopsis>Apply a denoise filter to the audio before mixing</synopsis>
					<description><para>Sets whether or not a denoise filter should be applied
					to the audio before mixing or not.  Off by default. Requires
					<literal>codec_speex</literal> to be built and installed.  Do not confuse this option
					with <replaceable>drop_silence</replaceable>.  Denoise is useful if there is a lot of background
					noise for a user as it attempts to remove the noise while preserving
					the speech.  This option does NOT remove silence from being mixed into
					the conference and does come at the cost of a slight performance hit.
					</para></description>
				</configOption>
				<configOption name="dsp_drop_silence">
					<since>
						<version>11.0.0</version>
					</since>
					<synopsis>Drop what Asterisk detects as silence from audio sent to the bridge</synopsis>
					<description><para>
					This option drops what Asterisk detects as silence from
					entering into the bridge.  Enabling this option will drastically
					improve performance and help remove the buildup of background
					noise from the conference. Highly recommended for large conferences
					due to its performance enhancements.
					</para></description>
				</configOption>
				<configOption name="dsp_silence_threshold">
					<since>
						<version>11.0.0</version>
					</since>
					<synopsis>The number of milliseconds of silence necessary to declare talking stopped.</synopsis>
					<description>
						<para>The time in milliseconds of sound falling below the
						<replaceable>dsp_talking_threshold</replaceable> option when
						a user is considered to stop talking.  This value affects several
						operations and should not be changed unless the impact on call
						quality is fully understood.
						</para>
						<para>What this value affects internally:
						</para>
						<para>1. When talk detection AMI events are enabled, this value
						determines when the user has stopped talking after a
						period of talking.  If this value is set too low
						AMI events indicating the user has stopped talking
						may get falsely sent out when the user briefly pauses
						during mid sentence.
						</para>
						<para>2. The <replaceable>drop_silence</replaceable> option
						depends on this value to determine when the user's audio should
						begin to be dropped from the conference bridge after the user
						stops talking.  If this value is set too low the user's
						audio stream may sound choppy to the other participants.  This
						is caused by the user transitioning constantly from silence to
						talking during mid sentence.
						</para>
						<para>The best way to approach this option is to set it slightly
						above the maximum amount of milliseconds of silence a user may
						generate during natural speech.
						</para>
						<para>Valid values are 1 through 2^31.</para>
					</description>
				</configOption>
				<configOption name="dsp_talking_threshold">
					<since>
						<version>11.10.0</version>
						<version>12.3.0</version>
					</since>
					<synopsis>Average magnitude threshold to determine talking.</synopsis>
					<description>
						<para>The minimum average magnitude per sample in a frame
						for the DSP to consider talking/noise present.  A value below
						this level is considered silence.  This value affects several
						operations and should not be changed unless the impact on call
						quality is fully understood.
						</para>
						<para>What this value affects internally:
						</para>
						<para>1. Audio is only mixed out of a user's incoming audio
						stream if talking is detected.  If this value is set too
						high the user will hear himself talking.
						</para>
						<para>2. When talk detection AMI events are enabled, this value
						determines when talking has begun which results in
						an AMI event to fire.  If this value is set too low
						AMI events may be falsely triggered by variants in
						room noise.
						</para>
						<para>3. The <replaceable>drop_silence</replaceable> option
						depends on this value to determine when the user's audio should
						be mixed into the bridge after periods of silence.  If this value
						is too high the user's speech will get discarded as they will
						be considered silent.
						</para>
						<para>Valid values are 1 through 2^15.</para>
					</description>
				</configOption>
				<configOption name="jitterbuffer">
					<since>
						<version>11.0.0</version>
					</since>
					<synopsis>Place a jitter buffer on the user's audio stream before audio mixing is performed</synopsis>
					<description><para>
						Enabling this option places a jitterbuffer on the user's audio stream
						before audio mixing is performed.  This is highly recommended but will
						add a slight delay to the audio.  This option is using the <literal>JITTERBUFFER</literal>
						dialplan function's default adaptive jitterbuffer.  For a more fine tuned
						jitterbuffer, disable this option and use the <literal>JITTERBUFFER</literal> dialplan function
						on the user before entering the ConfBridge application.
					</para></description>
				</configOption>
				<configOption name="template">
					<since>
						<version>11.0.0</version>
					</since>
					<synopsis>When using the CONFBRIDGE dialplan function, use a user profile as a template for creating a new temporary profile</synopsis>
				</configOption>
				<configOption name="timeout">
					<since>
						<version>13.7.0</version>
					</since>
					<synopsis>Kick the user out of the conference after this many seconds. 0 means there is no timeout for the user.</synopsis>
				</configOption>
				<configOption name="text_messaging" default="yes">
					<since>
						<version>16.10.0</version>
						<version>17.4.0</version>
					</since>
					<synopsis>Sets if text messages are sent to the user.</synopsis>
					<description><para>If text messaging is enabled for this user then
					text messages will be sent to it. These may be events or from other
					participants in the conference bridge. If disabled then no text
					messages are sent to the user.</para></description>
				</configOption>
				<configOption name="answer_channel" default="yes">
					<since>
						<version>16.19.0</version>
						<version>18.5.0</version>
					</since>
					<synopsis>Sets if a user's channel should be answered if currently unanswered.</synopsis>
				</configOption>
			</configObject>
			<configObject name="bridge_profile">
				<since>
					<version>12.0.0</version>
				</since>
				<synopsis>A named profile to apply to specific bridges.</synopsis>
				<description><para>ConfBridge bridges have a profile associated with them
				that determine their options. A configuration section is determined to be a
				<literal>bridge_profile</literal> when the <literal>type</literal> parameter has a value
				of <literal>bridge</literal>.
				</para></description>
				<configOption name="type">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Define this configuration category as a bridge profile</synopsis>
					<description><para>The type parameter determines how a context in the
					configuration file is interpreted.</para>
					<enumlist>
						<enum name="user"><para>Configure the context as a <replaceable>user_profile</replaceable></para></enum>
						<enum name="bridge"><para>Configure the context as a <replaceable>bridge_profile</replaceable></para></enum>
						<enum name="menu"><para>Configure the context as a <replaceable>menu</replaceable></para></enum>
					</enumlist>
					</description>
				</configOption>
				<configOption name="jitterbuffer">
					<since>
						<version>11.0.0</version>
					</since>
					<synopsis>Place a jitter buffer on the conference's audio stream</synopsis>
				</configOption>
				<configOption name="internal_sample_rate">
					<since>
						<version>18.22.0</version>
						<version>20.7.0</version>
						<version>21.2.0</version>
					</since>
					<synopsis>Set the internal native sample rate for mixing the conference</synopsis>
					<description><para>
						Sets the internal native sample rate the
						conference is mixed at.  This is set to automatically
						adjust the sample rate to the best quality by default.
						Other values can be anything from 8000-192000.  If a
						sample rate is set that Asterisk does not support, the
						closest sample rate Asterisk does support to the one requested
						will be used.
					</para></description>
				</configOption>
				<configOption name="maximum_sample_rate">
					<since>
						<version>18.22.0</version>
						<version>20.7.0</version>
						<version>21.2.0</version>
					</since>
					<synopsis>Set the maximum native sample rate for mixing the conference</synopsis>
					<description><para>
						Sets the maximum native sample rate the
						conference is mixed at. This is set to not have a
						maximum by default. If a sample rate is specified,
						though, the native sample rate will never exceed it.
					</para></description>
				</configOption>
				<configOption name="language" default="en">
					<since>
						<version>11.7.0</version>
					</since>
					<synopsis>The language used for announcements to the conference.</synopsis>
					<description><para>
						By default, announcements to a conference use English.  Which means
						the prompts played to all users within the conference will be
						English.  By changing the language of a bridge, this will change
						the language of the prompts played to all users.
					</para></description>
				</configOption>
				<configOption name="mixing_interval">
					<since>
						<version>11.0.0</version>
					</since>
					<synopsis>Sets the internal mixing interval in milliseconds for the bridge</synopsis>
					<description><para>
						Sets the internal mixing interval in milliseconds for the bridge.  This
						number reflects how tight or loose the mixing will be for the conference.
						In order to improve performance a larger mixing interval such as 40ms may
						be chosen.  Using a larger mixing interval comes at the cost of introducing
						larger amounts of delay into the bridge.  Valid values here are 10, 20, 40,
						or 80.
					</para></description>
				</configOption>
				<configOption name="binaural_active">
					<since>
						<version>15.0.0</version>
					</since>
					<synopsis>If true binaural conferencing with stereo audio is active</synopsis>
					<description><para>
						Activates binaural mixing for a conference bridge.
						Binaural features are disabled by default.
					</para></description>
				</configOption>
				<configOption name="record_conference">
					<since>
						<version>11.0.0</version>
					</since>
					<synopsis>Record the conference starting with the first active user's entrance and ending with the last active user's exit</synopsis>
					<description><para>
						Records the conference call starting when the first user
						enters the room, and ending when the last user exits the room.
						The default recorded filename is
						<filename>'confbridge-${name of conference bridge}-${start time}.wav'</filename>
						and the default format is 8khz slinear.  This file will be
						located in the configured monitoring directory in <filename>asterisk.conf</filename>.
					</para></description>
				</configOption>
				<configOption name="record_file" default="confbridge-${name of conference bridge}-${start time}.wav">
					<since>
						<version>11.0.0</version>
					</since>
					<synopsis>The filename of the conference recording</synopsis>
					<description><para>
						When <replaceable>record_conference</replaceable> is set to yes, the specific name of the
						record file can be set using this option.  Note that since multiple
						conferences may use the same bridge profile, this may cause issues
						depending on the configuration.  It is recommended to only use this
						option dynamically with the <literal>CONFBRIDGE()</literal> dialplan function. This
						allows the record name to be specified and a unique name to be chosen.
						By default, the record_file is stored in Asterisk's spool/monitor directory
						with a unique filename starting with the 'confbridge' prefix.
					</para></description>
				</configOption>
				<configOption name="record_file_append" default="yes">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Append to record file when starting/stopping on same conference recording</synopsis>
					<description><para>
						When <replaceable>record_file_append</replaceable> is set to yes, stopping and starting recording on a
						conference adds the new portion to end of current record_file. When this is
						set to no, a new <replaceable>record_file</replaceable> is generated every time you start then stop recording
						on a conference.
					</para></description>
				</configOption>
				<configOption name="record_file_timestamp" default="yes">
					<since>
						<version>14.0.0</version>
					</since>
					<synopsis>Append the start time to the record_file name so that it is unique.</synopsis>
					<description><para>
						When <replaceable>record_file_timestamp</replaceable> is set to yes, the start time is appended to
						<replaceable>record_file</replaceable> so that the filename is unique. This allows you to specify
						a <replaceable>record_file</replaceable> but not overwrite existing recordings.
					</para></description>
				</configOption>
				<configOption name="record_options" default="">
					<since>
						<version>14.0.0</version>
					</since>
					<synopsis>Pass additional options to MixMonitor when recording</synopsis>
					<description><para>
						Pass additional options to MixMonitor when <replaceable>record_conference</replaceable> is set to yes.
						See <literal>MixMonitor</literal> for available options.
					</para></description>
				</configOption>
				<configOption name="record_command" default="">
					<since>
						<version>14.0.0</version>
					</since>
					<synopsis>Execute a command after recording ends</synopsis>
					<description><para>
						Executes the specified command when recording ends. Any strings matching <literal>^{X}</literal> will be
						unescaped to <variable>X</variable>. All variables will be evaluated at the time ConfBridge is called.
					</para></description>
				</configOption>
				<configOption name="regcontext">
					<since>
						<version>13.10.0</version>
					</since>
					<synopsis>The name of the context into which to register the name of the conference bridge as NoOP() at priority 1</synopsis>
					<description><para>
						When set this will cause the name of the created conference to be registered
						into the named context at priority 1 with an operation of NoOP().  This can
						then be used in other parts of the dialplan to test for the existence of a
						specific conference bridge.
						You should be aware that there are potential races between testing for the
						existence of a bridge, and taking action upon that information, consider
						for example two callers executing the check simultaneously, and then taking
						special action as "first caller" into the bridge.  The same for exiting,
						directly after the check the bridge can be destroyed before the new caller
						enters (creating a new bridge), for example, and the "first member" actions
						could thus be missed.
					</para></description>
				</configOption>
				<configOption name="video_mode">
					<since>
						<version>11.0.0</version>
					</since>
					<synopsis>Sets how confbridge handles video distribution to the conference participants</synopsis>
					<description><para>
						Sets how confbridge handles video distribution to the conference participants.
						Note that participants wanting to view and be the source of a video feed
						<emphasis>MUST</emphasis> be sharing the same video codec.  Also, using video in conjunction with
						with the jitterbuffer currently results in the audio being slightly out of sync
						with the video.  This is a result of the jitterbuffer only working on the audio
						stream.  It is recommended to disable the jitterbuffer when video is used.</para>
						<enumlist>
							<enum name="none">
								<para>No video sources are set by default in the conference. It is still
								possible for a user to be set as a video source via AMI or DTMF action
								at any time.</para>
							</enum>
							<enum name="follow_talker">
								<para>The video feed will follow whoever is talking and providing video.</para>
							</enum>
							<enum name="last_marked">
								<para>The last marked user to join the conference with video capabilities
								will be the single source of video distributed to all participants.
								If multiple marked users are capable of video, the last one to join
								is always the source, when that user leaves it goes to the one who
								joined before them.</para>
							</enum>
							<enum name="first_marked">
								<para>The first marked user to join the conference with video capabilities
								is the single source of video distribution among all participants. If
								that user leaves, the marked user to join after them becomes the source.</para>
							</enum>
							<enum name="sfu">
								<para>Selective Forwarding Unit - Sets multi-stream
								operation for a multi-party video conference.</para>
							</enum>
						</enumlist>
					</description>
				</configOption>
				<configOption name="max_members">
					<since>
						<version>11.0.0</version>
					</since>
					<synopsis>Limit the maximum number of participants for a single conference</synopsis>
					<description><para>
						This option limits the number of participants for a single
						conference to a specific number.  By default conferences
						have no participant limit. After the limit is reached, the
						conference will be locked until someone leaves.  Note however
						that an Admin user will always be allowed to join the conference
						regardless if this limit is reached or not.
					</para></description>
				</configOption>
				<configOption name="sound_">
					<since>
						<version>13.19.0</version>
						<version>15.2.0</version>
					</since>
					<synopsis>Override the various conference bridge sound files</synopsis>
					<description><para>
						All sounds in the conference are customizable using the bridge profile options below.
						Simply state the option followed by the filename or full path of the filename after
						the option.  Example: <literal>sound_had_joined=conf-hasjoin</literal>  This will play the <literal>conf-hasjoin</literal>
						sound file found in the sounds directory when announcing someone's name is joining the
						conference.</para>
						<enumlist>
							<enum name="sound_join"><para>The sound played to everyone when someone enters the conference.</para></enum>
							<enum name="sound_leave"><para>The sound played to everyone when someone leaves the conference.</para></enum>
							<enum name="sound_has_joined"><para>The sound played before announcing someone's name has
										joined the conference. This is used for user intros.
										Example <literal>"_____ has joined the conference"</literal></para></enum>
							<enum name="sound_has_left"><para>The sound played when announcing someone's name has
										left the conference. This is used for user intros.
										Example <literal>"_____ has left the conference"</literal></para></enum>
							<enum name="sound_kicked"><para>The sound played to a user who has been kicked from the conference.</para></enum>
							<enum name="sound_muted"><para>The sound played when the mute option it toggled on.</para></enum>
							<enum name="sound_unmuted"><para>The sound played when the mute option it toggled off.</para></enum>
							<enum name="sound_binaural_on"><para>The sound played when binaural audio is turned on.</para></enum>
							<enum name="sound_binaural_off"><para>The sound played when the binaural audio is turned off.</para></enum>
							<enum name="sound_only_person"><para>The sound played when the user is the only person in the conference.</para></enum>
							<enum name="sound_only_one"><para>The sound played to a user when there is only one other
										person is in the conference.</para></enum>
							<enum name="sound_there_are"><para>The sound played when announcing how many users there
										are in a conference.</para></enum>
							<enum name="sound_other_in_party"><para>This file is used in conjunction with <literal>sound_there_are</literal>
										when announcing how many users there are in the conference.
										The sounds are stringed together like this.
										<literal>"sound_there_are" ${number of participants} "sound_other_in_party"</literal></para></enum>
							<enum name="sound_place_into_conference"><para>The sound played when someone is placed into the conference
										after waiting for a marked user.</para></enum>
							<enum name="sound_wait_for_leader"><para>The sound played when a user is placed into a conference that
										can not start until a marked user enters.</para></enum>
							<enum name="sound_leader_has_left"><para>The sound played when the last marked user leaves the conference.</para></enum>
							<enum name="sound_get_pin"><para>The sound played when prompting for a conference pin number.</para></enum>
							<enum name="sound_invalid_pin"><para>The sound played when an invalid pin is entered too many times.</para></enum>
							<enum name="sound_locked"><para>The sound played to a user trying to join a locked conference.</para></enum>
							<enum name="sound_locked_now"><para>The sound played to an admin after toggling the conference to locked mode.</para></enum>
							<enum name="sound_unlocked_now"><para>The sound played to an admin after toggling the conference to unlocked mode.</para></enum>
							<enum name="sound_error_menu"><para>The sound played when an invalid menu option is entered.</para></enum>
						</enumlist>
					</description>
				</configOption>
				<configOption name="video_update_discard" default="2000">
					<since>
						<version>15.0.0</version>
					</since>
					<synopsis>Sets the amount of time in milliseconds after sending a video update to discard subsequent video updates</synopsis>
					<description><para>
						Sets the amount of time in milliseconds after sending a video update request
						that subsequent video updates should be discarded. This means that if we
						send a video update we will discard any other video update requests until
						after the configured amount of time has elapsed. This prevents flooding of
						video update requests from clients.
					</para></description>
				</configOption>
				<configOption name="remb_send_interval" default="0">
					<since>
						<version>15.4.0</version>
					</since>
					<synopsis>Sets the interval in milliseconds that a combined REMB frame will be sent to video sources</synopsis>
					<description><para>
						Sets the interval in milliseconds that a combined REMB frame will be sent
						to video sources. This is done by taking all REMB frames that have been
						received since the last REMB frame was sent, making a combined value,
						and sending it to the source. A REMB frame contains receiver estimated
						maximum bitrate information. By creating a combined REMB frame the
						sender of video can be influenced on the bitrate they choose, allowing
						better quality for all receivers.
					</para></description>
				</configOption>
				<configOption name="remb_behavior" default="average">
					<since>
						<version>15.4.0</version>
					</since>
					<synopsis>Sets how REMB reports are generated from multiple sources</synopsis>
					<description><para>
						Sets how REMB reports are combined from multiple sources to form one. A REMB report
						consists of information about the receiver estimated maximum bitrate. As a source
						stream may be forwarded to multiple receivers the reports must be combined into
						a single one which is sent to the sender.</para>
						<enumlist>
							<enum name="average">
								<para>The average of all estimated maximum bitrates is taken and sent
								to the sender.</para>
							</enum>
							<enum name="lowest">
								<para>The lowest estimated maximum bitrate is forwarded to the sender.</para>
							</enum>
							<enum name="highest">
								<para>The highest estimated maximum bitrate is forwarded to the sender.</para>
							</enum>
							<enum name="average_all">
								<para>The average of all estimated maximum bitrates is taken from all
								receivers in the bridge and a single value is sent to each sender.</para>
							</enum>
							<enum name="lowest_all">
								<para>The lowest estimated maximum bitrate of all receivers in the bridge
								is taken and sent to each sender.</para>
							</enum>
							<enum name="highest_all">
								<para>The highest estimated maximum bitrate of all receivers in the bridge
								is taken and sent to each sender.</para>
							</enum>
							<enum name="force">
								<para>The bitrate configured in <literal>remb_estimated_bitrate</literal>
								is sent to each sender.</para>
							</enum>
						</enumlist>
					</description>
					<see-also><ref type="configOption">remb_estimated_bitrate</ref></see-also>
				</configOption>
				<configOption name="remb_estimated_bitrate">
					<since>
						<version>16.15.0</version>
						<version>17.9.0</version>
						<version>18.1.0</version>
					</since>
					<synopsis>Sets the estimated bitrate sent to each participant in REMB reports</synopsis>
					<description><para>
					    When <literal>remb_behavior</literal> is set to <literal>force</literal>,
					    this options sets the estimated bitrate (in bits per second) sent to each participant
					    in REMB reports.
					</para></description>
					<see-also><ref type="configOption">remb_behavior</ref></see-also>
				</configOption>
				<configOption name="enable_events" default="no">
					<since>
						<version>15.5.0</version>
					</since>
					<synopsis>Enables events for this bridge</synopsis>
					<description><para>
						If enabled, recipients who joined the bridge via a channel driver
						that supports Enhanced Messaging (currently only chan_pjsip) will
						receive in-dialog messages containing a JSON body describing the
						event.  The Content-Type header will be
						<literal>text/x-ast-confbridge-event</literal>.
						This feature must also be enabled in user profiles.</para>
					</description>
				</configOption>
				<configOption name="template">
					<since>
						<version>11.0.0</version>
					</since>
					<synopsis>When using the CONFBRIDGE dialplan function, use a bridge profile as a template for creating a new temporary profile</synopsis>
				</configOption>
			</configObject>
			<configObject name="menu">
				<since>
					<version>12.0.0</version>
				</since>
				<synopsis>A conference user menu</synopsis>
				<description>
					<para>Conference users, as defined by a <replaceable>conf_user</replaceable>,
					can have a DTMF menu assigned to their profile when they enter the
					<literal>ConfBridge</literal> application.</para>
				</description>
				<configOption name="type">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Define this configuration category as a menu</synopsis>
					<description><para>The type parameter determines how a context in the
					configuration file is interpreted.</para>
					<enumlist>
						<enum name="user"><para>Configure the context as a <replaceable>user_profile</replaceable></para></enum>
						<enum name="bridge"><para>Configure the context as a <replaceable>bridge_profile</replaceable></para></enum>
						<enum name="menu"><para>Configure the context as a <replaceable>menu</replaceable></para></enum>
					</enumlist>
					</description>
				</configOption>
				<configOption name="template">
					<since>
						<version>13.0.0</version>
					</since>
					<synopsis>When using the CONFBRIDGE dialplan function, use a menu profile as a template for creating a new temporary profile</synopsis>
				</configOption>
				<configOption name="^[0-9A-D*#]+$">
					<synopsis>DTMF sequences to assign various confbridge actions to</synopsis>
					<description>
					<para>The ConfBridge application also has the ability to apply custom DTMF menus to
					each channel using the application.  Like the User and Bridge profiles a menu
					is passed in to ConfBridge as an argument in the dialplan.</para>
					<para>Below is a list of menu actions that can be assigned to a DTMF sequence.</para>
					<note><para>
						To have the first DTMF digit in a sequence be the '#' character, you need to
						escape it.  If it is not escaped then normal config file processing will
						think it is a directive like #include.  For example: The mute setting is
						toggled when <literal>#1</literal> is pressed.</para>
						<para><literal>\#1=toggle_mute</literal></para>
					</note>
					<note><para>
					A single DTMF sequence can have multiple actions associated with it. This is
					accomplished by stringing the actions together and using a <literal>,</literal> as the
					delimiter.  Example:  Both listening and talking volume is reset when <literal>5</literal> is
					pressed.  <literal>5=reset_talking_volume, reset_listening_volume</literal></para></note>
					<enumlist>
						<enum name="playback(filename&amp;filename2&amp;...)"><para>
							<literal>playback</literal> will play back an audio file to a channel
							and then immediately return to the conference.
							This file can not be interrupted by DTMF.
							Multiple files can be chained together using the
							<literal>&amp;</literal> character.</para></enum>
						<enum name="playback_and_continue(filename&amp;filename2&amp;...)"><para>
							<literal>playback_and_continue</literal> will
							play back a prompt while continuing to
							collect the dtmf sequence.  This is useful
							when using a menu prompt that describes all
							the menu options.  Note however that any DTMF
							during this action will terminate the prompts
							playback.  Prompt files can be chained together
							using the <literal>&amp;</literal> character as a delimiter.</para></enum>
						<enum name="toggle_mute"><para>
							Toggle turning on and off mute.  Mute will make the user silent
							to everyone else, but the user will still be able to listen in.
							</para></enum>
						<enum name="toggle_binaural"><para>
							Toggle turning on and off binaural audio processing.
							</para></enum>
						<enum name="no_op"><para>
							This action does nothing (No Operation). Its only real purpose exists for
							being able to reserve a sequence in the config as a menu exit sequence.</para></enum>
						<enum name="decrease_listening_volume"><para>
							Decreases the channel's listening volume.</para></enum>
						<enum name="increase_listening_volume"><para>
							Increases the channel's listening volume.</para></enum>
						<enum name="reset_listening_volume"><para>
							Reset channel's listening volume to default level.</para></enum>
						<enum name="decrease_talking_volume"><para>
							Decreases the channel's talking volume.</para></enum>
						<enum name="increase_talking_volume"><para>
							Increases the channel's talking volume.</para></enum>
						<enum name="reset_talking_volume"><para>
							Reset channel's talking volume to default level.</para></enum>
						<enum name="dialplan_exec(context,exten,priority)"><para>
							The <literal>dialplan_exec</literal> action allows a user
							to escape from the conference and execute
							commands in the dialplan.  Once the dialplan
							exits the user will be put back into the
							conference.  The possibilities are endless!</para></enum>
						<enum name="leave_conference"><para>
							This action allows a user to exit the conference and continue
							execution in the dialplan.</para></enum>
						<enum name="admin_kick_last"><para>
							This action allows an Admin to kick the last participant from the
							conference. This action will only work for admins which allows
							a single menu to be used for both users and admins.</para></enum>
						<enum name="admin_toggle_conference_lock"><para>
							This action allows an Admin to toggle locking and
							unlocking the conference.  Non admins can not use
							this action even if it is in their menu.</para></enum>
						<enum name="set_as_single_video_src"><para>
							This action allows any user to set themselves as the
							single video source distributed to all participants.
							This will make the video feed stick to them regardless
							of what the <literal>video_mode</literal> is set to.</para></enum>
						<enum name="release_as_single_video_src"><para>
							This action allows a user to release themselves as
							the video source.  If <literal>video_mode</literal> is not set to <literal>none</literal>
							this action will result in the conference returning to
							whatever video mode the bridge profile is using.</para>
							<para>Note that this action will have no effect if the user
							is not currently the video source.  Also, the user is
							not guaranteed by using this action that they will not
							become the video source again.  The bridge will return
							to whatever operation the <literal>video_mode</literal> option is set to
							upon release of the video src.</para></enum>
						<enum name="admin_toggle_mute_participants"><para>
							This action allows an administrator to toggle the mute
							state for all non-admins within a conference.  All
							admin users are unaffected by this option.  Note that all
							users, regardless of their admin status, are notified
							that the conference is muted.</para></enum>
						<enum name="participant_count"><para>
							This action plays back the number of participants currently
							in a conference</para></enum>
						</enumlist>
					</description>
				</configOption>
			</configObject>
		</configFile>
	</configInfo>
<module language="en_US" name="conf_state">
	<support_level>core</support_level>
</module>
<module language="en_US" name="conf_state_empty">
	<support_level>core</support_level>
</module>
<module language="en_US" name="conf_state_inactive">
	<support_level>core</support_level>
</module>
<module language="en_US" name="conf_state_multi">
	<support_level>core</support_level>
</module>
<module language="en_US" name="conf_state_multi_marked">
	<support_level>core</support_level>
</module>
<module language="en_US" name="conf_state_single">
	<support_level>core</support_level>
</module>
<module language="en_US" name="conf_state_single_marked">
	<support_level>core</support_level>
</module>
	<managerEvent language="en_US" name="ConfbridgeStart" module="confbridge_manager">
		<managerEventInstance class="EVENT_FLAG_CALL" module="confbridge_manager">
			<since>
				<version>12.0.0</version>
			</since>
			<synopsis>Raised when a conference starts.</synopsis>
			<syntax>
				<parameter name="Conference">
					<para>The name of the Confbridge conference.</para>
				</parameter>
				<bridge_snapshot/>
			</syntax>
			<see-also>
				<ref type="managerEvent">ConfbridgeEnd</ref>
				<ref type="application">ConfBridge</ref>
			</see-also>
		</managerEventInstance>
	</managerEvent>
	<managerEvent language="en_US" name="ConfbridgeEnd" module="confbridge_manager">
		<managerEventInstance class="EVENT_FLAG_CALL" module="confbridge_manager">
			<since>
				<version>12.0.0</version>
			</since>
			<synopsis>Raised when a conference ends.</synopsis>
			<syntax>
				<parameter name="Conference">
					<para>The name of the Confbridge conference.</para>
				</parameter>
				<bridge_snapshot/>
			</syntax>
			<see-also>
				<ref type="managerEvent">ConfbridgeStart</ref>
				<ref type="application">ConfBridge</ref>
			</see-also>
		</managerEventInstance>
	</managerEvent>
	<managerEvent language="en_US" name="ConfbridgeJoin" module="confbridge_manager">
		<managerEventInstance class="EVENT_FLAG_CALL" module="confbridge_manager">
			<since>
				<version>12.0.0</version>
			</since>
			<synopsis>Raised when a channel joins a Confbridge conference.</synopsis>
			<syntax>
				<parameter name="Conference">
					<para>The name of the Confbridge conference.</para>
				</parameter>
				<bridge_snapshot/>
				<channel_snapshot/>
				<parameter name="Admin">
					<para>Identifies this user as an admin user.</para>
					<enumlist>
						<enum name="Yes"/>
						<enum name="No"/>
					</enumlist>
				</parameter>
				<parameter name="Muted">
					<para>The joining mute status.</para>
					<enumlist>
						<enum name="Yes"/>
						<enum name="No"/>
					</enumlist>
				</parameter>
			</syntax>
			<see-also>
				<ref type="managerEvent">ConfbridgeLeave</ref>
				<ref type="application">ConfBridge</ref>
			</see-also>
		</managerEventInstance>
	</managerEvent>
	<managerEvent language="en_US" name="ConfbridgeLeave" module="confbridge_manager">
		<managerEventInstance class="EVENT_FLAG_CALL" module="confbridge_manager">
			<since>
				<version>12.0.0</version>
			</since>
			<synopsis>Raised when a channel leaves a Confbridge conference.</synopsis>
			<syntax>
				<parameter name="Conference">
					<para>The name of the Confbridge conference.</para>
				</parameter>
				<bridge_snapshot/>
				<channel_snapshot/>
				<parameter name="Admin">
					<para>Identifies this user as an admin user.</para>
					<enumlist>
						<enum name="Yes"/>
						<enum name="No"/>
					</enumlist>
				</parameter>
			</syntax>
			<see-also>
				<ref type="managerEvent">ConfbridgeJoin</ref>
				<ref type="application">ConfBridge</ref>
			</see-also>
		</managerEventInstance>
	</managerEvent>
	<managerEvent language="en_US" name="ConfbridgeRecord" module="confbridge_manager">
		<managerEventInstance class="EVENT_FLAG_CALL" module="confbridge_manager">
			<since>
				<version>12.0.0</version>
			</since>
			<synopsis>Raised when a conference starts recording.</synopsis>
			<syntax>
				<parameter name="Conference">
					<para>The name of the Confbridge conference.</para>
				</parameter>
				<bridge_snapshot/>
			</syntax>
			<see-also>
				<ref type="managerEvent">ConfbridgeStopRecord</ref>
				<ref type="application">ConfBridge</ref>
			</see-also>
		</managerEventInstance>
	</managerEvent>
	<managerEvent language="en_US" name="ConfbridgeStopRecord" module="confbridge_manager">
		<managerEventInstance class="EVENT_FLAG_CALL" module="confbridge_manager">
			<since>
				<version>12.0.0</version>
			</since>
			<synopsis>Raised when a conference that was recording stops recording.</synopsis>
			<syntax>
				<parameter name="Conference">
					<para>The name of the Confbridge conference.</para>
				</parameter>
				<bridge_snapshot/>
			</syntax>
			<see-also>
				<ref type="managerEvent">ConfbridgeRecord</ref>
				<ref type="application">ConfBridge</ref>
			</see-also>
		</managerEventInstance>
	</managerEvent>
	<managerEvent language="en_US" name="ConfbridgeMute" module="confbridge_manager">
		<managerEventInstance class="EVENT_FLAG_CALL" module="confbridge_manager">
			<since>
				<version>12.0.0</version>
			</since>
			<synopsis>Raised when a Confbridge participant mutes.</synopsis>
			<syntax>
				<parameter name="Conference">
					<para>The name of the Confbridge conference.</para>
				</parameter>
				<bridge_snapshot/>
				<channel_snapshot/>
				<parameter name="Admin">
					<para>Identifies this user as an admin user.</para>
					<enumlist>
						<enum name="Yes"/>
						<enum name="No"/>
					</enumlist>
				</parameter>
			</syntax>
			<see-also>
				<ref type="managerEvent">ConfbridgeUnmute</ref>
				<ref type="application">ConfBridge</ref>
			</see-also>
		</managerEventInstance>
	</managerEvent>
	<managerEvent language="en_US" name="ConfbridgeUnmute" module="confbridge_manager">
		<managerEventInstance class="EVENT_FLAG_CALL" module="confbridge_manager">
			<since>
				<version>12.0.0</version>
			</since>
			<synopsis>Raised when a confbridge participant unmutes.</synopsis>
			<syntax>
				<parameter name="Conference">
					<para>The name of the Confbridge conference.</para>
				</parameter>
				<bridge_snapshot/>
				<channel_snapshot/>
				<parameter name="Admin">
					<para>Identifies this user as an admin user.</para>
					<enumlist>
						<enum name="Yes"/>
						<enum name="No"/>
					</enumlist>
				</parameter>
			</syntax>
			<see-also>
				<ref type="managerEvent">ConfbridgeMute</ref>
				<ref type="application">ConfBridge</ref>
			</see-also>
		</managerEventInstance>
	</managerEvent>
	<managerEvent language="en_US" name="ConfbridgeTalking" module="confbridge_manager">
		<managerEventInstance class="EVENT_FLAG_CALL" module="confbridge_manager">
			<since>
				<version>12.0.0</version>
			</since>
			<synopsis>Raised when a confbridge participant begins or ends talking.</synopsis>
			<syntax>
				<parameter name="Conference">
					<para>The name of the Confbridge conference.</para>
				</parameter>
				<bridge_snapshot/>
				<channel_snapshot/>
				<parameter name="TalkingStatus">
					<enumlist>
						<enum name="on"/>
						<enum name="off"/>
					</enumlist>
				</parameter>
				<parameter name="Admin">
					<para>Identifies this user as an admin user.</para>
					<enumlist>
						<enum name="Yes"/>
						<enum name="No"/>
					</enumlist>
				</parameter>
			</syntax>
			<see-also>
				<ref type="application">ConfBridge</ref>
			</see-also>
		</managerEventInstance>
	</managerEvent>
<module language="en_US" name="codec_a_mu">
	<support_level>core</support_level>
</module>
<module language="en_US" name="codec_adpcm">
	<support_level>core</support_level>
</module>
<module language="en_US" name="codec_alaw">
	<support_level>core</support_level>
</module>
<module language="en_US" name="codec_codec2">
	<depend>codec2</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="codec_dahdi">
	<depend>dahdi</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="codec_g722">
	<support_level>core</support_level>
</module>
<module language="en_US" name="codec_g726">
	<support_level>core</support_level>
</module>
<module language="en_US" name="codec_gsm">
	<depend>gsm</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="codec_ilbc">
	<use>ilbc</use>
	<support_level>core</support_level>
</module>
<module language="en_US" name="codec_lpc10">
	<support_level>core</support_level>
</module>
<module language="en_US" name="codec_resample">
	<support_level>core</support_level>
</module>
<module language="en_US" name="codec_speex">
	<depend>speex</depend>
	<depend>speex_preprocess</depend>
	<use type="external">speexdsp</use>
	<support_level>core</support_level>
</module>
<module language="en_US" name="codec_ulaw">
	<support_level>core</support_level>
</module>
<module language="en_US" name="format_g719">
	<support_level>core</support_level>
</module>
<module language="en_US" name="format_g723">
	<support_level>core</support_level>
</module>
<module language="en_US" name="format_g726">
	<support_level>core</support_level>
</module>
<module language="en_US" name="format_g729">
	<support_level>core</support_level>
</module>
<module language="en_US" name="format_gsm">
	<support_level>core</support_level>
</module>
<module language="en_US" name="format_h263">
	<support_level>core</support_level>
</module>
<module language="en_US" name="format_h264">
	<support_level>core</support_level>
</module>
<module language="en_US" name="format_ilbc">
	<support_level>core</support_level>
</module>
<module language="en_US" name="format_ogg_speex">
	<depend>speex</depend>
	<depend>ogg</depend>
	<support_level>extended</support_level>
</module>
<module language="en_US" name="format_ogg_vorbis">
	<depend>vorbis</depend>
	<depend>ogg</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="format_pcm">
	<support_level>core</support_level>
</module>
<module language="en_US" name="format_siren14">
	<support_level>core</support_level>
</module>
<module language="en_US" name="format_siren7">
	<support_level>core</support_level>
</module>
<module language="en_US" name="format_sln">
	<support_level>core</support_level>
</module>
<module language="en_US" name="format_vox">
	<support_level>extended</support_level>
</module>
<module language="en_US" name="format_wav">
	<support_level>core</support_level>
</module>
<module language="en_US" name="format_wav_gsm">
	<support_level>core</support_level>
</module>
<module language="en_US" name="cdr_adaptive_odbc">
	<depend>res_odbc</depend>
	<depend>generic_odbc</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="cdr_beanstalkd">
	<depend>beanstalk</depend>
	<support_level>extended</support_level>
</module>
<module language="en_US" name="cdr_csv">
	<support_level>extended</support_level>
</module>
<module language="en_US" name="cdr_custom">
	<depend>res_cdrel_custom</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="cdr_manager">
	<support_level>core</support_level>
</module>
	<managerEvent language="en_US" name="Cdr" module="cdr_manager">
		<managerEventInstance class="EVENT_FLAG_CDR" module="cdr_manager">
			<since>
				<version>13.2.0</version>
			</since>
			<synopsis>Raised when a CDR is generated.</synopsis>
			<syntax>
				<parameter name="AccountCode">
					<para>The account code of the Party A channel.</para>
				</parameter>
				<parameter name="Source">
					<para>The Caller ID number associated with the Party A in the CDR.</para>
				</parameter>
				<parameter name="Destination">
					<para>The dialplan extension the Party A was executing.</para>
				</parameter>
				<parameter name="DestinationContext">
					<para>The dialplan context the Party A was executing.</para>
				</parameter>
				<parameter name="CallerID">
					<para>The Caller ID name associated with the Party A in the CDR.</para>
				</parameter>
				<parameter name="Channel">
					<para>The channel name of the Party A.</para>
				</parameter>
				<parameter name="DestinationChannel">
					<para>The channel name of the Party B.</para>
				</parameter>
				<parameter name="LastApplication">
					<para>The last dialplan application the Party A executed.</para>
				</parameter>
				<parameter name="LastData">
					<para>
						The parameters passed to the last dialplan application the
						Party A executed.
					</para>
				</parameter>
				<parameter name="StartTime">
					<para>The time the CDR was created.</para>
				</parameter>
				<parameter name="AnswerTime">
					<para>
						The earliest of either the time when Party A answered, or
						the start time of this CDR.
					</para>
				</parameter>
				<parameter name="EndTime">
					<para>
						The time when the CDR was finished. This occurs when the
						Party A hangs up or when the bridge between Party A and
						Party B is broken.
					</para>
				</parameter>
				<parameter name="Duration">
					<para>The time, in seconds, of <replaceable>EndTime</replaceable> - <replaceable>StartTime</replaceable>.</para>
				</parameter>
				<parameter name="BillableSeconds">
					<para>The time, in seconds, of <replaceable>AnswerTime</replaceable> - <replaceable>StartTime</replaceable>.</para>
				</parameter>
				<parameter name="Disposition">
					<para>The final known disposition of the CDR.</para>
					<enumlist>
						<enum name="NO ANSWER">
							<para>The channel was not answered. This is the default disposition.</para>
						</enum>
						<enum name="FAILED">
							<para>The channel attempted to dial but the call failed.</para>
							<note>
								<para>The congestion setting in <filename>cdr.conf</filename> can result
								in the <literal>AST_CAUSE_CONGESTION</literal> hang up cause or the
								<literal>CONGESTION</literal> dial status to map to this disposition.
								</para>
							</note>
						</enum>
						<enum name="BUSY">
							<para>The channel attempted to dial but the remote party was busy.</para>
						</enum>
						<enum name="ANSWERED">
							<para>The channel was answered. The hang up cause will no longer
							impact the disposition of the CDR.</para>
						</enum>
						<enum name="CONGESTION">
							<para>The channel attempted to dial but the remote party was congested.</para>
						</enum>
					</enumlist>
				</parameter>
				<parameter name="AMAFlags">
					<para>A flag that informs a billing system how to treat the CDR.</para>
					<enumlist>
						<enum name="OMIT">
							<para>This CDR should be ignored.</para>
						</enum>
						<enum name="BILLING">
							<para>This CDR contains valid billing data.</para>
						</enum>
						<enum name="DOCUMENTATION">
							<para>This CDR is for documentation purposes.</para>
						</enum>
					</enumlist>
				</parameter>
				<parameter name="UniqueID">
					<para>A unique identifier for the Party A channel.</para>
				</parameter>
				<parameter name="UserField">
					<para>
						A user defined field set on the channels. If set on both the Party A
						and Party B channel, the userfields of both are concatenated and
						separated by a <literal>;</literal>.
					</para>
				</parameter>
			</syntax>
			<description>
				<para>
					The <replaceable>Cdr</replaceable> event is only raised when the
					<filename>cdr_manager</filename> backend is loaded and registered with
					the CDR engine.
				</para>
				<note>
					<para>
						This event can contain additional fields depending on the configuration
						provided by <filename>cdr_manager.conf</filename>.
					</para>
				</note>
			</description>
		</managerEventInstance>
	</managerEvent>
<module language="en_US" name="cdr_odbc">
	<depend>res_odbc</depend>
	<depend>generic_odbc</depend>
	<support_level>extended</support_level>
</module>
<module language="en_US" name="cdr_pgsql">
	<depend>pgsql</depend>
	<support_level>extended</support_level>
</module>
<module language="en_US" name="cdr_radius">
	<depend>radius</depend>
	<support_level>extended</support_level>
</module>
<module language="en_US" name="cdr_sqlite3_custom">
	<depend>res_cdrel_custom</depend>
	<depend>sqlite3</depend>
	<support_level>extended</support_level>
</module>
<module language="en_US" name="cdr_tds">
	<depend>freetds</depend>
	<support_level>extended</support_level>
</module>
<module language="en_US" name="cel_beanstalkd">
	<depend>beanstalk</depend>
	<support_level>extended</support_level>
</module>
<module language="en_US" name="cel_custom">
	<depend>res_cdrel_custom</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="cel_manager">
	<support_level>core</support_level>
</module>
	<managerEvent language="en_US" name="CEL" module="cel_manager">
		<managerEventInstance class="EVENT_FLAG_CALL" module="cel_manager">
			<since>
				<version>13.2.0</version>
			</since>
			<synopsis>Raised when a Channel Event Log is generated for a channel.</synopsis>
			<syntax>
				<parameter name="EventName">
					<para>
						The name of the CEL event being raised. This can include
						both the system defined CEL events, as well as user defined
						events.
					</para>
					<note>
						<para>All events listed here may not be raised, depending
						on the configuration in <filename>cel.conf</filename>.</para>
					</note>
					<enumlist>
						<enum name="CHAN_START">
							<para>A channel was created.</para>
						</enum>
						<enum name="CHAN_END">
							<para>A channel was terminated.</para>
						</enum>
						<enum name="ANSWER">
							<para>A channel answered.</para>
						</enum>
						<enum name="HANGUP">
							<para>A channel was hung up.</para>
						</enum>
						<enum name="BRIDGE_ENTER">
							<para>A channel entered a bridge.</para>
						</enum>
						<enum name="BRIDGE_EXIT">
							<para>A channel left a bridge.</para>
						</enum>
						<enum name="APP_START">
							<para>A channel entered into a tracked application.</para>
						</enum>
						<enum name="APP_END">
							<para>A channel left a tracked application.</para>
						</enum>
						<enum name="PARK_START">
							<para>A channel was parked.</para>
						</enum>
						<enum name="PARK_END">
							<para>A channel was unparked.</para>
						</enum>
						<enum name="BLINDTRANSFER">
							<para>A channel initiated a blind transfer.</para>
						</enum>
						<enum name="ATTENDEDTRANSFER">
							<para>A channel initiated an attended transfer.</para>
						</enum>
						<enum name="PICKUP">
							<para>A channel initated a call pickup.</para>
						</enum>
						<enum name="FORWARD">
							<para>A channel is being forwarded to another destination.</para>
						</enum>
						<enum name="LINKEDID_END">
							<para>The linked ID associated with this channel is being retired.</para>
						</enum>
						<enum name="LOCAL_OPTIMIZE_BEGIN">
							<para>A Local channel optimization has begun.</para>
						</enum>
						<enum name="LOCAL_OPTIMIZE">
							<para>A Local channel optimization has occurred.</para>
						</enum>
						<enum name="STREAM_BEGIN">
							<para>A stream started playing: it can be a standalone sound
							file playing back, or a music-on-hold class started.</para>
						</enum>
						<enum name="STREAM_END">
							<para>A playing stream ended.</para>
						</enum>
						<enum name="DTMF">
							<para>A DTMF digit was processed: these events are dispatched
							at the end, when the button is released and the duration is
							present in the extra field</para>
						</enum>
						<enum name="USER_DEFINED">
							<para>A user defined type.</para>
							<note>
								<para>
									This event is only present if <literal>show_user_defined</literal>
									in <filename>cel.conf</filename> is <literal>True</literal>. Otherwise,
									the user defined event will be placed directly in the
									<replaceable>EventName</replaceable> field.
								</para>
							</note>
						</enum>
					</enumlist>
				</parameter>
				<parameter name="AccountCode">
					<para>The channel's account code.</para>
				</parameter>
				<parameter name="CallerIDnum">
					<para>The Caller ID number.</para>
				</parameter>
				<parameter name="CallerIDname">
					<para>The Caller ID name.</para>
				</parameter>
				<parameter name="CallerIDani">
					<para>The Caller ID Automatic Number Identification.</para>
				</parameter>
				<parameter name="CallerIDrdnis">
					<para>The Caller ID Redirected Dialed Number Identification Service.</para>
				</parameter>
				<parameter name="CallerIDdnid">
					<para>The Caller ID Dialed Number Identifier.</para>
				</parameter>
				<parameter name="Exten">
					<para>The dialplan extension the channel is currently executing in.</para>
				</parameter>
				<parameter name="Context">
					<para>The dialplan context the channel is currently executing in.</para>
				</parameter>
				<parameter name="Application">
					<para>The dialplan application the channel is currently executing.</para>
				</parameter>
				<parameter name="AppData">
					<para>The arguments passed to the dialplan <replaceable>Application</replaceable>.</para>
				</parameter>
				<parameter name="EventTime">
					<para>The time the CEL event occurred.</para>
				</parameter>
				<parameter name="AMAFlags">
					<para>A flag that informs a billing system how to treat the CEL.</para>
					<enumlist>
						<enum name="OMIT">
							<para>This event should be ignored.</para>
						</enum>
						<enum name="BILLING">
							<para>This event contains valid billing data.</para>
						</enum>
						<enum name="DOCUMENTATION">
							<para>This event is for documentation purposes.</para>
						</enum>
					</enumlist>
				</parameter>
				<parameter name="UniqueID">
					<para>The unique ID of the channel.</para>
				</parameter>
				<parameter name="LinkedID">
					<para>The linked ID of the channel, which ties this event to other related channel's events.</para>
				</parameter>
				<parameter name="UserField">
					<para>
						A user defined field set on a channel, containing arbitrary
						application specific data.
					</para>
				</parameter>
				<parameter name="Peer">
					<para>
						If this channel is in a bridge, the channel that it is in
						a bridge with.
					</para>
				</parameter>
				<parameter name="PeerAccount">
					<para>
						If this channel is in a bridge, the accountcode of the
						channel it is in a bridge with.
					</para>
				</parameter>
				<parameter name="Extra">
					<para>
						Some events will have event specific data that accompanies the CEL record.
						This extra data is JSON encoded, and is dependent on the event in
						question.
					</para>
				</parameter>
			</syntax>
		</managerEventInstance>
	</managerEvent>
<module language="en_US" name="cel_odbc">
	<depend>res_odbc</depend>
	<depend>generic_odbc</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="cel_pgsql">
	<depend>pgsql</depend>
	<support_level>extended</support_level>
</module>
<module language="en_US" name="cel_radius">
	<depend>radius</depend>
	<support_level>extended</support_level>
</module>
<module language="en_US" name="cel_sqlite3_custom">
	<depend>res_cdrel_custom</depend>
	<depend>sqlite3</depend>
	<support_level>extended</support_level>
</module>
<module language="en_US" name="cel_tds">
	<depend>freetds</depend>
	<support_level>extended</support_level>
</module>
<module language="en_US" name="bridge_builtin_features">
	<support_level>core</support_level>
</module>
<module language="en_US" name="bridge_builtin_interval_features">
	<support_level>core</support_level>
</module>
<module language="en_US" name="bridge_holding">
	<support_level>core</support_level>
</module>
<module language="en_US" name="bridge_native_rtp">
	<support_level>core</support_level>
</module>
<module language="en_US" name="bridge_simple">
	<support_level>core</support_level>
</module>
<module language="en_US" name="bridge_softmix">
	<support_level>core</support_level>
</module>
<module language="en_US" name="func_aes">
	<depend>res_crypto</depend>
	<depend>crypto</depend>
	<support_level>core</support_level>
</module>
	<function name="AES_ENCRYPT" language="en_US" module="func_aes">
		<since>
			<version>1.6.1.0</version>
		</since>
		<synopsis>
			Encrypt a string with AES given a 16 character key.
		</synopsis>
		<syntax>
			<parameter name="key" required="true">
				<para>AES Key</para>
			</parameter>
			<parameter name="string" required="true">
				<para>Input string</para>
			</parameter>
		</syntax>
		<description>
			<para>Returns an AES encrypted string encoded in base64.</para>
		</description>
		<see-also>
			<ref type="function">AES_DECRYPT</ref>
			<ref type="function">BASE64_ENCODE</ref>
			<ref type="function">BASE64_DECODE</ref>
		</see-also>
	</function>
	<function name="AES_DECRYPT" language="en_US" module="func_aes">
		<since>
			<version>1.6.1.0</version>
		</since>
		<synopsis>
			Decrypt a string encoded in base64 with AES given a 16 character key.
		</synopsis>
		<syntax>
			<parameter name="key" required="true">
				<para>AES Key</para>
			</parameter>
			<parameter name="string" required="true">
				<para>Input string.</para>
			</parameter>
		</syntax>
		<description>
			<para>Returns the plain text string.</para>
		</description>
		<see-also>
			<ref type="function">AES_ENCRYPT</ref>
			<ref type="function">BASE64_ENCODE</ref>
			<ref type="function">BASE64_DECODE</ref>
		</see-also>
	</function>
<module language="en_US" name="func_base64">
	<support_level>core</support_level>
</module>
	<function name="BASE64_ENCODE" language="en_US" module="func_base64">
		<since>
			<version>1.4.0</version>
		</since>
		<synopsis>
			Encode a string in base64.
		</synopsis>
		<syntax>
			<parameter name="string" required="true">
				<para>Input string</para>
			</parameter>
		</syntax>
		<description>
			<para>Returns the base64 string.</para>
		</description>
		<see-also>
			<ref type="function">BASE64_DECODE</ref>
			<ref type="function">AES_DECRYPT</ref>
			<ref type="function">AES_ENCRYPT</ref>
		</see-also>
	</function>
	<function name="BASE64_DECODE" language="en_US" module="func_base64">
		<since>
			<version>1.4.0</version>
		</since>
		<synopsis>
			Decode a base64 string.
		</synopsis>
		<syntax>
			<parameter name="string" required="true">
				<para>Input string.</para>
			</parameter>
		</syntax>
		<description>
			<para>Returns the plain text string.</para>
		</description>
		<see-also>
			<ref type="function">BASE64_ENCODE</ref>
			<ref type="function">AES_DECRYPT</ref>
			<ref type="function">AES_ENCRYPT</ref>
		</see-also>
	</function>
<module language="en_US" name="func_blacklist">
	<support_level>core</support_level>
</module>
	<function name="BLACKLIST" language="en_US" module="func_blacklist">
		<since>
			<version>1.6.0</version>
		</since>
		<synopsis>
			Check if the callerid is on the blacklist.
		</synopsis>
		<syntax />
		<description>
			<para>Uses astdb to check if the Caller*ID is in family <literal>blacklist</literal>.
			Returns <literal>1</literal> or <literal>0</literal>.</para>
		</description>
		<see-also>
			<ref type="function">DB</ref>
		</see-also>
	</function>

<module language="en_US" name="func_callcompletion">
	<support_level>core</support_level>
</module>
	<function name="CALLCOMPLETION" language="en_US" module="func_callcompletion">
		<since>
			<version>1.8.0</version>
		</since>
		<synopsis>
			Get or set a call completion configuration parameter for a channel.
		</synopsis>
		<syntax>
			<parameter name="option" required="true">
				<para>The allowable options are:</para>
				<enumlist>
					<enum name="cc_agent_policy" />
					<enum name="cc_monitor_policy" />
					<enum name="cc_offer_timer" />
					<enum name="ccnr_available_timer" />
					<enum name="ccbs_available_timer" />
					<enum name="cc_recall_timer" />
					<enum name="cc_max_agents" />
					<enum name="cc_max_monitors" />
					<enum name="cc_agent_dialstring" />
				</enumlist>
			</parameter>
		</syntax>
		<description>
			<para>The CALLCOMPLETION function can be used to get or set a call
			completion configuration parameter for a channel. Note that setting
			a configuration parameter will only change the parameter for the
			duration of the call.

			For more information see <filename>doc/AST.pdf</filename>.
			For more information on call completion parameters, see <filename>configs/ccss.conf.sample</filename>.</para>
		</description>
	</function>
<module language="en_US" name="func_callerid">
	<support_level>core</support_level>
</module>
	<function name="CALLERID" language="en_US" module="func_callerid">
		<since>
			<version>1.2.0</version>
		</since>
		<synopsis>
			Gets or sets Caller*ID data on the channel.
		</synopsis>
		<syntax>
			<parameter name="datatype" required="true">
				<para>The allowable datatypes are:</para>
				<enumlist>
					<enum name = "all" />
					<enum name = "name" />
					<enum name = "name-valid" />
					<enum name = "name-charset" />
					<enum name = "name-pres" />
					<enum name = "num" />
					<enum name = "num-valid" />
					<enum name = "num-plan" />
					<enum name = "num-pres" />
					<enum name = "pres" />
					<enum name = "subaddr" />
					<enum name = "subaddr-valid" />
					<enum name = "subaddr-type" />
					<enum name = "subaddr-odd" />
					<enum name = "tag" />
					<enum name = "priv-all" />
					<enum name = "priv-name" />
					<enum name = "priv-name-valid" />
					<enum name = "priv-name-charset" />
					<enum name = "priv-name-pres" />
					<enum name = "priv-num" />
					<enum name = "priv-num-valid" />
					<enum name = "priv-num-plan" />
					<enum name = "priv-num-pres" />
					<enum name = "priv-subaddr" />
					<enum name = "priv-subaddr-valid" />
					<enum name = "priv-subaddr-type" />
					<enum name = "priv-subaddr-odd" />
					<enum name = "priv-tag" />
					<enum name = "ANI-all" />
					<enum name = "ANI-name" />
					<enum name = "ANI-name-valid" />
					<enum name = "ANI-name-charset" />
					<enum name = "ANI-name-pres" />
					<enum name = "ANI-num" />
					<enum name = "ANI-num-valid" />
					<enum name = "ANI-num-plan" />
					<enum name = "ANI-num-pres" />
					<enum name = "ANI-tag" />
					<enum name = "RDNIS" />
					<enum name = "DNID" />
					<enum name = "dnid-num-plan" />
					<enum name = "dnid-subaddr" />
					<enum name = "dnid-subaddr-valid" />
					<enum name = "dnid-subaddr-type" />
					<enum name = "dnid-subaddr-odd" />
				</enumlist>
				<para>Note that unlike other Caller ID fields, DNID information is not propagated
				by the <literal>Dial</literal> application, with the exception of
				Transmit Network Select (which is not currently used for anything).</para>
			</parameter>
			<parameter name="CID">
				<para>Optional Caller*ID to parse instead of using the Caller*ID from the
				channel. This parameter is only optional when reading the Caller*ID.</para>
			</parameter>
		</syntax>
		<description>
			<para>Gets or sets Caller*ID data on the channel. Uses channel callerid by
			default or optional callerid, if specified.</para>
			<para>The <replaceable>pres</replaceable> field gets/sets a combined value
			for <replaceable>name-pres</replaceable> and
			<replaceable>num-pres</replaceable>.</para>
			<para>The allowable values for the <replaceable>name-charset</replaceable>
			field are the following:</para>
			<enumlist>
				<enum name = "unknown"><para>Unknown</para></enum>
				<enum name = "iso8859-1"><para>ISO8859-1</para></enum>
				<enum name = "withdrawn"><para>Withdrawn</para></enum>
				<enum name = "iso8859-2"><para>ISO8859-2</para></enum>
				<enum name = "iso8859-3"><para>ISO8859-3</para></enum>
				<enum name = "iso8859-4"><para>ISO8859-4</para></enum>
				<enum name = "iso8859-5"><para>ISO8859-5</para></enum>
				<enum name = "iso8859-7"><para>ISO8859-7</para></enum>
				<enum name = "bmp"><para>ISO10646 Bmp String</para></enum>
				<enum name = "utf8"><para>ISO10646 UTF-8 String</para></enum>
			</enumlist>
			<para>The allowable values for the <replaceable>num-pres</replaceable>,
			<replaceable>name-pres</replaceable>, and <replaceable>pres</replaceable>
			fields are the following:</para>
			<enumlist>
				<enum name="allowed_not_screened">
					<para>Presentation Allowed, Not Screened.</para>
				</enum>
				<enum name="allowed_passed_screen">
					<para>Presentation Allowed, Passed Screen.</para>
				</enum>
				<enum name="allowed_failed_screen">
					<para>Presentation Allowed, Failed Screen.</para>
				</enum>
				<enum name="allowed">
					<para>Presentation Allowed, Network Number.</para>
				</enum>
				<enum name="prohib_not_screened">
					<para>Presentation Prohibited, Not Screened.</para>
				</enum>
				<enum name="prohib_passed_screen">
					<para>Presentation Prohibited, Passed Screen.</para>
				</enum>
				<enum name="prohib_failed_screen">
					<para>Presentation Prohibited, Failed Screen.</para>
				</enum>
				<enum name="prohib">
					<para>Presentation Prohibited, Network Number.</para>
				</enum>
				<enum name="unavailable">
					<para>Number Unavailable.</para>
				</enum>
			</enumlist>
			<variablelist>
				<variable name="CALL_QUALIFIER">
					<para>This is a special Caller ID-related variable
					that can be used to enable sending the Call Qualifier
					parameter in MDMF (Multiple Data Message Format)
					Caller ID spills.</para>
					<para>This variable is not automatically set by Asterisk.
					You are responsible for setting it if/when needed.</para>
					<para>Supporting Caller ID units will display the LDC
					(Long Distance Call) indicator when they receive this parameter.</para>
					<para>For incoming calls on FXO ports, if the Call Qualifier parameter is received,
					this variable will also be set to 1.</para>
					<para>This option must be used with a channel driver
					that allows Asterisk to generate the Caller ID spill,
					which currently only includes <literal>chan_dahdi</literal>.</para>
				</variable>
			</variablelist>
		</description>
	</function>
	<function name="CONNECTEDLINE" language="en_US" module="func_callerid">
		<since>
			<version>1.8.0</version>
		</since>
		<synopsis>
			Gets or sets Connected Line data on the channel.
		</synopsis>
		<syntax>
			<parameter name="datatype" required="true">
				<para>The allowable datatypes are:</para>
				<enumlist>
					<enum name = "all" />
					<enum name = "name" />
					<enum name = "name-valid" />
					<enum name = "name-charset" />
					<enum name = "name-pres" />
					<enum name = "num" />
					<enum name = "num-valid" />
					<enum name = "num-plan" />
					<enum name = "num-pres" />
					<enum name = "pres" />
					<enum name = "subaddr" />
					<enum name = "subaddr-valid" />
					<enum name = "subaddr-type" />
					<enum name = "subaddr-odd" />
					<enum name = "tag" />
					<enum name = "priv-all" />
					<enum name = "priv-name" />
					<enum name = "priv-name-valid" />
					<enum name = "priv-name-charset" />
					<enum name = "priv-name-pres" />
					<enum name = "priv-num" />
					<enum name = "priv-num-valid" />
					<enum name = "priv-num-plan" />
					<enum name = "priv-num-pres" />
					<enum name = "priv-subaddr" />
					<enum name = "priv-subaddr-valid" />
					<enum name = "priv-subaddr-type" />
					<enum name = "priv-subaddr-odd" />
					<enum name = "priv-tag" />
				</enumlist>
			</parameter>
			<parameter name="i">
				<para>If set, this will prevent the channel from sending out protocol
				messages because of the value being set</para>
			</parameter>
		</syntax>
		<description>
			<para>Gets or sets Connected Line data on the channel.</para>
			<para>The <replaceable>pres</replaceable> field gets/sets a combined value
			for <replaceable>name-pres</replaceable> and
			<replaceable>num-pres</replaceable>.</para>
			<para>The allowable values for the <replaceable>name-charset</replaceable>
			field are the following:</para>
			<enumlist>
				<enum name = "unknown"><para>Unknown</para></enum>
				<enum name = "iso8859-1"><para>ISO8859-1</para></enum>
				<enum name = "withdrawn"><para>Withdrawn</para></enum>
				<enum name = "iso8859-2"><para>ISO8859-2</para></enum>
				<enum name = "iso8859-3"><para>ISO8859-3</para></enum>
				<enum name = "iso8859-4"><para>ISO8859-4</para></enum>
				<enum name = "iso8859-5"><para>ISO8859-5</para></enum>
				<enum name = "iso8859-7"><para>ISO8859-7</para></enum>
				<enum name = "bmp"><para>ISO10646 Bmp String</para></enum>
				<enum name = "utf8"><para>ISO10646 UTF-8 String</para></enum>
			</enumlist>
			<para>The allowable values for the <replaceable>num-pres</replaceable>,
			<replaceable>name-pres</replaceable>, and <replaceable>pres</replaceable>
			fields are the following:</para>
			<enumlist>
				<enum name="allowed_not_screened">
					<para>Presentation Allowed, Not Screened.</para>
				</enum>
				<enum name="allowed_passed_screen">
					<para>Presentation Allowed, Passed Screen.</para>
				</enum>
				<enum name="allowed_failed_screen">
					<para>Presentation Allowed, Failed Screen.</para>
				</enum>
				<enum name="allowed">
					<para>Presentation Allowed, Network Number.</para>
				</enum>
				<enum name="prohib_not_screened">
					<para>Presentation Prohibited, Not Screened.</para>
				</enum>
				<enum name="prohib_passed_screen">
					<para>Presentation Prohibited, Passed Screen.</para>
				</enum>
				<enum name="prohib_failed_screen">
					<para>Presentation Prohibited, Failed Screen.</para>
				</enum>
				<enum name="prohib">
					<para>Presentation Prohibited, Network Number.</para>
				</enum>
				<enum name="unavailable">
					<para>Number Unavailable.</para>
				</enum>
			</enumlist>
		</description>
	</function>
	<function name="REDIRECTING" language="en_US" module="func_callerid">
		<since>
			<version>1.8.0</version>
		</since>
		<synopsis>
			Gets or sets Redirecting data on the channel.
		</synopsis>
		<syntax>
			<parameter name="datatype" required="true">
				<para>The allowable datatypes are:</para>
				<enumlist>
					<enum name = "orig-all" />
					<enum name = "orig-name" />
					<enum name = "orig-name-valid" />
					<enum name = "orig-name-charset" />
					<enum name = "orig-name-pres" />
					<enum name = "orig-num" />
					<enum name = "orig-num-valid" />
					<enum name = "orig-num-plan" />
					<enum name = "orig-num-pres" />
					<enum name = "orig-pres" />
					<enum name = "orig-subaddr" />
					<enum name = "orig-subaddr-valid" />
					<enum name = "orig-subaddr-type" />
					<enum name = "orig-subaddr-odd" />
					<enum name = "orig-tag" />
					<enum name = "orig-reason" />
					<enum name = "from-all" />
					<enum name = "from-name" />
					<enum name = "from-name-valid" />
					<enum name = "from-name-charset" />
					<enum name = "from-name-pres" />
					<enum name = "from-num" />
					<enum name = "from-num-valid" />
					<enum name = "from-num-plan" />
					<enum name = "from-num-pres" />
					<enum name = "from-pres" />
					<enum name = "from-subaddr" />
					<enum name = "from-subaddr-valid" />
					<enum name = "from-subaddr-type" />
					<enum name = "from-subaddr-odd" />
					<enum name = "from-tag" />
					<enum name = "to-all" />
					<enum name = "to-name" />
					<enum name = "to-name-valid" />
					<enum name = "to-name-charset" />
					<enum name = "to-name-pres" />
					<enum name = "to-num" />
					<enum name = "to-num-valid" />
					<enum name = "to-num-plan" />
					<enum name = "to-num-pres" />
					<enum name = "to-pres" />
					<enum name = "to-subaddr" />
					<enum name = "to-subaddr-valid" />
					<enum name = "to-subaddr-type" />
					<enum name = "to-subaddr-odd" />
					<enum name = "to-tag" />
					<enum name = "priv-orig-all" />
					<enum name = "priv-orig-name" />
					<enum name = "priv-orig-name-valid" />
					<enum name = "priv-orig-name-charset" />
					<enum name = "priv-orig-name-pres" />
					<enum name = "priv-orig-num" />
					<enum name = "priv-orig-num-valid" />
					<enum name = "priv-orig-num-plan" />
					<enum name = "priv-orig-num-pres" />
					<enum name = "priv-orig-subaddr" />
					<enum name = "priv-orig-subaddr-valid" />
					<enum name = "priv-orig-subaddr-type" />
					<enum name = "priv-orig-subaddr-odd" />
					<enum name = "priv-orig-tag" />
					<enum name = "priv-from-all" />
					<enum name = "priv-from-name" />
					<enum name = "priv-from-name-valid" />
					<enum name = "priv-from-name-charset" />
					<enum name = "priv-from-name-pres" />
					<enum name = "priv-from-num" />
					<enum name = "priv-from-num-valid" />
					<enum name = "priv-from-num-plan" />
					<enum name = "priv-from-num-pres" />
					<enum name = "priv-from-subaddr" />
					<enum name = "priv-from-subaddr-valid" />
					<enum name = "priv-from-subaddr-type" />
					<enum name = "priv-from-subaddr-odd" />
					<enum name = "priv-from-tag" />
					<enum name = "priv-to-all" />
					<enum name = "priv-to-name" />
					<enum name = "priv-to-name-valid" />
					<enum name = "priv-to-name-charset" />
					<enum name = "priv-to-name-pres" />
					<enum name = "priv-to-num" />
					<enum name = "priv-to-num-valid" />
					<enum name = "priv-to-num-plan" />
					<enum name = "priv-to-num-pres" />
					<enum name = "priv-to-subaddr" />
					<enum name = "priv-to-subaddr-valid" />
					<enum name = "priv-to-subaddr-type" />
					<enum name = "priv-to-subaddr-odd" />
					<enum name = "priv-to-tag" />
					<enum name = "reason" />
					<enum name = "count" />
				</enumlist>
			</parameter>
			<parameter name="i">
				<para>If set, this will prevent the channel from sending out protocol
				messages because of the value being set</para>
			</parameter>
		</syntax>
		<description>
			<para>Gets or sets Redirecting data on the channel.</para>
			<para>The <replaceable>orig-pres</replaceable>,
			<replaceable>from-pres</replaceable> and <replaceable>to-pres</replaceable>
			fields get/set a combined value for the corresponding
			<replaceable>...-name-pres</replaceable> and <replaceable>...-num-pres</replaceable>
			fields.</para>
			<para>The recognized values for the <replaceable>reason</replaceable>
			and <replaceable>orig-reason</replaceable> fields are the following:</para>
			<enumlist>
				<enum name = "away"><para>Callee is Away</para></enum>
				<enum name = "cf_dte"><para>Call Forwarding By The Called DTE</para></enum>
				<enum name = "cfb"><para>Call Forwarding Busy</para></enum>
				<enum name = "cfnr"><para>Call Forwarding No Reply</para></enum>
				<enum name = "cfu"><para>Call Forwarding Unconditional</para></enum>
				<enum name = "deflection"><para>Call Deflection</para></enum>
				<enum name = "dnd"><para>Do Not Disturb</para></enum>
				<enum name = "follow_me"><para>Follow Me</para></enum>
				<enum name = "out_of_order"><para>Called DTE Out-Of-Order</para></enum>
				<enum name = "send_to_vm"><para>Send the call to voicemail</para></enum>
				<enum name = "time_of_day"><para>Time of Day</para></enum>
				<enum name = "unavailable"><para>Callee is Unavailable</para></enum>
				<enum name = "unknown"><para>Unknown</para></enum>
			</enumlist>
			<note><para>You can set a user defined reason string that SIP can
			send/receive instead.  The user defined reason string my need to be
			quoted depending upon SIP or the peer's requirements.  These strings
			are treated as unknown by the non-SIP channel drivers.</para></note>
			<para>The allowable values for the <replaceable>xxx-name-charset</replaceable>
			field are the following:</para>
			<enumlist>
				<enum name = "unknown"><para>Unknown</para></enum>
				<enum name = "iso8859-1"><para>ISO8859-1</para></enum>
				<enum name = "withdrawn"><para>Withdrawn</para></enum>
				<enum name = "iso8859-2"><para>ISO8859-2</para></enum>
				<enum name = "iso8859-3"><para>ISO8859-3</para></enum>
				<enum name = "iso8859-4"><para>ISO8859-4</para></enum>
				<enum name = "iso8859-5"><para>ISO8859-5</para></enum>
				<enum name = "iso8859-7"><para>ISO8859-7</para></enum>
				<enum name = "bmp"><para>ISO10646 Bmp String</para></enum>
				<enum name = "utf8"><para>ISO10646 UTF-8 String</para></enum>
			</enumlist>
		</description>
	</function>
<module language="en_US" name="func_cdr">
	<support_level>core</support_level>
</module>
	<function name="CDR" language="en_US" module="func_cdr">
		<since>
			<version>1.2.0</version>
		</since>
		<synopsis>
			Gets or sets a CDR variable.
		</synopsis>
		<syntax>
			<parameter name="name" required="true">
				<para>CDR field name:</para>
				<enumlist>
					<enum name="clid">
						<para>Caller ID.</para>
					</enum>
					<enum name="lastdata">
						<para>Last application arguments.</para>
					</enum>
					<enum name="disposition">
						<para>The final state of the CDR.</para>
						<enumlist>
							<enum name="0">
								<para><literal>NO ANSWER</literal></para>
							</enum>
							<enum name="1">
								<para><literal>NO ANSWER</literal> (NULL record)</para>
							</enum>
							<enum name="2">
								<para><literal>FAILED</literal></para>
							</enum>
							<enum name="4">
								<para><literal>BUSY</literal></para>
							</enum>
							<enum name="8">
								<para><literal>ANSWERED</literal></para>
							</enum>
							<enum name="16">
								<para><literal>CONGESTION</literal></para>
							</enum>
						</enumlist>
					</enum>
					<enum name="src">
						<para>Source.</para>
					</enum>
					<enum name="start">
						<para>Time the call started.</para>
					</enum>
					<enum name="amaflags">
						<para>R/W the Automatic Message Accounting (AMA) flags on the channel.
						When read from a channel, the integer value will always be returned.
						When written to a channel, both the string format or integer value
						is accepted.</para>
						<enumlist>
							<enum name="1"><para><literal>OMIT</literal></para></enum>
							<enum name="2"><para><literal>BILLING</literal></para></enum>
							<enum name="3"><para><literal>DOCUMENTATION</literal></para></enum>
						</enumlist>
						<warning><para>Accessing this setting is deprecated in CDR. Please use the CHANNEL function instead.</para></warning>
					</enum>
					<enum name="dst">
						<para>Destination.</para>
					</enum>
					<enum name="answer">
						<para>Time the call was answered.</para>
					</enum>
					<enum name="accountcode">
						<para>The channel's account code.</para>
						<warning><para>Accessing this setting is deprecated in CDR. Please use the CHANNEL function instead.</para></warning>
					</enum>
					<enum name="dcontext">
						<para>Destination context.</para>
					</enum>
					<enum name="end">
						<para>Time the call ended.</para>
					</enum>
					<enum name="uniqueid">
						<para>The channel's unique id.</para>
					</enum>
					<enum name="dstchannel">
						<para>Destination channel.</para>
					</enum>
					<enum name="duration">
						<para>Duration of the call.</para>
					</enum>
					<enum name="userfield">
						<para>The channel's user specified field.</para>
					</enum>
					<enum name="lastapp">
						<para>Last application.</para>
					</enum>
					<enum name="billsec">
						<para>Duration of the call once it was answered.</para>
					</enum>
					<enum name="channel">
						<para>Channel name.</para>
					</enum>
					<enum name="sequence">
						<para>CDR sequence number.</para>
					</enum>
				</enumlist>
			</parameter>
			<parameter name="options" required="false">
				<optionlist>
					<option name="f">
						<para>Returns billsec or duration fields as floating point values.</para>
					</option>
					<option name="u">
						<para>Retrieves the raw, unprocessed value.</para>
						<para>For example, 'start', 'answer', and 'end' will be retrieved as epoch
						values, when the <literal>u</literal> option is passed, but formatted as YYYY-MM-DD HH:MM:SS
						otherwise.  Similarly, disposition and amaflags will return their raw
						integral values.</para>
					</option>
				</optionlist>
			</parameter>
		</syntax>
		<description>
			<para>All of the CDR field names are read-only, except for <literal>accountcode</literal>,
			<literal>userfield</literal>, and <literal>amaflags</literal>. You may, however, supply
			a name not on the above list, and create your own variable, whose value can be changed
			with this function, and this variable will be stored on the CDR.</para>
			<note><para>CDRs can only be modified before the bridge between two channels is
			torn down. For example, CDRs may not be modified after the <literal>Dial</literal>
			application has returned.</para></note>
			<example title="Set the userfield">
			 exten => 1,1,Set(CDR(userfield)=test)
			</example>
		</description>
	</function>
	<function name="CDR_PROP" language="en_US" module="func_cdr">
		<since>
			<version>12.0.0</version>
		</since>
		<synopsis>
			Set a property on a channel's CDR.
		</synopsis>
		<syntax>
			<parameter name="name" required="true">
				<para>The property to set on the CDR.</para>
				<enumlist>
					<enum name="party_a">
						<para>Set this channel as the preferred Party A when
						channels are associated together.</para>
						<para>Write-Only</para>
					</enum>
					<enum name="disable">
						<para>Setting to 1 will disable CDRs for this channel.
						Setting to 0 will enable CDRs for this channel.</para>
						<para>Write-Only</para>
					</enum>
				</enumlist>
			</parameter>
		</syntax>
		<description>
			<para>This function sets a property on a channel's CDR. Properties
			alter the behavior of how the CDR operates for that channel.</para>
		</description>
	</function>
<module language="en_US" name="func_channel">
	<support_level>core</support_level>
</module>
	<function name="CHANNELS" language="en_US" module="func_channel">
		<since>
			<version>1.6.1.0</version>
		</since>
		<synopsis>
			Gets the list of channels, optionally filtering by a regular expression.
		</synopsis>
		<syntax>
			<parameter name="regular_expression" />
		</syntax>
		<description>
			<para>Gets the list of channels, optionally filtering by a <replaceable>regular_expression</replaceable>. If
			no argument is provided, all known channels are returned. The
			<replaceable>regular_expression</replaceable> must correspond to
			the POSIX.2 specification, as shown in <emphasis>regex(7)</emphasis>. The list returned
			will be space-delimited.</para>
		</description>
	</function>
	<function name="CHANNEL_EXISTS" language="en_US" module="func_channel">
		<since>
			<version>16.22.0</version>
			<version>18.8.0</version>
		</since>
		<synopsis>
			Checks if the specified channel exists.
		</synopsis>
		<syntax>
			<parameter name="name_or_uid" required="true">
				<para>The name or unique ID of the channel to check.</para>
			</parameter>
		</syntax>
		<description>
			<para>Returns 1 if the channel <replaceable>name_or_uid</replaceable> exists, 0 if not.</para>
		</description>
	</function>
	<function name="MASTER_CHANNEL" language="en_US" module="func_channel">
		<since>
			<version>1.8.0</version>
		</since>
		<synopsis>
			Gets or sets variables on the master channel
		</synopsis>
		<description>
			<para>Allows access to the oldest channel associated with the current
			channel if it still exists.  If the channel is the master channel or
			the master channel no longer exists then access local channel variables
			instead.  In other words, the master channel is the channel identified by
			the channel's linkedid.</para>
		</description>
	</function>
	<function name="CHANNEL" language="en_US" module="func_channel">
		<since>
			<version>1.2.0</version>
		</since>
		<synopsis>
			Gets/sets various pieces of information about the channel.
		</synopsis>
		<syntax>
			<parameter name="item" required="true">
				<para>Standard items (provided by all channel technologies) are:</para>
				<enumlist>
					<enum name="amaflags">
						<para>R/W the Automatic Message Accounting (AMA) flags on the channel.
						When read from a channel, the integer value will always be returned.
						When written to a channel, both the string format or integer value
						is accepted.</para>
						<enumlist>
							<enum name="1"><para><literal>OMIT</literal></para></enum>
							<enum name="2"><para><literal>BILLING</literal></para></enum>
							<enum name="3"><para><literal>DOCUMENTATION</literal></para></enum>
						</enumlist>
					</enum>
					<enum name="accountcode">
						<para>R/W the channel's account code.</para>
					</enum>
					<enum name="adsicpe">
						<para>R/W The channel's support for ADSI (Analog Display Services Interface) CPE.</para>
						<enumlist>
							<enum name="available" />
							<enum name="offhookonly" />
							<enum name="unavailable" />
							<enum name="unknown" />
						</enumlist>
					</enum>
					<enum name="audioreadformat">
						<para>R/O format currently being read.</para>
					</enum>
					<enum name="audionativeformat">
						<para>R/O format used natively for audio.</para>
					</enum>
					<enum name="audiowriteformat">
						<para>R/O format currently being written.</para>
					</enum>
					<enum name="dtmf_features">
						<para>R/W The channel's DTMF bridge features.
						May include one or more of 'T' 'K' 'H' 'W' and 'X' in a similar manner to options
						in the <literal>Dial</literal> application. When setting it, the features string
						must be all upper case.</para>
					</enum>
					<enum name="callgroup">
						<para>R/W numeric call pickup groups that this channel is a member.</para>
					</enum>
					<enum name="pickupgroup">
						<para>R/W numeric call pickup groups this channel can pickup.</para>
					</enum>
					<enum name="namedcallgroup">
						<para>R/W named call pickup groups that this channel is a member.</para>
					</enum>
					<enum name="namedpickupgroup">
						<para>R/W named call pickup groups this channel can pickup.</para>
					</enum>
					<enum name="channeltype">
						<para>R/O technology used for channel.</para>
					</enum>
					<enum name="checkhangup">
						<para>R/O Whether the channel is hanging up (1/0)</para>
					</enum>
					<enum name="digitdetect">
						<para>R/W Enable or disable DTMF detection on channel drivers that support it.</para>
						<para>If set on a DAHDI channel, this will only disable DTMF detection, not pulse dialing detection.
						To disable pulse dialing, use the <literal>dialmode</literal> option.</para>
						<para>On DAHDI channels, this will disable DSP if it is not needed for anything else.
						This will prevent DTMF detection regardless of the <literal>dialmode</literal> setting.</para>
					</enum>
					<enum name="faxdetect">
						<para>R/W Enable or disable fax detection on channel drivers that support it.</para>
					</enum>
					<enum name="after_bridge_goto">
						<para>R/W the parseable goto string indicating where the channel is
						expected to return to in the PBX after exiting the next bridge it joins
						on the condition that it doesn't hang up. The parseable goto string uses
						the same syntax as the <literal>Goto</literal> application.</para>
					</enum>
					<enum name="hangup_handler_pop">
						<para>W/O Replace the most recently added hangup handler
						with a new hangup handler on the channel if supplied.  The
						assigned string is passed to the Gosub application when
						the channel is hung up.  Any optionally omitted context
						and exten are supplied by the channel pushing the handler
						before it is pushed.</para>
					</enum>
					<enum name="hangup_handler_push">
						<para>W/O Push a hangup handler onto the channel hangup
						handler stack.  The assigned string is passed to the
						Gosub application when the channel is hung up.  Any
						optionally omitted context and exten are supplied by the
						channel pushing the handler before it is pushed.</para>
					</enum>
					<enum name="hangup_handler_wipe">
						<para>W/O Wipe the entire hangup handler stack and replace
						with a new hangup handler on the channel if supplied.  The
						assigned string is passed to the Gosub application when
						the channel is hung up.  Any optionally omitted context
						and exten are supplied by the channel pushing the handler
						before it is pushed.</para>
					</enum>
					<enum name="onhold">
						<para>R/O Whether or not the channel is onhold. (1/0)</para>
					</enum>
					<enum name="language">
						<para>R/W language for sounds played.</para>
					</enum>
					<enum name="musicclass">
						<para>R/W class (from musiconhold.conf) for hold music.</para>
					</enum>
					<enum name="name">
						<para>The name of the channel</para>
					</enum>
					<enum name="parkinglot">
						<para>R/W parkinglot for parking.</para>
					</enum>
					<enum name="relaxdtmf">
						<para>W/O Enable or disable relaxed DTMF detection for channel drivers that support it,
						overriding any setting previously defaulted by the channel driver.</para>
					</enum>
					<enum name="rxgain">
						<para>R/W set rxgain level on channel drivers that support it.</para>
					</enum>
					<enum name="secure_bridge_signaling">
						<para>Whether or not channels bridged to this channel require secure signaling (1/0)</para>
					</enum>
					<enum name="secure_bridge_media">
						<para>Whether or not channels bridged to this channel require secure media (1/0)</para>
					</enum>
					<enum name="state">
						<para>R/O state of the channel</para>
					</enum>
					<enum name="tdd">
						<para>R/W Enable or disable TDD mode on channel drivers that support it.</para>
						<para>When reading this option, 1 indicates TDD mode enabled, 0 indicates TDD mode disabled,
						and <literal>mate</literal> indicates TDD mate mode.</para>
					</enum>
					<enum name="tonezone">
						<para>R/W zone for indications played</para>
					</enum>
					<enum name="transfercapability">
						<para>R/W ISDN Transfer Capability, one of:</para>
						<enumlist>
							<enum name="SPEECH" />
							<enum name="DIGITAL" />
							<enum name="RESTRICTED_DIGITAL" />
							<enum name="3K1AUDIO" />
							<enum name="DIGITAL_W_TONES" />
							<enum name="VIDEO" />
						</enumlist>
					</enum>
					<enum name="txgain">
						<para>R/W set txgain level on channel drivers that support it.</para>
					</enum>
					<enum name="videonativeformat">
						<para>R/O format used natively for video</para>
					</enum>
					<enum name="hangupsource">
						<para>R/W returns the channel responsible for hangup.</para>
					</enum>
					<enum name="appname">
						<para>R/O returns the internal application name.</para>
					</enum>
					<enum name="appdata">
						<para>R/O returns the application data if available.</para>
					</enum>
					<enum name="exten">
						<para>R/O returns the extension for an outbound channel.</para>
					</enum>
					<enum name="context">
						<para>R/O returns the context for an outbound channel.</para>
					</enum>
					<enum name="lastexten">
						<para>R/O returns the last unique extension for an outbound channel.</para>
					</enum>
					<enum name="lastcontext">
						<para>R/O returns the last unique context for an outbound channel.</para>
					</enum>
					<enum name="channame">
						<para>R/O returns the channel name for an outbound channel.</para>
					</enum>
					<enum name="uniqueid">
						<para>R/O returns the channel uniqueid.</para>
					</enum>
					<enum name="linkedid">
						<para>R/O returns the linkedid if available, otherwise returns the uniqueid.</para>
					</enum>
					<enum name="tenantid">
						<para>R/W The channel tenantid.</para>
					</enum>
					<enum name="max_forwards">
						<para>R/W The maximum number of forwards allowed.</para>
					</enum>
					<enum name="callid">
						<para>R/O Call identifier log tag associated with the channel
						e.g., <literal>[C-00000000]</literal>.</para>
					</enum>
				</enumlist>
				<xi:include xpointer="xpointer(/docs/info[@name='CHANNEL'])" />
			</parameter>
		</syntax>
		<description>
			<para>Gets/sets various pieces of information about the channel, additional <replaceable>item</replaceable> may
			be available from the channel driver; see its documentation for details. Any <replaceable>item</replaceable>
			requested that is not available on the current channel will return an empty string.</para>
			<example title="Standard CHANNEL item examples">
				; Push a hangup handler subroutine existing at dialplan
				; location default,s,1 onto the current channel
				same => n,Set(CHANNEL(hangup_handler_push)=default,s,1)

				; Set the current tonezone to Germany (de)
				same => n,Set(CHANNEL(tonezone)=de)

				; Set the allowed maximum number of forwarding attempts
				same => n,Set(CHANNEL(max_forwards)=10)

				; If this channel is ejected from its next bridge, and if
				; the channel is not hung up, begin executing dialplan at
				; location default,after-bridge,1
				same => n,Set(CHANNEL(after_bridge_goto)=default,after-bridge,1)

				; Log the current state of the channel
				same => n,Log(NOTICE, This channel is: ${CHANNEL(state)})
			</example>
			<xi:include xpointer="xpointer(/docs/info[@name='CHANNEL_EXAMPLES'])" />
			<para>The following channel variables are available as special built-in
			dialplan channel variables. These variables cannot be set or modified
			and are read-only.</para>
			<variablelist>
				<variable name="CALLINGPRES">
					<para>Caller ID presentation for incoming calls (PRI channels)</para>
				</variable>
				<variable name="CALLINGANI2">
					<para>Caller ANI2 (PRI channels)</para>
				</variable>
				<variable name="CALLINGTON">
					<para>Caller Type of Number (PRI channels)</para>
				</variable>
				<variable name="CALLINGTNS">
					<para>Transit Network Selector (PRI channels)</para>
				</variable>
				<variable name="EXTEN">
					<para>Current extension</para>
				</variable>
				<variable name="CONTEXT">
					<para>Current context</para>
				</variable>
				<variable name="PRIORITY">
					<para>Current priority</para>
				</variable>
				<variable name="CHANNEL">
					<para>Current channel name</para>
				</variable>
				<variable name="UNIQUEID">
					<para>Current call unique identifier</para>
				</variable>
				<variable name="HANGUPCAUSE">
					<para>Asterisk cause of hangup (inbound/outbound)</para>
				</variable>
			</variablelist>
		</description>
	</function>
<module language="en_US" name="func_config">
	<support_level>core</support_level>
</module>
	<function name="AST_CONFIG" language="en_US" module="func_config">
		<since>
			<version>1.6.1.0</version>
		</since>
		<synopsis>
			Retrieve a variable from a configuration file.
		</synopsis>
		<syntax>
			<parameter name="config_file" required="true" />
			<parameter name="category" required="true" />
			<parameter name="variable_name" required="true" />
			<parameter name="index" required="false">
				<para>If there are multiple variables with the same name, you can specify
				<literal>0</literal> for the first item (default), <literal>-1</literal> for the last
				item, or any other number for that specific item.  <literal>-1</literal> is useful
				when the variable is derived from a template and you want the effective value (the last
				occurrence), not the value from the template (the first occurrence).</para>
			</parameter>
		</syntax>
		<description>
			<para>This function reads a variable from an Asterisk configuration file.</para>
		</description>
	</function>

<module language="en_US" name="func_curl">
	<depend>res_curl</depend>
	<depend>curl</depend>
	<support_level>core</support_level>
</module>
	<function name="CURL" language="en_US" module="func_curl">
		<since>
			<version>10.0.0</version>
		</since>
		<synopsis>
			Retrieve content from a remote web or ftp server
		</synopsis>
		<syntax>
			<parameter name="url" required="true">
				<para>The full URL for the resource to retrieve.</para>
			</parameter>
			<parameter name="post-data">
				<para><emphasis>Read Only</emphasis></para>
				<para>If specified, an <literal>HTTP POST</literal> will be
				performed with the content of
				<replaceable>post-data</replaceable>, instead of an
				<literal>HTTP GET</literal> (default).</para>
			</parameter>
		</syntax>
		<description>
			<para>When this function is read, a <literal>HTTP GET</literal>
			(by default) will be used to retrieve the contents of the provided
			<replaceable>url</replaceable>. The contents are returned as the
			result of the function.</para>
			<example title="Displaying contents of a page" language="text">
			exten => s,1,Verbose(0, ${CURL(http://localhost:8088/static/astman.css)})
			</example>
			<para>When this function is written to, a <literal>HTTP GET</literal>
			will be used to retrieve the contents of the provided
			<replaceable>url</replaceable>. The value written to the function
			specifies the destination file of the cURL'd resource.</para>
			<example title="Retrieving a file" language="text">
			exten => s,1,Set(CURL(http://localhost:8088/static/astman.css)=/var/spool/asterisk/tmp/astman.css))
			</example>
			<note>
				<para>If <literal>live_dangerously</literal> in <literal>asterisk.conf</literal>
				is set to <literal>no</literal>, this function can only be written to from the
				dialplan, and not directly from external protocols. Read operations are
				unaffected.</para>
			</note>
		</description>
		<see-also>
			<ref type="function">CURLOPT</ref>
		</see-also>
	</function>
	<function name="CURLOPT" language="en_US" module="func_curl">
		<since>
			<version>10.0.0</version>
		</since>
		<synopsis>
			Sets various options for future invocations of CURL.
		</synopsis>
		<syntax>
			<parameter name="key" required="yes">
				<enumlist>
					<enum name="cookie">
						<para>A cookie to send with the request.  Multiple
						cookies are supported.</para>
					</enum>
					<enum name="conntimeout">
						<para>Number of seconds to wait for a connection to succeed</para>
					</enum>
					<enum name="dnstimeout">
						<para>Number of seconds to wait for DNS to be resolved</para>
					</enum>
					<enum name="followlocation">
						<para>Whether or not to follow HTTP 3xx redirects (boolean)</para>
					</enum>
					<enum name="ftptext">
						<para>For FTP URIs, force a text transfer (boolean)</para>
					</enum>
					<enum name="ftptimeout">
						<para>For FTP URIs, number of seconds to wait for a
						server response</para>
					</enum>
					<enum name="header">
						<para>Include header information in the result
						(boolean)</para>
					</enum>
					<enum name="httpauth">
						<para>Type of authentication method to use. The default is Basic Authentication.</para>
						<para>Multiple values can be specified to enable multiple authentication methods.
						To do so, invoke CURLOPT once using comma-separated values.</para>
						<enumlist>
							<enum name="basic" />
							<enum name="digest" />
						</enumlist>
					</enum>
					<enum name="httpheader">
						<para>Add HTTP header. Multiple calls add multiple headers.
						Setting of any header will remove the default
						"Content-Type application/x-www-form-urlencoded"</para>
					</enum>
					<enum name="httptimeout">
						<para>For HTTP(S) URIs, number of seconds to wait for a
						server response</para>
					</enum>
					<enum name="maxredirs">
						<para>Maximum number of redirects to follow. The default is -1,
						which allows for unlimited redirects. This only makes sense when
						followlocation is also set.</para>
					</enum>
					<enum name="proxy">
						<para>Hostname or IP address to use as a proxy server</para>
					</enum>
					<enum name="proxytype">
						<para>Type of <literal>proxy</literal></para>
						<enumlist>
							<enum name="http" />
							<enum name="socks4" />
							<enum name="socks5" />
						</enumlist>
					</enum>
					<enum name="proxyport">
						<para>Port number of the <literal>proxy</literal></para>
					</enum>
					<enum name="proxyuserpwd">
						<para>A <replaceable>username</replaceable><literal>:</literal><replaceable>password</replaceable>
						combination to use for authenticating requests through a
						<literal>proxy</literal></para>
					</enum>
					<enum name="referer">
						<para>Referer URL to use for the request</para>
					</enum>
					<enum name="useragent">
						<para>UserAgent string to use for the request</para>
					</enum>
					<enum name="userpwd">
						<para>A <replaceable>username</replaceable><literal>:</literal><replaceable>password</replaceable>
						to use for authentication when the server response to
						an initial request indicates a 401 status code.</para>
					</enum>
					<enum name="ssl_verifypeer">
						<para>Whether to verify the server certificate against
						a list of known root certificate authorities (boolean).</para>
					</enum>
					<enum name="ssl_verifyhost">
						<para>Whether to verify the host in the server's TLS certificate.
						Set to 2 to verify the host, 0 to ignore the host.</para>
					</enum>
					<enum name="ssl_cainfo">
						<para>Path to a file holding one or more certificates to verify
						the peer's certificate with. Only used when <literal>ssl_verifypeer</literal>
						is enabled.</para>
					</enum>
					<enum name="ssl_capath">
						<para>Path to a directory holding multiple CA certificates to
						verify the peer's certificate with. Only used when <literal>ssl_verifypeer</literal>
						is enabled.</para>
					</enum>
					<enum name="ssl_cert">
						<para>Path to a file containing a client certificate. Default format
						is PEM, and can be changed with <literal>ssl_certtype</literal>.</para>
					</enum>
					<enum name="ssl_certtype">
						<para>The format of the <literal>ssl_cert</literal> file.</para>
						<enumlist>
							<enum name="PEM" />
							<enum name="DER" />
						</enumlist>
					</enum>
					<enum name="ssl_key">
						<para>Path to a file containing a client private key. Default format
						is PEM, and can be changed with <literal>ssl_keytype</literal></para>
					</enum>
					<enum name="ssl_keytype">
						<para>The format of the <literal>ssl_key</literal> file.</para>
						<enumlist>
							<enum name="PEM" />
							<enum name="DER" />
							<enum name="ENG" />
						</enumlist>
					</enum>
					<enum name="ssl_keypasswd">
						<para>The passphrase to use the <literal>ssl_key</literal> file.</para>
					</enum>
					<enum name="hashcompat">
						<para>Assuming the responses will be in <literal>key1=value1&amp;key2=value2</literal>
						format, reformat the response such that it can be used
						by the <literal>HASH</literal> function.</para>
						<enumlist>
							<enum name="yes" />
							<enum name="no" />
							<enum name="legacy">
								<para>Also translate <literal>+</literal> to the
								space character, in violation of current RFC
								standards.</para>
							</enum>
						</enumlist>
					</enum>
					<enum name="failurecodes">
						<para>A comma separated list of HTTP response codes to be treated as errors</para>
					</enum>
				</enumlist>
			</parameter>
		</syntax>
		<description>
			<para>Options may be set globally or per channel.  Per-channel
			settings will override global settings. Only HTTP headers are added instead of overriding</para>
		</description>
		<see-also>
			<ref type="function">CURL</ref>
			<ref type="function">HASH</ref>
		</see-also>
	</function>
<module language="en_US" name="func_cut">
	<support_level>core</support_level>
</module>
	<function name="SORT" language="en_US" module="func_cut">
		<since>
			<version>1.2.0</version>
		</since>
		<synopsis>
			Sorts a list of key/vals into a list of keys, based upon the vals.
		</synopsis>
		<syntax>
			<parameter name="keyval" required="true" argsep=":">
				<argument name="key1" required="true" />
				<argument name="val1" required="true" />
			</parameter>
			<parameter name="keyvaln" multiple="true" argsep=":">
				<argument name="key2" required="true" />
				<argument name="val2" required="true" />
			</parameter>
		</syntax>
		<description>
			<para>Takes a comma-separated list of keys and values, each separated by a colon, and returns a
			comma-separated list of the keys, sorted by their values.  Values will be evaluated as
			floating-point numbers.</para>
		</description>
	</function>
	<function name="CUT" language="en_US" module="func_cut">
		<since>
			<version>1.2.0</version>
		</since>
		<synopsis>
			Slices and dices strings, based upon a named delimiter.
		</synopsis>
		<syntax>
			<parameter name="varname" required="true">
				<para>Variable you want cut</para>
			</parameter>
			<parameter name="char-delim" required="true">
				<para>Delimiter, defaults to <literal>-</literal></para>
			</parameter>
			<parameter name="range-spec" required="true">
				<para>Number of the field you want (1-based offset), may also be specified as a range (with <literal>-</literal>)
				or group of ranges and fields (with <literal>&amp;</literal>)</para>
			</parameter>
		</syntax>
		<description>
			<para>Cut out information from a string (<replaceable>varname</replaceable>), based upon a named delimiter.</para>
					<example title="The 'varname' parameter can only accept a variable name, not a variable expression">
				exten => s,1,Set(foo=${CUT(bar,,2)}); This is correct syntax
				exten => s,2,Set(foo=${CUT(${bar},,2)}); This is invalid syntax (unless bar contains the name of another variable)
 					</example>
		</description>
	</function>
<module language="en_US" name="func_db">
	<support_level>core</support_level>
</module>
	<function name="DB" language="en_US" module="func_db">
		<since>
			<version>1.2.0</version>
		</since>
		<synopsis>
			Read from or write to the Asterisk database.
		</synopsis>
		<syntax argsep="/">
			<parameter name="family" required="true" />
			<parameter name="key" required="true" />
		</syntax>
		<description>
			<para>This function will read from or write a value to the Asterisk database.  On a
			read, this function returns the corresponding value from the database, or blank
			if it does not exist.  Reading a database value will also set the variable
			DB_RESULT.  If you wish to find out if an entry exists, use the DB_EXISTS
			function.</para>
		</description>
		<see-also>
			<ref type="application">DBdel</ref>
			<ref type="function">DB_DELETE</ref>
			<ref type="application">DBdeltree</ref>
			<ref type="function">DB_EXISTS</ref>
		</see-also>
	</function>
	<function name="DB_EXISTS" language="en_US" module="func_db">
		<since>
			<version>1.2.0</version>
		</since>
		<synopsis>
			Check to see if a key exists in the Asterisk database.
		</synopsis>
		<syntax argsep="/">
			<parameter name="family" required="true" />
			<parameter name="key" required="true" />
		</syntax>
		<description>
			<para>This function will check to see if a key exists in the Asterisk
			database. If it exists, the function will return <literal>1</literal>. If not,
			it will return <literal>0</literal>.  Checking for existence of a database key will
			also set the variable DB_RESULT to the key's value if it exists.</para>
		</description>
		<see-also>
			<ref type="function">DB</ref>
		</see-also>
	</function>
	<function name="DB_KEYS" language="en_US" module="func_db">
		<since>
			<version>10.0.0</version>
		</since>
		<synopsis>
			Obtain a list of keys within the Asterisk database.
		</synopsis>
		<syntax>
			<parameter name="prefix" />
		</syntax>
		<description>
			<para>This function will return a comma-separated list of keys existing
			at the prefix specified within the Asterisk database.  If no argument is
			provided, then a list of key families will be returned.</para>
		</description>
		<see-also>
			<ref type="function">DB_KEYCOUNT</ref>
		</see-also>
	</function>
	<function name="DB_KEYCOUNT" language="en_US" module="func_db">
		<since>
			<version>16.26.0</version>
			<version>18.12.0</version>
			<version>19.4.0</version>
		</since>
		<synopsis>
			Obtain the number of keys at a prefix within the Asterisk database.
		</synopsis>
		<syntax>
			<parameter name="prefix" />
		</syntax>
		<description>
			<para>This function will return the number of keys that exist
			at the prefix specified within the Asterisk database.  If no argument is
			provided, then the number of all key families will be returned.</para>
		</description>
		<see-also>
			<ref type="function">DB_KEYS</ref>
		</see-also>
	</function>
	<function name="DB_DELETE" language="en_US" module="func_db">
		<since>
			<version>1.4.0</version>
		</since>
		<synopsis>
			Return a value from the database and delete it.
		</synopsis>
		<syntax argsep="/">
			<parameter name="family" required="true" />
			<parameter name="key" required="true" />
		</syntax>
		<description>
			<para>This function will retrieve a value from the Asterisk database
			and then remove that key from the database. <variable>DB_RESULT</variable>
			will be set to the key's value if it exists.</para>
			<note>
				<para>If <literal>live_dangerously</literal> in <literal>asterisk.conf</literal>
				is set to <literal>no</literal>, this function can only be read from the
				dialplan, and not directly from external protocols. It can, however, be
				executed as a write operation (<literal>DB_DELETE(family, key)=ignored</literal>)</para>
			</note>
		</description>
		<see-also>
			<ref type="application">DBdel</ref>
			<ref type="function">DB</ref>
			<ref type="application">DBdeltree</ref>
		</see-also>
	</function>
<module language="en_US" name="func_devstate">
	<support_level>core</support_level>
</module>
	<function name="DEVICE_STATE" language="en_US" module="func_devstate">
		<since>
			<version>1.6.0</version>
		</since>
		<synopsis>
			Get or Set a device state.
		</synopsis>
		<syntax>
			<parameter name="device" required="true" />
		</syntax>
		<description>
			<para>The DEVICE_STATE function can be used to retrieve the device state from any
			device state provider. For example:</para>
			<para>NoOp(SIP/mypeer has state ${DEVICE_STATE(SIP/mypeer)})</para>
			<para>NoOp(Conference number 1234 has state ${DEVICE_STATE(MeetMe:1234)})</para>
			<para>The DEVICE_STATE function can also be used to set custom device state from
			the dialplan.  The <literal>Custom:</literal> prefix must be used. For example:</para>
			<para>Set(DEVICE_STATE(Custom:lamp1)=BUSY)</para>
			<para>Set(DEVICE_STATE(Custom:lamp2)=NOT_INUSE)</para>
			<para>You can subscribe to the status of a custom device state using a hint in
			the dialplan:</para>
			<para>exten => 1234,hint,Custom:lamp1</para>
			<para>The possible values for both uses of this function are:</para>
			<para>UNKNOWN | NOT_INUSE | INUSE | BUSY | INVALID | UNAVAILABLE | RINGING |
			RINGINUSE | ONHOLD</para>
		</description>
	</function>
	<function name="HINT" language="en_US" module="func_devstate">
		<since>
			<version>1.6.0</version>
		</since>
		<synopsis>
			Get the devices set for a dialplan hint.
		</synopsis>
		<syntax>
			<parameter name="extension" required="true" argsep="@">
				<argument name="extension" required="true" />
				<argument name="context" />
			</parameter>
			<parameter name="options">
				<optionlist>
					<option name="n">
						<para>Retrieve name on the hint instead of list of devices.</para>
					</option>
				</optionlist>
			</parameter>
		</syntax>
		<description>
			<para>The HINT function can be used to retrieve the list of devices that are
			mapped to a dialplan hint.</para>
			<example title="Hint for extension 1234">
			same => n,NoOp(Hint for Extension 1234 is ${HINT(1234)})
			</example>
		</description>
	</function>
<module language="en_US" name="func_dialgroup">
	<support_level>core</support_level>
</module>
	<function name="DIALGROUP" language="en_US" module="func_dialgroup">
		<since>
			<version>1.6.0</version>
		</since>
		<synopsis>
			Manages a group of users for dialing.
		</synopsis>
		<syntax>
			<parameter name="group" required="true" />
			<parameter name="op">
				<para>The operation name, possible values are:</para>
				<para><literal>add</literal> - add a channel name or interface (write-only)</para>
				<para><literal>del</literal> - remove a channel name or interface (write-only)</para>
			</parameter>
		</syntax>
		<description>
			<para>Presents an interface meant to be used in concert with the Dial
			application, by presenting a list of channels which should be dialled when
			referenced.</para>
			<para>When DIALGROUP is read from, the argument is interpreted as the particular
			<replaceable>group</replaceable> for which a dial should be attempted.  When DIALGROUP is written to
			with no arguments, the entire list is replaced with the argument specified.</para>
			<para>Functionality is similar to a queue, except that when no interfaces are
			available, execution may continue in the dialplan.  This is useful when
			you want certain people to be the first to answer any calls, with immediate
			fallback to a queue when the front line people are busy or unavailable, but
			you still want front line people to log in and out of that group, just like
			a queue.</para>
			<example title="Add 2 endpoints to a dial group">
			exten => 1,1,Set(DIALGROUP(mygroup,add)=SIP/10)
			same => n,Set(DIALGROUP(mygroup,add)=SIP/20)
			same => n,Dial(${DIALGROUP(mygroup)})
			</example>
		</description>
	</function>
<module language="en_US" name="func_dialplan">
	<support_level>core</support_level>
</module>
	<function name="DIALPLAN_EXISTS" language="en_US" module="func_dialplan">
		<since>
			<version>1.6.0</version>
		</since>
		<synopsis>
			Checks the existence of a dialplan target.
		</synopsis>
		<syntax>
			<parameter name="context" required="true" />
			<parameter name="extension" />
			<parameter name="priority" />
		</syntax>
		<description>
			<para>This function returns <literal>1</literal> if the target exits. Otherwise, it returns <literal>0</literal>.</para>
		</description>
	</function>
<module language="en_US" name="func_enum">
	<support_level>core</support_level>
</module>
	<function name="ENUMQUERY" language="en_US" module="func_enum">
		<since>
			<version>1.6.0</version>
		</since>
		<synopsis>
			Initiate an ENUM query.
		</synopsis>
		<syntax>
			<parameter name="number" required="true" />
			<parameter name="method-type">
				<para>If no <replaceable>method-type</replaceable> is given, the default will be
				<literal>pjsip</literal>.</para>
			</parameter>
			<parameter name="zone-suffix">
				<para>If no <replaceable>zone-suffix</replaceable> is given, the default will be
				<literal>e164.arpa</literal></para>
			</parameter>
		</syntax>
		<description>
			<para>This will do a ENUM lookup of the given phone number.</para>
		</description>
	</function>
	<function name="ENUMRESULT" language="en_US" module="func_enum">
		<since>
			<version>1.6.0</version>
		</since>
		<synopsis>
			Retrieve results from a ENUMQUERY.
		</synopsis>
		<syntax>
			<parameter name="id" required="true">
				<para>The identifier returned by the ENUMQUERY function.</para>
			</parameter>
			<parameter name="resultnum" required="true">
				<para>The number of the result that you want to retrieve.</para>
				<para>Results start at <literal>1</literal>. If this argument is specified
				as <literal>getnum</literal>, then it will return the total number of results
				that are available or -1 on error.</para>
			</parameter>
		</syntax>
		<description>
			<para>This function will retrieve results from a previous use
			of the ENUMQUERY function.</para>
		</description>
	</function>
	<function name="ENUMLOOKUP" language="en_US" module="func_enum">
		<since>
			<version>1.2.0</version>
		</since>
		<synopsis>
			General or specific querying of NAPTR records for ENUM or ENUM-like DNS pointers.
		</synopsis>
		<syntax>
			<parameter name="number" required="true" />
			<parameter name="method-type">
				<para>If no <replaceable>method-type</replaceable> is given, the default will be
                                <literal>pjsip</literal>.</para>
			</parameter>
			<parameter name="options">
				<optionlist>
					<option name="c">
						<para>Returns an integer count of the number of NAPTRs of a certain RR type.</para>
						<para>Combination of <literal>c</literal> and Method-type of <literal>ALL</literal> will
						return a count of all NAPTRs for the record or -1 on error.</para>
					</option>
					<option name="u">
						<para>Returns the full URI and does not strip off the URI-scheme.</para>
					</option>
					<option name="s">
						<para>Triggers ISN specific rewriting.</para>
					</option>
					<option name="i">
						<para>Looks for branches into an Infrastructure ENUM tree.</para>
					</option>
					<option name="d">
						<para>for a direct DNS lookup without any flipping of digits.</para>
					</option>
				</optionlist>
			</parameter>
			<parameter name="record#">
				<para>If no <replaceable>record#</replaceable> is given,
				defaults to <literal>1</literal>.</para>
			</parameter>
			<parameter name="zone-suffix">
				<para>If no <replaceable>zone-suffix</replaceable> is given, the default will be
				<literal>e164.arpa</literal></para>
			</parameter>
		</syntax>
		<description>
			<para>For more information see <filename>doc/AST.pdf</filename>.</para>
		</description>
	</function>
	<function name="TXTCIDNAME" language="en_US" module="func_enum">
		<since>
			<version>1.2.0</version>
		</since>
		<synopsis>
			TXTCIDNAME looks up a caller name via DNS.
		</synopsis>
		<syntax>
			<parameter name="number" required="true" />
			<parameter name="zone-suffix">
				<para>If no <replaceable>zone-suffix</replaceable> is given, the default will be
				<literal>e164.arpa</literal></para>
			</parameter>
		</syntax>
		<description>
			<para>This function looks up the given phone number in DNS to retrieve
			the caller id name.  The result will either be blank or be the value
			found in the TXT record in DNS.</para>
		</description>
	</function>
<module language="en_US" name="func_env">
	<support_level>core</support_level>
</module>
	<function name="ENV" language="en_US" module="func_env">
		<since>
			<version>1.2.0</version>
		</since>
		<synopsis>
			Gets or sets the environment variable specified.
		</synopsis>
		<syntax>
			<parameter name="varname" required="true">
				<para>Environment variable name</para>
			</parameter>
		</syntax>
		<description>
			<para>Variables starting with <literal>AST_</literal> are reserved to the system and may not be set.</para>
			<para>Additionally, the following system variables are available as special built-in dialplan variables.
			These variables cannot be set or modified and are read-only.</para>
			<variablelist>
				<variable name="EPOCH">
					<para>Current unix style epoch</para>
				</variable>
				<variable name="SYSTEMNAME">
					<para>value of the <literal>systemname</literal> option from <literal>asterisk.conf</literal></para>
				</variable>
				<variable name="ASTCACHEDIR">
					<para>value of the <literal>astcachedir</literal> option from <literal>asterisk.conf</literal></para>
				</variable>
				<variable name="ASTETCDIR">
					<para>value of the <literal>astetcdir</literal> option from <literal>asterisk.conf</literal></para>
				</variable>
				<variable name="ASTMODDIR">
					<para>value of the <literal>astmoddir</literal> option from <literal>asterisk.conf</literal></para>
				</variable>
				<variable name="ASTVARLIBDIR">
					<para>value of the <literal>astvarlib</literal> option from <literal>asterisk.conf</literal></para>
				</variable>
				<variable name="ASTDBDIR">
					<para>value of the <literal>astdbdir</literal> option from <literal>asterisk.conf</literal></para>
				</variable>
				<variable name="ASTKEYDIR">
					<para>value of the <literal>astkeydir</literal> option from <literal>asterisk.conf</literal></para>
				</variable>
				<variable name="ASTDATADIR">
					<para>value of the <literal>astdatadir</literal> option from <literal>asterisk.conf</literal></para>
				</variable>
				<variable name="ASTAGIDIR">
					<para>value of the <literal>astagidir</literal> option from <literal>asterisk.conf</literal></para>
				</variable>
				<variable name="ASTSPOOLDIR">
					<para>value of the <literal>astspooldir</literal> option from <literal>asterisk.conf</literal></para>
				</variable>
				<variable name="ASTRUNDIR">
					<para>value of the <literal>astrundir</literal> option from <literal>asterisk.conf</literal></para>
				</variable>
				<variable name="ASTLOGDIR">
					<para>value of the <literal>astlogdir</literal> option from <literal>asterisk.conf</literal></para>
				</variable>
				<variable name="ASTSBINDIR">
					<para>value of the <literal>astsbindir</literal> option from <literal>asterisk.conf</literal></para>
				</variable>
				<variable name="ENTITYID">
					<para>Global Entity ID set automatically, or from <literal>asterisk.conf</literal></para>
				</variable>
			</variablelist>
		</description>
	</function>
	<function name="STAT" language="en_US" module="func_env">
		<since>
			<version>1.4.0</version>
		</since>
		<synopsis>
			Does a check on the specified file.
		</synopsis>
		<syntax>
			<parameter name="flag" required="true">
				<para>Flag may be one of the following:</para>
				<para>d - Checks if the file is a directory.</para>
				<para>e - Checks if the file exists.</para>
				<para>f - Checks if the file is a regular file.</para>
				<para>m - Returns the file mode (in octal)</para>
				<para>s - Returns the size (in bytes) of the file</para>
				<para>A - Returns the epoch at which the file was last accessed.</para>
				<para>C - Returns the epoch at which the inode was last changed.</para>
				<para>M - Returns the epoch at which the file was last modified.</para>
			</parameter>
			<parameter name="filename" required="true" />
		</syntax>
		<description>
			<note>
				<para>If <literal>live_dangerously</literal> in <literal>asterisk.conf</literal>
				is set to <literal>no</literal>, this function can only be executed from the
				dialplan, and not directly from external protocols.</para>
			</note>
		</description>
	</function>
	<function name="FILE" language="en_US" module="func_env">
		<since>
			<version>1.6.0</version>
		</since>
		<synopsis>
			Read or write text file.
		</synopsis>
		<syntax>
			<parameter name="filename" required="true" />
			<parameter name="offset">
				<para>Maybe specified as any number. If negative, <replaceable>offset</replaceable> specifies the number
				of bytes back from the end of the file.</para>
			</parameter>
			<parameter name="length">
				<para>If specified, will limit the length of the data read to that size. If negative,
				trims <replaceable>length</replaceable> bytes from the end of the file.</para>
			</parameter>
			<parameter name="options">
				<optionlist>
					<option name="l">
						<para>Line mode:  offset and length are assumed to be
						measured in lines, instead of byte offsets.</para>
					</option>
					<option name="a">
						<para>In write mode only, the append option is used to
						append to the end of the file, instead of overwriting
						the existing file.</para>
					</option>
					<option name="d">
						<para>In write mode and line mode only, this option does
						not automatically append a newline string to the end of
						a value.  This is useful for deleting lines, instead of
						setting them to blank.</para>
					</option>
				</optionlist>
			</parameter>
			<parameter name="format">
				<para>The <replaceable>format</replaceable> parameter may be
				used to delimit the type of line terminators in line mode.</para>
				<optionlist>
					<option name="u">
						<para>Unix newline format.</para>
					</option>
					<option name="d">
						<para>DOS newline format.</para>
					</option>
					<option name="m">
						<para>Macintosh newline format.</para>
					</option>
				</optionlist>
			</parameter>
		</syntax>
		<description>
			<para>Read and write text file in character and line mode.</para>
			<para>Examples:</para>
			<para>Read mode (byte):</para>
			<example title="Reads the entire content of the file">
			same => n,Set(foo=${FILE(/tmp/test.txt)})
			</example>
			<example title="Reads from the 11th byte to the end of the file (i.e. skips the first 10)">
			same => n,Set(foo=${FILE(/tmp/test.txt,10)})
			</example>
			<example title="Reads from the 11th to 20th byte in the file (i.e. skip the first 10, then read 10 bytes)">
			same => n,Set(foo=${FILE(/tmp/test.txt,10,10)})
			</example>
			<para>Read mode (line):</para>
			<example title="Reads the 3rd line of the file">
			same => n,Set(foo=${FILE(/tmp/test.txt,3,1,l)})
			</example>
			<example title="Reads the 3rd and 4th lines of the file">
			same => n,Set(foo=${FILE(/tmp/test.txt,3,2,l)})
			</example>
			<example title="Reads from the third line to the end of the file">
			same => n,Set(foo=${FILE(/tmp/test.txt,3,,l)})
			</example>
			<example title="Reads the last three lines of the file">
			same => n,Set(foo=${FILE(/tmp/test.txt,-3,,l)})
			</example>
			<example title="Reads the 3rd line of a DOS-formatted file">
			same => n,Set(foo=${FILE(/tmp/test.txt,3,1,l,d)})
			</example>
			<para>Write mode (byte):</para>
			<example title="Truncate the file and write bar">
			same => n,Set(FILE(/tmp/test.txt)=bar)
			</example>
			<example title="Append bar">
			same => n,Set(FILE(/tmp/test.txt,,,a)=bar)
			</example>
			<example title="Replace the first byte with bar (replaces 1 character with 3)">
			same => n,Set(FILE(/tmp/test.txt,0,1)=bar)
			</example>
			<example title="Replace 10 bytes beginning at the 21st byte of the file with bar">
			same => n,Set(FILE(/tmp/test.txt,20,10)=bar)
			</example>
			<example title="Replace all bytes from the 21st with bar">
			same => n,Set(FILE(/tmp/test.txt,20)=bar)
			</example>
			<example title="Insert bar after the 4th character">
			same => n,Set(FILE(/tmp/test.txt,4,0)=bar)
			</example>
			<para>Write mode (line):</para>
			<example title="Replace the first line of the file with bar">
			same => n,Set(FILE(/tmp/foo.txt,0,1,l)=bar)
			</example>
			<example title="Replace the last line of the file with bar">
			same => n,Set(FILE(/tmp/foo.txt,-1,,l)=bar)
			</example>
			<example title="Append bar to the file with a newline">
			same => n,Set(FILE(/tmp/foo.txt,,,al)=bar)
			</example>
			<note>
				<para>If <literal>live_dangerously</literal> in <literal>asterisk.conf</literal>
				is set to <literal>no</literal>, this function can only be executed from the
				dialplan, and not directly from external protocols.</para>
			</note>
		</description>
		<see-also>
			<ref type="function">FILE_COUNT_LINE</ref>
			<ref type="function">FILE_FORMAT</ref>
		</see-also>
	</function>
	<function name="FILE_COUNT_LINE" language="en_US" module="func_env">
		<since>
			<version>1.8.0</version>
		</since>
		<synopsis>
			Obtains the number of lines of a text file.
		</synopsis>
		<syntax>
			<parameter name="filename" required="true" />
			<parameter name="format">
				<para>Format may be one of the following:</para>
				<optionlist>
					<option name="u">
						<para>Unix newline format.</para>
					</option>
					<option name="d">
						<para>DOS newline format.</para>
					</option>
					<option name="m">
						<para>Macintosh newline format.</para>
					</option>
				</optionlist>
				<note><para>If not specified, an attempt will be made to determine the newline format type.</para></note>
			</parameter>
		</syntax>
		<description>
			<para>Returns the number of lines, or <literal>-1</literal> on error.</para>
			<note>
				<para>If <literal>live_dangerously</literal> in <literal>asterisk.conf</literal>
				is set to <literal>no</literal>, this function can only be executed from the
				dialplan, and not directly from external protocols.</para>
			</note>
		</description>
		<see-also>
			<ref type="function">FILE</ref>
			<ref type="function">FILE_FORMAT</ref>
		</see-also>
	</function>
	<function name="FILE_FORMAT" language="en_US" module="func_env">
		<since>
			<version>1.8.0</version>
		</since>
		<synopsis>
			Return the newline format of a text file.
		</synopsis>
		<syntax>
			<parameter name="filename" required="true" />
		</syntax>
		<description>
			<para>Return the line terminator type:</para>
			<para>'u' - Unix "\n" format</para>
			<para>'d' - DOS "\r\n" format</para>
			<para>'m' - Macintosh "\r" format</para>
			<para>'x' - Cannot be determined</para>
			<note>
				<para>If <literal>live_dangerously</literal> in <literal>asterisk.conf</literal>
				is set to <literal>no</literal>, this function can only be executed from the
				dialplan, and not directly from external protocols.</para>
			</note>
		</description>
		<see-also>
			<ref type="function">FILE</ref>
			<ref type="function">FILE_COUNT_LINE</ref>
		</see-also>
	</function>
	<function name="BASENAME" language="en_US" module="func_env">
		<since>
			<version>16.21.0</version>
			<version>18.7.0</version>
		</since>
		<synopsis>
			Return the name of a file.
		</synopsis>
		<syntax>
			<parameter name="filename" required="true" />
		</syntax>
		<description>
			<para>Return the base file name, given a full file path.</para>
			<example title="Directory name">
			same => n,Set(basename=${BASENAME(/etc/asterisk/extensions.conf)})
			same => n,NoOp(${basename}) ; outputs extensions.conf
			</example>
		</description>
		<see-also>
			<ref type="function">DIRNAME</ref>
		</see-also>
	</function>
	<function name="DIRNAME" language="en_US" module="func_env">
		<since>
			<version>16.21.0</version>
			<version>18.7.0</version>
		</since>
		<synopsis>
			Return the directory of a file.
		</synopsis>
		<syntax>
			<parameter name="filename" required="true" />
		</syntax>
		<description>
			<para>Return the directory of a file, given a full file path.</para>
			<example title="Directory name">
			same => n,Set(dirname=${DIRNAME(/etc/asterisk/extensions.conf)})
			same => n,NoOp(${dirname}) ; outputs /etc/asterisk
			</example>
		</description>
		<see-also>
			<ref type="function">BASENAME</ref>
		</see-also>
	</function>
<module language="en_US" name="func_evalexten">
	<support_level>extended</support_level>
</module>
	<function name="EVAL_EXTEN" language="en_US" module="func_evalexten">
		<since>
			<version>16.26.0</version>
			<version>18.12.0</version>
			<version>19.4.0</version>
		</since>
		<synopsis>
			Evaluates the contents of a dialplan extension and returns it as a string.
		</synopsis>
		<syntax>
			<parameter name="context" />
			<parameter name="extensions" />
			<parameter name="priority" required="true" />
		</syntax>
		<description>
			<para>The EVAL_EXTEN function looks up a dialplan entry by context,extension,priority,
			evaluates the contents of a Return statement to resolve any variable or function
			references, and returns the result as a string.</para>
			<para>You can use this function to create simple user-defined lookup tables or
			user-defined functions.</para>
			<example title="Custom dialplan functions">
			[call-types]
			exten => _1NNN,1,Return(internal)
			exten => _NXXNXXXXXX,1,Return(external)

			[udf]
			exten => calleridlen,1,Return(${LEN(${CALLERID(num)})})

			[default]
			exten => _X!,1,Verbose(Call type ${EVAL_EXTEN(call-types,${EXTEN},1)} - ${EVAL_EXTEN(udf,calleridlen,1)})
			</example>
			<para>Any variables in the evaluated data will be resolved in the context of
			that extension. For example, <literal>${EXTEN}</literal> would refer to the
			EVAL_EXTEN extension, not the extension in the context invoking the function.
			This behavior is similar to other applications, e.g. <literal>Gosub</literal>.</para>
			<example title="Choosing which prompt to use">
			same => n,Read(input,${EVAL_EXTEN(prompts,${CALLERID(num)},1)})

			[prompts]
			exten => _X!,1,Return(default)
			exten => _20X,1,Return(welcome)
			exten => _2XX,1,Return(${DB(promptsettings/${EXTEN})})
			exten => _3XX,1,Return(${ODBC_MYFUNC(${EXTEN})})
			</example>
			<para>Extensions on which EVAL_EXTEN is invoked are not different from other
			extensions. However, the application at that extension is not executed.
			Only the application data is parsed and evaluated.</para>
			<para>A limitation of this function is that the application at the specified
			extension isn't actually executed, and thus unlike a Gosub, you can't pass
			arguments in the EVAL_EXTEN function.</para>
			<para>If you need the ability to evaluate more complex logic that cannot be done
			purely using functions, see <literal>EVAL_SUB</literal>.</para>
		</description>
		<see-also>
			<ref type="function">EVAL</ref>
			<ref type="function">EVAL_SUB</ref>
		</see-also>
	</function>
	<function name="EVAL_SUB" language="en_US" module="func_evalexten">
		<since>
			<version>20.11.0</version>
			<version>21.6.0</version>
			<version>22.1.0</version>
		</since>
		<synopsis>
			Executes a Gosub and provides its return value as a string
		</synopsis>
		<syntax>
			<parameter name="context" />
			<parameter name="extensions" />
			<parameter name="priority" required="true" />
		</syntax>
		<description>
			<para>The EVAL_SUB function executes up a dialplan location by context,extension,priority, with optional arguments
			and returns the contents of the Return statement. The arguments to <literal>EVAL_SUB</literal>
			are exactly like they are with <literal>Gosub</literal>.</para>
			<para>This function is complementary to <literal>EVAL_EXTEN</literal>. However, it is more powerful,
			since it allows executing arbitrary dialplan and capturing some outcome as a dialplan function's
			return value, allowing it to be used in a variety of scenarios that do not allow executing dialplan
			directly but allow variables and functions to be used, and where using <literal>EVAL_EXTEN</literal>
			would be difficult or impossible.</para>
			<para>Consequently, this function also allows you to implement your own arbitrary functions
			in dialplan, which can then be wrapped using the Asterisk function interface using <literal>EVAL_SUB</literal>.</para>
			<para>While this function is primarily intended to be used for executing Gosub routines that are quick
			and do not interact with the channel, it is safe to execute arbitrary, even blocking, dialplan in the
			called subroutine. That said, this kind of usage is not recommended.</para>
			<para>This function will always return, even if the channel is hung up.</para>
			<example title="Record whether a PSTN call is local">
			[islocal]
			exten => _X!,1,ExecIf($[${LEN(${EXTEN})}&lt;10]?Return(1))
			same => n,Set(LOCAL(npanxx)=${EXTEN:-10:6})
			same => n,ReturnIf(${EXISTS(${DB(localcall/${npanxx})})}?${DB(localcall/${npanxx})})
			same => n,Set(LOCAL(islocal)=${SHELL(curl "https://example.com/islocal?npanxx=${EXTEN:-10:6}")})
			same => n,Set(LOCAL(islocal)=${FILTER(A-Z,${islocal})})
			same => n,Set(DB(localcall/${npanxx})=${islocal})
			same => n,Return(${islocal})

			[outgoing]
			exten => _1NXXNXXXXXX,1,Set(CDR(toll)=${IF($["${EVAL_SUB(islocal,${EXTEN},1)}"="Y"]?0:1)})
			same => n,Dial(DAHDI/1/${EXTEN})
			same => n,Hangup()
			</example>
			<para>This example illustrates an example of logic that would be difficult to capture
			in a way that a single call to <literal>EVAL_EXTEN</literal> would return the same result. For one, conditionals
			are involved, and due to the way Asterisk parses dialplan, all functions in an application call are evaluated all the
			time, which may be undesirable if they cause side effects (e.g. making a cURL request) that should only happen in certain circumstances.</para>
			<para>The above example, of course, does not require the use of this function, as it could have been invoked
			using the Gosub application directly. However, if constrained to just using variables or functions,
			<literal>EVAL_SUB</literal> would be required.</para>
		</description>
		<see-also>
			<ref type="function">EVAL_EXTEN</ref>
			<ref type="application">Return</ref>
		</see-also>
	</function>
<module language="en_US" name="func_export">
	<support_level>extended</support_level>
</module>
	<function name="EXPORT" language="en_US" module="func_export">
		<since>
			<version>16.30.0</version>
			<version>18.16.0</version>
			<version>19.8.0</version>
			<version>20.1.0</version>
		</since>
		<synopsis>
			Set variables or dialplan functions on any arbitrary channel that exists.
		</synopsis>
		<syntax>
			<parameter name="channel" required="true">
				<para>The complete channel name: <literal>SIP/12-abcd1234</literal>.</para>
			</parameter>
			<parameter name="var" required="true">
				<para>Variable name</para>
			</parameter>
		</syntax>
		<description>
			<para>Allows setting variables or functions on any existing channel if it exists.</para>
		</description>
		<see-also>
			<ref type="function">IMPORT</ref>
			<ref type="function">MASTER_CHANNEL</ref>
			<ref type="function">SHARED</ref>
		</see-also>
	</function>
<module language="en_US" name="func_extstate">
	<support_level>core</support_level>
</module>
	<function name="EXTENSION_STATE" language="en_US" module="func_extstate">
		<since>
			<version>1.6.0</version>
		</since>
		<synopsis>
			Get an extension's state.
		</synopsis>
		<syntax argsep="@">
			<parameter name="extension" required="true" />
			<parameter name="context">
				<para>If it is not specified defaults to <literal>default</literal>.</para>
			</parameter>
		</syntax>
		<description>
			<para>The EXTENSION_STATE function can be used to retrieve the state from any
			hinted extension. For example:</para>
			<para>NoOp(1234@default has state ${EXTENSION_STATE(1234)})</para>
			<para>NoOp(4567@home has state ${EXTENSION_STATE(4567@home)})</para>
			<para>The possible values returned by this function are:</para>
			<para>UNKNOWN | NOT_INUSE | INUSE | BUSY | INVALID | UNAVAILABLE | RINGING |
			RINGINUSE | HOLDINUSE | ONHOLD</para>
		</description>
	</function>
<module language="en_US" name="func_frame_drop">
	<support_level>extended</support_level>
</module>
	<function name="FRAME_DROP" language="en_US" module="func_frame_drop">
		<since>
			<version>16.21.0</version>
			<version>18.7.0</version>
		</since>
		<synopsis>
			Drops specific frame types in the TX or RX direction on a channel.
		</synopsis>
		<syntax>
			<parameter name="direction" required="true">
				<para>List of frame types to be dropped for the specified direction. Direction can be <literal>TX</literal> or <literal>RX</literal>. The <literal>TX</literal> direction will prevent Asterisk from sending frames to a channel, and the <literal>RX</literal> direction will prevent Asterisk from receiving frames from a channel.</para>
				<para>Subsequent calls to this function will replace previous settings, allowing certain frames to be dropped only temporarily, for instance.</para>
				<para>Below are the different types of frames that can be dropped. Other actions may need to be taken in conjunction with use of this function:
				for instance, if you drop ANSWER control frames, you should explicitly use <literal>Progress()</literal> for your call or undesired behavior
				may occur.</para>
				<enumlist>
					<enum name = "DTMF_BEGIN" />
					<enum name = "DTMF_END" />
					<enum name = "VOICE" />
					<enum name = "VIDEO" />
					<enum name = "CONTROL" />
					<enum name = "NULL" />
					<enum name = "IAX" />
					<enum name = "TEXT" />
					<enum name = "TEXT_DATA" />
					<enum name = "IMAGE" />
					<enum name = "HTML" />
					<enum name = "CNG" />
					<enum name = "MODEM" />
				</enumlist>
				<para>The following CONTROL frames can also be dropped:</para>
				<enumlist>
					<enum name = "RING" />
					<enum name = "RINGING" />
					<enum name = "ANSWER" />
					<enum name = "BUSY" />
					<enum name = "TAKEOFFHOOK" />
					<enum name = "OFFHOOK" />
					<enum name = "CONGESTION" />
					<enum name = "FLASH" />
					<enum name = "WINK" />
					<enum name = "PROGRESS" />
					<enum name = "PROCEEDING" />
					<enum name = "HOLD" />
					<enum name = "UNHOLD" />
					<enum name = "VIDUPDATE" />
					<enum name = "CONNECTED_LINE" />
					<enum name = "REDIRECTING" />
				</enumlist>
			</parameter>
		</syntax>
		<description>
			<para>Examples:</para>
			<example title="Drop only DTMF frames towards this channel">
			exten => 1,1,Set(FRAME_DROP(TX)=DTMF_BEGIN,DTMF_END)
			</example>
			<example title="Drop only Answer control frames towards this channel">
			exten => 1,1,Set(FRAME_DROP(TX)=ANSWER)
			</example>
			<example title="Drop only DTMF frames received on this channel">
			exten => 1,1,Set(FRAME_DROP(RX)=DTMF_BEGIN,DTMF_END)
			</example>
		</description>
	</function>
<module language="en_US" name="func_frame_trace">
	<support_level>extended</support_level>
</module>
	<function name="FRAME_TRACE" language="en_US" module="func_frame_trace">
		<since>
			<version>10.0.0</version>
		</since>
		<synopsis>
			View internal ast_frames as they are read and written on a channel.
		</synopsis>
		<syntax>
			<parameter name="filter list type" required="true">
				<para>A filter can be applied to the trace to limit what frames are viewed.  This
				filter can either be a <literal>white</literal> or <literal>black</literal> list
				of frame types.  When no filter type is present, <literal>white</literal> is
				used.  If no arguments are provided at all, all frames will be output.
				</para>

				<para>Below are the different types of frames that can be filtered.</para>
				<enumlist>
					<enum name = "DTMF_BEGIN" />
					<enum name = "DTMF_END" />
					<enum name = "VOICE" />
					<enum name = "VIDEO" />
					<enum name = "CONTROL" />
					<enum name = "NULL" />
					<enum name = "IAX" />
					<enum name = "TEXT" />
					<enum name = "TEXT_DATA" />
					<enum name = "IMAGE" />
					<enum name = "HTML" />
					<enum name = "CNG" />
					<enum name = "MODEM" />
				</enumlist>
			</parameter>
		</syntax>
		<description>
			<para>Examples:</para>
			<example title="View only DTMF frames">
			exten => 1,1,Set(FRAME_TRACE(white)=DTMF_BEGIN,DTMF_END)
			</example>
			<example title="View only DTMF frames">
			exten => 1,1,Set(FRAME_TRACE()=DTMF_BEGIN,DTMF_END)
			</example>
			<example title="View everything except DTMF frames">
			exten => 1,1,Set(FRAME_TRACE(black)=DTMF_BEGIN,DTMF_END)
			</example>
		</description>
	</function>
<module language="en_US" name="func_global">
	<support_level>core</support_level>
</module>
	<function name="GLOBAL" language="en_US" module="func_global">
		<since>
			<version>1.4.0</version>
		</since>
		<synopsis>
			Gets or sets the global variable specified.
		</synopsis>
		<syntax>
			<parameter name="varname" required="true">
				<para>Global variable name</para>
			</parameter>
		</syntax>
		<description>
			<para>Set or get the value of a global variable specified in <replaceable>varname</replaceable></para>
		</description>
	</function>
	<function name="GLOBAL_DELETE" language="en_US" module="func_global">
		<since>
			<version>18.21.0</version>
			<version>20.6.0</version>
			<version>21.1.0</version>
		</since>
		<synopsis>
			Deletes a specified global variable.
		</synopsis>
		<syntax>
			<parameter name="varname" required="true">
				<para>Global variable name</para>
			</parameter>
		</syntax>
		<description>
			<para>Delete the global variable specified in <replaceable>varname</replaceable>.
			Will succeed if the global variable exists or not.</para>
		</description>
		<see-also>
			<ref type="function">GLOBAL</ref>
			<ref type="function">DELETE</ref>
		</see-also>
	</function>
	<function name="GLOBAL_EXISTS" language="en_US" module="func_global">
		<since>
			<version>18.21.0</version>
			<version>20.6.0</version>
			<version>21.1.0</version>
		</since>
		<synopsis>
			Check if a global variable exists or not.
		</synopsis>
		<syntax>
			<parameter name="varname" required="true">
				<para>Global variable name</para>
			</parameter>
		</syntax>
		<description>
			<para>Returns <literal>1</literal> if global variable exists or <literal>0</literal> otherwise.</para>
		</description>
		<see-also>
			<ref type="function">VARIABLE_EXISTS</ref>
		</see-also>
	</function>
	<function name="SHARED" language="en_US" module="func_global">
		<since>
			<version>1.6.0</version>
		</since>
		<synopsis>
			Gets or sets the shared variable specified.
		</synopsis>
		<syntax>
			<parameter name="varname" required="true">
				<para>Variable name</para>
			</parameter>
			<parameter name="channel">
				<para>If not specified will default to current channel. It is the complete
				channel name: <literal>SIP/12-abcd1234</literal> or the prefix only <literal>SIP/12</literal>.</para>
			</parameter>
		</syntax>
		<description>
			<para>Implements a shared variable area, in which you may share variables between
			channels.</para>
			<para>The variables used in this space are separate from the general namespace of
			the channel and thus <variable>SHARED(foo)</variable> and <variable>foo</variable>
			represent two completely different variables, despite sharing the same name.</para>
			<para>Finally, realize that there is an inherent race between channels operating
			at the same time, fiddling with each others' internal variables, which is why
			this special variable namespace exists; it is to remind you that variables in
			the SHARED namespace may change at any time, without warning.  You should
			therefore take special care to ensure that when using the SHARED namespace,
			you retrieve the variable and store it in a regular channel variable before
			using it in a set of calculations (or you might be surprised by the result).</para>
		</description>
	</function>
	<managerEvent language="en_US" name="VarSet" module="func_global">
		<managerEventInstance class="EVENT_FLAG_DIALPLAN" module="func_global">
			<since>
				<version>12.0.0</version>
			</since>
			<synopsis>Raised when a variable is shared between channels.</synopsis>
			<syntax>
				<channel_snapshot/>
				<parameter name="Variable">
					<para>The SHARED variable being set.</para>
					<note><para>The variable name will always be enclosed with
					<literal>SHARED()</literal></para></note>
				</parameter>
				<parameter name="Value">
					<para>The new value of the variable.</para>
				</parameter>
			</syntax>
			<see-also>
				<ref type="function">SHARED</ref>
			</see-also>
		</managerEventInstance>
	</managerEvent>
<module language="en_US" name="func_groupcount">
	<support_level>core</support_level>
</module>
	<function name="GROUP_COUNT" language="en_US" module="func_groupcount">
		<since>
			<version>1.2.0</version>
		</since>
		<synopsis>
			Counts the number of channels in the specified group.
		</synopsis>
		<syntax argsep="@">
			<parameter name="groupname">
				<para>Group name.</para>
			</parameter>
			<parameter name="category">
				<para>Category name</para>
			</parameter>
		</syntax>
		<description>
			<para>Calculates the group count for the specified group, or uses the
			channel's current group if not specified (and non-empty).</para>
		</description>
	</function>
	<function name="GROUP_MATCH_COUNT" language="en_US" module="func_groupcount">
		<since>
			<version>1.2.0</version>
		</since>
		<synopsis>
			Counts the number of channels in the groups matching the specified pattern.
		</synopsis>
		<syntax argsep="@">
			<parameter name="groupmatch" required="true">
				<para>A standard regular expression used to match a group name.</para>
			</parameter>
			<parameter name="category">
				<para>A standard regular expression used to match a category name.</para>
			</parameter>
		</syntax>
		<description>
			<para>Calculates the group count for all groups that match the specified pattern.
			Note: category matching is applied after matching based on group.
			Uses standard regular expression matching on both (see regex(7)).</para>
		</description>
	</function>
	<function name="GROUP" language="en_US" module="func_groupcount">
		<since>
			<version>1.2.0</version>
		</since>
		<synopsis>
			Gets or sets the channel group.
		</synopsis>
		<syntax>
			<parameter name="category">
				<para>Category name.</para>
			</parameter>
		</syntax>
		<description>
			<para><replaceable>category</replaceable> can be employed for more fine grained group management. Each channel
			can only be member of exactly one group per <replaceable>category</replaceable>.</para>
		</description>
	</function>
	<function name="GROUP_LIST" language="en_US" module="func_groupcount">
		<since>
			<version>1.2.0</version>
		</since>
		<synopsis>
			Gets a list of the groups set on a channel.
		</synopsis>
		<syntax />
		<description>
			<para>Gets a list of the groups set on a channel.</para>
		</description>
	</function>

<module language="en_US" name="func_hangupcause">
	<support_level>core</support_level>
</module>
	<function name="HANGUPCAUSE" language="en_US" module="func_hangupcause">
		<since>
			<version>11.0.0</version>
		</since>
		<synopsis>
			Gets per-channel hangupcause information from the channel.
		</synopsis>
		<syntax>
			<parameter name="channel" required="true">
				<para>The name of the channel for which to retrieve cause information.</para>
			</parameter>
			<parameter name="type" required="true">
				<para>Parameter describing which type of information is requested. Types are:</para>
				<enumlist>
					<enum name="tech"><para>Technology-specific cause information</para></enum>
					<enum name="ast"><para>Translated Asterisk cause code</para></enum>
				</enumlist>
			</parameter>
		</syntax>
		<description>
			<para>Gets technology-specific or translated Asterisk cause code information
			from the channel for the specified channel that resulted from a dial.</para>
		</description>
		<see-also>
			<ref type="function">HANGUPCAUSE_KEYS</ref>
			<ref type="application">HangupCauseClear</ref>
		</see-also>
	</function>
	<function name="HANGUPCAUSE_KEYS" language="en_US" module="func_hangupcause">
		<since>
			<version>11.0.0</version>
		</since>
		<synopsis>
			Gets the list of channels for which hangup causes are available.
		</synopsis>
		<description>
			<para>Returns a comma-separated list of channel names to be used with the HANGUPCAUSE function.</para>
		</description>
		<see-also>
			<ref type="function">HANGUPCAUSE</ref>
			<ref type="application">HangupCauseClear</ref>
		</see-also>
	</function>
	<application name="HangupCauseClear" language="en_US" module="func_hangupcause">
		<since>
			<version>11.0.0</version>
		</since>
		<synopsis>
			Clears hangup cause information from the channel that is available through HANGUPCAUSE.
		</synopsis>
		<description>
			<para>Clears all channel-specific hangup cause information from the channel.
			This is never done automatically (i.e. for new Dial()s).</para>
		</description>
		<see-also>
			<ref type="function">HANGUPCAUSE</ref>
			<ref type="function">HANGUPCAUSE_KEYS</ref>
		</see-also>
	</application>
<module language="en_US" name="func_holdintercept">
	<support_level>core</support_level>
</module>
	<function name="HOLD_INTERCEPT" language="en_US" module="func_holdintercept">
		<since>
			<version>13.7.0</version>
		</since>
		<synopsis>
			Intercepts hold frames on a channel and raises an event instead of passing the frame on
		</synopsis>
		<syntax>
			<parameter name="action" required="true">
				<optionlist>
					<option name="remove">
						<para>W/O. Removes the hold interception function.</para>
					</option>
					<option name="set">
						<para>W/O. Enable hold interception on the channel. When
						enabled, the channel will intercept any hold action that
						is signalled from the device, and instead simply raise an
						event (AMI/ARI) indicating that the channel wanted to put other
						parties on hold.</para>
					</option>
				</optionlist>
			</parameter>
		</syntax>
	</function>
<module language="en_US" name="func_iconv">
	<depend>iconv</depend>
	<support_level>core</support_level>
</module>
	<function name="ICONV" language="en_US" module="func_iconv">
		<since>
			<version>1.6.0</version>
		</since>
		<synopsis>
			Converts charsets of strings.
		</synopsis>
		<syntax>
			<parameter name="in-charset" required="true">
				<para>Input charset</para>
			</parameter>
			<parameter name="out-charset" required="true">
				<para>Output charset</para>
			</parameter>
			<parameter name="string" required="true">
				<para>String to convert, from <replaceable>in-charset</replaceable> to <replaceable>out-charset</replaceable></para>
			</parameter>
		</syntax>
		<description>
			<para>Converts string from <replaceable>in-charset</replaceable> into <replaceable>out-charset</replaceable>.
			For available charsets, use <literal>iconv -l</literal> on your shell command line.</para>
			<note><para>Due to limitations within the API, ICONV will not currently work with
			charsets with embedded NULLs. If found, the string will terminate.</para></note>
		</description>
	</function>
<module language="en_US" name="func_jitterbuffer">
	<support_level>core</support_level>
</module>
	<function name="JITTERBUFFER" language="en_US" module="func_jitterbuffer">
		<since>
			<version>10.0.0</version>
		</since>
		<synopsis>
			Add a Jitterbuffer to the Read side of the channel. This dejitters the audio stream before it reaches the Asterisk core. This is a write only function.
		</synopsis>
		<syntax>
			<parameter name="jitterbuffer type" required="true">
				<optionlist>
					<option name="fixed">
						<para>Set a fixed jitterbuffer on the channel.</para>
					</option>
					<option name="adaptive">
						<para>Set an adaptive jitterbuffer on the channel.</para>
					</option>
					<option name="disabled">
						<para>Remove a previously set jitterbuffer from the channel.</para>
					</option>
				</optionlist>
			</parameter>
		</syntax>
		<description>
			<para>Jitterbuffers are constructed in two different ways.
			The first always take four arguments: <replaceable>max_size</replaceable>,
			<replaceable>resync_threshold</replaceable>, <replaceable>target_extra</replaceable>,
			and <replaceable>sync_video</replaceable>.
			Alternatively, a single argument of <literal>default</literal> can be provided,
			which will construct the default jitterbuffer for the given
			<replaceable>jitterbuffer type</replaceable>.</para>
			<para>The arguments are:</para>
			<para><replaceable>max_size</replaceable>: Length in milliseconds of the buffer.
			Defaults to 200 ms.</para>
			<para><replaceable>resync_threshold</replaceable>: The length in milliseconds over
			which a timestamp difference will result in resyncing the jitterbuffer.
			Defaults to 1000ms.</para>
			<para>target_extra: This option only affects the adaptive jitterbuffer. It represents
			the amount time in milliseconds by which the new jitter buffer will pad its size.
			Defaults to 40ms.</para>
			<para>sync_video: This option enables video synchronization with the audio stream. It can be
			turned on and off. Defaults to off.</para>
			<example title="Fixed with defaults" language="text">
			exten => 1,1,Set(JITTERBUFFER(fixed)=default)
			</example>
			<example title="Fixed with 200ms max size" language="text">
			exten => 1,1,Set(JITTERBUFFER(fixed)=200)
			</example>
			<example title="Fixed with 200ms max size and video sync support" language="text">
			exten => 1,1,Set(JITTERBUFFER(fixed)=200,,,yes)
			</example>
			<example title="Fixed with 200ms max size, resync threshold 1500" language="text">
			exten => 1,1,Set(JITTERBUFFER(fixed)=200,1500)
			</example>
			<example title="Adaptive with defaults" language="text">
			exten => 1,1,Set(JITTERBUFFER(adaptive)=default)
			</example>
			<example title="Adaptive with 200ms max size, 60ms target extra" language="text">
			exten => 1,1,Set(JITTERBUFFER(adaptive)=200,,60)
			</example>
			<example title="Adaptive with 200ms max size and video sync support" language="text">
			exten => 1,1,Set(JITTERBUFFER(adaptive)=200,,,yes)
			</example>
			<example title="Set a fixed jitterbuffer with defaults; then remove it" language="text">
			exten => 1,1,Set(JITTERBUFFER(fixed)=default)
			exten => 1,n,Set(JITTERBUFFER(disabled)=)
			</example>
			<note><para>If a channel specifies a jitterbuffer due to channel driver configuration and
			the JITTERBUFFER function has set a jitterbuffer for that channel, the jitterbuffer set by
			the JITTERBUFFER function will take priority and the jitterbuffer set by the channel
			configuration will not be applied.</para></note>
		</description>
	</function>
<module language="en_US" name="func_json">
	<support_level>extended</support_level>
</module>
	<function name="JSON_DECODE" language="en_US" module="func_json">
		<since>
			<version>16.24.0</version>
			<version>18.10.0</version>
			<version>19.2.0</version>
		</since>
		<synopsis>
			Returns the string value of a JSON object key from a string containing a
			JSON array.
		</synopsis>
		<syntax>
			<parameter name="varname" required="true">
				<para>The name of the variable containing the JSON string to parse.</para>
			</parameter>
			<parameter name="item" required="true">
				<para>The name of the key whose value to return.</para>
				<para>Multiple keys can be listed separated by a hierarchy delimeter, which will recursively index into a nested JSON string to retrieve a specific subkey's value.</para>
			</parameter>
			<parameter name="separator" required="false">
				<para>A single character that delimits a key hierarchy for nested indexing. Default is a period (.)</para>
				<para>This value should not appear in the key or hierarchy of keys itself, except to delimit the hierarchy of keys.</para>
			</parameter>
			<parameter name="options" required="no">
				<optionlist>
					<option name="c">
						<para>For keys that reference a JSON array, return
						the number of items in the array.</para>
						<para>This option has no effect on any other type
						of value.</para>
					</option>
				</optionlist>
			</parameter>
		</syntax>
		<description>
			<para>The JSON_DECODE function retrieves the value of the given variable name
			and parses it as JSON, returning the value at a specified key. If the key cannot
			be found, an empty string is returned.</para>
		</description>
		<see-also>
			<ref type="function">CURL</ref>
		</see-also>
	</function>
<module language="en_US" name="func_lock">
	<support_level>core</support_level>
</module>
	<function name="LOCK" language="en_US" module="func_lock">
		<since>
			<version>1.6.0</version>
		</since>
		<synopsis>
			Attempt to obtain a named mutex.
		</synopsis>
		<syntax>
			<parameter name="lockname" required="true" />
		</syntax>
		<description>
			<para>Attempts to grab a named lock exclusively, and prevents other channels from
			obtaining the same lock.  LOCK will wait for the lock to become available.
			Returns <literal>1</literal> if the lock was obtained or <literal>0</literal> on error.</para>
			<note><para>To avoid the possibility of a deadlock, LOCK will only attempt to
			obtain the lock for 3 seconds if the channel already has another lock.</para></note>
			<note>
				<para>If <literal>live_dangerously</literal> in <literal>asterisk.conf</literal>
				is set to <literal>no</literal>, this function can only be executed from the
				dialplan, and not directly from external protocols.</para>
			</note>
		</description>
		<see-also>
			<ref type="function">TRYLOCK</ref>
			<ref type="function">UNLOCK</ref>
		</see-also>
	</function>
	<function name="TRYLOCK" language="en_US" module="func_lock">
		<since>
			<version>1.6.0</version>
		</since>
		<synopsis>
			Attempt to obtain a named mutex.
		</synopsis>
		<syntax>
			<parameter name="lockname" required="true" />
		</syntax>
		<description>
			<para>Attempts to grab a named lock exclusively, and prevents other channels
			from obtaining the same lock.  Returns <literal>1</literal> if the lock was
			available or <literal>0</literal> otherwise.</para>
			<note>
				<para>If <literal>live_dangerously</literal> in <literal>asterisk.conf</literal>
				is set to <literal>no</literal>, this function can only be executed from the
				dialplan, and not directly from external protocols.</para>
			</note>
		</description>
		<see-also>
			<ref type="function">LOCK</ref>
			<ref type="function">UNLOCK</ref>
		</see-also>
	</function>
	<function name="UNLOCK" language="en_US" module="func_lock">
		<since>
			<version>1.6.0</version>
		</since>
		<synopsis>
			Unlocks a named mutex.
		</synopsis>
		<syntax>
			<parameter name="lockname" required="true" />
		</syntax>
		<description>
			<para>Unlocks a previously locked mutex. Returns <literal>1</literal> if the channel
			had a lock or <literal>0</literal> otherwise.</para>
			<note><para>It is generally unnecessary to unlock in a hangup routine, as any locks
			held are automatically freed when the channel is destroyed.</para></note>
			<note>
				<para>If <literal>live_dangerously</literal> in <literal>asterisk.conf</literal>
				is set to <literal>no</literal>, this function can only be executed from the
				dialplan, and not directly from external protocols.</para>
			</note>
		</description>
		<see-also>
			<ref type="function">LOCK</ref>
			<ref type="function">TRYLOCK</ref>
		</see-also>
	</function>
<module language="en_US" name="func_logic">
	<support_level>core</support_level>
</module>
	<function name="ISNULL" language="en_US" module="func_logic">
		<since>
			<version>1.2.0</version>
		</since>
		<synopsis>
			Check if a value is NULL.
		</synopsis>
		<syntax>
			<parameter name="data" required="true" />
		</syntax>
		<description>
			<para>Returns <literal>1</literal> if NULL or <literal>0</literal> otherwise.</para>
		</description>
	</function>
	<function name="SET" language="en_US" module="func_logic">
		<since>
			<version>1.2.0</version>
		</since>
		<synopsis>
			SET assigns a value to a channel variable.
		</synopsis>
		<syntax argsep="=">
			<parameter name="varname" required="true" />
			<parameter name="value" />
		</syntax>
		<description>
		</description>
	</function>
	<function name="EXISTS" language="en_US" module="func_logic">
		<since>
			<version>1.2.0</version>
		</since>
		<synopsis>
			Test the existence of a value.
		</synopsis>
		<syntax>
			<parameter name="data" required="true" />
		</syntax>
		<description>
			<para>Returns <literal>1</literal> if exists, <literal>0</literal> otherwise.</para>
		</description>
	</function>
	<function name="IF" language="en_US" module="func_logic">
		<since>
			<version>1.2.0</version>
		</since>
		<synopsis>
			Check for an expression.
		</synopsis>
		<syntax argsep="?">
			<parameter name="expression" required="true" />
			<parameter name="retvalue" argsep=":" required="true">
				<argument name="true" />
				<argument name="false" />
			</parameter>
		</syntax>
		<description>
			<para>Returns the data following <literal>?</literal> if true, else the data following <literal>:</literal></para>
		</description>
	</function>
	<function name="IFTIME" language="en_US" module="func_logic">
		<since>
			<version>1.2.0</version>
		</since>
		<synopsis>
			Temporal Conditional.
		</synopsis>
		<syntax argsep="?">
			<parameter name="timespec" required="true" />
			<parameter name="retvalue" required="true" argsep=":">
				<argument name="true" />
				<argument name="false" />
			</parameter>
		</syntax>
		<description>
			<para>Returns the data following <literal>?</literal> if true, else the data following <literal>:</literal></para>
		</description>
	</function>
	<function name="IMPORT" language="en_US" module="func_logic">
		<since>
			<version>1.6.0</version>
		</since>
		<synopsis>
			Retrieve the value of a variable from another channel.
		</synopsis>
		<syntax>
			<parameter name="channel" required="true" />
			<parameter name="variable" required="true" />
		</syntax>
		<description>
		</description>
	</function>
	<function name="DELETE" language="en_US" module="func_logic">
		<since>
			<version>18.21.0</version>
			<version>20.6.0</version>
			<version>21.1.0</version>
		</since>
		<synopsis>
			Deletes a specified channel variable.
		</synopsis>
		<syntax>
			<parameter name="varname" required="true">
				<para>Channel variable name</para>
			</parameter>
		</syntax>
		<description>
			<para>Delete the channel variable specified in <replaceable>varname</replaceable>.
			Will succeed if the channel variable exists or not.</para>
		</description>
		<see-also>
			<ref type="function">GLOBAL_DELETE</ref>
		</see-also>
	</function>
	<function name="VARIABLE_EXISTS" language="en_US" module="func_logic">
		<since>
			<version>18.21.0</version>
			<version>20.6.0</version>
			<version>21.1.0</version>
		</since>
		<synopsis>
			Check if a dialplan variable exists or not.
		</synopsis>
		<syntax>
			<parameter name="varname" required="true">
				<para>Channel variable name</para>
			</parameter>
		</syntax>
		<description>
			<para>Returns <literal>1</literal> if channel variable exists or <literal>0</literal> otherwise.</para>
		</description>
		<see-also>
			<ref type="function">GLOBAL_EXISTS</ref>
		</see-also>
	</function>
<module language="en_US" name="func_math">
	<support_level>core</support_level>
</module>
	<function name="MATH" language="en_US" module="func_math">
		<since>
			<version>1.2.0</version>
		</since>
		<synopsis>
			Performs Mathematical Functions.
		</synopsis>
		<syntax>
			<parameter name="expression" required="true">
				<para>Is of the form:
				<replaceable>number1</replaceable><replaceable>op</replaceable><replaceable>number2</replaceable>
				where the possible values for <replaceable>op</replaceable>
				are:</para>
				<para>+,-,/,*,%,&lt;&lt;,&gt;&gt;,^,AND,OR,XOR,&lt;,&gt;,&lt;=,&gt;=,== (and behave as their C equivalents)</para>
			</parameter>
			<parameter name="type">
				<para>Wanted type of result:</para>
				<para>f, float - float(default)</para>
				<para>i, int - integer</para>
				<para>h, hex - hex</para>
				<para>c, char - char</para>
			</parameter>
		</syntax>
		<description>
			<para>Performs mathematical functions based on two parameters and an operator.  The returned
			value type is <replaceable>type</replaceable></para>
			<example title="Sets var i to 11">
			same => n,Set(i=${MATH(123%16,int)})
			</example>
		</description>
	</function>
	<function name="INC" language="en_US" module="func_math">
		<since>
			<version>1.8.0</version>
		</since>
		<synopsis>
			Increments the value of a variable, while returning the updated value to the dialplan
		</synopsis>
		<syntax>
			<parameter name="variable" required="true">
				<para>
				The variable name to be manipulated, without the braces.
				</para>
			</parameter>
		</syntax>
		<description>
			<para>Increments the value of a variable, while returning the updated value to the dialplan</para>
			<para>Example: INC(MyVAR) - Increments MyVar</para>
			<para>Note: INC(${MyVAR}) - Is wrong, as INC expects the variable name, not its value</para>
		</description>
	</function>
	<function name="DEC" language="en_US" module="func_math">
		<since>
			<version>1.8.0</version>
		</since>
		<synopsis>
			Decrements the value of a variable, while returning the updated value to the dialplan
		</synopsis>
		<syntax>
			<parameter name="variable" required="true">
				<para>
				The variable name to be manipulated, without the braces.
				</para>
			</parameter>
		</syntax>
		<description>
			<para>Decrements the value of a variable, while returning the updated value to the dialplan</para>
			<example title="Decrements MyVAR">
			same => n,NoOp(${DEC(MyVAR)})
			</example>
			<note><para>DEC(${MyVAR}) is wrong, as DEC expects the variable name, not its value</para></note>
		</description>
	</function>
	<function name="MIN" language="en_US" module="func_math">
		<since>
			<version>16.19.0</version>
			<version>18.5.0</version>
		</since>
		<synopsis>
			Returns the minimum of two numbers.
		</synopsis>
		<syntax>
			<parameter name="num1" />
			<parameter name="num2" />
		</syntax>
		<description>
			<para>Returns the minimum of two numbers <replaceable>num1</replaceable> and <replaceable>num2</replaceable>.</para>
			<example title="Sets the min variable equal to 4">
			same => n,Set(min=${MIN(7,4)})
			</example>
		</description>
	</function>
	<function name="MAX" language="en_US" module="func_math">
		<since>
			<version>16.19.0</version>
			<version>18.5.0</version>
		</since>
		<synopsis>
			Returns the maximum of two numbers.
		</synopsis>
		<syntax>
			<parameter name="num1" />
			<parameter name="num2" />
		</syntax>
		<description>
			<para>Returns the maximum of two numbers <replaceable>num1</replaceable> and <replaceable>num2</replaceable>.</para>
			<example title="Sets the max variable equal to 13">
			same => n,Set(max=${MAX(4,7)})
			</example>
		</description>
	</function>
	<function name="ABS" language="en_US" module="func_math">
		<since>
			<version>16.19.0</version>
			<version>18.5.0</version>
		</since>
		<synopsis>
			Returns absolute value of a number.
		</synopsis>
		<syntax>
			<parameter name="num" />
		</syntax>
		<description>
			<para>Returns the absolute value of a number <replaceable>num</replaceable>.</para>
			<example title="Sets the absval variable equal to 13">
			same => n,Set(absval=${ABS(-13)})
			</example>
		</description>
	</function>
	<function name="DIGIT_SUM" language="en_US" module="func_math">
		<since>
			<version>23.1.0</version>
			<version>22.7.0</version>
			<version>20.17.0</version>
		</since>
		<synopsis>
			Returns the sum of all the digits in a number.
		</synopsis>
		<syntax>
			<parameter name="num" />
		</syntax>
		<description>
			<para>Returns the numeric sum of all the individual digits in a number, summed up.</para>
			<para>This can be useful for computing checksums based on the number,
			where errors are typically digits being off by one.</para>
			<example title="Get the sum of digits in 859">
			same => n,Set(digitsum=${DIGIT_SUM(859)}) ; assigns digitsum=22
			same => n,Set(checksum=$[${digitsum} % 10]) ; assigns checksum=2
			</example>
		</description>
	</function>
<module language="en_US" name="func_md5">
	<support_level>core</support_level>
</module>
	<function name="MD5" language="en_US" module="func_md5">
		<since>
			<version>1.2.0</version>
		</since>
		<synopsis>
			Computes an MD5 digest.
		</synopsis>
		<syntax>
			<parameter name="data" required="true" />
		</syntax>
		<description>
			<para>Computes an MD5 digest.</para>
		</description>
	</function>
<module language="en_US" name="func_module">
	<support_level>core</support_level>
</module>
	<function name="IFMODULE" language="en_US" module="func_module">
		<since>
			<version>1.6.0</version>
		</since>
		<synopsis>
			Checks if an Asterisk module is loaded in memory.
		</synopsis>
		<syntax>
			<parameter name="modulename.so" required="true">
				<para>Module name complete with <literal>.so</literal></para>
			</parameter>
		</syntax>
		<description>
			<para>Checks if a module is loaded. Use the full module name
			as shown by the list in <literal>module list</literal>.
			Returns <literal>1</literal> if module exists in memory, otherwise <literal>0</literal></para>
		</description>
	</function>
<module language="en_US" name="func_odbc">
	<depend>res_odbc</depend>
	<depend>generic_odbc</depend>
	<support_level>core</support_level>
</module>
	<function name="ODBC_FETCH" language="en_US" module="func_odbc">
		<since>
			<version>1.6.0</version>
		</since>
		<synopsis>
			Fetch a row from a multirow query.
		</synopsis>
		<syntax>
			<parameter name="result-id" required="true" />
		</syntax>
		<description>
			<para>For queries which are marked as mode=multirow, the original
			query returns a <replaceable>result-id</replaceable> from which results
			may be fetched.  This function implements the actual fetch of the results.</para>
			<para>This also sets <variable>ODBC_FETCH_STATUS</variable>.</para>
			<variablelist>
				<variable name="ODBC_FETCH_STATUS">
					<value name="SUCESS">
						If rows are available.
					</value>
					<value name="FAILURE">
						If no rows are available.
					</value>
				</variable>
			</variablelist>
		</description>
	</function>
	<application name="ODBCFinish" language="en_US" module="func_odbc">
		<since>
			<version>1.6.0</version>
		</since>
		<synopsis>
			Clear the resultset of a sucessful multirow query.
		</synopsis>
		<syntax>
			<parameter name="result-id" required="true" />
		</syntax>
		<description>
			<para>For queries which are marked as mode=multirow, this will clear
			any remaining rows of the specified resultset.</para>
		</description>
	</application>
	<function name="SQL_ESC" language="en_US" module="func_odbc">
		<since>
			<version>1.4.0</version>
		</since>
		<synopsis>
			Escapes single ticks for use in SQL statements.
		</synopsis>
		<syntax>
			<parameter name="string" required="true" />
		</syntax>
		<description>
			<para>Used in SQL templates to escape data which may contain single ticks
			<literal>'</literal> which are otherwise used to delimit data.</para>
			<example title="Escape example">
			 SELECT foo FROM bar WHERE baz='${SQL_ESC(${ARG1})}'
			</example>
		</description>
	</function>
	<function name="SQL_ESC_BACKSLASHES" language="en_US" module="func_odbc">
		<since>
			<version>16.26.0</version>
			<version>18.12.0</version>
			<version>19.4.0</version>
		</since>
		<synopsis>
			Escapes backslashes for use in SQL statements.
		</synopsis>
		<syntax>
			<parameter name="string" required="true" />
		</syntax>
		<description>
			<para>Used in SQL templates to escape data which may contain backslashes
			<literal>\</literal> which are otherwise used to escape data.</para>
			<example title="Escape with backslashes example">
			SELECT foo FROM bar WHERE baz='${SQL_ESC(${SQL_ESC_BACKSLASHES(${ARG1})})}'
			</example>
		</description>
	</function>
<module language="en_US" name="func_periodic_hook">
	<depend>app_chanspy</depend>
	<depend>func_cut</depend>
	<depend>func_groupcount</depend>
	<depend>func_uri</depend>
	<support_level>core</support_level>
</module>
	<function name="PERIODIC_HOOK" language="en_US" module="func_periodic_hook">
		<since>
			<version>13.0.0</version>
		</since>
		<synopsis>
			Execute a periodic dialplan hook into the audio of a call.
		</synopsis>
		<syntax>
			<parameter name="context" required="true">
				<para>(On Read Only) Context for the hook extension.</para>
			</parameter>
			<parameter name="extension" required="true">
				<para>(On Read Only) The hook extension.</para>
			</parameter>
			<parameter name="interval" required="true">
				<para>(On Read Only) Number of seconds in between hook runs.
				Whole seconds only.</para>
			</parameter>
			<parameter name="hook_id" required="true">
				<para>(On Write Only) The hook ID.</para>
			</parameter>
		</syntax>
		<description>
			<para>For example, you could use this function to enable playing
			a periodic <literal>beep</literal> sound in a call.</para>
			<para/>
			<example title="To turn on">
			same => n,Set(BEEPID=${PERIODIC_HOOK(hooks,beep,180)})
			</example>
			<example title="To turn off">
			same => n,Set(PERIODIC_HOOK(${BEEPID})=off)
			</example>
			<example title="To turn back on again later">
			same => n,Set(PERIODIC_HOOK(${BEEPID})=on)
			</example>
			<para>It is important to note that the hook does not actually
			run on the channel itself.  It runs asynchronously on a new channel.
			Any audio generated by the hook gets injected into the call for
			the channel PERIODIC_HOOK() was set on.</para>
			<para/>
			<para>The hook dialplan will have two variables available.
			<variable>HOOK_CHANNEL</variable> is the channel the hook is
			enabled on.  <variable>HOOK_ID</variable> is the hook ID for
			enabling or disabling the hook.</para>
		</description>
	</function>
<module language="en_US" name="func_pitchshift">
	<support_level>extended</support_level>
</module>
	<function name="PITCH_SHIFT" language="en_US" module="func_pitchshift">
		<since>
			<version>1.8.0</version>
		</since>
		<synopsis>
			Pitch shift both tx and rx audio streams on a channel.
		</synopsis>
		<syntax>
			<parameter name="channel direction" required="true">
				<para>Direction can be either <literal>rx</literal>, <literal>tx</literal>, or
				<literal>both</literal>.  The direction can either be set to a valid floating
				point number between 0.1 and 4.0 or one of the enum values listed below. A value
				of 1.0 has no effect.  Greater than 1 raises the pitch. Lower than 1 lowers
				the pitch.</para>

				<para>The pitch amount can also be set by the following values</para>
				<enumlist>
					<enum name = "highest" />
					<enum name = "higher" />
					<enum name = "high" />
					<enum name = "low" />
					<enum name = "lower" />
					<enum name = "lowest" />
				</enumlist>
			</parameter>
		</syntax>
		<description>
			<para>Examples:</para>
			<example title="Raises pitch an octave">
			exten => 1,1,Set(PITCH_SHIFT(tx)=highest)
			</example>
			<example title="Raises pitch more">
			exten => 1,1,Set(PITCH_SHIFT(rx)=higher)
			</example>
			<example title="Raises pitch">
			exten => 1,1,Set(PITCH_SHIFT(both)=high)
			</example>
			<example title="Lowers pitch">
			exten => 1,1,Set(PITCH_SHIFT(rx)=low)
			</example>
			<example title="Lowers pitch more">
			exten => 1,1,Set(PITCH_SHIFT(tx)=lower)
			</example>
			<example title="Lowers pitch an octave">
			exten => 1,1,Set(PITCH_SHIFT(both)=lowest)
			</example>
			<example title="Lowers pitch">
			exten => 1,1,Set(PITCH_SHIFT(rx)=0.8)
			</example>
			<example title="Raises pitch">
			exten => 1,1,Set(PITCH_SHIFT(tx)=1.5)
			</example>
		</description>
	</function>
<module language="en_US" name="func_pjsip_aor">
	<depend>pjproject</depend>
	<depend>res_pjsip</depend>
	<support_level>core</support_level>
</module>
	<function name="PJSIP_AOR" language="en_US" module="func_pjsip_aor">
		<since>
			<version>13.2.0</version>
		</since>
		<synopsis>
			Get information about a PJSIP AOR
		</synopsis>
		<syntax>
			<parameter name="name" required="true">
				<para>The name of the AOR to query.</para>
			</parameter>
			<parameter name="field" required="true">
				<para>The configuration option for the AOR to query for.
				Supported options are those fields on the
				<replaceable>aor</replaceable> object in
				<filename>pjsip.conf</filename>.</para>
				<note><para>
					When requested with this function, the <literal>contact</literal>
					parameter will return both permanent and dynamic contacts.
				</para></note>
				<note><para>
					The return value of the <literal>contact</literal> parameter is
					one or more internal contact IDs separated by commans.
					To get details about the contact itself, including the URI,
					call the <literal>PJSIP_CONTACT</literal> dialplan function
					with the contact ID and the desired contact parameter.
				</para></note>
				<para>
				</para>
				<para>
				Available Fields:
				</para>
				<enumlist>
					<configOptionToEnum>
						<xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='aor']/configOption)"/>
					</configOptionToEnum>
				</enumlist>
			</parameter>
		</syntax>
		<see-also>
			<ref type="function">PJSIP_CONTACT</ref>
		</see-also>
	</function>
<module language="en_US" name="func_pjsip_contact">
	<depend>pjproject</depend>
	<depend>res_pjsip</depend>
	<support_level>core</support_level>
</module>
	<function name="PJSIP_CONTACT" language="en_US" module="func_pjsip_contact">
		<since>
			<version>13.2.0</version>
		</since>
		<synopsis>
			Get information about a PJSIP contact
		</synopsis>
		<syntax>
			<parameter name="name" required="true">
				<para>
				Contact names are in the form of "aor_id@@hash" for dynamic contacts
				created by the registrar and permanent contacts defined
				in a <literal>contact</literal> parameter in an <literal>aor</literal>
				object.  You can get the "aor_id@@hash" contact ID by calling the
				<literal>PJSIP_AOR()</literal> dialplpan function with the AOR name
				and the <literal>contact</literal> field.  You can then pass the value
				returned to this function.
				</para>
			</parameter>
			<parameter name="field" required="true">
				<para>The configuration option for the contact to query for.
				Supported options are those fields on the
				<replaceable>contact</replaceable> object.</para>
				<enumlist>
					<configOptionToEnum>
						<xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='contact']/configOption)"/>
					</configOptionToEnum>
					<enum name="rtt">
						<para>The RTT of the last qualify</para>
					</enum>
					<enum name="status">
						<para>Status of the contact</para>
					</enum>
				</enumlist>
			</parameter>
		</syntax>
		<see-also>
			<ref type="function">PJSIP_AOR</ref>
		</see-also>
	</function>
<module language="en_US" name="func_pjsip_endpoint">
	<depend>pjproject</depend>
	<depend>res_pjsip</depend>
	<support_level>core</support_level>
</module>
	<function name="PJSIP_ENDPOINT" language="en_US" module="func_pjsip_endpoint">
		<since>
			<version>12.0.0</version>
		</since>
		<synopsis>
			Get information about a PJSIP endpoint
		</synopsis>
		<syntax>
			<parameter name="name" required="true">
				<para>The name of the endpoint to query.</para>
			</parameter>
			<parameter name="field" required="true">
				<para>The configuration option for the endpoint to query for.
				Supported options are those fields on the
				<replaceable>endpoint</replaceable> object in
				<filename>pjsip.conf</filename>.</para>
				<enumlist>
					<configOptionToEnum>
						<xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption)"/>
					</configOptionToEnum>
				</enumlist>
			</parameter>
		</syntax>
	</function>
<module language="en_US" name="func_presencestate">
	<support_level>core</support_level>
</module>
	<function name="PRESENCE_STATE" language="en_US" module="func_presencestate">
		<since>
			<version>11.0.0</version>
		</since>
		<synopsis>
			Get or Set a presence state.
		</synopsis>
		<syntax>
			<parameter name="provider" required="true">
			  <para>The provider of the presence, such as <literal>CustomPresence</literal></para>
			</parameter>
			<parameter name="field" required="true">
			  <para>Which field of the presence state information is wanted.</para>
			  <optionlist>
				<option name="value">
				  <para>The current presence, such as <literal>away</literal></para>
				</option>
				<option name="subtype">
				  <para>Further information about the current presence</para>
				</option>
			    <option name="message">
				  <para>A custom message that may indicate further details about the presence</para>
				</option>
			  </optionlist>
			</parameter>
			<parameter name="options" required="false">
			  <optionlist>
			    <option name="e">
				  <para>On Write - Use this option when the subtype and message provided are Base64
					encoded. The values will be stored encoded within Asterisk, but all consumers of
					the presence state (e.g. the SIP presence event package) will receive decoded values.</para>
					<para>On Read - Retrieves unencoded message/subtype in Base64 encoded form.</para>
				</option>
			  </optionlist>
			</parameter>
		</syntax>
		<description>
			<para>The PRESENCE_STATE function can be used to retrieve the presence from any
			presence provider. For example:</para>
			<para>NoOp(SIP/mypeer has presence ${PRESENCE_STATE(SIP/mypeer,value)})</para>
			<para>NoOp(Conference number 1234 has presence message ${PRESENCE_STATE(MeetMe:1234,message)})</para>
			<para>The PRESENCE_STATE function can also be used to set custom presence state from
			the dialplan.  The <literal>CustomPresence:</literal> prefix must be used. For example:</para>
			<para>Set(PRESENCE_STATE(CustomPresence:lamp1)=away,temporary,Out to lunch)</para>
			<para>Set(PRESENCE_STATE(CustomPresence:lamp2)=dnd,,Trying to get work done)</para>
			<para>Set(PRESENCE_STATE(CustomPresence:lamp3)=xa,T24gdmFjYXRpb24=,,e)</para>
			<para>Set(BASE64_LAMP3_PRESENCE=${PRESENCE_STATE(CustomPresence:lamp3,subtype,e)})</para>
			<para>You can subscribe to the status of a custom presence state using a hint in
			the dialplan:</para>
			<para>exten => 1234,hint,,CustomPresence:lamp1</para>
			<para>The possible values for both uses of this function are:</para>
			<para>not_set | unavailable | available | away | xa | chat | dnd</para>
		</description>
	</function>
<module language="en_US" name="func_rand">
	<support_level>core</support_level>
</module>
	<function name="RAND" language="en_US" module="func_rand">
		<since>
			<version>1.4.0</version>
		</since>
		<synopsis>
			Choose a random number in a range.
		</synopsis>
		<syntax>
			<parameter name="min" />
			<parameter name="max" />
		</syntax>
		<description>
			<para>Choose a random number between <replaceable>min</replaceable> and <replaceable>max</replaceable>.
			<replaceable>min</replaceable> defaults to <literal>0</literal>, if not specified, while <replaceable>max</replaceable> defaults
			to <literal>RAND_MAX</literal> (2147483647 on many systems).</para>
			<example title="Set random number between 1 and 8, inclusive">
			exten => s,1,Set(junky=${RAND(1,8)})
			</example>
		</description>
	</function>
<module language="en_US" name="func_realtime">
	<support_level>core</support_level>
</module>
	<function name="REALTIME" language="en_US" module="func_realtime">
		<since>
			<version>1.4.0</version>
		</since>
		<synopsis>
			RealTime Read/Write Functions.
		</synopsis>
		<syntax>
			<parameter name="family" required="true" />
			<parameter name="fieldmatch" required="true" />
			<parameter name="matchvalue" />
			<parameter name="delim1|field">
				<para>Use <replaceable>delim1</replaceable> with <replaceable>delim2</replaceable> on
				read and <replaceable>field</replaceable> without <replaceable>delim2</replaceable> on
				write</para>
				<para>If we are reading and <replaceable>delim1</replaceable> is not specified, defaults
				to <literal>,</literal></para>
			</parameter>
			<parameter name="delim2">
				<para>Parameter only used when reading, if not specified defaults to <literal>=</literal></para>
			</parameter>
		</syntax>
		<description>
			<para>This function will read or write values from/to a RealTime repository.
			REALTIME(....) will read names/values from the repository, and
			REALTIME(....)= will write a new value/field to the repository. On a
			read, this function returns a delimited text string. The name/value
			pairs are delimited by <replaceable>delim1</replaceable>, and the name and value are delimited
			between each other with delim2.
			If there is no match, NULL will be returned by the function.
			On a write, this function will always return NULL.</para>
		</description>
		<see-also>
			<ref type="function">REALTIME_STORE</ref>
			<ref type="function">REALTIME_DESTROY</ref>
			<ref type="function">REALTIME_FIELD</ref>
			<ref type="function">REALTIME_HASH</ref>
		</see-also>
	</function>
	<function name="REALTIME_STORE" language="en_US" module="func_realtime">
		<since>
			<version>1.6.0</version>
		</since>
		<synopsis>
			RealTime Store Function.
		</synopsis>
		<syntax>
			<parameter name="family" required="true" />
			<parameter name="field1" required="true" />
			<parameter name="fieldN" required="true" multiple="true" />
			<parameter name="field30" required="true" />
		</syntax>
		<description>
			<para>This function will insert a new set of values into the RealTime repository.
			If RT engine provides an unique ID of the stored record, REALTIME_STORE(...)=..
			creates channel variable named RTSTOREID, which contains value of unique ID.
			Currently, a maximum of 30 field/value pairs is supported.</para>
		</description>
		<see-also>
			<ref type="function">REALTIME</ref>
			<ref type="function">REALTIME_DESTROY</ref>
			<ref type="function">REALTIME_FIELD</ref>
			<ref type="function">REALTIME_HASH</ref>
		</see-also>
	</function>
	<function name="REALTIME_DESTROY" language="en_US" module="func_realtime">
		<since>
			<version>1.6.0</version>
		</since>
		<synopsis>
			RealTime Destroy Function.
		</synopsis>
		<syntax>
			<parameter name="family" required="true" />
			<parameter name="fieldmatch" required="true" />
			<parameter name="matchvalue" />
			<parameter name="delim1" />
			<parameter name="delim2" />
		</syntax>
		<description>
			<para>This function acts in the same way as REALTIME(....) does, except that
			it destroys the matched record in the RT engine.</para>
			<note>
				<para>If <literal>live_dangerously</literal> in <literal>asterisk.conf</literal>
				is set to <literal>no</literal>, this function can only be read from the
				dialplan, and not directly from external protocols. It can, however, be
				executed as a write operation (<literal>REALTIME_DESTROY(family, fieldmatch)=ignored</literal>)</para>
			</note>
		</description>
		<see-also>
			<ref type="function">REALTIME</ref>
			<ref type="function">REALTIME_STORE</ref>
			<ref type="function">REALTIME_FIELD</ref>
			<ref type="function">REALTIME_HASH</ref>
		</see-also>
	</function>
	<function name="REALTIME_FIELD" language="en_US" module="func_realtime">
		<since>
			<version>1.6.2.0</version>
		</since>
		<synopsis>
			RealTime query function.
		</synopsis>
		<syntax>
			<parameter name="family" required="true" />
			<parameter name="fieldmatch" required="true" />
			<parameter name="matchvalue" required="true" />
			<parameter name="fieldname" required="true" />
		</syntax>
		<description>
			<para>This function retrieves a single item, <replaceable>fieldname</replaceable>
			from the RT engine, where <replaceable>fieldmatch</replaceable> contains the value
			<replaceable>matchvalue</replaceable>.  When written to, the REALTIME_FIELD() function
			performs identically to the REALTIME() function.</para>
		</description>
		<see-also>
			<ref type="function">REALTIME</ref>
			<ref type="function">REALTIME_STORE</ref>
			<ref type="function">REALTIME_DESTROY</ref>
			<ref type="function">REALTIME_HASH</ref>
		</see-also>
	</function>
	<function name="REALTIME_HASH" language="en_US" module="func_realtime">
		<since>
			<version>1.6.2.0</version>
		</since>
		<synopsis>
			RealTime query function.
		</synopsis>
		<syntax>
			<parameter name="family" required="true" />
			<parameter name="fieldmatch" required="true" />
			<parameter name="matchvalue" required="true" />
		</syntax>
		<description>
			<para>This function retrieves a single record from the RT engine, where
			<replaceable>fieldmatch</replaceable> contains the value
			<replaceable>matchvalue</replaceable> and formats the output suitably, such that
			it can be assigned to the HASH() function.  The HASH() function then provides
			a suitable method for retrieving each field value of the record.</para>
		</description>
		<see-also>
			<ref type="function">REALTIME</ref>
			<ref type="function">REALTIME_STORE</ref>
			<ref type="function">REALTIME_DESTROY</ref>
			<ref type="function">REALTIME_FIELD</ref>
		</see-also>
	</function>
<module language="en_US" name="func_sayfiles">
	<support_level>extended</support_level>
</module>
	<function name="SAYFILES" language="en_US" module="func_sayfiles">
		<since>
			<version>16.21.0</version>
			<version>18.7.0</version>
		</since>
		<synopsis>
			Returns the ampersand-delimited file names that would be played by the Say applications (e.g. SayAlpha, SayDigits).
		</synopsis>
		<syntax>
			<parameter name="value" required="true">
				<para>The value to be translated to filenames.</para>
			</parameter>
			<parameter name="type">
				<para>Say application type.</para>
				<enumlist>
					<enum name="alpha">
						<para>Files played by SayAlpha(). Default if none is specified.</para>
					</enum>
					<enum name="digits">
						<para>Files played by SayDigits().</para>
					</enum>
					<enum name="money">
						<para>Files played by SayMoney(). Currently supported for English and US dollars only.</para>
					</enum>
					<enum name="number">
						<para>Files played by SayNumber(). Currently supported for English only.</para>
					</enum>
					<enum name="ordinal">
						<para>Files played by SayOrdinal(). Currently supported for English only.</para>
					</enum>
					<enum name="phonetic">
						<para>Files played by SayPhonetic().</para>
					</enum>
				</enumlist>
			</parameter>
		</syntax>
		<description>
			<para>Returns the files that would be played by a Say application. These filenames could then be
			passed directly into Playback, BackGround, Read, Queue, or any application which supports
			playback of multiple ampersand-delimited files.</para>
			<example title="Read using the number 123">
			 same => n,Read(response,${SAYFILES(123,number)})
			</example>
		</description>
		<see-also>
			<ref type="application">SayAlpha</ref>
			<ref type="application">SayDigits</ref>
			<ref type="application">SayMoney</ref>
			<ref type="application">SayNumber</ref>
			<ref type="application">SayOrdinal</ref>
			<ref type="application">SayPhonetic</ref>
		</see-also>
	</function>
<module language="en_US" name="func_scramble">
	<support_level>extended</support_level>
</module>
	<function name="SCRAMBLE" language="en_US" module="func_scramble">
		<since>
			<version>16.21.0</version>
			<version>18.7.0</version>
		</since>
		<synopsis>
			Scrambles audio on a channel.
		</synopsis>
		<syntax>
			<parameter name="direction" required="false">
				<para>Must be <literal>TX</literal> or <literal>RX</literal>
				to limit to a specific direction, or <literal>both</literal>
				for both directions. <literal>remove</literal>
				will remove an existing scrambler.</para>
			</parameter>
		</syntax>
		<description>
			<para>Scrambles audio on a channel using whole spectrum inversion.
			This is not intended to be used for securely scrambling
			audio. It merely renders obfuscates audio on a channel
			to render it unintelligible, as a privacy enhancement.</para>
			<example title="Scramble speech in both directions">
			same => n,Set(SCRAMBLE()=both)
			</example>
		</description>
		<see-also>
			<ref type="application">ChanSpy</ref>
		</see-also>
	</function>
<module language="en_US" name="func_sha1">
	<support_level>core</support_level>
</module>
	<function name="SHA1" language="en_US" module="func_sha1">
		<since>
			<version>1.4.0</version>
		</since>
		<synopsis>
			Computes a SHA1 digest.
		</synopsis>
		<syntax>
			<parameter name="data" required="true">
				<para>Input string</para>
			</parameter>
		</syntax>
		<description>
			<para>Generate a SHA1 digest via the SHA1 algorythm.</para>
			<example title="Set sha1hash variable to SHA1 hash of junky">
			exten => s,1,Set(sha1hash=${SHA1(junky)})
			</example>
			<para>The example above sets the asterisk variable sha1hash to the string <literal>60fa5675b9303eb62f99a9cd47f9f5837d18f9a0</literal>
			which is known as its hash</para>
		</description>
	</function>
<module language="en_US" name="func_shell">
	<support_level>core</support_level>
</module>
	<function name="SHELL" language="en_US" module="func_shell">
		<since>
			<version>1.6.0</version>
		</since>
		<synopsis>
			Executes a command using the system shell and captures its output.
		</synopsis>
		<syntax>
			<parameter name="command" required="true">
				<para>The command that the shell should execute.</para>
				<warning><para>Do not use untrusted strings such as <variable>CALLERID(num)</variable>
				or <variable>CALLERID(name)</variable> as part of the command parameters.  You
				risk a command injection attack executing arbitrary commands if the untrusted
				strings aren't filtered to remove dangerous characters.  See function
				<variable>FILTER()</variable>.</para></warning>
			</parameter>
		</syntax>
		<description>
			<para>Collects the output generated by a command executed by the system shell</para>
			<example title="Shell example">
			exten => s,1,Set(foo=${SHELL(echo bar)})
			</example>
			<note>
				<para>The command supplied to this function will be executed by the
				system's shell, typically specified in the SHELL environment variable. There
				are many different system shells available with somewhat different behaviors,
				so the output generated by this function may vary between platforms.</para>

				<para>If <literal>live_dangerously</literal> in <literal>asterisk.conf</literal>
				is set to <literal>no</literal>, this function can only be executed from the
				dialplan, and not directly from external protocols.</para>
			</note>
		</description>

	</function>
<module language="en_US" name="func_sorcery">
	<support_level>core</support_level>
</module>
	<function name="AST_SORCERY" language="en_US" module="func_sorcery">
		<since>
			<version>12.2.0</version>
		</since>
		<synopsis>
			Get a field from a sorcery object
		</synopsis>
		<syntax>
			<parameter name="module_name" required="true">
				<para>The name of the module owning the sorcery instance.</para>
			</parameter>
			<parameter name="object_type" required="true">
				<para>The type of object to query.</para>
			</parameter>
			<parameter name="object_id" required="true">
				<para>The id of the object to query.</para>
			</parameter>
			<parameter name="field_name" required="true">
				<para>The name of the field.</para>
			</parameter>
			<parameter name="retrieval_method" required="false">
				<para>Fields that have multiple occurrences may be retrieved in two ways.</para>
				<enumlist>
					<enum name="concat"><para>Returns all matching fields concatenated
					in a single string separated by <replaceable>separator</replaceable>
					which defaults to <literal>,</literal>.</para></enum>

					<enum name="single"><para>Returns the nth occurrence of the field
					as specified by <replaceable>occurrence_number</replaceable> which defaults to <literal>1</literal>.
					</para></enum>
				</enumlist>
				<para>The default is <literal>concat</literal> with separator <literal>,</literal>.</para>
			</parameter>
			<parameter name="retrieval_details" required="false">
				<para>Specifies either the separator for <literal>concat</literal>
				or the occurrence number for <literal>single</literal>.</para>
			</parameter>
		</syntax>
	</function>
<module language="en_US" name="func_speex">
	<depend>speex</depend>
	<depend>speex_preprocess</depend>
	<use type="external">speexdsp</use>
	<support_level>core</support_level>
</module>
	<function name="AGC" language="en_US" module="func_speex">
		<since>
			<version>1.6.1.0</version>
		</since>
		<synopsis>
			Apply automatic gain control to audio on a channel.
		</synopsis>
		<syntax>
			<parameter name="channeldirection" required="true">
				<para>This can be either <literal>rx</literal> or <literal>tx</literal></para>
			</parameter>
		</syntax>
		<description>
			<para>The AGC function will apply automatic gain control to the audio on the
			channel that it is executed on. Using <literal>rx</literal> for audio received
			and <literal>tx</literal> for audio transmitted to the channel. When using this
			function you set a target audio level. It is primarily intended for use with
			analog lines, but could be useful for other channels as well. The target volume
			is set with a number between <literal>1-32768</literal>. The larger the number
			the louder (more gain) the channel will receive.</para>
			<example title="Apply automatic gain control">
			exten => 1,1,Set(AGC(rx)=8000)
			exten => 1,2,Set(AGC(tx)=off)
			</example>
		</description>
	</function>
	<function name="DENOISE" language="en_US" module="func_speex">
		<since>
			<version>1.6.1.0</version>
		</since>
		<synopsis>
			Apply noise reduction to audio on a channel.
		</synopsis>
		<syntax>
			<parameter name="channeldirection" required="true">
				<para>This can be either <literal>rx</literal> or <literal>tx</literal>
				the values that can be set to this are either <literal>on</literal> and
				<literal>off</literal></para>
			</parameter>
		</syntax>
		<description>
			<para>The DENOISE function will apply noise reduction to audio on the channel
			that it is executed on. It is very useful for noisy analog lines, especially
			when adjusting gains or using AGC. Use <literal>rx</literal> for audio received from the channel
			and <literal>tx</literal> to apply the filter to the audio being sent to the channel.</para>
			<example title="Apply noise reduction">
			exten => 1,1,Set(DENOISE(rx)=on)
			exten => 1,2,Set(DENOISE(tx)=off)
			</example>
		</description>
	</function>
<module language="en_US" name="func_sprintf">
	<support_level>core</support_level>
</module>
	<function name="SPRINTF" language="en_US" module="func_sprintf">
		<since>
			<version>1.6.1.0</version>
		</since>
		<synopsis>
			Format a variable according to a format string.
		</synopsis>
		<syntax>
			<parameter name="format" required="true" />
			<parameter name="arg1" required="true" />
			<parameter name="arg2" multiple="true" />
			<parameter name="argN" />
		</syntax>
		<description>
			<para>Parses the format string specified and returns a string matching
			that format. Supports most options found in <emphasis>sprintf(3)</emphasis>.
			Returns a shortened string if a format specifier is not recognized.</para>
		</description>
		<see-also>
			<ref type="manpage">sprintf(3)</ref>
		</see-also>
	</function>
<module language="en_US" name="func_srv">
	<support_level>core</support_level>
</module>
	<function name="SRVQUERY" language="en_US" module="func_srv">
		<since>
			<version>1.8.0</version>
		</since>
		<synopsis>
			Initiate an SRV query.
		</synopsis>
		<syntax>
			<parameter name="service" required="true">
				<para>The service for which to look up SRV records. An example would be something
				like <literal>_sip._udp.example.com</literal></para>
			</parameter>
		</syntax>
		<description>
			<para>This will do an SRV lookup of the given service.</para>
		</description>
	</function>
	<function name="SRVRESULT" language="en_US" module="func_srv">
		<since>
			<version>1.8.0</version>
		</since>
		<synopsis>
			Retrieve results from an SRVQUERY.
		</synopsis>
		<syntax>
			<parameter name="id" required="true">
				<para>The identifier returned by the SRVQUERY function.</para>
			</parameter>
			<parameter name="resultnum" required="true">
				<para>The number of the result that you want to retrieve.</para>
				<para>Results start at <literal>1</literal>. If this argument is specified
				as <literal>getnum</literal>, then it will return the total number of results
				that are available.</para>
			</parameter>
			<parameter name="field" required="false">
				<para>The field of the result to retrieve.</para>
				<para>The fields that can be retrieved are:</para>
				<enumlist>
					<enum name="host"/>
					<enum name="port"/>
					<enum name="priority"/>
					<enum name="weight"/>
				</enumlist>
			</parameter>
		</syntax>
		<description>
			<para>This function will retrieve results from a previous use
			of the SRVQUERY function.</para>
		</description>
	</function>
<module language="en_US" name="func_strings">
	<support_level>core</support_level>
</module>
	<function name="FIELDQTY" language="en_US" module="func_strings">
		<since>
			<version>1.2.0</version>
		</since>
		<synopsis>
			Count the fields with an arbitrary delimiter
		</synopsis>
		<syntax>
			<parameter name="varname" required="true" />
			<parameter name="delim" required="true" />
		</syntax>
		<description>
			<para>The delimiter may be specified as a special or extended ASCII character, by encoding it.  The characters
			<literal>\n</literal>, <literal>\r</literal>, and <literal>\t</literal> are all recognized as the newline,
			carriage return, and tab characters, respectively.  Also, octal and hexadecimal specifications are recognized
			by the patterns <literal>\0nnn</literal> and <literal>\xHH</literal>, respectively.  For example, if you wanted
			to encode a comma as the delimiter, you could use either <literal>\054</literal> or <literal>\x2C</literal>.</para>
			<example title="Prints 3">
			exten => s,1,Set(example=ex-amp-le)
				same => n,NoOp(${FIELDQTY(example,-)})
			</example>
		</description>
	</function>
	<function name="FIELDNUM" language="en_US" module="func_strings">
		<since>
			<version>10.0.0</version>
		</since>
		<synopsis>
			Return the 1-based offset of a field in a list
		</synopsis>
		<syntax>
			<parameter name="varname" required="true" />
			<parameter name="delim" required="true" />
			<parameter name="value" required="true" />
		</syntax>
		<description>
			<para>Search the variable named <replaceable>varname</replaceable> for the string <replaceable>value</replaceable>
			delimited by <replaceable>delim</replaceable> and return a 1-based offset as to its location. If not found
			or an error occured, return <literal>0</literal>.</para>
			<para>The delimiter may be specified as a special or extended ASCII character, by encoding it.  The characters
			<literal>\n</literal>, <literal>\r</literal>, and <literal>\t</literal> are all recognized as the newline,
			carriage return, and tab characters, respectively.  Also, octal and hexadecimal specifications are recognized
			by the patterns <literal>\0nnn</literal> and <literal>\xHH</literal>, respectively.  For example, if you wanted
			to encode a comma as the delimiter, you could use either <literal>\054</literal> or <literal>\x2C</literal>.</para>
			<example title="Prints 2">
			exten => s,1,Set(example=ex-amp-le)
				same => n,NoOp(${FIELDNUM(example,-,amp)})
			</example>
		</description>
	</function>
	<function name="LISTFILTER" language="en_US" module="func_strings">
		<since>
			<version>1.6.2.0</version>
		</since>
		<synopsis>Remove an item from a list, by name.</synopsis>
		<syntax>
			<parameter name="varname" required="true" />
			<parameter name="delim" required="true" default="," />
			<parameter name="value" required="true" />
		</syntax>
		<description>
			<para>Remove <replaceable>value</replaceable> from the list contained in the <replaceable>varname</replaceable>
			variable, where the list delimiter is specified by the <replaceable>delim</replaceable> parameter.  This is
			very useful for removing a single channel name from a list of channels, for example.</para>
		</description>
	</function>
	<function name="FILTER" language="en_US" module="func_strings">
		<since>
			<version>1.2.40</version>
		</since>
		<synopsis>
			Filter the string to include only the allowed characters
		</synopsis>
		<syntax>
			<parameter name="allowed-chars" required="true" />
			<parameter name="string" required="true" />
		</syntax>
		<description>
			<para>Permits all characters listed in <replaceable>allowed-chars</replaceable>,
			filtering all others outs. In addition to literally listing the characters,
			you may also use ranges of characters (delimited by a <literal>-</literal></para>
			<para>Hexadecimal characters started with a <literal>\x</literal>(i.e. \x20)</para>
			<para>Octal characters started with a <literal>\0</literal> (i.e. \040)</para>
			<para>Also <literal>\t</literal>,<literal>\n</literal> and <literal>\r</literal> are recognized.</para>
			<note><para>If you want the <literal>-</literal> character it needs to be prefixed with a
			<literal>\</literal></para></note>
		</description>
	</function>
	<function name="REPLACE" language="en_US" module="func_strings">
		<since>
			<version>1.8.0</version>
		</since>
		<synopsis>
			Replace a set of characters in a given string with another character.
		</synopsis>
		<syntax>
			<parameter name="varname" required="true" />
			<parameter name="find-chars" required="true" />
			<parameter name="replace-char" required="false" />
		</syntax>
		<description>
			<para>Iterates through a string replacing all the <replaceable>find-chars</replaceable> with
			<replaceable>replace-char</replaceable>.  <replaceable>replace-char</replaceable> may be either
			empty or contain one character.  If empty, all <replaceable>find-chars</replaceable> will be
			deleted from the output.</para>
			<note><para>The replacement only occurs in the output.  The original variable is not
			altered.</para></note>
		</description>
	</function>
	<function name="STRREPLACE" language="en_US" module="func_strings">
		<since>
			<version>10.0.0</version>
		</since>
		<synopsis>
			Replace instances of a substring within a string with another string.
		</synopsis>
		<syntax>
			<parameter name="varname" required="true" />
			<parameter name="find-string" required="true" />
			<parameter name="replace-string" required="false" />
			<parameter name="max-replacements" required="false" />
		</syntax>
		<description>
			<para>Searches for all instances of the <replaceable>find-string</replaceable> in provided variable and
			replaces them with <replaceable>replace-string</replaceable>.  If <replaceable>replace-string</replaceable>
			is an empty string, this will effectively delete that substring.  If <replaceable>max-replacements</replaceable>
			is specified, this function will stop after performing replacements <replaceable>max-replacements</replaceable> times.</para>
			<note><para>The replacement only occurs in the output.  The original variable is not altered.</para></note>
		</description>
	</function>
	<function name="STRBETWEEN" language="en_US" module="func_strings">
		<since>
			<version>16.21.0</version>
			<version>18.7.0</version>
		</since>
		<synopsis>
			Inserts a substring between each character in a string.
		</synopsis>
		<syntax>
			<parameter name="varname" required="true" />
			<parameter name="insert-string" required="true" />
		</syntax>
		<description>
			<para>Inserts a substring <replaceable>find-string</replaceable> between each character in
			<replaceable>varname</replaceable>.</para>
			<note><para>The replacement only occurs in the output.  The original variable is not altered.</para></note>
			<example title="Add half-second pause between dialed digits">
				same => n,Set(digits=5551212)
				same => n,SendDTMF(${STRBETWEEN(digits,w)) ; this will send 5w5w5w1w2w1w2
			</example>
		</description>
	</function>
	<function name="TRIM" language="en_US" module="func_strings">
		<since>
			<version>16.30.0</version>
			<version>18.16.0</version>
			<version>19.8.0</version>
			<version>20.1.0</version>
		</since>
		<synopsis>
			Trim leading and trailing whitespace in a string
		</synopsis>
		<syntax>
			<parameter name="string" required="true" />
		</syntax>
		<description>
			<para>Replaces all leading and trailing whitespace in the provided string.</para>
		</description>
		<see-also>
			<ref type="function">LTRIM</ref>
			<ref type="function">RTRIM</ref>
		</see-also>
	</function>
	<function name="LTRIM" language="en_US" module="func_strings">
		<since>
			<version>16.30.0</version>
			<version>18.16.0</version>
			<version>19.8.0</version>
			<version>20.1.0</version>
		</since>
		<synopsis>
			Trim leading whitespace in a string
		</synopsis>
		<syntax>
			<parameter name="string" required="true" />
		</syntax>
		<description>
			<para>Replaces all leading whitespace in the provided string.</para>
		</description>
		<see-also>
			<ref type="function">TRIM</ref>
			<ref type="function">RTRIM</ref>
		</see-also>
	</function>
	<function name="RTRIM" language="en_US" module="func_strings">
		<since>
			<version>16.30.0</version>
			<version>18.16.0</version>
			<version>19.8.0</version>
			<version>20.1.0</version>
		</since>
		<synopsis>
			Trim trailing whitespace in a string
		</synopsis>
		<syntax>
			<parameter name="string" required="true" />
		</syntax>
		<description>
			<para>Replaces all trailing whitespace in the provided string.</para>
		</description>
		<see-also>
			<ref type="function">TRIM</ref>
			<ref type="function">LTRIM</ref>
		</see-also>
	</function>
	<function name="PASSTHRU" language="en_US" module="func_strings">
		<since>
			<version>1.8.0</version>
		</since>
		<synopsis>
			Pass the given argument back as a value.
		</synopsis>
		<syntax>
			<parameter name="string" required="false" />
		</syntax>
		<description>
			<para>Literally returns the given <replaceable>string</replaceable>.  The intent is to permit
			other dialplan functions which take a variable name as an argument to be able to take a literal
			string, instead.</para>
			<note><para>The functions which take a variable name need to be passed var and not
			${var}.  Similarly, use PASSTHRU() and not ${PASSTHRU()}.</para></note>
			<example title="Prints 321">
			exten => s,1,NoOp(${CHANNEL}) ; contains SIP/321-1
				same => n,NoOp(${CUT(PASSTHRU(${CUT(CHANNEL,-,1)}),/,2)})
			</example>
		</description>
	</function>
	<function name="REGEX" language="en_US" module="func_strings">
		<since>
			<version>1.2.0</version>
		</since>
		<synopsis>
			Check string against a regular expression.
		</synopsis>
		<syntax argsep=" ">
			<parameter name="&quot;regular expression&quot;" required="true" />
			<parameter name="string" required="true" />
		</syntax>
		<description>
			<para>Return <literal>1</literal> on regular expression match or <literal>0</literal> otherwise</para>
			<para>Please note that the space following the double quotes separating the
			regex from the data is optional and if present, is skipped. If a space is
			desired at the beginning of the data, then put two spaces there; the second
			will not be skipped.</para>
		</description>
	</function>
	<application name="ClearHash" language="en_US" module="func_strings">
		<since>
			<version>1.6.0</version>
		</since>
		<synopsis>
			Clear the keys from a specified hashname.
		</synopsis>
		<syntax>
			<parameter name="hashname" required="true" />
		</syntax>
		<description>
			<para>Clears all keys out of the specified <replaceable>hashname</replaceable>.</para>
		</description>
	</application>
	<function name="HASH" language="en_US" module="func_strings">
		<since>
			<version>1.6.0</version>
		</since>
		<synopsis>
			Implementation of a dialplan associative array
		</synopsis>
		<syntax>
			<parameter name="hashname" required="true" />
			<parameter name="hashkey" />
		</syntax>
		<description>
			<para>In two arguments mode, gets and sets values to corresponding keys within
			a named associative array. The single-argument mode will only work when assigned
			to from a function defined by func_odbc</para>
		</description>
	</function>
	<function name="HASHKEYS" language="en_US" module="func_strings">
		<since>
			<version>1.6.0</version>
		</since>
		<synopsis>
			Retrieve the keys of the HASH() function.
		</synopsis>
		<syntax>
			<parameter name="hashname" required="true" />
		</syntax>
		<description>
			<para>Returns a comma-delimited list of the current keys of the associative array
			defined by the HASH() function. Note that if you iterate over the keys of
			the result, adding keys during iteration will cause the result of the HASHKEYS()
			function to change.</para>
		</description>
	</function>
	<function name="KEYPADHASH" language="en_US" module="func_strings">
		<since>
			<version>1.4.0</version>
		</since>
		<synopsis>
			Hash the letters in string into equivalent keypad numbers.
		</synopsis>
		<syntax>
			<parameter name="string" required="true" />
		</syntax>
		<description>
			<example title="Returns 537">
			exten => s,1,Return(${KEYPADHASH(Les)})
			</example>
		</description>
	</function>
	<function name="ARRAY" language="en_US" module="func_strings">
		<since>
			<version>1.4.0</version>
		</since>
		<synopsis>
			Allows setting multiple variables at once.
		</synopsis>
		<syntax>
			<parameter name="var1" required="true" />
			<parameter name="var2" required="false" multiple="true" />
			<parameter name="varN" required="false" />
		</syntax>
		<description>
			<para>The comma-delimited list passed as a value to which the function is set will
			be interpreted as a set of values to which the comma-delimited list of
			variable names in the argument should be set.</para>
			<example title="Set var1 to 1 and var2 to 2">
			same => n,Set(ARRAY(var1,var2)=1,2)
			</example>
		</description>
	</function>
	<function name="STRPTIME" language="en_US" module="func_strings">
		<since>
			<version>1.4.0</version>
		</since>
		<synopsis>
			Returns the epoch of the arbitrary date/time string structured as described by the format.
		</synopsis>
		<syntax>
			<parameter name="datetime" required="true" />
			<parameter name="timezone" required="true" />
			<parameter name="format" required="true" />
		</syntax>
		<description>
			<para>This is useful for converting a date into <literal>EPOCH</literal> time,
			possibly to pass to an application like SayUnixTime or to calculate the difference
			between the two date strings</para>
			<example title="Prints 1141219835">
			same => n,NoOp(${STRPTIME(2006-03-01 07:30:35,America/Chicago,%Y-%m-%d %H:%M:%S)})
			</example>
		</description>
	</function>
	<function name="STRFTIME" language="en_US" module="func_strings">
		<since>
			<version>1.2.0</version>
		</since>
		<synopsis>
			Returns the current date/time in the specified format.
		</synopsis>
		<syntax>
			<parameter name="epoch" />
			<parameter name="timezone" />
			<parameter name="format" />
		</syntax>
		<description>
			<para>STRFTIME supports all of the same formats as the underlying C function
			<emphasis>strftime(3)</emphasis>.
			It also supports the following format: <literal>%[n]q</literal> - fractions of a second,
			with leading zeros.</para>
			<para>Example: <literal>%3q</literal> will give milliseconds and <literal>%1q</literal>
			will give tenths of a second. The default is set at milliseconds (n=3).
			The common case is to use it in combination with %S, as in <literal>%S.%3q</literal>.</para>
		</description>
		<see-also>
			<ref type="manpage">strftime(3)</ref>
		</see-also>
	</function>
	<function name="EVAL" language="en_US" module="func_strings">
		<since>
			<version>1.2.0</version>
		</since>
		<synopsis>
			Evaluate stored variables
		</synopsis>
		<syntax>
			<parameter name="variable" required="true" />
		</syntax>
		<description>
			<para>Using EVAL basically causes a string to be evaluated twice.
			When a variable or expression is in the dialplan, it will be
			evaluated at runtime. However, if the results of the evaluation
			is in fact another variable or expression, using EVAL will have it
			evaluated a second time.</para>
			<para>Example: If the <variable>MYVAR</variable> contains
			<variable>OTHERVAR</variable>, then the result of ${EVAL(
			<variable>MYVAR</variable>)} in the dialplan will be the
			contents of <variable>OTHERVAR</variable>. Normally just
			putting <variable>MYVAR</variable> in the dialplan the result
			would be <variable>OTHERVAR</variable>.</para>
		</description>
	</function>
	<function name="TOUPPER" language="en_US" module="func_strings">
		<since>
			<version>1.6.0</version>
		</since>
		<synopsis>
			Convert string to all uppercase letters.
		</synopsis>
		<syntax>
			<parameter name="string" required="true" />
		</syntax>
		<description>
			<example title="Prints EXAMPLE">
			exten => s,1,NoOp(${TOUPPER(Example)})
			</example>
		</description>
	</function>
	<function name="TOLOWER" language="en_US" module="func_strings">
		<since>
			<version>1.6.0</version>
		</since>
		<synopsis>
			Convert string to all lowercase letters.
		</synopsis>
		<syntax>
			<parameter name="string" required="true" />
		</syntax>
		<description>
			<example title="Prints example">
			exten => s,1,NoOp(${TOLOWER(Example)})
			</example>
		</description>
	</function>
	<function name="LEN" language="en_US" module="func_strings">
		<since>
			<version>1.2.0</version>
		</since>
		<synopsis>
			Return the length of the string given.
		</synopsis>
		<syntax>
			<parameter name="string" required="true" />
		</syntax>
		<description>
			<example title="Prints 7">
			exten => s,1,NoOp(${LEN(example)})
			</example>
		</description>
	</function>
	<function name="QUOTE" language="en_US" module="func_strings">
		<since>
			<version>1.4.0</version>
		</since>
		<synopsis>
			Quotes a given string, escaping embedded quotes as necessary
		</synopsis>
		<syntax>
			<parameter name="string" required="true" />
		</syntax>
		<description>
			<para>Example: ${QUOTE(ab"c"de)} will return ""ab\"c\"de""</para>
		</description>
	</function>
	<function name="CSV_QUOTE" language="en_US" module="func_strings">
		<since>
			<version>1.8.0</version>
		</since>
		<synopsis>
			Quotes a given string for use in a CSV file, escaping embedded quotes as necessary
		</synopsis>
		<syntax>
			<parameter name="string" required="true" />
		</syntax>
		<description>
			<para>Example: ${CSV_QUOTE("a,b" 123)} will return """a,b"" 123"</para>
		</description>
	</function>
	<function name="SHIFT" language="en_US" module="func_strings">
		<since>
			<version>1.8.0</version>
		</since>
		<synopsis>
			Removes and returns the first item off of a variable containing delimited text
		</synopsis>
		<syntax>
			<parameter name="varname" required="true" />
			<parameter name="delimiter" required="false" default="," />
		</syntax>
		<description>
			<example title="SHIFT example">
			exten => s,1,Set(array=one,two,three)
			exten => s,n,While($["${SET(var=${SHIFT(array)})}" != ""])
			exten => s,n,NoOp(var is ${var})
			exten => s,n,EndWhile
			</example>
			<para>This would iterate over each value in array, left to right, and
				would result in NoOp(var is one), NoOp(var is two), and
				NoOp(var is three) being executed.
			</para>
		</description>
	</function>
	<function name="POP" language="en_US" module="func_strings">
		<since>
			<version>1.8.0</version>
		</since>
		<synopsis>
			Removes and returns the last item off of a variable containing delimited text
		</synopsis>
		<syntax>
			<parameter name="varname" required="true" />
			<parameter name="delimiter" required="false" default="," />
		</syntax>
		<description>
			<example title="POP example">
			exten => s,1,Set(array=one,two,three)
			exten => s,n,While($["${SET(var=${POP(array)})}" != ""])
			exten => s,n,NoOp(var is ${var})
			exten => s,n,EndWhile
			</example>
			<para>This would iterate over each value in array, right to left, and
				would result in NoOp(var is three), NoOp(var is two), and
				NoOp(var is one) being executed.
			</para>
		</description>
	</function>
	<function name="PUSH" language="en_US" module="func_strings">
		<since>
			<version>1.8.0</version>
		</since>
		<synopsis>
			Appends one or more values to the end of a variable containing delimited text
		</synopsis>
		<syntax>
			<parameter name="varname" required="true" />
			<parameter name="delimiter" required="false" default="," />
		</syntax>
		<description>
			<example title="PUSH example">
			exten => s,1,Set(PUSH(array)=one,two,three)
			</example>
			<para>This would append one,
				two, and three to the end of the values stored in the variable
				"array".
			</para>
		</description>
	</function>
	<function name="UNSHIFT" language="en_US" module="func_strings">
		<since>
			<version>1.8.0</version>
		</since>
		<synopsis>
			Inserts one or more values to the beginning of a variable containing delimited text
		</synopsis>
		<syntax>
			<parameter name="varname" required="true" />
			<parameter name="delimiter" required="false" default="," />
		</syntax>
		<description>
			<example title="UNSHIFT example">
			exten => s,1,Set(UNSHIFT(array)=one,two,three)
			</example>
			<para>This would insert one,
				two, and three before the values stored in the variable
				"array".
			</para>
		</description>
	</function>
<module language="en_US" name="func_sysinfo">
	<support_level>core</support_level>
</module>
	<function name="SYSINFO" language="en_US" module="func_sysinfo">
		<since>
			<version>1.6.0</version>
		</since>
		<synopsis>
			Returns system information specified by parameter.
		</synopsis>
		<syntax>
			<parameter name="parameter" required="true">
				<enumlist>
					<enum name="loadavg">
						<para>System load average from past minute.</para>
					</enum>
					<enum name="numcalls">
						<para>Number of active calls currently in progress.</para>
					</enum>
					<enum name="uptime">
						<para>System uptime in hours.</para>
						<note><para>This parameter is dependant upon operating system.</para></note>
					</enum>
					<enum name="totalram">
						<para>Total usable main memory size in KiB.</para>
						<note><para>This parameter is dependant upon operating system.</para></note>
					</enum>
					<enum name="freeram">
						<para>Available memory size in KiB.</para>
						<note><para>This parameter is dependant upon operating system.</para></note>
					</enum>
					<enum name="bufferram">
						<para>Memory used by buffers in KiB.</para>
						<note><para>This parameter is dependant upon operating system.</para></note>
					</enum>
					<enum name="totalswap">
						<para>Total swap space still available in KiB.</para>
						<note><para>This parameter is dependant upon operating system.</para></note>
					</enum>
					<enum name="freeswap">
						<para>Free swap space still available in KiB.</para>
						<note><para>This parameter is dependant upon operating system.</para></note>
					</enum>
					<enum name="numprocs">
						<para>Number of current processes.</para>
						<note><para>This parameter is dependant upon operating system.</para></note>
					</enum>
				</enumlist>
			</parameter>
		</syntax>
		<description>
			<para>Returns information from a given parameter.</para>
		</description>
	</function>
<module language="en_US" name="func_talkdetect">
	<support_level>core</support_level>
</module>
	<function name="TALK_DETECT" language="en_US" module="func_talkdetect">
		<since>
			<version>12.4.0</version>
		</since>
		<synopsis>
			Raises notifications when Asterisk detects silence or talking on a channel.
		</synopsis>
		<syntax>
			<parameter name="action" required="true">
				<optionlist>
					<option name="remove">
						<para>W/O. Remove talk detection from the channel.</para>
					</option>
					<option name="set">
						<para>W/O. Enable TALK_DETECT and/or configure talk detection
						parameters. Can be called multiple times to change parameters
						on a channel with talk detection already enabled.</para>
						<argument name="dsp_silence_threshold" required="false">
							<para>The time in milliseconds of sound falling below the
							<replaceable>dsp_talking_threshold</replaceable> option when
							a user is considered to stop talking. The default value is
							2500.</para>
						</argument>
						<argument name="dsp_talking_threshold" required="false">
							<para>The minimum average magnitude per sample in a frame
							for the DSP to consider talking/noise present. A value below
							this level is considered silence. If not specified, the
							value comes from the <filename>dsp.conf</filename>
							<replaceable>silencethreshold</replaceable> option or 256
							if <filename>dsp.conf</filename> doesn't exist or the
							<replaceable>silencethreshold</replaceable> option is not
							set.</para>
						</argument>
					</option>
				</optionlist>
			</parameter>
		</syntax>
		<description>
			<para>The TALK_DETECT function enables events on the channel
			it is applied to. These events can be emitted over AMI, ARI, and
			potentially other Asterisk modules that listen for the internal
			notification.</para>
			<para>The function has two parameters that can optionally be passed
			when <literal>set</literal> on a channel: <replaceable>dsp_talking_threshold</replaceable>
			and <replaceable>dsp_silence_threshold</replaceable>.</para>
			<para><replaceable>dsp_talking_threshold</replaceable> is the minimum
			average magnitude per sample in a frame for the DSP to consider
			talking/noise present. A value below this level is considered silence.
			If this value is set too low, events may be falsely triggered by
			variants in room noise.</para>
			<para>Valid values are 1 through 32768. The default value is 256, unless
			overriden by the <replaceable>silencethreshold</replaceable> setting in
			<filename>dsp.conf</filename>.</para>
			<para><replaceable>dsp_silence_threshold</replaceable> is the time in milliseconds of sound
			falling within what the dsp has established as baseline silence before
			a user is considered be silent. If this value is set too low events
			indicating the user has stopped talking may get falsely sent out when
			the user briefly pauses during mid sentence.</para>
			<para>The best way to approach this option is to set it slightly above
			the maximum amount of ms of silence a user may generate during
			natural speech.</para>
			<para>By default this value is 2500ms. Valid values are 1
			through 2^31.</para>
			<example title="Enable talk detection">
			same => n,Set(TALK_DETECT(set)=)
			</example>
			<example title="Update existing talk detection's silence threshold to 1200 ms">
			same => n,Set(TALK_DETECT(set)=1200)
			</example>
			<example title="Remove talk detection">
			same => n,Set(TALK_DETECT(remove)=)
			</example>
			<example title="Enable and set talk threshold to 128">
			same => n,Set(TALK_DETECT(set)=,128)
			</example>
			<note>
				<para>The TALK_DETECT function uses an audiohook to inspect the
				voice media frames on a channel. Other functions, such as JITTERBUFFER,
				DENOISE, and AGC use a similar mechanism. Audiohooks are processed
				in the order in which they are placed on the channel. As such,
				it typically makes sense to place functions that modify the voice
				media data prior to placing the TALK_DETECT function, as this will
				yield better results.</para>
			</note>
			<example title="Denoise and then perform talk detection">
			same => n,Set(DENOISE(rx)=on)    ; Denoise received audio
			same => n,Set(TALK_DETECT(set)=) ; Perform talk detection on the denoised received audio
			</example>
		</description>
	</function>
<module language="en_US" name="func_timeout">
	<support_level>core</support_level>
</module>
	<function name="TIMEOUT" language="en_US" module="func_timeout">
		<since>
			<version>1.2.0</version>
		</since>
		<synopsis>
			Gets or sets timeouts on the channel. Timeout values are in seconds.
		</synopsis>
		<syntax>
			<parameter name="timeouttype" required="true">
				<para>The timeout that will be manipulated. The possible timeout types
				are: <literal>absolute</literal>, <literal>digit</literal> or
				<literal>response</literal></para>
			</parameter>
		</syntax>
		<description>
			<para>The timeouts that can be manipulated are:</para>
			<para><literal>absolute</literal>: The absolute maximum amount of time permitted for a call.
			Setting of 0 disables the timeout.</para>
			<para><literal>digit</literal>: The maximum amount of time permitted between digits when the
			user is typing in an extension.  When this timeout expires,
			after the user has started to type in an extension, the
			extension will be considered complete, and will be
			interpreted.  Note that if an extension typed in is valid,
			it will not have to timeout to be tested, so typically at
			the expiry of this timeout, the extension will be considered
			invalid (and thus control would be passed to the <literal>i</literal>
			extension, or if it doesn't exist the call would be
			terminated).  The default timeout is 5 seconds.</para>
			<para><literal>response</literal>: The maximum amount of time permitted after falling through a
			series of priorities for a channel in which the user may
			begin typing an extension.  If the user does not type an
			extension in this amount of time, control will pass to the
			<literal>t</literal> extension if it exists, and if not the call would be
			terminated.  The default timeout is 10 seconds.</para>
		</description>
	</function>
<module language="en_US" name="func_uri">
	<support_level>core</support_level>
</module>
	<function name="URIENCODE" language="en_US" module="func_uri">
		<since>
			<version>1.2.0</version>
		</since>
		<synopsis>
			Encodes a string to URI-safe encoding according to RFC 2396.
		</synopsis>
		<syntax>
			<parameter name="data" required="true">
				<para>Input string to be encoded.</para>
			</parameter>
		</syntax>
		<description>
			<para>Returns the encoded string defined in <replaceable>data</replaceable>.</para>
		</description>
	</function>
	<function name="URIDECODE" language="en_US" module="func_uri">
		<since>
			<version>1.2.0</version>
		</since>
		<synopsis>
			Decodes a URI-encoded string according to RFC 2396.
		</synopsis>
		<syntax>
			<parameter name="data" required="true">
				<para>Input string to be decoded.</para>
			</parameter>
		</syntax>
		<description>
			<para>Returns the decoded URI-encoded <replaceable>data</replaceable> string.</para>
		</description>
	</function>
<module language="en_US" name="func_uuid">
	<support_level>extended</support_level>
</module>
	<function name="UUID" language="en_US" module="func_uuid">
		<synopsis>
			Generates an UUID.
		</synopsis>
		<syntax>
		</syntax>
		<description>
			<para>Returns a version 4 (random) Universally Unique Identifier (UUID) as a string.</para>
			<example title="Generate an UUID">
			same => n,Set(uuid=${UUID()})
			</example>
		</description>
	</function>
<module language="en_US" name="func_version">
	<support_level>core</support_level>
</module>
	<function name="VERSION" language="en_US" module="func_version">
		<since>
			<version>1.6.0</version>
		</since>
		<synopsis>
			Return the Version info for this Asterisk.
		</synopsis>
		<syntax>
			<parameter name="info">
				<para>The possible values are:</para>
				<enumlist>
					<enum name="ASTERISK_VERSION_NUM">
						<para>A string of digits is returned, e.g. 10602 for 1.6.2 or 100300 for 10.3.0,
						or 999999 when using a Git build.</para>
					</enum>
					<enum name="BUILD_USER">
						<para>The string representing the user's name whose account
						was used to configure Asterisk, is returned.</para>
					</enum>
					<enum name="BUILD_HOSTNAME">
						<para>The string representing the name of the host on which Asterisk was configured, is returned.</para>
					</enum>
					<enum name="BUILD_MACHINE">
						<para>The string representing the type of machine on which Asterisk was configured, is returned.</para>
					</enum>
					<enum name="BUILD_OS">
						<para>The string representing the OS of the machine on which Asterisk was configured, is returned.</para>
					</enum>
					<enum name="BUILD_DATE">
						<para>The string representing the date on which Asterisk was configured, is returned.</para>
					</enum>
					<enum name="BUILD_KERNEL">
						<para>The string representing the kernel version of the machine on which Asterisk
						was configured, is returned.</para>
					</enum>
				</enumlist>
			</parameter>
		</syntax>
		<description>
			<para>If there are no arguments, return the version of Asterisk in this format: 18.12.0</para>
			<example title="Get current version">
			same => n,Set(junky=${VERSION()} ; sets junky to 18.12.0, or possibly GITMasterxxxxxx
			</example>
		</description>
	</function>
<module language="en_US" name="func_vmcount">
	<support_level>core</support_level>
</module>
	<function name="VMCOUNT" language="en_US" module="func_vmcount">
		<since>
			<version>1.2.0</version>
		</since>
		<synopsis>
			Count the voicemails in a specified mailbox or mailboxes.
		</synopsis>
		<syntax>
			<parameter name="vmbox" required="true" argsep="&amp;">
				<para>A mailbox or list of mailboxes</para>
			</parameter>
			<parameter name="folder" required="false">
				<para>If not specified, defaults to <literal>INBOX</literal></para>
			</parameter>
		</syntax>
		<description>
			<para>Count the number of voicemails in a specified mailbox, you could also specify
			the mailbox <replaceable>folder</replaceable>.</para>
			<example title="Mailbox folder count">
			exten => s,1,Set(foo=${VMCOUNT(125@default)})
			</example>
			<para>An ampersand-separated list of mailboxes may be specified to count voicemails in
			multiple mailboxes. If a folder is specified, this will apply to all mailboxes specified.</para>
                        <example title="Multiple mailbox inbox count">
                        same => n,NoOp(${VMCOUNT(1234@default&amp;1235@default&amp;1236@default,INBOX)})
                        </example>
		</description>
	</function>
<module language="en_US" name="func_volume">
	<support_level>core</support_level>
</module>
	<function name="VOLUME" language="en_US" module="func_volume">
		<since>
			<version>1.6.0</version>
		</since>
		<synopsis>
			Set or get the TX or RX volume of a channel.
		</synopsis>
		<syntax>
			<parameter name="direction" required="true">
				<para>Must be <literal>TX</literal> or <literal>RX</literal>.</para>
			</parameter>
			<parameter name="options">
				<optionlist>
					<option name="p">
						<para>Enable DTMF volume control</para>
					</option>
				</optionlist>
			</parameter>
		</syntax>
		<description>
			<para>The VOLUME function can be used to increase or decrease the <literal>tx</literal> or
			<literal>rx</literal> gain of any channel.</para>
			<example title="Increase volume">
			same => n,Set(VOLUME(TX)=3)
			</example>
			<example title="Increase volume">
			same => n,Set(VOLUME(RX)=2)
			</example>
			<example title="Increase volume with DTMF control">
			same => n,Set(VOLUME(TX,p)=3)
			</example>
			<example title="Increase RX volume with DTMF control">
			same => n,Set(VOLUME(RX,p)=3)
			</example>
			<example title="Decrease RX volume">
			same => n,Set(VOLUME(RX)=-4)
			</example>
			<example title="Reset to normal">
			same => n,Set(VOLUME(RX)=0)
			</example>
		</description>
	</function>
<module language="en_US" name="test_abstract_jb">
	<depend>TEST_FRAMEWORK</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="test_acl">
	<depend>TEST_FRAMEWORK</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="test_aeap">
	<depend>TEST_FRAMEWORK</depend>
	<depend>res_aeap</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="test_aeap_speech">
	<depend>TEST_FRAMEWORK</depend>
	<depend>res_aeap</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="test_aeap_transaction">
	<depend>TEST_FRAMEWORK</depend>
	<depend>res_aeap</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="test_aeap_transport">
	<depend>TEST_FRAMEWORK</depend>
	<depend>res_aeap</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="test_amihooks">
	<depend>TEST_FRAMEWORK</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="test_aoc">
	<depend>TEST_FRAMEWORK</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="test_app">
	<depend>TEST_FRAMEWORK</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="test_ari">
	<depend>TEST_FRAMEWORK</depend>
	<depend>res_ari</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="test_ari_model">
	<depend>TEST_FRAMEWORK</depend>
	<depend>res_ari_model</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="test_ast_format_str_reduce">
	<depend>TEST_FRAMEWORK</depend>
	<depend>format_g723</depend>
	<depend>format_g726</depend>
	<depend>format_g729</depend>
	<depend>format_gsm</depend>
	<depend>format_ogg_vorbis</depend>
	<depend>format_pcm</depend>
	<depend>format_siren14</depend>
	<depend>format_siren7</depend>
	<depend>format_sln</depend>
	<depend>format_wav</depend>
	<depend>format_wav_gsm</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="test_astobj2">
	<depend>TEST_FRAMEWORK</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="test_astobj2_thrash">
	<depend>TEST_FRAMEWORK</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="test_astobj2_weaken">
	<depend>TEST_FRAMEWORK</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="test_bridging">
	<depend>TEST_FRAMEWORK</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="test_bucket">
	<depend>TEST_FRAMEWORK</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="test_callerid">
	<depend>TEST_FRAMEWORK</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="test_capture">
	<depend>TEST_FRAMEWORK</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="test_cdr">
	<depend>TEST_FRAMEWORK</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="test_cel">
	<depend>TEST_FRAMEWORK</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="test_channel">
	<depend>TEST_FRAMEWORK</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="test_channel_feature_hooks">
	<depend>TEST_FRAMEWORK</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="test_codec_translations">
	<depend>TEST_FRAMEWORK</depend>
	<support_level>extended</support_level>
</module>
<module language="en_US" name="test_config">
	<depend>TEST_FRAMEWORK</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="test_conversions">
	<depend>TEST_FRAMEWORK</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="test_core_codec">
	<depend>TEST_FRAMEWORK</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="test_core_format">
	<depend>TEST_FRAMEWORK</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="test_crypto">
        <depend>TEST_FRAMEWORK</depend>
        <depend>res_crypto</depend>
        <depend>crypto</depend>
        <support_level>core</support_level>
</module>
<module language="en_US" name="test_data_buffer">
	<depend>TEST_FRAMEWORK</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="test_db">
	<depend>TEST_FRAMEWORK</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="test_devicestate">
	<depend>TEST_FRAMEWORK</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="test_dlinklists">
	<depend>TEST_FRAMEWORK</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="test_dns">
	<depend>TEST_FRAMEWORK</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="test_dns_naptr">
	<depend>TEST_FRAMEWORK</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="test_dns_query_set">
	<depend>TEST_FRAMEWORK</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="test_dns_recurring">
	<depend>TEST_FRAMEWORK</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="test_dns_srv">
	<depend>TEST_FRAMEWORK</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="test_endpoints">
	<depend>TEST_FRAMEWORK</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="test_event">
	<depend>TEST_FRAMEWORK</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="test_expr">
	<depend>TEST_FRAMEWORK</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="test_file">
	<depend>TEST_FRAMEWORK</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="test_format_cache">
	<depend>TEST_FRAMEWORK</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="test_format_cap">
	<depend>TEST_FRAMEWORK</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="test_func_file">
	<depend>TEST_FRAMEWORK</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="test_gosub">
	<depend>TEST_FRAMEWORK</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="test_hashtab_thrash">
	<depend>TEST_FRAMEWORK</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="test_heap">
	<depend>TEST_FRAMEWORK</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="test_http_media_cache">
	<depend>TEST_FRAMEWORK</depend>
	<depend>curl</depend>
	<depend>res_http_media_cache</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="test_jitterbuf">
	<depend>TEST_FRAMEWORK</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="test_json">
	<depend>TEST_FRAMEWORK</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="test_linkedlists">
	<depend>TEST_FRAMEWORK</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="test_locale">
	<depend>TEST_FRAMEWORK</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="test_logger">
	<depend>TEST_FRAMEWORK</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="test_media_cache">
	<depend>TEST_FRAMEWORK</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="test_message">
	<depend>TEST_FRAMEWORK</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="test_mwi">
	<depend>TEST_FRAMEWORK</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="test_named_lock">
	<depend>TEST_FRAMEWORK</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="test_netsock2">
	<depend>TEST_FRAMEWORK</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="test_optional_api">
	<depend>TEST_FRAMEWORK</depend>
	<depend>OPTIONAL_API</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="test_pbx">
	<depend>TEST_FRAMEWORK</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="test_poll">
	<depend>TEST_FRAMEWORK</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="test_res_pjsip_scheduler">
	<depend>TEST_FRAMEWORK</depend>
	<depend>pjproject</depend>
	<depend>res_pjsip</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="test_res_pjsip_session_caps">
	<depend>TEST_FRAMEWORK</depend>
	<depend>pjproject</depend>
	<depend>res_pjsip</depend>
	<depend>res_pjsip_session</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="test_res_prometheus">
	<depend>TEST_FRAMEWORK</depend>
	<depend>res_prometheus</depend>
	<depend>curl</depend>
	<support_level>extended</support_level>
</module>
<module language="en_US" name="test_res_rtp">
	<depend>TEST_FRAMEWORK</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="test_res_stasis">
	<depend>TEST_FRAMEWORK</depend>
	<depend>res_stasis</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="test_sched">
	<depend>TEST_FRAMEWORK</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="test_scope_trace">
	<depend>TEST_FRAMEWORK</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="test_scoped_lock">
	<depend>TEST_FRAMEWORK</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="test_security_events">
	<depend>TEST_FRAMEWORK</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="test_skel">
	<depend>TEST_FRAMEWORK</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="test_sorcery">
	<depend>TEST_FRAMEWORK</depend>
	<depend>func_sorcery</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="test_sorcery_astdb">
	<depend>TEST_FRAMEWORK</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="test_sorcery_memory_cache_thrash">
	<depend>TEST_FRAMEWORK</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="test_sorcery_realtime">
	<depend>TEST_FRAMEWORK</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="test_stasis">
	<depend>TEST_FRAMEWORK</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="test_stasis_channels">
	<depend>TEST_FRAMEWORK</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="test_stasis_endpoints">
	<depend>TEST_FRAMEWORK</depend>
	<depend>res_stasis_test</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="test_stasis_state">
	<depend>TEST_FRAMEWORK</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="test_stream">
	<depend>TEST_FRAMEWORK</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="test_stringfields">
	<depend>TEST_FRAMEWORK</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="test_strings">
	<depend>TEST_FRAMEWORK</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="test_substitution">
	<depend>TEST_FRAMEWORK</depend>
	<depend>func_curl</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="test_taskpool">
	<depend>TEST_FRAMEWORK</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="test_taskprocessor">
	<depend>TEST_FRAMEWORK</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="test_threadpool">
	<depend>TEST_FRAMEWORK</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="test_time">
	<depend>TEST_FRAMEWORK</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="test_uri">
	<depend>TEST_FRAMEWORK</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="test_utils">
	<depend>TEST_FRAMEWORK</depend>
	<depend>res_agi</depend>
	<depend>res_crypto</depend>
	<depend>crypto</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="test_uuid">
	<depend>TEST_FRAMEWORK</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="test_vector">
	<depend>TEST_FRAMEWORK</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="test_voicemail_api">
	<depend>TEST_FRAMEWORK</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="test_websocket_client">
	<depend>TEST_FRAMEWORK</depend>
	<depend>res_http_websocket</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="test_xml_escape">
	<depend>TEST_FRAMEWORK</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="abstract_jb">
	<support_level>core</support_level>
</module>
<module language="en_US" name="acl">
	<support_level>core</support_level>
</module>
<module language="en_US" name="alaw">
	<support_level>core</support_level>
</module>
<module language="en_US" name="aoc">
	<support_level>core</support_level>
</module>
	<managerEvent language="en_US" name="AOC-S" module="builtin">
		<managerEventInstance class="EVENT_FLAG_AOC" module="builtin">
			<since>
				<version>12.0.0</version>
			</since>
			<synopsis>Raised when an Advice of Charge message is sent at the beginning of a call.</synopsis>
			<syntax>
				<channel_snapshot/>
				<parameter name="Chargeable" />
				<parameter name="RateType">
					<enumlist>
						<enum name="NotAvailable" />
						<enum name="Free" />
						<enum name="FreeFromBeginning" />
						<enum name="Duration" />
						<enum name="Flag" />
						<enum name="Volume" />
						<enum name="SpecialCode" />
					</enumlist>
				</parameter>
				<parameter name="Currency" />
				<parameter name="Name" />
				<parameter name="Cost" />
				<parameter name="Multiplier">
					<enumlist>
						<enum name="1/1000" />
						<enum name="1/100" />
						<enum name="1/10" />
						<enum name="1" />
						<enum name="10" />
						<enum name="100" />
						<enum name="1000" />
					</enumlist>
				</parameter>
				<parameter name="ChargingType" />
				<parameter name="StepFunction" />
				<parameter name="Granularity" />
				<parameter name="Length" />
				<parameter name="Scale" />
				<parameter name="Unit">
					<enumlist>
						<enum name="Octet" />
						<enum name="Segment" />
						<enum name="Message" />
					</enumlist>
				</parameter>
				<parameter name="SpecialCode" />
			</syntax>
			<see-also>
				<ref type="managerEvent">AOC-D</ref>
				<ref type="managerEvent">AOC-E</ref>
			</see-also>
		</managerEventInstance>
	</managerEvent>
	<managerEvent language="en_US" name="AOC-D" module="builtin">
		<managerEventInstance class="EVENT_FLAG_AOC" module="builtin">
			<since>
				<version>12.0.0</version>
			</since>
			<synopsis>Raised when an Advice of Charge message is sent during a call.</synopsis>
			<syntax>
				<channel_snapshot/>
				<parameter name="Charge" />
				<parameter name="Type">
					<enumlist>
						<enum name="NotAvailable" />
						<enum name="Free" />
						<enum name="Currency" />
						<enum name="Units" />
					</enumlist>
				</parameter>
				<parameter name="BillingID">
					<enumlist>
						<enum name="Normal" />
						<enum name="Reverse" />
						<enum name="CreditCard" />
						<enum name="CallForwardingUnconditional" />
						<enum name="CallForwardingBusy" />
						<enum name="CallForwardingNoReply" />
						<enum name="CallDeflection" />
						<enum name="CallTransfer" />
						<enum name="NotAvailable" />
					</enumlist>
				</parameter>
				<parameter name="TotalType">
					<enumlist>
						<enum name="SubTotal" />
						<enum name="Total" />
					</enumlist>
				</parameter>
				<parameter name="Currency" />
				<parameter name="Name" />
				<parameter name="Cost" />
				<parameter name="Multiplier">
					<enumlist>
						<enum name="1/1000" />
						<enum name="1/100" />
						<enum name="1/10" />
						<enum name="1" />
						<enum name="10" />
						<enum name="100" />
						<enum name="1000" />
					</enumlist>
				</parameter>
				<parameter name="Units" />
				<parameter name="NumberOf" />
				<parameter name="TypeOf" />
			</syntax>
			<see-also>
				<ref type="manager">AOCMessage</ref>
				<ref type="managerEvent">AOC-S</ref>
				<ref type="managerEvent">AOC-E</ref>
			</see-also>
		</managerEventInstance>
	</managerEvent>
	<managerEvent language="en_US" name="AOC-E" module="builtin">
		<managerEventInstance class="EVENT_FLAG_AOC" module="builtin">
			<since>
				<version>12.0.0</version>
			</since>
			<synopsis>Raised when an Advice of Charge message is sent at the end of a call.</synopsis>
			<syntax>
				<channel_snapshot/>
				<parameter name="ChargingAssociation" />
				<parameter name="Number" />
				<parameter name="Plan" />
				<parameter name="ID" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='AOC-D']/managerEventInstance/syntax/parameter)" />
			</syntax>
			<see-also>
				<ref type="manager">AOCMessage</ref>
				<ref type="managerEvent">AOC-S</ref>
				<ref type="managerEvent">AOC-D</ref>
			</see-also>
		</managerEventInstance>
	</managerEvent>
<module language="en_US" name="app">
	<support_level>core</support_level>
</module>
<module language="en_US" name="asterisk">
	<support_level>core</support_level>
</module>
	<managerEvent language="en_US" name="FullyBooted" module="builtin">
		<managerEventInstance class="EVENT_FLAG_SYSTEM" module="builtin">
			<since>
				<version>12.0.0</version>
			</since>
			<synopsis>Raised when all Asterisk initialization procedures have finished.</synopsis>
			<syntax>
				<parameter name="Status">
					<para>Informational message</para>
				</parameter>
				<parameter name="Uptime">
					<para>Seconds since start</para>
				</parameter>
				<parameter name="LastReload">
					<para>Seconds since last reload</para>
				</parameter>
			</syntax>
		</managerEventInstance>
	</managerEvent>
	<managerEvent language="en_US" name="Shutdown" module="builtin">
		<managerEventInstance class="EVENT_FLAG_SYSTEM" module="builtin">
			<since>
				<version>12.0.0</version>
			</since>
			<synopsis>Raised when Asterisk is shutdown or restarted.</synopsis>
			<syntax>
				<parameter name="Shutdown">
					<para>Whether the shutdown is proceeding cleanly (all channels
					were hungup successfully) or uncleanly (channels will be
					terminated)</para>
					<enumlist>
						<enum name="Uncleanly"/>
						<enum name="Cleanly"/>
					</enumlist>
				</parameter>
				<parameter name="Restart">
					<para>Whether or not a restart will occur.</para>
					<enumlist>
						<enum name="True"/>
						<enum name="False"/>
					</enumlist>
				</parameter>
			</syntax>
		</managerEventInstance>
	</managerEvent>
<module language="en_US" name="astfd">
	<support_level>core</support_level>
</module>
<module language="en_US" name="astmm">
	<support_level>core</support_level>
</module>
<module language="en_US" name="astobj2">
	<support_level>core</support_level>
</module>
<module language="en_US" name="astobj2_global">
	<support_level>core</support_level>
</module>
<module language="en_US" name="audiohook">
	<support_level>core</support_level>
</module>
<module language="en_US" name="autochan">
	<support_level>core</support_level>
</module>
<module language="en_US" name="autoservice">
	<support_level>core</support_level>
</module>
<module language="en_US" name="backtrace">
	<support_level>core</support_level>
</module>
<module language="en_US" name="bridge">
	<support_level>core</support_level>
</module>
	<manager name="BridgeTechnologyList" language="en_US" module="builtin">
		<since>
			<version>12.0.0</version>
		</since>
		<synopsis>
			List available bridging technologies and their statuses.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
		</syntax>
		<description>
			<para>Returns detailed information about the available bridging technologies.</para>
		</description>
		<see-also>
			<ref type="manager">BridgeTechnologySuspend</ref>
			<ref type="manager">BridgeTechnologyUnsuspend</ref>
		</see-also>
	</manager>
	<manager name="BridgeTechnologySuspend" language="en_US" module="builtin">
		<since>
			<version>12.0.0</version>
		</since>
		<synopsis>
			Suspend a bridging technology.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="BridgeTechnology" required="true">
				<para>The name of the bridging technology to suspend.</para>
			</parameter>
		</syntax>
		<description>
			<para>Marks a bridging technology as suspended, which prevents subsequently created bridges from using it.</para>
		</description>
		<see-also>
			<ref type="manager">BridgeTechnologySuspend</ref>
			<ref type="manager">BridgeTechnologyUnsuspend</ref>
		</see-also>
	</manager>
	<manager name="BridgeTechnologyUnsuspend" language="en_US" module="builtin">
		<since>
			<version>12.0.0</version>
		</since>
		<synopsis>
			Unsuspend a bridging technology.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="BridgeTechnology" required="true">
				<para>The name of the bridging technology to unsuspend.</para>
			</parameter>
		</syntax>
		<description>
			<para>Clears a previously suspended bridging technology, which allows subsequently created bridges to use it.</para>
		</description>
		<see-also>
			<ref type="manager">BridgeTechnologyList</ref>
			<ref type="manager">BridgeTechnologySuspend</ref>
		</see-also>
	</manager>
<module language="en_US" name="bridge_after">
	<support_level>core</support_level>
</module>
<module language="en_US" name="bridge_channel">
	<support_level>core</support_level>
</module>
<module language="en_US" name="bridge_roles">
	<support_level>core</support_level>
</module>
<module language="en_US" name="bucket">
	<use type="external">uriparser</use>
	<support_level>core</support_level>
</module>
<module language="en_US" name="callerid">
	<support_level>core</support_level>
</module>
<module language="en_US" name="ccss">
	<support_level>core</support_level>
</module>
	<application name="CallCompletionRequest" language="en_US" module="builtin">
		<since>
			<version>1.8.0</version>
		</since>
		<synopsis>
			Request call completion service for previous call
		</synopsis>
		<syntax />
		<description>
			<para>Request call completion service for a previously failed
			call attempt.</para>
			<para>This application sets the following channel variables:</para>
			<variablelist>
				<variable name="CC_REQUEST_RESULT">
					<para>This is the returned status of the request.</para>
					<value name="SUCCESS" />
					<value name="FAIL" />
				</variable>
				<variable name="CC_REQUEST_REASON">
					<para>This is the reason the request failed.</para>
					<value name="NO_CORE_INSTANCE" />
					<value name="NOT_GENERIC" />
					<value name="TOO_MANY_REQUESTS" />
					<value name="UNSPECIFIED" />
				</variable>
			</variablelist>
		</description>
	</application>
	<application name="CallCompletionCancel" language="en_US" module="builtin">
		<since>
			<version>1.8.0</version>
		</since>
		<synopsis>
			Cancel call completion service
		</synopsis>
		<syntax />
		<description>
			<para>Cancel a Call Completion Request.</para>
			<para>This application sets the following channel variables:</para>
			<variablelist>
				<variable name="CC_CANCEL_RESULT">
					<para>This is the returned status of the cancel.</para>
					<value name="SUCCESS" />
					<value name="FAIL" />
				</variable>
				<variable name="CC_CANCEL_REASON">
					<para>This is the reason the cancel failed.</para>
					<value name="NO_CORE_INSTANCE" />
					<value name="NOT_GENERIC" />
					<value name="UNSPECIFIED" />
				</variable>
			</variablelist>
		</description>
	</application>
<module language="en_US" name="cdr">
	<support_level>core</support_level>
</module>
	<configInfo name="cdr" language="en_US">
		<synopsis>Call Detail Record configuration</synopsis>
		<description>
			<para>CDR is Call Detail Record, which provides logging services via a variety of
			pluggable backend modules. Detailed call information can be recorded to
			databases, files, etc. Useful for billing, fraud prevention, compliance with
			Sarbanes-Oxley aka The Enron Act, QOS evaluations, and more.</para>
		</description>
		<configFile name="cdr.conf">
			<configObject name="general">
				<since>
					<version>12.0.0</version>
				</since>
				<synopsis>Global settings applied to the CDR engine.</synopsis>
				<configOption name="debug">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Enable/disable verbose CDR debugging.</synopsis>
					<description><para>When set to <literal>True</literal>, verbose updates
					of changes in CDR information will be logged. Note that this is only
					of use when debugging CDR behavior.</para>
					</description>
				</configOption>
				<configOption name="enable" default="yes">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Enable/disable CDR logging.</synopsis>
					<description><para>Define whether or not to use CDR logging. Setting this to "no" will override
					any loading of backend CDR modules.</para>
					</description>
				</configOption>
				<configOption name="channeldefaultenabled" default="yes">
					<since>
						<version>16.24.0</version>
						<version>18.10.0</version>
						<version>19.2.0</version>
					</since>
					<synopsis>Whether CDR is enabled on a channel by default</synopsis>
					<description><para>Define whether or not CDR should be enabled on a channel by default.
					Setting this to "yes" will enable CDR on every channel unless it is explicitly disabled.
					Setting this to "no" will disable CDR on every channel unless it is explicitly enabled.
					</para>
					<para>Note that CDR must still be globally enabled (<literal>enable = yes</literal>) for this
					option to have any effect. This only applies to whether CDR is enabled or disabled on
					newly created channels, which can be changed in the dialplan during a call.</para>
					<para>If this is set to "yes", you should use <literal>Set(CDR_PROP(disable)=1)</literal>
					to disable CDR for a call.</para>
					<para>If this is set to "no", you should use <literal>Set(CDR_PROP(disable)=0)</literal>
					to undisable (enable) CDR for a call.</para>
					</description>
				</configOption>
				<configOption name="ignorestatechanges" default="no">
					<since>
						<version>16.30.0</version>
						<version>18.16.0</version>
						<version>19.8.0</version>
						<version>20.1.0</version>
					</since>
					<synopsis>Whether CDR is updated or forked by bridging changes.</synopsis>
					<description><para>Define whether or not CDR should be updated by bridging changes.
					This includes entering and leaving bridges and call parking.</para>
					<para>If this is set to "no", bridging changes will be ignored for all CDRs.
					This should only be done if these events should not affect CDRs and are undesired,
					such as to use a single CDR for the lifetime of the channel.</para>
					<para>This setting cannot be changed on a reload.</para>
					</description>
				</configOption>
				<configOption name="ignoredialchanges" default="no">
					<since>
						<version>16.30.0</version>
						<version>18.16.0</version>
						<version>19.8.0</version>
						<version>20.1.0</version>
					</since>
					<synopsis>Whether CDR is updated or forked by dial updates.</synopsis>
					<description><para>Define whether or not CDR should be updated by dial updates.</para>
					<para>If this is set to "no", a single CDR will be used for the channel, even if
					multiple endpoints or destinations are dialed sequentially. Note that you will also
					lose detailed nonanswer dial dispositions if this option is enabled, which may not be acceptable,
					e.g. instead of detailed no-answer dispositions like BUSY and CONGESTION, the disposition
					will always be NO ANSWER if the channel was unanswered (it will still be ANSWERED
					if the channel was answered).</para>
					<para>This option should be enabled if a single CDR is desired for the lifetime of
					the channel.</para>
					</description>
				</configOption>
				<configOption name="unanswered">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Log calls that are never answered and don't set an outgoing party.</synopsis>
					<description><para>
					Define whether or not to log unanswered calls that don't involve an outgoing party. Setting
					this to "yes" will make calls to extensions that don't answer and don't set a side B channel
					(such as by using the Dial application) receive CDR log entries. If this option is set to
					"no", then those log entries will not be created. Unanswered calls which get offered to an
					outgoing line will always receive log entries regardless of this option, and that is the
					intended behavior.
					</para>
					</description>
				</configOption>
				<configOption name="congestion">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Log congested calls.</synopsis>
					<description><para>Define whether or not to log congested calls. Setting this to "yes" will
					report each call that fails to complete due to congestion conditions.</para>
					</description>
				</configOption>
				<configOption name="endbeforehexten">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Don't produce CDRs while executing hangup logic</synopsis>
					<description>
						<para>As each CDR for a channel is finished, its end time is updated
						and the CDR is finalized. When a channel is hung up and hangup
						logic is present (in the form of a hangup handler or the
						<literal>h</literal> extension), a new CDR is generated for the
						channel. Any statistics are gathered from this new CDR. By enabling
						this option, no new CDR is created for the dialplan logic that is
						executed in <literal>h</literal> extensions or attached hangup handler
						subroutines. The default value is <literal>yes</literal>, indicating
						that a CDR will be generated during hangup logic.</para>
					</description>
				</configOption>
				<configOption name="initiatedseconds">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Count microseconds for billsec purposes</synopsis>
					<description><para>Normally, the <literal>billsec</literal> field logged to the CDR backends
					is simply the end time (hangup time) minus the answer time in seconds. Internally,
					asterisk stores the time in terms of microseconds and seconds. By setting
					initiatedseconds to <literal>yes</literal>, you can force asterisk to report any seconds
					that were initiated (a sort of round up method). Technically, this is
					when the microsecond part of the end time is greater than the microsecond
					part of the answer time, then the billsec time is incremented one second.</para>
					</description>
				</configOption>
				<configOption name="batch">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Submit CDRs to the backends for processing in batches</synopsis>
					<description><para>Define the CDR batch mode, where instead of posting the CDR at the end of
					every call, the data will be stored in a buffer to help alleviate load on the
					asterisk server.</para>
					<warning><para>Use of batch mode may result in data loss after unsafe asterisk termination,
					i.e., software crash, power failure, kill -9, etc.</para>
					</warning>
					</description>
				</configOption>
				<configOption name="size">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>The maximum number of CDRs to accumulate before triggering a batch</synopsis>
					<description><para>Define the maximum number of CDRs to accumulate in the buffer before posting
					them to the backend engines. batch must be set to <literal>yes</literal>.</para>
					</description>
				</configOption>
				<configOption name="time">
					<since>
						<version>13.22.0</version>
						<version>15.5.0</version>
					</since>
					<synopsis>The maximum time to accumulate CDRs before triggering a batch</synopsis>
					<description><para>Define the maximum time to accumulate CDRs before posting them in a batch to the
					backend engines. If this time limit is reached, then it will post the records, regardless of the value
					defined for size. batch must be set to <literal>yes</literal>.</para>
					<note><para>Time is expressed in seconds.</para></note>
					</description>
				</configOption>
				<configOption name="scheduleronly">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Post batched CDRs on their own thread instead of the scheduler</synopsis>
					<description><para>The CDR engine uses the internal asterisk scheduler to determine when to post
					records.  Posting can either occur inside the scheduler thread, or a new
					thread can be spawned for the submission of every batch.  For small batches,
					it might be acceptable to just use the scheduler thread, so set this to <literal>yes</literal>.
					For large batches, say anything over size=10, a new thread is recommended, so
					set this to <literal>no</literal>.</para>
					</description>
				</configOption>
				<configOption name="safeshutdown">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Block shutdown of Asterisk until CDRs are submitted</synopsis>
					<description><para>When shutting down asterisk, you can block until the CDRs are submitted.  If
					you don't, then data will likely be lost.  You can always check the size of
					the CDR batch buffer with the CLI <astcli>cdr status</astcli> command.  To enable blocking on
					submission of CDR data during asterisk shutdown, set this to <literal>yes</literal>.</para>
					</description>
				</configOption>
				<configOption name="canceldispositionenabled" default="no">
					<synopsis>Whether to enable CANCEL disposition in CDR</synopsis>
					<description><para>
					Define if the CANCEL disposition state should be used.
					When enabled, The NO ANSWER disposition will be split into two distinct dispositions: CANCEL and NO ANSWER.
					</para>
					</description>
				</configOption>
			</configObject>
		</configFile>
	</configInfo>
<module language="en_US" name="cel">
	<support_level>core</support_level>
</module>
	<configInfo name="cel" language="en_US">
		<configFile name="cel.conf">
			<configObject name="general">
				<since>
					<version>12.0.0</version>
				</since>
				<synopsis>Options that apply globally to Channel Event Logging (CEL)</synopsis>
				<configOption name="enable">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Determines whether CEL is enabled</synopsis>
				</configOption>
				<configOption name="dateformat">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>The format to be used for dates when logging</synopsis>
				</configOption>
				<configOption name="apps">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>List of apps for CEL to track</synopsis>
					<description><para>A case-insensitive, comma-separated list of applications
					to track when one or both of APP_START and APP_END events are flagged for
					tracking</para></description>
				</configOption>
				<configOption name="events">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>List of events for CEL to track</synopsis>
					<description><para>A case-sensitive, comma-separated list of event names
					to track. These event names do not include the leading <literal>AST_CEL</literal>.
					</para>
					<enumlist>
						<enum name="ALL">
							<para>Special value which tracks all events.</para>
						</enum>
						<enum name="CHAN_START"/>
						<enum name="CHAN_END"/>
						<enum name="ANSWER"/>
						<enum name="HANGUP"/>
						<enum name="APP_START"/>
						<enum name="APP_END"/>
						<enum name="PARK_START"/>
						<enum name="PARK_END"/>
						<enum name="USER_DEFINED"/>
						<enum name="BRIDGE_ENTER"/>
						<enum name="BRIDGE_EXIT"/>
						<enum name="BLINDTRANSFER"/>
						<enum name="ATTENDEDTRANSFER"/>
						<enum name="PICKUP"/>
						<enum name="FORWARD"/>
						<enum name="LINKEDID_END"/>
						<enum name="LOCAL_OPTIMIZE"/>
						<enum name="LOCAL_OPTIMIZE_BEGIN"/>
						<enum name="STREAM_BEGIN"/>
						<enum name="STREAM_END"/>
						<enum name="DTMF"/>
					</enumlist>
					</description>
				</configOption>
			</configObject>
		</configFile>
	</configInfo>
<module language="en_US" name="channel">
	<support_level>core</support_level>
</module>
		<managerEvent language="en_US" name="Rename" module="builtin">
			<managerEventInstance class="EVENT_FLAG_CALL" module="builtin">
				<since>
					<version>16.24.0</version>
					<version>18.10.0</version>
					<version>19.2.0</version>
				</since>
				<synopsis>Raised when the name of a channel is changed.</synopsis>
			</managerEventInstance>
		</managerEvent>
<module language="en_US" name="channel_internal_api">
	<support_level>core</support_level>
</module>
<module language="en_US" name="chanvars">
	<support_level>core</support_level>
</module>
<module language="en_US" name="cli">
	<support_level>core</support_level>
</module>
<module language="en_US" name="codec">
	<support_level>core</support_level>
</module>
<module language="en_US" name="codec_builtin">
	<support_level>core</support_level>
</module>
<module language="en_US" name="config">
	<support_level>core</support_level>
</module>
<module language="en_US" name="config_options">
	<support_level>core</support_level>
</module>
<module language="en_US" name="conversions">
	<support_level>core</support_level>
</module>
<module language="en_US" name="core_local">
	<support_level>core</support_level>
</module>
	<manager name="LocalOptimizeAway" language="en_US" module="builtin">
		<since>
			<version>1.8.0</version>
		</since>
		<synopsis>
			Optimize away a local channel when possible.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="Channel" required="true">
				<para>The channel name to optimize away.</para>
			</parameter>
		</syntax>
		<description>
			<para>A local channel created with "/n" will not automatically optimize away.
			Calling this command on the local channel will clear that flag and allow
			it to optimize away if it's bridged or when it becomes bridged.</para>
		</description>
	</manager>
	<managerEvent language="en_US" name="LocalBridge" module="builtin">
		<managerEventInstance class="EVENT_FLAG_CALL" module="builtin">
			<since>
				<version>12.0.0</version>
			</since>
			<synopsis>Raised when two halves of a Local Channel form a bridge.</synopsis>
			<syntax>
				<channel_snapshot prefix="LocalOne"/>
				<channel_snapshot prefix="LocalTwo"/>
				<parameter name="Context">
					<para>The context in the dialplan that Channel2 starts in.</para>
				</parameter>
				<parameter name="Exten">
					<para>The extension in the dialplan that Channel2 starts in.</para>
				</parameter>
				<parameter name="LocalOptimization">
					<enumlist>
						<enum name="Yes"/>
						<enum name="No"/>
					</enumlist>
				</parameter>
			</syntax>
		</managerEventInstance>
	</managerEvent>
	<managerEvent language="en_US" name="LocalOptimizationBegin" module="builtin">
		<managerEventInstance class="EVENT_FLAG_CALL" module="builtin">
			<since>
				<version>12.0.0</version>
			</since>
			<synopsis>Raised when two halves of a Local Channel begin to optimize
			themselves out of the media path.</synopsis>
			<syntax>
				<channel_snapshot prefix="LocalOne"/>
				<channel_snapshot prefix="LocalTwo"/>
				<channel_snapshot prefix="Source"/>
				<parameter name="DestUniqueId">
					<para>The unique ID of the bridge into which the local channel is optimizing.</para>
				</parameter>
				<parameter name="Id">
					<para>Identification for the optimization operation.</para>
				</parameter>
			</syntax>
			<see-also>
				<ref type="managerEvent">LocalOptimizationEnd</ref>
				<ref type="manager">LocalOptimizeAway</ref>
			</see-also>
		</managerEventInstance>
	</managerEvent>
	<managerEvent language="en_US" name="LocalOptimizationEnd" module="builtin">
		<managerEventInstance class="EVENT_FLAG_CALL" module="builtin">
			<since>
				<version>12.0.0</version>
			</since>
			<synopsis>Raised when two halves of a Local Channel have finished optimizing
			themselves out of the media path.</synopsis>
			<syntax>
				<channel_snapshot prefix="LocalOne"/>
				<channel_snapshot prefix="LocalTwo"/>
				<parameter name="Success">
					<para>Indicates whether the local optimization succeeded.</para>
				</parameter>
				<parameter name="Id">
					<para>Identification for the optimization operation. Matches the <replaceable>Id</replaceable>
					from a previous <literal>LocalOptimizationBegin</literal></para>
				</parameter>
			</syntax>
			<see-also>
				<ref type="managerEvent">LocalOptimizationBegin</ref>
				<ref type="manager">LocalOptimizeAway</ref>
			</see-also>
		</managerEventInstance>
	</managerEvent>
<module language="en_US" name="core_unreal">
	<support_level>core</support_level>
</module>
<module language="en_US" name="crypt">
	<support_level>core</support_level>
</module>
<module language="en_US" name="data_buffer">
	<support_level>core</support_level>
</module>
<module language="en_US" name="datastore">
	<support_level>core</support_level>
</module>
<module language="en_US" name="db">
	<support_level>core</support_level>
</module>
	<manager name="DBGet" language="en_US" module="builtin">
		<since>
			<version>1.2.0</version>
		</since>
		<synopsis>
			Get DB Entry.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="Family" required="true" />
			<parameter name="Key" required="true" />
		</syntax>
		<description>
		</description>
	</manager>
	<manager name="DBGetTree" language="en_US" module="builtin">
		<since>
			<version>19.6.0</version>
			<version>18.14.0</version>
			<version>16.28.0</version>
		</since>
		<synopsis>
			Get DB entries, optionally at a particular family/key
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="Family" required="false" />
			<parameter name="Key" required="false" />
		</syntax>
		<description>
		</description>
	</manager>
	<manager name="DBPut" language="en_US" module="builtin">
		<since>
			<version>1.2.0</version>
		</since>
		<synopsis>
			Put DB entry.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="Family" required="true" />
			<parameter name="Key" required="true" />
			<parameter name="Val" />
		</syntax>
		<description>
		</description>
	</manager>
	<manager name="DBDel" language="en_US" module="builtin">
		<since>
			<version>1.6.0</version>
		</since>
		<synopsis>
			Delete DB entry.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="Family" required="true" />
			<parameter name="Key" required="true" />
		</syntax>
		<description>
		</description>
	</manager>
	<manager name="DBDelTree" language="en_US" module="builtin">
		<since>
			<version>1.6.0</version>
		</since>
		<synopsis>
			Delete DB Tree.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="Family" required="true" />
			<parameter name="Key" />
		</syntax>
		<description>
		</description>
	</manager>
<module language="en_US" name="devicestate">
	<support_level>core</support_level>
</module>
	<managerEvent language="en_US" name="DeviceStateChange" module="builtin">
		<managerEventInstance class="EVENT_FLAG_CALL" module="builtin">
			<since>
				<version>13.0.0</version>
			</since>
			<synopsis>Raised when a device state changes</synopsis>
			<syntax>
				<parameter name="Device">
					<para>The device whose state has changed</para>
				</parameter>
				<parameter name="State">
					<para>The new state of the device</para>
				</parameter>
			</syntax>
			<description>
				<para>This differs from the <literal>ExtensionStatus</literal>
				event because this event is raised for all device state changes,
				not only for changes that affect dialplan hints.</para>
			</description>
			<see-also>
				<ref type="managerEvent">ExtensionStatus</ref>
			</see-also>
		</managerEventInstance>
	</managerEvent>
<module language="en_US" name="dial">
	<support_level>core</support_level>
</module>
<module language="en_US" name="dns">
	<support_level>core</support_level>
</module>
<module language="en_US" name="dns_core">
	<support_level>core</support_level>
</module>
<module language="en_US" name="dns_naptr">
	<support_level>core</support_level>
</module>
<module language="en_US" name="dns_query_set">
	<support_level>core</support_level>
</module>
<module language="en_US" name="dns_recurring">
	<support_level>core</support_level>
</module>
<module language="en_US" name="dns_srv">
	<support_level>core</support_level>
</module>
<module language="en_US" name="dns_test">
	<support_level>core</support_level>
</module>
<module language="en_US" name="dns_tlsa">
	<support_level>core</support_level>
</module>
<module language="en_US" name="dns_txt">
	<support_level>core</support_level>
</module>
<module language="en_US" name="dnsmgr">
	<support_level>core</support_level>
</module>
<module language="en_US" name="dsp">
	<support_level>core</support_level>
</module>
<module language="en_US" name="endpoints">
	<support_level>core</support_level>
</module>
<module language="en_US" name="enum">
	<support_level>core</support_level>
</module>
<module language="en_US" name="event">
	<support_level>core</support_level>
</module>
<module language="en_US" name="features">
	<support_level>core</support_level>
</module>
	<application name="Bridge" language="en_US" module="builtin">
		<since>
			<version>1.6.0</version>
		</since>
		<synopsis>
			Bridge two channels.
		</synopsis>
		<syntax>
			<parameter name="channel" required="true">
				<para>The current channel is bridged to the channel
				identified by the channel name, channel name prefix, or channel
				uniqueid.</para>
			</parameter>
			<parameter name="options">
				<optionlist>
					<option name="p">
						<para>Play a courtesy tone to <replaceable>channel</replaceable>.</para>
					</option>
					<option name="F" argsep="^">
						<argument name="context" required="false" />
						<argument name="exten" required="false" />
						<argument name="priority" required="true" />
						<para>When the bridger hangs up, transfer the <emphasis>bridged</emphasis> party
						to the specified destination and <emphasis>start</emphasis> execution at that location.</para>
						<note>
							<para>Any channel variables you want the called channel to inherit from the caller channel must be
							prefixed with one or two underbars ('_').</para>
						</note>
						<note>
							<para>This option will override the 'x' option</para>
						</note>
					</option>
					<option name="F">
						<para>When the bridger hangs up, transfer the <emphasis>bridged</emphasis> party
						to the next priority of	the current extension and <emphasis>start</emphasis> execution
						at that location.</para>
						<note>
							<para>Any channel variables you want the called channel to inherit from the caller channel must be
							prefixed with one or two underbars ('_').</para>
						</note>
						<note>
							<para>Using this option from a or Gosub() might not make sense as there would be no return points.</para>
						</note>
						<note>
							<para>This option will override the 'x' option</para>
						</note>
					</option>

					<option name="h">
						<para>Allow the called party to hang up by sending the
						<replaceable>*</replaceable> DTMF digit.</para>
					</option>
					<option name="H">
						<para>Allow the calling party to hang up by pressing the
						<replaceable>*</replaceable> DTMF digit.</para>
					</option>
					<option name="k">
						<para>Allow the called party to enable parking of the call by sending
						the DTMF sequence defined for call parking in <filename>features.conf</filename>.</para>
					</option>
					<option name="K">
						<para>Allow the calling party to enable parking of the call by sending
						 the DTMF sequence defined for call parking in <filename>features.conf</filename>.</para>
					</option>
					<option name="L(x[:y][:z])">
						<para>Limit the call to <replaceable>x</replaceable> ms. Play a warning
						when <replaceable>y</replaceable> ms are left. Repeat the warning every
						<replaceable>z</replaceable> ms. The following special variables can be
						used with this option:</para>
						<variablelist>
							<variable name="LIMIT_PLAYAUDIO_CALLER">
								<para>Play sounds to the caller. yes|no (default yes)</para>
							</variable>
							<variable name="LIMIT_PLAYAUDIO_CALLEE">
								<para>Play sounds to the callee. yes|no</para>
							</variable>
							<variable name="LIMIT_TIMEOUT_FILE">
								<para>File to play when time is up.</para>
							</variable>
							<variable name="LIMIT_CONNECT_FILE">
								<para>File to play when call begins.</para>
							</variable>
							<variable name="LIMIT_WARNING_FILE">
								<para>File to play as warning if <replaceable>y</replaceable> is
								defined. The default is to say the time remaining.</para>
							</variable>
						</variablelist>
					</option>
					<option name="n">
						<para>Do not answer the channel automatically before bridging.</para>
						<para>Additionally, to prevent a bridged channel (the target of the Bridge application)
						from answering, the <literal>BRIDGE_NOANSWER</literal> variable can be set to inhibit
						answering.</para>
						<warning><para>Do not set the <literal>BRIDGE_NOANSWER</literal> variable globally,
						as it will break normal bridging behavior in many cases. Only use this variable on
						a per-channel basis when you really know what you are doing!</para></warning>
					</option>
					<option name="S(x)">
						<para>Hang up the call after <replaceable>x</replaceable> seconds *after* the called party has answered the call.</para>
					</option>
					<option name="t">
						<para>Allow the called party to transfer the calling party by sending the
						DTMF sequence defined in <filename>features.conf</filename>.</para>
					</option>
					<option name="T">
						<para>Allow the calling party to transfer the called party by sending the
						DTMF sequence defined in <filename>features.conf</filename>.</para>
					</option>
					<option name="w">
						<para>Allow the called party to enable recording of the call by sending
						the DTMF sequence defined for one-touch recording in <filename>features.conf</filename>.</para>
					</option>
					<option name="W">
						<para>Allow the calling party to enable recording of the call by sending
						the DTMF sequence defined for one-touch recording in <filename>features.conf</filename>.</para>
					</option>
					<option name="x">
						<para>Cause the called party to be hung up after the bridge, instead of being
						restarted in the dialplan.</para>
					</option>
				</optionlist>
			</parameter>
		</syntax>
		<description>
			<para>Allows the ability to bridge two channels via the dialplan.</para>
			<para>This application sets the following channel variable upon completion:</para>
			<variablelist>
				<variable name="BRIDGERESULT">
					<para>The result of the bridge attempt as a text string.</para>
					<value name="SUCCESS" />
					<value name="FAILURE" />
					<value name="LOOP" />
					<value name="NONEXISTENT" />
				</variable>
			</variablelist>
		</description>
		<see-also>
			<ref type="manager">Bridge</ref>
			<ref type="managerEvent">BridgeCreate</ref>
			<ref type="managerEvent">BridgeEnter</ref>
		</see-also>
	</application>
	<manager name="Bridge" language="en_US" module="builtin">
		<since>
			<version>1.6.0</version>
		</since>
		<synopsis>
			Bridge two channels already in the PBX.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="Channel1" required="true">
				<para>Channel to Bridge to Channel2.</para>
			</parameter>
			<parameter name="Channel2" required="true">
				<para>Channel to Bridge to Channel1.</para>
			</parameter>
			<parameter name="Tone">
				<para>Play courtesy tone to Channel 2.</para>
				<enumlist>
					<enum name="no" />
					<enum name="Channel1" />
					<enum name="Channel2" />
					<enum name="Both" />
				</enumlist>
			</parameter>
		</syntax>
		<description>
			<para>Bridge together two channels already in the PBX.</para>
		</description>
		<see-also>
			<ref type="application">Bridge</ref>
			<ref type="managerEvent">BridgeCreate</ref>
			<ref type="managerEvent">BridgeEnter</ref>
			<ref type="manager">BridgeDestroy</ref>
			<ref type="manager">BridgeInfo</ref>
			<ref type="manager">BridgeKick</ref>
			<ref type="manager">BridgeList</ref>
		</see-also>
	</manager>
	<configInfo name="features" language="en_US">
		<synopsis>Features Configuration</synopsis>
		<configFile name="features.conf">
			<configObject name="globals">
				<since>
					<version>12.0.0</version>
				</since>
				<synopsis>
				</synopsis>
				<configOption name="featuredigittimeout" default="1000">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Milliseconds allowed between digit presses when entering a feature code.</synopsis>
				</configOption>
				<configOption name="courtesytone">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Sound to play when automixmon is activated</synopsis>
				</configOption>
				<configOption name="recordingfailsound">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Sound to play when automixmon is attempted but fails to start</synopsis>
				</configOption>
				<configOption name="transferdigittimeout" default="3">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Seconds allowed between digit presses when dialing a transfer destination</synopsis>
				</configOption>
				<configOption name="atxfernoanswertimeout" default="15">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Seconds to wait for attended transfer destination to answer</synopsis>
				</configOption>
				<configOption name="atxferdropcall" default="no">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Hang up the call entirely if the attended transfer fails</synopsis>
					<description>
						<para>When this option is set to <literal>no</literal>, then Asterisk will attempt to
						re-call the transferrer if the call to the transfer target fails. If the call to the
						transferrer fails, then Asterisk will wait <replaceable>atxferloopdelay</replaceable>
						milliseconds and then attempt to dial the transfer target again. This process will
						repeat until <replaceable>atxfercallbackretries</replaceable> attempts to re-call
						the transferrer have occurred.</para>
						<para>When this option is set to <literal>yes</literal>, then Asterisk will not attempt
						to re-call the transferrer if the call to the transfer target fails. Asterisk will instead
						hang up all channels involved in the transfer.</para>
					</description>
				</configOption>
				<configOption name="atxferloopdelay" default="10">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Seconds to wait between attempts to re-dial transfer destination</synopsis>
					<see-also><ref type="configOption">atxferdropcall</ref></see-also>
				</configOption>
				<configOption name="atxfercallbackretries" default="2">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Number of times to re-attempt dialing a transfer destination</synopsis>
					<see-also><ref type="configOption">atxferdropcall</ref></see-also>
				</configOption>
				<configOption name="xfersound" default="beep">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Sound to play to during transfer and transfer-like operations.</synopsis>
					<description>
						<para>This sound will play to the transferrer and transfer target channels when
						an attended transfer completes. This sound is also played to channels when performing
						an AMI <literal>Bridge</literal> action.</para>
					</description>
				</configOption>
				<configOption name="xferfailsound" default="beeperr">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Sound to play to a transferee when a transfer fails</synopsis>
				</configOption>
				<configOption name="atxferabort" default="*1">
					<synopsis>Digits to dial to abort an attended transfer attempt</synopsis>
					<description>
						<para>This option is only available to the transferrer during an attended
						transfer operation. Aborting a transfer results in the transfer being cancelled and
						the original parties in the call being re-bridged.</para>
					</description>
				</configOption>
				<configOption name="atxfercomplete" default="*2">
					<synopsis>Digits to dial to complete an attended transfer</synopsis>
					<description>
						<para>This option is only available to the transferrer during an attended
						transfer operation. Completing the transfer with a DTMF sequence is functionally
						equivalent to hanging up the transferrer channel during an attended transfer. The
						result is that the transfer target and transferees are bridged.</para>
					</description>
				</configOption>
				<configOption name="atxferthreeway" default="*3">
					<synopsis>Digits to dial to change an attended transfer into a three-way call</synopsis>
					<description>
						<para>This option is only available to the transferrer during an attended
						transfer operation. Pressing this DTMF sequence will result in the transferrer,
						the transferees, and the transfer target all being in a single bridge together.</para>
					</description>
				</configOption>
				<configOption name="atxferswap" default="*4">
					<synopsis>Digits to dial to toggle who the transferrer is currently bridged to during an attended transfer</synopsis>
					<description>
						<para>This option is only available to the transferrer during an attended
						transfer operation. Pressing this DTMF sequence will result in the transferrer swapping
						which party he is bridged with. For instance, if the transferrer is currently bridged with
						the transfer target, then pressing this DTMF sequence will cause the transferrer to be
						bridged with the transferees.</para>
					</description>
				</configOption>
				<configOption name="pickupexten" default="*8">
					<synopsis>Digits used for picking up ringing calls</synopsis>
					<description>
						<para>In order for the pickup attempt to be successful, the party attempting to
						pick up the call must either have a <replaceable>namedpickupgroup</replaceable> in
						common with a ringing party's <replaceable>namedcallgroup</replaceable> or must
						have a <replaceable>pickupgroup</replaceable> in common with a ringing party's
						<replaceable>callgroup</replaceable>.</para>
					</description>
				</configOption>
				<configOption name="pickupsound">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Sound to play to picker when a call is picked up</synopsis>
				</configOption>
				<configOption name="pickupfailsound">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Sound to play to picker when a call cannot be picked up</synopsis>
				</configOption>
				<configOption name="transferdialattempts" default="3">
					<since>
						<version>13.1.0</version>
					</since>
					<synopsis>Number of dial attempts allowed when attempting a transfer</synopsis>
				</configOption>
				<configOption name="transferretrysound" default="pbx-invalid">
					<since>
						<version>13.1.0</version>
					</since>
					<synopsis>Sound that is played when an incorrect extension is dialed and the transferer should try again.</synopsis>
				</configOption>
				<configOption name="transferinvalidsound" default="privacy-incorrect">
					<since>
						<version>13.1.0</version>
					</since>
					<synopsis>Sound that is played when an incorrect extension is dialed and the transferer has no attempts remaining.</synopsis>
				</configOption>
				<configOption name="transferannouncesound" default="pbx-transfer">
					<since>
						<version>16.29.0</version>
						<version>18.15.0</version>
						<version>19.7.0</version>
					</since>
					<synopsis>Sound that is played to the transferer when a transfer is initiated. If empty, no sound will be played.</synopsis>
				</configOption>
			</configObject>
			<configObject name="featuremap">
				<since>
					<version>12.0.0</version>
				</since>
				<synopsis>DTMF options that can be triggered during bridged calls</synopsis>
				<configOption name="atxfer">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>DTMF sequence to initiate an attended transfer</synopsis>
					<description>
						<para>The transferee parties will be placed on hold and the
						transferrer may dial an extension to reach a transfer target. During an
						attended transfer, the transferrer may consult with the transfer target
						before completing the transfer. Once the transferrer has hung up or pressed
						the <replaceable>atxfercomplete</replaceable> DTMF sequence, then the transferees
						and transfer target will be bridged.</para>
					</description>
				</configOption>
				<configOption name="blindxfer" default="#">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>DTMF sequence to initiate a blind transfer</synopsis>
					<description>
						<para>The transferee parties will be placed on hold and the
						transferrer may dial an extension to reach a transfer target. During a
						blind transfer, as soon as the transfer target is dialed, the transferrer
						is hung up.</para>
					</description>
				</configOption>
				<configOption name="disconnect" default="*">
					<synopsis>DTMF sequence to disconnect the current call</synopsis>
					<description>
						<para>Entering this DTMF sequence will cause the bridge to end, no
						matter the number of parties present</para>
					</description>
				</configOption>
				<configOption name="parkcall">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>DTMF sequence to park a call</synopsis>
					<description>
						<para>The parking lot used to park the call is determined by using either the
						<replaceable>PARKINGLOT</replaceable> channel variable or a configured value on
						the channel (provided by the channel driver) if the variable is not present. If
						no configured value on the channel is present, then <literal>"default"</literal>
						is used. The call is parked in the next available space in the parking lot.</para>
					</description>
				</configOption>
				<configOption name="automixmon">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>DTMF sequence to start or stop MixMonitor on a call</synopsis>
					<description>
						<para>This will cause the channel that pressed the DTMF sequence
						to be monitored by the <literal>MixMonitor</literal> application. The
						format for the recording is determined by the <replaceable>TOUCH_MIXMONITOR_FORMAT</replaceable>
						channel variable. If this variable is not specified, then <literal>wav</literal> is the
						default. The filename is constructed in the following manner:</para>
						<para>    prefix-timestamp-suffix.fmt</para>
						<para>where prefix is either the value of the <replaceable>TOUCH_MIXMONITOR_PREFIX</replaceable>
						channel variable or <literal>auto</literal> if the variable is not set. The timestamp
						is a UNIX timestamp. The suffix is either the value of the <replaceable>TOUCH_MIXMONITOR</replaceable>
						channel variable or the callerID of the channels if the variable is not set.</para>
						<para>To play a periodic beep while this call is being recorded, set the
						<replaceable>TOUCH_MIXMONITOR_BEEP</replaceable> to the interval in seconds. The interval will default
						to 15 seconds if invalid.  The minimum interval is 5 seconds.</para>
					</description>
				</configOption>
			</configObject>
			<configObject name="applicationmap">
				<since>
					<version>12.0.0</version>
				</since>
				<synopsis>Section for defining custom feature invocations during a call</synopsis>
				<description>
					<para>The applicationmap is an area where new custom features can be created. Items
					defined in the applicationmap are not automatically accessible to bridged parties. Access
					to the individual items is controlled using the <replaceable>DYNAMIC_FEATURES</replaceable> channel variable.
					The <replaceable>DYNAMIC_FEATURES</replaceable> is a <literal>#</literal> separated list of
					either applicationmap item names or featuregroup names.</para>
				</description>
				<configOption name="">
					<synopsis>A custom feature to invoke during a bridged call</synopsis>
					<description>
						<para>Each item listed here is a comma-separated list of parameters that determine
						how a feature may be invoked during a call</para>
						<para>    Example:</para>
						<para>    eggs = *5,self,Playback(hello-world),default</para>
						<para>This would create a feature called <literal>eggs</literal> that could be invoked
						during a call by pressing the <literal>*5</literal>. The party that presses the DTMF
						sequence would then trigger the <literal>Playback</literal> application to play the
						<literal>hello-world</literal> file. The application invocation would happen on the
						party that pressed the DTMF sequence since <literal>self</literal> is specified. The
						other parties in the bridge would hear the <literal>default</literal> music on hold
						class during the playback.</para>
						<para>In addition to the syntax outlined in this documentation, a backwards-compatible alternative
						is also allowed. The following applicationmap lines are functionally identical:</para>
						<para>    eggs = *5,self,Playback(hello-world),default</para>
						<para>    eggs = *5,self,Playback,hello-world,default</para>
						<para>    eggs = *5,self,Playback,"hello-world",default</para>
					</description>
					<syntax argsep=",">
						<parameter name="dtmf" required="true">
							<para>The DTMF sequence used to trigger the option</para>
						</parameter>
						<parameter name="activate_on" required="true">
							<para>The party that the feature will be invoked on</para>
							<optionlist>
								<option name="self"><para>Feature is invoked on party that presses the DTMF sequence</para></option>
								<option name="peer"><para>Feature is invoked on other parties in the bridge</para></option>
							</optionlist>
						</parameter>
						<parameter name="app" required="true">
							<para>The dialplan application to run when the DTMF sequence is pressed</para>
							<argument name="app_args" required="false">
								<para>The arguments to the dialplan application to run</para>
							</argument>
						</parameter>
						<parameter name="moh_class" required="false">
							<para>Music on hold class to play to bridge participants that are not the target of the application invocation</para>
						</parameter>
					</syntax>
				</configOption>
			</configObject>
			<configObject name="featuregroup">
				<since>
					<version>12.0.0</version>
				</since>
				<synopsis>Groupings of items from the applicationmap</synopsis>
				<description>
					<para>Feature groups allow for multiple applicationmap items to be
					grouped together. Like with individual applicationmap items, feature groups
					can be part of the <replaceable>DYNAMIC_FEATURES</replaceable> channel variable.
					In addition to creating groupings, the feature group section allows for the
					DTMF sequence used to invoke an applicationmap item to be overridden with
					a different sequence.</para>
				</description>
				<configOption name="">
					<synopsis>Applicationmap item to place in the feature group</synopsis>
					<description>
						<para>Each item here must be a name of an item in the applicationmap. The
						argument may either be a new DTMF sequence to use for the item or it
						may be left blank in order to use the DTMF sequence specified in the
						applicationmap. For example:</para>
						<para>	eggs => *1</para>
						<para>	bacon =></para>
						<para>would result in the applicationmap items <literal>eggs</literal> and
						<literal>bacon</literal> being in the featuregroup. The former would have its
						default DTMF trigger overridden with <literal>*1</literal> and the latter would
						have the DTMF value specified in the applicationmap.</para>
					</description>
				</configOption>
			</configObject>
		</configFile>
	</configInfo>
	<function name="FEATURE" language="en_US" module="builtin">
		<since>
			<version>12.0.0</version>
		</since>
		<synopsis>
			Get or set a feature option on a channel.
		</synopsis>
		<syntax>
			<parameter name="option_name" required="true">
				<para>The allowed values are:</para>
				<enumlist>
					<enum name="inherit"><para>Inherit feature settings made in FEATURE or FEATUREMAP to child channels.</para></enum>
					<enum name="featuredigittimeout"><para><xi:include xpointer="xpointer(/docs/configInfo[@name='features']/configFile[@name='features.conf']/configObject[@name='globals']/configOption[@name='featuredigittimeout']/synopsis/text())" /></para></enum>
					<enum name="transferdigittimeout"><para><xi:include xpointer="xpointer(/docs/configInfo[@name='features']/configFile[@name='features.conf']/configObject[@name='globals']/configOption[@name='transferdigittimeout']/synopsis/text())" /></para></enum>
					<enum name="atxfernoanswertimeout"><para><xi:include xpointer="xpointer(/docs/configInfo[@name='features']/configFile[@name='features.conf']/configObject[@name='globals']/configOption[@name='atxfernoanswertimeout']/synopsis/text())" /></para></enum>
					<enum name="atxferdropcall"><para><xi:include xpointer="xpointer(/docs/configInfo[@name='features']/configFile[@name='features.conf']/configObject[@name='globals']/configOption[@name='atxferdropcall']/synopsis/text())" /></para></enum>
					<enum name="atxferloopdelay"><para><xi:include xpointer="xpointer(/docs/configInfo[@name='features']/configFile[@name='features.conf']/configObject[@name='globals']/configOption[@name='atxferloopdelay']/synopsis/text())" /></para></enum>
					<enum name="atxfercallbackretries"><para><xi:include xpointer="xpointer(/docs/configInfo[@name='features']/configFile[@name='features.conf']/configObject[@name='globals']/configOption[@name='atxfercallbackretries']/synopsis/text())" /></para></enum>
					<enum name="xfersound"><para><xi:include xpointer="xpointer(/docs/configInfo[@name='features']/configFile[@name='features.conf']/configObject[@name='globals']/configOption[@name='xfersound']/synopsis/text())" /></para></enum>
					<enum name="xferfailsound"><para><xi:include xpointer="xpointer(/docs/configInfo[@name='features']/configFile[@name='features.conf']/configObject[@name='globals']/configOption[@name='xferfailsound']/synopsis/text())" /></para></enum>
					<enum name="atxferabort"><para><xi:include xpointer="xpointer(/docs/configInfo[@name='features']/configFile[@name='features.conf']/configObject[@name='globals']/configOption[@name='atxferabort']/synopsis/text())" /></para></enum>
					<enum name="atxfercomplete"><para><xi:include xpointer="xpointer(/docs/configInfo[@name='features']/configFile[@name='features.conf']/configObject[@name='globals']/configOption[@name='atxfercomplete']/synopsis/text())" /></para></enum>
					<enum name="atxferthreeway"><para><xi:include xpointer="xpointer(/docs/configInfo[@name='features']/configFile[@name='features.conf']/configObject[@name='globals']/configOption[@name='atxferthreeway']/synopsis/text())" /></para></enum>
					<enum name="pickupexten"><para><xi:include xpointer="xpointer(/docs/configInfo[@name='features']/configFile[@name='features.conf']/configObject[@name='globals']/configOption[@name='pickupexten']/synopsis/text())" /></para></enum>
					<enum name="pickupsound"><para><xi:include xpointer="xpointer(/docs/configInfo[@name='features']/configFile[@name='features.conf']/configObject[@name='globals']/configOption[@name='pickupsound']/synopsis/text())" /></para></enum>
					<enum name="pickupfailsound"><para><xi:include xpointer="xpointer(/docs/configInfo[@name='features']/configFile[@name='features.conf']/configObject[@name='globals']/configOption[@name='pickupfailsound']/synopsis/text())" /></para></enum>
					<enum name="courtesytone"><para><xi:include xpointer="xpointer(/docs/configInfo[@name='features']/configFile[@name='features.conf']/configObject[@name='globals']/configOption[@name='courtesytone']/synopsis/text())" /></para></enum>
					<enum name="recordingfailsound"><para><xi:include xpointer="xpointer(/docs/configInfo[@name='features']/configFile[@name='features.conf']/configObject[@name='globals']/configOption[@name='recordingfailsound']/synopsis/text())" /></para></enum>
					<enum name="transferdialattempts"><para><xi:include xpointer="xpointer(/docs/configInfo[@name='features']/configFile[@name='features.conf']/configObject[@name='globals']/configOption[@name='transferdialattempts']/synopsis/text())" /></para></enum>
					<enum name="transferretrysound"><para><xi:include xpointer="xpointer(/docs/configInfo[@name='features']/configFile[@name='features.conf']/configObject[@name='globals']/configOption[@name='transferretrysound']/synopsis/text())" /></para></enum>
					<enum name="transferinvalidsound"><para><xi:include xpointer="xpointer(/docs/configInfo[@name='features']/configFile[@name='features.conf']/configObject[@name='globals']/configOption[@name='transferinvalidsound']/synopsis/text())" /></para></enum>
					<enum name="transferannouncesound"><para><xi:include xpointer="xpointer(/docs/configInfo[@name='features']/configFile[@name='features.conf']/configObject[@name='globals']/configOption[@name='transferannouncesound']/synopsis/text())" /></para></enum>
				</enumlist>
			</parameter>
		</syntax>
		<description>
			<para>When this function is used as a read, it will get the current
			value of the specified feature option for this channel.  It will be
			the value of this option configured in features.conf if a channel specific
			value has not been set.  This function can also be used to set a channel
			specific value for the supported feature options.</para>
		</description>
		<see-also>
			<ref type="function">FEATUREMAP</ref>
		</see-also>
	</function>
	<function name="FEATUREMAP" language="en_US" module="builtin">
		<since>
			<version>12.0.0</version>
		</since>
		<synopsis>
			Get or set a feature map to a given value on a specific channel.
		</synopsis>
		<syntax>
			<parameter name="feature_name" required="true">
				<para>The allowed values are:</para>
				<enumlist>
					<enum name="atxfer"><para>Attended Transfer</para></enum>
					<enum name="blindxfer"><para>Blind Transfer</para></enum>
					<enum name="disconnect"><para>Call Disconnect</para></enum>
					<enum name="parkcall"><para>Park Call</para></enum>
					<enum name="automixmon"><para>Auto MixMonitor</para></enum>
				</enumlist>
			</parameter>
		</syntax>
		<description>
			<para>When this function is used as a read, it will get the current
			digit sequence mapped to the specified feature for this channel.  This
			value will be the one configured in features.conf if a channel specific
			value has not been set.  This function can also be used to set a channel
			specific value for a feature mapping.</para>
		</description>
		<see-also>
			<ref type="function">FEATURE</ref>
		</see-also>
	</function>
<module language="en_US" name="file">
	<support_level>core</support_level>
</module>
<module language="en_US" name="fixedjitterbuf">
	<support_level>core</support_level>
</module>
<module language="en_US" name="format">
	<support_level>core</support_level>
</module>
<module language="en_US" name="format_cache">
	<support_level>core</support_level>
</module>
<module language="en_US" name="format_cap">
	<support_level>core</support_level>
</module>
<module language="en_US" name="format_compatibility">
	<support_level>core</support_level>
</module>
<module language="en_US" name="frame">
	<support_level>core</support_level>
</module>
<module language="en_US" name="framehook">
	<support_level>core</support_level>
</module>
<module language="en_US" name="fskmodem">
	<support_level>core</support_level>
</module>
<module language="en_US" name="fskmodem_float">
	<support_level>core</support_level>
</module>
<module language="en_US" name="fskmodem_int">
	<support_level>core</support_level>
</module>
<module language="en_US" name="global_datastores">
	<support_level>core</support_level>
</module>
<module language="en_US" name="hashtab">
	<support_level>core</support_level>
</module>
<module language="en_US" name="heap">
	<support_level>core</support_level>
</module>
<module language="en_US" name="http">
	<support_level>core</support_level>
</module>
<module language="en_US" name="image">
	<support_level>core</support_level>
</module>
<module language="en_US" name="indications">
	<support_level>core</support_level>
</module>
<module language="en_US" name="io">
	<support_level>core</support_level>
</module>
<module language="en_US" name="jitterbuf">
	<support_level>core</support_level>
</module>
<module language="en_US" name="json">
	<depend>jansson</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="libasteriskpj">
	<support_level>core</support_level>
</module>
<module language="en_US" name="loader">
	<support_level>core</support_level>
</module>
	<managerEvent language="en_US" name="Reload" module="builtin">
		<managerEventInstance class="EVENT_FLAG_SYSTEM" module="builtin">
			<since>
				<version>12.0.0</version>
			</since>
			<synopsis>Raised when a module has been reloaded in Asterisk.</synopsis>
			<syntax>
				<parameter name="Module">
					<para>The name of the module that was reloaded, or
					<literal>All</literal> if all modules were reloaded</para>
				</parameter>
				<parameter name="Status">
					<para>The numeric status code denoting the success or failure
					of the reload request.</para>
					<enumlist>
						<enum name="0"><para>Success</para></enum>
						<enum name="1"><para>Request queued</para></enum>
						<enum name="2"><para>Module not found</para></enum>
						<enum name="3"><para>Error</para></enum>
						<enum name="4"><para>Reload already in progress</para></enum>
						<enum name="5"><para>Module uninitialized</para></enum>
						<enum name="6"><para>Reload not supported</para></enum>
					</enumlist>
				</parameter>
			</syntax>
		</managerEventInstance>
	</managerEvent>
	<managerEvent language="en_US" name="Load" module="builtin">
		<managerEventInstance class="EVENT_FLAG_SYSTEM" module="builtin">
			<since>
				<version>16.0.0</version>
			</since>
			<synopsis>Raised when a module has been loaded in Asterisk.</synopsis>
			<syntax>
				<parameter name="Module">
					<para>The name of the module that was loaded</para>
				</parameter>
				<parameter name="Status">
					<para>The result of the load request.</para>
					<enumlist>
						<enum name="Failure"><para>Module could not be loaded properly</para></enum>
						<enum name="Success"><para>Module loaded and configured</para></enum>
						<enum name="Decline"><para>Module is not configured</para></enum>
					</enumlist>
				</parameter>
			</syntax>
		</managerEventInstance>
	</managerEvent>
	<managerEvent language="en_US" name="Unload" module="builtin">
		<managerEventInstance class="EVENT_FLAG_SYSTEM" module="builtin">
			<since>
				<version>16.0.0</version>
			</since>
			<synopsis>Raised when a module has been unloaded in Asterisk.</synopsis>
			<syntax>
				<parameter name="Module">
					<para>The name of the module that was unloaded</para>
				</parameter>
				<parameter name="Status">
					<para>The result of the unload request.</para>
					<enumlist>
						<enum name="Success"><para>Module unloaded successfully</para></enum>
					</enumlist>
				</parameter>
			</syntax>
		</managerEventInstance>
	</managerEvent>
<module language="en_US" name="lock">
	<support_level>core</support_level>
</module>
							<managerEvent language="en_US" name="DeadlockStart" module="builtin">
								<managerEventInstance class="EVENT_FLAG_SYSTEM" module="builtin">
									<since>
										<version>16.29.0</version>
										<version>18.15.0</version>
										<version>19.7.0</version>
									</since>
									<synopsis>Raised when a probable deadlock has started.
									Delivery of this event is attempted but not guaranteed,
                                                                        and could fail for example if the manager itself is deadlocked.
                                                                        </synopsis>
										<syntax>
											<parameter name="Mutex">
												<para>The mutex involved in the deadlock.</para>
											</parameter>
										</syntax>
								</managerEventInstance>
							</managerEvent>
<module language="en_US" name="logger">
	<support_level>core</support_level>
</module>
<module language="en_US" name="manager">
	<support_level>core</support_level>
</module>
	<managerEvent language="en_US" name="BridgeCreate" module="builtin">
		<managerEventInstance class="EVENT_FLAG_CALL" module="builtin">
			<since>
				<version>12.0.0</version>
			</since>
			<synopsis>Raised when a bridge is created.</synopsis>
			<syntax>
				<bridge_snapshot/>
			</syntax>
			<see-also>
				<ref type="managerEvent">BridgeDestroy</ref>
				<ref type="managerEvent">BridgeEnter</ref>
				<ref type="managerEvent">BridgeLeave</ref>
			</see-also>
		</managerEventInstance>
	</managerEvent>
	<managerEvent language="en_US" name="BridgeDestroy" module="builtin">
		<managerEventInstance class="EVENT_FLAG_CALL" module="builtin">
			<since>
				<version>12.0.0</version>
			</since>
			<synopsis>Raised when a bridge is destroyed.</synopsis>
			<syntax>
				<bridge_snapshot/>
			</syntax>
			<see-also>
				<ref type="managerEvent">BridgeCreate</ref>
				<ref type="managerEvent">BridgeEnter</ref>
				<ref type="managerEvent">BridgeLeave</ref>
			</see-also>
		</managerEventInstance>
	</managerEvent>
	<managerEvent language="en_US" name="BridgeEnter" module="builtin">
		<managerEventInstance class="EVENT_FLAG_CALL" module="builtin">
			<since>
				<version>12.0.0</version>
			</since>
			<synopsis>Raised when a channel enters a bridge.</synopsis>
			<syntax>
				<bridge_snapshot/>
				<channel_snapshot/>
				<parameter name="SwapUniqueid">
					<para>The uniqueid of the channel being swapped out of the bridge</para>
				</parameter>
			</syntax>
			<see-also>
				<ref type="managerEvent">BridgeCreate</ref>
				<ref type="managerEvent">BridgeDestroy</ref>
				<ref type="managerEvent">BridgeLeave</ref>
			</see-also>
		</managerEventInstance>
	</managerEvent>
	<managerEvent language="en_US" name="BridgeLeave" module="builtin">
		<managerEventInstance class="EVENT_FLAG_CALL" module="builtin">
			<since>
				<version>12.0.0</version>
			</since>
			<synopsis>Raised when a channel leaves a bridge.</synopsis>
			<syntax>
				<bridge_snapshot/>
				<channel_snapshot/>
			</syntax>
			<see-also>
				<ref type="managerEvent">BridgeCreate</ref>
				<ref type="managerEvent">BridgeDestroy</ref>
				<ref type="managerEvent">BridgeEnter</ref>
			</see-also>
		</managerEventInstance>
	</managerEvent>
	<managerEvent language="en_US" name="BridgeVideoSourceUpdate" module="builtin">
		<managerEventInstance class="EVENT_FLAG_CALL" module="builtin">
			<since>
				<version>13.13.0</version>
				<version>14.2.0</version>
			</since>
			<synopsis>Raised when the channel that is the source of video in a bridge changes.</synopsis>
			<syntax>
				<bridge_snapshot/>
				<parameter name="BridgePreviousVideoSource">
					<para>The unique ID of the channel that was the video source.</para>
				</parameter>
			</syntax>
			<see-also>
				<ref type="managerEvent">BridgeCreate</ref>
				<ref type="managerEvent">BridgeDestroy</ref>
			</see-also>
		</managerEventInstance>
	</managerEvent>
	<manager name="BridgeList" language="en_US" module="builtin">
		<since>
			<version>12.0.0</version>
		</since>
		<synopsis>
			Get a list of bridges in the system.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="BridgeType">
				<para>Optional type for filtering the resulting list of bridges.</para>
			</parameter>
		</syntax>
		<description>
			<para>Returns a list of bridges, optionally filtering on a bridge type.</para>
		</description>
		<see-also>
			<ref type="manager">Bridge</ref>
			<ref type="manager">BridgeDestroy</ref>
			<ref type="manager">BridgeInfo</ref>
			<ref type="manager">BridgeKick</ref>
		</see-also>
	</manager>
	<manager name="BridgeInfo" language="en_US" module="builtin">
		<since>
			<version>12.0.0</version>
		</since>
		<synopsis>
			Get information about a bridge.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="BridgeUniqueid" required="true">
				<para>The unique ID of the bridge about which to retrieve information.</para>
			</parameter>
		</syntax>
		<description>
			<para>Returns detailed information about a bridge and the channels in it.</para>
		</description>
		<see-also>
			<ref type="manager">Bridge</ref>
			<ref type="manager">BridgeDestroy</ref>
			<ref type="manager">BridgeKick</ref>
			<ref type="manager">BridgeList</ref>
		</see-also>
		<responses>
			<list-elements>
				<managerEvent language="en_US" name="BridgeInfoChannel" module="builtin">
					<managerEventInstance class="EVENT_FLAG_COMMAND" module="builtin">
						<since>
							<version>13.0.0</version>
						</since>
						<synopsis>Information about a channel in a bridge.</synopsis>
						<syntax>
							<channel_snapshot/>
						</syntax>
					</managerEventInstance>
				</managerEvent>
			</list-elements>
			<managerEvent language="en_US" name="BridgeInfoComplete" module="builtin">
				<managerEventInstance class="EVENT_FLAG_COMMAND" module="builtin">
					<since>
						<version>13.0.0</version>
					</since>
					<synopsis>Information about a bridge.</synopsis>
					<syntax>
						<bridge_snapshot/>
					</syntax>
				</managerEventInstance>
			</managerEvent>
		</responses>
	</manager>
	<manager name="BridgeDestroy" language="en_US" module="builtin">
		<since>
			<version>12.0.0</version>
		</since>
		<synopsis>
			Destroy a bridge.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="BridgeUniqueid" required="true">
				<para>The unique ID of the bridge to destroy.</para>
			</parameter>
		</syntax>
		<description>
			<para>Deletes the bridge, causing channels to continue or hang up.</para>
		</description>
		<see-also>
			<ref type="manager">Bridge</ref>
			<ref type="manager">BridgeInfo</ref>
			<ref type="manager">BridgeKick</ref>
			<ref type="manager">BridgeList</ref>
			<ref type="managerEvent">BridgeDestroy</ref>
		</see-also>
	</manager>
	<manager name="BridgeKick" language="en_US" module="builtin">
		<since>
			<version>12.0.0</version>
		</since>
		<synopsis>
			Kick a channel from a bridge.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="BridgeUniqueid" required="false">
				<para>The unique ID of the bridge containing the channel to
				destroy.  This parameter can be omitted, or supplied to insure
				that the channel is not removed from the wrong bridge.</para>
			</parameter>
			<parameter name="Channel" required="true">
				<para>The channel to kick out of a bridge.</para>
			</parameter>
		</syntax>
		<description>
			<para>The channel is removed from the bridge.</para>
		</description>
		<see-also>
			<ref type="manager">Bridge</ref>
			<ref type="manager">BridgeDestroy</ref>
			<ref type="manager">BridgeInfo</ref>
			<ref type="manager">BridgeList</ref>
			<ref type="managerEvent">BridgeLeave</ref>
		</see-also>
	</manager>
		<managerEvent language="en_US" name="BridgeMerge" module="builtin">
			<managerEventInstance class="EVENT_FLAG_CALL" module="builtin">
				<since>
					<version>16.24.0</version>
					<version>18.10.0</version>
					<version>19.2.0</version>
				</since>
				<synopsis>Raised when two bridges are merged.</synopsis>
				<syntax>
					<bridge_snapshot prefix="To"/>
					<bridge_snapshot prefix="From"/>
				</syntax>
			</managerEventInstance>
		</managerEvent>
	<managerEvent language="en_US" name="Newchannel" module="builtin">
		<managerEventInstance class="EVENT_FLAG_CALL" module="builtin">
			<since>
				<version>12.0.0</version>
			</since>
			<synopsis>Raised when a new channel is created.</synopsis>
			<syntax>
				<channel_snapshot/>
			</syntax>
			<see-also>
				<ref type="managerEvent">Newstate</ref>
				<ref type="managerEvent">Hangup</ref>
			</see-also>
		</managerEventInstance>
	</managerEvent>
	<managerEvent language="en_US" name="Newstate" module="builtin">
		<managerEventInstance class="EVENT_FLAG_CALL" module="builtin">
			<since>
				<version>12.0.0</version>
			</since>
			<synopsis>Raised when a channel's state changes.</synopsis>
			<syntax>
				<channel_snapshot/>
			</syntax>
			<see-also>
				<ref type="managerEvent">Newchannel</ref>
				<ref type="managerEvent">Hangup</ref>
			</see-also>
		</managerEventInstance>
	</managerEvent>
	<managerEvent language="en_US" name="Hangup" module="builtin">
		<managerEventInstance class="EVENT_FLAG_CALL" module="builtin">
			<since>
				<version>12.0.0</version>
			</since>
			<synopsis>Raised when a channel is hung up.</synopsis>
			<syntax>
				<channel_snapshot/>
				<parameter name="Cause">
					<para>A numeric cause code for why the channel was hung up.</para>
				</parameter>
				<parameter name="Cause-txt">
					<para>A description of why the channel was hung up.</para>
				</parameter>
				<parameter name="TechCause">
					<para>A technology-specific off-nominal numeric cause code
					for why the channel was hung up.  Suppressed for nominally
					terminated calls.</para>
				</parameter>
			</syntax>
			<see-also>
				<ref type="managerEvent">Newchannel</ref>
				<ref type="managerEvent">SoftHangupRequest</ref>
				<ref type="managerEvent">HangupRequest</ref>
				<ref type="managerEvent">Newstate</ref>
			</see-also>
		</managerEventInstance>
	</managerEvent>
	<managerEvent language="en_US" name="HangupRequest" module="builtin">
		<managerEventInstance class="EVENT_FLAG_CALL" module="builtin">
			<since>
				<version>12.0.0</version>
			</since>
			<synopsis>Raised when a hangup is requested.</synopsis>
			<syntax>
				<channel_snapshot/>
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='Hangup']/managerEventInstance/syntax/parameter[@name='Cause'])" />
			</syntax>
			<see-also>
				<ref type="managerEvent">SoftHangupRequest</ref>
				<ref type="managerEvent">Hangup</ref>
			</see-also>
		</managerEventInstance>
	</managerEvent>
	<managerEvent language="en_US" name="SoftHangupRequest" module="builtin">
		<managerEventInstance class="EVENT_FLAG_CALL" module="builtin">
			<since>
				<version>12.0.0</version>
			</since>
			<synopsis>Raised when a soft hangup is requested with a specific cause code.</synopsis>
			<syntax>
				<channel_snapshot/>
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='Hangup']/managerEventInstance/syntax/parameter[@name='Cause'])" />
			</syntax>
			<see-also>
				<ref type="managerEvent">HangupRequest</ref>
				<ref type="managerEvent">Hangup</ref>
			</see-also>
		</managerEventInstance>
	</managerEvent>
	<managerEvent language="en_US" name="NewExten" module="builtin">
		<managerEventInstance class="EVENT_FLAG_DIALPLAN" module="builtin">
			<since>
				<version>12.0.0</version>
			</since>
			<synopsis>Raised when a channel enters a new context, extension, priority.</synopsis>
			<syntax>
				<channel_snapshot/>
				<parameter name="Extension">
					<para>Deprecated in 12, but kept for
					backward compatibility. Please use
					'Exten' instead.</para>
				</parameter>
				<parameter name="Application">
					<para>The application about to be executed.</para>
				</parameter>
				<parameter name="AppData">
					<para>The data to be passed to the application.</para>
				</parameter>
			</syntax>
		</managerEventInstance>
	</managerEvent>
	<managerEvent language="en_US" name="NewCallerid" module="builtin">
		<managerEventInstance class="EVENT_FLAG_CALL" module="builtin">
			<since>
				<version>12.0.0</version>
			</since>
			<synopsis>Raised when a channel receives new Caller ID information.</synopsis>
			<syntax>
				<channel_snapshot/>
				<parameter name="CID-CallingPres">
					<para>A description of the Caller ID presentation.</para>
				</parameter>
			</syntax>
			<see-also>
				<ref type="function">CALLERID</ref>
			</see-also>
		</managerEventInstance>
	</managerEvent>
	<managerEvent language="en_US" name="NewConnectedLine" module="builtin">
		<managerEventInstance class="EVENT_FLAG_CALL" module="builtin">
			<since>
				<version>13.13.0</version>
				<version>14.2.0</version>
			</since>
			<synopsis>Raised when a channel's connected line information is changed.</synopsis>
			<syntax>
				<channel_snapshot/>
			</syntax>
			<see-also>
				<ref type="function">CONNECTEDLINE</ref>
			</see-also>
		</managerEventInstance>
	</managerEvent>
	<managerEvent language="en_US" name="NewAccountCode" module="builtin">
		<managerEventInstance class="EVENT_FLAG_CALL" module="builtin">
			<since>
				<version>12.0.0</version>
			</since>
			<synopsis>Raised when a Channel's AccountCode is changed.</synopsis>
			<syntax>
				<channel_snapshot/>
				<parameter name="OldAccountCode">
					<para>The channel's previous account code</para>
				</parameter>
			</syntax>
			<see-also>
				<ref type="function">CHANNEL</ref>
			</see-also>
		</managerEventInstance>
	</managerEvent>
	<managerEvent language="en_US" name="DialBegin" module="builtin">
		<managerEventInstance class="EVENT_FLAG_CALL" module="builtin">
			<since>
				<version>12.0.0</version>
			</since>
			<synopsis>Raised when a dial action has started.</synopsis>
			<syntax>
				<channel_snapshot/>
				<channel_snapshot prefix="Dest"/>
				<parameter name="DialString">
					<para>The non-technology specific device being dialed.</para>
				</parameter>
			</syntax>
			<see-also>
				<ref type="application">Dial</ref>
				<ref type="application">Originate</ref>
				<ref type="manager">Originate</ref>
				<ref type="managerEvent">DialEnd</ref>
			</see-also>
		</managerEventInstance>
	</managerEvent>
	<managerEvent language="en_US" name="DialState" module="builtin">
		<managerEventInstance class="EVENT_FLAG_CALL" module="builtin">
			<since>
				<version>14.0.0</version>
			</since>
			<synopsis>Raised when dial status has changed.</synopsis>
			<syntax>
				<channel_snapshot/>
				<channel_snapshot prefix="Dest"/>
				<parameter name="DialStatus">
					<para> The new state of the outbound dial attempt.</para>
					<enumlist>
						<enum name="RINGING">
							<para>The outbound channel is ringing.</para>
						</enum>
						<enum name="PROCEEDING">
							<para>The call to the outbound channel is proceeding.</para>
						</enum>
						<enum name="PROGRESS">
							<para>Progress has been received on the outbound channel.</para>
						</enum>
					</enumlist>
				</parameter>
				<parameter name="Forward" required="false">
					<para>If the call was forwarded, where the call was
					forwarded to.</para>
				</parameter>
			</syntax>
		</managerEventInstance>
	</managerEvent>
	<managerEvent language="en_US" name="DialEnd" module="builtin">
		<managerEventInstance class="EVENT_FLAG_CALL" module="builtin">
			<since>
				<version>12.0.0</version>
			</since>
			<synopsis>Raised when a dial action has completed.</synopsis>
			<syntax>
				<channel_snapshot/>
				<channel_snapshot prefix="Dest"/>
				<parameter name="DialStatus">
					<para>The result of the dial operation.</para>
					<enumlist>
						<enum name="ABORT">
							<para>The call was aborted.</para>
						</enum>
						<enum name="ANSWER">
							<para>The caller answered.</para>
						</enum>
						<enum name="BUSY">
							<para>The caller was busy.</para>
						</enum>
						<enum name="CANCEL">
							<para>The caller cancelled the call.</para>
						</enum>
						<enum name="CHANUNAVAIL">
							<para>The requested channel is unavailable.</para>
						</enum>
						<enum name="CONGESTION">
							<para>The called party is congested.</para>
						</enum>
						<enum name="CONTINUE">
							<para>The dial completed, but the caller elected
							to continue in the dialplan.</para>
						</enum>
						<enum name="GOTO">
							<para>The dial completed, but the caller jumped to
							a dialplan location.</para>
							<para>If known, the location the caller is jumping
							to will be appended to the result following a
							":".</para>
						</enum>
						<enum name="NOANSWER">
							<para>The called party failed to answer.</para>
						</enum>
					</enumlist>
				</parameter>
				<parameter name="Forward" required="false">
					<para>If the call was forwarded, where the call was
					forwarded to.</para>
				</parameter>
			</syntax>
			<see-also>
				<ref type="application">Dial</ref>
				<ref type="application">Originate</ref>
				<ref type="manager">Originate</ref>
				<ref type="managerEvent">DialBegin</ref>
			</see-also>
		</managerEventInstance>
	</managerEvent>
	<managerEvent language="en_US" name="Hold" module="builtin">
		<managerEventInstance class="EVENT_FLAG_CALL" module="builtin">
			<since>
				<version>12.0.0</version>
			</since>
			<synopsis>Raised when a channel goes on hold.</synopsis>
			<syntax>
				<channel_snapshot/>
				<parameter name="MusicClass">
					<para>The suggested MusicClass, if provided.</para>
				</parameter>
			</syntax>
			<see-also>
				<ref type="managerEvent">Unhold</ref>
			</see-also>
		</managerEventInstance>
	</managerEvent>
	<managerEvent language="en_US" name="Unhold" module="builtin">
		<managerEventInstance class="EVENT_FLAG_CALL" module="builtin">
			<since>
				<version>12.0.0</version>
			</since>
			<synopsis>Raised when a channel goes off hold.</synopsis>
			<syntax>
				<channel_snapshot/>
			</syntax>
			<see-also>
				<ref type="managerEvent">Hold</ref>
			</see-also>
		</managerEventInstance>
	</managerEvent>
	<managerEvent language="en_US" name="ChanSpyStart" module="builtin">
		<managerEventInstance class="EVENT_FLAG_CALL" module="builtin">
			<since>
				<version>12.0.0</version>
			</since>
			<synopsis>Raised when one channel begins spying on another channel.</synopsis>
			<syntax>
				<channel_snapshot prefix="Spyer"/>
				<channel_snapshot prefix="Spyee"/>
			</syntax>
			<see-also>
				<ref type="managerEvent">ChanSpyStop</ref>
				<ref type="application">ChanSpy</ref>
			</see-also>
		</managerEventInstance>
	</managerEvent>
	<managerEvent language="en_US" name="ChanSpyStop" module="builtin">
		<managerEventInstance class="EVENT_FLAG_CALL" module="builtin">
			<since>
				<version>12.0.0</version>
			</since>
			<synopsis>Raised when a channel has stopped spying.</synopsis>
			<syntax>
				<channel_snapshot prefix="Spyer"/>
				<channel_snapshot prefix="Spyee"/>
			</syntax>
			<see-also>
				<ref type="managerEvent">ChanSpyStart</ref>
				<ref type="application">ChanSpy</ref>
			</see-also>
		</managerEventInstance>
	</managerEvent>
	<managerEvent language="en_US" name="HangupHandlerRun" module="builtin">
		<managerEventInstance class="EVENT_FLAG_DIALPLAN" module="builtin">
			<since>
				<version>12.0.0</version>
			</since>
			<synopsis>Raised when a hangup handler is about to be called.</synopsis>
			<syntax>
				<channel_snapshot/>
				<parameter name="Handler">
					<para>Hangup handler parameter string passed to the Gosub application.</para>
				</parameter>
			</syntax>
			<see-also>
				<ref type="function">CHANNEL</ref>
			</see-also>
		</managerEventInstance>
	</managerEvent>
	<managerEvent language="en_US" name="HangupHandlerPop" module="builtin">
		<managerEventInstance class="EVENT_FLAG_DIALPLAN" module="builtin">
			<since>
				<version>12.0.0</version>
			</since>
			<synopsis>
				Raised when a hangup handler is removed from the handler stack
				by the CHANNEL() function.
			</synopsis>
			<syntax>
				<channel_snapshot/>
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='HangupHandlerRun']/managerEventInstance/syntax/parameter)" />
			</syntax>
			<see-also>
				<ref type="managerEvent">HangupHandlerPush</ref>
				<ref type="function">CHANNEL</ref>
			</see-also>
		</managerEventInstance>
	</managerEvent>
	<managerEvent language="en_US" name="HangupHandlerPush" module="builtin">
		<managerEventInstance class="EVENT_FLAG_DIALPLAN" module="builtin">
			<since>
				<version>12.0.0</version>
			</since>
			<synopsis>
				Raised when a hangup handler is added to the handler stack by
				the CHANNEL() function.
			</synopsis>
			<syntax>
				<channel_snapshot/>
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='HangupHandlerRun']/managerEventInstance/syntax/parameter)" />
			</syntax>
			<see-also>
				<ref type="managerEvent">HangupHandlerPop</ref>
				<ref type="function">CHANNEL</ref>
			</see-also>
		</managerEventInstance>
	</managerEvent>
	<managerEvent language="en_US" name="FAXStatus" module="builtin">
		<managerEventInstance class="EVENT_FLAG_CALL" module="builtin">
			<since>
				<version>12.0.0</version>
			</since>
			<synopsis>
				Raised periodically during a fax transmission.
			</synopsis>
			<syntax>
				<channel_snapshot/>
				<parameter name="Operation">
					<enumlist>
						<enum name="gateway"/>
						<enum name="receive"/>
						<enum name="send"/>
					</enumlist>
				</parameter>
				<parameter name="Status">
					<para>A text message describing the current status of the fax</para>
				</parameter>
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='ReceiveFAX']/managerEventInstance/syntax/parameter[@name='LocalStationID'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='ReceiveFAX']/managerEventInstance/syntax/parameter[@name='FileName'])" />
			</syntax>
		</managerEventInstance>
	</managerEvent>
	<managerEvent language="en_US" name="ReceiveFAX" module="builtin">
		<managerEventInstance class="EVENT_FLAG_CALL" module="builtin">
			<since>
				<version>12.0.0</version>
			</since>
			<synopsis>
				Raised when a receive fax operation has completed.
			</synopsis>
			<syntax>
				<channel_snapshot/>
				<parameter name="LocalStationID">
					<para>The value of the <variable>LOCALSTATIONID</variable> channel variable</para>
				</parameter>
				<parameter name="RemoteStationID">
					<para>The value of the <variable>REMOTESTATIONID</variable> channel variable</para>
				</parameter>
				<parameter name="PagesTransferred">
					<para>The number of pages that have been transferred</para>
				</parameter>
				<parameter name="Resolution">
					<para>The negotiated resolution</para>
				</parameter>
				<parameter name="TransferRate">
					<para>The negotiated transfer rate</para>
				</parameter>
				<parameter name="FileName" multiple="yes">
					<para>The files being affected by the fax operation</para>
				</parameter>
			</syntax>
		</managerEventInstance>
	</managerEvent>
	<managerEvent language="en_US" name="SendFAX" module="builtin">
		<managerEventInstance class="EVENT_FLAG_CALL" module="builtin">
			<since>
				<version>12.0.0</version>
			</since>
			<synopsis>
				Raised when a send fax operation has completed.
			</synopsis>
			<syntax>
				<channel_snapshot/>
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='ReceiveFAX']/managerEventInstance/syntax/parameter)" />
			</syntax>
		</managerEventInstance>
	</managerEvent>
	<managerEvent language="en_US" name="MusicOnHoldStart" module="builtin">
		<managerEventInstance class="EVENT_FLAG_CALL" module="builtin">
			<since>
				<version>12.0.0</version>
			</since>
			<synopsis>Raised when music on hold has started on a channel.</synopsis>
			<syntax>
				<channel_snapshot/>
				<parameter name="Class">
					<para>The class of music being played on the channel</para>
				</parameter>
			</syntax>
			<see-also>
				<ref type="managerEvent">MusicOnHoldStop</ref>
				<ref type="application">StartMusicOnHold</ref>
				<ref type="application">MusicOnHold</ref>
			</see-also>
		</managerEventInstance>
	</managerEvent>
	<managerEvent language="en_US" name="MusicOnHoldStop" module="builtin">
		<managerEventInstance class="EVENT_FLAG_CALL" module="builtin">
			<since>
				<version>12.0.0</version>
			</since>
			<synopsis>Raised when music on hold has stopped on a channel.</synopsis>
			<syntax>
				<channel_snapshot/>
			</syntax>
			<see-also>
				<ref type="managerEvent">MusicOnHoldStart</ref>
				<ref type="application">StopMusicOnHold</ref>
			</see-also>
		</managerEventInstance>
	</managerEvent>
		<managerEvent language="en_US" name="DTMFBegin" module="builtin">
			<managerEventInstance class="EVENT_FLAG_DTMF" module="builtin">
				<since>
					<version>16.24.0</version>
					<version>18.10.0</version>
					<version>19.2.0</version>
				</since>
				<synopsis>Raised when a DTMF digit has started on a channel.</synopsis>
					<syntax>
						<channel_snapshot/>
						<parameter name="Digit">
							<para>DTMF digit received or transmitted (0-9, A-E, # or *</para>
						</parameter>
						<parameter name="Direction">
							<enumlist>
								<enum name="Received"/>
								<enum name="Sent"/>
							</enumlist>
						</parameter>
					</syntax>
					<see-also>
						<ref type="managerEvent">DTMFEnd</ref>
					</see-also>
			</managerEventInstance>
		</managerEvent>
		<managerEvent language="en_US" name="DTMFEnd" module="builtin">
			<managerEventInstance class="EVENT_FLAG_DTMF" module="builtin">
				<since>
					<version>16.24.0</version>
					<version>18.10.0</version>
					<version>19.2.0</version>
				</since>
				<synopsis>Raised when a DTMF digit has ended on a channel.</synopsis>
					<syntax>
						<channel_snapshot/>
						<parameter name="Digit">
							<para>DTMF digit received or transmitted (0-9, A-E, # or *</para>
						</parameter>
						<parameter name="DurationMs">
							<para>Duration (in milliseconds) DTMF was sent/received</para>
						</parameter>
						<parameter name="Direction">
							<enumlist>
								<enum name="Received"/>
								<enum name="Sent"/>
							</enumlist>
						</parameter>
					</syntax>
					<see-also>
						<ref type="managerEvent">DTMFBegin</ref>
					</see-also>
			</managerEventInstance>
		</managerEvent>
		<managerEvent language="en_US" name="Flash" module="builtin">
			<managerEventInstance class="EVENT_FLAG_CALL" module="builtin">
				<since>
					<version>16.24.0</version>
					<version>18.10.0</version>
					<version>19.2.0</version>
				</since>
				<synopsis>Raised when a hook flash occurs on a channel.</synopsis>
					<syntax>
						<channel_snapshot/>
					</syntax>
			</managerEventInstance>
		</managerEvent>
		<managerEvent language="en_US" name="Wink" module="builtin">
			<managerEventInstance class="EVENT_FLAG_CALL" module="builtin">
				<since>
					<version>16.24.0</version>
					<version>18.10.0</version>
					<version>19.2.0</version>
				</since>
				<synopsis>Raised when a wink occurs on a channel.</synopsis>
					<syntax>
						<channel_snapshot/>
					</syntax>
			</managerEventInstance>
		</managerEvent>
		<managerEvent language="en_US" name="MessageWaiting" module="builtin">
			<managerEventInstance class="EVENT_FLAG_CALL" module="builtin">
				<since>
					<version>16.24.0</version>
					<version>18.10.0</version>
					<version>19.2.0</version>
				</since>
				<synopsis>Raised when the state of messages in a voicemail mailbox
				has changed or when a channel has finished interacting with a
				mailbox.</synopsis>
				<syntax>
					<channel_snapshot/>
					<parameter name="Mailbox">
						<para>The mailbox with the new message, specified as <literal>mailbox</literal>@<literal>context</literal></para>
					</parameter>
					<parameter name="Waiting">
						<para>Whether or not the mailbox has messages waiting for it.</para>
					</parameter>
					<parameter name="New">
						<para>The number of new messages.</para>
					</parameter>
					<parameter name="Old">
						<para>The number of old messages.</para>
					</parameter>
				</syntax>
				<description>
					<note><para>The Channel related parameters are only present if a
					channel was involved in the manipulation of a mailbox. If no
					channel is involved, the parameters are not included with the
					event.</para>
					</note>
				</description>
			</managerEventInstance>
		</managerEvent>
<module language="en_US" name="media_cache">
	<support_level>core</support_level>
</module>
<module language="en_US" name="media_index">
	<support_level>core</support_level>
</module>
<module language="en_US" name="message">
	<support_level>core</support_level>
</module>
	<function name="MESSAGE" language="en_US" module="builtin">
		<since>
			<version>10.0.0</version>
		</since>
		<synopsis>
			Create a message or read fields from a message.
		</synopsis>
		<syntax argsep="/">
			<parameter name="argument" required="true">
			<para>Field of the message to get or set.</para>
			<enumlist>
				<enum name="to">
					<para>When processing an
					incoming message, this will be set to the destination listed as
					the recipient of the message that was received by Asterisk.</para>
					<para>
					</para>
					<para>For an ourgoing message, this will set the To header in the
					outgoing SIP message.  This may be overridden by the "to" parameter
					of MessageSend.
					</para>
				</enum>
				<enum name="from">
					<para>When processing an
					incoming message, this will be set to the source of the message.</para>
					<para>
					</para>
					<para>For an ourgoing message, this will set the From header in the
					outgoing SIP message. This may be overridden by the "from" parameter
					of MessageSend.
					</para>
				</enum>
				<enum name="custom_data">
					<para>Write-only.  Mark or unmark all message headers for an outgoing
					message.  The following values can be set:</para>
					<enumlist>
						<enum name="mark_all_outbound">
							<para>Mark all headers for an outgoing message.</para>
						</enum>
						<enum name="clear_all_outbound">
							<para>Unmark all headers for an outgoing message.</para>
						</enum>
					</enumlist>
				</enum>
				<enum name="body">
					<para>Read/Write.  The message body.  When processing an incoming
					message, this includes the body of the message that Asterisk
					received.  When MessageSend() is executed, the contents of this
					field are used as the body of the outgoing message.  The body
					will always be UTF-8.</para>
				</enum>
			</enumlist>
			</parameter>
		</syntax>
		<description>
			<para>This function will read from or write a value to a text message.
			It is used both to read the data out of an incoming message, as well as
			modify or create a message that will be sent outbound.</para>
		</description>
		<see-also>
			<ref type="application">MessageSend</ref>
		</see-also>
	</function>
	<function name="MESSAGE_DATA" language="en_US" module="builtin">
		<since>
			<version>10.0.0</version>
		</since>
		<synopsis>
			Read or write custom data attached to a message.
		</synopsis>
		<syntax argsep="/">
			<parameter name="argument" required="true">
			<para>Field of the message to get or set.</para>
			</parameter>
		</syntax>
		<description>
			<para>This function will read from or write a value to a text message.
			It is used both to read the data out of an incoming message, as well as
			modify a message that will be sent outbound.</para>
			<note>
				<para>If you want to set an outbound message to carry data in the
				current message, do
				Set(MESSAGE_DATA(<replaceable>key</replaceable>)=${MESSAGE_DATA(<replaceable>key</replaceable>)}).</para>
			</note>
		</description>
		<see-also>
			<ref type="application">MessageSend</ref>
		</see-also>
	</function>
	<application name="MessageSend" language="en_US" module="builtin">
		<since>
			<version>10.0.0</version>
		</since>
		<synopsis>
			Send a text message.
		</synopsis>
		<syntax>
			<parameter name="destination" required="true">
				<para>A To URI for the message.</para>
				<xi:include xpointer="xpointer(/docs/info[@name='MessageDestinationInfo'])" />
			</parameter>
			<parameter name="from" required="false">
				<para>A From URI for the message if needed for the
				message technology being used to send this message. This can be a
				SIP(S) URI, such as <literal>Alice &lt;sip:alice@atlanta.com&gt;</literal>,
				or a string in the format <literal>alice@atlanta.com</literal>.
				This will override a <literal>from</literal>
				specified using the MESSAGE dialplan function or the <literal>from</literal>
				that may have been on an incoming message.
				</para>
				<xi:include xpointer="xpointer(/docs/info[@name='MessageFromInfo'])" />
			</parameter>
			<parameter name="to" required="false">
				<para>A To URI for the message if needed for the
				message technology being used to send this message. This can be a
				SIP(S) URI, such as <literal>Alice &lt;sip:alice@atlanta.com&gt;</literal>,
				or a string in the format <literal>alice@atlanta.com</literal>.
				This will override a <literal>to</literal>
				specified using the MESSAGE dialplan function or the <literal>to</literal>
				that may have been on an incoming message.
				</para>
				<xi:include xpointer="xpointer(/docs/info[@name='MessageToInfo'])" />
			</parameter>
		</syntax>
		<description>
			<para>Send a text message.  The body of the message that will be
			sent is what is currently set to <literal>MESSAGE(body)</literal>.
			This may he come from an incoming message.
			The technology chosen for sending the message is determined
			based on a prefix to the <literal>destination</literal> parameter.</para>
			<para>This application sets the following channel variables:</para>
			<variablelist>
				<variable name="MESSAGE_SEND_STATUS">
					<para>This is the message delivery status returned by this application.</para>
					<value name="INVALID_PROTOCOL">
						No handler for the technology part of the URI was found.
					</value>
					<value name="INVALID_URI">
						The protocol handler reported that the URI was not valid.
					</value>
					<value name="SUCCESS">
						Successfully passed on to the protocol handler, but delivery has not necessarily been guaranteed.
					</value>
					<value name="FAILURE">
						The protocol handler reported that it was unable to deliver the message for some reason.
					</value>
				</variable>
			</variablelist>
		</description>
	</application>
	<manager name="MessageSend" language="en_US" module="builtin">
		<since>
			<version>11.0.0</version>
		</since>
		<synopsis>
			Send an out of call message to an endpoint.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="Destination" required="false">
				<para>A To URI for the message. If Destination is provided, the To
				parameter can also be supplied and may alter the message based on
				the specified message technology.</para>
				<para>For backwards compatibility, if Destination is not provided,
				the To parameter must be provided and will be used as the message
				destination.</para>
				<xi:include xpointer="xpointer(/docs/info[@name='MessageDestinationInfo'])" />
			</parameter>
			<parameter name="To" required="false">
				<para>A To URI for the message if needed for the
				message technology being used to send this message. This can be a
				SIP(S) URI, such as <literal>Alice &lt;sip:alice@atlanta.com&gt;</literal>,
				or a string in the format <literal>alice@atlanta.com</literal>.</para>
				<para>This parameter is required if the Destination parameter is not
				provided.</para>
				<xi:include xpointer="xpointer(/docs/info[@name='MessageToInfo'])" />
			</parameter>
			<parameter name="From">
				<para>A From URI for the message if needed for the
				message technology being used to send this message.</para>
				<xi:include xpointer="xpointer(/docs/info[@name='MessageFromInfo'])" />
			</parameter>
			<parameter name="Body">
				<para>The message body text.  This must not contain any newlines as that
				conflicts with the AMI protocol.</para>
			</parameter>
			<parameter name="Base64Body">
				<para>Text bodies requiring the use of newlines have to be base64 encoded
				in this field.  Base64Body will be decoded before being sent out.
				Base64Body takes precedence over Body.</para>
			</parameter>
			<parameter name="Variable">
				<para>Message variable to set, multiple Variable: headers are
				allowed.  The header value is a comma separated list of
				name=value pairs.</para>
			</parameter>
		</syntax>
	</manager>
<module language="en_US" name="mixmonitor">
	<support_level>core</support_level>
</module>
<module language="en_US" name="mwi">
	<support_level>core</support_level>
</module>
	<configInfo name="named_acl" language="en_US">
		<configFile name="acl.conf">
			<configObject name="named_acl">
				<since>
					<version>12.0.0</version>
				</since>
				<synopsis>Options for configuring a named ACL</synopsis>
				<configOption name="permit">
					<since>
						<version>11.0.0</version>
					</since>
					<synopsis>An address/subnet from which to allow access</synopsis>
				</configOption>
				<configOption name="deny">
					<since>
						<version>11.0.0</version>
					</since>
					<synopsis>An address/subnet from which to disallow access</synopsis>
				</configOption>
			</configObject>
		</configFile>
	</configInfo>
<module language="en_US" name="netsock2">
	<support_level>core</support_level>
</module>
<module language="en_US" name="options">
	<support_level>core</support_level>
</module>
<module language="en_US" name="pbx">
	<support_level>core</support_level>
</module>
	<function name="EXCEPTION" language="en_US" module="builtin">
		<since>
			<version>1.6.0</version>
		</since>
		<synopsis>
			Retrieve the details of the current dialplan exception.
		</synopsis>
		<syntax>
			<parameter name="field" required="true">
				<para>The following fields are available for retrieval:</para>
				<enumlist>
					<enum name="reason">
						<para>INVALID, ERROR, RESPONSETIMEOUT, ABSOLUTETIMEOUT, or custom
						value set by the RaiseException() application</para>
					</enum>
					<enum name="context">
						<para>The context executing when the exception occurred.</para>
					</enum>
					<enum name="exten">
						<para>The extension executing when the exception occurred.</para>
					</enum>
					<enum name="priority">
						<para>The numeric priority executing when the exception occurred.</para>
					</enum>
				</enumlist>
			</parameter>
		</syntax>
		<description>
			<para>Retrieve the details (specified <replaceable>field</replaceable>) of the current dialplan exception.</para>
		</description>
		<see-also>
			<ref type="application">RaiseException</ref>
		</see-also>
	</function>
	<function name="TESTTIME" language="en_US" module="builtin">
		<since>
			<version>1.8.0</version>
		</since>
		<synopsis>
			Sets a time to be used with the channel to test logical conditions.
		</synopsis>
		<syntax>
			<parameter name="date" required="true" argsep=" ">
				<para>Date in ISO 8601 format</para>
			</parameter>
			<parameter name="time" required="true" argsep=" ">
				<para>Time in HH:MM:SS format (24-hour time)</para>
			</parameter>
			<parameter name="zone" required="false">
				<para>Timezone name</para>
			</parameter>
		</syntax>
		<description>
			<para>To test dialplan timing conditions at times other than the current time, use
			this function to set an alternate date and time.  For example, you may wish to evaluate
			whether a location will correctly identify to callers that the area is closed on Christmas
			Day, when Christmas would otherwise fall on a day when the office is normally open.</para>
		</description>
		<see-also>
			<ref type="application">GotoIfTime</ref>
		</see-also>
	</function>
	<manager name="ShowDialPlan" language="en_US" module="builtin">
		<since>
			<version>1.6.0</version>
		</since>
		<synopsis>
			Show dialplan contexts and extensions
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="Extension">
				<para>Show a specific extension.</para>
			</parameter>
			<parameter name="Context">
				<para>Show a specific context.</para>
			</parameter>
		</syntax>
		<description>
			<para>Show dialplan contexts and extensions. Be aware that showing the full dialplan
			may take a lot of capacity.</para>
		</description>
	</manager>
	<manager name="ExtensionStateList" language="en_US" module="builtin">
		<since>
			<version>13.0.0</version>
		</since>
		<synopsis>
			List the current known extension states.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
		</syntax>
		<description>
			<para>This will list out all known extension states in a
			sequence of <replaceable>ExtensionStatus</replaceable> events.
			When finished, a <replaceable>ExtensionStateListComplete</replaceable> event
			will be emitted.</para>
		</description>
		<see-also>
			<ref type="manager">ExtensionState</ref>
			<ref type="function">HINT</ref>
			<ref type="function">EXTENSION_STATE</ref>
		</see-also>
		<responses>
			<list-elements>
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='ExtensionStatus'])" />
			</list-elements>
			<managerEvent name="ExtensionStateListComplete" language="en_US" module="builtin">
				<managerEventInstance class="EVENT_FLAG_COMMAND" module="builtin">
					<since>
						<version>13.0.0</version>
					</since>
					<synopsis>
						Indicates the end of the list the current known extension states.
					</synopsis>
					<syntax>
						<parameter name="EventList">
							<para>Conveys the status of the event list.</para>
						</parameter>
						<parameter name="ListItems">
							<para>Conveys the number of statuses reported.</para>
						</parameter>
					</syntax>
				</managerEventInstance>
			</managerEvent>
		</responses>
	</manager>
<module language="en_US" name="pbx_app">
	<support_level>core</support_level>
</module>
<module language="en_US" name="pbx_builtins">
	<support_level>core</support_level>
</module>
	<application name="Answer" language="en_US" module="builtin">
		<since>
			<version>13.8.0</version>
		</since>
		<synopsis>
			Answer a channel if ringing.
		</synopsis>
		<syntax>
			<parameter name="delay">
				<para>Asterisk will wait this number of milliseconds before returning to
				the dialplan after answering the call.</para>
				<para>The minimum is 500 ms. To answer immediately without waiting for media,
				use the i option.</para>
			</parameter>
			<parameter name="options">
				<optionlist>
					<option name="i">
						<para>Answer the channel immediately without waiting for media.</para>
					</option>
				</optionlist>
			</parameter>
		</syntax>
		<description>
			<para>If the call has not been answered, this application will
			answer it. Otherwise, it has no effect on the call.</para>
			<para>By default, Asterisk will wait for media for up to 500 ms, or
			the user specified delay, whichever is longer. If you do not want
			to wait for media at all, use the i option.</para>
		</description>
		<see-also>
			<ref type="application">Hangup</ref>
		</see-also>
	</application>
	<application name="BackGround" language="en_US" module="builtin">
		<since>
			<version>13.8.0</version>
		</since>
		<synopsis>
			Play an audio file while waiting for digits of an extension to go to.
		</synopsis>
		<syntax>
			<parameter name="filenames" required="true" argsep="&amp;">
				<para>Ampersand separated list of filenames. If the filename
				is a relative filename (it does not begin with a slash), it
				will be searched for in the Asterisk sounds directory. If the
				filename is able to be parsed as a URL, Asterisk will
				download the file and then begin playback on it. To include a
				literal <literal>&amp;</literal> in the URL you can enclose
				the URL in single quotes.</para>
				<argument name="filename1" required="true" />
				<argument name="filename2" multiple="true" />
			</parameter>
			<parameter name="options">
				<optionlist>
					<option name="s">
						<para>Causes the playback of the message to be skipped
						if the channel is not in the <literal>up</literal> state (i.e. it
						hasn't been answered yet). If this happens, the
						application will return immediately.</para>
					</option>
					<option name="n">
						<para>Don't answer the channel before playing the files.</para>
					</option>
					<option name="m">
						<para>Only break if a digit hit matches a one digit
						extension in the destination context.</para>
					</option>
					<option name="p">
						<para>Do not allow playback to be interrupted with digits.</para>
					</option>
				</optionlist>
			</parameter>
			<parameter name="langoverride">
				<para>Explicitly specifies which language to attempt to use for the requested sound files.</para>
			</parameter>
			<parameter name="context">
				<para>This is the dialplan context that this application will use when exiting
				to a dialed extension.</para>
			</parameter>
		</syntax>
		<description>
			<para>This application will play the given list of files <emphasis>(do not put extension)</emphasis>
			while waiting for an extension to be dialed by the calling channel. To continue waiting
			for digits after this application has finished playing files, the <literal>WaitExten</literal>
			application should be used.</para>
			<para>If one of the requested sound files does not exist, call processing will be terminated.</para>
			<para>This application sets the following channel variable upon completion:</para>
			<variablelist>
				<variable name="BACKGROUNDSTATUS">
					<para>The status of the background attempt as a text string.</para>
					<value name="SUCCESS" />
					<value name="FAILED" />
				</variable>
			</variablelist>
		</description>
		<see-also>
			<ref type="application">ControlPlayback</ref>
			<ref type="application">WaitExten</ref>
			<ref type="application">BackgroundDetect</ref>
			<ref type="function">TIMEOUT</ref>
		</see-also>
	</application>
	<application name="Busy" language="en_US" module="builtin">
		<since>
			<version>13.8.0</version>
		</since>
		<synopsis>
			Indicate the Busy condition.
		</synopsis>
		<syntax>
			<parameter name="timeout">
				<para>If specified, the calling channel will be hung up after the specified number of seconds.
				Otherwise, this application will wait until the calling channel hangs up.</para>
			</parameter>
		</syntax>
		<description>
			<para>This application will indicate the busy condition to the calling channel.</para>
		</description>
		<see-also>
			<ref type="application">Congestion</ref>
			<ref type="application">Progress</ref>
			<ref type="application">PlayTones</ref>
			<ref type="application">Hangup</ref>
		</see-also>
	</application>
	<application name="Congestion" language="en_US" module="builtin">
		<since>
			<version>13.8.0</version>
		</since>
		<synopsis>
			Indicate the Congestion condition.
		</synopsis>
		<syntax>
			<parameter name="timeout">
				<para>If specified, the calling channel will be hung up after the specified number of seconds.
				Otherwise, this application will wait until the calling channel hangs up.</para>
			</parameter>
		</syntax>
		<description>
			<para>This application will indicate the congestion condition to the calling channel.</para>
		</description>
		<see-also>
			<ref type="application">Busy</ref>
			<ref type="application">Progress</ref>
			<ref type="application">PlayTones</ref>
			<ref type="application">Hangup</ref>
		</see-also>
	</application>
	<application name="ExecIfTime" language="en_US" module="builtin">
		<since>
			<version>13.8.0</version>
		</since>
		<synopsis>
			Conditional application execution based on the current time.
		</synopsis>
		<syntax argsep="?">
			<parameter name="day_condition" required="true">
				<argument name="times" required="true" />
				<argument name="weekdays" required="true" />
				<argument name="mdays" required="true" />
				<argument name="months" required="true" />
				<argument name="timezone" required="false" />
			</parameter>
			<parameter name="appname" required="true" hasparams="optional">
				<argument name="appargs" required="true" />
			</parameter>
		</syntax>
		<description>
			<para>This application will execute the specified dialplan application, with optional
			arguments, if the current time matches the given time specification.</para>
		</description>
		<see-also>
			<ref type="application">Exec</ref>
			<ref type="application">ExecIf</ref>
			<ref type="application">TryExec</ref>
			<ref type="application">GotoIfTime</ref>
		</see-also>
	</application>
	<application name="Goto" language="en_US" module="builtin">
		<since>
			<version>13.8.0</version>
		</since>
		<synopsis>
			Jump to a particular priority, extension, or context.
		</synopsis>
		<syntax>
			<parameter name="context" documentationtype="dialplan_context" />
			<parameter name="extension" documentationtype="dialplan_extension" />
			<parameter name="priority" documentationtype="dialplan_priority" required="true" />
		</syntax>
		<description>
			<para>This application will set the current context, extension, and priority in the channel structure.
			After it completes, the pbx engine will continue dialplan execution at the specified location.
			If no specific <replaceable>extension</replaceable>, or <replaceable>extension</replaceable> and
			<replaceable>context</replaceable>, are specified, then this application will
			just set the specified <replaceable>priority</replaceable> of the current extension.</para>
			<para>At least a <replaceable>priority</replaceable> is required as an argument, or the goto will
			return a <literal>-1</literal>,	and the channel and call will be terminated.</para>
			<para>If the location that is put into the channel information is bogus, and asterisk cannot
			find that location in the dialplan, then the execution engine will try to find and execute the code in
			the <literal>i</literal> (invalid) extension in the current context. If that does not exist, it will try to execute the
			<literal>h</literal> extension. If neither the <literal>h</literal> nor <literal>i</literal> extensions
			have been defined, the channel is hung up, and the execution of instructions on the channel is terminated.
			What this means is that, for example, you specify a context that does not exist, then
			it will not be possible to find the <literal>h</literal> or <literal>i</literal> extensions,
			and the call will terminate!</para>
		</description>
		<see-also>
			<ref type="application">GotoIf</ref>
			<ref type="application">GotoIfTime</ref>
			<ref type="application">Gosub</ref>
		</see-also>
	</application>
	<application name="GotoIf" language="en_US" module="builtin">
		<since>
			<version>13.8.0</version>
		</since>
		<synopsis>
			Conditional goto.
		</synopsis>
		<syntax argsep="?">
			<parameter name="condition" required="true" />
			<parameter name="destination" required="true" argsep=":">
				<argument name="labeliftrue">
					<para>Continue at <replaceable>labeliftrue</replaceable> if the condition is true.
					Takes the form similar to Goto() of [[context,]extension,]priority.</para>
				</argument>
				<argument name="labeliffalse">
					<para>Continue at <replaceable>labeliffalse</replaceable> if the condition is false.
					Takes the form similar to Goto() of [[context,]extension,]priority.</para>
				</argument>
			</parameter>
		</syntax>
		<description>
			<para>This application will set the current context, extension, and priority in the channel structure
			based on the evaluation of the given condition. After this application completes, the
			pbx engine will continue dialplan execution at the specified location in the dialplan.
			The labels are specified with the same syntax as used within the Goto application.
			If the label chosen by the condition is omitted, no jump is performed, and the execution passes to the
			next instruction. If the target location is bogus, and does not exist, the execution engine will try
			to find and execute the code in the <literal>i</literal> (invalid) extension in the current context.
			If that does not exist, it will try to execute the <literal>h</literal> extension.
			If neither the <literal>h</literal> nor <literal>i</literal> extensions have been defined,
			the channel is hung up, and the execution of instructions on the channel is terminated.
			Remember that this command can set the current context, and if the context specified
			does not exist, then it will not be able to find any 'h' or 'i' extensions there, and
			the channel and call will both be terminated!.</para>
		</description>
		<see-also>
			<ref type="application">Goto</ref>
			<ref type="application">GotoIfTime</ref>
			<ref type="application">GosubIf</ref>
		</see-also>
	</application>
	<application name="GotoIfTime" language="en_US" module="builtin">
		<since>
			<version>13.8.0</version>
		</since>
		<synopsis>
			Conditional Goto based on the current time.
		</synopsis>
		<syntax argsep="?">
			<parameter name="condition" required="true">
				<argument name="times" required="true" />
				<argument name="weekdays" required="true" />
				<argument name="mdays" required="true" />
				<argument name="months" required="true" />
				<argument name="timezone" required="false" />
			</parameter>
			<parameter name="destination" required="true" argsep=":">
				<argument name="labeliftrue">
					<para>Continue at <replaceable>labeliftrue</replaceable> if the condition is true.
					Takes the form similar to Goto() of [[context,]extension,]priority.</para>
				</argument>
				<argument name="labeliffalse">
					<para>Continue at <replaceable>labeliffalse</replaceable> if the condition is false.
					Takes the form similar to Goto() of [[context,]extension,]priority.</para>
				</argument>
			</parameter>
		</syntax>
		<description>
			<para>This application will set the context, extension, and priority in the channel structure
			based on the evaluation of the given time specification. After this application completes,
			the pbx engine will continue dialplan execution at the specified location in the dialplan.
			If the current time is within the given time specification, the channel will continue at
			<replaceable>labeliftrue</replaceable>. Otherwise the channel will continue at <replaceable>labeliffalse</replaceable>.
			If the label chosen by the condition is omitted, no jump is performed, and execution passes to the next
			instruction. If the target jump location is bogus, the same actions would be taken as for <literal>Goto</literal>.
			Further information on the time specification can be found in examples
			illustrating how to do time-based context includes in the dialplan.</para>
		</description>
		<see-also>
			<ref type="application">GotoIf</ref>
			<ref type="application">Goto</ref>
			<ref type="function">IFTIME</ref>
			<ref type="function">TESTTIME</ref>
		</see-also>
	</application>
	<application name="Hangup" language="en_US" module="builtin">
		<since>
			<version>13.8.0</version>
		</since>
		<synopsis>
			Hang up the calling channel.
		</synopsis>
		<syntax>
			<parameter name="causecode">
				<para>If a <replaceable>causecode</replaceable> is given the channel's
				hangup cause will be set to the given value.</para>
			</parameter>
		</syntax>
		<description>
			<para>This application will hang up the calling channel.</para>
		</description>
		<see-also>
			<ref type="application">Answer</ref>
			<ref type="application">Busy</ref>
			<ref type="application">Congestion</ref>
		</see-also>
	</application>
	<application name="Incomplete" language="en_US" module="builtin">
		<since>
			<version>13.8.0</version>
		</since>
		<synopsis>
			Returns AST_PBX_INCOMPLETE value.
		</synopsis>
		<syntax>
			<parameter name="n">
				<para>If specified, then Incomplete will not attempt to answer the channel first.</para>
				<note><para>Most channel types need to be in Answer state in order to receive DTMF.</para></note>
			</parameter>
		</syntax>
		<description>
			<para>Signals the PBX routines that the previous matched extension is incomplete
			and that further input should be allowed before matching can be considered
			to be complete.  Can be used within a pattern match when certain criteria warrants
			a longer match.</para>
		</description>
	</application>
	<application name="NoOp" language="en_US" module="builtin">
		<since>
			<version>13.8.0</version>
		</since>
		<synopsis>
			Do Nothing (No Operation).
		</synopsis>
		<syntax>
			<parameter name="text">
				<para>Any text provided can be viewed at the Asterisk CLI.</para>
			</parameter>
		</syntax>
		<description>
			<para>This application does nothing. However, it is useful for debugging purposes.</para>
			<para>This method can be used to see the evaluations of variables or functions without having any effect.</para>
		</description>
		<see-also>
			<ref type="application">Verbose</ref>
			<ref type="application">Log</ref>
		</see-also>
	</application>
	<application name="Proceeding" language="en_US" module="builtin">
		<since>
			<version>13.8.0</version>
		</since>
		<synopsis>
			Indicate proceeding.
		</synopsis>
		<syntax />
		<description>
			<para>This application will request that a proceeding message be provided to the calling channel.</para>
		</description>
	</application>
	<application name="Progress" language="en_US" module="builtin">
		<since>
			<version>13.8.0</version>
		</since>
		<synopsis>
			Indicate progress.
		</synopsis>
		<syntax />
		<description>
			<para>This application will request that in-band progress information be provided to the calling channel.</para>
		</description>
		<see-also>
			<ref type="application">Busy</ref>
			<ref type="application">Congestion</ref>
			<ref type="application">Ringing</ref>
			<ref type="application">PlayTones</ref>
		</see-also>
	</application>
	<application name="RaiseException" language="en_US" module="builtin">
		<since>
			<version>13.8.0</version>
		</since>
		<synopsis>
			Handle an exceptional condition.
		</synopsis>
		<syntax>
			<parameter name="reason" required="true" />
		</syntax>
		<description>
			<para>This application will jump to the <literal>e</literal> extension in the current context, setting the
			dialplan function EXCEPTION(). If the <literal>e</literal> extension does not exist, the call will hangup.</para>
		</description>
		<see-also>
			<ref type="function">EXCEPTION</ref>
		</see-also>
	</application>
	<application name="Ringing" language="en_US" module="builtin">
		<since>
			<version>13.8.0</version>
		</since>
		<synopsis>
			Indicate ringing tone.
		</synopsis>
		<syntax />
		<description>
			<para>This application will request that the channel indicate a ringing tone to the user.</para>
		</description>
		<see-also>
			<ref type="application">Busy</ref>
			<ref type="application">Congestion</ref>
			<ref type="application">Progress</ref>
			<ref type="application">PlayTones</ref>
		</see-also>
	</application>
	<application name="SayAlpha" language="en_US" module="builtin">
		<since>
			<version>13.8.0</version>
		</since>
		<synopsis>
			Say Alpha.
		</synopsis>
		<syntax>
			<parameter name="string" required="true" />
		</syntax>
		<description>
			<para>This application will play the sounds that correspond to the letters
			of the given <replaceable>string</replaceable>. If the channel variable
			<variable>SAY_DTMF_INTERRUPT</variable> is set to 'true' (case insensitive),
			then this application will react to DTMF in the	same way as
			<literal>BackGround</literal>.</para>
		</description>
		<see-also>
			<ref type="application">SayDigits</ref>
			<ref type="application">SayMoney</ref>
			<ref type="application">SayNumber</ref>
			<ref type="application">SayOrdinal</ref>
			<ref type="application">SayPhonetic</ref>
			<ref type="function">CHANNEL</ref>
			<ref type="function">SAYFILES</ref>
		</see-also>
	</application>
	<application name="SayAlphaCase" language="en_US" module="builtin">
		<since>
			<version>13.8.0</version>
		</since>
		<synopsis>
			Say Alpha.
		</synopsis>
		<syntax>
			<parameter name="casetype" required="true" >
				<enumlist>
					<enum name="a">
						<para>Case sensitive (all) pronunciation.
						(Ex: SayAlphaCase(a,aBc); - lowercase a uppercase b lowercase c).</para>
					</enum>
					<enum name="l">
						<para>Case sensitive (lower) pronunciation.
						(Ex: SayAlphaCase(l,aBc); - lowercase a b lowercase c).</para>
					</enum>
					<enum name="n">
						<para>Case insensitive pronunciation. Equivalent to SayAlpha.
						(Ex: SayAlphaCase(n,aBc) - a b c).</para>
					</enum>
					<enum name="u">
						<para>Case sensitive (upper) pronunciation.
						(Ex: SayAlphaCase(u,aBc); - a uppercase b c).</para>
					</enum>
				</enumlist>
			</parameter>
			<parameter name="string" required="true" />
		</syntax>
		<description>
			<para>This application will play the sounds that correspond to the letters of the
			given <replaceable>string</replaceable>.  Optionally, a <replaceable>casetype</replaceable> may be
			specified.  This will be used for case-insensitive or case-sensitive pronunciations. If the channel
			variable <variable>SAY_DTMF_INTERRUPT</variable> is set to 'true' (case insensitive), then this
			application will react to DTMF in the same way as <literal>BackGround</literal>.</para>
		</description>
		<see-also>
			<ref type="application">SayDigits</ref>
			<ref type="application">SayMoney</ref>
			<ref type="application">SayNumber</ref>
			<ref type="application">SayOrdinal</ref>
			<ref type="application">SayPhonetic</ref>
			<ref type="application">SayAlpha</ref>
			<ref type="function">CHANNEL</ref>
		</see-also>
	</application>
	<application name="SayDigits" language="en_US" module="builtin">
		<since>
			<version>13.8.0</version>
		</since>
		<synopsis>
			Say Digits.
		</synopsis>
		<syntax>
			<parameter name="digits" required="true" />
		</syntax>
		<description>
			<para>This application will play the sounds that correspond to the digits of
			the given number. This will use the language that is currently set for the channel.
			If the channel variable <variable>SAY_DTMF_INTERRUPT</variable> is set to 'true'
			(case insensitive), then this application will react to DTMF in the same way as
			<literal>BackGround</literal>.</para>
		</description>
		<see-also>
			<ref type="application">SayAlpha</ref>
			<ref type="application">SayMoney</ref>
			<ref type="application">SayNumber</ref>
			<ref type="application">SayOrdinal</ref>
			<ref type="application">SayPhonetic</ref>
			<ref type="function">CHANNEL</ref>
			<ref type="function">SAYFILES</ref>
		</see-also>
	</application>
	<application name="SayMoney" language="en_US" module="builtin">
		<since>
			<version>16.21.0</version>
			<version>18.7.0</version>
		</since>
		<synopsis>
			Say Money.
		</synopsis>
		<syntax>
			<parameter name="dollars" required="true" />
		</syntax>
		<description>
			<para>This application will play the currency sounds for the given floating point number
			in the current language. Currently only English and US Dollars is supported.
			If the channel variable <variable>SAY_DTMF_INTERRUPT</variable> is set to 'true'
			(case insensitive), then this application will react to DTMF in the same way as
			<literal>BackGround</literal>.</para>
		</description>
		<see-also>
			<ref type="application">SayAlpha</ref>
			<ref type="application">SayNumber</ref>
			<ref type="application">SayOrdinal</ref>
			<ref type="application">SayPhonetic</ref>
			<ref type="function">CHANNEL</ref>
			<ref type="function">SAYFILES</ref>
		</see-also>
	</application>
	<application name="SayNumber" language="en_US" module="builtin">
		<since>
			<version>13.8.0</version>
		</since>
		<synopsis>
			Say Number.
		</synopsis>
		<syntax>
			<parameter name="digits" required="true" />
			<parameter name="gender" />
		</syntax>
		<description>
			<para>This application will play the sounds that correspond to the given
			<replaceable>digits</replaceable>. Optionally, a <replaceable>gender</replaceable> may be
			specified. This will use the language that is currently set for the channel. See the CHANNEL()
			function for more information on setting the language for the channel. If the channel variable
			<variable>SAY_DTMF_INTERRUPT</variable> is set to 'true' (case insensitive), then this
			application will react to DTMF in the same way as <literal>BackGround</literal>.</para>
		</description>
		<see-also>
			<ref type="application">SayAlpha</ref>
			<ref type="application">SayDigits</ref>
			<ref type="application">SayMoney</ref>
			<ref type="application">SayPhonetic</ref>
			<ref type="function">CHANNEL</ref>
			<ref type="function">SAYFILES</ref>
		</see-also>
	</application>
	<application name="SayOrdinal" language="en_US" module="builtin">
		<since>
			<version>16.21.0</version>
			<version>18.7.0</version>
		</since>
		<synopsis>
			Say Ordinal Number.
		</synopsis>
		<syntax>
			<parameter name="digits" required="true" />
			<parameter name="gender" />
		</syntax>
		<description>
			<para>This application will play the ordinal sounds that correspond to the given
			<replaceable>digits</replaceable> (e.g. 1st, 42nd). Currently only English is supported.</para>
			<para>Optionally, a <replaceable>gender</replaceable> may be
			specified. This will use the language that is currently set for the channel. See the CHANNEL()
			function for more information on setting the language for the channel. If the channel variable
			<variable>SAY_DTMF_INTERRUPT</variable> is set to 'true' (case insensitive), then this
			application will react to DTMF in the same way as <literal>BackGround</literal>.</para>
		</description>
		<see-also>
			<ref type="application">SayAlpha</ref>
			<ref type="application">SayDigits</ref>
			<ref type="application">SayMoney</ref>
			<ref type="application">SayNumber</ref>
			<ref type="application">SayPhonetic</ref>
			<ref type="function">CHANNEL</ref>
			<ref type="function">SAYFILES</ref>
		</see-also>
	</application>
	<application name="SayPhonetic" language="en_US" module="builtin">
		<since>
			<version>13.8.0</version>
		</since>
		<synopsis>
			Say Phonetic.
		</synopsis>
		<syntax>
			<parameter name="string" required="true" />
		</syntax>
		<description>
			<para>This application will play the sounds from the phonetic alphabet that correspond to the
			letters in the given <replaceable>string</replaceable>. If the channel variable
			<variable>SAY_DTMF_INTERRUPT</variable> is set to 'true' (case insensitive), then this
			application will react to DTMF in the same way as <literal>BackGround</literal>.</para>
		</description>
		<see-also>
			<ref type="application">SayAlpha</ref>
			<ref type="application">SayDigits</ref>
			<ref type="application">SayMoney</ref>
			<ref type="application">SayNumber</ref>
			<ref type="application">SayOrdinal</ref>
			<ref type="function">SAYFILES</ref>
		</see-also>
	</application>
	<application name="Wait" language="en_US" module="builtin">
		<since>
			<version>13.8.0</version>
		</since>
		<synopsis>
			Waits for some time.
		</synopsis>
		<syntax>
			<parameter name="seconds" required="true">
				<para>Can be passed with fractions of a second. For example, <literal>1.5</literal> will ask the
				application to wait for 1.5 seconds.</para>
			</parameter>
		</syntax>
		<description>
			<para>This application waits for a specified number of <replaceable>seconds</replaceable>.</para>
		</description>
	</application>
	<application name="WaitDigit" language="en_US" module="builtin">
		<since>
			<version>15.0.0</version>
		</since>
		<synopsis>
			Waits for a digit to be entered.
		</synopsis>
		<syntax>
			<parameter name="seconds">
				<para>Can be passed with fractions of a second. For example, <literal>1.5</literal> will ask the
				application to wait for 1.5 seconds.</para>
			</parameter>
			<parameter name="digits">
				<para>Digits to accept, all others are ignored.</para>
			</parameter>
		</syntax>
		<description>
			<para>This application waits for the user to press one of the accepted
			<replaceable>digits</replaceable> for a specified number of
			<replaceable>seconds</replaceable>.</para>
			<variablelist>
				<variable name="WAITDIGITSTATUS">
					<para>This is the final status of the command</para>
					<value name="ERROR">Parameters are invalid.</value>
					<value name="DTMF">An accepted digit was received.</value>
					<value name="TIMEOUT">The timeout passed before any acceptable digits were received.</value>
					<value name="CANCEL">The channel has hungup or was redirected.</value>
				</variable>
				<variable name="WAITDIGITRESULT">
					<para>The digit that was received, only set if
					<variable>WAITDIGITSTATUS</variable> is <literal>DTMF</literal>.</para>
				</variable>
			</variablelist>
		</description>
		<see-also>
			<ref type="application">Wait</ref>
			<ref type="application">WaitExten</ref>
		</see-also>
	</application>
	<application name="WaitExten" language="en_US" module="builtin">
		<since>
			<version>13.8.0</version>
		</since>
		<synopsis>
			Waits for an extension to be entered.
		</synopsis>
		<syntax>
			<parameter name="seconds">
				<para>Can be passed with fractions of a second. For example, <literal>1.5</literal> will ask the
				application to wait for 1.5 seconds.</para>
			</parameter>
			<parameter name="options">
				<optionlist>
					<option name="m">
						<para>Provide music on hold to the caller while waiting for an extension.</para>
						<argument name="x">
							<para>Specify the class for music on hold. <emphasis>CHANNEL(musicclass) will
							be used instead if set</emphasis></para>
						</argument>
					</option>
					<option name="d">
						<para>Play indications tone on channel while waiting for digits.</para>
						<argument name="x">
							<para>Specify the indications tone to play.
							Default is <literal>dial</literal> tone.</para>
						</argument>
					</option>
				</optionlist>
			</parameter>
		</syntax>
		<description>
			<para>This application waits for the user to enter a new extension for a specified number
			of <replaceable>seconds</replaceable>.</para>
		</description>
		<see-also>
			<ref type="application">BackGround</ref>
			<ref type="function">TIMEOUT</ref>
		</see-also>
	</application>
<module language="en_US" name="pbx_functions">
	<support_level>core</support_level>
</module>
<module language="en_US" name="pbx_hangup_handler">
	<support_level>core</support_level>
</module>
<module language="en_US" name="pbx_ignorepat">
	<support_level>core</support_level>
</module>
<module language="en_US" name="pbx_include">
	<support_level>core</support_level>
</module>
<module language="en_US" name="pbx_sw">
	<support_level>core</support_level>
</module>
<module language="en_US" name="pbx_switch">
	<support_level>core</support_level>
</module>
<module language="en_US" name="pbx_timing">
	<support_level>core</support_level>
</module>
<module language="en_US" name="pbx_variables">
	<support_level>core</support_level>
</module>
	<application name="Set" language="en_US" module="builtin">
		<since>
			<version>13.8.0</version>
		</since>
		<synopsis>
			Set channel variable or function value.
		</synopsis>
		<syntax argsep="=">
			<parameter name="name" required="true" />
			<parameter name="value" required="true" />
		</syntax>
		<description>
			<para>This function can be used to set the value of channel variables or dialplan functions.
			When setting variables, if the variable name is prefixed with <literal>_</literal>,
			the variable will be inherited into channels created from the current channel.
			If the variable name is prefixed with <literal>__</literal>, the variable will be
			inherited into channels created from the current channel and all children channels.</para>
			<note><para>If (and only if), in <filename>/etc/asterisk/asterisk.conf</filename>, you have
			a <literal>[compat]</literal> category, and you have <literal>app_set = 1.4</literal> under that, then
			the behavior of this app changes, and strips surrounding quotes from the right hand side as
			it did previously in 1.4.
			The advantages of not stripping out quoting, and not caring about the separator characters (comma and vertical bar)
			were sufficient to make these changes in 1.6. Confusion about how many backslashes would be needed to properly
			protect separators and quotes in various database access strings has been greatly
			reduced by these changes.</para></note>
		</description>
		<see-also>
			<ref type="application">MSet</ref>
			<ref type="function">GLOBAL</ref>
			<ref type="function">SET</ref>
			<ref type="function">ENV</ref>
		</see-also>
	</application>
	<application name="MSet" language="en_US" module="builtin">
		<since>
			<version>13.8.0</version>
		</since>
		<synopsis>
			Set channel variable(s) or function value(s).
		</synopsis>
		<syntax>
			<parameter name="set1" required="true" argsep="=">
				<argument name="name1" required="true" />
				<argument name="value1" required="true" />
			</parameter>
			<parameter name="set2" multiple="true" argsep="=">
				<argument name="name2" required="true" />
				<argument name="value2" required="true" />
			</parameter>
		</syntax>
		<description>
			<para>This function can be used to set the value of channel variables or dialplan functions.
			When setting variables, if the variable name is prefixed with <literal>_</literal>,
			the variable will be inherited into channels created from the current channel
			If the variable name is prefixed with <literal>__</literal>, the variable will be
			inherited into channels created from the current channel and all children channels.
			MSet behaves in a similar fashion to the way Set worked in 1.2/1.4 and is thus
			prone to doing things that you may not expect. For example, it strips surrounding
			double-quotes from the right-hand side (value). If you need to put a separator
			character (comma or vert-bar), you will need to escape them by inserting a backslash
			before them. Avoid its use if possible.</para>
			<para>This application allows up to 99 variables to be set at once.</para>
		</description>
		<see-also>
			<ref type="application">Set</ref>
		</see-also>
	</application>
<module language="en_US" name="pickup">
	<support_level>core</support_level>
</module>
	<managerEvent language="en_US" name="Pickup" module="builtin">
		<managerEventInstance class="EVENT_FLAG_CALL" module="builtin">
			<since>
				<version>12.0.0</version>
			</since>
			<synopsis>Raised when a call pickup occurs.</synopsis>
			<syntax>
				<channel_snapshot/>
				<channel_snapshot prefix="Target"/>
			</syntax>
		</managerEventInstance>
	</managerEvent>
<module language="en_US" name="plc">
	<support_level>core</support_level>
</module>
<module language="en_US" name="presencestate">
	<support_level>core</support_level>
</module>
	<managerEvent language="en_US" name="PresenceStateChange" module="builtin">
		<managerEventInstance class="EVENT_FLAG_CALL" module="builtin">
			<since>
				<version>13.0.0</version>
			</since>
			<synopsis>Raised when a presence state changes</synopsis>
			<syntax>
				<parameter name="Presentity">
					<para>The entity whose presence state has changed</para>
				</parameter>
				<parameter name="Status">
					<para>The new status of the presentity</para>
				</parameter>
				<parameter name="Subtype">
					<para>The new subtype of the presentity</para>
				</parameter>
				<parameter name="Message">
					<para>The new message of the presentity</para>
				</parameter>
			</syntax>
			<description>
				<para>This differs from the <literal>PresenceStatus</literal>
				event because this event is raised for all presence state changes,
				not only for changes that affect dialplan hints.</para>
			</description>
			<see-also>
				<ref type="managerEvent">PresenceStatus</ref>
			</see-also>
		</managerEventInstance>
	</managerEvent>
<module language="en_US" name="privacy">
	<support_level>core</support_level>
</module>
<module language="en_US" name="refer">
	<support_level>core</support_level>
</module>
<module language="en_US" name="rtp_engine">
	<support_level>core</support_level>
</module>
	<managerEvent language="en_US" name="RTCPSent" module="builtin">
		<managerEventInstance class="EVENT_FLAG_REPORTING" module="builtin">
			<since>
				<version>12.0.0</version>
			</since>
			<synopsis>Raised when an RTCP packet is sent.</synopsis>
			<syntax>
				<channel_snapshot/>
				<parameter name="SSRC">
					<para>The SSRC identifier for our stream</para>
				</parameter>
				<parameter name="PT">
					<para>The type of packet for this RTCP report.</para>
					<enumlist>
						<enum name="200(SR)"/>
						<enum name="201(RR)"/>
					</enumlist>
				</parameter>
				<parameter name="To">
					<para>The address the report is sent to.</para>
				</parameter>
				<parameter name="ReportCount">
					<para>The number of reports that were sent.</para>
					<para>The report count determines the number of ReportX headers in
					the message. The X for each set of report headers will range from 0 to
					<literal>ReportCount - 1</literal>.</para>
				</parameter>
				<parameter name="SentNTP" required="false">
					<para>The time the sender generated the report. Only valid when
					PT is <literal>200(SR)</literal>.</para>
				</parameter>
				<parameter name="SentRTP" required="false">
					<para>The sender's last RTP timestamp. Only valid when PT is
					<literal>200(SR)</literal>.</para>
				</parameter>
				<parameter name="SentPackets" required="false">
					<para>The number of packets the sender has sent. Only valid when PT
					is <literal>200(SR)</literal>.</para>
				</parameter>
				<parameter name="SentOctets" required="false">
					<para>The number of bytes the sender has sent. Only valid when PT is
					<literal>200(SR)</literal>.</para>
				</parameter>
				<parameter name="ReportXSourceSSRC">
					<para>The SSRC for the source of this report block.</para>
				</parameter>
				<parameter name="ReportXFractionLost">
					<para>The fraction of RTP data packets from <literal>ReportXSourceSSRC</literal>
					lost since the previous SR or RR report was sent.</para>
				</parameter>
				<parameter name="ReportXCumulativeLost">
					<para>The total number of RTP data packets from <literal>ReportXSourceSSRC</literal>
					lost since the beginning of reception.</para>
				</parameter>
				<parameter name="ReportXHighestSequence">
					<para>The highest sequence number received in an RTP data packet from
					<literal>ReportXSourceSSRC</literal>.</para>
				</parameter>
				<parameter name="ReportXSequenceNumberCycles">
					<para>The number of sequence number cycles seen for the RTP data
					received from <literal>ReportXSourceSSRC</literal>.</para>
				</parameter>
				<parameter name="ReportXIAJitter">
					<para>An estimate of the statistical variance of the RTP data packet
					interarrival time, measured in timestamp units.</para>
				</parameter>
				<parameter name="ReportXLSR">
					<para>The last SR timestamp received from <literal>ReportXSourceSSRC</literal>.
					If no SR has been received from <literal>ReportXSourceSSRC</literal>,
					then 0.</para>
				</parameter>
				<parameter name="ReportXDLSR">
					<para>The delay, expressed in units of 1/65536 seconds, between
					receiving the last SR packet from <literal>ReportXSourceSSRC</literal>
					and sending this report.</para>
				</parameter>
			</syntax>
			<see-also>
				<ref type="managerEvent">RTCPReceived</ref>
			</see-also>
		</managerEventInstance>
	</managerEvent>
	<managerEvent language="en_US" name="RTCPReceived" module="builtin">
		<managerEventInstance class="EVENT_FLAG_REPORTING" module="builtin">
			<since>
				<version>12.0.0</version>
			</since>
			<synopsis>Raised when an RTCP packet is received.</synopsis>
			<syntax>
				<channel_snapshot/>
				<parameter name="SSRC">
					<para>The SSRC identifier for the remote system</para>
				</parameter>
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='RTCPSent']/managerEventInstance/syntax/parameter[@name='PT'])" />
				<parameter name="From">
					<para>The address the report was received from.</para>
				</parameter>
				<parameter name="RTT">
					<para>Calculated Round-Trip Time in seconds</para>
				</parameter>
				<parameter name="ReportCount">
					<para>The number of reports that were received.</para>
					<para>The report count determines the number of ReportX headers in
					the message. The X for each set of report headers will range from 0 to
					<literal>ReportCount - 1</literal>.</para>
				</parameter>
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='RTCPSent']/managerEventInstance/syntax/parameter[@name='SentNTP'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='RTCPSent']/managerEventInstance/syntax/parameter[@name='SentRTP'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='RTCPSent']/managerEventInstance/syntax/parameter[@name='SentPackets'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='RTCPSent']/managerEventInstance/syntax/parameter[@name='SentOctets'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='RTCPSent']/managerEventInstance/syntax/parameter[contains(@name, 'ReportX')])" />
			</syntax>
			<see-also>
				<ref type="managerEvent">RTCPSent</ref>
			</see-also>
		</managerEventInstance>
	</managerEvent>
<module language="en_US" name="say">
	<support_level>core</support_level>
</module>
<module language="en_US" name="sched">
	<support_level>core</support_level>
</module>
<module language="en_US" name="sdp_srtp">
	<support_level>core</support_level>
</module>
<module language="en_US" name="security_events">
	<support_level>core</support_level>
</module>
	<managerEvent language="en_US" name="FailedACL" module="builtin">
		<managerEventInstance class="EVENT_FLAG_SECURITY" module="builtin">
			<since>
				<version>12.1.0</version>
			</since>
			<synopsis>Raised when a request violates an ACL check.</synopsis>
			<syntax>
				<parameter name="EventTV">
					<para>The time the event was detected.</para>
				</parameter>
				<parameter name="Severity">
					<para>A relative severity of the security event.</para>
					<enumlist>
						<enum name="Informational"/>
						<enum name="Error"/>
					</enumlist>
				</parameter>
				<parameter name="Service">
					<para>The Asterisk service that raised the security event.</para>
				</parameter>
				<parameter name="EventVersion">
					<para>The version of this event.</para>
				</parameter>
				<parameter name="AccountID">
					<para>The Service account associated with the security event
					notification.</para>
				</parameter>
				<parameter name="SessionID">
					<para>A unique identifier for the session in the service
					that raised the event.</para>
				</parameter>
				<parameter name="LocalAddress">
					<para>The address of the Asterisk service that raised the
					security event.</para>
				</parameter>
				<parameter name="RemoteAddress">
					<para>The remote address of the entity that caused the
					security event to be raised.</para>
				</parameter>
				<parameter name="Module" required="false">
					<para>If available, the name of the module that raised the event.</para>
				</parameter>
				<parameter name="ACLName" required="false">
					<para>If available, the name of the ACL that failed.</para>
				</parameter>
				<parameter name="SessionTV" required="false">
					<para>The timestamp reported by the session.</para>
				</parameter>
			</syntax>
		</managerEventInstance>
	</managerEvent>
	<managerEvent language="en_US" name="InvalidAccountID" module="builtin">
		<managerEventInstance class="EVENT_FLAG_SECURITY" module="builtin">
			<since>
				<version>12.1.0</version>
			</since>
			<synopsis>Raised when a request fails an authentication check due to an invalid account ID.</synopsis>
			<syntax>
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='EventTV'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='Severity'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='Service'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='EventVersion'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='AccountID'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='SessionID'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='LocalAddress'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='RemoteAddress'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='Module'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='SessionTV'])" />
			</syntax>
		</managerEventInstance>
	</managerEvent>
	<managerEvent language="en_US" name="SessionLimit" module="builtin">
		<managerEventInstance class="EVENT_FLAG_SECURITY" module="builtin">
			<since>
				<version>12.1.0</version>
			</since>
			<synopsis>Raised when a request fails due to exceeding the number of allowed concurrent sessions for that service.</synopsis>
			<syntax>
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='EventTV'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='Severity'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='Service'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='EventVersion'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='AccountID'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='SessionID'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='LocalAddress'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='RemoteAddress'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='Module'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='SessionTV'])" />
			</syntax>
		</managerEventInstance>
	</managerEvent>
	<managerEvent language="en_US" name="MemoryLimit" module="builtin">
		<managerEventInstance class="EVENT_FLAG_SECURITY" module="builtin">
			<since>
				<version>12.1.0</version>
			</since>
			<synopsis>Raised when a request fails due to an internal memory allocation failure.</synopsis>
			<syntax>
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='EventTV'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='Severity'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='Service'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='EventVersion'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='AccountID'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='SessionID'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='LocalAddress'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='RemoteAddress'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='Module'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='SessionTV'])" />
			</syntax>
		</managerEventInstance>
	</managerEvent>
	<managerEvent language="en_US" name="LoadAverageLimit" module="builtin">
		<managerEventInstance class="EVENT_FLAG_SECURITY" module="builtin">
			<since>
				<version>12.1.0</version>
			</since>
			<synopsis>Raised when a request fails because a configured load average limit has been reached.</synopsis>
			<syntax>
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='EventTV'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='Severity'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='Service'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='EventVersion'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='AccountID'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='SessionID'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='LocalAddress'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='RemoteAddress'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='Module'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='SessionTV'])" />
			</syntax>
		</managerEventInstance>
	</managerEvent>
	<managerEvent language="en_US" name="RequestNotSupported" module="builtin">
		<managerEventInstance class="EVENT_FLAG_SECURITY" module="builtin">
			<since>
				<version>12.1.0</version>
			</since>
			<synopsis>Raised when a request fails due to some aspect of the requested item not being supported by the service.</synopsis>
			<syntax>
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='EventTV'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='Severity'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='Service'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='EventVersion'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='AccountID'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='SessionID'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='LocalAddress'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='RemoteAddress'])" />
				<parameter name="RequestType">
					<para>The type of request attempted.</para>
				</parameter>
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='Module'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='SessionTV'])" />
			</syntax>
		</managerEventInstance>
	</managerEvent>
	<managerEvent language="en_US" name="RequestNotAllowed" module="builtin">
		<managerEventInstance class="EVENT_FLAG_SECURITY" module="builtin">
			<since>
				<version>12.1.0</version>
			</since>
			<synopsis>Raised when a request is not allowed by the service.</synopsis>
			<syntax>
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='EventTV'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='Severity'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='Service'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='EventVersion'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='AccountID'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='SessionID'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='LocalAddress'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='RemoteAddress'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='RequestNotSupported']/managerEventInstance/syntax/parameter[@name='RequestType'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='Module'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='SessionTV'])" />
				<parameter name="RequestParams" required="false">
					<para>Parameters provided to the rejected request.</para>
				</parameter>
			</syntax>
		</managerEventInstance>
	</managerEvent>
	<managerEvent language="en_US" name="AuthMethodNotAllowed" module="builtin">
		<managerEventInstance class="EVENT_FLAG_SECURITY" module="builtin">
			<since>
				<version>12.1.0</version>
			</since>
			<synopsis>Raised when a request used an authentication method not allowed by the service.</synopsis>
			<syntax>
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='EventTV'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='Severity'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='Service'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='EventVersion'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='AccountID'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='SessionID'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='LocalAddress'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='RemoteAddress'])" />
				<parameter name="AuthMethod">
					<para>The authentication method attempted.</para>
				</parameter>
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='Module'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='SessionTV'])" />
			</syntax>
		</managerEventInstance>
	</managerEvent>
	<managerEvent language="en_US" name="RequestBadFormat" module="builtin">
		<managerEventInstance class="EVENT_FLAG_SECURITY" module="builtin">
			<since>
				<version>12.1.0</version>
			</since>
			<synopsis>Raised when a request is received with bad formatting.</synopsis>
			<syntax>
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='EventTV'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='Severity'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='Service'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='EventVersion'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='AccountID'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='SessionID'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='LocalAddress'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='RemoteAddress'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='RequestNotSupported']/managerEventInstance/syntax/parameter[@name='RequestType'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='Module'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='SessionTV'])" />
				<parameter name="AccountID" required="false">
					<para>The account ID associated with the rejected request.</para>
				</parameter>
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='RequestNotAllowed']/managerEventInstance/syntax/parameter[@name='RequestParams'])" />
			</syntax>
		</managerEventInstance>
	</managerEvent>
	<managerEvent language="en_US" name="SuccessfulAuth" module="builtin">
		<managerEventInstance class="EVENT_FLAG_SECURITY" module="builtin">
			<since>
				<version>12.1.0</version>
			</since>
			<synopsis>Raised when a request successfully authenticates with a service.</synopsis>
			<syntax>
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='EventTV'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='Severity'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='Service'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='EventVersion'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='AccountID'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='SessionID'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='LocalAddress'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='RemoteAddress'])" />
				<parameter name="UsingPassword">
					<para>Whether or not the authentication attempt included a password.</para>
				</parameter>
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='Module'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='SessionTV'])" />
			</syntax>
		</managerEventInstance>
	</managerEvent>
	<managerEvent language="en_US" name="UnexpectedAddress" module="builtin">
		<managerEventInstance class="EVENT_FLAG_SECURITY" module="builtin">
			<since>
				<version>12.1.0</version>
			</since>
			<synopsis>Raised when a request has a different source address then what is expected for a session already in progress with a service.</synopsis>
			<syntax>
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='EventTV'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='Severity'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='Service'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='EventVersion'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='AccountID'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='SessionID'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='LocalAddress'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='RemoteAddress'])" />
				<parameter name="ExpectedAddress">
					<para>The address that the request was expected to use.</para>
				</parameter>
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='Module'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='SessionTV'])" />
			</syntax>
		</managerEventInstance>
	</managerEvent>
	<managerEvent language="en_US" name="ChallengeResponseFailed" module="builtin">
		<managerEventInstance class="EVENT_FLAG_SECURITY" module="builtin">
			<since>
				<version>12.1.0</version>
			</since>
			<synopsis>Raised when a request's attempt to authenticate has been challenged, and the request failed the authentication challenge.</synopsis>
			<syntax>
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='EventTV'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='Severity'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='Service'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='EventVersion'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='AccountID'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='SessionID'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='LocalAddress'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='RemoteAddress'])" />
				<parameter name="Challenge">
					<para>The challenge that was sent.</para>
				</parameter>
				<parameter name="Response">
					<para>The response that was received.</para>
				</parameter>
				<parameter name="ExpectedResponse">
					<para>The expected response to the challenge.</para>
				</parameter>
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='Module'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='SessionTV'])" />
			</syntax>
		</managerEventInstance>
	</managerEvent>
	<managerEvent language="en_US" name="InvalidPassword" module="builtin">
		<managerEventInstance class="EVENT_FLAG_SECURITY" module="builtin">
			<since>
				<version>12.1.0</version>
			</since>
			<synopsis>Raised when a request provides an invalid password during an authentication attempt.</synopsis>
			<syntax>
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='EventTV'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='Severity'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='Service'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='EventVersion'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='AccountID'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='SessionID'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='LocalAddress'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='RemoteAddress'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='Module'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='SessionTV'])" />
				<parameter name="Challenge" required="false">
					<para>The challenge that was sent.</para>
				</parameter>
				<parameter name="ReceivedChallenge" required="false">
					<para>The challenge that was received.</para>
				</parameter>
				<parameter name="ReceivedHash" required="false">
					<para>The hash that was received.</para>
				</parameter>
			</syntax>
		</managerEventInstance>
	</managerEvent>
	<managerEvent language="en_US" name="ChallengeSent" module="builtin">
		<managerEventInstance class="EVENT_FLAG_SECURITY" module="builtin">
			<since>
				<version>12.1.0</version>
			</since>
			<synopsis>Raised when an Asterisk service sends an authentication challenge to a request.</synopsis>
			<syntax>
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='EventTV'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='Severity'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='Service'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='EventVersion'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='AccountID'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='SessionID'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='LocalAddress'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='RemoteAddress'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='ChallengeResponseFailed']/managerEventInstance/syntax/parameter[@name='Challenge'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='Module'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='SessionTV'])" />
			</syntax>
		</managerEventInstance>
	</managerEvent>
	<managerEvent language="en_US" name="InvalidTransport" module="builtin">
		<managerEventInstance class="EVENT_FLAG_SECURITY" module="builtin">
			<since>
				<version>12.1.0</version>
			</since>
			<synopsis>Raised when a request attempts to use a transport not allowed by the Asterisk service.</synopsis>
			<syntax>
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='EventTV'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='Severity'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='Service'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='EventVersion'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='AccountID'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='SessionID'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='LocalAddress'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='RemoteAddress'])" />
				<parameter name="AttemptedTransport">
					<para>The transport type that the request attempted to use.</para>
				</parameter>
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='Module'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='SessionTV'])" />
			</syntax>
		</managerEventInstance>
	</managerEvent>
<module language="en_US" name="slinfactory">
	<support_level>core</support_level>
</module>
<module language="en_US" name="smoother">
	<support_level>core</support_level>
</module>
<module language="en_US" name="sorcery">
	<support_level>core</support_level>
</module>
<module language="en_US" name="sounds">
	<support_level>core</support_level>
</module>
<module language="en_US" name="srv">
	<support_level>core</support_level>
</module>
<module language="en_US" name="stasis">
	<support_level>core</support_level>
</module>
	<managerEvent language="en_US" name="UserEvent" module="builtin">
		<managerEventInstance class="EVENT_FLAG_USER" module="builtin">
			<since>
				<version>12.3.0</version>
			</since>
			<synopsis>A user defined event raised from the dialplan.</synopsis>
			<syntax>
				<channel_snapshot/>
				<parameter name="UserEvent">
					<para>The event name, as specified in the dialplan.</para>
				</parameter>
			</syntax>
			<description>
				<para>Event may contain additional arbitrary parameters in addition to optional bridge and endpoint snapshots.  Multiple snapshots of the same type are prefixed with a numeric value.</para>
			</description>
			<see-also>
				<ref type="application">UserEvent</ref>
				<ref type="managerEvent">UserEvent</ref>
			</see-also>
		</managerEventInstance>
	</managerEvent>
	<configInfo name="stasis" language="en_US">
		<configFile name="stasis.conf">
			<configObject name="threadpool">
				<since>
					<version>12.8.0</version>
					<version>13.1.0</version>
				</since>
				<synopsis>Settings that configure the threadpool Stasis uses to deliver some messages.</synopsis>
				<configOption name="initial_size" default="5">
					<since>
						<version>12.8.0</version>
						<version>13.1.0</version>
					</since>
					<synopsis>Initial number of threads in the message bus threadpool.</synopsis>
				</configOption>
				<configOption name="idle_timeout_sec" default="20">
					<since>
						<version>12.8.0</version>
						<version>13.1.0</version>
					</since>
					<synopsis>Number of seconds before an idle thread is disposed of.</synopsis>
				</configOption>
				<configOption name="max_size" default="50">
					<since>
						<version>12.8.0</version>
						<version>13.1.0</version>
					</since>
					<synopsis>Maximum number of threads in the threadpool.</synopsis>
				</configOption>
			</configObject>
			<configObject name="taskpool">
				<since>
					<version>23.1.0</version>
					<version>22.7.0</version>
					<version>20.17.0</version>
				</since>
				<synopsis>Settings that configure the taskpool Stasis uses to deliver some messages.</synopsis>
				<configOption name="minimum_size" default="5">
					<since>
					<version>23.1.0</version>
					<version>22.7.0</version>
					<version>20.17.0</version>
					</since>
					<synopsis>Minimum number of taskprocessors in the message bus taskpool.</synopsis>
				</configOption>
				<configOption name="initial_size" default="5">
					<since>
					<version>23.1.0</version>
					<version>22.7.0</version>
					<version>20.17.0</version>
					</since>
					<synopsis>Initial number of taskprocessors in the message bus taskpool.</synopsis>
				</configOption>
				<configOption name="idle_timeout_sec" default="20">
					<since>
					<version>23.1.0</version>
					<version>22.7.0</version>
					<version>20.17.0</version>
					</since>
					<synopsis>Number of seconds before an idle taskprocessor is disposed of.</synopsis>
				</configOption>
				<configOption name="max_size" default="50">
					<since>
					<version>23.1.0</version>
					<version>22.7.0</version>
					<version>20.17.0</version>
					</since>
					<synopsis>Maximum number of taskprocessors in the taskpool.</synopsis>
				</configOption>
			</configObject>
			<configObject name="declined_message_types">
				<since>
					<version>13.0.0</version>
				</since>
				<synopsis>Stasis message types for which to decline creation.</synopsis>
				<configOption name="decline">
					<since>
						<version>12.8.0</version>
						<version>13.1.0</version>
					</since>
					<synopsis>The message type to decline.</synopsis>
					<description>
						<para>This configuration option defines the name of the Stasis
						message type that Asterisk is forbidden from creating and can be
						specified as many times as necessary to achieve the desired result.</para>
						<enumlist>
							<enum name="stasis_app_recording_snapshot_type" />
							<enum name="stasis_app_playback_snapshot_type" />
							<enum name="stasis_test_message_type" />
							<enum name="confbridge_start_type" />
							<enum name="confbridge_end_type" />
							<enum name="confbridge_join_type" />
							<enum name="confbridge_leave_type" />
							<enum name="confbridge_start_record_type" />
							<enum name="confbridge_stop_record_type" />
							<enum name="confbridge_mute_type" />
							<enum name="confbridge_unmute_type" />
							<enum name="confbridge_talking_type" />
							<enum name="cel_generic_type" />
							<enum name="ast_bridge_snapshot_type" />
							<enum name="ast_bridge_merge_message_type" />
							<enum name="ast_channel_entered_bridge_type" />
							<enum name="ast_channel_left_bridge_type" />
							<enum name="ast_blind_transfer_type" />
							<enum name="ast_attended_transfer_type" />
							<enum name="ast_endpoint_snapshot_type" />
							<enum name="ast_endpoint_state_type" />
							<enum name="ast_device_state_message_type" />
							<enum name="ast_test_suite_message_type" />
							<enum name="ast_mwi_state_type" />
							<enum name="ast_mwi_vm_app_type" />
							<enum name="ast_format_register_type" />
							<enum name="ast_format_unregister_type" />
							<enum name="ast_manager_get_generic_type" />
							<enum name="ast_parked_call_type" />
							<enum name="ast_channel_snapshot_type" />
							<enum name="ast_channel_dial_type" />
							<enum name="ast_channel_varset_type" />
							<enum name="ast_channel_hangup_request_type" />
							<enum name="ast_channel_dtmf_begin_type" />
							<enum name="ast_channel_dtmf_end_type" />
							<enum name="ast_channel_flash_type" />
							<enum name="ast_channel_wink_type" />
							<enum name="ast_channel_hold_type" />
							<enum name="ast_channel_unhold_type" />
							<enum name="ast_channel_chanspy_start_type" />
							<enum name="ast_channel_chanspy_stop_type" />
							<enum name="ast_channel_fax_type" />
							<enum name="ast_channel_hangup_handler_type" />
							<enum name="ast_channel_moh_start_type" />
							<enum name="ast_channel_moh_stop_type" />
							<enum name="ast_channel_mixmonitor_start_type" />
							<enum name="ast_channel_mixmonitor_stop_type" />
							<enum name="ast_channel_mixmonitor_mute_type" />
							<enum name="ast_channel_agent_login_type" />
							<enum name="ast_channel_agent_logoff_type" />
							<enum name="ast_channel_talking_start" />
							<enum name="ast_channel_talking_stop" />
							<enum name="ast_channel_tone_detect" />
							<enum name="ast_security_event_type" />
							<enum name="ast_named_acl_change_type" />
							<enum name="ast_local_bridge_type" />
							<enum name="ast_local_optimization_begin_type" />
							<enum name="ast_local_optimization_end_type" />
							<enum name="stasis_subscription_change_type" />
							<enum name="ast_multi_user_event_type" />
							<enum name="stasis_cache_clear_type" />
							<enum name="stasis_cache_update_type" />
							<enum name="ast_network_change_type" />
							<enum name="ast_system_registry_type" />
							<enum name="ast_cc_available_type" />
							<enum name="ast_cc_offertimerstart_type" />
							<enum name="ast_cc_requested_type" />
							<enum name="ast_cc_requestacknowledged_type" />
							<enum name="ast_cc_callerstopmonitoring_type" />
							<enum name="ast_cc_callerstartmonitoring_type" />
							<enum name="ast_cc_callerrecalling_type" />
							<enum name="ast_cc_recallcomplete_type" />
							<enum name="ast_cc_failure_type" />
							<enum name="ast_cc_monitorfailed_type" />
							<enum name="ast_presence_state_message_type" />
							<enum name="ast_rtp_rtcp_sent_type" />
							<enum name="ast_rtp_rtcp_received_type" />
							<enum name="ast_call_pickup_type" />
							<enum name="aoc_s_type" />
							<enum name="aoc_d_type" />
							<enum name="aoc_e_type" />
							<enum name="dahdichannel_type" />
							<enum name="mcid_type" />
							<enum name="session_timeout_type" />
							<enum name="cdr_read_message_type" />
							<enum name="cdr_write_message_type" />
							<enum name="cdr_prop_write_message_type" />
							<enum name="corosync_ping_message_type" />
							<enum name="agi_exec_start_type" />
							<enum name="agi_exec_end_type" />
							<enum name="agi_async_start_type" />
							<enum name="agi_async_exec_type" />
							<enum name="agi_async_end_type" />
							<enum name="queue_caller_join_type" />
							<enum name="queue_caller_leave_type" />
							<enum name="queue_caller_abandon_type" />
							<enum name="queue_member_status_type" />
							<enum name="queue_member_added_type" />
							<enum name="queue_member_removed_type" />
							<enum name="queue_member_pause_type" />
							<enum name="queue_member_penalty_type" />
							<enum name="queue_member_ringinuse_type" />
							<enum name="queue_agent_called_type" />
							<enum name="queue_agent_connect_type" />
							<enum name="queue_agent_complete_type" />
							<enum name="queue_agent_dump_type" />
							<enum name="queue_agent_ringnoanswer_type" />
							<enum name="meetme_join_type" />
							<enum name="meetme_leave_type" />
							<enum name="meetme_end_type" />
							<enum name="meetme_mute_type" />
							<enum name="meetme_talking_type" />
							<enum name="meetme_talk_request_type" />
							<enum name="appcdr_message_type" />
							<enum name="forkcdr_message_type" />
							<enum name="cdr_sync_message_type" />
						</enumlist>
					</description>
				</configOption>
			</configObject>
		</configFile>
	</configInfo>
<module language="en_US" name="stasis_bridges">
	<support_level>core</support_level>
</module>
	<managerEvent language="en_US" name="BlindTransfer" module="builtin">
		<managerEventInstance class="EVENT_FLAG_CALL" module="builtin">
			<since>
				<version>12.0.0</version>
			</since>
			<synopsis>Raised when a blind transfer is complete.</synopsis>
			<syntax>
				<parameter name="Result">
					<para>Indicates if the transfer was successful or if it failed.</para>
					<enumlist>
						<enum name="Fail"><para>An internal error occurred.</para></enum>
						<enum name="Invalid"><para>Invalid configuration for transfer (e.g. Not bridged)</para></enum>
						<enum name="Not Permitted"><para>Bridge does not permit transfers</para></enum>
						<enum name="Success"><para>Transfer completed successfully</para></enum>
					</enumlist>
					<note><para>A result of <literal>Success</literal> does not necessarily mean that a target was successfully
					contacted. It means that a party was successfully placed into the dialplan at the expected location.</para></note>
				</parameter>
				<channel_snapshot prefix="Transferer"/>
				<channel_snapshot prefix="Transferee"/>
				<bridge_snapshot/>
				<parameter name="IsExternal">
					<para>Indicates if the transfer was performed outside of Asterisk. For instance,
					a channel protocol native transfer is external. A DTMF transfer is internal.</para>
						<enumlist>
							<enum name="Yes" />
							<enum name="No" />
						</enumlist>
				</parameter>
				<parameter name="Context">
					<para>Destination context for the blind transfer.</para>
				</parameter>
				<parameter name="Extension">
					<para>Destination extension for the blind transfer.</para>
				</parameter>
			</syntax>
			<see-also>
				<ref type="manager">BlindTransfer</ref>
			</see-also>
		</managerEventInstance>
	</managerEvent>
	<managerEvent language="en_US" name="AttendedTransfer" module="builtin">
		<managerEventInstance class="EVENT_FLAG_CALL" module="builtin">
			<since>
				<version>12.0.0</version>
			</since>
			<synopsis>Raised when an attended transfer is complete.</synopsis>
			<syntax>
				<xi:include xpointer="xpointer(docs/managerEvent[@name='BlindTransfer']/managerEventInstance/syntax/parameter[@name='Result'])" />
				<channel_snapshot prefix="OrigTransferer"/>
				<bridge_snapshot prefix="Orig"/>
				<channel_snapshot prefix="SecondTransferer"/>
				<bridge_snapshot prefix="Second"/>
				<parameter name="DestType">
					<para>Indicates the method by which the attended transfer completed.</para>
					<enumlist>
						<enum name="Bridge"><para>The transfer was accomplished by merging two bridges into one.</para></enum>
						<enum name="App"><para>The transfer was accomplished by having a channel or bridge run a dialplan application.</para></enum>
						<enum name="Link"><para>The transfer was accomplished by linking two bridges together using a local channel pair.</para></enum>
						<enum name="Threeway"><para>The transfer was accomplished by placing all parties into a threeway call.</para></enum>
						<enum name="Fail"><para>The transfer failed.</para></enum>
					</enumlist>
				</parameter>
				<parameter name="DestBridgeUniqueid">
					<para>Indicates the surviving bridge when bridges were merged to complete the transfer</para>
					<note><para>This header is only present when <replaceable>DestType</replaceable> is <literal>Bridge</literal> or <literal>Threeway</literal></para></note>
				</parameter>
				<parameter name="DestApp">
					<para>Indicates the application that is running when the transfer completes</para>
					<note><para>This header is only present when <replaceable>DestType</replaceable> is <literal>App</literal></para></note>
				</parameter>
				<channel_snapshot prefix="LocalOne"/>
				<channel_snapshot prefix="LocalTwo"/>
				<parameter name="DestTransfererChannel">
					<para>The name of the surviving transferer channel when a transfer results in a threeway call</para>
					<note><para>This header is only present when <replaceable>DestType</replaceable> is <literal>Threeway</literal></para></note>
				</parameter>
				<channel_snapshot prefix="Transferee" />
				<channel_snapshot prefix="TransferTarget" />
			</syntax>
			<description>
				<para>The headers in this event attempt to describe all the major details of the attended transfer. The two transferer channels
				and the two bridges are determined based on their chronological establishment. So consider that Alice calls Bob, and then Alice
				transfers the call to Voicemail. The transferer and bridge headers would be arranged as follows:</para>
				<para>	<replaceable>OrigTransfererChannel</replaceable>: Alice's channel in the bridge with Bob.</para>
				<para>	<replaceable>OrigBridgeUniqueid</replaceable>: The bridge between Alice and Bob.</para>
				<para>	<replaceable>SecondTransfererChannel</replaceable>: Alice's channel that called Voicemail.</para>
				<para>	<replaceable>SecondBridgeUniqueid</replaceable>: Not present, since a call to Voicemail has no bridge.</para>
				<para>Now consider if the order were reversed; instead of having Alice call Bob and transfer him to Voicemail, Alice instead
				calls her Voicemail and transfers that to Bob. The transferer and bridge headers would be arranged as follows:</para>
				<para>	<replaceable>OrigTransfererChannel</replaceable>: Alice's channel that called Voicemail.</para>
				<para>	<replaceable>OrigBridgeUniqueid</replaceable>: Not present, since a call to Voicemail has no bridge.</para>
				<para>	<replaceable>SecondTransfererChannel</replaceable>: Alice's channel in the bridge with Bob.</para>
				<para>	<replaceable>SecondBridgeUniqueid</replaceable>: The bridge between Alice and Bob.</para>
			</description>
			<see-also>
				<ref type="manager">AtxFer</ref>
			</see-also>
		</managerEventInstance>
	</managerEvent>
<module language="en_US" name="stasis_cache">
	<support_level>core</support_level>
</module>
<module language="en_US" name="stasis_cache_pattern">
	<support_level>core</support_level>
</module>
<module language="en_US" name="stasis_channels">
	<support_level>core</support_level>
</module>
	<managerEvent language="en_US" name="VarSet" module="builtin">
		<managerEventInstance class="EVENT_FLAG_DIALPLAN" module="builtin">
			<since>
				<version>12.0.0</version>
			</since>
			<synopsis>Raised when a variable is set to a particular value.</synopsis>
			<syntax>
				<channel_snapshot/>
				<parameter name="Variable">
					<para>The variable being set.</para>
				</parameter>
				<parameter name="Value">
					<para>The new value of the variable.</para>
				</parameter>
			</syntax>
		</managerEventInstance>
	</managerEvent>
	<managerEvent language="en_US" name="AgentLogin" module="builtin">
		<managerEventInstance class="EVENT_FLAG_AGENT" module="builtin">
			<since>
				<version>12.0.0</version>
			</since>
			<synopsis>Raised when an Agent has logged in.</synopsis>
			<syntax>
				<channel_snapshot/>
				<parameter name="Agent">
					<para>Agent ID of the agent.</para>
				</parameter>
			</syntax>
			<see-also>
				<ref type="application">AgentLogin</ref>
				<ref type="managerEvent">AgentLogoff</ref>
			</see-also>
		</managerEventInstance>
	</managerEvent>
	<managerEvent language="en_US" name="AgentLogoff" module="builtin">
		<managerEventInstance class="EVENT_FLAG_AGENT" module="builtin">
			<since>
				<version>12.0.0</version>
			</since>
			<synopsis>Raised when an Agent has logged off.</synopsis>
			<syntax>
				<channel_snapshot/>
				<parameter name="Agent">
					<para>Agent ID of the agent.</para>
				</parameter>
				<parameter name="Logintime">
					<para>The number of seconds the agent was logged in.</para>
				</parameter>
			</syntax>
			<see-also>
				<ref type="managerEvent">AgentLogin</ref>
			</see-also>
		</managerEventInstance>
	</managerEvent>
	<managerEvent language="en_US" name="ChannelTalkingStart" module="builtin">
		<managerEventInstance class="EVENT_FLAG_CLASS" module="builtin">
			<since>
				<version>12.4.0</version>
			</since>
			<synopsis>Raised when talking is detected on a channel.</synopsis>
			<syntax>
				<channel_snapshot/>
			</syntax>
			<see-also>
				<ref type="function">TALK_DETECT</ref>
				<ref type="managerEvent">ChannelTalkingStop</ref>
			</see-also>
		</managerEventInstance>
	</managerEvent>
	<managerEvent language="en_US" name="ChannelTalkingStop" module="builtin">
		<managerEventInstance class="EVENT_FLAG_CLASS" module="builtin">
			<since>
				<version>12.4.0</version>
			</since>
			<synopsis>Raised when talking is no longer detected on a channel.</synopsis>
			<syntax>
				<channel_snapshot/>
				<parameter name="Duration">
					<para>The length in time, in milliseconds, that talking was
					detected on the channel.</para>
				</parameter>
			</syntax>
			<see-also>
				<ref type="function">TALK_DETECT</ref>
				<ref type="managerEvent">ChannelTalkingStart</ref>
			</see-also>
		</managerEventInstance>
	</managerEvent>
<module language="en_US" name="stasis_endpoints">
	<support_level>core</support_level>
</module>
	<managerEvent language="en_US" name="PeerStatus" module="builtin">
		<managerEventInstance class="EVENT_FLAG_SYSTEM" module="builtin">
			<since>
				<version>12.0.0</version>
			</since>
			<synopsis>Raised when the state of a peer changes.</synopsis>
			<syntax>
				<parameter name="ChannelType">
					<para>The channel technology of the peer.</para>
				</parameter>
				<parameter name="Peer">
					<para>The name of the peer (including channel technology).</para>
				</parameter>
				<parameter name="PeerStatus">
					<para>New status of the peer.</para>
					<enumlist>
						<enum name="Unknown"/>
						<enum name="Registered"/>
						<enum name="Unregistered"/>
						<enum name="Rejected"/>
						<enum name="Lagged"/>
					</enumlist>
				</parameter>
				<parameter name="Cause">
					<para>The reason the status has changed.</para>
				</parameter>
				<parameter name="Address">
					<para>New address of the peer.</para>
				</parameter>
				<parameter name="Port">
					<para>New port for the peer.</para>
				</parameter>
				<parameter name="Time">
					<para>Time it takes to reach the peer and receive a response.</para>
				</parameter>
			</syntax>
		</managerEventInstance>
	</managerEvent>
	<managerEvent language="en_US" name="ContactStatus" module="builtin">
		<managerEventInstance class="EVENT_FLAG_SYSTEM" module="builtin">
			<since>
				<version>13.5.0</version>
			</since>
			<synopsis>Raised when the state of a contact changes.</synopsis>
			<syntax>
				<parameter name="URI">
					<para>This contact's URI.</para>
				</parameter>
				<parameter name="ContactStatus">
					<para>New status of the contact.</para>
					<enumlist>
						<enum name="Unknown"/>
						<enum name="Unreachable"/>
						<enum name="Reachable"/>
						<enum name="Unqualified"/>
						<enum name="Removed"/>
						<enum name="Updated"/>
					</enumlist>
				</parameter>
				<parameter name="AOR">
					<para>The name of the associated aor.</para>
				</parameter>
				<parameter name="EndpointName">
					<para>The name of the associated endpoint.</para>
				</parameter>
				<parameter name="RoundtripUsec">
					<para>The RTT measured during the last qualify.</para>
				</parameter>
			</syntax>
		</managerEventInstance>
	</managerEvent>
<module language="en_US" name="stasis_message">
	<support_level>core</support_level>
</module>
<module language="en_US" name="stasis_message_router">
	<support_level>core</support_level>
</module>
<module language="en_US" name="stasis_state">
	<support_level>core</support_level>
</module>
<module language="en_US" name="stasis_system">
	<support_level>core</support_level>
</module>
	<managerEvent language="en_US" name="Registry" module="builtin">
		<managerEventInstance class="EVENT_FLAG_SYSTEM" module="builtin">
			<since>
				<version>12.0.0</version>
			</since>
			<synopsis>Raised when an outbound registration completes.</synopsis>
			<syntax>
				<parameter name="ChannelType">
					<para>The type of channel that was registered (or not).</para>
				</parameter>
				<parameter name="Username">
					<para>The username portion of the registration.</para>
				</parameter>
				<parameter name="Domain">
					<para>The address portion of the registration.</para>
				</parameter>
				<parameter name="Status">
					<para>The status of the registration request.</para>
					<enumlist>
						<enum name="Registered"/>
						<enum name="Unregistered"/>
						<enum name="Rejected"/>
						<enum name="Failed"/>
					</enumlist>
				</parameter>
				<parameter name="Cause">
					<para>What caused the rejection of the request, if available.</para>
				</parameter>
			</syntax>
		</managerEventInstance>
	</managerEvent>
<module language="en_US" name="localtime">
	<support_level>core</support_level>
</module>
<module language="en_US" name="strcompat">
	<support_level>core</support_level>
</module>
<module language="en_US" name="stream">
	<support_level>core</support_level>
</module>
<module language="en_US" name="strings">
	<support_level>core</support_level>
</module>
<module language="en_US" name="stun">
	<support_level>core</support_level>
</module>
<module language="en_US" name="syslog">
	<support_level>core</support_level>
</module>
<module language="en_US" name="taskprocessor">
	<support_level>core</support_level>
</module>
<module language="en_US" name="tdd">
	<support_level>core</support_level>
</module>
<module language="en_US" name="term">
	<support_level>core</support_level>
</module>
<module language="en_US" name="test">
	<support_level>core</support_level>
</module>
<module language="en_US" name="threadstorage">
	<support_level>core</support_level>
</module>
<module language="en_US" name="time">
	<support_level>core</support_level>
</module>
<module language="en_US" name="timing">
	<support_level>core</support_level>
</module>
<module language="en_US" name="translate">
	<support_level>core</support_level>
</module>
<module language="en_US" name="udptl">
	<support_level>core</support_level>
</module>
	<configInfo name="udptl" language="en_US">
		<configFile name="udptl.conf">
			<configObject name="global">
				<since>
					<version>12.0.0</version>
				</since>
				<synopsis>Global options for configuring UDPTL</synopsis>
				<configOption name="udptlstart">
					<since>
						<version>11.0.0</version>
					</since>
					<synopsis>The start of the UDPTL port range</synopsis>
				</configOption>
				<configOption name="udptlend">
					<since>
						<version>11.0.0</version>
					</since>
					<synopsis>The end of the UDPTL port range</synopsis>
				</configOption>
				<configOption name="udptlchecksums">
					<since>
						<version>11.0.0</version>
					</since>
					<synopsis>Whether to enable or disable UDP checksums on UDPTL traffic</synopsis>
				</configOption>
				<configOption name="udptlfecentries">
					<since>
						<version>11.0.0</version>
					</since>
					<synopsis>The number of error correction entries in a UDPTL packet</synopsis>
				</configOption>
				<configOption name="udptlfecspan">
					<since>
						<version>11.0.0</version>
					</since>
					<synopsis>The span over which parity is calculated for FEC in a UDPTL packet</synopsis>
				</configOption>
				<configOption name="use_even_ports">
					<since>
						<version>11.0.0</version>
					</since>
					<synopsis>Whether to only use even-numbered UDPTL ports</synopsis>
				</configOption>
				<configOption name="t38faxudpec">
					<since>
						<version>11.0.0</version>
					</since>
					<synopsis>Removed</synopsis>
				</configOption>
				<configOption name="t38faxmaxdatagram">
					<since>
						<version>11.0.0</version>
					</since>
					<synopsis>Removed</synopsis>
				</configOption>
			</configObject>
		</configFile>
	</configInfo>
<module language="en_US" name="ulaw">
	<support_level>core</support_level>
</module>
<module language="en_US" name="utf8">
	 <support_level>core</support_level>
</module>
<module language="en_US" name="utils">
	<support_level>core</support_level>
</module>
<module language="en_US" name="xml">
	<support_level>core</support_level>
</module>
<module language="en_US" name="xmldoc">
	<support_level>core</support_level>
</module>
	<function name="LOG_GROUP" language="en_US" module="builtin">
		<since>
			<version>18.21.0</version>
			<version>20.6.0</version>
			<version>21.1.0</version>
		</since>
		<synopsis>
			Set the channel group name for log filtering on this channel
		</synopsis>
		<syntax>
			<parameter name="group" required="false">
				<para>Channel log group name. Leave empty to remove any existing group membership.</para>
				<para>You can use any arbitrary alphanumeric name that can then be used by the
				"logger filter changroup" CLI command to filter dialplan output by group name.</para>
			</parameter>
		</syntax>
		<description>
			<para>Assign a channel to a group for log filtering.</para>
			<para>Because this application can result in dialplan execution logs
			being suppressed (or unsuppressed) from the CLI if filtering is active,
			it is recommended to call this as soon as possible when dialplan execution begins.</para>
			<para>Calling this multiple times will replace any previous group assignment.</para>
			<example title="Associate channel with group test">
			exten => s,1,Set(LOG_GROUP()=test)
				same => n,NoOp() ; if a logging call ID group filter name is enabled but test is not included, you will not see this
			</example>
			<example title="Associate channel with group important">
			exten => s,1,Set(LOG_GROUP()=important)
				same => n,Set(foo=bar) ; do some important things to show on the CLI (assuming it is filtered with important enabled)
				same => n,Set(LOG_GROUP()=) ; remove from group important to stop showing execution on the CLI
				same => n,Wait(5) ; do some unimportant stuff
			</example>
		</description>
		<see-also>
			<ref type="application">Log</ref>
		</see-also>
	</function>
	<managerEvent language="en_US" name="LogChannel" module="builtin">
		<managerEventInstance class="EVENT_FLAG_SYSTEM" module="builtin">
			<since>
				<version>16.24.0</version>
				<version>18.10.0</version>
				<version>19.2.0</version>
			</since>
			<synopsis>Raised when a logging channel is re-enabled after a reload operation.</synopsis>
			<syntax>
				<parameter name="Channel">
					<para>The name of the logging channel.</para>
				</parameter>
			</syntax>
		</managerEventInstance>
		<managerEventInstance class="EVENT_FLAG_SYSTEM" module="builtin">
			<since>
				<version>16.24.0</version>
				<version>18.10.0</version>
				<version>19.2.0</version>
			</since>
			<synopsis>Raised when a logging channel is disabled.</synopsis>
			<syntax>
				<parameter name="Channel">
					<para>The name of the logging channel.</para>
				</parameter>
			</syntax>
		</managerEventInstance>
	</managerEvent>
	<manager name="Ping" language="en_US" module="builtin">
		<since>
			<version>0.2.0</version>
		</since>
		<synopsis>
			Keepalive command.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
		</syntax>
		<description>
			<para>A 'Ping' action will elicit a 'Pong' response. Used to keep the
			manager connection open.</para>
		</description>
	</manager>
	<manager name="Events" language="en_US" module="builtin">
		<since>
			<version>0.9.0</version>
		</since>
		<synopsis>
			Control Event Flow.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="EventMask" required="true">
				<enumlist>
					<enum name="on">
						<para>If all events should be sent.</para>
					</enum>
					<enum name="off">
						<para>If no events should be sent.</para>
					</enum>
					<enum name="system,call,log,...">
						<para>To select which flags events should have to be sent.</para>
					</enum>
				</enumlist>
			</parameter>
		</syntax>
		<description>
			<para>Enable/Disable sending of events to this manager client.</para>
		</description>
	</manager>
	<manager name="Logoff" language="en_US" module="builtin">
		<since>
			<version>0.2.0</version>
		</since>
		<synopsis>
			Logoff Manager.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
		</syntax>
		<description>
			<para>Logoff the current manager session.</para>
		</description>
		<see-also>
			<ref type="manager">Login</ref>
		</see-also>
	</manager>
	<manager name="Login" language="en_US" module="builtin">
		<since>
			<version>0.2.0</version>
		</since>
		<synopsis>
			Login Manager.
		</synopsis>
		<syntax>
			<parameter name="ActionID">
				<para>ActionID for this transaction. Will be returned.</para>
			</parameter>
			<parameter name="Username" required="true">
				<para>Username to login with as specified in manager.conf.</para>
			</parameter>
			<parameter name="AuthType">
				<para>Authorization type. Valid values are:</para>
				<enumlist>
					<enum name="plain"><para>Plain text secret. (default)</para></enum>
					<enum name="MD5"><para>MD5 hashed secret.</para></enum>
				</enumlist>
			</parameter>
			<parameter name="Secret">
				<para>Plain text secret to login with as specified in manager.conf.</para>
			</parameter>
			<parameter name="Key">
				<para>Key to use with MD5 authentication.  To create the key, you must
				initialize a new MD5 hash, call the <literal>Challenge</literal> AMI action,
				update the hash with the response, then update the hash with the secret as specified
				in manager.conf.  The key value must be the final result of the hash
				as a 32 character lower-case hex string without any "0x" prepended.
				See the description for an example of creating a key in Python.</para>
			</parameter>
			<parameter name="Events">
				<xi:include xpointer="xpointer(/docs/manager[@name='Events']/syntax/parameter[@name='EventMask']/enumlist)" />
			</parameter>
		</syntax>
		<description>
			<para>Login Manager.</para>
			<example title="Create an MD5 Key in Python">
				import hashlib
				m = hashlib.md5()
				m.update(response_from_challenge)
				m.update(your_secret)
				key = m.hexdigest()
				## '031edd7d41651593c5fe5c006fa5752b'
			</example>
		</description>
		<see-also>
			<ref type="manager">Challenge</ref>
			<ref type="manager">Logoff</ref>
		</see-also>
	</manager>
	<manager name="Challenge" language="en_US" module="builtin">
		<since>
			<version>0.4.0</version>
		</since>
		<synopsis>
			Generate Challenge for MD5 Auth.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="AuthType" required="true">
				<para>Digest algorithm to use in the challenge. Valid values are:</para>
				<enumlist>
					<enum name="MD5" />
				</enumlist>
			</parameter>
		</syntax>
		<description>
			<para>Generate a challenge for MD5 authentication.</para>
		</description>
	</manager>
	<manager name="Hangup" language="en_US" module="builtin">
		<since>
			<version>0.2.0</version>
		</since>
		<synopsis>
			Hangup channel.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="Channel" required="true">
				<para>The exact channel name to be hungup, or to use a regular expression, set this parameter to: /regex/</para>
				<para>Example exact channel: SIP/provider-0000012a</para>
				<para>Example regular expression: /^SIP/provider-.*$/</para>
			</parameter>
			<parameter name="Cause">
				<para>Numeric hangup cause.</para>
			</parameter>
		</syntax>
		<description>
			<para>Hangup a channel.</para>
		</description>
	</manager>
	<manager name="Status" language="en_US" module="builtin">
		<since>
			<version>0.2.0</version>
		</since>
		<synopsis>
			List channel status.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="Channel" required="false">
				<para>The name of the channel to query for status.</para>
			</parameter>
			<parameter name="Variables">
				<para>Comma <literal>,</literal> separated list of variable to include.</para>
			</parameter>
			<parameter name="AllVariables">
				<para>If set to "true", the Status event will include all channel variables for
				the requested channel(s).</para>
				<enumlist>
					<enum name="true"/>
					<enum name="false"/>
				</enumlist>
			</parameter>
		</syntax>
		<description>
			<para>Will return the status information of each channel along with the
			value for the specified channel variables.</para>
		</description>
		<responses>
			<list-elements>
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='Status'])" />
			</list-elements>
			<xi:include xpointer="xpointer(/docs/managerEvent[@name='StatusComplete'])" />
		</responses>
	</manager>
	<managerEvent language="en_US" name="Status" module="builtin">
		<managerEventInstance class="EVENT_FLAG_CALL" module="builtin">
			<since>
				<version>18.26.0</version>
				<version>20.11.0</version>
				<version>21.6.0</version>
				<version>22.1.0</version>
			</since>
			<synopsis>Raised in response to a Status command.</synopsis>
			<syntax>
				<parameter name="ActionID" required="false"/>
				<channel_snapshot/>
				<parameter name="Type">
					<para>Type of channel</para>
				</parameter>
				<parameter name="DNID">
					<para>Dialed number identifier</para>
				</parameter>
				<parameter name="EffectiveConnectedLineNum">
				</parameter>
				<parameter name="EffectiveConnectedLineName">
				</parameter>
				<parameter name="TimeToHangup">
					<para>Absolute lifetime of the channel</para>
				</parameter>
				<parameter name="BridgeID">
					<para>Identifier of the bridge the channel is in, may be empty if not in one</para>
				</parameter>
				<parameter name="Application">
					<para>Application currently executing on the channel</para>
				</parameter>
				<parameter name="Data">
					<para>Data given to the currently executing channel</para>
				</parameter>
				<parameter name="Nativeformats">
					<para>Media formats the connected party is willing to send or receive</para>
				</parameter>
				<parameter name="Readformat">
					<para>Media formats that frames from the channel are received in</para>
				</parameter>
				<parameter name="Readtrans">
					<para>Translation path for media received in native formats</para>
				</parameter>
				<parameter name="Writeformat">
					<para>Media formats that frames to the channel are accepted in</para>
				</parameter>
				<parameter name="Writetrans">
					<para>Translation path for media sent to the connected party</para>
				</parameter>
				<parameter name="Callgroup">
					<para>Configured call group on the channel</para>
				</parameter>
				<parameter name="Pickupgroup">
					<para>Configured pickup group on the channel</para>
				</parameter>
				<parameter name="Seconds">
					<para>Number of seconds the channel has been active</para>
				</parameter>
			</syntax>
			<see-also>
				<ref type="manager">Status</ref>
			</see-also>
		</managerEventInstance>
	</managerEvent>
	<managerEvent language="en_US" name="StatusComplete" module="builtin">
		<managerEventInstance class="EVENT_FLAG_CALL" module="builtin">
			<since>
				<version>18.26.0</version>
				<version>20.11.0</version>
				<version>21.6.0</version>
				<version>22.1.0</version>
			</since>
			<synopsis>Raised in response to a Status command.</synopsis>
			<syntax>
				<parameter name="Items">
					<para>Number of Status events returned</para>
				</parameter>
			</syntax>
			<see-also>
				<ref type="manager">Status</ref>
			</see-also>
		</managerEventInstance>
	</managerEvent>
	<manager name="Setvar" language="en_US" module="builtin">
		<since>
			<version>1.0.0</version>
		</since>
		<synopsis>
			Sets a channel variable or function value.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="Channel">
				<para>Channel to set variable for.</para>
			</parameter>
			<parameter name="Variable" required="true">
				<para>Variable name, function or expression.</para>
			</parameter>
			<parameter name="Value" required="true">
				<para>Variable or function value.</para>
			</parameter>
		</syntax>
		<description>
			<para>This command can be used to set the value of channel variables or dialplan
			functions.</para>
			<note>
				<para>If a channel name is not provided then the variable is considered global.</para>
			</note>
		</description>
		<see-also>
			<ref type="manager">Getvar</ref>
		</see-also>
	</manager>
	<manager name="Getvar" language="en_US" module="builtin">
		<since>
			<version>1.0.0</version>
		</since>
		<synopsis>
			Gets a channel variable or function value.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="Channel">
				<para>Channel to read variable from.</para>
			</parameter>
			<parameter name="Variable" required="true">
				<para>Variable name, function or expression.</para>
			</parameter>
		</syntax>
		<description>
			<para>Get the value of a channel variable or function return.</para>
			<note>
				<para>If a channel name is not provided then the variable is considered global.</para>
			</note>
		</description>
		<see-also>
			<ref type="manager">Setvar</ref>
		</see-also>
	</manager>
	<manager name="GetConfig" language="en_US" module="builtin">
		<since>
			<version>1.4.0</version>
		</since>
		<synopsis>
			Retrieve configuration.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="Filename" required="true">
				<para>Configuration filename (e.g. <filename>foo.conf</filename>).</para>
			</parameter>
			<parameter name="Category">
				<para>Category in configuration file.</para>
			</parameter>
			<parameter name="Filter">
				<para>A comma separated list of
				<replaceable>name_regex</replaceable>=<replaceable>value_regex</replaceable>
				expressions which will cause only categories whose variables match all expressions
				to be considered.  The special variable name <literal>TEMPLATES</literal>
				can be used to control whether templates are included.  Passing
				<literal>include</literal> as the value will include templates
				along with normal categories. Passing
				<literal>restrict</literal> as the value will restrict the operation to
				ONLY templates.  Not specifying a <literal>TEMPLATES</literal> expression
				results in the default behavior which is to not include templates.</para>
			</parameter>
		</syntax>
		<description>
			<para>This action will dump the contents of a configuration
			file by category and contents or optionally by specified category only.
			In the case where a category name is non-unique, a filter may be specified
			to match only categories with matching variable values.</para>
		</description>
		<see-also>
			<ref type="manager">GetConfigJSON</ref>
			<ref type="manager">UpdateConfig</ref>
			<ref type="manager">CreateConfig</ref>
			<ref type="manager">ListCategories</ref>
		</see-also>
	</manager>
	<manager name="GetConfigJSON" language="en_US" module="builtin">
		<since>
			<version>1.6.0</version>
		</since>
		<synopsis>
			Retrieve configuration (JSON format).
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="Filename" required="true">
				<para>Configuration filename (e.g. <filename>foo.conf</filename>).</para>
			</parameter>
			<parameter name="Category">
				<para>Category in configuration file.</para>
			</parameter>
			<parameter name="Filter">
				<xi:include xpointer="xpointer(/docs/manager[@name='GetConfig']/syntax/parameter[@name='Filter']/para[1])" />
			</parameter>
		</syntax>
		<description>
			<para>This action will dump the contents of a configuration file by category
			and contents in JSON format or optionally by specified category only.
			This only makes sense to be used using rawman over the HTTP interface.
			In the case where a category name is non-unique, a filter may be specified
			to match only categories with matching variable values.</para>
		</description>
		<see-also>
			<ref type="manager">GetConfig</ref>
			<ref type="manager">UpdateConfig</ref>
			<ref type="manager">CreateConfig</ref>
			<ref type="manager">ListCategories</ref>
		</see-also>
	</manager>
	<manager name="UpdateConfig" language="en_US" module="builtin">
		<since>
			<version>1.4.0</version>
		</since>
		<synopsis>
			Update basic configuration.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="SrcFilename" required="true">
				<para>Configuration filename to read (e.g. <filename>foo.conf</filename>).</para>
			</parameter>
			<parameter name="DstFilename" required="true">
				<para>Configuration filename to write (e.g. <filename>foo.conf</filename>)</para>
			</parameter>
			<parameter name="Reload">
				<para>Whether or not a reload should take place (or name of specific module).</para>
			</parameter>
			<parameter name="PreserveEffectiveContext">
				<para>Whether the effective category contents should be preserved on template change. Default is true (pre 13.2 behavior).</para>
			</parameter>
			<parameter name="Action-000000">
				<para>Action to take.</para>
				<para>0's represent 6 digit number beginning with 000000.</para>
				<enumlist>
					<enum name="NewCat" />
					<enum name="RenameCat" />
					<enum name="DelCat" />
					<enum name="EmptyCat" />
					<enum name="Update" />
					<enum name="Delete" />
					<enum name="Append" />
					<enum name="Insert" />
				</enumlist>
			</parameter>
			<parameter name="Cat-000000">
				<para>Category to operate on.</para>
				<xi:include xpointer="xpointer(/docs/manager[@name='UpdateConfig']/syntax/parameter[@name='Action-000000']/para[2])" />
			</parameter>
			<parameter name="Var-000000">
				<para>Variable to work on.</para>
				<xi:include xpointer="xpointer(/docs/manager[@name='UpdateConfig']/syntax/parameter[@name='Action-000000']/para[2])" />
			</parameter>
			<parameter name="Value-000000">
				<para>Value to work on.</para>
				<xi:include xpointer="xpointer(/docs/manager[@name='UpdateConfig']/syntax/parameter[@name='Action-000000']/para[2])" />
			</parameter>
			<parameter name="Match-000000">
				<para>Extra match required to match line.</para>
				<xi:include xpointer="xpointer(/docs/manager[@name='UpdateConfig']/syntax/parameter[@name='Action-000000']/para[2])" />
			</parameter>
			<parameter name="Line-000000">
				<para>Line in category to operate on (used with delete and insert actions).</para>
				<xi:include xpointer="xpointer(/docs/manager[@name='UpdateConfig']/syntax/parameter[@name='Action-000000']/para[2])" />
			</parameter>
			<parameter name="Options-000000">
				<para>A comma separated list of action-specific options.</para>
					<enumlist>
						<enum name="NewCat"><para>One or more of the following... </para>
							<enumlist>
								<enum name="allowdups"><para>Allow duplicate category names.</para></enum>
								<enum name="template"><para>This category is a template.</para></enum>
								<enum name="inherit=&quot;template[,...]&quot;"><para>Templates from which to inherit.</para></enum>
							</enumlist>
						</enum>
					</enumlist>
					<para> </para>
						<para>The following actions share the same options...</para>
					<enumlist>
						<enum name="RenameCat"/>
						<enum name="DelCat"/>
						<enum name="EmptyCat"/>
						<enum name="Update"/>
						<enum name="Delete"/>
						<enum name="Append"/>
						<enum name="Insert"><para> </para>
							<enumlist>
								<enum name="catfilter=&quot;&lt;expression&gt;[,...]&quot;"><para> </para>
									<xi:include xpointer="xpointer(/docs/manager[@name='GetConfig']/syntax/parameter[@name='Filter']/para[1])" />
									<para><literal>catfilter</literal> is most useful when a file
									contains multiple categories with the same name and you wish to
									operate on specific ones instead of all of them.</para>
								</enum>
							</enumlist>
						</enum>
					</enumlist>
				<xi:include xpointer="xpointer(/docs/manager[@name='UpdateConfig']/syntax/parameter[@name='Action-000000']/para[2])" />
			</parameter>
		</syntax>
		<description>
			<para>This action will modify, create, or delete configuration elements
			in Asterisk configuration files.</para>
		</description>
		<see-also>
			<ref type="manager">GetConfig</ref>
			<ref type="manager">GetConfigJSON</ref>
			<ref type="manager">CreateConfig</ref>
			<ref type="manager">ListCategories</ref>
		</see-also>
	</manager>
	<manager name="CreateConfig" language="en_US" module="builtin">
		<since>
			<version>1.6.0</version>
		</since>
		<synopsis>
			Creates an empty file in the configuration directory.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="Filename" required="true">
				<para>The configuration filename to create (e.g. <filename>foo.conf</filename>).</para>
			</parameter>
		</syntax>
		<description>
			<para>This action will create an empty file in the configuration
			directory. This action is intended to be used before an UpdateConfig
			action.</para>
		</description>
		<see-also>
			<ref type="manager">GetConfig</ref>
			<ref type="manager">GetConfigJSON</ref>
			<ref type="manager">UpdateConfig</ref>
			<ref type="manager">ListCategories</ref>
		</see-also>
	</manager>
	<manager name="ListCategories" language="en_US" module="builtin">
		<since>
			<version>1.6.0</version>
		</since>
		<synopsis>
			List categories in configuration file.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="Filename" required="true">
				<para>Configuration filename (e.g. <filename>foo.conf</filename>).</para>
			</parameter>
		</syntax>
		<description>
			<para>This action will dump the categories in a given file.</para>
		</description>
		<see-also>
			<ref type="manager">GetConfig</ref>
			<ref type="manager">GetConfigJSON</ref>
			<ref type="manager">UpdateConfig</ref>
			<ref type="manager">CreateConfig</ref>
		</see-also>
	</manager>
	<manager name="Redirect" language="en_US" module="builtin">
		<since>
			<version>0.2.0</version>
		</since>
		<synopsis>
			Redirect (transfer) a call.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="Channel" required="true">
				<para>Channel to redirect.</para>
			</parameter>
			<parameter name="ExtraChannel">
				<para>Second call leg to transfer (optional).</para>
			</parameter>
			<parameter name="Exten" required="true">
				<para>Extension to transfer to.</para>
			</parameter>
			<parameter name="ExtraExten">
				<para>Extension to transfer extrachannel to (optional).</para>
			</parameter>
			<parameter name="Context" required="true">
				<para>Context to transfer to.</para>
			</parameter>
			<parameter name="ExtraContext">
				<para>Context to transfer extrachannel to (optional).</para>
			</parameter>
			<parameter name="Priority" required="true">
				<para>Priority to transfer to.</para>
			</parameter>
			<parameter name="ExtraPriority">
				<para>Priority to transfer extrachannel to (optional).</para>
			</parameter>
		</syntax>
		<description>
			<para>Redirect (transfer) a call.</para>
		</description>
		<see-also>
			<ref type="manager">BlindTransfer</ref>
		</see-also>
	</manager>
	<manager name="Atxfer" language="en_US" module="builtin">
		<since>
			<version>1.6.1.0</version>
		</since>
		<synopsis>
			Attended transfer.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="Channel" required="true">
				<para>Transferer's channel.</para>
			</parameter>
			<parameter name="Exten" required="true">
				<para>Extension to transfer to.</para>
			</parameter>
			<parameter name="Context">
				<para>Context to transfer to.</para>
			</parameter>
		</syntax>
		<description>
			<para>Attended transfer.</para>
		</description>
		<see-also>
			<ref type="managerEvent">AttendedTransfer</ref>
		</see-also>
	</manager>
	<manager name="CancelAtxfer" language="en_US" module="builtin">
		<since>
			<version>15.1.0</version>
			<version>14.7.0</version>
			<version>13.18.0</version>
		</since>
		<synopsis>
			Cancel an attended transfer.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="Channel" required="true">
				<para>The transferer channel.</para>
			</parameter>
		</syntax>
		<description>
			<para>Cancel an attended transfer. Note, this uses the configured cancel attended transfer
			feature option (atxferabort) to cancel the transfer. If not available this action will fail.
			</para>
		</description>
		<see-also>
			<ref type="managerEvent">AttendedTransfer</ref>
		</see-also>
	</manager>
	<manager name="Originate" language="en_US" module="builtin">
		<since>
			<version>0.2.0</version>
		</since>
		<synopsis>
			Originate a call.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="Channel" required="true">
				<para>Channel name to call.</para>
			</parameter>
			<parameter name="Exten">
				<para>Extension to use (requires <literal>Context</literal> and
				<literal>Priority</literal>)</para>
			</parameter>
			<parameter name="Context">
				<para>Context to use (requires <literal>Exten</literal> and
				<literal>Priority</literal>)</para>
			</parameter>
			<parameter name="Priority">
				<para>Priority to use (requires <literal>Exten</literal> and
				<literal>Context</literal>)</para>
			</parameter>
			<parameter name="Application">
				<para>Application to execute.</para>
			</parameter>
			<parameter name="Data">
				<para>Data to use (requires <literal>Application</literal>).</para>
			</parameter>
			<parameter name="Timeout" default="30000">
				<para>How long to wait for call to be answered (in ms.).</para>
			</parameter>
			<parameter name="CallerID">
				<para>Caller ID to be set on the outgoing channel.</para>
			</parameter>
			<parameter name="Variable">
				<para>Channel variable to set, multiple Variable: headers are allowed.</para>
			</parameter>
			<parameter name="Account">
				<para>Account code.</para>
			</parameter>
			<parameter name="EarlyMedia">
				<para>Set to <literal>true</literal> to force call bridge on early media..</para>
			</parameter>
			<parameter name="Async">
				<para>Set to <literal>true</literal> for fast origination.</para>
			</parameter>
			<parameter name="Codecs">
				<para>Comma-separated list of codecs to use for this call.</para>
			</parameter>
			<parameter name="ChannelId">
				<para>Channel UniqueId to be set on the channel.</para>
			</parameter>
			<parameter name="OtherChannelId">
				<para>Channel UniqueId to be set on the second local channel.</para>
			</parameter>
			<parameter name="PreDialGoSub">
				<para>PreDialGoSub Context,Extension,Priority to set options/headers needed before start the outgoing extension</para>
			</parameter>
		</syntax>
		<description>
			<para>Generates an outgoing call to a
			<replaceable>Extension</replaceable>/<replaceable>Context</replaceable>/<replaceable>Priority</replaceable>
			or <replaceable>Application</replaceable>/<replaceable>Data</replaceable></para>
		</description>
		<see-also>
			<ref type="managerEvent">OriginateResponse</ref>
		</see-also>
	</manager>
	<managerEvent language="en_US" name="OriginateResponse" module="builtin">
		<managerEventInstance class="EVENT_FLAG_CALL" module="builtin">
			<since>
				<version>18.26.0</version>
				<version>20.11.0</version>
				<version>21.6.0</version>
				<version>22.1.0</version>
			</since>
			<synopsis>Raised in response to an Originate command.</synopsis>
			<syntax>
				<parameter name="ActionID" required="false"/>
				<parameter name="Response">
					<enumlist>
						<enum name="Failure"/>
						<enum name="Success"/>
					</enumlist>
				</parameter>
				<parameter name="Channel"/>
				<parameter name="Context"/>
				<parameter name="Exten"/>
				<parameter name="Application"/>
				<parameter name="Data"/>
				<parameter name="Reason"/>
				<parameter name="Uniqueid"/>
				<parameter name="CallerIDNum"/>
				<parameter name="CallerIDName"/>
			</syntax>
			<see-also>
				<ref type="manager">Originate</ref>
			</see-also>
		</managerEventInstance>
	</managerEvent>
	<manager name="Command" language="en_US" module="builtin">
		<since>
			<version>0.3.0</version>
		</since>
		<synopsis>
			Execute Asterisk CLI Command.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="Command" required="true">
				<para>Asterisk CLI command to run.</para>
			</parameter>
		</syntax>
		<description>
			<para>Run a CLI command.</para>
		</description>
	</manager>
	<manager name="ExtensionState" language="en_US" module="builtin">
		<since>
			<version>0.4.0</version>
		</since>
		<synopsis>
			Check Extension Status.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="Exten" required="true">
				<para>Extension to check state on.</para>
			</parameter>
			<parameter name="Context" required="true">
				<para>Context for extension.</para>
			</parameter>
		</syntax>
		<description>
			<para>Report the extension state for given extension. If the extension has a hint,
			will use devicestate to check the status of the device connected to the extension.</para>
			<para>Will return an <literal>Extension Status</literal> message. The response will include
			the hint for the extension and the status.</para>
		</description>
		<see-also>
			<ref type="managerEvent">ExtensionStatus</ref>
		</see-also>
	</manager>
	<manager name="PresenceState" language="en_US" module="builtin">
		<since>
			<version>11.0.0</version>
		</since>
		<synopsis>
			Check Presence State
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="Provider" required="true">
				<para>Presence Provider to check the state of</para>
			</parameter>
		</syntax>
		<description>
			<para>Report the presence state for the given presence provider.</para>
			<para>Will return a <literal>Presence State</literal> message. The response will include the
			presence state and, if set, a presence subtype and custom message.</para>
		</description>
		<see-also>
			<ref type="managerEvent">PresenceStatus</ref>
		</see-also>
	</manager>
	<manager name="AbsoluteTimeout" language="en_US" module="builtin">
		<since>
			<version>0.5.0</version>
		</since>
		<synopsis>
			Set absolute timeout.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="Channel" required="true">
				<para>Channel name to hangup.</para>
			</parameter>
			<parameter name="Timeout" required="true">
				<para>Maximum duration of the call (sec).</para>
			</parameter>
		</syntax>
		<description>
			<para>Hangup a channel after a certain time. Acknowledges set time with
			<literal>Timeout Set</literal> message.</para>
		</description>
	</manager>
	<manager name="MailboxStatus" language="en_US" module="builtin">
		<since>
			<version>0.4.0</version>
		</since>
		<synopsis>
			Check mailbox.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="Mailbox" required="true">
				<para>Full mailbox ID <replaceable>mailbox</replaceable>@<replaceable>vm-context</replaceable>.</para>
			</parameter>
		</syntax>
		<description>
			<para>Checks a voicemail account for status.</para>
			<para>Returns whether there are messages waiting.</para>
			<para>Message: Mailbox Status.</para>
			<para>Mailbox: <replaceable>mailboxid</replaceable>.</para>
			<para>Waiting: <literal>0</literal> if messages waiting, <literal>1</literal>
			if no messages waiting.</para>
		</description>
		<see-also>
			<ref type="manager">MailboxCount</ref>
		</see-also>
	</manager>
	<manager name="MailboxCount" language="en_US" module="builtin">
		<since>
			<version>0.5.0</version>
		</since>
		<synopsis>
			Check Mailbox Message Count.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="Mailbox" required="true">
				<para>Full mailbox ID <replaceable>mailbox</replaceable>@<replaceable>vm-context</replaceable>.</para>
			</parameter>
		</syntax>
		<description>
			<para>Checks a voicemail account for new messages.</para>
			<para>Returns number of urgent, new and old messages.</para>
			<para>Message: Mailbox Message Count</para>
			<para>Mailbox: <replaceable>mailboxid</replaceable></para>
			<para>UrgentMessages: <replaceable>count</replaceable></para>
			<para>NewMessages: <replaceable>count</replaceable></para>
			<para>OldMessages: <replaceable>count</replaceable></para>
		</description>
		<see-also>
			<ref type="manager">MailboxStatus</ref>
		</see-also>
	</manager>
	<manager name="ListCommands" language="en_US" module="builtin">
		<since>
			<version>1.0.0</version>
		</since>
		<synopsis>
			List available manager commands.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
		</syntax>
		<description>
			<para>Returns the action name and synopsis for every action that
			is available to the user.</para>
		</description>
	</manager>
	<manager name="SendText" language="en_US" module="builtin">
		<since>
			<version>1.6.0</version>
		</since>
		<synopsis>
			Sends a text message to channel. A content type	can be optionally specified. If not set
			it is set to an empty string allowing a custom handler to default it as it sees fit.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="Channel" required="true">
				<para>Channel to send message to.</para>
			</parameter>
			<parameter name="Message" required="true">
				<para>Message to send.</para>
			</parameter>
			<parameter name="Content-Type" required="false" default="">
				<para>The type of content in the message</para>
			</parameter>
		</syntax>
		<description>
			<para>Sends A Text Message to a channel while in a call.</para>
		</description>
		<see-also>
			<ref type="application">SendText</ref>
		</see-also>
	</manager>
	<manager name="UserEvent" language="en_US" module="builtin">
		<since>
			<version>1.4.0</version>
		</since>
		<synopsis>
			Send an arbitrary event.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="UserEvent" required="true">
				<para>Event string to send.</para>
			</parameter>
			<parameter name="Header1">
				<para>Content1.</para>
			</parameter>
			<parameter name="HeaderN">
				<para>ContentN.</para>
			</parameter>
		</syntax>
		<description>
			<para>Send an event to manager sessions.</para>
		</description>
		<see-also>
			<ref type="managerEvent">UserEvent</ref>
			<ref type="application">UserEvent</ref>
		</see-also>
	</manager>
	<manager name="WaitEvent" language="en_US" module="builtin">
		<since>
			<version>1.4.0</version>
		</since>
		<synopsis>
			Wait for an event to occur.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="Timeout" required="true">
				<para>Maximum time (in seconds) to wait for events, <literal>-1</literal> means forever.</para>
			</parameter>
		</syntax>
		<description>
			<para>This action will elicit a <literal>Success</literal> response. Whenever
			a manager event is queued. Once WaitEvent has been called on an HTTP manager
			session, events will be generated and queued.</para>
		</description>
	</manager>
	<manager name="CoreSettings" language="en_US" module="builtin">
		<since>
			<version>1.6.0</version>
		</since>
		<synopsis>
			Show PBX core settings (version etc).
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
		</syntax>
		<description>
			<para>Query for Core PBX settings.</para>
		</description>
	</manager>
	<manager name="CoreStatus" language="en_US" module="builtin">
		<since>
			<version>1.6.0</version>
		</since>
		<synopsis>
			Show PBX core status variables.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
		</syntax>
		<description>
			<para>Query for Core PBX status.</para>
		</description>
	</manager>
	<manager name="Reload" language="en_US" module="builtin">
		<since>
			<version>1.6.0</version>
		</since>
		<synopsis>
			Send a reload event.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="Module">
				<para>Name of the module to reload.</para>
			</parameter>
		</syntax>
		<description>
			<para>Send a reload event.</para>
		</description>
		<see-also>
			<ref type="manager">ModuleLoad</ref>
		</see-also>
	</manager>
	<managerEvent language="en_US" name="CoreShowChannel" module="builtin">
		<managerEventInstance class="EVENT_FLAG_CALL" module="builtin">
			<since>
				<version>18.26.0</version>
				<version>20.11.0</version>
				<version>21.6.0</version>
				<version>22.1.0</version>
			</since>
			<synopsis>Raised in response to a CoreShowChannels command.</synopsis>
			<syntax>
				<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
				<channel_snapshot/>
				<parameter name="BridgeId">
					<para>Identifier of the bridge the channel is in, may be empty if not in one</para>
				</parameter>
				<parameter name="Application">
					<para>Application currently executing on the channel</para>
				</parameter>
				<parameter name="ApplicationData">
					<para>Data given to the currently executing application</para>
				</parameter>
				<parameter name="Duration">
					<para>The amount of time the channel has existed</para>
				</parameter>
			</syntax>
			<see-also>
				<ref type="manager">CoreShowChannels</ref>
				<ref type="managerEvent">CoreShowChannelsComplete</ref>
			</see-also>
		</managerEventInstance>
	</managerEvent>
	<managerEvent language="en_US" name="CoreShowChannelsComplete" module="builtin">
		<managerEventInstance class="EVENT_FLAG_CALL" module="builtin">
			<since>
				<version>18.26.0</version>
				<version>20.11.0</version>
				<version>21.6.0</version>
				<version>22.1.0</version>
			</since>
			<synopsis>Raised at the end of the CoreShowChannel list produced by the CoreShowChannels command.</synopsis>
			<syntax>
				<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
				<parameter name="EventList">
					<para>Conveys the status of the command response list</para>
				</parameter>
				<parameter name="ListItems">
					<para>The total number of list items produced</para>
				</parameter>
			</syntax>
			<see-also>
				<ref type="manager">CoreShowChannels</ref>
				<ref type="managerEvent">CoreShowChannel</ref>
			</see-also>
		</managerEventInstance>
	</managerEvent>
	<manager name="CoreShowChannels" language="en_US" module="builtin">
		<since>
			<version>1.6.0</version>
		</since>
		<synopsis>
			List currently active channels.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
		</syntax>
		<description>
			<para>List currently defined channels and some information about them.</para>
		</description>
		<responses>
			<list-elements>
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='CoreShowChannel'])" />
			</list-elements>
			<xi:include xpointer="xpointer(/docs/managerEvent[@name='CoreShowChannelsComplete'])" />
		</responses>
	</manager>
	<managerEvent language="en_US" name="CoreShowChannelMapComplete" module="builtin">
		<managerEventInstance class="EVENT_FLAG_CALL" module="builtin">
			<since>
				<version>18.26.0</version>
				<version>20.11.0</version>
				<version>21.6.0</version>
				<version>22.1.0</version>
			</since>
			<synopsis>Raised at the end of the CoreShowChannelMap list produced by the CoreShowChannelMap command.</synopsis>
			<syntax>
				<parameter name="EventList">
					<para>Conveys the status of the command response list</para>
				</parameter>
				<parameter name="ListItems">
					<para>The total number of list items produced</para>
				</parameter>
			</syntax>
		</managerEventInstance>
	</managerEvent>
	<manager name="CoreShowChannelMap" language="en_US" module="builtin">
		<since>
			<version>20.4.0</version>
			<version>18.19.0</version>
		</since>
		<synopsis>
			List all channels connected to the specified channel.
		</synopsis>
		<syntax>
			<parameter name="Channel">
				<para>The channel to get the mapping for. Requires a channel name.</para>
			</parameter>
		</syntax>
		<description>
			<para>List all channels currently connected to the specified channel. This can be any channel, including
			Local channels, and Local channels will be followed through to their other half.</para>
		</description>
	</manager>
	<manager name="LoggerRotate" language="en_US" module="builtin">
		<since>
			<version>13.0.0</version>
		</since>
		<synopsis>
			Reload and rotate the Asterisk logger.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
		</syntax>
		<description>
			<para>Reload and rotate the logger. Analogous to the CLI command 'logger rotate'.</para>
		</description>
	</manager>
	<manager name="ModuleLoad" language="en_US" module="builtin">
		<since>
			<version>1.6.0</version>
		</since>
		<synopsis>
			Module management.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="Module">
				<para>Asterisk module name (including .so extension) or subsystem identifier:</para>
				<enumlist>
					<enum name="cdr" />
					<enum name="dnsmgr" />
					<enum name="extconfig" />
					<enum name="enum" />
					<enum name="acl" />
					<enum name="manager" />
					<enum name="http" />
					<enum name="logger" />
					<enum name="features" />
					<enum name="dsp" />
					<enum name="udptl" />
					<enum name="indications" />
					<enum name="cel" />
					<enum name="plc" />
				</enumlist>
			</parameter>
			<parameter name="LoadType" required="true">
				<para>The operation to be done on module. Subsystem identifiers may only
				be reloaded.</para>
				<enumlist>
					<enum name="load" />
					<enum name="unload" />
					<enum name="reload" />
					<enum name="refresh">
						<para>Completely unload and load again a specified module.</para>
					</enum>
				</enumlist>
				<para>If no module is specified for a <literal>reload</literal> loadtype,
				all modules are reloaded.</para>
			</parameter>
			<parameter name="Recursive" required="false">
				<para>For <literal>refresh</literal> operations, attempt to recursively
				unload any other modules that are dependent on this module, if that would
				allow it to successfully unload, and load them again afterwards.</para>
			</parameter>
		</syntax>
		<description>
			<para>Loads, unloads or reloads an Asterisk module in a running system.</para>
		</description>
		<see-also>
			<ref type="manager">Reload</ref>
			<ref type="manager">ModuleCheck</ref>
		</see-also>
	</manager>
	<manager name="ModuleCheck" language="en_US" module="builtin">
		<since>
			<version>1.6.0</version>
		</since>
		<synopsis>
			Check if module is loaded.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="Module" required="true">
				<para>Asterisk module name (not including extension).</para>
			</parameter>
		</syntax>
		<description>
			<para>Checks if Asterisk module is loaded. Will return Success/Failure.
			An empty Version header is also returned (which doesn't contain
			the module revision number).</para>
		</description>
		<see-also>
			<ref type="manager">ModuleLoad</ref>
		</see-also>
	</manager>
	<manager name="AOCMessage" language="en_US" module="builtin">
		<since>
			<version>1.8.0</version>
		</since>
		<synopsis>
			Generate an Advice of Charge message on a channel.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="Channel">
				<para>Channel name to generate the AOC message on.
				This value is required unless ChannelPrefix is given.</para>
			</parameter>
			<parameter name="ChannelPrefix">
				<para>Partial channel prefix.  By using this option one can match the beginning part
				of a channel name without having to put the entire name in.  For example
				if a channel name is SIP/snom-00000001 and this value is set to SIP/snom, then
				that channel matches and the message will be sent.  Note however that only
				the first matched channel has the message sent on it. </para>
			</parameter>
			<parameter name="MsgType" required="true">
				<para>Defines what type of AOC message to create, AOC-S, AOC-D or AOC-E</para>
				<enumlist>
					<enum name="S" />
					<enum name="D" />
					<enum name="E" />
				</enumlist>
			</parameter>
			<parameter name="ChargeType">
				<para>Defines what kind of charge this message represents for AOC-D and AOC-E.</para>
				<enumlist>
					<enum name="NA" />
					<enum name="FREE" />
					<enum name="Currency" />
					<enum name="Unit" />
				</enumlist>
			</parameter>
			<parameter name="UnitAmount(0)">
				<para>This represents the amount of units charged. The ETSI AOC standard specifies that
				this value along with the optional UnitType value are entries in a list.  To accommodate this
				these values take an index value starting at 0 which can be used to generate this list of
				unit entries.  For example, If two unit entries were required this could be achieved by setting the
				parameter UnitAmount(0)=1234 and UnitAmount(1)=5678.  Note that UnitAmount at index 0 is
				required when ChargeType=Unit, all other entries in the list are optional.
				</para>
			</parameter>
			<parameter name="UnitType(0)">
				<para>Defines the type of unit.  ETSI AOC standard specifies this as an integer
				value between 1 and 16, but this value is left open to accept any positive
				integer.  Like the UnitAmount parameter, this value represents a list entry
				and has an index parameter that starts at 0.
				</para>
			</parameter>
			<parameter name="CurrencyName">
				<para>Specifies the currency's name.  Note that this value is truncated after 10 characters.</para>
			</parameter>
			<parameter name="CurrencyAmount">
				<para>Specifies the charge unit amount as a positive integer.
				This value is required when ChargeType==Currency (AOC-D or AOC-E) or
				RateType==Duration/Flat/Volume (AOC-S).</para>
			</parameter>
			<parameter name="CurrencyMultiplier">
				<para>Specifies the currency multiplier.
				This value is required when CurrencyAmount is given.</para>
				<enumlist>
					<enum name="OneThousandth" />
					<enum name="OneHundredth" />
					<enum name="OneTenth" />
					<enum name="One" />
					<enum name="Ten" />
					<enum name="Hundred" />
					<enum name="Thousand" />
				</enumlist>
			</parameter>
			<parameter name="TotalType" default="Total">
				<para>Defines what kind of AOC-D total is represented.</para>
				<enumlist>
					<enum name="Total" />
					<enum name="SubTotal" />
				</enumlist>
			</parameter>
			<parameter name="AOCBillingId">
				<para>Represents a billing ID associated with an AOC-D or AOC-E message. Note
				that only the first 3 items of the enum are valid AOC-D billing IDs</para>
				<enumlist>
					<enum name="Normal" />
					<enum name="ReverseCharge" />
					<enum name="CreditCard" />
					<enum name="CallFwdUnconditional" />
					<enum name="CallFwdBusy" />
					<enum name="CallFwdNoReply" />
					<enum name="CallDeflection" />
					<enum name="CallTransfer" />
				</enumlist>
			</parameter>
			<parameter name="ChargingAssociationId">
				<para>Charging association identifier.  This is optional for AOC-E and can be
				set to any value between -32768 and 32767</para>
			</parameter>
			<parameter name="ChargingAssociationNumber">
				<para>Represents the charging association party number.  This value is optional
				for AOC-E.</para>
			</parameter>
			<parameter name="ChargingAssociationPlan">
				<para>Integer representing the charging plan associated with the ChargingAssociationNumber.
				The value is bits 7 through 1 of the Q.931 octet containing the type-of-number and
				numbering-plan-identification fields.</para>
			</parameter>
			<parameter name="ChargedItem">
				<para>Defines what part of the call is charged in AOC-S. Usually this is set to
				BasicCommunication, which refers to the time after the call is answered, but establishment
				(CallAttempt) or successful establishment (CallSetup) of a call can also be used.
				Other options are available, but these generally do not carry enough information to actually
				calculate the price of a call.
				It is possible to have multiple ChargedItem entries for a single call -- for example to
				charge for both the establishment of the call and the actual call. In this case, each
				ChargedItem is described by a ChargedItem: header and all other headers that follow it up to
				the next ChargedItem: header.</para>
				<enumlist>
					<enum name="NA" />
					<enum name="SpecialArrangement" />
					<enum name="BasicCommunication" />
					<enum name="CallAttempt" />
					<enum name="CallSetup" />
					<enum name="UserUserInfo" />
					<enum name="SupplementaryService" />
				</enumlist>
			</parameter>
			<parameter name="RateType">
				<para>Defines how an AOC-S ChargedItem is charged.
				The Duration option is only available when ChargedItem==BasicCommunication.</para>
				<enumlist>
					<enum name="NA" />
					<enum name="Free" />
					<enum name="FreeFromBeginning" />
					<enum name="Duration" />
					<enum name="Flat" />
					<enum name="Volume" />
					<enum name="SpecialCode" />
				</enumlist>
			</parameter>
			<parameter name="Time">
				<para>Specifies a positive integer which is the amount of time is paid for by one
				CurrencyAmount.
				This value is required when RateType==Duration.</para>
			</parameter>
			<parameter name="TimeScale">
				<para>Specifies the time multiplier.
				This value is required when Time is given.</para>
				<enumlist>
					<enum name="OneHundredthSecond" />
					<enum name="OneTenthSecond" />
					<enum name="Second" />
					<enum name="TenSeconds" />
					<enum name="Minute" />
					<enum name="Hour" />
					<enum name="Day" />
				</enumlist>
			</parameter>
			<parameter name="Granularity">
				<para>Specifies a positive integer which is the size of the charged time increments.
				This value is optional when RateType==Duration and ChargingType==StepFunction.</para>
			</parameter>
			<parameter name="GranularityTimeScale">
				<para>Specifies the granularity time multiplier.
				This value is required when Granularity is given.</para>
				<enumlist>
					<enum name="OneHundredthSecond" />
					<enum name="OneTenthSecond" />
					<enum name="Second" />
					<enum name="TenSeconds" />
					<enum name="Minute" />
					<enum name="Hour" />
					<enum name="Day" />
				</enumlist>
			</parameter>
			<parameter name="ChargingType">
				<para>Specifies whether the charge increases continuously with time or in increments of
				Time or, if provided, Granularity.
				This value is required when RateType==Duration.</para>
				<enumlist>
					<enum name="ContinuousCharging" />
					<enum name="StepFunction" />
				</enumlist>
			</parameter>
			<parameter name="VolumeUnit">
				<para>Specifies the quantity of which one unit is paid for by one CurrencyAmount.
				This value is required when RateType==Volume.</para>
				<enumlist>
					<enum name="Octet" />
					<enum name="Segment" />
					<enum name="Message" />
				</enumlist>
			</parameter>
			<parameter name="Code">
				<para>Specifies the charging code, which can be set to a value between 1 and 10.
				This value is required when ChargedItem==SpecialArrangement or RateType==SpecialCode.</para>
			</parameter>
		</syntax>
		<description>
			<para>Generates an AOC-S, AOC-D or AOC-E message on a channel.</para>
		</description>
		<see-also>
			<ref type="managerEvent">AOC-S</ref>
			<ref type="managerEvent">AOC-D</ref>
			<ref type="managerEvent">AOC-E</ref>
		</see-also>
	</manager>
	<function name="AMI_CLIENT" language="en_US" module="builtin">
		<since>
			<version>11.0.0</version>
		</since>
		<synopsis>
			Checks attributes of manager accounts
		</synopsis>
		<syntax>
			<parameter name="loginname" required="true">
				<para>Login name, specified in manager.conf</para>
			</parameter>
			<parameter name="field" required="true">
				<para>The manager account attribute to return</para>
				<enumlist>
					<enum name="sessions"><para>The number of sessions for this AMI account</para></enum>
				</enumlist>
			</parameter>
		</syntax>
		<description>
			<para>
				Currently, the only supported  parameter is "sessions" which will return the current number of
				active sessions for this AMI account.
			</para>
		</description>
	</function>
	<manager name="Filter" language="en_US" module="builtin">
		<since>
			<version>10.0.0</version>
		</since>
		<synopsis>
			Dynamically add filters for the current manager session.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="Operation">
				<enumlist>
					<enum name="Add">
						<para>Add a filter.</para>
					</enum>
				</enumlist>
			</parameter>
			<parameter name="MatchCriteria">
				<para>
				Advanced match criteria.  If not specified, the <literal>Filter</literal>
				parameter is assumed to be a regular expression and will be matched against
				the entire event payload.
				</para>
				<para>
				Syntax: [name(&lt;event_name&gt;)][,header(&lt;header_name&gt;)][,&lt;match_method&gt;]
				</para>
				<para>
				One of each of the following may be specified separated by commas.
				</para>
				<para>
				</para>
				<enumlist>
					<enum name="action(include|exclude)">
						<para>
						Instead of prefixing the Filter with <literal>!</literal> to exclude matching events,
						specify <literal>action(exclude)</literal>.  Although the default is <literal>include</literal>
						if <literal>action</literal> isn't specified, adding <literal>action(include)</literal>
						will help with readability.
						</para>
						<para>
						</para>
					</enum>
					<enum name="name(&lt;event_name&gt;)">
						<para>
						Only events with name <replaceable>event_name</replaceable> will be included.
						</para>
						<para>
						</para>
					</enum>
					<enum name="header(&lt;header_name&gt;)">
						<para>
						Only events containing a header with a name of <replaceable>header_name</replaceable>
						will be included and the <literal>Filter</literal> parameter (if supplied) will only be
						matched against the value of the header.
						</para>
						<para>
						</para>
					</enum>
					<enum name="&lt;match_method&gt;">
						<para>Specifies how the <literal>Filter</literal> parameter
						is to be applied to the results of applying any 
						<literal>name(&lt;event_name&gt;)</literal> and/or
						<literal>header(&lt;header_name&gt;)</literal> parameters
						above.
						</para>
						<para>
						One of the following:
						</para>
						<enumlist>
							<enum name="regex">
								<para>The <literal>Filter</literal> parameter contains a regular expression
								which will be matched against the result. (default)
								</para>
								<para>
								</para>
							</enum>
							<enum name="exact">
								<para>The <literal>Filter</literal> parameter contains a string which must
								exactly match the entire result.
								</para>
								<para>
								</para>
							</enum>
							<enum name="startsWith">
								<para>The <literal>Filter</literal> parameter contains a string which must
								match the beginning of the result.
								</para>
								<para>
								</para>
							</enum>
							<enum name="endsWith">
								<para>The <literal>Filter</literal> parameter contains a string which must
								match the end of the result.
								</para>
								<para>
								</para>
							</enum>
							<enum name="contains">
								<para>The <literal>Filter</literal> parameter contains a string
								which will be searched for in the result.
								</para>
								<para>
								</para>
							</enum>
							<enum name="none">
								<para>The <literal>Filter</literal> parameter is ignored.
								</para>
							</enum>
						</enumlist>
					</enum>	
				</enumlist>
			</parameter>
			<parameter name="Filter">
				<para>The match expression to be applied to the event.</para>
				<para>See the manager.conf.sample file in the configs/samples
				directory of the Asterisk source tree for more information.</para>
			</parameter>
		</syntax>
		<description>
			<para>See the manager.conf.sample file in the configs/samples
			directory of the Asterisk source tree for a full description
			and examples.</para>
			<note>
			<para>
			The filters added are only used for the current session.
			Once the connection is closed the filters are removed.
			</para>
			</note>
			<note>
			<para>
			This command requires the system permission because
			this command can be used to create filters that may bypass
			filters defined in manager.conf
			</para>
			</note>
		</description>
	</manager>
	<manager name="BlindTransfer" language="en_US" module="builtin">
		<since>
			<version>12.0.0</version>
		</since>
		<synopsis>
			Blind transfer channel(s) to the given destination
		</synopsis>
		<syntax>
			<parameter name="Channel" required="true">
			</parameter>
			<parameter name="Context">
			</parameter>
			<parameter name="Exten">
			</parameter>
		</syntax>
		<description>
			<para>Redirect all channels currently bridged to the specified channel to the specified destination.</para>
		</description>
		<see-also>
			<ref type="manager">Redirect</ref>
			<ref type="managerEvent">BlindTransfer</ref>
		</see-also>
	</manager>
	<managerEvent name="ExtensionStatus" language="en_US" module="builtin">
		<managerEventInstance class="EVENT_FLAG_CALL" module="builtin">
			<since>
				<version>18.26.0</version>
				<version>20.11.0</version>
				<version>21.6.0</version>
				<version>22.1.0</version>
			</since>
			<synopsis>Raised when a hint changes due to a device state change.</synopsis>
			<syntax>
				<parameter name="Exten">
					<para>Name of the extension.</para>
				</parameter>
				<parameter name="Context">
					<para>Context that owns the extension.</para>
				</parameter>
				<parameter name="Hint">
					<para>Hint set for the extension</para>
				</parameter>
				<parameter name="Status">
					<para>Numerical value of the extension status. Extension
					status is determined by the combined device state of all items
					contained in the hint.</para>
					<enumlist>
						<enum name="-2">
							<para>The extension was removed from the dialplan.</para>
						</enum>
						<enum name="-1">
							<para>The extension's hint was removed from the dialplan.</para>
						</enum>
						<enum name="0">
							<para><literal>Idle</literal> - Related device(s) are in an idle
							state.</para>
						</enum>
						<enum name="1">
							<para><literal>InUse</literal> - Related device(s) are in active
							calls but may take more calls.</para>
						</enum>
						<enum name="2">
							<para><literal>Busy</literal> - Related device(s) are in active
							calls and may not take any more calls.</para>
						</enum>
						<enum name="4">
							<para><literal>Unavailable</literal> - Related device(s) are
							not reachable.</para>
						</enum>
						<enum name="8">
							<para><literal>Ringing</literal> - Related device(s) are
							currently ringing.</para>
						</enum>
						<enum name="9">
							<para><literal>InUse&amp;Ringing</literal> - Related device(s)
							are currently ringing and in active calls.</para>
						</enum>
						<enum name="16">
							<para><literal>Hold</literal> - Related device(s) are
							currently on hold.</para>
						</enum>
						<enum name="17">
							<para><literal>InUse&amp;Hold</literal> - Related device(s)
							are currently on hold and in active calls.</para>
						</enum>
					</enumlist>
				</parameter>
				<parameter name="StatusText">
					<para>Text representation of <literal>Status</literal>.</para>
					<enumlist>
						<enum name="Idle" />
						<enum name="InUse" />
						<enum name="Busy" />
						<enum name="Unavailable" />
						<enum name="Ringing" />
						<enum name="InUse&amp;Ringing" />
						<enum name="Hold" />
						<enum name="InUse&amp;Hold" />
						<enum name="Unknown">
							<para>Status does not match any of the above values.</para>
						</enum>
					</enumlist>
				</parameter>
			</syntax>
			<see-also>
				<ref type="manager">ExtensionState</ref>
			</see-also>
		</managerEventInstance>
	</managerEvent>
	<managerEvent name="PresenceStatus" language="en_US" module="builtin">
		<managerEventInstance class="EVENT_FLAG_CALL" module="builtin">
			<since>
				<version>18.26.0</version>
				<version>20.11.0</version>
				<version>21.6.0</version>
				<version>22.1.0</version>
			</since>
			<synopsis>Raised when a hint changes due to a presence state change.</synopsis>
			<syntax>
				<parameter name="Exten" />
				<parameter name="Context" />
				<parameter name="Hint" />
				<parameter name="Status" />
				<parameter name="Subtype" />
				<parameter name="Message" />
			</syntax>
			<see-also>
				<ref type="manager">PresenceState</ref>
			</see-also>
		</managerEventInstance>
	</managerEvent>
<module language="en_US" name="pval">
	<support_level>extended</support_level>
</module>
<module language="en_US" name="resource_asterisk">
	<support_level>core</support_level>
</module>
<module language="en_US" name="resource_bridges">
	<support_level>core</support_level>
</module>
<module language="en_US" name="resource_channels">
	<support_level>core</support_level>
</module>
<module language="en_US" name="resource_device_states">
	<support_level>core</support_level>
</module>
<module language="en_US" name="resource_events">
	<support_level>core</support_level>
</module>
<module language="en_US" name="resource_mailboxes">
	<support_level>core</support_level>
</module>
<module language="en_US" name="resource_playbacks">
	<support_level>core</support_level>
</module>
<module language="en_US" name="resource_recordings">
	<support_level>core</support_level>
</module>
	<application name="Park" language="en_US" module="parking_applications">
		<since>
			<version>12.0.0</version>
		</since>
		<synopsis>
			Park yourself.
		</synopsis>
		<syntax>
			<parameter name="parking_lot_name">
				<para>Specify in which parking lot to park a call.</para>
				<para>The parking lot used is selected in the following order:</para>
				<para>1) parking_lot_name option to this application</para>
				<para>2) <variable>PARKINGLOT</variable> variable</para>
				<para>3) <literal>CHANNEL(parkinglot)</literal> function
				(Possibly preset by the channel driver.)</para>
				<para>4) Default parking lot.</para>
			</parameter>
			<parameter name="options">
				<para>A list of options for this parked call.</para>
				<optionlist>
					<option name="r">
						<para>Send ringing instead of MOH to the parked call.</para>
					</option>
					<option name="R">
						<para>Randomize the selection of a parking space.</para>
					</option>
					<option name="s">
						<para>Silence announcement of the parking space number.</para>
					</option>
					<option name="c" argsep=",">
						<argument name="context" required="false" />
						<argument name="extension" required="false" />
						<argument name="priority" required="true" />
						<para>If the parking times out, go to this place in the dialplan
							instead of where the parking lot defines the call should go.
						</para>
					</option>
					<option name="t">
						<argument name="duration" required="true" />
						<para>Use a timeout of <literal>duration</literal> seconds instead
							of the timeout specified by the parking lot.</para>
					</option>
				</optionlist>
			</parameter>
		</syntax>
		<description>
			<para>Used to park yourself (typically in combination with an attended
			transfer to know the parking space).</para>
			<para>If you set the <variable>PARKINGEXTEN</variable> variable to a
				parking space extension in the parking lot, Park() will attempt to park the
				call on that extension. If the extension is already in use then execution
				will continue at the next priority.
			</para>
			<para>If the <literal>parkeddynamic</literal> option is enabled in
				<filename>res_parking.conf</filename> the following variables can be
				used to dynamically create new parking lots. When using dynamic parking
				lots, be aware of the conditions as explained in the notes section
				below.
			</para>
			<para>The <variable>PARKINGDYNAMIC</variable> variable specifies the
				parking lot to use as a template to create a dynamic parking lot. It
				is an error to specify a non-existent parking lot for the template.
				If not set then the default parking lot is used as the template.
			</para>
			<para>The <variable>PARKINGDYNCONTEXT</variable> variable specifies the
				dialplan context to use for the newly created dynamic parking lot. If
				not set then the context from the parking lot template is used. The
				context is created if it does not already exist and the new parking lot
				needs to create extensions.
			</para>
			<para>The <variable>PARKINGDYNEXTEN</variable> variable specifies the
				<literal>parkext</literal> to use for the newly created dynamic
				parking lot. If not set then the <literal>parkext</literal> is used from
				the parking lot template. If the template does not specify a
				<literal>parkext</literal> then no extensions are created for the newly
				created parking lot. The dynamic parking lot cannot be created if it
				needs to create extensions that overlap existing parking lot extensions.
				The only exception to this is for the <literal>parkext</literal>
				extension and only if neither of the overlaping parking lot's
				<literal>parkext</literal> is exclusive.
			</para>
			<para>The <variable>PARKINGDYNPOS</variable> variable specifies the
				parking positions to use for the newly created dynamic parking lot. If
				not set then the <literal>parkpos</literal> from the parking lot template
				is used.
			</para>
			<note>
				<para>This application must be used as the first extension priority
					to be recognized as a parking access extension for blind transfers.
					Blind transfers and the DTMF one-touch parking feature need this
					distinction to operate properly. The parking access extension in
					this case is treated like a dialplan hint.
				</para>
			</note>
		</description>
		<see-also>
			<ref type="application">ParkedCall</ref>
		</see-also>
	</application>

	<application name="ParkedCall" language="en_US" module="parking_applications">
		<since>
			<version>12.0.0</version>
		</since>
		<synopsis>
			Retrieve a parked call.
		</synopsis>
		<syntax>
			<parameter name="parking_lot_name">
				<para>Specify from which parking lot to retrieve a parked call.</para>
				<para>The parking lot used is selected in the following order:</para>
				<para>1) parking_lot_name option</para>
				<para>2) <variable>PARKINGLOT</variable> variable</para>
				<para>3) <literal>CHANNEL(parkinglot)</literal> function
				(Possibly preset by the channel driver.)</para>
				<para>4) Default parking lot.</para>
			</parameter>
			<parameter name="parking_space">
				<para>Parking space to retrieve a parked call from.
				If not provided then the first available parked call in the
				parking lot will be retrieved.</para>
			</parameter>
		</syntax>
		<description>
			<para>Used to retrieve a parked call from a parking lot.</para>
			<note>
				<para>If a parking lot's parkext option is set, then Parking lots
				will automatically create and manage dialplan extensions in
				the parking lot context. If that is the case then you will not
				need to manage parking extensions yourself, just include the
				parking context of the parking lot.</para>
			</note>
		</description>
		<see-also>
			<ref type="application">Park</ref>
		</see-also>
	</application>

	<application name="ParkAndAnnounce" language="en_US" module="parking_applications">
		<since>
			<version>12.0.0</version>
		</since>
		<synopsis>
			Park and Announce.
		</synopsis>
		<syntax>
			<parameter name="parking_lot_name">
				<para>Specify in which parking lot to park a call.</para>
				<para>The parking lot used is selected in the following order:</para>
				<para>1) parking_lot_name option to this application</para>
				<para>2) <variable>PARKINGLOT</variable> variable</para>
				<para>3) <literal>CHANNEL(parkinglot)</literal> function
				(Possibly preset by the channel driver.)</para>
				<para>4) Default parking lot.</para>
			</parameter>
			<parameter name="options">
				<para>A list of options for this parked call.</para>
				<optionlist>
					<option name="r">
						<para>Send ringing instead of MOH to the parked call.</para>
					</option>
					<option name="R">
						<para>Randomize the selection of a parking space.</para>
					</option>
					<option name="c" argsep=",">
						<argument name="context" required="false" />
						<argument name="extension" required="false" />
						<argument name="priority" required="true" />
						<para>If the parking times out, go to this place in the dialplan
							instead of where the parking lot defines the call should go.
						</para>
					</option>
					<option name="t">
						<argument name="duration" required="true" />
						<para>Use a timeout of <literal>duration</literal> seconds instead
							of the timeout specified by the parking lot.</para>
					</option>
				</optionlist>
			</parameter>
			<parameter name="announce_template" required="true" argsep=":">
				<argument name="announce" required="true">
					<para>Colon-separated list of files to announce. The word
					<literal>PARKED</literal> will be replaced by a say_digits of the extension in which
					the call is parked.</para>
				</argument>
				<argument name="announce1" multiple="true" />
			</parameter>
			<parameter name="dial" required="true">
				<para>The app_dial style resource to call to make the
				announcement. Console/dsp calls the console.</para>
			</parameter>
		</syntax>
		<description>
			<para>Park a call into the parkinglot and announce the call to another channel.</para>
			<para>The variable <variable>PARKEDAT</variable> will contain the parking extension
			into which the call was placed.  Use with the Local channel to allow the dialplan to make
			use of this information.</para>
		</description>
		<see-also>
			<ref type="application">Park</ref>
			<ref type="application">ParkedCall</ref>
		</see-also>
	</application>
	<function name="PARK_GET_CHANNEL" language="en_US" module="parking_bridge_features">
		<since>
			<version>16.0.0</version>
		</since>
		<synopsis>
			Get the channel name of an occupied parking space in a parking lot.
		</synopsis>
			<syntax>
				<parameter name="parking_space" required="true">
				</parameter>
				<parameter name="parking_lot" required="true">
				</parameter>
			</syntax>
		<description>
			<para>This function returns the channel of the specified parking space
				if the parking lot space is occupied.</para>
			</description>
	</function>
	<manager name="Parkinglots" language="en_US" module="parking_manager">
		<since>
			<version>11.0.0</version>
		</since>
		<synopsis>
			Get a list of parking lots
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
		</syntax>
		<description>
			<para>List all parking lots as a series of AMI events</para>
		</description>
	</manager>
	<manager name="ParkedCalls" language="en_US" module="parking_manager">
		<since>
			<version>0.7.2</version>
		</since>
		<synopsis>
			List parked calls.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="ParkingLot">
				<para>If specified, only show parked calls from the parking lot with this name.</para>
			</parameter>
		</syntax>
		<description>
			<para>List parked calls.</para>
		</description>
	</manager>
	<manager name="Park" language="en_US" module="parking_manager">
		<since>
			<version>1.4.0</version>
		</since>
		<synopsis>
			Park a channel.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="Channel" required="true">
				<para>Channel name to park.</para>
			</parameter>
			<parameter name="TimeoutChannel" required="false">
				<para>Channel name to use when constructing the dial string that will be dialed if the parked channel
				times out. If <literal>TimeoutChannel</literal> is in a two party bridge with
				<literal>Channel</literal>, then <literal>TimeoutChannel</literal> will receive an announcement and be
				treated as having parked <literal>Channel</literal> in the same manner as the Park Call DTMF feature.
				</para>
			</parameter>
			<parameter name="AnnounceChannel" required="false">
				<para>If specified, then this channel will receive an announcement when <literal>Channel</literal>
				is parked if <literal>AnnounceChannel</literal> is in a state where it can receive announcements
				(AnnounceChannel must be bridged). <literal>AnnounceChannel</literal> has no bearing on the actual
				state of the parked call.</para>
			</parameter>
			<parameter name="Timeout" required="false">
				<para>Overrides the timeout of the parking lot for this park action. Specified in milliseconds, but will be converted to
					seconds. Use a value of 0 to disable the timeout.
				</para>
			</parameter>
			<parameter name="Parkinglot" required="false">
				<para>The parking lot to use when parking the channel</para>
			</parameter>
			<parameter name="ParkingSpace" required="false">
				<para>The parking space extension in the parking lot.
					If the space is already in use then execution will continue at the next priority.
				</para>
			</parameter>
		</syntax>
		<description>
			<para>Park an arbitrary channel with optional arguments for specifying the parking lot used, how long
				the channel should remain parked, and what dial string to use as the parker if the call times out.
			</para>
		</description>
	</manager>
	<managerEvent language="en_US" name="ParkedCall" module="parking_manager">
		<managerEventInstance class="EVENT_FLAG_CALL" module="parking_manager">
			<since>
				<version>12.0.0</version>
			</since>
			<synopsis>Raised when a channel is parked.</synopsis>
			<syntax>
				<channel_snapshot prefix="Parkee"/>
				<parameter name="ParkerDialString">
					<para>Dial String that can be used to call back the parker on ParkingTimeout.</para>
				</parameter>
				<parameter name="Parkinglot">
					<para>Name of the parking lot that the parkee is parked in</para>
				</parameter>
				<parameter name="ParkingSpace">
					<para>Parking Space that the parkee is parked in</para>
				</parameter>
				<parameter name="ParkingTimeout">
				<para>Time remaining until the parkee is forcefully removed from parking in seconds</para>
				</parameter>
				<parameter name="ParkingDuration">
					<para>Time the parkee has been in the parking bridge (in seconds)</para>
				</parameter>
			</syntax>
		</managerEventInstance>
	</managerEvent>
	<managerEvent language="en_US" name="ParkedCallTimeOut" module="parking_manager">
		<managerEventInstance class="EVENT_FLAG_CALL" module="parking_manager">
			<since>
				<version>12.0.0</version>
			</since>
			<synopsis>Raised when a channel leaves a parking lot due to reaching the time limit of being parked.</synopsis>
			<syntax>
				<channel_snapshot prefix="Parkee"/>
				<channel_snapshot prefix="Parker"/>
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='ParkedCall']/managerEventInstance/syntax/parameter)" />
			</syntax>
		</managerEventInstance>
	</managerEvent>
	<managerEvent language="en_US" name="ParkedCallGiveUp" module="parking_manager">
		<managerEventInstance class="EVENT_FLAG_CALL" module="parking_manager">
			<since>
				<version>12.0.0</version>
			</since>
			<synopsis>Raised when a channel leaves a parking lot because it hung up without being answered.</synopsis>
			<syntax>
				<channel_snapshot prefix="Parkee"/>
				<channel_snapshot prefix="Parker"/>
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='ParkedCall']/managerEventInstance/syntax/parameter)" />
			</syntax>
		</managerEventInstance>
	</managerEvent>
	<managerEvent language="en_US" name="UnParkedCall" module="parking_manager">
		<managerEventInstance class="EVENT_FLAG_CALL" module="parking_manager">
			<since>
				<version>12.0.0</version>
			</since>
			<synopsis>Raised when a channel leaves a parking lot because it was retrieved from the parking lot and reconnected.</synopsis>
			<syntax>
				<channel_snapshot prefix="Parkee"/>
				<channel_snapshot prefix="Parker"/>
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='ParkedCall']/managerEventInstance/syntax/parameter)" />
				<channel_snapshot prefix="Retriever"/>
			</syntax>
		</managerEventInstance>
	</managerEvent>
	<managerEvent language="en_US" name="ParkedCallSwap" module="parking_manager">
		<managerEventInstance class="EVENT_FLAG_CALL" module="parking_manager">
			<since>
				<version>13.5.0</version>
			</since>
			<synopsis>Raised when a channel takes the place of a previously parked channel</synopsis>
			<syntax>
				<channel_snapshot prefix="Parkee"/>
				<channel_snapshot prefix="Parker"/>
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='ParkedCall']/managerEventInstance/syntax/parameter)" />
			</syntax>
			<description>
				<para>This event is raised when a channel initially parked in the parking lot
				is swapped out with a different channel. The most common case for this is when
				an attended transfer to a parking lot occurs. The Parkee information in the event
				will indicate the party that was swapped into the parking lot.</para>
			</description>
		</managerEventInstance>
	</managerEvent>
<module language="en_US" name="res_adsi">
	<support_level>deprecated</support_level>
</module>
<module language="en_US" name="res_aeap">
	<depend>res_http_websocket</depend>
	<support_level>core</support_level>
</module>
	<configInfo name="res_aeap" language="en_US">
		<synopsis>Asterisk External Application Protocol (AEAP) module for Asterisk</synopsis>
		<configFile name="aeap.conf">
			<configObject name="client">
				<since>
					<version>18.12.0</version>
					<version>19.4.0</version>
				</since>
				<synopsis>AEAP client options</synopsis>
				<configOption name="type">
					<since>
						<version>18.12.0</version>
						<version>19.4.0</version>
					</since>
					<synopsis>Must be of type 'client'.</synopsis>
				</configOption>
				<configOption name="url">
					<since>
						<version>18.12.0</version>
						<version>19.4.0</version>
					</since>
					<synopsis>The URL of the server to connect to.</synopsis>
				</configOption>
				<configOption name="protocol">
					<since>
						<version>18.12.0</version>
						<version>19.4.0</version>
					</since>
					<synopsis>The application protocol.</synopsis>
				</configOption>
				<configOption name="codecs">
					<since>
						<version>18.12.0</version>
						<version>19.4.0</version>
					</since>
				        <synopsis>Optional media codec(s)</synopsis>
					<description><para>
					If this is specified, Asterisk will use this for codec related negotiations
					with the external application. Otherwise, Asterisk will default to using the
					codecs configured on the endpoint.
					</para></description>
				</configOption>
			</configObject>
		</configFile>
	</configInfo>
<module language="en_US" name="res_ael_share">
	<support_level>extended</support_level>
</module>
<module language="en_US" name="res_agi">
	<depend>res_speech</depend>
	<support_level>core</support_level>
</module>
	<agi name="answer" language="en_US">
		<since>
			<version>0.4.0</version>
		</since>
		<synopsis>
			Answer channel
		</synopsis>
		<syntax />
		<description>
			<para>Answers channel if not already in answer state. Returns <literal>-1</literal> on
			channel failure, or <literal>0</literal> if successful.</para>
		</description>
		<see-also>
			<ref type="agi">hangup</ref>
			<ref type="application">AGI</ref>
		</see-also>
	</agi>
	<agi name="asyncagi break" language="en_US">
		<since>
			<version>1.8.0</version>
		</since>
		<synopsis>
			Interrupts Async AGI
		</synopsis>
		<syntax />
		<description>
			<para>Interrupts expected flow of Async AGI commands and returns control to previous source
			(typically, the PBX dialplan).</para>
		</description>
		<see-also>
			<ref type="agi">hangup</ref>
			<ref type="application">AGI</ref>
		</see-also>
	</agi>
	<agi name="channel status" language="en_US">
		<since>
			<version>0.4.0</version>
		</since>
		<synopsis>
			Returns status of the connected channel.
		</synopsis>
		<syntax>
			<parameter name="channelname" />
		</syntax>
		<description>
			<para>Returns the status of the specified <replaceable>channelname</replaceable>.
			If no channel name is given then returns the status of the current channel.</para>
			<para>Return values:</para>
			<enumlist>
				<enum name="0">
					<para>Channel is down and available.</para>
				</enum>
				<enum name="1">
					<para>Channel is down, but reserved.</para>
				</enum>
				<enum name="2">
					<para>Channel is off hook.</para>
				</enum>
				<enum name="3">
					<para>Digits (or equivalent) have been dialed.</para>
				</enum>
				<enum name="4">
					<para>Line is ringing.</para>
				</enum>
				<enum name="5">
					<para>Remote end is ringing.</para>
				</enum>
				<enum name="6">
					<para>Line is up.</para>
				</enum>
				<enum name="7">
					<para>Line is busy.</para>
				</enum>
			</enumlist>
		</description>
		<see-also>
			<ref type="application">AGI</ref>
		</see-also>
	</agi>
	<agi name="control stream file" language="en_US">
		<since>
			<version>1.2.0</version>
		</since>
		<synopsis>
			Sends audio file on channel and allows the listener to control the stream.
		</synopsis>
		<syntax>
			<parameter name="filename" required="true">
				<para>The file extension must not be included in the filename.</para>
			</parameter>
			<parameter name="escape_digits" required="true" />
			<parameter name="skipms" />
			<parameter name="ffchar">
				<para>Defaults to <literal>#</literal></para>
			</parameter>
			<parameter name="rewchr">
				<para>Defaults to <literal>*</literal></para>
			</parameter>
			<parameter name="pausechr" />
			<parameter name="offsetms">
				<para>Offset, in milliseconds, to start the audio playback</para>
			</parameter>
		</syntax>
		<description>
			<para>Send the given file, allowing playback to be controlled by the given
			digits, if any. Use double quotes for the digits if you wish none to be
			permitted. If offsetms is provided then the audio will seek to offsetms
			before play starts. Returns <literal>0</literal> if playback completes without a digit
			being pressed, or the ASCII numerical value of the digit if one was pressed,
			or <literal>-1</literal> on error or if the channel was disconnected. Returns the
			position where playback was terminated as endpos.</para>

			<para>It sets the following channel variables upon completion:</para>
			<variablelist>
				<variable name="CPLAYBACKSTATUS">
					<para>Contains the status of the attempt as a text string</para>
					<value name="SUCCESS" />
					<value name="USERSTOPPED" />
					<value name="REMOTESTOPPED" />
					<value name="ERROR" />
				</variable>
				<variable name="CPLAYBACKOFFSET">
					<para>Contains the offset in ms into the file where playback
					was at when it stopped. <literal>-1</literal> is end of file.</para>
				</variable>
				<variable name="CPLAYBACKSTOPKEY">
					<para>If the playback is stopped by the user this variable contains
					the key that was pressed.</para>
				</variable>
			</variablelist>
		</description>
		<see-also>
			<ref type="agi">get option</ref>
			<ref type="agi">control stream file</ref>
			<ref type="application">AGI</ref>
		</see-also>
	</agi>
	<agi name="database del" language="en_US">
		<since>
			<version>0.4.0</version>
		</since>
		<synopsis>
			Removes database key/value
		</synopsis>
		<syntax>
			<parameter name="family" required="true" />
			<parameter name="key" required="true" />
		</syntax>
		<description>
			<para>Deletes an entry in the Asterisk database for a given
			<replaceable>family</replaceable> and <replaceable>key</replaceable>.</para>
			<para>Returns <literal>1</literal> if successful, <literal>0</literal>
			otherwise.</para>
		</description>
		<see-also>
			<ref type="agi">database get</ref>
			<ref type="agi">database put</ref>
			<ref type="agi">database deltree</ref>
			<ref type="application">AGI</ref>
		</see-also>
	</agi>
	<agi name="database deltree" language="en_US">
		<since>
			<version>0.4.0</version>
		</since>
		<synopsis>
			Removes database keytree/value
		</synopsis>
		<syntax>
			<parameter name="family" required="true" />
			<parameter name="keytree" />
		</syntax>
		<description>
			<para>Deletes a <replaceable>family</replaceable> or specific <replaceable>keytree</replaceable>
			within a <replaceable>family</replaceable> in the Asterisk database.</para>
			<para>Returns <literal>1</literal> if successful, <literal>0</literal> otherwise.</para>
		</description>
		<see-also>
			<ref type="agi">database get</ref>
			<ref type="agi">database put</ref>
			<ref type="agi">database del</ref>
			<ref type="application">AGI</ref>
		</see-also>
	</agi>
	<agi name="database get" language="en_US">
		<since>
			<version>0.4.0</version>
		</since>
		<synopsis>
			Gets database value
		</synopsis>
		<syntax>
			<parameter name="family" required="true" />
			<parameter name="key" required="true" />
		</syntax>
		<description>
			<para>Retrieves an entry in the Asterisk database for a given <replaceable>family</replaceable>
			and <replaceable>key</replaceable>.</para>
			<para>Returns <literal>0</literal> if <replaceable>key</replaceable> is not set.
			Returns <literal>1</literal> if <replaceable>key</replaceable> is set and returns the variable
			in parenthesis.</para>
			<para>Example return code: 200 result=1 (testvariable)</para>
		</description>
		<see-also>
			<ref type="agi">database put</ref>
			<ref type="agi">database del</ref>
			<ref type="agi">database deltree</ref>
			<ref type="application">AGI</ref>
		</see-also>
	</agi>
	<agi name="database put" language="en_US">
		<since>
			<version>0.4.0</version>
		</since>
		<synopsis>
			Adds/updates database value
		</synopsis>
		<syntax>
			<parameter name="family" required="true" />
			<parameter name="key" required="true" />
			<parameter name="value" required="true" />
		</syntax>
		<description>
			<para>Adds or updates an entry in the Asterisk database for a given
			<replaceable>family</replaceable>, <replaceable>key</replaceable>, and
			<replaceable>value</replaceable>.</para>
			<para>Returns <literal>1</literal> if successful, <literal>0</literal> otherwise.</para>
		</description>
		<see-also>
			<ref type="agi">database get</ref>
			<ref type="agi">database del</ref>
			<ref type="agi">database deltree</ref>
			<ref type="application">AGI</ref>
		</see-also>
	</agi>
	<agi name="exec" language="en_US">
		<since>
			<version>0.4.0</version>
		</since>
		<synopsis>
			Executes a given Application
		</synopsis>
		<syntax>
			<parameter name="application" required="true" />
			<parameter name="options" required="true" />
		</syntax>
		<description>
			<para>Executes <replaceable>application</replaceable> with given
			<replaceable>options</replaceable>.</para>
			<para>Returns whatever the <replaceable>application</replaceable> returns, or
			<literal>-2</literal> on failure to find <replaceable>application</replaceable>.</para>
			<note>
				<para>exec does not evaluate dialplan functions and variables unless it is explicitly enabled by setting the <variable>AGIEXECFULL</variable> variable to <literal>yes</literal>.</para>
			</note>
		</description>
		<see-also>
			<ref type="application">AGI</ref>
		</see-also>
	</agi>
	<agi name="get data" language="en_US">
		<since>
			<version>0.4.0</version>
		</since>
		<synopsis>
			Prompts for DTMF on a channel
		</synopsis>
		<syntax>
			<parameter name="file" required="true" />
			<parameter name="timeout" />
			<parameter name="maxdigits" />
		</syntax>
		<description>
			<para>Stream the given <replaceable>file</replaceable>, and receive DTMF data.</para>
			<para>Returns the digits received from the channel at the other end.</para>
		</description>
		<see-also>
			<ref type="application">AGI</ref>
		</see-also>
	</agi>
	<agi name="get full variable" language="en_US">
		<since>
			<version>1.2.0</version>
		</since>
		<synopsis>
			Evaluates a channel expression
		</synopsis>
		<syntax>
			<parameter name="expression" required="true" />
			<parameter name="channelname" />
		</syntax>
		<description>
			<para>Evaluates the given <replaceable>expression</replaceable> against the
			channel specified by <replaceable>channelname</replaceable>, or the current
			channel if <replaceable>channelname</replaceable> is not provided.</para>
			<para>Unlike GET VARIABLE, the <replaceable>expression</replaceable> is
			processed in a manner similar to dialplan evaluation, allowing complex
			and built-in variables to be accessed, e.g. <literal>The time is
			${EPOCH}</literal></para>
			<para>Returns <literal>0</literal> if no channel matching
			<replaceable>channelname</replaceable> exists, <literal>1</literal>
			otherwise.</para>
			<para>Example return code: 200 result=1 (The time is 1578493800)</para>
		</description>
		<see-also>
			<ref type="agi">get variable</ref>
			<ref type="agi">set variable</ref>
			<ref type="application">AGI</ref>
		</see-also>
	</agi>
	<agi name="get option" language="en_US">
		<since>
			<version>1.2.0</version>
		</since>
		<synopsis>
			Stream file, prompt for DTMF, with timeout.
		</synopsis>
		<syntax>
			<parameter name="filename" required="true" />
			<parameter name="escape_digits" required="true" />
			<parameter name="timeout" />
		</syntax>
		<description>
			<para>Behaves similar to STREAM FILE but used with a timeout option.</para>
		</description>
		<see-also>
			<ref type="agi">stream file</ref>
			<ref type="agi">control stream file</ref>
			<ref type="application">AGI</ref>
		</see-also>
	</agi>
	<agi name="get variable" language="en_US">
		<since>
			<version>0.4.0</version>
		</since>
		<synopsis>
			Gets a channel variable.
		</synopsis>
		<syntax>
			<parameter name="variablename" required="true" />
		</syntax>
		<description>
			<para>Returns <literal>0</literal> if <replaceable>variablename</replaceable> is not set.
			Returns <literal>1</literal> if <replaceable>variablename</replaceable> is set and returns
			the variable in parentheses.</para>
			<para>Example return code: 200 result=1 (testvariable)</para>
		</description>
		<see-also>
			<ref type="agi">get full variable</ref>
			<ref type="agi">set variable</ref>
			<ref type="application">AGI</ref>
		</see-also>
	</agi>
	<agi name="hangup" language="en_US">
		<since>
			<version>0.4.0</version>
		</since>
		<synopsis>
			Hangup a channel.
		</synopsis>
		<syntax>
			<parameter name="channelname" />
		</syntax>
		<description>
			<para>Hangs up the specified channel. If no channel name is given, hangs
			up the current channel</para>
		</description>
		<see-also>
			<ref type="application">AGI</ref>
		</see-also>
	</agi>
	<agi name="noop" language="en_US">
		<since>
			<version>0.4.0</version>
		</since>
		<synopsis>
			Does nothing.
		</synopsis>
		<syntax />
		<description>
			<para>Does nothing.</para>
		</description>
		<see-also>
			<ref type="application">AGI</ref>
		</see-also>
	</agi>
	<agi name="receive char" language="en_US">
		<since>
			<version>0.4.0</version>
		</since>
		<synopsis>
			Receives one character from channels supporting it.
		</synopsis>
		<syntax>
			<parameter name="timeout" required="true">
				<para>The maximum time to wait for input in milliseconds, or <literal>0</literal>
				for infinite. Most channels</para>
			</parameter>
		</syntax>
		<description>
			<para>Receives a character of text on a channel. Most channels do not support
			the reception of text. Returns the decimal value of the character
			if one is received, or <literal>0</literal> if the channel does not support
			text reception. Returns <literal>-1</literal> only on error/hangup.</para>
		</description>
		<see-also>
			<ref type="agi">receive text</ref>
			<ref type="application">AGI</ref>
		</see-also>
	</agi>
	<agi name="receive text" language="en_US">
		<since>
			<version>1.2.0</version>
		</since>
		<synopsis>
			Receives text from channels supporting it.
		</synopsis>
		<syntax>
			<parameter name="timeout" required="true">
				<para>The timeout to be the maximum time to wait for input in
				milliseconds, or <literal>0</literal> for infinite.</para>
			</parameter>
		</syntax>
		<description>
			<para>Receives a string of text on a channel. Most channels
			do not support the reception of text. Returns <literal>-1</literal> for failure
			or <literal>1</literal> for success, and the string in parenthesis.</para>
		</description>
		<see-also>
			<ref type="agi">receive char</ref>
			<ref type="agi">send text</ref>
			<ref type="application">AGI</ref>
		</see-also>
	</agi>
	<agi name="record file" language="en_US">
		<since>
			<version>0.4.0</version>
		</since>
		<synopsis>
			Records to a given file.
		</synopsis>
		<syntax>
			<parameter name="filename" required="true">
				<para>The destination filename of the recorded audio.</para>
			</parameter>
			<parameter name="format" required="true">
				<para>The audio format in which to save the resulting file.</para>
			</parameter>
			<parameter name="escape_digits" required="true">
				<para>The DTMF digits that will terminate the recording process.</para>
			</parameter>
			<parameter name="timeout" required="true">
				<para>The maximum recording time in milliseconds. Set to -1 for no
				limit.</para>
			</parameter>
			<parameter name="offset_samples">
				<para>Causes the recording to first seek to the specified offset before
				recording begins.</para>
			</parameter>
			<parameter name="beep">
				<para>Causes Asterisk to play a beep as recording begins. This argument
				can take any value.</para>
			</parameter>
			<parameter name="s=silence">
				<para>The number of seconds of silence that are permitted before the
				recording is terminated, regardless of the
				<replaceable>escape_digits</replaceable> or <replaceable>timeout</replaceable>
				arguments. If specified, this parameter must be preceded by
				<literal>s=</literal>.</para>
			</parameter>
		</syntax>
		<description>
			<para>Record to a file until a given dtmf digit in the sequence is received.
			Returns <literal>-1</literal> on hangup or error.  The format will specify what kind of file
			will be recorded. The <replaceable>timeout</replaceable> is the maximum record time in
			milliseconds, or <literal>-1</literal> for no <replaceable>timeout</replaceable>.
			<replaceable>offset samples</replaceable> is optional, and, if provided, will seek
			to the offset without exceeding the end of the
			file. <replaceable>beep</replaceable> can take any value, and causes Asterisk
			to play a beep to the channel that is about to be recorded. <replaceable>silence</replaceable> is
			the number of seconds of silence allowed before the function returns despite the
			lack of dtmf digits or reaching <replaceable>timeout</replaceable>. <replaceable>silence</replaceable>
			value must be preceded by <literal>s=</literal> and is also optional.</para>
		</description>
		<see-also>
			<ref type="application">AGI</ref>
		</see-also>
	</agi>
	<agi name="say alpha" language="en_US">
		<since>
			<version>1.2.0</version>
		</since>
		<synopsis>
			Says a given character string.
		</synopsis>
		<syntax>
			<parameter name="number" required="true" />
			<parameter name="escape_digits" required="true" />
		</syntax>
		<description>
			<para>Say a given character string, returning early if any of the given DTMF digits
			are received on the channel. Returns <literal>0</literal> if playback completes
			without a digit being pressed, or the ASCII numerical value of the digit if one
			was pressed or <literal>-1</literal> on error/hangup.</para>
		</description>
		<see-also>
			<ref type="agi">say digits</ref>
			<ref type="agi">say number</ref>
			<ref type="agi">say phonetic</ref>
			<ref type="agi">say date</ref>
			<ref type="agi">say time</ref>
			<ref type="agi">say datetime</ref>
			<ref type="application">AGI</ref>
		</see-also>
	</agi>
	<agi name="say digits" language="en_US">
		<since>
			<version>0.4.0</version>
		</since>
		<synopsis>
			Says a given digit string.
		</synopsis>
		<syntax>
			<parameter name="number" required="true" />
			<parameter name="escape_digits" required="true" />
		</syntax>
		<description>
			<para>Say a given digit string, returning early if any of the given DTMF digits
			are received on the channel. Returns <literal>0</literal> if playback completes
			without a digit being pressed, or the ASCII numerical value of the digit if one
			was pressed or <literal>-1</literal> on error/hangup.</para>
		</description>
		<see-also>
			<ref type="agi">say alpha</ref>
			<ref type="agi">say number</ref>
			<ref type="agi">say phonetic</ref>
			<ref type="agi">say date</ref>
			<ref type="agi">say time</ref>
			<ref type="agi">say datetime</ref>
			<ref type="application">AGI</ref>
		</see-also>
	</agi>
	<agi name="say number" language="en_US">
		<since>
			<version>0.4.0</version>
		</since>
		<synopsis>
			Says a given number.
		</synopsis>
		<syntax>
			<parameter name="number" required="true" />
			<parameter name="escape_digits" required="true" />
			<parameter name="gender" />
		</syntax>
		<description>
			<para>Say a given number, returning early if any of the given DTMF digits
			are received on the channel.  Returns <literal>0</literal> if playback
			completes without a digit being pressed, or the ASCII numerical value of
			the digit if one was pressed or <literal>-1</literal> on error/hangup.</para>
		</description>
		<see-also>
			<ref type="agi">say alpha</ref>
			<ref type="agi">say digits</ref>
			<ref type="agi">say phonetic</ref>
			<ref type="agi">say date</ref>
			<ref type="agi">say time</ref>
			<ref type="agi">say datetime</ref>
			<ref type="application">AGI</ref>
		</see-also>
	</agi>
	<agi name="say phonetic" language="en_US">
		<since>
			<version>1.0.0</version>
		</since>
		<synopsis>
			Says a given character string with phonetics.
		</synopsis>
		<syntax>
			<parameter name="string" required="true" />
			<parameter name="escape_digits" required="true" />
		</syntax>
		<description>
			<para>Say a given character string with phonetics, returning early if any of the
			given DTMF digits are received on the channel. Returns <literal>0</literal> if
			playback completes without a digit pressed, the ASCII numerical value of the digit
			if one was pressed, or <literal>-1</literal> on error/hangup.</para>
		</description>
		<see-also>
			<ref type="agi">say alpha</ref>
			<ref type="agi">say digits</ref>
			<ref type="agi">say number</ref>
			<ref type="agi">say date</ref>
			<ref type="agi">say time</ref>
			<ref type="agi">say datetime</ref>
			<ref type="application">AGI</ref>
		</see-also>
	</agi>
	<agi name="say date" language="en_US">
		<since>
			<version>1.2.0</version>
		</since>
		<synopsis>
			Says a given date.
		</synopsis>
		<syntax>
			<parameter name="date" required="true">
				<para>Is number of seconds elapsed since 00:00:00 on January 1, 1970.
				Coordinated Universal Time (UTC).</para>
			</parameter>
			<parameter name="escape_digits" required="true" />
		</syntax>
		<description>
			<para>Say a given date, returning early if any of the given DTMF digits are
			received on the channel. Returns <literal>0</literal> if playback
			completes without a digit being pressed, or the ASCII numerical value of the
			digit if one was pressed or <literal>-1</literal> on error/hangup.</para>
		</description>
		<see-also>
			<ref type="agi">say alpha</ref>
			<ref type="agi">say digits</ref>
			<ref type="agi">say number</ref>
			<ref type="agi">say phonetic</ref>
			<ref type="agi">say time</ref>
			<ref type="agi">say datetime</ref>
			<ref type="application">AGI</ref>
		</see-also>
	</agi>
	<agi name="say time" language="en_US">
		<since>
			<version>1.0.0</version>
		</since>
		<synopsis>
			Says a given time.
		</synopsis>
		<syntax>
			<parameter name="time" required="true">
				<para>Is number of seconds elapsed since 00:00:00 on January 1, 1970.
				Coordinated Universal Time (UTC).</para>
			</parameter>
			<parameter name="escape_digits" required="true" />
		</syntax>
		<description>
			<para>Say a given time, returning early if any of the given DTMF digits are
			received on the channel. Returns <literal>0</literal> if playback completes
			without a digit being pressed, or the ASCII numerical value of the digit if
			one was pressed or <literal>-1</literal> on error/hangup.</para>
		</description>
		<see-also>
			<ref type="agi">say alpha</ref>
			<ref type="agi">say digits</ref>
			<ref type="agi">say number</ref>
			<ref type="agi">say phonetic</ref>
			<ref type="agi">say date</ref>
			<ref type="agi">say datetime</ref>
			<ref type="application">AGI</ref>
		</see-also>
	</agi>
	<agi name="say datetime" language="en_US">
		<since>
			<version>1.2.0</version>
		</since>
		<synopsis>
			Says a given time as specified by the format given.
		</synopsis>
		<syntax>
			<parameter name="time" required="true">
				<para>Is number of seconds elapsed since 00:00:00
				on January 1, 1970, Coordinated Universal Time (UTC)</para>
			</parameter>
			<parameter name="escape_digits" required="true" />
			<parameter name="format">
				<para>Is the format the time should be said in. See
				<filename>voicemail.conf</filename> (defaults to <literal>ABdY
				'digits/at' IMp</literal>).</para>
			</parameter>
			<parameter name="timezone">
				<para>Acceptable values can be found in <filename>/usr/share/zoneinfo</filename>
				Defaults to machine default.</para>
			</parameter>
		</syntax>
		<description>
			<para>Say a given time, returning early if any of the given DTMF digits are
			received on the channel. Returns <literal>0</literal> if playback
			completes without a digit being pressed, or the ASCII numerical value of the
			digit if one was pressed or <literal>-1</literal> on error/hangup.</para>
		</description>
		<see-also>
			<ref type="agi">say alpha</ref>
			<ref type="agi">say digits</ref>
			<ref type="agi">say number</ref>
			<ref type="agi">say phonetic</ref>
			<ref type="agi">say date</ref>
			<ref type="agi">say time</ref>
			<ref type="application">AGI</ref>
		</see-also>
	</agi>
	<agi name="send image" language="en_US">
		<since>
			<version>0.4.0</version>
		</since>
		<synopsis>
			Sends images to channels supporting it.
		</synopsis>
		<syntax>
			<parameter name="image" required="true" />
		</syntax>
		<description>
			<para>Sends the given image on a channel. Most channels do not support the
			transmission of images. Returns <literal>0</literal> if image is sent, or if
			the channel does not support image transmission.  Returns <literal>-1</literal>
			only on error/hangup. Image names should not include extensions.</para>
		</description>
		<see-also>
			<ref type="application">AGI</ref>
		</see-also>
	</agi>
	<agi name="send text" language="en_US">
		<since>
			<version>0.4.0</version>
		</since>
		<synopsis>
			Sends text to channels supporting it.
		</synopsis>
		<syntax>
			<parameter name="text to send" required="true">
				<para>Text consisting of greater than one word should be placed
				in quotes since the command only accepts a single argument.</para>
			</parameter>
		</syntax>
		<description>
			<para>Sends the given text on a channel. Most channels do not support the
			transmission of text. Returns <literal>0</literal> if text is sent, or if the
			channel does not support text transmission. Returns <literal>-1</literal> only
			on error/hangup.</para>
		</description>
		<see-also>
			<ref type="agi">receive text</ref>
			<ref type="application">AGI</ref>
		</see-also>
	</agi>
	<agi name="set autohangup" language="en_US">
		<since>
			<version>0.4.0</version>
		</since>
		<synopsis>
			Autohangup channel in some time.
		</synopsis>
		<syntax>
			<parameter name="time" required="true" />
		</syntax>
		<description>
			<para>Cause the channel to automatically hangup at <replaceable>time</replaceable>
			seconds in the future. Of course it can be hungup before then as well. Setting to
			<literal>0</literal> will cause the autohangup feature to be disabled on this channel.</para>
		</description>
		<see-also>
			<ref type="application">AGI</ref>
		</see-also>
	</agi>
	<agi name="set callerid" language="en_US">
		<since>
			<version>0.4.0</version>
		</since>
		<synopsis>
			Sets callerid for the current channel.
		</synopsis>
		<syntax>
			<parameter name="number" required="true" />
		</syntax>
		<description>
			<para>Changes the callerid of the current channel.</para>
		</description>
		<see-also>
			<ref type="application">AGI</ref>
		</see-also>
	</agi>
	<agi name="set context" language="en_US">
		<since>
			<version>0.4.0</version>
		</since>
		<synopsis>
			Sets channel context.
		</synopsis>
		<syntax>
			<parameter name="desired context" required="true" />
		</syntax>
		<description>
			<para>Sets the context for continuation upon exiting the application.</para>
		</description>
		<see-also>
			<ref type="agi">set extension</ref>
			<ref type="agi">set priority</ref>
			<ref type="application">AGI</ref>
		</see-also>
	</agi>
	<agi name="set extension" language="en_US">
		<since>
			<version>0.4.0</version>
		</since>
		<synopsis>
			Changes channel extension.
		</synopsis>
		<syntax>
			<parameter name="new extension" required="true" />
		</syntax>
		<description>
			<para>Changes the extension for continuation upon exiting the application.</para>
		</description>
		<see-also>
			<ref type="agi">set context</ref>
			<ref type="agi">set priority</ref>
			<ref type="application">AGI</ref>
		</see-also>
	</agi>
	<agi name="set music" language="en_US">
		<since>
			<version>0.5.0</version>
		</since>
		<synopsis>
			Enable/Disable Music on hold generator
		</synopsis>
		<syntax>
			<parameter name="boolean" required="true">
				<enumlist>
					<enum name="on" />
					<enum name="off" />
				</enumlist>
			</parameter>
			<parameter name="class" required="true" />
		</syntax>
		<description>
			<para>Enables/Disables the music on hold generator. If <replaceable>class</replaceable>
			is not specified, then the <literal>default</literal> music on hold class will be
			used. This generator will be stopped automatically when playing a file.</para>
			<para>Always returns <literal>0</literal>.</para>
		</description>
		<see-also>
			<ref type="application">AGI</ref>
		</see-also>
	</agi>
	<agi name="set priority" language="en_US">
		<since>
			<version>0.4.0</version>
		</since>
		<synopsis>
			Set channel dialplan priority.
		</synopsis>
		<syntax>
			<parameter name="priority" required="true" />
		</syntax>
		<description>
			<para>Changes the priority for continuation upon exiting the application.
			The priority must be a valid priority or label.</para>
		</description>
		<see-also>
			<ref type="agi">set context</ref>
			<ref type="agi">set extension</ref>
			<ref type="application">AGI</ref>
		</see-also>
	</agi>
	<agi name="set variable" language="en_US">
		<since>
			<version>0.4.0</version>
		</since>
		<synopsis>
			Sets a channel variable.
		</synopsis>
		<syntax>
			<parameter name="variablename" required="true" />
			<parameter name="value" required="true" />
		</syntax>
		<description>
			<para>Sets a variable to the current channel.</para>
		</description>
		<see-also>
			<ref type="agi">get variable</ref>
			<ref type="agi">get full variable</ref>
			<ref type="application">AGI</ref>
		</see-also>
	</agi>
	<agi name="stream file" language="en_US">
		<since>
			<version>0.4.0</version>
		</since>
		<synopsis>
			Sends audio file on channel.
		</synopsis>
		<syntax>
			<parameter name="filename" required="true">
				<para>File name to play. The file extension must not be
				included in the <replaceable>filename</replaceable>.</para>
			</parameter>
			<parameter name="escape_digits" required="true">
				<para>Use double quotes for the digits if you wish none to be
				permitted.</para>
			</parameter>
			<parameter name="sample offset">
				<para>If sample offset is provided then the audio will seek to sample
				offset before play starts.</para>
			</parameter>
		</syntax>
		<description>
			<para>Send the given file, allowing playback to be interrupted by the given
			digits, if any. Returns <literal>0</literal> if playback completes without a digit
			being pressed, or the ASCII numerical value of the digit if one was pressed,
			or <literal>-1</literal> on error or if the channel was disconnected. If
			musiconhold is playing before calling stream file it will be automatically
			stopped and will not be restarted after completion.</para>
			<para>It sets the following channel variables upon completion:</para>
			<variablelist>
				<variable name="PLAYBACKSTATUS">
					<para>The status of the playback attempt as a text string.</para>
					<value name="SUCCESS"/>
					<value name="FAILED"/>
				</variable>
			</variablelist>
		</description>
		<see-also>
			<ref type="agi">control stream file</ref>
			<ref type="agi">get option</ref>
			<ref type="application">AGI</ref>
		</see-also>
	</agi>
	<agi name="tdd mode" language="en_US">
		<since>
			<version>0.4.0</version>
		</since>
		<synopsis>
			Toggles TDD mode (for the deaf).
		</synopsis>
		<syntax>
			<parameter name="boolean" required="true">
				<enumlist>
					<enum name="on" />
					<enum name="off" />
				</enumlist>
			</parameter>
		</syntax>
		<description>
			<para>Enable/Disable TDD transmission/reception on a channel. Returns <literal>1</literal> if
			successful, or <literal>0</literal> if channel is not TDD-capable.</para>
		</description>
		<see-also>
			<ref type="application">AGI</ref>
		</see-also>
	</agi>
	<agi name="verbose" language="en_US">
		<since>
			<version>0.4.0</version>
		</since>
		<synopsis>
			Logs a message to the asterisk verbose log.
		</synopsis>
		<syntax>
			<parameter name="message" required="true" />
			<parameter name="level" required="true" />
		</syntax>
		<description>
			<para>Sends <replaceable>message</replaceable> to the console via verbose
			message system. <replaceable>level</replaceable> is the verbose level (1-4).
			Always returns <literal>1</literal></para>
		</description>
		<see-also>
			<ref type="application">AGI</ref>
		</see-also>
	</agi>
	<agi name="wait for digit" language="en_US">
		<since>
			<version>0.4.0</version>
		</since>
		<synopsis>
			Waits for a digit to be pressed.
		</synopsis>
		<syntax>
			<parameter name="timeout" required="true" />
		</syntax>
		<description>
			<para>Waits up to <replaceable>timeout</replaceable> milliseconds for channel to
			receive a DTMF digit. Returns <literal>-1</literal> on channel failure, <literal>0</literal>
			if no digit is received in the timeout, or the numerical value of the ascii of the digit if
			one is received. Use <literal>-1</literal> for the <replaceable>timeout</replaceable> value if
			you desire the call to block indefinitely.</para>
		</description>
		<see-also>
			<ref type="application">AGI</ref>
		</see-also>
	</agi>
	<agi name="speech create" language="en_US">
		<since>
			<version>1.6.0</version>
		</since>
		<synopsis>
			Creates a speech object.
		</synopsis>
		<syntax>
			<parameter name="engine" required="true" />
		</syntax>
		<description>
			<para>Create a speech object to be used by the other Speech AGI commands.</para>
		</description>
		<see-also>
			<ref type="agi">speech set</ref>
			<ref type="agi">speech destroy</ref>
			<ref type="agi">speech load grammar</ref>
			<ref type="agi">speech unload grammar</ref>
			<ref type="agi">speech activate grammar</ref>
			<ref type="agi">speech deactivate grammar</ref>
			<ref type="agi">speech recognize</ref>
			<ref type="application">AGI</ref>
		</see-also>
	</agi>
	<agi name="speech set" language="en_US">
		<since>
			<version>1.6.0</version>
		</since>
		<synopsis>
			Sets a speech engine setting.
		</synopsis>
		<syntax>
			<parameter name="name" required="true" />
			<parameter name="value" required="true" />
		</syntax>
		<description>
			<para>Set an engine-specific setting.</para>
		</description>
		<see-also>
			<ref type="agi">speech create</ref>
			<ref type="agi">speech destroy</ref>
			<ref type="agi">speech load grammar</ref>
			<ref type="agi">speech unload grammar</ref>
			<ref type="agi">speech activate grammar</ref>
			<ref type="agi">speech deactivate grammar</ref>
			<ref type="agi">speech recognize</ref>
			<ref type="application">AGI</ref>
		</see-also>
	</agi>
	<agi name="speech destroy" language="en_US">
		<since>
			<version>1.6.0</version>
		</since>
		<synopsis>
			Destroys a speech object.
		</synopsis>
		<syntax>
		</syntax>
		<description>
			<para>Destroy the speech object created by <literal>SPEECH CREATE</literal>.</para>
		</description>
		<see-also>
			<ref type="agi">speech create</ref>
			<ref type="agi">speech set</ref>
			<ref type="agi">speech load grammar</ref>
			<ref type="agi">speech unload grammar</ref>
			<ref type="agi">speech activate grammar</ref>
			<ref type="agi">speech deactivate grammar</ref>
			<ref type="agi">speech recognize</ref>
			<ref type="application">AGI</ref>
		</see-also>
	</agi>
	<agi name="speech load grammar" language="en_US">
		<since>
			<version>1.6.0</version>
		</since>
		<synopsis>
			Loads a grammar.
		</synopsis>
		<syntax>
			<parameter name="grammar name" required="true" />
			<parameter name="path to grammar" required="true" />
		</syntax>
		<description>
			<para>Loads the specified grammar as the specified name.</para>
		</description>
		<see-also>
			<ref type="agi">speech create</ref>
			<ref type="agi">speech set</ref>
			<ref type="agi">speech destroy</ref>
			<ref type="agi">speech unload grammar</ref>
			<ref type="agi">speech activate grammar</ref>
			<ref type="agi">speech deactivate grammar</ref>
			<ref type="agi">speech recognize</ref>
			<ref type="application">AGI</ref>
		</see-also>
	</agi>
	<agi name="speech unload grammar" language="en_US">
		<since>
			<version>1.6.0</version>
		</since>
		<synopsis>
			Unloads a grammar.
		</synopsis>
		<syntax>
			<parameter name="grammar name" required="true" />
		</syntax>
		<description>
			<para>Unloads the specified grammar.</para>
		</description>
		<see-also>
			<ref type="agi">speech create</ref>
			<ref type="agi">speech set</ref>
			<ref type="agi">speech destroy</ref>
			<ref type="agi">speech load grammar</ref>
			<ref type="agi">speech activate grammar</ref>
			<ref type="agi">speech deactivate grammar</ref>
			<ref type="agi">speech recognize</ref>
			<ref type="application">AGI</ref>
		</see-also>
	</agi>
	<agi name="speech activate grammar" language="en_US">
		<since>
			<version>1.6.0</version>
		</since>
		<synopsis>
			Activates a grammar.
		</synopsis>
		<syntax>
			<parameter name="grammar name" required="true" />
		</syntax>
		<description>
			<para>Activates the specified grammar on the speech object.</para>
		</description>
		<see-also>
			<ref type="agi">speech create</ref>
			<ref type="agi">speech set</ref>
			<ref type="agi">speech destroy</ref>
			<ref type="agi">speech load grammar</ref>
			<ref type="agi">speech unload grammar</ref>
			<ref type="agi">speech deactivate grammar</ref>
			<ref type="agi">speech recognize</ref>
			<ref type="application">AGI</ref>
		</see-also>
	</agi>
	<agi name="speech deactivate grammar" language="en_US">
		<since>
			<version>1.6.0</version>
		</since>
		<synopsis>
			Deactivates a grammar.
		</synopsis>
		<syntax>
			<parameter name="grammar name" required="true" />
		</syntax>
		<description>
			<para>Deactivates the specified grammar on the speech object.</para>
		</description>
		<see-also>
			<ref type="agi">speech create</ref>
			<ref type="agi">speech set</ref>
			<ref type="agi">speech destroy</ref>
			<ref type="agi">speech load grammar</ref>
			<ref type="agi">speech unload grammar</ref>
			<ref type="agi">speech activate grammar</ref>
			<ref type="agi">speech recognize</ref>
			<ref type="application">AGI</ref>
		</see-also>
	</agi>
	<agi name="speech recognize" language="en_US">
		<since>
			<version>1.6.0</version>
		</since>
		<synopsis>
			Recognizes speech.
		</synopsis>
		<syntax>
			<parameter name="prompt" required="true" />
			<parameter name="timeout" required="true" />
			<parameter name="offset" />
		</syntax>
		<description>
			<para>Plays back given <replaceable>prompt</replaceable> while listening for
			speech and dtmf.</para>
		</description>
		<see-also>
			<ref type="agi">speech create</ref>
			<ref type="agi">speech set</ref>
			<ref type="agi">speech destroy</ref>
			<ref type="agi">speech load grammar</ref>
			<ref type="agi">speech unload grammar</ref>
			<ref type="agi">speech activate grammar</ref>
			<ref type="agi">speech deactivate grammar</ref>
			<ref type="application">AGI</ref>
		</see-also>
	</agi>
	<application name="AGI" language="en_US" module="res_agi">
		<since>
			<version>0.1.9</version>
		</since>
		<synopsis>
			Executes an AGI compliant application.
		</synopsis>
		<syntax>
			<parameter name="command" required="true">
				<para>How AGI should be invoked on the channel.</para>
			</parameter>
			<parameter name="args">
				<para>Arguments to pass to the AGI script or server.</para>
				<argument name="arg1" required="true" />
				<argument name="arg2" multiple="yes" />
			</parameter>
		</syntax>
		<description>
			<para>Executes an Asterisk Gateway Interface compliant
			program on a channel. AGI allows Asterisk to launch external programs written
			in any language to control a telephony channel, play audio, read DTMF digits,
			etc. by communicating with the AGI protocol.</para>
			<para>The following variants of AGI exist, and are chosen based on the value
			passed to <replaceable>command</replaceable>:</para>
			<enumlist>
				<enum name="AGI">
					<para>The classic variant of AGI, this will launch the script
					specified by <replaceable>command</replaceable> as a new process.
					Communication with the script occurs on <literal>stdin</literal> and
					<literal>stdout</literal>. If the full path to the script is not
					provided, the <directory>astagidir</directory> specified in
					<filename>asterisk.conf</filename> will be used.
					</para>
				</enum>
				<enum name="FastAGI">
					<para>Connect Asterisk to a FastAGI server using a TCP connection.
					The URI to the FastAGI server should be given in the form
					<literal>[scheme]://host.domain[:port][/script/name]</literal>,
					where <replaceable>scheme</replaceable> is either <literal>agi</literal>
					or <literal>hagi</literal>.</para>
					<para>In the case of <literal>hagi</literal>, an SRV lookup will be
					performed to try to connect to a list of FastAGI servers. The hostname in
					the URI must be prefixed with <literal>_agi._tcp</literal>. prior to the DNS resolution. For
					example, if you specify the URI <literal>hagi://agi.example.com/foo.agi</literal>
					the DNS query would be for <literal>_agi._tcp.agi.example.com</literal>. You
					will need to make sure this resolves correctly.</para>
				</enum>
				<enum name="AsyncAGI">
					<para>Use AMI to control the channel in AGI. AGI commands can be invoked
					using the <literal>AMI</literal> action, with a variety of AGI specific
					events passed back over the AMI connection. AsyncAGI should be invoked
					by passing <literal>agi:async</literal> to the <replaceable>command</replaceable>
					parameter.</para>
				</enum>
			</enumlist>
			<note>
			<para>As of <literal>1.6.0</literal>, this channel will
			not stop dialplan execution on hangup inside of this application. Dialplan
			execution will continue normally, even upon hangup until the AGI application
			signals a desire to stop (either by exiting or, in the case of a net script, by
			closing the connection).</para>
			<para>A locally executed AGI script will receive <literal>SIGHUP</literal> on
			hangup from the channel, except when it is already hung up. A fast AGI server will
			correspondingly receive a <literal>HANGUP</literal> inline with the command dialog.
			Both of these signals may be disabled by setting the <variable>AGISIGHUP</variable>
			channel variable to <literal>no</literal> before executing the AGI application.
			Alternatively, if you would like the AGI application to exit immediately
			after a channel hangup is detected, set the <variable>AGIEXITONHANGUP</variable>
			variable to <literal>yes</literal>.</para>
			</note>
			<example title="Start the AGI script /tmp/my-cool-script.sh, passing it the contents of the channel variable FOO">
			same => n,AGI(/tmp/my-cool-script.sh,${FOO})
			</example>
			<example title="Start the AGI script my-cool-script.sh located in the astagidir directory, specified in asterisk.conf">
			same => n,AGI(my-cool-script.sh)
			</example>
			<example title="Connect to the FastAGI server located at 127.0.0.1 and start the script awesome-script">
			same => n,AGI(agi://127.0.0.1/awesome-script)
			</example>
			<example title="Start AsyncAGI">
			same => n,AGI(agi:async)
			</example>
			<para>This application sets the following channel variable upon completion:</para>
			<variablelist>
				<variable name="AGISTATUS">
					<para>The status of the attempt to the run the AGI script
					text string, one of:</para>
					<value name="SUCCESS" />
					<value name="FAILURE" />
					<value name="NOTFOUND" />
					<value name="HANGUP" />
				</variable>
			</variablelist>
		</description>
		<see-also>
			<ref type="manager">AGI</ref>
			<ref type="managerEvent">AsyncAGIStart</ref>
			<ref type="managerEvent">AsyncAGIEnd</ref>
			<ref type="application">EAGI</ref>
			<ref type="filename">asterisk.conf</ref>
		</see-also>
	</application>
	<application name="EAGI" language="en_US" module="res_agi">
		<since>
			<version>0.4.0</version>
		</since>
		<synopsis>
			Executes an EAGI compliant application.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/application[@name='AGI']/syntax/parameter[@name='command'])" />
			<xi:include xpointer="xpointer(/docs/application[@name='AGI']/syntax/parameter[@name='args'])" />
		</syntax>
		<description>
			<para>Using 'EAGI' provides enhanced AGI, with incoming audio available out of band
			on file descriptor 3. In all other respects, it behaves in the same fashion as
			AGI. See the documentation for the <literal>AGI</literal> dialplan application for
			more information on invoking AGI on a channel.</para>
			<para>This application sets the following channel variable upon completion:</para>
			<xi:include xpointer="xpointer(/docs/application[@name='AGI']/description/variablelist)" />
		</description>
		<see-also>
			<ref type="application">AGI</ref>
		</see-also>
	</application>
	<manager name="AGI" language="en_US" module="res_agi">
		<since>
			<version>1.6.0</version>
		</since>
		<synopsis>
			Add an AGI command to execute by Async AGI.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="Channel" required="true">
				<para>Channel that is currently in Async AGI.</para>
			</parameter>
			<parameter name="Command" required="true">
				<para>Application to execute.</para>
			</parameter>
			<parameter name="CommandID">
				<para>This will be sent back in CommandID header of AsyncAGI exec
				event notification.</para>
			</parameter>
		</syntax>
		<description>
			<para>Add an AGI command to the execute queue of the channel in Async AGI.</para>
		</description>
		<see-also>
			<ref type="managerEvent">AsyncAGIStart</ref>
			<ref type="managerEvent">AsyncAGIExec</ref>
			<ref type="managerEvent">AsyncAGIEnd</ref>
		</see-also>
	</manager>
	<managerEvent language="en_US" name="AsyncAGIStart" module="res_agi">
		<managerEventInstance class="EVENT_FLAG_AGI" module="res_agi">
			<since>
				<version>12.0.0</version>
			</since>
			<synopsis>Raised when a channel starts AsyncAGI command processing.</synopsis>
			<syntax>
				<channel_snapshot/>
				<parameter name="Env">
					<para>URL encoded string read from the AsyncAGI server.</para>
				</parameter>
			</syntax>
			<see-also>
				<ref type="managerEvent">AsyncAGIEnd</ref>
				<ref type="managerEvent">AsyncAGIExec</ref>
				<ref type="application">AGI</ref>
				<ref type="manager">AGI</ref>
			</see-also>
		</managerEventInstance>
	</managerEvent>
	<managerEvent language="en_US" name="AsyncAGIEnd" module="res_agi">
		<managerEventInstance class="EVENT_FLAG_AGI" module="res_agi">
			<since>
				<version>12.0.0</version>
			</since>
			<synopsis>Raised when a channel stops AsyncAGI command processing.</synopsis>
			<syntax>
				<channel_snapshot/>
			</syntax>
			<see-also>
				<ref type="managerEvent">AsyncAGIStart</ref>
				<ref type="managerEvent">AsyncAGIExec</ref>
				<ref type="application">AGI</ref>
				<ref type="manager">AGI</ref>
			</see-also>
		</managerEventInstance>
	</managerEvent>
	<managerEvent language="en_US" name="AsyncAGIExec" module="res_agi">
		<managerEventInstance class="EVENT_FLAG_AGI" module="res_agi">
			<since>
				<version>12.0.0</version>
			</since>
			<synopsis>Raised when AsyncAGI completes an AGI command.</synopsis>
			<syntax>
				<channel_snapshot/>
				<parameter name="CommandID" required="false">
					<para>Optional command ID sent by the AsyncAGI server to identify the command.</para>
				</parameter>
				<parameter name="Result">
					<para>URL encoded result string from the executed AGI command.</para>
				</parameter>
			</syntax>
			<see-also>
				<ref type="managerEvent">AsyncAGIStart</ref>
				<ref type="managerEvent">AsyncAGIEnd</ref>
				<ref type="application">AGI</ref>
				<ref type="manager">AGI</ref>
			</see-also>
		</managerEventInstance>
	</managerEvent>
	<managerEvent language="en_US" name="AGIExecStart" module="res_agi">
		<managerEventInstance class="EVENT_FLAG_AGI" module="res_agi">
			<since>
				<version>12.0.0</version>
			</since>
			<synopsis>Raised when a received AGI command starts processing.</synopsis>
			<syntax>
				<channel_snapshot/>
				<parameter name="Command">
					<para>The AGI command as received from the external source.</para>
				</parameter>
				<parameter name="CommandId">
					<para>Random identification number assigned to the execution of this command.</para>
				</parameter>
			</syntax>
			<see-also>
				<ref type="managerEvent">AGIExecEnd</ref>
				<ref type="application">AGI</ref>
			</see-also>
		</managerEventInstance>
	</managerEvent>
	<managerEvent language="en_US" name="AGIExecEnd" module="res_agi">
		<managerEventInstance class="EVENT_FLAG_AGI" module="res_agi">
			<since>
				<version>12.0.0</version>
			</since>
			<synopsis>Raised when a received AGI command completes processing.</synopsis>
			<syntax>
				<channel_snapshot/>
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='AGIExecStart']/managerEventInstance/syntax/parameter)" />
				<parameter name="ResultCode">
					<para>The numeric result code from AGI</para>
				</parameter>
				<parameter name="Result">
					<para>The text result reason from AGI</para>
				</parameter>
			</syntax>
			<see-also>
				<ref type="managerEvent">AGIExecStart</ref>
				<ref type="application">AGI</ref>
			</see-also>
		</managerEventInstance>
	</managerEvent>
<module language="en_US" name="res_ari">
	<depend type="module">res_http_websocket</depend>
	<depend type="module">res_stasis</depend>
	<depend type="module">res_websocket_client</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="res_ari_applications">
	<depend type="module">res_ari</depend>
	<depend type="module">res_ari_model</depend>
	<depend type="module">res_stasis</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="res_ari_asterisk">
	<depend type="module">res_ari</depend>
	<depend type="module">res_ari_model</depend>
	<depend type="module">res_stasis</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="res_ari_bridges">
	<depend type="module">res_ari</depend>
	<depend type="module">res_ari_model</depend>
	<depend type="module">res_stasis</depend>
	<depend type="module">res_stasis_recording</depend>
	<depend type="module">res_stasis_playback</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="res_ari_channels">
	<depend type="module">res_ari</depend>
	<depend type="module">res_ari_model</depend>
	<depend type="module">res_stasis</depend>
	<depend type="module">res_stasis_answer</depend>
	<depend type="module">res_stasis_playback</depend>
	<depend type="module">res_stasis_recording</depend>
	<depend type="module">res_stasis_snoop</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="res_ari_device_states">
	<depend type="module">res_ari</depend>
	<depend type="module">res_ari_model</depend>
	<depend type="module">res_stasis</depend>
	<depend type="module">res_stasis_device_state</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="res_ari_endpoints">
	<depend type="module">res_ari</depend>
	<depend type="module">res_ari_model</depend>
	<depend type="module">res_stasis</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="res_ari_events">
	<depend type="module">res_ari</depend>
	<depend type="module">res_ari_model</depend>
	<depend type="module">res_stasis</depend>
	<depend type="module">res_http_websocket</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="res_ari_mailboxes">
	<depend type="module">res_ari</depend>
	<depend type="module">res_ari_model</depend>
	<depend type="module">res_stasis</depend>
	<depend type="module">res_stasis_mailbox</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="res_ari_model">
	<support_level>core</support_level>
</module>
<module language="en_US" name="res_ari_playbacks">
	<depend type="module">res_ari</depend>
	<depend type="module">res_ari_model</depend>
	<depend type="module">res_stasis</depend>
	<depend type="module">res_stasis_playback</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="res_ari_recordings">
	<depend type="module">res_ari</depend>
	<depend type="module">res_ari_model</depend>
	<depend type="module">res_stasis</depend>
	<depend type="module">res_stasis_recording</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="res_ari_sounds">
	<depend type="module">res_ari</depend>
	<depend type="module">res_ari_model</depend>
	<depend type="module">res_stasis</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="res_audiosocket">
	<support_level>extended</support_level>
</module>
<module language="en_US" name="res_calendar">
	<support_level>extended</support_level>
</module>
	<function name="CALENDAR_BUSY" language="en_US" module="res_calendar">
		<since>
			<version>1.8.0</version>
		</since>
		<synopsis>
			Determine if the calendar is marked busy at this time.
		</synopsis>
		<syntax>
			<parameter name="calendar" required="true" />
		</syntax>
		<description>
			<para>Check the specified calendar's current busy status.</para>
		</description>
		<see-also>
			<ref type="function">CALENDAR_EVENT</ref>
			<ref type="function">CALENDAR_QUERY</ref>
			<ref type="function">CALENDAR_QUERY_RESULT</ref>
			<ref type="function">CALENDAR_WRITE</ref>
		</see-also>
	</function>
	<function name="CALENDAR_EVENT" language="en_US" module="res_calendar">
		<since>
			<version>1.8.0</version>
		</since>
		<synopsis>
			Get calendar event notification data from a notification call.
		</synopsis>
		<syntax>
			<parameter name="field" required="true">
				<enumlist>
					<enum name="summary"><para>The VEVENT SUMMARY property or Exchange event 'subject'</para></enum>
					<enum name="description"><para>The text description of the event</para></enum>
					<enum name="organizer"><para>The organizer of the event</para></enum>
					<enum name="location"><para>The location of the event</para></enum>
					<enum name="categories"><para>The categories of the event</para></enum>
					<enum name="priority"><para>The priority of the event</para></enum>
					<enum name="calendar"><para>The name of the calendar associated with the event</para></enum>
					<enum name="uid"><para>The unique identifier for this event</para></enum>
					<enum name="start"><para>The start time of the event</para></enum>
					<enum name="end"><para>The end time of the event</para></enum>
					<enum name="busystate"><para>The busy state of the event 0=FREE, 1=TENTATIVE, 2=BUSY</para></enum>
				</enumlist>
			</parameter>
		</syntax>
		<description>
			<para>Whenever a calendar event notification call is made, the event data
			may be accessed with this function.</para>
		</description>
		<see-also>
			<ref type="function">CALENDAR_BUSY</ref>
			<ref type="function">CALENDAR_QUERY</ref>
			<ref type="function">CALENDAR_QUERY_RESULT</ref>
			<ref type="function">CALENDAR_WRITE</ref>
		</see-also>
	</function>
	<function name="CALENDAR_QUERY" language="en_US" module="res_calendar">
		<since>
			<version>1.8.0</version>
		</since>
		<synopsis>Query a calendar server and store the data on a channel
		</synopsis>
		<syntax>
			<parameter name="calendar" required="true">
				<para>The calendar that should be queried</para>
			</parameter>
			<parameter name="start" required="false">
				<para>The start time of the query (in seconds since epoch)</para>
			</parameter>
			<parameter name="end" required="false">
				<para>The end time of the query (in seconds since epoch)</para>
			</parameter>
		</syntax>
		<description>
			<para>Get a list of events in the currently accessible timeframe of the <replaceable>calendar</replaceable>
			The function returns the id for accessing the result with CALENDAR_QUERY_RESULT()</para>
		</description>
		<see-also>
			<ref type="function">CALENDAR_BUSY</ref>
			<ref type="function">CALENDAR_EVENT</ref>
			<ref type="function">CALENDAR_QUERY_RESULT</ref>
			<ref type="function">CALENDAR_WRITE</ref>
		</see-also>
	</function>
	<function name="CALENDAR_QUERY_RESULT" language="en_US" module="res_calendar">
		<since>
			<version>1.8.0</version>
		</since>
		<synopsis>
			Retrieve data from a previously run CALENDAR_QUERY() call
		</synopsis>
		<syntax>
			<parameter name="id" required="true">
				<para>The query ID returned by <literal>CALENDAR_QUERY</literal></para>
			</parameter>
			<parameter name="field" required="true">
				<enumlist>
					<enum name="getnum"><para>number of events occurring during time range</para></enum>
					<enum name="summary"><para>A summary of the event</para></enum>
					<enum name="description"><para>The full event description</para></enum>
					<enum name="organizer"><para>The event organizer</para></enum>
					<enum name="location"><para>The event location</para></enum>
					<enum name="categories"><para>The categories of the event</para></enum>
					<enum name="priority"><para>The priority of the event</para></enum>
					<enum name="calendar"><para>The name of the calendar associted with the event</para></enum>
					<enum name="uid"><para>The unique identifier for the event</para></enum>
					<enum name="start"><para>The start time of the event (in seconds since epoch)</para></enum>
					<enum name="end"><para>The end time of the event (in seconds since epoch)</para></enum>
					<enum name="busystate"><para>The busy status of the event 0=FREE, 1=TENTATIVE, 2=BUSY</para></enum>
				</enumlist>
			</parameter>
			<parameter name="entry" required="false" default="1">
				<para>Return data from a specific event returned by the query</para>
			</parameter>
		</syntax>
		<description>
			<para>After running CALENDAR_QUERY and getting a result <replaceable>id</replaceable>, calling
			<literal>CALENDAR_QUERY</literal> with that <replaceable>id</replaceable> and a <replaceable>field</replaceable>
			will return the data for that field. If multiple events matched the query, and <replaceable>entry</replaceable>
			is provided, information from that event will be returned.</para>
		</description>
		<see-also>
			<ref type="function">CALENDAR_BUSY</ref>
			<ref type="function">CALENDAR_EVENT</ref>
			<ref type="function">CALENDAR_QUERY</ref>
			<ref type="function">CALENDAR_WRITE</ref>
		</see-also>
	</function>
	<function name="CALENDAR_WRITE" language="en_US" module="res_calendar">
		<since>
			<version>1.8.0</version>
		</since>
		<synopsis>Write an event to a calendar</synopsis>
		<syntax>
			<parameter name="calendar" required="true">
				<para>The calendar to write to</para>
			</parameter>
			<parameter name="field" multiple="true" required="true">
				<enumlist>
					<enum name="summary"><para>A summary of the event</para></enum>
					<enum name="description"><para>The full event description</para></enum>
					<enum name="organizer"><para>The event organizer</para></enum>
					<enum name="location"><para>The event location</para></enum>
					<enum name="categories"><para>The categories of the event</para></enum>
					<enum name="priority"><para>The priority of the event</para></enum>
					<enum name="uid"><para>The unique identifier for the event</para></enum>
					<enum name="start"><para>The start time of the event (in seconds since epoch)</para></enum>
					<enum name="end"><para>The end time of the event (in seconds since epoch)</para></enum>
					<enum name="busystate"><para>The busy status of the event 0=FREE, 1=TENTATIVE, 2=BUSY</para></enum>
				</enumlist>
			</parameter>
		</syntax>
		<description>
			<example title="Set calendar fields">
			same => n,Set(CALENDAR_WRITE(calendar,field1,field2,field3)=val1,val2,val3)
			</example>
			<para>The field and value arguments can easily be set/passed using the HASHKEYS() and HASH() functions</para>
			<variablelist>
				<variable name="CALENDAR_SUCCESS">
					<para>The status of the write operation to the calendar</para>
					<value name="1" >
						The event was successfully written to the calendar.
					</value>
					<value name="0" >
						The event was not written to the calendar due to network issues, permissions, etc.
					</value>
				</variable>
			</variablelist>

		</description>
		<see-also>
			<ref type="function">CALENDAR_BUSY</ref>
			<ref type="function">CALENDAR_EVENT</ref>
			<ref type="function">CALENDAR_QUERY</ref>
			<ref type="function">CALENDAR_QUERY_RESULT</ref>
		</see-also>
	</function>

<module language="en_US" name="res_calendar_caldav">
	<depend>res_calendar</depend>
	<depend>neon</depend>
	<depend>ical</depend>
	<depend>libxml2</depend>
	<support_level>extended</support_level>
</module>
<module language="en_US" name="res_calendar_ews">
	<depend>res_calendar</depend>
	<depend>neon29</depend>
	<support_level>extended</support_level>
</module>
<module language="en_US" name="res_calendar_exchange">
	<depend>res_calendar</depend>
	<depend>neon</depend>
	<depend>ical</depend>
	<depend>iksemel</depend>
	<support_level>extended</support_level>
</module>
<module language="en_US" name="res_calendar_icalendar">
	<depend>res_calendar</depend>
	<depend>neon</depend>
	<depend>ical</depend>
	<support_level>extended</support_level>
</module>
<module language="en_US" name="res_cdrel_custom">
	<depend>sqlite3</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="res_chan_stats">
	<depend>res_statsd</depend>
	<defaultenabled>no</defaultenabled>
	<support_level>extended</support_level>
</module>
<module language="en_US" name="res_clialiases">
	<support_level>core</support_level>
</module>
<module language="en_US" name="res_cliexec">
	<defaultenabled>no</defaultenabled>
	<support_level>extended</support_level>
</module>
<module language="en_US" name="res_clioriginate">
	<support_level>core</support_level>
</module>
<module language="en_US" name="res_config_curl">
	<depend>func_curl</depend>
	<depend>res_curl</depend>
	<depend>curl</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="res_config_ldap">
	<depend>ldap</depend>
	<support_level>extended</support_level>
</module>
<module language="en_US" name="res_config_odbc">
	<depend>res_odbc</depend>
	<depend>generic_odbc</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="res_config_pgsql">
	<depend>pgsql</depend>
	<support_level>extended</support_level>
</module>
<module language="en_US" name="res_config_sqlite3">
	<depend>sqlite3</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="res_convert">
	<support_level>core</support_level>
</module>
<module language="en_US" name="res_corosync">
	<depend>corosync</depend>
	<defaultenabled>no</defaultenabled>
	<support_level>extended</support_level>
</module>
<module language="en_US" name="res_crypto">
	<depend>openssl</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="res_curl">
	<depend>curl</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="res_endpoint_stats">
	<depend>res_statsd</depend>
	<defaultenabled>no</defaultenabled>
	<support_level>extended</support_level>
</module>
<module language="en_US" name="res_fax">
	<support_level>core</support_level>
</module>
	<application name="ReceiveFAX" language="en_US" module="res_fax">
		<since>
			<version>11.0.0</version>
		</since>
		<synopsis>
			Receive a FAX and save as a TIFF/F file.
		</synopsis>
		<syntax>
			<parameter name="filename" required="true" />
			<parameter name="options">
				<optionlist>
					<option name="d">
						<para>Enable FAX debugging.</para>
					</option>
					<option name="f">
						<para>Allow audio fallback FAX transfer on T.38 capable channels.</para>
					</option>
					<option name="F">
						<para>Force usage of audio mode on T.38 capable channels.</para>
					</option>
					<option name="s">
						<para>Send progress Manager events (overrides statusevents setting in res_fax.conf).</para>
					</option>
				</optionlist>
			</parameter>
		</syntax>
		<description>
 			<para>This application is provided by res_fax, which is a FAX technology agnostic module
 			that utilizes FAX technology resource modules to complete a FAX transmission.</para>
			<para>Session arguments can be set by the FAXOPT function and to check results of the ReceiveFAX() application.</para>
			<variablelist>
				<variable name="FAXSTATUS">
					<para>Whether the fax transmission was successful</para>
					<value name="SUCCESS"/>
					<value name="FAILURE"/>
				</variable>
				<variable name="FAXERROR">
					<para>Description of what caused the fax to fail</para>
					<value name="MEMORY_ERROR"/>
					<value name="Channel Problems"/>
				</variable>
				<variable name="FAXSTATUSSTRING">
					<para>Detailed description of the status of the fax transmission</para>
				</variable>
				<variable name="LOCALSTATIONID">
					<para>Local Station ID</para>
				</variable>
				<variable name="REMOTESTATIONID">
					<para>Remote Station ID</para>
				</variable>
				<variable name="FAXPAGES">
					<para>Number of pages in the fax</para>
				</variable>
				<variable name="FAXBITRATE">
					<para>Bit rate of the fax transmission</para>
				</variable>
				<variable name="FAXRESOLUTION">
					<para>Resolution of the fax document</para>
				</variable>
				<variable name="FAXMODE">
					<para>Fax transmission mode</para>
					<value name="audio"/>
					<value name="T38"/>
				</variable>
			</variablelist>
		</description>
		<see-also>
			<ref type="application">SendFAX</ref>
			<ref type="function">FAXOPT</ref>
		</see-also>
	</application>
	<application name="SendFAX" language="en_US" module="res_fax">
		<since>
			<version>11.0.0</version>
		</since>
		<synopsis>
			Sends a specified TIFF/F file as a FAX.
		</synopsis>
		<syntax>
			<parameter name="filename" required="true" argsep="&amp;">
				<argument name="filename2" multiple="true">
					<para>TIFF file to send as a FAX.</para>
				</argument>
			</parameter>
			<parameter name="options">
				<optionlist>
					<option name="d">
						<para>Enable FAX debugging.</para>
					</option>
					<option name="f">
						<para>Allow audio fallback FAX transfer on T.38 capable channels.</para>
					</option>
					<option name="F">
						<para>Force usage of audio mode on T.38 capable channels.</para>
					</option>
					<option name="s">
						<para>Send progress Manager events (overrides statusevents setting in res_fax.conf).</para>
					</option>
					<option name="z">
						<para>Initiate a T.38 reinvite on the channel if the remote end does not.</para>
					</option>
				</optionlist>
			</parameter>
		</syntax>
		<description>
 			<para>This application is provided by res_fax, which is a FAX technology agnostic module
 			that utilizes FAX technology resource modules to complete a FAX transmission.</para>
			<para>Session arguments can be set by the FAXOPT function and to check results of the SendFAX() application.</para>
			<variablelist>
				<variable name="FAXSTATUS">
					<para>Whether the fax transmission was successful</para>
					<value name="SUCCESS"/>
					<value name="FAILURE"/>
				</variable>
				<variable name="FAXERROR">
					<para>Description of what caused the fax to fail</para>
					<value name="MEMORY_ERROR"/>
					<value name="Channel Problems"/>
				</variable>
				<variable name="FAXSTATUSSTRING">
					<para>Detailed description of the status of the fax transmission</para>
				</variable>
				<variable name="LOCALSTATIONID">
					<para>Local Station ID</para>
				</variable>
				<variable name="REMOTESTATIONID">
					<para>Remote Station ID</para>
				</variable>
				<variable name="FAXPAGES">
					<para>Number of pages in the fax</para>
				</variable>
				<variable name="FAXBITRATE">
					<para>Bit rate of the fax transmission</para>
				</variable>
				<variable name="FAXRESOLUTION">
					<para>Resolution of the fax document</para>
				</variable>
				<variable name="FAXMODE">
					<para>Fax transmission mode</para>
					<value name="audio"/>
					<value name="T38"/>
				</variable>
			</variablelist>
		</description>
		<see-also>
			<ref type="application">ReceiveFAX</ref>
			<ref type="function">FAXOPT</ref>
		</see-also>
	</application>
	<function name="FAXOPT" language="en_US" module="res_fax">
		<since>
			<version>11.0.0</version>
		</since>
		<synopsis>
			Gets/sets various pieces of information about a fax session.
		</synopsis>
		<syntax>
			<parameter name="item" required="true">
				<enumlist>
					<enum name="ecm">
						<para>R/W Error Correction Mode (ECM) enable with 'yes', disable with 'no'.</para>
					</enum>
					<enum name="error">
						<para>R/O FAX transmission error code upon failure.</para>
					</enum>
					<enum name="filename">
						<para>R/O Filename of the first file of the FAX transmission.</para>
					</enum>
					<enum name="filenames">
						<para>R/O Filenames of all of the files in the FAX transmission (comma separated).</para>
					</enum>
					<enum name="headerinfo">
						<para>R/W FAX header information.</para>
					</enum>
					<enum name="localstationid">
						<para>R/W Local Station Identification.</para>
					</enum>
					<enum name="minrate">
						<para>R/W Minimum transfer rate set before transmission.</para>
					</enum>
					<enum name="maxrate">
						<para>R/W Maximum transfer rate set before transmission.</para>
					</enum>
					<enum name="modem">
						<para>R/W Modem type (v17/v27/v29).</para>
					</enum>
					<enum name="gateway">
						<para>R/W T38 fax gateway, with optional fax activity timeout in seconds (yes[,timeout]/no)</para>
					</enum>
					<enum name="faxdetect">
						<para>R/W Enable FAX detect with optional timeout in seconds (yes,t38,cng[,timeout]/no)</para>
					</enum>
					<enum name="pages">
						<para>R/O Number of pages transferred.</para>
					</enum>
					<enum name="rate">
						<para>R/O Negotiated transmission rate.</para>
					</enum>
					<enum name="remotestationid">
						<para>R/O Remote Station Identification after transmission.</para>
					</enum>
					<enum name="resolution">
						<para>R/O Negotiated image resolution after transmission.</para>
					</enum>
					<enum name="sessionid">
						<para>R/O Session ID of the FAX transmission.</para>
					</enum>
					<enum name="status">
						<para>R/O Result Status of the FAX transmission.</para>
					</enum>
					<enum name="statusstr">
						<para>R/O Verbose Result Status of the FAX transmission.</para>
					</enum>
					<enum name="t38timeout">
						<para>R/W The timeout used for T.38 negotiation.</para>
					</enum>
					<enum name="negotiate_both">
						<para>R/W Upon v21 detection allow gateway to send negotiation requests to both T.38 endpoints, and do not wait on the "other" side to initiate (yes|no)</para>
					</enum>
				</enumlist>
			</parameter>
		</syntax>
		<description>
			<para>FAXOPT can be used to override the settings for a FAX session listed in <filename>res_fax.conf</filename>,
		   	it can also be used to retrieve information about a FAX session that has finished eg. pages/status.</para>
		</description>
		<see-also>
			<ref type="application">ReceiveFAX</ref>
			<ref type="application">SendFAX</ref>
		</see-also>
	</function>
	<manager name="FAXSessions" language="en_US" module="res_fax">
		<since>
			<version>13.0.0</version>
		</since>
		<synopsis>
			Lists active FAX sessions
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
		</syntax>
		<description>
			<para>Will generate a series of FAXSession events with information about each FAXSession. Closes with
			a FAXSessionsComplete event which includes a count of the included FAX sessions. This action works in
			the same manner as the CLI command 'fax show sessions'</para>
		</description>
	</manager>
	<managerEvent language="en_US" name="FAXSessionsEntry" module="res_fax">
		<managerEventInstance class="EVENT_FLAG_REPORTING" module="res_fax">
			<since>
				<version>13.0.0</version>
			</since>
			<synopsis>A single list item for the FAXSessions AMI command</synopsis>
			<syntax>
				<parameter name="ActionID" required="false"/>
				<parameter name="Channel">
					<para>Name of the channel responsible for the FAX session</para>
				</parameter>
				<parameter name="Technology">
					<para>The FAX technology that the FAX session is using</para>
				</parameter>
				<parameter name="SessionNumber">
					<para>The numerical identifier for this particular session</para>
				</parameter>
				<parameter name="SessionType">
					<para>FAX session passthru/relay type</para>
					<enumlist>
						<enum name="G.711" />
						<enum name="T.38" />
					</enumlist>
				</parameter>
				<parameter name="Operation">
					<para>FAX session operation type</para>
					<enumlist>
						<enum name="gateway" />
						<enum name="V.21" />
						<enum name="send" />
						<enum name="receive" />
						<enum name="none" />
					</enumlist>
				</parameter>
				<parameter name="State">
					<para>Current state of the FAX session</para>
					<enumlist>
						<enum name="Uninitialized" />
						<enum name="Initialized" />
						<enum name="Open" />
						<enum name="Active" />
						<enum name="Complete" />
						<enum name="Reserved" />
						<enum name="Inactive" />
						<enum name="Unknown" />
					</enumlist>
				</parameter>
				<parameter name="Files">
					<para>File or list of files associated with this FAX session</para>
				</parameter>
			</syntax>
		</managerEventInstance>
	</managerEvent>
	<managerEvent language="en_US" name="FAXSessionsComplete" module="res_fax">
		<managerEventInstance class="EVENT_FLAG_CALL" module="res_fax">
			<since>
				<version>13.0.0</version>
			</since>
			<synopsis>Raised when all FAXSession events are completed for a FAXSessions command</synopsis>
			<syntax>
				<parameter name="ActionID" required="false"/>
				<parameter name="Total">
					<para>Count of FAXSession events sent in response to FAXSessions action</para>
				</parameter>
			</syntax>
		</managerEventInstance>
	</managerEvent>
	<manager name="FAXSession" language="en_US" module="res_fax">
		<since>
			<version>13.0.0</version>
		</since>
		<synopsis>
			Responds with a detailed description of a single FAX session
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="SessionNumber" required="true">
				<para>The session ID of the fax the user is interested in.</para>
			</parameter>
		</syntax>
		<description>
			<para>Provides details about a specific FAX session. The response will include a common subset of
			the output from the CLI command 'fax show session &lt;session_number&gt;' for each technology. If the
			FAX technolgy used by this session does not include a handler for FAXSession, then this action
			will fail.</para>
		</description>
	</manager>
	<managerEvent language="en_US" name="FAXSession" module="res_fax">
		<managerEventInstance class="EVENT_FLAG_REPORTING" module="res_fax">
			<since>
				<version>13.0.0</version>
			</since>
			<synopsis>Raised in response to FAXSession manager command</synopsis>
			<syntax>
				<parameter name="ActionID" required="false"/>
				<parameter name="SessionNumber">
					<para>The numerical identifier for this particular session</para>
				</parameter>
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FAXSessionsEntry']/managerEventInstance/syntax/parameter[@name='Operation'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='FAXSessionsEntry']/managerEventInstance/syntax/parameter[@name='State'])" />
				<parameter name="ErrorCorrectionMode" required="false">
					<para>Whether error correcting mode is enabled for the FAX session. This field is not
					included when operation is 'V.21 Detect' or if operation is 'gateway' and state is
					'Uninitialized'
					</para>
					<enumlist>
						<enum name="yes" />
						<enum name="no" />
					</enumlist>
				</parameter>
				<parameter name="DataRate" required="false">
					<para>Bit rate of the FAX. This field is not included when operation is 'V.21 Detect' or
					if operation is 'gateway' and state is 'Uninitialized'.</para>
				</parameter>
				<parameter name="ImageResolution" required="false">
					<para>Resolution of each page of the FAX. Will be in the format of X_RESxY_RES. This field
					is not included if the operation is anything other than Receive/Transmit.</para>
				</parameter>
				<parameter name="PageNumber" required="false">
					<para>Current number of pages transferred during this FAX session. May change as the FAX
					progresses. This field is not included when operation is 'V.21 Detect' or if operation is
					'gateway' and state is 'Uninitialized'.</para>
				</parameter>
				<parameter name="FileName" required="false">
					<para>Filename of the image being sent/received for this FAX session. This field is not
					included if Operation isn't 'send' or 'receive'.</para>
				</parameter>
				<parameter name="PagesTransmitted" required="false">
					<para>Total number of pages sent during this session. This field is not included if
					Operation isn't 'send' or 'receive'. Will always be 0 for 'receive'.</para>
				</parameter>
				<parameter name="PagesReceived" required="false">
					<para>Total number of pages received during this session. This field is not included if
					Operation is not 'send' or 'receive'. Will be 0 for 'send'.</para>
				</parameter>
				<parameter name="TotalBadLines" required="false">
					<para>Total number of bad lines sent/received during this session. This field is not
					included if Operation is not 'send' or 'received'.</para>
				</parameter>
			</syntax>
		</managerEventInstance>
	</managerEvent>
	<manager name="FAXStats" language="en_US" module="res_fax">
		<since>
			<version>13.0.0</version>
		</since>
		<synopsis>
			Responds with fax statistics
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
		</syntax>
		<description>
			<para>Provides FAX statistics including the number of active sessions, reserved sessions, completed
			sessions, failed sessions, and the number of receive/transmit attempts. This command provides all
			of the non-technology specific information provided by the CLI command 'fax show stats'</para>
		</description>
	</manager>
	<managerEvent language="en_US" name="FAXStats" module="res_fax">
		<managerEventInstance class="EVENT_FLAG_REPORTING" module="res_fax">
			<since>
				<version>13.0.0</version>
			</since>
			<synopsis>Raised in response to FAXStats manager command</synopsis>
			<syntax>
				<parameter name="ActionID" required="false"/>
				<parameter name="CurrentSessions" required="true">
					<para>Number of active FAX sessions</para>
				</parameter>
				<parameter name="ReservedSessions" required="true">
					<para>Number of reserved FAX sessions</para>
				</parameter>
				<parameter name="TransmitAttempts" required="true">
					<para>Total FAX sessions for which Asterisk is/was the transmitter</para>
				</parameter>
				<parameter name="ReceiveAttempts" required="true">
					<para>Total FAX sessions for which Asterisk is/was the recipient</para>
				</parameter>
				<parameter name="CompletedFAXes" required="true">
					<para>Total FAX sessions which have been completed successfully</para>
				</parameter>
				<parameter name="FailedFAXes" required="true">
					<para>Total FAX sessions which failed to complete successfully</para>
				</parameter>
			</syntax>
		</managerEventInstance>
	</managerEvent>
<module language="en_US" name="res_fax_spandsp">
	<depend>spandsp</depend>
	<depend>res_fax</depend>
	<support_level>extended</support_level>
</module>
<module language="en_US" name="res_format_attr_celt">
	<support_level>core</support_level>
</module>
<module language="en_US" name="res_format_attr_g729">
	<support_level>core</support_level>
</module>
<module language="en_US" name="res_format_attr_h263">
	<support_level>core</support_level>
</module>
<module language="en_US" name="res_format_attr_h264">
	<support_level>core</support_level>
</module>
<module language="en_US" name="res_format_attr_ilbc">
	<support_level>core</support_level>
</module>
<module language="en_US" name="res_format_attr_opus">
	<support_level>core</support_level>
</module>
<module language="en_US" name="res_format_attr_silk">
	<support_level>core</support_level>
</module>
<module language="en_US" name="res_format_attr_siren14">
	<support_level>core</support_level>
</module>
<module language="en_US" name="res_format_attr_siren7">
	<support_level>core</support_level>
</module>
<module language="en_US" name="res_format_attr_vp8">
	<support_level>core</support_level>
</module>
<module language="en_US" name="res_geolocation">
	<depend>libxml2</depend>
	<depend>libxslt</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="res_hep">
	<support_level>extended</support_level>
</module>
	<configInfo name="res_hep" language="en_US">
		<synopsis>Resource for integration with Homer using HEPv3</synopsis>
		<configFile name="hep.conf">
			<configObject name="general">
				<since>
					<version>12.2.0</version>
				</since>
				<synopsis>General settings.</synopsis>
				<description><para>
					The <emphasis>general</emphasis> settings section contains information
					to configure Asterisk as a Homer capture agent.
					</para>
				</description>
				<configOption name="enabled" default="yes">
					<since>
						<version>12.2.0</version>
					</since>
					<synopsis>Enable or disable packet capturing.</synopsis>
					<description>
						<enumlist>
							<enum name="no" />
							<enum name="yes" />
						</enumlist>
					</description>
				</configOption>
				<configOption name="uuid_type" default="call-id">
					<since>
						<version>12.2.0</version>
					</since>
					<synopsis>The preferred type of UUID to pass to Homer.</synopsis>
					<description>
						<enumlist>
							<enum name="call-id"><para>Use the PJSIP Call-Id</para></enum>
							<enum name="channel"><para>Use the Asterisk channel name</para></enum>
						</enumlist>
					</description>
				</configOption>
				<configOption name="capture_address">
					<since>
						<version>13.16.0</version>
						<version>14.5.0</version>
					</since>
					<synopsis>The address and port of the Homer server to send packets to.</synopsis>
				</configOption>
				<configOption name="capture_password">
					<since>
						<version>12.2.0</version>
					</since>
					<synopsis>If set, the authentication password to send to Homer.</synopsis>
				</configOption>
				<configOption name="capture_id" default="0">
					<since>
						<version>12.2.0</version>
					</since>
					<synopsis>The ID for this capture agent.</synopsis>
				</configOption>
				<configOption name="capture_name" default="">
					<since>
						<version>18.16.0</version>
						<version>20.1.0</version>
					</since>
					<synopsis>The name for this capture agent.</synopsis>
				</configOption>
			</configObject>
		</configFile>
	</configInfo>
<module language="en_US" name="res_hep_pjsip">
	<depend>pjproject</depend>
	<depend>res_pjsip</depend>
	<depend>res_pjsip_session</depend>
	<depend>res_hep</depend>
	<support_level>extended</support_level>
</module>
<module language="en_US" name="res_hep_rtcp">
	<depend>res_hep</depend>
	<support_level>extended</support_level>
</module>
<module language="en_US" name="res_http_media_cache">
	<depend>curl</depend>
	<depend>res_curl</depend>
	<support_level>core</support_level>
</module>
	<configInfo name="res_http_media_cache" language="en_US">
		<synopsis>HTTP media cache</synopsis>
		<configFile name="res_http_media_cache.conf">
			<configObject name="general">
				<since>
					<version>18.18.0</version>
					<version>20.3.0</version>
				</since>
				<synopsis>General configuration</synopsis>
				<configOption name="timeout_secs" default="180">
					<since>
						<version>18.18.0</version>
						<version>20.3.0</version>
					</since>
					<synopsis>The maximum time the transfer is allowed to complete in seconds. See https://curl.se/libcurl/c/CURLOPT_TIMEOUT.html for details.</synopsis>
				</configOption>
				<configOption name="user_agent">
					<since>
						<version>18.18.0</version>
						<version>20.3.0</version>
					</since>
					<synopsis>The HTTP User-Agent to use for requests. See https://curl.se/libcurl/c/CURLOPT_USERAGENT.html for details.</synopsis>
				</configOption>
				<configOption name="follow_location" default="1">
					<since>
						<version>18.18.0</version>
						<version>20.3.0</version>
					</since>
					<synopsis>Follow HTTP 3xx redirects on requests. See https://curl.se/libcurl/c/CURLOPT_FOLLOWLOCATION.html for details.</synopsis>
				</configOption>
				<configOption name="max_redirects" default="8">
					<since>
						<version>18.18.0</version>
						<version>20.3.0</version>
					</since>
					<synopsis>The maximum number of redirects to follow. See https://curl.se/libcurl/c/CURLOPT_MAXREDIRS.html for details.</synopsis>
				</configOption>
				<configOption name="proxy">
					<since>
						<version>18.18.0</version>
						<version>20.3.0</version>
					</since>
					<synopsis>The proxy to use for requests. See https://curl.se/libcurl/c/CURLOPT_PROXY.html for details.</synopsis>
				</configOption>
				<configOption name="protocols">
					<since>
						<version>18.18.0</version>
						<version>20.3.0</version>
					</since>
					<synopsis>The comma separated list of allowed protocols for the request. Available with cURL 7.85.0 or later. See https://curl.se/libcurl/c/CURLOPT_PROTOCOLS_STR.html for details.</synopsis>
				</configOption>
				<configOption name="redirect_protocols">
					<since>
						<version>18.18.0</version>
						<version>20.3.0</version>
					</since>
					<synopsis>The comma separated list of allowed protocols for redirects. Available with cURL 7.85.0 or later. See https://curl.se/libcurl/c/CURLOPT_REDIR_PROTOCOLS_STR.html for details.</synopsis>
				</configOption>
				<configOption name="dns_cache_timeout_secs" default="60">
					<since>
						<version>18.18.0</version>
						<version>20.3.0</version>
					</since>
					<synopsis>The life-time for DNS cache entries. See https://curl.se/libcurl/c/CURLOPT_DNS_CACHE_TIMEOUT.html for details.</synopsis>
				</configOption>
			</configObject>
		</configFile>
	</configInfo>
<module language="en_US" name="res_http_post">
	<depend>gmime</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="res_http_websocket">
	<support_level>core</support_level>
</module>
<module language="en_US" name="res_limit">
	<support_level>core</support_level>
</module>
<module language="en_US" name="res_manager_devicestate">
	<support_level>core</support_level>
</module>
	<manager name="DeviceStateList" language="en_US" module="res_manager_devicestate">
		<since>
			<version>13.0.0</version>
		</since>
		<synopsis>
			List the current known device states.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
		</syntax>
		<description>
			<para>This will list out all known device states in a
			sequence of <replaceable>DeviceStateChange</replaceable> events.
			When finished, a <replaceable>DeviceStateListComplete</replaceable> event
			will be emitted.</para>
		</description>
		<see-also>
			<ref type="managerEvent">DeviceStateChange</ref>
			<ref type="function">DEVICE_STATE</ref>
		</see-also>
		<responses>
			<list-elements>
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='DeviceStateChange'])" />
			</list-elements>
			<managerEvent name="DeviceStateListComplete" language="en_US" module="res_manager_devicestate">
				<managerEventInstance class="EVENT_FLAG_COMMAND" module="res_manager_devicestate">
					<since>
						<version>13.0.0</version>
					</since>
					<synopsis>
						Indicates the end of the list the current known extension states.
					</synopsis>
					<syntax>
						<parameter name="EventList">
							<para>Conveys the status of the event list.</para>
						</parameter>
						<parameter name="ListItems">
							<para>Conveys the number of statuses reported.</para>
						</parameter>
					</syntax>
				</managerEventInstance>
			</managerEvent>
		</responses>
	</manager>
<module language="en_US" name="res_manager_presencestate">
	<support_level>core</support_level>
</module>
	<manager name="PresenceStateList" language="en_US" module="res_manager_presencestate">
		<since>
			<version>13.0.0</version>
		</since>
		<synopsis>
			List the current known presence states.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
		</syntax>
		<description>
			<para>This will list out all known presence states in a
			sequence of <replaceable>PresenceStateChange</replaceable> events.
			When finished, a <replaceable>PresenceStateListComplete</replaceable> event
			will be emitted.</para>
		</description>
		<see-also>
			<ref type="manager">PresenceState</ref>
			<ref type="managerEvent">PresenceStatus</ref>
			<ref type="function">PRESENCE_STATE</ref>
		</see-also>
		<responses>
			<list-elements>
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='PresenceStateChange'])" />
			</list-elements>
			<managerEvent name="PresenceStateListComplete" language="en_US" module="res_manager_presencestate">
				<managerEventInstance class="EVENT_FLAG_COMMAND" module="res_manager_presencestate">
					<since>
						<version>13.0.0</version>
					</since>
					<synopsis>
						Indicates the end of the list the current known extension states.
					</synopsis>
					<syntax>
						<parameter name="EventList">
							<para>Conveys the status of the event list.</para>
						</parameter>
						<parameter name="ListItems">
							<para>Conveys the number of statuses reported.</para>
						</parameter>
					</syntax>
				</managerEventInstance>
			</managerEvent>
		</responses>
	</manager>
<module language="en_US" name="res_musiconhold">
	<conflict>win32</conflict>
	<support_level>core</support_level>
</module>
	<application name="MusicOnHold" language="en_US" module="res_musiconhold">
		<since>
			<version>0.1.12</version>
		</since>
		<synopsis>
			Play Music On Hold indefinitely.
		</synopsis>
		<syntax>
			<parameter name="class" required="true" />
			<parameter name="duration" />
		</syntax>
		<description>
			<para>Plays hold music specified by class. If omitted, the default music
			source for the channel will be used. Change the default class with
			Set(CHANNEL(musicclass)=...). If duration is given, hold music will be played
			specified number of seconds. If duration is omitted, music plays indefinitely.
			Returns <literal>0</literal> when done, <literal>-1</literal> on hangup.</para>
			<para>This application does not automatically answer and should be preceeded by
			an application such as Answer() or Progress().</para>
		</description>
	</application>
	<application name="StartMusicOnHold" language="en_US" module="res_musiconhold">
		<since>
			<version>1.2.0</version>
		</since>
		<synopsis>
			Play Music On Hold.
		</synopsis>
		<syntax>
			<parameter name="class" required="true" />
		</syntax>
		<description>
			<para>Starts playing music on hold, uses default music class for channel.
			Starts playing music specified by class. If omitted, the default music
			source for the channel will be used. Always returns <literal>0</literal>.</para>
		</description>
	</application>
	<application name="StopMusicOnHold" language="en_US" module="res_musiconhold">
		<since>
			<version>1.2.0</version>
		</since>
		<synopsis>
			Stop playing Music On Hold.
		</synopsis>
		<syntax />
		<description>
			<para>Stops playing music on hold.</para>
		</description>
	</application>
<module language="en_US" name="res_mutestream">
	<support_level>core</support_level>
</module>
	<function name="MUTEAUDIO" language="en_US" module="res_mutestream">
		<since>
			<version>1.8.0</version>
		</since>
		<synopsis>
			Muting audio streams in the channel
		</synopsis>
		<syntax>
			<parameter name="direction" required="true">
				<para>Must be one of </para>
				<enumlist>
					<enum name="in">
						<para>Inbound stream (to the PBX)</para>
					</enum>
					<enum name="out">
						<para>Outbound stream (from the PBX)</para>
					</enum>
					<enum name="all">
						<para>Both streams</para>
					</enum>
				</enumlist>
			</parameter>
		</syntax>
		<description>
			<para>The MUTEAUDIO function can be used to mute inbound (to the PBX) or outbound audio in a call.</para>
			<example title="Mute incoming audio">
			exten => s,1,Set(MUTEAUDIO(in)=on)
			</example>
			<example title="Do not mute incoming audio">
			exten => s,1,Set(MUTEAUDIO(in)=off)
			</example>
		</description>
	</function>
	<manager name="MuteAudio" language="en_US" module="res_mutestream">
		<since>
			<version>1.8.0</version>
		</since>
		<synopsis>
			Mute an audio stream.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="Channel" required="true">
				<para>The channel you want to mute.</para>
			</parameter>
			<parameter name="Direction" required="true">
				<enumlist>
					<enum name="in">
						<para>Set muting on inbound audio stream. (to the PBX)</para>
					</enum>
					<enum name="out">
						<para>Set muting on outbound audio stream. (from the PBX)</para>
					</enum>
					<enum name="all">
						<para>Set muting on inbound and outbound audio streams.</para>
					</enum>
				</enumlist>
			</parameter>
			<parameter name="State" required="true">
				<enumlist>
					<enum name="on">
						<para>Turn muting on.</para>
					</enum>
					<enum name="off">
						<para>Turn muting off.</para>
					</enum>
				</enumlist>
			</parameter>
		</syntax>
		<description>
			<para>Mute an incoming or outgoing audio stream on a channel.</para>
		</description>
	</manager>
<module language="en_US" name="res_mwi_devstate">
	<support_level>core</support_level>
</module>
<module language="en_US" name="res_mwi_external">
	<defaultenabled>no</defaultenabled>
	<support_level>core</support_level>
</module>
	<configInfo name="res_mwi_external" language="en_US">
		<synopsis>Core external MWI support</synopsis>
		<configFile name="sorcery.conf">
			<configObject name="mailboxes">
				<synopsis>Persistent cache of external MWI Mailboxs.</synopsis>
				<description>
					<para>Allows the alteration of sorcery backend mapping for
					the persistent cache of external MWI mailboxes.</para>
				</description>
			</configObject>
		</configFile>
	</configInfo>
<module language="en_US" name="res_mwi_external_ami">
	<depend>res_mwi_external</depend>
	<support_level>core</support_level>
</module>
	<manager name="MWIGet" language="en_US" module="res_mwi_external_ami">
		<since>
			<version>12.1.0</version>
		</since>
		<synopsis>
			Get selected mailboxes with message counts.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="Mailbox" required="true">
				<para>Mailbox ID in the form of
				/<replaceable>regex</replaceable>/ for all mailboxes matching the regular
				expression.  Otherwise it is for a specific mailbox.</para>
			</parameter>
		</syntax>
		<description>
			<para>Get a list of mailboxes with their message counts.</para>
		</description>
	</manager>
	<managerEvent language="en_US" name="MWIGet" module="res_mwi_external_ami">
		<managerEventInstance class="EVENT_FLAG_REPORTING" module="res_mwi_external_ami">
			<since>
				<version>12.1.0</version>
			</since>
			<synopsis>
				Raised in response to a MWIGet command.
			</synopsis>
			<syntax>
				<parameter name="ActionID" required="false"/>
				<parameter name="Mailbox">
					<para>Specific mailbox ID.</para>
				</parameter>
				<parameter name="OldMessages">
					<para>The number of old messages in the mailbox.</para>
				</parameter>
				<parameter name="NewMessages">
					<para>The number of new messages in the mailbox.</para>
				</parameter>
			</syntax>
			<see-also>
				<ref type="manager">MWIGet</ref>
			</see-also>
		</managerEventInstance>
	</managerEvent>
	<managerEvent language="en_US" name="MWIGetComplete" module="res_mwi_external_ami">
		<managerEventInstance class="EVENT_FLAG_REPORTING" module="res_mwi_external_ami">
			<since>
				<version>12.1.0</version>
			</since>
			<synopsis>
				Raised in response to a MWIGet command.
			</synopsis>
			<syntax>
				<parameter name="ActionID" required="false"/>
				<parameter name="EventList" />
				<parameter name="ListItems">
					<para>The number of mailboxes reported.</para>
				</parameter>
			</syntax>
			<see-also>
				<ref type="manager">MWIGet</ref>
			</see-also>
		</managerEventInstance>
	</managerEvent>
	<manager name="MWIDelete" language="en_US" module="res_mwi_external_ami">
		<since>
			<version>12.1.0</version>
		</since>
		<synopsis>
			Delete selected mailboxes.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<xi:include xpointer="xpointer(/docs/manager[@name='MWIGet']/syntax/parameter[@name='Mailbox'])" />
		</syntax>
		<description>
			<para>Delete the specified mailboxes.</para>
		</description>
	</manager>
	<manager name="MWIUpdate" language="en_US" module="res_mwi_external_ami">
		<since>
			<version>12.1.0</version>
		</since>
		<synopsis>
			Update the mailbox message counts.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="Mailbox" required="true">
				<para>Specific mailbox ID.</para>
			</parameter>
			<parameter name="OldMessages">
				<para>The number of old messages in the mailbox.  Defaults
				to zero if missing.</para>
			</parameter>
			<parameter name="NewMessages">
				<para>The number of new messages in the mailbox.  Defaults
				to zero if missing.</para>
			</parameter>
		</syntax>
		<description>
			<para>Update the mailbox message counts.</para>
		</description>
	</manager>
<module language="en_US" name="res_odbc">
	<depend>generic_odbc</depend>
	<depend>res_odbc_transaction</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="res_odbc_transaction">
	<depend>generic_odbc</depend>
	<support_level>core</support_level>
</module>
	<function name="ODBC" language="en_US" module="res_odbc_transaction">
		<since>
			<version>13.8.0</version>
		</since>
		<synopsis>
			Controls ODBC transaction properties.
		</synopsis>
		<syntax>
			<parameter name="property" required="true">
				<enumlist>
					<enum name="transaction">
						<para>Gets or sets the active transaction ID.  If set, and the transaction ID does not
						exist and a <replaceable>database name</replaceable> is specified as an argument, it will be created.</para>
					</enum>
					<enum name="forcecommit">
						<para>Controls whether a transaction will be automatically committed when the channel
						hangs up.  Defaults to forcecommit value from the relevant DSN (which defaults to false).
						If a <replaceable>transaction ID</replaceable> is specified in the optional argument,
						the property will be applied to that ID, otherwise to the current active ID.</para>
					</enum>
					<enum name="isolation">
						<para>Controls the data isolation on uncommitted transactions.  May be one of the
						following: <literal>read_committed</literal>, <literal>read_uncommitted</literal>,
						<literal>repeatable_read</literal>, or <literal>serializable</literal>.  Defaults to the
						database setting in <filename>res_odbc.conf</filename> or <literal>read_committed</literal>
						if not specified.  If a <replaceable>transaction ID</replaceable> is specified as an optional argument, it will be
						applied to that ID, otherwise the current active ID.</para>
					</enum>
				</enumlist>
			</parameter>
			<parameter name="argument" required="false" />
		</syntax>
		<description>
			<para>The ODBC() function allows setting several properties to influence how a connected
			database processes transactions.</para>
		</description>
	</function>
	<application name="ODBC_Commit" language="en_US" module="res_odbc_transaction">
		<since>
			<version>13.8.0</version>
		</since>
		<synopsis>
			Commits a currently open database transaction.
		</synopsis>
		<syntax>
			<parameter name="transaction ID" required="no" />
		</syntax>
		<description>
			<para>Commits the database transaction specified by <replaceable>transaction ID</replaceable>
			or the current active transaction, if not specified.</para>
		</description>
	</application>
	<application name="ODBC_Rollback" language="en_US" module="res_odbc_transaction">
		<since>
			<version>13.8.0</version>
		</since>
		<synopsis>
			Rollback a currently open database transaction.
		</synopsis>
		<syntax>
			<parameter name="transaction ID" required="no" />
		</syntax>
		<description>
			<para>Rolls back the database transaction specified by <replaceable>transaction ID</replaceable>
			or the current active transaction, if not specified.</para>
		</description>
	</application>
<module language="en_US" name="res_parking">
	<depend>bridge_holding</depend>
	<support_level>core</support_level>
</module>
	<configInfo name="res_parking" language="en_US">
		<configFile name="res_parking.conf">
			<configObject name="globals">
				<since>
					<version>12.0.0</version>
				</since>
				<synopsis>Options that apply to every parking lot</synopsis>
				<configOption name="parkeddynamic">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Enables dynamically created parkinglots.</synopsis>
					<description>
						<para>If the option is enabled then the following variables can
							be used to dynamically create new parking lots.
						</para>
						<para>The <variable>PARKINGDYNAMIC</variable> variable specifies the
							parking lot to use as a template to create a dynamic parking lot. It
							is an error to specify a non-existent parking lot for the template.
							If not set then the default parking lot is used as the template.
						</para>
						<para>The <variable>PARKINGDYNCONTEXT</variable> variable specifies the
							dialplan context to use for the newly created dynamic parking lot. If
							not set then the context from the parking lot template is used. The
							context is created if it does not already exist and the new parking lot
							needs to create extensions.
						</para>
						<para>The <variable>PARKINGDYNEXTEN</variable> variable specifies the
							<literal>parkext</literal> to use for the newly created dynamic
							parking lot. If not set then the <literal>parkext</literal> is used from
							the parking lot template. If the template does not specify a
							<literal>parkext</literal> then no extensions are created for the newly
							created parking lot. The dynamic parking lot cannot be created if it
							needs to create extensions that overlap existing parking lot extensions.
							The only exception to this is for the <literal>parkext</literal>
							extension and only if neither of the overlaping parking lot's
							<literal>parkext</literal> is exclusive.
						</para>
						<para>The <variable>PARKINGDYNPOS</variable> variable specifies the
							parking positions to use for the newly created dynamic parking lot. If
							not set then the <literal>parkpos</literal> from the parking lot template
							is used.
						</para>
					</description>
				</configOption>
			</configObject>
			<configObject name="parking_lot">
				<since>
					<version>12.0.0</version>
				</since>
				<synopsis>Defined parking lots for res_parking to use to park calls on</synopsis>
				<configOption name="context" default="parkedcalls">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>The name of the context where calls are parked and picked up from.</synopsis>
					<description><para>This option is only used if parkext is set.</para></description>
				</configOption>
				<configOption name="parkext">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Extension to park calls to this parking lot.</synopsis>
					<description>
						<para>If this option is used, this extension will automatically
							be created to place calls into parking lots. In addition, if
							<literal>parkext_exclusive</literal> is set for this parking
							lot, the name of the parking lot will be included in the
							application's arguments so that it only parks to this parking
							lot. The extension will be created in <literal>context</literal>.
							Using this option also creates extensions for retrieving
							parked calls from the parking spaces in the same context.
						</para>
						<note>
							<para>Generated parking extensions cannot overlap.
								The only exception is if neither overlapping
								<literal>parkext</literal> is exclusive.
							</para>
						</note>
					</description>
				</configOption>
				<configOption name="parkext_exclusive" default="no">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>If yes, the extension registered as parkext will park exclusively to this parking lot.</synopsis>
				</configOption>
				<configOption name="parkpos" default="701-750">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Numerical range of parking spaces which can be used to retrieve parked calls.</synopsis>
					<description>
						<para>If <literal>parkext</literal> is set, these extensions
							will automatically be mapped in <literal>context</literal>
							in order to pick up calls parked to these parking spaces.
						</para>
					</description>
				</configOption>
				<configOption name="parkinghints" default="no">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>If yes, this parking lot will add hints automatically for parking spaces.</synopsis>
				</configOption>
				<configOption name="parkingtime" default="45">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Amount of time a call will remain parked before giving up (in seconds).</synopsis>
				</configOption>
				<configOption name="parkedmusicclass">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Which music class to use for parked calls. They will use the default if unspecified.</synopsis>
				</configOption>
				<configOption name="comebacktoorigin" default="yes">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Determines what should be done with the parked channel if no one picks it up before it times out.</synopsis>
					<description><para>Valid Options:</para>
						<enumlist>
							<enum name="yes">
								<para>Automatically have the parked channel dial the device that parked the call with dial
									timeout set by the <literal>parkingtime</literal> option. When the call times out an extension
									to dial the PARKER will automatically be created in the <literal>park-dial</literal> context with
									an extension of the flattened parker device name. If the call is not answered, the parked channel
									that is timing out will continue in the dial plan at that point if there are more priorities in
									the extension (which won't be the case unless the dialplan deliberately includes such priorities
									in the <literal>park-dial</literal> context through pattern matching or deliberately written
									flattened peer extensions).</para>
							</enum>
							<enum name="no">
								<para>Place the call into the PBX at <literal>comebackcontext</literal> instead. The extension will
									still be set as the flattened peer name. If an extension the flattened peer name isn't available
									then it will fall back to the <literal>s</literal> extension. If that also is unavailable it will
									attempt to fall back to <literal>s@default</literal>. The normal dial extension will still be
									created in the <literal>park-dial</literal> context with the extension also being the flattened
									peer name.</para>
							</enum>
						</enumlist>
						<note><para>Flattened Peer Names - Extensions can not include slash characters since those are used for pattern
							matching. When a peer name is flattened, slashes become underscores. For example if the parker of a call
							is called <literal>SIP/0004F2040001</literal> then flattened peer name and therefor the extensions created
							and used on timeouts will be <literal>SIP_0004F204001</literal>.</para></note>
						<note><para>When parking times out and the channel returns to the dial plan, the following variables are set:
						</para></note>
						<variablelist>
							<variable name="PARKING_SPACE">
								<para>extension that the call was parked in prior to timing out.</para>
							</variable>
							<variable name="PARKEDLOT">
								<para>name of the lot that the call was parked in prior to timing out.</para>
							</variable>
							<variable name="PARKER">
								<para>The device that parked the call</para>
							</variable>
							<variable name="PARKER_FLAT">
								<para>The flat version of <variable>PARKER</variable></para>
							</variable>
						</variablelist>
					</description>
				</configOption>
				<configOption name="comebackdialtime" default="30">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Timeout for the Dial extension created to call back the parker when a parked call times out.</synopsis>
				</configOption>
				<configOption name="comebackcontext" default="parkedcallstimeout">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Context where parked calls will enter the PBX on timeout when comebacktoorigin=no</synopsis>
					<description><para>The extension the call enters will prioritize the flattened peer name in this context.
						If the flattened peer name extension is unavailable, then the 's' extension in this context will be
						used. If that also is unavailable, the 's' extension in the 'default' context will be used.</para>
					</description>
				</configOption>
				<configOption name="courtesytone">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>If the name of a sound file is provided, use this as the courtesy tone</synopsis>
					<description><para>By default, this tone is only played to the caller of a parked call. Who receives the tone
						can be changed using the <literal>parkedplay</literal> option.</para>
					</description>
				</configOption>
				<configOption name="parkedplay" default="caller">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Who we should play the courtesytone to on the pickup of a parked call from this lot</synopsis>
					<description>
						<enumlist>
							<enum name="no"><para>Apply to neither side.</para></enum>
							<enum name="caller"><para>Apply only to the call connecting with the call coming out of the parking lot.</para></enum>
							<enum name="callee"><para>Apply only to the call coming out of the parking lot.</para></enum>
							<enum name="both"><para>Apply to both sides.</para></enum>
						</enumlist>
						<note><para>If courtesy tone is not specified then this option will be ignored.</para></note>
					</description>
				</configOption>
				<configOption name="parkedcalltransfers" default="no">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Who to apply the DTMF transfer features to when parked calls are picked up or timeout.</synopsis>
					<description>
						<xi:include xpointer="xpointer(/docs/configInfo[@name='res_parking']/configFile[@name='res_parking.conf']/configObject[@name='parking_lot']/configOption[@name='parkedplay']/description/enumlist)" />
					</description>
				</configOption>
				<configOption name="parkedcallreparking" default="no">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Who to apply the DTMF parking feature to when parked calls are picked up or timeout.</synopsis>
					<description>
						<xi:include xpointer="xpointer(/docs/configInfo[@name='res_parking']/configFile[@name='res_parking.conf']/configObject[@name='parking_lot']/configOption[@name='parkedplay']/description/enumlist)" />
					</description>
				</configOption>
				<configOption name="parkedcallhangup" default="no">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Who to apply the DTMF hangup feature to when parked calls are picked up or timeout.</synopsis>
					<description>
						<xi:include xpointer="xpointer(/docs/configInfo[@name='res_parking']/configFile[@name='res_parking.conf']/configObject[@name='parking_lot']/configOption[@name='parkedplay']/description/enumlist)" />
					</description>
				</configOption>
				<configOption name="parkedcallrecording" default="no">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Who to apply the DTMF MixMonitor recording feature to when parked calls are picked up or timeout.</synopsis>
					<description>
						<xi:include xpointer="xpointer(/docs/configInfo[@name='res_parking']/configFile[@name='res_parking.conf']/configObject[@name='parking_lot']/configOption[@name='parkedplay']/description/enumlist)" />
					</description>
				</configOption>
				<configOption name="findslot" default="first">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Rule to use when trying to figure out which parking space a call should be parked with.</synopsis>
					<description>
						<enumlist>
							<enum name="first"><para>Always try to place in the lowest available space in the parking lot</para></enum>
							<enum name="next"><para>Track the last parking space used and always attempt to use the one immediately after.
							</para></enum>
						</enumlist>
					</description>
				</configOption>
			</configObject>
		</configFile>
	</configInfo>
<module language="en_US" name="res_phoneprov">
	<support_level>extended</support_level>
</module>
	<function name="PP_EACH_EXTENSION" language="en_US" module="res_phoneprov">
		<since>
			<version>1.6.1.0</version>
		</since>
		<synopsis>
			Execute specified template for each extension.
		</synopsis>
		<syntax>
			<parameter name="mac" required="true" />
			<parameter name="template_file" required="true" />
		</syntax>
		<description>
			<para>Output the specified template for each extension associated with the specified MAC address.</para>
		</description>
	</function>
	<function name="PP_EACH_USER" language="en_US" module="res_phoneprov">
		<since>
			<version>1.6.0</version>
		</since>
		<synopsis>
			Generate a string for each phoneprov user.
		</synopsis>
		<syntax>
			<parameter name="string" required="true" />
			<parameter name="exclude_mac" required="true" />
		</syntax>
		<description>
			<para>Pass in a string, with phoneprov variables you want substituted in the format of
			%{VARNAME}, and you will get the string rendered for each user in phoneprov
			excluding ones with MAC address <replaceable>exclude_mac</replaceable>. Probably not
			useful outside of res_phoneprov.</para>
			<para>Example: ${PP_EACH_USER(&lt;item&gt;&lt;fn&gt;%{DISPLAY_NAME}&lt;/fn&gt;&lt;/item&gt;|${MAC})</para>
		</description>
	</function>
<module language="en_US" name="res_pjproject">
	<depend>pjproject</depend>
	<depend>res_sorcery_config</depend>
	<support_level>core</support_level>
</module>
	<configInfo name="res_pjproject" language="en_US">
		<synopsis>pjproject common configuration</synopsis>
		<configFile name="pjproject.conf">
			<configObject name="startup">
				<synopsis>Asterisk startup time options for PJPROJECT</synopsis>
				<description>
					<note><para>The id of this object, as well as its type, must be
					'startup' or it won't be found.</para></note>
				</description>
				<configOption name="type">
					<synopsis>Must be of type 'startup'.</synopsis>
				</configOption>
				<configOption name="log_level" default="2">
					<synopsis>Initial maximum pjproject logging level to log.</synopsis>
					<description>
						<para>Valid values are: 0-6, and default</para>
					<note><para>
						This option is needed very early in the startup process
						so it can only be read from config files because the
						modules for other methods have not been loaded yet.
					</para></note>
					</description>
				</configOption>
			</configObject>
			<configObject name="log_mappings">
				<since>
					<version>13.8.0</version>
				</since>
				<synopsis>PJPROJECT to Asterisk Log Level Mapping</synopsis>
				<description><para>Warnings and errors in the pjproject libraries are generally handled
					by Asterisk.  In many cases, Asterisk wouldn't even consider them to
					be warnings or errors so the messages emitted by pjproject directly
					are either superfluous or misleading.  The 'log_mappings'
					object allows mapping the pjproject levels to Asterisk levels, or nothing.
					</para>
					<note><para>The id of this object, as well as its type, must be
					'log_mappings' or it won't be found.</para></note>
				</description>
				<configOption name="type">
					<since>
						<version>13.8.0</version>
					</since>
					<synopsis>Must be of type 'log_mappings'.</synopsis>
				</configOption>
				<configOption name="asterisk_error" default="0,1">
					<since>
						<version>13.8.0</version>
					</since>
					<synopsis>A comma separated list of pjproject log levels to map to Asterisk LOG_ERROR.</synopsis>
				</configOption>
				<configOption name="asterisk_warning" default="2">
					<since>
						<version>13.8.0</version>
					</since>
					<synopsis>A comma separated list of pjproject log levels to map to Asterisk LOG_WARNING.</synopsis>
				</configOption>
				<configOption name="asterisk_notice" default="">
					<since>
						<version>13.8.0</version>
					</since>
					<synopsis>A comma separated list of pjproject log levels to map to Asterisk LOG_NOTICE.</synopsis>
				</configOption>
				<configOption name="asterisk_verbose" default="">
					<since>
						<version>13.8.0</version>
					</since>
					<synopsis>A comma separated list of pjproject log levels to map to Asterisk LOG_VERBOSE.</synopsis>
				</configOption>
				<configOption name="asterisk_debug" default="3,4">
					<since>
						<version>13.8.0</version>
					</since>
					<synopsis>A comma separated list of pjproject log levels to map to Asterisk LOG_DEBUG.</synopsis>
				</configOption>
				<configOption name="asterisk_trace" default="5,6">
					<since>
						<version>16.21.0</version>
						<version>18.7.0</version>
					</since>
					<synopsis>A comma separated list of pjproject log levels to map to Asterisk LOG_TRACE.</synopsis>
				</configOption>
			</configObject>
		</configFile>
	</configInfo>
<module language="en_US" name="res_pjsip">
	<depend>pjproject</depend>
	<depend>res_pjproject</depend>
	<depend>res_sorcery_config</depend>
	<depend>res_sorcery_memory</depend>
	<depend>res_sorcery_astdb</depend>
	<use type="module">res_statsd</use>
	<use type="module">res_geolocation</use>
	<support_level>core</support_level>
</module>
<module language="en_US" name="res_pjsip_acl">
	<depend>pjproject</depend>
	<depend>res_pjsip</depend>
	<support_level>core</support_level>
</module>
	<configInfo name="res_pjsip_acl" language="en_US">
		<synopsis>SIP ACL module</synopsis>
		<description><para>
			<emphasis>ACL</emphasis>
			</para><para>
			The ACL module used by <literal>res_pjsip</literal>. This module is
			independent of <literal>endpoints</literal> and operates on all inbound
			SIP communication using res_pjsip.
			</para><para>
			There are two main ways of defining your ACL with the options
			provided. You can use the <literal>permit</literal> and <literal>deny</literal> options
			which act on <emphasis>IP</emphasis> addresses, or the <literal>contactpermit</literal>
			and <literal>contactdeny</literal> options which act on <emphasis>Contact header</emphasis>
			addresses in incoming REGISTER requests. You can combine the various options to
			create a mixed ACL.
			</para><para>
			Additionally, instead of defining an ACL with options, you can reference IP or
			Contact header ACLs from the file <filename>acl.conf</filename> by using the <literal>acl</literal>
			or <literal>contactacl</literal> options.
		</para></description>
		<configFile name="pjsip.conf">
			<configObject name="acl">
				<since>
					<version>12.0.0</version>
				</since>
				<synopsis>Access Control List</synopsis>
				<configOption name="acl">
					<since>
						<version>12.2.0</version>
					</since>
					<synopsis>List of IP ACL section names in acl.conf</synopsis>
					<description><para>
						This matches sections configured in <literal>acl.conf</literal>. The value is
						defined as a list of comma-delimited section names.
					</para></description>
				</configOption>
				<configOption name="contact_acl">
					<since>
						<version>12.2.0</version>
					</since>
					<synopsis>List of Contact ACL section names in acl.conf</synopsis>
					<description><para>
						This matches sections configured in <literal>acl.conf</literal>. The value is
						defined as a list of comma-delimited section names.
					</para></description>
				</configOption>
				<configOption name="contact_deny">
					<since>
						<version>12.2.0</version>
					</since>
					<synopsis>List of Contact header addresses to deny</synopsis>
					<description><para>
						The value is a comma-delimited list of IP addresses. IP addresses may
						have a subnet mask appended. The subnet mask may be written in either
						CIDR or dotted-decimal notation. Separate the IP address and subnet
						mask with a slash ('/')
					</para></description>
				</configOption>
				<configOption name="contact_permit">
					<since>
						<version>12.2.0</version>
					</since>
					<synopsis>List of Contact header addresses to permit</synopsis>
					<description><para>
						The value is a comma-delimited list of IP addresses. IP addresses may
						have a subnet mask appended. The subnet mask may be written in either
						CIDR or dotted-decimal notation. Separate the IP address and subnet
						mask with a slash ('/')
					</para></description>
				</configOption>
				<configOption name="deny">
					<since>
						<version>12.2.0</version>
					</since>
					<synopsis>List of IP addresses to deny access from</synopsis>
					<description><para>
						The value is a comma-delimited list of IP addresses. IP addresses may
						have a subnet mask appended. The subnet mask may be written in either
						CIDR or dotted-decimal notation. Separate the IP address and subnet
						mask with a slash ('/')
					</para></description>
				</configOption>
				<configOption name="permit">
					<since>
						<version>12.2.0</version>
					</since>
					<synopsis>List of IP addresses to permit access from</synopsis>
					<description><para>
						The value is a comma-delimited list of IP addresses. IP addresses may
						have a subnet mask appended. The subnet mask may be written in either
						CIDR or dotted-decimal notation. Separate the IP address and subnet
						mask with a slash ('/')
					</para></description>
				</configOption>
				<configOption name="type">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Must be of type 'acl'.</synopsis>
				</configOption>
			</configObject>
		</configFile>
	</configInfo>
<module language="en_US" name="res_pjsip_aoc">
	<depend>pjproject</depend>
	<depend>res_pjsip</depend>
	<support_level>extended</support_level>
</module>
<module language="en_US" name="res_pjsip_authenticator_digest">
	<depend>pjproject</depend>
	<depend>res_pjsip</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="res_pjsip_caller_id">
	<depend>pjproject</depend>
	<depend>res_pjsip</depend>
	<depend>res_pjsip_session</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="res_pjsip_config_wizard">
	<depend>pjproject</depend>
	<depend>res_pjsip</depend>
	<support_level>core</support_level>
</module>
	<configInfo name="res_pjsip_config_wizard" language="en_US">
		<synopsis>Module that provides simple configuration wizard capabilities.</synopsis>
		<description><para>
			<emphasis>PJSIP Configuration Wizard</emphasis>
			</para>
			<para>This module allows creation of common PJSIP configuration scenarios
			without having to specify individual endpoint, aor, auth, identify and registration objects.
			</para>
			<para> </para>

			<para>For example, the following configuration snippet would create the
			endpoint, aor, contact, auth and phoneprov objects necessary for a phone to
			get phone provisioning information, register, and make and receive calls.
			A hint is also created in the default context for extension 1000.</para>
			<example title="myphone">
			[myphone]
			type = wizard
			sends_auth = no
			accepts_auth = yes
			sends_registrations = no
			accepts_registrations = yes
			has_phoneprov = yes
			transport = ipv4
			has_hint = yes
			hint_exten = 1000
			inbound_auth/username = testname
			inbound_auth/password = test password
			endpoint/allow = ulaw
			endpoint/context = default
			phoneprov/MAC = 001122aa4455
			phoneprov/PROFILE = profile1
			</example>

			<para>The first 8 items are specific to the wizard.  The rest of the items
			are passed verbatim to the underlying objects.</para>
			<para> </para>

			<para>The following configuration snippet would create the
			endpoint, aor, contact, auth, identify and registration objects necessary for a trunk
			to another pbx or ITSP that requires registration.</para>
			<example title="mytrunk">
			[mytrunk]
			type = wizard
			sends_auth = yes
			accepts_auth = no
			sends_registrations = yes
			accepts_registrations = no
			transport = ipv4
			remote_hosts = sip1.myitsp.com:5060,sip2.myitsp.com:5060
			outbound_auth/username = testname
			outbound_auth/password = test password
			endpoint/allow = ulaw
			endpoint/context = default
			</example>

			<para>Of course, any of the items in either example could be placed into
			templates and shared among wizard objects.</para>

			<para> </para>
			<para>For more information, visit:</para>
			<para><literal>https://docs.asterisk.org/Configuration/Channel-Drivers/SIP/Configuring-res_pjsip/PJSIP-Configuration-Wizard/</literal></para>
		</description>

		<configFile name="pjsip_wizard.conf">
			<configObject name="wizard">
				<synopsis>Provides config wizard.</synopsis>
				<description>
				<para>For more information, visit:</para>
				<para><literal>https://docs.asterisk.org/Configuration/Channel-Drivers/SIP/Configuring-res_pjsip/PJSIP-Configuration-Wizard/</literal></para>
				</description>
				<configOption name="type">
					<synopsis>Must be 'wizard'.</synopsis>
				</configOption>
				<configOption name="transport">
					<synopsis>The name of a transport to use for this object.</synopsis>
					<description><para>If not specified,
					the default will be used.</para></description>
				</configOption>
				<configOption name="remote_hosts">
					<synopsis>List of remote hosts.</synopsis>
					<description><para>A comma-separated list of remote hosts in the form of
					<replaceable>host</replaceable>[:<replaceable>port</replaceable>].
					If set, an aor static contact and an identify match will be created for each
					entry in the list.  If send_registrations is also set, a registration will
					also be created for each.</para></description>
				</configOption>
				<configOption name="outbound_proxy">
					<synopsis>Shortcut for specifying proxy on individual objects.</synopsis>
					<description><para>Shortcut for specifying endpoint/outbound_proxy,
					aor/outbound_proxy, and registration/outbound_proxy individually.
					</para></description>
				</configOption>
				<configOption name="sends_auth" default="no">
					<synopsis>Send outbound authentication to remote hosts.</synopsis>
					<description><para>At least outbound_auth/username is required.</para></description>
				</configOption>
				<configOption name="accepts_auth" default="no">
					<synopsis>Accept incoming authentication from remote hosts.</synopsis>
					<description><para>At least inbound_auth/username is required.</para></description>
				</configOption>
				<configOption name="sends_registrations" default="no">
					<synopsis>Send outbound registrations to remote hosts.</synopsis>
					<description><para>remote_hosts is required and a registration object will
					be created for each host in the remote _hosts string.  If authentication is required,
					sends_auth and an outbound_auth/username must also be supplied.</para></description>
				</configOption>
				<configOption name="sends_line_with_registrations" default="no">
					<synopsis>Sets "line" and "endpoint parameters on registrations.</synopsis>
					<description><para>Setting this to true will cause the wizard to skip the
					creation of an identify object to match incoming requests to the endpoint and
					instead add the line and endpoint parameters to the outbound registration object.
					</para></description>
				</configOption>
				<configOption name="accepts_registrations" default="no">
					<synopsis>Accept inbound registration from remote hosts.</synopsis>
					<description><para>An AOR with dynamic contacts will be created.  If
					the number of contacts nneds to be limited, set aor/max_contacts.</para></description>
				</configOption>
				<configOption name="has_phoneprov" default="no">
					<synopsis>Create a phoneprov object for this endpoint.</synopsis>
					<description><para>A phoneprov object will be created.  phoneprov/MAC
					must be specified.</para></description>
				</configOption>
				<configOption name="server_uri_pattern" default="sip:${REMOTE_HOST}">
					<synopsis>A pattern to use for constructing outbound registration server_uris.</synopsis>
					<description><para>
					The literal <literal>${REMOTE_HOST}</literal> will be substituted with the
					appropriate remote_host for each registration.</para></description>
				</configOption>
				<configOption name="client_uri_pattern" default="sip:${USERNAME}@${REMOTE_HOST}">
					<synopsis>A pattern to use for constructing outbound registration client_uris.</synopsis>
					<description><para>
					The literals <literal>${REMOTE_HOST}</literal> and <literal>${USERNAME}</literal>
					will be substituted with the appropriate remote_host and outbound_auth/username.</para></description>
				</configOption>
				<configOption name="contact_pattern" default="sip:${REMOTE_HOST}">
					<synopsis>A pattern to use for constructing outbound contact uris.</synopsis>
					<description><para>
					The literal <literal>${REMOTE_HOST}</literal> will be substituted with the
					appropriate remote_host for each contact.</para></description>
				</configOption>
				<configOption name="has_hint" default="no">
					<synopsis>Create hint and optionally a default application.</synopsis>
					<description><para>Create hint and optionally a default application.</para></description>
				</configOption>
				<configOption name="hint_context" default="endpoint/context or 'default'">
					<synopsis>The context in which to place hints.</synopsis>
					<description>
					<para>Ignored if <literal>hint_exten</literal> is not specified otherwise specifies the
					context into which the dialplan hints will be placed.  If not specified,
					defaults to the endpoint's context or <literal>default</literal> if that isn't
					found.
					</para></description>
				</configOption>
				<configOption name="hint_exten">
					<synopsis>Extension to map a PJSIP hint to.</synopsis>
					<description>
					<para>Will create the following entry in <literal>hint_context</literal>:</para>
					<para>   <literal>exten =&gt; &lt;hint_exten&gt;,hint,PJSIP/&lt;wizard_id&gt;</literal></para>
					<para> </para>
					<para>Normal dialplan precedence rules apply so if there's already a hint for
					this extension in <literal>hint_context</literal>, this one will be ignored.
					For more information, visit: </para>
					<para><literal>https://docs.asterisk.org/Configuration/Channel-Drivers/SIP/Configuring-res_pjsip/PJSIP-Configuration-Wizard/</literal></para>
					</description>
				</configOption>
				<configOption name="hint_application">
					<synopsis>Application to call when 'hint_exten' is dialed.</synopsis>
					<description>
					<para>Ignored if <literal>hint_exten</literal> isn't specified otherwise
					will create the following priority 1 extension in <literal>hint_context</literal>:</para>
					<para>   <literal>exten =&gt; &lt;hint_exten&gt;,1,&lt;hint_application&gt;</literal></para>
					<para> </para>
					<para>You can specify any valid extensions.conf application expression.</para>
					<example title="Valid expressions">
					Dial(${HINT})
					Gosub(stdexten,${EXTEN},1(${HINT}))
					</example>
					<para>Any extensions.conf style variables specified are passed directly to the
					dialplan.</para>
					<para> </para>
					<para>Normal dialplan precedence rules apply so if there's already a priority 1
					application for this specific extension in <literal>hint_context</literal>,
					this one will be ignored. For more information, visit: </para>
					<para><literal>https://docs.asterisk.org/Configuration/Channel-Drivers/SIP/Configuring-res_pjsip/PJSIP-Configuration-Wizard/</literal></para>
					</description>
				</configOption>
				<configOption name="endpoint&#47;*">
					<synopsis>Variables to be passed directly to the endpoint.</synopsis>
				</configOption>
				<configOption name="aor&#47;*">
					<synopsis>Variables to be passed directly to the aor.</synopsis>
					<description><para>If an aor/contact is explicitly defined then remote_hosts
					will not be used to create contacts automatically.</para></description>
				</configOption>
				<configOption name="inbound_auth&#47;*">
					<synopsis>Variables to be passed directly to the inbound auth.</synopsis>
				</configOption>
				<configOption name="outbound_auth&#47;*">
					<synopsis>Variables to be passed directly to the outbound auth.</synopsis>
				</configOption>
				<configOption name="identify&#47;*">
					<synopsis>Variables to be passed directly to the identify.</synopsis>
					<description><para>If an identify/match is explicitly defined then remote_hosts
					will not be used to create matches automatically.</para></description>
				</configOption>
				<configOption name="registration&#47;*">
					<synopsis>Variables to be passed directly to the outbound registrations.</synopsis>
				</configOption>
				<configOption name="phoneprov&#47;*">
					<synopsis>Variables to be passed directly to the phoneprov object.</synopsis>
					<description><para>
					To activate phoneprov, at least phoneprov/MAC must be set.</para></description>
				</configOption>
			</configObject>
		</configFile>
	</configInfo>
<module language="en_US" name="res_pjsip_dialog_info_body_generator">
	<depend>pjproject</depend>
	<depend>res_pjsip</depend>
	<depend>res_pjsip_pubsub</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="res_pjsip_diversion">
	<depend>pjproject</depend>
	<depend>res_pjsip</depend>
	<depend>res_pjsip_session</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="res_pjsip_dlg_options">
	<depend>pjproject</depend>
	<depend>res_pjsip</depend>
	<depend>res_pjsip_session</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="res_pjsip_dtmf_info">
	<depend>pjproject</depend>
	<depend>res_pjsip</depend>
	<depend>res_pjsip_session</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="res_pjsip_empty_info">
	<depend>pjproject</depend>
	<depend>res_pjsip</depend>
	<depend>res_pjsip_session</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="res_pjsip_endpoint_identifier_anonymous">
	<depend>pjproject</depend>
	<depend>res_pjsip</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="res_pjsip_endpoint_identifier_ip">
	<depend>pjproject</depend>
	<depend>res_pjsip</depend>
	<support_level>core</support_level>
</module>
	<configInfo name="res_pjsip_endpoint_identifier_ip" language="en_US">
		<synopsis>Module that identifies endpoints</synopsis>
		<configFile name="pjsip.conf">
			<configObject name="identify">
				<since>
					<version>13.14.0</version>
					<version>14.3.0</version>
				</since>
				<synopsis>Identifies endpoints via some criteria.</synopsis>
				<description>
					<para>This module provides alternatives to matching inbound requests to
					a configured endpoint. At least one of the matching mechanisms
					must be provided, or the object configuration is invalid.</para>
					<para>The matching mechanisms are provided by the following
					configuration options:</para>
					<enumlist>
						<enum name="match"><para>Match by source IP address.</para></enum>
						<enum name="match_header"><para>Match by SIP header.</para></enum>
					</enumlist>
					<note><para>If multiple matching criteria are provided then an inbound
					request will be matched to the endpoint if it matches
					<emphasis>any</emphasis> of the criteria.</para></note>
				</description>
				<configOption name="endpoint">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Name of endpoint identified</synopsis>
				</configOption>
				<configOption name="match">
					<since>
						<version>12.2.0</version>
					</since>
					<synopsis>IP addresses or networks to match against.</synopsis>
					<description>
						<para>The value is a comma-delimited list of IP addresses or
						hostnames.</para>
						<para>IP addresses may have a subnet mask appended. The subnet
						mask may be written in either CIDR or dotted-decimal
						notation. Separate the IP address and subnet mask with a slash
						('/'). A source port can also be specified by adding a colon (':')
						after the address but before the subnet mask, e.g.
						3.2.1.0:5061/24. To specify a source port for an IPv6 address, the
						address itself must be enclosed in square brackets
						('[2001:db8:0::1]:5060')</para>
						<para>When a hostname is used, the behavior depends on whether
						<replaceable>srv_lookups</replaceable> is enabled and/or a source
						port is provided. If <replaceable>srv_lookups</replaceable> is
						enabled and a source port is not provided, Asterisk will perform
						an SRV lookup on the provided hostname, adding all of the A and
						AAAA records that are resolved.</para>
						<para>If the SRV lookup fails,
						<replaceable>srv_lookups</replaceable> is disabled, or a source
						port is specified when the hostname is configured, Asterisk will
						resolve the hostname and add all A and AAAA records that are
						resolved.</para>
					</description>
				</configOption>
				<configOption name="srv_lookups" default="yes">
					<since>
						<version>13.14.0</version>
						<version>14.3.0</version>
					</since>
					<synopsis>Perform SRV lookups for provided hostnames.</synopsis>
					<description>
						<para>When enabled, <replaceable>srv_lookups</replaceable> will
						perform SRV lookups for _sip._udp, _sip._tcp, and _sips._tcp of
						the given hostnames to determine additional addresses that traffic
						may originate from.
						</para>
					</description>
				</configOption>
				<configOption name="match_header">
					<since>
						<version>13.15.0</version>
						<version>14.4.0</version>
					</since>
					<synopsis>Header/value pair to match against.</synopsis>
					<description>
						<para>A SIP header whose value is used to match against.  SIP
						requests containing the header, along with the specified value,
						will be mapped to the specified endpoint.  The header must be
						specified with a <literal>:</literal>, as in
						<literal>match_header = SIPHeader: value</literal>.
						</para>
						<para>The specified SIP header value can be a regular
						expression if the value is of the form
						/<replaceable>regex</replaceable>/.
						</para>
						<note><para>Use of a regex is expensive so be sure you need
						to use a regex to match your endpoint.
						</para></note>
					</description>
				</configOption>
				<configOption name="match_request_uri">
					<since>
						<version>18.23.0</version>
						<version>20.8.0</version>
						<version>21.3.0</version>
					</since>
					<synopsis>Request URI to match against.</synopsis>
					<description>
						<para>The SIP request URI is used to match against.
						</para>
						<para>The specified SIP request URI can be a regular
						expression if the value is of the form
						/<replaceable>regex</replaceable>/.
						</para>
						<note><para>Use of a regex is expensive so be sure you need
						to use a regex to match your endpoint.
						</para></note>
					</description>
				</configOption>
				<configOption name="type">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Must be of type 'identify'.</synopsis>
				</configOption>
			</configObject>
		</configFile>
	</configInfo>
<module language="en_US" name="res_pjsip_endpoint_identifier_user">
	<depend>pjproject</depend>
	<depend>res_pjsip</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="res_pjsip_exten_state">
	<depend>pjproject</depend>
	<depend>res_pjsip</depend>
	<depend>res_pjsip_pubsub</depend>
	<depend>res_pjsip_outbound_publish</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="res_pjsip_history">
	<depend>pjproject</depend>
	<depend>res_pjsip</depend>
	<support_level>extended</support_level>
</module>
<module language="en_US" name="res_pjsip_geolocation">
	<depend>res_geolocation</depend>
	<depend>pjproject</depend>
	<depend>res_pjsip</depend>
	<depend>res_pjsip_session</depend>
	<depend>chan_pjsip</depend>
	<depend>libxml2</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="res_pjsip_header_funcs">
	<depend>pjproject</depend>
	<depend>res_pjsip</depend>
	<depend>res_pjsip_session</depend>
	<support_level>core</support_level>
</module>
	<function name="PJSIP_HEADER" language="en_US" module="res_pjsip_header_funcs">
		<since>
			<version>12.0.0</version>
		</since>
		<synopsis>
			Gets headers from an inbound PJSIP channel. Adds, updates or removes the
			specified SIP header from an outbound PJSIP channel.
		</synopsis>
		<syntax>
			<parameter name="action" required="true">
				<enumlist>
					<enum name="read"><para>Returns instance <replaceable>number</replaceable>
					of header <replaceable>name</replaceable>. A <literal>*</literal>
					may be appended to <replaceable>name</replaceable> to iterate over all
					headers <emphasis>beginning with</emphasis> <replaceable>name</replaceable>.
					</para></enum>

					<enum name="add"><para>Adds a new header <replaceable>name</replaceable>
					to this session.</para></enum>

					<enum name="update"><para>Updates instance <replaceable>number</replaceable>
					of header <replaceable>name</replaceable> to a new value.
					The header must already exist.</para></enum>

					<enum name="remove"><para>Removes all instances of previously added headers
					whose names match <replaceable>name</replaceable>. A <literal>*</literal>
					may be appended to <replaceable>name</replaceable> to remove all headers
					<emphasis>beginning with</emphasis> <replaceable>name</replaceable>.
					<replaceable>name</replaceable> may be set to a single <literal>*</literal>
					to clear <emphasis>all</emphasis> previously added headers. In all cases,
					the number of headers actually removed is returned.</para></enum>
				</enumlist>
			</parameter>

			<parameter name="name" required="true"><para>The name of the header.</para></parameter>

			<parameter name="number" required="false">
				<para>If there's more than 1 header with the same name, this specifies which header
				to read or update.  If not specified, defaults to <literal>1</literal> meaning
				the first matching header.  Not valid for <literal>add</literal> or
				<literal>remove</literal>.</para>
			</parameter>

		</syntax>
		<description>
			<para>PJSIP_HEADER allows you to read specific SIP headers from the inbound
			PJSIP channel as well as write(add, update, remove) headers on the outbound
			channel. One exception is that you can read headers that you have already
			added on the outbound channel.</para>
			<para>Examples:</para>
			<example title="Set somevar to the value of the From header">
			exten => 1,1,Set(somevar=${PJSIP_HEADER(read,From)})
			</example>
			<example title="Set via2 to the value of the 2nd Via header">
			exten => 1,1,Set(via2=${PJSIP_HEADER(read,Via,2)})
			</example>
			<example title="Set xhdr to the value of the 1st X-header">
			exten => 1,1,Set(xhdr=${PJSIP_HEADER(read,X-*,1)})
			</example>
			<example title="Add an X-Myheader header with the value of myvalue">
			exten => 1,1,Set(PJSIP_HEADER(add,X-MyHeader)=myvalue)
			</example>
			<example title="Add an X-Myheader header with an empty value">
			exten => 1,1,Set(PJSIP_HEADER(add,X-MyHeader)=)
			</example>
			<example title="Update the value of the header named X-Myheader to newvalue">
			; 'X-Myheader' must already exist or the call will fail.
			exten => 1,1,Set(PJSIP_HEADER(update,X-MyHeader)=newvalue)
			</example>
			<example title="Remove all headers whose names exactly match X-MyHeader">
			exten => 1,1,Set(PJSIP_HEADER(remove,X-MyHeader)=)
			</example>
			<example title="Remove all headers that begin with X-My">
			exten => 1,1,Set(PJSIP_HEADER(remove,X-My*)=)
			</example>
			<example title="Remove all previously added headers">
			exten => 1,1,Set(PJSIP_HEADER(remove,*)=)
			</example>
			<note><para>The <literal>remove</literal> action can be called by reading
			<emphasis>or</emphasis> writing PJSIP_HEADER.</para></note>
			<example title="Display the number of headers removed">
			exten => 1,1,Verbose( Removed ${PJSIP_HEADER(remove,X-MyHeader)} headers)
			</example>
			<example title="Set a variable to the number of headers removed">
			exten => 1,1,Set(count=${PJSIP_HEADER(remove,X-MyHeader)})
			</example>
			<example title="Just remove them ignoring any count">
			exten => 1,1,Set(=${PJSIP_HEADER(remove,X-MyHeader)})
			exten => 1,1,Set(PJSIP_HEADER(remove,X-MyHeader)=)
			</example>

			<note><para>If you call PJSIP_HEADER in a normal dialplan context you'll be
			operating on the <emphasis>caller's (incoming)</emphasis> channel which
			may not be what you want. To operate on the <emphasis>callee's (outgoing)</emphasis>
			channel call PJSIP_HEADER in a pre-dial handler. </para></note>
			<example title="Set headers on callee channel">
			[handler]
			exten => addheader,1,Set(PJSIP_HEADER(add,X-MyHeader)=myvalue)
			exten => addheader,2,Set(PJSIP_HEADER(add,X-MyHeader2)=myvalue2)

			[somecontext]
			exten => 1,1,Dial(PJSIP/${EXTEN},,b(handler^addheader^1))
			</example>
		</description>
	</function>
	<function name="PJSIP_INHERITABLE_HEADER" language="en_US" module="res_pjsip_header_funcs">
		<since>
			<version>20.19.0</version>
			<version>22.9.0</version>
			<version>23.3.0</version>
		</since>
		<synopsis>
			Adds, updates or removes the specified SIP header from a PJSIP or non-PJSIP channel
			to be inherited to an outbound PJSIP channel.
		</synopsis>
		<syntax>
			<parameter name="action" required="true">
				<enumlist>

					<enum name="add"><para>Adds a new header <replaceable>name</replaceable>
					to this channel.</para></enum>

					<enum name="update"><para>Updates instance <replaceable>number</replaceable>
					of header <replaceable>name</replaceable> to a new value.
					The header must already exist.</para></enum>

					<enum name="remove"><para>Removes all instances of previously added headers
					whose names match <replaceable>name</replaceable>. A <literal>*</literal>
					may be appended to <replaceable>name</replaceable> to remove all headers
					<emphasis>beginning with</emphasis> <replaceable>name</replaceable>.
					<replaceable>name</replaceable> may be set to a single <literal>*</literal>
					to clear <emphasis>all</emphasis> previously added headers. In all cases,
					the number of headers actually removed is returned.</para></enum>
				</enumlist>
			</parameter>

			<parameter name="name" required="true"><para>The name of the header.</para></parameter>

			<parameter name="number" required="false">
				<para>If there's more than 1 header with the same name, this specifies which header
				to read or update.  If not specified, defaults to <literal>1</literal> meaning
				the first matching header.  Not valid for <literal>add</literal> or
				<literal>remove</literal>.</para>
			</parameter>

		</syntax>
		<description>
			<para>PJSIP_INHERITABLE_HEADER allows you to write specific SIP headers on a calling
			channel to be inherited by an outbound PJSIP channel.</para>
			<para>Examples:</para>
			<example title="Add an inheritable X-Myheader header with the value of myvalue">
			exten => 1,1,Set(PJSIP_INHERITABLE_HEADER(add,X-MyHeader)=myvalue)
			</example>
			<example title="Add an inheritable X-Myheader header with an empty value">
			exten => 1,1,Set(PJSIP_INHERITABLE_HEADER(add,X-MyHeader)=)
			</example>
			<example title="Add an inheritable X-MyHeader that will be inherited by child channel">
			exten => 1,1,Set(PJSIP_INHERITABLE_HEADER(add,X-MyHeader)=myvalue)
			</example>
			<example title="Update the value of the inheritable header named X-Myheader to newvalue">
			; 'X-Myheader' must already exist or the call will fail.
			exten => 1,1,Set(PJSIP_INHERITABLE_HEADER(update,X-MyHeader)=newvalue)
			</example>
			<example title="Remove all inheritable headers whose names exactly match X-MyHeader">
			exten => 1,1,Set(PJSIP_INHERITABLE_HEADER(remove,X-MyHeader)=)
			</example>
			<example title="Remove all inheritable headers that begin with X-My">
			exten => 1,1,Set(PJSIP_INHERITABLE_HEADER(remove,X-My*)=)
			</example>

			<note><para>If you call PJSIP_INHERITABLE_HEADER in a normal dialplan context you'll be
			operating on the <emphasis>caller's</emphasis> channel which
			will then be inherited to the <emphasis>callee's (outgoing)</emphasis>
			channel. Inherited headers can be updated or removed via PJSIP_INHERITABLE_HEADER
			in a pre-dial handler. </para>
			<para>Headers added via PJSIP_INHERITABLE_HEADER are separate from headers
			added via PJSIP_HEADER. A header added via PJSIP_INHERITABLE_HEADER can only
			be or removed modified by PJSIP_INHERITABLE_HEADER. A header added via
			PJSIP_HEADER can only be modified or removed by PJSIP_HEADER.</para></note>
			<example title="Set and modify headers on callee channel">
			[handler]
			exten => modheader,1,Set(PJSIP_INHERITABLE_HEADER(update,X-MyHeader)=myvalue)
				same => n,Set(PJSIP_INHERITABLE_HEADER(update,X-MyHeader2)=myvalueX)
				same => n,Set(PJSIP_INHERITABLE_HEADER(remove,X-MyHeader2)=)

			[somecontext]
			exten => 1,1,Set(PJSIP_INHERITABLE_HEADER(add,X-MyHeader1)=myvalue1)
				same => n,Set(PJSIP_INHERITABLE_HEADER(add,X-MyHeader2)=myvalue2)
				same => n,Set(PJSIP_INHERITABLE_HEADER(add,X-MyHeader3)=myvalue3)
				same => n,Dial(PJSIP/${EXTEN},,b(handler^modheader^1))
			</example>
		</description>
	</function>
	<function name="PJSIP_HEADERS" language="en_US" module="res_pjsip_header_funcs">
		<since>
			<version>16.20.0</version>
			<version>18.6.0</version>
		</since>
		<synopsis>
			Gets the list of SIP header names from an INVITE message.
		</synopsis>
		<syntax>
			<parameter name="prefix">
				<para>If specified, only the headers matching the given prefix are returned.</para>
			</parameter>
		</syntax>
		<description>
			<para>Returns a comma-separated list of header names (without values) from the
			INVITE message. Multiple headers with the same name are included in the list only once.
			</para>
			<para>For example, <literal>${PJSIP_HEADERS(Co)}</literal> might return
			<literal>Contact,Content-Length,Content-Type</literal>. As a practical example,
			you may use <literal>${PJSIP_HEADERS(X-)}</literal> to enumerate optional extended
			headers.</para>
		</description>
		<see-also>
			<ref type="function">PJSIP_HEADER</ref>
		</see-also>
	</function>
	<function name="PJSIP_RESPONSE_HEADER" language="en_US" module="res_pjsip_header_funcs">
		<since>
			<version>16.28.0</version>
			<version>18.14.0</version>
			<version>19.6.0</version>
		</since>
		<synopsis>
			Gets headers of 200 response from an outbound PJSIP channel.
		</synopsis>
		<syntax>
			<parameter name="action" required="true">
				<enumlist>
					<enum name="read">
						<para>Returns instance <replaceable>number</replaceable>
						of response header <replaceable>name</replaceable>.</para>
					</enum>
				</enumlist>
			</parameter>

			<parameter name="name" required="true">
				<para>The <replaceable>name</replaceable> of the response header.
				A <literal>*</literal> can be appended to the <replaceable>name</replaceable>
				to iterate over all response headers <emphasis>beginning with</emphasis>
				<replaceable>name</replaceable>.</para>
			</parameter>

			<parameter name="number" required="false">
				<para>If there's more than 1 header with the same name, this specifies which header
				to read.  If not specified, defaults to <literal>1</literal> meaning
				the first matching header.
				</para>
			</parameter>

		</syntax>
		<description>
			<para>PJSIP_RESPONSE_HEADER allows you to read specific SIP headers of 200 response
			from the outbound PJSIP channel.</para>
			<para>Examples:</para>
			<example title="Set 'somevar' to the value of the 'From' header">
				exten => 1,1,Set(somevar=${PJSIP_RESPONSE_HEADER(read,From)})
			</example>
			<example title="Set 'via2' to the value of the 2nd 'Via' header">
				exten => 1,1,Set(via2=${PJSIP_RESPONSE_HEADER(read,Via,2)})
			</example>
			<example title="Set 'xhdr' to the value of the 1sx X-header">
				exten => 1,1,Set(xhdr=${PJSIP_RESPONSE_HEADER(read,X-*,1)})
			</example>

			<note><para>If you call PJSIP_RESPONSE_HEADER in a normal dialplan context you'll be
			operating on the <emphasis>caller's (incoming)</emphasis> channel which
			may not be what you want. To operate on the <emphasis>callee's (outgoing)</emphasis>
			channel call PJSIP_RESPONSE_HEADER in a pre-connect handler.</para>
			</note>
			<example title="Usage on pre-connect handler">
				[handler]
				exten => readheader,1,NoOp(PJSIP_RESPONSE_HEADER(read,X-MyHeader))
				[somecontext]
				exten => 1,1,Dial(PJSIP/${EXTEN},,U(handler^readheader^1))
			</example>
		</description>
		<see-also>
			<ref type="function">PJSIP_RESPONSE_HEADERS</ref>
			<ref type="function">PJSIP_HEADER</ref>
		</see-also>
	</function>
	<function name="PJSIP_RESPONSE_HEADERS" language="en_US" module="res_pjsip_header_funcs">
		<since>
			<version>16.28.0</version>
			<version>18.14.0</version>
			<version>19.6.0</version>
		</since>
		<synopsis>
			Gets the list of SIP header names from the 200 response of INVITE message.
		</synopsis>
		<syntax>
			<parameter name="prefix">
				<para>If specified, only the headers matching the given prefix are returned.</para>
			</parameter>
		</syntax>
		<description>
			<para>Returns a comma-separated list of header names (without values) from the 200
			response of INVITE message. Multiple headers with the same name are included in the
			list only once.</para>
			<para>For example, <literal>${PJSIP_RESPONSE_HEADERS(Co)}</literal> might return
			<literal>Contact,Content-Length,Content-Type</literal>. As a practical example,
			you may use <literal>${PJSIP_RESPONSE_HEADERS(X-)}</literal> to enumerate optional
			extended headers.</para>
		</description>
		<see-also>
			<ref type="function">PJSIP_RESPONSE_HEADER</ref>
			<ref type="function">PJSIP_HEADERS</ref>
		</see-also>
	</function>
	<function name="PJSIP_HEADER_PARAM" language="en_US" module="res_pjsip_header_funcs">
		<since>
			<version>18.16.0</version>
			<version>20.1.0</version>
		</since>
		<synopsis>
			Get or set header/URI parameters on a PJSIP channel.
		</synopsis>
		<syntax>
			<parameter name="header_name" required="true">
				<para>Header in which parameter should be read or set.</para>
				<para>Currently, the only supported header is <literal>From</literal>.</para>
			</parameter>
			<parameter name="parameter_type" required="true">
				<para>The type of parameter to get or set.</para>
				<para>Default is header parameter.</para>
				<enumlist>
					<enum name="header">
						<para>Header parameter.</para>
					</enum>
					<enum name="uri">
						<para>URI parameter.</para>
					</enum>
				</enumlist>
			</parameter>
			<parameter name="parameter_name" required="true">
				<para>Name of parameter.</para>
			</parameter>
		</syntax>
		<description>
			<para>PJSIP_HEADER_PARAM allows you to read or set parameters in a SIP header on a
			PJSIP channel.</para>
			<para>Both URI parameters and header parameters can be read and set using
			this function. URI parameters appear in the URI (inside the &lt;&gt; in the header)
			while header parameters appear afterwards.</para>
			<note><para>If you call PJSIP_HEADER_PARAM in a normal dialplan context you'll be
			operating on the <emphasis>caller's (incoming)</emphasis> channel which
			may not be what you want. To operate on the <emphasis>callee's (outgoing)</emphasis>
			channel call PJSIP_HEADER_PARAM in a pre-dial handler. </para></note>
			<example title="Set URI parameter in From header on outbound channel">
			[handler]
			exten => addheader,1,Set(PJSIP_HEADER_PARAM(From,uri,isup-oli)=27)
			same => n,Return()
			[somecontext]
			exten => 1,1,Dial(PJSIP/${EXTEN},,b(handler^addheader^1))
			</example>
			<example title="Read URI parameter in From header on inbound channel">
			same => n,Set(value=${PJSIP_HEADER_PARAM(From,uri,isup-oli)})
			</example>
		</description>
	</function>
<module language="en_US" name="res_pjsip_logger">
	<depend>pjproject</depend>
	<depend>res_pjsip</depend>
	<defaultenabled>yes</defaultenabled>
	<support_level>core</support_level>
</module>
<module language="en_US" name="res_pjsip_maintenance">
	<depend>pjproject</depend>
	<depend>res_pjsip</depend>
	<depend>res_pjsip_session</depend>
	<support_level>extended</support_level>
</module>
	<manager name="PJSIPSetMaintenance" language="en_US" module="res_pjsip_maintenance">
		<since>
			<version>20.20.0</version>
			<version>22.10.0</version>
			<version>23.4.0</version>
		</since>
		<synopsis>
			Enable or disable maintenance mode for a PJSIP endpoint.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="Endpoint" required="true">
				<para>The PJSIP endpoint name, or <literal>all</literal> to
				toggle maintenance mode for every configured endpoint.</para>
			</parameter>
			<parameter name="State" required="true">
				<para>Desired maintenance state.</para>
				<enumlist>
					<enum name="on" />
					<enum name="off" />
				</enumlist>
			</parameter>
		</syntax>
		<description>
			<para>Enables or disables maintenance mode for the specified PJSIP
			endpoint.  While in maintenance mode, new inbound out-of-dialog
			requests are rejected with 503 Service Unavailable (except
			SUBSCRIBE/REGISTER with Expires: 0), and outbound originations via
			Dial() or ARI are refused before any SIP session or channel is
			created.  In-progress dialogs are unaffected.</para>
			<para>A <literal>PJSIPMaintenanceStatus</literal> event is emitted
			when the state changes.</para>
		</description>
	</manager>
	<manager name="PJSIPShowMaintenance" language="en_US" module="res_pjsip_maintenance">
		<since>
			<version>20.20.0</version>
			<version>22.10.0</version>
			<version>23.4.0</version>
		</since>
		<synopsis>
			Show maintenance mode status for PJSIP endpoints.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="Endpoint" required="false">
				<para>If specified, show the status for this endpoint only.
				If omitted, list all endpoints currently in maintenance
				mode.</para>
			</parameter>
		</syntax>
		<description>
			<para>Emits one <literal>PJSIPMaintenanceStatus</literal> event
			per result, followed by a
			<literal>PJSIPMaintenanceStatusComplete</literal> event.</para>
		</description>
	</manager>
	<managerEvent language="en_US" name="PJSIPMaintenanceStatus" module="res_pjsip_maintenance">
		<managerEventInstance class="EVENT_FLAG_SYSTEM" module="res_pjsip_maintenance">
			<since>
				<version>20.20.0</version>
				<version>22.10.0</version>
				<version>23.4.0</version>
			</since>
			<synopsis>
				Reports the maintenance mode state of a PJSIP endpoint.
			</synopsis>
			<syntax>
				<parameter name="Endpoint">
					<para>The PJSIP endpoint name.</para>
				</parameter>
				<parameter name="Status">
					<para>Current maintenance state.</para>
					<enumlist>
						<enum name="enabled" />
						<enum name="disabled" />
					</enumlist>
				</parameter>
			</syntax>
			<description>
				<para>Emitted when an endpoint enters or leaves maintenance
				mode, and as a list entry in response to
				<literal>PJSIPShowMaintenance</literal>.</para>
			</description>
		</managerEventInstance>
	</managerEvent>
<module language="en_US" name="res_pjsip_messaging">
	<depend>pjproject</depend>
	<depend>res_pjsip</depend>
	<depend>res_pjsip_session</depend>
	<support_level>core</support_level>
</module>
	<info name="MessageDestinationInfo" language="en_US" tech="PJSIP" module="res_pjsip_messaging">
		<para>The <literal>destination</literal> parameter is used to construct
		the Request URI for an outgoing message.  It can be in one of the following
		formats, all prefixed with the <literal>pjsip:</literal> message tech.</para>
		<para>
		</para>
		<enumlist>
			<enum name="endpoint">
				<para>Request URI comes from the endpoint's default aor and contact.</para>
			</enum>
			<enum name="endpoint/aor">
				<para>Request URI comes from the specific aor/contact.</para>
			</enum>
			<enum name="endpoint@domain">
				<para>Request URI from the endpoint's default aor and contact.  The domain is discarded.</para>
			</enum>
		</enumlist>
		<para>
		</para>
		<para>These all use the endpoint to send the message with the specified URI:</para>
		<para>
		</para>
		<enumlist>
 			<enum name="endpoint/&lt;sip[s]:host&gt;>"/>
 			<enum name="endpoint/&lt;sip[s]:user@host&gt;"/>
 			<enum name="endpoint/&quot;display name&quot; &lt;sip[s]:host&gt;"/>
 			<enum name="endpoint/&quot;display name&quot; &lt;sip[s]:user@host&gt;"/>
 			<enum name="endpoint/sip[s]:host"/>
 			<enum name="endpoint/sip[s]:user@host"/>
 			<enum name="endpoint/host"/>
 			<enum name="endpoint/user@host"/>
 		</enumlist>
		<para>
		</para>
		<para>These all use the default endpoint to send the message with the specified URI:</para>
		<para>
		</para>
 	 	<enumlist>
 			<enum name="&lt;sip[s]:host&gt;"/>
 			<enum name="&lt;sip[s]:user@host&gt;"/>
 			<enum name="&quot;display name&quot; &lt;sip[s]:host&gt;"/>
 			<enum name="&quot;display name&quot; &lt;sip[s]:user@host&gt;"/>
 			<enum name="sip[s]:host"/>
 			<enum name="sip[s]:user@host"/>
 	 	</enumlist>
		<para>
		</para>
 	 	<para>These use the default endpoint to send the message with the specified host:</para>
		<para>
		</para>
 	 	<enumlist>
 			<enum name="host"/>
 			<enum name="user@host"/>
 	 	</enumlist>
 		<para>
 		</para>
 		<para>This form is similar to a dialstring:</para>
		<para>
		</para>
		<enumlist>
			<enum name="PJSIP/user@endpoint"/>
		</enumlist>
		<para>
		</para>
		<para>You still need to prefix the destination with
		the <literal>pjsip:</literal> message technology prefix.  For example:
		<literal>pjsip:PJSIP/8005551212@myprovider</literal>.
		The endpoint contact's URI will have the <literal>user</literal> inserted
		into it and will become the Request URI.  If the contact URI already has
		a user specified, it will be replaced.
		</para>
		<para>
		</para>
	</info>
	<info name="MessageFromInfo" language="en_US" tech="PJSIP" module="res_pjsip_messaging">
		<para>The <literal>from</literal> parameter is used to specity the <literal>From:</literal>
		header in the outgoing SIP MESSAGE.  It will override the value specified in
		MESSAGE(from) which itself will override any <literal>from</literal> value from
		an incoming SIP MESSAGE.
		</para>
 		<para>
 		</para>
	</info>
	<info name="MessageToInfo" language="en_US" tech="PJSIP" module="res_pjsip_messaging">
		<para>The <literal>to</literal> parameter is used to specity the <literal>To:</literal>
		header in the outgoing SIP MESSAGE.  It will override the value specified in
		MESSAGE(to) which itself will override any <literal>to</literal> value from
		an incoming SIP MESSAGE.
		</para>
 		<para>
 		</para>
	</info>
<module language="en_US" name="res_pjsip_mwi">
	<depend>pjproject</depend>
	<depend>res_pjsip</depend>
	<depend>res_pjsip_pubsub</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="res_pjsip_mwi_body_generator">
	<depend>pjproject</depend>
	<depend>res_pjsip</depend>
	<depend>res_pjsip_pubsub</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="res_pjsip_nat">
	<depend>pjproject</depend>
	<depend>res_pjsip</depend>
	<depend>res_pjsip_session</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="res_pjsip_notify">
	<depend>pjproject</depend>
	<depend>res_pjsip</depend>
	<support_level>core</support_level>
</module>
	<manager name="PJSIPNotify" language="en_US" module="res_pjsip_notify">
		<since>
			<version>12.0.0</version>
		</since>
		<synopsis>
			Send a NOTIFY to either an endpoint, an arbitrary URI, or inside a SIP dialog.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="Endpoint" required="false">
				<para>The endpoint to which to send the NOTIFY.</para>
			</parameter>
			<parameter name="URI" required="false">
				<para>Abritrary URI to which to send the NOTIFY.</para>
			</parameter>
			<parameter name="channel" required="false">
				<para>Channel name to send the NOTIFY. Must be a PJSIP channel.</para>
			</parameter>
			<parameter name="Option" required="false">
				<para>The config section name from <literal>pjsip_notify.conf</literal> to use.</para>
				<para>One of Option or Variable must be specified.</para>
			</parameter>
			<parameter name="Variable" required="false">
				<para>Appends variables as headers/content to the NOTIFY. If the variable is
				named <literal>Content</literal>, then the value will compose the body
				of the message if another variable sets <literal>Content-Type</literal>.
				<replaceable>name</replaceable>=<replaceable>value</replaceable></para>
				<para>One of Option or Variable must be specified.</para>
			</parameter>
		</syntax>
		<description>
			<para>Sends a NOTIFY to an endpoint, an arbitrary URI, or inside a SIP dialog.</para>
			<para>All parameters for this event must be specified in the body of this
			request	via multiple <literal>Variable: name=value</literal> sequences.</para>
			<note><para>One (and only one) of <literal>Endpoint</literal>,
			<literal>URI</literal>, or <literal>Channel</literal> must be specified.
			If <literal>URI</literal> is used, the default outbound endpoint will be used
			to send the message. If the default outbound endpoint isn't configured, this command
			can not send to an arbitrary URI.</para></note>
		</description>
	</manager>
	<configInfo name="res_pjsip_notify" language="en_US">
		<synopsis>Module that supports sending NOTIFY requests to endpoints from external sources</synopsis>
		<configFile name="pjsip_notify.conf">
			<configObject name="general">
				<synopsis>Unused, but reserved.</synopsis>
			</configObject>
			<configObject name="notify">
				<since>
					<version>12.0.0</version>
				</since>
				<synopsis>Configuration of a NOTIFY request.</synopsis>
				<description>
					<para>Each key-value pair in a <literal>notify</literal>
					configuration section defines either a SIP header to send
					in the request or a line of content in the request message
					body. A key of <literal>Content</literal> is treated
					as part of the message body and is appended in sequential
					order; any other header is treated as part of the SIP
					request.</para>
				</description>
				<configOption name="">
					<synopsis>A key/value pair to add to a NOTIFY request.</synopsis>
					<description>
						<para>If the key is <literal>Content</literal>,
						it will be treated as part of the message body. Otherwise,
						it will be added as a header in the NOTIFY request.</para>
						<para>The following headers are reserved and cannot be
						specified:</para>
						<enumlist>
							<enum name="Call-ID" />
							<enum name="Contact" />
							<enum name="CSeq" />
							<enum name="To" />
							<enum name="From" />
							<enum name="Record-Route" />
							<enum name="Route" />
							<enum name="Via" />
						</enumlist>
					</description>
				</configOption>
			</configObject>
		</configFile>
	</configInfo>
<module language="en_US" name="res_pjsip_one_touch_record_info">
	 <depend>pjproject</depend>
	 <depend>res_pjsip</depend>
	 <depend>res_pjsip_session</depend>
	 <support_level>core</support_level>
</module>
<module language="en_US" name="res_pjsip_outbound_authenticator_digest">
	<depend>pjproject</depend>
	<depend>res_pjsip</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="res_pjsip_outbound_publish">
	<depend>pjproject</depend>
	<depend>res_pjproject</depend>
	<depend>res_pjsip</depend>
	<support_level>core</support_level>
</module>
	<configInfo name="res_pjsip_outbound_publish" language="en_US">
		<synopsis>SIP resource for outbound publish</synopsis>
		<description><para>
			<emphasis>Outbound Publish</emphasis>
			</para>
			<para>This module allows <literal>res_pjsip</literal> to publish to other SIP servers.</para>
		</description>
		<configFile name="pjsip.conf">
			<configObject name="outbound-publish">
				<since>
					<version>13.0.0</version>
				</since>
				<synopsis>The configuration for outbound publish</synopsis>
				<description><para>
					Publish is <emphasis>COMPLETELY</emphasis> separate from the rest of
					<literal>pjsip.conf</literal>. A minimal configuration consists of
					setting a <literal>server_uri</literal> and <literal>event</literal>.
				</para></description>
				<configOption name="expiration" default="3600">
					<since>
						<version>13.0.0</version>
					</since>
					<synopsis>Expiration time for publications in seconds</synopsis>
				</configOption>
				<configOption name="outbound_auth" default="">
					<since>
						<version>13.0.0</version>
					</since>
					<synopsis>Authentication object(s) to be used for outbound publishes.</synopsis>
					<description><para>
						This is a comma-delimited list of <replaceable>auth</replaceable>
						sections defined in <filename>pjsip.conf</filename> used to respond
						to outbound authentication challenges.</para>
						<note><para>
						Using the same auth section for inbound and outbound
						authentication is not recommended.  There is a difference in
						meaning for an empty realm setting between inbound and outbound
						authentication uses.  See the auth realm description for details.
						</para></note>
					</description>
				</configOption>
				<configOption name="outbound_proxy" default="">
					<since>
						<version>13.0.0</version>
					</since>
					<synopsis>Full SIP URI of the outbound proxy used to send publishes</synopsis>
					<description><para>
						Proxy through which to send requests, a full SIP URI must be provided (default: "").
						Consider adding \;lr for loose routing (to keep user@domain in the request URI).
					</para></description>
				</configOption>
				<configOption name="server_uri">
					<since>
						<version>13.0.0</version>
					</since>
					<synopsis>SIP URI of the server and entity to publish to</synopsis>
					<description><para>
						This is the URI at which to find the entity and server to send the outbound PUBLISH to.
						This URI is used as the request URI of the outbound PUBLISH request from Asterisk.
					</para></description>
				</configOption>
				<configOption name="from_uri">
					<since>
						<version>13.0.0</version>
					</since>
					<synopsis>SIP URI to use in the From header</synopsis>
					<description><para>
						This is the URI that will be placed into the From header of outgoing PUBLISH
						messages. If no URI is specified then the URI provided in <literal>server_uri</literal>
						will be used.
					</para></description>
				</configOption>
				<configOption name="to_uri">
					<since>
						<version>13.0.0</version>
					</since>
					<synopsis>SIP URI to use in the To header</synopsis>
					<description><para>
						This is the URI that will be placed into the To header of outgoing PUBLISH
						messages. If no URI is specified then the URI provided in <literal>server_uri</literal>
						will be used.
					</para></description>
				</configOption>
				<configOption name="event" default="">
					<since>
						<version>13.0.0</version>
					</since>
					<synopsis>Event type of the PUBLISH.</synopsis>
				</configOption>
				<configOption name="max_auth_attempts" default="5">
					<since>
						<version>13.0.0</version>
					</since>
					<synopsis>Maximum number of authentication attempts before stopping the publication.</synopsis>
				</configOption>
				<configOption name="transport">
					<since>
						<version>13.9.0</version>
					</since>
					<synopsis>Transport used for outbound publish</synopsis>
					<description>
						<note><para>A <replaceable>transport</replaceable> configured in
						<literal>pjsip.conf</literal>. As with other <literal>res_pjsip</literal> modules, this will use the first available transport of the appropriate type if unconfigured.</para></note>
					</description>
				</configOption>
				<configOption name="multi_user" default="no">
					<since>
						<version>14.0.0</version>
					</since>
					<synopsis>Enable multi-user support</synopsis>
					<description><para>When enabled the user portion of the server uri is replaced by a dynamically created user</para></description>
				</configOption>
				<configOption name="type">
					<since>
						<version>13.0.0</version>
					</since>
					<synopsis>Must be of type 'outbound-publish'.</synopsis>
				</configOption>
			</configObject>
		</configFile>
	</configInfo>
<module language="en_US" name="res_pjsip_outbound_registration">
	<depend>pjproject</depend>
	<depend>res_pjsip</depend>
	<use type="module">res_statsd</use>
	<support_level>core</support_level>
</module>
	<configInfo name="res_pjsip_outbound_registration" language="en_US">
		<synopsis>SIP resource for outbound registrations</synopsis>
		<description><para>
			<emphasis>Outbound Registration</emphasis>
			</para>
			<para>This module allows <literal>res_pjsip</literal> to register to other SIP servers.</para>
		</description>
		<configFile name="pjsip.conf">
			<configObject name="registration">
				<since>
					<version>12.0.0</version>
				</since>
				<synopsis>The configuration for outbound registration</synopsis>
				<description><para>
					Registration is <emphasis>COMPLETELY</emphasis> separate from the rest of
					<literal>pjsip.conf</literal>. A minimal configuration consists of
					setting a <literal>server_uri</literal>	and a <literal>client_uri</literal>.
				</para></description>
				<configOption name="auth_rejection_permanent" default="yes">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Determines whether failed authentication challenges are treated
					as permanent failures.</synopsis>
					<description><para>If this option is enabled and an authentication challenge fails,
					registration will not be attempted again until the configuration is reloaded.</para></description>
				</configOption>
				<configOption name="client_uri">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Client SIP URI used when attemping outbound registration</synopsis>
					<description><para>
						This is the address-of-record for the outbound registration (i.e. the URI in
						the To header of the REGISTER).</para>
						<para>For registration with an ITSP, the client SIP URI may need to consist of
						an account name or number and the provider's hostname for their registrar, e.g.
						client_uri=1234567890@example.com. This may differ between providers.</para>
						<para>For registration to generic registrars, the client SIP URI will depend
						on networking specifics and configuration of the registrar.
					</para></description>
				</configOption>
				<configOption name="contact_user" default="s">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Contact User to use in request. If this value is not set, this defaults to 's'</synopsis>
				</configOption>
				<configOption name="contact_header_params">
					<since>
						<version>17.0.0</version>
					</since>
					<synopsis>Header parameters to place in the Contact header</synopsis>
				</configOption>
				<configOption name="expiration" default="3600">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Expiration time for registrations in seconds</synopsis>
				</configOption>
				<configOption name="max_retries" default="10">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Maximum number of registration attempts.</synopsis>
					<description><para>
						This sets the maximum number of registration attempts that are made before
						stopping any further attempts. If set to 0 then upon failure no further attempts
						are made.
					</para></description>
				</configOption>
				<configOption name="security_negotiation" default="no">
					<since>
						<version>21.0.0</version>
					</since>
					<synopsis>The kind of security agreement negotiation to use. Currently, only mediasec is supported.</synopsis>
					<description>
						<enumlist>
							<enum name="no" />
							<enum name="mediasec" />
						</enumlist>
					</description>
				</configOption>
				<configOption name="security_mechanisms">
					<since>
						<version>21.0.0</version>
					</since>
					<synopsis>List of security mechanisms supported.</synopsis>
					<description><para>
						This is a comma-delimited list of security mechanisms to use. Each security mechanism
						must be in the form defined by RFC 3329 section 2.2.
					</para></description>
				</configOption>
				<configOption name="outbound_auth" default="">
					<since>
						<version>12.2.0</version>
					</since>
					<synopsis>Authentication object(s) to be used for outbound registrations.</synopsis>
					<description><para>
						This is a comma-delimited list of <replaceable>auth</replaceable>
						sections defined in <filename>pjsip.conf</filename> used to respond
						to outbound authentication challenges.</para>
						<note><para>
						Using the same auth section for inbound and outbound
						authentication is not recommended.  There is a difference in
						meaning for an empty realm setting between inbound and outbound
						authentication uses.  See the auth realm description for details.
						</para></note>
					</description>
				</configOption>
				<configOption name="outbound_proxy" default="">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Full SIP URI of the outbound proxy used to send registrations</synopsis>
				</configOption>
				<configOption name="max_random_initial_delay" default="10">
					<since>
						<version>16.27.0</version>
						<version>18.13.0</version>
						<version>19.5.0</version>
					</since>
					<synopsis>Maximum interval in seconds for which an initial registration may be randomly delayed</synopsis>
					<description>
						<para>By default, registrations are randomly delayed by a small amount to prevent
						too many registrations from being made simultaneously.</para>
						<para>Depending on your system usage, it may be desirable to set this to a smaller
						or larger value to have fine grained control over the size of this random delay.</para>
					</description>
				</configOption>
				<configOption name="retry_interval" default="60">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Interval in seconds between retries if outbound registration is unsuccessful</synopsis>
				</configOption>
				<configOption name="forbidden_retry_interval" default="0">
					<since>
						<version>11.7.0</version>
					</since>
					<synopsis>Interval used when receiving a 403 Forbidden response.</synopsis>
					<description><para>
						If a 403 Forbidden is received, chan_pjsip will wait
						<replaceable>forbidden_retry_interval</replaceable> seconds before
						attempting registration again. If 0 is specified, chan_pjsip will not
						retry after receiving a 403 Forbidden response. Setting this to a non-zero
						value goes against a "SHOULD NOT" in RFC3261, but can be used to work around
						buggy registrars.
					</para></description>
				</configOption>
				<configOption name="fatal_retry_interval" default="0">
					<since>
						<version>13.7.0</version>
					</since>
					<synopsis>Interval used when receiving a Fatal response.</synopsis>
					<description><para>
						If a fatal response is received, chan_pjsip will wait
						<replaceable>fatal_retry_interval</replaceable> seconds before
						attempting registration again. If 0 is specified, chan_pjsip will not
						retry after receiving a fatal (non-temporary 4xx, 5xx, 6xx) response.
						Setting this to a non-zero value may go against a "SHOULD NOT" in RFC3261,
						but can be used to work around buggy registrars.</para>
						<note><para>if also set the <replaceable>forbidden_retry_interval</replaceable>
						takes precedence over this one when a 403 is received.
						Also, if <replaceable>auth_rejection_permanent</replaceable> equals 'yes' then
						a 401 and 407 become subject to this retry interval.</para></note>
					</description>
				</configOption>
				<configOption name="server_uri">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>SIP URI of the server to register against</synopsis>
					<description><para>
						This is the URI at which to find the registrar to send the outbound REGISTER. This URI
						is used as the request URI of the outbound REGISTER request from Asterisk.</para>
						<para>For registration with an ITSP, the setting may often be just the domain of
						the registrar, e.g. sip:sip.example.com.
					</para></description>
				</configOption>
				<configOption name="transport">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Transport used for outbound authentication</synopsis>
					<description>
						<note><para>A <replaceable>transport</replaceable> configured in
						<literal>pjsip.conf</literal>. As with other <literal>res_pjsip</literal> modules, this will use the first available transport of the appropriate type if unconfigured.</para></note>
					</description>
				</configOption>
				<configOption name="line">
					<since>
						<version>13.4.0</version>
					</since>
					<synopsis>Whether to add a 'line' parameter to the Contact for inbound call matching</synopsis>
					<description><para>
						When enabled this option will cause a 'line' parameter to be added to the Contact
						header placed into the outgoing registration request. If the remote server sends a call
						this line parameter will be used to establish a relationship to the outbound registration,
						ultimately causing the configured endpoint to be used.
					</para></description>
				</configOption>
				<configOption name="endpoint">
					<since>
						<version>13.4.0</version>
					</since>
					<synopsis>Endpoint to use for incoming related calls</synopsis>
					<description><para>
						When line support is enabled this configured endpoint name is used for incoming calls
						that are related to the outbound registration.
					</para></description>
				</configOption>
				<configOption name="type">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Must be of type 'registration'.</synopsis>
				</configOption>
				<configOption name="support_path">
					<since>
						<version>12.1.0</version>
					</since>
					<synopsis>Enables advertising SIP Path support for outbound REGISTER requests.</synopsis>
					<description><para>
						When this option is enabled, outbound REGISTER requests will advertise
						support for Path headers so that intervening proxies can add to the Path
						header as necessary.
					</para></description>
				</configOption>
				<configOption name="support_outbound">
					<since>
						<version>17.0.0</version>
					</since>
					<synopsis>Enables advertising SIP Outbound support (RFC5626) for outbound REGISTER requests.</synopsis>
				</configOption>
				<configOption name="user_agent">
					<since>
						<version>21.2.0</version>
					</since>
					<synopsis>Overrides the User-Agent header that should be used for outbound REGISTER requests.</synopsis>
				</configOption>
			</configObject>
		</configFile>
	</configInfo>
	<manager name="PJSIPUnregister" language="en_US" module="res_pjsip_outbound_registration">
		<since>
			<version>12.0.0</version>
		</since>
		<synopsis>
			Unregister an outbound registration.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="Registration" required="true">
				<para>The outbound registration to unregister or '*all' to unregister them all.</para>
			</parameter>
		</syntax>
		<description>
			<para>
			Unregisters the specified (or all) outbound registration(s) and stops future registration attempts.
			Call PJSIPRegister to start registration and schedule re-registrations according to configuration.
            </para>
		</description>
	</manager>
	<manager name="PJSIPRegister" language="en_US" module="res_pjsip_outbound_registration">
		<since>
			<version>13.2.0</version>
		</since>
		<synopsis>
			Register an outbound registration.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="Registration" required="true">
				<para>The outbound registration to register or '*all' to register them all.</para>
			</parameter>
		</syntax>
		<description>
			<para>
			Unregisters the specified (or all) outbound registration(s) then starts registration and schedules re-registrations
			according to configuration.
            </para>
		</description>
	</manager>
	<manager name="PJSIPShowRegistrationsOutbound" language="en_US" module="res_pjsip_outbound_registration">
		<since>
			<version>12.0.0</version>
		</since>
		<synopsis>
			Lists PJSIP outbound registrations.
		</synopsis>
		<syntax />
		<description>
			<para>
			In response <literal>OutboundRegistrationDetail</literal> events showing configuration and status
			information are raised for each outbound registration object. <literal>AuthDetail</literal>
			events are raised for each associated auth object as well.  Once all events are completed an
			<literal>OutboundRegistrationDetailComplete</literal> is issued.
                        </para>
		</description>
	</manager>
	<managerEvent language="en_US" name="OutboundRegistrationDetail" module="res_pjsip_outbound_registration">
		<managerEventInstance class="EVENT_FLAG_COMMAND" module="res_pjsip_outbound_registration">
			<since>
				<version>12.0.0</version>
			</since>
			<synopsis>
				Provides configuration details and status information about an
				outbound registration.
			</synopsis>
			<syntax>
				<parameter name="ObjectType">
					<para>The object's type. This will always be 'registration'.</para>
				</parameter>
				<parameter name="ObjectName">
					<para>The name of this object.</para>
				</parameter>
				<parameter name="MaxRetries">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip_outbound_registration']/configFile[@name='pjsip.conf']/configObject[@name='registration']/configOption[@name='max_retries']/synopsis/node())"/></para>
				</parameter>
				<parameter name="ClientUri">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip_outbound_registration']/configFile[@name='pjsip.conf']/configObject[@name='registration']/configOption[@name='client_uri']/synopsis/node())"/></para>
				</parameter>
				<parameter name="SecurityNegotiation">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip_outbound_registration']/configFile[@name='pjsip.conf']/configObject[@name='registration']/configOption[@name='security_negotiation']/synopsis/node())"/></para>
				</parameter>
				<parameter name="AuthRejectionPermanent">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip_outbound_registration']/configFile[@name='pjsip.conf']/configObject[@name='registration']/configOption[@name='auth_rejection_permanent']/synopsis/node())"/></para>
				</parameter>
				<parameter name="ServerUri">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip_outbound_registration']/configFile[@name='pjsip.conf']/configObject[@name='registration']/configOption[@name='server_uri']/synopsis/node())"/></para>
				</parameter>
				<parameter name="MaxRandomInitialDelay">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip_outbound_registration']/configFile[@name='pjsip.conf']/configObject[@name='registration']/configOption[@name='max_random_initial_delay']/synopsis/node())"/></para>
				</parameter>
				<parameter name="SupportPath">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip_outbound_registration']/configFile[@name='pjsip.conf']/configObject[@name='registration']/configOption[@name='support_path']/synopsis/node())"/></para>
				</parameter>
				<parameter name="RetryInterval">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip_outbound_registration']/configFile[@name='pjsip.conf']/configObject[@name='registration']/configOption[@name='retry_interval']/synopsis/node())"/></para>
				</parameter>
				<parameter name="ContactHeaderParams">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip_outbound_registration']/configFile[@name='pjsip.conf']/configObject[@name='registration']/configOption[@name='contact_header_params']/synopsis/node())"/></para>
				</parameter>
				<parameter name="Expiration">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip_outbound_registration']/configFile[@name='pjsip.conf']/configObject[@name='registration']/configOption[@name='expiration']/synopsis/node())"/></para>
				</parameter>
				<parameter name="Transport">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip_outbound_registration']/configFile[@name='pjsip.conf']/configObject[@name='registration']/configOption[@name='transport']/synopsis/node())"/></para>
				</parameter>
				<parameter name="Line">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip_outbound_registration']/configFile[@name='pjsip.conf']/configObject[@name='registration']/configOption[@name='line']/synopsis/node())"/></para>
				</parameter>
				<parameter name="ContactUser">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip_outbound_registration']/configFile[@name='pjsip.conf']/configObject[@name='registration']/configOption[@name='contact_user']/synopsis/node())"/></para>
				</parameter>
				<parameter name="Endpoint">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip_outbound_registration']/configFile[@name='pjsip.conf']/configObject[@name='registration']/configOption[@name='endpoint']/synopsis/node())"/></para>
				</parameter>
				<parameter name="UserAgent">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip_outbound_registration']/configFile[@name='pjsip.conf']/configObject[@name='registration']/configOption[@name='user_agent']/synopsis/node())"/></para>
				</parameter>
				<parameter name="ForbiddenRetryInterval">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip_outbound_registration']/configFile[@name='pjsip.conf']/configObject[@name='registration']/configOption[@name='forbidden_retry_interval']/synopsis/node())"/></para>
				</parameter>
				<parameter name="OutboundAuth">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip_outbound_registration']/configFile[@name='pjsip.conf']/configObject[@name='registration']/configOption[@name='outbound_auth']/synopsis/node())"/></para>
				</parameter>
				<parameter name="OutboundProxy">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip_outbound_registration']/configFile[@name='pjsip.conf']/configObject[@name='registration']/configOption[@name='outbound_proxy']/synopsis/node())"/></para>
				</parameter>
				<parameter name="FatalRetryInterval">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip_outbound_registration']/configFile[@name='pjsip.conf']/configObject[@name='registration']/configOption[@name='fatal_retry_interval']/synopsis/node())"/></para>
				</parameter>
				<parameter name="SupportOutbound">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip_outbound_registration']/configFile[@name='pjsip.conf']/configObject[@name='registration']/configOption[@name='support_outbound']/synopsis/node())"/></para>
				</parameter>
				<parameter name="Status">
					<para>The current status of this registration. Will be one of:</para>
					<enumlist>
						<enum name="Registered"/>
						<enum name="Unregistered"/>
						<enum name="Rejected"/>
					</enumlist>
				</parameter>
				<parameter name="NextReg">
					<para>The number of seconds until the next registration.</para>
				</parameter>
			</syntax>
		</managerEventInstance>
	</managerEvent>
<module language="en_US" name="res_pjsip_path">
	<depend>pjproject</depend>
	<depend>res_pjsip</depend>
	<depend>res_pjsip_session</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="res_pjsip_phoneprov_provider">
	<depend>pjproject</depend>
	<depend>res_pjsip</depend>
	<depend>res_phoneprov</depend>
	<support_level>extended</support_level>
</module>
	<configInfo name="res_pjsip_phoneprov_provider" language="en_US">
		<synopsis>Module that integrates res_pjsip with res_phoneprov.</synopsis>
		<description><para>
			<emphasis>PJSIP Phoneprov Provider</emphasis>
			</para>
			<para>This module creates the integration between <literal>res_pjsip</literal> and
			<literal>res_phoneprov</literal>.
			</para>
			<para>Each user to be integrated requires a <literal>phoneprov</literal>
			section defined in <filename>pjsip.conf</filename>.  Each section identifies
			the endpoint associated with the user and any other name/value pairs to be passed
			on to res_phoneprov's template substitution.  Only <literal>MAC</literal> and
			<literal>PROFILE</literal> variables are required.  Any other variables
			supplied will be passed through.</para>
			<para> </para>
			<para>Example:</para>
			<para>[1000]</para>
			<para>type = phoneprovr</para>
			<para>endpoint = ep1000</para>
			<para>MAC = deadbeef4dad</para>
			<para>PROFILE = grandstream2</para>
			<para>LINEKEYS = 2</para>
			<para>LINE = 1</para>
			<para>OTHERVAR = othervalue</para>
			<para> </para>
			<para>The following variables are automatically defined if an endpoint
			is defined for the user:</para>
			<enumlist>
				<enum name="USERNAME"><para>Source: The user_name defined in the first auth reference
				in the endpoint.</para></enum>
				<enum name="SECRET"><para>Source: The user_pass defined in the first auth reference
				in the endpoint.</para></enum>
				<enum name="CALLERID"><para>Source: The number part of the callerid defined in
				the endpoint.</para></enum>
				<enum name="DISPLAY_NAME"><para>Source: The name part of the callerid defined in
				the endpoint.</para></enum>
				<enum name="LABEL"><para>Source: The id of the phoneprov section.</para></enum>
			</enumlist>
			<para> </para>
			<para>In addition to the standard variables, the following are also automatically defined:</para>
			<enumlist>
				<enum name="ENDPOINT_ID"><para>Source: The id of the endpoint.</para></enum>
				<enum name="TRANSPORT_ID"><para>Source: The id of the transport used by the endpoint.</para></enum>
				<enum name="AUTH_ID"><para>Source: The id of the auth used by the endpoint.</para></enum>
			</enumlist>
			<para> </para>
			<para>All other template substitution variables must be explicitly defined in the
			phoneprov_default or phoneprov sections.</para>
		</description>

		<configFile name="pjsip.conf">
			<configObject name="phoneprov">
				<since>
					<version>12.7.0</version>
				</since>
				<synopsis>Provides variables for each user.</synopsis>
				<configOption name="type">
					<since>
						<version>13.2.0</version>
					</since>
					<synopsis>Must be of type 'phoneprov'.</synopsis>
				</configOption>
				<configOption name="endpoint">
					<synopsis>The endpoint from which variables will be retrieved.</synopsis>
				</configOption>
				<configOption name="MAC">
					<synopsis>The mac address for this user. (required)</synopsis>
				</configOption>
				<configOption name="PROFILE">
					<synopsis>The phoneprov profile to use for this user. (required)</synopsis>
				</configOption>
				<configOption name="*">
					<synopsis>Other name/value pairs to be passed through for use in templates.</synopsis>
				</configOption>
			</configObject>
		</configFile>
	</configInfo>
<module language="en_US" name="res_pjsip_pidf_body_generator">
	<depend>pjproject</depend>
	<depend>res_pjsip</depend>
	<depend>res_pjsip_pubsub</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="res_pjsip_pidf_digium_body_supplement">
	<depend>pjproject</depend>
	<depend>res_pjsip</depend>
	<depend>res_pjsip_pubsub</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="res_pjsip_pidf_eyebeam_body_supplement">
	<depend>pjproject</depend>
	<depend>res_pjsip</depend>
	<depend>res_pjsip_pubsub</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="res_pjsip_publish_asterisk">
	<depend>pjproject</depend>
	<depend>res_pjsip</depend>
	<depend>res_pjsip_outbound_publish</depend>
	<depend>res_pjsip_pubsub</depend>
	<support_level>core</support_level>
</module>
	<configInfo name="res_pjsip_publish_asterisk" language="en_US">
		<synopsis>SIP resource for inbound and outbound Asterisk event publications</synopsis>
		<description><para>
			<emphasis>Inbound and outbound Asterisk event publication</emphasis>
			</para>
			<para>This module allows <literal>res_pjsip</literal> to send and receive Asterisk event publications.</para>
		</description>
		<configFile name="pjsip.conf">
			<configObject name="asterisk-publication">
				<since>
					<version>13.0.0</version>
				</since>
				<synopsis>The configuration for inbound Asterisk event publication</synopsis>
				<description><para>
					Publish is <emphasis>COMPLETELY</emphasis> separate from the rest of
					<literal>pjsip.conf</literal>.
				</para></description>
				<configOption name="devicestate_publish">
					<since>
						<version>13.0.0</version>
					</since>
					<synopsis>Optional name of a publish item that can be used to publish a request for full device state information.</synopsis>
				</configOption>
				<configOption name="mailboxstate_publish">
					<since>
						<version>13.0.0</version>
					</since>
					<synopsis>Optional name of a publish item that can be used to publish a request for full mailbox state information.</synopsis>
				</configOption>
				<configOption name="device_state" default="no">
					<since>
						<version>13.0.0</version>
					</since>
					<synopsis>Whether we should permit incoming device state events.</synopsis>
				</configOption>
				<configOption name="device_state_filter">
					<since>
						<version>13.0.0</version>
					</since>
					<synopsis>Optional regular expression used to filter what devices we accept events for.</synopsis>
				</configOption>
				<configOption name="mailbox_state" default="no">
					<since>
						<version>13.0.0</version>
					</since>
					<synopsis>Whether we should permit incoming mailbox state events.</synopsis>
				</configOption>
				<configOption name="mailbox_state_filter">
					<since>
						<version>13.0.0</version>
					</since>
					<synopsis>Optional regular expression used to filter what mailboxes we accept events for.</synopsis>
				</configOption>
				<configOption name="type">
					<since>
						<version>13.0.0</version>
					</since>
					<synopsis>Must be of type 'asterisk-publication'.</synopsis>
				</configOption>
			</configObject>
		</configFile>
	</configInfo>
<module language="en_US" name="res_pjsip_pubsub">
	<depend>pjproject</depend>
	<depend>res_pjsip</depend>
	<support_level>core</support_level>
</module>
	<manager name="PJSIPShowSubscriptionsInbound" language="en_US" module="res_pjsip_pubsub">
		<since>
			<version>12.0.0</version>
		</since>
		<synopsis>
			Lists inbound subscriptions.
		</synopsis>
		<syntax />
		<description>
			<para>
			Provides a listing of all inbound subscriptions.  An event <literal>InboundSubscriptionDetail</literal>
			is issued for each subscription object.  Once all detail events are completed an
			<literal>InboundSubscriptionDetailComplete</literal> event is issued.
                        </para>
		</description>
	</manager>
	<managerEvent language="en_US" name="InboundSubscriptionDetail" module="res_pjsip_pubsub">
		<managerEventInstance class="EVENT_FLAG_COMMAND" module="res_pjsip_pubsub">
			<since>
				<version>12.0.0</version>
			</since>
			<synopsis>
				Provides details about an inbound subscription - one in which Asterisk
				handles SUBSCRIBE requests and periodically sends NOTIFYs to its
				subscribers.
			</synopsis>
			<syntax>
				<parameter name="Role">
					<para>Asterisk's role for this subscription. This will always be
					<literal>Notifier</literal>.</para>
				</parameter>
				<parameter name="Endpoint">
					<para>The name of the endpoint associated with this
					subscription.</para>
				</parameter>
				<parameter name="Callid">
					<para>The CallID of the dialog associated with this
					subscription.</para>
				</parameter>
				<parameter name="State">
					<para>The current state of the subscription.</para>
				</parameter>
				<parameter name="Callerid">
					<para>The Caller ID of the endpoint associated with this
					subscription.</para>
				</parameter>
				<parameter name="SubscriptionType">
					<para>Asterisk currently supports the following subscription types, but
					this could also be extended by third-party modules so this list may not
					be exhaustive:</para>
					<enumlist>
						<enum name="mwi"/>
						<enum name="extension_state"/>
					</enumlist>
				</parameter>
				<parameter name="Extension">
					<para>If the <literal>SubscriptionType</literal> is
					<literal>extension_state</literal> this will be the monitored
					extension.</para>
				</parameter>
				<parameter name="ExtensionStates">
					<para>If the <literal>SubscriptionType</literal> is
					<literal>extension_state</literal> this will be the monitored
					extension's state.</para>
					<enumlist>
						<enum name="Idle"/>
						<enum name="InUse"/>
						<enum name="Busy"/>
						<enum name="Unavailable"/>
						<enum name="Ringing"/>
						<enum name="InUse&amp;Ringing"/>
						<enum name="Hold"/>
						<enum name="InUse&amp;Hold"/>
						<enum name="Unknown"/>
					</enumlist>
				</parameter>
				<parameter name="Mailboxes">
					<para>If the <literal>SubscriptionType</literal> is
					<literal>mwi</literal> this will be a comma-separated list of
					mailboxes.</para>
				</parameter>
			</syntax>
		</managerEventInstance>
	</managerEvent>
	<manager name="PJSIPShowSubscriptionsOutbound" language="en_US" module="res_pjsip_pubsub">
		<since>
			<version>12.0.0</version>
		</since>
		<synopsis>
			Lists outbound subscriptions.
		</synopsis>
		<syntax />
		<description>
			<para>
			Provides a listing of all outbound subscriptions.  An event <literal>OutboundSubscriptionDetail</literal>
			is issued for each subscription object.  Once all detail events are completed an
			<literal>OutboundSubscriptionDetailComplete</literal> event is issued.
                        </para>
		</description>
	</manager>
	<managerEvent language="en_US" name="OutboundSubscriptionDetail" module="res_pjsip_pubsub">
		<managerEventInstance class="EVENT_FLAG_COMMAND" module="res_pjsip_pubsub">
			<since>
				<version>12.0.0</version>
			</since>
			<synopsis>
				Provides details about an outbound subscription - one in which Asterisk
				sends SUBSCRIBE requests and periodically receives NOTIFYs.
			</synopsis>
			<syntax>
				<parameter name="Role">
					<para>Asterisk's role for this subscription. This will always be
					<literal>Subscriber</literal>.</para>
				</parameter>
				<parameter name="Endpoint">
					<para>The name of the endpoint associated with this
					subscription.</para>
				</parameter>
				<parameter name="Callid">
					<para>The CallID of the dialog associated with this
					subscription.</para>
				</parameter>
				<parameter name="State">
					<para>The current state of the subscription.</para>
				</parameter>
				<parameter name="Callerid">
					<para>The Caller ID of the endpoint associated with this
					subscription.</para>
				</parameter>
				<parameter name="SubscriptionType">
					<para>Asterisk currently supports the following subscription types, but
					this could also be extended by third-party modules so this list may not
					be exhaustive:</para>
					<enumlist>
						<enum name="mwi"/>
						<enum name="extension_state"/>
					</enumlist>
				</parameter>
				<parameter name="Extension">
					<para>If the <literal>SubscriptionType</literal> is
					<literal>extension_state</literal> this will be the monitored
					extension.</para>
				</parameter>
				<parameter name="ExtensionStates">
					<para>If the <literal>SubscriptionType</literal> is
					<literal>extension_state</literal> this will be the monitored
					extension's state.</para>
					<enumlist>
						<enum name="Idle"/>
						<enum name="InUse"/>
						<enum name="Busy"/>
						<enum name="Unavailable"/>
						<enum name="Ringing"/>
						<enum name="InUse&amp;Ringing"/>
						<enum name="Hold"/>
						<enum name="InUse&amp;Hold"/>
						<enum name="Unknown"/>
					</enumlist>
				</parameter>
				<parameter name="Mailboxes">
					<para>If the <literal>SubscriptionType</literal> is
					<literal>mwi</literal> this will be a comma-separated list of
					mailboxes.</para>
				</parameter>
			</syntax>
		</managerEventInstance>
	</managerEvent>
	<manager name="PJSIPShowResourceLists" language="en_US" module="res_pjsip_pubsub">
		<since>
			<version>13.0.0</version>
		</since>
		<synopsis>
			Displays settings for configured resource lists.
		</synopsis>
		<syntax />
		<description>
			<para>
			Provides a listing of all resource lists.  An event <literal>ResourceListDetail</literal>
			is issued for each resource list object.  Once all detail events are completed a
			<literal>ResourceListDetailComplete</literal> event is issued.
                        </para>
		</description>
	</manager>
	<managerEvent language="en_US" name="ResourceListDetail" module="res_pjsip_pubsub">
		<managerEventInstance class="EVENT_FLAG_COMMAND" module="res_pjsip_pubsub">
			<since>
				<version>13.0.0</version>
			</since>
			<synopsis>Provides details about a resource list.</synopsis>
			<syntax>
				<parameter name="ObjectType">
					<para>The object's type. This will always be 'resource_list'.</para>
				</parameter>
				<parameter name="ObjectName">
					<para>The name of this object.</para>
				</parameter>
				<parameter name="Event">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip_pubsub']/configFile[@name='pjsip.conf']/configObject[@name='resource_list']/configOption[@name='event']/synopsis/node())"/></para>
				</parameter>
				<parameter name="FullState">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip_pubsub']/configFile[@name='pjsip.conf']/configObject[@name='resource_list']/configOption[@name='full_state']/synopsis/node())"/></para>
				</parameter>
				<parameter name="ListItem">
					<para>A comma-separated list of resources that belong to this resource list.</para>
				</parameter>
				<parameter name="NotificationBatchInterval">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip_pubsub']/configFile[@name='pjsip.conf']/configObject[@name='resource_list']/configOption[@name='notification_batch_interval']/synopsis/node())"/></para>
				</parameter>
				<parameter name="ResourceDisplayName">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip_pubsub']/configFile[@name='pjsip.conf']/configObject[@name='resource_list']/configOption[@name='resource_display_name']/synopsis/node())"/></para>
				</parameter>
			</syntax>
		</managerEventInstance>
	</managerEvent>

	<configInfo name="res_pjsip_pubsub" language="en_US">
		<synopsis>Module that implements publish and subscribe support.</synopsis>
		<configFile name="pjsip.conf">
			<configObject name="subscription_persistence">
				<synopsis>Persists SIP subscriptions so they survive restarts.</synopsis>
				<configOption name="packet">
					<synopsis>Entire SIP SUBSCRIBE packet that created the subscription</synopsis>
				</configOption>
				<configOption name="src_name">
					<synopsis>The source address of the subscription</synopsis>
				</configOption>
				<configOption name="src_port">
					<synopsis>The source port of the subscription</synopsis>
				</configOption>
				<configOption name="transport_key">
					<synopsis>The type of transport the subscription was received on</synopsis>
				</configOption>
				<configOption name="local_name">
					<synopsis>The local address the subscription was received on</synopsis>
				</configOption>
				<configOption name="local_port">
					<synopsis>The local port the subscription was received on</synopsis>
				</configOption>
				<configOption name="cseq">
					<synopsis>The sequence number of the next NOTIFY to be sent</synopsis>
				</configOption>
				<configOption name="tag">
					<synopsis>The local tag of the dialog for the subscription</synopsis>
				</configOption>
				<configOption name="endpoint">
					<synopsis>The name of the endpoint that subscribed</synopsis>
				</configOption>
				<configOption name="expires">
					<synopsis>The time at which the subscription expires</synopsis>
				</configOption>
				<configOption name="contact_uri">
					<synopsis>The Contact URI of the dialog for the subscription</synopsis>
				</configOption>
				<configOption name="prune_on_boot">
					<synopsis>If set, indicates that the contact used a reliable transport
					and therefore the subscription must be deleted after an asterisk restart.
					</synopsis>
				</configOption>
				<configOption name="generator_data">
					<synopsis>If set, contains persistence data for all generators of content
					for the subscription.
					</synopsis>
				</configOption>
			</configObject>
			<configObject name="resource_list">
				<since>
					<version>13.0.0</version>
				</since>
				<synopsis>Resource list configuration parameters.</synopsis>
				<description>
					<para>This configuration object allows for RFC 4662 resource list subscriptions
					to be specified. This can be useful to decrease the amount of subscription traffic
					that a server has to process.</para>
					<note>
						<para>Current limitations limit the size of SIP NOTIFY requests that Asterisk sends
						to double that of the PJSIP maximum packet length. If your resource list notifications
						are larger than this maximum, you will need to make adjustments.</para>
					</note>
				</description>
				<configOption name="type">
					<since>
						<version>13.0.0</version>
					</since>
					<synopsis>Must be of type 'resource_list'</synopsis>
				</configOption>
				<configOption name="event">
					<since>
						<version>13.0.0</version>
					</since>
					<synopsis>The SIP event package that the list resource belong to.</synopsis>
					<description><para>
						The SIP event package describes the types of resources that Asterisk reports
						the state of.
					</para>
						<enumlist>
							<enum name="presence"><para>
								Device state and presence reporting.
							</para></enum>
							<enum name="dialog"><para>
								This is identical to <replaceable>presence</replaceable>.
							</para></enum>
							<enum name="message-summary"><para>
								Message-waiting indication (MWI) reporting.
							</para></enum>
						</enumlist>
					</description>
				</configOption>
				<configOption name="list_item">
					<since>
						<version>13.0.0</version>
					</since>
					<synopsis>The name of a resource to report state on</synopsis>
					<description>
						<para>In general Asterisk looks up list items in the following way:</para>
						<para>1. Check if the list item refers to another configured resource list.</para>
						<para>2. Pass the name of the resource off to event-package-specific handlers
						   to find the specified resource.</para>
						<para>The second part means that the way the list item is specified depends
						on what type of list this is. For instance, if you have the <replaceable>event</replaceable>
						set to <literal>presence</literal>, then list items should be in the form of
						dialplan_extension@dialplan_context. For <literal>message-summary</literal> mailbox
						names should be listed.</para>
					</description>
				</configOption>
				<configOption name="full_state" default="no">
					<since>
						<version>13.0.0</version>
					</since>
					<synopsis>Indicates if the entire list's state should be sent out.</synopsis>
					<description>
						<para>If this option is enabled, and a resource changes state, then Asterisk will construct
						a notification that contains the state of all resources in the list. If the option is
						disabled, Asterisk will construct a notification that only contains the states of
						resources that have changed.</para>
						<note>
							<para>Even with this option disabled, there are certain situations where Asterisk is forced
							to send a notification with the states of all resources in the list. When a subscriber
							renews or terminates its subscription to the list, Asterisk MUST send a full state
							notification.</para>
						</note>
					</description>
				</configOption>
				<configOption name="notification_batch_interval" default="0">
					<since>
						<version>13.0.0</version>
					</since>
					<synopsis>Time Asterisk should wait, in milliseconds, before sending notifications.</synopsis>
					<description>
						<para>When a resource's state changes, it may be desired to wait a certain amount before Asterisk
						sends a notification to subscribers. This allows for other state changes to accumulate, so that
						Asterisk can communicate multiple state changes in a single notification instead of rapidly sending
						many notifications.</para>
					</description>
				</configOption>
				<configOption name="resource_display_name" default="no">
					<since>
						<version>16.25.0</version>
						<version>18.11.0</version>
						<version>19.3.0</version>
					</since>
					<synopsis>Indicates whether display name of resource or the resource name being reported.</synopsis>
					<description>
						<para>If this option is enabled, the Display Name will be reported as resource name.
						If the <replaceable>event</replaceable> set to <literal>presence</literal> or <literal>dialog</literal>,
						the non-empty HINT name will be set as the Display Name.
						The <literal>message-summary</literal> is not supported yet.</para>
					</description>
				</configOption>
			</configObject>
			<configObject name="inbound-publication">
				<since>
					<version>13.0.0</version>
				</since>
				<synopsis>The configuration for inbound publications</synopsis>
				<configOption name="endpoint" default="">
					<since>
						<version>13.0.0</version>
					</since>
					<synopsis>Optional name of an endpoint that is only allowed to publish to this resource</synopsis>
				</configOption>
				<configOption name="type">
					<since>
						<version>13.0.0</version>
					</since>
					<synopsis>Must be of type 'inbound-publication'.</synopsis>
				</configOption>
			</configObject>
		</configFile>
	</configInfo>
<module language="en_US" name="res_pjsip_refer">
	<depend>pjproject</depend>
	<depend>res_pjsip</depend>
	<depend>res_pjsip_session</depend>
	<depend>res_pjsip_pubsub</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="res_pjsip_registrar">
	<depend>pjproject</depend>
	<depend>res_pjproject</depend>
	<depend>res_pjsip</depend>
	<support_level>core</support_level>
</module>
	<manager name="PJSIPShowRegistrationsInbound" language="en_US" module="res_pjsip_registrar">
		<since>
			<version>12.0.0</version>
		</since>
		<synopsis>
			Lists PJSIP inbound registrations.
		</synopsis>
		<syntax />
		<description>
			<para>
			In response, <literal>InboundRegistrationDetail</literal> events showing configuration
			and status information are raised for all contacts, static or dynamic.  Once all events
			are completed an <literal>InboundRegistrationDetailComplete</literal> is issued.
			</para>
			<warning><para>
				This command just dumps all coonfigured AORs with contacts, even if the contact
				is a permanent one.  To really get just inbound registrations, use
				<literal>PJSIPShowRegistrationInboundContactStatuses</literal>.
			</para>
			</warning>
		</description>
		<see-also>
			<ref type="manager" module="res_pjsip_registrar">PJSIPShowRegistrationInboundContactStatuses</ref>
		</see-also>
	</manager>
	<manager name="PJSIPShowRegistrationInboundContactStatuses" language="en_US" module="res_pjsip_registrar">
		<since>
			<version>14.3.0</version>
			<version>13.14.0</version>
		</since>
		<synopsis>
			Lists ContactStatuses for PJSIP inbound registrations.
		</synopsis>
		<syntax />
		<description>
			<para>
			In response, <literal>ContactStatusDetail</literal> events showing status information
			are raised for each inbound registration (dynamic contact) object.  Once all events
			are completed a <literal>ContactStatusDetailComplete</literal> event is issued.
			</para>
		</description>
	</manager>
	<managerEvent language="en_US" name="InboundRegistrationDetail" module="res_pjsip_registrar">
		<managerEventInstance class="EVENT_FLAG_COMMAND" module="res_pjsip_registrar">
			<since>
				<version>12.0.0</version>
			</since>
			<synopsis>Provide details about the Address of Record (AoR) associated
			with a registration.</synopsis>
			<syntax>
				<parameter name="ObjectType">
					<para>The object's type. This will always be 'aor'.</para>
				</parameter>
				<parameter name="ObjectName">
					<para>The name of this object.</para>
				</parameter>
				<parameter name="MinimumExpiration">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='aor']/configOption[@name='minimum_expiration']/synopsis/node())"/></para>
				</parameter>
				<parameter name="DefaultExpiration">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='aor']/configOption[@name='default_expiration']/synopsis/node())"/></para>
				</parameter>
				<parameter name="QualifyTimeout">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='aor']/configOption[@name='qualify_timeout']/synopsis/node())"/></para>
				</parameter>
				<parameter name="Qualify2xxOnly">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='aor']/configOption[@name='qualify_2xx_only']/synopsis/node())"/></para>
				</parameter>
				<parameter name="Mailboxes">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='aor']/configOption[@name='mailboxes']/synopsis/node())"/></para>
				</parameter>
				<parameter name="SupportPath">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='aor']/configOption[@name='support_path']/synopsis/node())"/></para>
				</parameter>
				<parameter name="RemoveUnavailable">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='aor']/configOption[@name='remove_unavailable']/synopsis/node())"/></para>
				</parameter>
				<parameter name="VoicemailExtension">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='aor']/configOption[@name='voicemail_extension']/synopsis/node())"/></para>
				</parameter>
				<parameter name="MaxContacts">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='aor']/configOption[@name='max_contacts']/synopsis/node())"/></para>
				</parameter>
				<parameter name="AuthenticateQualify">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='aor']/configOption[@name='authenticate_qualify']/synopsis/node())"/></para>
				</parameter>
				<parameter name="MaximumExpiration">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='aor']/configOption[@name='maximum_expiration']/synopsis/node())"/></para>
				</parameter>
				<parameter name="QualifyFrequency">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='aor']/configOption[@name='qualify_frequency']/synopsis/node())"/></para>
				</parameter>
				<parameter name="RemoveExisting">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='aor']/configOption[@name='remove_existing']/synopsis/node())"/></para>
				</parameter>
				<parameter name="OutboundProxy">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='aor']/configOption[@name='outbound_proxy']/synopsis/node())"/></para>
				</parameter>
				<parameter name="Contacts">
					<para>A comma-separated list of contacts associated with this AoR.</para>
				</parameter>
				<parameter name="Contact">
					<para>The specific contact associated with this registration.</para>
				</parameter>
			</syntax>
		</managerEventInstance>
	</managerEvent>
<module language="en_US" name="res_pjsip_rfc3326">
	<depend>pjproject</depend>
	<depend>res_pjsip</depend>
	<depend>res_pjsip_session</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="res_pjsip_rfc3329">
	<depend>pjproject</depend>
	<depend>res_pjsip</depend>
	<depend>res_pjsip_session</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="res_pjsip_sdp_rtp">
	<depend>pjproject</depend>
	<depend>res_pjsip</depend>
	<depend>res_pjsip_session</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="res_pjsip_send_to_voicemail">
	 <depend>pjproject</depend>
	 <depend>res_pjsip</depend>
	 <depend>res_pjsip_session</depend>
	 <support_level>core</support_level>
</module>
<module language="en_US" name="res_pjsip_session">
	<depend>pjproject</depend>
	<depend>res_pjsip</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="res_pjsip_sips_contact">
	<depend>pjproject</depend>
	<depend>res_pjsip</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="res_pjsip_stir_shaken">
	<depend>pjproject</depend>
	<depend>res_pjsip</depend>
	<depend>res_pjsip_session</depend>
	<depend>res_stir_shaken</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="res_pjsip_t38">
	<depend>pjproject</depend>
	<depend>res_pjsip</depend>
	<depend>res_pjsip_session</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="res_pjsip_transport_websocket">
	<depend>pjproject</depend>
	<depend>res_pjsip</depend>
	<depend>res_http_websocket</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="res_pjsip_xpidf_body_generator">
	<depend>pjproject</depend>
	<depend>res_pjsip</depend>
	<depend>res_pjsip_pubsub</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="res_prometheus">
	<use>pjproject</use>
	<use type="module">res_pjsip</use>
	<use type="module">res_pjsip_outbound_registration</use>
	<support_level>extended</support_level>
</module>
	<configInfo name="res_prometheus" language="en_US">
		<synopsis>Resource for integration with Prometheus</synopsis>
		<configFile name="prometheus.conf">
			<configObject name="general">
				<since>
					<version>17.0.0</version>
				</since>
				<synopsis>General settings.</synopsis>
				<description>
					<para>
					The <emphasis>general</emphasis> settings section contains information
					to configure Asterisk to serve up statistics for a Prometheus server.
					</para>
					<note>
						<para>You must enable Asterisk's HTTP server in <filename>http.conf</filename>
						for this module to function properly!
						</para>
					</note>
				</description>
				<configOption name="enabled" default="no">
					<since>
						<version>17.0.0</version>
					</since>
					<synopsis>Enable or disable Prometheus statistics.</synopsis>
					<description>
						<enumlist>
							<enum name="no" />
							<enum name="yes" />
						</enumlist>
					</description>
				</configOption>
				<configOption name="core_metrics_enabled" default="yes">
					<since>
						<version>17.0.0</version>
					</since>
					<synopsis>Enable or disable core metrics.</synopsis>
					<description>
						<para>
						Core metrics show various properties of the Asterisk system, including
						how the binary was built, the version, uptime, last reload time, etc.
						Generally, these options are harmless and should always be enabled.
						This option mostly exists to disable output of all options for testing
						purposes, as well as for those foolish souls who really don't care
						what version of Asterisk they're running.
						</para>
						<enumlist>
							<enum name="no" />
							<enum name="yes" />
						</enumlist>
					</description>
				</configOption>
				<configOption name="uri" default="metrics">
					<since>
						<version>17.0.0</version>
					</since>
					<synopsis>The HTTP URI to serve metrics up on.</synopsis>
				</configOption>
				<configOption name="auth_username">
					<since>
						<version>17.0.0</version>
					</since>
					<synopsis>Username to use for Basic Auth.</synopsis>
					<description>
						<para>
						If set, use Basic Auth to authenticate requests to the route
						specified by <replaceable>uri</replaceable>. Note that you
						will need to configure your Prometheus server with the
						appropriate auth credentials.
						</para>
						<para>
						If set, <replaceable>auth_password</replaceable> must also
						be set appropriately.
						</para>
						<warning>
							<para>
							It is highly recommended to set up Basic Auth. Failure
							to do so may result in useful information about your
							Asterisk system being made easily scrapable by the
							wide world. Consider yourself duly warned.
							</para>
						</warning>
					</description>
				</configOption>
				<configOption name="auth_password">
					<since>
						<version>17.0.0</version>
					</since>
					<synopsis>Password to use for Basic Auth.</synopsis>
					<description>
						<para>
						If set, this is used in conjunction with <replaceable>auth_username</replaceable>
						to require Basic Auth for all requests to the Prometheus metrics. Note that
						setting this without <replaceable>auth_username</replaceable> will not
						do anything.
						</para>
					</description>
				</configOption>
				<configOption name="auth_realm" default="Asterisk Prometheus Metrics">
					<since>
						<version>17.0.0</version>
					</since>
					<synopsis>Auth realm used in challenge responses</synopsis>
				</configOption>
			</configObject>
		</configFile>
	</configInfo>
<module language="en_US" name="res_realtime">
	<support_level>core</support_level>
</module>
<module language="en_US" name="res_remb_modifier">
	<defaultenabled>no</defaultenabled>
	<support_level>extended</support_level>
</module>
<module language="en_US" name="res_resolver_unbound">
	<depend>unbound</depend>
	<support_level>core</support_level>
</module>
	<configInfo name="res_resolver_unbound" language="en_US">
		<configFile name="resolver_unbound.conf">
			<configObject name="general">
				<since>
					<version>14.1.0</version>
				</since>
				<synopsis>General options for res_resolver_unbound</synopsis>
				<configOption name="hosts">
					<since>
						<version>14.0.0</version>
					</since>
					<synopsis>Full path to an optional hosts file</synopsis>
					<description><para>Hosts specified in a hosts file will be resolved within the resolver itself. If a value
					of system is provided the system-specific file will be used.</para></description>
				</configOption>
				<configOption name="resolv">
					<since>
						<version>14.0.0</version>
					</since>
					<synopsis>Full path to an optional resolv.conf file</synopsis>
					<description><para>The resolv.conf file specifies the nameservers to contact when resolving queries. If a
					value of system is provided the system-specific file will be used. If provided alongside explicit nameservers the
					nameservers contained within the resolv.conf file will be used after all others.</para></description>
				</configOption>
				<configOption name="nameserver">
					<since>
						<version>14.0.0</version>
					</since>
					<synopsis>Nameserver to use for queries</synopsis>
					<description><para>An explicit nameserver can be specified which is used for resolving queries. If multiple
					nameserver lines are specified the first will be the primary with failover occurring, in order, to the other
					nameservers as backups. If provided alongside a resolv.conf file the nameservers explicitly specified will be
					used before all others.</para></description>
				</configOption>
				<configOption name="debug">
					<since>
						<version>14.0.0</version>
					</since>
					<synopsis>Unbound debug level</synopsis>
					<description><para>The debugging level for the unbound resolver. While there is no explicit range generally
					the higher the number the more debug is output.</para></description>
				</configOption>
				<configOption name="ta_file">
					<since>
						<version>14.0.0</version>
					</since>
					<synopsis>Trust anchor file</synopsis>
					<description><para>Full path to a file with DS and DNSKEY records in zone file format. This file is provided
					to unbound and is used as a source for trust anchors.</para></description>
				</configOption>
			</configObject>
		</configFile>
	</configInfo>
<module language="en_US" name="res_rtp_asterisk">
	<use type="external">openssl</use>
	<use type="external">pjproject</use>
	<support_level>core</support_level>
</module>
<module language="en_US" name="res_rtp_multicast">
	<support_level>core</support_level>
</module>
<module language="en_US" name="res_security_log">
	<support_level>core</support_level>
</module>
<module language="en_US" name="res_smdi">
	<support_level>extended</support_level>
</module>

	<function name="SMDI_MSG_RETRIEVE" language="en_US" module="res_smdi">
		<since>
			<version>1.4.19</version>
		</since>
		<synopsis>
			Retrieve an SMDI message.
		</synopsis>
		<syntax>
			<parameter name="smdi port" required="true" />
			<parameter name="search key" required="true" />
			<parameter name="timeout" />
			<parameter name="options">
				<enumlist>
					<enum name="t">
						<para>Instead of searching on the forwarding station, search on the message desk terminal.</para>
					</enum>
					<enum name="n">
						<para>Instead of searching on the forwarding station, search on the message desk number.</para>
					</enum>
				</enumlist>
			</parameter>
		</syntax>
		<description>
			<para>This function is used to retrieve an incoming SMDI message. It returns
			an ID which can be used with the SMDI_MSG() function to access details of
			the message.  Note that this is a destructive function in the sense that
			once an SMDI message is retrieved using this function, it is no longer in
			the global SMDI message queue, and can not be accessed by any other Asterisk
			channels.  The timeout for this function is optional, and the default is
			3 seconds.  When providing a timeout, it should be in milliseconds.
			</para>
			<para>The default search is done on the forwarding station ID. However, if
			you set one of the search key options in the options field, you can change
			this behavior.
			</para>
		</description>
		<see-also>
			<ref type="function">SMDI_MSG</ref>
		</see-also>
	</function>
	<function name="SMDI_MSG" language="en_US" module="res_smdi">
		<since>
			<version>1.4.19</version>
		</since>
		<synopsis>
			Retrieve details about an SMDI message.
		</synopsis>
		<syntax>
			<parameter name="message_id" required="true" />
			<parameter name="component" required="true">
				<para>Valid message components are:</para>
				<enumlist>
					<enum name="number">
						<para>The message desk number</para>
					</enum>
					<enum name="terminal">
						<para>The message desk terminal</para>
					</enum>
					<enum name="station">
						<para>The forwarding station</para>
					</enum>
					<enum name="callerid">
						<para>The callerID of the calling party that was forwarded</para>
					</enum>
					<enum name="type">
						<para>The call type.  The value here is the exact character
						that came in on the SMDI link.  Typically, example values
						are:</para>
						<para>Options:</para>
						<enumlist>
							<enum name="D">
								<para>Direct Calls</para>
							</enum>
							<enum name="A">
								<para>Forward All Calls</para>
							</enum>
							<enum name="B">
								<para>Forward Busy Calls</para>
							</enum>
							<enum name="N">
								<para>Forward No Answer Calls</para>
							</enum>
						</enumlist>
					</enum>
				</enumlist>
			</parameter>
		</syntax>
		<description>
			<para>This function is used to access details of an SMDI message that was
			pulled from the incoming SMDI message queue using the SMDI_MSG_RETRIEVE()
			function.</para>
		</description>
		<see-also>
			<ref type="function">SMDI_MSG_RETRIEVE</ref>
		</see-also>
	</function>
<module language="en_US" name="res_snmp">
	<depend>netsnmp</depend>
	<support_level>extended</support_level>
</module>
<module language="en_US" name="res_sorcery_astdb">
	<support_level>core</support_level>
</module>
<module language="en_US" name="res_sorcery_config">
	<support_level>core</support_level>
</module>
<module language="en_US" name="res_sorcery_memory">
	<support_level>core</support_level>
</module>
<module language="en_US" name="res_sorcery_memory_cache">
	<support_level>core</support_level>
</module>
	<manager name="SorceryMemoryCacheExpireObject" language="en_US" module="res_sorcery_memory_cache">
		<since>
			<version>13.5.0</version>
		</since>
		<synopsis>
			Expire (remove) an object from a sorcery memory cache.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="Cache" required="true">
				<para>The name of the cache to expire the object from.</para>
			</parameter>
			<parameter name="Object" required="true">
				<para>The name of the object to expire.</para>
			</parameter>
		</syntax>
		<description>
			<para>Expires (removes) an object from a sorcery memory cache. If full backend caching is enabled
			this action is not available and will fail. In this case the SorceryMemoryCachePopulate or
			SorceryMemoryCacheExpire AMI actions must be used instead.</para>
		</description>
	</manager>
	<manager name="SorceryMemoryCacheExpire" language="en_US" module="res_sorcery_memory_cache">
		<since>
			<version>13.5.0</version>
		</since>
		<synopsis>
			Expire (remove) ALL objects from a sorcery memory cache.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="Cache" required="true">
				<para>The name of the cache to expire all objects from.</para>
			</parameter>
		</syntax>
		<description>
			<para>Expires (removes) ALL objects from a sorcery memory cache.</para>
		</description>
	</manager>
	<manager name="SorceryMemoryCacheStaleObject" language="en_US" module="res_sorcery_memory_cache">
		<since>
			<version>13.5.0</version>
		</since>
		<synopsis>
			Mark an object in a sorcery memory cache as stale.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="Cache" required="true">
				<para>The name of the cache to mark the object as stale in.</para>
			</parameter>
			<parameter name="Object" required="true">
				<para>The name of the object to mark as stale.</para>
			</parameter>
			<parameter name="Reload" required="false">
				<para>If true, then immediately reload the object from the backend cache instead of waiting for the next retrieval</para>
			</parameter>
		</syntax>
		<description>
			<para>Marks an object as stale within a sorcery memory cache.</para>
		</description>
	</manager>
	<manager name="SorceryMemoryCacheStale" language="en_US" module="res_sorcery_memory_cache">
		<since>
			<version>13.5.0</version>
		</since>
		<synopsis>
			Marks ALL objects in a sorcery memory cache as stale.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="Cache" required="true">
				<para>The name of the cache to mark all object as stale in.</para>
			</parameter>
		</syntax>
		<description>
			<para>Marks ALL objects in a sorcery memory cache as stale.</para>
		</description>
	</manager>
	<manager name="SorceryMemoryCachePopulate" language="en_US" module="res_sorcery_memory_cache">
		<since>
			<version>13.7.0</version>
		</since>
		<synopsis>
			Expire all objects from a memory cache and populate it with all objects from the backend.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="Cache" required="true">
				<para>The name of the cache to populate.</para>
			</parameter>
		</syntax>
		<description>
			<para>Expires all objects from a memory cache and populate it with all objects from the backend.</para>
		</description>
	</manager>
<module language="en_US" name="res_sorcery_realtime">
	<support_level>core</support_level>
</module>
<module language="en_US" name="res_speech">
	<support_level>core</support_level>
</module>
<module language="en_US" name="res_speech_aeap">
	<support_level>core</support_level>
</module>
<module language="en_US" name="res_srtp">
	<depend>srtp</depend>
	<use type="external">openssl</use>
	<support_level>core</support_level>
</module>
<module language="en_US" name="res_stasis">
	<support_level>core</support_level>
</module>
<module language="en_US" name="res_stasis_answer">
	<depend type="module">res_stasis</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="res_stasis_broadcast">
	<depend type="module">res_stasis</depend>
	<depend type="module">res_ari</depend>
	<support_level>extended</support_level>
</module>
<module language="en_US" name="res_stasis_device_state">
	<depend type="module">res_stasis</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="res_stasis_mailbox">
	<depend type="module">res_stasis</depend>
	<depend type="module">res_mwi_external</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="res_stasis_playback">
	<depend type="module">res_stasis</depend>
	<depend type="module">res_stasis_recording</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="res_stasis_recording">
	<depend type="module">res_stasis</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="res_stasis_snoop">
	<depend type="module">res_stasis</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="res_stasis_test">
	<depend>TEST_FRAMEWORK</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="res_statsd">
	<support_level>extended</support_level>
</module>
	<configInfo name="res_statsd" language="en_US">
		<synopsis>StatsD client</synopsis>
		<description>
			<para>The <literal>res_statsd</literal> module provides an API that
			allows Asterisk and its modules to send statistics to a StatsD
			server. It only provides a means to communicate with a StatsD server
			and does not send any metrics of its own.</para>
			<para>An example module, <literal>res_chan_stats</literal>, is
			provided which uses the API exposed by this module to send channel
			statistics to the configured StatsD server.</para>
			<para>More information about StatsD can be found at
			https://github.com/statsd/statsd</para>
		</description>
		<configFile name="statsd.conf">
			<configObject name="global">
				<since>
					<version>12.0.0</version>
				</since>
				<synopsis>Global configuration settings</synopsis>
				<configOption name="enabled">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Enable/disable the StatsD module</synopsis>
				</configOption>
				<configOption name="server">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Address of the StatsD server</synopsis>
				</configOption>
				<configOption name="prefix">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Prefix to prepend to every metric</synopsis>
				</configOption>
				<configOption name="add_newline">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Append a newline to every event. This is useful if
					you want to fake out a server using netcat
					(nc -lu 8125)</synopsis>
				</configOption>
				<configOption name="meter_support">
					<since>
						<version>16.20.0</version>
						<version>18.6.0</version>
					</since>
					<synopsis>Enable/disable the non-standard StatsD Meter type,
					if disabled falls back to counter and will append a "_meter" suffix to the metric name</synopsis>
				</configOption>
			</configObject>
		</configFile>
	</configInfo>
<module language="en_US" name="res_stir_shaken">
	<depend>curl</depend>
	<depend>res_curl</depend>
	<depend>libjwt</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="res_stun_monitor">
	<support_level>core</support_level>
</module>
<module language="en_US" name="res_timing_dahdi">
	<depend>dahdi</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="res_timing_kqueue">
	<depend>kqueue</depend>
	<conflict>launchd</conflict>
	<support_level>extended</support_level>
</module>
<module language="en_US" name="res_timing_pthread">
	<support_level>extended</support_level>
</module>
<module language="en_US" name="res_timing_timerfd">
	<depend>timerfd</depend>
	<support_level>core</support_level>
</module>
<module language="en_US" name="res_tonedetect">
	<support_level>extended</support_level>
</module>
	<application name="WaitForTone" language="en_US" module="res_tonedetect">
		<since>
			<version>16.21.0</version>
			<version>18.7.0</version>
		</since>
		<synopsis>
			Wait for tone
		</synopsis>
		<syntax>
			<parameter name="freq" required="true">
				<para>Frequency of the tone to wait for.</para>
			</parameter>
			<parameter name="duration_ms" required="false">
				<para>Minimum duration of tone, in ms. Default is 500ms.
				Using a minimum duration under 50ms is unlikely to produce
				accurate results.</para>
			</parameter>
			<parameter name="timeout" required="false">
				<para>Maximum amount of time, in seconds, to wait for specified tone.
				Default is forever.</para>
			</parameter>
			<parameter name="times" required="false">
				<para>Number of times the tone should be detected (subject to the
				provided timeout) before returning. Default is 1.</para>
			</parameter>
			<parameter name="options" required="false">
				<optionlist>
					<option name="d">
						<para>Custom decibel threshold to use. Default is 16.</para>
					</option>
					<option name="s">
						<para>Squelch tone.</para>
					</option>
				</optionlist>
			</parameter>
		</syntax>
		<description>
			<para>Waits for a single-frequency tone to be detected before dialplan execution continues.</para>
			<variablelist>
				<variable name="WAITFORTONESTATUS">
					<para>This indicates the result of the wait.</para>
					<value name="SUCCESS"/>
					<value name="ERROR"/>
					<value name="TIMEOUT"/>
					<value name="HANGUP"/>
				</variable>
			</variablelist>
		</description>
		<see-also>
			<ref type="application">PlayTones</ref>
		</see-also>
	</application>
	<application name="ToneScan" language="en_US" module="res_tonedetect">
		<since>
			<version>16.23.0</version>
			<version>18.9.0</version>
			<version>19.1.0</version>
		</since>
		<synopsis>
			Wait for period of time while scanning for call progress tones
		</synopsis>
		<syntax>
			<parameter name="zone" required="false">
				<para>Call progress zone. Default is the system default.</para>
			</parameter>
			<parameter name="timeout" required="false">
				<para>Maximum amount of time, in seconds, to wait for call progress
				or signal tones. Default is forever.</para>
			</parameter>
			<parameter name="threshold" required="false">
				<para>DSP threshold required for a match. A higher number will
				require a longer match and may reduce false positives, at the
				expense of false negatives. Default is 1.</para>
			</parameter>
			<parameter name="options" required="false">
				<optionlist>
					<option name="f">
						<para>Enable fax machine detection. By default, this is disabled.</para>
					</option>
					<option name="v">
						<para>Enable voice detection. By default, this is disabled.</para>
					</option>
				</optionlist>
			</parameter>
		</syntax>
		<description>
			<para>Waits for a a distinguishable call progress tone and then exits.
			Unlike a conventional scanner, this is not currently capable of
			scanning for modem carriers.</para>
			<variablelist>
				<variable name="TONESCANSTATUS">
					This indicates the result of the scan.
					<value name="RINGING">
						Audible ringback tone
					</value>
					<value name="BUSY">
						Busy tone
					</value>
					<value name="SIT">
						Special Information Tones
					</value>
					<value name="VOICE">
						Human voice detected
					</value>
					<value name="DTMF">
						DTMF digit
					</value>
					<value name="FAX">
						Fax (answering)
					</value>
					<value name="MODEM">
						Modem (answering)
					</value>
					<value name="DIALTONE">
						Dial tone
					</value>
					<value name="NUT">
						UK Number Unobtainable tone
					</value>
					<value name="TIMEOUT">
						Timeout reached before any positive detection
					</value>
					<value name="HANGUP">
						Caller hung up before any positive detection
					</value>
				</variable>
			</variablelist>
		</description>
		<see-also>
			<ref type="application">WaitForTone</ref>
		</see-also>
	</application>
	<function name="TONE_DETECT" language="en_US" module="res_tonedetect">
		<since>
			<version>16.21.0</version>
			<version>18.7.0</version>
		</since>
		<synopsis>
			Asynchronously detects a tone
		</synopsis>
		<syntax>
			<parameter name="freq" required="true">
				<para>Frequency of the tone to detect. To disable frequency
				detection completely (e.g. for signal detection only),
				specify 0 for the frequency.</para>
			</parameter>
			<parameter name="duration_ms" required="false">
				<para>Minimum duration of tone, in ms. Default is 500ms.
				Using a minimum duration under 50ms is unlikely to produce
				accurate results.</para>
			</parameter>
			<parameter name="options">
				<optionlist>
					<option name="a">
						<para>Match immediately on Special Information Tones, instead of or in addition
						to a particular frequency.</para>
					</option>
					<option name="b">
						<para>Match immediately on a busy signal, instead of or in addition to
						a particular frequency.</para>
					</option>
					<option name="c">
						<para>Match immediately on a dial tone, instead of or in addition to
						a particular frequency.</para>
					</option>
					<option name="d">
						<para>Custom decibel threshold to use. Default is 16.</para>
					</option>
					<option name="e">
						<para>Automatically end detection after desired number of hits (as specified in the <literal>n</literal> option.</para>
					</option>
					<option name="g">
						<para>Go to the specified context,exten,priority if tone is received on this channel.
						Detection will not end automatically, unless the <literal>e</literal> option is also specified.</para>
					</option>
					<option name="h">
						<para>Go to the specified context,exten,priority if tone is transmitted on this channel.
						Detection will not end automatically, unless the <literal>e</literal> option is also specified.</para>
					</option>
					<option name="n">
						<para>Number of times the tone should be detected (subject to the
						provided timeout) before going to the destination provided in the <literal>g</literal>
						or <literal>h</literal> option. Default is 1.</para>
					</option>
					<option name="p">
						<para>Match immediately on audible ringback tone, instead of or in addition to
						a particular frequency.</para>
					</option>
					<option name="r">
						<para>Apply to received frames only. Default is both directions.</para>
					</option>
					<option name="s">
						<para>Squelch tone.</para>
					</option>
					<option name="t">
						<para>Apply to transmitted frames only. Default is both directions.</para>
					</option>
					<option name="x">
						<para>Destroy the detector (stop detection).</para>
					</option>
				</optionlist>
			</parameter>
		</syntax>
		<description>
			<para>The TONE_DETECT function detects a single-frequency tone and keeps
			track of how many times the tone has been detected.</para>
			<para>When reading this function (instead of writing), supply <literal>tx</literal>
			to get the number of times a tone has been detected in the TX direction and
			<literal>rx</literal> to get the number of times a tone has been detected in the
			RX direction.</para>
			<example title="intercept2600">
			same => n,Set(TONE_DETECT(2600,1000,g(got-2600,s,1))=) ; detect 2600 Hz
			same => n,Wait(15)
			same => n,NoOp(${TONE_DETECT(rx)})
			</example>
			<example title="dropondialtone">
			same => n,Set(TONE_DETECT(0,,bg(my-hangup,s,1))=) ; disconnect a call if we hear a busy signal
			same => n,Goto(somewhere-else)
			same => n(myhangup),Hangup()
			</example>
			<example title="removedetector">
			same => n,Set(TONE_DETECT(0,,x)=) ; remove the detector from the channel
			</example>
		</description>
	</function>
<module language="en_US" name="res_websocket_client">
	<support_level>core</support_level>
</module>
	<configInfo name="res_websocket_client" language="en_US">
		<synopsis>Websocket Client Configuration</synopsis>
		<configFile name="websocket_client.conf">
			<configObject name="websocket_client">
				<since>
					<version>20.15.0</version>
					<version>21.10.0</version>
					<version>22.5.0</version>
				</since>
				<synopsis>Websocket Client Configuration</synopsis>
				<see-also>
					<ref type="link">/Configuration/Channel-Drivers/WebSocket/</ref>
					<ref type="link">/Configuration/Interfaces/Asterisk-REST-Interface-ARI/ARI-Outbound-Websockets/</ref>
				</see-also>
				<description>
					<para>
					These config objects are currently shared by the following Asterisk capabilities:
					</para>
					<enumlist>
							<enum name="chan_websocket"><para>The WebSocket channel driver.</para></enum>
							<enum name="res_ari"><para>ARI Outbound WebSockets.</para></enum>
					</enumlist>
					<para>
					They may have more specific information or restrictions on the parameters below.
					</para>
					<example title="websocket_client.conf">
;
; A connection for use by chan_websocket
[media_connection1]
type = websocket_client
uri = ws://localhost:8787
protocols = media
username = media_username
password = media_password
connection_type = per_call_config
connection_timeout = 500
reconnect_interval = 500
reconnect_attempts = 5
tls_enabled = no
;
; A TLS connection for use by ARI Outbound Websocket
[ari_connection1]
type = websocket_client
uri = wss://localhost:8765
protocols = ari
username = some_username
password = some_password
connection_type = persistent
connection_timeout = 500
reconnect_interval = 500
reconnect_attempts = 5
tls_enabled = yes
ca_list_file = /etc/pki/tls/cert.pem
verify_server_cert = no
verify_server_hostname = no
					</example>
				</description>
				<configOption name="type">
					<since>
						<version>20.15.0</version>
						<version>21.10.0</version>
						<version>22.5.0</version>
					</since>
					<synopsis>Must be "websocket_client".</synopsis>
				</configOption>
				<configOption name="uri">
					<since>
						<version>20.15.0</version>
						<version>21.10.0</version>
						<version>22.5.0</version>
					</since>
					<synopsis>Full URI to remote server.</synopsis>
				</configOption>
				<configOption name="protocols">
					<since>
						<version>20.15.0</version>
						<version>21.10.0</version>
						<version>22.5.0</version>
					</since>
					<synopsis>Comma separated list of protocols acceptable to the server.</synopsis>
				</configOption>
				<configOption name="username">
					<since>
						<version>20.15.0</version>
						<version>21.10.0</version>
						<version>22.5.0</version>
					</since>
					<synopsis>Server authentication username if required.</synopsis>
				</configOption>
				<configOption name="password">
					<since>
						<version>20.15.0</version>
						<version>21.10.0</version>
						<version>22.5.0</version>
					</since>
					<synopsis>Server authentication password if required.</synopsis>
				</configOption>
				<configOption name="connection_type">
					<since>
						<version>20.15.0</version>
						<version>21.10.0</version>
						<version>22.5.0</version>
					</since>
					<synopsis>Single persistent connection or per-call configuration.</synopsis>
					<description>
					<enumlist>
						<enum name="persistent"><para>Single persistent connection for all calls.</para></enum>
						<enum name="per_call_config"><para>New connection for each call to the Stasis() dialplan app.</para></enum>
					</enumlist>
					</description>
				</configOption>
				<configOption name="connection_timeout">
					<since>
						<version>20.15.0</version>
						<version>21.10.0</version>
						<version>22.5.0</version>
					</since>
					<synopsis>Connection timeout (ms).</synopsis>
				</configOption>
				<configOption name="reconnect_attempts">
					<since>
						<version>20.15.0</version>
						<version>21.10.0</version>
						<version>22.5.0</version>
					</since>
					<synopsis>On failure, how many times should reconnection be attempted?</synopsis>
					<description>
						<para>
							For per_call connections, this is the number of
							(re)connection attempts to make before returning an
							and terminating the call.  Persistent connections
							always retry forever but this setting will control
							how often failure messages are logged.
						</para>
					</description>
				</configOption>
				<configOption name="reconnect_interval">
					<since>
						<version>20.15.0</version>
						<version>21.10.0</version>
						<version>22.5.0</version>
					</since>
					<synopsis>How often should reconnection be attempted (ms)?</synopsis>
				</configOption>
				<configOption name="tls_enabled">
					<since>
						<version>20.15.0</version>
						<version>21.10.0</version>
						<version>22.5.0</version>
					</since>
					<synopsis>Enable TLS</synopsis>
				</configOption>
				<configOption name="ca_list_file">
					<since>
						<version>20.15.0</version>
						<version>21.10.0</version>
						<version>22.5.0</version>
					</since>
					<synopsis>File containing the server's CA certificate. (optional)</synopsis>
				</configOption>
				<configOption name="ca_list_path">
					<since>
						<version>20.15.0</version>
						<version>21.10.0</version>
						<version>22.5.0</version>
					</since>
					<synopsis>Path to a directory containing one or more hashed CA certificates. (optional)</synopsis>
				</configOption>
				<configOption name="cert_file">
					<since>
						<version>20.15.0</version>
						<version>21.10.0</version>
						<version>22.5.0</version>
					</since>
					<synopsis>File containing a client certificate. (optional)</synopsis>
				</configOption>
				<configOption name="priv_key_file">
					<since>
						<version>20.15.0</version>
						<version>21.10.0</version>
						<version>22.5.0</version>
					</since>
					<synopsis>File containing the client's private key. (optional)</synopsis>
				</configOption>
				<configOption name="verify_server_cert">
					<since>
						<version>20.15.0</version>
						<version>21.10.0</version>
						<version>22.5.0</version>
					</since>
					<synopsis>If set to true, verify the server's certificate. (optional)</synopsis>
				</configOption>
				<configOption name="verify_server_hostname">
					<since>
						<version>20.15.0</version>
						<version>21.10.0</version>
						<version>22.5.0</version>
					</since>
					<synopsis>If set to true, verify that the server's hostname matches the common name in it's certificate. (optional)</synopsis>
				</configOption>
			</configObject>
		</configFile>
	</configInfo>
<module language="en_US" name="res_xmpp">
	<depend>iksemel</depend>
	<use type="external">openssl</use>
	<support_level>core</support_level>
</module>
	<application name="JabberSend" language="en_US" module="res_xmpp">
		<since>
			<version>12.0.0</version>
		</since>
		<synopsis>
			Sends an XMPP message to a buddy.
		</synopsis>
		<syntax>
			<parameter name="account" required="true">
				<para>The local named account to listen on (specified in
				xmpp.conf)</para>
			</parameter>
			<parameter name="jid" required="true">
				<para>Jabber ID of the buddy to send the message to. It can be a
				bare JID (username@domain) or a full JID (username@domain/resource).</para>
			</parameter>
			<parameter name="message" required="true">
				<para>The message to send.</para>
			</parameter>
		</syntax>
		<description>
			<para>Sends the content of <replaceable>message</replaceable> as text message
			from the given <replaceable>account</replaceable> to the buddy identified by
			<replaceable>jid</replaceable></para>
			<para>The example below sends "Hello world" to
			<replaceable>bob@domain.com</replaceable> as an XMPP message from the account
			<replaceable>asterisk</replaceable>, configured in xmpp.conf.</para>
			<example title="Send 'Hello world' to Bob">
			same => n,JabberSend(asterisk,bob@domain.com,Hello world)
			</example>
		</description>
		<see-also>
			<ref type="function" module="res_xmpp">JABBER_STATUS</ref>
			<ref type="function" module="res_xmpp">JABBER_RECEIVE</ref>
		</see-also>
	</application>
	<function name="JABBER_RECEIVE" language="en_US" module="res_xmpp">
		<since>
			<version>12.0.0</version>
		</since>
		<synopsis>
			Reads XMPP messages.
		</synopsis>
		<syntax>
			<parameter name="account" required="true">
				<para>The local named account to listen on (specified in
				xmpp.conf)</para>
			</parameter>
			<parameter name="jid" required="true">
				<para>Jabber ID of the buddy to receive message from. It can be a
				bare JID (username@domain) or a full JID (username@domain/resource).</para>
			</parameter>
			<parameter name="timeout">
				<para>In seconds, defaults to <literal>20</literal>.</para>
			</parameter>
		</syntax>
		<description>
			<para>Receives a text message on the given <replaceable>account</replaceable>
			from the buddy identified by <replaceable>jid</replaceable> and returns the contents.</para>
			<para>The example below returns an XMPP message sent from
			<replaceable>bob@domain.com</replaceable> (or nothing in case of a time out), to
			the <replaceable>asterisk</replaceable> XMPP account configured in xmpp.conf.</para>
			<example title="Receive a message">
			same => n,Set(msg=${JABBER_RECEIVE(asterisk,bob@domain.com)})
			</example>
		</description>
		<see-also>
			<ref type="function" module="res_xmpp">JABBER_STATUS</ref>
			<ref type="application" module="res_xmpp">JabberSend</ref>
		</see-also>
	</function>
	<function name="JABBER_STATUS" language="en_US" module="res_xmpp">
		<since>
			<version>12.0.0</version>
		</since>
		<synopsis>
			Retrieves a buddy's status.
		</synopsis>
		<syntax>
			<parameter name="account" required="true">
				<para>The local named account to listen on (specified in
				xmpp.conf)</para>
			</parameter>
			<parameter name="jid" required="true">
				<para>Jabber ID of the buddy to receive message from. It can be a
				bare JID (username@domain) or a full JID (username@domain/resource).</para>
			</parameter>
		</syntax>
		<description>
			<para>Retrieves the numeric status associated with the buddy identified
			by <replaceable>jid</replaceable>. The return value will be one of the
			following.</para>
			<enumlist>
				<enum name="1">
					<para>Online</para>
				</enum>
				<enum name="2">
					<para>Chatty</para>
				</enum>
				<enum name="3">
					<para>Away</para>
				</enum>
				<enum name="4">
					<para>Extended Away</para>
				</enum>
				<enum name="5">
					<para>Do Not Disturb</para>
				</enum>
				<enum name="6">
					<para>Offline</para>
				</enum>
				<enum name="7">
					<para>Not In Roster</para>
				</enum>
			</enumlist>
		</description>
		<see-also>
			<ref type="function" module="res_xmpp">JABBER_RECEIVE</ref>
			<ref type="application" module="res_xmpp">JabberSend</ref>
		</see-also>
	</function>
	<application name="JabberSendGroup" language="en_US" module="res_xmpp">
		<since>
			<version>12.0.0</version>
		</since>
		<synopsis>
			Send a Jabber Message to a specified chat room
		</synopsis>
		<syntax>
			<parameter name="Jabber" required="true">
				<para>Client or transport Asterisk uses to connect to Jabber.</para>
			</parameter>
			<parameter name="RoomJID" required="true">
				<para>XMPP/Jabber JID (Name) of chat room.</para>
			</parameter>
			<parameter name="Message" required="true">
				<para>Message to be sent to the chat room.</para>
			</parameter>
			<parameter name="Nickname" required="false">
				<para>The nickname Asterisk uses in the chat room.</para>
			</parameter>
		</syntax>
		<description>
			<para>Allows user to send a message to a chat room via XMPP.</para>
			<note><para>To be able to send messages to a chat room, a user must have previously joined it. Use the <replaceable>JabberJoin</replaceable> function to do so.</para></note>
		</description>
	</application>
	<application name="JabberJoin" language="en_US" module="res_xmpp">
		<since>
			<version>12.0.0</version>
		</since>
		<synopsis>
			Join a chat room
		</synopsis>
		<syntax>
			<parameter name="Jabber" required="true">
				<para>Client or transport Asterisk uses to connect to Jabber.</para>
			</parameter>
			<parameter name="RoomJID" required="true">
				<para>XMPP/Jabber JID (Name) of chat room.</para>
			</parameter>
			<parameter name="Nickname" required="false">
				<para>The nickname Asterisk will use in the chat room.</para>
				<note><para>If a different nickname is supplied to an already joined room, the old nick will be changed to the new one.</para></note>
			</parameter>
		</syntax>
		<description>
			<para>Allows Asterisk to join a chat room.</para>
		</description>
	</application>
	<application name="JabberLeave" language="en_US" module="res_xmpp">
		<since>
			<version>12.0.0</version>
		</since>
		<synopsis>
			Leave a chat room
		</synopsis>
		<syntax>
			<parameter name="Jabber" required="true">
				<para>Client or transport Asterisk uses to connect to Jabber.</para>
			</parameter>
			<parameter name="RoomJID" required="true">
				<para>XMPP/Jabber JID (Name) of chat room.</para>
			</parameter>
			<parameter name="Nickname" required="false">
				<para>The nickname Asterisk uses in the chat room.</para>
			</parameter>
		</syntax>
		<description>
			<para>Allows Asterisk to leave a chat room.</para>
		</description>
	</application>
	<manager name="JabberSend" language="en_US" module="res_xmpp">
		<since>
			<version>1.4.0</version>
		</since>
		<synopsis>
			Sends a message to a Jabber Client.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="Jabber" required="true">
				<para>Client or transport Asterisk uses to connect to JABBER.</para>
			</parameter>
			<parameter name="JID" required="true">
				<para>XMPP/Jabber JID (Name) of recipient.</para>
			</parameter>
			<parameter name="Message" required="true">
				<para>Message to be sent to the buddy.</para>
			</parameter>
		</syntax>
		<description>
			<para>Sends a message to a Jabber Client.</para>
		</description>
	</manager>
	<info name="MessageDestinationInfo" language="en_US" tech="XMPP" module="res_xmpp">
		<para>Specifying a prefix of <literal>xmpp:</literal> will send the
		message as an XMPP chat message.</para>
	</info>
	<info name="MessageFromInfo" language="en_US" tech="XMPP" module="res_xmpp">
		<para>Specifying a prefix of <literal>xmpp:</literal> will specify the
		account defined in <literal>xmpp.conf</literal> to send the message from.
		Note that this field is required for XMPP messages.</para>
	</info>
	<info name="MessageToInfo" language="en_US" tech="XMPP" module="res_xmpp">
		<para>Ignored</para>
	</info>
	<configInfo name="res_xmpp" language="en_US">
		<synopsis>XMPP Messaging</synopsis>
		<configFile name="xmpp.conf">
			<configObject name="global">
				<since>
					<version>12.0.0</version>
				</since>
				<synopsis>Global configuration settings</synopsis>
				<configOption name="debug">
					<since>
						<version>11.0.0</version>
					</since>
					<synopsis>Enable/disable XMPP message debugging</synopsis>
				</configOption>
				<configOption name="autoprune">
					<since>
						<version>11.0.0</version>
					</since>
					<synopsis>Auto-remove users from buddy list.</synopsis>
					<description><para>Auto-remove users from buddy list. Depending on the setup
					(e.g., using your personal Gtalk account for a test) this could cause loss of
					the contact list.
					</para></description>
				</configOption>
				<configOption name="autoregister">
					<since>
						<version>11.0.0</version>
					</since>
					<synopsis>Auto-register users from buddy list</synopsis>
				</configOption>
				<configOption name="collection_nodes">
					<since>
						<version>11.0.0</version>
					</since>
					<synopsis>Enable support for XEP-0248 for use with distributed device state</synopsis>
				</configOption>
				<configOption name="pubsub_autocreate">
					<since>
						<version>11.0.0</version>
					</since>
					<synopsis>Whether or not the PubSub server supports/is using auto-create for nodes</synopsis>
				</configOption>
				<configOption name="auth_policy">
					<since>
						<version>11.0.0</version>
					</since>
					<synopsis>Whether to automatically accept or deny users' subscription requests</synopsis>
				</configOption>
			</configObject>
			<configObject name="client">
				<since>
					<version>12.0.0</version>
				</since>
				<synopsis>Configuration options for an XMPP client</synopsis>
				<configOption name="username">
					<since>
						<version>11.0.0</version>
					</since>
					<synopsis>XMPP username with optional resource</synopsis>
				</configOption>
				<configOption name="secret">
					<since>
						<version>11.0.0</version>
					</since>
					<synopsis>XMPP password</synopsis>
				</configOption>
				<configOption name="refresh_token">
					<since>
						<version>13.18.0</version>
						<version>14.7.0</version>
						<version>15.1.0</version>
					</since>
					<synopsis>Google OAuth 2.0 refresh token</synopsis>
				</configOption>
				<configOption name="oauth_clientid">
					<since>
						<version>13.18.0</version>
						<version>14.7.0</version>
						<version>15.1.0</version>
					</since>
					<synopsis>Google OAuth 2.0 application's client id</synopsis>
				</configOption>
				<configOption name="oauth_secret">
					<since>
						<version>13.18.0</version>
						<version>14.7.0</version>
						<version>15.1.0</version>
					</since>
					<synopsis>Google OAuth 2.0 application's secret</synopsis>
				</configOption>
				<configOption name="serverhost">
					<since>
						<version>11.0.0</version>
					</since>
					<synopsis>Route to server, e.g. talk.google.com</synopsis>
				</configOption>
				<configOption name="statusmessage">
					<since>
						<version>11.0.0</version>
					</since>
					<synopsis>Custom status message</synopsis>
				</configOption>
				<configOption name="pubsub_node">
					<since>
						<version>11.0.0</version>
					</since>
					<synopsis>Node for publishing events via PubSub</synopsis>
				</configOption>
				<configOption name="context">
					<since>
						<version>11.0.0</version>
					</since>
					<synopsis>Dialplan context to send incoming messages to</synopsis>
				</configOption>
				<configOption name="priority">
					<since>
						<version>11.0.0</version>
					</since>
					<synopsis>XMPP resource priority</synopsis>
				</configOption>
				<configOption name="port">
					<since>
						<version>11.0.0</version>
					</since>
					<synopsis>XMPP server port</synopsis>
				</configOption>
				<configOption name="timeout">
					<since>
						<version>11.0.0</version>
					</since>
					<synopsis>Timeout in seconds to hold incoming messages</synopsis>
					<description><para>Timeout (in seconds) on the message stack. Messages stored longer
					than this value will be deleted by Asterisk. This option applies to incoming messages only
					which are intended to be processed by the <literal>JABBER_RECEIVE</literal> dialplan function.
					</para></description>
				</configOption>
				<configOption name="debug">
					<since>
						<version>11.0.0</version>
					</since>
					<synopsis>Enable debugging</synopsis>
				</configOption>
				<configOption name="type">
					<since>
						<version>11.0.0</version>
					</since>
					<synopsis>Connection is either a client or a component</synopsis>
				</configOption>
				<configOption name="distribute_events">
					<since>
						<version>11.0.0</version>
					</since>
					<synopsis>Whether or not to distribute events using this connection</synopsis>
				</configOption>
				<configOption name="usetls">
					<since>
						<version>11.0.0</version>
					</since>
					<synopsis>Whether to use TLS for the connection or not</synopsis>
				</configOption>
				<configOption name="usesasl">
					<since>
						<version>11.0.0</version>
					</since>
					<synopsis>Whether to use SASL for the connection or not</synopsis>
				</configOption>
				<configOption name="forceoldssl">
					<since>
						<version>11.0.0</version>
					</since>
					<synopsis>Force the use of old-style SSL for the connection</synopsis>
				</configOption>
				<configOption name="keepalive">
					<since>
						<version>11.0.0</version>
					</since>
					<synopsis>If enabled, periodically send an XMPP message from this client with an empty message</synopsis>
				</configOption>
				<configOption name="autoprune">
					<since>
						<version>11.18.0</version>
						<version>13.4.0</version>
					</since>
					<synopsis>Auto-remove users from buddy list.</synopsis>
					<description><para>Auto-remove users from buddy list. Depending on the setup
					(e.g., using your personal Gtalk account for a test) this could cause loss of
					the contact list.
					</para></description>
				</configOption>
				<configOption name="autoregister">
					<since>
						<version>11.18.0</version>
						<version>13.4.0</version>
					</since>
					<synopsis>Auto-register users bfrom buddy list</synopsis>
				</configOption>
				<configOption name="auth_policy">
					<since>
						<version>11.18.0</version>
						<version>13.4.0</version>
					</since>
					<synopsis>Whether to automatically accept or deny users' subscription requests</synopsis>
				</configOption>
				<configOption name="sendtodialplan">
					<since>
						<version>11.0.0</version>
					</since>
					<synopsis>Send incoming messages into the dialplan</synopsis>
				</configOption>
				<configOption name="status">
					<since>
						<version>11.0.0</version>
					</since>
					<synopsis>Default XMPP status for the client</synopsis>
					<description><para>Can be one of the following XMPP statuses:</para>
						<enumlist>
							<enum name="chat"/>
							<enum name="available"/>
							<enum name="away"/>
							<enum name="xaway"/>
							<enum name="dnd"/>
						</enumlist>
					</description>
				</configOption>
				<configOption name="buddy">
					<since>
						<version>11.0.0</version>
					</since>
					<synopsis>Manual addition of buddy to list</synopsis>
					<description><para>
					Manual addition of buddy to the buddy list. For distributed events, these buddies are
					automatically added in the whitelist as 'owners' of the node(s).
					</para></description>
				</configOption>
			</configObject>
		</configFile>
	</configInfo>
<module language="en_US" name="agent">
	<support_level>extended</support_level>
</module>
	<configInfo name="res_ari" language="en_US">
		<synopsis>HTTP binding for the Stasis API</synopsis>
		<configFile name="ari.conf">
			<configObject name="general">
				<since>
					<version>12.0.0</version>
				</since>
				<synopsis>General configuration settings</synopsis>
				<configOption name="enabled">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Enable/disable the ARI module</synopsis>
					<description>
						<para>This option enables or disables the ARI module.</para>
						<note>
							<para>ARI uses Asterisk's HTTP server, which must also be enabled in <filename>http.conf</filename>.</para>
						</note>
					</description>
					<see-also>
						<ref type="filename">http.conf</ref>
						<ref type="link">https://docs.asterisk.org/Configuration/Core-Configuration/Asterisk-Builtin-mini-HTTP-Server/</ref>
					</see-also>
				</configOption>
				<configOption name="websocket_write_timeout" default="100">
					<since>
						<version>11.11.0</version>
						<version>12.4.0</version>
					</since>
					<synopsis>The timeout (in milliseconds) to set on WebSocket connections.</synopsis>
					<description>
						<para>If a websocket connection accepts input slowly, the timeout
						for writes to it can be increased to keep it from being disconnected.
						Value is in milliseconds.</para>
					</description>
				</configOption>
				<configOption name="pretty">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Responses from ARI are formatted to be human readable</synopsis>
				</configOption>
				<configOption name="auth_realm">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Realm to use for authentication. Defaults to Asterisk REST Interface.</synopsis>
				</configOption>
				<configOption name="allowed_origins">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Comma separated list of allowed origins, for Cross-Origin Resource Sharing. May be set to * to allow all origins.</synopsis>
				</configOption>
				<configOption name="channelvars">
					<since>
						<version>14.2.0</version>
					</since>
					<synopsis>Comma separated list of channel variables to display in channel json.</synopsis>
				</configOption>
			</configObject>

			<configObject name="user">
				<since>
					<version>12.0.0</version>
				</since>
				<synopsis>Per-user configuration settings</synopsis>
				<configOption name="type">
					<since>
						<version>13.30.0</version>
						<version>16.7.0</version>
						<version>17.1.0</version>
					</since>
					<synopsis>Define this configuration section as a user.</synopsis>
					<description>
						<enumlist>
							<enum name="user"><para>Configure this section as a <replaceable>user</replaceable></para></enum>
						</enumlist>
					</description>
				</configOption>
				<configOption name="read_only">
					<since>
						<version>13.30.0</version>
						<version>16.7.0</version>
						<version>17.1.0</version>
					</since>
					<synopsis>When set to yes, user is only authorized for read-only requests</synopsis>
				</configOption>
				<configOption name="password">
					<since>
						<version>13.30.0</version>
						<version>16.7.0</version>
						<version>17.1.0</version>
					</since>
					<synopsis>Crypted or plaintext password (see password_format)</synopsis>
				</configOption>
				<configOption name="password_format">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>password_format may be set to plain (the default) or crypt. When set to crypt, crypt(3) is used to validate the password. A crypted password can be generated using mkpasswd -m sha-512. When set to plain, the password is in plaintext</synopsis>
				</configOption>
				<configOption name="acl">
					<since>
						<version>20.19.0</version>
						<version>22.9.0</version>
						<version>23.3.0</version>
					</since>
					<synopsis>List of IP ACL section names in acl.conf</synopsis>
					<description><para>
						This matches sections configured in <literal>acl.conf</literal>.
					</para></description>
				</configOption>
				<configOption name="deny">
					<since>
						<version>20.19.0</version>
						<version>22.9.0</version>
						<version>23.3.0</version>
					</since>
					<synopsis>List of IP addresses to deny access from</synopsis>
					<description><para>
						The value is a comma-delimited list of IP addresses. IP addresses may
						have a subnet mask appended. The subnet mask may be written in either
						CIDR or dotted-decimal notation. Separate the IP address and subnet
						mask with a slash ('/')
					</para></description>
				</configOption>
				<configOption name="permit">
					<since>
						<version>20.19.0</version>
						<version>22.9.0</version>
						<version>23.3.0</version>
					</since>
					<synopsis>List of IP addresses to permit access from</synopsis>
					<description><para>
						The value is a comma-delimited list of IP addresses. IP addresses may
						have a subnet mask appended. The subnet mask may be written in either
						CIDR or dotted-decimal notation. Separate the IP address and subnet
						mask with a slash ('/')
					</para></description>
				</configOption>
			</configObject>
			<configObject name="outbound_websocket">
				<since>
					<version>20.15.0</version>
					<version>21.10.0</version>
					<version>22.5.0</version>
				</since>
				<synopsis>Outbound websocket configuration</synopsis>
				<configOption name="type">
					<since>
						<version>20.15.0</version>
						<version>21.10.0</version>
						<version>22.5.0</version>
					</since>
					<synopsis>Must be "outbound_websocket".</synopsis>
				</configOption>
				<configOption name="websocket_client_id">
					<since>
						<version>20.15.0</version>
						<version>21.10.0</version>
						<version>22.5.0</version>
					</since>
					<synopsis>The ID of a connection defined in websocket_client.conf.</synopsis>
				</configOption>
				<configOption name="apps">
					<since>
						<version>20.15.0</version>
						<version>21.10.0</version>
						<version>22.5.0</version>
					</since>
					<synopsis>Comma separated list of stasis applications that will use this websocket.</synopsis>
				</configOption>
				<configOption name="local_ari_user">
					<since>
						<version>20.15.0</version>
						<version>21.10.0</version>
						<version>22.5.0</version>
					</since>
					<synopsis>The local ARI user to act as.</synopsis>
				</configOption>
				<configOption name="subscribe_all" default="no">
					<since>
						<version>20.15.0</version>
						<version>21.10.0</version>
						<version>22.5.0</version>
					</since>
					<synopsis>Subscribe applications to all event</synopsis>
				</configOption>
			</configObject>
		</configFile>
	</configInfo>
	<configInfo name="res_geolocation" language="en_US">
		<synopsis>Core Geolocation Support</synopsis>
		<configFile name="geolocation.conf">
			<configObject name="location">
				<since>
					<version>16.29.0</version>
					<version>18.15.0</version>
					<version>19.7.0</version>
				</since>
				<synopsis>Location</synopsis>
				<description>
					<para>Parameters for defining a Location object</para>
				</description>

				<configOption name="type">
					<since>
						<version>16.28.0</version>
						<version>18.14.0</version>
						<version>19.6.0</version>
					</since>
					<synopsis>Must be of type 'location'.</synopsis>
				</configOption>

				<configOption name="format" default="none">
					<since>
						<version>16.28.0</version>
						<version>18.14.0</version>
						<version>19.6.0</version>
					</since>
					<synopsis>Location specification type</synopsis>
					<description>
						<enumlist>
							<enum name="civicAddress">
								<para>
									The <literal>location_info</literal>
									parameter must contain a comma separated list of IANA codes
									or synonyms describing the civicAddress of this location.
									The IANA codes and synonyms can be obtained by executing
									the CLI command <literal>geoloc show civicAddr_mapping</literal>.
								</para>
							</enum>
							<enum name="GML">
								<para>
									The
									<literal>location_info</literal> parameter must contain a comma
									separated list valid GML elements describing this location.
								</para>
							</enum>
							<enum name="URI">
								<para>
									The
									<literal>location_info</literal> parameter must contain a single
									URI parameter which contains an external URI describing this location.
								</para>
							</enum>
						</enumlist>
					</description>
				</configOption>

				<configOption name="location_info" default="none">
					<since>
						<version>16.28.0</version>
						<version>18.14.0</version>
						<version>19.6.0</version>
					</since>
					<synopsis>Location information</synopsis>
					<description>
						<para>The contents of this parameter are specific to the
							location <literal>format</literal>.</para>
						<enumlist>
						<enum name="civicAddress">
						<para>
						location_info = country=US,A1="New York",city_district=Manhattan,
						A3="New York", house_number=1633, street=46th, street_suffix = Street,
						postal_code=10222,floor=20,room=20A2
						</para>
						</enum>
						<enum name="GML">
						<para>
						location_info = Shape=Sphere, pos3d="39.12345 -105.98766 1920", radius=200
						</para>
						</enum>
						<enum name="URI">
						<para>
						location_info = URI=https:/something.com?exten=${EXTEN}
						</para>
						</enum>
						</enumlist>
					</description>
				</configOption>

				<configOption name="location_source" default="none">
					<since>
						<version>16.28.0</version>
						<version>18.14.0</version>
						<version>19.6.0</version>
					</since>
					<synopsis>Fully qualified host name</synopsis>
					<description>
						<para>This parameter isn't required but if provided, RFC8787 says it MUST be a fully
						qualified host name.  IP addresses are specifically NOT allowed.  The value will be placed
						in a <literal>loc-src</literal> parameter appended to the URI in the <literal>
						Geolocation</literal> header.</para>
					</description>
				</configOption>

				<configOption name="method" default="none">
					<since>
						<version>16.28.0</version>
						<version>18.14.0</version>
						<version>19.6.0</version>
					</since>
					<synopsis>Location determination method</synopsis>
					<description>
						<para>This is a rarely used field in the specification that would
						indicate the method used to determine the location.  Its usage and values should be
						pre-negotiated with any recipients.</para>
						<enumlist>
						<enum name="GPS"/>
						<enum name="A-GPS"/>
						<enum name="Manual"/>
						<enum name="DHCP"/>
						<enum name="Triangulation"/>
						<enum name="Cell"/>
						<enum name="802.11"/>
						</enumlist>
					</description>
				</configOption>

				<configOption name="confidence" default="none">
					<since>
						<version>16.28.0</version>
						<version>18.14.0</version>
						<version>19.6.0</version>
					</since>
					<synopsis>Level of confidence</synopsis>
					<description>
						<para>This is a rarely used field in the specification that would
						indicate the confidence in the location specified.  See RFC7459
						for exact details.
						</para>
						<para>
						Sub-parameters:
						</para>
						<enumlist>
						<enum name="pdf">
						<para>One of:</para>
						<enumlist>
						<enum name="unknown"/>
						<enum name="normal"/>
						<enum name="rectangular"/>
						</enumlist>
						</enum>
						<enum name="value">
						<para>A percentage indicating the confidence.</para>
						</enum>
						</enumlist>
					</description>
					<see-also>
						<ref type="link">https://www.rfc-editor.org/rfc/rfc7459</ref>
					</see-also>
				</configOption>
			</configObject>

			<configObject name="profile">
				<since>
					<version>16.29.0</version>
					<version>18.15.0</version>
					<version>19.7.0</version>
				</since>
				<synopsis>Profile</synopsis>
				<description>
					<para>Parameters for defining a Profile object</para>
				</description>
				<configOption name="type">
					<since>
						<version>16.28.0</version>
						<version>18.14.0</version>
						<version>19.6.0</version>
					</since>
					<synopsis>Must be of type 'profile'.</synopsis>
				</configOption>

				<configOption name="pidf_element" default="device">
					<since>
						<version>16.28.0</version>
						<version>18.14.0</version>
						<version>19.6.0</version>
					</since>
					<synopsis>PIDF-LO element to place this profile in</synopsis>
					<description>
						<enumlist>
							<enum name="tuple" />
							<enum name="device" />
							<enum name="person" />
						</enumlist>
						<para>
							Based on RFC5491 (see below) the recommended and default element
							is <literal>device</literal>.
						</para>
					</description>
					<see-also>
						<ref type="link">https://www.rfc-editor.org/rfc/rfc5491.html#section-3.4</ref>
					</see-also>
				</configOption>

				<configOption name="pidf_element_id" default="">
					<since>
						<version>20.18.0</version>
						<version>22.8.0</version>
						<version>23.2.0</version>
					</since>
					<synopsis>The id attribute value for the PIDF-LO element</synopsis>
				</configOption>

				<configOption name="device_id" default="">
					<since>
						<version>20.18.0</version>
						<version>22.8.0</version>
						<version>23.2.0</version>
					</since>
					<synopsis>The content of the deviceID element</synopsis>
				</configOption>

				<configOption name="location_reference" default="none">
					<since>
						<version>16.28.0</version>
						<version>18.14.0</version>
						<version>19.6.0</version>
					</since>
					<synopsis>Reference to a location object</synopsis>
				</configOption>

				<configOption name="location_info_refinement" default="none">
					<since>
						<version>16.28.0</version>
						<version>18.14.0</version>
						<version>19.6.0</version>
					</since>
					<synopsis>Reference to a location object</synopsis>
				</configOption>
				<configOption name="location_variables" default="none">
					<since>
						<version>16.28.0</version>
						<version>18.14.0</version>
						<version>19.6.0</version>
					</since>
					<synopsis>Reference to a location object</synopsis>
				</configOption>

				<configOption name="usage_rules" default="empty &lt;usage_rules&gt; element">
					<since>
						<version>16.28.0</version>
						<version>18.14.0</version>
						<version>19.6.0</version>
					</since>
					<synopsis>location specification type</synopsis>
					<description>
						<para>xxxx</para>
					</description>
				</configOption>

				<configOption name="notes" default="">
					<since>
						<version>16.28.0</version>
						<version>18.14.0</version>
						<version>19.6.0</version>
					</since>
					<synopsis>Notes to be added to the outgoing PIDF-LO document</synopsis>
					<description>
						<para>The specification of this parameter will cause a
						<literal>&lt;note-well&gt;</literal> element to be added to the
						outgoing PIDF-LO document.  Its usage should be pre-negotiated with
						any recipients.</para>
					</description>

				</configOption>
				<configOption name="allow_routing_use" default="no">
					<since>
						<version>16.28.0</version>
						<version>18.14.0</version>
						<version>19.6.0</version>
					</since>
					<synopsis>Sets the value of the Geolocation-Routing header.</synopsis>
				</configOption>

				<configOption name="suppress_empty_ca_elements" default="no">
					<since>
						<version>16.29.0</version>
						<version>18.15.0</version>
						<version>19.7.0</version>
					</since>
					<synopsis>Sets if empty Civic Address elements should be suppressed
					from the PIDF-LO document.</synopsis>
				</configOption>

				<configOption name="profile_precedence" default="discard_incoming">
					<since>
						<version>16.28.0</version>
						<version>18.14.0</version>
						<version>19.6.0</version>
					</since>
					<synopsis>Determine which profile on a channel should be used</synopsis>
					<description>
						<enumlist>
							<enum name="prefer_incoming">
							<para>Use the incoming profile if it exists and has location information, otherwise use the
							configured profile if it exists and has location information. If neither profile has location
							information, nothing is sent.
							</para></enum>
							<enum name="prefer_config">
							<para>Use the configured profile if it exists and has location information, otherwise use the
							incoming profile if it exists and has location information. If neither profile has location
							information, nothing is sent.
							</para></enum>
							<enum name="discard_incoming"
							><para>Discard any incoming profile and use the configured profile if it exists and
							it has location information.  If the configured profile doesn't exist or has no
							location information, nothing is sent.
							</para></enum>
							<enum name="discard_config">
							<para>Discard any configured profile and use the incoming profile if it exists and
							it has location information.  If the incoming profile doesn't exist or has no
							location information, nothing is sent.
							</para></enum>
						</enumlist>
					</description>
				</configOption>

				<xi:include xpointer="xpointer(/docs/configInfo[@name='res_geolocation']/configFile[@name='geolocation.conf']/configObject[@name='location']/configOption[@name='format'])"/>
				<xi:include xpointer="xpointer(/docs/configInfo[@name='res_geolocation']/configFile[@name='geolocation.conf']/configObject[@name='location']/configOption[@name='location_info'])"/>
				<xi:include xpointer="xpointer(/docs/configInfo[@name='res_geolocation']/configFile[@name='geolocation.conf']/configObject[@name='location']/configOption[@name='confidence'])"/>
				<xi:include xpointer="xpointer(/docs/configInfo[@name='res_geolocation']/configFile[@name='geolocation.conf']/configObject[@name='location']/configOption[@name='location_source'])"/>
				<xi:include xpointer="xpointer(/docs/configInfo[@name='res_geolocation']/configFile[@name='geolocation.conf']/configObject[@name='location']/configOption[@name='method'])"/>
			</configObject>
		</configFile>
	</configInfo>
	<function name="GEOLOC_PROFILE" language="en_US" module="res_geolocation">
		<since>
			<version>16.28.0</version>
			<version>18.14.0</version>
			<version>19.6.0</version>
		</since>
		<synopsis>
			Get or Set a field in a geolocation profile
		</synopsis>
		<syntax>
			<parameter name="parameter" required="true">
				<para>The profile parameter to operate on. The following fields from the
				Location and Profile objects are supported.</para>
				<enumlist>
					<enum name="id"/>
					<enum name="location_reference"/>
					<enum name="method"/>
					<enum name="allow_routing_use"/>
					<enum name="profile_precedence"/>
					<enum name="format"/>
					<enum name="pidf_element"/>
					<enum name="pidf_element_id"/>
					<enum name="location_source"/>
					<enum name="notes"/>
					<enum name="location_info"/>
					<enum name="location_info_refinement"/>
					<enum name="location_variables"/>
					<enum name="effective_location"/>
					<enum name="usage_rules"/>
					<enum name="confidence"/>
					<enum name="device_id"/>
				</enumlist>
				<para>Additionally, the <literal>inheritable</literal> field may be
				set to <literal>true</literal> or <literal>false</literal> to control
				whether the profile will be passed to the outgoing channel.
				</para>
				<para>
				</para>
			</parameter>

			<parameter name="options" required="false">
				<optionlist>
				<option name="a">
					<para>Append provided value to the specified parameter
					instead of replacing the existing value.  This only applies
					to variable list parameters like
					<literal>location_info_refinement</literal>.
					</para>
				</option>
				<option name="r">
					<para>Before reading or after writing the specified parameter,
					re-resolve the <literal>effective_location</literal> and
					<literal>usage_rules</literal> parameters using the
					<literal>location_variables</literal> parameter and the variables
					set on the channel in effect at the time this function is called.
					</para>
					<note><para>On a read operation, this does not alter the actual profile
						in any way.  On a write operation however, the
						<literal>effective_location</literal> and/or <literal>usage_rules</literal>
						parameters may indeed change and those changes will be passed on
						to any outgoing channel.
					</para></note>
				</option>
				</optionlist>
			</parameter>
		</syntax>
		<description><para>
		When used to set a parameter on a profile, if the profile doesn't already exist, a new
		one will be created automatically.
		</para>
		<para>
		The <literal>${GEOLOCPROFILESTATUS}</literal> channel variable will be set with
		a return code indicating the result of the operation.  Possible values are:
		</para>
		<enumlist>
			<enum name="0"><para>Success</para></enum>
			<enum name="-1"><para>No or not enough parameters were supplied</para></enum>
			<enum name="-2"><para>There was an internal error finding or creating a profile</para></enum>
			<enum name="-3"><para>There was an issue specific to the parameter specified
			(value not valid or parameter name not found, etc.)</para></enum>
		</enumlist>
		</description>
	</function>

	<configInfo name="res_pjsip" language="en_US">
		<synopsis>SIP Resource using PJProject</synopsis>
		<configFile name="pjsip.conf">
			<configObject name="endpoint">
				<since>
					<version>12.0.0</version>
				</since>
				<synopsis>Endpoint</synopsis>
				<description><para>
					The <emphasis>Endpoint</emphasis> is the primary configuration object.
					It contains the core SIP related options only, endpoints are <emphasis>NOT</emphasis>
					dialable entries of their own. Communication with another SIP device is
					accomplished via Addresses of Record (AoRs) which have one or more
					contacts associated with them. Endpoints <emphasis>NOT</emphasis> configured to
					use a <literal>transport</literal> will default to first transport found
					in <filename>pjsip.conf</filename> that matches its type.
					</para>
					<para>Example: An Endpoint has been configured with no transport.
					When it comes time to call an AoR, PJSIP will find the
					first transport that matches the type. A SIP URI of <literal>sip:5000@[11::33]</literal>
					will use the first IPv6 transport and try to send the request.
					</para>
					<para>If the anonymous endpoint identifier is in use an endpoint with the name
					"anonymous@domain" will be searched for as a last resort. If this is not found
					it will fall back to searching for "anonymous". If neither endpoints are found
					the anonymous endpoint identifier will not return an endpoint and anonymous
					calling will not be possible.
					</para>
				</description>
				<configOption name="100rel" default="yes">
					<since>
						<version>12.2.0</version>
					</since>
					<synopsis>Allow support for RFC3262 provisional ACK tags</synopsis>
					<description>
						<enumlist>
							<enum name="no">
							<para>If set to <literal>no</literal>, do not support transmission of
							reliable provisional responses. As UAS, if an incoming request contains 100rel
							in the Required header, it is rejected with 420 Bad Extension.</para>
							</enum>
							<enum name="required">
							<para>If set to <literal>required</literal>, require provisional responses to
							be sent and received reliably. As UAS, incoming requests without 100rel
							in the Supported header are rejected with 421 Extension Required. As UAC,
							outgoing requests will have 100rel in the Required header.</para>
							</enum>
							<enum name="peer_supported">
							<para>If set to <literal>peer_supported</literal>, send provisional responses
							reliably if the request by the peer contained 100rel in the Supported or
							Require header. As UAS, if an incoming request contains 100rel in the Supported
							header, send 1xx responses reliably. If the request by the peer does not contain 100rel
							in the Supported and Require header, send responses normally. As UAC, outgoing requests
							will contain 100rel in the Supported header.</para>
							</enum>
							<enum name="yes">
							<para>If set to <literal>yes</literal>, indicate the support of reliable provisional
							responses and PRACK them if required by the peer. As UAS, if the incoming request
							contains 100rel in the Supported header but not in the Required header, send 1xx
							responses normally. If the incoming request contains 100rel in the Required header,
							send 1xx responses reliably. As UAC add 100rel to the Supported header and PRACK 1xx
							responses if required.</para>
							</enum>
						</enumlist>
					</description>
				</configOption>
				<configOption name="aggregate_mwi" default="yes">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Condense MWI notifications into a single NOTIFY.</synopsis>
					<description><para>When enabled, <replaceable>aggregate_mwi</replaceable> condenses message
					waiting notifications from multiple mailboxes into a single NOTIFY. If it is disabled,
					individual NOTIFYs are sent for each mailbox.</para></description>
				</configOption>
				<configOption name="allow">
					<since>
						<version>13.0.0</version>
					</since>
					<synopsis>Media Codec(s) to allow</synopsis>
				</configOption>
				<configOption name="codec_prefs_incoming_offer">
					<since>
						<version>18.0.0</version>
					</since>
					<synopsis>Codec negotiation prefs for incoming offers.</synopsis>
					<description>
						<para>
							This is a string that describes how the codecs
							specified on an incoming SDP offer (pending) are reconciled with the codecs specified
							on an endpoint (configured) before being sent to the Asterisk core.
							The string actually specifies 4 <literal>name:value</literal> pair parameters
							separated by commas. Whitespace is ignored and they may be specified in any order.
							Note that this option is reserved for future functionality.

						</para>
						<para>
							Parameters:
						</para>
						<enumlist>
							<enum name="prefer: &lt; pending | configured &gt;">
								<para>
								</para>
								<enumlist>
									<enum name="pending"><para>The codec list from the caller. (default)</para></enum>
									<enum name="configured"><para>The codec list from the endpoint.</para></enum>
								</enumlist>
							</enum>
							<enum name="operation : &lt; intersect | only_preferred | only_nonpreferred &gt;">
								<para>
								</para>
								<enumlist>
									<enum name="intersect"><para>Only common codecs with the preferred codecs first. (default)</para></enum>
									<enum name="only_preferred"><para>Use only the preferred codecs.</para></enum>
									<enum name="only_nonpreferred"><para>Use only the non-preferred codecs.</para></enum>
								</enumlist>
							</enum>
							<enum name="keep : &lt; all | first &gt;">
								<para>
								</para>
								<enumlist>
									<enum name="all"><para>After the operation, keep all codecs. (default)</para></enum>
									<enum name="first"><para>After the operation, keep only the first codec.</para></enum>
								</enumlist>
							</enum>
							<enum name="transcode : &lt; allow | prevent &gt;">
								<para>
								</para>
								<enumlist>
									<enum name="allow"><para>Allow transcoding. (default)</para></enum>
									<enum name="prevent"><para>Prevent transcoding.</para></enum>
								</enumlist>
							</enum>
						</enumlist>
						<para>
						</para>
						<example>
							codec_prefs_incoming_offer = prefer: pending, operation: intersect, keep: all, transcode: allow
						</example>
						<para>
							Prefer the codecs coming from the caller.  Use only the ones that are common.
							keeping the order of the preferred list. Keep all codecs in the result. Allow transcoding.
						</para>
					</description>
				</configOption>
				<configOption name="codec_prefs_outgoing_offer">
					<since>
						<version>18.0.0</version>
					</since>
					<synopsis>Codec negotiation prefs for outgoing offers.</synopsis>
					<description>
						<para>
							This is a string that describes how the codecs specified in the topology that
							comes from the Asterisk core (pending) are reconciled with the codecs specified on an
							endpoint (configured) when sending an SDP offer.
							The string actually specifies 4 <literal>name:value</literal> pair parameters
							separated by commas. Whitespace is ignored and they may be specified in any order.
							Note that this option is reserved for future functionality.

						</para>
						<para>
							Parameters:
						</para>
						<enumlist>
							<enum name="prefer: &lt; pending | configured &gt;">
								<para>
								</para>
								<enumlist>
									<enum name="pending"><para>The codec list from the core. (default)</para></enum>
									<enum name="configured"><para>The codec list from the endpoint.</para></enum>
								</enumlist>
							</enum>
							<enum name="operation : &lt; union | intersect | only_preferred | only_nonpreferred &gt;">
								<para>
								</para>
								<enumlist>
									<enum name="union"><para>Merge the lists with the preferred codecs first. (default)</para></enum>
									<enum name="intersect"><para>Only common codecs with the preferred codecs first. (default)</para></enum>
									<enum name="only_preferred"><para>Use only the preferred codecs.</para></enum>
									<enum name="only_nonpreferred"><para>Use only the non-preferred codecs.</para></enum>
								</enumlist>
							</enum>
							<enum name="keep : &lt; all | first &gt;">
								<para>
								</para>
								<enumlist>
									<enum name="all"><para>After the operation, keep all codecs. (default)</para></enum>
									<enum name="first"><para>After the operation, keep only the first codec.</para></enum>
								</enumlist>
							</enum>
							<enum name="transcode : &lt; allow | prevent &gt;">
								<para>
								</para>
								<enumlist>
									<enum name="allow"><para>Allow transcoding. (default)</para></enum>
									<enum name="prevent"><para>Prevent transcoding.</para></enum>
								</enumlist>
							</enum>
						</enumlist>
						<para>
						</para>
						<example>
						codec_prefs_outgoing_offer = prefer: configured, operation: union, keep: first, transcode: prevent
						</example>
						<para>
						Prefer the codecs coming from the endpoint.  Merge them with the codecs from the core
						keeping the order of the preferred list. Keep only the first one. No transcoding allowed.
						</para>
					</description>
				</configOption>
				<configOption name="codec_prefs_incoming_answer">
					<since>
						<version>18.0.0</version>
					</since>
					<synopsis>Codec negotiation prefs for incoming answers.</synopsis>
					<description>
						<para>
							This is a string that describes how the codecs specified in an incoming SDP answer
							(pending) are reconciled with the codecs specified on an endpoint (configured)
							when receiving an SDP answer.
							The string actually specifies 4 <literal>name:value</literal> pair parameters
							separated by commas. Whitespace is ignored and they may be specified in any order.
							Note that this option is reserved for future functionality.

						</para>
						<para>
							Parameters:
						</para>
						<enumlist>
							<enum name="prefer: &lt; pending | configured &gt;">
								<para>
								</para>
								<enumlist>
									<enum name="pending"><para>The codec list in the received SDP answer. (default)</para></enum>
									<enum name="configured"><para>The codec list from the endpoint.</para></enum>
								</enumlist>
							</enum>
							<enum name="operation : &lt; union | intersect | only_preferred | only_nonpreferred &gt;">
								<para>
								</para>
								<enumlist>
									<enum name="union"><para>Merge the lists with the preferred codecs first.</para></enum>
									<enum name="intersect"><para>Only common codecs with the preferred codecs first. (default)</para></enum>
									<enum name="only_preferred"><para>Use only the preferred codecs.</para></enum>
									<enum name="only_nonpreferred"><para>Use only the non-preferred codecs.</para></enum>
								</enumlist>
							</enum>
							<enum name="keep : &lt; all | first &gt;">
								<para>
								</para>
								<enumlist>
									<enum name="all"><para>After the operation, keep all codecs. (default)</para></enum>
									<enum name="first"><para>After the operation, keep only the first codec.</para></enum>
								</enumlist>
							</enum>
							<enum name="transcode : &lt; allow | prevent &gt;">
								<para>
								The transcode parameter is ignored when processing answers.
								</para>
							</enum>
						</enumlist>
						<para>
						</para>
						<example>
						codec_prefs_incoming_answer = keep: first
						</example>
						<para>
						Use the defaults but keep oinly the first codec.
						</para>
					</description>
				</configOption>
				<configOption name="codec_prefs_outgoing_answer">
					<since>
						<version>18.0.0</version>
					</since>
					<synopsis>Codec negotiation prefs for outgoing answers.</synopsis>
					<description>
						<para>
							This is a string that describes how the codecs that come from the core (pending)
							are reconciled with the codecs specified on an endpoint (configured)
							when sending an SDP answer.
							The string actually specifies 4 <literal>name:value</literal> pair parameters
							separated by commas. Whitespace is ignored and they may be specified in any order.
							Note that this option is reserved for future functionality.

						</para>
						<para>
							Parameters:
						</para>
						<enumlist>
							<enum name="prefer: &lt; pending | configured &gt;">
								<para>
								</para>
								<enumlist>
									<enum name="pending"><para>The codec list that came from the core. (default)</para></enum>
									<enum name="configured"><para>The codec list from the endpoint.</para></enum>
								</enumlist>
							</enum>
							<enum name="operation : &lt; union | intersect | only_preferred | only_nonpreferred &gt;">
								<para>
								</para>
								<enumlist>
									<enum name="union"><para>Merge the lists with the preferred codecs first.</para></enum>
									<enum name="intersect"><para>Only common codecs with the preferred codecs first. (default)</para></enum>
									<enum name="only_preferred"><para>Use only the preferred codecs.</para></enum>
									<enum name="only_nonpreferred"><para>Use only the non-preferred codecs.</para></enum>
								</enumlist>
							</enum>
							<enum name="keep : &lt; all | first &gt;">
								<para>
								</para>
								<enumlist>
									<enum name="all"><para>After the operation, keep all codecs. (default)</para></enum>
									<enum name="first"><para>After the operation, keep only the first codec.</para></enum>
								</enumlist>
							</enum>
							<enum name="transcode : &lt; allow | prevent &gt;">
								<para>
								The transcode parameter is ignored when processing answers.
								</para>
							</enum>
						</enumlist>
						<para>
						</para>
						<example>
						codec_prefs_incoming_answer = keep: first
						</example>
						<para>
						Use the defaults but keep oinly the first codec.
						</para>
					</description>
				</configOption>
				<configOption name="allow_overlap" default="yes">
					<since>
						<version>13.15.0</version>
						<version>14.4.0</version>
					</since>
					<synopsis>Enable RFC3578 overlap dialing support.</synopsis>
				</configOption>
				<configOption name="overlap_context">
					<since>
						<version>18.17.0</version>
						<version>20.2.0</version>
					</since>
					<synopsis>Dialplan context to use for RFC3578 overlap dialing.</synopsis>
					<description>
						<para>Dialplan context to use for overlap dialing extension matching.
						If not specified, the context configured for the endpoint will be used.
						If specified, the extensions/patterns in the specified context will be used
						for determining if a full number has been received from the endpoint.
						</para>
					</description>
				</configOption>
				<configOption name="aors">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>AoR(s) to be used with the endpoint</synopsis>
					<description><para>
						List of comma separated AoRs that the endpoint should be associated with.
					</para></description>
				</configOption>
				<configOption name="auth">
					<since>
						<version>12.2.0</version>
					</since>
					<synopsis>Authentication Object(s) associated with the endpoint</synopsis>
					<description><para>
						This is a comma-delimited list of <replaceable>auth</replaceable> sections defined
						in <filename>pjsip.conf</filename> to be used to verify inbound connection attempts.
						</para><para>
						Endpoints without an authentication object
						configured will allow connections without verification.</para>
						<note><para>
						Using the same auth section for inbound and outbound
						authentication is not recommended.  There is a difference in
						meaning for an empty realm setting between inbound and outbound
						authentication uses.  See the auth realm description for details.
						</para></note>
					</description>
				</configOption>
				<configOption name="callerid">
					<since>
						<version>12.2.0</version>
					</since>
					<synopsis>CallerID information for the endpoint</synopsis>
					<description><para>
						Must be in the format <literal>Name &lt;Number&gt;</literal>,
						or only <literal>&lt;Number&gt;</literal>.
					</para></description>
				</configOption>
				<configOption name="callerid_privacy">
					<since>
						<version>12.7.0</version>
					</since>
					<synopsis>Default privacy level</synopsis>
					<description>
						<enumlist>
							<enum name="allowed_not_screened" />
							<enum name="allowed_passed_screen" />
							<enum name="allowed_failed_screen" />
							<enum name="allowed" />
							<enum name="prohib_not_screened" />
							<enum name="prohib_passed_screen" />
							<enum name="prohib_failed_screen" />
							<enum name="prohib" />
							<enum name="unavailable" />
						</enumlist>
					</description>
				</configOption>
				<configOption name="callerid_tag">
					<since>
						<version>12.2.0</version>
					</since>
					<synopsis>Internal id_tag for the endpoint</synopsis>
				</configOption>
				<configOption name="context">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Dialplan context for inbound sessions</synopsis>
				</configOption>
				<configOption name="direct_media_glare_mitigation" default="none">
					<since>
						<version>12.2.0</version>
					</since>
					<synopsis>Mitigation of direct media (re)INVITE glare</synopsis>
					<description>
						<para>
						This setting attempts to avoid creating INVITE glare scenarios
						by disabling direct media reINVITEs in one direction thereby allowing
						designated servers (according to this option) to initiate direct
						media reINVITEs without contention and significantly reducing call
						setup time.
						</para>
						<para>
						A more detailed description of how this option functions can be found in
						the Asterisk documentation https://docs.asterisk.org/Configuration/Channel-Drivers/SIP/Concepts/SIP-Direct-Media-Reinvite-Glare-Avoidance/
						</para>
						<enumlist>
							<enum name="none" />
							<enum name="outgoing" />
							<enum name="incoming" />
						</enumlist>
					</description>
				</configOption>
				<configOption name="direct_media_method" default="invite">
					<since>
						<version>12.2.0</version>
					</since>
					<synopsis>Direct Media method type</synopsis>
					<description>
						<para>Method for setting up Direct Media between endpoints.</para>
						<enumlist>
							<enum name="invite" />
							<enum name="reinvite">
								<para>Alias for the <literal>invite</literal> value.</para>
							</enum>
							<enum name="update" />
						</enumlist>
					</description>
				</configOption>
				<configOption name="trust_connected_line">
					<since>
						<version>13.24.0</version>
						<version>16.1.0</version>
					</since>
					<synopsis>Accept Connected Line updates from this endpoint</synopsis>
				</configOption>
				<configOption name="send_connected_line">
					<since>
						<version>13.24.0</version>
						<version>16.1.0</version>
					</since>
					<synopsis>Send Connected Line updates to this endpoint</synopsis>
				</configOption>
				<configOption name="connected_line_method" default="invite">
					<since>
						<version>12.2.0</version>
					</since>
					<synopsis>Connected line method type</synopsis>
					<description>
						<para>Method used when updating connected line information.</para>
						<enumlist>
							<enum name="invite">
							<para>When set to <literal>invite</literal>, check the remote's Allow header and
							if UPDATE is allowed, send UPDATE instead of INVITE to avoid SDP
							renegotiation.  If UPDATE is not Allowed, send INVITE.</para>
							</enum>
							<enum name="reinvite">
								<para>Alias for the <literal>invite</literal> value.</para>
							</enum>
							<enum name="update">
							<para>If set to <literal>update</literal>, send UPDATE regardless of what the remote
							Allows. </para>
							</enum>
						</enumlist>
					</description>
				</configOption>
				<configOption name="direct_media" default="yes">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Determines whether media may flow directly between endpoints.</synopsis>
				</configOption>
				<configOption name="disable_direct_media_on_nat" default="no">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Disable direct media session refreshes when NAT obstructs the media session</synopsis>
				</configOption>
				<configOption name="disallow">
					<since>
						<version>13.0.0</version>
					</since>
					<synopsis>Media Codec(s) to disallow</synopsis>
				</configOption>
				<configOption name="dtmf_mode" default="rfc4733">
					<since>
						<version>12.2.0</version>
					</since>
					<synopsis>DTMF mode</synopsis>
					<description>
						<para>This setting allows to choose the DTMF mode for endpoint communication.</para>
						<enumlist>
							<enum name="rfc4733">
								<para>DTMF is sent out of band of the main audio stream.</para>
							</enum>
							<enum name="inband">
								<para>DTMF is sent as part of audio stream.</para>
							</enum>
							<enum name="info">
								<para>DTMF is sent as SIP INFO packets.</para>
							</enum>
							<enum name="auto">
								<para>DTMF is sent as RFC 4733 if the other side supports it or as INBAND if not.</para>
							</enum>
							<enum name="auto_info">
								<para>DTMF is sent as RFC 4733 if the other side supports it or as SIP INFO if not.</para>
							</enum>
						</enumlist>
					</description>
				</configOption>
				<configOption name="media_address">
					<since>
						<version>18.22.0</version>
						<version>20.7.0</version>
						<version>21.2.0</version>
					</since>
					<synopsis>IP address used in SDP for media handling</synopsis>
					<description><para>
						At the time of SDP creation, the IP address defined here will be used as
						the media address for individual streams in the SDP.
					</para>
					<note><para>
						Be aware that the <literal>external_media_address</literal> option, set in Transport
						configuration, can also affect the final media address used in the SDP.
					</para></note>
					</description>
				</configOption>
				<configOption name="bind_rtp_to_media_address">
					<since>
						<version>13.8.0</version>
					</since>
					<synopsis>Bind the RTP instance to the media_address</synopsis>
					<description><para>
						If media_address is specified, this option causes the RTP instance to be bound to the
						specified ip address which causes the packets to be sent from that address.
					</para>
					</description>
				</configOption>
				<configOption name="force_rport" default="yes">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Force use of return port</synopsis>
				</configOption>
				<configOption name="ice_support" default="no">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Enable the ICE mechanism to help traverse NAT</synopsis>
				</configOption>
				<configOption name="identify_by">
					<since>
						<version>13.19.0</version>
						<version>15.2.0</version>
					</since>
					<synopsis>Way(s) for the endpoint to be identified</synopsis>
					<description>
						<para>Endpoints and AORs can be identified in multiple ways.  This
						option is a comma separated list of methods the endpoint can be
						identified.
						</para>
						<note><para>
						This option controls both how an endpoint is matched for incoming
						traffic and also how an AOR is determined if a registration
						occurs.  You must list at least one method that also matches for
						AORs or the registration will fail.
						</para></note>
						<enumlist>
							<enum name="username">
								<para>Matches the endpoint or AOR ID based on the username
								and domain in the From header (or To header for AORs).  If
								an exact match on both username and domain/realm fails, the
								match is retried with just the username.
								</para>
							</enum>
							<enum name="auth_username">
								<para>Matches the endpoint or AOR ID based on the username
								and realm in the Authentication header.  If an exact match
								on both username and domain/realm fails, the match is
								retried with just the username.
								</para>
								<note><para>This method of identification has some security
								considerations because an Authentication header is not
								present on the first message of a dialog when digest
								authentication is used.  The client can't generate it until
								the server sends the challenge in a 401 response.  Since
								Asterisk normally sends a security event when an incoming
								request can't be matched to an endpoint, using this method
								requires that the security event be deferred until a request
								is received with the Authentication header and only
								generated if the username doesn't result in a match.  This
								may result in a delay before an attack is recognized.  You
								can control how many unmatched requests are received from
								a single ip address before a security event is generated
								using the <literal>unidentified_request</literal>
								parameters in the "global" configuration object.
								</para></note>
							</enum>
							<enum name="ip">
								<para>Matches the endpoint based on the source IP address.
								</para>
								<para>This method of identification is not configured here
								but simply allowed by this configuration option.  See the
								documentation for the <literal>identify</literal>
								configuration section for more details on this method of
								endpoint identification.
								</para>
							</enum>
							<enum name="header">
								<para>Matches the endpoint based on a configured SIP header
								value.
								</para>
								<para>This method of identification is not configured here
								but simply allowed by this configuration option.  See the
								documentation for the <literal>identify</literal>
								configuration section for more details on this method of
								endpoint identification.
								</para>
							</enum>
							<enum name="request_uri">
								<para>Matches the endpoint based on the configured SIP
								request uri.
								</para>
								<para>This method of identification is not configured here
								but simply allowed by this configuration option.
								</para>
							</enum>
						</enumlist>
					</description>
				</configOption>
				<configOption name="redirect_method">
					<since>
						<version>12.2.0</version>
					</since>
					<synopsis>How redirects received from an endpoint are handled</synopsis>
					<description><para>
						When a redirect is received from an endpoint there are multiple ways it can be handled.
						If this option is set to <literal>user</literal> the user portion of the redirect target
						is treated as an extension within the dialplan and dialed using a Local channel. If this option
						is set to <literal>uri_core</literal> the target URI is returned to the dialing application
						which dials it using the PJSIP channel driver and endpoint originally used. If this option is
						set to <literal>uri_pjsip</literal> the redirect occurs within chan_pjsip itself and is not exposed
						to the core at all. The <literal>uri_pjsip</literal> option has the benefit of being more efficient
						and also supporting multiple potential redirect targets. The con is that since redirection occurs
						within chan_pjsip redirecting information is not forwarded and redirection can not be
						prevented.
						</para>
						<enumlist>
							<enum name="user" />
							<enum name="uri_core" />
							<enum name="uri_pjsip" />
						</enumlist>
					</description>
				</configOption>
				<configOption name="follow_redirect_methods">
					<since>
						<version>20.18.0</version>
						<version>22.8.0</version>
						<version>23.2.0</version>
					</since>
					<synopsis>Follow 3XX redirect responses for the defined SIP methods.</synopsis>
					<description><para>
						This is a comma-delimited, case-insensitive list of SIP methods for which redirects are followed.
						When a redirect response is received for a SIP request, the redirect is only followed if the
						method is listed in this config option. For example <literal>MESSAGE</literal>. Currently, only
						<literal>MESSAGE</literal> is supported.
						</para>
					</description>
				</configOption>
				<configOption name="mailboxes">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>NOTIFY the endpoint when state changes for any of the specified mailboxes</synopsis>
					<description><para>
						Asterisk will send unsolicited MWI NOTIFY messages to the endpoint when state
						changes happen for any of the specified mailboxes. More than one mailbox can be
						specified with a comma-delimited string. app_voicemail mailboxes must be specified
						as mailbox@context; for example: mailboxes=6001@default. For mailboxes provided by
						external sources, such as through the res_mwi_external module, you must specify
						strings supported by the external system.
					</para><para>
						For endpoints that SUBSCRIBE for MWI, use the <literal>mailboxes</literal> option in your AOR
						configuration.
					</para></description>
				</configOption>
				<configOption name="mwi_subscribe_replaces_unsolicited">
					<since>
						<version>13.24.0</version>
						<version>15.7.0</version>
					</since>
					<synopsis>An MWI subscribe will replace sending unsolicited NOTIFYs</synopsis>
				</configOption>
				<configOption name="voicemail_extension">
					<since>
						<version>13.9.0</version>
					</since>
					<synopsis>The voicemail extension to send in the NOTIFY Message-Account header</synopsis>
				</configOption>
				<configOption name="moh_suggest" default="default">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Default Music On Hold class</synopsis>
				</configOption>
				<configOption name="outbound_auth">
					<since>
						<version>12.2.0</version>
					</since>
					<synopsis>Authentication object(s) used for outbound requests</synopsis>
					<description><para>
						This is a comma-delimited list of <replaceable>auth</replaceable>
						sections defined in <filename>pjsip.conf</filename> used to respond
						to outbound connection authentication challenges.</para>
						<note><para>
						Using the same auth section for inbound and outbound
						authentication is not recommended.  There is a difference in
						meaning for an empty realm setting between inbound and outbound
						authentication uses.  See the auth realm description for details.
						</para></note>
					</description>
				</configOption>
				<configOption name="outbound_proxy">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Full SIP URI of the outbound proxy used to send requests</synopsis>
					<description><para>
						Proxy through which to send requests, a full SIP URI must be provided (default: "").
						Consider adding \;lr for loose routing (to keep user@domain in the request URI).
					</para></description>
				</configOption>
				<configOption name="rewrite_contact">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Allow Contact header to be rewritten with the source IP address-port</synopsis>
					<description><para>
						On inbound SIP messages from this endpoint, the Contact header or an
						appropriate Record-Route header will be changed to have the source IP
						address and port.  This option does not affect outbound messages sent to
						this endpoint.  This option helps servers communicate with endpoints
						that are behind NATs.  This option also helps reuse reliable transport
						connections such as TCP and TLS.
					</para></description>
				</configOption>
				<configOption name="rtp_ipv6" default="no">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Allow use of IPv6 for RTP traffic</synopsis>
				</configOption>
				<configOption name="rtp_symmetric" default="no">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Enforce that RTP must be symmetric</synopsis>
				</configOption>
				<configOption name="send_diversion" default="yes">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Send the Diversion header, conveying the diversion
					information to the called user agent</synopsis>
				</configOption>
				<configOption name="send_history_info" default="no">
					<since>
						<version>13.38.0</version>
						<version>16.15.0</version>
						<version>17.9.0</version>
						<version>18.1.0</version>
					</since>
					<synopsis>Send the History-Info header, conveying the diversion
					information to the called and calling user agents</synopsis>
				</configOption>
				<configOption name="send_pai" default="no">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Send the P-Asserted-Identity header</synopsis>
				</configOption>
				<configOption name="send_rpid" default="no">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Send the Remote-Party-ID header</synopsis>
				</configOption>
				<configOption name="rpid_immediate" default="no">
					<since>
						<version>13.4.0</version>
					</since>
					<synopsis>Immediately send connected line updates on unanswered incoming calls.</synopsis>
					<description>
						<para>When enabled, immediately send <emphasis>180 Ringing</emphasis>
						or <emphasis>183 Progress</emphasis> response messages to the
						caller if the connected line information is updated before
						the call is answered.  This can send a <emphasis>180 Ringing</emphasis>
						response before the call has even reached the far end.  The
						caller can start hearing ringback before the far end even gets
						the call.  Many phones tend to grab the first connected line
						information and refuse to update the display if it changes.  The
						first information is not likely to be correct if the call
						goes to an endpoint not under the control of this Asterisk
						box.</para>
						<para>When disabled, a connected line update must wait for
						another reason to send a message with the connected line
						information to the caller before the call is answered.  You can
						trigger the sending of the information by using an appropriate
						dialplan application such as <emphasis>Ringing</emphasis>.</para>
					</description>
				</configOption>
				<configOption name="tenantid" default="">
					<since>
						<version>18.25.0</version>
						<version>20.10.0</version>
						<version>21.5.0</version>
					</since>
					<synopsis>The tenant ID for this endpoint.</synopsis>
					<description><para>
						Sets the tenant ID for this endpoint. When a channel is created,
						tenantid will be set to this value. It can be changed via dialplan
						later if needed.
					</para></description>
				</configOption>
				<configOption name="timers_min_se" default="90">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Minimum session timers expiration period</synopsis>
					<description><para>
						Minimum session timer expiration period. Time in seconds.
					</para></description>
				</configOption>
				<configOption name="timers" default="yes">
					<since>
						<version>12.2.0</version>
					</since>
					<synopsis>Session timers for SIP packets</synopsis>
					<description>
						<enumlist>
							<enum name="no" />
							<enum name="yes" />
							<enum name="required" />
							<enum name="always" />
							<enum name="forced"><para>Alias of always</para></enum>
						</enumlist>
					</description>
				</configOption>
				<configOption name="timers_sess_expires" default="1800">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Maximum session timer expiration period</synopsis>
					<description><para>
						Maximum session timer expiration period. Time in seconds.
					</para></description>
				</configOption>
				<configOption name="transport">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Explicit transport configuration to use</synopsis>
					<description>
						<para>This will <emphasis>force</emphasis> the endpoint to use the
						specified transport configuration to send SIP messages.  You need
						to already know what kind of transport (UDP/TCP/IPv4/etc) the
						endpoint device will use.
						</para>
						<note><para>Not specifying a transport will select the first
						configured transport in <filename>pjsip.conf</filename> which is
						compatible with the URI we are trying to contact.
						</para></note>
						<warning><para>Transport configuration is not affected by reloads. In order to
						change transports, a full Asterisk restart is required</para></warning>
					</description>
				</configOption>
				<configOption name="trust_id_inbound" default="no">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Accept identification information received from this endpoint</synopsis>
					<description><para>This option determines whether Asterisk will accept
					identification from the endpoint from headers such as P-Asserted-Identity
					or Remote-Party-ID header. This option applies both to calls originating from the
					endpoint and calls originating from Asterisk. If <literal>no</literal>, the
					configured Caller-ID from pjsip.conf will always be used as the identity for
					the endpoint.</para></description>
				</configOption>
				<configOption name="trust_id_outbound" default="no">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Send private identification details to the endpoint.</synopsis>
					<description><para>This option determines whether res_pjsip will send private
					identification information to the endpoint. If <literal>no</literal>,
					private Caller-ID information will not be forwarded to the endpoint.
					"Private" in this case refers to any method of restricting identification.
					Example: setting <replaceable>callerid_privacy</replaceable> to any
					<literal>prohib</literal> variation.
					Example: If <replaceable>trust_id_inbound</replaceable> is set to
					<literal>yes</literal>, the presence of a <literal>Privacy: id</literal>
					header in a SIP request or response would indicate the identification
					provided in the request is private.</para></description>
				</configOption>
				<configOption name="type">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Must be of type 'endpoint'.</synopsis>
				</configOption>
				<configOption name="use_ptime" default="no">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Use Endpoint's requested packetization interval</synopsis>
				</configOption>
				<configOption name="use_avpf" default="no">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Determines whether res_pjsip will use and enforce usage of AVPF for this
					endpoint.</synopsis>
					<description><para>
						If set to <literal>yes</literal>, res_pjsip will use the AVPF or SAVPF RTP
						profile for all media offers on outbound calls and media updates and will
						decline media offers not using the AVPF or SAVPF profile.
					</para><para>
						If set to <literal>no</literal>, res_pjsip will use the AVP or SAVP RTP
						profile for all media offers on outbound calls and media updates, and will
						decline media offers not using the AVP or SAVP profile.
					</para></description>
				</configOption>
				<configOption name="force_avp" default="no">
					<since>
						<version>12.4.0</version>
					</since>
					<synopsis>Determines whether res_pjsip will use and enforce usage of AVP,
					regardless of the RTP profile in use for this endpoint.</synopsis>
					<description><para>
						If set to <literal>yes</literal>, res_pjsip will use the AVP, AVPF, SAVP, or
						SAVPF RTP profile for all media offers on outbound calls and media updates including
						those for DTLS-SRTP streams.
					</para><para>
						If set to <literal>no</literal>, res_pjsip will use the respective RTP profile
						depending on configuration.
					</para></description>
				</configOption>
				<configOption name="media_use_received_transport" default="no">
					<since>
						<version>12.4.0</version>
					</since>
					<synopsis>Determines whether res_pjsip will use the media transport received in the
					offer SDP in the corresponding answer SDP.</synopsis>
					<description><para>
						If set to <literal>yes</literal>, res_pjsip will use the received media transport.
					</para><para>
						If set to <literal>no</literal>, res_pjsip will use the respective RTP profile
						depending on configuration.
					</para></description>
				</configOption>
				<configOption name="media_encryption" default="no">
					<since>
						<version>12.2.0</version>
					</since>
					<synopsis>Determines whether res_pjsip will use and enforce usage of media encryption
					for this endpoint.</synopsis>
					<description>
						<enumlist>
							<enum name="no"><para>
								res_pjsip will offer no encryption and allow no encryption to be setup.
							</para></enum>
							<enum name="sdes"><para>
								res_pjsip will offer standard SRTP setup via in-SDP keys. Encrypted SIP
								transport should be used in conjunction with this option to prevent
								exposure of media encryption keys.
							</para></enum>
							<enum name="dtls"><para>
								res_pjsip will offer DTLS-SRTP setup.
							</para></enum>
						</enumlist>
					</description>
				</configOption>
				<configOption name="media_encryption_optimistic" default="no">
					<since>
						<version>13.1.0</version>
					</since>
					<synopsis>Determines whether encryption should be used if possible but does not terminate the
					session if not achieved.</synopsis>
					<description><para>
						This option only applies if <replaceable>media_encryption</replaceable> is
						set to <literal>sdes</literal> or <literal>dtls</literal>.
					</para></description>
				</configOption>
				<configOption name="g726_non_standard" default="no">
					<since>
						<version>13.5.0</version>
					</since>
					<synopsis>Force g.726 to use AAL2 packing order when negotiating g.726 audio</synopsis>
					<description><para>
						When set to "yes" and an endpoint negotiates g.726 audio then use g.726 for AAL2
						packing order instead of what is recommended by RFC3551. Since this essentially
						replaces the underlying 'g726' codec with 'g726aal2' then 'g726aal2' needs to be
						specified in the endpoint's allowed codec list.
					</para></description>
				</configOption>
				<configOption name="inband_progress" default="no">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Determines whether chan_pjsip will indicate ringing using inband
						progress.</synopsis>
					<description><para>
						If set to <literal>yes</literal>, chan_pjsip will send a 183 Session Progress
						when told to indicate ringing and will immediately start sending ringing
						as audio.
					</para><para>
						If set to <literal>no</literal>, chan_pjsip will send a 180 Ringing when told
						to indicate ringing and will NOT send it as audio.
					</para></description>
				</configOption>
				<configOption name="call_group">
					<since>
						<version>12.2.0</version>
					</since>
					<synopsis>The numeric pickup groups for a channel.</synopsis>
					<description><para>
						Can be set to a comma separated list of numbers or ranges between the values
						of 0-63 (maximum of 64 groups).
					</para></description>
				</configOption>
				<configOption name="pickup_group">
					<since>
						<version>12.2.0</version>
					</since>
					<synopsis>The numeric pickup groups that a channel can pickup.</synopsis>
					<description><para>
						Can be set to a comma separated list of numbers or ranges between the values
						of 0-63 (maximum of 64 groups).
					</para></description>
				</configOption>
				<configOption name="named_call_group">
					<since>
						<version>12.2.0</version>
					</since>
					<synopsis>The named pickup groups for a channel.</synopsis>
					<description><para>
						Can be set to a comma separated list of case sensitive strings limited by
						supported line length.
					</para></description>
				</configOption>
				<configOption name="named_pickup_group">
					<since>
						<version>12.2.0</version>
					</since>
					<synopsis>The named pickup groups that a channel can pickup.</synopsis>
					<description><para>
						Can be set to a comma separated list of case sensitive strings limited by
						supported line length.
					</para></description>
				</configOption>
				<configOption name="device_state_busy_at" default="0">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>The number of in-use channels which will cause busy to be returned as device state</synopsis>
					<description><para>
						When the number of in-use channels for the endpoint equal to or greater than the devicestate_busy_at setting
						the PJSIP channel driver will return busy as the device state instead of in use.
					</para></description>
				</configOption>
				<configOption name="t38_udptl" default="no">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Whether T.38 UDPTL support is enabled or not</synopsis>
					<description><para>
						If set to yes T.38 UDPTL support will be enabled, and T.38 negotiation requests will be accepted
						and relayed.
					</para></description>
				</configOption>
				<configOption name="t38_udptl_ec" default="none">
					<since>
						<version>12.2.0</version>
					</since>
					<synopsis>T.38 UDPTL error correction method</synopsis>
					<description>
						<enumlist>
							<enum name="none"><para>
								No error correction should be used.
							</para></enum>
							<enum name="fec"><para>
								Forward error correction should be used.
							</para></enum>
							<enum name="redundancy"><para>
								Redundancy error correction should be used.
							</para></enum>
						</enumlist>
					</description>
				</configOption>
				<configOption name="t38_udptl_maxdatagram" default="0">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>T.38 UDPTL maximum datagram size</synopsis>
					<description><para>
						This option can be set to override the maximum datagram of a remote endpoint for broken
						endpoints.
					</para></description>
				</configOption>
				<configOption name="fax_detect" default="no">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Whether CNG tone detection is enabled</synopsis>
					<description><para>
						This option can be set to send the session to the fax extension when a CNG tone is
						detected.
					</para></description>
				</configOption>
				<configOption name="fax_detect_timeout">
					<since>
						<version>13.11.0</version>
					</since>
					<synopsis>How long into a call before fax_detect is disabled for the call</synopsis>
					<description><para>
						The option determines how many seconds into a call before the
						fax_detect option is disabled for the call.  Setting the value
						to zero disables the timeout.
					</para></description>
				</configOption>
				<configOption name="t38_udptl_nat" default="no">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Whether NAT support is enabled on UDPTL sessions</synopsis>
					<description><para>
						When enabled the UDPTL stack will send UDPTL packets to the source address of
						received packets.
					</para></description>
				</configOption>
				<configOption name="t38_udptl_ipv6" default="no">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Whether IPv6 is used for UDPTL Sessions</synopsis>
					<description><para>
						When enabled the UDPTL stack will use IPv6.
					</para></description>
				</configOption>
				<configOption name="t38_bind_udptl_to_media_address" default="no">
					<since>
						<version>16.22.0</version>
						<version>18.8.0</version>
					</since>
					<synopsis>Bind the UDPTL instance to the media_adress</synopsis>
					<description><para>
						If media_address is specified, this option causes the UDPTL instance to be bound to
						the specified ip address which causes the packets to be sent from that address.
					</para></description>
				</configOption>
				<configOption name="tone_zone">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Set which country's indications to use for channels created for this endpoint.</synopsis>
				</configOption>
				<configOption name="language">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Set the default language to use for channels created for this endpoint.</synopsis>
				</configOption>
				<configOption name="one_touch_recording" default="no">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Determines whether one-touch recording is allowed for this endpoint.</synopsis>
					<see-also>
						<ref type="configOption">record_on_feature</ref>
						<ref type="configOption">record_off_feature</ref>
					</see-also>
				</configOption>
				<configOption name="record_on_feature" default="automixmon">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>The feature to enact when one-touch recording is turned on.</synopsis>
					<description>
						<para>When an INFO request for one-touch recording arrives with a Record header set to "on", this
						feature will be enabled for the channel. The feature designated here can be any built-in
						or dynamic feature defined in features.conf.</para>
						<note><para>This setting has no effect if the endpoint's one_touch_recording option is disabled</para></note>
					</description>
					<see-also>
						<ref type="configOption">one_touch_recording</ref>
						<ref type="configOption">record_off_feature</ref>
					</see-also>
				</configOption>
				<configOption name="record_off_feature" default="automixmon">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>The feature to enact when one-touch recording is turned off.</synopsis>
					<description>
						<para>When an INFO request for one-touch recording arrives with a Record header set to "off", this
						feature will be enabled for the channel. The feature designated here can be any built-in
						or dynamic feature defined in features.conf.</para>
						<note><para>This setting has no effect if the endpoint's one_touch_recording option is disabled</para></note>
					</description>
					<see-also>
						<ref type="configOption">one_touch_recording</ref>
						<ref type="configOption">record_on_feature</ref>
					</see-also>
				</configOption>
				<configOption name="rtp_engine" default="asterisk">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Name of the RTP engine to use for channels created for this endpoint</synopsis>
				</configOption>
				<configOption name="allow_transfer" default="yes">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Determines whether SIP REFER transfers are allowed for this endpoint</synopsis>
				</configOption>
				<configOption name="user_eq_phone" default="no">
					<since>
						<version>13.2.0</version>
					</since>
					<synopsis>Determines whether a user=phone parameter is placed into the request URI if the user is determined to be a phone number</synopsis>
				</configOption>
				<configOption name="moh_passthrough" default="no">
					<since>
						<version>13.30.0</version>
					</since>
					<synopsis>Determines whether hold and unhold will be passed through using re-INVITEs with recvonly and sendrecv to the remote side</synopsis>
				</configOption>
				<configOption name="sdp_owner" default="-">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>String placed as the username portion of an SDP origin (o=) line.</synopsis>
					<description><para>
						The username portion of an SDP origin to be used in the SDP 'o=' line.
						Note: If this option is left empty or set only to whitespace, it will
						automatically default to a hyphen ('-') to ensure compliance
						with RFC 8866.
					</para></description>
				</configOption>
				<configOption name="sdp_session" default="Asterisk">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>String used for the SDP session (s=) line.</synopsis>
					<description><para>
						The session name to be used in the SDP 's=' line.
						Note: If this option is left empty or set only to whitespace, it will
						automatically default to a hyphen ('-') to ensure compliance
						with RFC 8866.
				</para></description>
				</configOption>
				<configOption name="tos_audio">
					<since>
						<version>12.2.0</version>
					</since>
					<synopsis>DSCP TOS bits for audio streams</synopsis>
					<description><para>
						See https://docs.asterisk.org/Configuration/Channel-Drivers/IP-Quality-of-Service for more information about QoS settings
					</para></description>
				</configOption>
				<configOption name="tos_video">
					<since>
						<version>12.2.0</version>
					</since>
					<synopsis>DSCP TOS bits for video streams</synopsis>
					<description><para>
						See https://docs.asterisk.org/Configuration/Channel-Drivers/IP-Quality-of-Service for more information about QoS settings
					</para></description>
				</configOption>
				<configOption name="cos_audio">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Priority for audio streams</synopsis>
					<description><para>
						See https://docs.asterisk.org/Configuration/Channel-Drivers/IP-Quality-of-Service for more information about QoS settings
					</para></description>
				</configOption>
				<configOption name="cos_video">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Priority for video streams</synopsis>
					<description><para>
						See https://docs.asterisk.org/Configuration/Channel-Drivers/IP-Quality-of-Service for more information about QoS settings
					</para></description>
				</configOption>
				<configOption name="allow_subscribe" default="yes">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Determines if endpoint is allowed to initiate subscriptions with Asterisk.</synopsis>
				</configOption>
				<configOption name="sub_min_expiry" default="60">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>The minimum allowed expiry time for subscriptions initiated by the endpoint.</synopsis>
				</configOption>
				<configOption name="from_user">
					<since>
						<version>13.18.0</version>
						<version>14.7.0</version>
					</since>
					<synopsis>Username to use in From header for requests to this endpoint.</synopsis>
				</configOption>
				<configOption name="mwi_from_user">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Username to use in From header for unsolicited MWI NOTIFYs to this endpoint.</synopsis>
				</configOption>
				<configOption name="from_domain">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Domain to use in From header for requests to this endpoint.</synopsis>
				</configOption>
				<configOption name="dtls_verify">
					<since>
						<version>12.7.0</version>
					</since>
					<synopsis>Verify that the provided peer certificate is valid</synopsis>
					<description><para>
						This option only applies if <replaceable>media_encryption</replaceable> is
						set to <literal>dtls</literal>.
						</para><para>
						It can be one of the following values:
						</para><enumlist>
							<enum name="no"><para>
								meaning no verification is done.
							</para></enum>
							<enum name="fingerprint"><para>
								meaning to verify the remote fingerprint.
							</para></enum>
							<enum name="certificate"><para>
								meaning to verify the remote certificate.
							</para></enum>
							<enum name="yes"><para>
								meaning to verify both the remote fingerprint and certificate.
							</para></enum>
						</enumlist>
					</description>
				</configOption>
				<configOption name="dtls_rekey">
					<since>
						<version>12.7.0</version>
					</since>
					<synopsis>Interval at which to renegotiate the TLS session and rekey the SRTP session</synopsis>
					<description><para>
						This option only applies if <replaceable>media_encryption</replaceable> is
						set to <literal>dtls</literal>.
					</para><para>
						If this is not set or the value provided is 0 rekeying will be disabled.
					</para></description>
				</configOption>
				<configOption name="dtls_auto_generate_cert" default="no">
					<since>
						<version>15.2.0</version>
					</since>
					<synopsis>Whether or not to automatically generate an ephemeral X.509 certificate</synopsis>
					<description>
						<para>
							If enabled, Asterisk will generate an X.509 certificate for each DTLS session.
							This option only applies if <replaceable>media_encryption</replaceable> is set
							to <literal>dtls</literal>. This option will be automatically enabled if
							<literal>webrtc</literal> is enabled and <literal>dtls_cert_file</literal> is
							not specified.
						</para>
					</description>
				</configOption>
				<configOption name="dtls_cert_file">
					<since>
						<version>12.2.0</version>
					</since>
					<synopsis>Path to certificate file to present to peer</synopsis>
					<description><para>
						This option only applies if <replaceable>media_encryption</replaceable> is
						set to <literal>dtls</literal>.
					</para></description>
				</configOption>
				<configOption name="dtls_private_key">
					<since>
						<version>12.2.0</version>
					</since>
					<synopsis>Path to private key for certificate file</synopsis>
					<description><para>
						This option only applies if <replaceable>media_encryption</replaceable> is
						set to <literal>dtls</literal>.
					</para></description>
				</configOption>
				<configOption name="dtls_cipher">
					<since>
						<version>12.2.0</version>
					</since>
					<synopsis>Cipher to use for DTLS negotiation</synopsis>
					<description><para>
						This option only applies if <replaceable>media_encryption</replaceable> is
						set to <literal>dtls</literal>.
					</para>
					<para>Many options for acceptable ciphers. See link for more:</para>
					<para>http://www.openssl.org/docs/apps/ciphers.html#CIPHER_STRINGS
					</para></description>
				</configOption>
				<configOption name="dtls_ca_file">
					<since>
						<version>12.2.0</version>
					</since>
					<synopsis>Path to certificate authority certificate</synopsis>
					<description><para>
						This option only applies if <replaceable>media_encryption</replaceable> is
						set to <literal>dtls</literal>.
					</para></description>
				</configOption>
				<configOption name="dtls_ca_path">
					<since>
						<version>12.2.0</version>
					</since>
					<synopsis>Path to a directory containing certificate authority certificates</synopsis>
					<description><para>
						This option only applies if <replaceable>media_encryption</replaceable> is
						set to <literal>dtls</literal>.
					</para></description>
				</configOption>
				<configOption name="dtls_setup">
					<since>
						<version>12.2.0</version>
					</since>
					<synopsis>Whether we are willing to accept connections, connect to the other party, or both.</synopsis>
					<description>
						<para>
							This option only applies if <replaceable>media_encryption</replaceable> is
							set to <literal>dtls</literal>.
						</para>
						<enumlist>
							<enum name="active"><para>
								res_pjsip will make a connection to the peer.
							</para></enum>
							<enum name="passive"><para>
								res_pjsip will accept connections from the peer.
							</para></enum>
							<enum name="actpass"><para>
								res_pjsip will offer and accept connections from the peer.
							</para></enum>
						</enumlist>
					</description>
				</configOption>
				<configOption name="dtls_fingerprint">
					<since>
						<version>12.7.0</version>
					</since>
					<synopsis>Type of hash to use for the DTLS fingerprint in the SDP.</synopsis>
					<description>
						<para>
							This option only applies if <replaceable>media_encryption</replaceable> is
							set to <literal>dtls</literal>.
						</para>
						<enumlist>
							<enum name="SHA-256"></enum>
							<enum name="SHA-1"></enum>
						</enumlist>
					</description>
				</configOption>
				<configOption name="srtp_tag_32">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Determines whether 32 byte tags should be used instead of 80 byte tags.</synopsis>
					<description><para>
						This option only applies if <replaceable>media_encryption</replaceable> is
						set to <literal>sdes</literal> or <literal>dtls</literal>.
					</para></description>
				</configOption>
				<configOption name="set_var">
					<since>
						<version>12.2.0</version>
					</since>
					<synopsis>Variable set on a channel involving the endpoint.</synopsis>
					<description><para>
						When a new channel is created using the endpoint set the specified
						variable(s) on that channel. For multiple channel variables specify
						multiple 'set_var'(s).
					</para></description>
				</configOption>
				<configOption name="message_context">
					<since>
						<version>13.5.0</version>
					</since>
					<synopsis>Context to route incoming MESSAGE requests to.</synopsis>
					<description><para>
						If specified, incoming MESSAGE requests will be routed to the indicated
						dialplan context. If no <replaceable>message_context</replaceable> is
						specified, then the <replaceable>context</replaceable> setting is used.
					</para></description>
				</configOption>
				<configOption name="accountcode">
					<since>
						<version>13.5.0</version>
					</since>
					<synopsis>An accountcode to set automatically on any channels created for this endpoint.</synopsis>
					<description><para>
						If specified, any channel created for this endpoint will automatically
						have this accountcode set on it.
					</para></description>
				</configOption>
				<configOption name="preferred_codec_only" default="no">
					<since>
						<version>15.0.0</version>
					</since>
					<synopsis>Respond to a SIP invite with the single most preferred codec (DEPRECATED)</synopsis>
					<description><para>Respond to a SIP invite with the single most preferred codec
					rather than advertising all joint codec capabilities. This limits the other side's codec
					choice to exactly what we prefer.</para>
					<warning><para>This option has been deprecated in favor of
					<literal>incoming_call_offer_pref</literal>.  Setting both options is unsupported.</para>
					</warning>
					</description>
					<see-also>
						<ref type="configOption">incoming_call_offer_pref</ref>
					</see-also>
				</configOption>
				<configOption name="incoming_call_offer_pref" default="local">
					<since>
						<version>18.0.0</version>
					</since>
					<synopsis>Preferences for selecting codecs for an incoming call.</synopsis>
					<description>
						<para>Based on this setting, a joint list of preferred codecs between those
						received in an incoming SDP offer (remote), and those specified in the
						endpoint's "allow" parameter (local) es created and is passed to the Asterisk
						core. </para>
						<note><para>This list will consist of only those codecs found in both lists.</para></note>
						<enumlist>
							<enum name="local"><para>
								Include all codecs in the local list that are also in the remote list
								preserving the local order.  (default).
							</para></enum>
							<enum name="local_first"><para>
								Include only the first codec in the local list that is also in the remote list.
							</para></enum>
							<enum name="remote"><para>
								Include all codecs in the remote list that are also in the local list
								preserving the remote order.
							</para></enum>
							<enum name="remote_first"><para>
								Include only the first codec in the remote list that is also in the local list.
							</para></enum>
						</enumlist>
					</description>
				</configOption>
				<configOption name="outgoing_call_offer_pref" default="remote_merge">
					<since>
						<version>18.0.0</version>
					</since>
					<synopsis>Preferences for selecting codecs for an outgoing call.</synopsis>
					<description>
						<para>Based on this setting, a joint list of preferred codecs between
						those received from the Asterisk core (remote), and those specified in
						the endpoint's "allow" parameter (local) is created and is used to create
						the outgoing SDP offer.</para>
						<enumlist>
							<enum name="local"><para>
								Include all codecs in the local list that are also in the remote list
								preserving the local order.
							</para></enum>
							<enum name="local_merge"><para>
								Include all codecs in the local list preserving the local order.
							</para></enum>
							<enum name="local_first"><para>
								Include only the first codec in the local list.
							</para></enum>
							<enum name="remote"><para>
								Include all codecs in the remote list that are also in the local list
								preserving the remote order.
							</para></enum>
							<enum name="remote_merge"><para>
                                                                Include all codecs in the local list preserving the remote order. (default)
							</para></enum>
							<enum name="remote_first"><para>
								Include only the first codec in the remote list that is also in the local list.
							</para></enum>
						</enumlist>
					</description>
				</configOption>
				<configOption name="rtp_keepalive">
					<since>
						<version>13.5.0</version>
					</since>
					<synopsis>Number of seconds between RTP comfort noise keepalive packets.</synopsis>
					<description><para>
						At the specified interval, Asterisk will send an RTP comfort noise frame. This may
						be useful for situations where Asterisk is behind a NAT or firewall and must keep
						a hole open in order to allow for media to arrive at Asterisk.
					</para></description>
				</configOption>
				<configOption name="rtp_timeout" default="0">
					<since>
						<version>13.5.0</version>
					</since>
					<synopsis>Maximum number of seconds without receiving RTP (while off hold) before terminating call.</synopsis>
					<description><para>
						This option configures the number of seconds without RTP (while off hold) before
						considering a channel as dead. When the number of seconds is reached the underlying
						channel is hung up. By default this option is set to 0, which means do not check.
					</para></description>
				</configOption>
				<configOption name="rtp_timeout_hold" default="0">
					<since>
						<version>13.5.0</version>
					</since>
					<synopsis>Maximum number of seconds without receiving RTP (while on hold) before terminating call.</synopsis>
					<description><para>
						This option configures the number of seconds without RTP (while on hold) before
						considering a channel as dead. When the number of seconds is reached the underlying
						channel is hung up. By default this option is set to 0, which means do not check.
					</para></description>
				</configOption>
				<configOption name="rtp_port_start" default="0">
					<since>
						<version>20.20.0</version>
						<version>22.10.0</version>
						<version>23.4.0</version>
					</since>
					<synopsis>Per-endpoint starting RTP port number.</synopsis>
					<description><para>
						Defines the starting port number for a dedicated per-endpoint RTP port
						range, overriding the global rtp.conf setting. Must be used together
						with <literal>rtp_port_end</literal>. When set to 0, the global
						rtp.conf range is used. The value must be between 1024 and 65535.
					</para></description>
				</configOption>
				<configOption name="rtp_port_end" default="0">
					<since>
						<version>20.20.0</version>
						<version>22.10.0</version>
						<version>23.4.0</version>
					</since>
					<synopsis>Per-endpoint ending RTP port number.</synopsis>
					<description><para>
						Defines the ending port number for a dedicated per-endpoint RTP port
						range, overriding the global rtp.conf setting. Must be used together
						with <literal>rtp_port_start</literal>. When set to 0, the global
						rtp.conf range is used. The value must be greater than
						<literal>rtp_port_start</literal> and between 1024 and 65535.
					</para></description>
				</configOption>
				<configOption name="acl">
					<since>
						<version>13.10.0</version>
					</since>
					<synopsis>List of IP ACL section names in acl.conf</synopsis>
					<description><para>
						This matches sections configured in <literal>acl.conf</literal>. The value is
						defined as a list of comma-delimited section names.
					</para></description>
				</configOption>
				<configOption name="deny">
					<since>
						<version>13.10.0</version>
					</since>
					<synopsis>List of IP addresses to deny access from</synopsis>
					<description><para>
						The value is a comma-delimited list of IP addresses. IP addresses may
						have a subnet mask appended. The subnet mask may be written in either
						CIDR or dotted-decimal notation. Separate the IP address and subnet
						mask with a slash ('/')
					</para></description>
				</configOption>
				<configOption name="permit">
					<since>
						<version>13.10.0</version>
					</since>
					<synopsis>List of IP addresses to permit access from</synopsis>
					<description><para>
						The value is a comma-delimited list of IP addresses. IP addresses may
						have a subnet mask appended. The subnet mask may be written in either
						CIDR or dotted-decimal notation. Separate the IP address and subnet
						mask with a slash ('/')
					</para></description>
				</configOption>
				<configOption name="contact_acl">
					<since>
						<version>13.10.0</version>
					</since>
					<synopsis>List of Contact ACL section names in acl.conf</synopsis>
					<description><para>
						This matches sections configured in <literal>acl.conf</literal>. The value is
						defined as a list of comma-delimited section names.
					</para></description>
				</configOption>
				<configOption name="contact_deny">
					<since>
						<version>13.10.0</version>
					</since>
					<synopsis>List of Contact header addresses to deny</synopsis>
					<description><para>
						The value is a comma-delimited list of IP addresses. IP addresses may
						have a subnet mask appended. The subnet mask may be written in either
						CIDR or dotted-decimal notation. Separate the IP address and subnet
						mask with a slash ('/')
					</para></description>
				</configOption>
				<configOption name="contact_permit">
					<since>
						<version>13.10.0</version>
					</since>
					<synopsis>List of Contact header addresses to permit</synopsis>
					<description><para>
						The value is a comma-delimited list of IP addresses. IP addresses may
						have a subnet mask appended. The subnet mask may be written in either
						CIDR or dotted-decimal notation. Separate the IP address and subnet
						mask with a slash ('/')
					</para></description>
				</configOption>
				<configOption name="subscribe_context">
					<since>
						<version>13.11.0</version>
					</since>
					<synopsis>Context for incoming MESSAGE requests.</synopsis>
					<description><para>
						If specified, incoming SUBSCRIBE requests will be searched for the matching
						extension in the indicated context.
						If no <replaceable>subscribe_context</replaceable> is specified,
						then the <replaceable>context</replaceable> setting is used.
					</para></description>
				</configOption>
				<configOption name="contact_user" default="">
					<since>
						<version>13.12.0</version>
						<version>14.1.0</version>
					</since>
					<synopsis>Force the user on the outgoing Contact header to this value.</synopsis>
					<description><para>
						On outbound requests, force the user portion of the Contact header to this value.
					</para></description>
				</configOption>
				<configOption name="asymmetric_rtp_codec" default="no">
					<since>
						<version>13.13.0</version>
						<version>14.2.0</version>
					</since>
					<synopsis>Allow the sending and receiving RTP codec to differ</synopsis>
					<description><para>
						When set to "yes" the codec in use for sending will be allowed to differ from
						that of the received one. PJSIP will not automatically switch the sending one
						to the receiving one.
					</para></description>
				</configOption>
				<configOption name="rtcp_mux" default="no">
					<since>
						<version>13.15.0</version>
						<version>14.4.0</version>
					</since>
					<synopsis>Enable RFC 5761 RTCP multiplexing on the RTP port</synopsis>
					<description><para>
						With this option enabled, Asterisk will attempt to negotiate the use of the "rtcp-mux"
						attribute on all media streams. This will result in RTP and RTCP being sent and received
						on the same port. This shifts the demultiplexing logic to the application rather than
						the transport layer. This option is useful when interoperating with WebRTC endpoints
						since they mandate this option's use.
					</para></description>
				</configOption>
				<configOption name="refer_blind_progress" default="yes">
					<since>
						<version>13.17.0</version>
						<version>14.6.0</version>
					</since>
					<synopsis>Whether to notifies all the progress details on blind transfer</synopsis>
					<description><para>
						Some SIP phones (Mitel/Aastra, Snom) expect a sip/frag "200 OK"
						after REFER has been accepted. If set to <literal>no</literal> then asterisk
						will not send the progress details, but immediately will send "200 OK".
					</para></description>
				</configOption>
				<configOption name="notify_early_inuse_ringing" default="no">
					<since>
						<version>13.17.0</version>
						<version>14.6.0</version>
					</since>
					<synopsis>Whether to notifies dialog-info 'early' on InUse&amp;Ringing state</synopsis>
					<description><para>
						Control whether dialog-info subscriptions get 'early' state
						on Ringing when already INUSE.
					</para></description>
				</configOption>
				<configOption name="max_audio_streams" default="1">
					<since>
						<version>15.0.0</version>
					</since>
					<synopsis>The maximum number of allowed audio streams for the endpoint</synopsis>
					<description><para>
						This option enforces a limit on the maximum simultaneous negotiated audio
						streams allowed for the endpoint.
					</para></description>
				</configOption>
				<configOption name="max_video_streams" default="1">
					<since>
						<version>15.0.0</version>
					</since>
					<synopsis>The maximum number of allowed video streams for the endpoint</synopsis>
					<description><para>
						This option enforces a limit on the maximum simultaneous negotiated video
						streams allowed for the endpoint.
					</para></description>
				</configOption>
				<configOption name="bundle" default="no">
					<since>
						<version>15.0.0</version>
					</since>
					<synopsis>Enable RTP bundling</synopsis>
					<description><para>
						With this option enabled, Asterisk will attempt to negotiate the use of bundle.
						If negotiated this will result in multiple RTP streams being carried over the same
						underlying transport. Note that enabling bundle will also enable the rtcp_mux option.
					</para></description>
				</configOption>
				<configOption name="webrtc" default="no">
					<since>
						<version>15.0.0</version>
					</since>
					<synopsis>Defaults and enables some options that are relevant to WebRTC</synopsis>
					<description><para>
						When set to "yes" this also enables the following values that are needed in
						order for basic WebRTC support to work: rtcp_mux, use_avpf, ice_support, and
						use_received_transport. The following configuration settings also get defaulted
						as follows:</para>
						<para>media_encryption=dtls</para>
						<para>dtls_auto_generate_cert=yes (if dtls_cert_file is not set)</para>
						<para>dtls_verify=fingerprint</para>
						<para>dtls_setup=actpass</para>
					</description>
				</configOption>
				<configOption name="incoming_mwi_mailbox">
					<since>
						<version>13.18.0</version>
						<version>14.7.0</version>
						<version>15.1.0</version>
					</since>
					<synopsis>Mailbox name to use when incoming MWI NOTIFYs are received</synopsis>
					<description><para>
						If an MWI NOTIFY is received <emphasis>from</emphasis> this endpoint,
						this mailbox will be used when notifying other modules of MWI status
						changes.  If not set, incoming MWI NOTIFYs are ignored.
					</para></description>
				</configOption>
				<configOption name="follow_early_media_fork">
					<since>
						<version>13.22.0</version>
						<version>15.5.0</version>
					</since>
					<synopsis>Follow SDP forked media when To tag is different</synopsis>
					<description><para>
						On outgoing calls, if the UAS responds with different SDP attributes
						on subsequent 18X or 2XX responses (such as a port update) AND the
						To tag on the subsequent response is different than that on the previous
						one, follow it. This usually happens when the INVITE is forked to multiple
						UASs and more than one sends an SDP answer.
						</para>
						<note><para>
							This option must also be enabled in the <literal>system</literal>
							section for it to take effect here.
						</para></note>
					</description>
				</configOption>
				<configOption name="accept_multiple_sdp_answers" default="no">
					<since>
						<version>13.22.0</version>
						<version>15.5.0</version>
					</since>
					<synopsis>Accept multiple SDP answers on non-100rel responses</synopsis>
					<description><para>
						On outgoing calls, if the UAS responds with different SDP attributes
						on non-100rel 18X or 2XX responses (such as a port update) AND the
						To tag on the subsequent response is the same as that on the previous one,
						process the updated SDP.  This can happen when the UAS needs to change ports
						for some reason such as using a separate port for custom ringback.
						</para>
						<note><para>
							This option must also be enabled in the <literal>system</literal>
							section for it to take effect here.
						</para></note>
					</description>
				</configOption>
				<configOption name="suppress_q850_reason_headers" default="no">
					<since>
						<version>13.23.0</version>
						<version>15.6.0</version>
					</since>
					<synopsis>Suppress Q.850 Reason headers for this endpoint</synopsis>
					<description><para>
						Some devices can't accept multiple Reason headers and get confused
						when both 'SIP' and 'Q.850' Reason headers are received.  This
						option allows the 'Q.850' Reason header to be suppressed.</para>
					</description>
				</configOption>
				<configOption name="ignore_183_without_sdp" default="no">
					<since>
						<version>13.26.0</version>
						<version>16.3.0</version>
					</since>
					<synopsis>Do not forward 183 when it doesn't contain SDP</synopsis>
					<description><para>
						Certain SS7 internetworking scenarios can result in a 183
						to be generated for reasons other than early media.  Forwarding
						this 183 can cause loss of ringback tone.  This flag emulates
						the behavior of chan_sip and prevents these 183 responses from
						being forwarded.</para>
					</description>
				</configOption>
				<configOption name="stir_shaken" default="no">
					<since>
						<version>18.22.0</version>
						<version>20.7.0</version>
						<version>21.2.0</version>
					</since>
					<synopsis>Enable STIR/SHAKEN support on this endpoint</synopsis>
					<description><para>
						Enable STIR/SHAKEN support on this endpoint. On incoming INVITEs,
						the Identity header will be checked for validity. On outgoing
						INVITEs, an Identity header will be added.</para>
					</description>
				</configOption>
				<configOption name="stir_shaken_profile" default="">
					<since>
						<version>16.26.0</version>
						<version>18.12.0</version>
						<version>19.4.0</version>
					</since>
					<synopsis>STIR/SHAKEN profile containing additional configuration options</synopsis>
					<description><para>
						A STIR/SHAKEN profile that is defined in stir_shaken.conf. Contains
						several options and rules used for STIR/SHAKEN.</para>
					</description>
				</configOption>
				<configOption name="allow_unauthenticated_options" default="no">
					<since>
						<version>16.18.0</version>
						<version>18.4.0</version>
					</since>
					<synopsis>Skip authentication when receiving OPTIONS requests</synopsis>
					<description><para>
						RFC 3261 says that the response to an OPTIONS request MUST be the
						same had the request been an INVITE. Some UAs use OPTIONS requests
						like a 'ping' and the expectation is that they will return a
						200 OK.</para>
						<para>Enabling <literal>allow_unauthenticated_options</literal>
						will skip authentication of OPTIONS requests for the given
						endpoint.</para>
						<para>There are security implications to enabling this setting as
						it can allow information disclosure to occur - specifically, if
						enabled, an external party could enumerate and find the endpoint
						name by sending OPTIONS requests and examining the
						responses.</para>
					</description>
				</configOption>
				<configOption name="security_negotiation" default="no">
					<since>
						<version>21.0.0</version>
					</since>
					<synopsis>The kind of security agreement negotiation to use. Currently, only mediasec is supported.</synopsis>
					<description>
						<enumlist>
							<enum name="no" />
							<enum name="mediasec" />
						</enumlist>
					</description>
				</configOption>
				<configOption name="security_mechanisms">
					<since>
						<version>21.0.0</version>
					</since>
					<synopsis>List of security mechanisms supported.</synopsis>
					<description><para>
						This is a comma-delimited list of security mechanisms to use. Each security mechanism
						must be in the form defined by RFC 3329 section 2.2.
					</para></description>
				</configOption>
				<configOption name="geoloc_incoming_call_profile" default="">
					<since>
						<version>16.28.0</version>
						<version>18.14.0</version>
						<version>19.6.0</version>
					</since>
					<synopsis>Geolocation profile to apply to incoming calls</synopsis>
					<description><para>
						This geolocation profile will be applied to all calls received
						by the channel driver from the remote endpoint before they're
						forwarded to the dialplan.
						</para>
					</description>
				</configOption>
				<configOption name="geoloc_outgoing_call_profile" default="">
					<since>
						<version>16.28.0</version>
						<version>18.14.0</version>
						<version>19.6.0</version>
					</since>
					<synopsis>Geolocation profile to apply to outgoing calls</synopsis>
					<description><para>
						This geolocation profile will be applied to all calls received
						by the channel driver from the dialplan before they're forwarded
						the remote endpoint.
						</para>
					</description>
				</configOption>
				<configOption name="send_aoc" default="no">
					<since>
						<version>18.16.0</version>
						<version>20.1.0</version>
					</since>
					<synopsis>Send Advice-of-Charge messages</synopsis>
				</configOption>
				<configOption name="suppress_moh_on_sendonly" default="no">
					<since>
						<version>20.11.0</version>
						<version>21.6.0</version>
						<version>22.1.0</version>
					</since>
					<synopsis>Suppress playing MOH to party A if party B sends
					"sendonly" or "inactive" in an SDP</synopsis>
					<description><para>
					Normally, when one party in a call sends Asterisk an SDP with a "sendonly"
					or "inactive" attribute it means "hold" and causes Asterisk to start
					playing MOH back to the other party. This can be problematic if it happens at
					certain times, such as in a 183 Progress message, because the MOH will
					replace any early media you may be playing to the calling party. If you set
					this option to "yes" on an endpoint and the endpoint receives an SDP
					with "sendonly" or "inactive", Asterisk will NOT play MOH back to the other
					party.
					</para>
					<note><para>
					This doesn't just apply to 183 responses.  MOH will be suppressed when
					the attribute appears in any SDP received including INVITEs, re-INVITES,
					and other responses.
					</para>
					</note>
					</description>
				</configOption>
			</configObject>
			<configObject name="auth">
				<since>
					<version>12.0.0</version>
				</since>
				<!--
				Be sure to update the following documentation page when making changes to this object:
				https://docs.asterisk.org/Configuration/Channel-Drivers/SIP/Configuring-res_pjsip/PJSIP-Authentication
				 -->
				<synopsis>Authentication type</synopsis>
				<description><para>
					Authentication objects hold the authentication information for use
					by other objects such as <literal>endpoints</literal> or <literal>registrations</literal>.
					This also allows for multiple objects to use a single auth object. See
					the <literal>auth_type</literal> config option for security mechanism choices.
				</para>
				<note><para>
				See the link below for detailed discussion of this object especially concerning
				realms and digest hash algorithms.
				</para>
				<para>
				https://docs.asterisk.org/Configuration/Channel-Drivers/SIP/Configuring-res_pjsip/PJSIP-Authentication
				</para>
				</note>
				</description>
				<see-also>
					<ref type="link">https://docs.asterisk.org/Configuration/Channel-Drivers/SIP/Configuring-res_pjsip/PJSIP-Authentication</ref>
				</see-also>
				<configOption name="auth_type" default="digest">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Authentication type</synopsis>
					<description><para>
						If set to <literal>google_oauth</literal> then we'll read from the
						refresh_token/oauth_clientid/oauth_secret parameters.
						If set to <literal>digest</literal> then we'll read from the
						<literal>password</literal> and/or <literal>password_digest</literal>
						parameters.  The older <literal>md5</literal> and <literal>userpass</literal>
						values are deprecated and converted to <literal>digest</literal>.
						</para>
						<enumlist>
							<enum name="userpass"><para>Deprecated.  Use <literal>digest</literal>.</para></enum>
							<enum name="md5"><para>Deprecated.  Use <literal>digest</literal>.</para></enum>
							<enum name="google_oauth"><para>If selected, the <literal>refresh_token</literal>,
							<literal>oauth_clientid</literal> and <literal>oauth_secret</literal>
							parameters must be provided.</para></enum>
							<enum name="digest"><para>If selected, the <literal>password</literal>
							and/or one or more <literal>password_digest</literal>
							parameters must be provided.</para></enum>
						</enumlist>
						<para>
						</para>
					</description>
				</configOption>
				<configOption name="username">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Username to use for account</synopsis>
				</configOption>
				<configOption name="password">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Plain text password used for authentication.</synopsis>
					<description><para>Only used when auth_type is <literal>digest</literal>.</para></description>
				</configOption>
				<configOption name="password_digest" default="">
					<since>
						<version>20.12.0</version>
						<version>21.7.0</version>
						<version>22.2.0</version>
					</since>
					<synopsis>One or more pre-computed hashes used for authentication.</synopsis>
					<description><para>Only used when auth_type is <literal>digest</literal>.
						As an alternative to specifying a plain text password,
						you can specify one or more pre-computed digests separated by
						commas.
						</para>
						<para>
						<literal>password_digest= &lt;digest-spec&gt;[,&lt;digest_spec&gt;]...</literal>
						</para>
						<enumlist>
							<enum name="&lt;digest-spec&gt;"><para>&lt;hash-algorithm&gt;:&lt;hashed-credential&gt;</para></enum>
							<enum name="&lt;hash-algorithm&gt;"><para>One of the supported hash algorithms
								which currently are</para>
								<enumlist>
									<enum name="MD5"><para>Supported by all versions of OpenSSL and pjproject</para></enum>
									<enum name="SHA-256"><para>Supported by OpenSSL versions &gt;> 1.0.0 and pjproject versions &gt;= 2.15.1</para></enum>
									<enum name="SHA-512-256"><para>Supported by OpenSSL versions &gt;= 1.1.1 and pjproject versions &gt;= 2.15.1</para></enum>
								</enumlist>
								<para>You can see the current list by running the CLI command
								<literal>pjproject show buildopts</literal>.
							</para></enum>
							<enum name="&lt;hashed-credential&gt;">
								<para>The result of passing the following string through
								the selected hash algorithm:
								<literal>&lt;username&gt;:&lt;realm&gt;:&lt;password&gt;</literal>
								</para>
							</enum>
						</enumlist>
						<para>You can create the hash by piping the string into the appropriate
						hash/checksum program.  See the description for the <literal>realm</literal>
						parameter for info on how to set it.</para>
						<example>
						$ echo -n "myname:myrealm:mypassword" | openssl dgst -md5
						MD5(stdin)= dce9ccd0a69e3ef90d8b9bf725053e78
						</example>
						<para>You would then set:</para>
						<example>
						password_digest = md5:dce9ccd0a69e3ef90d8b9bf725053e78
						</example>
					</description>
				</configOption>
				<configOption name="md5_cred" default="">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>MD5 Hash used for authentication. (deprecated)</synopsis>
					<description><para>Use the <literal>password_digest</literal> parameter instead.
					If supplied, a <literal>password_digest</literal> parameter will be created
					for it.
					</para></description>
				</configOption>
				<configOption name="supported_algorithms_uac">
					<since>
						<version>20.12.0</version>
						<version>21.7.0</version>
						<version>22.2.0</version>
					</since>
					<synopsis>Comma separated list of algorithms to support when this auth is used as a UAC</synopsis>
					<description><para>Valid values:</para>
						<enumlist>
							<enum name="md5"><para>Supported by all versions of OpenSSL and pjproject</para></enum>
							<enum name="sha-256"><para>Supported by all versions of OpenSSL but only pjproject versions &gt; 2.14.1</para></enum>
							<enum name="sha-512-256"><para>Supported by OpenSSL versions &gt;= 1.1.1 and pjproject versions &gt; 2.14.1</para></enum>
						</enumlist>
						<para>
							The default may be specified by the
							<literal>default_auth_algorithms_uac</literal> parameter in
							the global object. If that's not specified, the default is "MD5".
						</para>
					</description>
				</configOption>
				<configOption name="supported_algorithms_uas">
					<since>
						<version>20.12.0</version>
						<version>21.7.0</version>
						<version>22.2.0</version>
					</since>
					<synopsis>Comma separated list of algorithms to support when this auth is used as a UAS</synopsis>
					<description><para>Valid values:</para>
						<enumlist>
							<enum name="md5"><para>Supported by all versions of OpenSSL and pjproject</para></enum>
							<enum name="sha-256"><para>Supported by all versions of OpenSSL but only pjproject versions &gt; 2.14.1</para></enum>
							<enum name="sha-512-256"><para>Supported by OpenSSL versions &gt;= 1.1.1 and pjproject versions &gt; 2.14.1</para></enum>
						</enumlist>
						<para>
							The default may be specified by the
							<literal>default_auth_algorithms_uas</literal> parameter in
							the global object. If that's not specified, the default is "MD5".
						</para>
					</description>
				</configOption>
				<configOption name="refresh_token">
					<since>
						<version>17.0.0</version>
					</since>
					<synopsis>OAuth 2.0 refresh token</synopsis>
				</configOption>
				<configOption name="oauth_clientid">
					<since>
						<version>17.0.0</version>
					</since>
					<synopsis>OAuth 2.0 application's client id</synopsis>
				</configOption>
				<configOption name="oauth_secret">
					<since>
						<version>17.0.0</version>
					</since>
					<synopsis>OAuth 2.0 application's secret</synopsis>
				</configOption>
				<configOption name="realm" default="">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>SIP realm for endpoint</synopsis>
					<description><para>
						For incoming authentication (asterisk is the UAS),
						this is the realm to be sent on WWW-Authenticate
						headers.  If not specified, the <replaceable>global</replaceable>
						object's <variable>default_realm</variable> will be used.
						</para>
						<para>
						</para>
						<para>
						For outgoing authentication (asterisk is the UAC), this
						must either be the realm the server is expected to send,
						or left blank or contain a single '*' to automatically
						use the realm sent by the server. If you have multiple
						auth objects for an endpoint, the realm is also used to
						match the auth object to the realm the server sent.
						</para>
						<para>
						</para>
						<note>
						<para>
						Using the same auth section for inbound and outbound
						authentication is not recommended.  There is a difference in
						meaning for an empty realm setting between inbound and outbound
						authentication uses.
						</para>
						</note>
						<para>
						</para>
						<note>
							<para>
								If more than one auth object with the same realm or
								more than one wildcard auth object is associated to
								an endpoint, only the first one of each defined on
								the endpoint will be used.
							</para>
						</note>
					</description>
				</configOption>
				<configOption name="nonce_lifetime" default="32">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Lifetime of a nonce associated with this authentication config.</synopsis>
				</configOption>
				<configOption name="type">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Must be 'auth'</synopsis>
				</configOption>
			</configObject>
			<configObject name="domain_alias">
				<since>
					<version>13.20.0</version>
					<version>15.3.0</version>
				</since>
				<synopsis>Domain Alias</synopsis>
				<description><para>
					Signifies that a domain is an alias. If the domain on a session is
					not found to match an AoR then this object is used to see if we have
					an alias for the AoR to which the endpoint is binding. This objects
					name as defined in configuration should be the domain alias and a
					config option is provided to specify the domain to be aliased.
				</para></description>
				<configOption name="type">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Must be of type 'domain_alias'.</synopsis>
				</configOption>
				<configOption name="domain">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Domain to be aliased</synopsis>
				</configOption>
			</configObject>
			<configObject name="transport">
				<since>
					<version>13.8.0</version>
				</since>
				<synopsis>SIP Transport</synopsis>
				<description><para>
					<emphasis>Transports</emphasis>
					</para>
					<para>There are different transports and protocol derivatives
						supported by <literal>res_pjsip</literal>. They are in order of
						preference: UDP, TCP, and WebSocket (WS).</para>
					<note><para>Changes to transport configuration in pjsip.conf will only be
						effected on a complete restart of Asterisk. A module reload
						will not suffice.</para></note>
				</description>
				<configOption name="async_operations" default="1">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Number of simultaneous Asynchronous Operations, can no longer be set, always set to 1</synopsis>
				</configOption>
				<configOption name="bind">
					<since>
						<version>12.2.0</version>
					</since>
					<synopsis>IP Address and optional port to bind to for this transport</synopsis>
				</configOption>
				<configOption name="ca_list_file">
					<since>
						<version>13.8.0</version>
					</since>
					<synopsis>File containing a list of certificates to read (TLS ONLY, not WSS)</synopsis>
				</configOption>
				<configOption name="ca_list_path">
					<since>
						<version>13.8.0</version>
					</since>
					<synopsis>Path to directory containing a list of certificates to read (TLS ONLY, not WSS)</synopsis>
				</configOption>
				<configOption name="cert_file">
					<since>
						<version>13.8.0</version>
					</since>
					<synopsis>Certificate file for endpoint (TLS ONLY, not WSS)</synopsis>
					<description><para>
						A path to a .crt or .pem file can be provided.  However, only
						the certificate is read from the file, not the private key.
						The <literal>priv_key_file</literal> option must supply a
						matching key file. The certificate file can be reloaded if
						the filename in configuration remains unchanged.
					</para></description>
				</configOption>
				<configOption name="cipher">
					<since>
						<version>12.2.0</version>
					</since>
					<synopsis>Preferred cryptography cipher names (TLS ONLY, not WSS)</synopsis>
					<description>
					<para>Comma separated list of cipher names or numeric equivalents.
						Numeric equivalents can be either decimal or hexadecimal (0xX).
					</para>
					<para>There are many cipher names.  Use the CLI command
						<literal>pjsip list ciphers</literal> to see a list of cipher
						names available for your installation.  See link for more:</para>
					<para>http://www.openssl.org/docs/apps/ciphers.html#CIPHER_SUITE_NAMES
					</para>
					</description>
				</configOption>
				<configOption name="domain">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Domain the transport comes from</synopsis>
				</configOption>
				<configOption name="external_media_address">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>External IP address to use in RTP handling</synopsis>
					<description><para>
						When a request or response is sent out, if the destination of the
						message is outside the IP network defined in the option <literal>localnet</literal>,
						and the media address in the SDP is within the localnet network, then the
						media address in the SDP will be rewritten to the value defined for
						<literal>external_media_address</literal>.
					</para></description>
				</configOption>
				<configOption name="external_signaling_address">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>External address for SIP signalling</synopsis>
				</configOption>
				<configOption name="external_signaling_port" default="0">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>External port for SIP signalling</synopsis>
				</configOption>
				<configOption name="method">
					<since>
						<version>12.2.0</version>
					</since>
					<synopsis>Method of SSL transport (TLS ONLY, not WSS)</synopsis>
					<description>
						<para>The availability of each of these options is dependent on the
						version and configuration of the underlying PJSIP library.</para>
						<enumlist>
							<enum name="default">
								<para>The default as defined by PJSIP. This is currently TLSv1, but may change with future releases.</para>
							</enum>
							<enum name="unspecified">
								<para>This option is equivalent to setting 'default'</para>
							</enum>
							<enum name="tlsv1" />
							<enum name="tlsv1_1" />
							<enum name="tlsv1_2" />
							<enum name="tlsv1_3" />
							<enum name="sslv2" />
							<enum name="sslv3" />
							<enum name="sslv23" />
						</enumlist>
					</description>
				</configOption>
				<configOption name="local_net">
					<since>
						<version>12.2.0</version>
					</since>
					<synopsis>Network to consider local (used for NAT purposes).</synopsis>
					<description><para>This must be in CIDR or dotted decimal format with the IP
					and mask separated with a slash ('/').</para></description>
				</configOption>
				<configOption name="password">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Password required for transport</synopsis>
				</configOption>
				<configOption name="priv_key_file">
					<since>
						<version>13.8.0</version>
					</since>
					<synopsis>Private key file (TLS ONLY, not WSS)</synopsis>
					<description><para>
						A path to a key file can be provided. The private key file
						can be reloaded if the filename in configuration remains
						unchanged.
					</para></description>
				</configOption>
				<configOption name="protocol" default="udp">
					<since>
						<version>12.2.0</version>
					</since>
					<synopsis>Protocol to use for SIP traffic</synopsis>
					<description>
						<enumlist>
							<enum name="udp" />
							<enum name="tcp" />
							<enum name="tls" />
							<enum name="ws" />
							<enum name="wss" />
							<enum name="flow" />
						</enumlist>
					</description>
				</configOption>
				<configOption name="require_client_cert" default="false">
					<since>
						<version>12.2.0</version>
					</since>
					<synopsis>Require client certificate (TLS ONLY, not WSS)</synopsis>
				</configOption>
				<configOption name="tcp_keepalive_enable" default="no">
					<since>
						<version>18.23.0</version>
						<version>20.8.0</version>
						<version>21.3.0</version>
					</since>
					<synopsis>Enable TCP keepalive</synopsis>
					<description><para>
						When set to 'yes', TCP keepalive messages are sent to verify that the endpoint is still reachable. This can help detect dead TCP connections in environments where connections may be silently dropped (e.g., NAT timeouts).
					</para></description>
				</configOption>
				<configOption name="tcp_keepalive_idle_time" default="30">
					<since>
						<version>18.23.0</version>
						<version>20.8.0</version>
						<version>21.3.0</version>
					</since>
					<synopsis>Idle time before the first TCP keepalive probe is sent</synopsis>
					<description><para>
						Specifies the amount of time in seconds that the connection must be idle before the first TCP keepalive probe is sent. An idle connection is defined as a connection in which no data has been sent or received by the application.
					</para></description>
				</configOption>
				<configOption name="tcp_keepalive_interval_time" default="10">
					<since>
						<version>18.23.0</version>
						<version>20.8.0</version>
						<version>21.3.0</version>
					</since>
					<synopsis>Interval between TCP keepalive probes</synopsis>
					<description><para>
						Specifies the interval in seconds between individual TCP keepalive probes, once the first probe is sent. This interval is used for subsequent probes if the peer does not respond to the previous probe.
					</para></description>
				</configOption>
				<configOption name="tcp_keepalive_probe_count" default="5">
					<since>
						<version>18.23.0</version>
						<version>20.8.0</version>
						<version>21.3.0</version>
					</since>
					<synopsis>Maximum number of TCP keepalive probes</synopsis>
					<description><para>
						Specifies the maximum number of TCP keepalive probes to send before considering the connection dead and notifying the application. If the peer does not respond after this many probes, the connection is considered broken.
					</para></description>
				</configOption>
				<configOption name="type">
					<since>
						<version>13.8.0</version>
					</since>
					<synopsis>Must be of type 'transport'.</synopsis>
				</configOption>
				<configOption name="verify_client" default="false">
					<since>
						<version>12.2.0</version>
					</since>
					<synopsis>Require verification of client certificate (TLS ONLY, not WSS)</synopsis>
				</configOption>
				<configOption name="verify_server" default="false">
					<since>
						<version>12.2.0</version>
					</since>
					<synopsis>Require verification of server certificate (TLS ONLY, not WSS)</synopsis>
				</configOption>
				<configOption name="tos" default="false">
					<since>
						<version>12.2.0</version>
					</since>
					<synopsis>Enable TOS for the signalling sent over this transport</synopsis>
					<description>
					<para>See <literal>https://docs.asterisk.org/Configuration/Channel-Drivers/IP-Quality-of-Service</literal>
					for more information on this parameter.</para>
					<note><para>This option does not apply to the <replaceable>ws</replaceable>
					or the <replaceable>wss</replaceable> protocols.</para></note>
					</description>
				</configOption>
				<configOption name="cos" default="false">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Enable COS for the signalling sent over this transport</synopsis>
					<description>
					<para>See <literal>https://docs.asterisk.org/Configuration/Channel-Drivers/IP-Quality-of-Service</literal>
					for more information on this parameter.</para>
					<note><para>This option does not apply to the <replaceable>ws</replaceable>
					or the <replaceable>wss</replaceable> protocols.</para></note>
					</description>
				</configOption>
				<configOption name="websocket_write_timeout" default="100">
					<since>
						<version>11.11.0</version>
						<version>12.4.0</version>
					</since>
					<synopsis>The timeout (in milliseconds) to set on WebSocket connections.</synopsis>
					<description>
						<para>If a websocket connection accepts input slowly, the timeout
						for writes to it can be increased to keep it from being disconnected.
						Value is in milliseconds.</para>
					</description>
				</configOption>
				<configOption name="allow_reload" default="no">
					<since>
						<version>13.8.0</version>
					</since>
					<synopsis>Allow this transport to be reloaded.</synopsis>
					<description>
						<para>Allow this transport to be reloaded when res_pjsip is reloaded.
						This option defaults to "no" because reloading a transport may disrupt
						in-progress calls.</para>
					</description>
				</configOption>
				<configOption name="allow_wildcard_certs" default="false">
					<since>
						<version>16.28.0</version>
						<version>18.14.0</version>
						<version>19.6.0</version>
					</since>
					<synopsis>Allow use of wildcards in certificates (TLS ONLY)</synopsis>
					<description>
					  <para>In combination with verify_server, when enabled allow use of wildcards,
					  i.e. '*.' in certs for common,and subject alt names of type DNS for TLS
					  transport types. Names must start with the wildcard. Partial wildcards, e.g.
					  'f*.example.com' and 'foo.*.com' are not allowed. As well, names only match
					  against a single level meaning '*.example.com' matches 'foo.example.com',
					  but not 'foo.bar.example.com'.
					  </para>
					</description>
				</configOption>
				<configOption name="symmetric_transport" default="no">
					<since>
						<version>13.15.0</version>
						<version>14.4.0</version>
					</since>
					<synopsis>Use the same transport for outgoing requests as incoming ones.</synopsis>
					<description>
						<para>When a request from a dynamic contact
							comes in on a transport with this option set to 'yes',
							the transport name will be saved and used for subsequent
							outgoing requests like OPTIONS, NOTIFY and INVITE.  It's
							saved as a contact uri parameter named 'x-ast-txp' and will
							display with the contact uri in CLI, AMI, and ARI output.
							On the outgoing request, if a transport wasn't explicitly
							set on the endpoint AND the request URI is not a hostname,
							the saved transport will be used and the 'x-ast-txp'
							parameter stripped from the outgoing packet.
						</para>
					</description>
				</configOption>
			</configObject>
			<configObject name="contact">
				<synopsis>A way of creating an aliased name to a SIP URI</synopsis>
				<description><para>
					Contacts are a way to hide SIP URIs from the dialplan directly.
					They are also used to make a group of contactable parties when
					in use with <literal>AoR</literal> lists.
				</para></description>
				<configOption name="type">
					<synopsis>Must be of type 'contact'.</synopsis>
				</configOption>
				<configOption name="uri">
					<synopsis>SIP URI to contact peer</synopsis>
				</configOption>
				<configOption name="expiration_time">
					<synopsis>Time to keep alive a contact</synopsis>
					<description><para>
						Time to keep alive a contact. String style specification.
					</para></description>
				</configOption>
				<configOption name="qualify_frequency" default="0">
					<synopsis>Interval at which to qualify a contact</synopsis>
					<description><para>
						Interval between attempts to qualify the contact for reachability.
						If <literal>0</literal> never qualify. Time in seconds.
					</para></description>
				</configOption>
				<configOption name="qualify_timeout" default="3.0">
					<synopsis>Timeout for qualify</synopsis>
					<description><para>
						If the contact doesn't respond to the OPTIONS request before the timeout,
						the contact is marked unavailable. This includes time spent performing
						any required DNS lookup(s) prior to sending the OPTIONS.
						If <literal>0</literal> no timeout. Time in fractional seconds.
					</para></description>
				</configOption>
				<configOption name="qualify_2xx_only">
					<synopsis>Only qualify contact if OPTIONS request returns 2XX</synopsis>
					<description>
						<para>If true only mark a contact as available if the qualify OPTIONS
						request receives a 2XX response.
						</para>
					</description>
				</configOption>
				<configOption name="authenticate_qualify">
					<synopsis>Authenticates a qualify challenge response if needed</synopsis>
					<description>
						<para>If true and a qualify request receives a challenge response then
						authentication is attempted before declaring the contact available.
						</para>
						<note><para>This option does nothing as we will always complete
						the challenge response authentication if the qualify request is
						challenged.
						</para></note>
					</description>
				</configOption>
				<configOption name="outbound_proxy">
					<synopsis>Outbound proxy used when sending OPTIONS request</synopsis>
					<description><para>
						If set the provided URI will be used as the outbound proxy when an
						OPTIONS request is sent to a contact for qualify purposes.
					</para></description>
				</configOption>
				<configOption name="path">
					<synopsis>Stored Path vector for use in Route headers on outgoing requests.</synopsis>
				</configOption>
				<configOption name="user_agent">
					<synopsis>User-Agent header from registration.</synopsis>
					<description><para>
						The User-Agent is automatically stored based on data present in incoming SIP
						REGISTER requests and is not intended to be configured manually.
					</para></description>
				</configOption>
				<configOption name="endpoint">
					<synopsis>Endpoint name</synopsis>
					<description><para>
						The name of the endpoint this contact belongs to
					</para></description>
				</configOption>
				<configOption name="reg_server">
					<synopsis>Asterisk Server name</synopsis>
					<description><para>
						Asterisk Server name on which SIP endpoint registered.
					</para></description>
				</configOption>
				<configOption name="via_addr">
					<synopsis>IP-address of the last Via header from registration.</synopsis>
					<description><para>
						The last Via header should contain the address of UA which sent the request.
						The IP-address of the last Via header is automatically stored based on data present
						in incoming SIP REGISTER requests and is not intended to be configured manually.
					</para></description>
				</configOption>
				<configOption name="via_port">
					<synopsis>IP-port of the last Via header from registration.</synopsis>
					<description><para>
						The IP-port of the last Via header is automatically stored based on data present
						in incoming SIP REGISTER requests and is not intended to be configured manually.
					</para></description>
				</configOption>
				<configOption name="call_id">
					<synopsis>Call-ID header from registration.</synopsis>
					<description><para>
						The Call-ID header is automatically stored based on data present
						in incoming SIP REGISTER requests and is not intended to be configured manually.
					</para></description>
				</configOption>
				<configOption name="prune_on_boot">
					<synopsis>A contact that cannot survive a restart/boot.</synopsis>
					<description><para>
						The option is set if the incoming SIP REGISTER contact is rewritten
						on a reliable transport and is not intended to be configured manually.
					</para></description>
				</configOption>
			</configObject>
			<configObject name="aor">
				<since>
					<version>13.35.0</version>
					<version>16.12.0</version>
					<version>17.6.0</version>
				</since>
				<synopsis>The configuration for a location of an endpoint</synopsis>
				<description><para>
					An AoR is what allows Asterisk to contact an endpoint via res_pjsip. If no
					AoRs are specified, an endpoint will not be reachable by Asterisk.
					Beyond that, an AoR has other uses within Asterisk, such as inbound
					registration.
					</para><para>
					An <literal>AoR</literal> is a way to allow dialing a group
					of <literal>Contacts</literal> that all use the same
					<literal>endpoint</literal> for calls.
					</para><para>
					This can be used as another way of grouping a list of contacts to dial
					rather than specifying them each directly when dialing via the dialplan.
					This must be used in conjunction with the <literal>PJSIP_DIAL_CONTACTS</literal>.
					</para><para>
					Registrations: For Asterisk to match an inbound registration to an endpoint,
					the AoR object name must match the user portion of the SIP URI in the "To:"
					header of the inbound SIP registration. That will usually be equivalent
					to the "user name" set in your hard or soft phones configuration.
				</para></description>
				<configOption name="contact">
					<since>
						<version>12.2.0</version>
					</since>
					<synopsis>Permanent contacts assigned to AoR</synopsis>
					<description><para>
						Contacts specified will be called whenever referenced
						by <literal>chan_pjsip</literal>.
						</para><para>
						Use a separate "contact=" entry for each contact required. Contacts
						are specified using a SIP URI.
					</para></description>
				</configOption>
				<configOption name="default_expiration" default="3600">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Default expiration time in seconds for contacts that are dynamically bound to an AoR.</synopsis>
				</configOption>
				<configOption name="mailboxes">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Allow subscriptions for the specified mailbox(es)</synopsis>
					<description><para>This option applies when an external entity subscribes to an AoR
						for Message Waiting Indications. The mailboxes specified will be subscribed to.
						More than one mailbox can be specified with a comma-delimited string.
						app_voicemail mailboxes must be specified as mailbox@context;
						for example: mailboxes=6001@default. For mailboxes provided by external sources,
						such as through the res_mwi_external module, you must specify strings supported by
						the external system.
					</para><para>
						For endpoints that cannot SUBSCRIBE for MWI, you can set the <literal>mailboxes</literal> option in your
						endpoint configuration section to enable unsolicited MWI NOTIFYs to the endpoint.
					</para></description>
				</configOption>
				<configOption name="voicemail_extension">
					<since>
						<version>13.9.0</version>
					</since>
					<synopsis>The voicemail extension to send in the NOTIFY Message-Account header</synopsis>
				</configOption>
				<configOption name="maximum_expiration" default="7200">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Maximum time to keep an AoR</synopsis>
					<description><para>
						Maximum time to keep a peer with explicit expiration. Time in seconds.
					</para></description>
				</configOption>
				<configOption name="max_contacts" default="0">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Maximum number of contacts that can bind to an AoR</synopsis>
					<description><para>
						Maximum number of contacts that can associate with this AoR. This value does
						not affect the number of contacts that can be added with the "contact" option.
						It only limits contacts added through external interaction, such as
						registration.
						</para>
						<note><para>The <replaceable>rewrite_contact</replaceable> option
						registers the source address as the contact address to help with
						NAT and reusing connection oriented transports such as TCP and
						TLS.  Unfortunately, refreshing a registration may register a
						different contact address and exceed
						<replaceable>max_contacts</replaceable>.  The
						<replaceable>remove_existing</replaceable> and
						<replaceable>remove_unavailable</replaceable> options can help by
						removing either the soonest to expire or unavailable contact(s) over
						<replaceable>max_contacts</replaceable> which is likely the
						old <replaceable>rewrite_contact</replaceable> contact source
						address being refreshed.
						</para></note>
						<note><para>This should be set to <literal>1</literal> and
						<replaceable>remove_existing</replaceable> set to <literal>yes</literal> if you
						wish to stick with the older <literal>chan_sip</literal> behaviour.
						</para></note>
					</description>
				</configOption>
				<configOption name="minimum_expiration" default="60">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Minimum keep alive time for an AoR</synopsis>
					<description><para>
						Minimum time to keep a peer with an explicit expiration. Time in seconds.
					</para></description>
				</configOption>
				<configOption name="remove_existing" default="no">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Determines whether new contacts replace existing ones.</synopsis>
					<description><para>
						On receiving a new registration to the AoR should it remove enough
						existing contacts not added or updated by the registration to
						satisfy <replaceable>max_contacts</replaceable>?  Any removed
						contacts will expire the soonest.
						</para>
						<note><para>The <replaceable>rewrite_contact</replaceable> option
						registers the source address as the contact address to help with
						NAT and reusing connection oriented transports such as TCP and
						TLS.  Unfortunately, refreshing a registration may register a
						different contact address and exceed
						<replaceable>max_contacts</replaceable>.  The
						<replaceable>remove_existing</replaceable> option can help by
						removing the soonest to expire contact(s) over
						<replaceable>max_contacts</replaceable> which is likely the
						old <replaceable>rewrite_contact</replaceable> contact source
						address being refreshed.
						</para></note>
						<note><para>This should be set to <literal>yes</literal> and
						<replaceable>max_contacts</replaceable> set to <literal>1</literal> if you
						wish to stick with the older <literal>chan_sip</literal> behaviour.
						</para></note>
					</description>
				</configOption>
				<configOption name="remove_unavailable" default="no">
					<since>
						<version>16.22.0</version>
						<version>18.8.0</version>
					</since>
					<synopsis>Determines whether new contacts should replace unavailable ones.</synopsis>
					<description><para>
						The effect of this setting depends on the setting of
						<replaceable>remove_existing</replaceable>.</para>
						<para>If <replaceable>remove_existing</replaceable> is set to
						<literal>no</literal> (default), setting remove_unavailable to
						<literal>yes</literal> will remove only unavailable contacts that exceed
						<replaceable>max_contacts</replaceable>	to allow an incoming
						REGISTER to complete sucessfully.</para>
						<para>If <replaceable>remove_existing</replaceable> is set to
						<literal>yes</literal>, setting remove_unavailable to
						<literal>yes</literal> will prioritize unavailable contacts for removal
						instead of just removing the contact that expires the soonest.</para>
						<note><para>See <replaceable>remove_existing</replaceable> and
						<replaceable>max_contacts</replaceable> for further information about how
						these 3 settings interact.
						</para></note>
					</description>
				</configOption>
				<configOption name="type">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Must be of type 'aor'.</synopsis>
				</configOption>
				<configOption name="qualify_frequency" default="0">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Interval at which to qualify an AoR</synopsis>
					<description><para>
						Interval between attempts to qualify the AoR for reachability.
						If <literal>0</literal> never qualify. Time in seconds.
					</para></description>
				</configOption>
				<configOption name="qualify_timeout" default="3.0">
					<since>
						<version>13.4.0</version>
					</since>
					<synopsis>Timeout for qualify</synopsis>
					<description><para>
						If the contact doesn't respond to the OPTIONS request before the timeout,
						the contact is marked unavailable. This includes time spent performing
						any required DNS lookup(s) prior to sending the OPTIONS.
						If <literal>0</literal> no timeout. Time in fractional seconds.
					</para></description>
				</configOption>
				<configOption name="qualify_2xx_only">
                    <since>
                    	<version>20.12.0</version>
                    	<version>21.7.0</version>
                    	<version>22.2.0</version>
                    </since>
					<synopsis>Only qualify contact if OPTIONS request returns 2XX</synopsis>
					<description>
						<para>If true only mark a contact as available if the qualify OPTIONS
						request receives a 2XX response.
						</para>
					</description>
				</configOption>
				<configOption name="authenticate_qualify">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Authenticates a qualify challenge response if needed</synopsis>
					<description>
						<para>If true and a qualify request receives a challenge response then
						authentication is attempted before declaring the contact available.
						</para>
						<note><para>This option does nothing as we will always complete
						the challenge response authentication if the qualify request is
						challenged.
						</para></note>
					</description>
				</configOption>
				<configOption name="outbound_proxy">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Outbound proxy used when sending OPTIONS request</synopsis>
					<description><para>
						If set the provided URI will be used as the outbound proxy when an
						OPTIONS request is sent to a contact for qualify purposes.
					</para></description>
				</configOption>
				<configOption name="support_path">
					<since>
						<version>12.1.0</version>
					</since>
					<synopsis>Enables Path support for REGISTER requests and Route support for other requests.</synopsis>
					<description><para>
						When this option is enabled, the Path headers in register requests will be saved
						and its contents will be used in Route headers for outbound out-of-dialog requests
						and in Path headers for outbound 200 responses. Path support will also be indicated
						in the Supported header.
					</para></description>
				</configOption>
			</configObject>
			<configObject name="system">
				<since>
					<version>12.2.0</version>
				</since>
				<synopsis>Options that apply to the SIP stack as well as other system-wide settings</synopsis>
				<description><para>
					The settings in this section are global. In addition to being global, the values will
					not be re-evaluated when a reload is performed. This is because the values must be set
					before the SIP stack is initialized. The only way to reset these values is to either
					restart Asterisk, or unload res_pjsip.so and then load it again.
				</para></description>
				<configOption name="timer_t1" default="500">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Set transaction timer T1 value (milliseconds).</synopsis>
					<description><para>
						Timer T1 is the base for determining how long to wait before retransmitting
						requests that receive no response when using an unreliable transport (e.g. UDP).
						For more information on this timer, see RFC 3261, Section 17.1.1.1.
					</para></description>
				</configOption>
				<configOption name="timer_b" default="32000">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Set transaction timer B value (milliseconds).</synopsis>
					<description><para>
						Timer B determines the maximum amount of time to wait after sending an INVITE
						request before terminating the transaction. It is recommended that this be set
						to 64 * Timer T1, but it may be set higher if desired. For more information on
						this timer, see RFC 3261, Section 17.1.1.1.
					</para></description>
				</configOption>
				<configOption name="compact_headers" default="no">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Use the short forms of common SIP header names.</synopsis>
				</configOption>
				<configOption name="taskpool_minimum_size" default="4">
					<since>
						<version>23.2.0</version>
						<version>22.8.0</version>
						<version>20.18.0</version>
					</since>
					<synopsis>Minimum number of taskprocessors in the res_pjsip taskpool.</synopsis>
				</configOption>
				<configOption name="taskpool_initial_size" default="4">
					<since>
						<version>23.2.0</version>
						<version>22.8.0</version>
						<version>20.18.0</version>
					</since>
					<synopsis>Initial number of taskprocessors in the res_pjsip taskpool.</synopsis>
				</configOption>
				<configOption name="taskpool_auto_increment" default="1">
					<since>
						<version>23.2.0</version>
						<version>22.8.0</version>
						<version>20.18.0</version>
					</since>
					<synopsis>The amount by which the number of taskprocessors is incremented when necessary.</synopsis>
				</configOption>
				<configOption name="taskpool_idle_timeout" default="60">
					<since>
						<version>23.2.0</version>
						<version>22.8.0</version>
						<version>20.18.0</version>
					</since>
					<synopsis>Number of seconds before an idle taskprocessor should be disposed of.</synopsis>
				</configOption>
				<configOption name="taskpool_max_size" default="50">
					<since>
						<version>23.2.0</version>
						<version>22.8.0</version>
						<version>20.18.0</version>
					</since>
					<synopsis>Maximum number of taskprocessors in the res_pjsip taskpool.
					A value of 0 indicates no maximum.</synopsis>
				</configOption>
				<configOption name="threadpool_initial_size" default="4">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Initial number of threads in the res_pjsip taskpool.
						Deprecated in favor of taskpool_initial_size.</synopsis>
				</configOption>
				<configOption name="threadpool_auto_increment" default="1">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>The amount by which the number of threads is incremented when necessary.
						Deprecated in favor of taskpool_auto_increment.</synopsis>
				</configOption>
				<configOption name="threadpool_idle_timeout" default="60">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Number of seconds before an idle taskprocessor should be disposed of.
						Deprecated in favor of taskpool_idle_timeout.</synopsis>
				</configOption>
				<configOption name="threadpool_max_size" default="50">
					<since>
						<version>13.7.0</version>
					</since>
					<synopsis>Maximum number of taskprocessors in the res_pjsip taskpool.
					A value of 0 indicates no maximum.
					Deprecated in favor of taskpool_max_size.</synopsis>
				</configOption>
				<configOption name="disable_tcp_switch" default="yes">
					<since>
						<version>13.1.0</version>
					</since>
					<synopsis>Disable automatic switching from UDP to TCP transports.</synopsis>
					<description><para>
						Disable automatic switching from UDP to TCP transports if outgoing
						request is too large.  See RFC 3261 section 18.1.1.
					</para></description>
				</configOption>
				<configOption name="follow_early_media_fork">
					<since>
						<version>13.22.0</version>
						<version>15.5.0</version>
					</since>
					<synopsis>Follow SDP forked media when To tag is different</synopsis>
					<description><para>
						On outgoing calls, if the UAS responds with different SDP attributes
						on subsequent 18X or 2XX responses (such as a port update) AND the
						To tag on the subsequent response is different than that on the previous
						one, follow it.
						</para>
						<note><para>
							This option must also be enabled on endpoints that require
							this functionality.
						</para></note>
					</description>
				</configOption>
				<configOption name="accept_multiple_sdp_answers">
					<since>
						<version>13.22.0</version>
						<version>15.5.0</version>
					</since>
					<synopsis>Follow SDP forked media when To tag is the same</synopsis>
					<description><para>
						On outgoing calls, if the UAS responds with different SDP attributes
						on non-100rel 18X or 2XX responses (such as a port update) AND the
						To tag on the subsequent response is the same as that on the previous one,
						process the updated SDP.
						</para>
						<note><para>
							This option must also be enabled on endpoints that require
							this functionality.
						</para></note>
					</description>
				</configOption>
				<configOption name="disable_rport" default="no">
					<since>
						<version>13.35.0</version>
						<version>16.12.0</version>
						<version>17.6.0</version>
					</since>
					<synopsis>Disable the use of rport in outgoing requests.</synopsis>
					<description><para>
						Remove "rport" parameter from the outgoing requests.
					</para></description>
				</configOption>
				<configOption name="type">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Must be of type 'system' UNLESS the object name is 'system'.</synopsis>
				</configOption>
			</configObject>
			<configObject name="global">
				<since>
					<version>12.0.0</version>
				</since>
				<synopsis>Options that apply globally to all SIP communications</synopsis>
				<description><para>
					The settings in this section are global. Unlike options in the <literal>system</literal>
					section, these options can be refreshed by performing a reload.
				</para></description>
				<configOption name="max_forwards" default="70">
					<since>
						<version>13.3.0</version>
					</since>
					<synopsis>Value used in Max-Forwards header for SIP requests.</synopsis>
				</configOption>
				<configOption name="keep_alive_interval" default="90">
					<since>
						<version>13.3.0</version>
					</since>
					<synopsis>The interval (in seconds) to send keepalives to active connection-oriented transports.</synopsis>
				</configOption>
				<configOption name="contact_expiration_check_interval" default="30">
					<since>
						<version>13.9.0</version>
					</since>
					<synopsis>The interval (in seconds) to check for expired contacts.</synopsis>
				</configOption>
				<configOption name="disable_multi_domain" default="no">
					<since>
						<version>13.12.0</version>
						<version>14.1.0</version>
					</since>
					<synopsis>Disable Multi Domain support</synopsis>
					<description><para>
						If disabled it can improve realtime performance by reducing the number of database requests.
					</para></description>
				</configOption>
				<configOption name="max_initial_qualify_time" default="0">
					<since>
						<version>13.4.0</version>
					</since>
					<synopsis>The maximum amount of time from startup that qualifies should be attempted on all contacts.
					If greater than the qualify_frequency for an aor, qualify_frequency will be used instead.</synopsis>
				</configOption>
				<configOption name="unidentified_request_period" default="5">
					<since>
						<version>13.10.0</version>
					</since>
					<synopsis>The number of seconds over which to accumulate unidentified requests.</synopsis>
					<description><para>
					If <literal>unidentified_request_count</literal> unidentified requests are received
					during <literal>unidentified_request_period</literal>, a security event will be generated.
					</para></description>
				</configOption>
				<configOption name="unidentified_request_count" default="5">
					<since>
						<version>13.10.0</version>
					</since>
					<synopsis>The number of unidentified requests from a single IP to allow.</synopsis>
					<description><para>
					If <literal>unidentified_request_count</literal> unidentified requests are received
					during <literal>unidentified_request_period</literal>, a security event will be generated.
					</para></description>
				</configOption>
				<configOption name="unidentified_request_prune_interval" default="30">
					<since>
						<version>13.10.0</version>
					</since>
					<synopsis>The interval at which unidentified requests are older than
					twice the unidentified_request_period are pruned.</synopsis>
				</configOption>
				<configOption name="type">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Must be of type 'global' UNLESS the object name is 'global'.</synopsis>
				</configOption>
				<configOption name="user_agent" default="Asterisk &lt;Asterisk Version&gt;">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Value used in User-Agent header for SIP requests and Server header for SIP responses.</synopsis>
				</configOption>
				<configOption name="regcontext" default="">
					<since>
						<version>13.8.0</version>
					</since>
					<synopsis>When set, Asterisk will dynamically create and destroy a NoOp priority 1 extension for a given
						peer who registers or unregisters with us.</synopsis>
				</configOption>
				<configOption name="default_outbound_endpoint" default="default_outbound_endpoint">
					<since>
						<version>13.3.0</version>
					</since>
					<synopsis>Endpoint to use when sending an outbound request to a URI without a specified endpoint.</synopsis>
				</configOption>
				<configOption name="default_voicemail_extension">
					<since>
						<version>13.9.0</version>
					</since>
					<synopsis>The voicemail extension to send in the NOTIFY Message-Account header if not specified on endpoint or aor</synopsis>
				</configOption>
				<configOption name="debug" default="no">
					<since>
						<version>13.3.0</version>
					</since>
					<synopsis>Enable/Disable SIP debug logging.  Valid options include yes, no, or
						a host address</synopsis>
				</configOption>
				<configOption name="endpoint_identifier_order">
					<since>
						<version>13.3.0</version>
					</since>
					<synopsis>The order by which endpoint identifiers are processed and checked.
						Identifier names are usually derived from and can be found in the endpoint
						identifier module itself (res_pjsip_endpoint_identifier_*).
						You can use the CLI command "pjsip show identifiers" to see the
						identifiers currently available.</synopsis>
					<description>
						<note><para>
						One of the identifiers is "auth_username" which matches on the username in
						an Authentication header.  This method has some security considerations because an
						Authentication header is not present on the first message of a dialog when
						digest authentication is used.  The client can't generate it until the server
						sends the challenge in a 401 response.  Since Asterisk normally sends a security
						event when an incoming request can't be matched to an endpoint, using auth_username
						requires that the security event be deferred until a request is received with
						the Authentication header and only generated if the username doesn't result in a
						match.  This may result in a delay before an attack is recognized.  You can control
						how many unmatched requests are received from a single ip address before a security
						event is generated using the unidentified_request parameters.
						</para></note>
					</description>
				</configOption>
				<configOption name="default_from_user" default="asterisk">
					<since>
						<version>13.6.0</version>
					</since>
					<synopsis>When Asterisk generates an outgoing SIP request, the From header username will be
						set to this value if there is no better option (such as CallerID) to be
						used.</synopsis>
				</configOption>
				<configOption name="default_realm" default="asterisk">
					<since>
						<version>13.10.0</version>
					</since>
					<synopsis>When Asterisk generates a challenge, the digest realm will be
						set to this value if there is no better option (such as auth/realm) to be
						used.</synopsis>
				</configOption>
				<configOption name="mwi_tps_queue_high" default="500">
					<since>
						<version>13.12.0</version>
						<version>14.1.0</version>
					</since>
					<synopsis>MWI taskprocessor high water alert trigger level.</synopsis>
					<description>
						<para>On a heavily loaded system you may need to adjust the
						taskprocessor queue limits.  If any taskprocessor queue size
						reaches its high water level then pjsip will stop processing
						new requests until the alert is cleared.  The alert clears
						when all alerting taskprocessor queues have dropped to their
						low water clear level.
						</para>
					</description>
				</configOption>
				<configOption name="mwi_tps_queue_low" default="-1">
					<since>
						<version>13.12.0</version>
						<version>14.1.0</version>
					</since>
					<synopsis>MWI taskprocessor low water clear alert level.</synopsis>
					<description>
						<para>On a heavily loaded system you may need to adjust the
						taskprocessor queue limits.  If any taskprocessor queue size
						reaches its high water level then pjsip will stop processing
						new requests until the alert is cleared.  The alert clears
						when all alerting taskprocessor queues have dropped to their
						low water clear level.
						</para>
						<note><para>Set to -1 for the low water level to be 90% of
						the high water level.</para></note>
					</description>
				</configOption>
				<configOption name="mwi_disable_initial_unsolicited" default="no">
					<since>
						<version>13.12.0</version>
						<version>14.1.0</version>
					</since>
					<synopsis>Enable/Disable sending unsolicited MWI to all endpoints on startup.</synopsis>
					<description>
						<para>When the initial unsolicited MWI notification are
						enabled on startup then the initial notifications
						get sent at startup.  If you have a lot of endpoints
						(thousands) that use unsolicited MWI then you may
						want to consider disabling the initial startup
						notifications.
						</para>
						<para>When the initial unsolicited MWI notifications are
						disabled on startup then the notifications will start
						on the endpoint's next contact update.
						</para>
					</description>
				</configOption>
				<configOption name="ignore_uri_user_options">
					<since>
						<version>13.12.0</version>
						<version>14.1.0</version>
					</since>
					<synopsis>Enable/Disable ignoring SIP URI user field options.</synopsis>
					<description>
						<para>If you have this option enabled and there are semicolons
						in the user field of a SIP URI then the field is truncated
						at the first semicolon.  This effectively makes the semicolon
						a non-usable character for PJSIP endpoint names, extensions,
						and AORs.  This can be useful for improving compatibility with
						an ITSP that likes to use user options for whatever reason.
						</para>
						<example title="Sample SIP URI">
							sip:1235557890;phone-context=national@x.x.x.x;user=phone
						</example>
						<example title="Sample SIP URI user field">
							1235557890;phone-context=national
						</example>
						<example title="Sample SIP URI user field truncated">
							1235557890
						</example>
						<note><para>The caller-id and redirecting number strings
						obtained from incoming SIP URI user fields are always truncated
						at the first semicolon.</para></note>
					</description>
				</configOption>
				<configOption name="use_callerid_contact" default="no">
					<since>
						<version>13.24.0</version>
						<version>16.1.0</version>
					</since>
					<synopsis>Place caller-id information into Contact header</synopsis>
					<description><para>
						This option will cause Asterisk to place caller-id information into
						generated Contact headers.</para>
					</description>
				</configOption>
				<configOption name="send_contact_status_on_update_registration" default="no">
					<since>
						<version>16.2.0</version>
					</since>
					<synopsis>Enable sending AMI ContactStatus event when a device refreshes its registration.</synopsis>
				</configOption>
				<configOption name="taskprocessor_overload_trigger">
					<since>
						<version>13.26.0</version>
						<version>16.3.0</version>
					</since>
					<synopsis>Trigger scope for taskprocessor overloads</synopsis>
					<description><para>
						This option specifies the trigger the distributor will use for
						detecting taskprocessor overloads.  When it detects an overload condition,
						the distrubutor will stop accepting new requests until the overload is
						cleared.
						</para>
						<enumlist>
							<enum name="global"><para>(default) Any taskprocessor overload will trigger.</para></enum>
							<enum name="pjsip_only"><para>Only pjsip taskprocessor overloads will trigger.</para></enum>
							<enum name="none"><para>No overload detection will be performed.</para></enum>
						</enumlist>
						<warning><para>
						The "none" and "pjsip_only" options should be used
						with extreme caution and only to mitigate specific issues.
						Under certain conditions they could make things worse.
						</para></warning>
					</description>
				</configOption>
				<configOption name="norefersub" default="yes">
					<since>
						<version>13.27.0</version>
						<version>16.4.0</version>
					</since>
					<synopsis>Advertise support for RFC4488 REFER subscription suppression</synopsis>
				</configOption>
				<configOption name="allow_sending_180_after_183" default="no">
					<since>
						<version>16.26.0</version>
						<version>18.12.0</version>
						<version>19.4.0</version>
					</since>
					<synopsis>Allow 180 after 183</synopsis>
					<description><para>
						Allow Asterisk to send 180 Ringing to an endpoint
						after 183 Session Progress has been send.
						If disabled Asterisk will instead send only a
						183 Session Progress to the endpoint.
						(default: "no")
						</para>
					</description>
				</configOption>
				<configOption name="all_codecs_on_empty_reinvite" default="no">
					<since>
						<version>16.30.0</version>
						<version>18.16.0</version>
						<version>19.8.0</version>
						<version>20.1.0</version>
					</since>
					<synopsis>If we should return all codecs on re-INVITE without SDP</synopsis>
					<description><para>
						On reception of a re-INVITE without SDP Asterisk will send an SDP
						offer in the 200 OK response containing all configured codecs on the
						endpoint, instead of simply those that have already been negotiated.
						RFC 3261 specifies this as a SHOULD requirement.
					</para></description>
				</configOption>
				<configOption name="default_auth_algorithms_uas" default="no">
					<since>
						<version>20.12.0</version>
						<version>21.7.0</version>
						<version>22.2.0</version>
					</since>
					<synopsis>List of default authentication algorithms to support when Asterisk is UAS</synopsis>
					<description><para>Valid values:</para>
						<enumlist>
							<enum name="md5"><para>Supported by all versions of OpenSSL and pjproject</para></enum>
							<enum name="sha-256"><para>Supported by all versions of OpenSSL but only pjproject versions > 2.14.1</para></enum>
							<enum name="sha-512-256"><para>Supported by OpenSSL versions >= 1.1.1 and pjproject versions > 2.14.1</para></enum>
						</enumlist>
						<para>If not specified, the default is <literal>MD5</literal> only.</para>
					</description>
				</configOption>
				<configOption name="default_auth_algorithms_uac" default="no">
					<since>
						<version>20.12.0</version>
						<version>21.7.0</version>
						<version>22.2.0</version>
					</since>
					<synopsis>List of default authentication algorithms to support when Asterisk is UAC</synopsis>
					<description><para>Valid values:</para>
						<enumlist>
							<enum name="md5"><para>Supported by all versions of OpenSSL and pjproject</para></enum>
							<enum name="sha-256"><para>Supported by all versions of OpenSSL but only pjproject versions > 2.14.1</para></enum>
							<enum name="sha-512-256"><para>Supported by OpenSSL versions >= 1.1.1 and pjproject versions > 2.14.1</para></enum>
						</enumlist>
						<para>If not specified, the default is <literal>MD5</literal> only.</para>
					</description>
				</configOption>
			</configObject>
		</configFile>
	</configInfo>
	<manager name="PJSIPQualify" language="en_US" module="res_pjsip">
		<since>
			<version>12.0.0</version>
		</since>
		<synopsis>
			Qualify a chan_pjsip endpoint.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="Endpoint" required="true">
				<para>The endpoint you want to qualify.</para>
			</parameter>
		</syntax>
		<description>
			<para>Qualify a chan_pjsip endpoint.</para>
		</description>
	</manager>
	<managerEvent language="en_US" name="IdentifyDetail" module="res_pjsip">
		<managerEventInstance class="EVENT_FLAG_COMMAND" module="res_pjsip">
			<since>
				<version>13.20.0</version>
				<version>15.3.0</version>
			</since>
			<synopsis>Provide details about an identify section.</synopsis>
			<syntax>
				<parameter name="ObjectType">
					<para>The object's type. This will always be 'identify'.</para>
				</parameter>
				<parameter name="ObjectName">
					<para>The name of this object.</para>
				</parameter>
				<parameter name="Endpoint">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip_endpoint_identifier_ip']/configFile[@name='pjsip.conf']/configObject[@name='identify']/configOption[@name='endpoint']/synopsis/node())"/></para>
				</parameter>
				<parameter name="SrvLookups">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip_endpoint_identifier_ip']/configFile[@name='pjsip.conf']/configObject[@name='identify']/configOption[@name='srv_lookups']/synopsis/node())"/></para>
				</parameter>
				<parameter name="Match">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip_endpoint_identifier_ip']/configFile[@name='pjsip.conf']/configObject[@name='identify']/configOption[@name='match']/synopsis/node())"/></para>
				</parameter>
				<parameter name="MatchHeader">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip_endpoint_identifier_ip']/configFile[@name='pjsip.conf']/configObject[@name='identify']/configOption[@name='match_header']/synopsis/node())"/></para>
				</parameter>
				<parameter name="MatchRequestUri">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip_endpoint_identifier_ip']/configFile[@name='pjsip.conf']/configObject[@name='identify']/configOption[@name='match_request_uri']/synopsis/node())"/></para>
				</parameter>
				<parameter name="EndpointName">
					<para>The name of the endpoint associated with this information.</para>
				</parameter>
			</syntax>
		</managerEventInstance>
	</managerEvent>
	<managerEvent language="en_US" name="AorDetail" module="res_pjsip">
		<managerEventInstance class="EVENT_FLAG_COMMAND" module="res_pjsip">
			<since>
				<version>13.12.0</version>
				<version>14.1.0</version>
			</since>
			<synopsis>Provide details about an Address of Record (AoR) section.</synopsis>
			<syntax>
				<parameter name="ObjectType">
					<para>The object's type. This will always be 'aor'.</para>
				</parameter>
				<parameter name="ObjectName">
					<para>The name of this object.</para>
				</parameter>
				<parameter name="MinimumExpiration">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='aor']/configOption[@name='minimum_expiration']/synopsis/node())"/></para>
				</parameter>
				<parameter name="MaximumExpiration">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='aor']/configOption[@name='maximum_expiration']/synopsis/node())"/></para>
				</parameter>
				<parameter name="DefaultExpiration">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='aor']/configOption[@name='default_expiration']/synopsis/node())"/></para>
				</parameter>
				<parameter name="QualifyFrequency">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='aor']/configOption[@name='qualify_frequency']/synopsis/node())"/></para>
				</parameter>
				<parameter name="AuthenticateQualify">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='aor']/configOption[@name='authenticate_qualify']/synopsis/node())"/></para>
				</parameter>
				<parameter name="MaxContacts">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='aor']/configOption[@name='max_contacts']/synopsis/node())"/></para>
				</parameter>
				<parameter name="RemoveExisting">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='aor']/configOption[@name='remove_existing']/synopsis/node())"/></para>
				</parameter>
				<parameter name="RemoveUnavailable">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='aor']/configOption[@name='remove_unavailable']/synopsis/node())"/></para>
				</parameter>
				<parameter name="Mailboxes">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='aor']/configOption[@name='mailboxes']/synopsis/node())"/></para>
				</parameter>
				<parameter name="OutboundProxy">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='aor']/configOption[@name='outbound_proxy']/synopsis/node())"/></para>
				</parameter>
				<parameter name="SupportPath">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='aor']/configOption[@name='support_path']/synopsis/node())"/></para>
				</parameter>
				<parameter name="Qualify2xxOnly">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='aor']/configOption[@name='qualify_2xx_only']/synopsis/node())"/></para>
				</parameter>
				<parameter name="QualifyTimeout">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='aor']/configOption[@name='qualify_timeout']/synopsis/node())"/></para>
				</parameter>
				<parameter name="VoicemailExtension">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='aor']/configOption[@name='voicemail_extension']/synopsis/node())"/></para>
				</parameter>
				<parameter name="Contacts">
					<para>A comma-separated list of contacts associated with this AoR.</para>
				</parameter>
				<parameter name="TotalContacts">
					<para>The total number of contacts associated with this AoR.</para>
				</parameter>
				<parameter name="ContactsRegistered">
					<para>The number of non-permanent contacts associated with this AoR.</para>
				</parameter>
				<parameter name="EndpointName">
					<para>The name of the endpoint associated with this information.</para>
				</parameter>
			</syntax>
		</managerEventInstance>
	</managerEvent>
	<managerEvent language="en_US" name="AuthDetail" module="res_pjsip">
		<managerEventInstance class="EVENT_FLAG_COMMAND" module="res_pjsip">
			<since>
				<version>12.0.0</version>
			</since>
			<synopsis>Provide details about an authentication section.</synopsis>
			<syntax>
				<parameter name="ObjectType">
					<para>The object's type. This will always be 'auth'.</para>
				</parameter>
				<parameter name="ObjectName">
					<para>The name of this object.</para>
				</parameter>
				<parameter name="Username">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='auth']/configOption[@name='username']/synopsis/node())"/></para>
				</parameter>
				<parameter name="Password">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='auth']/configOption[@name='username']/synopsis/node())"/></para>
				</parameter>
				<parameter name="Md5Cred">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='auth']/configOption[@name='md5_cred']/synopsis/node())"/></para>
				</parameter>
				<parameter name="Realm">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='auth']/configOption[@name='realm']/synopsis/node())"/></para>
				</parameter>
				<parameter name="NonceLifetime">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='auth']/configOption[@name='nonce_lifetime']/synopsis/node())"/></para>
				</parameter>
				<parameter name="AuthType">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='auth']/configOption[@name='auth_type']/synopsis/node())"/></para>
				</parameter>
				<parameter name="EndpointName">
					<para>The name of the endpoint associated with this information.</para>
				</parameter>
				<parameter name="OauthClientid">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='auth']/configOption[@name='oauth_clientid']/synopsis/node())"/></para>
				</parameter>
				<parameter name="OauthSecret">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='auth']/configOption[@name='oauth_secret']/synopsis/node())"/></para>
				</parameter>
				<parameter name="PasswordDigest">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='auth']/configOption[@name='password_digest']/synopsis/node())"/></para>
				</parameter>
				<parameter name="RefreshToken">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='auth']/configOption[@name='refresh_token']/synopsis/node())"/></para>
				</parameter>
				<parameter name="SupportedAlgorithmsUac">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='auth']/configOption[@name='supported_algorithms_uac']/synopsis/node())"/></para>
				</parameter>
				<parameter name="SupportedAlgorithmsUas">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='auth']/configOption[@name='supported_algorithms_uas']/synopsis/node())"/></para>
				</parameter>
			</syntax>
		</managerEventInstance>
	</managerEvent>
	<managerEvent language="en_US" name="TransportDetail" module="res_pjsip">
		<managerEventInstance class="EVENT_FLAG_COMMAND" module="res_pjsip">
			<since>
				<version>12.6.0</version>
			</since>
			<synopsis>Provide details about an authentication section.</synopsis>
			<syntax>
				<parameter name="ObjectType">
					<para>The object's type. This will always be 'transport'.</para>
				</parameter>
				<parameter name="ObjectName">
					<para>The name of this object.</para>
				</parameter>
				<parameter name="Protocol">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='transport']/configOption[@name='protocol']/synopsis/node())"/></para>
				</parameter>
				<parameter name="Bind">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='transport']/configOption[@name='bind']/synopsis/node())"/></para>
				</parameter>
				<parameter name="AsycOperations">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='transport']/configOption[@name='async_operations']/synopsis/node())"/></para>
				</parameter>
				<parameter name="CaListFile">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='transport']/configOption[@name='ca_list_file']/synopsis/node())"/></para>
				</parameter>
				<parameter name="CaListPath">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='transport']/configOption[@name='ca_list_path']/synopsis/node())"/></para>
				</parameter>
				<parameter name="CertFile">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='transport']/configOption[@name='cert_file']/synopsis/node())"/></para>
				</parameter>
				<parameter name="PrivKeyFile">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='transport']/configOption[@name='priv_key_file']/synopsis/node())"/></para>
				</parameter>
				<parameter name="Password">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='transport']/configOption[@name='password']/synopsis/node())"/></para>
				</parameter>
				<parameter name="ExternalSignalingAddress">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='transport']/configOption[@name='external_signaling_address']/synopsis/node())"/></para>
				</parameter>
				<parameter name="ExternalSignalingPort">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='transport']/configOption[@name='external_signaling_port']/synopsis/node())"/></para>
				</parameter>
				<parameter name="ExternalMediaAddress">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='transport']/configOption[@name='external_media_address']/synopsis/node())"/></para>
				</parameter>
				<parameter name="Domain">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='transport']/configOption[@name='domain']/synopsis/node())"/></para>
				</parameter>
				<parameter name="VerifyServer">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='transport']/configOption[@name='verify_server']/synopsis/node())"/></para>
				</parameter>
				<parameter name="VerifyClient">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='transport']/configOption[@name='verify_client']/synopsis/node())"/></para>
				</parameter>
				<parameter name="RequireClientCert">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='transport']/configOption[@name='require_client_cert']/synopsis/node())"/></para>
				</parameter>
				<parameter name="Method">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='transport']/configOption[@name='method']/synopsis/node())"/></para>
				</parameter>
				<parameter name="Cipher">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='transport']/configOption[@name='cipher']/synopsis/node())"/></para>
				</parameter>
				<parameter name="LocalNet">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='transport']/configOption[@name='local_net']/synopsis/node())"/></para>
				</parameter>
				<parameter name="Tos">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='transport']/configOption[@name='tos']/synopsis/node())"/></para>
				</parameter>
				<parameter name="Cos">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='transport']/configOption[@name='cos']/synopsis/node())"/></para>
				</parameter>
				<parameter name="WebsocketWriteTimeout">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='transport']/configOption[@name='websocket_write_timeout']/synopsis/node())"/></para>
				</parameter>
				<parameter name="AllowReload">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='transport']/configOption[@name='allow_reload']/synopsis/node())"/></para>
				</parameter>
				<parameter name="AllowWildcardCerts">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='transport']/configOption[@name='allow_wildcard_certs']/synopsis/node())"/></para>
				</parameter>
				<parameter name="SymmetricTransport">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='transport']/configOption[@name='symmetric_transport']/synopsis/node())"/></para>
				</parameter>
				<parameter name="TcpKeepaliveEnable">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='transport']/configOption[@name='tcp_keepalive_enable']/synopsis/node())"/></para>
				</parameter>
				<parameter name="TcpKeepaliveIdleTime">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='transport']/configOption[@name='tcp_keepalive_idle_time']/synopsis/node())"/></para>
				</parameter>
				<parameter name="TcpKeepaliveIntervalTime">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='transport']/configOption[@name='tcp_keepalive_interval_time']/synopsis/node())"/></para>
				</parameter>
				<parameter name="TcpKeepaliveProbeCount">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='transport']/configOption[@name='tcp_keepalive_probe_count']/synopsis/node())"/></para>
				</parameter>
				<parameter name="EndpointName">
					<para>The name of the endpoint associated with this information.</para>
				</parameter>
			</syntax>
		</managerEventInstance>
	</managerEvent>
	<managerEvent language="en_US" name="EndpointDetail" module="res_pjsip">
		<managerEventInstance class="EVENT_FLAG_COMMAND" module="res_pjsip">
			<since>
				<version>12.0.0</version>
			</since>
			<synopsis>Provide details about an endpoint section.</synopsis>
			<syntax>
				<parameter name="ObjectType">
					<para>The object's type. This will always be 'endpoint'.</para>
				</parameter>
				<parameter name="ObjectName">
					<para>The name of this object.</para>
				</parameter>
				<parameter name="Context">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='context']/synopsis/node())"/></para>
				</parameter>
				<parameter name="Allow">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='allow']/synopsis/node())"/></para>
				</parameter>
				<parameter name="DtmfMode">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='dtmf_mode']/synopsis/node())"/></para>
				</parameter>
				<parameter name="RtpIpv6">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='rtp_ipv6']/synopsis/node())"/></para>
				</parameter>
				<parameter name="RtpSymmetric">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='rtp_symmetric']/synopsis/node())"/></para>
				</parameter>
				<parameter name="IceSupport">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='ice_support']/synopsis/node())"/></para>
				</parameter>
				<parameter name="UsePtime">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='use_ptime']/synopsis/node())"/></para>
				</parameter>
				<parameter name="ForceRport">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='force_rport']/synopsis/node())"/></para>
				</parameter>
				<parameter name="RewriteContact">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='rewrite_contact']/synopsis/node())"/></para>
				</parameter>
				<parameter name="Transport">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='transport']/synopsis/node())"/></para>
				</parameter>
				<parameter name="OutboundProxy">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='outbound_proxy']/synopsis/node())"/></para>
				</parameter>
				<parameter name="MohSuggest">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='moh_suggest']/synopsis/node())"/></para>
				</parameter>
				<parameter name="100rel">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='100rel']/synopsis/node())"/></para>
				</parameter>
				<parameter name="Timers">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='timers']/synopsis/node())"/></para>
				</parameter>
				<parameter name="TimersMinSe">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='timers_min_se']/synopsis/node())"/></para>
				</parameter>
				<parameter name="TimersSessExpires">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='timers_sess_expires']/synopsis/node())"/></para>
				</parameter>
				<parameter name="Auth">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='auth']/synopsis/node())"/></para>
				</parameter>
				<parameter name="OutboundAuth">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='outbound_auth']/synopsis/node())"/></para>
				</parameter>
				<parameter name="Aors">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='aors']/synopsis/node())"/></para>
				</parameter>
				<parameter name="MediaAddress">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='media_address']/synopsis/node())"/></para>
				</parameter>
				<parameter name="IdentifyBy">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='identify_by']/synopsis/node())"/></para>
				</parameter>
				<parameter name="DirectMedia">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='direct_media']/synopsis/node())"/></para>
				</parameter>
				<parameter name="DirectMediaMethod">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='direct_media_method']/synopsis/node())"/></para>
				</parameter>
				<parameter name="TrustConnectedLine">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='trust_connected_line']/synopsis/node())"/></para>
				</parameter>
				<parameter name="SendConnectedLine">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='send_connected_line']/synopsis/node())"/></para>
				</parameter>
				<parameter name="ConnectedLineMethod">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='connected_line_method']/synopsis/node())"/></para>
				</parameter>
				<parameter name="DirectMediaGlareMitigation">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='direct_media_glare_mitigation']/synopsis/node())"/></para>
				</parameter>
				<parameter name="DisableDirectMediaOnNat">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='disable_direct_media_on_nat']/synopsis/node())"/></para>
				</parameter>
				<parameter name="Callerid">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='callerid']/synopsis/node())"/></para>
				</parameter>
				<parameter name="CalleridPrivacy">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='callerid_privacy']/synopsis/node())"/></para>
				</parameter>
				<parameter name="CalleridTag">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='callerid_tag']/synopsis/node())"/></para>
				</parameter>
				<parameter name="TrustIdInbound">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='trust_id_inbound']/synopsis/node())"/></para>
				</parameter>
				<parameter name="TrustIdOutbound">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='trust_id_outbound']/synopsis/node())"/></para>
				</parameter>
				<parameter name="SendPai">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='send_pai']/synopsis/node())"/></para>
				</parameter>
				<parameter name="SendRpid">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='send_rpid']/synopsis/node())"/></para>
				</parameter>
				<parameter name="SendDiversion">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='send_diversion']/synopsis/node())"/></para>
				</parameter>
				<parameter name="Mailboxes">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='mailboxes']/synopsis/node())"/></para>
				</parameter>
				<parameter name="AggregateMwi">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='aggregate_mwi']/synopsis/node())"/></para>
				</parameter>
				<parameter name="MediaEncryption">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='media_encryption']/synopsis/node())"/></para>
				</parameter>
				<parameter name="MediaEncryptionOptimistic">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='media_encryption_optimistic']/synopsis/node())"/></para>
				</parameter>
				<parameter name="UseAvpf">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='use_avpf']/synopsis/node())"/></para>
				</parameter>
				<parameter name="ForceAvp">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='force_avp']/synopsis/node())"/></para>
				</parameter>
				<parameter name="MediaUseReceivedTransport">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='media_use_received_transport']/synopsis/node())"/></para>
				</parameter>
				<parameter name="OneTouchRecording">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='one_touch_recording']/synopsis/node())"/></para>
				</parameter>
				<parameter name="InbandProgress">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='inband_progress']/synopsis/node())"/></para>
				</parameter>
				<parameter name="CallGroup">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='call_group']/synopsis/node())"/></para>
				</parameter>
				<parameter name="PickupGroup">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='pickup_group']/synopsis/node())"/></para>
				</parameter>
				<parameter name="NamedCallGroup">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='named_call_group']/synopsis/node())"/></para>
				</parameter>
				<parameter name="NamedPickupGroup">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='named_pickup_group']/synopsis/node())"/></para>
				</parameter>
				<parameter name="DeviceStateBusyAt">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='device_state_busy_at']/synopsis/node())"/></para>
				</parameter>
				<parameter name="T38Udptl">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='t38_udptl']/synopsis/node())"/></para>
				</parameter>
				<parameter name="T38UdptlEc">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='t38_udptl_ec']/synopsis/node())"/></para>
				</parameter>
				<parameter name="T38UdptlMaxdatagram">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='t38_udptl_maxdatagram']/synopsis/node())"/></para>
				</parameter>
				<parameter name="FaxDetect">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='fax_detect']/synopsis/node())"/></para>
				</parameter>
				<parameter name="T38UdptlNat">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='t38_udptl_nat']/synopsis/node())"/></para>
				</parameter>
				<parameter name="T38UdptlIpv6">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='t38_udptl_ipv6']/synopsis/node())"/></para>
				</parameter>
				<parameter name="T38BindUdptlToMediaAddress">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='t38_bind_udptl_to_media_address']/synopsis/node())"/></para>
				</parameter>
				<parameter name="ToneZone">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='tone_zone']/synopsis/node())"/></para>
				</parameter>
				<parameter name="Language">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='language']/synopsis/node())"/></para>
				</parameter>
				<parameter name="RecordOnFeature">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='record_on_feature']/synopsis/node())"/></para>
				</parameter>
				<parameter name="RecordOffFeature">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='record_off_feature']/synopsis/node())"/></para>
				</parameter>
				<parameter name="AllowTransfer">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='allow_transfer']/synopsis/node())"/></para>
				</parameter>
				<parameter name="UserEqPhone">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='user_eq_phone']/synopsis/node())"/></para>
				</parameter>
				<parameter name="MohPassthrough">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='moh_passthrough']/synopsis/node())"/></para>
				</parameter>
				<parameter name="SdpOwner">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='sdp_owner']/synopsis/node())"/></para>
				</parameter>
				<parameter name="SdpSession">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='sdp_session']/synopsis/node())"/></para>
				</parameter>
				<parameter name="TosAudio">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='tos_audio']/synopsis/node())"/></para>
				</parameter>
				<parameter name="TosVideo">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='tos_video']/synopsis/node())"/></para>
				</parameter>
				<parameter name="CosAudio">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='cos_audio']/synopsis/node())"/></para>
				</parameter>
				<parameter name="CosVideo">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='cos_video']/synopsis/node())"/></para>
				</parameter>
				<parameter name="AllowSubscribe">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='allow_subscribe']/synopsis/node())"/></para>
				</parameter>
				<parameter name="SubMinExpiry">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='sub_min_expiry']/synopsis/node())"/></para>
				</parameter>
				<parameter name="FromUser">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='from_user']/synopsis/node())"/></para>
				</parameter>
				<parameter name="FromDomain">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='from_domain']/synopsis/node())"/></para>
				</parameter>
				<parameter name="MwiFromUser">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='mwi_from_user']/synopsis/node())"/></para>
				</parameter>
				<parameter name="RtpEngine">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='rtp_engine']/synopsis/node())"/></para>
				</parameter>
				<parameter name="DtlsVerify">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='dtls_verify']/synopsis/node())"/></para>
				</parameter>
				<parameter name="DtlsRekey">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='dtls_rekey']/synopsis/node())"/></para>
				</parameter>
				<parameter name="DtlsCertFile">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='dtls_cert_file']/synopsis/node())"/></para>
				</parameter>
				<parameter name="DtlsPrivateKey">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='dtls_private_key']/synopsis/node())"/></para>
				</parameter>
				<parameter name="DtlsCipher">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='dtls_cipher']/synopsis/node())"/></para>
				</parameter>
				<parameter name="DtlsCaFile">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='dtls_ca_file']/synopsis/node())"/></para>
				</parameter>
				<parameter name="DtlsCaPath">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='dtls_ca_path']/synopsis/node())"/></para>
				</parameter>
				<parameter name="DtlsSetup">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='dtls_setup']/synopsis/node())"/></para>
				</parameter>
				<parameter name="SrtpTag32">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='srtp_tag_32']/synopsis/node())"/></para>
				</parameter>
				<parameter name="RedirectMethod">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='redirect_method']/synopsis/node())"/></para>
				</parameter>
				<parameter name="SetVar">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='set_var']/synopsis/node())"/></para>
				</parameter>
				<parameter name="MessageContext">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='message_context']/synopsis/node())"/></para>
				</parameter>
				<parameter name="Accountcode">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='accountcode']/synopsis/node())"/></para>
				</parameter>
				<parameter name="PreferredCodecOnly">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='preferred_codec_only']/synopsis/node())"/></para>
				</parameter>
				<parameter name="DeviceState">
					<para>The aggregate device state for this endpoint.</para>
				</parameter>
				<parameter name="ActiveChannels">
					<para>The number of active channels associated with this endpoint.</para>
				</parameter>
				<parameter name="SubscribeContext">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='subscribe_context']/synopsis/node())"/></para>
				</parameter>
				<parameter name="AllowOverlap">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='allow_overlap']/synopsis/node())"/></para>
				</parameter>
				<parameter name="OverlapContext">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='overlap_context']/synopsis/node())"/></para>
				</parameter>
				<parameter name="AcceptMultipleSdpAnswers">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='accept_multiple_sdp_answers']/synopsis/node())"/></para>
				</parameter>
				<parameter name="Acl">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='acl']/synopsis/node())"/></para>
				</parameter>
				<parameter name="AllowUnauthenticatedOptions">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='allow_unauthenticated_options']/synopsis/node())"/></para>
				</parameter>
				<parameter name="AsymmetricRtpCodec">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='asymmetric_rtp_codec']/synopsis/node())"/></para>
				</parameter>
				<parameter name="BindRtpToMediaAddress">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='bind_rtp_to_media_address']/synopsis/node())"/></para>
				</parameter>
				<parameter name="Bundle">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='bundle']/synopsis/node())"/></para>
				</parameter>
				<parameter name="CodecPrefsIncomingAnswer">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='codec_prefs_incoming_answer']/synopsis/node())"/></para>
				</parameter>
				<parameter name="CodecPrefsIncomingOffer">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='codec_prefs_incoming_offer']/synopsis/node())"/></para>
				</parameter>
				<parameter name="CodecPrefsOutgoingAnswer">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='codec_prefs_outgoing_answer']/synopsis/node())"/></para>
				</parameter>
				<parameter name="CodecPrefsOutgoingOffer">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='codec_prefs_outgoing_offer']/synopsis/node())"/></para>
				</parameter>
				<parameter name="ContactAcl">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='contact_acl']/synopsis/node())"/></para>
				</parameter>
				<parameter name="DtlsAutoGenerateCert">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='dtls_auto_generate_cert']/synopsis/node())"/></para>
				</parameter>
				<parameter name="DtlsFingerprint">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='dtls_fingerprint']/synopsis/node())"/></para>
				</parameter>
				<parameter name="FaxDetectTimeout">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='fax_detect_timeout']/synopsis/node())"/></para>
				</parameter>
				<parameter name="FollowEarlyMediaFork">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='follow_early_media_fork']/synopsis/node())"/></para>
				</parameter>
				<parameter name="G726NonStandard">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='g726_non_standard']/synopsis/node())"/></para>
				</parameter>
				<parameter name="GeolocIncomingCallProfile">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='geoloc_incoming_call_profile']/synopsis/node())"/></para>
				</parameter>
				<parameter name="GeolocOutgoingCallProfile">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='geoloc_outgoing_call_profile']/synopsis/node())"/></para>
				</parameter>
				<parameter name="Ignore183WithoutSdp">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='ignore_183_without_sdp']/synopsis/node())"/></para>
				</parameter>
				<parameter name="IncomingCallOfferPref">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='incoming_call_offer_pref']/synopsis/node())"/></para>
				</parameter>
				<parameter name="IncomingMwiMailbox">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='incoming_mwi_mailbox']/synopsis/node())"/></para>
				</parameter>
				<parameter name="MaxAudioStreams">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='max_audio_streams']/synopsis/node())"/></para>
				</parameter>
				<parameter name="MaxVideoStreams">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='max_video_streams']/synopsis/node())"/></para>
				</parameter>
				<parameter name="MwiSubscribeReplacesUnsolicited">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='mwi_subscribe_replaces_unsolicited']/synopsis/node())"/></para>
				</parameter>
				<parameter name="NotifyEarlyInuseRinging">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='notify_early_inuse_ringing']/synopsis/node())"/></para>
				</parameter>
				<parameter name="OutgoingCallOfferPref">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='outgoing_call_offer_pref']/synopsis/node())"/></para>
				</parameter>
				<parameter name="ReferBlindProgress">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='refer_blind_progress']/synopsis/node())"/></para>
				</parameter>
				<parameter name="RpidImmediate">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='rpid_immediate']/synopsis/node())"/></para>
				</parameter>
				<parameter name="RtcpMux">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='rtcp_mux']/synopsis/node())"/></para>
				</parameter>
				<parameter name="RtpKeepalive">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='rtp_keepalive']/synopsis/node())"/></para>
				</parameter>
				<parameter name="RtpTimeout">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='rtp_timeout']/synopsis/node())"/></para>
				</parameter>
				<parameter name="RtpTimeoutHold">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='rtp_timeout_hold']/synopsis/node())"/></para>
				</parameter>
				<parameter name="RtpPortStart">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='rtp_port_start']/synopsis/node())"/></para>
				</parameter>
				<parameter name="RtpPortEnd">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='rtp_port_end']/synopsis/node())"/></para>
				</parameter>
				<parameter name="SecurityNegotiation">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='security_negotiation']/synopsis/node())"/></para>
				</parameter>
				<parameter name="SendAoc">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='send_aoc']/synopsis/node())"/></para>
				</parameter>
				<parameter name="SendHistoryInfo">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='send_history_info']/synopsis/node())"/></para>
				</parameter>
				<parameter name="StirShaken">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='stir_shaken']/synopsis/node())"/></para>
				</parameter>
				<parameter name="StirShakenProfile">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='stir_shaken_profile']/synopsis/node())"/></para>
				</parameter>
				<parameter name="SuppressMohOnSendonly">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='suppress_moh_on_sendonly']/synopsis/node())"/></para>
				</parameter>
				<parameter name="SuppressQ850ReasonHeaders">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='suppress_q850_reason_headers']/synopsis/node())"/></para>
				</parameter>
				<parameter name="Tenantid">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='tenantid']/synopsis/node())"/></para>
				</parameter>
				<parameter name="VoicemailExtension">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='voicemail_extension']/synopsis/node())"/></para>
				</parameter>
				<parameter name="Webrtc">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='webrtc']/synopsis/node())"/></para>
				</parameter>
			</syntax>
		</managerEventInstance>
	</managerEvent>
	<managerEvent language="en_US" name="AorList" module="res_pjsip">
		<managerEventInstance class="EVENT_FLAG_COMMAND" module="res_pjsip">
			<since>
				<version>16.0.0</version>
			</since>
			<synopsis>Provide details about an Address of Record (AoR) section.</synopsis>
			<syntax>
				<parameter name="ObjectType">
					<para>The object's type. This will always be 'aor'.</para>
				</parameter>
				<parameter name="ObjectName">
					<para>The name of this object.</para>
				</parameter>
				<parameter name="MinimumExpiration">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='aor']/configOption[@name='minimum_expiration']/synopsis/node())"/></para>
				</parameter>
				<parameter name="MaximumExpiration">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='aor']/configOption[@name='maximum_expiration']/synopsis/node())"/></para>
				</parameter>
				<parameter name="DefaultExpiration">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='aor']/configOption[@name='default_expiration']/synopsis/node())"/></para>
				</parameter>
				<parameter name="QualifyFrequency">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='aor']/configOption[@name='qualify_frequency']/synopsis/node())"/></para>
				</parameter>
				<parameter name="QualifyTimeout">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='aor']/configOption[@name='qualify_timeout']/synopsis/node())"/></para>
				</parameter>
				<parameter name="Qualify2xxOnly">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='aor']/configOption[@name='qualify_2xx_only']/synopsis/node())"/></para>
				</parameter>
				<parameter name="AuthenticateQualify">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='aor']/configOption[@name='authenticate_qualify']/synopsis/node())"/></para>
				</parameter>
				<parameter name="MaxContacts">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='aor']/configOption[@name='max_contacts']/synopsis/node())"/></para>
				</parameter>
				<parameter name="RemoveExisting">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='aor']/configOption[@name='remove_existing']/synopsis/node())"/></para>
				</parameter>
				<parameter name="RemoveUnavailable">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='aor']/configOption[@name='remove_unavailable']/synopsis/node())"/></para>
				</parameter>
				<parameter name="Mailboxes">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='aor']/configOption[@name='mailboxes']/synopsis/node())"/></para>
				</parameter>
				<parameter name="VoicemailExtension">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='aor']/configOption[@name='voicemail_extension']/synopsis/node())"/></para>
				</parameter>
				<parameter name="OutboundProxy">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='aor']/configOption[@name='outbound_proxy']/synopsis/node())"/></para>
				</parameter>
				<parameter name="SupportPath">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='aor']/configOption[@name='support_path']/synopsis/node())"/></para>
				</parameter>
				<parameter name="Contacts">
					<para>A comma-separated list of contacts associated with this AoR.</para>
				</parameter>
			</syntax>
		</managerEventInstance>
	</managerEvent>
	<managerEvent language="en_US" name="AuthList" module="res_pjsip">
		<managerEventInstance class="EVENT_FLAG_COMMAND" module="res_pjsip">
			<since>
				<version>16.0.0</version>
			</since>
			<synopsis>Provide details about an Address of Record (Auth) section.</synopsis>
			<syntax>
				<parameter name="ObjectType">
					<para>The object's type. This will always be 'auth'.</para>
				</parameter>
				<parameter name="ObjectName">
					<para>The name of this object.</para>
				</parameter>
				<parameter name="Username">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='auth']/configOption[@name='username']/synopsis/node())"/></para>
				</parameter>
				<parameter name="Md5Cred">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='auth']/configOption[@name='md5_cred']/synopsis/node())"/></para>
				</parameter>
				<parameter name="Realm">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='auth']/configOption[@name='realm']/synopsis/node())"/></para>
				</parameter>
				<parameter name="AuthType">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='auth']/configOption[@name='auth_type']/synopsis/node())"/></para>
				</parameter>
				<parameter name="Password">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='auth']/configOption[@name='password']/synopsis/node())"/></para>
				</parameter>
				<parameter name="NonceLifetime">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='auth']/configOption[@name='nonce_lifetime']/synopsis/node())"/></para>
				</parameter>
				<parameter name="OauthClientid">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='auth']/configOption[@name='oauth_clientid']/synopsis/node())"/></para>
				</parameter>
				<parameter name="OauthSecret">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='auth']/configOption[@name='oauth_secret']/synopsis/node())"/></para>
				</parameter>
				<parameter name="PasswordDigest">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='auth']/configOption[@name='password_digest']/synopsis/node())"/></para>
				</parameter>
				<parameter name="RefreshToken">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='auth']/configOption[@name='refresh_token']/synopsis/node())"/></para>
				</parameter>
				<parameter name="SupportedAlgorithmsUac">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='auth']/configOption[@name='supported_algorithms_uac']/synopsis/node())"/></para>
				</parameter>
				<parameter name="SupportedAlgorithmsUas">
					<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='auth']/configOption[@name='supported_algorithms_uas']/synopsis/node())"/></para>
				</parameter>
			</syntax>
		</managerEventInstance>
	</managerEvent>
	<managerEvent language="en_US" name="ContactList" module="res_pjsip">
		<managerEventInstance class="EVENT_FLAG_COMMAND" module="res_pjsip">
			<since>
				<version>16.0.0</version>
			</since>
			<synopsis>Provide details about a contact section.</synopsis>
			<syntax>
				<parameter name="ObjectType">
					<para>The object's type. This will always be 'contact'.</para>
				</parameter>
				<parameter name="ObjectName">
					<para>The name of this object.</para>
				</parameter>
				<parameter name="ViaAddr">
					<para>IP address of the last Via header in REGISTER request.
					Will only appear in the event if available.</para>
				</parameter>
				<parameter name="ViaPort">
					<para>Port number of the last Via header in REGISTER request.
					Will only appear in the event if available.</para>
				</parameter>
				<parameter name="QualifyTimeout">
					<para>The elapsed time in decimal seconds after which an OPTIONS
					message is sent before the contact is considered unavailable.</para>
				</parameter>
				<parameter name="CallId">
					<para>Content of the Call-ID header in REGISTER request.
					Will only appear in the event if available.</para>
				</parameter>
				<parameter name="RegServer">
					<para>Asterisk Server name.</para>
				</parameter>
				<parameter name="PruneOnBoot">
					<para>If true delete the contact on Asterisk restart/boot.</para>
				</parameter>
				<parameter name="Path">
					<para>The Path header received on the REGISTER.</para>
				</parameter>
				<parameter name="Endpoint">
					<para>The name of the endpoint associated with this information.</para>
				</parameter>
				<parameter name="AuthenticateQualify">
					<para>A boolean indicating whether a qualify should be authenticated.</para>
				</parameter>
				<parameter name="Uri">
					<para>This contact's URI.</para>
				</parameter>
				<parameter name="QualifyFrequency">
					<para>The interval in seconds at which the contact will be qualified.</para>
				</parameter>
				<parameter name="UserAgent">
					<para>Content of the User-Agent header in REGISTER request</para>
				</parameter>
				<parameter name="ExpirationTime">
					<para>Absolute time that this contact is no longer valid after</para>
				</parameter>
				<parameter name="OutboundProxy">
					<para>The contact's outbound proxy.</para>
				</parameter>
				<parameter name="Status">
					<para>This contact's status.</para>
					<enumlist>
						<enum name="Reachable"/>
						<enum name="Unreachable"/>
						<enum name="NonQualified"/>
						<enum name="Unknown"/>
					</enumlist>
				</parameter>
				<parameter name="RoundtripUsec">
					<para>The round trip time in microseconds.</para>
				</parameter>
				<parameter name="Qualify2xxOnly">
					<para>A boolean indicating whether to only consider a contact
					available if the OPTIONS response has a 2xx status code.</para>
				</parameter>
			</syntax>
		</managerEventInstance>
	</managerEvent>
	<managerEvent language="en_US" name="ContactStatusDetail" module="res_pjsip">
		<managerEventInstance class="EVENT_FLAG_COMMAND" module="res_pjsip">
			<since>
				<version>13.0.0</version>
			</since>
			<synopsis>Provide details about a contact's status.</synopsis>
			<syntax>
				<parameter name="AOR">
					<para>The AoR that owns this contact.</para>
				</parameter>
				<parameter name="URI">
					<para>This contact's URI.</para>
				</parameter>
				<parameter name="Status">
					<para>This contact's status.</para>
					<enumlist>
						<enum name="Reachable"/>
						<enum name="Unreachable"/>
						<enum name="NonQualified"/>
						<enum name="Unknown"/>
					</enumlist>
				</parameter>
				<parameter name="RoundtripUsec">
					<para>The round trip time in microseconds.</para>
				</parameter>
				<parameter name="EndpointName">
					<para>The name of the endpoint associated with this information.</para>
				</parameter>
				<parameter name="UserAgent">
					<para>Content of the User-Agent header in REGISTER request</para>
				</parameter>
				<parameter name="RegExpire">
					<para>Absolute time that this contact is no longer valid after</para>
				</parameter>
				<parameter name="ViaAddress">
					<para>IP address:port of the last Via header in REGISTER request.
					Will only appear in the event if available.</para>
				</parameter>
				<parameter name="CallID">
					<para>Content of the Call-ID header in REGISTER request.
					Will only appear in the event if available.</para>
				</parameter>
				<parameter name="ID">
					<para>The sorcery ID of the contact.</para>
				</parameter>
				<parameter name="AuthenticateQualify">
					<para>A boolean indicating whether a qualify should be authenticated.</para>
				</parameter>
				<parameter name="OutboundProxy">
					<para>The contact's outbound proxy.</para>
				</parameter>
				<parameter name="Path">
					<para>The Path header received on the REGISTER.</para>
				</parameter>
				<parameter name="QualifyFrequency">
					<para>The interval in seconds at which the contact will be qualified.</para>
				</parameter>
				<parameter name="QualifyTimeout">
					<para>The elapsed time in decimal seconds after which an OPTIONS
					message is sent before the contact is considered unavailable.</para>
				</parameter>
				<parameter name="Qualify2xxOnly">
					<para>Only consider a contact available if the OPTIONS response
					has a 2xx status code.</para>
				</parameter>
			</syntax>
		</managerEventInstance>
	</managerEvent>
	<managerEvent language="en_US" name="EndpointList" module="res_pjsip">
		<managerEventInstance class="EVENT_FLAG_COMMAND" module="res_pjsip">
			<since>
				<version>12.0.0</version>
			</since>
			<synopsis>Provide details about a contact's status.</synopsis>
			<syntax>
				<parameter name="ObjectType">
					<para>The object's type. This will always be 'endpoint'.</para>
				</parameter>
				<parameter name="ObjectName">
					<para>The name of this object.</para>
				</parameter>
				<parameter name="Transport">
					<para>The transport configurations associated with this endpoint.</para>
				</parameter>
				<parameter name="Aor">
					<para>The aor configurations associated with this endpoint.</para>
				</parameter>
				<parameter name="Auths">
					<para>The inbound authentication configurations associated with this endpoint.</para>
				</parameter>
				<parameter name="OutboundAuths">
					<para>The outbound authentication configurations associated with this endpoint.</para>
				</parameter>
				<parameter name="DeviceState">
					<para>The aggregate device state for this endpoint.</para>
				</parameter>
				<parameter name="ActiveChannels">
					<para>The number of active channels associated with this endpoint.</para>
				</parameter>
				<parameter name="Contacts">
					<para>A comma-separated list of contacts associated with this AoR.</para>
				</parameter>
			</syntax>
		</managerEventInstance>
	</managerEvent>
	<manager name="PJSIPShowEndpoints" language="en_US" module="res_pjsip">
		<since>
			<version>12.0.0</version>
		</since>
		<synopsis>
			Lists PJSIP endpoints.
		</synopsis>
		<syntax />
		<description>
			<para>
			Provides a listing of all endpoints.  For each endpoint an <literal>EndpointList</literal> event
			is raised that contains relevant attributes and status information.  Once all
			endpoints have been listed an <literal>EndpointListComplete</literal> event is issued.
			</para>
		</description>
		<responses>
			<list-elements>
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='EndpointList'])" />
			</list-elements>
			<managerEvent language="en_US" name="EndpointListComplete" module="res_pjsip">
				<managerEventInstance class="EVENT_FLAG_COMMAND" module="res_pjsip">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Provide final information about an endpoint list.</synopsis>
					<syntax>
						<parameter name="EventList"/>
						<parameter name="ListItems"/>
					</syntax>
				</managerEventInstance>
			</managerEvent>
		</responses>
	</manager>
	<manager name="PJSIPShowEndpoint" language="en_US" module="res_pjsip">
		<since>
			<version>12.0.0</version>
		</since>
		<synopsis>
			Detail listing of an endpoint and its objects.
		</synopsis>
		<syntax>
			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
			<parameter name="Endpoint" required="true">
				<para>The endpoint to list.</para>
			</parameter>
		</syntax>
		<description>
			<para>
			Provides a detailed listing of options for a given endpoint.  Events are issued
			showing the configuration and status of the endpoint and associated objects.  These
			events include <literal>EndpointDetail</literal>, <literal>AorDetail</literal>,
			<literal>AuthDetail</literal>, <literal>TransportDetail</literal>, and
			<literal>IdentifyDetail</literal>.  Some events may be listed multiple times if multiple objects are
			associated (for instance AoRs).  Once all detail events have been raised a final
			<literal>EndpointDetailComplete</literal> event is issued.
			</para>
		</description>
		<responses>
			<list-elements>
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='EndpointDetail'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='IdentifyDetail'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='ContactStatusDetail'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='AuthDetail'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='TransportDetail'])" />
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='AorDetail'])" />
			</list-elements>
			<managerEvent language="en_US" name="EndpointDetailComplete" module="res_pjsip">
				<managerEventInstance class="EVENT_FLAG_COMMAND" module="res_pjsip">
					<since>
						<version>12.0.0</version>
					</since>
					<synopsis>Provide final information about endpoint details.</synopsis>
					<syntax>
						<parameter name="EventList"/>
						<parameter name="ListItems"/>
					</syntax>
				</managerEventInstance>
			</managerEvent>
		</responses>
	</manager>
	<manager name="PJSIPShowAors" language="en_US" module="res_pjsip">
		<since>
			<version>16.0.0</version>
		</since>
		<synopsis>
			Lists PJSIP AORs.
		</synopsis>
		<syntax />
		<description>
			<para>
			Provides a listing of all AORs. For each AOR an <literal>AorList</literal> event
			is raised that contains relevant attributes and status information.  Once all
			aors have been listed an <literal>AorListComplete</literal> event is issued.
			</para>
		</description>
		<responses>
			<list-elements>
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='AorList'])" />
			</list-elements>
			<managerEvent language="en_US" name="AorListComplete" module="res_pjsip">
				<managerEventInstance class="EVENT_FLAG_COMMAND" module="res_pjsip">
					<since>
						<version>16.0.0</version>
					</since>
					<synopsis>Provide final information about an aor list.</synopsis>
					<syntax>
						<parameter name="EventList"/>
						<parameter name="ListItems"/>
					</syntax>
				</managerEventInstance>
			</managerEvent>
		</responses>
	</manager>
	<manager name="PJSIPShowAuths" language="en_US" module="res_pjsip">
		<since>
			<version>16.0.0</version>
		</since>
		<synopsis>
			Lists PJSIP Auths.
		</synopsis>
		<syntax />
		<description>
			<para>Provides a listing of all Auths. For each Auth an <literal>AuthList</literal> event
			is raised that contains relevant attributes and status information.  Once all
			auths have been listed an <literal>AuthListComplete</literal> event is issued.
			</para>
		</description>
		<responses>
			<list-elements>
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='AuthList'])" />
			</list-elements>
			<managerEvent language="en_US" name="AuthListComplete" module="res_pjsip">
				<managerEventInstance class="EVENT_FLAG_COMMAND" module="res_pjsip">
					<since>
						<version>16.0.0</version>
					</since>
					<synopsis>Provide final information about an auth list.</synopsis>
					<syntax>
						<parameter name="EventList"/>
						<parameter name="ListItems"/>
					</syntax>
				</managerEventInstance>
			</managerEvent>
		</responses>
	</manager>
	<manager name="PJSIPShowContacts" language="en_US" module="res_pjsip">
		<since>
			<version>16.0.0</version>
		</since>
		<synopsis>
			Lists PJSIP Contacts.
		</synopsis>
		<syntax />
		<description>
			<para>Provides a listing of all Contacts. For each Contact a <literal>ContactList</literal>
			event is raised that contains relevant attributes and status information.
			Once all contacts have been listed a <literal>ContactListComplete</literal> event
			is issued.
			</para>
		</description>
		<responses>
			<list-elements>
				<xi:include xpointer="xpointer(/docs/managerEvent[@name='ContactList'])" />
			</list-elements>
			<managerEvent language="en_US" name="ContactListComplete" module="res_pjsip">
				<managerEventInstance class="EVENT_FLAG_COMMAND" module="res_pjsip">
					<since>
						<version>16.0.0</version>
					</since>
					<synopsis>Provide final information about a contact list.</synopsis>
					<syntax>
						<parameter name="EventList"/>
						<parameter name="ListItems"/>
					</syntax>
				</managerEventInstance>
			</managerEvent>
		</responses>
	</manager>
	<configInfo name="res_stir_shaken" language="en_US">
		<synopsis>STIR/SHAKEN module for Asterisk</synopsis>
		<configFile name="stir_shaken.conf">
			<configObject name="attestation">
				<since>
					<version>18.22.0</version>
					<version>20.7.0</version>
					<version>21.2.0</version>
				</since>
				<synopsis>STIR/SHAKEN attestation options</synopsis>
				<configOption name="global_disable" default="false">
					<since>
						<version>18.22.0</version>
						<version>20.7.0</version>
						<version>21.2.0</version>
					</since>
					<synopsis>Globally disable verification</synopsis>
				</configOption>
				<configOption name="private_key_file" default="">
					<since>
						<version>18.22.0</version>
						<version>20.7.0</version>
						<version>21.2.0</version>
					</since>
					<synopsis>File path to a certificate</synopsis>
				</configOption>
				<configOption name="public_cert_url" default="">
					<since>
						<version>18.22.0</version>
						<version>20.7.0</version>
						<version>21.2.0</version>
					</since>
					<synopsis>URL to the public certificate</synopsis>
					<description><para>
					 Must be a valid http, or https, URL.
					</para></description>
				</configOption>
				<configOption name="attest_level">
					<since>
						<version>18.22.0</version>
						<version>20.7.0</version>
						<version>21.2.0</version>
					</since>
					<synopsis>Attestation level</synopsis>
				</configOption>
				<configOption name="unknown_tn_attest_level">
					<since>
						<version>20.12.0</version>
						<version>21.7.0</version>
						<version>22.2.0</version>
					</since>
					<synopsis>Attestation level to use for unknown TNs</synopsis>
					<description><para>
					Normally if a callerid TN isn't configured in stir_shaken.conf
					no Identity header will be created. If this option is set,
					however, an Identity header will be sent using this
					attestation level.  Since there's no TN object, you must
					ensure that a private_key_file and public_cert_url are
					configured in the attestation or profile objects for
					this to work.
					</para></description>
				</configOption>
				<configOption name="check_tn_cert_public_url" default="false">
					<since>
						<version>18.22.0</version>
						<version>20.7.0</version>
						<version>21.2.0</version>
					</since>
					<synopsis>On load, Retrieve all TN's certificates and validate their dates</synopsis>
				</configOption>
				<configOption name="send_mky" default="no">
					<since>
						<version>18.22.0</version>
						<version>20.7.0</version>
						<version>21.2.0</version>
					</since>
					<synopsis>Send a media key (mky) grant in the attestation for DTLS calls.
					(not common)</synopsis>
				</configOption>
			</configObject>
			<configObject name="tn">
				<since>
					<version>18.22.0</version>
					<version>20.7.0</version>
					<version>21.2.0</version>
				</since>
				<synopsis>STIR/SHAKEN TN options</synopsis>
				<configOption name="type">
					<since>
						<version>18.22.0</version>
						<version>20.7.0</version>
						<version>21.2.0</version>
					</since>
					<synopsis>Must be of type 'tn'.</synopsis>
				</configOption>
				<configOption name="private_key_file" default="">
					<since>
						<version>18.22.0</version>
						<version>20.7.0</version>
						<version>21.2.0</version>
					</since>
					<synopsis>File path to a certificate</synopsis>
				</configOption>
				<configOption name="public_cert_url" default="">
					<since>
						<version>18.22.0</version>
						<version>20.7.0</version>
						<version>21.2.0</version>
					</since>
					<synopsis>URL to the public certificate</synopsis>
					<description><para>
					 Must be a valid http, or https, URL.
					</para></description>
				</configOption>
				<configOption name="attest_level">
					<since>
						<version>18.22.0</version>
						<version>20.7.0</version>
						<version>21.2.0</version>
					</since>
					<synopsis>Attestation level</synopsis>
				</configOption>
				<configOption name="check_tn_cert_public_url" default="false">
					<since>
						<version>18.22.0</version>
						<version>20.7.0</version>
						<version>21.2.0</version>
					</since>
					<synopsis>On load, Retrieve all TN's certificates and validate their dates</synopsis>
				</configOption>
				<configOption name="send_mky" default="no">
					<since>
						<version>18.22.0</version>
						<version>20.7.0</version>
						<version>21.2.0</version>
					</since>
					<synopsis>Send a media key (mky) grant in the attestation for DTLS calls.
					(not common)</synopsis>
				</configOption>
			</configObject>
			<configObject name="verification">
				<since>
					<version>18.22.0</version>
					<version>20.7.0</version>
					<version>21.2.0</version>
				</since>
				<synopsis>STIR/SHAKEN verification options</synopsis>
				<configOption name="global_disable" default="false">
					<since>
						<version>18.22.0</version>
						<version>20.7.0</version>
						<version>21.2.0</version>
					</since>
					<synopsis>Globally disable verification</synopsis>
				</configOption>
				<configOption name="load_system_certs" default="">
					<since>
						<version>18.22.0</version>
						<version>20.7.0</version>
						<version>21.2.0</version>
					</since>
					<synopsis>A boolean indicating whether trusted CA certificates should be loaded from the system</synopsis>
				</configOption>
				<configOption name="ca_file" default="">
					<since>
						<version>18.22.0</version>
						<version>20.7.0</version>
						<version>21.2.0</version>
					</since>
					<synopsis>Path to a file containing one or more CA certs in PEM format</synopsis>
					<description>
						<para>These certs are used to verify the chain of trust for the
						certificate retrieved from the X5U Identity header parameter.  This
						file must have the root CA certificate, the certificate of the
						issuer of the X5U certificate, and any intermediate certificates
						between them.</para>
						<para>
						See https://docs.asterisk.org/Deployment/STIR-SHAKEN/ for more information.
						</para>
					</description>
				</configOption>
				<configOption name="ca_path" default="">
					<since>
						<version>18.22.0</version>
						<version>20.7.0</version>
						<version>21.2.0</version>
					</since>
					<synopsis>Path to a directory containing one or more hashed CA certs</synopsis>
					<description>
						<xi:include xpointer="xpointer(/docs/configInfo[@name='res_stir_shaken']/configFile[@name='stir_shaken.conf']/configObject[@name='verification']/configOption[@name='ca_file']/description/node())" />
						<para>For this option, the individual certificates must be placed in
						the directory specified and hashed using the <literal>openssl rehash</literal>
						command.</para>
						<para>
						See https://docs.asterisk.org/Deployment/STIR-SHAKEN/ for more information.
						</para>
					</description>
				</configOption>
				<configOption name="crl_file" default="">
					<since>
						<version>18.22.0</version>
						<version>20.7.0</version>
						<version>21.2.0</version>
					</since>
					<synopsis>Path to a file containing one or more CRLs in PEM format</synopsis>
					<description>
						<para>If you with to check if the certificate in the X5U Identity header
						parameter has been revoked, you'll need the certificate revocation
						list generated by the issuer.</para>
						<para>
						See https://docs.asterisk.org/Deployment/STIR-SHAKEN/ for more information.
						</para>
					</description>
				</configOption>
				<configOption name="crl_path" default="">
					<since>
						<version>18.22.0</version>
						<version>20.7.0</version>
						<version>21.2.0</version>
					</since>
					<synopsis>Path to a directory containing one or more hashed CRLs</synopsis>
					<description>
						<xi:include xpointer="xpointer(/docs/configInfo[@name='res_stir_shaken']/configFile[@name='stir_shaken.conf']/configObject[@name='verification']/configOption[@name='crl_file']/description/node())" />
						<para>For this option, the individual CRLs must be placed in
						the directory specified and hashed using the <literal>openssl rehash</literal>
						command.</para>
						<para>
						See https://docs.asterisk.org/Deployment/STIR-SHAKEN/ for more information.
						</para>
					</description>
				</configOption>
				<configOption name="untrusted_cert_file" default="">
					<since>
						<version>18.22.0</version>
						<version>20.7.0</version>
						<version>21.2.0</version>
					</since>
					<synopsis>Path to a file containing one or more untrusted cert in PEM format used to verify CRLs</synopsis>
					<description>
					<para>If you with to check if the certificate in the X5U Identity header
					parameter has been revoked, you'll need the certificate revocation
					list generated by the issuer.  Unfortunately, sometimes the CRLs are signed by a
					different CA than the certificate being verified.  In this case, you
					may need to provide the untrusted certificate to verify the CRL.</para>
					<para>
					See https://docs.asterisk.org/Deployment/STIR-SHAKEN/ for more information.
					</para>
					</description>
				</configOption>
				<configOption name="untrusted_cert_path" default="">
					<since>
						<version>18.22.0</version>
						<version>20.7.0</version>
						<version>21.2.0</version>
					</since>
					<synopsis>Path to a directory containing one or more hashed untrusted certs used to verify CRLs</synopsis>
					<description>
						<xi:include xpointer="xpointer(/docs/configInfo[@name='res_stir_shaken']/configFile[@name='stir_shaken.conf']/configObject[@name='verification']/configOption[@name='untrusted_cert_file']/description/node())" />
						<para>For this option, the individual certificates must be placed in
						the directory specified and hashed using the <literal>openssl rehash</literal>
						command.</para>
						<para>
						See https://docs.asterisk.org/Deployment/STIR-SHAKEN/ for more information.
						</para>
					</description>
				</configOption>
				<configOption name="cert_cache_dir" default="">
					<since>
						<version>18.22.0</version>
						<version>20.7.0</version>
						<version>21.2.0</version>
					</since>
					<synopsis>Directory to cache retrieved verification certs</synopsis>
				</configOption>
				<configOption name="curl_timeout" default="2">
					<since>
						<version>18.22.0</version>
						<version>20.7.0</version>
						<version>21.2.0</version>
					</since>
					<synopsis>Maximum time to wait to CURL certificates</synopsis>
				</configOption>
				<configOption name="max_cache_entry_age" default="60">
					<since>
						<version>18.22.0</version>
						<version>20.7.0</version>
						<version>21.2.0</version>
					</since>
					<synopsis>Number of seconds a cache entry may be behind current time</synopsis>
				</configOption>
				<configOption name="max_cache_size" default="1000">
					<since>
						<version>18.22.0</version>
						<version>20.7.0</version>
						<version>21.2.0</version>
					</since>
					<synopsis>Maximum size to use for caching public keys</synopsis>
				</configOption>
				<configOption name="max_iat_age" default="15">
					<since>
						<version>18.22.0</version>
						<version>20.7.0</version>
						<version>21.2.0</version>
					</since>
					<synopsis>Number of seconds an iat grant may be behind current time</synopsis>
				</configOption>
				<configOption name="max_date_header_age" default="15">
					<since>
						<version>18.22.0</version>
						<version>20.7.0</version>
						<version>21.2.0</version>
					</since>
					<synopsis>Number of seconds a SIP Date header may be behind current time</synopsis>
				</configOption>
				<configOption name="failure_action" default="continue">
					<since>
						<version>18.22.0</version>
						<version>20.7.0</version>
						<version>21.2.0</version>
					</since>
					<synopsis>The default failure action when not set on a profile</synopsis>
					<description>
						<enumlist>
							<enum name="continue">
							<para>If set to <literal>continue</literal>, continue and let
							the dialplan decide what action to take.</para>
							</enum>
							<enum name="reject_request">
							<para>If set to <literal>reject_request</literal>, reject the incoming
							request with response codes defined in RFC8224.
							</para>
							</enum>
							<enum name="continue_return_reason">
							<para>If set to <literal>return_reason</literal>, continue to the
							dialplan but add a <literal>Reason</literal> header to the sender in
							the next provisional response.</para>
							</enum>
						</enumlist>
					</description>
				</configOption>
				<configOption name="use_rfc9410_responses" default="no">
					<since>
						<version>18.22.0</version>
						<version>20.7.0</version>
						<version>21.2.0</version>
					</since>
					<synopsis>RFC9410 uses the STIR protocol on Reason headers
					instead of the SIP protocol</synopsis>
				</configOption>
				<configOption name="ignore_sip_date_header" default="no">
					<since>
						<version>20.15.0</version>
						<version>21.10.0</version>
						<version>22.5.0</version>
					</since>
					<synopsis>When set to true, will cause the verification process to not consider a
						missing or invalid SIP "Date" header to be a failure.  This will make the
						IAT the sole "truth" for Date in the verification process.</synopsis>
				</configOption>
				<configOption name="relax_x5u_port_scheme_restrictions" default="no">
					<since>
						<version>18.22.0</version>
						<version>20.7.0</version>
						<version>21.2.0</version>
					</since>
					<synopsis>Relaxes check for "https" and port 443 or 8443
					in incoming Identity header x5u URLs.</synopsis>
				</configOption>
				<configOption name="relax_x5u_path_restrictions" default="no">
					<since>
						<version>18.22.0</version>
						<version>20.7.0</version>
						<version>21.2.0</version>
					</since>
					<synopsis>Relaxes check for query parameters, user/password, etc.
					in incoming Identity header x5u URLs.</synopsis>
				</configOption>
				<configOption name="x5u_acl" default="">
					<since>
						<version>18.22.0</version>
						<version>20.7.0</version>
						<version>21.2.0</version>
					</since>
					<synopsis>An existing ACL from acl.conf to use when checking
					hostnames in incoming Identity header x5u URLs.</synopsis>
				</configOption>
				<configOption name="x5u_permit" default="">
					<since>
						<version>18.22.0</version>
						<version>20.7.0</version>
						<version>21.2.0</version>
					</since>
					<synopsis>An IP or subnet to permit when checking
					hostnames in incoming Identity header x5u URLs.</synopsis>
				</configOption>
				<configOption name="x5u_deny" default="">
					<since>
						<version>18.22.0</version>
						<version>20.7.0</version>
						<version>21.2.0</version>
					</since>
					<synopsis>An IP or subnet to deny  checking
					hostnames in incoming Identity header x5u URLs.</synopsis>
				</configOption>
			</configObject>
			<configObject name="profile">
				<since>
					<version>18.22.0</version>
					<version>20.7.0</version>
					<version>21.2.0</version>
				</since>
				<synopsis>STIR/SHAKEN profile configuration options</synopsis>
				<configOption name="type">
					<since>
						<version>18.22.0</version>
						<version>20.7.0</version>
						<version>21.2.0</version>
					</since>
					<synopsis>Must be of type 'profile'.</synopsis>
				</configOption>
				<xi:include xpointer="xpointer(/docs/configInfo[@name='res_stir_shaken']/configFile[@name='stir_shaken.conf']/configObject[@name='verification']/configOption[@name='load_system_certs'])" />
				<xi:include xpointer="xpointer(/docs/configInfo[@name='res_stir_shaken']/configFile[@name='stir_shaken.conf']/configObject[@name='verification']/configOption[@name='ca_file'])" />
				<xi:include xpointer="xpointer(/docs/configInfo[@name='res_stir_shaken']/configFile[@name='stir_shaken.conf']/configObject[@name='verification']/configOption[@name='ca_path'])" />
				<xi:include xpointer="xpointer(/docs/configInfo[@name='res_stir_shaken']/configFile[@name='stir_shaken.conf']/configObject[@name='verification']/configOption[@name='crl_file'])" />
				<xi:include xpointer="xpointer(/docs/configInfo[@name='res_stir_shaken']/configFile[@name='stir_shaken.conf']/configObject[@name='verification']/configOption[@name='crl_path'])" />
				<xi:include xpointer="xpointer(/docs/configInfo[@name='res_stir_shaken']/configFile[@name='stir_shaken.conf']/configObject[@name='verification']/configOption[@name='untrusted_cert_file'])" />
				<xi:include xpointer="xpointer(/docs/configInfo[@name='res_stir_shaken']/configFile[@name='stir_shaken.conf']/configObject[@name='verification']/configOption[@name='untrusted_cert_path'])" />
				<xi:include xpointer="xpointer(/docs/configInfo[@name='res_stir_shaken']/configFile[@name='stir_shaken.conf']/configObject[@name='verification']/configOption[@name='cert_cache_dir'])" />
				<xi:include xpointer="xpointer(/docs/configInfo[@name='res_stir_shaken']/configFile[@name='stir_shaken.conf']/configObject[@name='verification']/configOption[@name='curl_timeout'])" />
				<xi:include xpointer="xpointer(/docs/configInfo[@name='res_stir_shaken']/configFile[@name='stir_shaken.conf']/configObject[@name='verification']/configOption[@name='max_iat_age'])" />
				<xi:include xpointer="xpointer(/docs/configInfo[@name='res_stir_shaken']/configFile[@name='stir_shaken.conf']/configObject[@name='verification']/configOption[@name='max_date_header_age'])" />
				<xi:include xpointer="xpointer(/docs/configInfo[@name='res_stir_shaken']/configFile[@name='stir_shaken.conf']/configObject[@name='verification']/configOption[@name='ignore_sip_date_header'])" />
				<xi:include xpointer="xpointer(/docs/configInfo[@name='res_stir_shaken']/configFile[@name='stir_shaken.conf']/configObject[@name='verification']/configOption[@name='max_cache_entry_age'])" />
				<xi:include xpointer="xpointer(/docs/configInfo[@name='res_stir_shaken']/configFile[@name='stir_shaken.conf']/configObject[@name='verification']/configOption[@name='max_cache_size'])" />
				<xi:include xpointer="xpointer(/docs/configInfo[@name='res_stir_shaken']/configFile[@name='stir_shaken.conf']/configObject[@name='verification']/configOption[@name='failure_action'])" />
				<xi:include xpointer="xpointer(/docs/configInfo[@name='res_stir_shaken']/configFile[@name='stir_shaken.conf']/configObject[@name='verification']/configOption[@name='use_rfc9410_responses'])" />
				<xi:include xpointer="xpointer(/docs/configInfo[@name='res_stir_shaken']/configFile[@name='stir_shaken.conf']/configObject[@name='verification']/configOption[@name='relax_x5u_port_scheme_restrictions'])" />
				<xi:include xpointer="xpointer(/docs/configInfo[@name='res_stir_shaken']/configFile[@name='stir_shaken.conf']/configObject[@name='verification']/configOption[@name='relax_x5u_path_restrictions'])" />
				<xi:include xpointer="xpointer(/docs/configInfo[@name='res_stir_shaken']/configFile[@name='stir_shaken.conf']/configObject[@name='verification']/configOption[@name='x5u_acl'])" />
				<xi:include xpointer="xpointer(/docs/configInfo[@name='res_stir_shaken']/configFile[@name='stir_shaken.conf']/configObject[@name='verification']/configOption[@name='x5u_permit'])" />
				<xi:include xpointer="xpointer(/docs/configInfo[@name='res_stir_shaken']/configFile[@name='stir_shaken.conf']/configObject[@name='verification']/configOption[@name='x5u_deny'])" />
				<xi:include xpointer="xpointer(/docs/configInfo[@name='res_stir_shaken']/configFile[@name='stir_shaken.conf']/configObject[@name='attestation']/configOption[@name='check_tn_cert_public_url'])" />
				<xi:include xpointer="xpointer(/docs/configInfo[@name='res_stir_shaken']/configFile[@name='stir_shaken.conf']/configObject[@name='attestation']/configOption[@name='private_key_file'])" />
				<xi:include xpointer="xpointer(/docs/configInfo[@name='res_stir_shaken']/configFile[@name='stir_shaken.conf']/configObject[@name='attestation']/configOption[@name='public_cert_url'])" />
				<xi:include xpointer="xpointer(/docs/configInfo[@name='res_stir_shaken']/configFile[@name='stir_shaken.conf']/configObject[@name='attestation']/configOption[@name='attest_level'])" />
				<xi:include xpointer="xpointer(/docs/configInfo[@name='res_stir_shaken']/configFile[@name='stir_shaken.conf']/configObject[@name='attestation']/configOption[@name='unknown_tn_attest_level'])" />
				<xi:include xpointer="xpointer(/docs/configInfo[@name='res_stir_shaken']/configFile[@name='stir_shaken.conf']/configObject[@name='attestation']/configOption[@name='send_mky'])" />
				<configOption name="endpoint_behavior" default="off">
					<since>
						<version>18.22.0</version>
						<version>20.7.0</version>
						<version>21.2.0</version>
					</since>
					<synopsis>Actions performed when an endpoint references this profile</synopsis>
					<description>
						<enumlist>
							<enum name="off">
							<para>Don't do any STIR/SHAKEN processing.</para>
							</enum>
							<enum name="attest">
							<para>Attest on outgoing calls.</para>
							</enum>
							<enum name="verify">
							<para>Verify incoming calls.</para>
							</enum>
							<enum name="on">
							<para>Attest outgoing calls and verify incoming calls.</para>
							</enum>
						</enumlist>
					</description>
				</configOption>
			</configObject>
		</configFile>
	</configInfo>
	<function name="STIR_SHAKEN" language="en_US" module="res_stir_shaken">
		<since>
			<version>16.15.0</version>
		</since>
		<synopsis>
			Gets the number of STIR/SHAKEN results or a specific STIR/SHAKEN value from a result on the channel.
		</synopsis>
		<syntax>
			<parameter name="index" required="true">
				<para>The index of the STIR/SHAKEN result to get. If only 'count' is passed in, gets the number of STIR/SHAKEN results instead.</para>
			</parameter>
			<parameter name="value" required="false">
				<para>The value to get from the STIR/SHAKEN result. Only used when an index is passed in (instead of 'count'). Allowable values:</para>
				<enumlist>
					<enum name = "identity" />
					<enum name = "attestation" />
					<enum name = "verify_result" />
				</enumlist>
			</parameter>
		</syntax>
		<description>
			<para>This function will either return the number of STIR/SHAKEN identities, or return information on the specified identity.
			To get the number of identities, just pass 'count' as the only parameter to the function. If you want to get information on a
			specific STIR/SHAKEN identity, you can get the number of identities and then pass an index as the first parameter and one of
			the values you would like to retrieve as the second parameter.
			</para>
			<example title="Get count and retrieve value">
			same => n,NoOp(Number of STIR/SHAKEN identities: ${STIR_SHAKEN(count)})
			same => n,NoOp(Identity ${STIR_SHAKEN(0, identity)} has attestation level ${STIR_SHAKEN(0, attestation)})
			</example>
		</description>
	</function>
	<function name="STIR_SHAKEN_ATTESTATION" language="en_US" module="res_stir_shaken">
		<since>
			<version>20.17.0</version>
			<version>22.7.0</version>
			<version>23.1.0</version>
		</since>
		<synopsis>
			Sets STIR/SHAKEN Attestation parameters on an outgoing channel.
		</synopsis>
		<syntax>
			<parameter name="field" required="true">
				<para>The attestation field to set. Allowable values:</para>
				<enumlist>
					<enum name = "suppress">
					<para>
					When set to <literal>true</literal>, attestation is suppressed
					on the channel regardless of the profile on the endpoint.
					</para>
					</enum>
				</enumlist>
			</parameter>
		</syntax>
		<description>
			<para>When used on an outgoing channel, this function can override the
			profile on an endpoint.  Currently, only the ability to suppress
			attestation is supported.
			</para>
			<para>
			</para>
			<example title="Suppress attestation on an outgoing channel">
			same => n,Set(STIR_SHAKEN_ATTESTATION(suppress)=yes)
			</example>
		</description>
	</function>
<module language="en_US" name="chan_mobile">
	<depend>bluetooth</depend>
	<defaultenabled>no</defaultenabled>
	<support_level>extended</support_level>
</module>
<module language="en_US" name="chan_ooh323">
	<defaultenabled>no</defaultenabled>
	<support_level>extended</support_level>
</module>
<info name="CHANNEL" language="en_US" tech="OOH323" module="chan_ooh323">
	<enumlist>
		<enum name="faxdetect">
			<para>R/W Fax Detect</para>
			<para>Returns 0 or 1</para>
			<para>Write yes or no</para>
		</enum>
		<enum name="t38support">
			<para>R/W t38support</para>
			<para>Returns 0 or 1</para>
			<para>Write yes or no</para>
		</enum>
		<enum name="h323id_url">
			<para>R/O Returns caller URL</para>
			</enum>
		<enum name="caller_h323id">
			<para>R/O Returns caller h323id</para>
		</enum>
		<enum name="caller_dialeddigits">
			<para>R/O Returns caller dialed digits</para>
		</enum>
		<enum name="caller_email">
			<para>R/O Returns caller email</para>
		</enum>
		<enum name="callee_email">
			<para>R/O Returns callee email</para>
		</enum>
		<enum name="callee_dialeddigits">
			<para>R/O Returns callee dialed digits</para>
		</enum>
		<enum name="caller_url">
			<para>R/O Returns caller URL</para>
		</enum>
		<enum name="max_forwards">
			<para>R/W Get or set the maximum number of call forwards for this channel.

			This number describes the number of times a call may be forwarded by this channel
			before the call fails. "Forwards" in this case refers to redirects by phones as well
			as calls to local channels.

			Note that this has no relation to the SIP Max-Forwards header.
			</para>
		</enum>
	</enumlist>
</info>
<module language="en_US" name="format_mp3">
	<defaultenabled>no</defaultenabled>
	<support_level>extended</support_level>
</module>
<module language="en_US" name="res_config_mysql">
	<depend>mysqlclient</depend>
	<defaultenabled>no</defaultenabled>
	<support_level>extended</support_level>
</module>
</docs>
