From 4d1afc66a48c16225df87f4db07379043ec0cba9 Mon Sep 17 00:00:00 2001 From: BarRaider <46548278+BarRaider@users.noreply.github.com> Date: Sun, 12 Apr 2020 20:06:29 -0700 Subject: [PATCH] v1.8 - Midi Support, Hotkeys support, AND/OR support and more... - `AND/OR` support on the Mode1 Check in the `Advanced Toggle`! You can now do things like `Strip[0].Mute AND Strip[1].B2` or `Strip[0].Solo OR Strip[0].B2 OR Strip[1].B1` - Customizable `Long Press` length on the Press/Long-Press action - **Hotkey Support** :star_struck: - All advanced actions now support sending hotkeys to integrate with the :voicemeeter: Macros - **Midi Support** :star_struck: :star_struck: - All advanced actions now support the :voicemeeter: `SendMidi` commands - Support for `\n` (new line) in the Enabled/Disabled Texts --- README.md | 37 +- .../VMAdvancedPTTAction.cs} | 57 ++- .../VMAdvancedPressAction.cs} | 94 ++++- VoiceMeeter/Actions/VMAdvancedToggle.cs | 310 ++++++++++++++ .../VMMicrophoneAction.cs} | 4 +- .../VMModifyAction.cs} | 4 +- VoiceMeeter/HotkeyCommands/HotkeyHandler.cs | 172 ++++++++ .../HotkeyCommands/VirtualKeyCodeContainer.cs | 32 ++ VoiceMeeter/Images/categoryIcon@2x - Copy.png | Bin 4880 -> 0 bytes VoiceMeeter/Images/pluginIcon.png | Bin 6965 -> 5903 bytes VoiceMeeter/Images/pluginIcon@2x.png | Bin 12030 -> 16759 bytes VoiceMeeter/Images/vmTop@2x.png | Bin 0 -> 7825 bytes VoiceMeeter/Midi/MidiCommandHandler.cs | 149 +++++++ VoiceMeeter/Properties/AssemblyInfo.cs | 6 +- .../PropertyInspector/AdvancedKeypress.js | 38 ++ .../{Advanced.html => AdvancedKeypress.html} | 56 ++- .../VoiceMeeter/AdvancedPTT.html | 43 +- .../VoiceMeeter/AdvancedToggle.html | 43 +- .../VoiceMeeter/Microphone.html | 2 +- .../PropertyInspector/VoiceMeeter/Modify.html | 2 +- .../PropertyInspector/jquery-3.3.1.min.js | 2 + .../jquery.highlight-within-textarea.css | 68 ++++ .../jquery.highlight-within-textarea.js | 380 ++++++++++++++++++ VoiceMeeter/PropertyInspector/sdpi.css | 11 + .../PropertyInspector/sdtools.common.js | 55 ++- VoiceMeeter/VMAdvancedToggle.cs | 189 --------- VoiceMeeter/VoiceMeeter.csproj | 50 ++- VoiceMeeter/manifest.json | 10 +- VoiceMeeter/packages.config | 5 +- 29 files changed, 1561 insertions(+), 258 deletions(-) rename VoiceMeeter/{VMAdvancedPTT.cs => Actions/VMAdvancedPTTAction.cs} (69%) rename VoiceMeeter/{VMAdvancedPress.cs => Actions/VMAdvancedPressAction.cs} (60%) create mode 100644 VoiceMeeter/Actions/VMAdvancedToggle.cs rename VoiceMeeter/{VMMicrophone.cs => Actions/VMMicrophoneAction.cs} (97%) rename VoiceMeeter/{VMModify.cs => Actions/VMModifyAction.cs} (97%) create mode 100644 VoiceMeeter/HotkeyCommands/HotkeyHandler.cs create mode 100644 VoiceMeeter/HotkeyCommands/VirtualKeyCodeContainer.cs delete mode 100644 VoiceMeeter/Images/categoryIcon@2x - Copy.png create mode 100644 VoiceMeeter/Images/vmTop@2x.png create mode 100644 VoiceMeeter/Midi/MidiCommandHandler.cs create mode 100644 VoiceMeeter/PropertyInspector/AdvancedKeypress.js rename VoiceMeeter/PropertyInspector/VoiceMeeter/{Advanced.html => AdvancedKeypress.html} (50%) create mode 100644 VoiceMeeter/PropertyInspector/jquery-3.3.1.min.js create mode 100644 VoiceMeeter/PropertyInspector/jquery.highlight-within-textarea.css create mode 100644 VoiceMeeter/PropertyInspector/jquery.highlight-within-textarea.js delete mode 100644 VoiceMeeter/VMAdvancedToggle.cs diff --git a/README.md b/README.md index a47a020..2c506bb 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,14 @@ -# streamdeck-voicemeeter +# Voicemeeter Integration VoiceMeeter integration and live feedback for the Elgato Stream Deck device. -**Author's website and contact information:** [https://barraider.github.io](https://barraider.github.io) +**Author's website and contact information:** [https://barraider.com](https://barraider.com) + +## What's new in v1.8 +- `AND/OR` support on the Mode1 Check in the `Advanced Toggle`! You can now do things like `Strip[0].Mute AND Strip[1].B2` or `Strip[0].Solo OR Strip[0].B2 OR Strip[1].B1` +- Customizable `Long Press` length on the Press/Long-Press action +- **Hotkey Support** :star_struck: - All advanced actions now support sending hotkeys to integrate with the :voicemeeter: Macros +- **Midi Support** :star_struck: :star_struck: - All advanced actions now support the :voicemeeter: `SendMidi` commands +- Support for `\n` (new line) in the Enabled/Disabled Texts ## What's new in 1.7 - VM Advanced actions now support renaming values that show 1 / 0 to a user-defined text (On/Off or Enabled/Disabled, etc.) @@ -19,7 +26,7 @@ https://github.com/BarRaider/streamdeck-voicemeeter/releases/ - See a live indication of the current status on Stream Deck (never forget your microphone on again!) - Can also be used to mute/unmute different Strips/Buses such as Spotify/Background music/etc. - Choose from 4 different icons to display the mute/unmute settings -- **New in v1.0:** You can now choose your own images to display, instead of the 4 pre-defined icons +- Choose your own images to display, instead of the 4 pre-defined icons #### VoiceMeeter Modify Setting - Allows you to easily modify various VoiceMeeter settings @@ -79,26 +86,16 @@ A: Valid values can be found starting on page 9 of VoiceMeeter API PDF: https:// Q: Can I make the title multi-line? A: Yes, write `\n` in the `Title Prefix` parameter to add lines -## Dependencies -This plugin uses the [StreamDeck-Tools](https://github.com/BarRaider/streamdeck-tools) v2.0 +### Download -## How do I get started using it? -Install by clicking the com.barraider.voicemeeter.streamDeckPlugin file in the Releases folder: -https://github.com/BarRaider/streamdeck-voicemeeter/releases +* [Download plugin](https://github.com/BarRaider/streamdeck-voicemeeter/releases/) ## I found a bug, who do I contact? -For support please contact the developer. Contact information is available at https://barraider.github.io +For support please contact the developer. Contact information is available at https://barraider.com ## I have a feature request, who do I contact? -Please contact the developer. Contact information is available at https://barraider.github.io - -## License -MIT License - -Copyright (c) 2019 +Please contact the developer. Contact information is available at https://barraider.com -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +## Dependencies +* Uses StreamDeck-Tools by BarRaider: [![NuGet](https://img.shields.io/nuget/v/streamdeck-tools.svg?style=flat)](https://www.nuget.org/packages/streamdeck-tools) +* Uses [Easy-PI](https://github.com/BarRaider/streamdeck-easypi) by BarRaider - Provides seamless integration with the Stream Deck PI (Property Inspector) \ No newline at end of file diff --git a/VoiceMeeter/VMAdvancedPTT.cs b/VoiceMeeter/Actions/VMAdvancedPTTAction.cs similarity index 69% rename from VoiceMeeter/VMAdvancedPTT.cs rename to VoiceMeeter/Actions/VMAdvancedPTTAction.cs index d31dbdb..d25da72 100644 --- a/VoiceMeeter/VMAdvancedPTT.cs +++ b/VoiceMeeter/Actions/VMAdvancedPTTAction.cs @@ -1,4 +1,5 @@ using BarRaider.SdTools; +using HotkeyCommands; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System; @@ -6,11 +7,12 @@ using System.Linq; using System.Text; using System.Threading.Tasks; +using VoiceMeeter.Midi; namespace VoiceMeeter { [PluginActionId("com.barraider.vmadvancedptt")] - public class VMAdvancedPTT : PluginBase + public class VMAdvancedPTTAction : PluginBase { private class PluginSettings { @@ -50,6 +52,18 @@ public static PluginSettings CreateDefaultSettings() [JsonProperty(PropertyName = "disabledText")] public string DisabledText { get; set; } + + [JsonProperty(PropertyName = "keypressHotkey")] + public string KeypressHotkey { get; set; } + + [JsonProperty(PropertyName = "keypressMidi")] + public string KeypressMidi { get; set; } + + [JsonProperty(PropertyName = "releaseHotkey")] + public string ReleaseHotkey { get; set; } + + [JsonProperty(PropertyName = "releaseMidi")] + public string ReleaseMidi { get; set; } } #region Private members @@ -60,7 +74,7 @@ public static PluginSettings CreateDefaultSettings() #region Public Methods - public VMAdvancedPTT(SDConnection connection, InitialPayload payload) : base(connection, payload) + public VMAdvancedPTTAction(SDConnection connection, InitialPayload payload) : base(connection, payload) { if (payload.Settings == null || payload.Settings.Count == 0) { @@ -71,6 +85,7 @@ public VMAdvancedPTT(SDConnection connection, InitialPayload payload) : base(con { this.settings = payload.Settings.ToObject(); } + InitializeSettings(); } public async override void KeyPressed(KeyPayload payload) @@ -85,6 +100,12 @@ public async override void KeyPressed(KeyPayload payload) { VMManager.Instance.SetParameters(settings.KeyPressValue); } + MidiCommandHandler.HandleMidiParameters(settings.KeypressMidi); + + if (!String.IsNullOrEmpty(settings.KeypressHotkey)) + { + HotkeyHandler.RunHotkey(settings.KeypressHotkey); + } } public override void KeyReleased(KeyPayload payload) @@ -93,6 +114,12 @@ public override void KeyReleased(KeyPayload payload) { VMManager.Instance.SetParameters(settings.KeyReleaseValue); } + MidiCommandHandler.HandleMidiParameters(settings.ReleaseMidi); + + if (!String.IsNullOrEmpty(settings.ReleaseHotkey)) + { + HotkeyHandler.RunHotkey(settings.ReleaseHotkey); + } } public async override void OnTick() @@ -127,8 +154,8 @@ public async override void OnTick() public override void ReceivedSettings(ReceivedSettingsPayload payload) { - // New in StreamDeck-Tools v2.0: Tools.AutoPopulateSettings(settings, payload.Settings); + InitializeSettings(); Logger.Instance.LogMessage(TracingLevel.INFO, $"Settings loaded: {payload.Settings}"); } @@ -140,5 +167,29 @@ public override void Dispose() } #endregion + + #region Private Methods + + private void InitializeSettings() + { + string keypressHotkey = HotkeyHandler.ParseKeystroke(settings.KeypressHotkey); + string releaseHotkey = HotkeyHandler.ParseKeystroke(settings.ReleaseHotkey); + + // If the parsed hotkey is different than what the user inputed, overwrite the user input + // because it's invalid + if (keypressHotkey != settings.KeypressHotkey || releaseHotkey != settings.ReleaseHotkey) + { + settings.KeypressHotkey = keypressHotkey; + settings.ReleaseHotkey = releaseHotkey; + SaveSettings(); + } + } + + private Task SaveSettings() + { + return Connection.SetSettingsAsync(JObject.FromObject(settings)); + } + + #endregion } } diff --git a/VoiceMeeter/VMAdvancedPress.cs b/VoiceMeeter/Actions/VMAdvancedPressAction.cs similarity index 60% rename from VoiceMeeter/VMAdvancedPress.cs rename to VoiceMeeter/Actions/VMAdvancedPressAction.cs index 299abcd..5258e7c 100644 --- a/VoiceMeeter/VMAdvancedPress.cs +++ b/VoiceMeeter/Actions/VMAdvancedPressAction.cs @@ -1,4 +1,5 @@ using BarRaider.SdTools; +using HotkeyCommands; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System; @@ -6,11 +7,12 @@ using System.Linq; using System.Text; using System.Threading.Tasks; +using VoiceMeeter.Midi; namespace VoiceMeeter { [PluginActionId("com.barraider.vmadvanced")] - class VMAdvancedPress : PluginBase + class VMAdvancedPressAction : PluginBase { private class PluginSettings { @@ -24,7 +26,12 @@ public static PluginSettings CreateDefaultSettings() TitleParam = String.Empty, TitlePrefix = String.Empty, EnabledText = String.Empty, - DisabledText = String.Empty + DisabledText = String.Empty, + KeypressHotkey = String.Empty, + KeypressMidi = String.Empty, + LongHotkey = String.Empty, + LongMidi = String.Empty, + LongKeypressTime = LONG_KEYPRESS_LENGTH_MS.ToString() }; return instance; @@ -50,22 +57,39 @@ public static PluginSettings CreateDefaultSettings() [JsonProperty(PropertyName = "disabledText")] public string DisabledText { get; set; } + + [JsonProperty(PropertyName = "keypressHotkey")] + public string KeypressHotkey { get; set; } + + [JsonProperty(PropertyName = "keypressMidi")] + public string KeypressMidi { get; set; } + + [JsonProperty(PropertyName = "longHotkey")] + public string LongHotkey { get; set; } + + [JsonProperty(PropertyName = "longMidi")] + public string LongMidi { get; set; } + + [JsonProperty(PropertyName = "longKeypressTime")] + public string LongKeypressTime { get; set; } } #region Private members - private const int LONG_KEYPRESS_LENGTH = 1; + private const int LONG_KEYPRESS_LENGTH_MS = 600; private readonly PluginSettings settings; private bool keyPressed = false; private bool longKeyPressed = false; private DateTime keyPressStart; + private int longKeypressTime = LONG_KEYPRESS_LENGTH_MS; + private readonly System.Timers.Timer tmrRunLongPress = new System.Timers.Timer(); #endregion #region Public Methods - public VMAdvancedPress(SDConnection connection, InitialPayload payload) : base(connection, payload) + public VMAdvancedPressAction(SDConnection connection, InitialPayload payload) : base(connection, payload) { if (payload.Settings == null || payload.Settings.Count == 0) { @@ -76,6 +100,14 @@ public VMAdvancedPress(SDConnection connection, InitialPayload payload) : base(c { this.settings = payload.Settings.ToObject(); } + tmrRunLongPress.Elapsed += TmrRunLongPress_Elapsed; + + InitializeSettings(); + } + + private void TmrRunLongPress_Elapsed(object sender, System.Timers.ElapsedEventArgs e) + { + LongKeyPressed(); } public void LongKeyPressed() @@ -85,6 +117,12 @@ public void LongKeyPressed() { VMManager.Instance.SetParameters(settings.LongPressValue); } + MidiCommandHandler.HandleMidiParameters(settings.LongMidi); + + if (!String.IsNullOrEmpty(settings.LongHotkey)) + { + HotkeyHandler.RunHotkey(settings.LongHotkey); + } } #endregion @@ -93,8 +131,8 @@ public void LongKeyPressed() public override void ReceivedSettings(ReceivedSettingsPayload payload) { - // New in StreamDeck-Tools v2.0: Tools.AutoPopulateSettings(settings, payload.Settings); + InitializeSettings(); Logger.Instance.LogMessage(TracingLevel.INFO, $"Settings loaded: {payload.Settings}"); } @@ -110,15 +148,24 @@ public async override void KeyPressed(KeyPayload payload) await Connection.ShowAlert(); return; } + + tmrRunLongPress.Interval = longKeypressTime > 0 ? longKeypressTime : LONG_KEYPRESS_LENGTH_MS; + tmrRunLongPress.Start(); } public override void KeyReleased(KeyPayload payload) { keyPressed = false; + tmrRunLongPress.Stop(); if (!longKeyPressed && !String.IsNullOrEmpty(settings.SetValue)) { VMManager.Instance.SetParameters(settings.SetValue); + MidiCommandHandler.HandleMidiParameters(settings.KeypressMidi); + if (!String.IsNullOrEmpty(settings.KeypressHotkey)) + { + HotkeyHandler.RunHotkey(settings.KeypressHotkey); + } } } @@ -130,13 +177,6 @@ public async override void OnTick() return; } - // Stream Deck calls this function every second, - // so this is the best place to determine if we need to call the long keypress - if (!String.IsNullOrEmpty(settings.LongPressValue) && keyPressed && (DateTime.Now - keyPressStart).TotalSeconds >= LONG_KEYPRESS_LENGTH) - { - LongKeyPressed(); - } - if (settings.TitleType == TitleTypeEnum.VMLive && !String.IsNullOrEmpty(settings.TitleParam)) { string prefix = String.Empty; @@ -167,5 +207,35 @@ public override void Dispose() public override void ReceivedGlobalSettings(ReceivedGlobalSettingsPayload payload) { } #endregion + + #region Private Methods + + private void InitializeSettings() + { + string keypressHotkey = HotkeyHandler.ParseKeystroke(settings.KeypressHotkey); + string longHotkey = HotkeyHandler.ParseKeystroke(settings.LongHotkey); + + // If the parsed hotkey is different than what the user inputed, overwrite the user input + // because it's invalid + if (keypressHotkey != settings.KeypressHotkey || longHotkey != settings.LongHotkey) + { + settings.KeypressHotkey = keypressHotkey; + settings.LongHotkey = longHotkey; + SaveSettings(); + } + + if (!Int32.TryParse(settings.LongKeypressTime, out longKeypressTime)) + { + settings.LongKeypressTime = LONG_KEYPRESS_LENGTH_MS.ToString(); + SaveSettings(); + } + } + + private Task SaveSettings() + { + return Connection.SetSettingsAsync(JObject.FromObject(settings)); + } + + #endregion } } diff --git a/VoiceMeeter/Actions/VMAdvancedToggle.cs b/VoiceMeeter/Actions/VMAdvancedToggle.cs new file mode 100644 index 0000000..fcdb20e --- /dev/null +++ b/VoiceMeeter/Actions/VMAdvancedToggle.cs @@ -0,0 +1,310 @@ +using BarRaider.SdTools; +using HotkeyCommands; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using VoiceMeeter.Midi; +using WindowsInput.Native; + +namespace VoiceMeeter +{ + //--------------------------------------------------- + // BarRaider's Hall Of Fame + // Subscriber: Vedeksu GIFTED SUB X8!!! + // 1700 Bits: Vedeksu + // 1500 Bits: ovpx + // 750 Bits: fragglerocket + // Subscriber: fragglerocket + // Subscriber: CyberlightGames gifted sub + // Subscriber: icessassin gifted sub x3 + // 300 Bits: iiRoco + // Subscriber: brandoncc2 x2 Gifted subs + //--------------------------------------------------- + [PluginActionId("com.barraider.vmadvancedtoggle")] + class VMAdvancedToggleAction : PluginBase + { + private class PluginSettings + { + public static PluginSettings CreateDefaultSettings() + { + PluginSettings instance = new PluginSettings + { + Mode1Value = String.Empty, + Mode1Param = String.Empty, + Mode2Value = String.Empty, + TitleType = TitleTypeEnum.VMLive, + TitleParam = String.Empty, + UserImage1 = String.Empty, + UserImage2 = String.Empty, + TitlePrefix = String.Empty, + EnabledText = String.Empty, + DisabledText = String.Empty, + Mode1Hotkey = String.Empty, + Mode2Hotkey = String.Empty, + Mode1Midi = String.Empty, + Mode2Midi = String.Empty + }; + + return instance; + } + + [JsonProperty(PropertyName = "mode1Value")] + public string Mode1Value { get; set; } + + [JsonProperty(PropertyName = "mode1Param")] + public string Mode1Param { get; set; } + + [JsonProperty(PropertyName = "mode2Value")] + public string Mode2Value { get; set; } + + [FilenameProperty] + [JsonProperty(PropertyName = "userImage1")] + public string UserImage1 { get; set; } + + [FilenameProperty] + [JsonProperty(PropertyName = "userImage2")] + public string UserImage2 { get; set; } + + [JsonProperty(PropertyName = "titleType")] + public TitleTypeEnum TitleType { get; set; } + + [JsonProperty(PropertyName = "titleParam")] + public string TitleParam { get; set; } + + [JsonProperty(PropertyName = "titlePrefix")] + public string TitlePrefix { get; set; } + + [JsonProperty(PropertyName = "enabledText")] + public string EnabledText { get; set; } + + [JsonProperty(PropertyName = "disabledText")] + public string DisabledText { get; set; } + + [JsonProperty(PropertyName = "mode1Hotkey")] + public string Mode1Hotkey { get; set; } + + [JsonProperty(PropertyName = "mode2Hotkey")] + public string Mode2Hotkey { get; set; } + + [JsonProperty(PropertyName = "mode1Midi")] + public string Mode1Midi { get; set; } + + [JsonProperty(PropertyName = "mode2Midi")] + public string Mode2Midi { get; set; } + } + + #region Private members + private const string LOGICAL_AND = " AND "; + private const string LOGICAL_OR = " OR "; + + private readonly PluginSettings settings; + + #endregion + + #region Public Methods + + public VMAdvancedToggleAction(SDConnection connection, InitialPayload payload) : base(connection, payload) + { + if (payload.Settings == null || payload.Settings.Count == 0) + { + this.settings = PluginSettings.CreateDefaultSettings(); + Connection.SetSettingsAsync(JObject.FromObject(settings)); + } + else + { + this.settings = payload.Settings.ToObject(); + } + InitializeSettings(); + } + + #endregion + + #region IPluginable + + public async override void KeyPressed(KeyPayload payload) + { + if (!VMManager.Instance.IsConnected) + { + await Connection.ShowAlert(); + return; + } + + bool isMode1 = IsMode1(true); + if (isMode1) // Currently in Mode1, so run Mode2 commands + { + if (!String.IsNullOrEmpty(settings.Mode2Value)) + { + VMManager.Instance.SetParameters(settings.Mode2Value); + } + MidiCommandHandler.HandleMidiParameters(settings.Mode2Midi); + + if (!String.IsNullOrEmpty(settings.Mode2Hotkey)) + { + HotkeyHandler.RunHotkey(settings.Mode2Hotkey); + } + } + else // Currently in Mode2, so run Mode1 commands + { + if (!String.IsNullOrEmpty(settings.Mode1Value)) + { + VMManager.Instance.SetParameters(settings.Mode1Value); + } + MidiCommandHandler.HandleMidiParameters(settings.Mode1Midi); + + if (!String.IsNullOrEmpty(settings.Mode1Hotkey)) + { + HotkeyHandler.RunHotkey(settings.Mode1Hotkey); + } + } + } + + public override void KeyReleased(KeyPayload payload) { } + + public async override void OnTick() + { + if (!VMManager.Instance.IsConnected) + { + await Connection.SetImageAsync(Properties.Plugin.Default.VMNotRunning); + return; + } + + // Set the image + if (!String.IsNullOrEmpty(settings.UserImage1) && IsMode1(false)) + { + await Connection.SetImageAsync(Tools.FileToBase64(settings.UserImage1.ToString(), true)); + } + else if (!String.IsNullOrEmpty(settings.UserImage2)) + { + await Connection.SetImageAsync(Tools.FileToBase64(settings.UserImage2.ToString(), true)); + } + + // Set the title + if (settings.TitleType == TitleTypeEnum.VMLive && !String.IsNullOrEmpty(settings.TitleParam)) + { + string prefix = String.Empty; + if (!String.IsNullOrEmpty(settings.TitlePrefix)) + { + prefix = settings.TitlePrefix.Replace(@"\n", "\n"); + } + + string value = VMManager.Instance.GetParam(settings.TitleParam); + if (!String.IsNullOrEmpty(settings.EnabledText) && !String.IsNullOrEmpty(value) && value == Constants.ENABLED_VALUE) + { + value = settings.EnabledText.Replace(@"\n", "\n"); ; + } + else if (!String.IsNullOrEmpty(settings.DisabledText) && !String.IsNullOrEmpty(value) && value == Constants.DISABLED_VALUE) + { + value = settings.DisabledText.Replace(@"\n", "\n"); ; + } + + await Connection.SetTitleAsync($"{prefix}{value}"); + } + } + + public override void Dispose() + { + Logger.Instance.LogMessage(TracingLevel.INFO, "Destructor called"); + } + + public async override void ReceivedSettings(ReceivedSettingsPayload payload) + { + Tools.AutoPopulateSettings(settings, payload.Settings); + Logger.Instance.LogMessage(TracingLevel.INFO, $"Settings loaded: {payload.Settings}"); + + InitializeSettings(); + // Used to return the correct filename back to the Property Inspector + await SaveSettings(); + } + + public override void ReceivedGlobalSettings(ReceivedGlobalSettingsPayload payload) { } + + #endregion + + #region Private Methods + + private bool IsMode1(bool shouldLog) + { + if (String.IsNullOrEmpty(settings.Mode1Param)) + { + return false; + } + + // Support EITHER one, not both + if (settings.Mode1Param.Contains(LOGICAL_AND) && settings.Mode1Param.Contains(LOGICAL_OR)) + { + if (shouldLog) + { + Logger.Instance.LogMessage(TracingLevel.WARN, $"Invalid IsMode1 check - contains *both* AND and OR: {settings.Mode1Param}"); + } + return false; + } + + string[] clauses; + if (settings.Mode1Param.Contains(LOGICAL_AND)) // Contains ANDs + { + clauses = settings.Mode1Param.Split(new string[] { LOGICAL_AND }, StringSplitOptions.RemoveEmptyEntries); + foreach (string clause in clauses) + { + // If even one of them is false, that's enough to return a false + if (!VMManager.Instance.GetParamBool(clause.Trim())) + { + if (shouldLog) + { + Logger.Instance.LogMessage(TracingLevel.INFO, $"Mode1 returned false due to clause: {clause}"); + } + return false; + } + } + return true; + } + else if (settings.Mode1Param.Contains(LOGICAL_OR)) // Contains ORs + { + clauses = settings.Mode1Param.Split(new string[] { LOGICAL_OR }, StringSplitOptions.RemoveEmptyEntries); + foreach (string clause in clauses) + { + // If ANY clause is true, that's enough to return a true + if (VMManager.Instance.GetParamBool(clause.Trim())) + { + if (shouldLog) + { + Logger.Instance.LogMessage(TracingLevel.INFO, $"Mode1 returned true due to clause: {clause}"); + } + return true; + } + } + return false; + } + else // Only one clause + { + return VMManager.Instance.GetParamBool(settings.Mode1Param); + } + + } + + private Task SaveSettings() + { + return Connection.SetSettingsAsync(JObject.FromObject(settings)); + } + + private void InitializeSettings() + { + string mode1Hotkey = HotkeyHandler.ParseKeystroke(settings.Mode1Hotkey); + string mode2Hotkey = HotkeyHandler.ParseKeystroke(settings.Mode2Hotkey); + + // If the parsed hotkey is different than what the user inputed, overwrite the user input + // because it's invalid + if (mode1Hotkey != settings.Mode1Hotkey || mode2Hotkey != settings.Mode2Hotkey) + { + settings.Mode1Hotkey = mode1Hotkey; + settings.Mode2Hotkey = mode2Hotkey; + SaveSettings(); + } + } + + #endregion + } +} diff --git a/VoiceMeeter/VMMicrophone.cs b/VoiceMeeter/Actions/VMMicrophoneAction.cs similarity index 97% rename from VoiceMeeter/VMMicrophone.cs rename to VoiceMeeter/Actions/VMMicrophoneAction.cs index a20c0b7..4339345 100644 --- a/VoiceMeeter/VMMicrophone.cs +++ b/VoiceMeeter/Actions/VMMicrophoneAction.cs @@ -6,7 +6,7 @@ namespace VoiceMeeter { [PluginActionId("com.barraider.vmmicrophone")] - class VMMicrophone : PluginBase + class VMMicrophoneAction : PluginBase { private enum MicTypeEnum { @@ -74,7 +74,7 @@ public static PluginSettings CreateDefaultSettings() #region Public Methods - public VMMicrophone(SDConnection connection, InitialPayload payload) : base(connection, payload) + public VMMicrophoneAction(SDConnection connection, InitialPayload payload) : base(connection, payload) { if (payload.Settings == null || payload.Settings.Count == 0) { diff --git a/VoiceMeeter/VMModify.cs b/VoiceMeeter/Actions/VMModifyAction.cs similarity index 97% rename from VoiceMeeter/VMModify.cs rename to VoiceMeeter/Actions/VMModifyAction.cs index 773b44b..03dff33 100644 --- a/VoiceMeeter/VMModify.cs +++ b/VoiceMeeter/Actions/VMModifyAction.cs @@ -10,7 +10,7 @@ namespace VoiceMeeter { [PluginActionId("com.barraider.vmmodify")] - class VMModify : PluginBase + class VMModifyAction : PluginBase { private enum ParamTypeEnum { @@ -85,7 +85,7 @@ public static PluginSettings CreateDefaultSettings() #region Public Methods - public VMModify(SDConnection connection, InitialPayload payload) : base(connection, payload) + public VMModifyAction(SDConnection connection, InitialPayload payload) : base(connection, payload) { if (payload.Settings == null || payload.Settings.Count == 0) { diff --git a/VoiceMeeter/HotkeyCommands/HotkeyHandler.cs b/VoiceMeeter/HotkeyCommands/HotkeyHandler.cs new file mode 100644 index 0000000..e9a5017 --- /dev/null +++ b/VoiceMeeter/HotkeyCommands/HotkeyHandler.cs @@ -0,0 +1,172 @@ +using BarRaider.SdTools; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading.Tasks; +using WindowsInput.Native; + +namespace HotkeyCommands +{ + public static class HotkeyHandler + { + private const string MACRO_END = "}}"; + private const string REGEX_MACRO = @"^\{(\{[^\{\}]+\})+\}$"; + private const string REGEX_SUB_COMMAND = @"(\{[^\{\}]+\})"; + public static string ParseKeystroke(string keyStroke) + { + if (String.IsNullOrEmpty(keyStroke)) + { + return String.Empty; + } + + // Removed in VoiceMeeter since we expect an actual keystroke/hotkey and not just one character + /* + if (keyStroke.Length == 1) // 1 Character is fine + { + return keyStroke; + }*/ + + string macro = ExtractMacro(keyStroke, 0); + if (string.IsNullOrEmpty(macro)) // Not a macro, save only first character + { + return String.Empty; + } + return macro; + } + + public static void RunHotkey(string hotkey) + { + Logger.Instance.LogMessage(TracingLevel.INFO, $"Simulating hotkey: {hotkey}"); + List keyStrokes = HotkeyHandler.ExtractKeyStrokes(hotkey); + VirtualKeyCodeContainer keyCode = keyStrokes.Last(); + keyStrokes.Remove(keyCode); + + if (keyStrokes.Count > 0) + { + Task.Run(() => SimulateKeyStroke(keyStrokes.Select(ks => ks.KeyCode).ToArray(), keyCode.KeyCode)); + } + } + + private static void SimulateKeyStroke(VirtualKeyCode[] keyStrokes, VirtualKeyCode keyCode) + { + WindowsInput.InputSimulator iis = new WindowsInput.InputSimulator(); + iis.Keyboard.ModifiedKeyStroke(keyStrokes, keyCode); + } + + + internal static List ExtractKeyStrokes(string macroText) + { + List keyStrokes = new List(); + + + try + { + MatchCollection matches = Regex.Matches(macroText, REGEX_SUB_COMMAND); + foreach (var match in matches) + { + string matchText = match.ToString().Replace("{", "").Replace("}", ""); + if (matchText.Length == 1) + { + char code = matchText.ToUpperInvariant()[0]; + keyStrokes.Add(new VirtualKeyCodeContainer((VirtualKeyCode)code)); + } + else + { + VirtualKeyCodeContainer stroke = MacroTextToKeyCode(matchText); + if (stroke != null) + { + keyStrokes.Add(stroke); + } + } + } + } + catch (Exception ex) + { + Logger.Instance.LogMessage(TracingLevel.ERROR, $"ExtractKeyStrokes Exception: {ex}"); + } + + return keyStrokes; + } + + internal static string ExtractMacro(string text, int position) + { + try + { + int endPosition = text.IndexOf(MACRO_END, position); + + // Found an end, let's verify it's actually a macro + if (endPosition > position) + { + // Use Regex to verify it's really a macro + var match = Regex.Match(text.Substring(position, endPosition - position + MACRO_END.Length), REGEX_MACRO); + if (match.Length > 0) + { + return match.Value; + } + } + } + catch (Exception ex) + { + Logger.Instance.LogMessage(TracingLevel.ERROR, $"ExtractMacro Exception: {ex}"); + } + + return null; + } + + private static VirtualKeyCodeContainer MacroTextToKeyCode(string macroText) + { + try + { + string text = ConvertSimilarMacroCommands(macroText.ToUpperInvariant()); + VirtualKeyCode keyCode = (VirtualKeyCode)Enum.Parse(typeof(VirtualKeyCode), text, true); + return new VirtualKeyCodeContainer(keyCode); + } + catch (Exception ex) + { + Logger.Instance.LogMessage(TracingLevel.ERROR, $"MacroTextToInt Exception: {ex}"); + return null; + } + } + + internal static string ConvertSimilarMacroCommands(string macroText) + { + switch (macroText) + { + case "CTRL": + return "CONTROL"; + case "LCTRL": + return "LCONTROL"; + case "RCTRL": + return "RCONTROL"; + case "ALT": + return "MENU"; + case "LALT": + return "LMENU"; + case "RALT": + return "RMENU"; + case "ENTER": + return "RETURN"; + case "BACKSPACE": + return "BACK"; + case "WIN": + return "LWIN"; + case "WINDOWS": + return "LWIN"; + case "PAGEUP": + case "PGUP": + return "PRIOR"; + case "PAGEDOWN": + case "PGDN": + return "NEXT"; + case "BREAK": + return "PAUSE"; + + } + + return macroText; + } + + } +} diff --git a/VoiceMeeter/HotkeyCommands/VirtualKeyCodeContainer.cs b/VoiceMeeter/HotkeyCommands/VirtualKeyCodeContainer.cs new file mode 100644 index 0000000..f170384 --- /dev/null +++ b/VoiceMeeter/HotkeyCommands/VirtualKeyCodeContainer.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using WindowsInput.Native; + +namespace HotkeyCommands +{ + public class VirtualKeyCodeContainer + { + public VirtualKeyCode KeyCode { get; private set; } + public bool IsExtended + { + get + { + return !String.IsNullOrEmpty(ExtendedCommand); + } + } + + public string ExtendedCommand { get; private set; } + + public string ExtendedData { get; private set; } + + public VirtualKeyCodeContainer(VirtualKeyCode keyCode, string extendedCommand = null, string extendedData = null) + { + KeyCode = keyCode; + ExtendedCommand = extendedCommand; + ExtendedData = extendedData; + } + } +} diff --git a/VoiceMeeter/Images/categoryIcon@2x - Copy.png b/VoiceMeeter/Images/categoryIcon@2x - Copy.png deleted file mode 100644 index b87c10249d2c8d53d7d73c505767790f783ac396..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4880 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

rBKGFsnp zJX1$(zYc5%{oqqbD^BIsJHXI!4(vngKZCz=72ZXcA*M#LUONuyHX65n63-Br&-@H? zydQ7lR=nPo$V3d8%%Z<^4C}R{5VKkEt|H|pdVn+&(U?PTl*xbMUJTu)<#*m4rYwqI z_%qD$0aCBNNa@3OQvI#pMVbNC1OG(s4}K3n+e!ZG-zR?mSI|$Np?1eTRBqg6K2 zn8gO3rr|vD9je#=2GtLLgzT5@MAWOy{?YvuKlxegXCB3zoWd$psoZcAmG|F7;%j$f zlnPWn`zN^9e-ykL_Q~U<@B0*5Uq2*UkZs+~G!{YtmV=7K8#)|V}I=T@iuKmJNi7@)DVFt36`x#9~mL`^JftGvG6#( zUZ;5dPIM_TpiJ zjujL?@dYZMxtGcxejV?ejRd7>+}^d+Z~wQ{?)ohCbJrjXV+;2>dW0hHw7)S9t1Kl& zb~urs<%f|i9cY86i9Nn2EF$XT0|>WFuz3fhyU>5~0P)@5g?KALPdoNYM{xE%AGV`4 z)~`o)cVg_{OZr%!>CV$hfDsYcsrA9>34FLRO|4oJhm z@Lhtck8hhu9Sl!p43&dd$FDUAIyw=mw{T(-8H*$17P@BO2@y()r79XdJ@|%=F*b(g zy7+B5M9c|&9$(i9Y9+LC6$683T*;j?QE?Jd^eI=BD%HdMGGJQGG-r2lSfy%YTJfv3SHIcONDSbg-x4r1MC>Wm*`zjcGJvn*GCv%bLzqoK91VOu%+)s)mkC(|q4^j}I`be zn|>3-aL4~e|E?BJDsonMUH7fCLD+kEq;5aLbIeRE$dq*W{t&_W|pej*1b+rA89 znP%5(v+ecGJr|2_|0QGdR>%F4P%HenR)Cql|BI{tKPhs6G`EK92GkoaF~`C*3~Kdy zSeLgg6W8^^N~)<_R-tZ&Q)743W4~}46V<_xwB7uV0U4 z$FNKj$FZ?n(x65gbe-S+@Xh?`mp;e&=dNLNY?2M@*Rt!ryD+5Bvj-0^MM^q)2@+b< ziRa_}2e;gt6&7H(av~!_?UI%?Ehm*~1izWm2js z+|Wa3Gmtu_lfMQh?&3JEfWB$bFG zoFtianzg;%R7=IM-6fSwkj-S!O^3O;eApQucVc9-If~^9`Pl-dZlDW~mXt#(nZ@;8 zY)dDXP19)9$QOzjhQ*4WE-KYJ_k86W^pDSQ<+e-6CatL1i9X$7CNiu$?_7jwF*Gz5 zE}!EkPlYD^%)kh(={RfGtmLvSm(bImV`yZYb*oo#!MZhEwryKDPJZ&#NiI0=93(oA zJ@FLX-JNXNcrL3}tl-@{t|lgYVya11D3pmAN=|fyVT5Coab1!~#?b6!=u9f9iP<{YL=0g$6f0Ho%G8?%mSu!ef^LRW zipmGFV=)T(e7J0dZcwaC(y?ZTbhT2(n;njd6_zC3p}NGT<_iRV5ITRAsu!kFRez#o z7|b>5$eB5ntiZG^bkkz4SY&*14ow6&%KNqx%$3VfbZJSaL+dv*S3+M1bWJsX<}1&- zN-CLVX1*H!uO)o+i1~>eAjL$?j)yZUhI+7)T&U5jnfAcLwvx?fY{;etRDq_QY(Bn7 z%4T<~2pXhg7QVD;cs`~9*>q~*i3%FNrs2zQqBWfDFjUb{Wmg)N$XfxTw_+-_5e@~& za2})Sn`ksy*B4@RJ)F*Iw%$qJTr<|+XsBvh5Y>^knCe&vdxIeSPAojcU@7Whixhoj zHCPx)I_qABkSy+=#mid{|G)KTXFGx7t&UYWp-@_*rRa4~aRSu#YeGs=v%fanL{C{I lL49w>V*>vlq&U#`zX8BNUdsGlX$k-U002ovPDHLkV1jQ-ScL!p literal 6965 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 W1fT5m%Ip*WvE^XvOch!C?feHe4HW1A diff --git a/VoiceMeeter/Images/pluginIcon@2x.png b/VoiceMeeter/Images/pluginIcon@2x.png index 273fb6fcb634cf184a5aca85c71b694e56c7d1f5..0cc5c0161c36e3b4ddb873957cee9bd555ca3f8b 100644 GIT binary patch literal 16759 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 diff --git a/VoiceMeeter/Images/vmTop@2x.png b/VoiceMeeter/Images/vmTop@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..59f7059bf324f9877b60cda402439639afae3822 GIT binary patch literal 7825 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 0) + { + // Extract the midi command from the entire command string + int midiCommandEnd = parameters.IndexOf(')', position); + if (midiCommandEnd < 0) + { + Logger.Instance.LogMessage(TracingLevel.WARN, $"Invalid Midi Command in string: {parameters}"); + return; + } + + // Get all the parameters inside the quotes + int paramsStart = position + MIDI_COMMAND_PREFIX.Length; + string midiCommand = parameters.Substring(paramsStart, midiCommandEnd - paramsStart); + + // Split it out to the various params + string[] commands = midiCommand.Split(','); + if (commands.Length != MIDI_COMMAND_PARAMS_NUM) + { + Logger.Instance.LogMessage(TracingLevel.WARN, $"Invalid Number of Midi params in command: {midiCommand}"); + return; + } + + // Trim the commands + for (int idx = 0; idx < commands.Length; idx++) + { + commands[idx] = commands[idx].Trim(); + } + + MidiCommandHandler.HandleMidiRequest(commands[0], commands[1], commands[2], commands[3], commands[4]); + searchStart = midiCommandEnd; + + // Continue the while loop until all midi commands have been dealt with + position = parameters.IndexOf(MIDI_COMMAND_PREFIX, searchStart); + } + } + } + + public static void HandleMidiRequest(string deviceName, string commandType, string channel, string key, string value) + { + if (!Int32.TryParse(channel, out int channelId)) + { + Logger.Instance.LogMessage(TracingLevel.ERROR, $"HandleMidiRequest called but invalid value for channel {channel}"); + // TODO: Write an error log + return; + } + + if (channelId < 0 || channelId > 15) + { + Logger.Instance.LogMessage(TracingLevel.ERROR, $"HandleMidiRequest called but invalid value for channelId {channelId}"); + return; + } + + // We need to reduce one from channelId because channel1 is actually a value of 0 + channelId--; + + if (!Int32.TryParse(key, out int keyId)) + { + Logger.Instance.LogMessage(TracingLevel.ERROR, $"HandleMidiRequest called but invalid value for key {key}"); + return; + } + + if (keyId < 0 || keyId > 127) + { + Logger.Instance.LogMessage(TracingLevel.ERROR, $"HandleMidiRequest called but invalid value for keyId {keyId}"); + return; + } + + if (!Int32.TryParse(value, out int valueId)) + { + Logger.Instance.LogMessage(TracingLevel.ERROR, $"HandleMidiRequest called but invalid value for value {value}"); + return; + } + + if (valueId < 0 || valueId > 127) + { + Logger.Instance.LogMessage(TracingLevel.ERROR, $"HandleMidiRequest called but invalid value for valueId {valueId}"); + return; + } + + var device = GetOutputDevice(deviceName); + + if (device == null) + { + Logger.Instance.LogMessage(TracingLevel.ERROR, $"HandleMidiRequest called but could not determine output device named: {deviceName}"); + return; + } + var outputDevice = device.CreateDevice(); + outputDevice.Open(); + + Logger.Instance.LogMessage(TracingLevel.INFO, $"HandleMidiRequest called for {commandType} with values Channel: {channelId} Key: {keyId} Value: {valueId}"); + // Create the correct command to send the midi device + switch (commandType.ToLowerInvariant()) + { + case ("note-on"): + outputDevice.Send(new RtMidi.Core.Messages.NoteOnMessage((Channel)channelId, (Key)keyId, valueId)); + break; + case ("note-off"): + outputDevice.Send(new RtMidi.Core.Messages.NoteOffMessage((Channel)channelId, (Key)keyId, valueId)); + break; + case ("ctrl-change"): + outputDevice.Send(new RtMidi.Core.Messages.ControlChangeMessage((Channel)channelId, keyId, valueId)); + break; + default: + Logger.Instance.LogMessage(TracingLevel.ERROR, $"HandleMidiRequest called but invalid command: {commandType}"); + break; + } + } + + private static IMidiOutputDeviceInfo GetOutputDevice(string deviceName) + { + if (String.IsNullOrEmpty(deviceName)) + { + return null; + } + + deviceName = deviceName.ToLowerInvariant(); + return MidiDeviceManager.Default.OutputDevices.Where(d => d.Name.ToLowerInvariant().Contains(deviceName)).FirstOrDefault(); + } + } +} diff --git a/VoiceMeeter/Properties/AssemblyInfo.cs b/VoiceMeeter/Properties/AssemblyInfo.cs index be8b486..2a91563 100644 --- a/VoiceMeeter/Properties/AssemblyInfo.cs +++ b/VoiceMeeter/Properties/AssemblyInfo.cs @@ -5,12 +5,12 @@ // General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information // associated with an assembly. -[assembly: AssemblyTitle("com.barraider.voicemeeter.sdPlugin")] +[assembly: AssemblyTitle("com.barraider.voicemeeter")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("com.barraider.voicemeeter.sdPlugin")] -[assembly: AssemblyCopyright("Copyright © 2019")] +[assembly: AssemblyProduct("com.barraider.voicemeeter")] +[assembly: AssemblyCopyright("Copyright © 2020")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] diff --git a/VoiceMeeter/PropertyInspector/AdvancedKeypress.js b/VoiceMeeter/PropertyInspector/AdvancedKeypress.js new file mode 100644 index 0000000..fb28a9d --- /dev/null +++ b/VoiceMeeter/PropertyInspector/AdvancedKeypress.js @@ -0,0 +1,38 @@ +document.addEventListener('websocketCreate', function () { + console.log("Websocket created!"); + checkSettings(actionInfo.payload.settings); + window.setTimeout(updateLongKeypressLabel, 500); + + websocket.addEventListener('message', function (event) { + console.log("Got message event!"); + + // Received message from Stream Deck + var jsonObj = JSON.parse(event.data); + + if (jsonObj.event === 'sendToPropertyInspector') { + var payload = jsonObj.payload; + checkSettings(payload); + } + else if (jsonObj.event === 'didReceiveSettings') { + var payload = jsonObj.payload; + checkSettings(payload.settings); + } + window.setTimeout(updateLongKeypressLabel, 500); + }); +}); + +document.addEventListener('settingsUpdated', function (event) { + console.log("Got settingsUpdated event!"); + window.setTimeout(updateLongKeypressLabel, 500); +}) + +function checkSettings(payload) { + console.log("Checking Settings"); +} + +function updateLongKeypressLabel() { + var longKeypressTimeTitle = document.getElementById('longKeypressTimeTitle'); + var longKeypressTime = document.getElementById('longKeypressTime'); + + longKeypressTimeTitle.innerText = "Long Keypress Time: " + longKeypressTime.value + " ms"; +} diff --git a/VoiceMeeter/PropertyInspector/VoiceMeeter/Advanced.html b/VoiceMeeter/PropertyInspector/VoiceMeeter/AdvancedKeypress.html similarity index 50% rename from VoiceMeeter/PropertyInspector/VoiceMeeter/Advanced.html rename to VoiceMeeter/PropertyInspector/VoiceMeeter/AdvancedKeypress.html index f39724e..18466bf 100644 --- a/VoiceMeeter/PropertyInspector/VoiceMeeter/Advanced.html +++ b/VoiceMeeter/PropertyInspector/VoiceMeeter/AdvancedKeypress.html @@ -7,6 +7,11 @@ BarRaider's VoiceMeeter Plugin + + + + +

@@ -21,13 +26,60 @@

-
Key Press
+
Keypress
+
+
Keypress Send Hotkey
+ + + +
+ +
+
Keypress Midi
+ +
-
Long-Press
+
Long Keypress
+
+
Long Keypress Time
+
+ 150 + + 1000 + + + +
+
+
+
Long Send Hotkey
+ + + +
+ +
+
Longpress Midi
+ +
Title
+
+
Keypress Send Hotkey
+ + + +
+ +
+
Keypress Midi
+ +
Key Release
+
+
Release Send Hotkey
+ + + +
+ +
+
Release Midi
+ +
Title
- diff --git a/VoiceMeeter/PropertyInspector/VoiceMeeter/AdvancedToggle.html b/VoiceMeeter/PropertyInspector/VoiceMeeter/AdvancedToggle.html index 866b22a..c2c194b 100644 --- a/VoiceMeeter/PropertyInspector/VoiceMeeter/AdvancedToggle.html +++ b/VoiceMeeter/PropertyInspector/VoiceMeeter/AdvancedToggle.html @@ -7,6 +7,10 @@ BarRaider's VoiceMeeter Plugin + + + +
@@ -19,6 +23,7 @@ Example: Lets use Mode1 to turn Mono on (and do aditional things): "Strip[0].mono=1;Bus[2].Gain=-20;"
Now "Mode1 Check" should be: "Strip[0].mono"
Mode2 should turn mono Off: "Strip[0].mono=0;Bus[2].Gain=-10;..."

+ * NEW: Mode1 Check now supports AND/OR:
'Strip[0].mono AND Strip[1].B1'
Additional examples in the project page.

@@ -27,6 +32,24 @@
Mode1 Key Press
+
+
Mode1 Send Hotkey
+ + + +
+ +
+
Mode1 Midi
+ +
Mode1 Check
@@ -43,7 +66,24 @@
Mode2 Key Press
- +
+
Mode2 Send Hotkey
+ + + +
+ +
+
Mode2 Midi
+ +
Mode2 image
@@ -79,6 +119,5 @@ For feedback/suggestions contact me at https://BarRaider.com
- diff --git a/VoiceMeeter/PropertyInspector/VoiceMeeter/Microphone.html b/VoiceMeeter/PropertyInspector/VoiceMeeter/Microphone.html index 33ee0d9..79cfed9 100644 --- a/VoiceMeeter/PropertyInspector/VoiceMeeter/Microphone.html +++ b/VoiceMeeter/PropertyInspector/VoiceMeeter/Microphone.html @@ -7,6 +7,7 @@ BarRaider's VoiceMeeter Plugin +
@@ -72,6 +73,5 @@
- diff --git a/VoiceMeeter/PropertyInspector/VoiceMeeter/Modify.html b/VoiceMeeter/PropertyInspector/VoiceMeeter/Modify.html index aba9484..0601960 100644 --- a/VoiceMeeter/PropertyInspector/VoiceMeeter/Modify.html +++ b/VoiceMeeter/PropertyInspector/VoiceMeeter/Modify.html @@ -7,6 +7,7 @@ BarRaider's VoiceMeeter Plugin +
@@ -74,6 +75,5 @@
- diff --git a/VoiceMeeter/PropertyInspector/jquery-3.3.1.min.js b/VoiceMeeter/PropertyInspector/jquery-3.3.1.min.js new file mode 100644 index 0000000..4d9b3a2 --- /dev/null +++ b/VoiceMeeter/PropertyInspector/jquery-3.3.1.min.js @@ -0,0 +1,2 @@ +/*! jQuery v3.3.1 | (c) JS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(e,t){"use strict";var n=[],r=e.document,i=Object.getPrototypeOf,o=n.slice,a=n.concat,s=n.push,u=n.indexOf,l={},c=l.toString,f=l.hasOwnProperty,p=f.toString,d=p.call(Object),h={},g=function e(t){return"function"==typeof t&&"number"!=typeof t.nodeType},y=function e(t){return null!=t&&t===t.window},v={type:!0,src:!0,noModule:!0};function m(e,t,n){var i,o=(t=t||r).createElement("script");if(o.text=e,n)for(i in v)n[i]&&(o[i]=n[i]);t.head.appendChild(o).parentNode.removeChild(o)}function x(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?l[c.call(e)]||"object":typeof e}var b="3.3.1",w=function(e,t){return new w.fn.init(e,t)},T=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;w.fn=w.prototype={jquery:"3.3.1",constructor:w,length:0,toArray:function(){return o.call(this)},get:function(e){return null==e?o.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=w.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return w.each(this,e)},map:function(e){return this.pushStack(w.map(this,function(t,n){return e.call(t,n,t)}))},slice:function(){return this.pushStack(o.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(n>=0&&n0&&t-1 in e)}var E=function(e){var t,n,r,i,o,a,s,u,l,c,f,p,d,h,g,y,v,m,x,b="sizzle"+1*new Date,w=e.document,T=0,C=0,E=ae(),k=ae(),S=ae(),D=function(e,t){return e===t&&(f=!0),0},N={}.hasOwnProperty,A=[],j=A.pop,q=A.push,L=A.push,H=A.slice,O=function(e,t){for(var n=0,r=e.length;n+~]|"+M+")"+M+"*"),z=new RegExp("="+M+"*([^\\]'\"]*?)"+M+"*\\]","g"),X=new RegExp(W),U=new RegExp("^"+R+"$"),V={ID:new RegExp("^#("+R+")"),CLASS:new RegExp("^\\.("+R+")"),TAG:new RegExp("^("+R+"|[*])"),ATTR:new RegExp("^"+I),PSEUDO:new RegExp("^"+W),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+P+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},G=/^(?:input|select|textarea|button)$/i,Y=/^h\d$/i,Q=/^[^{]+\{\s*\[native \w/,J=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,K=/[+~]/,Z=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),ee=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},te=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ne=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},re=function(){p()},ie=me(function(e){return!0===e.disabled&&("form"in e||"label"in e)},{dir:"parentNode",next:"legend"});try{L.apply(A=H.call(w.childNodes),w.childNodes),A[w.childNodes.length].nodeType}catch(e){L={apply:A.length?function(e,t){q.apply(e,H.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function oe(e,t,r,i){var o,s,l,c,f,h,v,m=t&&t.ownerDocument,T=t?t.nodeType:9;if(r=r||[],"string"!=typeof e||!e||1!==T&&9!==T&&11!==T)return r;if(!i&&((t?t.ownerDocument||t:w)!==d&&p(t),t=t||d,g)){if(11!==T&&(f=J.exec(e)))if(o=f[1]){if(9===T){if(!(l=t.getElementById(o)))return r;if(l.id===o)return r.push(l),r}else if(m&&(l=m.getElementById(o))&&x(t,l)&&l.id===o)return r.push(l),r}else{if(f[2])return L.apply(r,t.getElementsByTagName(e)),r;if((o=f[3])&&n.getElementsByClassName&&t.getElementsByClassName)return L.apply(r,t.getElementsByClassName(o)),r}if(n.qsa&&!S[e+" "]&&(!y||!y.test(e))){if(1!==T)m=t,v=e;else if("object"!==t.nodeName.toLowerCase()){(c=t.getAttribute("id"))?c=c.replace(te,ne):t.setAttribute("id",c=b),s=(h=a(e)).length;while(s--)h[s]="#"+c+" "+ve(h[s]);v=h.join(","),m=K.test(e)&&ge(t.parentNode)||t}if(v)try{return L.apply(r,m.querySelectorAll(v)),r}catch(e){}finally{c===b&&t.removeAttribute("id")}}}return u(e.replace(B,"$1"),t,r,i)}function ae(){var e=[];function t(n,i){return e.push(n+" ")>r.cacheLength&&delete t[e.shift()],t[n+" "]=i}return t}function se(e){return e[b]=!0,e}function ue(e){var t=d.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function le(e,t){var n=e.split("|"),i=n.length;while(i--)r.attrHandle[n[i]]=t}function ce(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function fe(e){return function(t){return"input"===t.nodeName.toLowerCase()&&t.type===e}}function pe(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function de(e){return function(t){return"form"in t?t.parentNode&&!1===t.disabled?"label"in t?"label"in t.parentNode?t.parentNode.disabled===e:t.disabled===e:t.isDisabled===e||t.isDisabled!==!e&&ie(t)===e:t.disabled===e:"label"in t&&t.disabled===e}}function he(e){return se(function(t){return t=+t,se(function(n,r){var i,o=e([],n.length,t),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}function ge(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}n=oe.support={},o=oe.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return!!t&&"HTML"!==t.nodeName},p=oe.setDocument=function(e){var t,i,a=e?e.ownerDocument||e:w;return a!==d&&9===a.nodeType&&a.documentElement?(d=a,h=d.documentElement,g=!o(d),w!==d&&(i=d.defaultView)&&i.top!==i&&(i.addEventListener?i.addEventListener("unload",re,!1):i.attachEvent&&i.attachEvent("onunload",re)),n.attributes=ue(function(e){return e.className="i",!e.getAttribute("className")}),n.getElementsByTagName=ue(function(e){return e.appendChild(d.createComment("")),!e.getElementsByTagName("*").length}),n.getElementsByClassName=Q.test(d.getElementsByClassName),n.getById=ue(function(e){return h.appendChild(e).id=b,!d.getElementsByName||!d.getElementsByName(b).length}),n.getById?(r.filter.ID=function(e){var t=e.replace(Z,ee);return function(e){return e.getAttribute("id")===t}},r.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&g){var n=t.getElementById(e);return n?[n]:[]}}):(r.filter.ID=function(e){var t=e.replace(Z,ee);return function(e){var n="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return n&&n.value===t}},r.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&g){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),r.find.TAG=n.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):n.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},r.find.CLASS=n.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&g)return t.getElementsByClassName(e)},v=[],y=[],(n.qsa=Q.test(d.querySelectorAll))&&(ue(function(e){h.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&y.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||y.push("\\["+M+"*(?:value|"+P+")"),e.querySelectorAll("[id~="+b+"-]").length||y.push("~="),e.querySelectorAll(":checked").length||y.push(":checked"),e.querySelectorAll("a#"+b+"+*").length||y.push(".#.+[+~]")}),ue(function(e){e.innerHTML="";var t=d.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&y.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&y.push(":enabled",":disabled"),h.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&y.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),y.push(",.*:")})),(n.matchesSelector=Q.test(m=h.matches||h.webkitMatchesSelector||h.mozMatchesSelector||h.oMatchesSelector||h.msMatchesSelector))&&ue(function(e){n.disconnectedMatch=m.call(e,"*"),m.call(e,"[s!='']:x"),v.push("!=",W)}),y=y.length&&new RegExp(y.join("|")),v=v.length&&new RegExp(v.join("|")),t=Q.test(h.compareDocumentPosition),x=t||Q.test(h.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return f=!0,0;var r=!e.compareDocumentPosition-!t.compareDocumentPosition;return r||(1&(r=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!n.sortDetached&&t.compareDocumentPosition(e)===r?e===d||e.ownerDocument===w&&x(w,e)?-1:t===d||t.ownerDocument===w&&x(w,t)?1:c?O(c,e)-O(c,t):0:4&r?-1:1)}:function(e,t){if(e===t)return f=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e===d?-1:t===d?1:i?-1:o?1:c?O(c,e)-O(c,t):0;if(i===o)return ce(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?ce(a[r],s[r]):a[r]===w?-1:s[r]===w?1:0},d):d},oe.matches=function(e,t){return oe(e,null,null,t)},oe.matchesSelector=function(e,t){if((e.ownerDocument||e)!==d&&p(e),t=t.replace(z,"='$1']"),n.matchesSelector&&g&&!S[t+" "]&&(!v||!v.test(t))&&(!y||!y.test(t)))try{var r=m.call(e,t);if(r||n.disconnectedMatch||e.document&&11!==e.document.nodeType)return r}catch(e){}return oe(t,d,null,[e]).length>0},oe.contains=function(e,t){return(e.ownerDocument||e)!==d&&p(e),x(e,t)},oe.attr=function(e,t){(e.ownerDocument||e)!==d&&p(e);var i=r.attrHandle[t.toLowerCase()],o=i&&N.call(r.attrHandle,t.toLowerCase())?i(e,t,!g):void 0;return void 0!==o?o:n.attributes||!g?e.getAttribute(t):(o=e.getAttributeNode(t))&&o.specified?o.value:null},oe.escape=function(e){return(e+"").replace(te,ne)},oe.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},oe.uniqueSort=function(e){var t,r=[],i=0,o=0;if(f=!n.detectDuplicates,c=!n.sortStable&&e.slice(0),e.sort(D),f){while(t=e[o++])t===e[o]&&(i=r.push(o));while(i--)e.splice(r[i],1)}return c=null,e},i=oe.getText=function(e){var t,n="",r=0,o=e.nodeType;if(o){if(1===o||9===o||11===o){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=i(e)}else if(3===o||4===o)return e.nodeValue}else while(t=e[r++])n+=i(t);return n},(r=oe.selectors={cacheLength:50,createPseudo:se,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(Z,ee),e[3]=(e[3]||e[4]||e[5]||"").replace(Z,ee),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||oe.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&oe.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return V.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=a(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(Z,ee).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=E[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&E(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=oe.attr(r,e);return null==i?"!="===t:!t||(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i.replace($," ")+" ").indexOf(n)>-1:"|="===t&&(i===n||i.slice(0,n.length+1)===n+"-"))}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var l,c,f,p,d,h,g=o!==a?"nextSibling":"previousSibling",y=t.parentNode,v=s&&t.nodeName.toLowerCase(),m=!u&&!s,x=!1;if(y){if(o){while(g){p=t;while(p=p[g])if(s?p.nodeName.toLowerCase()===v:1===p.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?y.firstChild:y.lastChild],a&&m){x=(d=(l=(c=(f=(p=y)[b]||(p[b]={}))[p.uniqueID]||(f[p.uniqueID]={}))[e]||[])[0]===T&&l[1])&&l[2],p=d&&y.childNodes[d];while(p=++d&&p&&p[g]||(x=d=0)||h.pop())if(1===p.nodeType&&++x&&p===t){c[e]=[T,d,x];break}}else if(m&&(x=d=(l=(c=(f=(p=t)[b]||(p[b]={}))[p.uniqueID]||(f[p.uniqueID]={}))[e]||[])[0]===T&&l[1]),!1===x)while(p=++d&&p&&p[g]||(x=d=0)||h.pop())if((s?p.nodeName.toLowerCase()===v:1===p.nodeType)&&++x&&(m&&((c=(f=p[b]||(p[b]={}))[p.uniqueID]||(f[p.uniqueID]={}))[e]=[T,x]),p===t))break;return(x-=i)===r||x%r==0&&x/r>=0}}},PSEUDO:function(e,t){var n,i=r.pseudos[e]||r.setFilters[e.toLowerCase()]||oe.error("unsupported pseudo: "+e);return i[b]?i(t):i.length>1?(n=[e,e,"",t],r.setFilters.hasOwnProperty(e.toLowerCase())?se(function(e,n){var r,o=i(e,t),a=o.length;while(a--)e[r=O(e,o[a])]=!(n[r]=o[a])}):function(e){return i(e,0,n)}):i}},pseudos:{not:se(function(e){var t=[],n=[],r=s(e.replace(B,"$1"));return r[b]?se(function(e,t,n,i){var o,a=r(e,null,i,[]),s=e.length;while(s--)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),t[0]=null,!n.pop()}}),has:se(function(e){return function(t){return oe(e,t).length>0}}),contains:se(function(e){return e=e.replace(Z,ee),function(t){return(t.textContent||t.innerText||i(t)).indexOf(e)>-1}}),lang:se(function(e){return U.test(e||"")||oe.error("unsupported lang: "+e),e=e.replace(Z,ee).toLowerCase(),function(t){var n;do{if(n=g?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return(n=n.toLowerCase())===e||0===n.indexOf(e+"-")}while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===h},focus:function(e){return e===d.activeElement&&(!d.hasFocus||d.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:de(!1),disabled:de(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!r.pseudos.empty(e)},header:function(e){return Y.test(e.nodeName)},input:function(e){return G.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:he(function(){return[0]}),last:he(function(e,t){return[t-1]}),eq:he(function(e,t,n){return[n<0?n+t:n]}),even:he(function(e,t){for(var n=0;n=0;)e.push(r);return e}),gt:he(function(e,t,n){for(var r=n<0?n+t:n;++r1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function be(e,t,n){for(var r=0,i=t.length;r-1&&(o[l]=!(a[l]=f))}}else v=we(v===a?v.splice(h,v.length):v),i?i(null,a,v,u):L.apply(a,v)})}function Ce(e){for(var t,n,i,o=e.length,a=r.relative[e[0].type],s=a||r.relative[" "],u=a?1:0,c=me(function(e){return e===t},s,!0),f=me(function(e){return O(t,e)>-1},s,!0),p=[function(e,n,r){var i=!a&&(r||n!==l)||((t=n).nodeType?c(e,n,r):f(e,n,r));return t=null,i}];u1&&xe(p),u>1&&ve(e.slice(0,u-1).concat({value:" "===e[u-2].type?"*":""})).replace(B,"$1"),n,u0,i=e.length>0,o=function(o,a,s,u,c){var f,h,y,v=0,m="0",x=o&&[],b=[],w=l,C=o||i&&r.find.TAG("*",c),E=T+=null==w?1:Math.random()||.1,k=C.length;for(c&&(l=a===d||a||c);m!==k&&null!=(f=C[m]);m++){if(i&&f){h=0,a||f.ownerDocument===d||(p(f),s=!g);while(y=e[h++])if(y(f,a||d,s)){u.push(f);break}c&&(T=E)}n&&((f=!y&&f)&&v--,o&&x.push(f))}if(v+=m,n&&m!==v){h=0;while(y=t[h++])y(x,b,a,s);if(o){if(v>0)while(m--)x[m]||b[m]||(b[m]=j.call(u));b=we(b)}L.apply(u,b),c&&!o&&b.length>0&&v+t.length>1&&oe.uniqueSort(u)}return c&&(T=E,l=w),x};return n?se(o):o}return s=oe.compile=function(e,t){var n,r=[],i=[],o=S[e+" "];if(!o){t||(t=a(e)),n=t.length;while(n--)(o=Ce(t[n]))[b]?r.push(o):i.push(o);(o=S(e,Ee(i,r))).selector=e}return o},u=oe.select=function(e,t,n,i){var o,u,l,c,f,p="function"==typeof e&&e,d=!i&&a(e=p.selector||e);if(n=n||[],1===d.length){if((u=d[0]=d[0].slice(0)).length>2&&"ID"===(l=u[0]).type&&9===t.nodeType&&g&&r.relative[u[1].type]){if(!(t=(r.find.ID(l.matches[0].replace(Z,ee),t)||[])[0]))return n;p&&(t=t.parentNode),e=e.slice(u.shift().value.length)}o=V.needsContext.test(e)?0:u.length;while(o--){if(l=u[o],r.relative[c=l.type])break;if((f=r.find[c])&&(i=f(l.matches[0].replace(Z,ee),K.test(u[0].type)&&ge(t.parentNode)||t))){if(u.splice(o,1),!(e=i.length&&ve(u)))return L.apply(n,i),n;break}}}return(p||s(e,d))(i,t,!g,n,!t||K.test(e)&&ge(t.parentNode)||t),n},n.sortStable=b.split("").sort(D).join("")===b,n.detectDuplicates=!!f,p(),n.sortDetached=ue(function(e){return 1&e.compareDocumentPosition(d.createElement("fieldset"))}),ue(function(e){return e.innerHTML="","#"===e.firstChild.getAttribute("href")})||le("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),n.attributes&&ue(function(e){return e.innerHTML="",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||le("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),ue(function(e){return null==e.getAttribute("disabled")})||le(P,function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),oe}(e);w.find=E,w.expr=E.selectors,w.expr[":"]=w.expr.pseudos,w.uniqueSort=w.unique=E.uniqueSort,w.text=E.getText,w.isXMLDoc=E.isXML,w.contains=E.contains,w.escapeSelector=E.escape;var k=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&w(e).is(n))break;r.push(e)}return r},S=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},D=w.expr.match.needsContext;function N(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var A=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,t,n){return g(t)?w.grep(e,function(e,r){return!!t.call(e,r,e)!==n}):t.nodeType?w.grep(e,function(e){return e===t!==n}):"string"!=typeof t?w.grep(e,function(e){return u.call(t,e)>-1!==n}):w.filter(t,e,n)}w.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?w.find.matchesSelector(r,e)?[r]:[]:w.find.matches(e,w.grep(t,function(e){return 1===e.nodeType}))},w.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(w(e).filter(function(){for(t=0;t1?w.uniqueSort(n):n},filter:function(e){return this.pushStack(j(this,e||[],!1))},not:function(e){return this.pushStack(j(this,e||[],!0))},is:function(e){return!!j(this,"string"==typeof e&&D.test(e)?w(e):e||[],!1).length}});var q,L=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(w.fn.init=function(e,t,n){var i,o;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(i="<"===e[0]&&">"===e[e.length-1]&&e.length>=3?[null,e,null]:L.exec(e))||!i[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(i[1]){if(t=t instanceof w?t[0]:t,w.merge(this,w.parseHTML(i[1],t&&t.nodeType?t.ownerDocument||t:r,!0)),A.test(i[1])&&w.isPlainObject(t))for(i in t)g(this[i])?this[i](t[i]):this.attr(i,t[i]);return this}return(o=r.getElementById(i[2]))&&(this[0]=o,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):g(e)?void 0!==n.ready?n.ready(e):e(w):w.makeArray(e,this)}).prototype=w.fn,q=w(r);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};w.fn.extend({has:function(e){var t=w(e,this),n=t.length;return this.filter(function(){for(var e=0;e-1:1===n.nodeType&&w.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(o.length>1?w.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?u.call(w(e),this[0]):u.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(w.uniqueSort(w.merge(this.get(),w(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}});function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}w.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return k(e,"parentNode")},parentsUntil:function(e,t,n){return k(e,"parentNode",n)},next:function(e){return P(e,"nextSibling")},prev:function(e){return P(e,"previousSibling")},nextAll:function(e){return k(e,"nextSibling")},prevAll:function(e){return k(e,"previousSibling")},nextUntil:function(e,t,n){return k(e,"nextSibling",n)},prevUntil:function(e,t,n){return k(e,"previousSibling",n)},siblings:function(e){return S((e.parentNode||{}).firstChild,e)},children:function(e){return S(e.firstChild)},contents:function(e){return N(e,"iframe")?e.contentDocument:(N(e,"template")&&(e=e.content||e),w.merge([],e.childNodes))}},function(e,t){w.fn[e]=function(n,r){var i=w.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=w.filter(r,i)),this.length>1&&(O[e]||w.uniqueSort(i),H.test(e)&&i.reverse()),this.pushStack(i)}});var M=/[^\x20\t\r\n\f]+/g;function R(e){var t={};return w.each(e.match(M)||[],function(e,n){t[n]=!0}),t}w.Callbacks=function(e){e="string"==typeof e?R(e):w.extend({},e);var t,n,r,i,o=[],a=[],s=-1,u=function(){for(i=i||e.once,r=t=!0;a.length;s=-1){n=a.shift();while(++s-1)o.splice(n,1),n<=s&&s--}),this},has:function(e){return e?w.inArray(e,o)>-1:o.length>0},empty:function(){return o&&(o=[]),this},disable:function(){return i=a=[],o=n="",this},disabled:function(){return!o},lock:function(){return i=a=[],n||t||(o=n=""),this},locked:function(){return!!i},fireWith:function(e,n){return i||(n=[e,(n=n||[]).slice?n.slice():n],a.push(n),t||u()),this},fire:function(){return l.fireWith(this,arguments),this},fired:function(){return!!r}};return l};function I(e){return e}function W(e){throw e}function $(e,t,n,r){var i;try{e&&g(i=e.promise)?i.call(e).done(t).fail(n):e&&g(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}w.extend({Deferred:function(t){var n=[["notify","progress",w.Callbacks("memory"),w.Callbacks("memory"),2],["resolve","done",w.Callbacks("once memory"),w.Callbacks("once memory"),0,"resolved"],["reject","fail",w.Callbacks("once memory"),w.Callbacks("once memory"),1,"rejected"]],r="pending",i={state:function(){return r},always:function(){return o.done(arguments).fail(arguments),this},"catch":function(e){return i.then(null,e)},pipe:function(){var e=arguments;return w.Deferred(function(t){w.each(n,function(n,r){var i=g(e[r[4]])&&e[r[4]];o[r[1]](function(){var e=i&&i.apply(this,arguments);e&&g(e.promise)?e.promise().progress(t.notify).done(t.resolve).fail(t.reject):t[r[0]+"With"](this,i?[e]:arguments)})}),e=null}).promise()},then:function(t,r,i){var o=0;function a(t,n,r,i){return function(){var s=this,u=arguments,l=function(){var e,l;if(!(t=o&&(r!==W&&(s=void 0,u=[e]),n.rejectWith(s,u))}};t?c():(w.Deferred.getStackHook&&(c.stackTrace=w.Deferred.getStackHook()),e.setTimeout(c))}}return w.Deferred(function(e){n[0][3].add(a(0,e,g(i)?i:I,e.notifyWith)),n[1][3].add(a(0,e,g(t)?t:I)),n[2][3].add(a(0,e,g(r)?r:W))}).promise()},promise:function(e){return null!=e?w.extend(e,i):i}},o={};return w.each(n,function(e,t){var a=t[2],s=t[5];i[t[1]]=a.add,s&&a.add(function(){r=s},n[3-e][2].disable,n[3-e][3].disable,n[0][2].lock,n[0][3].lock),a.add(t[3].fire),o[t[0]]=function(){return o[t[0]+"With"](this===o?void 0:this,arguments),this},o[t[0]+"With"]=a.fireWith}),i.promise(o),t&&t.call(o,o),o},when:function(e){var t=arguments.length,n=t,r=Array(n),i=o.call(arguments),a=w.Deferred(),s=function(e){return function(n){r[e]=this,i[e]=arguments.length>1?o.call(arguments):n,--t||a.resolveWith(r,i)}};if(t<=1&&($(e,a.done(s(n)).resolve,a.reject,!t),"pending"===a.state()||g(i[n]&&i[n].then)))return a.then();while(n--)$(i[n],s(n),a.reject);return a.promise()}});var B=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;w.Deferred.exceptionHook=function(t,n){e.console&&e.console.warn&&t&&B.test(t.name)&&e.console.warn("jQuery.Deferred exception: "+t.message,t.stack,n)},w.readyException=function(t){e.setTimeout(function(){throw t})};var F=w.Deferred();w.fn.ready=function(e){return F.then(e)["catch"](function(e){w.readyException(e)}),this},w.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--w.readyWait:w.isReady)||(w.isReady=!0,!0!==e&&--w.readyWait>0||F.resolveWith(r,[w]))}}),w.ready.then=F.then;function _(){r.removeEventListener("DOMContentLoaded",_),e.removeEventListener("load",_),w.ready()}"complete"===r.readyState||"loading"!==r.readyState&&!r.documentElement.doScroll?e.setTimeout(w.ready):(r.addEventListener("DOMContentLoaded",_),e.addEventListener("load",_));var z=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===x(n)){i=!0;for(s in n)z(e,t,s,n[s],!0,o,a)}else if(void 0!==r&&(i=!0,g(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(w(e),n)})),t))for(;s1,null,!0)},removeData:function(e){return this.each(function(){K.remove(this,e)})}}),w.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=J.get(e,t),n&&(!r||Array.isArray(n)?r=J.access(e,t,w.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=w.queue(e,t),r=n.length,i=n.shift(),o=w._queueHooks(e,t),a=function(){w.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return J.get(e,n)||J.access(e,n,{empty:w.Callbacks("once memory").add(function(){J.remove(e,[t+"queue",n])})})}}),w.fn.extend({queue:function(e,t){var n=2;return"string"!=typeof e&&(t=e,e="fx",n--),arguments.length\x20\t\r\n\f]+)/i,he=/^$|^module$|\/(?:java|ecma)script/i,ge={option:[1,""],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};ge.optgroup=ge.option,ge.tbody=ge.tfoot=ge.colgroup=ge.caption=ge.thead,ge.th=ge.td;function ye(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&N(e,t)?w.merge([e],n):n}function ve(e,t){for(var n=0,r=e.length;n-1)i&&i.push(o);else if(l=w.contains(o.ownerDocument,o),a=ye(f.appendChild(o),"script"),l&&ve(a),n){c=0;while(o=a[c++])he.test(o.type||"")&&n.push(o)}return f}!function(){var e=r.createDocumentFragment().appendChild(r.createElement("div")),t=r.createElement("input");t.setAttribute("type","radio"),t.setAttribute("checked","checked"),t.setAttribute("name","t"),e.appendChild(t),h.checkClone=e.cloneNode(!0).cloneNode(!0).lastChild.checked,e.innerHTML="",h.noCloneChecked=!!e.cloneNode(!0).lastChild.defaultValue}();var be=r.documentElement,we=/^key/,Te=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ce=/^([^.]*)(?:\.(.+)|)/;function Ee(){return!0}function ke(){return!1}function Se(){try{return r.activeElement}catch(e){}}function De(e,t,n,r,i,o){var a,s;if("object"==typeof t){"string"!=typeof n&&(r=r||n,n=void 0);for(s in t)De(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=ke;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return w().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=w.guid++)),e.each(function(){w.event.add(this,t,i,r,n)})}w.event={global:{},add:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,y=J.get(e);if(y){n.handler&&(n=(o=n).handler,i=o.selector),i&&w.find.matchesSelector(be,i),n.guid||(n.guid=w.guid++),(u=y.events)||(u=y.events={}),(a=y.handle)||(a=y.handle=function(t){return"undefined"!=typeof w&&w.event.triggered!==t.type?w.event.dispatch.apply(e,arguments):void 0}),l=(t=(t||"").match(M)||[""]).length;while(l--)d=g=(s=Ce.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=w.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=w.event.special[d]||{},c=w.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&w.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(e,r,h,a)||e.addEventListener&&e.addEventListener(d,a)),f.add&&(f.add.call(e,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),w.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,y=J.hasData(e)&&J.get(e);if(y&&(u=y.events)){l=(t=(t||"").match(M)||[""]).length;while(l--)if(s=Ce.exec(t[l])||[],d=g=s[1],h=(s[2]||"").split(".").sort(),d){f=w.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,y.handle)||w.removeEvent(e,d,y.handle),delete u[d])}else for(d in u)w.event.remove(e,d+t[l],n,r,!0);w.isEmptyObject(u)&&J.remove(e,"handle events")}},dispatch:function(e){var t=w.event.fix(e),n,r,i,o,a,s,u=new Array(arguments.length),l=(J.get(this,"events")||{})[t.type]||[],c=w.event.special[t.type]||{};for(u[0]=t,n=1;n=1))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n-1:w.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u\x20\t\r\n\f]*)[^>]*)\/>/gi,Ae=/\s*$/g;function Le(e,t){return N(e,"table")&&N(11!==t.nodeType?t:t.firstChild,"tr")?w(e).children("tbody")[0]||e:e}function He(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Oe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Pe(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(J.hasData(e)&&(o=J.access(e),a=J.set(t,o),l=o.events)){delete a.handle,a.events={};for(i in l)for(n=0,r=l[i].length;n1&&"string"==typeof y&&!h.checkClone&&je.test(y))return e.each(function(i){var o=e.eq(i);v&&(t[0]=y.call(this,i,o.html())),Re(o,t,n,r)});if(p&&(i=xe(t,e[0].ownerDocument,!1,e,r),o=i.firstChild,1===i.childNodes.length&&(i=o),o||r)){for(u=(s=w.map(ye(i,"script"),He)).length;f")},clone:function(e,t,n){var r,i,o,a,s=e.cloneNode(!0),u=w.contains(e.ownerDocument,e);if(!(h.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||w.isXMLDoc(e)))for(a=ye(s),r=0,i=(o=ye(e)).length;r0&&ve(a,!u&&ye(e,"script")),s},cleanData:function(e){for(var t,n,r,i=w.event.special,o=0;void 0!==(n=e[o]);o++)if(Y(n)){if(t=n[J.expando]){if(t.events)for(r in t.events)i[r]?w.event.remove(n,r):w.removeEvent(n,r,t.handle);n[J.expando]=void 0}n[K.expando]&&(n[K.expando]=void 0)}}}),w.fn.extend({detach:function(e){return Ie(this,e,!0)},remove:function(e){return Ie(this,e)},text:function(e){return z(this,function(e){return void 0===e?w.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return Re(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Le(this,e).appendChild(e)})},prepend:function(){return Re(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Le(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return Re(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return Re(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(w.cleanData(ye(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return w.clone(this,e,t)})},html:function(e){return z(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!Ae.test(e)&&!ge[(de.exec(e)||["",""])[1].toLowerCase()]){e=w.htmlPrefilter(e);try{for(;n=0&&(u+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))),u}function et(e,t,n){var r=$e(e),i=Fe(e,t,r),o="border-box"===w.css(e,"boxSizing",!1,r),a=o;if(We.test(i)){if(!n)return i;i="auto"}return a=a&&(h.boxSizingReliable()||i===e.style[t]),("auto"===i||!parseFloat(i)&&"inline"===w.css(e,"display",!1,r))&&(i=e["offset"+t[0].toUpperCase()+t.slice(1)],a=!0),(i=parseFloat(i)||0)+Ze(e,t,n||(o?"border":"content"),a,r,i)+"px"}w.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Fe(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=G(t),u=Xe.test(t),l=e.style;if(u||(t=Je(s)),a=w.cssHooks[t]||w.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];"string"==(o=typeof n)&&(i=ie.exec(n))&&i[1]&&(n=ue(e,t,i),o="number"),null!=n&&n===n&&("number"===o&&(n+=i&&i[3]||(w.cssNumber[s]?"":"px")),h.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=G(t);return Xe.test(t)||(t=Je(s)),(a=w.cssHooks[t]||w.cssHooks[s])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=Fe(e,t,r)),"normal"===i&&t in Ve&&(i=Ve[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),w.each(["height","width"],function(e,t){w.cssHooks[t]={get:function(e,n,r){if(n)return!ze.test(w.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?et(e,t,r):se(e,Ue,function(){return et(e,t,r)})},set:function(e,n,r){var i,o=$e(e),a="border-box"===w.css(e,"boxSizing",!1,o),s=r&&Ze(e,t,r,a,o);return a&&h.scrollboxSize()===o.position&&(s-=Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-parseFloat(o[t])-Ze(e,t,"border",!1,o)-.5)),s&&(i=ie.exec(n))&&"px"!==(i[3]||"px")&&(e.style[t]=n,n=w.css(e,t)),Ke(e,n,s)}}}),w.cssHooks.marginLeft=_e(h.reliableMarginLeft,function(e,t){if(t)return(parseFloat(Fe(e,"marginLeft"))||e.getBoundingClientRect().left-se(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),w.each({margin:"",padding:"",border:"Width"},function(e,t){w.cssHooks[e+t]={expand:function(n){for(var r=0,i={},o="string"==typeof n?n.split(" "):[n];r<4;r++)i[e+oe[r]+t]=o[r]||o[r-2]||o[0];return i}},"margin"!==e&&(w.cssHooks[e+t].set=Ke)}),w.fn.extend({css:function(e,t){return z(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=$e(e),i=t.length;a1)}});function tt(e,t,n,r,i){return new tt.prototype.init(e,t,n,r,i)}w.Tween=tt,tt.prototype={constructor:tt,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||w.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(w.cssNumber[n]?"":"px")},cur:function(){var e=tt.propHooks[this.prop];return e&&e.get?e.get(this):tt.propHooks._default.get(this)},run:function(e){var t,n=tt.propHooks[this.prop];return this.options.duration?this.pos=t=w.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):tt.propHooks._default.set(this),this}},tt.prototype.init.prototype=tt.prototype,tt.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=w.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){w.fx.step[e.prop]?w.fx.step[e.prop](e):1!==e.elem.nodeType||null==e.elem.style[w.cssProps[e.prop]]&&!w.cssHooks[e.prop]?e.elem[e.prop]=e.now:w.style(e.elem,e.prop,e.now+e.unit)}}},tt.propHooks.scrollTop=tt.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},w.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},w.fx=tt.prototype.init,w.fx.step={};var nt,rt,it=/^(?:toggle|show|hide)$/,ot=/queueHooks$/;function at(){rt&&(!1===r.hidden&&e.requestAnimationFrame?e.requestAnimationFrame(at):e.setTimeout(at,w.fx.interval),w.fx.tick())}function st(){return e.setTimeout(function(){nt=void 0}),nt=Date.now()}function ut(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=oe[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function lt(e,t,n){for(var r,i=(pt.tweeners[t]||[]).concat(pt.tweeners["*"]),o=0,a=i.length;o1)},removeAttr:function(e){return this.each(function(){w.removeAttr(this,e)})}}),w.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?w.prop(e,t,n):(1===o&&w.isXMLDoc(e)||(i=w.attrHooks[t.toLowerCase()]||(w.expr.match.bool.test(t)?dt:void 0)),void 0!==n?null===n?void w.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=w.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!h.radioValue&&"radio"===t&&N(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(M);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),dt={set:function(e,t,n){return!1===t?w.removeAttr(e,n):e.setAttribute(n,n),n}},w.each(w.expr.match.bool.source.match(/\w+/g),function(e,t){var n=ht[t]||w.find.attr;ht[t]=function(e,t,r){var i,o,a=t.toLowerCase();return r||(o=ht[a],ht[a]=i,i=null!=n(e,t,r)?a:null,ht[a]=o),i}});var gt=/^(?:input|select|textarea|button)$/i,yt=/^(?:a|area)$/i;w.fn.extend({prop:function(e,t){return z(this,w.prop,e,t,arguments.length>1)},removeProp:function(e){return this.each(function(){delete this[w.propFix[e]||e]})}}),w.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&w.isXMLDoc(e)||(t=w.propFix[t]||t,i=w.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=w.find.attr(e,"tabindex");return t?parseInt(t,10):gt.test(e.nodeName)||yt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),h.optSelected||(w.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),w.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){w.propFix[this.toLowerCase()]=this});function vt(e){return(e.match(M)||[]).join(" ")}function mt(e){return e.getAttribute&&e.getAttribute("class")||""}function xt(e){return Array.isArray(e)?e:"string"==typeof e?e.match(M)||[]:[]}w.fn.extend({addClass:function(e){var t,n,r,i,o,a,s,u=0;if(g(e))return this.each(function(t){w(this).addClass(e.call(this,t,mt(this)))});if((t=xt(e)).length)while(n=this[u++])if(i=mt(n),r=1===n.nodeType&&" "+vt(i)+" "){a=0;while(o=t[a++])r.indexOf(" "+o+" ")<0&&(r+=o+" ");i!==(s=vt(r))&&n.setAttribute("class",s)}return this},removeClass:function(e){var t,n,r,i,o,a,s,u=0;if(g(e))return this.each(function(t){w(this).removeClass(e.call(this,t,mt(this)))});if(!arguments.length)return this.attr("class","");if((t=xt(e)).length)while(n=this[u++])if(i=mt(n),r=1===n.nodeType&&" "+vt(i)+" "){a=0;while(o=t[a++])while(r.indexOf(" "+o+" ")>-1)r=r.replace(" "+o+" "," ");i!==(s=vt(r))&&n.setAttribute("class",s)}return this},toggleClass:function(e,t){var n=typeof e,r="string"===n||Array.isArray(e);return"boolean"==typeof t&&r?t?this.addClass(e):this.removeClass(e):g(e)?this.each(function(n){w(this).toggleClass(e.call(this,n,mt(this),t),t)}):this.each(function(){var t,i,o,a;if(r){i=0,o=w(this),a=xt(e);while(t=a[i++])o.hasClass(t)?o.removeClass(t):o.addClass(t)}else void 0!==e&&"boolean"!==n||((t=mt(this))&&J.set(this,"__className__",t),this.setAttribute&&this.setAttribute("class",t||!1===e?"":J.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;t=" "+e+" ";while(n=this[r++])if(1===n.nodeType&&(" "+vt(mt(n))+" ").indexOf(t)>-1)return!0;return!1}});var bt=/\r/g;w.fn.extend({val:function(e){var t,n,r,i=this[0];{if(arguments.length)return r=g(e),this.each(function(n){var i;1===this.nodeType&&(null==(i=r?e.call(this,n,w(this).val()):e)?i="":"number"==typeof i?i+="":Array.isArray(i)&&(i=w.map(i,function(e){return null==e?"":e+""})),(t=w.valHooks[this.type]||w.valHooks[this.nodeName.toLowerCase()])&&"set"in t&&void 0!==t.set(this,i,"value")||(this.value=i))});if(i)return(t=w.valHooks[i.type]||w.valHooks[i.nodeName.toLowerCase()])&&"get"in t&&void 0!==(n=t.get(i,"value"))?n:"string"==typeof(n=i.value)?n.replace(bt,""):null==n?"":n}}}),w.extend({valHooks:{option:{get:function(e){var t=w.find.attr(e,"value");return null!=t?t:vt(w.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r-1)&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),w.each(["radio","checkbox"],function(){w.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=w.inArray(w(e).val(),t)>-1}},h.checkOn||(w.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})}),h.focusin="onfocusin"in e;var wt=/^(?:focusinfocus|focusoutblur)$/,Tt=function(e){e.stopPropagation()};w.extend(w.event,{trigger:function(t,n,i,o){var a,s,u,l,c,p,d,h,v=[i||r],m=f.call(t,"type")?t.type:t,x=f.call(t,"namespace")?t.namespace.split("."):[];if(s=h=u=i=i||r,3!==i.nodeType&&8!==i.nodeType&&!wt.test(m+w.event.triggered)&&(m.indexOf(".")>-1&&(m=(x=m.split(".")).shift(),x.sort()),c=m.indexOf(":")<0&&"on"+m,t=t[w.expando]?t:new w.Event(m,"object"==typeof t&&t),t.isTrigger=o?2:3,t.namespace=x.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+x.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=i),n=null==n?[t]:w.makeArray(n,[t]),d=w.event.special[m]||{},o||!d.trigger||!1!==d.trigger.apply(i,n))){if(!o&&!d.noBubble&&!y(i)){for(l=d.delegateType||m,wt.test(l+m)||(s=s.parentNode);s;s=s.parentNode)v.push(s),u=s;u===(i.ownerDocument||r)&&v.push(u.defaultView||u.parentWindow||e)}a=0;while((s=v[a++])&&!t.isPropagationStopped())h=s,t.type=a>1?l:d.bindType||m,(p=(J.get(s,"events")||{})[t.type]&&J.get(s,"handle"))&&p.apply(s,n),(p=c&&s[c])&&p.apply&&Y(s)&&(t.result=p.apply(s,n),!1===t.result&&t.preventDefault());return t.type=m,o||t.isDefaultPrevented()||d._default&&!1!==d._default.apply(v.pop(),n)||!Y(i)||c&&g(i[m])&&!y(i)&&((u=i[c])&&(i[c]=null),w.event.triggered=m,t.isPropagationStopped()&&h.addEventListener(m,Tt),i[m](),t.isPropagationStopped()&&h.removeEventListener(m,Tt),w.event.triggered=void 0,u&&(i[c]=u)),t.result}},simulate:function(e,t,n){var r=w.extend(new w.Event,n,{type:e,isSimulated:!0});w.event.trigger(r,null,t)}}),w.fn.extend({trigger:function(e,t){return this.each(function(){w.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return w.event.trigger(e,t,n,!0)}}),h.focusin||w.each({focus:"focusin",blur:"focusout"},function(e,t){var n=function(e){w.event.simulate(t,e.target,w.event.fix(e))};w.event.special[t]={setup:function(){var r=this.ownerDocument||this,i=J.access(r,t);i||r.addEventListener(e,n,!0),J.access(r,t,(i||0)+1)},teardown:function(){var r=this.ownerDocument||this,i=J.access(r,t)-1;i?J.access(r,t,i):(r.removeEventListener(e,n,!0),J.remove(r,t))}}});var Ct=e.location,Et=Date.now(),kt=/\?/;w.parseXML=function(t){var n;if(!t||"string"!=typeof t)return null;try{n=(new e.DOMParser).parseFromString(t,"text/xml")}catch(e){n=void 0}return n&&!n.getElementsByTagName("parsererror").length||w.error("Invalid XML: "+t),n};var St=/\[\]$/,Dt=/\r?\n/g,Nt=/^(?:submit|button|image|reset|file)$/i,At=/^(?:input|select|textarea|keygen)/i;function jt(e,t,n,r){var i;if(Array.isArray(t))w.each(t,function(t,i){n||St.test(e)?r(e,i):jt(e+"["+("object"==typeof i&&null!=i?t:"")+"]",i,n,r)});else if(n||"object"!==x(t))r(e,t);else for(i in t)jt(e+"["+i+"]",t[i],n,r)}w.param=function(e,t){var n,r=[],i=function(e,t){var n=g(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(Array.isArray(e)||e.jquery&&!w.isPlainObject(e))w.each(e,function(){i(this.name,this.value)});else for(n in e)jt(n,e[n],t,i);return r.join("&")},w.fn.extend({serialize:function(){return w.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=w.prop(this,"elements");return e?w.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!w(this).is(":disabled")&&At.test(this.nodeName)&&!Nt.test(e)&&(this.checked||!pe.test(e))}).map(function(e,t){var n=w(this).val();return null==n?null:Array.isArray(n)?w.map(n,function(e){return{name:t.name,value:e.replace(Dt,"\r\n")}}):{name:t.name,value:n.replace(Dt,"\r\n")}}).get()}});var qt=/%20/g,Lt=/#.*$/,Ht=/([?&])_=[^&]*/,Ot=/^(.*?):[ \t]*([^\r\n]*)$/gm,Pt=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Mt=/^(?:GET|HEAD)$/,Rt=/^\/\//,It={},Wt={},$t="*/".concat("*"),Bt=r.createElement("a");Bt.href=Ct.href;function Ft(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i=0,o=t.toLowerCase().match(M)||[];if(g(n))while(r=o[i++])"+"===r[0]?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function _t(e,t,n,r){var i={},o=e===Wt;function a(s){var u;return i[s]=!0,w.each(e[s]||[],function(e,s){var l=s(t,n,r);return"string"!=typeof l||o||i[l]?o?!(u=l):void 0:(t.dataTypes.unshift(l),a(l),!1)}),u}return a(t.dataTypes[0])||!i["*"]&&a("*")}function zt(e,t){var n,r,i=w.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&w.extend(!0,e,r),e}function Xt(e,t,n){var r,i,o,a,s=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}function Ut(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(!(a=l[u+" "+o]||l["* "+o]))for(i in l)if((s=i.split(" "))[1]===o&&(a=l[u+" "+s[0]]||l["* "+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}w.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Ct.href,type:"GET",isLocal:Pt.test(Ct.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":$t,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":w.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?zt(zt(e,w.ajaxSettings),t):zt(w.ajaxSettings,e)},ajaxPrefilter:Ft(It),ajaxTransport:Ft(Wt),ajax:function(t,n){"object"==typeof t&&(n=t,t=void 0),n=n||{};var i,o,a,s,u,l,c,f,p,d,h=w.ajaxSetup({},n),g=h.context||h,y=h.context&&(g.nodeType||g.jquery)?w(g):w.event,v=w.Deferred(),m=w.Callbacks("once memory"),x=h.statusCode||{},b={},T={},C="canceled",E={readyState:0,getResponseHeader:function(e){var t;if(c){if(!s){s={};while(t=Ot.exec(a))s[t[1].toLowerCase()]=t[2]}t=s[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return c?a:null},setRequestHeader:function(e,t){return null==c&&(e=T[e.toLowerCase()]=T[e.toLowerCase()]||e,b[e]=t),this},overrideMimeType:function(e){return null==c&&(h.mimeType=e),this},statusCode:function(e){var t;if(e)if(c)E.always(e[E.status]);else for(t in e)x[t]=[x[t],e[t]];return this},abort:function(e){var t=e||C;return i&&i.abort(t),k(0,t),this}};if(v.promise(E),h.url=((t||h.url||Ct.href)+"").replace(Rt,Ct.protocol+"//"),h.type=n.method||n.type||h.method||h.type,h.dataTypes=(h.dataType||"*").toLowerCase().match(M)||[""],null==h.crossDomain){l=r.createElement("a");try{l.href=h.url,l.href=l.href,h.crossDomain=Bt.protocol+"//"+Bt.host!=l.protocol+"//"+l.host}catch(e){h.crossDomain=!0}}if(h.data&&h.processData&&"string"!=typeof h.data&&(h.data=w.param(h.data,h.traditional)),_t(It,h,n,E),c)return E;(f=w.event&&h.global)&&0==w.active++&&w.event.trigger("ajaxStart"),h.type=h.type.toUpperCase(),h.hasContent=!Mt.test(h.type),o=h.url.replace(Lt,""),h.hasContent?h.data&&h.processData&&0===(h.contentType||"").indexOf("application/x-www-form-urlencoded")&&(h.data=h.data.replace(qt,"+")):(d=h.url.slice(o.length),h.data&&(h.processData||"string"==typeof h.data)&&(o+=(kt.test(o)?"&":"?")+h.data,delete h.data),!1===h.cache&&(o=o.replace(Ht,"$1"),d=(kt.test(o)?"&":"?")+"_="+Et+++d),h.url=o+d),h.ifModified&&(w.lastModified[o]&&E.setRequestHeader("If-Modified-Since",w.lastModified[o]),w.etag[o]&&E.setRequestHeader("If-None-Match",w.etag[o])),(h.data&&h.hasContent&&!1!==h.contentType||n.contentType)&&E.setRequestHeader("Content-Type",h.contentType),E.setRequestHeader("Accept",h.dataTypes[0]&&h.accepts[h.dataTypes[0]]?h.accepts[h.dataTypes[0]]+("*"!==h.dataTypes[0]?", "+$t+"; q=0.01":""):h.accepts["*"]);for(p in h.headers)E.setRequestHeader(p,h.headers[p]);if(h.beforeSend&&(!1===h.beforeSend.call(g,E,h)||c))return E.abort();if(C="abort",m.add(h.complete),E.done(h.success),E.fail(h.error),i=_t(Wt,h,n,E)){if(E.readyState=1,f&&y.trigger("ajaxSend",[E,h]),c)return E;h.async&&h.timeout>0&&(u=e.setTimeout(function(){E.abort("timeout")},h.timeout));try{c=!1,i.send(b,k)}catch(e){if(c)throw e;k(-1,e)}}else k(-1,"No Transport");function k(t,n,r,s){var l,p,d,b,T,C=n;c||(c=!0,u&&e.clearTimeout(u),i=void 0,a=s||"",E.readyState=t>0?4:0,l=t>=200&&t<300||304===t,r&&(b=Xt(h,E,r)),b=Ut(h,b,E,l),l?(h.ifModified&&((T=E.getResponseHeader("Last-Modified"))&&(w.lastModified[o]=T),(T=E.getResponseHeader("etag"))&&(w.etag[o]=T)),204===t||"HEAD"===h.type?C="nocontent":304===t?C="notmodified":(C=b.state,p=b.data,l=!(d=b.error))):(d=C,!t&&C||(C="error",t<0&&(t=0))),E.status=t,E.statusText=(n||C)+"",l?v.resolveWith(g,[p,C,E]):v.rejectWith(g,[E,C,d]),E.statusCode(x),x=void 0,f&&y.trigger(l?"ajaxSuccess":"ajaxError",[E,h,l?p:d]),m.fireWith(g,[E,C]),f&&(y.trigger("ajaxComplete",[E,h]),--w.active||w.event.trigger("ajaxStop")))}return E},getJSON:function(e,t,n){return w.get(e,t,n,"json")},getScript:function(e,t){return w.get(e,void 0,t,"script")}}),w.each(["get","post"],function(e,t){w[t]=function(e,n,r,i){return g(n)&&(i=i||r,r=n,n=void 0),w.ajax(w.extend({url:e,type:t,dataType:i,data:n,success:r},w.isPlainObject(e)&&e))}}),w._evalUrl=function(e){return w.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},w.fn.extend({wrapAll:function(e){var t;return this[0]&&(g(e)&&(e=e.call(this[0])),t=w(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(e){return g(e)?this.each(function(t){w(this).wrapInner(e.call(this,t))}):this.each(function(){var t=w(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=g(e);return this.each(function(n){w(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(e){return this.parent(e).not("body").each(function(){w(this).replaceWith(this.childNodes)}),this}}),w.expr.pseudos.hidden=function(e){return!w.expr.pseudos.visible(e)},w.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},w.ajaxSettings.xhr=function(){try{return new e.XMLHttpRequest}catch(e){}};var Vt={0:200,1223:204},Gt=w.ajaxSettings.xhr();h.cors=!!Gt&&"withCredentials"in Gt,h.ajax=Gt=!!Gt,w.ajaxTransport(function(t){var n,r;if(h.cors||Gt&&!t.crossDomain)return{send:function(i,o){var a,s=t.xhr();if(s.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(a in t.xhrFields)s[a]=t.xhrFields[a];t.mimeType&&s.overrideMimeType&&s.overrideMimeType(t.mimeType),t.crossDomain||i["X-Requested-With"]||(i["X-Requested-With"]="XMLHttpRequest");for(a in i)s.setRequestHeader(a,i[a]);n=function(e){return function(){n&&(n=r=s.onload=s.onerror=s.onabort=s.ontimeout=s.onreadystatechange=null,"abort"===e?s.abort():"error"===e?"number"!=typeof s.status?o(0,"error"):o(s.status,s.statusText):o(Vt[s.status]||s.status,s.statusText,"text"!==(s.responseType||"text")||"string"!=typeof s.responseText?{binary:s.response}:{text:s.responseText},s.getAllResponseHeaders()))}},s.onload=n(),r=s.onerror=s.ontimeout=n("error"),void 0!==s.onabort?s.onabort=r:s.onreadystatechange=function(){4===s.readyState&&e.setTimeout(function(){n&&r()})},n=n("abort");try{s.send(t.hasContent&&t.data||null)}catch(e){if(n)throw e}},abort:function(){n&&n()}}}),w.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),w.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return w.globalEval(e),e}}}),w.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),w.ajaxTransport("script",function(e){if(e.crossDomain){var t,n;return{send:function(i,o){t=w("